ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzCmluZGV4IGRkMzExY2YuLjZiZDMwZmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMKKysrIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJaHR0cDovL2tlcm5lbG5ld2JpZXMub3JnLwogCiBMaW51eCBVU0IgcHJvamVjdDoKLQlodHRwOi8vbGludXgtdXNiLnNvdXJjZWZvcmdlLm5ldC8KKwlodHRwOi8vd3d3LmxpbnV4LXVzYi5vcmcvCiAKIEhvdyB0byBOT1Qgd3JpdGUga2VybmVsIGRyaXZlciBieSBhcmphbnZAcmVkaGF0LmNvbQogCWh0dHA6Ly9wZW9wbGUucmVkaGF0LmNvbS9hcmphbnYvb2xzcGFwZXIucGRmCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwppbmRleCA2MTk4ZTVlLi5jMmM4NWJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKQEAgLTQ3OCwxMCArNDc4LDExIEBACiBKZWZmIEdhcnppaywgIkxpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGZvcm1hdC4iCiAgIDxodHRwOi8vbGludXgueXl6LnVzL3BhdGNoLWZvcm1hdC5odG1sPgogCi1HcmVnIEtyb2FoLCAiSG93IHRvIHBpc3Mgb2ZmIGEga2VybmVsIHN1YnN5c3RlbSBtYWludGFpbmVyIi4KK0dyZWcgS3JvYWgtSGFydG1hbiAiSG93IHRvIHBpc3Mgb2ZmIGEga2VybmVsIHN1YnN5c3RlbSBtYWludGFpbmVyIi4KICAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy8yMDA1LzAzLzMxLz4KICAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy8yMDA1LzA3LzA4Lz4KICAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy8yMDA1LzEwLzE5Lz4KKyAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy8yMDA2LzAxLzExLz4KIAogTk8hISEhIE5vIG1vcmUgaHVnZSBwYXRjaCBib21icyB0byBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnIHBlb3BsZSEuCiAgIDxodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWxpbnV4LWtlcm5lbCZtPTExMjExMjc0OTkxMjk0NCZ3PTI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IGRkMGJmYzIuLmZlMTFmY2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC04NTYsNiArODU2LDQ5IEBACiAKIAltZ2E9CQlbSFcsRFJNXQogCisJbWlncmF0aW9uX2Nvc3Q9CisJCQlbS05MLFNNUF0gZGVidWc6IG92ZXJyaWRlIHNjaGVkdWxlciBtaWdyYXRpb24gY29zdHMKKwkJCUZvcm1hdDogPGxldmVsLTEtdXNlY3M+LDxsZXZlbC0yLXVzZWNzPiwuLi4KKwkJCVRoaXMgZGVidWdnaW5nIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUKKwkJCWRlZmF1bHQgc2NoZWR1bGVyIG1pZ3JhdGlvbiBjb3N0IG1hdHJpeC4gVGhlIG51bWJlcnMKKwkJCWFyZSBpbmRleGVkIGJ5ICdDUFUgZG9tYWluIGRpc3RhbmNlJy4KKwkJCUUuZy4gbWlncmF0aW9uX2Nvc3Q9MTAwMCwyMDAwLDMwMDAgb24gYW4gU01UIE5VTUEKKwkJCWJveCB3aWxsIHNldCB1cCBhbiBpbnRyYS1jb3JlIG1pZ3JhdGlvbiBjb3N0IG9mCisJCQkxIG1zZWMsIGFuIGludGVyLWNvcmUgbWlncmF0aW9uIGNvc3Qgb2YgMiBtc2VjcywKKwkJCWFuZCBhbiBpbnRlci1ub2RlIG1pZ3JhdGlvbiBjb3N0IG9mIDMgbXNlY3MuCisKKwkJCVdBUk5JTkc6IHVzaW5nIHRoZSB3cm9uZyB2YWx1ZXMgaGVyZSBjYW4gYnJlYWsKKwkJCXNjaGVkdWxlciBwZXJmb3JtYW5jZSwgc28gaXQncyBvbmx5IGZvciBzY2hlZHVsZXIKKwkJCWRldmVsb3BtZW50IHB1cnBvc2VzLCBub3QgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuCisKKwltaWdyYXRpb25fZGVidWc9CisJCQlbS05MLFNNUF0gbWlncmF0aW9uIGNvc3QgYXV0by1kZXRlY3QgdmVyYm9zaXR5CisJCQlGb3JtYXQ9PDB8MXwyPgorCQkJSWYgYSBzeXN0ZW0ncyBtaWdyYXRpb24gbWF0cml4IHJlcG9ydGVkIGF0IGJvb3R1cAorCQkJc2VlbXMgZXJyb25lb3VzIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8KKwkJCWluY3JlYXNlIHZlcmJvc2l0eSBvZiB0aGUgZGV0ZWN0aW9uIHByb2Nlc3MuCisJCQlXZSBkZWZhdWx0IHRvIDAgKG5vIGV4dHJhIG1lc3NhZ2VzKSwgMSB3aWxsIHByaW50CisJCQlzb21lIG1vcmUgaW5mb3JtYXRpb24sIGFuZCAyIHdpbGwgYmUgcmVhbGx5CisJCQl2ZXJib3NlIChwcm9iYWJseSBvbmx5IHVzZWZ1bCBpZiB5b3UgYWxzbyBoYXZlIGEKKwkJCXNlcmlhbCBjb25zb2xlIGF0dGFjaGVkIHRvIHRoZSBzeXN0ZW0pLgorCisJbWlncmF0aW9uX2ZhY3Rvcj0KKwkJCVtLTkwsU01QXSBtdWx0aXBseS9kaXZpZGUgbWlncmF0aW9uIGNvc3RzIGJ5IGEgZmFjdG9yCisJCQlGb3JtYXQ9PHBlcmNlbnQ+CisJCQlUaGlzIGRlYnVnIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBwcm9wb3J0aW9uYWxseQorCQkJaW5jcmVhc2Ugb3IgZGVjcmVhc2UgdGhlIGF1dG8tZGV0ZWN0ZWQgbWlncmF0aW9uCisJCQljb3N0cyBmb3IgYWxsIGVudHJpZXMgb2YgdGhlIG1pZ3JhdGlvbiBtYXRyaXguCisJCQlFLmcuIG1pZ3JhdGlvbl9mYWN0b3I9MTUwIHdpbGwgaW5jcmVhc2UgbWlncmF0aW9uCisJCQljb3N0cyBieSA1MCUuIChhbmQgdGh1cyB0aGUgc2NoZWR1bGVyIHdpbGwgYmUgbGVzcworCQkJZWFnZXIgbWlncmF0aW5nIGNhY2hlLWhvdCB0YXNrcykKKwkJCW1pZ3JhdGlvbl9mYWN0b3I9ODAgd2lsbCBkZWNyZWFzZSBtaWdyYXRpb24gY29zdHMKKwkJCWJ5IDIwJS4gKHRodXMgdGhlIHNjaGVkdWxlciB3aWxsIGJlIG1vcmUgZWFnZXIgdG8KKwkJCW1pZ3JhdGUgdGFza3MpCisKKwkJCVdBUk5JTkc6IHVzaW5nIHRoZSB3cm9uZyB2YWx1ZXMgaGVyZSBjYW4gYnJlYWsKKwkJCXNjaGVkdWxlciBwZXJmb3JtYW5jZSwgc28gaXQncyBvbmx5IGZvciBzY2hlZHVsZXIKKwkJCWRldmVsb3BtZW50IHB1cnBvc2VzLCBub3QgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuCisKIAltb3VzZWRldi50YXBfdGltZT0KIAkJCVtNT1VTRV0gTWF4aW11bSB0aW1lIGJldHdlZW4gZmluZ2VyIHRvdWNoaW5nIGFuZAogCQkJbGVhdmluZyB0b3VjaHBhZCBzdXJmYWNlIGZvciB0b3VjaCB0byBiZSBjb25zaWRlcmVkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaS9idXR0ZXJmbHkgYi9Eb2N1bWVudGF0aW9uL3NwaS9idXR0ZXJmbHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlOGM4ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc3BpL2J1dHRlcmZseQpAQCAtMCwwICsxLDU3IEBACitzcGlfYnV0dGVyZmx5IC0gcGFycG9ydC10by1idXR0ZXJmbHkgYWRhcHRlciBkcml2ZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGlzIGEgaGFyZHdhcmUgYW5kIHNvZnR3YXJlIHByb2plY3QgdGhhdCBpbmNsdWRlcyBidWlsZGluZyBhbmQgdXNpbmcKK2EgcGFyYWxsZWwgcG9ydCBhZGFwdGVyIGNhYmxlLCB0b2dldGhlciB3aXRoIGFuICJBVlIgQnV0dGVyZmx5IiB0byBydW4KK2Zpcm13YXJlIGZvciB1c2VyIGludGVyZmFjaW5nIGFuZC9vciBzZW5zb3JzLiAgQSBCdXR0ZXJmbHkgaXMgYSAkVVMyMAorYmF0dGVyeSBwb3dlcmVkIGNhcmQgd2l0aCBhbiBBVlIgbWljcm9jb250cm9sbGVyIGFuZCBsb3RzIG9mIGdvb2RpZXM6CitzZW5zb3JzLCBMQ0QsIGZsYXNoLCB0b2dnbGUgc3RpY2ssIGFuZCBtb3JlLiAgWW91IGNhbiB1c2UgQVZSLUdDQyB0bworZGV2ZWxvcCBmaXJtd2FyZSBmb3IgdGhpcywgYW5kIGZsYXNoIGl0IHVzaW5nIHRoaXMgYWRhcHRlciBjYWJsZS4KKworWW91IGNhbiBtYWtlIHRoaXMgYWRhcHRlciBmcm9tIGFuIG9sZCBwcmludGVyIGNhYmxlIGFuZCBzb2xkZXIgdGhpbmdzCitkaXJlY3RseSB0byB0aGUgQnV0dGVyZmx5LiAgT3IgKGlmIHlvdSBoYXZlIHRoZSBwYXJ0cyBhbmQgc2tpbGxzKSB5b3UKK2NhbiBjb21lIHVwIHdpdGggc29tZXRoaW5nIGZhbmNpZXIsIHByb3ZpZGluZyBjaXJ1aXQgcHJvdGVjdGlvbiB0byB0aGUKK0J1dHRlcmZseSBhbmQgdGhlIHByaW50ZXIgcG9ydCwgb3Igd2l0aCBhIGJldHRlciBwb3dlciBzdXBwbHkgdGhhbiB0d28KK3NpZ25hbCBwaW5zIGZyb20gdGhlIHByaW50ZXIgcG9ydC4KKworCitUaGUgZmlyc3QgY2FibGUgY29ubmVjdGlvbnMgd2lsbCBob29rIExpbnV4IHVwIHRvIG9uZSBTUEkgYnVzLCB3aXRoIHRoZQorQVZSIGFuZCBhIERhdGFGbGFzaCBjaGlwOyBhbmQgdG8gdGhlIEFWUiByZXNldCBsaW5lLiAgVGhpcyBpcyBhbGwgeW91CituZWVkIHRvIHJlZmxhc2ggdGhlIGZpcm13YXJlLCBhbmQgdGhlIHBpbnMgYXJlIHRoZSBzdGFuZGFyZCBBdG1lbCAiSVNQIgorY29ubmVjdG9yIHBpbnMgKHVzZWQgYWxzbyBvbiBub24tQnV0dGVyZmx5IEFWUiBib2FyZHMpLgorCisJU2lnbmFsCSAgQnV0dGVyZmx5CSAgUGFycG9ydCAoREItMjUpCisJLS0tLS0tCSAgLS0tLS0tLS0tCSAgLS0tLS0tLS0tLS0tLS0tCisJU0NLCT0gSjQwMy5QQjEvU0NLCT0gcGluIDIvRDAKKwlSRVNFVAk9IEo0MDMublJTVAk9IHBpbiAzL0QxCisJVkNDCT0gSjQwMy5WQ0NfRVhUCT0gcGluIDgvRDYKKwlNT1NJCT0gSjQwMy5QQjIvTU9TSQk9IHBpbiA5L0Q3CisJTUlTTwk9IEo0MDMuUEIzL01JU08JPSBwaW4gMTEvUzcsbkJVU1kKKwlHTkQJPSBKNDAzLkdORAk9IHBpbiAyMy9HTkQKKworVGhlbiB0byBsZXQgTGludXggbWFzdGVyIHRoYXQgYnVzIHRvIHRhbGsgdG8gdGhlIERhdGFGbGFzaCBjaGlwLCB5b3UgbXVzdAorKGEpIGZsYXNoIG5ldyBmaXJtd2FyZSB0aGF0IGRpc2FibGVzIFNQSSAoc2V0IFBSUi4yLCBhbmQgZGlzYWJsZSBwdWxsdXBzCitieSBjbGVhcmluZyBQT1JUQi5bMC0zXSk7IChiKSBjb25maWd1cmUgdGhlIG10ZF9kYXRhZmxhc2ggZHJpdmVyOyBhbmQKKyhjKSBjYWJsZSBpbiB0aGUgY2hpcHNlbGVjdC4KKworCVNpZ25hbAkgIEJ1dHRlcmZseQkgIFBhcnBvcnQgKERCLTI1KQorCS0tLS0tLQkgIC0tLS0tLS0tLQkgIC0tLS0tLS0tLS0tLS0tLQorCVZDQwk9IEo0MDAuVkNDX0VYVAk9IHBpbiA3L0Q1CisJU0VMRUNUCT0gSjQwMC5QQjAvblNTCT0gcGluIDE3L0MzLG5TRUxFQ1QKKwlHTkQJPSBKNDAwLkdORAk9IHBpbiAyNC9HTkQKKworVGhlICJVU0kiIGNvbnRyb2xsZXIsIHVzaW5nIEo0MDUsIGNhbiBiZSB1c2VkIGZvciBhIHNlY29uZCBTUEkgYnVzLiAgVGhhdAord291bGQgbGV0IHlvdSB0YWxrIHRvIHRoZSBBVlIgb3ZlciBTUEksIHJ1bm5pbmcgZmlybXdhcmUgdGhhdCBtYWtlcyBpdCBhY3QKK2FzIGFuIFNQSSBzbGF2ZSwgd2hpbGUgbGV0dGluZyBlaXRoZXIgTGludXggb3IgdGhlIEFWUiB1c2UgdGhlIERhdGFGbGFzaC4KK1RoZXJlIGFyZSBwbGVudHkgb2Ygc3BhcmUgcGFycG9ydCBwaW5zIHRvIHdpcmUgdGhpcyBvbmUgdXAsIHN1Y2ggYXM6CisKKwlTaWduYWwJICBCdXR0ZXJmbHkJICBQYXJwb3J0IChEQi0yNSkKKwktLS0tLS0JICAtLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0KKwlTQ0sJPSBKNDAzLlBFNC9VU0NLCT0gcGluIDUvRDMKKwlNT1NJCT0gSjQwMy5QRTUvREkJPSBwaW4gNi9ENAorCU1JU08JPSBKNDAzLlBFNi9ETwk9IHBpbiAxMi9TNSxuUEFQRVJPVVQKKwlHTkQJPSBKNDAzLkdORAk9IHBpbiAyMi9HTkQKKworCUlSUQk9IEo0MDIuUEY0CT0gcGluIDEwL1M2LEFDSworCUdORAk9IEo0MDIuR05EKFAyKQk9IHBpbiAyNS9HTkQKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpLXN1bW1hcnkgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktc3VtbWFyeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZmYmEzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGkvc3BpLXN1bW1hcnkKQEAgLTAsMCArMSw0NTcgQEAKK092ZXJ2aWV3IG9mIExpbnV4IGtlcm5lbCBTUEkgc3VwcG9ydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzAyLURlYy0yMDA1CisKK1doYXQgaXMgU1BJPworLS0tLS0tLS0tLS0tCitUaGUgIlNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSIgKFNQSSkgaXMgYSBzeW5jaHJvbm91cyBmb3VyIHdpcmUgc2VyaWFsCitsaW5rIHVzZWQgdG8gY29ubmVjdCBtaWNyb2NvbnRyb2xsZXJzIHRvIHNlbnNvcnMsIG1lbW9yeSwgYW5kIHBlcmlwaGVyYWxzLgorCitUaGUgdGhyZWUgc2lnbmFsIHdpcmVzIGhvbGQgYSBjbG9jayAoU0NMSywgb2Z0ZW4gb24gdGhlIG9yZGVyIG9mIDEwIE1IeiksCithbmQgcGFyYWxsZWwgZGF0YSBsaW5lcyB3aXRoICJNYXN0ZXIgT3V0LCBTbGF2ZSBJbiIgKE1PU0kpIG9yICJNYXN0ZXIgSW4sCitTbGF2ZSBPdXQiIChNSVNPKSBzaWduYWxzLiAgKE90aGVyIG5hbWVzIGFyZSBhbHNvIHVzZWQuKSAgVGhlcmUgYXJlIGZvdXIKK2Nsb2NraW5nIG1vZGVzIHRocm91Z2ggd2hpY2ggZGF0YSBpcyBleGNoYW5nZWQ7IG1vZGUtMCBhbmQgbW9kZS0zIGFyZSBtb3N0Citjb21tb25seSB1c2VkLiAgRWFjaCBjbG9jayBjeWNsZSBzaGlmdHMgZGF0YSBvdXQgYW5kIGRhdGEgaW47IHRoZSBjbG9jaworZG9lc24ndCBjeWNsZSBleGNlcHQgd2hlbiB0aGVyZSBpcyBkYXRhIHRvIHNoaWZ0LgorCitTUEkgbWFzdGVycyBtYXkgdXNlIGEgImNoaXAgc2VsZWN0IiBsaW5lIHRvIGFjdGl2YXRlIGEgZ2l2ZW4gU1BJIHNsYXZlCitkZXZpY2UsIHNvIHRob3NlIHRocmVlIHNpZ25hbCB3aXJlcyBtYXkgYmUgY29ubmVjdGVkIHRvIHNldmVyYWwgY2hpcHMKK2luIHBhcmFsbGVsLiAgQWxsIFNQSSBzbGF2ZXMgc3VwcG9ydCBjaGlwc2VsZWN0cy4gIFNvbWUgZGV2aWNlcyBoYXZlCitvdGhlciBzaWduYWxzLCBvZnRlbiBpbmNsdWRpbmcgYW4gaW50ZXJydXB0IHRvIHRoZSBtYXN0ZXIuCisKK1VubGlrZSBzZXJpYWwgYnVzc2VzIGxpa2UgVVNCIG9yIFNNQlVTLCBldmVuIGxvdyBsZXZlbCBwcm90b2NvbHMgZm9yCitTUEkgc2xhdmUgZnVuY3Rpb25zIGFyZSB1c3VhbGx5IG5vdCBpbnRlcm9wZXJhYmxlIGJldHdlZW4gdmVuZG9ycworKGV4Y2VwdCBmb3IgY2FzZXMgbGlrZSBTUEkgbWVtb3J5IGNoaXBzKS4KKworICAtIFNQSSBtYXkgYmUgdXNlZCBmb3IgcmVxdWVzdC9yZXNwb25zZSBzdHlsZSBkZXZpY2UgcHJvdG9jb2xzLCBhcyB3aXRoCisgICAgdG91Y2hzY3JlZW4gc2Vuc29ycyBhbmQgbWVtb3J5IGNoaXBzLgorCisgIC0gSXQgbWF5IGFsc28gYmUgdXNlZCB0byBzdHJlYW0gZGF0YSBpbiBlaXRoZXIgZGlyZWN0aW9uIChoYWxmIGR1cGxleCksCisgICAgb3IgYm90aCBvZiB0aGVtIGF0IHRoZSBzYW1lIHRpbWUgKGZ1bGwgZHVwbGV4KS4KKworICAtIFNvbWUgZGV2aWNlcyBtYXkgdXNlIGVpZ2h0IGJpdCB3b3Jkcy4gIE90aGVycyBtYXkgZGlmZmVyZW50IHdvcmQKKyAgICBsZW5ndGhzLCBzdWNoIGFzIHN0cmVhbXMgb2YgMTItYml0IG9yIDIwLWJpdCBkaWdpdGFsIHNhbXBsZXMuCisKK0luIHRoZSBzYW1lIHdheSwgU1BJIHNsYXZlcyB3aWxsIG9ubHkgcmFyZWx5IHN1cHBvcnQgYW55IGtpbmQgb2YgYXV0b21hdGljCitkaXNjb3ZlcnkvZW51bWVyYXRpb24gcHJvdG9jb2wuICBUaGUgdHJlZSBvZiBzbGF2ZSBkZXZpY2VzIGFjY2Vzc2libGUgZnJvbQorYSBnaXZlbiBTUEkgbWFzdGVyIHdpbGwgbm9ybWFsbHkgYmUgc2V0IHVwIG1hbnVhbGx5LCB3aXRoIGNvbmZpZ3VyYXRpb24KK3RhYmxlcy4KKworU1BJIGlzIG9ubHkgb25lIG9mIHRoZSBuYW1lcyB1c2VkIGJ5IHN1Y2ggZm91ci13aXJlIHByb3RvY29scywgYW5kCittb3N0IGNvbnRyb2xsZXJzIGhhdmUgbm8gcHJvYmxlbSBoYW5kbGluZyAiTWljcm9XaXJlIiAodGhpbmsgb2YgaXQgYXMKK2hhbGYtZHVwbGV4IFNQSSwgZm9yIHJlcXVlc3QvcmVzcG9uc2UgcHJvdG9jb2xzKSwgU1NQICgiU3luY2hyb25vdXMKK1NlcmlhbCBQcm90b2NvbCIpLCBQU1AgKCJQcm9ncmFtbWFibGUgU2VyaWFsIFByb3RvY29sIiksIGFuZCBvdGhlcgorcmVsYXRlZCBwcm90b2NvbHMuCisKK01pY3JvY29udHJvbGxlcnMgb2Z0ZW4gc3VwcG9ydCBib3RoIG1hc3RlciBhbmQgc2xhdmUgc2lkZXMgb2YgdGhlIFNQSQorcHJvdG9jb2wuICBUaGlzIGRvY3VtZW50IChhbmQgTGludXgpIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHRoZSBtYXN0ZXIKK3NpZGUgb2YgU1BJIGludGVyYWN0aW9ucy4KKworCitXaG8gdXNlcyBpdD8gIE9uIHdoYXQga2luZHMgb2Ygc3lzdGVtcz8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGludXggZGV2ZWxvcGVycyB1c2luZyBTUEkgYXJlIHByb2JhYmx5IHdyaXRpbmcgZGV2aWNlIGRyaXZlcnMgZm9yIGVtYmVkZGVkCitzeXN0ZW1zIGJvYXJkcy4gIFNQSSBpcyB1c2VkIHRvIGNvbnRyb2wgZXh0ZXJuYWwgY2hpcHMsIGFuZCBpdCBpcyBhbHNvIGEKK3Byb3RvY29sIHN1cHBvcnRlZCBieSBldmVyeSBNTUMgb3IgU0QgbWVtb3J5IGNhcmQuICAoVGhlIG9sZGVyICJEYXRhRmxhc2giCitjYXJkcywgcHJlZGF0aW5nIE1NQyBjYXJkcyBidXQgdXNpbmcgdGhlIHNhbWUgY29ubmVjdG9ycyBhbmQgY2FyZCBzaGFwZSwKK3N1cHBvcnQgb25seSBTUEkuKSAgU29tZSBQQyBoYXJkd2FyZSB1c2VzIFNQSSBmbGFzaCBmb3IgQklPUyBjb2RlLgorCitTUEkgc2xhdmUgY2hpcHMgcmFuZ2UgZnJvbSBkaWdpdGFsL2FuYWxvZyBjb252ZXJ0ZXJzIHVzZWQgZm9yIGFuYWxvZworc2Vuc29ycyBhbmQgY29kZWNzLCB0byBtZW1vcnksIHRvIHBlcmlwaGVyYWxzIGxpa2UgVVNCIGNvbnRyb2xsZXJzCitvciBFdGhlcm5ldCBhZGFwdGVyczsgYW5kIG1vcmUuCisKK01vc3Qgc3lzdGVtcyB1c2luZyBTUEkgd2lsbCBpbnRlZ3JhdGUgYSBmZXcgZGV2aWNlcyBvbiBhIG1haW5ib2FyZC4KK1NvbWUgcHJvdmlkZSBTUEkgbGlua3Mgb24gZXhwYW5zaW9uIGNvbm5lY3RvcnM7IGluIGNhc2VzIHdoZXJlIG5vCitkZWRpY2F0ZWQgU1BJIGNvbnRyb2xsZXIgZXhpc3RzLCBHUElPIHBpbnMgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEKK2xvdyBzcGVlZCAiYml0YmFuZ2luZyIgYWRhcHRlci4gIFZlcnkgZmV3IHN5c3RlbXMgd2lsbCAiaG90cGx1ZyIgYW4gU1BJCitjb250cm9sbGVyOyB0aGUgcmVhc29ucyB0byB1c2UgU1BJIGZvY3VzIG9uIGxvdyBjb3N0IGFuZCBzaW1wbGUgb3BlcmF0aW9uLAorYW5kIGlmIGR5bmFtaWMgcmVjb25maWd1cmF0aW9uIGlzIGltcG9ydGFudCwgVVNCIHdpbGwgb2Z0ZW4gYmUgYSBtb3JlCithcHByb3ByaWF0ZSBsb3ctcGluY291bnQgcGVyaXBoZXJhbCBidXMuCisKK01hbnkgbWljcm9jb250cm9sbGVycyB0aGF0IGNhbiBydW4gTGludXggaW50ZWdyYXRlIG9uZSBvciBtb3JlIEkvTworaW50ZXJmYWNlcyB3aXRoIFNQSSBtb2Rlcy4gIEdpdmVuIFNQSSBzdXBwb3J0LCB0aGV5IGNvdWxkIHVzZSBNTUMgb3IgU0QKK2NhcmRzIHdpdGhvdXQgbmVlZGluZyBhIHNwZWNpYWwgcHVycG9zZSBNTUMvU0QvU0RJTyBjb250cm9sbGVyLgorCisKK0hvdyBkbyB0aGVzZSBkcml2ZXIgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcyB3b3JrPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgPGxpbnV4L3NwaS9zcGkuaD4gaGVhZGVyIGZpbGUgaW5jbHVkZXMga2VybmVsZG9jLCBhcyBkb2VzIHRoZQorbWFpbiBzb3VyY2UgY29kZSwgYW5kIHlvdSBzaG91bGQgY2VydGFpbmx5IHJlYWQgdGhhdC4gIFRoaXMgaXMganVzdAorYW4gb3ZlcnZpZXcsIHNvIHlvdSBnZXQgdGhlIGJpZyBwaWN0dXJlIGJlZm9yZSB0aGUgZGV0YWlscy4KKworU1BJIHJlcXVlc3RzIGFsd2F5cyBnbyBpbnRvIEkvTyBxdWV1ZXMuICBSZXF1ZXN0cyBmb3IgYSBnaXZlbiBTUEkgZGV2aWNlCithcmUgYWx3YXlzIGV4ZWN1dGVkIGluIEZJRk8gb3JkZXIsIGFuZCBjb21wbGV0ZSBhc3luY2hyb25vdXNseSB0aHJvdWdoCitjb21wbGV0aW9uIGNhbGxiYWNrcy4gIFRoZXJlIGFyZSBhbHNvIHNvbWUgc2ltcGxlIHN5bmNocm9ub3VzIHdyYXBwZXJzCitmb3IgdGhvc2UgY2FsbHMsIGluY2x1ZGluZyBvbmVzIGZvciBjb21tb24gdHJhbnNhY3Rpb24gdHlwZXMgbGlrZSB3cml0aW5nCithIGNvbW1hbmQgYW5kIHRoZW4gcmVhZGluZyBpdHMgcmVzcG9uc2UuCisKK1RoZXJlIGFyZSB0d28gdHlwZXMgb2YgU1BJIGRyaXZlciwgaGVyZSBjYWxsZWQ6CisKKyAgQ29udHJvbGxlciBkcml2ZXJzIC4uLiB0aGVzZSBhcmUgb2Z0ZW4gYnVpbHQgaW4gdG8gU3lzdGVtLU9uLUNoaXAKKwlwcm9jZXNzb3JzLCBhbmQgb2Z0ZW4gc3VwcG9ydCBib3RoIE1hc3RlciBhbmQgU2xhdmUgcm9sZXMuCisJVGhlc2UgZHJpdmVycyB0b3VjaCBoYXJkd2FyZSByZWdpc3RlcnMgYW5kIG1heSB1c2UgRE1BLgorCU9yIHRoZXkgY2FuIGJlIFBJTyBiaXRiYW5nZXJzLCBuZWVkaW5nIGp1c3QgR1BJTyBwaW5zLgorCisgIFByb3RvY29sIGRyaXZlcnMgLi4uIHRoZXNlIHBhc3MgbWVzc2FnZXMgdGhyb3VnaCB0aGUgY29udHJvbGxlcgorCWRyaXZlciB0byBjb21tdW5pY2F0ZSB3aXRoIGEgU2xhdmUgb3IgTWFzdGVyIGRldmljZSBvbiB0aGUKKwlvdGhlciBzaWRlIG9mIGFuIFNQSSBsaW5rLgorCitTbyBmb3IgZXhhbXBsZSBvbmUgcHJvdG9jb2wgZHJpdmVyIG1pZ2h0IHRhbGsgdG8gdGhlIE1URCBsYXllciB0byBleHBvcnQKK2RhdGEgdG8gZmlsZXN5c3RlbXMgc3RvcmVkIG9uIFNQSSBmbGFzaCBsaWtlIERhdGFGbGFzaDsgYW5kIG90aGVycyBtaWdodAorY29udHJvbCBhdWRpbyBpbnRlcmZhY2VzLCBwcmVzZW50IHRvdWNoc2NyZWVuIHNlbnNvcnMgYXMgaW5wdXQgaW50ZXJmYWNlcywKK29yIG1vbml0b3IgdGVtcGVyYXR1cmUgYW5kIHZvbHRhZ2UgbGV2ZWxzIGR1cmluZyBpbmR1c3RyaWFsIHByb2Nlc3NpbmcuCitBbmQgdGhvc2UgbWlnaHQgYWxsIGJlIHNoYXJpbmcgdGhlIHNhbWUgY29udHJvbGxlciBkcml2ZXIuCisKK0EgInN0cnVjdCBzcGlfZGV2aWNlIiBlbmNhcHN1bGF0ZXMgdGhlIG1hc3Rlci1zaWRlIGludGVyZmFjZSBiZXR3ZWVuCit0aG9zZSB0d28gdHlwZXMgb2YgZHJpdmVyLiAgQXQgdGhpcyB3cml0aW5nLCBMaW51eCBoYXMgbm8gc2xhdmUgc2lkZQorcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLgorCitUaGVyZSBpcyBhIG1pbmltYWwgY29yZSBvZiBTUEkgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcywgZm9jdXNzaW5nIG9uCit1c2luZyBkcml2ZXIgbW9kZWwgdG8gY29ubmVjdCBjb250cm9sbGVyIGFuZCBwcm90b2NvbCBkcml2ZXJzIHVzaW5nCitkZXZpY2UgdGFibGVzIHByb3ZpZGVkIGJ5IGJvYXJkIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIGNvZGUuICBTUEkKK3Nob3dzIHVwIGluIHN5c2ZzIGluIHNldmVyYWwgbG9jYXRpb25zOgorCisgICAvc3lzL2RldmljZXMvLi4uL0NUTFIvc3BpQi5DIC4uLiBzcGlfZGV2aWNlIGZvciBvbiBidXMgIkIiLAorCWNoaXBzZWxlY3QgQywgYWNjZXNzZWQgdGhyb3VnaCBDVExSLgorCisgICAvc3lzL2RldmljZXMvLi4uL0NUTFIvc3BpQi5DL21vZGFsaWFzIC4uLiBpZGVudGlmaWVzIHRoZSBkcml2ZXIKKwl0aGF0IHNob3VsZCBiZSB1c2VkIHdpdGggdGhpcyBkZXZpY2UgKGZvciBob3RwbHVnL2NvbGRwbHVnKQorCisgICAvc3lzL2J1cy9zcGkvZGV2aWNlcy9zcGlCLkMgLi4uIHN5bWxpbmsgdG8gdGhlIHBoeXNpY2FsCisgICAJc3BpQi1DIGRldmljZQorCisgICAvc3lzL2J1cy9zcGkvZHJpdmVycy9EIC4uLiBkcml2ZXIgZm9yIG9uZSBvciBtb3JlIHNwaSouKiBkZXZpY2VzCisKKyAgIC9zeXMvY2xhc3Mvc3BpX21hc3Rlci9zcGlCIC4uLiBjbGFzcyBkZXZpY2UgZm9yIHRoZSBjb250cm9sbGVyCisJbWFuYWdpbmcgYnVzICJCIi4gIEFsbCB0aGUgc3BpQi4qIGRldmljZXMgc2hhcmUgdGhlIHNhbWUKKwlwaHlzaWNhbCBTUEkgYnVzIHNlZ21lbnQsIHdpdGggU0NMSywgTU9TSSwgYW5kIE1JU08uCisKKworSG93IGRvZXMgYm9hcmQtc3BlY2lmaWMgaW5pdCBjb2RlIGRlY2xhcmUgU1BJIGRldmljZXM/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xpbnV4IG5lZWRzIHNldmVyYWwga2luZHMgb2YgaW5mb3JtYXRpb24gdG8gcHJvcGVybHkgY29uZmlndXJlIFNQSSBkZXZpY2VzLgorVGhhdCBpbmZvcm1hdGlvbiBpcyBub3JtYWxseSBwcm92aWRlZCBieSBib2FyZC1zcGVjaWZpYyBjb2RlLCBldmVuIGZvcgorY2hpcHMgdGhhdCBkbyBzdXBwb3J0IHNvbWUgb2YgYXV0b21hdGVkIGRpc2NvdmVyeS9lbnVtZXJhdGlvbi4KKworREVDTEFSRSBDT05UUk9MTEVSUworCitUaGUgZmlyc3Qga2luZCBvZiBpbmZvcm1hdGlvbiBpcyBhIGxpc3Qgb2Ygd2hhdCBTUEkgY29udHJvbGxlcnMgZXhpc3QuCitGb3IgU3lzdGVtLW9uLUNoaXAgKFNPQykgYmFzZWQgYm9hcmRzLCB0aGVzZSB3aWxsIHVzdWFsbHkgYmUgcGxhdGZvcm0KK2RldmljZXMsIGFuZCB0aGUgY29udHJvbGxlciBtYXkgbmVlZCBzb21lIHBsYXRmb3JtX2RhdGEgaW4gb3JkZXIgdG8KK29wZXJhdGUgcHJvcGVybHkuICBUaGUgInN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UiIHdpbGwgaW5jbHVkZSByZXNvdXJjZXMKK2xpa2UgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIncyBmaXJzdCByZWdpc3RlciBhbmQgaXRzIElSUS4KKworUGxhdGZvcm1zIHdpbGwgb2Z0ZW4gYWJzdHJhY3QgdGhlICJyZWdpc3RlciBTUEkgY29udHJvbGxlciIgb3BlcmF0aW9uLAorbWF5YmUgY291cGxpbmcgaXQgd2l0aCBjb2RlIHRvIGluaXRpYWxpemUgcGluIGNvbmZpZ3VyYXRpb25zLCBzbyB0aGF0Cit0aGUgYXJjaC8uLi4vbWFjaC0qL2JvYXJkLSouYyBmaWxlcyBmb3Igc2V2ZXJhbCBib2FyZHMgY2FuIGFsbCBzaGFyZSB0aGUKK3NhbWUgYmFzaWMgY29udHJvbGxlciBzZXR1cCBjb2RlLiAgVGhpcyBpcyBiZWNhdXNlIG1vc3QgU09DcyBoYXZlIHNldmVyYWwKK1NQSS1jYXBhYmxlIGNvbnRyb2xsZXJzLCBhbmQgb25seSB0aGUgb25lcyBhY3R1YWxseSB1c2FibGUgb24gYSBnaXZlbgorYm9hcmQgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCB1cCBhbmQgcmVnaXN0ZXJlZC4KKworU28gZm9yIGV4YW1wbGUgYXJjaC8uLi4vbWFjaC0qL2JvYXJkLSouYyBmaWxlcyBtaWdodCBoYXZlIGNvZGUgbGlrZToKKworCSNpbmNsdWRlIDxhc20vYXJjaC9zcGkuaD4JLyogZm9yIG15c29jX3NwaV9kYXRhICovCisKKwkvKiBpZiB5b3VyIG1hY2gtKiBpbmZyYXN0cnVjdHVyZSBkb2Vzbid0IHN1cHBvcnQga2VybmVscyB0aGF0IGNhbgorCSAqIHJ1biBvbiBtdWx0aXBsZSBib2FyZHMsIHBkYXRhIHdvdWxkbid0IGJlbmVmaXQgZnJvbSAiX19pbml0Ii4KKwkgKi8KKwlzdGF0aWMgc3RydWN0IG15c29jX3NwaV9kYXRhIF9faW5pdCBwZGF0YSA9IHsgLi4uIH07CisKKwlzdGF0aWMgX19pbml0IGJvYXJkX2luaXQodm9pZCkKKwl7CisJCS4uLgorCQkvKiB0aGlzIGJvYXJkIG9ubHkgdXNlcyBTUEkgY29udHJvbGxlciAjMiAqLworCQlteXNvY19yZWdpc3Rlcl9zcGkoMiwgJnBkYXRhKTsKKwkJLi4uCisJfQorCitBbmQgU09DLXNwZWNpZmljIHV0aWxpdHkgY29kZSBtaWdodCBsb29rIHNvbWV0aGluZyBsaWtlOgorCisJI2luY2x1ZGUgPGFzbS9hcmNoL3NwaS5oPgorCisJc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3BpMiA9IHsgLi4uIH07CisKKwl2b2lkIG15c29jX3JlZ2lzdGVyX3NwaSh1bnNpZ25lZCBuLCBzdHJ1Y3QgbXlzb2Nfc3BpX2RhdGEgKnBkYXRhKQorCXsKKwkJc3RydWN0IG15c29jX3NwaV9kYXRhICpwZGF0YTI7CisKKwkJcGRhdGEyID0ga21hbGxvYyhzaXplb2YgKnBkYXRhMiwgR0ZQX0tFUk5FTCk7CisJCSpwZGF0YTIgPSBwZGF0YTsKKwkJLi4uCisJCWlmIChuID09IDIpIHsKKwkJCXNwaTItPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGEyOworCQkJcmVnaXN0ZXJfcGxhdGZvcm1fZGV2aWNlKCZzcGkyKTsKKworCQkJLyogYWxzbzogc2V0IHVwIHBpbiBtb2RlcyBzbyB0aGUgc3BpMiBzaWduYWxzIGFyZQorCQkJICogdmlzaWJsZSBvbiB0aGUgcmVsZXZhbnQgcGlucyAuLi4gYm9vdGxvYWRlcnMgb24KKwkJCSAqIHByb2R1Y3Rpb24gYm9hcmRzIG1heSBhbHJlYWR5IGhhdmUgZG9uZSB0aGlzLCBidXQKKwkJCSAqIGRldmVsb3BlciBib2FyZHMgd2lsbCBvZnRlbiBuZWVkIExpbnV4IHRvIGRvIGl0LgorCQkJICovCisJCX0KKwkJLi4uCisJfQorCitOb3RpY2UgaG93IHRoZSBwbGF0Zm9ybV9kYXRhIGZvciBib2FyZHMgbWF5IGJlIGRpZmZlcmVudCwgZXZlbiBpZiB0aGUKK3NhbWUgU09DIGNvbnRyb2xsZXIgaXMgdXNlZC4gIEZvciBleGFtcGxlLCBvbiBvbmUgYm9hcmQgU1BJIG1pZ2h0IHVzZQorYW4gZXh0ZXJuYWwgY2xvY2ssIHdoZXJlIGFub3RoZXIgZGVyaXZlcyB0aGUgU1BJIGNsb2NrIGZyb20gY3VycmVudAorc2V0dGluZ3Mgb2Ygc29tZSBtYXN0ZXIgY2xvY2suCisKKworREVDTEFSRSBTTEFWRSBERVZJQ0VTCisKK1RoZSBzZWNvbmQga2luZCBvZiBpbmZvcm1hdGlvbiBpcyBhIGxpc3Qgb2Ygd2hhdCBTUEkgc2xhdmUgZGV2aWNlcyBleGlzdAorb24gdGhlIHRhcmdldCBib2FyZCwgb2Z0ZW4gd2l0aCBzb21lIGJvYXJkLXNwZWNpZmljIGRhdGEgbmVlZGVkIGZvciB0aGUKK2RyaXZlciB0byB3b3JrIGNvcnJlY3RseS4KKworTm9ybWFsbHkgeW91ciBhcmNoLy4uLi9tYWNoLSovYm9hcmQtKi5jIGZpbGVzIHdvdWxkIHByb3ZpZGUgYSBzbWFsbCB0YWJsZQorbGlzdGluZyB0aGUgU1BJIGRldmljZXMgb24gZWFjaCBib2FyZC4gIChUaGlzIHdvdWxkIHR5cGljYWxseSBiZSBvbmx5IGEKK3NtYWxsIGhhbmRmdWwuKSAgVGhhdCBtaWdodCBsb29rIGxpa2U6CisKKwlzdGF0aWMgc3RydWN0IGFkczc4NDZfcGxhdGZvcm1fZGF0YSBhZHNfaW5mbyA9IHsKKwkJLnZyZWZfZGVsYXlfdXNlY3MJPSAxMDAsCisJCS54X3BsYXRlX29obXMJCT0gNTgwLAorCQkueV9wbGF0ZV9vaG1zCQk9IDQxMCwKKwl9OworCisJc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBzcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkubW9kYWxpYXMJPSAiYWRzNzg0NiIsCisJCS5wbGF0Zm9ybV9kYXRhCT0gJmFkc19pbmZvLAorCQkubW9kZQkJPSBTUElfTU9ERV8wLAorCQkuaXJxCQk9IEdQSU9fSVJRKDMxKSwKKwkJLm1heF9zcGVlZF9oegk9IDEyMDAwMCAvKiBtYXggc2FtcGxlIHJhdGUgYXQgM1YgKi8gKiAxNiwKKwkJLmJ1c19udW0JPSAxLAorCQkuY2hpcF9zZWxlY3QJPSAwLAorCX0sCisJfTsKKworQWdhaW4sIG5vdGljZSBob3cgYm9hcmQtc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQ7IGVhY2ggY2hpcCBtYXkgbmVlZAorc2V2ZXJhbCB0eXBlcy4gIFRoaXMgZXhhbXBsZSBzaG93cyBnZW5lcmljIGNvbnN0cmFpbnRzIGxpa2UgdGhlIGZhc3Rlc3QgU1BJCitjbG9jayB0byBhbGxvdyAoYSBmdW5jdGlvbiBvZiBib2FyZCB2b2x0YWdlIGluIHRoaXMgY2FzZSkgb3IgaG93IGFuIElSUSBwaW4KK2lzIHdpcmVkLCBwbHVzIGNoaXAtc3BlY2lmaWMgY29uc3RyYWludHMgbGlrZSBhbiBpbXBvcnRhbnQgZGVsYXkgdGhhdCdzCitjaGFuZ2VkIGJ5IHRoZSBjYXBhY2l0YW5jZSBhdCBvbmUgcGluLgorCisoVGhlcmUncyBhbHNvICJjb250cm9sbGVyX2RhdGEiLCBpbmZvcm1hdGlvbiB0aGF0IG1heSBiZSB1c2VmdWwgdG8gdGhlCitjb250cm9sbGVyIGRyaXZlci4gIEFuIGV4YW1wbGUgd291bGQgYmUgcGVyaXBoZXJhbC1zcGVjaWZpYyBETUEgdHVuaW5nCitkYXRhIG9yIGNoaXBzZWxlY3QgY2FsbGJhY2tzLiAgVGhpcyBpcyBzdG9yZWQgaW4gc3BpX2RldmljZSBsYXRlci4pCisKK1RoZSBib2FyZF9pbmZvIHNob3VsZCBwcm92aWRlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBsZXQgdGhlIHN5c3RlbSB3b3JrCit3aXRob3V0IHRoZSBjaGlwJ3MgZHJpdmVyIGJlaW5nIGxvYWRlZC4gIFRoZSBtb3N0IHRyb3VibGVzb21lIGFzcGVjdCBvZgordGhhdCBpcyBsaWtlbHkgdGhlIFNQSV9DU19ISUdIIGJpdCBpbiB0aGUgc3BpX2RldmljZS5tb2RlIGZpZWxkLCBzaW5jZQorc2hhcmluZyBhIGJ1cyB3aXRoIGEgZGV2aWNlIHRoYXQgaW50ZXJwcmV0cyBjaGlwc2VsZWN0ICJiYWNrd2FyZHMiIGlzCitub3QgcG9zc2libGUuCisKK1RoZW4geW91ciBib2FyZCBpbml0aWFsaXphdGlvbiBjb2RlIHdvdWxkIHJlZ2lzdGVyIHRoYXQgdGFibGUgd2l0aCB0aGUgU1BJCitpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCBpdCdzIGF2YWlsYWJsZSBsYXRlciB3aGVuIHRoZSBTUEkgbWFzdGVyIGNvbnRyb2xsZXIKK2RyaXZlciBpcyByZWdpc3RlcmVkOgorCisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oc3BpX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoc3BpX2JvYXJkX2luZm8pKTsKKworTGlrZSB3aXRoIG90aGVyIHN0YXRpYyBib2FyZC1zcGVjaWZpYyBzZXR1cCwgeW91IHdvbid0IHVucmVnaXN0ZXIgdGhvc2UuCisKK1RoZSB3aWRlbHkgdXNlZCAiY2FyZCIgc3R5bGUgY29tcHV0ZXJzIGJ1bmRsZSBtZW1vcnksIGNwdSwgYW5kIGxpdHRsZSBlbHNlCitvbnRvIGEgY2FyZCB0aGF0J3MgbWF5YmUganVzdCB0aGlydHkgc3F1YXJlIGNlbnRpbWV0ZXJzLiAgT24gc3VjaCBzeXN0ZW1zLAoreW91ciBhcmNoLy4uLi9tYWNoLS4uLi9ib2FyZC0qLmMgZmlsZSB3b3VsZCBwcmltYXJpbHkgcHJvdmlkZSBpbmZvcm1hdGlvbgorYWJvdXQgdGhlIGRldmljZXMgb24gdGhlIG1haW5ib2FyZCBpbnRvIHdoaWNoIHN1Y2ggYSBjYXJkIGlzIHBsdWdnZWQuICBUaGF0CitjZXJ0YWlubHkgaW5jbHVkZXMgU1BJIGRldmljZXMgaG9va2VkIHVwIHRocm91Z2ggdGhlIGNhcmQgY29ubmVjdG9ycyEKKworCitOT04tU1RBVElDIENPTkZJR1VSQVRJT05TCisKK0RldmVsb3BlciBib2FyZHMgb2Z0ZW4gcGxheSBieSBkaWZmZXJlbnQgcnVsZXMgdGhhbiBwcm9kdWN0IGJvYXJkcywgYW5kIG9uZQorZXhhbXBsZSBpcyB0aGUgcG90ZW50aWFsIG5lZWQgdG8gaG90cGx1ZyBTUEkgZGV2aWNlcyBhbmQvb3IgY29udHJvbGxlcnMuCisKK0ZvciB0aG9zZSBjYXNlcyB5b3UgbWlnaHQgbmVlZCB0byB1c2UgdXNlIHNwaV9idXNudW1fdG9fbWFzdGVyKCkgdG8gbG9vawordXAgdGhlIHNwaSBidXMgbWFzdGVyLCBhbmQgd2lsbCBsaWtlbHkgbmVlZCBzcGlfbmV3X2RldmljZSgpIHRvIHByb3ZpZGUgdGhlCitib2FyZCBpbmZvIGJhc2VkIG9uIHRoZSBib2FyZCB0aGF0IHdhcyBob3RwbHVnZ2VkLiAgT2YgY291cnNlLCB5b3UnZCBsYXRlcgorY2FsbCBhdCBsZWFzdCBzcGlfdW5yZWdpc3Rlcl9kZXZpY2UoKSB3aGVuIHRoYXQgYm9hcmQgaXMgcmVtb3ZlZC4KKworV2hlbiBMaW51eCBpbmNsdWRlcyBzdXBwb3J0IGZvciBNTUMvU0QvU0RJTy9EYXRhRmxhc2ggY2FyZHMgdGhyb3VnaCBTUEksIHRob3NlCitjb25maWd1cmF0aW9ucyB3aWxsIGFsc28gYmUgZHluYW1pYy4gIEZvcnR1bmF0ZWx5LCB0aG9zZSBkZXZpY2VzIGFsbCBzdXBwb3J0CitiYXNpYyBkZXZpY2UgaWRlbnRpZmljYXRpb24gcHJvYmVzLCBzbyB0aGF0IHN1cHBvcnQgc2hvdWxkIGhvdHBsdWcgbm9ybWFsbHkuCisKKworSG93IGRvIEkgd3JpdGUgYW4gIlNQSSBQcm90b2NvbCBEcml2ZXIiPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWxsIFNQSSBkcml2ZXJzIGFyZSBjdXJyZW50bHkga2VybmVsIGRyaXZlcnMuICBBIHVzZXJzcGFjZSBkcml2ZXIgQVBJCit3b3VsZCBqdXN0IGJlIGFub3RoZXIga2VybmVsIGRyaXZlciwgcHJvYmFibHkgb2ZmZXJpbmcgc29tZSBsb3dsZXZlbAorYWNjZXNzIHRocm91Z2ggYWlvX3JlYWQoKSwgYWlvX3dyaXRlKCksIGFuZCBpb2N0bCgpIGNhbGxzIGFuZCB1c2luZyB0aGUKK3N0YW5kYXJkIHVzZXJzcGFjZSBzeXNmcyBtZWNoYW5pc21zIHRvIGJpbmQgdG8gYSBnaXZlbiBTUEkgZGV2aWNlLgorCitTUEkgcHJvdG9jb2wgZHJpdmVycyBzb21ld2hhdCByZXNlbWJsZSBwbGF0Zm9ybSBkZXZpY2UgZHJpdmVyczoKKworCXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBDSElQX2RyaXZlciA9IHsKKwkJLmRyaXZlciA9IHsKKwkJCS5uYW1lCQk9ICJDSElQIiwKKwkJCS5idXMJCT0gJnNwaV9idXNfdHlwZSwKKwkJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJfSwKKworCQkucHJvYmUJCT0gQ0hJUF9wcm9iZSwKKwkJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChDSElQX3JlbW92ZSksCisJCS5zdXNwZW5kCT0gQ0hJUF9zdXNwZW5kLAorCQkucmVzdW1lCQk9IENISVBfcmVzdW1lLAorCX07CisKK1RoZSBkcml2ZXIgY29yZSB3aWxsIGF1dG1hdGljYWxseSBhdHRlbXB0IHRvIGJpbmQgdGhpcyBkcml2ZXIgdG8gYW55IFNQSQorZGV2aWNlIHdob3NlIGJvYXJkX2luZm8gZ2F2ZSBhIG1vZGFsaWFzIG9mICJDSElQIi4gIFlvdXIgcHJvYmUoKSBjb2RlCittaWdodCBsb29rIGxpa2UgdGhpcyB1bmxlc3MgeW91J3JlIGNyZWF0aW5nIGEgY2xhc3NfZGV2aWNlOgorCisJc3RhdGljIGludCBfX2RldmluaXQgQ0hJUF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorCXsKKwkJc3RydWN0IENISVAJCQkqY2hpcDsKKwkJc3RydWN0IENISVBfcGxhdGZvcm1fZGF0YQkqcGRhdGE7CisKKwkJLyogYXNzdW1pbmcgdGhlIGRyaXZlciByZXF1aXJlcyBib2FyZC1zcGVjaWZpYyBkYXRhOiAqLworCQlwZGF0YSA9ICZzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCQlpZiAoIXBkYXRhKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJLyogZ2V0IG1lbW9yeSBmb3IgZHJpdmVyJ3MgcGVyLWNoaXAgc3RhdGUgKi8KKwkJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mICpjaGlwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjaGlwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIGNoaXApOworCisJCS4uLiBldGMKKwkJcmV0dXJuIDA7CisJfQorCitBcyBzb29uIGFzIGl0IGVudGVycyBwcm9iZSgpLCB0aGUgZHJpdmVyIG1heSBpc3N1ZSBJL08gcmVxdWVzdHMgdG8KK3RoZSBTUEkgZGV2aWNlIHVzaW5nICJzdHJ1Y3Qgc3BpX21lc3NhZ2UiLiAgV2hlbiByZW1vdmUoKSByZXR1cm5zLAordGhlIGRyaXZlciBndWFyYW50ZWVzIHRoYXQgaXQgd29uJ3Qgc3VibWl0IGFueSBtb3JlIHN1Y2ggbWVzc2FnZXMuCisKKyAgLSBBbiBzcGlfbWVzc2FnZSBpcyBhIHNlcXVlbmNlIG9mIG9mIHByb3RvY29sIG9wZXJhdGlvbnMsIGV4ZWN1dGVkCisgICAgYXMgb25lIGF0b21pYyBzZXF1ZW5jZS4gIFNQSSBkcml2ZXIgY29udHJvbHMgaW5jbHVkZToKKworICAgICAgKyB3aGVuIGJpZGlyZWN0aW9uYWwgcmVhZHMgYW5kIHdyaXRlcyBzdGFydCAuLi4gYnkgaG93IGl0cworICAgICAgICBzZXF1ZW5jZSBvZiBzcGlfdHJhbnNmZXIgcmVxdWVzdHMgaXMgYXJyYW5nZWQ7CisKKyAgICAgICsgb3B0aW9uYWxseSBkZWZpbmluZyBzaG9ydCBkZWxheXMgYWZ0ZXIgdHJhbnNmZXJzIC4uLiB1c2luZworICAgICAgICB0aGUgc3BpX3RyYW5zZmVyLmRlbGF5X3VzZWNzIHNldHRpbmc7CisKKyAgICAgICsgd2hldGhlciB0aGUgY2hpcHNlbGVjdCBiZWNvbWVzIGluYWN0aXZlIGFmdGVyIGEgdHJhbnNmZXIgYW5kCisgICAgICAgIGFueSBkZWxheSAuLi4gYnkgdXNpbmcgdGhlIHNwaV90cmFuc2Zlci5jc19jaGFuZ2UgZmxhZzsKKworICAgICAgKyBoaW50aW5nIHdoZXRoZXIgdGhlIG5leHQgbWVzc2FnZSBpcyBsaWtlbHkgdG8gZ28gdG8gdGhpcyBzYW1lCisgICAgICAgIGRldmljZSAuLi4gdXNpbmcgdGhlIHNwaV90cmFuc2Zlci5jc19jaGFuZ2UgZmxhZyBvbiB0aGUgbGFzdAorCXRyYW5zZmVyIGluIHRoYXQgYXRvbWljIGdyb3VwLCBhbmQgcG90ZW50aWFsbHkgc2F2aW5nIGNvc3RzCisJZm9yIGNoaXAgZGVzZWxlY3QgYW5kIHNlbGVjdCBvcGVyYXRpb25zLgorCisgIC0gRm9sbG93IHN0YW5kYXJkIGtlcm5lbCBydWxlcywgYW5kIHByb3ZpZGUgRE1BLXNhZmUgYnVmZmVycyBpbgorICAgIHlvdXIgbWVzc2FnZXMuICBUaGF0IHdheSBjb250cm9sbGVyIGRyaXZlcnMgdXNpbmcgRE1BIGFyZW4ndCBmb3JjZWQKKyAgICB0byBtYWtlIGV4dHJhIGNvcGllcyB1bmxlc3MgdGhlIGhhcmR3YXJlIHJlcXVpcmVzIGl0IChlLmcuIHdvcmtpbmcKKyAgICBhcm91bmQgaGFyZHdhcmUgZXJyYXRhIHRoYXQgZm9yY2UgdGhlIHVzZSBvZiBib3VuY2UgYnVmZmVyaW5nKS4KKworICAgIElmIHN0YW5kYXJkIGRtYV9tYXBfc2luZ2xlKCkgaGFuZGxpbmcgb2YgdGhlc2UgYnVmZmVycyBpcyBpbmFwcHJvcHJpYXRlLAorICAgIHlvdSBjYW4gdXNlIHNwaV9tZXNzYWdlLmlzX2RtYV9tYXBwZWQgdG8gdGVsbCB0aGUgY29udHJvbGxlciBkcml2ZXIKKyAgICB0aGF0IHlvdSd2ZSBhbHJlYWR5IHByb3ZpZGVkIHRoZSByZWxldmFudCBETUEgYWRkcmVzc2VzLgorCisgIC0gVGhlIGJhc2ljIEkvTyBwcmltaXRpdmUgaXMgc3BpX2FzeW5jKCkuICBBc3luYyByZXF1ZXN0cyBtYXkgYmUKKyAgICBpc3N1ZWQgaW4gYW55IGNvbnRleHQgKGlycSBoYW5kbGVyLCB0YXNrLCBldGMpIGFuZCBjb21wbGV0aW9uCisgICAgaXMgcmVwb3J0ZWQgdXNpbmcgYSBjYWxsYmFjayBwcm92aWRlZCB3aXRoIHRoZSBtZXNzYWdlLgorICAgIEFmdGVyIGFueSBkZXRlY3RlZCBlcnJvciwgdGhlIGNoaXAgaXMgZGVzZWxlY3RlZCBhbmQgcHJvY2Vzc2luZworICAgIG9mIHRoYXQgc3BpX21lc3NhZ2UgaXMgYWJvcnRlZC4KKworICAtIFRoZXJlIGFyZSBhbHNvIHN5bmNocm9ub3VzIHdyYXBwZXJzIGxpa2Ugc3BpX3N5bmMoKSwgYW5kIHdyYXBwZXJzCisgICAgbGlrZSBzcGlfcmVhZCgpLCBzcGlfd3JpdGUoKSwgYW5kIHNwaV93cml0ZV90aGVuX3JlYWQoKS4gIFRoZXNlCisgICAgbWF5IGJlIGlzc3VlZCBvbmx5IGluIGNvbnRleHRzIHRoYXQgbWF5IHNsZWVwLCBhbmQgdGhleSdyZSBhbGwKKyAgICBjbGVhbiAoYW5kIHNtYWxsLCBhbmQgIm9wdGlvbmFsIikgbGF5ZXJzIG92ZXIgc3BpX2FzeW5jKCkuCisKKyAgLSBUaGUgc3BpX3dyaXRlX3RoZW5fcmVhZCgpIGNhbGwsIGFuZCBjb252ZW5pZW5jZSB3cmFwcGVycyBhcm91bmQKKyAgICBpdCwgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHNtYWxsIGFtb3VudHMgb2YgZGF0YSB3aGVyZSB0aGUKKyAgICBjb3N0IG9mIGFuIGV4dHJhIGNvcHkgbWF5IGJlIGlnbm9yZWQuICBJdCdzIGRlc2lnbmVkIHRvIHN1cHBvcnQKKyAgICBjb21tb24gUlBDLXN0eWxlIHJlcXVlc3RzLCBzdWNoIGFzIHdyaXRpbmcgYW4gZWlnaHQgYml0IGNvbW1hbmQKKyAgICBhbmQgcmVhZGluZyBhIHNpeHRlZW4gYml0IHJlc3BvbnNlIC0tIHNwaV93OHIxNigpIGJlaW5nIG9uZSBpdHMKKyAgICB3cmFwcGVycywgZG9pbmcgZXhhY3RseSB0aGF0LgorCitTb21lIGRyaXZlcnMgbWF5IG5lZWQgdG8gbW9kaWZ5IHNwaV9kZXZpY2UgY2hhcmFjdGVyaXN0aWNzIGxpa2UgdGhlCit0cmFuc2ZlciBtb2RlLCB3b3Jkc2l6ZSwgb3IgY2xvY2sgcmF0ZS4gIFRoaXMgaXMgZG9uZSB3aXRoIHNwaV9zZXR1cCgpLAord2hpY2ggd291bGQgbm9ybWFsbHkgYmUgY2FsbGVkIGZyb20gcHJvYmUoKSBiZWZvcmUgdGhlIGZpcnN0IEkvTyBpcworZG9uZSB0byB0aGUgZGV2aWNlLgorCitXaGlsZSAic3BpX2RldmljZSIgd291bGQgYmUgdGhlIGJvdHRvbSBib3VuZGFyeSBvZiB0aGUgZHJpdmVyLCB0aGUKK3VwcGVyIGJvdW5kYXJpZXMgbWlnaHQgaW5jbHVkZSBzeXNmcyAoZXNwZWNpYWxseSBmb3Igc2Vuc29yIHJlYWRpbmdzKSwKK3RoZSBpbnB1dCBsYXllciwgQUxTQSwgbmV0d29ya2luZywgTVRELCB0aGUgY2hhcmFjdGVyIGRldmljZSBmcmFtZXdvcmssCitvciBvdGhlciBMaW51eCBzdWJzeXN0ZW1zLgorCitOb3RlIHRoYXQgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBtZW1vcnkgeW91ciBkcml2ZXIgbXVzdCBtYW5hZ2UgYXMgcGFydAorb2YgaW50ZXJhY3Rpbmcgd2l0aCBTUEkgZGV2aWNlcy4KKworICAtIEkvTyBidWZmZXJzIHVzZSB0aGUgdXN1YWwgTGludXggcnVsZXMsIGFuZCBtdXN0IGJlIERNQS1zYWZlLgorICAgIFlvdSdkIG5vcm1hbGx5IGFsbG9jYXRlIHRoZW0gZnJvbSB0aGUgaGVhcCBvciBmcmVlIHBhZ2UgcG9vbC4KKyAgICBEb24ndCB1c2UgdGhlIHN0YWNrLCBvciBhbnl0aGluZyB0aGF0J3MgZGVjbGFyZWQgInN0YXRpYyIuCisKKyAgLSBUaGUgc3BpX21lc3NhZ2UgYW5kIHNwaV90cmFuc2ZlciBtZXRhZGF0YSB1c2VkIHRvIGdsdWUgdGhvc2UKKyAgICBJL08gYnVmZmVycyBpbnRvIGEgZ3JvdXAgb2YgcHJvdG9jb2wgdHJhbnNhY3Rpb25zLiAgVGhlc2UgY2FuCisgICAgYmUgYWxsb2NhdGVkIGFueXdoZXJlIGl0J3MgY29udmVuaWVudCwgaW5jbHVkaW5nIGFzIHBhcnQgb2YKKyAgICBvdGhlciBhbGxvY2F0ZS1vbmNlIGRyaXZlciBkYXRhIHN0cnVjdHVyZXMuICBaZXJvLWluaXQgdGhlc2UuCisKK0lmIHlvdSBsaWtlLCBzcGlfbWVzc2FnZV9hbGxvYygpIGFuZCBzcGlfbWVzc2FnZV9mcmVlKCkgY29udmVuaWVuY2UKK3JvdXRpbmVzIGFyZSBhdmFpbGFibGUgdG8gYWxsb2NhdGUgYW5kIHplcm8taW5pdGlhbGl6ZSBhbiBzcGlfbWVzc2FnZQord2l0aCBzZXZlcmFsIHRyYW5zZmVycy4KKworCitIb3cgZG8gSSB3cml0ZSBhbiAiU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlciI/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBbiBTUEkgY29udHJvbGxlciB3aWxsIHByb2JhYmx5IGJlIHJlZ2lzdGVyZWQgb24gdGhlIHBsYXRmb3JtX2J1czsgd3JpdGUKK2EgZHJpdmVyIHRvIGJpbmQgdG8gdGhlIGRldmljZSwgd2hpY2hldmVyIGJ1cyBpcyBpbnZvbHZlZC4KKworVGhlIG1haW4gdGFzayBvZiB0aGlzIHR5cGUgb2YgZHJpdmVyIGlzIHRvIHByb3ZpZGUgYW4gInNwaV9tYXN0ZXIiLgorVXNlIHNwaV9hbGxvY19tYXN0ZXIoKSB0byBhbGxvY2F0ZSB0aGUgbWFzdGVyLCBhbmQgY2xhc3NfZ2V0X2RldmRhdGEoKQordG8gZ2V0IHRoZSBkcml2ZXItcHJpdmF0ZSBkYXRhIGFsbG9jYXRlZCBmb3IgdGhhdCBkZXZpY2UuCisKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXN0cnVjdCBDT05UUk9MTEVSCSpjOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZiAqYyk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiAtRU5PREVWOworCisJYyA9IGNsYXNzX2dldF9kZXZkYXRhKCZtYXN0ZXItPmNkZXYpOworCitUaGUgZHJpdmVyIHdpbGwgaW5pdGlhbGl6ZSB0aGUgZmllbGRzIG9mIHRoYXQgc3BpX21hc3RlciwgaW5jbHVkaW5nIHRoZQorYnVzIG51bWJlciAobWF5YmUgdGhlIHNhbWUgYXMgdGhlIHBsYXRmb3JtIGRldmljZSBJRCkgYW5kIHRocmVlIG1ldGhvZHMKK3VzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgU1BJIGNvcmUgYW5kIFNQSSBwcm90b2NvbCBkcml2ZXJzLiAgSXQgd2lsbAorYWxzbyBpbml0aWFsaXplIGl0cyBvd24gaW50ZXJuYWwgc3RhdGUuCisKKyAgICBtYXN0ZXItPnNldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCisJVGhpcyBzZXRzIHVwIHRoZSBkZXZpY2UgY2xvY2sgcmF0ZSwgU1BJIG1vZGUsIGFuZCB3b3JkIHNpemVzLgorCURyaXZlcnMgbWF5IGNoYW5nZSB0aGUgZGVmYXVsdHMgcHJvdmlkZWQgYnkgYm9hcmRfaW5mbywgYW5kIHRoZW4KKwljYWxsIHNwaV9zZXR1cChzcGkpIHRvIGludm9rZSB0aGlzIHJvdXRpbmUuICBJdCBtYXkgc2xlZXAuCisKKyAgICBtYXN0ZXItPnRyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzc2FnZSkKKyAgICAJVGhpcyBtdXN0IG5vdCBzbGVlcC4gIEl0cyByZXNwb25zaWJpbGl0eSBpcyBhcnJhbmdlIHRoYXQgdGhlCisJdHJhbnNmZXIgaGFwcGVucyBhbmQgaXRzIGNvbXBsZXRlKCkgY2FsbGJhY2sgaXMgaXNzdWVkOyB0aGUgdHdvCisJd2lsbCBub3JtYWxseSBoYXBwZW4gbGF0ZXIsIGFmdGVyIG90aGVyIHRyYW5zZmVycyBjb21wbGV0ZS4KKworICAgIG1hc3Rlci0+Y2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorCVlvdXIgY29udHJvbGxlciBkcml2ZXIgbWF5IHVzZSBzcGlfZGV2aWNlLmNvbnRyb2xsZXJfc3RhdGUgdG8gaG9sZAorCXN0YXRlIGl0IGR5bmFtaWNhbGx5IGFzc29jaWF0ZXMgd2l0aCB0aGF0IGRldmljZS4gIElmIHlvdSBkbyB0aGF0LAorCWJlIHN1cmUgdG8gcHJvdmlkZSB0aGUgY2xlYW51cCgpIG1ldGhvZCB0byBmcmVlIHRoYXQgc3RhdGUuCisKK1RoZSBidWxrIG9mIHRoZSBkcml2ZXIgd2lsbCBiZSBtYW5hZ2luZyB0aGUgSS9PIHF1ZXVlIGZlZCBieSB0cmFuc2ZlcigpLgorCitUaGF0IHF1ZXVlIGNvdWxkIGJlIHB1cmVseSBjb25jZXB0dWFsLiAgRm9yIGV4YW1wbGUsIGEgZHJpdmVyIHVzZWQgb25seQorZm9yIGxvdy1mcmVxdWVuY3kgc2Vuc29yIGFjZXNzIG1pZ2h0IGJlIGZpbmUgdXNpbmcgc3luY2hyb25vdXMgUElPLgorCitCdXQgdGhlIHF1ZXVlIHdpbGwgcHJvYmFibHkgYmUgdmVyeSByZWFsLCB1c2luZyBtZXNzYWdlLT5xdWV1ZSwgUElPLAorb2Z0ZW4gRE1BIChlc3BlY2lhbGx5IGlmIHRoZSByb290IGZpbGVzeXN0ZW0gaXMgaW4gU1BJIGZsYXNoKSwgYW5kCitleGVjdXRpb24gY29udGV4dHMgbGlrZSBJUlEgaGFuZGxlcnMsIHRhc2tsZXRzLCBvciB3b3JrcXVldWVzIChzdWNoCithcyBrZXZlbnRkKS4gIFlvdXIgZHJpdmVyIGNhbiBiZSBhcyBmYW5jeSwgb3IgYXMgc2ltcGxlLCBhcyB5b3UgbmVlZC4KKworCitUSEFOS1MgVE8KKy0tLS0tLS0tLQorQ29udHJpYnV0b3JzIHRvIExpbnV4LVNQSSBkaXNjdXNzaW9ucyBpbmNsdWRlIChpbiBhbHBoYWJldGljYWwgb3JkZXIsCitieSBsYXN0IG5hbWUpOgorCitEYXZpZCBCcm93bmVsbAorUnVzc2VsbCBLaW5nCitEbWl0cnkgUGVydnVzaGluCitTdGVwaGVuIFN0cmVldAorTWFyayBVbmRlcndvb2QKK0FuZHJldyBWaWN0b3IKK1ZpdGFseSBXb29sCisKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggMGRiNzJhMy4uNzE2OTNjNSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTI1MTksNiArMjUxOSwxOSBAQAogTTogICAgIHJvbXNAbHBnLnRpY2FsYy5vcmcKIFM6ICAgICBNYWludGFpbmVkCiAKK1RJUEMgTkVUV09SSyBMQVlFUgorUDoJUGVyIExpZGVuCitNOglwZXIubGlkZW5Abm9zcGFtLmVyaWNzc29uLmNvbQorUDoJSm9uIE1hbG95CitNOglqb24ubWFsb3lAbm9zcGFtLmVyaWNzc29uLmNvbQorUDoJQWxsYW4gU3RlcGhlbnMKK006CWFsbGFuLnN0ZXBoZW5zQG5vc3BhbS53aW5kcml2ZXIuY29tCitMOgl0aXBjLWRpc2N1c3Npb25AbGlzdHMuc291cmNlZm9yZ2UubmV0CitXOglodHRwOi8vdGlwYy5zb3VyY2Vmb3JnZS5uZXQvCitXOglodHRwOi8vdGlwYy5jc2xhYi5lcmljc3Nvbi5uZXQvCitUOglnaXQgdGlwYy5jc2xhYi5lcmljc3Nvbi5uZXQ6L3B1Yi9naXQvdGlwYy5naXQKK1M6CU1haW50YWluZWQKKwogVExBTiBORVRXT1JLIERSSVZFUgogUDoJU2FtdWVsIENoZXNzbWFuCiBNOgljaGVzc21hbkB0dXgub3JnCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYWJiNzM5Yi4uOTkyNGZkMCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjc2LDcgKzI3Niw3IEBACiB7CiAJZXh0ZXJuIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKTsKIAotCXN0cnVjdCB0aHJlYWRfaW5mbyAqY2hpbGR0aSA9IHAtPnRocmVhZF9pbmZvOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqY2hpbGR0aSA9IHRhc2tfdGhyZWFkX2luZm8ocCk7CiAJc3RydWN0IHB0X3JlZ3MgKiBjaGlsZHJlZ3M7CiAJc3RydWN0IHN3aXRjaF9zdGFjayAqIGNoaWxkc3RhY2ssICpzdGFjazsKIAl1bnNpZ25lZCBsb25nIHN0YWNrX29mZnNldCwgc2V0dGxzOwpAQCAtMjg1LDcgKzI4NSw3IEBACiAJaWYgKCEocmVncy0+cHMgJiA4KSkKIAkJc3RhY2tfb2Zmc2V0ID0gKFBBR0VfU0laRS0xKSAmICh1bnNpZ25lZCBsb25nKSByZWdzOwogCWNoaWxkcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKQotCSAgKHN0YWNrX29mZnNldCArIFBBR0VfU0laRSArIChsb25nKSBjaGlsZHRpKTsKKwkgIChzdGFja19vZmZzZXQgKyBQQUdFX1NJWkUgKyB0YXNrX3N0YWNrX3BhZ2UocCkpOwogCQkKIAkqY2hpbGRyZWdzID0gKnJlZ3M7CiAJc2V0dGxzID0gcmVncy0+cjIwOwpAQCAtNDI4LDMwICs0MjgsMTUgQEAKIGludAogZHVtcF9lbGZfdGFzayhlbGZfZ3JlZ190ICpkZXN0LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aTsKLQlzdHJ1Y3QgcHRfcmVncyAqcHQ7Ci0KLQl0aSA9IHRhc2stPnRocmVhZF9pbmZvOwotCXB0ID0gKHN0cnVjdCBwdF9yZWdzICopKCh1bnNpZ25lZCBsb25nKXRpICsgMipQQUdFX1NJWkUpIC0gMTsKLQotCWR1bXBfZWxmX3RocmVhZChkZXN0LCBwdCwgdGkpOwotCisJZHVtcF9lbGZfdGhyZWFkKGRlc3QsIHRhc2tfcHRfcmVncyh0YXNrKSwgdGFza190aHJlYWRfaW5mbyh0YXNrKSk7CiAJcmV0dXJuIDE7CiB9CiAKIGludAogZHVtcF9lbGZfdGFza19mcChlbGZfZnByZWdfdCAqZGVzdCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGk7Ci0Jc3RydWN0IHB0X3JlZ3MgKnB0OwotCXN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3OwotCi0JdGkgPSB0YXNrLT50aHJlYWRfaW5mbzsKLQlwdCA9IChzdHJ1Y3QgcHRfcmVncyAqKSgodW5zaWduZWQgbG9uZyl0aSArIDIqUEFHRV9TSVpFKSAtIDE7Ci0Jc3cgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKXB0IC0gMTsKLQorCXN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3ID0gKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKil0YXNrX3B0X3JlZ3ModGFzaykgLSAxOwogCW1lbWNweShkZXN0LCBzdy0+ZnAsIDMyICogOCk7Ci0KIAlyZXR1cm4gMTsKIH0KIApAQCAtNDkyLDggKzQ3Nyw4IEBACiB1bnNpZ25lZCBsb25nCiB0aHJlYWRfc2F2ZWRfcGModGFza190ICp0KQogewotCXVuc2lnbmVkIGxvbmcgYmFzZSA9ICh1bnNpZ25lZCBsb25nKXQtPnRocmVhZF9pbmZvOwotCXVuc2lnbmVkIGxvbmcgZnAsIHNwID0gdC0+dGhyZWFkX2luZm8tPnBjYi5rc3A7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHQpOworCXVuc2lnbmVkIGxvbmcgZnAsIHNwID0gdGFza190aHJlYWRfaW5mbyh0KS0+cGNiLmtzcDsKIAogCWlmIChzcCA+IGJhc2UgJiYgc3ArNio4IDwgYmFzZSArIDE2KjEwMjQpIHsKIAkJZnAgPSAoKHVuc2lnbmVkIGxvbmcqKXNwKVs2XTsKQEAgLTUyMyw3ICs1MDgsNyBAQAogCiAJcGMgPSB0aHJlYWRfc2F2ZWRfcGMocCk7CiAJaWYgKGluX3NjaGVkX2Z1bmN0aW9ucyhwYykpIHsKLQkJc2NoZWR1bGVfZnJhbWUgPSAoKHVuc2lnbmVkIGxvbmcgKilwLT50aHJlYWRfaW5mby0+cGNiLmtzcClbNl07CisJCXNjaGVkdWxlX2ZyYW1lID0gKCh1bnNpZ25lZCBsb25nICopdGFza190aHJlYWRfaW5mbyhwKS0+cGNiLmtzcClbNl07CiAJCXJldHVybiAoKHVuc2lnbmVkIGxvbmcgKilzY2hlZHVsZV9mcmFtZSlbMTJdOwogCX0KIAlyZXR1cm4gcGM7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jCmluZGV4IDk5NjlkMjEuLjBjZDA2MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jCkBAIC03Miw2ICs3MiwxMyBAQAogCVJFR19SMCA9IDAsIFJFR19GMCA9IDMyLCBSRUdfRlBDUiA9IDYzLCBSRUdfUEMgPSA2NAogfTsKIAorI2RlZmluZSBQVF9SRUcocmVnKSBcCisgIChQQUdFX1NJWkUqMiAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykgKyBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnKSkKKworI2RlZmluZSBTV19SRUcocmVnKSBcCisgKFBBR0VfU0laRSoyIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSAtIHNpemVvZihzdHJ1Y3Qgc3dpdGNoX3N0YWNrKSBcCisgICsgb2Zmc2V0b2Yoc3RydWN0IHN3aXRjaF9zdGFjaywgcmVnKSkKKwogc3RhdGljIGludCByZWdvZmZbXSA9IHsKIAlQVF9SRUcoCSAgIHIwKSwgUFRfUkVHKAkgICByMSksIFBUX1JFRygJICAgcjIpLCBQVF9SRUcoCSAgcjMpLAogCVBUX1JFRygJICAgcjQpLCBQVF9SRUcoCSAgIHI1KSwgUFRfUkVHKAkgICByNiksIFBUX1JFRygJICByNyksCkBAIC0xMDMsMTQgKzExMCwxNCBAQAogCXVuc2lnbmVkIGxvbmcgKmFkZHI7CiAKIAlpZiAocmVnbm8gPT0gMzApIHsKLQkJYWRkciA9ICZ0YXNrLT50aHJlYWRfaW5mby0+cGNiLnVzcDsKKwkJYWRkciA9ICZ0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5wY2IudXNwOwogCX0gZWxzZSBpZiAocmVnbm8gPT0gNjUpIHsKLQkJYWRkciA9ICZ0YXNrLT50aHJlYWRfaW5mby0+cGNiLnVuaXF1ZTsKKwkJYWRkciA9ICZ0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5wY2IudW5pcXVlOwogCX0gZWxzZSBpZiAocmVnbm8gPT0gMzEgfHwgcmVnbm8gPiA2NSkgewogCQl6ZXJvID0gMDsKIAkJYWRkciA9ICZ6ZXJvOwogCX0gZWxzZSB7Ci0JCWFkZHIgPSAodm9pZCAqKXRhc2stPnRocmVhZF9pbmZvICsgcmVnb2ZmW3JlZ25vXTsKKwkJYWRkciA9IHRhc2tfc3RhY2tfcGFnZSh0YXNrKSArIHJlZ29mZltyZWdub107CiAJfQogCXJldHVybiBhZGRyOwogfQpAQCAtMTI1LDcgKzEzMiw3IEBACiAJaWYgKHJlZ25vID09IDYzKSB7CiAJCXVuc2lnbmVkIGxvbmcgZnBjciA9ICpnZXRfcmVnX2FkZHIodGFzaywgcmVnbm8pOwogCQl1bnNpZ25lZCBsb25nIHN3Y3IKLQkJICA9IHRhc2stPnRocmVhZF9pbmZvLT5pZWVlX3N0YXRlICYgSUVFRV9TV19NQVNLOworCQkgID0gdGFza190aHJlYWRfaW5mbyh0YXNrKS0+aWVlZV9zdGF0ZSAmIElFRUVfU1dfTUFTSzsKIAkJc3djciA9IHN3Y3JfdXBkYXRlX3N0YXR1cyhzd2NyLCBmcGNyKTsKIAkJcmV0dXJuIGZwY3IgfCBzd2NyOwogCX0KQEAgLTEzOSw4ICsxNDYsOCBAQAogcHV0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgcmVnbm8sIHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlpZiAocmVnbm8gPT0gNjMpIHsKLQkJdGFzay0+dGhyZWFkX2luZm8tPmllZWVfc3RhdGUKLQkJICA9ICgodGFzay0+dGhyZWFkX2luZm8tPmllZWVfc3RhdGUgJiB+SUVFRV9TV19NQVNLKQorCQl0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5pZWVlX3N0YXRlCisJCSAgPSAoKHRhc2tfdGhyZWFkX2luZm8odGFzayktPmllZWVfc3RhdGUgJiB+SUVFRV9TV19NQVNLKQogCQkgICAgIHwgKGRhdGEgJiBJRUVFX1NXX01BU0spKTsKIAkJZGF0YSA9IChkYXRhICYgRlBDUl9EWU5fTUFTSykgfCBpZWVlX3N3Y3JfdG9fZnBjcihkYXRhKTsKIAl9CkBAIC0xODgsMzUgKzE5NSwzNSBAQAogCQkgKiBicmFuY2ggKGVtdWxhdGlvbiBjYW4gYmUgdHJpY2t5IGZvciBmcCBicmFuY2hlcykuCiAJCSAqLwogCQlkaXNwbCA9ICgoczMyKShpbnNuIDw8IDExKSkgPj4gOTsKLQkJY2hpbGQtPnRocmVhZF9pbmZvLT5icHRfYWRkcltuc2F2ZWQrK10gPSBwYyArIDQ7CisJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5icHRfYWRkcltuc2F2ZWQrK10gPSBwYyArIDQ7CiAJCWlmIChkaXNwbCkJCS8qIGd1YXJkIGFnYWluc3QgdW5vcHRpbWl6ZWQgY29kZSAqLwotCQkJY2hpbGQtPnRocmVhZF9pbmZvLT5icHRfYWRkcltuc2F2ZWQrK10KKwkJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5icHRfYWRkcltuc2F2ZWQrK10KIAkJCSAgPSBwYyArIDQgKyBkaXNwbDsKIAkJREJHKERCR19CUFQsICgiZXhlY2luZyBicmFuY2hcbiIpKTsKIAl9IGVsc2UgaWYgKG9wX2NvZGUgPT0gMHgxYSkgewogCQlyZWdfYiA9IChpbnNuID4+IDE2KSAmIDB4MWY7Ci0JCWNoaWxkLT50aHJlYWRfaW5mby0+YnB0X2FkZHJbbnNhdmVkKytdID0gZ2V0X3JlZyhjaGlsZCwgcmVnX2IpOworCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+YnB0X2FkZHJbbnNhdmVkKytdID0gZ2V0X3JlZyhjaGlsZCwgcmVnX2IpOwogCQlEQkcoREJHX0JQVCwgKCJleGVjaW5nIGp1bXBcbiIpKTsKIAl9IGVsc2UgewotCQljaGlsZC0+dGhyZWFkX2luZm8tPmJwdF9hZGRyW25zYXZlZCsrXSA9IHBjICsgNDsKKwkJdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmJwdF9hZGRyW25zYXZlZCsrXSA9IHBjICsgNDsKIAkJREJHKERCR19CUFQsICgiZXhlY2luZyBub3JtYWwgaW5zblxuIikpOwogCX0KIAogCS8qIGluc3RhbGwgYnJlYWtwb2ludHM6ICovCiAJZm9yIChpID0gMDsgaSA8IG5zYXZlZDsgKytpKSB7Ci0JCXJlcyA9IHJlYWRfaW50KGNoaWxkLCBjaGlsZC0+dGhyZWFkX2luZm8tPmJwdF9hZGRyW2ldLAorCQlyZXMgPSByZWFkX2ludChjaGlsZCwgdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmJwdF9hZGRyW2ldLAogCQkJICAgICAgIChpbnQgKikgJmluc24pOwogCQlpZiAocmVzIDwgMCkKIAkJCXJldHVybiByZXM7Ci0JCWNoaWxkLT50aHJlYWRfaW5mby0+YnB0X2luc25baV0gPSBpbnNuOworCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+YnB0X2luc25baV0gPSBpbnNuOwogCQlEQkcoREJHX0JQVCwgKCIgICAgLT4gbmV4dF9wYz0lbHhcbiIsCi0JCQkgICAgICBjaGlsZC0+dGhyZWFkX2luZm8tPmJwdF9hZGRyW2ldKSk7Ci0JCXJlcyA9IHdyaXRlX2ludChjaGlsZCwgY2hpbGQtPnRocmVhZF9pbmZvLT5icHRfYWRkcltpXSwKKwkJCSAgICAgIHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5icHRfYWRkcltpXSkpOworCQlyZXMgPSB3cml0ZV9pbnQoY2hpbGQsIHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5icHRfYWRkcltpXSwKIAkJCQlCUkVBS0lOU1QpOwogCQlpZiAocmVzIDwgMCkKIAkJCXJldHVybiByZXM7CiAJfQotCWNoaWxkLT50aHJlYWRfaW5mby0+YnB0X25zYXZlZCA9IG5zYXZlZDsKKwl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+YnB0X25zYXZlZCA9IG5zYXZlZDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI3LDkgKzIzNCw5IEBACiBpbnQKIHB0cmFjZV9jYW5jZWxfYnB0KHN0cnVjdCB0YXNrX3N0cnVjdCAqIGNoaWxkKQogewotCWludCBpLCBuc2F2ZWQgPSBjaGlsZC0+dGhyZWFkX2luZm8tPmJwdF9uc2F2ZWQ7CisJaW50IGksIG5zYXZlZCA9IHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5icHRfbnNhdmVkOwogCi0JY2hpbGQtPnRocmVhZF9pbmZvLT5icHRfbnNhdmVkID0gMDsKKwl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+YnB0X25zYXZlZCA9IDA7CiAKIAlpZiAobnNhdmVkID4gMikgewogCQlwcmludGsoInB0cmFjZV9jYW5jZWxfYnB0OiBib2d1cyBuc2F2ZWQ6ICVkIVxuIiwgbnNhdmVkKTsKQEAgLTIzNyw4ICsyNDQsOCBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBuc2F2ZWQ7ICsraSkgewotCQl3cml0ZV9pbnQoY2hpbGQsIGNoaWxkLT50aHJlYWRfaW5mby0+YnB0X2FkZHJbaV0sCi0JCQkgIGNoaWxkLT50aHJlYWRfaW5mby0+YnB0X2luc25baV0pOworCQl3cml0ZV9pbnQoY2hpbGQsIHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5icHRfYWRkcltpXSwKKwkJCSAgdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmJwdF9pbnNuW2ldKTsKIAl9CiAJcmV0dXJuIChuc2F2ZWQgIT0gMCk7CiB9CkBAIC0zNTUsNyArMzYyLDcgQEAKIAkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpCiAJCQlicmVhazsKIAkJLyogTWFyayBzaW5nbGUgc3RlcHBpbmcuICAqLwotCQljaGlsZC0+dGhyZWFkX2luZm8tPmJwdF9uc2F2ZWQgPSAtMTsKKwkJdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmJwdF9uc2F2ZWQgPSAtMTsKIAkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7CiAJCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOwogCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYwppbmRleCBkYTBiZTM0Li40Yjg3MzUyIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYwpAQCAtMzAyLDcgKzMwMiw3IEBACiAJCSArIGh3cnBiLT5wcm9jZXNzb3Jfb2Zmc2V0CiAJCSArIGNwdWlkICogaHdycGItPnByb2Nlc3Nvcl9zaXplKTsKIAlod3BjYiA9IChzdHJ1Y3QgcGNiX3N0cnVjdCAqKSBjcHUtPmh3cGNiOwotCWlwY2IgPSAmaWRsZS0+dGhyZWFkX2luZm8tPnBjYjsKKwlpcGNiID0gJnRhc2tfdGhyZWFkX2luZm8oaWRsZSktPnBjYjsKIAogCS8qIEluaXRpYWxpemUgdGhlIENQVSdzIEhXUENCIHRvIHNvbWV0aGluZyBqdXN0IGdvb2QgZW5vdWdoIGZvcgogCSAgIHVzIHRvIGdldCBzdGFydGVkLiAgSW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnRpbmcsIHdlJ2xsIHN3cGN0eApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggNTBiOWFmYS4uM2NmZDgyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC03MjksNiArNzI5LDggQEAKIAogc291cmNlICJkcml2ZXJzL2kyYy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3BpL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9od21vbi9LY29uZmlnIgogCiAjc291cmNlICJkcml2ZXJzL2wzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUwppbmRleCA2YWJhZmI2Li5hYWE0NzQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCisrKyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKQEAgLTg0LDcgKzg0LDcgQEAKIAkJa3B1dGMJIydcbicKIAkJa3BoZXgJcjUsIDgJCS8qIGRlY29tcHJlc3NlZCBrZXJuZWwgc3RhcnQgKi8KIAkJa3B1dGMJIyctJwotCQlrcGhleAlyOCwgOAkJLyogZGVjb21wcmVzc2VkIGtlcm5lbCBlbmQgICovCisJCWtwaGV4CXI5LCA4CQkvKiBkZWNvbXByZXNzZWQga2VybmVsIGVuZCAgKi8KIAkJa3B1dGMJIyc+JwogCQlrcGhleAlyNCwgOAkJLyoga2VybmVsIGV4ZWN1dGlvbiBhZGRyZXNzICovCiAJCWtwdXRjCSMnXG4nCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJLndvcmQJc3RhcnQJCQlAIGFic29sdXRlIGxvYWQvcnVuIHpJbWFnZSBhZGRyZXNzCiAJCS53b3JkCV9lZGF0YQkJCUAgekltYWdlIGVuZCBhZGRyZXNzCiAxOgkJbW92CXI3LCByMQkJCUAgc2F2ZSBhcmNoaXRlY3R1cmUgSUQKLQkJbW92CXI4LCAjMAkJCUAgc2F2ZSByMAorCQltb3YJcjgsIHIyCQkJQCBzYXZlIGF0YWdzIHBvaW50ZXIKIAogI2lmbmRlZiBfX0FSTV9BUkNIXzJfXwogCQkvKgpAQCAtMTQ0LDcgKzE0NCw3IEBACiAKIAkJLyoKIAkJICogc29tZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29kZSBjYW4gYmUgaW5zZXJ0ZWQKLQkJICogYnkgdGhlIGxpbmtlciBoZXJlLCBidXQgaXQgc2hvdWxkIHByZXNlcnZlIHI3IGFuZCByOC4KKwkJICogYnkgdGhlIGxpbmtlciBoZXJlLCBidXQgaXQgc2hvdWxkIHByZXNlcnZlIHI3LCByOCwgYW5kIHI5LgogCQkgKi8KIAogCQkudGV4dApAQCAtMjQ5LDE2ICsyNDksMTcgQEAKICAqIHI1ICAgICA9IGRlY29tcHJlc3NlZCBrZXJuZWwgc3RhcnQKICAqIHI2ICAgICA9IHByb2Nlc3NvciBJRAogICogcjcgICAgID0gYXJjaGl0ZWN0dXJlIElECi0gKiByOC1yMTQgPSB1bnVzZWQKKyAqIHI4ICAgICA9IGF0YWdzIHBvaW50ZXIKKyAqIHI5LXIxNCA9IGNvcnJ1cHRlZAogICovCiAJCWFkZAlyMSwgcjUsIHIwCQlAIGVuZCBvZiBkZWNvbXByZXNzZWQga2VybmVsCiAJCWFkcglyMiwgcmVsb2Nfc3RhcnQKIAkJbGRyCXIzLCBMQzEKIAkJYWRkCXIzLCByMiwgcjMKLTE6CQlsZG1pYQlyMiEsIHtyOCAtIHIxM30JCUAgY29weSByZWxvY2F0aW9uIGNvZGUKLQkJc3RtaWEJcjEhLCB7cjggLSByMTN9Ci0JCWxkbWlhCXIyISwge3I4IC0gcjEzfQotCQlzdG1pYQlyMSEsIHtyOCAtIHIxM30KKzE6CQlsZG1pYQlyMiEsIHtyOSAtIHIxNH0JCUAgY29weSByZWxvY2F0aW9uIGNvZGUKKwkJc3RtaWEJcjEhLCB7cjkgLSByMTR9CisJCWxkbWlhCXIyISwge3I5IC0gcjE0fQorCQlzdG1pYQlyMSEsIHtyOSAtIHIxNH0KIAkJY21wCXIyLCByMwogCQlibG8JMWIKIApAQCAtMzA4LDExICszMDksMTIgQEAKICAqICByNCA9IGtlcm5lbCBleGVjdXRpb24gYWRkcmVzcwogICogIHI2ID0gcHJvY2Vzc29yIElECiAgKiAgcjcgPSBhcmNoaXRlY3R1cmUgbnVtYmVyCi0gKiAgcjggPSBydW4tdGltZSBhZGRyZXNzIG9mICJzdGFydCIKKyAqICByOCA9IGF0YWdzIHBvaW50ZXIKKyAqICByOSA9IHJ1bi10aW1lIGFkZHJlc3Mgb2YgInN0YXJ0IiAgKD8/PykKICAqIE9uIGV4aXQsCi0gKiAgcjEsIHIyLCByMywgcjgsIHI5LCByMTIgY29ycnVwdGVkCisgKiAgcjEsIHIyLCByMywgcjksIHIxMCwgcjEyIGNvcnJ1cHRlZAogICogVGhpcyByb3V0aW5lIG11c3QgcHJlc2VydmU6Ci0gKiAgcjQsIHI1LCByNiwgcjcKKyAqICByNCwgcjUsIHI2LCByNywgcjgKICAqLwogCQkuYWxpZ24JNQogY2FjaGVfb246CW1vdglyMywgIzgJCQlAIGNhY2hlX29uIGZ1bmN0aW9uCkBAIC0zMjYsMTUgKzMyOCwxNSBAQAogICogYml0cyBmb3IgdGhlIFJBTSBhcmVhIG9ubHkuCiAgKi8KIAkJbW92CXIwLCByMwotCQltb3YJcjgsIHIwLCBsc3IgIzE4Ci0JCW1vdglyOCwgcjgsIGxzbCAjMTgJCUAgc3RhcnQgb2YgUkFNCi0JCWFkZAlyOSwgcjgsICMweDEwMDAwMDAwCUAgYSByZWFzb25hYmxlIFJBTSBzaXplCisJCW1vdglyOSwgcjAsIGxzciAjMTgKKwkJbW92CXI5LCByOSwgbHNsICMxOAkJQCBzdGFydCBvZiBSQU0KKwkJYWRkCXIxMCwgcjksICMweDEwMDAwMDAwCUAgYSByZWFzb25hYmxlIFJBTSBzaXplCiAJCW1vdglyMSwgIzB4MTIKIAkJb3JyCXIxLCByMSwgIzMgPDwgMTAKIAkJYWRkCXIyLCByMywgIzE2Mzg0CiAxOgkJY21wCXIxLCByOAkJCUAgaWYgdmlydCA+IHN0YXJ0IG9mIFJBTQogCQlvcnJocwlyMSwgcjEsICMweDBjCQlAIHNldCBjYWNoZWFibGUsIGJ1ZmZlcmFibGUKLQkJY21wCXIxLCByOQkJCUAgaWYgdmlydCA+IGVuZCBvZiBSQU0KKwkJY21wCXIxLCByMTAJCQlAIGlmIHZpcnQgPiBlbmQgb2YgUkFNCiAJCWJpY2hzCXIxLCByMSwgIzB4MGMJCUAgY2xlYXIgY2FjaGVhYmxlLCBidWZmZXJhYmxlCiAJCXN0cglyMSwgW3IwXSwgIzQJCUAgMToxIG1hcHBpbmcKIAkJYWRkCXIxLCByMSwgIzEwNDg1NzYKQEAgLTQwMywyNiArNDA1LDI4IEBACiAgKiByNSAgICAgPSBkZWNvbXByZXNzZWQga2VybmVsIHN0YXJ0CiAgKiByNiAgICAgPSBwcm9jZXNzb3IgSUQKICAqIHI3ICAgICA9IGFyY2hpdGVjdHVyZSBJRAotICogcjgtcjE0ID0gdW51c2VkCisgKiByOCAgICAgPSBhdGFncyBwb2ludGVyCisgKiByOS1yMTQgPSBjb3JydXB0ZWQKICAqLwogCQkuYWxpZ24JNQotcmVsb2Nfc3RhcnQ6CWFkZAlyOCwgcjUsIHIwCityZWxvY19zdGFydDoJYWRkCXI5LCByNSwgcjAKIAkJZGVidWdfcmVsb2Nfc3RhcnQKIAkJbW92CXIxLCByNAogMToKIAkJLnJlcHQJNAotCQlsZG1pYQlyNSEsIHtyMCwgcjIsIHIzLCByOSAtIHIxM30JQCByZWxvY2F0ZSBrZXJuZWwKLQkJc3RtaWEJcjEhLCB7cjAsIHIyLCByMywgcjkgLSByMTN9CisJCWxkbWlhCXI1ISwge3IwLCByMiwgcjMsIHIxMCAtIHIxNH0JQCByZWxvY2F0ZSBrZXJuZWwKKwkJc3RtaWEJcjEhLCB7cjAsIHIyLCByMywgcjEwIC0gcjE0fQogCQkuZW5kcgogCi0JCWNtcAlyNSwgcjgKKwkJY21wCXI1LCByOQogCQlibG8JMWIKIAkJZGVidWdfcmVsb2NfZW5kCiAKIGNhbGxfa2VybmVsOglibAljYWNoZV9jbGVhbl9mbHVzaAogCQlibAljYWNoZV9vZmYKLQkJbW92CXIwLCAjMAorCQltb3YJcjAsICMwCQkJQCBtdXN0IGJlIHplcm8KIAkJbW92CXIxLCByNwkJCUAgcmVzdG9yZSBhcmNoaXRlY3R1cmUgbnVtYmVyCisJCW1vdglyMiwgcjgJCQlAIHJlc3RvcmUgYXRhZ3MgcG9pbnRlcgogCQltb3YJcGMsIHI0CQkJQCBjYWxsIGtlcm5lbAogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jIGIvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCmluZGV4IDFiN2VhYWIuLjE1OWFkN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYworKysgYi9hcmNoL2FybS9jb21tb24vbG9jb21vLmMKQEAgLTExMDMsMTQgKzExMDMsMTQgQEAKIHN0cnVjdCBidXNfdHlwZSBsb2NvbW9fYnVzX3R5cGUgPSB7CiAJLm5hbWUJCT0gImxvY29tby1idXMiLAogCS5tYXRjaAkJPSBsb2NvbW9fbWF0Y2gsCisJLnByb2JlCQk9IGxvY29tb19idXNfcHJvYmUsCisJLnJlbW92ZQkJPSBsb2NvbW9fYnVzX3JlbW92ZSwKIAkuc3VzcGVuZAk9IGxvY29tb19idXNfc3VzcGVuZCwKIAkucmVzdW1lCQk9IGxvY29tb19idXNfcmVzdW1lLAogfTsKIAogaW50IGxvY29tb19kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGxvY29tb19kcml2ZXIgKmRyaXZlcikKIHsKLQlkcml2ZXItPmRydi5wcm9iZSA9IGxvY29tb19idXNfcHJvYmU7Ci0JZHJpdmVyLT5kcnYucmVtb3ZlID0gbG9jb21vX2J1c19yZW1vdmU7CiAJZHJpdmVyLT5kcnYuYnVzID0gJmxvY29tb19idXNfdHlwZTsKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRydik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vcnRjdGltZS5jIGIvYXJjaC9hcm0vY29tbW9uL3J0Y3RpbWUuYwppbmRleCBmZmI4MmQ1Li40OGIxZTE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vcnRjdGltZS5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9ydGN0aW1lLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL3J0Yy5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KQEAgLTM1LDcgKzM2LDcgQEAKIC8qCiAgKiBydGNfc2VtIHByb3RlY3RzIHJ0Y19pbnVzZSBhbmQgcnRjX29wcwogICovCi1zdGF0aWMgREVDTEFSRV9NVVRFWChydGNfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgocnRjX211dGV4KTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJ0Y19pbnVzZTsKIHN0YXRpYyBzdHJ1Y3QgcnRjX29wcyAqcnRjX29wczsKIApAQCAtMzU2LDcgKzM1Nyw3IEBACiB7CiAJaW50IHJldDsKIAotCWRvd24oJnJ0Y19zZW0pOworCW11dGV4X2xvY2soJnJ0Y19tdXRleCk7CiAKIAlpZiAocnRjX2ludXNlKSB7CiAJCXJldCA9IC1FQlVTWTsKQEAgLTM3NCw3ICszNzUsNyBAQAogCQkJcnRjX2ludXNlID0gMTsKIAkJfQogCX0KLQl1cCgmcnRjX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZydGNfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTQ4MCw3ICs0ODEsNyBAQAogewogCWludCByZXQgPSAtRUJVU1k7CiAKLQlkb3duKCZydGNfc2VtKTsKKwltdXRleF9sb2NrKCZydGNfbXV0ZXgpOwogCWlmIChydGNfb3BzID09IE5VTEwpIHsKIAkJcnRjX29wcyA9IG9wczsKIApAQCAtNDg5LDcgKzQ5MCw3IEBACiAJCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJkcml2ZXIvcnRjIiwgMCwgTlVMTCwKIAkJCQkJICAgICAgIHJ0Y19yZWFkX3Byb2MsIG9wcyk7CiAJfQotCXVwKCZydGNfc2VtKTsKKwltdXRleF91bmxvY2soJnJ0Y19tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDk3LDEyICs0OTgsMTIgQEAKIAogdm9pZCB1bnJlZ2lzdGVyX3J0YyhzdHJ1Y3QgcnRjX29wcyAqcnRjKQogewotCWRvd24oJnJ0Y19zZW0pOworCW11dGV4X2xvY2soJnJ0Y19tdXRleCk7CiAJaWYgKHJ0YyA9PSBydGNfb3BzKSB7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvcnRjIiwgTlVMTCk7CiAJCW1pc2NfZGVyZWdpc3RlcigmcnRjX21pc2NkZXYpOwogCQlydGNfb3BzID0gTlVMTDsKIAl9Ci0JdXAoJnJ0Y19zZW0pOworCW11dGV4X3VubG9jaygmcnRjX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9ydGMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jIGIvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCmluZGV4IGQwZDZlNmQuLjE0NzUwODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYworKysgYi9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKQEAgLTEyNDcsMTQgKzEyNDcsMTQgQEAKIHN0cnVjdCBidXNfdHlwZSBzYTExMTFfYnVzX3R5cGUgPSB7CiAJLm5hbWUJCT0gInNhMTExMS1yYWIiLAogCS5tYXRjaAkJPSBzYTExMTFfbWF0Y2gsCisJLnByb2JlCQk9IHNhMTExMV9idXNfcHJvYmUsCisJLnJlbW92ZQkJPSBzYTExMTFfYnVzX3JlbW92ZSwKIAkuc3VzcGVuZAk9IHNhMTExMV9idXNfc3VzcGVuZCwKIAkucmVzdW1lCQk9IHNhMTExMV9idXNfcmVzdW1lLAogfTsKIAogaW50IHNhMTExMV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHNhMTExMV9kcml2ZXIgKmRyaXZlcikKIHsKLQlkcml2ZXItPmRydi5wcm9iZSA9IHNhMTExMV9idXNfcHJvYmU7Ci0JZHJpdmVyLT5kcnYucmVtb3ZlID0gc2ExMTExX2J1c19yZW1vdmU7CiAJZHJpdmVyLT5kcnYuYnVzID0gJnNhMTExMV9idXNfdHlwZTsKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRydik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBka19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBka19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkZDEzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGRrX2RlZmNvbmZpZwpAQCAtMCwwICsxLDEwMDkgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNQorIyBNb24gSmFuICA5IDIwOjU0OjMwIDIwMDYKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9BVDkxUk05MjAwPXkKKworIworIyBBVDkxUk05MjAwIEltcGxlbWVudGF0aW9ucworIworCisjCisjIEFUOTFSTTkyMDAgQm9hcmQgVHlwZQorIworQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMERLPXkKKyMgQ09ORklHX01BQ0hfQVQ5MVJNOTIwMEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ1NCMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ1NCNjM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ0FSTUVWQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0tCOTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0FURUI5MjAwIGlzIG5vdCBzZXQKKworIworIyBBVDkxUk05MjAwIEZlYXR1cmUgU2VsZWN0aW9ucworIworQ09ORklHX0FUOTFfUFJPR1JBTU1BQkxFX0NMT0NLUz15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9BUk05MjBUPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0VD15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V1Q9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfQ09QWV9WNFdCPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKKyMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX0lTQV9ETUFfQVBJPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCitDT05GSUdfUENDQVJEPXkKKyMgQ09ORklHX1BDTUNJQV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBPXkKK0NPTkZJR19QQ01DSUFfTE9BRF9DSVM9eQorQ09ORklHX1BDTUNJQV9JT0NUTD15CisKKyMKKyMgUEMtY2FyZCBicmlkZ2VzCisjCitDT05GSUdfQVQ5MV9DRj15CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQwOTYKK0NPTkZJR19MRURTPXkKK0NPTkZJR19MRURTX1RJTUVSPXkKKyMgQ09ORklHX0xFRFNfQ1BVIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJtZW09MzJNIGNvbnNvbGU9dHR5UzAsMTE1MjAwIGluaXRyZD0weDIwNDEwMDAwLDMxNDU3Mjggcm9vdD0vZGV2L3JhbTAgcnciCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj15CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9KRURFQ1BST0JFPXkKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JTlRFTEVYVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorQ09ORklHX01URF9DRklfQU1EU1REX1JFVFJZPTAKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHgxMDAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDIwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0yCisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0lNUEE3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQVQ5MV9EQVRBRkxBU0g9eQorQ09ORklHX01URF9BVDkxX0RBVEFGTEFTSF9DQVJEPXkKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorQ09ORklHX0FSTV9BVDkxX0VUSEVSPXkKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfUENNQ0lBIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9BVDkxPXkKK0NPTkZJR19TRVJJQUxfQVQ5MV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9BVDkxX1RUWUFUIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CitDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQ9eQorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19BVDkxX1dBVENIRE9HPXkKKworIworIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKK0NPTkZJR19BVDkxX1JUQz15CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKworIworIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBUkRNQU5fNDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DQVJETUFOXzQwNDAgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAorQ09ORklHX0FUOTFfU1BJPXkKK0NPTkZJR19BVDkxX1NQSURFVj15CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworQ09ORklHX0kyQ19BVDkxPXkKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX1gxMjA1X0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9ERUJVRz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworIyBDT05GSUdfVVNCX1NUT1JBR0UgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCisjIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0CisKKyMKKyMgVmlkZW80TGludXggc3VwcG9ydCBpcyBuZWVkZWQgZm9yIFVTQiBNdWx0aW1lZGlhIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworCisjCisjIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUU0VSVk8gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKworIworIyBVU0IgRFNMIG1vZGVtIHN1cHBvcnQKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKK0NPTkZJR19VU0JfR0FER0VUPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfU0VMRUNURUQ9eQorIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfR09LVSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9PTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX0FUOTE9eQorQ09ORklHX1VTQl9BVDkxPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfRFVNTVlfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRFVBTFNQRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9aRVJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GSUxFX1NUT1JBR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCitDT05GSUdfTU1DPXkKKyMgQ09ORklHX01NQ19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTU1DX0JMT0NLPXkKKyMgQ09ORklHX01NQ19XQlNEIGlzIG5vdCBzZXQKK0NPTkZJR19NTUNfQVQ5MVJNOTIwMD15CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX1JFTEFZRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JBTUZTPXkKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCisjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19VU0VSPXkKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGVrX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGVrX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDgzOGNjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9hdDkxcm05MjAwZWtfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTk4IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTUKKyMgTW9uIEphbiAgOSAyMDo1NzozMSAyMDA2CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9BVDkxUk05MjAwPXkKKworIworIyBBVDkxUk05MjAwIEltcGxlbWVudGF0aW9ucworIworCisjCisjIEFUOTFSTTkyMDAgQm9hcmQgVHlwZQorIworIyBDT05GSUdfQVJDSF9BVDkxUk05MjAwREsgaXMgbm90IHNldAorQ09ORklHX01BQ0hfQVQ5MVJNOTIwMEVLPXkKKyMgQ09ORklHX01BQ0hfQ1NCMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ1NCNjM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ0FSTUVWQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0tCOTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0FURUI5MjAwIGlzIG5vdCBzZXQKKworIworIyBBVDkxUk05MjAwIEZlYXR1cmUgU2VsZWN0aW9ucworIworQ09ORklHX0FUOTFfUFJPR1JBTU1BQkxFX0NMT0NLUz15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9BUk05MjBUPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0VD15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V1Q9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfQ09QWV9WNFdCPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKKyMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX0lTQV9ETUFfQVBJPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00MDk2CitDT05GSUdfTEVEUz15CitDT05GSUdfTEVEU19USU1FUj15CitDT05GSUdfTEVEU19DUFU9eQorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9Im1lbT0zMk0gY29uc29sZT10dHlTMCwxMTUyMDAgaW5pdHJkPTB4MjA0MTAwMDAsMzE0NTcyOCByb290PS9kZXYvcmFtMCBydyIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKK0NPTkZJR19NVERfSkVERUNQUk9CRT15CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURF9SRVRSWT0wCisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4MTAwMDAwMDAKK0NPTkZJR19NVERfUEhZU01BUF9MRU49MHg4MDAwMDAKK0NPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9JTVBBNyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0FUOTFfREFUQUZMQVNIPXkKK0NPTkZJR19NVERfQVQ5MV9EQVRBRkxBU0hfQ0FSRD15CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIE9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CitDT05GSUdfQVJNX0FUOTFfRVRIRVI9eQorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQVQ5MT15CitDT05GSUdfU0VSSUFMX0FUOTFfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfQVQ5MV9UVFlBVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorQ09ORklHX1dBVENIRE9HX05PV0FZT1VUPXkKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfQVQ5MV9XQVRDSERPRz15CisKKyMKKyMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CitDT05GSUdfQVQ5MV9SVEM9eQorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CitDT05GSUdfQVQ5MV9TUEk9eQorQ09ORklHX0FUOTFfU1BJREVWPXkKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCisjIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfSTJDX0FUOTE9eQorIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfWDEyMDVfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GQj15CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CitDT05GSUdfRkJfUzFEMTNYWFg9eQorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0xPR08gaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQj15CitDT05GSUdfVVNCX0RFQlVHPXkKKworIworIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCisjCitDT05GSUdfVVNCX0RFVklDRUZTPXkKKyMgQ09ORklHX1VTQl9CQU5EV0lEVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9IQ0Q9eQorIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfTElUVExFX0VORElBTj15CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCisjIENPTkZJR19VU0JfU1RPUkFHRSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIElucHV0IERldmljZXMKKyMKKyMgQ09ORklHX1VTQl9ISUQgaXMgbm90IHNldAorCisjCisjIFVTQiBISUQgQm9vdCBQcm90b2NvbCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUlQVEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XQUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUNFQ0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQlRBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUE9XRVJNQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lUTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FR0FMQVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1lFQUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKworIworIyBVU0IgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKKworIworIyBWaWRlbzRMaW51eCBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgVVNCIE11bHRpbWVkaWEgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPXkKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVRLSVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVRTRVJWTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorCisjCisjIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAorIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworQ09ORklHX1VTQl9HQURHRVQ9eQorIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9TRUxFQ1RFRD15CisjIENPTkZJR19VU0JfR0FER0VUX05FVDIyODAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9QWEEyWFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9HT0tVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX09NQVAgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfQVQ5MT15CitDT05GSUdfVVNCX0FUOTE9eQorIyBDT05GSUdfVVNCX0dBREdFVF9EVU1NWV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1pFUk8gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VURlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR19TRVJJQUwgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKK0NPTkZJR19NTUM9eQorIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19NTUNfQkxPQ0s9eQorIyBDT05GSUdfTU1DX1dCU0QgaXMgbm90IHNldAorQ09ORklHX01NQ19BVDkxUk05MjAwPXkKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfUkVMQVlGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19DUkFNRlM9eQorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKKyMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRVJST1JTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19MTD15CisjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jc2IzMzdfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9jc2IzMzdfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NWEzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2NzYjMzN19kZWZjb25maWcKQEAgLTAsMCArMSwxMTM2IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTUKKyMgTW9uIEphbiAgOSAyMTo1MTozMSAyMDA2CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9BVDkxUk05MjAwPXkKKworIworIyBBVDkxUk05MjAwIEltcGxlbWVudGF0aW9ucworIworCisjCisjIEFUOTFSTTkyMDAgQm9hcmQgVHlwZQorIworIyBDT05GSUdfQVJDSF9BVDkxUk05MjAwREsgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9BVDkxUk05MjAwRUsgaXMgbm90IHNldAorQ09ORklHX01BQ0hfQ1NCMzM3PXkKKyMgQ09ORklHX01BQ0hfQ1NCNjM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ0FSTUVWQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0tCOTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0FURUI5MjAwIGlzIG5vdCBzZXQKKworIworIyBBVDkxUk05MjAwIEZlYXR1cmUgU2VsZWN0aW9ucworIworQ09ORklHX0FUOTFfUFJPR1JBTU1BQkxFX0NMT0NLUz15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9BUk05MjBUPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0VD15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V1Q9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfQ09QWV9WNFdCPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKKyMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX0lTQV9ETUFfQVBJPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCitDT05GSUdfUENDQVJEPXkKKyMgQ09ORklHX1BDTUNJQV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBPXkKK0NPTkZJR19QQ01DSUFfTE9BRF9DSVM9eQorQ09ORklHX1BDTUNJQV9JT0NUTD15CisKKyMKKyMgUEMtY2FyZCBicmlkZ2VzCisjCitDT05GSUdfQVQ5MV9DRj15CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQwOTYKK0NPTkZJR19MRURTPXkKK0NPTkZJR19MRURTX1RJTUVSPXkKK0NPTkZJR19MRURTX0NQVT15CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0ibWVtPTMyTSBjb25zb2xlPXR0eVMwLDM4NDAwIGluaXRyZD0weDIwNDEwMDAwLDMxNDU3Mjggcm9vdD0vZGV2L3JhbTAgcnciCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9eQorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ1NCMzM3PXkKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BVDkxX0RBVEFGTEFTSCBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIE9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCisjIENPTkZJR19CTEtfREVWX1NEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBQQ01DSUEgU0NTSSBhZGFwdGVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDTUNJQV9BSEExNTJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9GRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9OSU5KQV9TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9RTE9HSUMgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1NZTTUzQzUwMCBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CitDT05GSUdfQVJNX0FUOTFfRVRIRVI9eQorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9QQ01DSUEgaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9BVDkxPXkKK0NPTkZJR19TRVJJQUxfQVQ5MV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9BVDkxX1RUWUFUIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CitDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQ9eQorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19BVDkxX1dBVENIRE9HPXkKKworIworIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorQ09ORklHX1JUQz15CisjIENPTkZJR19BVDkxX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKworIworIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBUkRNQU5fNDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DQVJETUFOXzQwNDAgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAorQ09ORklHX0FUOTFfU1BJPXkKK0NPTkZJR19BVDkxX1NQSURFVj15CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworQ09ORklHX0kyQ19BVDkxPXkKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX1gxMjA1X0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9ERUJVRz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworQ09ORklHX1VTQl9TVE9SQUdFPXkKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCisjIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAorCisjCisjIFZpZGVvNExpbnV4IHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgTXVsdGltZWRpYSBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCitDT05GSUdfVVNCX1NFUklBTD15CitDT05GSUdfVVNCX1NFUklBTF9DT05TT0xFPXkKK0NPTkZJR19VU0JfU0VSSUFMX0dFTkVSSUM9eQorIyBDT05GSUdfVVNCX1NFUklBTF9BSVJQUklNRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0FOWURBVEEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9CRUxLSU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9XSElURUhFQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9ESUdJX0FDQ0VMRVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DUDIxMDEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DWVBSRVNTX004IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRU1QRUcgaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfRlRESV9TSU89eQorIyBDT05GSUdfVVNCX1NFUklBTF9WSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lQQVEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlRfVEkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9HQVJNSU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUFcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fTVBSPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjg9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0EyOFg9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0EyOFhBPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjhYQj15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5PXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMThYPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMTlXPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMTlRVz15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5UUk9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0E0OVc9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0E0OVdMQz15CisjIENPTkZJR19VU0JfU0VSSUFMX0tMU0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LT0JJTF9TQ1QgaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfTUNUX1UyMzI9eQorIyBDT05GSUdfVVNCX1NFUklBTF9QTDIzMDMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9IUDRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfU0FGRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1RJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1lCRVJKQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfWElSQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfT1BUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VaVVNCPXkKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVFNFUlZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERTTCBtb2RlbSBzdXBwb3J0CisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCitDT05GSUdfVVNCX0dBREdFVD15CisjIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX1NFTEVDVEVEPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfTkVUMjI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1BYQTJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0dPS1UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfT01BUCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9BVDkxPXkKK0NPTkZJR19VU0JfQVQ5MT15CisjIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWkVSTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRGUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRklMRV9TVE9SQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworQ09ORklHX01NQz15CisjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01NQ19CTE9DSz15CisjIENPTkZJR19NTUNfV0JTRCBpcyBub3Qgc2V0CitDT05GSUdfTU1DX0FUOTFSTTkyMDA9eQorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorQ09ORklHX05GU19WND15CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKK0NPTkZJR19TVU5SUENfR1NTPXkKK0NPTkZJR19SUENTRUNfR1NTX0tSQjU9eQorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19VU0VSPXkKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKK0NPTkZJR19DUllQVE89eQorIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19ERVM9eQorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvY3NiNjM3X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvY3NiNjM3X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWE5NmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9jc2I2MzdfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTExNiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE1CisjIE1vbiBKYW4gIDkgMjE6NTI6MDAgMjAwNgorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBCbG9jayBsYXllcgorIworCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMD15CisKKyMKKyMgQVQ5MVJNOTIwMCBJbXBsZW1lbnRhdGlvbnMKKyMKKworIworIyBBVDkxUk05MjAwIEJvYXJkIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMERLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQVQ5MVJNOTIwMEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ1NCMzM3IGlzIG5vdCBzZXQKK0NPTkZJR19NQUNIX0NTQjYzNz15CisjIENPTkZJR19NQUNIX0NBUk1FVkEgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9LQjkyMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9BVEVCOTIwMCBpcyBub3Qgc2V0CisKKyMKKyMgQVQ5MVJNOTIwMCBGZWF0dXJlIFNlbGVjdGlvbnMKKyMKK0NPTkZJR19BVDkxX1BST0dSQU1NQUJMRV9DTE9DS1M9eQorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNOTIwVD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWNFQ9eQorQ09ORklHX0NQVV9DQUNIRV9WNFdUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX0NPUFlfVjRXQj15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworQ09ORklHX1BDQ0FSRD15CisjIENPTkZJR19QQ01DSUFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BDTUNJQT15CitDT05GSUdfUENNQ0lBX0xPQURfQ0lTPXkKK0NPTkZJR19QQ01DSUFfSU9DVEw9eQorCisjCisjIFBDLWNhcmQgYnJpZGdlcworIworQ09ORklHX0FUOTFfQ0Y9eQorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00MDk2CitDT05GSUdfTEVEUz15CitDT05GSUdfTEVEU19USU1FUj15CitDT05GSUdfTEVEU19DUFU9eQorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9Im1lbT0zMk0gY29uc29sZT10dHlTMCwzODQwMCBpbml0cmQ9MHgyMDQxMDAwMCwzMTQ1NzI4IHJvb3Q9L2Rldi9yYW0wIHJ3IgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NTQjYzNz15CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVQ5MV9EQVRBRkxBU0ggaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworIyBDT05GSUdfQkxLX0RFVl9TRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIFNDU0kgYWRhcHRlciBzdXBwb3J0CisjCisjIENPTkZJR19QQ01DSUFfQUhBMTUyWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfRkRPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfTklOSkFfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfUUxPR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9TWU01M0M1MDAgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorQ09ORklHX0FSTV9BVDkxX0VUSEVSPXkKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfUENNQ0lBIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQVQ5MT15CitDT05GSUdfU0VSSUFMX0FUOTFfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfQVQ5MV9UVFlBVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorQ09ORklHX1dBVENIRE9HX05PV0FZT1VUPXkKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfQVQ5MV9XQVRDSERPRz15CisKKyMKKyMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19SVEM9eQorIyBDT05GSUdfQVQ5MV9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisKKyMKKyMgUENNQ0lBIGNoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19TWU5DTElOS19DUyBpcyBub3Qgc2V0CisjIENPTkZJR19DQVJETUFOXzQwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ0FSRE1BTl80MDQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKK0NPTkZJR19BVDkxX1NQST15CitDT05GSUdfQVQ5MV9TUElERVY9eQorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKKyMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JMkNfQVQ5MT15CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19YMTIwNV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCPXkKK0NPTkZJR19VU0JfREVCVUc9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRD15CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT15CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworIyBDT05GSUdfVVNCX0hJRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVRNVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VHQUxBWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWUVBTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVRJX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKKworIworIyBWaWRlbzRMaW51eCBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgVVNCIE11bHRpbWVkaWEgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPXkKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAorIworQ09ORklHX1VTQl9TRVJJQUw9eQorQ09ORklHX1VTQl9TRVJJQUxfQ09OU09MRT15CitDT05GSUdfVVNCX1NFUklBTF9HRU5FUklDPXkKKyMgQ09ORklHX1VTQl9TRVJJQUxfQUlSUFJJTUUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9BTllEQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQkVMS0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfV0hJVEVIRUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRElHSV9BQ0NFTEVQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1AyMTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1lQUkVTU19NOCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VNUEVHIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU0VSSUFMX0ZURElfU0lPPXkKKyMgQ09ORklHX1VTQl9TRVJJQUxfVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUEFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9FREdFUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUX1RJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfR0FSTUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVBXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9QREEgaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTj15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX01QUj15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTI4PXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjhYPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjhYQT15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTI4WEI9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0ExOT15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE4WD15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5Vz15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5UVc9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0ExOVFJPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBNDlXPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBNDlXTEM9eQorIyBDT05GSUdfVVNCX1NFUklBTF9LTFNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS09CSUxfU0NUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU0VSSUFMX01DVF9VMjMyPXkKKyMgQ09ORklHX1VTQl9TRVJJQUxfUEwyMzAzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSFA0WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1NBRkUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9USSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0NZQkVSSkFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1hJUkNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09QVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09NTklORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9FWlVTQj15CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVRLSVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVRTRVJWTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorCisjCisjIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAorIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfUkVMQVlGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19DUkFNRlM9eQorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCitDT05GSUdfQ1JZUFRPPXkKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDU9eQorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZWNhcmQuYyBiL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jCmluZGV4IGRjZWI4MjYuLjc0ZWEyOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9lY2FyZC5oPgpAQCAtMjA2LDcgKzIwNyw3IEBACiAKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChlY2FyZF93YWl0KTsKIHN0YXRpYyBzdHJ1Y3QgZWNhcmRfcmVxdWVzdCAqZWNhcmRfcmVxOwotc3RhdGljIERFQ0xBUkVfTVVURVgoZWNhcmRfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoZWNhcmRfbXV0ZXgpOwogCiAvKgogICogU2V0IHVwIHRoZSBleHBhbnNpb24gY2FyZCBkYWVtb24ncyBwYWdlIHRhYmxlcy4KQEAgLTI5OSw3ICszMDAsNyBAQAogCiAJcmVxLT5jb21wbGV0ZSA9ICZjb21wbGV0aW9uOwogCi0JZG93bigmZWNhcmRfc2VtKTsKKwltdXRleF9sb2NrKCZlY2FyZF9tdXRleCk7CiAJZWNhcmRfcmVxID0gcmVxOwogCXdha2VfdXAoJmVjYXJkX3dhaXQpOwogCkBAIC0zMDcsNyArMzA4LDcgQEAKIAkgKiBOb3cgd2FpdCBmb3Iga2VjYXJkZCB0byBydW4uCiAJICovCiAJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcGxldGlvbik7Ci0JdXAoJmVjYXJkX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZlY2FyZF9tdXRleCk7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09IE1pZC1sZXZlbCBjYXJkIGNvbnRyb2wgPT09PT09PT09PT09PT09PT09PT09ICovCkBAIC0xMTQ2LDkgKzExNDcsMTEgQEAKIAlzdHJ1Y3QgZWNhcmRfZHJpdmVyICpkcnYgPSBFQ0FSRF9EUlYoZGV2LT5kcml2ZXIpOwogCXN0cnVjdCBlY2FyZF9yZXF1ZXN0IHJlcTsKIAotCWlmIChkcnYtPnNodXRkb3duKQotCQlkcnYtPnNodXRkb3duKGVjKTsKLQllY2FyZF9yZWxlYXNlKGVjKTsKKwlpZiAoZGV2LT5kcml2ZXIpIHsKKwkJaWYgKGRydi0+c2h1dGRvd24pCisJCQlkcnYtPnNodXRkb3duKGVjKTsKKwkJZWNhcmRfcmVsZWFzZShlYyk7CisJfQogCiAJLyoKIAkgKiBJZiB0aGlzIGNhcmQgaGFzIGEgbG9hZGVyLCBjYWxsIHRoZSByZXNldCBoYW5kbGVyLgpAQCAtMTE2Myw5ICsxMTY2LDYgQEAKIGludCBlY2FyZF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGVjYXJkX2RyaXZlciAqZHJ2KQogewogCWRydi0+ZHJ2LmJ1cyA9ICZlY2FyZF9idXNfdHlwZTsKLQlkcnYtPmRydi5wcm9iZSA9IGVjYXJkX2Rydl9wcm9iZTsKLQlkcnYtPmRydi5yZW1vdmUgPSBlY2FyZF9kcnZfcmVtb3ZlOwotCWRydi0+ZHJ2LnNodXRkb3duID0gZWNhcmRfZHJ2X3NodXRkb3duOwogCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcnYpOwogfQpAQCAtMTE5NCw2ICsxMTk0LDkgQEAKIAkubmFtZQkJPSAiZWNhcmQiLAogCS5kZXZfYXR0cnMJPSBlY2FyZF9kZXZfYXR0cnMsCiAJLm1hdGNoCQk9IGVjYXJkX21hdGNoLAorCS5wcm9iZQkJPSBlY2FyZF9kcnZfcHJvYmUsCisJLnJlbW92ZQkJPSBlY2FyZF9kcnZfcmVtb3ZlLAorCS5zaHV0ZG93bgk9IGVjYXJkX2Rydl9zaHV0ZG93biwKIH07CiAKIHN0YXRpYyBpbnQgZWNhcmRfYnVzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9maXEuYyBiL2FyY2gvYXJtL2tlcm5lbC9maXEuYwppbmRleCA5Mjk5ZGZjMjUuLjFlYzNmN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9maXEuYworKysgYi9hcmNoL2FybS9rZXJuZWwvZmlxLmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCWxkbWlhCSUxLCB7cjggLSByMTR9XG5cCiAJbXNyCWNwc3JfYywgJTAJQCByZXR1cm4gdG8gU1ZDIG1vZGVcblwKIAltb3YJcjAsIHIwXG5cCi0JbGRtZWEJZnAsIHtmcCwgc3AsIHBjfSIKKwlsZG1mZAlzcCwge2ZwLCBzcCwgcGN9IgogCTogIj0mciIgKHRtcCkKIAk6ICJyIiAoJnJlZ3MtPkFSTV9yOCksICJJIiAoUFNSX0lfQklUIHwgUFNSX0ZfQklUIHwgRklRX01PREUpKTsKIH0KQEAgLTExOSw3ICsxMTksNyBAQAogCXN0bWlhCSUxLCB7cjggLSByMTR9XG5cCiAJbXNyCWNwc3JfYywgJTAJQCByZXR1cm4gdG8gU1ZDIG1vZGVcblwKIAltb3YJcjAsIHIwXG5cCi0JbGRtZWEJZnAsIHtmcCwgc3AsIHBjfSIKKwlsZG1mZAlzcCwge2ZwLCBzcCwgcGN9IgogCTogIj0mciIgKHRtcCkKIAk6ICJyIiAoJnJlZ3MtPkFSTV9yOCksICJJIiAoUFNSX0lfQklUIHwgUFNSX0ZfQklUIHwgRklRX01PREUpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDU0YTIxYmQuLjRiNGU0Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYwpAQCAtMzQyLDEwICszNDIsMTAgQEAKIHZvaWQgcmVsZWFzZV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICpkZWFkX3Rhc2spCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfVkZQKQotCXZmcF9yZWxlYXNlX3RocmVhZCgmZGVhZF90YXNrLT50aHJlYWRfaW5mby0+dmZwc3RhdGUpOworCXZmcF9yZWxlYXNlX3RocmVhZCgmdGFza190aHJlYWRfaW5mbyhkZWFkX3Rhc2spLT52ZnBzdGF0ZSk7CiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19JV01NWFQpCi0JaXdtbXh0X3Rhc2tfcmVsZWFzZShkZWFkX3Rhc2stPnRocmVhZF9pbmZvKTsKKwlpd21teHRfdGFza19yZWxlYXNlKHRhc2tfdGhyZWFkX2luZm8oZGVhZF90YXNrKSk7CiAjZW5kaWYKIH0KIApAQCAtMzU1LDEwICszNTUsOSBAQAogY29weV90aHJlYWQoaW50IG5yLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHN0YWNrX3N0YXJ0LAogCSAgICB1bnNpZ25lZCBsb25nIHN0a19zeiwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IHAtPnRocmVhZF9pbmZvOwotCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3M7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSB0YXNrX3RocmVhZF9pbmZvKHApOworCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3MgPSB0YXNrX3B0X3JlZ3MocCk7CiAKLQljaGlsZHJlZ3MgPSAodm9pZCAqKXRocmVhZCArIFRIUkVBRF9TVEFSVF9TUCAtIHNpemVvZigqcmVncyk7CiAJKmNoaWxkcmVncyA9ICpyZWdzOwogCWNoaWxkcmVncy0+QVJNX3IwID0gMDsKIAljaGlsZHJlZ3MtPkFSTV9zcCA9IHN0YWNrX3N0YXJ0OwpAQCAtNDYwLDggKzQ1OSw4IEBACiAJaWYgKCFwIHx8IHAgPT0gY3VycmVudCB8fCBwLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCiAJCXJldHVybiAwOwogCi0Jc3RhY2tfc3RhcnQgPSAodW5zaWduZWQgbG9uZykocC0+dGhyZWFkX2luZm8gKyAxKTsKLQlzdGFja19lbmQgPSAoKHVuc2lnbmVkIGxvbmcpcC0+dGhyZWFkX2luZm8pICsgVEhSRUFEX1NJWkU7CisJc3RhY2tfc3RhcnQgPSAodW5zaWduZWQgbG9uZyllbmRfb2Zfc3RhY2socCk7CisJc3RhY2tfZW5kID0gKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHApICsgVEhSRUFEX1NJWkU7CiAKIAlmcCA9IHRocmVhZF9zYXZlZF9mcChwKTsKIAlkbyB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMmI4NGY3OC4uZTU5MWY3MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKQEAgLTU1LDIzICs1NSw2IEBACiAjZW5kaWYKIAogLyoKLSAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbGl2ZSBwdF9yZWdzIGZvciB0aGUgc3BlY2lmaWVkIHRhc2suCi0gKiBUaGVzZSBhcmUgc2F2ZWQgb250byB0aGUgdG9wIGtlcm5lbCBzdGFjayB3aGVuIHRoZSBwcm9jZXNzCi0gKiBpcyBub3QgcnVubmluZy4KLSAqCi0gKiBOb3RlOiBpZiBhIHVzZXIgdGhyZWFkIGlzIGV4ZWN2ZSdkIGZyb20ga2VybmVsIHNwYWNlLCB0aGUKLSAqIGtlcm5lbCBzdGFjayB3aWxsIG5vdCBiZSBlbXB0eSBvbiBlbnRyeSB0byB0aGUga2VybmVsLCBzbwotICogcHRyYWNpbmcgdGhlc2UgdGFza3Mgd2lsbCBmYWlsLgotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwdF9yZWdzICoKLWdldF91c2VyX3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQotewotCXJldHVybiAoc3RydWN0IHB0X3JlZ3MgKikKLQkJKCh1bnNpZ25lZCBsb25nKXRhc2stPnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkUgLQotCQkJCSA4IC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7Ci19Ci0KLS8qCiAgKiB0aGlzIHJvdXRpbmUgd2lsbCBnZXQgYSB3b3JkIG9mZiBvZiB0aGUgcHJvY2Vzc2VzIHByaXZpbGVnZWQgc3RhY2suCiAgKiB0aGUgb2Zmc2V0IGlzIGhvdyBmYXIgZnJvbSB0aGUgYmFzZSBhZGRyIGFzIHN0b3JlZCBpbiB0aGUgVEhSRUFELgogICogdGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCBhbGwgdGhlIHByaXZpbGVnZWQgc3RhY2tzIGFyZSBpbiBvdXIKQEAgLTc5LDcgKzYyLDcgQEAKICAqLwogc3RhdGljIGlubGluZSBsb25nIGdldF91c2VyX3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBvZmZzZXQpCiB7Ci0JcmV0dXJuIGdldF91c2VyX3JlZ3ModGFzayktPnVyZWdzW29mZnNldF07CisJcmV0dXJuIHRhc2tfcHRfcmVncyh0YXNrKS0+dXJlZ3Nbb2Zmc2V0XTsKIH0KIAogLyoKQEAgLTkxLDcgKzc0LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBwdXRfdXNlcl9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgb2Zmc2V0LCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgbmV3cmVncywgKnJlZ3MgPSBnZXRfdXNlcl9yZWdzKHRhc2spOworCXN0cnVjdCBwdF9yZWdzIG5ld3JlZ3MsICpyZWdzID0gdGFza19wdF9yZWdzKHRhc2spOwogCWludCByZXQgPSAtRUlOVkFMOwogCiAJbmV3cmVncyA9ICpyZWdzOwpAQCAtNDIxLDcgKzQwNCw3IEBACiAJdTMyIGluc247CiAJaW50IHJlczsKIAotCXJlZ3MgPSBnZXRfdXNlcl9yZWdzKGNoaWxkKTsKKwlyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAlwYyA9IGluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CiAKIAlpZiAodGh1bWJfbW9kZShyZWdzKSkgewpAQCAtNTcyLDcgKzU1NSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcHRyYWNlX2dldHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgX191c2VyICp1cmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF91c2VyX3JlZ3ModHNrKTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyh0c2spOwogCiAJcmV0dXJuIGNvcHlfdG9fdXNlcih1cmVncywgcmVncywgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkgPyAtRUZBVUxUIDogMDsKIH0KQEAgLTU4Nyw3ICs1NzAsNyBAQAogCiAJcmV0ID0gLUVGQVVMVDsKIAlpZiAoY29weV9mcm9tX3VzZXIoJm5ld3JlZ3MsIHVyZWdzLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKSA9PSAwKSB7Ci0JCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X3VzZXJfcmVncyh0c2spOworCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyh0c2spOwogCiAJCXJldCA9IC1FSU5WQUw7CiAJCWlmICh2YWxpZF91c2VyX3JlZ3MoJm5ld3JlZ3MpKSB7CkBAIC02MDQsNyArNTg3LDcgQEAKICAqLwogc3RhdGljIGludCBwdHJhY2VfZ2V0ZnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB2b2lkIF9fdXNlciAqdWZwKQogewotCXJldHVybiBjb3B5X3RvX3VzZXIodWZwLCAmdHNrLT50aHJlYWRfaW5mby0+ZnBzdGF0ZSwKKwlyZXR1cm4gY29weV90b191c2VyKHVmcCwgJnRhc2tfdGhyZWFkX2luZm8odHNrKS0+ZnBzdGF0ZSwKIAkJCSAgICBzaXplb2Yoc3RydWN0IHVzZXJfZnApKSA/IC1FRkFVTFQgOiAwOwogfQogCkBAIC02MTMsNyArNTk2LDcgQEAKICAqLwogc3RhdGljIGludCBwdHJhY2Vfc2V0ZnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB2b2lkIF9fdXNlciAqdWZwKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gdHNrLT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IHRhc2tfdGhyZWFkX2luZm8odHNrKTsKIAl0aHJlYWQtPnVzZWRfY3BbMV0gPSB0aHJlYWQtPnVzZWRfY3BbMl0gPSAxOwogCXJldHVybiBjb3B5X2Zyb21fdXNlcigmdGhyZWFkLT5mcHN0YXRlLCB1ZnAsCiAJCQkgICAgICBzaXplb2Yoc3RydWN0IHVzZXJfZnApKSA/IC1FRkFVTFQgOiAwOwpAQCAtNjI2LDcgKzYwOSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcHRyYWNlX2dldHdtbXhyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB2b2lkIF9fdXNlciAqdWZwKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gdHNrLT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IHRhc2tfdGhyZWFkX2luZm8odHNrKTsKIAl2b2lkICpwdHIgPSAmdGhyZWFkLT5mcHN0YXRlOwogCiAJaWYgKCF0ZXN0X3RpX3RocmVhZF9mbGFnKHRocmVhZCwgVElGX1VTSU5HX0lXTU1YVCkpCkBAIC02NDMsNyArNjI2LDcgQEAKICAqLwogc3RhdGljIGludCBwdHJhY2Vfc2V0d21teHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgX191c2VyICp1ZnApCiB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSB0c2stPnRocmVhZF9pbmZvOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gdGFza190aHJlYWRfaW5mbyh0c2spOwogCXZvaWQgKnB0ciA9ICZ0aHJlYWQtPmZwc3RhdGU7CiAKIAlpZiAoIXRlc3RfdGlfdGhyZWFkX2ZsYWcodGhyZWFkLCBUSUZfVVNJTkdfSVdNTVhUKSkKQEAgLTc3OSw3ICs3NjIsNyBAQAogI2VuZGlmCiAKIAkJY2FzZSBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBOgotCQkJcmV0ID0gcHV0X3VzZXIoY2hpbGQtPnRocmVhZF9pbmZvLT50cF92YWx1ZSwKKwkJCXJldCA9IHB1dF91c2VyKHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT50cF92YWx1ZSwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOwogCQkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKaW5kZXggMmNhYjc0MWEuLmM0NWQxMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIAkiNVRFIiwKIAkiNVRFSiIsCiAJIjZURUoiLAotCSI/KDEwKSIsCisJIjciLAogCSI/KDExKSIsCiAJIj8oMTIpIiwKIAkiPygxMykiLApAQCAtMjU4LDE0ICsyNTgsMTcgQEAKIHsKIAlpbnQgY3B1X2FyY2g7CiAKLQlpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwMGYwMDApID09IDApIHsKKwlpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwOGYwMDApID09IDApIHsKIAkJY3B1X2FyY2ggPSBDUFVfQVJDSF9VTktOT1dOOwotCX0gZWxzZSBpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwMGYwMDApID09IDB4MDAwMDcwMDApIHsKKwl9IGVsc2UgaWYgKChwcm9jZXNzb3JfaWQgJiAweDAwMDhmMDAwKSA9PSAweDAwMDA3MDAwKSB7CiAJCWNwdV9hcmNoID0gKHByb2Nlc3Nvcl9pZCAmICgxIDw8IDIzKSkgPyBDUFVfQVJDSF9BUk12NFQgOiBDUFVfQVJDSF9BUk12MzsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwODAwMDApID09IDB4MDAwMDAwMDApIHsKIAkJY3B1X2FyY2ggPSAocHJvY2Vzc29yX2lkID4+IDE2KSAmIDc7CiAJCWlmIChjcHVfYXJjaCkKIAkJCWNwdV9hcmNoICs9IENQVV9BUkNIX0FSTXYzOworCX0gZWxzZSB7CisJCS8qIHRoZSByZXZpc2VkIENQVUlEICovCisJCWNwdV9hcmNoID0gKChwcm9jZXNzb3JfaWQgPj4gMTIpICYgMHhmKSAtIDB4YiArIENQVV9BUkNIX0FSTXY2OwogCX0KIAogCXJldHVybiBjcHVfYXJjaDsKQEAgLTg2MywxMSArODY2LDExIEBACiAJc2VxX3ByaW50ZihtLCAiXG5DUFUgaW1wbGVtZW50ZXJcdDogMHglMDJ4XG4iLCBwcm9jZXNzb3JfaWQgPj4gMjQpOwogCXNlcV9wcmludGYobSwgIkNQVSBhcmNoaXRlY3R1cmU6ICVzXG4iLCBwcm9jX2FyY2hbY3B1X2FyY2hpdGVjdHVyZSgpXSk7CiAKLQlpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwMGYwMDApID09IDB4MDAwMDAwMDApIHsKKwlpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwOGYwMDApID09IDB4MDAwMDAwMDApIHsKIAkJLyogcHJlLUFSTTcgKi8KIAkJc2VxX3ByaW50ZihtLCAiQ1BVIHBhcnRcdFx0OiAlMDd4XG4iLCBwcm9jZXNzb3JfaWQgPj4gNCk7CiAJfSBlbHNlIHsKLQkJaWYgKChwcm9jZXNzb3JfaWQgJiAweDAwMDBmMDAwKSA9PSAweDAwMDA3MDAwKSB7CisJCWlmICgocHJvY2Vzc29yX2lkICYgMHgwMDA4ZjAwMCkgPT0gMHgwMDAwNzAwMCkgewogCQkJLyogQVJNNyAqLwogCQkJc2VxX3ByaW50ZihtLCAiQ1BVIHZhcmlhbnRcdDogMHglMDJ4XG4iLAogCQkJCSAgIChwcm9jZXNzb3JfaWQgPj4gMTYpICYgMTI3KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwppbmRleCAzNzNjMDk1Li43MzM4OTQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkgKiBXZSBuZWVkIHRvIHRlbGwgdGhlIHNlY29uZGFyeSBjb3JlIHdoZXJlIHRvIGZpbmQKIAkgKiBpdHMgc3RhY2sgYW5kIHRoZSBwYWdlIHRhYmxlcy4KIAkgKi8KLQlzZWNvbmRhcnlfZGF0YS5zdGFjayA9ICh2b2lkICopaWRsZS0+dGhyZWFkX2luZm8gKyBUSFJFQURfU1RBUlRfU1A7CisJc2Vjb25kYXJ5X2RhdGEuc3RhY2sgPSB0YXNrX3N0YWNrX3BhZ2UoaWRsZSkgKyBUSFJFQURfU1RBUlRfU1A7CiAJc2Vjb25kYXJ5X2RhdGEucGdkaXIgPSB2aXJ0X3RvX3BoeXMocGdkKTsKIAl3bWIoKTsKIApAQCAtMjQ1LDcgKzI0NSw3IEBACiAJX19hc21fXygibW92CXNwLCAlMFxuIgogCSIJYglzZWNvbmRhcnlfc3RhcnRfa2VybmVsIgogCQk6Ci0JCTogInIiICgodm9pZCAqKWN1cnJlbnQtPnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkUgLSA4KSk7CisJCTogInIiICh0YXNrX3N0YWNrX3BhZ2UoY3VycmVudCkgKyBUSFJFQURfU0laRSAtIDgpKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMgYi9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYwppbmRleCBjOWZlNmY1Li45M2NmZDNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJfSBlbHNlIGlmICh2ZXJpZnlfc3RhY2soZnApKSB7CiAJCXByaW50aygiaW52YWxpZCBmcmFtZSBwb2ludGVyIDB4JTA4eCIsIGZwKTsKIAkJb2sgPSAwOwotCX0gZWxzZSBpZiAoZnAgPCAodW5zaWduZWQgbG9uZykodHNrLT50aHJlYWRfaW5mbyArIDEpKQorCX0gZWxzZSBpZiAoZnAgPCAodW5zaWduZWQgbG9uZyllbmRfb2Zfc3RhY2sodHNrKSkKIAkJcHJpbnRrKCJmcmFtZSBwb2ludGVyIHVuZGVyZmxvdyIpOwogCXByaW50aygiXG4iKTsKIApAQCAtMjEwLDcgKzIxMCw3IEBACiAKIAlpZiAoIXVzZXJfbW9kZShyZWdzKSB8fCBpbl9pbnRlcnJ1cHQoKSkgewogCQlkdW1wX21lbSgiU3RhY2s6ICIsIHJlZ3MtPkFSTV9zcCwKLQkJCSBUSFJFQURfU0laRSArICh1bnNpZ25lZCBsb25nKXRzay0+dGhyZWFkX2luZm8pOworCQkJIFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHRzaykpOwogCQlkdW1wX2JhY2t0cmFjZShyZWdzLCB0c2spOwogCQlkdW1wX2luc3RyKHJlZ3MpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHkuUyBiL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHkuUwppbmRleCA5OTBlZTYzLi4yMWVmZmUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5LlMKKysrIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weS5TCkBAIC0xOCwxMSArMTgsMTMgQEAKICAqLwogCiAJCS5tYWNybwlzYXZlX3JlZ3MKKwkJbW92CWlwLCBzcAogCQlzdG1mZAlzcCEsIHtyMSwgcjQgLSByOCwgZnAsIGlwLCBsciwgcGN9CisJCXN1YglmcCwgaXAsICM0CiAJCS5lbmRtCiAKLQkJLm1hY3JvCWxvYWRfcmVncyxmbGFncwotCQlMT0FEUkVHUyhcZmxhZ3MsZnAse3IxLCByNCAtIHI4LCBmcCwgc3AsIHBjfSkKKwkJLm1hY3JvCWxvYWRfcmVncworCQlsZG1mZAlzcCwge3IxLCByNCAtIHI4LCBmcCwgc3AsIHBjfQogCQkuZW5kbQogCiAJCS5tYWNybwlsb2FkMWIsIHJlZzEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHlnZW5lcmljLlMgYi9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5Z2VuZXJpYy5TCmluZGV4IDRhNDYwOWMuLmM1MGU4ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHlnZW5lcmljLlMKKysrIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weWdlbmVyaWMuUwpAQCAtMjMsNyArMjMsNyBAQAogc3VtCS5yZXEJcjMKIAogLkx6ZXJvOgkJbW92CXIwLCBzdW0KLQkJbG9hZF9yZWdzCWVhCisJCWxvYWRfcmVncwogCiAJCS8qCiAJCSAqIEFsaWduIGFuIHVuYWxpZ25lZCBkZXN0aW5hdGlvbiBwb2ludGVyLiAgV2Uga25vdyB0aGF0CkBAIC04Nyw5ICs4Nyw3IEBACiAJCWIJLkxkb25lCiAKIEZOX0VOVFJZCi0JCW1vdglpcCwgc3AKIAkJc2F2ZV9yZWdzCi0JCXN1YglmcCwgaXAsICM0CiAKIAkJY21wCWxlbiwgIzgJCQlAIEVuc3VyZSB0aGF0IHdlIGhhdmUgYXQgbGVhc3QKIAkJYmxvCS5MbGVzczgJCQlAIDggYnl0ZXMgdG8gY29weS4KQEAgLTE2Myw3ICsxNjEsNyBAQAogCQlsZHIJc3VtLCBbc3AsICMwXQkJQCBkc3QKIAkJdHN0CXN1bSwgIzEKIAkJbW92bmUJcjAsIHIwLCByb3IgIzgKLQkJbG9hZF9yZWdzCWVhCisJCWxvYWRfcmVncwogCiAuTHNyY19ub3RfYWxpZ25lZDoKIAkJYWRjCXN1bSwgc3VtLCAjMAkJQCBpbmNsdWRlIEMgZnJvbSBkc3QgYWxpZ25tZW50CmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUwppbmRleCAzMzNiY2EyLi5jM2I5M2UyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TCisrKyBiL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHl1c2VyLlMKQEAgLTE4LDExICsxOCwxMyBAQAogCQkudGV4dAogCiAJCS5tYWNybwlzYXZlX3JlZ3MKKwkJbW92CWlwLCBzcAogCQlzdG1mZAlzcCEsIHtyMSAtIHIyLCByNCAtIHI4LCBmcCwgaXAsIGxyLCBwY30KKwkJc3ViCWZwLCBpcCwgIzQKIAkJLmVuZG0KIAotCQkubWFjcm8JbG9hZF9yZWdzLGZsYWdzCi0JCWxkbVxmbGFncwlmcCwge3IxLCByMiwgcjQtcjgsIGZwLCBzcCwgcGN9CisJCS5tYWNybwlsb2FkX3JlZ3MKKwkJbGRtZmQJc3AsIHtyMSwgcjIsIHI0LXI4LCBmcCwgc3AsIHBjfQogCQkuZW5kbQogCiAJCS5tYWNybwlsb2FkMWIsCXJlZzEKQEAgLTEwMCw1ICsxMDIsNSBAQAogNjAwMjoJCXRlcQlyMiwgcjEKIAkJc3RybmViCXIwLCBbcjFdLCAjMQogCQlibmUJNjAwMmIKLQkJbG9hZF9yZWdzCWVhCisJCWxvYWRfcmVncwogCQkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY2xvY2suYwppbmRleCAxYzg0YzYwLi43NGFhN2EzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jbG9jay5jCkBAIC0xNiwyNiArMTYsMjcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKIAogc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOwotc3RhdGljIERFQ0xBUkVfTVVURVgoY2xvY2tzX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKGNsb2Nrc19tdXRleCk7CiAKIHN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKIHsKIAlzdHJ1Y3QgY2xrICpwLCAqY2xrID0gRVJSX1BUUigtRU5PRU5UKTsKIAotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7CiAJCWlmIChzdHJjbXAoaWQsIHAtPm5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7CiAJCQljbGsgPSBwOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIAogCXJldHVybiBjbGs7CiB9CkBAIC03OCwxOCArNzksMTggQEAKIAogaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2FkZCgmY2xrLT5ub2RlLCAmY2xvY2tzKTsKLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChjbGtfcmVnaXN0ZXIpOwogCiB2b2lkIGNsa191bnJlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKIHsKLQlkb3duKCZjbG9ja3Nfc2VtKTsKKwltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCWxpc3RfZGVsKCZjbGstPm5vZGUpOwotCXVwKCZjbG9ja3Nfc2VtKTsKKwltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MKGNsa191bnJlZ2lzdGVyKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL01ha2VmaWxlCmluZGV4IDFmMjgwNWNhLi43NWU2ZWUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL01ha2VmaWxlCkBAIC04LDEwICs4LDEwIEBACiBvYmotCQk6PQogCiAjIEJvYXJkLXNwZWNpZmljIHN1cHBvcnQKLSNvYmotJChDT05GSUdfQVJDSF9BVDkxUk05MjAwREspCSs9IGJvYXJkLWRrLm8KLSNvYmotJChDT05GSUdfTUFDSF9BVDkxUk05MjAwRUspCSs9IGJvYXJkLWVrLm8KLSNvYmotJChDT05GSUdfTUFDSF9DU0IzMzcpCSs9IGJvYXJkLWNzYjMzNy5vCi0jb2JqLSQoQ09ORklHX01BQ0hfQ1NCNjM3KQkrPSBib2FyZC1jc2I2Mzcubworb2JqLSQoQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMERLKQkrPSBib2FyZC1kay5vCitvYmotJChDT05GSUdfTUFDSF9BVDkxUk05MjAwRUspCSs9IGJvYXJkLWVrLm8KK29iai0kKENPTkZJR19NQUNIX0NTQjMzNykJKz0gYm9hcmQtY3NiMzM3Lm8KK29iai0kKENPTkZJR19NQUNIX0NTQjYzNykJKz0gYm9hcmQtY3NiNjM3Lm8KICNvYmotJChDT05GSUdfTUFDSF9DQVJNRVZBKQkrPSBib2FyZC1jYXJtZXZhLm8KICNvYmotJChDT05GSUdfTUFDSF9LQjkyMDApCSs9IGJvYXJkLWtiOTIwMi5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1jc2IzMzcuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1jc2IzMzcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWVjODM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWNzYjMzNy5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWNzYjMzNy5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBTQU4gUGVvcGxlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NlcmlhbF9hdDkxcm05MjAwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKworc3RhdGljIHZvaWQgX19pbml0IGNzYjMzN19pbml0X2lycSh2b2lkKQoreworCS8qIEluaXRpYWxpemUgQUlDIGNvbnRyb2xsZXIgKi8KKwlhdDkxcm05MjAwX2luaXRfaXJxKE5VTEwpOworCisJLyogU2V0IHVwIHRoZSBHUElPIGludGVycnVwdHMgKi8KKwlhdDkxX2dwaW9faXJxX3NldHVwKEJHQV9HUElPX0JBTktTKTsKK30KKworLyoKKyAqIFNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb24uCisgKiAgICAwIC4uIDMgPSBVU0FSVDAgLi4gVVNBUlQzCisgKiAgICA0ICAgICAgPSBEQkdVCisgKi8KKyNkZWZpbmUgQ1NCMzM3X1VBUlRfTUFQCQl7IDQsIDEsIC0xLCAtMSwgLTEgfQkvKiB0dHlTMCwgLi4uLCB0dHlTNCAqLworI2RlZmluZSBDU0IzMzdfU0VSSUFMX0NPTlNPTEUJMAkJCS8qIHR0eVMwICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBjc2IzMzdfbWFwX2lvKHZvaWQpCit7CisJaW50IHNlcmlhbFtBVDkxX05SX1VBUlRdID0gQ1NCMzM3X1VBUlRfTUFQOworCWludCBpOworCisJYXQ5MXJtOTIwMF9tYXBfaW8oKTsKKworCS8qIEluaXRpYWxpemUgY2xvY2tzOiAzLjY4NjQgTUh6IGNyeXN0YWwgKi8KKwlhdDkxX2Nsb2NrX2luaXQoMzY4NjQwMCk7CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0FUOTEKKwlhdDkxX2NvbnNvbGVfcG9ydCA9IENTQjMzN19TRVJJQUxfQ09OU09MRTsKKwltZW1jcHkoYXQ5MV9zZXJpYWxfbWFwLCBzZXJpYWwsIHNpemVvZihzZXJpYWwpKTsKKworCS8qIFJlZ2lzdGVyIFVBUlRzICovCisJZm9yIChpID0gMDsgaSA8IEFUOTFfTlJfVUFSVDsgaSsrKSB7CisJCWlmIChzZXJpYWxbaV0gPj0gMCkKKwkJCWF0OTFfcmVnaXN0ZXJfdWFydChpLCBzZXJpYWxbaV0pOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBjc2IzMzdfZXRoX2RhdGEgPSB7CisJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEMyLAorCS5pc19ybWlpCT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgX19pbml0ZGF0YSBjc2IzMzdfdXNiaF9kYXRhID0geworCS5wb3J0cwkJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBhdDkxX3VkY19kYXRhIF9faW5pdGRhdGEgY3NiMzM3X3VkY19kYXRhID0geworCS8vIHRoaXMgaGFzIG5vIFZCVVMgc2Vuc2luZyBwaW4KKwkucHVsbHVwX3Bpbgk9IEFUOTFfUElOX1BBMjQsCit9OworCitzdGF0aWMgc3RydWN0IGF0OTFfY2ZfZGF0YSBfX2luaXRkYXRhIGNzYjMzN19jZl9kYXRhID0geworCS8qCisJICogY29ubmVjdG9yIFA0IG9uIHRoZSBDU0IgMzM3IG1hdGVzIHRvCisJICogY29ubmVjdG9yIFA4IG9uIHRoZSBDU0IgMzAwQ0YKKwkgKi8KKworCS8qIENTQjMzNyBzcGVjaWZpYyAqLworCS5kZXRfcGluCT0gQVQ5MV9QSU5fUEMzLAorCisJLyogQ1NCMzAwQ0Ygc3BlY2lmaWMgKi8KKwkuaXJxX3Bpbgk9IEFUOTFfUElOX1BBMTksCisJLnZjY19waW4JPSBBVDkxX1BJTl9QRDAsCisJLnJzdF9waW4JPSBBVDkxX1BJTl9QRDIsCit9OworCitzdGF0aWMgc3RydWN0IGF0OTFfbW1jX2RhdGEgX19pbml0ZGF0YSBjc2IzMzdfbW1jX2RhdGEgPSB7CisJLmRldF9waW4JPSBBVDkxX1BJTl9QRDUsCisJLmlzX2IJCT0gMCwKKwkud2lyZTQJCT0gMSwKKwkud3BfcGluCQk9IEFUOTFfUElOX1BENiwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjc2IzMzdfYm9hcmRfaW5pdCh2b2lkKQoreworCS8qIEV0aGVybmV0ICovCisJYXQ5MV9hZGRfZGV2aWNlX2V0aCgmY3NiMzM3X2V0aF9kYXRhKTsKKwkvKiBVU0IgSG9zdCAqLworCWF0OTFfYWRkX2RldmljZV91c2JoKCZjc2IzMzdfdXNiaF9kYXRhKTsKKwkvKiBVU0IgRGV2aWNlICovCisJYXQ5MV9hZGRfZGV2aWNlX3VkYygmY3NiMzM3X3VkY19kYXRhKTsKKwkvKiBDb21wYWN0IEZsYXNoICovCisJYXQ5MV9zZXRfZ3Bpb19pbnB1dChBVDkxX1BJTl9QQjIyLCAxKTsJCS8qIElPSVMxNiAqLworCWF0OTFfYWRkX2RldmljZV9jZigmY3NiMzM3X2NmX2RhdGEpOworCS8qIE1NQyAqLworCWF0OTFfYWRkX2RldmljZV9tbWMoJmNzYjMzN19tbWNfZGF0YSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoQ1NCMzM3LCAiQ29nZW50IENTQjMzNyIpCisJLyogTWFpbnRhaW5lcjogQmlsbCBHYXRsaWZmICovCisJLnBoeXNfcmFtCT0gQVQ5MV9TRFJBTV9CQVNFLAorCS5waHlzX2lvCT0gQVQ5MV9CQVNFX1NZUywKKwkuaW9fcGdfb2Zmc3QJPSAoQVQ5MV9WQV9CQVNFX1NZUyA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gQVQ5MV9TRFJBTV9CQVNFICsgMHgxMDAsCisJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAorCS5tYXBfaW8JCT0gY3NiMzM3X21hcF9pbywKKwkuaW5pdF9pcnEJPSBjc2IzMzdfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IGNzYjMzN19ib2FyZF9pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1jc2I2MzcuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1jc2I2MzcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2U0Y2MyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWNzYjYzNy5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWNzYjYzNy5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBTQU4gUGVvcGxlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NlcmlhbF9hdDkxcm05MjAwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKworc3RhdGljIHZvaWQgX19pbml0IGNzYjYzN19pbml0X2lycSh2b2lkKQoreworCS8qIEluaXRpYWxpemUgQUlDIGNvbnRyb2xsZXIgKi8KKwlhdDkxcm05MjAwX2luaXRfaXJxKE5VTEwpOworCisJLyogU2V0IHVwIHRoZSBHUElPIGludGVycnVwdHMgKi8KKwlhdDkxX2dwaW9faXJxX3NldHVwKEJHQV9HUElPX0JBTktTKTsKK30KKworLyoKKyAqIFNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb24uCisgKiAgICAwIC4uIDMgPSBVU0FSVDAgLi4gVVNBUlQzCisgKiAgICA0ICAgICAgPSBEQkdVCisgKi8KKyNkZWZpbmUgQ1NCNjM3X1VBUlRfTUFQCQl7IDQsIDEsIC0xLCAtMSwgLTEgfQkvKiB0dHlTMCwgLi4uLCB0dHlTNCAqLworI2RlZmluZSBDU0I2MzdfU0VSSUFMX0NPTlNPTEUJMAkJCS8qIHR0eVMwICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBjc2I2MzdfbWFwX2lvKHZvaWQpCit7CisJaW50IHNlcmlhbFtBVDkxX05SX1VBUlRdID0gQ1NCNjM3X1VBUlRfTUFQOworCWludCBpOworCisJYXQ5MXJtOTIwMF9tYXBfaW8oKTsKKworCS8qIEluaXRpYWxpemUgY2xvY2tzOiAzLjY4NjQgTUh6IGNyeXN0YWwgKi8KKwlhdDkxX2Nsb2NrX2luaXQoMzY4NjQwMCk7CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0FUOTEKKwlhdDkxX2NvbnNvbGVfcG9ydCA9IENTQjYzN19TRVJJQUxfQ09OU09MRTsKKwltZW1jcHkoYXQ5MV9zZXJpYWxfbWFwLCBzZXJpYWwsIHNpemVvZihzZXJpYWwpKTsKKworCS8qIFJlZ2lzdGVyIFVBUlRzICovCisJZm9yIChpID0gMDsgaSA8IEFUOTFfTlJfVUFSVDsgaSsrKSB7CisJCWlmIChzZXJpYWxbaV0gPj0gMCkKKwkJCWF0OTFfcmVnaXN0ZXJfdWFydChpLCBzZXJpYWxbaV0pOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBjc2I2MzdfZXRoX2RhdGEgPSB7CisJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEMwLAorCS5pc19ybWlpCT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgX19pbml0ZGF0YSBjc2I2MzdfdXNiaF9kYXRhID0geworCS5wb3J0cwkJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBhdDkxX3VkY19kYXRhIF9faW5pdGRhdGEgY3NiNjM3X3VkY19kYXRhID0geworCS52YnVzX3BpbiAgICAgPSBBVDkxX1BJTl9QQjI4LAorCS5wdWxsdXBfcGluICAgPSBBVDkxX1BJTl9QQjEsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY3NiNjM3X2JvYXJkX2luaXQodm9pZCkKK3sKKwkvKiBFdGhlcm5ldCAqLworCWF0OTFfYWRkX2RldmljZV9ldGgoJmNzYjYzN19ldGhfZGF0YSk7CisJLyogVVNCIEhvc3QgKi8KKwlhdDkxX2FkZF9kZXZpY2VfdXNiaCgmY3NiNjM3X3VzYmhfZGF0YSk7CisJLyogVVNCIERldmljZSAqLworCWF0OTFfYWRkX2RldmljZV91ZGMoJmNzYjYzN191ZGNfZGF0YSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoQ1NCNjM3LCAiQ29nZW50IENTQjYzNyIpCisJLyogTWFpbnRhaW5lcjogQmlsbCBHYXRsaWZmICovCisJLnBoeXNfcmFtCT0gQVQ5MV9TRFJBTV9CQVNFLAorCS5waHlzX2lvCT0gQVQ5MV9CQVNFX1NZUywKKwkuaW9fcGdfb2Zmc3QJPSAoQVQ5MV9WQV9CQVNFX1NZUyA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gQVQ5MV9TRFJBTV9CQVNFICsgMHgxMDAsCisJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAorCS5tYXBfaW8JCT0gY3NiNjM3X21hcF9pbywKKwkuaW5pdF9pcnEJPSBjc2I2MzdfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IGNzYjYzN19ib2FyZF9pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1kay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWRrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3NDdhMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1kay5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWRrLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IFNBTiBQZW9wbGUKKyAqCisgKiAgRXBzb24gUzFEIGZyYW1lYnVmZmVyIGdsdWUgY29kZSBpczoKKyAqICAgICBDb3B5cmlnaHQgKEMpIDIwMDUgVGhpYmF1dCBWQVJFTkUgPHZhcmVuZXRAcGFyaXNjLWxpbnV4Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvc2VyaWFsX2F0OTFybTkyMDAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCitzdGF0aWMgdm9pZCBfX2luaXQgZGtfaW5pdF9pcnEodm9pZCkKK3sKKwkvKiBJbml0aWFsaXplIEFJQyBjb250cm9sbGVyICovCisJYXQ5MXJtOTIwMF9pbml0X2lycShOVUxMKTsKKworCS8qIFNldCB1cCB0aGUgR1BJTyBpbnRlcnJ1cHRzICovCisJYXQ5MV9ncGlvX2lycV9zZXR1cChCR0FfR1BJT19CQU5LUyk7Cit9CisKKy8qCisgKiBTZXJpYWwgcG9ydCBjb25maWd1cmF0aW9uLgorICogICAgMCAuLiAzID0gVVNBUlQwIC4uIFVTQVJUMworICogICAgNCAgICAgID0gREJHVQorICovCisjZGVmaW5lIERLX1VBUlRfTUFQCQl7IDQsIDEsIC0xLCAtMSwgLTEgfQkvKiB0dHlTMCwgLi4uLCB0dHlTNCAqLworI2RlZmluZSBES19TRVJJQUxfQ09OU09MRQkwCQkJLyogdHR5UzAgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGRrX21hcF9pbyh2b2lkKQoreworCWludCBzZXJpYWxbQVQ5MV9OUl9VQVJUXSA9IERLX1VBUlRfTUFQOworCWludCBpOworCisJYXQ5MXJtOTIwMF9tYXBfaW8oKTsKKworCS8qIEluaXRpYWxpemUgY2xvY2tzOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KKwlhdDkxX2Nsb2NrX2luaXQoMTg0MzIwMDApOworCisjaWZkZWYgQ09ORklHX1NFUklBTF9BVDkxCisJYXQ5MV9jb25zb2xlX3BvcnQgPSBES19TRVJJQUxfQ09OU09MRTsKKwltZW1jcHkoYXQ5MV9zZXJpYWxfbWFwLCBzZXJpYWwsIHNpemVvZihzZXJpYWwpKTsKKworCS8qIFJlZ2lzdGVyIFVBUlRzICovCisJZm9yIChpID0gMDsgaSA8IEFUOTFfTlJfVUFSVDsgaSsrKSB7CisJCWlmIChhdDkxX3NlcmlhbF9tYXBbaV0gPj0gMCkKKwkJCWF0OTFfcmVnaXN0ZXJfdWFydChpLCBhdDkxX3NlcmlhbF9tYXBbaV0pOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBka19ldGhfZGF0YSA9IHsKKwkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzQsCisJLmlzX3JtaWkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBhdDkxX3VzYmhfZGF0YSBfX2luaXRkYXRhIGRrX3VzYmhfZGF0YSA9IHsKKwkucG9ydHMJCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91ZGNfZGF0YSBfX2luaXRkYXRhIGRrX3VkY19kYXRhID0geworCS52YnVzX3Bpbgk9IEFUOTFfUElOX1BENCwKKwkucHVsbHVwX3Bpbgk9IEFUOTFfUElOX1BENSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9jZl9kYXRhIF9faW5pdGRhdGEgZGtfY2ZfZGF0YSA9IHsKKwkuZGV0X3Bpbgk9IEFUOTFfUElOX1BCMCwKKwkucnN0X3Bpbgk9IEFUOTFfUElOX1BDNSwKKwkvLyAuaXJxX3Bpbgk9IC4uLiBub3QgY29ubmVjdGVkCisJLy8gLnZjY19waW4JPSAuLi4gYWx3YXlzIHBvd2VyZWQKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9tbWNfZGF0YSBfX2luaXRkYXRhIGRrX21tY19kYXRhID0geworCS5pc19iCQk9IDAsCisJLndpcmU0CQk9IDEsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZGtfYm9hcmRfaW5pdCh2b2lkKQoreworCS8qIEV0aGVybmV0ICovCisJYXQ5MV9hZGRfZGV2aWNlX2V0aCgmZGtfZXRoX2RhdGEpOworCS8qIFVTQiBIb3N0ICovCisJYXQ5MV9hZGRfZGV2aWNlX3VzYmgoJmRrX3VzYmhfZGF0YSk7CisJLyogVVNCIERldmljZSAqLworCWF0OTFfYWRkX2RldmljZV91ZGMoJmRrX3VkY19kYXRhKTsKKwkvKiBDb21wYWN0IEZsYXNoICovCisJYXQ5MV9hZGRfZGV2aWNlX2NmKCZka19jZl9kYXRhKTsKKwkvKiBNTUMgKi8KKwlhdDkxX3NldF9ncGlvX291dHB1dChBVDkxX1BJTl9QQjcsIDEpOwkvKiB0aGlzIE1NQyBjYXJkIHNsb3QgY2FuIG9wdGlvbmFsbHkgdXNlIFNQSSBzaWduYWxpbmcgKENTMykuIGRlZmF1bHQ6IE1NQyAqLworCWF0OTFfYWRkX2RldmljZV9tbWMoJmRrX21tY19kYXRhKTsKKwkvKiBWR0EgKi8KKy8vCWRrX2FkZF9kZXZpY2VfdmlkZW8oKTsKK30KKworTUFDSElORV9TVEFSVChBVDkxUk05MjAwREssICJBdG1lbCBBVDkxUk05MjAwLURLIikKKwkvKiBNYWludGFpbmVyOiBTQU4gUGVvcGxlL0F0bWVsICovCisJLnBoeXNfcmFtCT0gQVQ5MV9TRFJBTV9CQVNFLAorCS5waHlzX2lvCT0gQVQ5MV9CQVNFX1NZUywKKwkuaW9fcGdfb2Zmc3QJPSAoQVQ5MV9WQV9CQVNFX1NZUyA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gQVQ5MV9TRFJBTV9CQVNFICsgMHgxMDAsCisJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAorCS5tYXBfaW8JCT0gZGtfbWFwX2lvLAorCS5pbml0X2lycQk9IGRrX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBka19ib2FyZF9pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1lay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWVrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0MDY0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1lay5jCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWVrLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IFNBTiBQZW9wbGUKKyAqCisgKiAgRXBzb24gUzFEIGZyYW1lYnVmZmVyIGdsdWUgY29kZSBpczoKKyAqICAgICBDb3B5cmlnaHQgKEMpIDIwMDUgVGhpYmF1dCBWQVJFTkUgPHZhcmVuZXRAcGFyaXNjLWxpbnV4Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvc2VyaWFsX2F0OTFybTkyMDAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKK3sKKwkvKiBJbml0aWFsaXplIEFJQyBjb250cm9sbGVyICovCisJYXQ5MXJtOTIwMF9pbml0X2lycShOVUxMKTsKKworCS8qIFNldCB1cCB0aGUgR1BJTyBpbnRlcnJ1cHRzICovCisJYXQ5MV9ncGlvX2lycV9zZXR1cChCR0FfR1BJT19CQU5LUyk7Cit9CisKKy8qCisgKiBTZXJpYWwgcG9ydCBjb25maWd1cmF0aW9uLgorICogICAgMCAuLiAzID0gVVNBUlQwIC4uIFVTQVJUMworICogICAgNCAgICAgID0gREJHVQorICovCisjZGVmaW5lIEVLX1VBUlRfTUFQCQl7IDQsIDEsIC0xLCAtMSwgLTEgfQkvKiB0dHlTMCwgLi4uLCB0dHlTNCAqLworI2RlZmluZSBFS19TRVJJQUxfQ09OU09MRQkwCQkJLyogdHR5UzAgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGVrX21hcF9pbyh2b2lkKQoreworCWludCBzZXJpYWxbQVQ5MV9OUl9VQVJUXSA9IEVLX1VBUlRfTUFQOworCWludCBpOworCisJYXQ5MXJtOTIwMF9tYXBfaW8oKTsKKworCS8qIEluaXRpYWxpemUgY2xvY2tzOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KKwlhdDkxX2Nsb2NrX2luaXQoMTg0MzIwMDApOworCisjaWZkZWYgQ09ORklHX1NFUklBTF9BVDkxCisJYXQ5MV9jb25zb2xlX3BvcnQgPSBFS19TRVJJQUxfQ09OU09MRTsKKwltZW1jcHkoYXQ5MV9zZXJpYWxfbWFwLCBzZXJpYWwsIHNpemVvZihzZXJpYWwpKTsKKworCS8qIFJlZ2lzdGVyIFVBUlRzICovCisJZm9yIChpID0gMDsgaSA8IEFUOTFfTlJfVUFSVDsgaSsrKSB7CisJCWlmIChzZXJpYWxbaV0gPj0gMCkKKwkJCWF0OTFfcmVnaXN0ZXJfdWFydChpLCBzZXJpYWxbaV0pOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBla19ldGhfZGF0YSA9IHsKKwkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzQsCisJLmlzX3JtaWkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBhdDkxX3VzYmhfZGF0YSBfX2luaXRkYXRhIGVrX3VzYmhfZGF0YSA9IHsKKwkucG9ydHMJCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91ZGNfZGF0YSBfX2luaXRkYXRhIGVrX3VkY19kYXRhID0geworCS52YnVzX3Bpbgk9IEFUOTFfUElOX1BENCwKKwkucHVsbHVwX3Bpbgk9IEFUOTFfUElOX1BENSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9tbWNfZGF0YSBfX2luaXRkYXRhIGVrX21tY19kYXRhID0geworCS5kZXRfcGluCT0gQVQ5MV9QSU5fUEIyNywKKwkuaXNfYgkJPSAwLAorCS53aXJlNAkJPSAxLAorCS53cF9waW4JCT0gQVQ5MV9QSU5fUEExNywKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19ib2FyZF9pbml0KHZvaWQpCit7CisJLyogRXRoZXJuZXQgKi8KKwlhdDkxX2FkZF9kZXZpY2VfZXRoKCZla19ldGhfZGF0YSk7CisJLyogVVNCIEhvc3QgKi8KKwlhdDkxX2FkZF9kZXZpY2VfdXNiaCgmZWtfdXNiaF9kYXRhKTsKKwkvKiBVU0IgRGV2aWNlICovCisJYXQ5MV9hZGRfZGV2aWNlX3VkYygmZWtfdWRjX2RhdGEpOworCS8qIE1NQyAqLworCWF0OTFfc2V0X2dwaW9fb3V0cHV0KEFUOTFfUElOX1BCMjIsIDEpOwkvKiB0aGlzIE1NQyBjYXJkIHNsb3QgY2FuIG9wdGlvbmFsbHkgdXNlIFNQSSBzaWduYWxpbmcgKENTMykuIGRlZmF1bHQ6IE1NQyAqLworCWF0OTFfYWRkX2RldmljZV9tbWMoJmVrX21tY19kYXRhKTsKKwkvKiBWR0EgKi8KKy8vCWVrX2FkZF9kZXZpY2VfdmlkZW8oKTsKK30KKworTUFDSElORV9TVEFSVChBVDkxUk05MjAwRUssICJBdG1lbCBBVDkxUk05MjAwLUVLIikKKwkvKiBNYWludGFpbmVyOiBTQU4gUGVvcGxlL0F0bWVsICovCisJLnBoeXNfcmFtCT0gQVQ5MV9TRFJBTV9CQVNFLAorCS5waHlzX2lvCT0gQVQ5MV9CQVNFX1NZUywKKwkuaW9fcGdfb2Zmc3QJPSAoQVQ5MV9WQV9CQVNFX1NZUyA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gQVQ5MV9TRFJBTV9CQVNFICsgMHgxMDAsCisJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAorCS5tYXBfaW8JCT0gZWtfbWFwX2lvLAorCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2Nsb2NrLmMKaW5kZXggNDA2ODRlMC4uOTVhMWUyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2Nsb2NrLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0NTI1Lmg+CkBAIC0yMiwyMCArMjMsMjAgQEAKICNpbmNsdWRlICJjbG9jay5oIgogCiBzdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChjbG9ja3Nfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoY2xvY2tzX211dGV4KTsKIAogc3RydWN0IGNsayAqY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkKQogewogCXN0cnVjdCBjbGsgKnAsICpjbGsgPSBFUlJfUFRSKC1FTk9FTlQpOwogCi0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKIAkJaWYgKHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKIAkJCWNsayA9IHA7CiAJCQlicmVhazsKIAkJfQogCX0KLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCiAJcmV0dXJuIGNsazsKIH0KQEAgLTEwNywxOCArMTA4LDE4IEBACiAKIGludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQogewotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9hZGQoJmNsay0+bm9kZSwgJmNsb2Nrcyk7Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woY2xrX3JlZ2lzdGVyKTsKIAogdm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2RlbCgmY2xrLT5ub2RlKTsKLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChjbGtfdW5yZWdpc3Rlcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9sbS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2xtLmMKaW5kZXggNWI0MWUzYS4uNjIyY2RjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2xtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2xtLmMKQEAgLTIyLDIwICsyMiw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgbG1fYnVzdHlwZSA9IHsKLQkubmFtZQkJPSAibG9naWNtb2R1bGUiLAotCS5tYXRjaAkJPSBsbV9tYXRjaCwKLS8vCS5zdXNwZW5kCT0gbG1fc3VzcGVuZCwKLS8vCS5yZXN1bWUJCT0gbG1fcmVzdW1lLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbG1faW5pdCh2b2lkKQotewotCXJldHVybiBidXNfcmVnaXN0ZXIoJmxtX2J1c3R5cGUpOwotfQotCi1wb3N0Y29yZV9pbml0Y2FsbChsbV9pbml0KTsKLQogc3RhdGljIGludCBsbV9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBsbV9kZXZpY2UgKmxtZGV2ID0gdG9fbG1fZGV2aWNlKGRldik7CkBAIC00OSwxNiArMzUsMzAgQEAKIAlzdHJ1Y3QgbG1fZGV2aWNlICpsbWRldiA9IHRvX2xtX2RldmljZShkZXYpOwogCXN0cnVjdCBsbV9kcml2ZXIgKmxtZHJ2ID0gdG9fbG1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAotCWxtZHJ2LT5yZW1vdmUobG1kZXYpOworCWlmIChsbWRydi0+cmVtb3ZlKQorCQlsbWRydi0+cmVtb3ZlKGxtZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBidXNfdHlwZSBsbV9idXN0eXBlID0geworCS5uYW1lCQk9ICJsb2dpY21vZHVsZSIsCisJLm1hdGNoCQk9IGxtX21hdGNoLAorCS5wcm9iZQkJPSBsbV9idXNfcHJvYmUsCisJLnJlbW92ZQkJPSBsbV9idXNfcmVtb3ZlLAorLy8JLnN1c3BlbmQJPSBsbV9idXNfc3VzcGVuZCwKKy8vCS5yZXN1bWUJCT0gbG1fYnVzX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGxtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZsbV9idXN0eXBlKTsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwobG1faW5pdCk7CisKIGludCBsbV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGxtX2RyaXZlciAqZHJ2KQogewogCWRydi0+ZHJ2LmJ1cyA9ICZsbV9idXN0eXBlOwotCWRydi0+ZHJ2LnByb2JlID0gbG1fYnVzX3Byb2JlOwotCWRydi0+ZHJ2LnJlbW92ZSA9IGxtX2J1c19yZW1vdmU7Ci0KIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRydik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NzcC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvc3NwLmMKaW5kZXggYTY4YjMwZS4uOTMwOTZiZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3NzcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3NzcC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgpAQCAtNTksNyArNjAsNyBAQAogI2VuZGlmCiB9OwogCi1zdGF0aWMgREVDTEFSRV9NVVRFWChzZW0pOworc3RhdGljIERFRklORV9NVVRFWChtdXRleCk7CiBzdGF0aWMgaW50IHVzZV9jb3VudFtQWEFfU1NQX1BPUlRTXSA9IHswLCAwLCAwfTsKIAogc3RhdGljIGlycXJldHVybl90IHNzcF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTIzOSwxNiArMjQwLDE2IEBACiAJaWYgKHBvcnQgPiBQWEFfU1NQX1BPUlRTIHx8IHBvcnQgPT0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkb3duKCZzZW0pOworCW11dGV4X2xvY2soJm11dGV4KTsKIAlpZiAodXNlX2NvdW50W3BvcnQgLSAxXSkgewotCQl1cCgmc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZtdXRleCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCXVzZV9jb3VudFtwb3J0IC0gMV0rKzsKIAogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKF9fUFJFRyhTU0NSMF9QKHBvcnQpKSwgMHgyYywgIlNTUCIpKSB7CiAJCXVzZV9jb3VudFtwb3J0IC0gMV0tLTsKLQkJdXAoJnNlbSk7CisJCW11dGV4X3VubG9jaygmbXV0ZXgpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlkZXYtPnBvcnQgPSBwb3J0OwpAQCAtMjY1LDEzICsyNjYsMTMgQEAKIAogCS8qIHR1cm4gb24gU1NQIHBvcnQgY2xvY2sgKi8KIAlweGFfc2V0X2NrZW4oc3NwX2luZm9bcG9ydC0xXS5jbG9jaywgMSk7Ci0JdXAoJnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZtdXRleCk7CiAJcmV0dXJuIDA7CiAKIG91dF9yZWdpb246CiAJcmVsZWFzZV9tZW1fcmVnaW9uKF9fUFJFRyhTU0NSMF9QKHBvcnQpKSwgMHgyYyk7CiAJdXNlX2NvdW50W3BvcnQgLSAxXS0tOwotCXVwKCZzZW0pOworCW11dGV4X3VubG9jaygmbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI4Miw3ICsyODMsNyBAQAogICovCiB2b2lkIHNzcF9leGl0KHN0cnVjdCBzc3BfZGV2ICpkZXYpCiB7Ci0JZG93bigmc2VtKTsKKwltdXRleF9sb2NrKCZtdXRleCk7CiAJU1NDUjBfUChkZXYtPnBvcnQpICY9IH5TU0NSMF9TU0U7CiAKICAgICAJaWYgKGRldi0+cG9ydCA+IFBYQV9TU1BfUE9SVFMgfHwgZGV2LT5wb3J0ID09IDApIHsKQEAgLTI5NSw3ICsyOTYsNyBAQAogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAlyZWxlYXNlX21lbV9yZWdpb24oX19QUkVHKFNTQ1IwX1AoZGV2LT5wb3J0KSksIDB4MmMpOwogCXVzZV9jb3VudFtkZXYtPnBvcnQgLSAxXS0tOwotCXVwKCZzZW0pOworCW11dGV4X3VubG9jaygmbXV0ZXgpOwogfQogCiBFWFBPUlRfU1lNQk9MKHNzcF93cml0ZV93b3JkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY2xvY2suYwppbmRleCBlYzNmN2U3Li4yMTMyNWE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jbG9jay5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0MzA3Lmg+CkBAIC0yMSwyMCArMjIsMjAgQEAKICNpbmNsdWRlICJjbG9jay5oIgogCiBzdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChjbG9ja3Nfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoY2xvY2tzX211dGV4KTsKIAogc3RydWN0IGNsayAqY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkKQogewogCXN0cnVjdCBjbGsgKnAsICpjbGsgPSBFUlJfUFRSKC1FTk9FTlQpOwogCi0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKIAkJaWYgKHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKIAkJCWNsayA9IHA7CiAJCQlicmVhazsKIAkJfQogCX0KLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCiAJcmV0dXJuIGNsazsKIH0KQEAgLTEwOSwxOCArMTEwLDE4IEBACiAKIGludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQogewotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9hZGQoJmNsay0+bm9kZSwgJmNsb2Nrcyk7Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woY2xrX3JlZ2lzdGVyKTsKIAogdm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2RlbCgmY2xrLT5ub2RlKTsKLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChjbGtfdW5yZWdpc3Rlcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKaW5kZXggZmMwOWJhOS4uYWYyZjNkNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgpAQCAtNTEsNyArNTIsNyBAQAogLyogY2xvY2sgaW5mb3JtYXRpb24gKi8KIAogc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOwotc3RhdGljIERFQ0xBUkVfTVVURVgoY2xvY2tzX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKGNsb2Nrc19tdXRleCk7CiAKIC8qIG9sZCBmdW5jdGlvbnMgKi8KIApAQCAtMTAyLDcgKzEwMyw3IEBACiAJZWxzZQogCQlpZG5vID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldiktPmlkOwogCi0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNsb2NrcywgbGlzdCkgewogCQlpZiAocC0+aWQgPT0gaWRubyAmJgpAQCAtMTI2LDcgKzEyNyw3IEBACiAJCX0KIAl9CiAKLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCXJldHVybiBjbGs7CiB9CiAKQEAgLTM2Miw5ICszNjMsOSBAQAogCiAJLyogYWRkIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjbG9ja3MgKi8KIAotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9hZGQoJmNsay0+bGlzdCwgJmNsb2Nrcyk7Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2Nsb2NrLmMKaW5kZXggZGNmMTAwMS4uOTg1OGM5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jbG9jay5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaWNzdDMwNy5oPgpAQCAtMjIsMjAgKzIzLDIwIEBACiAjaW5jbHVkZSAiY2xvY2suaCIKIAogc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOwotc3RhdGljIERFQ0xBUkVfTVVURVgoY2xvY2tzX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKGNsb2Nrc19tdXRleCk7CiAKIHN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKIHsKIAlzdHJ1Y3QgY2xrICpwLCAqY2xrID0gRVJSX1BUUigtRU5PRU5UKTsKIAotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7CiAJCWlmIChzdHJjbXAoaWQsIHAtPm5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7CiAJCQljbGsgPSBwOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIAogCXJldHVybiBjbGs7CiB9CkBAIC0xMTAsMTggKzExMSwxOCBAQAogCiBpbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKIHsKLQlkb3duKCZjbG9ja3Nfc2VtKTsKKwltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCWxpc3RfYWRkKCZjbGstPm5vZGUsICZjbG9ja3MpOwotCXVwKCZjbG9ja3Nfc2VtKTsKKwltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGNsa19yZWdpc3Rlcik7CiAKIHZvaWQgY2xrX3VucmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQogewotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9kZWwoJmNsay0+bm9kZSk7Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0woY2xrX3VucmVnaXN0ZXIpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb25zaXN0ZW50LmMgYi9hcmNoL2FybS9tbS9jb25zaXN0ZW50LmMKaW5kZXggMDUxM2VkMS4uYzJlZTE4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY29uc2lzdGVudC5jCisrKyBiL2FyY2gvYXJtL21tL2NvbnNpc3RlbnQuYwpAQCAtMjAsMTUgKzIwLDI1IEBACiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogCi0jZGVmaW5lIENPTlNJU1RFTlRfQkFTRQkoMHhmZmMwMDAwMCkKKy8qIFNhbml0eSBjaGVjayBzaXplICovCisjaWYgKENPTlNJU1RFTlRfRE1BX1NJWkUgJSBTWl8yTSkKKyNlcnJvciAiQ09OU0lTVEVOVF9ETUFfU0laRSBtdXN0IGJlIG11bHRpcGxlIG9mIDJNaUIiCisjZW5kaWYKKwogI2RlZmluZSBDT05TSVNURU5UX0VORAkoMHhmZmUwMDAwMCkKKyNkZWZpbmUgQ09OU0lTVEVOVF9CQVNFCShDT05TSVNURU5UX0VORCAtIENPTlNJU1RFTlRfRE1BX1NJWkUpCisKICNkZWZpbmUgQ09OU0lTVEVOVF9PRkZTRVQoeCkJKCgodW5zaWduZWQgbG9uZykoeCkgLSBDT05TSVNURU5UX0JBU0UpID4+IFBBR0VfU0hJRlQpCisjZGVmaW5lIENPTlNJU1RFTlRfUFRFX0lOREVYKHgpICgoKHVuc2lnbmVkIGxvbmcpKHgpIC0gQ09OU0lTVEVOVF9CQVNFKSA+PiBQR0RJUl9TSElGVCkKKyNkZWZpbmUgTlVNX0NPTlNJU1RFTlRfUFRFUyAoQ09OU0lTVEVOVF9ETUFfU0laRSA+PiBQR0RJUl9TSElGVCkKKwogCiAvKgotICogVGhpcyBpcyB0aGUgcGFnZSB0YWJsZSAoMk1CKSBjb3ZlcmluZyB1bmNhY2hlZCwgRE1BIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnMKKyAqIFRoZXNlIGFyZSB0aGUgcGFnZSB0YWJsZXMgKDJNQiBlYWNoKSBjb3ZlcmluZyB1bmNhY2hlZCwgRE1BIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnMKICAqLwotc3RhdGljIHB0ZV90ICpjb25zaXN0ZW50X3B0ZTsKK3N0YXRpYyBwdGVfdCAqY29uc2lzdGVudF9wdGVbTlVNX0NPTlNJU1RFTlRfUFRFU107CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvbnNpc3RlbnRfbG9jayk7CiAKIC8qCkBAIC0xNDIsNyArMTUyLDcgQEAKIAl1bnNpZ25lZCBsb25nIG9yZGVyOwogCXU2NCBtYXNrID0gSVNBX0RNQV9USFJFU0hPTEQsIGxpbWl0OwogCi0JaWYgKCFjb25zaXN0ZW50X3B0ZSkgeworCWlmICghY29uc2lzdGVudF9wdGVbMF0pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogbm90IGluaXRpYWxpc2VkXG4iLCBfX2Z1bmNfXyk7CiAJCWR1bXBfc3RhY2soKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0yMDUsOSArMjE1LDEyIEBACiAJYyA9IHZtX3JlZ2lvbl9hbGxvYygmY29uc2lzdGVudF9oZWFkLCBzaXplLAogCQkJICAgIGdmcCAmIH4oX19HRlBfRE1BIHwgX19HRlBfSElHSE1FTSkpOwogCWlmIChjKSB7Ci0JCXB0ZV90ICpwdGUgPSBjb25zaXN0ZW50X3B0ZSArIENPTlNJU1RFTlRfT0ZGU0VUKGMtPnZtX3N0YXJ0KTsKKwkJcHRlX3QgKnB0ZTsKIAkJc3RydWN0IHBhZ2UgKmVuZCA9IHBhZ2UgKyAoMSA8PCBvcmRlcik7CisJCWludCBpZHggPSBDT05TSVNURU5UX1BURV9JTkRFWChjLT52bV9zdGFydCk7CisJCXUzMiBvZmYgPSBDT05TSVNURU5UX09GRlNFVChjLT52bV9zdGFydCkgJiAoUFRSU19QRVJfUFRFLTEpOwogCisJCXB0ZSA9IGNvbnNpc3RlbnRfcHRlW2lkeF0gKyBvZmY7CiAJCWMtPnZtX3BhZ2VzID0gcGFnZTsKIAogCQkvKgpAQCAtMjI2LDYgKzIzOSwxMSBAQAogCQkJc2V0X3B0ZShwdGUsIG1rX3B0ZShwYWdlLCBwcm90KSk7CiAJCQlwYWdlKys7CiAJCQlwdGUrKzsKKwkJCW9mZisrOworCQkJaWYgKG9mZiA+PSBQVFJTX1BFUl9QVEUpIHsKKwkJCQlvZmYgPSAwOworCQkJCXB0ZSA9IGNvbnNpc3RlbnRfcHRlWysraWR4XTsKKwkJCX0KIAkJfSB3aGlsZSAoc2l6ZSAtPSBQQUdFX1NJWkUpOwogCiAJCS8qCkBAIC0zMjcsNiArMzQ1LDggQEAKIAlzdHJ1Y3Qgdm1fcmVnaW9uICpjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGFkZHI7CiAJcHRlX3QgKnB0ZXA7CisJaW50IGlkeDsKKwl1MzIgb2ZmOwogCiAJV0FSTl9PTihpcnFzX2Rpc2FibGVkKCkpOwogCkBAIC0zNDcsNyArMzY3LDkgQEAKIAkJc2l6ZSA9IGMtPnZtX2VuZCAtIGMtPnZtX3N0YXJ0OwogCX0KIAotCXB0ZXAgPSBjb25zaXN0ZW50X3B0ZSArIENPTlNJU1RFTlRfT0ZGU0VUKGMtPnZtX3N0YXJ0KTsKKwlpZHggPSBDT05TSVNURU5UX1BURV9JTkRFWChjLT52bV9zdGFydCk7CisJb2ZmID0gQ09OU0lTVEVOVF9PRkZTRVQoYy0+dm1fc3RhcnQpICYgKFBUUlNfUEVSX1BURS0xKTsKKwlwdGVwID0gY29uc2lzdGVudF9wdGVbaWR4XSArIG9mZjsKIAlhZGRyID0gYy0+dm1fc3RhcnQ7CiAJZG8gewogCQlwdGVfdCBwdGUgPSBwdGVwX2dldF9hbmRfY2xlYXIoJmluaXRfbW0sIGFkZHIsIHB0ZXApOwpAQCAtMzU1LDYgKzM3NywxMSBAQAogCiAJCXB0ZXArKzsKIAkJYWRkciArPSBQQUdFX1NJWkU7CisJCW9mZisrOworCQlpZiAob2ZmID49IFBUUlNfUEVSX1BURSkgeworCQkJb2ZmID0gMDsKKwkJCXB0ZXAgPSBjb25zaXN0ZW50X3B0ZVsrK2lkeF07CisJCX0KIAogCQlpZiAoIXB0ZV9ub25lKHB0ZSkgJiYgcHRlX3ByZXNlbnQocHRlKSkgewogCQkJcGZuID0gcHRlX3BmbihwdGUpOwpAQCAtNDAxLDExICs0MjgsMTIgQEAKIAlwZ2RfdCAqcGdkOwogCXBtZF90ICpwbWQ7CiAJcHRlX3QgKnB0ZTsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0ID0gMCwgaSA9IDA7CisJdTMyIGJhc2UgPSBDT05TSVNURU5UX0JBU0U7CiAKIAlkbyB7Ci0JCXBnZCA9IHBnZF9vZmZzZXQoJmluaXRfbW0sIENPTlNJU1RFTlRfQkFTRSk7Ci0JCXBtZCA9IHBtZF9hbGxvYygmaW5pdF9tbSwgcGdkLCBDT05TSVNURU5UX0JBU0UpOworCQlwZ2QgPSBwZ2Rfb2Zmc2V0KCZpbml0X21tLCBiYXNlKTsKKwkJcG1kID0gcG1kX2FsbG9jKCZpbml0X21tLCBwZ2QsIGJhc2UpOwogCQlpZiAoIXBtZCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gcG1kIHRhYmxlc1xuIiwgX19mdW5jX18pOwogCQkJcmV0ID0gLUVOT01FTTsKQEAgLTQxMywxNSArNDQxLDE2IEBACiAJCX0KIAkJV0FSTl9PTighcG1kX25vbmUoKnBtZCkpOwogCi0JCXB0ZSA9IHB0ZV9hbGxvY19rZXJuZWwocG1kLCBDT05TSVNURU5UX0JBU0UpOworCQlwdGUgPSBwdGVfYWxsb2Nfa2VybmVsKHBtZCwgYmFzZSk7CiAJCWlmICghcHRlKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBwdGUgdGFibGVzXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJYnJlYWs7CiAJCX0KIAotCQljb25zaXN0ZW50X3B0ZSA9IHB0ZTsKLQl9IHdoaWxlICgwKTsKKwkJY29uc2lzdGVudF9wdGVbaSsrXSA9IHB0ZTsKKwkJYmFzZSArPSAoMSA8PCBQR0RJUl9TSElGVCk7CisJfSB3aGlsZSAoYmFzZSA8IENPTlNJU1RFTlRfRU5EKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCmluZGV4IDg0ZmQ2NTYuLjdlYmM1YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KQEAgLTI3LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9jbG9jay5oPgogCiBMSVNUX0hFQUQoY2xvY2tzKTsKLXN0YXRpYyBERUNMQVJFX01VVEVYKGNsb2Nrc19zZW0pOworc3RhdGljIERFRklORV9NVVRFWChjbG9ja3NfbXV0ZXgpOwogREVGSU5FX1NQSU5MT0NLKGNsb2NrZndfbG9jayk7CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2Z1bmN0aW9ucyAqYXJjaF9jbG9jazsKQEAgLTQwLDE0ICs0MSwxNCBAQAogewogCXN0cnVjdCBjbGsgKnAsICpjbGsgPSBFUlJfUFRSKC1FTk9FTlQpOwogCi0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKIAkJaWYgKHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKIAkJCWNsayA9IHA7CiAJCQlicmVhazsKIAkJfQogCX0KLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCiAJcmV0dXJuIGNsazsKIH0KQEAgLTI0OSwxMSArMjUwLDExIEBACiAKIGludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQogewotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9hZGQoJmNsay0+bm9kZSwgJmNsb2Nrcyk7CiAJaWYgKGNsay0+aW5pdCkKIAkJY2xrLT5pbml0KGNsayk7Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjYxLDkgKzI2Miw5IEBACiAKIHZvaWQgY2xrX3VucmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQogewotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9kZWwoJmNsay0+bm9kZSk7Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0woY2xrX3VucmVnaXN0ZXIpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2FybTI2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMTU4MzNhMC4uMzg2MzA1NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjc3LDEwICsyNzcsOSBAQAogY29weV90aHJlYWQoaW50IG5yLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHN0YWNrX3N0YXJ0LAogCSAgICB1bnNpZ25lZCBsb25nIHVudXNlZCwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IHAtPnRocmVhZF9pbmZvOwotCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3M7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSB0YXNrX3RocmVhZF9pbmZvKHApOworCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3MgPSB0YXNrX3B0X3JlZ3MocCk7CiAKLQljaGlsZHJlZ3MgPSBfX2dldF91c2VyX3JlZ3ModGhyZWFkKTsKIAkqY2hpbGRyZWdzID0gKnJlZ3M7CiAJY2hpbGRyZWdzLT5BUk1fcjAgPSAwOwogCWNoaWxkcmVncy0+QVJNX3NwID0gc3RhY2tfc3RhcnQ7CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jCmluZGV4IDRlNmI3MzUuLjNjMzM3MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jCkBAIC00MCwyMSArNDAsNiBAQAogI2RlZmluZSBCUkVBS0lOU1RfQVJNCTB4ZWY5ZjAwMDEKIAogLyoKLSAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbGl2ZSBwdF9yZWdzIGZvciB0aGUgc3BlY2lmaWVkIHRhc2suCi0gKiBUaGVzZSBhcmUgc2F2ZWQgb250byB0aGUgdG9wIGtlcm5lbCBzdGFjayB3aGVuIHRoZSBwcm9jZXNzCi0gKiBpcyBub3QgcnVubmluZy4KLSAqCi0gKiBOb3RlOiBpZiBhIHVzZXIgdGhyZWFkIGlzIGV4ZWN2ZSdkIGZyb20ga2VybmVsIHNwYWNlLCB0aGUKLSAqIGtlcm5lbCBzdGFjayB3aWxsIG5vdCBiZSBlbXB0eSBvbiBlbnRyeSB0byB0aGUga2VybmVsLCBzbwotICogcHRyYWNpbmcgdGhlc2UgdGFza3Mgd2lsbCBmYWlsLgotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwdF9yZWdzICoKLWdldF91c2VyX3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQotewotCXJldHVybiBfX2dldF91c2VyX3JlZ3ModGFzay0+dGhyZWFkX2luZm8pOwotfQotCi0vKgogICogdGhpcyByb3V0aW5lIHdpbGwgZ2V0IGEgd29yZCBvZmYgb2YgdGhlIHByb2Nlc3NlcyBwcml2aWxlZ2VkIHN0YWNrLgogICogdGhlIG9mZnNldCBpcyBob3cgZmFyIGZyb20gdGhlIGJhc2UgYWRkciBhcyBzdG9yZWQgaW4gdGhlIFRIUkVBRC4KICAqIHRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgYWxsIHRoZSBwcml2aWxlZ2VkIHN0YWNrcyBhcmUgaW4gb3VyCkBAIC02Miw3ICs0Nyw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgbG9uZyBnZXRfdXNlcl9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgb2Zmc2V0KQogewotCXJldHVybiBnZXRfdXNlcl9yZWdzKHRhc2spLT51cmVnc1tvZmZzZXRdOworCXJldHVybiB0YXNrX3B0X3JlZ3ModGFzayktPnVyZWdzW29mZnNldF07CiB9CiAKIC8qCkBAIC03NCw3ICs1OSw3IEBACiBzdGF0aWMgaW5saW5lIGludAogcHV0X3VzZXJfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IG9mZnNldCwgbG9uZyBkYXRhKQogewotCXN0cnVjdCBwdF9yZWdzIG5ld3JlZ3MsICpyZWdzID0gZ2V0X3VzZXJfcmVncyh0YXNrKTsKKwlzdHJ1Y3QgcHRfcmVncyBuZXdyZWdzLCAqcmVncyA9IHRhc2tfcHRfcmVncyh0YXNrKTsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCW5ld3JlZ3MgPSAqcmVnczsKQEAgLTM3Nyw3ICszNjIsNyBAQAogCXUzMiBpbnNuOwogCWludCByZXM7CiAKLQlyZWdzID0gZ2V0X3VzZXJfcmVncyhjaGlsZCk7CisJcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJcGMgPSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOwogCiAJcmVzID0gcmVhZF9pbnN0cihjaGlsZCwgcGMsICZpbnNuKTsKQEAgLTUwMCw3ICs0ODUsNyBAQAogICovCiBzdGF0aWMgaW50IHB0cmFjZV9nZXRyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB2b2lkICp1cmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF91c2VyX3JlZ3ModHNrKTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyh0c2spOwogCiAJcmV0dXJuIGNvcHlfdG9fdXNlcih1cmVncywgcmVncywgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkgPyAtRUZBVUxUIDogMDsKIH0KQEAgLTUxNSw3ICs1MDAsNyBAQAogCiAJcmV0ID0gLUVGQVVMVDsKIAlpZiAoY29weV9mcm9tX3VzZXIoJm5ld3JlZ3MsIHVyZWdzLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKSA9PSAwKSB7Ci0JCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X3VzZXJfcmVncyh0c2spOworCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyh0c2spOwogCiAJCXJldCA9IC1FSU5WQUw7CiAJCWlmICh2YWxpZF91c2VyX3JlZ3MoJm5ld3JlZ3MpKSB7CkBAIC01MzIsNyArNTE3LDcgQEAKICAqLwogc3RhdGljIGludCBwdHJhY2VfZ2V0ZnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB2b2lkICp1ZnApCiB7Ci0JcmV0dXJuIGNvcHlfdG9fdXNlcih1ZnAsICZ0c2stPnRocmVhZF9pbmZvLT5mcHN0YXRlLAorCXJldHVybiBjb3B5X3RvX3VzZXIodWZwLCAmdGFza190aHJlYWRfaW5mbyh0c2spLT5mcHN0YXRlLAogCQkJICAgIHNpemVvZihzdHJ1Y3QgdXNlcl9mcCkpID8gLUVGQVVMVCA6IDA7CiB9CiAKQEAgLTU0Miw3ICs1MjcsNyBAQAogc3RhdGljIGludCBwdHJhY2Vfc2V0ZnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB2b2lkICp1ZnApCiB7CiAJc2V0X3N0b3BwZWRfY2hpbGRfdXNlZF9tYXRoKHRzayk7Ci0JcmV0dXJuIGNvcHlfZnJvbV91c2VyKCZ0c2stPnRocmVhZF9pbmZvLT5mcHN0YXRlLCB1ZnAsCisJcmV0dXJuIGNvcHlfZnJvbV91c2VyKCZ0YXNrX3RocmVhc19pbmZvKHRzayktPmZwc3RhdGUsIHVmcCwKIAkJCSAgICAgIHNpemVvZihzdHJ1Y3QgdXNlcl9mcCkpID8gLUVGQVVMVCA6IDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYva2VybmVsL3RyYXBzLmMgYi9hcmNoL2FybTI2L2tlcm5lbC90cmFwcy5jCmluZGV4IGY2NGY1OTAuLjU4NDdlYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0yNi9rZXJuZWwvdHJhcHMuYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAKIC8qc3RhdGljKi8gdm9pZCBfX2R1bXBfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgc3ApCiB7Ci0JZHVtcF9tZW0oIlN0YWNrOiAiLCBzcCwgODE5MisodW5zaWduZWQgbG9uZyl0c2stPnRocmVhZF9pbmZvKTsKKwlkdW1wX21lbSgiU3RhY2s6ICIsIHNwLCA4MTkyKyh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZSh0c2spKTsKIH0KIAogdm9pZCBkdW1wX3N0YWNrKHZvaWQpCkBAIC0xNTgsNyArMTU4LDcgQEAKIAl9IGVsc2UgaWYgKHZlcmlmeV9zdGFjayhmcCkpIHsKIAkJcHJpbnRrKCJpbnZhbGlkIGZyYW1lIHBvaW50ZXIgMHglMDh4IiwgZnApOwogCQlvayA9IDA7Ci0JfSBlbHNlIGlmIChmcCA8ICh1bnNpZ25lZCBsb25nKSh0c2stPnRocmVhZF9pbmZvICsgMSkpCisJfSBlbHNlIGlmIChmcCA8ICh1bnNpZ25lZCBsb25nKWVuZF9vZl9zdGFjayh0c2spKQogCQlwcmludGsoImZyYW1lIHBvaW50ZXIgdW5kZXJmbG93Iik7CiAJcHJpbnRrKCJcbiIpOwogCkBAIC0xNjgsNyArMTY4LDcgQEAKIAogLyogRklYTUUgLSB0aGlzIGlzIHByb2JhYmx5IHdyb25nLi4gKi8KIHZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnNwKSB7Ci0JZHVtcF9tZW0oIlN0YWNrOiAiLCAodW5zaWduZWQgbG9uZylzcCwgODE5MisodW5zaWduZWQgbG9uZyl0YXNrLT50aHJlYWRfaW5mbyk7CisJZHVtcF9tZW0oIlN0YWNrOiAiLCAodW5zaWduZWQgbG9uZylzcCwgODE5MisodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodGFzaykpOwogfQogCiBERUZJTkVfU1BJTkxPQ0soZGllX2xvY2spOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJcHJpbnRrKCJDUFU6ICVkXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXNob3dfcmVncyhyZWdzKTsKIAlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHN0YWNrIGxpbWl0ID0gMHglcClcbiIsCi0JCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgdHNrLT50aHJlYWRfaW5mbyArIDEpOworCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGVuZF9vZl9zdGFjayh0c2spKTsKIAogCWlmICghdXNlcl9tb2RlKHJlZ3MpIHx8IGluX2ludGVycnVwdCgpKSB7CiAJCV9fZHVtcF9zdGFjayh0c2ssICh1bnNpZ25lZCBsb25nKShyZWdzICsgMSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3Byb2Nlc3MuYwppbmRleCA2OWUyOGI0Li4wYTY3NWNlIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3Byb2Nlc3MuYwpAQCAtNzksNyArNzksNyBAQAogICovCiB1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCiB7Ci0JcmV0dXJuICh1bnNpZ25lZCBsb25nKXVzZXJfcmVncyh0LT50aHJlYWRfaW5mbyktPmlycDsKKwlyZXR1cm4gdGFza19wdF9yZWdzKHQpLT5pcnA7CiB9CiAKIHN0YXRpYyB2b2lkIGtlcm5lbF90aHJlYWRfaGVscGVyKHZvaWQqIGR1bW15LCBpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZykKQEAgLTEyOCw3ICsxMjgsNyBAQAogCSAqIHJlbWVtYmVyIHRoYXQgdGhlIHRhc2tfc3RydWN0IGRvdWJsZXMgYXMgdGhlIGtlcm5lbCBzdGFjayBmb3IgdGhlIHRhc2sKIAkgKi8KIAotCWNoaWxkcmVncyA9IHVzZXJfcmVncyhwLT50aHJlYWRfaW5mbyk7ICAgICAgICAKKwljaGlsZHJlZ3MgPSB0YXNrX3B0X3JlZ3MocCk7CiAgICAgICAgIAogCSpjaGlsZHJlZ3MgPSAqcmVnczsgIC8qIHN0cnVjdCBjb3B5IG9mIHB0X3JlZ3MgKi8KICAgICAgICAgCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYwppbmRleCA2Y2JkMzRhLi5mMjE0Zjc0IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvcHRyYWNlLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAlpZiAocmVnbm8gPT0gUFRfVVNQKQogCQlyZXR1cm4gdGFzay0+dGhyZWFkLnVzcDsKIAllbHNlIGlmIChyZWdubyA8IFBUX01BWCkKLQkJcmV0dXJuICgodW5zaWduZWQgbG9uZyAqKXVzZXJfcmVncyh0YXNrLT50aHJlYWRfaW5mbykpW3JlZ25vXTsKKwkJcmV0dXJuICgodW5zaWduZWQgbG9uZyAqKXRhc2tfcHRfcmVncyh0YXNrKSlbcmVnbm9dOwogCWVsc2UKIAkJcmV0dXJuIDA7CiB9CkBAIC01MSw3ICs1MSw3IEBACiAJaWYgKHJlZ25vID09IFBUX1VTUCkKIAkJdGFzay0+dGhyZWFkLnVzcCA9IGRhdGE7CiAJZWxzZSBpZiAocmVnbm8gPCBQVF9NQVgpCi0JCSgodW5zaWduZWQgbG9uZyAqKXVzZXJfcmVncyh0YXNrLT50aHJlYWRfaW5mbykpW3JlZ25vXSA9IGRhdGE7CisJCSgodW5zaWduZWQgbG9uZyAqKXRhc2tfcHRfcmVncyh0YXNrKSlbcmVnbm9dID0gZGF0YTsKIAllbHNlCiAJCXJldHVybiAtMTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggODgyYmU0Mi4uODQzNTEzMSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTk2LDcgKzk2LDcgQEAKICAqLwogdW5zaWduZWQgbG9uZyB0aHJlYWRfc2F2ZWRfcGMoc3RydWN0IHRhc2tfc3RydWN0ICp0KQogewotCXJldHVybiAodW5zaWduZWQgbG9uZyl1c2VyX3JlZ3ModC0+dGhyZWFkX2luZm8pLT5lcnA7CisJcmV0dXJuIHRhc2tfcHRfcmVncyh0KS0+ZXJwOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTQ4LDcgKzE0OCw3IEBACiAJICogZml4IGl0IHVwLiBOb3RlOiB0aGUgdGFza19zdHJ1Y3QgZG91YmxlcyBhcyB0aGUga2VybmVsIHN0YWNrIGZvciB0aGUKIAkgKiB0YXNrLgogCSAqLwotCWNoaWxkcmVncyA9IHVzZXJfcmVncyhwLT50aHJlYWRfaW5mbyk7CisJY2hpbGRyZWdzID0gdGFza19wdF9yZWdzKHApOwogCSpjaGlsZHJlZ3MgPSAqcmVnczsJLyogU3RydWN0IGNvcHkgb2YgcHRfcmVncy4gKi8KICAgICAgICAgcC0+c2V0X2NoaWxkX3RpZCA9IHAtPmNsZWFyX2NoaWxkX3RpZCA9IE5VTEw7CiAgICAgICAgIGNoaWxkcmVncy0+cjEwID0gMDsJLyogQ2hpbGQgcmV0dXJucyAwIGFmdGVyIGEgZm9yay9jbG9uZS4gKi8KQEAgLTE1Nyw3ICsxNTcsNyBAQAogCSAqIFRoZSBUTFMgaXMgaW4gJG1vZiBiZWFjdXNlIGl0IGlzIHRoZSA1dGggYXJndW1lbnQgdG8gc3lzX2Nsb25lLgogCSAqLwogCWlmIChwLT5tbSAmJiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TRVRUTFMpKSB7Ci0JCXAtPnRocmVhZF9pbmZvLT50bHMgPSByZWdzLT5tb2Y7CisJCXRhc2tfdGhyZWFkX2luZm8ocCktPnRscyA9IHJlZ3MtPm1vZjsKIAl9CiAKIAkvKiBQdXQgdGhlIHN3aXRjaCBzdGFjayByaWdodCBiZWxvdyB0aGUgcHRfcmVncy4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3B0cmFjZS5jCmluZGV4IDU1MjhiODMuLjgyY2YyZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wdHJhY2UuYwpAQCAtNDYsNyArNDYsNyBAQAogCXVuc2lnbmVkIGxvbmcgcmV0OwogCiAJaWYgKHJlZ25vIDw9IFBUX0VEQSkKLQkJcmV0ID0gKCh1bnNpZ25lZCBsb25nICopdXNlcl9yZWdzKHRhc2stPnRocmVhZF9pbmZvKSlbcmVnbm9dOworCQlyZXQgPSAoKHVuc2lnbmVkIGxvbmcgKil0YXNrX3B0X3JlZ3ModGFzaykpW3JlZ25vXTsKIAllbHNlIGlmIChyZWdubyA9PSBQVF9VU1ApCiAJCXJldCA9IHRhc2stPnRocmVhZC51c3A7CiAJZWxzZSBpZiAocmVnbm8gPT0gUFRfUFBDKQpAQCAtNjUsMTMgKzY1LDEzIEBACiBpbnQgcHV0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGludCByZWdubywgdW5zaWduZWQgbG9uZyBkYXRhKQogewogCWlmIChyZWdubyA8PSBQVF9FREEpCi0JCSgodW5zaWduZWQgbG9uZyAqKXVzZXJfcmVncyh0YXNrLT50aHJlYWRfaW5mbykpW3JlZ25vXSA9IGRhdGE7CisJCSgodW5zaWduZWQgbG9uZyAqKXRhc2tfcHRfcmVncyh0YXNrKSlbcmVnbm9dID0gZGF0YTsKIAllbHNlIGlmIChyZWdubyA9PSBQVF9VU1ApCiAJCXRhc2stPnRocmVhZC51c3AgPSBkYXRhOwogCWVsc2UgaWYgKHJlZ25vID09IFBUX1BQQykgewogCQkvKiBXcml0ZSBwc2V1ZG8tUEMgdG8gRVJQIG9ubHkgaWYgY2hhbmdlZC4gKi8KIAkJaWYgKGRhdGEgIT0gZ2V0X3BzZXVkb19wYyh0YXNrKSkKLQkJCSgodW5zaWduZWQgbG9uZyAqKXVzZXJfcmVncyh0YXNrLT50aHJlYWRfaW5mbykpW1BUX0VSUF0gPSBkYXRhOworCQkJdGFza19wdF9yZWdzKHRhc2spLT5lcnAgPSBkYXRhOwogCX0gZWxzZSBpZiAocmVnbm8gPD0gUFRfTUFYKQogCQlyZXR1cm4gcHV0X2RlYnVncmVnKHRhc2stPnBpZCwgcmVnbm8sIGRhdGEpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc21wLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NtcC5jCmluZGV4IDEzODY3ZjQuLmRhNDBkMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zbXAuYwpAQCAtMTEzLDEwICsxMTMsMTAgQEAKIAlpZiAoSVNfRVJSKGlkbGUpKQogCQlwYW5pYygiU01QOiBmb3JrIGZhaWxlZCBmb3IgQ1BVOiVkIiwgY3B1aWQpOwogCi0JaWRsZS0+dGhyZWFkX2luZm8tPmNwdSA9IGNwdWlkOworCXRhc2tfdGhyZWFkX2luZm8oaWRsZSktPmNwdSA9IGNwdWlkOwogCiAJLyogSW5mb3JtYXRpb24gdG8gdGhlIENQVSB0aGF0IGlzIGFib3V0IHRvIGJvb3QgKi8KLQlzbXBfaW5pdF9jdXJyZW50X2lkbGVfdGhyZWFkID0gaWRsZS0+dGhyZWFkX2luZm87CisJc21wX2luaXRfY3VycmVudF9pZGxlX3RocmVhZCA9IHRhc2tfdGhyZWFkX2luZm8oaWRsZSk7CiAJY3B1X25vd19ib290aW5nID0gY3B1aWQ7CiAKIAkvKiBXYWl0IGZvciBDUFUgdG8gY29tZSBvbmxpbmUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tbS90bGIuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tbS90bGIuYwppbmRleCBiMDhhMjhiLi45ZDc1ZDc2IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbW0vdGxiLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21tL3RsYi5jCkBAIC0xOTgsOSArMTk4LDkgQEAKIAlwZXJfY3B1KGN1cnJlbnRfcGdkLCBjcHUpID0gbmV4dC0+cGdkOwogCiAJLyogU3dpdGNoIGNvbnRleHQgaW4gdGhlIE1NVS4gKi8KLSAgICAgICAgaWYgKHRzayAmJiB0c2stPnRocmVhZF9pbmZvKQorICAgICAgICBpZiAodHNrICYmIHRhc2tfdGhyZWFkX2luZm8odHNrKSkKICAgICAgICAgewotICAgICAgICAgIFNQRUNfUkVHX1dSKFNQRUNfUkVHX1BJRCwgbmV4dC0+Y29udGV4dC5wYWdlX2lkIHwgdHNrLT50aHJlYWRfaW5mby0+dGxzKTsKKyAgICAgICAgICBTUEVDX1JFR19XUihTUEVDX1JFR19QSUQsIG5leHQtPmNvbnRleHQucGFnZV9pZCB8IHRhc2tfdGhyZWFkX2luZm8odHNrKS0+dGxzKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2Zydi9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGM0NDg4MzcuLjBmZmY4YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAKIAlyZWdzMCA9IF9fa2VybmVsX2ZyYW1lMF9wdHI7CiAJY2hpbGRyZWdzMCA9IChzdHJ1Y3QgcHRfcmVncyAqKQotCQkoKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkUgLSBVU0VSX0NPTlRFWFRfU0laRSk7CisJCSh0YXNrX3N0YWNrX3BhZ2UocCkgKyBUSFJFQURfU0laRSAtIFVTRVJfQ09OVEVYVF9TSVpFKTsKIAljaGlsZHJlZ3MgPSBjaGlsZHJlZ3MwOwogCiAJLyogc2V0IHVwIHRoZSB1c2Vyc3BhY2UgZnJhbWUgKHRoZSBvbmx5IHBsYWNlIHRoYXQgdGhlIFVTUCBpcyBzdG9yZWQpICovCkBAIC0yMjAsNyArMjIwLDcgQEAKIAkJKmNoaWxkcmVncyA9ICpyZWdzOwogCQljaGlsZHJlZ3MtPnNwID0gKHVuc2lnbmVkIGxvbmcpIGNoaWxkcmVnczA7CiAJCWNoaWxkcmVncy0+bmV4dF9mcmFtZSA9IGNoaWxkcmVnczA7Ci0JCWNoaWxkcmVncy0+Z3IxNSA9ICh1bnNpZ25lZCBsb25nKSBwLT50aHJlYWRfaW5mbzsKKwkJY2hpbGRyZWdzLT5ncjE1ID0gKHVuc2lnbmVkIGxvbmcpIHRhc2tfdGhyZWFkX2luZm8ocCk7CiAJCWNoaWxkcmVncy0+Z3IyOSA9ICh1bnNpZ25lZCBsb25nKSBwOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9oODMwMC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDU4NWVkNWUuLmVkNzlhZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogewogCXN0cnVjdCBwdF9yZWdzICogY2hpbGRyZWdzOwogCi0JY2hpbGRyZWdzID0gKChzdHJ1Y3QgcHRfcmVncyAqKSAoVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZykgcC0+dGhyZWFkX2luZm8pKSAtIDE7CisJY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopIChUSFJFQURfU0laRSArIHRhc2tfc3RhY2tfcGFnZShwKSkgLSAxOwogCiAJKmNoaWxkcmVncyA9ICpyZWdzOwogCWNoaWxkcmVncy0+cmV0cGMgPSAodW5zaWduZWQgbG9uZykgcmV0X2Zyb21fZm9yazsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMDM1OTI4Zi4uMjE4NTM3NyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTQyNCwxOCArNDI0LDcgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAlpbnQgZXJyOwogCi0JY2hpbGRyZWdzID0gKChzdHJ1Y3QgcHRfcmVncyAqKSAoVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZykgcC0+dGhyZWFkX2luZm8pKSAtIDE7Ci0JLyoKLQkgKiBUaGUgYmVsb3cgLTggaXMgdG8gcmVzZXJ2ZSA4IGJ5dGVzIG9uIHRvcCBvZiB0aGUgcmluZzAgc3RhY2suCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGVudGlyZSAic3RydWN0IHB0X3JlZ3MiCi0JICogaXMgYWNjZXNzYWJsZSBldmVuIGlmIHRoZSBDUFUgaGF2ZW4ndCBzdG9yZWQgdGhlIFNTL0VTUCByZWdpc3RlcnMKLQkgKiBvbiB0aGUgc3RhY2sgKGludGVycnVwdCBnYXRlIGRvZXMgbm90IHNhdmUgdGhlc2UgcmVnaXN0ZXJzCi0JICogd2hlbiBzd2l0Y2hpbmcgdG8gdGhlIHNhbWUgcHJpdiByaW5nKS4KLQkgKiBUaGVyZWZvcmUgYmV3YXJlOiBhY2Nlc3NpbmcgdGhlIHhzcy9lc3AgZmllbGRzIG9mIHRoZQotCSAqICJzdHJ1Y3QgcHRfcmVncyIgaXMgcG9zc2libGUsIGJ1dCB0aGV5IG1heSBjb250YWluIHRoZQotCSAqIGNvbXBsZXRlbHkgd3JvbmcgdmFsdWVzLgotCSAqLwotCWNoaWxkcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoKHVuc2lnbmVkIGxvbmcpIGNoaWxkcmVncyAtIDgpOworCWNoaWxkcmVncyA9IHRhc2tfcHRfcmVncyhwKTsKIAkqY2hpbGRyZWdzID0gKnJlZ3M7CiAJY2hpbGRyZWdzLT5lYXggPSAwOwogCWNoaWxkcmVncy0+ZXNwID0gZXNwOwpAQCAtNTQwLDEyICs1MjksNyBAQAogICovCiBpbnQgZHVtcF90YXNrX3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGVsZl9ncmVnc2V0X3QgKnJlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgcHRyZWdzOwotCQotCXB0cmVncyA9ICooc3RydWN0IHB0X3JlZ3MgKikKLQkJKCh1bnNpZ25lZCBsb25nKXRzay0+dGhyZWFkX2luZm8gKwotCQkvKiBzZWUgY29tbWVudHMgaW4gY29weV90aHJlYWQoKSBhYm91dCAtOCAqLwotCQlUSFJFQURfU0laRSAtIHNpemVvZihwdHJlZ3MpIC0gOCk7CisJc3RydWN0IHB0X3JlZ3MgcHRyZWdzID0gKnRhc2tfcHRfcmVncyh0c2spOwogCXB0cmVncy54Y3MgJj0gMHhmZmZmOwogCXB0cmVncy54ZHMgJj0gMHhmZmZmOwogCXB0cmVncy54ZXMgJj0gMHhmZmZmOwpAQCAtNjAxLDggKzU4NSw4IEBACiAJICogZ2NjIHNob3VsZCBlbGltaW5hdGUgdGhlIC0+dGhyZWFkX2luZm8gZGVyZWZlcmVuY2UgaWYKIAkgKiBoYXNfc2VjdXJlX2NvbXB1dGluZyByZXR1cm5zIDAgYXQgY29tcGlsZSB0aW1lIChTRUNDT01QPW4pLgogCSAqLwotCXByZXYgPSBwcmV2X3AtPnRocmVhZF9pbmZvOwotCW5leHQgPSBuZXh0X3AtPnRocmVhZF9pbmZvOworCXByZXYgPSB0YXNrX3RocmVhZF9pbmZvKHByZXZfcCk7CisJbmV4dCA9IHRhc2tfdGhyZWFkX2luZm8obmV4dF9wKTsKIAogCWlmIChoYXNfc2VjdXJlX2NvbXB1dGluZyhwcmV2KSB8fCBoYXNfc2VjdXJlX2NvbXB1dGluZyhuZXh0KSkgewogCQkvKiBzbG93IHBhdGggaGVyZSAqLwpAQCAtNzg3LDcgKzc3MSw3IEBACiAJaW50IGNvdW50ID0gMDsKIAlpZiAoIXAgfHwgcCA9PSBjdXJyZW50IHx8IHAtPnN0YXRlID09IFRBU0tfUlVOTklORykKIAkJcmV0dXJuIDA7Ci0Jc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXAtPnRocmVhZF9pbmZvOworCXN0YWNrX3BhZ2UgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UocCk7CiAJZXNwID0gcC0+dGhyZWFkLmVzcDsKIAlpZiAoIXN0YWNrX3BhZ2UgfHwgZXNwIDwgc3RhY2tfcGFnZSB8fCBlc3AgPiB0b3BfZXNwK3N0YWNrX3BhZ2UpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwppbmRleCBiM2MyZTJjLi4yNTVhZGI0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwpAQCAtODc1LDggKzg3NSw3IEBACiAJCS8qIGluaXRpYWxpemUgdGhyZWFkX3N0cnVjdC4gIHdlIHJlYWxseSB3YW50IHRvIGF2b2lkIGRlc3Ryb3kKIAkJICogaWRsZSB0cmVhZAogCQkgKi8KLQkJaWRsZS0+dGhyZWFkLmVzcCA9ICh1bnNpZ25lZCBsb25nKSgoKHN0cnVjdCBwdF9yZWdzICopCi0JCQkoVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZykgaWRsZS0+dGhyZWFkX2luZm8pKSAtIDEpOworCQlpZGxlLT50aHJlYWQuZXNwID0gKHVuc2lnbmVkIGxvbmcpdGFza19wdF9yZWdzKGlkbGUpOwogCQlpbml0X2lkbGUoaWRsZSwgY3B1KTsKIAkJcmV0dXJuIGlkbGU7CiAJfQpAQCAtMTA5Niw2ICsxMDk1LDcgQEAKIAkJCWNhY2hlc2l6ZSA9IDE2OyAvKiBQZW50aXVtcywgMng4a0IgY2FjaGUgKi8KIAkJCWJhbmR3aWR0aCA9IDEwMDsKIAkJfQorCQltYXhfY2FjaGVfc2l6ZSA9IGNhY2hlc2l6ZSAqIDEwMjQ7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZtODYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jCmluZGV4IGNiZGIwYWYuLjBjOTBhZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jCkBAIC0zMTEsNyArMzExLDcgQEAKIAkJIm1vdmwgJTEsJSVlYnBcblx0IgogCQkiam1wIHJlc3VtZV91c2Vyc3BhY2UiCiAJCTogLyogbm8gb3V0cHV0cyAqLwotCQk6InIiICgmaW5mby0+cmVncyksICJyIiAodHNrLT50aHJlYWRfaW5mbykgOiAiYXgiKTsKKwkJOiJyIiAoJmluZm8tPnJlZ3MpLCAiciIgKHRhc2tfdGhyZWFkX2luZm8odHNrKSkgOiAiYXgiKTsKIAkvKiB3ZSBuZXZlciByZXR1cm4gaGVyZSAqLwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jIGIvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYwppbmRleCBhMzQ2ZTE4Li42MjZjZGM4IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCisrKyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKQEAgLTEwOCw3ICsxMDgsNiBAQAogc3RhdGljIHN0cnVjdCBjb25zb2xlICpjb25zb2xlOwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciAqdG1wX2J1ZjsKLXN0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogZXh0ZXJuIHN0cnVjdCBjb25zb2xlICpjb25zb2xlX2RyaXZlcnM7IC8qIGZyb20ga2VybmVsL3ByaW50ay5jICovCiAKQEAgLTE2NywxNSArMTY2LDkgQEAKIAkJCX0KIAkJfQogCQlzZWVuX2VzYyA9IDA7Ci0JCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkgYnJlYWs7CiAKLQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBjaDsKLQotCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IDA7Ci0KLQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7Ci0JCXR0eS0+ZmxpcC5jb3VudCsrOworCQlpZiAodHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgVFRZX05PUk1BTCkgPT0gMCkKKwkJCWJyZWFrOwogCX0KIAl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvZWxmY29yZTMyLmggYi9hcmNoL2lhNjQvaWEzMi9lbGZjb3JlMzIuaAppbmRleCBiNzNiOGI2Li5hNDdmNjNiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9lbGZjb3JlMzIuaAorKysgYi9hcmNoL2lhNjQvaWEzMi9lbGZjb3JlMzIuaApAQCAtOTUsOCArOTUsNyBAQAogc3RhdGljIGlubGluZSBpbnQgZWxmX2NvcmVfY29weV90YXNrX3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0LAogCQkJCQkgIGVsZl9ncmVnc2V0X3QqIGVsZnJlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnBwID0gaWE2NF90YXNrX3JlZ3ModCk7Ci0JRUxGX0NPUkVfQ09QWV9SRUdTKCgqZWxmcmVncyksIHBwKTsKKwlFTEZfQ09SRV9DT1BZX1JFR1MoKCplbGZyZWdzKSwgdGFza19wdF9yZWdzKHQpKTsKIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9zaWduYWwuYyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfc2lnbmFsLmMKaW5kZXggYWE4OTFjOS4uNTg1NjUxMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9zaWduYWwuYworKysgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX3NpZ25hbC5jCkBAIC0yNTUsNyArMjU1LDcgQEAKIAkgKi8KIAlmcF90b3MgPSAoZnNyPj4xMSkmMHg3OwogCWZyOF9zdF9tYXAgPSAoOC1mcF90b3MpJjB4NzsKLQlwdHAgPSBpYTY0X3Rhc2tfcmVncyh0c2spOworCXB0cCA9IHRhc2tfcHRfcmVncyh0c2spOwogCWZwcmVncCA9IChzdHJ1Y3QgX2ZwcmVnX2lhMzIgKikoKCh1bnNpZ25lZCBsb25nKWJ1ZiArIDE1KSAmIH4xNSk7CiAJaWE2NGYyaWEzMmYoZnByZWdwLCAmcHRwLT5mOCk7CiAJY29weV90b191c2VyKCZzYXZlLT5fc3RbKDArZnI4X3N0X21hcCkmMHg3XSwgZnByZWdwLCBzaXplb2Yoc3RydWN0IF9mcHJlZ19pYTMyKSk7CkBAIC0zODksNyArMzg5LDcgQEAKIAlmcjhfc3RfbWFwID0gKDgtZnBfdG9zKSYweDc7CiAJZnByZWdwID0gKHN0cnVjdCBfZnByZWdfaWEzMiAqKSgoKHVuc2lnbmVkIGxvbmcpYnVmICsgMTUpICYgfjE1KTsKIAotCXB0cCA9IGlhNjRfdGFza19yZWdzKHRzayk7CisJcHRwID0gdGFza19wdF9yZWdzKHRzayk7CiAJY29weV9mcm9tX3VzZXIoZnByZWdwLCAmc2F2ZS0+X3N0WygwK2ZyOF9zdF9tYXApJjB4N10sIHNpemVvZihzdHJ1Y3QgX2ZwcmVnX2lhMzIpKTsKIAlpYTMyZjJpYTY0ZigmcHRwLT5mOCwgZnByZWdwKTsKIAljb3B5X2Zyb21fdXNlcihmcHJlZ3AsICZzYXZlLT5fc3RbKDErZnI4X3N0X21hcCkmMHg3XSwgc2l6ZW9mKHN0cnVjdCBfZnByZWdfaWEzMikpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9zdXBwb3J0LmMgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX3N1cHBvcnQuYwppbmRleCA0ZjYzMDA0Li5jMTg3NzQzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9pYTMyX3N1cHBvcnQuYworKysgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX3N1cHBvcnQuYwpAQCAtNTgsNyArNTgsNyBAQAogdm9pZAogaWEzMl9sb2FkX3NlZ21lbnRfZGVzY3JpcHRvcnMgKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGlhNjRfdGFza19yZWdzKHRhc2spOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHRhc2spOwogCiAJLyogU2V0dXAgdGhlIHNlZ21lbnQgZGVzY3JpcHRvcnMgKi8KIAlyZWdzLT5yMjQgPSBsb2FkX2Rlc2MocmVncy0+cjE2ID4+IDE2KTsJCS8qIEVTRCAqLwpAQCAtMTEzLDcgKzExMyw3IEBACiBpYTMyX2xvYWRfc3RhdGUgKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKIHsKIAl1bnNpZ25lZCBsb25nIGVmbGFnLCBmc3IsIGZjciwgZmlyLCBmZHIsIHRzc2Q7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBpYTY0X3Rhc2tfcmVncyh0KTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyh0KTsKIAogCWVmbGFnID0gdC0+dGhyZWFkLmVmbGFnOwogCWZzciA9IHQtPnRocmVhZC5mc3I7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jIGIvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYwppbmRleCAwNjY4YjJiNy4uMzk0NWQzNyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYworKysgYi9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jCkBAIC0xNDgyLDcgKzE0ODIsNyBAQAogewogCXN0cnVjdCBwdF9yZWdzICpjaGlsZF9yZWdzOwogCi0JY2hpbGRfcmVncyA9IGlhNjRfdGFza19yZWdzKGNoaWxkKTsKKwljaGlsZF9yZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAlzd2l0Y2ggKHJlZ25vIC8gc2l6ZW9mKGludCkpIHsKIAkgICAgICBjYXNlIFBUX0VCWDogcmV0dXJuIGNoaWxkX3JlZ3MtPnIxMTsKIAkgICAgICBjYXNlIFBUX0VDWDogcmV0dXJuIGNoaWxkX3JlZ3MtPnI5OwpAQCAtMTUxMCw3ICsxNTEwLDcgQEAKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRfcmVnczsKIAotCWNoaWxkX3JlZ3MgPSBpYTY0X3Rhc2tfcmVncyhjaGlsZCk7CisJY2hpbGRfcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJc3dpdGNoIChyZWdubyAvIHNpemVvZihpbnQpKSB7CiAJICAgICAgY2FzZSBQVF9FQlg6IGNoaWxkX3JlZ3MtPnIxMSA9IHZhbHVlOyBicmVhazsKIAkgICAgICBjYXNlIFBUX0VDWDogY2hpbGRfcmVncy0+cjkgPSB2YWx1ZTsgYnJlYWs7CkBAIC0xNjI2LDcgKzE2MjYsNyBAQAogCSAqICBTdGFjayBmcmFtZXMgc3RhcnQgd2l0aCAxNi1ieXRlcyBvZiB0ZW1wIHNwYWNlCiAJICovCiAJc3dwID0gKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKikodHNrLT50aHJlYWQua3NwICsgMTYpOwotCXB0cCA9IGlhNjRfdGFza19yZWdzKHRzayk7CisJcHRwID0gdGFza19wdF9yZWdzKHRzayk7CiAJdG9zID0gKHRzay0+dGhyZWFkLmZzciA+PiAxMSkgJiA3OwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAJCXB1dF9mcHJlZyhpLCAmc2F2ZS0+c3Rfc3BhY2VbaV0sIHB0cCwgc3dwLCB0b3MpOwpAQCAtMTY1OSw3ICsxNjU5LDcgQEAKIAkgKiAgU3RhY2sgZnJhbWVzIHN0YXJ0IHdpdGggMTYtYnl0ZXMgb2YgdGVtcCBzcGFjZQogCSAqLwogCXN3cCA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopKHRzay0+dGhyZWFkLmtzcCArIDE2KTsKLQlwdHAgPSBpYTY0X3Rhc2tfcmVncyh0c2spOworCXB0cCA9IHRhc2tfcHRfcmVncyh0c2spOwogCXRvcyA9ICh0c2stPnRocmVhZC5mc3IgPj4gMTEpICYgNzsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQlnZXRfZnByZWcoaSwgJnNhdmUtPnN0X3NwYWNlW2ldLCBwdHAsIHN3cCwgdG9zKTsKQEAgLTE2OTAsNyArMTY5MCw3IEBACiAgICAgICAgICAqICBTdGFjayBmcmFtZXMgc3RhcnQgd2l0aCAxNi1ieXRlcyBvZiB0ZW1wIHNwYWNlCiAgICAgICAgICAqLwogICAgICAgICBzd3AgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKSh0c2stPnRocmVhZC5rc3AgKyAxNik7Ci0gICAgICAgIHB0cCA9IGlhNjRfdGFza19yZWdzKHRzayk7CisgICAgICAgIHB0cCA9IHRhc2tfcHRfcmVncyh0c2spOwogCXRvcyA9ICh0c2stPnRocmVhZC5mc3IgPj4gMTEpICYgNzsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJcHV0X2ZwcmVnKGksIChzdHJ1Y3QgX2ZwcmVnX2lhMzIgX191c2VyICopJnNhdmUtPnN0X3NwYWNlWzQqaV0sIHB0cCwgc3dwLCB0b3MpOwpAQCAtMTczNCw3ICsxNzM0LDcgQEAKIAkgKiAgU3RhY2sgZnJhbWVzIHN0YXJ0IHdpdGggMTYtYnl0ZXMgb2YgdGVtcCBzcGFjZQogCSAqLwogCXN3cCA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopKHRzay0+dGhyZWFkLmtzcCArIDE2KTsKLQlwdHAgPSBpYTY0X3Rhc2tfcmVncyh0c2spOworCXB0cCA9IHRhc2tfcHRfcmVncyh0c2spOwogCXRvcyA9ICh0c2stPnRocmVhZC5mc3IgPj4gMTEpICYgNzsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCWdldF9mcHJlZyhpLCAoc3RydWN0IF9mcHJlZ19pYTMyIF9fdXNlciAqKSZzYXZlLT5zdF9zcGFjZVs0KmldLCBwdHAsIHN3cCwgdG9zKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TIGIvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMKaW5kZXggMmRkYmFjNi4uY2U0MjM5MSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMKQEAgLTkwMyw1ICs5MDMsNiBAQAogCWRhdGE4IDAKIAlkYXRhOCAwCiAJZGF0YTggMAorCWRhdGE4IDAJCQkJCQkJLy8gMTI4MAogCiAJLm9yZyBmc3lzY2FsbF90YWJsZSArIDgqTlJfc3lzY2FsbHMJLy8gZ3VhcmQgYWdhaW5zdCBmYWlsdXJlcyB0byBpbmNyZWFzZSBOUl9zeXNjYWxscwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMgYi9hcmNoL2lhNjQva2VybmVsL2pwcm9iZXMuUwppbmRleCAyMzIzMzc3Li41Y2Q2MjI2ZiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMKQEAgLTYwLDMgKzYwLDMwIEBACiBHTE9CQUxfRU5UUlkoanByb2JlX2luc3RfcmV0dXJuKQogCWJyLmNhbGwuc3B0ay5tYW55IGIwPWpwcm9iZV9icmVhawogRU5EKGpwcm9iZV9pbnN0X3JldHVybikKKworR0xPQkFMX0VOVFJZKGludmFsaWRhdGVfc3RhY2tlZF9yZWdzKQorCW1vdmwgcjE2PWludmFsaWRhdGVfcmVzdG9yZV9jZm0KKwk7OworCW1vdiBiNj1yMTYKKwk7OworCWJyLnJldC5zcHRrLm1hbnkgYjYKKwk7OworaW52YWxpZGF0ZV9yZXN0b3JlX2NmbToKKwltb3YgcjE2PWFyLnJzYworCTs7CisJbW92IGFyLnJzYz1yMAorCTs7CisJbG9hZHJzCisJOzsKKwltb3YgYXIucnNjPXIxNgorCTs7CisJYnIuY29uZC5zcHRrLm1hbnkgcnAKK0VORChpbnZhbGlkYXRlX3N0YWNrZWRfcmVncykKKworR0xPQkFMX0VOVFJZKGZsdXNoX3JlZ2lzdGVyX3N0YWNrKQorCS8vIGZsdXNoIGRpcnR5IHJlZ3MgdG8gYmFja2luZyBzdG9yZSAobXVzdCBiZSBmaXJzdCBpbiBpbnNuIGdyb3VwKQorCWZsdXNocnMKKwk7OworCWJyLnJldC5zcHRrLm1hbnkgcnAKK0VORChmbHVzaF9yZWdpc3Rlcl9zdGFjaykKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwppbmRleCAzNDZmZWRmLi41MGFlOGM3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwpAQCAtNzY2LDExICs3NjYsNTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdHJ1Y3QgcGFyYW1fYnNwX2NmbSB7CisJdW5zaWduZWQgbG9uZyBpcDsKKwl1bnNpZ25lZCBsb25nICpic3A7CisJdW5zaWduZWQgbG9uZyBjZm07Cit9OworCitzdGF0aWMgdm9pZCBpYTY0X2dldF9ic3BfY2ZtKHN0cnVjdCB1bndfZnJhbWVfaW5mbyAqaW5mbywgdm9pZCAqYXJnKQoreworCXVuc2lnbmVkIGxvbmcgaXA7CisJc3RydWN0IHBhcmFtX2JzcF9jZm0gKmxwID0gYXJnOworCisJZG8geworCQl1bndfZ2V0X2lwKGluZm8sICZpcCk7CisJCWlmIChpcCA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChpcCA9PSBscC0+aXApIHsKKwkJCXVud19nZXRfYnNwKGluZm8sICh1bnNpZ25lZCBsb25nKikmbHAtPmJzcCk7CisJCQl1bndfZ2V0X2NmbShpbmZvLCAodW5zaWduZWQgbG9uZyopJmxwLT5jZm0pOworCQkJcmV0dXJuOworCQl9CisJfSB3aGlsZSAodW53X3Vud2luZChpbmZvKSA+PSAwKTsKKwlscC0+YnNwID0gMDsKKwlscC0+Y2ZtID0gMDsKKwlyZXR1cm47Cit9CisKIGludCBfX2twcm9iZXMgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBqcHJvYmUgKmpwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBqcHJvYmUsIGtwKTsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAoKHN0cnVjdCBmbnB0ciAqKShqcC0+ZW50cnkpKS0+aXA7CiAJc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYiA9IGdldF9rcHJvYmVfY3RsYmxrKCk7CisJc3RydWN0IHBhcmFtX2JzcF9jZm0gcGE7CisJaW50IGJ5dGVzOworCisJLyoKKwkgKiBDYWxsZWUgb3ducyB0aGUgYXJndW1lbnQgc3BhY2UgYW5kIGNvdWxkIG92ZXJ3cml0ZSBpdCwgZWcKKwkgKiB0YWlsIGNhbGwgb3B0aW1pemF0aW9uLiBTbyB0byBiZSBhYnNvbHV0ZWx5IHNhZmUKKwkgKiB3ZSBzYXZlIHRoZSBhcmd1bWVudCBzcGFjZSBiZWZvcmUgdHJhbnNmZXJpbmcgdGhlIGNvbnRyb2wKKwkgKiB0byBpbnN0cnVtZW50ZWQganByb2JlIGZ1bmN0aW9uIHdoaWNoIHJ1bnMgaW4KKwkgKiB0aGUgcHJvY2VzcyBjb250ZXh0CisJICovCisJcGEuaXAgPSByZWdzLT5jcl9paXA7CisJdW53X2luaXRfcnVubmluZyhpYTY0X2dldF9ic3BfY2ZtLCAmcGEpOworCWJ5dGVzID0gKGNoYXIgKilpYTY0X3JzZV9za2lwX3JlZ3MocGEuYnNwLCBwYS5jZm0gJiAweDNmKQorCQkJCS0gKGNoYXIgKilwYS5ic3A7CisJbWVtY3B5KCBrY2ItPmpwcm9iZXNfc2F2ZWRfc3RhY2tlZF9yZWdzLAorCQlwYS5ic3AsCisJCWJ5dGVzICk7CisJa2NiLT5ic3AgPSBwYS5ic3A7CisJa2NiLT5jZm0gPSBwYS5jZm07CiAKIAkvKiBzYXZlIGFyY2hpdGVjdHVyYWwgc3RhdGUgKi8KIAlrY2ItPmpwcm9iZV9zYXZlZF9yZWdzID0gKnJlZ3M7CkBAIC03OTIsOCArODM3LDIwIEBACiBpbnQgX19rcHJvYmVzIGxvbmdqbXBfYnJlYWtfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiID0gZ2V0X2twcm9iZV9jdGxibGsoKTsKKwlpbnQgYnl0ZXM7CiAKKwkvKiByZXN0b3JpbmcgYXJjaGl0ZWN0dXJhbCBzdGF0ZSAqLwogCSpyZWdzID0ga2NiLT5qcHJvYmVfc2F2ZWRfcmVnczsKKworCS8qIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgYXJndW1lbnQgc3BhY2UgKi8KKwlmbHVzaF9yZWdpc3Rlcl9zdGFjaygpOworCWJ5dGVzID0gKGNoYXIgKilpYTY0X3JzZV9za2lwX3JlZ3Moa2NiLT5ic3AsIGtjYi0+Y2ZtICYgMHgzZikKKwkJCQktIChjaGFyICopa2NiLT5ic3A7CisJbWVtY3B5KCBrY2ItPmJzcCwKKwkJa2NiLT5qcHJvYmVzX3NhdmVkX3N0YWNrZWRfcmVncywKKwkJYnl0ZXMgKTsKKwlpbnZhbGlkYXRlX3N0YWNrZWRfcmVncygpOworCiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKaW5kZXggMzU1YWYxNS4uZWU3ZWVjOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYworKysgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCkBAIC03NjYsNyArNzY2LDcgQEAKIAkJCWwgPSBzdHJsZW4ocHJldmlvdXNfY3VycmVudC0+Y29tbSk7CiAJCXNucHJpbnRmKGNvbW0sIHNpemVvZihjb21tKSwgIiVzICUqcyAlZCIsCiAJCQljdXJyZW50LT5jb21tLCBsLCBwcmV2aW91c19jdXJyZW50LT5jb21tLAotCQkJcHJldmlvdXNfY3VycmVudC0+dGhyZWFkX2luZm8tPmNwdSk7CisJCQl0YXNrX3RocmVhZF9pbmZvKHByZXZpb3VzX2N1cnJlbnQpLT5jcHUpOwogCX0KIAltZW1jcHkoY3VycmVudC0+Y29tbSwgY29tbSwgc2l6ZW9mKGN1cnJlbnQtPmNvbW0pKTsKIApAQCAtMTQyMyw3ICsxNDIzLDcgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSAoc3RydWN0IHRhc2tfc3RydWN0ICopKChjaGFyICopbWNhX2RhdGEgKyBvZmZzZXQpOwogCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGk7CiAJbWVtc2V0KHAsIDAsIEtFUk5FTF9TVEFDS19TSVpFKTsKLQl0aSA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikoKGNoYXIgKilwICsgSUE2NF9UQVNLX1NJWkUpOworCXRpID0gdGFza190aHJlYWRfaW5mbyhwKTsKIAl0aS0+ZmxhZ3MgPSBfVElGX01DQV9JTklUOwogCXRpLT5wcmVlbXB0X2NvdW50ID0gMTsKIAl0aS0+dGFzayA9IHA7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL21jYV9hc20uUyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2FzbS5TCmluZGV4IGRiMzJmYzEuLjQwM2E4MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2FzbS5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2FzbS5TCkBAIC04NDcsNyArODQ3LDcgQEAKIAk7OwogCW1vdiBjci5paW09dGVtcDMKIAltb3YgY3IuaWhhPXRlbXA0Ci0JZGVwIHIyMj0wLHIyMiw2MiwyCS8vIHBhbF9taW5fc3RhdGUsIHBoeXNpY2FsLCB1bmNhY2hlZAorCWRlcCByMjI9MCxyMjIsNjIsMQkvLyBwYWxfbWluX3N0YXRlLCBwaHlzaWNhbCwgdW5jYWNoZWQKIAltb3YgSUE2NF9LUihDVVJSRU5UKT1yMjEKIAlsZDggcjg9W3RlbXAxXQkJLy8gb3Nfc3RhdHVzCiAJbGQ4IHIxMD1bdGVtcDJdCQkvLyBjb250ZXh0CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCmluZGV4IGMwMjZhYzEuLmJkODdjYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCkBAIC0xNzEwLDcgKzE3MTAsNyBAQAogcGZtX3N5c3dpZGVfZm9yY2Vfc3RvcCh2b2lkICppbmZvKQogewogCXBmbV9jb250ZXh0X3QgICAqY3R4ID0gKHBmbV9jb250ZXh0X3QgKilpbmZvOwotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gaWE2NF90YXNrX3JlZ3MoY3VycmVudCk7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpvd25lcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CkBAIC0xODE1LDcgKzE4MTUsNyBAQAogCWlzX3N5c3RlbSA9IGN0eC0+Y3R4X2ZsX3N5c3RlbTsKIAogCXRhc2sgPSBQRk1fQ1RYX1RBU0soY3R4KTsKLQlyZWdzID0gaWE2NF90YXNrX3JlZ3ModGFzayk7CisJcmVncyA9IHRhc2tfcHRfcmVncyh0YXNrKTsKIAogCURQUklOVCgoImN0eF9zdGF0ZT0lZCBpc19jdXJyZW50PSVkXG4iLAogCQlzdGF0ZSwKQEAgLTE5NDUsNyArMTk0NSw3IEBACiAJaXNfc3lzdGVtID0gY3R4LT5jdHhfZmxfc3lzdGVtOwogCiAJdGFzayA9IFBGTV9DVFhfVEFTSyhjdHgpOwotCXJlZ3MgPSBpYTY0X3Rhc2tfcmVncyh0YXNrKTsKKwlyZWdzID0gdGFza19wdF9yZWdzKHRhc2spOwogCiAJRFBSSU5UKCgiY3R4X3N0YXRlPSVkIGlzX2N1cnJlbnQ9JWRcbiIsIAogCQlzdGF0ZSwKQEAgLTQwNTIsNyArNDA1Miw3IEBACiAJIAkgKi8KIAkJaWE2NF9wc3IocmVncyktPnVwID0gMDsKIAl9IGVsc2UgewotCQl0cmVncyA9IGlhNjRfdGFza19yZWdzKHRhc2spOworCQl0cmVncyA9IHRhc2tfcHRfcmVncyh0YXNrKTsKIAogCQkvKgogCSAJICogc3RvcCBtb25pdG9yaW5nIGF0IHRoZSB1c2VyIGxldmVsCkBAIC00MTM0LDcgKzQxMzQsNyBAQAogCQlpYTY0X3BzcihyZWdzKS0+dXAgPSAxOwogCiAJfSBlbHNlIHsKLQkJdHJlZ3MgPSBpYTY0X3Rhc2tfcmVncyhjdHgtPmN0eF90YXNrKTsKKwkJdHJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3R4LT5jdHhfdGFzayk7CiAKIAkJLyoKIAkJICogc3RhcnQgbW9uaXRvcmluZyBhdCB0aGUga2VybmVsIGxldmVsIHRoZSBuZXh0CkBAIC00NDA0LDcgKzQ0MDQsNyBAQAogCQkvKgogCQkgKiB3aGVuIG5vdCBjdXJyZW50LCB0YXNrIE1VU1QgYmUgc3RvcHBlZCwgc28gdGhpcyBpcyBzYWZlCiAJCSAqLwotCQlyZWdzID0gaWE2NF90YXNrX3JlZ3ModGFzayk7CisJCXJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CiAKIAkJLyogZm9yY2UgYSBmdWxsIHJlbG9hZCAqLwogCQljdHgtPmN0eF9sYXN0X2FjdGl2YXRpb24gPSBQRk1fSU5WQUxJRF9BQ1RJVkFUSU9OOwpAQCAtNDUzMCw3ICs0NTMwLDcgQEAKIAkvKgogCSAqIHBlci10YXNrIG1vZGUKIAkgKi8KLQl0cmVncyA9IHRhc2sgPT0gY3VycmVudCA/IHJlZ3MgOiBpYTY0X3Rhc2tfcmVncyh0YXNrKTsKKwl0cmVncyA9IHRhc2sgPT0gY3VycmVudCA/IHJlZ3MgOiB0YXNrX3B0X3JlZ3ModGFzayk7CiAKIAlpZiAodGFzayA9PSBjdXJyZW50KSB7CiAJCS8qCkBAIC00NTkzLDcgKzQ1OTMsNyBAQAogewogCXBmbV9jb250ZXh0X3QgKmN0eDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gaWE2NF90YXNrX3JlZ3ModGFzayk7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CiAJaW50IHJldCwgc3RhdGU7CiAJaW50IGZyZWVfb2sgPSAwOwogCkBAIC00OTI2LDcgKzQ5MjYsNyBAQAogCWlmICh1bmxpa2VseShyZXQpKSBnb3RvIGFib3J0X2xvY2tlZDsKIAogc2tpcF9mZDoKLQlyZXQgPSAoKmZ1bmMpKGN0eCwgYXJnc19rLCBjb3VudCwgaWE2NF90YXNrX3JlZ3MoY3VycmVudCkpOworCXJldCA9ICgqZnVuYykoY3R4LCBhcmdzX2ssIGNvdW50LCB0YXNrX3B0X3JlZ3MoY3VycmVudCkpOwogCiAJY2FsbF9tYWRlID0gMTsKIApAQCAtNTA1MCw3ICs1MDUwLDcgQEAKIAogCXBmbV9jbGVhcl90YXNrX25vdGlmeSgpOwogCi0JcmVncyA9IGlhNjRfdGFza19yZWdzKGN1cnJlbnQpOworCXJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAKIAkvKgogCSAqIGV4dHJhY3QgcmVhc29uIGZvciBiZWluZyBoZXJlIGFuZCBjbGVhcgpAQCAtNTc5NCw3ICs1Nzk0LDcgQEAKIAkgKiBvbiBldmVyeSBDUFUsIHNvIHdlIGNhbiByZWx5IG9uIHRoZSBwaWQgdG8gaWRlbnRpZnkgdGhlIGlkbGUgdGFzay4KIAkgKi8KIAlpZiAoKGluZm8gJiBQRk1fQ1BVSU5GT19FWENMX0lETEUpID09IDAgfHwgdGFzay0+cGlkKSB7Ci0JCXJlZ3MgPSBpYTY0X3Rhc2tfcmVncyh0YXNrKTsKKwkJcmVncyA9IHRhc2tfcHRfcmVncyh0YXNrKTsKIAkJaWE2NF9wc3IocmVncyktPnBwID0gaXNfY3R4c3dpbiA/IGRjcl9wcCA6IDA7CiAJCXJldHVybjsKIAl9CkBAIC01ODc3LDcgKzU4NzcsNyBAQAogCWZsYWdzID0gcGZtX3Byb3RlY3RfY3R4X2N0eHN3KGN0eCk7CiAKIAlpZiAoY3R4LT5jdHhfc3RhdGUgPT0gUEZNX0NUWF9aT01CSUUpIHsKLQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBpYTY0X3Rhc2tfcmVncyh0YXNrKTsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CiAKIAkJcGZtX2NsZWFyX3Bzcl91cCgpOwogCkBAIC02MDc3LDcgKzYwNzcsNyBAQAogCUJVR19PTihwc3IgJiBJQTY0X1BTUl9JKTsKIAogCWlmICh1bmxpa2VseShjdHgtPmN0eF9zdGF0ZSA9PSBQRk1fQ1RYX1pPTUJJRSkpIHsKLQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBpYTY0X3Rhc2tfcmVncyh0YXNrKTsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CiAKIAkJQlVHX09OKGN0eC0+Y3R4X3NtcGxfaGRyKTsKIApAQCAtNjQ0Niw3ICs2NDQ2LDcgQEAKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKIAotCXJlZ3MgPSBpYTY0X3Rhc2tfcmVncyhjdXJyZW50KTsKKwlyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCiAJRFBSSU5UKCgiY2FsbGVkXG4iKSk7CiAKQEAgLTY0NzIsNyArNjQ3Miw3IEBACiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CiAKLQlyZWdzID0gaWE2NF90YXNrX3JlZ3MoY3VycmVudCk7CisJcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKIAogCURQUklOVCgoImNhbGxlZFxuIikpOwogCkBAIC02NzU0LDcgKzY3NTQsNyBAQAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAogCXRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXJlZ3MgICAgID0gaWE2NF90YXNrX3JlZ3MoY3VycmVudCk7CisJcmVncyAgICAgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJaW5mbyAgICAgPSBQRk1fQ1BVSU5GT19HRVQoKTsKIAlkY3IgICAgICA9IGlhNjRfZ2V0cmVnKF9JQTY0X1JFR19DUl9EQ1IpOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGU5OTA0YzcuLjMwOWQ1OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zMjgsNyArMzI4LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0lBMzJfU1VQUE9SVAotCWlmIChJU19JQTMyX1BST0NFU1MoaWE2NF90YXNrX3JlZ3ModGFzaykpKQorCWlmIChJU19JQTMyX1BST0NFU1ModGFza19wdF9yZWdzKHRhc2spKSkKIAkJaWEzMl9zYXZlX3N0YXRlKHRhc2spOwogI2VuZGlmCiB9CkBAIC0zNTMsNyArMzUzLDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0lBMzJfU1VQUE9SVAotCWlmIChJU19JQTMyX1BST0NFU1MoaWE2NF90YXNrX3JlZ3ModGFzaykpKQorCWlmIChJU19JQTMyX1BST0NFU1ModGFza19wdF9yZWdzKHRhc2spKSkKIAkJaWEzMl9sb2FkX3N0YXRlKHRhc2spOwogI2VuZGlmCiB9CkBAIC00ODgsNyArNDg4LDcgQEAKIAkgKiBJZiB3ZSdyZSBjbG9uaW5nIGFuIElBMzIgdGFzayB0aGVuIHNhdmUgdGhlIElBMzIgZXh0cmEKIAkgKiBzdGF0ZSBmcm9tIHRoZSBjdXJyZW50IHRhc2sgdG8gdGhlIG5ldyB0YXNrCiAJICovCi0JaWYgKElTX0lBMzJfUFJPQ0VTUyhpYTY0X3Rhc2tfcmVncyhjdXJyZW50KSkpIHsKKwlpZiAoSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyhjdXJyZW50KSkpIHsKIAkJaWEzMl9zYXZlX3N0YXRlKHApOwogCQlpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TRVRUTFMpCiAJCQlyZXR2YWwgPSBpYTMyX2Nsb25lX3RscyhwLCBjaGlsZF9wdHJlZ3MpOwpAQCAtNzAxLDcgKzcwMSw3IEBACiBrZXJuZWxfdGhyZWFkX2hlbHBlciAoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKICNpZmRlZiBDT05GSUdfSUEzMl9TVVBQT1JUCi0JaWYgKElTX0lBMzJfUFJPQ0VTUyhpYTY0X3Rhc2tfcmVncyhjdXJyZW50KSkpIHsKKwlpZiAoSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyhjdXJyZW50KSkpIHsKIAkJLyogQSBrZXJuZWwgdGhyZWFkIGlzIGFsd2F5cyBhIDY0LWJpdCBwcm9jZXNzLiAqLwogCQljdXJyZW50LT50aHJlYWQubWFwX2Jhc2UgID0gREVGQVVMVF9NQVBfQkFTRTsKIAkJY3VycmVudC0+dGhyZWFkLnRhc2tfc2l6ZSA9IERFRkFVTFRfVEFTS19TSVpFOwpAQCAtNzIyLDcgKzcyMiw3IEBACiAJY3VycmVudC0+dGhyZWFkLmZsYWdzICY9IH4oSUE2NF9USFJFQURfRlBIX1ZBTElEIHwgSUE2NF9USFJFQURfREJHX1ZBTElEKTsKIAlpYTY0X2Ryb3BfZnB1KGN1cnJlbnQpOwogI2lmZGVmIENPTkZJR19JQTMyX1NVUFBPUlQKLQlpZiAoSVNfSUEzMl9QUk9DRVNTKGlhNjRfdGFza19yZWdzKGN1cnJlbnQpKSkgeworCWlmIChJU19JQTMyX1BST0NFU1ModGFza19wdF9yZWdzKGN1cnJlbnQpKSkgewogCQlpYTMyX2Ryb3BfcGFydGlhbF9wYWdlX2xpc3QoY3VycmVudCk7CiAJCWN1cnJlbnQtPnRocmVhZC50YXNrX3NpemUgPSBJQTMyX1BBR0VfT0ZGU0VUOwogCQlzZXRfZnMoVVNFUl9EUyk7CkBAIC03NTUsNyArNzU1LDcgQEAKIAlpZiAoY3VycmVudC0+dGhyZWFkLmZsYWdzICYgSUE2NF9USFJFQURfREJHX1ZBTElEKQogCQlwZm1fcmVsZWFzZV9kZWJ1Z19yZWdpc3RlcnMoY3VycmVudCk7CiAjZW5kaWYKLQlpZiAoSVNfSUEzMl9QUk9DRVNTKGlhNjRfdGFza19yZWdzKGN1cnJlbnQpKSkKKwlpZiAoSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyhjdXJyZW50KSkpCiAJCWlhMzJfZHJvcF9wYXJ0aWFsX3BhZ2VfbGlzdChjdXJyZW50KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvaWE2NC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggOGQ4OGVlZS4uZWFlZDE0YSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3B0cmFjZS5jCkBAIC0yNTQsNyArMjU0LDcgQEAKIAlsb25nIG51bV9yZWdzLCBuYml0czsKIAlzdHJ1Y3QgcHRfcmVncyAqcHQ7CiAKLQlwdCA9IGlhNjRfdGFza19yZWdzKHRhc2spOworCXB0ID0gdGFza19wdF9yZWdzKHRhc2spOwogCWtic3AgPSAodW5zaWduZWQgbG9uZyAqKSBzdy0+YXJfYnNwc3RvcmU7CiAJdWJzcHN0b3JlID0gKHVuc2lnbmVkIGxvbmcgKikgcHQtPmFyX2JzcHN0b3JlOwogCkBAIC0zMTQsNyArMzE0LDcgQEAKIAlzdHJ1Y3QgcHRfcmVncyAqcHQ7CiAJdW5zaWduZWQgbG9uZyBjZm0sICp1cmJzX2thcmdzOwogCi0JcHQgPSBpYTY0X3Rhc2tfcmVncyh0YXNrKTsKKwlwdCA9IHRhc2tfcHRfcmVncyh0YXNrKTsKIAlrYnNwID0gKHVuc2lnbmVkIGxvbmcgKikgc3ctPmFyX2JzcHN0b3JlOwogCXVic3BzdG9yZSA9ICh1bnNpZ25lZCBsb25nICopIHB0LT5hcl9ic3BzdG9yZTsKIApAQCAtNDA3LDcgKzQwNyw3IEBACiAKIAl1cmJzX2VuZCA9IChsb25nICopIHVzZXJfcmJzX2VuZDsKIAlsYWRkciA9ICh1bnNpZ25lZCBsb25nICopIGFkZHI7Ci0JY2hpbGRfcmVncyA9IGlhNjRfdGFza19yZWdzKGNoaWxkKTsKKwljaGlsZF9yZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAlic3BzdG9yZSA9ICh1bnNpZ25lZCBsb25nICopIGNoaWxkX3JlZ3MtPmFyX2JzcHN0b3JlOwogCWtyYnMgPSAodW5zaWduZWQgbG9uZyAqKSBjaGlsZCArIElBNjRfUkJTX09GRlNFVC84OwogCWlmIChvbl9rZXJuZWxfcmJzKGFkZHIsICh1bnNpZ25lZCBsb25nKSBic3BzdG9yZSwKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogCXN0cnVjdCBwdF9yZWdzICpjaGlsZF9yZWdzOwogCiAJbGFkZHIgPSAodW5zaWduZWQgbG9uZyAqKSBhZGRyOwotCWNoaWxkX3JlZ3MgPSBpYTY0X3Rhc2tfcmVncyhjaGlsZCk7CisJY2hpbGRfcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJYnNwc3RvcmUgPSAodW5zaWduZWQgbG9uZyAqKSBjaGlsZF9yZWdzLT5hcl9ic3BzdG9yZTsKIAlrcmJzID0gKHVuc2lnbmVkIGxvbmcgKikgY2hpbGQgKyBJQTY0X1JCU19PRkZTRVQvODsKIAlpZiAob25fa2VybmVsX3JicyhhZGRyLCAodW5zaWduZWQgbG9uZykgYnNwc3RvcmUsCkBAIC01NjcsNyArNTY3LDcgQEAKIAkJICovCiAJCXJldHVybiAwOwogCi0JdGhyZWFkX3JlZ3MgPSBpYTY0X3Rhc2tfcmVncyh0aHJlYWQpOworCXRocmVhZF9yZWdzID0gdGFza19wdF9yZWdzKHRocmVhZCk7CiAJdGhyZWFkX3Jic19lbmQgPSBpYTY0X2dldF91c2VyX3Jic19lbmQodGhyZWFkLCB0aHJlYWRfcmVncywgTlVMTCk7CiAJaWYgKCFvbl9rZXJuZWxfcmJzKGFkZHIsIHRocmVhZF9yZWdzLT5hcl9ic3BzdG9yZSwgdGhyZWFkX3Jic19lbmQpKQogCQlyZXR1cm4gMDsKQEAgLTYyNyw3ICs2MjcsNyBAQAogaW5saW5lIHZvaWQKIGlhNjRfZmx1c2hfZnBoIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0Jc3RydWN0IGlhNjRfcHNyICpwc3IgPSBpYTY0X3BzcihpYTY0X3Rhc2tfcmVncyh0YXNrKSk7CisJc3RydWN0IGlhNjRfcHNyICpwc3IgPSBpYTY0X3Bzcih0YXNrX3B0X3JlZ3ModGFzaykpOwogCiAJLyoKIAkgKiBQcmV2ZW50IG1pZ3JhdGluZyB0aGlzIHRhc2sgd2hpbGUKQEAgLTY1Myw3ICs2NTMsNyBAQAogdm9pZAogaWE2NF9zeW5jX2ZwaCAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXN0cnVjdCBpYTY0X3BzciAqcHNyID0gaWE2NF9wc3IoaWE2NF90YXNrX3JlZ3ModGFzaykpOworCXN0cnVjdCBpYTY0X3BzciAqcHNyID0gaWE2NF9wc3IodGFza19wdF9yZWdzKHRhc2spKTsKIAogCWlhNjRfZmx1c2hfZnBoKHRhc2spOwogCWlmICghKHRhc2stPnRocmVhZC5mbGFncyAmIElBNjRfVEhSRUFEX0ZQSF9WQUxJRCkpIHsKQEAgLTc5NCw3ICs3OTQsNyBAQAogCQkJCQkgICsgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZykpKQogCiAKLQlwdCA9IGlhNjRfdGFza19yZWdzKGNoaWxkKTsKKwlwdCA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJc3cgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKSAoY2hpbGQtPnRocmVhZC5rc3AgKyAxNik7CiAKIAlpZiAoKGFkZHIgJiAweDcpICE9IDApIHsKQEAgLTExMjAsNyArMTEyMCw3IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBwcHIsIHNpemVvZihzdHJ1Y3QgcHRfYWxsX3VzZXJfcmVncykpKQogCQlyZXR1cm4gLUVJTzsKIAotCXB0ID0gaWE2NF90YXNrX3JlZ3MoY2hpbGQpOworCXB0ID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAlzdyA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopIChjaGlsZC0+dGhyZWFkLmtzcCArIDE2KTsKIAl1bndfaW5pdF9mcm9tX2Jsb2NrZWRfdGFzaygmaW5mbywgY2hpbGQpOwogCWlmICh1bndfdW53aW5kX3RvX3VzZXIoJmluZm8pIDwgMCkgewpAQCAtMTI2NSw3ICsxMjY1LDcgQEAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgcHByLCBzaXplb2Yoc3RydWN0IHB0X2FsbF91c2VyX3JlZ3MpKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlwdCA9IGlhNjRfdGFza19yZWdzKGNoaWxkKTsKKwlwdCA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJc3cgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKSAoY2hpbGQtPnRocmVhZC5rc3AgKyAxNik7CiAJdW53X2luaXRfZnJvbV9ibG9ja2VkX3Rhc2soJmluZm8sIGNoaWxkKTsKIAlpZiAodW53X3Vud2luZF90b191c2VyKCZpbmZvKSA8IDApIHsKQEAgLTE0MDMsNyArMTQwMyw3IEBACiB2b2lkCiBwdHJhY2VfZGlzYWJsZSAoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKIHsKLQlzdHJ1Y3QgaWE2NF9wc3IgKmNoaWxkX3BzciA9IGlhNjRfcHNyKGlhNjRfdGFza19yZWdzKGNoaWxkKSk7CisJc3RydWN0IGlhNjRfcHNyICpjaGlsZF9wc3IgPSBpYTY0X3Bzcih0YXNrX3B0X3JlZ3MoY2hpbGQpKTsKIAogCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAvdGFrZW4tYnJhbmNoIHRyYXAgYml0cyBhcmUgbm90IHNldDogKi8KIAljaGlsZF9wc3ItPnNzID0gMDsKQEAgLTE0NTYsNyArMTQ1Niw3IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X3RzazsKIAotCXB0ID0gaWE2NF90YXNrX3JlZ3MoY2hpbGQpOworCXB0ID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAlzdyA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopIChjaGlsZC0+dGhyZWFkLmtzcCArIDE2KTsKIAogCXN3aXRjaCAocmVxdWVzdCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zYWxpbmZvLmMgYi9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYwppbmRleCBhODdhMTYyLi45ZDVhODIzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDcmVhdGVzIGVudHJpZXMgaW4gL3Byb2Mvc2FsIGZvciB2YXJpb3VzIHN5c3RlbSBmZWF0dXJlcy4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBDbwogICoJQmpvcm4gSGVsZ2FhcyA8Ympvcm4uaGVsZ2Fhc0BocC5jb20+CiAgKgpAQCAtMjcsOSArMjcsMTcgQEAKICAqICAgbWNhLmMgbWF5IG5vdCBwYXNzIGEgYnVmZmVyLCBhIE5VTEwgYnVmZmVyIGp1c3QgaW5kaWNhdGVzIHRoYXQgYSBuZXcKICAqICAgcmVjb3JkIGlzIGF2YWlsYWJsZSBpbiBTQUwuCiAgKiAgIFJlcGxhY2Ugc29tZSBOUl9DUFVTIGJ5IGNwdXNfb25saW5lLCBmb3IgaG90cGx1ZyBjcHUuCisgKgorICogSmFuICA1IDIwMDYgICAgICAgIGthb3NAc2dpLmNvbQorICogICBIYW5kbGUgaG90cGx1ZyBjcHVzIGNvbWluZyBvbmxpbmUuCisgKiAgIEhhbmRsZSBob3RwbHVnIGNwdXMgZ29pbmcgb2ZmbGluZSB3aGlsZSB0aGV5IHN0aWxsIGhhdmUgb3V0c3RhbmRpbmcgcmVjb3Jkcy4KKyAqICAgVXNlIHRoZSBjcHVfKiBtYWNyb3MgY29uc2lzdGVudGx5LgorICogICBSZXBsYWNlIHRoZSBjb3VudGluZyBzZW1hcGhvcmUgd2l0aCBhIG11dGV4IGFuZCBhIHRlc3QgaWYgdGhlIGNwdW1hc2sgaXMgbm9uLWVtcHR5LgorICogICBNb2RpZnkgdGhlIGxvY2tpbmcgdG8gbWFrZSB0aGUgdGVzdCBmb3IgIndvcmsgdG8gZG8iIGFuIGF0b21pYyBvcGVyYXRpb24uCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTEzMiw4ICsxNDAsOCBAQAogfTsKIAogc3RydWN0IHNhbGluZm9fZGF0YSB7Ci0Jdm9sYXRpbGUgY3B1bWFza190CWNwdV9ldmVudDsJLyogd2hpY2ggY3B1cyBoYXZlIG91dHN0YW5kaW5nIGV2ZW50cyAqLwotCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwkJLyogY291bnQgb2YgY3B1cyB3aXRoIG91dHN0YW5kaW5nIGV2ZW50cyAoYml0cyBzZXQgaW4gY3B1X2V2ZW50KSAqLworCWNwdW1hc2tfdAkJY3B1X2V2ZW50OwkvKiB3aGljaCBjcHVzIGhhdmUgb3V0c3RhbmRpbmcgZXZlbnRzICovCisJc3RydWN0IHNlbWFwaG9yZQltdXRleDsKIAl1OAkJCSpsb2dfYnVmZmVyOwogCXU2NAkJCWxvZ19zaXplOwogCXU4CQkJKm9lbWRhdGE7CS8qIGRlY29kZWQgb2VtIGRhdGEgKi8KQEAgLTE3NCw2ICsxODIsMjEgQEAKIAlpbnQgcmV0OwogfTsKIAorLyogS2ljayB0aGUgbXV0ZXggdGhhdCB0ZWxscyB1c2VyIHNwYWNlIHRoYXQgdGhlcmUgaXMgd29yayB0byBkby4gIEluc3RlYWQgb2YKKyAqIHRyeWluZyB0byB0cmFjayB0aGUgc3RhdGUgb2YgdGhlIG11dGV4IGFjcm9zcyBtdWx0aXBsZSBjcHVzLCBpbiB1c2VyCisgKiBjb250ZXh0LCBpbnRlcnJ1cHQgY29udGV4dCwgbm9uLW1hc2thYmxlIGludGVycnVwdCBjb250ZXh0IGFuZCBob3RwbHVnIGNwdSwKKyAqIGl0IGlzIGZhciBlYXNpZXIganVzdCB0byBncmFiIHRoZSBtdXRleCBpZiBpdCBpcyBmcmVlIHRoZW4gcmVsZWFzZSBpdC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgd2l0aCBkYXRhX3NhdmVkX2xvY2sgaGVsZCwgdG8gbWFrZSB0aGUgZG93bi91cAorICogb3BlcmF0aW9uIGF0b21pYy4KKyAqLworc3RhdGljIHZvaWQKK3NhbGluZm9fd29ya190b19kbyhzdHJ1Y3Qgc2FsaW5mb19kYXRhICpkYXRhKQoreworCWRvd25fdHJ5bG9jaygmZGF0YS0+bXV0ZXgpOworCXVwKCZkYXRhLT5tdXRleCk7Cit9CisKIHN0YXRpYyB2b2lkCiBzYWxpbmZvX3BsYXRmb3JtX29lbWRhdGFfY3B1KHZvaWQgKmNvbnRleHQpCiB7CkBAIC0yMTIsOSArMjM1LDkgQEAKIAogCUJVR19PTih0eXBlID49IEFSUkFZX1NJWkUoc2FsaW5mb19sb2dfbmFtZSkpOwogCisJaWYgKGlycXNhZmUpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKIAlpZiAoYnVmZmVyKSB7Ci0JCWlmIChpcnFzYWZlKQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOwogCQlmb3IgKGkgPSAwLCBkYXRhX3NhdmVkID0gZGF0YS0+ZGF0YV9zYXZlZDsgaSA8IHNhdmVkX3NpemU7ICsraSwgKytkYXRhX3NhdmVkKSB7CiAJCQlpZiAoIWRhdGFfc2F2ZWQtPmJ1ZmZlcikKIAkJCQlicmVhazsKQEAgLTIzMiwxMyArMjU1LDExIEBACiAJCQlkYXRhX3NhdmVkLT5zaXplID0gc2l6ZTsKIAkJCWRhdGFfc2F2ZWQtPmJ1ZmZlciA9IGJ1ZmZlcjsKIAkJfQotCQlpZiAoaXJxc2FmZSkKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOwogCX0KLQotCWlmICghdGVzdF9hbmRfc2V0X2JpdChzbXBfcHJvY2Vzc29yX2lkKCksICZkYXRhLT5jcHVfZXZlbnQpKSB7Ci0JCWlmIChpcnFzYWZlKQotCQkJdXAoJmRhdGEtPnNlbSk7CisJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGRhdGEtPmNwdV9ldmVudCk7CisJaWYgKGlycXNhZmUpIHsKKwkJc2FsaW5mb193b3JrX3RvX2RvKGRhdGEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKIAl9CiB9CiAKQEAgLTI0OSwyMCArMjcwLDE3IEBACiBzdGF0aWMgdm9pZAogc2FsaW5mb190aW1lb3V0X2NoZWNrKHN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGEpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpZiAoIWRhdGEtPm9wZW4pCiAJCXJldHVybjsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJaWYgKHRlc3RfYml0KGksICZkYXRhLT5jcHVfZXZlbnQpKSB7Ci0JCQkvKiBkb3VibGUgdXAoKSBpcyBub3QgYSBwcm9ibGVtLCB1c2VyIHNwYWNlIHdpbGwgc2VlIG5vCi0JCQkgKiByZWNvcmRzIGZvciB0aGUgYWRkaXRpb25hbCAiZXZlbnRzIi4KLQkJCSAqLwotCQkJdXAoJmRhdGEtPnNlbSk7Ci0JCX0KKwlpZiAoIWNwdXNfZW1wdHkoZGF0YS0+Y3B1X2V2ZW50KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CisJCXNhbGluZm9fd29ya190b19kbyhkYXRhKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCAKK3N0YXRpYyB2b2lkCiBzYWxpbmZvX3RpbWVvdXQgKHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXNhbGluZm9fdGltZW91dF9jaGVjayhzYWxpbmZvX2RhdGEgKyBTQUxfSU5GT19UWVBFX01DQSk7CkBAIC0yOTAsMTYgKzMwOCwyMCBAQAogCWludCBpLCBuLCBjcHUgPSAtMTsKIAogcmV0cnk6Ci0JaWYgKGRvd25fdHJ5bG9jaygmZGF0YS0+c2VtKSkgeworCWlmIChjcHVzX2VtcHR5KGRhdGEtPmNwdV9ldmVudCkgJiYgZG93bl90cnlsb2NrKCZkYXRhLT5tdXRleCkpIHsKIAkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQogCQkJcmV0dXJuIC1FQUdBSU47Ci0JCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRhdGEtPnNlbSkpCisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRhdGEtPm11dGV4KSkKIAkJCXJldHVybiAtRUlOVFI7CiAJfQogCiAJbiA9IGRhdGEtPmNwdV9jaGVjazsKIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmICh0ZXN0X2JpdChuLCAmZGF0YS0+Y3B1X2V2ZW50KSAmJiBjcHVfb25saW5lKG4pKSB7CisJCWlmIChjcHVfaXNzZXQobiwgZGF0YS0+Y3B1X2V2ZW50KSkgeworCQkJaWYgKCFjcHVfb25saW5lKG4pKSB7CisJCQkJY3B1X2NsZWFyKG4sIGRhdGEtPmNwdV9ldmVudCk7CisJCQkJY29udGludWU7CisJCQl9CiAJCQljcHUgPSBuOwogCQkJYnJlYWs7CiAJCX0KQEAgLTMxMCw5ICszMzIsNiBAQAogCWlmIChjcHUgPT0gLTEpCiAJCWdvdG8gcmV0cnk7CiAKLQkvKiBldmVudHMgYXJlIHN0aWNreSB1bnRpbCB0aGUgdXNlciBzYXlzICJjbGVhciIgKi8KLQl1cCgmZGF0YS0+c2VtKTsKLQogCS8qIGZvciBuZXh0IHJlYWQsIHN0YXJ0IGNoZWNraW5nIGF0IG5leHQgQ1BVICovCiAJZGF0YS0+Y3B1X2NoZWNrID0gY3B1OwogCWlmICgrK2RhdGEtPmNwdV9jaGVjayA9PSBOUl9DUFVTKQpAQCAtMzgxLDEwICs0MDAsOCBAQAogc3RhdGljIHZvaWQKIGNhbGxfb25fY3B1KGludCBjcHUsIHZvaWQgKCpmbikodm9pZCAqKSwgdm9pZCAqYXJnKQogewotCWNwdW1hc2tfdCBzYXZlX2NwdXNfYWxsb3dlZCwgbmV3X2NwdXNfYWxsb3dlZDsKLQltZW1jcHkoJnNhdmVfY3B1c19hbGxvd2VkLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkLCBzaXplb2Yoc2F2ZV9jcHVzX2FsbG93ZWQpKTsKLQltZW1zZXQoJm5ld19jcHVzX2FsbG93ZWQsIDAsIHNpemVvZihuZXdfY3B1c19hbGxvd2VkKSk7Ci0Jc2V0X2JpdChjcHUsICZuZXdfY3B1c19hbGxvd2VkKTsKKwljcHVtYXNrX3Qgc2F2ZV9jcHVzX2FsbG93ZWQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJY3B1bWFza190IG5ld19jcHVzX2FsbG93ZWQgPSBjcHVtYXNrX29mX2NwdShjcHUpOwogCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgbmV3X2NwdXNfYWxsb3dlZCk7CiAJKCpmbikoYXJnKTsKIAlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVfY3B1c19hbGxvd2VkKTsKQEAgLTQzMywxMCArNDUwLDEwIEBACiAJaWYgKCFkYXRhLT5zYXZlZF9udW0pCiAJCWNhbGxfb25fY3B1KGNwdSwgc2FsaW5mb19sb2dfcmVhZF9jcHUsIGRhdGEpOwogCWlmICghZGF0YS0+bG9nX3NpemUpIHsKLQkgICAgICAgIGRhdGEtPnN0YXRlID0gU1RBVEVfTk9fREFUQTsKLQkgICAgICAgIGNsZWFyX2JpdChjcHUsICZkYXRhLT5jcHVfZXZlbnQpOworCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX05PX0RBVEE7CisJCWNwdV9jbGVhcihjcHUsIGRhdGEtPmNwdV9ldmVudCk7CiAJfSBlbHNlIHsKLQkgICAgICAgIGRhdGEtPnN0YXRlID0gU1RBVEVfTE9HX1JFQ09SRDsKKwkJZGF0YS0+c3RhdGUgPSBTVEFURV9MT0dfUkVDT1JEOwogCX0KIH0KIApAQCAtNDczLDI3ICs0OTAsMzEgQEAKIHNhbGluZm9fbG9nX2NsZWFyKHN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGEsIGludCBjcHUpCiB7CiAJc2FsX2xvZ19yZWNvcmRfaGVhZGVyX3QgKnJoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOwogCWRhdGEtPnN0YXRlID0gU1RBVEVfTk9fREFUQTsKLQlpZiAoIXRlc3RfYml0KGNwdSwgJmRhdGEtPmNwdV9ldmVudCkpCi0JCXJldHVybiAwOwotCWRvd24oJmRhdGEtPnNlbSk7Ci0JY2xlYXJfYml0KGNwdSwgJmRhdGEtPmNwdV9ldmVudCk7Ci0JaWYgKGRhdGEtPnNhdmVkX251bSkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7Ci0JCXNoaWZ0MV9kYXRhX3NhdmVkKGRhdGEsIGRhdGEtPnNhdmVkX251bSAtIDEgKTsKLQkJZGF0YS0+c2F2ZWRfbnVtID0gMDsKKwlpZiAoIWNwdV9pc3NldChjcHUsIGRhdGEtPmNwdV9ldmVudCkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOwogCX0KKwljcHVfY2xlYXIoY3B1LCBkYXRhLT5jcHVfZXZlbnQpOworCWlmIChkYXRhLT5zYXZlZF9udW0pIHsKKwkJc2hpZnQxX2RhdGFfc2F2ZWQoZGF0YSwgZGF0YS0+c2F2ZWRfbnVtIC0gMSk7CisJCWRhdGEtPnNhdmVkX251bSA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOwogCXJoID0gKHNhbF9sb2dfcmVjb3JkX2hlYWRlcl90ICopKGRhdGEtPmxvZ19idWZmZXIpOwogCS8qIENvcnJlY3RlZCBlcnJvcnMgaGF2ZSBhbHJlYWR5IGJlZW4gY2xlYXJlZCBmcm9tIFNBTCAqLwogCWlmIChyaC0+c2V2ZXJpdHkgIT0gc2FsX2xvZ19zZXZlcml0eV9jb3JyZWN0ZWQpCiAJCWNhbGxfb25fY3B1KGNwdSwgc2FsaW5mb19sb2dfY2xlYXJfY3B1LCBkYXRhKTsKIAkvKiBjbGVhcmluZyBhIHJlY29yZCBtYXkgbWFrZSBhIG5ldyByZWNvcmQgdmlzaWJsZSAqLwogCXNhbGluZm9fbG9nX25ld19yZWFkKGNwdSwgZGF0YSk7Ci0JaWYgKGRhdGEtPnN0YXRlID09IFNUQVRFX0xPR19SRUNPUkQgJiYKLQkgICAgIXRlc3RfYW5kX3NldF9iaXQoY3B1LCAgJmRhdGEtPmNwdV9ldmVudCkpCi0JCXVwKCZkYXRhLT5zZW0pOworCWlmIChkYXRhLT5zdGF0ZSA9PSBTVEFURV9MT0dfUkVDT1JEKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJY3B1X3NldChjcHUsIGRhdGEtPmNwdV9ldmVudCk7CisJCXNhbGluZm9fd29ya190b19kbyhkYXRhKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC01NTAsNiArNTcxLDUzIEBACiAJLndyaXRlICAgPSBzYWxpbmZvX2xvZ193cml0ZSwKIH07CiAKKyNpZmRlZglDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzYWxpbmZvX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGE7CisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9PTkxJTkU6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJZm9yIChpID0gMCwgZGF0YSA9IHNhbGluZm9fZGF0YTsKKwkJICAgICBpIDwgQVJSQVlfU0laRShzYWxpbmZvX2RhdGEpOworCQkgICAgICsraSwgKytkYXRhKSB7CisJCQljcHVfc2V0KGNwdSwgZGF0YS0+Y3B1X2V2ZW50KTsKKwkJCXNhbGluZm9fd29ya190b19kbyhkYXRhKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfREVBRDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOworCQlmb3IgKGkgPSAwLCBkYXRhID0gc2FsaW5mb19kYXRhOworCQkgICAgIGkgPCBBUlJBWV9TSVpFKHNhbGluZm9fZGF0YSk7CisJCSAgICAgKytpLCArK2RhdGEpIHsKKwkJCXN0cnVjdCBzYWxpbmZvX2RhdGFfc2F2ZWQgKmRhdGFfc2F2ZWQ7CisJCQlpbnQgajsKKwkJCWZvciAoaiA9IEFSUkFZX1NJWkUoZGF0YS0+ZGF0YV9zYXZlZCkgLSAxLCBkYXRhX3NhdmVkID0gZGF0YS0+ZGF0YV9zYXZlZCArIGo7CisJCQkgICAgIGogPj0gMDsKKwkJCSAgICAgLS1qLCAtLWRhdGFfc2F2ZWQpIHsKKwkJCQlpZiAoZGF0YV9zYXZlZC0+YnVmZmVyICYmIGRhdGFfc2F2ZWQtPmNwdSA9PSBjcHUpIHsKKwkJCQkJc2hpZnQxX2RhdGFfc2F2ZWQoZGF0YSwgaik7CisJCQkJfQorCQkJfQorCQkJY3B1X2NsZWFyKGNwdSwgZGF0YS0+Y3B1X2V2ZW50KTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2FsaW5mb19jcHVfbm90aWZpZXIgPQoreworCS5ub3RpZmllcl9jYWxsID0gc2FsaW5mb19jcHVfY2FsbGJhY2ssCisJLnByaW9yaXR5ID0gMCwKK307CisjZW5kaWYJLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisKIHN0YXRpYyBpbnQgX19pbml0CiBzYWxpbmZvX2luaXQodm9pZCkKIHsKQEAgLTU1Nyw3ICs2MjUsNyBAQAogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKnNkaXIgPSBzYWxpbmZvX3Byb2NfZW50cmllczsgLyoga2VlcHMgdHJhY2sgb2YgZXZlcnkgZW50cnkgKi8KIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpciwgKmVudHJ5OwogCXN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGE7Ci0JaW50IGksIGosIG9ubGluZTsKKwlpbnQgaSwgajsKIAogCXNhbGluZm9fZGlyID0gcHJvY19ta2Rpcigic2FsIiwgTlVMTCk7CiAJaWYgKCFzYWxpbmZvX2RpcikKQEAgLTU3Miw3ICs2NDAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNhbGluZm9fbG9nX25hbWUpOyBpKyspIHsKIAkJZGF0YSA9IHNhbGluZm9fZGF0YSArIGk7CiAJCWRhdGEtPnR5cGUgPSBpOwotCQlzZW1hX2luaXQoJmRhdGEtPnNlbSwgMCk7CisJCWluaXRfTVVURVgoJmRhdGEtPm11dGV4KTsKIAkJZGlyID0gcHJvY19ta2RpcihzYWxpbmZvX2xvZ19uYW1lW2ldLCBzYWxpbmZvX2Rpcik7CiAJCWlmICghZGlyKQogCQkJY29udGludWU7CkBAIC01OTIsMTIgKzY2MCw4IEBACiAJCSpzZGlyKysgPSBlbnRyeTsKIAogCQkvKiB3ZSBtaXNzZWQgYW55IGV2ZW50cyBiZWZvcmUgbm93ICovCi0JCW9ubGluZSA9IDA7Ci0JCWZvcl9lYWNoX29ubGluZV9jcHUoaikgewotCQkJc2V0X2JpdChqLCAmZGF0YS0+Y3B1X2V2ZW50KTsKLQkJCSsrb25saW5lOwotCQl9Ci0JCXNlbWFfaW5pdCgmZGF0YS0+c2VtLCBvbmxpbmUpOworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCisJCQljcHVfc2V0KGosIGRhdGEtPmNwdV9ldmVudCk7CiAKIAkJKnNkaXIrKyA9IGRpcjsKIAl9CkBAIC02MDksNiArNjczLDEwIEBACiAJc2FsaW5mb190aW1lci5mdW5jdGlvbiA9ICZzYWxpbmZvX3RpbWVvdXQ7CiAJYWRkX3RpbWVyKCZzYWxpbmZvX3RpbWVyKTsKIAorI2lmZGVmCUNPTkZJR19IT1RQTFVHX0NQVQorCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc2FsaW5mb19jcHVfbm90aWZpZXIpOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGMzMzMwNWQuLmMwNzY2NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKQEAgLTYwLDYgKzYwLDcgQEAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIChJQTY0X0NQVV9TSVpFID4gUEFHRV9TSVpFKQogIyBlcnJvciAic3RydWN0IGNwdWluZm9faWE2NCB0b28gYmlnISIKQEAgLTY5NSw2ICs2OTYsNyBAQAogZ2V0X21heF9jYWNoZWxpbmVfc2l6ZSAodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGxpbmVfc2l6ZSwgbWF4ID0gMTsKKwl1bnNpZ25lZCBpbnQgY2FjaGVfc2l6ZSA9IDA7CiAJdTY0IGwsIGxldmVscywgdW5pcXVlX2NhY2hlczsKICAgICAgICAgcGFsX2NhY2hlX2NvbmZpZ19pbmZvX3QgY2NpOwogICAgICAgICBzNjQgc3RhdHVzOwpAQCAtNzI0LDYgKzcyNiw4IEBACiAJCWxpbmVfc2l6ZSA9IDEgPDwgY2NpLnBjY2lfbGluZV9zaXplOwogCQlpZiAobGluZV9zaXplID4gbWF4KQogCQkJbWF4ID0gbGluZV9zaXplOworCQlpZiAoY2FjaGVfc2l6ZSA8IGNjaS5wY2NpX2NhY2hlX3NpemUpCisJCQljYWNoZV9zaXplID0gY2NpLnBjY2lfY2FjaGVfc2l6ZTsKIAkJaWYgKCFjY2kucGNjaV91bmlmaWVkKSB7CiAJCQlzdGF0dXMgPSBpYTY0X3BhbF9jYWNoZV9jb25maWdfaW5mbyhsLAogCQkJCQkJICAgIC8qIGNhY2hlX3R5cGUgKGluc3RydWN0aW9uKT0gKi8gMSwKQEAgLTc0MCw2ICs3NDQsOSBAQAogCQkJaWE2NF9pX2NhY2hlX3N0cmlkZV9zaGlmdCA9IGNjaS5wY2NpX3N0cmlkZTsKIAl9CiAgIG91dDoKKyNpZmRlZiBDT05GSUdfU01QCisJbWF4X2NhY2hlX3NpemUgPSBtYXgobWF4X2NhY2hlX3NpemUsIGNhY2hlX3NpemUpOworI2VuZGlmCiAJaWYgKG1heCA+IGlhNjRfbWF4X2NhY2hlbGluZV9zaXplKQogCQlpYTY0X21heF9jYWNoZWxpbmVfc2l6ZSA9IG1heDsKIH0KQEAgLTc5NCw3ICs4MDEsNyBAQAogI2VuZGlmCiAKIAkvKiBDbGVhciB0aGUgc3RhY2sgbWVtb3J5IHJlc2VydmVkIGZvciBwdF9yZWdzOiAqLwotCW1lbXNldChpYTY0X3Rhc2tfcmVncyhjdXJyZW50KSwgMCwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisJbWVtc2V0KHRhc2tfcHRfcmVncyhjdXJyZW50KSwgMCwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CiAKIAlpYTY0X3NldF9rcihJQTY0X0tSX0ZQVV9PV05FUiwgMCk7CiAKQEAgLTg3MCw2ICs4NzcsMTUgQEAKIAlwbV9pZGxlID0gZGVmYXVsdF9pZGxlOwogfQogCisvKgorICogT24gU01QIHN5c3RlbXMsIHdoZW4gdGhlIHNjaGVkdWxlciBkb2VzIG1pZ3JhdGlvbi1jb3N0IGF1dG9kZXRlY3Rpb24sCisgKiBpdCBuZWVkcyBhIHdheSB0byBmbHVzaCBhcyBtdWNoIG9mIHRoZSBDUFUncyBjYWNoZXMgYXMgcG9zc2libGUuCisgKi8KK3ZvaWQgc2NoZWRfY2FjaGVmbHVzaCh2b2lkKQoreworCWlhNjRfc2FsX2NhY2hlX2ZsdXNoKDMpOworfQorCiB2b2lkCiBjaGVja19idWdzICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNThjZTA3ZS4uNDYzZjZiYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NpZ25hbC5jCkBAIC02NTUsMTEgKzY1NSwxMSBAQAogCiAJCWlmICghdCkKIAkJCXJldHVybjsKLQkJdC0+dGhyZWFkX2luZm8tPnNpZ2RlbGF5ZWQuc2lnbm8gPSBzaWdubzsKLQkJdC0+dGhyZWFkX2luZm8tPnNpZ2RlbGF5ZWQuY29kZSA9IGNvZGU7Ci0JCXQtPnRocmVhZF9pbmZvLT5zaWdkZWxheWVkLmFkZHIgPSBhZGRyOwotCQl0LT50aHJlYWRfaW5mby0+c2lnZGVsYXllZC5zdGFydF90aW1lID0gc3RhcnRfdGltZTsKLQkJdC0+dGhyZWFkX2luZm8tPnNpZ2RlbGF5ZWQucGlkID0gcGlkOworCQl0YXNrX3RocmVhZF9pbmZvKHQpLT5zaWdkZWxheWVkLnNpZ25vID0gc2lnbm87CisJCXRhc2tfdGhyZWFkX2luZm8odCktPnNpZ2RlbGF5ZWQuY29kZSA9IGNvZGU7CisJCXRhc2tfdGhyZWFkX2luZm8odCktPnNpZ2RlbGF5ZWQuYWRkciA9IGFkZHI7CisJCXRhc2tfdGhyZWFkX2luZm8odCktPnNpZ2RlbGF5ZWQuc3RhcnRfdGltZSA9IHN0YXJ0X3RpbWU7CisJCXRhc2tfdGhyZWFkX2luZm8odCktPnNpZ2RlbGF5ZWQucGlkID0gcGlkOwogCQl3bWIoKTsKIAkJc2V0X3Rza190aHJlYWRfZmxhZyh0LCBUSUZfU0lHREVMQVlFRCk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zeXNfaWE2NC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zeXNfaWE2NC5jCmluZGV4IGYyZGJjZDEuLmM3Yjk0M2YgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc3lzX2lhNjQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3N5c19pYTY0LmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogYXNtbGlua2FnZSBsb25nCiBzeXNfcGlwZSAodm9pZCkKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGlhNjRfdGFza19yZWdzKGN1cnJlbnQpOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCWludCBmZFsyXTsKIAlpbnQgcmV0dmFsOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKaW5kZXggZDNlMGVjYi4uNTUzOTE5MCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYwpAQCAtNTMwLDEyICs1MzAsMTUgQEAKIAkJaWYgKGZzeXNfbW9kZShjdXJyZW50LCAmcmVncykpIHsKIAkJCWV4dGVybiBjaGFyIF9fa2VybmVsX3N5c2NhbGxfdmlhX2JyZWFrW107CiAJCQkvKgotCQkJICogR290IGEgdHJhcCBpbiBmc3lzLW1vZGU6IFRha2VuIEJyYW5jaCBUcmFwIGFuZCBTaW5nbGUgU3RlcCB0cmFwCi0JCQkgKiBuZWVkIHNwZWNpYWwgaGFuZGxpbmc7IERlYnVnIHRyYXAgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlbi4KKwkJCSAqIEdvdCBhIHRyYXAgaW4gZnN5cy1tb2RlOiBUYWtlbiBCcmFuY2ggVHJhcAorCQkJICogYW5kIFNpbmdsZSBTdGVwIHRyYXAgbmVlZCBzcGVjaWFsIGhhbmRsaW5nOworCQkJICogRGVidWcgdHJhcCBpcyBpZ25vcmVkICh3ZSBkaXNhYmxlIGl0IGhlcmUKKwkJCSAqIGFuZCByZS1lbmFibGUgaXQgaW4gdGhlIGxvd2VyLXByaXZpbGVnZSB0cmFwKS4KIAkJCSAqLwogCQkJaWYgKHVubGlrZWx5KHZlY3RvciA9PSAyOSkpIHsKLQkJCQlkaWUoIkdvdCBkZWJ1ZyB0cmFwIGluIGZzeXMtbW9kZS0tLW5vdCBzdXBwb3NlZCB0byBoYXBwZW4hIiwKLQkJCQkgICAgJnJlZ3MsIDApOworCQkJCXNldF90aHJlYWRfZmxhZyhUSUZfREJfRElTQUJMRUQpOworCQkJCWlhNjRfcHNyKCZyZWdzKS0+ZGIgPSAwOworCQkJCWlhNjRfcHNyKCZyZWdzKS0+bHAgPSAxOwogCQkJCXJldHVybjsKIAkJCX0KIAkJCS8qIHJlLWRvIHRoZSBzeXN0ZW0gY2FsbCB2aWEgYnJlYWsgMHgxMDAwMDA6ICovCkBAIC01ODksMTAgKzU5MiwxOSBAQAogCSAgICAgIGNhc2UgMzQ6CiAJCWlmIChpc3IgJiAweDIpIHsKIAkJCS8qIExvd2VyLVByaXZpbGVnZSBUcmFuc2ZlciBUcmFwICovCisKKwkJCS8qIElmIHdlIGRpc2FibGVkIGRlYnVnIHRyYXBzIGR1cmluZyBhbiBmc3lzY2FsbCwKKwkJCSAqIHJlLWVuYWJsZSB0aGVtIGhlcmUuCisJCQkgKi8KKwkJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9EQl9ESVNBQkxFRCkpIHsKKwkJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfREJfRElTQUJMRUQpOworCQkJCWlhNjRfcHNyKCZyZWdzKS0+ZGIgPSAxOworCQkJfQorCiAJCQkvKgotCQkJICogSnVzdCBjbGVhciBQU1IubHAgYW5kIHRoZW4gcmV0dXJuIGltbWVkaWF0ZWx5OiBhbGwgdGhlCi0JCQkgKiBpbnRlcmVzdGluZyB3b3JrIChlLmcuLCBzaWduYWwgZGVsaXZlcnkgaXMgZG9uZSBpbiB0aGUga2VybmVsCi0JCQkgKiBleGl0IHBhdGgpLgorCQkJICogSnVzdCBjbGVhciBQU1IubHAgYW5kIHRoZW4gcmV0dXJuIGltbWVkaWF0ZWx5OgorCQkJICogYWxsIHRoZSBpbnRlcmVzdGluZyB3b3JrIChlLmcuLCBzaWduYWwgZGVsaXZlcnkpCisJCQkgKiBpcyBkb25lIGluIHRoZSBrZXJuZWwgZXhpdCBwYXRoLgogCQkJICovCiAJCQlpYTY0X3BzcigmcmVncyktPmxwID0gMDsKIAkJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9tbS90bGIuYyBiL2FyY2gvaWE2NC9tbS90bGIuYwppbmRleCA0MTEwNWQ0Li42YTRlZWM5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vdGxiLmMKKysrIGIvYXJjaC9pYTY0L21tL3RsYi5jCkBAIC05MCw3ICs5MCw3IEBACiB7CiAJc3RhdGljIERFRklORV9TUElOTE9DSyhwdGNnX2xvY2spOwogCi0JaWYgKG1tICE9IGN1cnJlbnQtPmFjdGl2ZV9tbSkgeworCWlmIChtbSAhPSBjdXJyZW50LT5hY3RpdmVfbW0gfHwgIWN1cnJlbnQtPm1tKSB7CiAJCWZsdXNoX3RsYl9hbGwoKTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oIGIvYXJjaC9pYTY0L3NuL2luY2x1ZGUveHRhbGsvaHViZGV2LmgKaW5kZXggNzFjMmIyNy4uNGQ0MTdjMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2luY2x1ZGUveHRhbGsvaHViZGV2LmgKKysrIGIvYXJjaC9pYTY0L3NuL2luY2x1ZGUveHRhbGsvaHViZGV2LmgKQEAgLTI2LDExICsyNiwxNCBAQAogI2RlZmluZSBJSU9fTlVNX0lUVEVTICAgNwogI2RlZmluZSBIVUJfTlVNX0JJR19XSU5ET1cgICAgICAoSUlPX05VTV9JVFRFUyAtIDEpCiAKLXN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfbGlzdCB7CisvKiBUaGlzIHN0cnVjdCBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgUFJPTSBhbmQgdGhlIGtlcm5lbC4KKyAqIENoYW5nZXMgdG8gdGhpcyBzdHJ1Y3Qgd2lsbCByZXF1aXJlIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyB0byB0aGUga2VybmVsLgorICovCitzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2NvbW1vbiB7CiAJaW50IHNmZGxfYnVzOwogCWludCBzZmRsX3Nsb3Q7CiAJaW50IHNmZGxfcGluOwotCXN0cnVjdCBiYXJfbGlzdCB7CisJc3RydWN0IGNvbW1vbl9iYXJfbGlzdCB7CiAJCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CiAJCXVuc2lnbmVkIGxvbmcgZW5kOwogCX0gc2ZkbF9iYXJfbGlzdFs2XTsKQEAgLTQwLDE0ICs0MywxOSBAQAogCXVpbnQzMl90IHNmZGxfcGVyc2lzdGVudF9idXNudW07CiAJdWludDMyX3Qgc2ZkbF9wZXJzaXN0ZW50X3NlZ21lbnQ7CiAJc3RydWN0IHBjaWJ1c19pbmZvICpzZmRsX3BjaWJ1c19pbmZvOworfTsKKworLyogVGhpcyBzdHJ1Y3QgaXMga2VybmVsIG9ubHkgYW5kIGlzIG5vdCB1c2VkIGJ5IHRoZSBQUk9NICovCitzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCB7CiAJc3BpbmxvY2tfdCBzZmRsX2ZsdXNoX2xvY2s7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9jb21tb24gKmNvbW1vbjsKIH07CiAKIC8qCi0gKiAqKndpZGdldF9wIC0gVXNlZCBhcyBhbiBhcnJheVt3aWRfbnVtXVtkZXZpY2VdIG9mIHNuX2ZsdXNoX2RldmljZV9saXN0LgorICogKip3aWRnZXRfcCAtIFVzZWQgYXMgYW4gYXJyYXlbd2lkX251bV1bZGV2aWNlXSBvZiBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsLgogICovCiBzdHJ1Y3Qgc25fZmx1c2hfbmFzaWRfZW50cnkgIHsKLQlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2xpc3QgKip3aWRnZXRfcDsgLyogVXNlZCBhcyBhIGFycmF5IG9mIHdpZF9udW0gKi8KKwlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCAqKndpZGdldF9wOyAvLyBVc2VkIGFzIGFuIGFycmF5IG9mIHdpZF9udW0KIAl1aW50NjRfdCBpaW9faXR0ZVs4XTsKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvYnRlX2Vycm9yLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2J0ZV9lcnJvci5jCmluZGV4IGZjYmM3NDguLmYxZWMxMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvYnRlX2Vycm9yLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9idGVfZXJyb3IuYwpAQCAtMzMsNyArMzMsNyBAQAogICogV2FpdCB1bnRpbCBhbGwgQlRFIHJlbGF0ZWQgQ1JCcyBhcmUgY29tcGxldGVkCiAgKiBhbmQgdGhlbiByZXNldCB0aGUgaW50ZXJmYWNlcy4KICAqLwotdm9pZCBzaHViMV9idGVfZXJyb3JfaGFuZGxlcih1bnNpZ25lZCBsb25nIF9ub2RlcGRhKQoraW50IHNodWIxX2J0ZV9lcnJvcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgX25vZGVwZGEpCiB7CiAJc3RydWN0IG5vZGVwZGFfcyAqZXJyX25vZGVwZGEgPSAoc3RydWN0IG5vZGVwZGFfcyAqKV9ub2RlcGRhOwogCXN0cnVjdCB0aW1lcl9saXN0ICpyZWNvdmVyeV90aW1lciA9ICZlcnJfbm9kZXBkYS0+YnRlX3JlY292ZXJ5X3RpbWVyOwpAQCAtNTMsNyArNTMsNyBAQAogCSAgICAoZXJyX25vZGVwZGEtPmJ0ZV9pZlsxXS5iaF9lcnJvciA9PSBCVEVfU1VDQ0VTUykpIHsKIAkJQlRFX1BSSU5USygoImVoOiVwOiVkIE5vdGhpbmcgdG8gZG8uXG4iLCBlcnJfbm9kZXBkYSwKIAkJCSAgICBzbXBfcHJvY2Vzc29yX2lkKCkpKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBEZXRlcm1pbmUgaW5mb3JtYXRpb24gYWJvdXQgb3VyIGh1YiAqLwpAQCAtODEsNyArODEsNyBAQAogCQltb2RfdGltZXIocmVjb3ZlcnlfdGltZXIsIEhaICogNSk7CiAJCUJURV9QUklOVEsoKCJlaDolcDolZCBNYXJrZWQgR2l2aW5nIHVwXG4iLCBlcnJfbm9kZXBkYSwKIAkJCSAgICBzbXBfcHJvY2Vzc29yX2lkKCkpKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAl9CiAJaWYgKGljbXIuaWlfaWNtcl9mbGRfcy5pX2NyYl92bGQgIT0gMCkgewogCkBAIC05OSw3ICs5OSw3IEBACiAJCQkJQlRFX1BSSU5USygoImVoOiVwOiVkIFZhbGlkICVkLCBHaXZpbmcgdXBcbiIsCiAJCQkJCSAgICBlcnJfbm9kZXBkYSwgc21wX3Byb2Nlc3Nvcl9pZCgpLAogCQkJCQkgICAgaSkpOwotCQkJCXJldHVybjsKKwkJCQlyZXR1cm4gMTsKIAkJCX0KIAkJfQogCX0KQEAgLTEyNCw2ICsxMjQsNDIgQEAKIAlSRU1PVEVfSFVCX1MobmFzaWQsIElJT19JQkNSLCBpYmNyLmlpX2liY3JfcmVndmFsKTsKIAogCWRlbF90aW1lcihyZWNvdmVyeV90aW1lcik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXYWl0IHVudGlsIGFsbCBCVEUgcmVsYXRlZCBDUkJzIGFyZSBjb21wbGV0ZWQKKyAqIGFuZCB0aGVuIHJlc2V0IHRoZSBpbnRlcmZhY2VzLgorICovCitpbnQgc2h1YjJfYnRlX2Vycm9yX2hhbmRsZXIodW5zaWduZWQgbG9uZyBfbm9kZXBkYSkKK3sKKwlzdHJ1Y3Qgbm9kZXBkYV9zICplcnJfbm9kZXBkYSA9IChzdHJ1Y3Qgbm9kZXBkYV9zICopX25vZGVwZGE7CisJc3RydWN0IHRpbWVyX2xpc3QgKnJlY292ZXJ5X3RpbWVyID0gJmVycl9ub2RlcGRhLT5idGVfcmVjb3ZlcnlfdGltZXI7CisJc3RydWN0IGJ0ZWluZm9fcyAqYnRlOworCW5hc2lkX3QgbmFzaWQ7CisJdTY0IHN0YXR1czsKKwlpbnQgaTsKKworCW5hc2lkID0gY25vZGVpZF90b19uYXNpZChlcnJfbm9kZXBkYS0+YnRlX2lmWzBdLmJ0ZV9jbm9kZSk7CisKKwkvKgorCSAqIFZlcmlmeSB0aGF0IGFsbCB0aGUgQlRFcyBhcmUgY29tcGxldGUKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQlRFU19QRVJfTk9ERTsgaSsrKSB7CisJCWJ0ZSA9ICZlcnJfbm9kZXBkYS0+YnRlX2lmW2ldOworCQlzdGF0dXMgPSBCVEVfTE5TVEFUX0xPQUQoYnRlKTsKKwkJaWYgKChzdGF0dXMgJiBJQkxTX0VSUk9SKSB8fCAhKHN0YXR1cyAmIElCTFNfQlVTWSkpCisJCQljb250aW51ZTsKKwkJbW9kX3RpbWVyKHJlY292ZXJ5X3RpbWVyLCBIWiAqIDUpOworCQlCVEVfUFJJTlRLKCgiZWg6JXA6JWQgTWFya2VkIEdpdmluZyB1cFxuIiwgZXJyX25vZGVwZGEsCisJCQkgICAgc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoaWE2NF9zbl9idGVfcmVjb3ZlcnkobmFzaWQpKQorCQlwYW5pYygiYnRlX2Vycm9yX2hhbmRsZXIoKTogRmF0YWwgQlRFIEVycm9yIik7CisKKwlkZWxfdGltZXIocmVjb3ZlcnlfdGltZXIpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTM1LDcgKzE3MSw2IEBACiAJc3RydWN0IG5vZGVwZGFfcyAqZXJyX25vZGVwZGEgPSAoc3RydWN0IG5vZGVwZGFfcyAqKV9ub2RlcGRhOwogCXNwaW5sb2NrX3QgKnJlY292ZXJ5X2xvY2sgPSAmZXJyX25vZGVwZGEtPmJ0ZV9yZWNvdmVyeV9sb2NrOwogCWludCBpOwotCW5hc2lkX3QgbmFzaWQ7CiAJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CiAJdm9sYXRpbGUgdTY0ICpub3RpZnk7CiAJYnRlX3Jlc3VsdF90IGJoX2Vycm9yOwpAQCAtMTYwLDEyICsxOTUsMTUgQEAKIAl9CiAKIAlpZiAoaXNfc2h1YjEoKSkgewotCQlzaHViMV9idGVfZXJyb3JfaGFuZGxlcihfbm9kZXBkYSk7CisJCWlmIChzaHViMV9idGVfZXJyb3JfaGFuZGxlcihfbm9kZXBkYSkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmVjb3ZlcnlfbG9jaywgaXJxX2ZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQogCX0gZWxzZSB7Ci0JCW5hc2lkID0gY25vZGVpZF90b19uYXNpZChlcnJfbm9kZXBkYS0+YnRlX2lmWzBdLmJ0ZV9jbm9kZSk7Ci0KLQkJaWYgKGlhNjRfc25fYnRlX3JlY292ZXJ5KG5hc2lkKSkKLQkJCXBhbmljKCJidGVfZXJyb3JfaGFuZGxlcigpOiBGYXRhbCBCVEUgRXJyb3IiKTsKKwkJaWYgKHNodWIyX2J0ZV9lcnJvcl9oYW5kbGVyKF9ub2RlcGRhKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyZWNvdmVyeV9sb2NrLCBpcnFfZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IEJURVNfUEVSX05PREU7IGkrKykgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9odWJlcnJvci5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9odWJlcnJvci5jCmluZGV4IDVjNWViMDEuLjU2YWI2YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaHViZXJyb3IuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2h1YmVycm9yLmMKQEAgLTMyLDEzICszMiwxNCBAQAogCXJldF9zdHVmZi52MCA9IDA7CiAJaHViZGV2X2luZm8gPSAoc3RydWN0IGh1YmRldl9pbmZvICopYXJnOwogCW5hc2lkID0gaHViZGV2X2luZm8tPmhkaV9uYXNpZDsKLQlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLCBTTl9TQUxfSFVCX0VSUk9SX0lOVEVSUlVQVCwKLQkJCSh1NjQpIG5hc2lkLCAwLCAwLCAwLCAwLCAwLCAwKTsKLQotCWlmICgoaW50KXJldF9zdHVmZi52MCkKLQkJcGFuaWMoImh1YmlpX2VpbnRfaGFuZGxlcigpOiBGYXRhbCBUSU8gRXJyb3IiKTsKIAogCWlmIChpc19zaHViMSgpKSB7CisJCVNBTF9DQUxMX05PTE9DSyhyZXRfc3R1ZmYsIFNOX1NBTF9IVUJfRVJST1JfSU5URVJSVVBULAorCQkJKHU2NCkgbmFzaWQsIDAsIDAsIDAsIDAsIDAsIDApOworCisJCWlmICgoaW50KXJldF9zdHVmZi52MCkKKwkJCXBhbmljKCJodWJpaV9laW50X2hhbmRsZXIoKTogRmF0YWwgVElPIEVycm9yIik7CisKIAkJaWYgKCEobmFzaWQgJiAxKSkgLyogTm90IGEgVElPLCBoYW5kbGUgQ1JCIGVycm9ycyAqLwogCQkJKHZvaWQpaHViaWlvX2NyYl9lcnJvcl9oYW5kbGVyKGh1YmRldl9pbmZvKTsKIAl9IGVsc2UgCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jCmluZGV4IDMxODA4N2UuLjI1OGQ5ZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jCkBAIC03NiwxMSArNzYsMTIgQEAKIH07CiAKIC8qCi0gKiBSZXRyaWV2ZSB0aGUgRE1BIEZsdXNoIExpc3QgZ2l2ZW4gbmFzaWQuICBUaGlzIGxpc3QgaXMgbmVlZGVkIAotICogdG8gaW1wbGVtZW50IHRoZSBXQVIgLSBGbHVzaCBETUEgZGF0YSBvbiBQSU8gUmVhZHMuCisgKiBSZXRyaWV2ZSB0aGUgRE1BIEZsdXNoIExpc3QgZ2l2ZW4gbmFzaWQsIHdpZGdldCwgYW5kIGRldmljZS4KKyAqIFRoaXMgbGlzdCBpcyBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBXQVIgLSBGbHVzaCBETUEgZGF0YSBvbiBQSU8gUmVhZHMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdWludDY0X3QKLXNhbF9nZXRfd2lkZ2V0X2RtYWZsdXNoX2xpc3QodTY0IG5hc2lkLCB1NjQgd2lkZ2V0X251bSwgdTY0IGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHU2NAorc2FsX2dldF9kZXZpY2VfZG1hZmx1c2hfbGlzdCh1NjQgbmFzaWQsIHU2NCB3aWRnZXRfbnVtLCB1NjQgZGV2aWNlX251bSwKKwkJCSAgICAgdTY0IGFkZHJlc3MpCiB7CiAKIAlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJldF9zdHVmZjsKQEAgLTg4LDE3ICs4OSwxNyBAQAogCXJldF9zdHVmZi52MCA9IDA7CiAKIAlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLAotCQkJKHU2NCkgU05fU0FMX0lPSUZfR0VUX1dJREdFVF9ETUFGTFVTSF9MSVNULAotCQkJKHU2NCkgbmFzaWQsICh1NjQpIHdpZGdldF9udW0sICh1NjQpIGFkZHJlc3MsIDAsIDAsIDAsCi0JCQkwKTsKLQlyZXR1cm4gcmV0X3N0dWZmLnYwOworCQkJKHU2NCkgU05fU0FMX0lPSUZfR0VUX0RFVklDRV9ETUFGTFVTSF9MSVNULAorCQkJKHU2NCkgbmFzaWQsICh1NjQpIHdpZGdldF9udW0sCisJCQkodTY0KSBkZXZpY2VfbnVtLCAodTY0KSBhZGRyZXNzLCAwLCAwLCAwKTsKKwlyZXR1cm4gcmV0X3N0dWZmLnN0YXR1czsKIAogfQogCiAvKgogICogUmV0cmlldmUgdGhlIGh1YiBkZXZpY2UgaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBnaXZlbiBuYXNpZC4KICAqLwotc3RhdGljIGlubGluZSB1aW50NjRfdCBzYWxfZ2V0X2h1YmRldl9pbmZvKHU2NCBoYW5kbGUsIHU2NCBhZGRyZXNzKQorc3RhdGljIGlubGluZSB1NjQgc2FsX2dldF9odWJkZXZfaW5mbyh1NjQgaGFuZGxlLCB1NjQgYWRkcmVzcykKIHsKIAogCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcmV0X3N0dWZmOwpAQCAtMTE0LDcgKzExNSw3IEBACiAvKgogICogUmV0cmlldmUgdGhlIHBjaSBidXMgaW5mb3JtYXRpb24gZ2l2ZW4gdGhlIGJ1cyBudW1iZXIuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdWludDY0X3Qgc2FsX2dldF9wY2lidXNfaW5mbyh1NjQgc2VnbWVudCwgdTY0IGJ1c251bSwgdTY0IGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHU2NCBzYWxfZ2V0X3BjaWJ1c19pbmZvKHU2NCBzZWdtZW50LCB1NjQgYnVzbnVtLCB1NjQgYWRkcmVzcykKIHsKIAogCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcmV0X3N0dWZmOwpAQCAtMTMwLDcgKzEzMSw3IEBACiAvKgogICogUmV0cmlldmUgdGhlIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gZ2l2ZW4gdGhlIGJ1cyBhbmQgZGV2aWNlfGZ1bmN0aW9uIG51bWJlci4KICAqLwotc3RhdGljIGlubGluZSB1aW50NjRfdAorc3RhdGljIGlubGluZSB1NjQKIHNhbF9nZXRfcGNpZGV2X2luZm8odTY0IHNlZ21lbnQsIHU2NCBidXNfbnVtYmVyLCB1NjQgZGV2Zm4sIHU2NCBwY2lfZGV2LCAKIAkJCXU2NCBzbl9pcnFfaW5mbykKIHsKQEAgLTE3MCwxMiArMTcxLDEyIEBACiAgKi8KIHN0YXRpYyB2b2lkIHNuX2ZpeHVwX2lvbm9kZXModm9pZCkKIHsKLQotCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfbGlzdCAqc25fZmx1c2hfZGV2aWNlX2xpc3Q7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKnNuX2ZsdXNoX2RldmljZV9rZXJuZWw7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKmRldl9lbnRyeTsKIAlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmRldjsKLQl1aW50NjRfdCBzdGF0dXM7Ci0JdWludDY0X3QgbmFzaWQ7Ci0JaW50IGksIHdpZGdldDsKKwl1NjQgc3RhdHVzOworCXU2NCBuYXNpZDsKKwlpbnQgaSwgd2lkZ2V0LCBkZXZpY2U7CiAKIAkvKgogCSAqIEdldCBTR0kgU3BlY2lmaWMgSFVCIGNoaXBzZXQgaW5mb3JtYXRpb24uCkBAIC0xODYsNyArMTg3LDcgQEAKIAkJbmFzaWQgPSBjbm9kZWlkX3RvX25hc2lkKGkpOwogCQlodWJkZXYtPm1heF9zZWdtZW50X251bWJlciA9IDB4ZmZmZmZmZmY7CiAJCWh1YmRldi0+bWF4X3BjaWJ1c19udW1iZXIgPSAweGZmOwotCQlzdGF0dXMgPSBzYWxfZ2V0X2h1YmRldl9pbmZvKG5hc2lkLCAodWludDY0X3QpIF9fcGEoaHViZGV2KSk7CisJCXN0YXR1cyA9IHNhbF9nZXRfaHViZGV2X2luZm8obmFzaWQsICh1NjQpIF9fcGEoaHViZGV2KSk7CiAJCWlmIChzdGF0dXMpCiAJCQljb250aW51ZTsKIApAQCAtMjEzLDM4ICsyMTQsNDkgQEAKIAogCQlodWJkZXYtPmhkaV9mbHVzaF9uYXNpZF9saXN0LndpZGdldF9wID0KIAkJICAgIGttYWxsb2MoKEhVQl9XSURHRVRfSURfTUFYICsgMSkgKgotCQkJICAgIHNpemVvZihzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2xpc3QgKiksIEdGUF9LRVJORUwpOwotCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsICopLAorCQkJICAgIEdGUF9LRVJORUwpOwogCQltZW1zZXQoaHViZGV2LT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcCwgMHgwLAogCQkgICAgICAgKEhVQl9XSURHRVRfSURfTUFYICsgMSkgKgotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfbGlzdCAqKSk7CisJCSAgICAgICBzaXplb2Yoc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKikpOwogCiAJCWZvciAod2lkZ2V0ID0gMDsgd2lkZ2V0IDw9IEhVQl9XSURHRVRfSURfTUFYOyB3aWRnZXQrKykgewotCQkJc25fZmx1c2hfZGV2aWNlX2xpc3QgPSBrbWFsbG9jKERFVl9QRVJfV0lER0VUICoKLQkJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0Ci0JCQkJCQkJICAgICAgc25fZmx1c2hfZGV2aWNlX2xpc3QpLAotCQkJCQkJICAgICAgIEdGUF9LRVJORUwpOwotCQkJbWVtc2V0KHNuX2ZsdXNoX2RldmljZV9saXN0LCAweDAsCisJCQlzbl9mbHVzaF9kZXZpY2Vfa2VybmVsID0ga21hbGxvYyhERVZfUEVSX1dJREdFVCAqCisJCQkJCQkgICAgICAgICBzaXplb2Yoc3RydWN0CisJCQkJCQkgICAgICAgIHNuX2ZsdXNoX2RldmljZV9rZXJuZWwpLAorCQkJCQkJICAgICAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghc25fZmx1c2hfZGV2aWNlX2tlcm5lbCkKKwkJCQlCVUcoKTsKKwkJCW1lbXNldChzbl9mbHVzaF9kZXZpY2Vfa2VybmVsLCAweDAsCiAJCQkgICAgICAgREVWX1BFUl9XSURHRVQgKgotCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2xpc3QpKTsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwpKTsKIAotCQkJc3RhdHVzID0KLQkJCSAgICBzYWxfZ2V0X3dpZGdldF9kbWFmbHVzaF9saXN0KG5hc2lkLCB3aWRnZXQsCi0JCQkJCQkJICh1aW50NjRfdCkKLQkJCQkJCQkgX19wYQotCQkJCQkJCSAoc25fZmx1c2hfZGV2aWNlX2xpc3QpKTsKLQkJCWlmIChzdGF0dXMpIHsKLQkJCQlrZnJlZShzbl9mbHVzaF9kZXZpY2VfbGlzdCk7Ci0JCQkJY29udGludWU7CisJCQlkZXZfZW50cnkgPSBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsOworCQkJZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCBERVZfUEVSX1dJREdFVDsKKwkJCSAgICAgZGV2aWNlKyssZGV2X2VudHJ5KyspIHsKKwkJCQlkZXZfZW50cnktPmNvbW1vbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdAorCQkJCQkgICAgICAJICAgICAgICBzbl9mbHVzaF9kZXZpY2VfY29tbW9uKSwKKwkJCQkJICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMKTsKKwkJCQlpZiAoIWRldl9lbnRyeS0+Y29tbW9uKQorCQkJCQlCVUcoKTsKKwkJCQltZW1zZXQoZGV2X2VudHJ5LT5jb21tb24sIDB4MCwgc2l6ZW9mKHN0cnVjdAorCQkJCQkgICAgIAkgICAgICAgc25fZmx1c2hfZGV2aWNlX2NvbW1vbikpOworCisJCQkJc3RhdHVzID0gc2FsX2dldF9kZXZpY2VfZG1hZmx1c2hfbGlzdChuYXNpZCwKKwkJCQkJCQkJCXdpZGdldCwKKwkJCQkJCQkJICAgICAgIAlkZXZpY2UsCisJCQkJCQkgICAgICAodTY0KShkZXZfZW50cnktPmNvbW1vbikpOworCQkJCWlmIChzdGF0dXMpCisJCQkJCUJVRygpOworCisJCQkJc3Bpbl9sb2NrX2luaXQoJmRldl9lbnRyeS0+c2ZkbF9mbHVzaF9sb2NrKTsKIAkJCX0KIAotCQkJc3Bpbl9sb2NrX2luaXQoJnNuX2ZsdXNoX2RldmljZV9saXN0LT5zZmRsX2ZsdXNoX2xvY2spOwotCQkJaHViZGV2LT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcFt3aWRnZXRdID0KLQkJCSAgICBzbl9mbHVzaF9kZXZpY2VfbGlzdDsKLQkJfQotCisJCQlpZiAoc25fZmx1c2hfZGV2aWNlX2tlcm5lbCkKKwkJCQlodWJkZXYtPmhkaV9mbHVzaF9uYXNpZF9saXN0LndpZGdldF9wW3dpZGdldF0gPQorCQkJCQkJICAgICAgIHNuX2ZsdXNoX2RldmljZV9rZXJuZWw7CisJICAgICAgICB9CiAJfQotCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKaW5kZXggNDkzZmIzZi4uNmE3OTM5YiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYwpAQCAtNzcsMTIgKzc3LDYgQEAKIAlrZnJlZSh0b19jeF9kZXYoZGV2KSk7CiB9CiAKLXN0cnVjdCBidXNfdHlwZSB0aW9jeF9idXNfdHlwZSA9IHsKLQkubmFtZSA9ICJ0aW9jeCIsCi0JLm1hdGNoID0gdGlvY3hfbWF0Y2gsCi0JLnVldmVudCA9IHRpb2N4X3VldmVudCwKLX07Ci0KIC8qKgogICogY3hfZGV2aWNlX21hdGNoIC0gRmluZCBjeF9kZXZpY2UgaW4gdGhlIGlkIHRhYmxlLgogICogQGlkczogaWQgdGFibGUgZnJvbSBkcml2ZXIKQEAgLTE0OSw2ICsxNDMsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RydWN0IGJ1c190eXBlIHRpb2N4X2J1c190eXBlID0geworCS5uYW1lID0gInRpb2N4IiwKKwkubWF0Y2ggPSB0aW9jeF9tYXRjaCwKKwkudWV2ZW50ID0gdGlvY3hfdWV2ZW50LAorCS5wcm9iZSA9IGN4X2RldmljZV9wcm9iZSwKKwkucmVtb3ZlID0gY3hfZHJpdmVyX3JlbW92ZSwKK307CisKIC8qKgogICogY3hfZHJpdmVyX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgdGhlIGRyaXZlci4KICAqIEBjeF9kcml2ZXI6IGRyaXZlciB0YWJsZSAoY3hfZHJ2IHN0cnVjdCkgZnJvbSBkcml2ZXIKQEAgLTE2Miw4ICsxNjQsNiBAQAogewogCWN4X2RyaXZlci0+ZHJpdmVyLm5hbWUgPSBjeF9kcml2ZXItPm5hbWU7CiAJY3hfZHJpdmVyLT5kcml2ZXIuYnVzID0gJnRpb2N4X2J1c190eXBlOwotCWN4X2RyaXZlci0+ZHJpdmVyLnByb2JlID0gY3hfZGV2aWNlX3Byb2JlOwotCWN4X2RyaXZlci0+ZHJpdmVyLnJlbW92ZSA9IGN4X2RyaXZlcl9yZW1vdmU7CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZjeF9kcml2ZXItPmRyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3hwY19jaGFubmVsLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwY19jaGFubmVsLmMKaW5kZXggYWJmNGZjMi4uMGMwYTY4OSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfY2hhbm5lbC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX2NoYW5uZWwuYwpAQCAtMyw3ICszLDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKi8KIAogCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9zbi9idGUuaD4KICNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+Ci0jaW5jbHVkZSAieHBjLmgiCisjaW5jbHVkZSA8YXNtL3NuL3hwYy5oPgogCiAKIC8qCkBAIC03NzksNiArNzc5LDEyIEBACiAKIAkvKiBib3RoIHNpZGVzIGFyZSBkaXNjb25uZWN0ZWQgbm93ICovCiAKKwlpZiAoY2gtPmZsYWdzICYgWFBDX0NfQ09OTkVDVENBTExPVVQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmxvY2ssICppcnFfZmxhZ3MpOworCQl4cGNfZGlzY29ubmVjdF9jYWxsb3V0KGNoLCB4cGNEaXNjb25uZWN0ZWQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmxvY2ssICppcnFfZmxhZ3MpOworCX0KKwogCS8qIGl0J3Mgbm93IHNhZmUgdG8gZnJlZSB0aGUgY2hhbm5lbCdzIG1lc3NhZ2UgcXVldWVzICovCiAJeHBjX2ZyZWVfbXNncXVldWVzKGNoKTsKIApAQCAtMTY0NSw3ICsxNjUxLDcgQEAKIAogCiB2b2lkCi14cGNfZGlzY29ubmVjdGluZ19jYWxsb3V0KHN0cnVjdCB4cGNfY2hhbm5lbCAqY2gpCit4cGNfZGlzY29ubmVjdF9jYWxsb3V0KHN0cnVjdCB4cGNfY2hhbm5lbCAqY2gsIGVudW0geHBjX3JldHZhbCByZWFzb24pCiB7CiAJLyoKIAkgKiBMZXQgdGhlIGNoYW5uZWwncyByZWdpc3RlcmVyIGtub3cgdGhhdCB0aGUgY2hhbm5lbCBpcyBiZWluZwpAQCAtMTY1NCwxNSArMTY2MCwxMyBAQAogCSAqLwogCiAJaWYgKGNoLT5mdW5jICE9IE5VTEwpIHsKLQkJZGV2X2RiZyh4cGNfY2hhbiwgImNoLT5mdW5jKCkgY2FsbGVkLCByZWFzb249eHBjRGlzY29ubmVjdGluZywiCi0JCQkiIHBhcnRpZD0lZCwgY2hhbm5lbD0lZFxuIiwgY2gtPnBhcnRpZCwgY2gtPm51bWJlcik7CisJCWRldl9kYmcoeHBjX2NoYW4sICJjaC0+ZnVuYygpIGNhbGxlZCwgcmVhc29uPSVkLCBwYXJ0aWQ9JWQsICIKKwkJCSJjaGFubmVsPSVkXG4iLCByZWFzb24sIGNoLT5wYXJ0aWQsIGNoLT5udW1iZXIpOwogCi0JCWNoLT5mdW5jKHhwY0Rpc2Nvbm5lY3RpbmcsIGNoLT5wYXJ0aWQsIGNoLT5udW1iZXIsIE5VTEwsCi0JCQkJCQkJCWNoLT5rZXkpOworCQljaC0+ZnVuYyhyZWFzb24sIGNoLT5wYXJ0aWQsIGNoLT5udW1iZXIsIE5VTEwsIGNoLT5rZXkpOwogCi0JCWRldl9kYmcoeHBjX2NoYW4sICJjaC0+ZnVuYygpIHJldHVybmVkLCByZWFzb249IgotCQkJInhwY0Rpc2Nvbm5lY3RpbmcsIHBhcnRpZD0lZCwgY2hhbm5lbD0lZFxuIiwKLQkJCWNoLT5wYXJ0aWQsIGNoLT5udW1iZXIpOworCQlkZXZfZGJnKHhwY19jaGFuLCAiY2gtPmZ1bmMoKSByZXR1cm5lZCwgcmVhc29uPSVkLCBwYXJ0aWQ9JWQsICIKKwkJCSJjaGFubmVsPSVkXG4iLCByZWFzb24sIGNoLT5wYXJ0aWQsIGNoLT5udW1iZXIpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jCmluZGV4IGI2MTcyMzYuLjg5MzA1ODZlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3hwY19tYWluLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jCkBAIC0zLDcgKzMsNyBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqLwogCiAKQEAgLTU5LDcgKzU5LDcgQEAKICNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSAieHBjLmgiCisjaW5jbHVkZSA8YXNtL3NuL3hwYy5oPgogCiAKIC8qIGRlZmluZSB0d28gWFBDIGRlYnVnIGRldmljZSBzdHJ1Y3R1cmVzIHRvIGJlIHVzZWQgd2l0aCBkZXZfZGJnKCkgZXQgYWwgKi8KQEAgLTgyLDYgKzgyLDkgQEAKIHN0cnVjdCBkZXZpY2UgKnhwY19jaGFuID0gJnhwY19jaGFuX2RiZ19zdWJuYW1lOwogCiAKK3N0YXRpYyBpbnQgeHBjX2tkZWJ1Z19pZ25vcmU7CisKKwogLyogc3lzdHVuZSByZWxhdGVkIHZhcmlhYmxlcyBmb3IgL3Byb2Mvc3lzIGRpcmVjdG9yaWVzICovCiAKIHN0YXRpYyBpbnQgeHBjX2hiX2ludGVydmFsID0gWFBDX0hCX0RFRkFVTFRfSU5URVJWQUw7CkBAIC0xNjIsNiArMTY1LDggQEAKIH07CiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnhwY19zeXNjdGw7CiAKKy8qIG5vbi16ZXJvIGlmIGFueSByZW1vdGUgcGFydGl0aW9uIGRpc2VuZ2FnZSByZXF1ZXN0IHdhcyB0aW1lZCBvdXQgKi8KK2ludCB4cGNfZGlzZW5nYWdlX3JlcXVlc3RfdGltZWRvdXQ7CiAKIC8qICNvZiBJUlFzIHJlY2VpdmVkICovCiBzdGF0aWMgYXRvbWljX3QgeHBjX2FjdF9JUlFfcmN2ZDsKQEAgLTc3Myw3ICs3NzgsNyBAQAogCQkJY2gtPmZsYWdzIHw9IFhQQ19DX0RJU0NPTk5FQ1RDQUxMT1VUOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmxvY2ssIGlycV9mbGFncyk7CiAKLQkJCXhwY19kaXNjb25uZWN0aW5nX2NhbGxvdXQoY2gpOworCQkJeHBjX2Rpc2Nvbm5lY3RfY2FsbG91dChjaCwgeHBjRGlzY29ubmVjdGluZyk7CiAJCX0gZWxzZSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+bG9jaywgaXJxX2ZsYWdzKTsKIAkJfQpAQCAtOTIxLDkgKzkyNiw5IEBACiB4cGNfZG9fZXhpdChlbnVtIHhwY19yZXR2YWwgcmVhc29uKQogewogCXBhcnRpZF90IHBhcnRpZDsKLQlpbnQgYWN0aXZlX3BhcnRfY291bnQ7CisJaW50IGFjdGl2ZV9wYXJ0X2NvdW50LCBwcmludGVkX3dhaXRpbmdfbXNnID0gMDsKIAlzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqcGFydDsKLQl1bnNpZ25lZCBsb25nIHByaW50bXNnX3RpbWU7CisJdW5zaWduZWQgbG9uZyBwcmludG1zZ190aW1lLCBkaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0ID0gMDsKIAogCiAJLyogYSAncm1tb2QgWFBDJyBhbmQgYSAncmVib290JyBjYW5ub3QgYm90aCBlbmQgdXAgaGVyZSB0b2dldGhlciAqLwpAQCAtOTUzLDcgKzk1OCw4IEBACiAKIAkvKiB3YWl0IGZvciBhbGwgcGFydGl0aW9ucyB0byBiZWNvbWUgaW5hY3RpdmUgKi8KIAotCXByaW50bXNnX3RpbWUgPSBqaWZmaWVzOworCXByaW50bXNnX3RpbWUgPSBqaWZmaWVzICsgKFhQQ19ESVNFTkdBR0VfUFJJTlRNU0dfSU5URVJWQUwgKiBIWik7CisJeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVkb3V0ID0gMDsKIAogCWRvIHsKIAkJYWN0aXZlX3BhcnRfY291bnQgPSAwOwpAQCAtOTY5LDIwICs5NzUsMzkgQEAKIAkJCWFjdGl2ZV9wYXJ0X2NvdW50Kys7CiAKIAkJCVhQQ19ERUFDVElWQVRFX1BBUlRJVElPTihwYXJ0LCByZWFzb24pOworCisJCQlpZiAocGFydC0+ZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dCA+CisJCQkJCQlkaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0KSB7CisJCQkJZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dCA9CisJCQkJCQlwYXJ0LT5kaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0OworCQkJfQogCQl9CiAKLQkJaWYgKGFjdGl2ZV9wYXJ0X2NvdW50ID09IDApIHsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGppZmZpZXMgPj0gcHJpbnRtc2dfdGltZSkgewotCQkJZGV2X2luZm8oeHBjX3BhcnQsICJ3YWl0aW5nIGZvciBwYXJ0aXRpb25zIHRvICIKLQkJCQkiZGVhY3RpdmF0ZS9kaXNlbmdhZ2UsIGFjdGl2ZSBjb3VudD0lZCwgcmVtb3RlICIKLQkJCQkiZW5nYWdlZD0weCVseFxuIiwgYWN0aXZlX3BhcnRfY291bnQsCi0JCQkJeHBjX3BhcnRpdGlvbl9lbmdhZ2VkKDFVTCA8PCBwYXJ0aWQpKTsKLQotCQkJcHJpbnRtc2dfdGltZSA9IGppZmZpZXMgKworCQlpZiAoeHBjX3BhcnRpdGlvbl9lbmdhZ2VkKC0xVUwpKSB7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcmludG1zZ190aW1lKSkgeworCQkJCWRldl9pbmZvKHhwY19wYXJ0LCAid2FpdGluZyBmb3IgcmVtb3RlICIKKwkJCQkJInBhcnRpdGlvbnMgdG8gZGlzZW5nYWdlLCB0aW1lb3V0IGluICIKKwkJCQkJIiVsZCBzZWNvbmRzXG4iLAorCQkJCQkoZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dCAtIGppZmZpZXMpCisJCQkJCQkJCQkvIEhaKTsKKwkJCQlwcmludG1zZ190aW1lID0gamlmZmllcyArCiAJCQkJCShYUENfRElTRU5HQUdFX1BSSU5UTVNHX0lOVEVSVkFMICogSFopOworCQkJCXByaW50ZWRfd2FpdGluZ19tc2cgPSAxOworCQkJfQorCisJCX0gZWxzZSBpZiAoYWN0aXZlX3BhcnRfY291bnQgPiAwKSB7CisJCQlpZiAocHJpbnRlZF93YWl0aW5nX21zZykgeworCQkJCWRldl9pbmZvKHhwY19wYXJ0LCAid2FpdGluZyBmb3IgbG9jYWwgcGFydGl0aW9uIgorCQkJCQkiIHRvIGRpc2VuZ2FnZVxuIik7CisJCQkJcHJpbnRlZF93YWl0aW5nX21zZyA9IDA7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWlmICgheHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVkb3V0KSB7CisJCQkJZGV2X2luZm8oeHBjX3BhcnQsICJhbGwgcGFydGl0aW9ucyBoYXZlICIKKwkJCQkJImRpc2VuZ2FnZWRcbiIpOworCQkJfQorCQkJYnJlYWs7CiAJCX0KIAogCQkvKiBzbGVlcCBmb3IgYSAxLzMgb2YgYSBzZWNvbmQgb3Igc28gKi8KQEAgLTEwMDAsMTEgKzEwMjUsMTMgQEAKIAlkZWxfdGltZXJfc3luYygmeHBjX2hiX3RpbWVyKTsKIAlEQlVHX09OKHhwY192YXJzLT5oZWFydGJlYXRpbmdfdG9fbWFzayAhPSAwKTsKIAotCS8qIHRha2Ugb3Vyc2VsdmVzIG9mZiBvZiB0aGUgcmVib290X25vdGlmaWVyX2xpc3QgKi8KLQkodm9pZCkgdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnhwY19yZWJvb3Rfbm90aWZpZXIpOworCWlmIChyZWFzb24gPT0geHBjVW5sb2FkaW5nKSB7CisJCS8qIHRha2Ugb3Vyc2VsdmVzIG9mZiBvZiB0aGUgcmVib290X25vdGlmaWVyX2xpc3QgKi8KKwkJKHZvaWQpIHVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ4cGNfcmVib290X25vdGlmaWVyKTsKIAotCS8qIHRha2Ugb3Vyc2VsdmVzIG9mZiBvZiB0aGUgZGllX25vdGlmaWVyIGxpc3QgKi8KLQkodm9pZCkgdW5yZWdpc3Rlcl9kaWVfbm90aWZpZXIoJnhwY19kaWVfbm90aWZpZXIpOworCQkvKiB0YWtlIG91cnNlbHZlcyBvZmYgb2YgdGhlIGRpZV9ub3RpZmllciBsaXN0ICovCisJCSh2b2lkKSB1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigmeHBjX2RpZV9ub3RpZmllcik7CisJfQogCiAJLyogY2xvc2UgZG93biBwcm90ZWN0aW9ucyBmb3IgSVBJIG9wZXJhdGlvbnMgKi8KIAl4cGNfcmVzdHJpY3RfSVBJX29wcygpOwpAQCAtMTAyMCw2MyArMTA0Nyw2IEBACiAKIAogLyoKLSAqIENhbGxlZCB3aGVuIHRoZSBzeXN0ZW0gaXMgYWJvdXQgdG8gYmUgZWl0aGVyIHJlc3RhcnRlZCBvciBoYWx0ZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi14cGNfZGllX2Rpc2VuZ2FnZSh2b2lkKQotewotCXN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0OwotCXBhcnRpZF90IHBhcnRpZDsKLQl1bnNpZ25lZCBsb25nIGVuZ2FnZWQ7Ci0JbG9uZyB0aW1lLCBwcmludF90aW1lLCBkaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0OwotCi0KLQkvKiBrZWVwIHhwY19oYl9jaGVja2VyIHRocmVhZCBmcm9tIGRvaW5nIGFueXRoaW5nIChqdXN0IGluIGNhc2UpICovCi0JeHBjX2V4aXRpbmcgPSAxOwotCi0JeHBjX3ZhcnMtPmhlYXJ0YmVhdGluZ190b19tYXNrID0gMDsgIC8qIGluZGljYXRlIHdlJ3JlIGRlYWN0aXZhdGVkICovCi0KLQlmb3IgKHBhcnRpZCA9IDE7IHBhcnRpZCA8IFhQX01BWF9QQVJUSVRJT05TOyBwYXJ0aWQrKykgewotCQlwYXJ0ID0gJnhwY19wYXJ0aXRpb25zW3BhcnRpZF07Ci0KLQkJaWYgKCFYUENfU1VQUE9SVFNfRElTRU5HQUdFX1JFUVVFU1QocGFydC0+Ci0JCQkJCQkJcmVtb3RlX3ZhcnNfdmVyc2lvbikpIHsKLQotCQkJLyoganVzdCBpbiBjYXNlIGl0IHdhcyBsZWZ0IHNldCBieSBhbiBlYXJsaWVyIFhQQyAqLwotCQkJeHBjX2NsZWFyX3BhcnRpdGlvbl9lbmdhZ2VkKDFVTCA8PCBwYXJ0aWQpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoeHBjX3BhcnRpdGlvbl9lbmdhZ2VkKDFVTCA8PCBwYXJ0aWQpIHx8Ci0JCQkJCXBhcnQtPmFjdF9zdGF0ZSAhPSBYUENfUF9JTkFDVElWRSkgewotCQkJeHBjX3JlcXVlc3RfcGFydGl0aW9uX2Rpc2VuZ2FnZShwYXJ0KTsKLQkJCXhwY19tYXJrX3BhcnRpdGlvbl9kaXNlbmdhZ2VkKHBhcnQpOwotCQkJeHBjX0lQSV9zZW5kX2Rpc2VuZ2FnZShwYXJ0KTsKLQkJfQotCX0KLQotCXByaW50X3RpbWUgPSBydGNfdGltZSgpOwotCWRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQgPSBwcmludF90aW1lICsKLQkJKHhwY19kaXNlbmdhZ2VfcmVxdWVzdF90aW1lbGltaXQgKiBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQpOwotCi0JLyogd2FpdCBmb3IgYWxsIG90aGVyIHBhcnRpdGlvbnMgdG8gZGlzZW5nYWdlIGZyb20gdXMgKi8KLQotCXdoaWxlICgoZW5nYWdlZCA9IHhwY19wYXJ0aXRpb25fZW5nYWdlZCgtMVVMKSkgJiYKLQkJCSh0aW1lID0gcnRjX3RpbWUoKSkgPCBkaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0KSB7Ci0KLQkJaWYgKHRpbWUgPj0gcHJpbnRfdGltZSkgewotCQkJZGV2X2luZm8oeHBjX3BhcnQsICJ3YWl0aW5nIGZvciByZW1vdGUgcGFydGl0aW9ucyB0byAiCi0JCQkJImRpc2VuZ2FnZSwgZW5nYWdlZD0weCVseFxuIiwgZW5nYWdlZCk7Ci0JCQlwcmludF90aW1lID0gdGltZSArIChYUENfRElTRU5HQUdFX1BSSU5UTVNHX0lOVEVSVkFMICoKLQkJCQkJCXNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCk7Ci0JCX0KLQl9Ci0JZGV2X2luZm8oeHBjX3BhcnQsICJmaW5pc2hlZCB3YWl0aW5nIGZvciByZW1vdGUgcGFydGl0aW9ucyB0byAiCi0JCQkJImRpc2VuZ2FnZSwgZW5nYWdlZD0weCVseFxuIiwgZW5nYWdlZCk7Ci19Ci0KLQotLyoKICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHN5c3RlbSBpcyBiZWluZyByZWJvb3RlZC4KICAqLwogc3RhdGljIGludApAQCAtMTEwNSw3ICsxMDc1LDg4IEBACiAKIAogLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHN5c3RlbSBpcyBiZWluZyByZWJvb3RlZC4KKyAqIE5vdGlmeSBvdGhlciBwYXJ0aXRpb25zIHRvIGRpc2VuZ2FnZSBmcm9tIGFsbCByZWZlcmVuY2VzIHRvIG91ciBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkCit4cGNfZGllX2Rpc2VuZ2FnZSh2b2lkKQoreworCXN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0OworCXBhcnRpZF90IHBhcnRpZDsKKwl1bnNpZ25lZCBsb25nIGVuZ2FnZWQ7CisJbG9uZyB0aW1lLCBwcmludG1zZ190aW1lLCBkaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0OworCisKKwkvKiBrZWVwIHhwY19oYl9jaGVja2VyIHRocmVhZCBmcm9tIGRvaW5nIGFueXRoaW5nIChqdXN0IGluIGNhc2UpICovCisJeHBjX2V4aXRpbmcgPSAxOworCisJeHBjX3ZhcnMtPmhlYXJ0YmVhdGluZ190b19tYXNrID0gMDsgIC8qIGluZGljYXRlIHdlJ3JlIGRlYWN0aXZhdGVkICovCisKKwlmb3IgKHBhcnRpZCA9IDE7IHBhcnRpZCA8IFhQX01BWF9QQVJUSVRJT05TOyBwYXJ0aWQrKykgeworCQlwYXJ0ID0gJnhwY19wYXJ0aXRpb25zW3BhcnRpZF07CisKKwkJaWYgKCFYUENfU1VQUE9SVFNfRElTRU5HQUdFX1JFUVVFU1QocGFydC0+CisJCQkJCQkJcmVtb3RlX3ZhcnNfdmVyc2lvbikpIHsKKworCQkJLyoganVzdCBpbiBjYXNlIGl0IHdhcyBsZWZ0IHNldCBieSBhbiBlYXJsaWVyIFhQQyAqLworCQkJeHBjX2NsZWFyX3BhcnRpdGlvbl9lbmdhZ2VkKDFVTCA8PCBwYXJ0aWQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoeHBjX3BhcnRpdGlvbl9lbmdhZ2VkKDFVTCA8PCBwYXJ0aWQpIHx8CisJCQkJCXBhcnQtPmFjdF9zdGF0ZSAhPSBYUENfUF9JTkFDVElWRSkgeworCQkJeHBjX3JlcXVlc3RfcGFydGl0aW9uX2Rpc2VuZ2FnZShwYXJ0KTsKKwkJCXhwY19tYXJrX3BhcnRpdGlvbl9kaXNlbmdhZ2VkKHBhcnQpOworCQkJeHBjX0lQSV9zZW5kX2Rpc2VuZ2FnZShwYXJ0KTsKKwkJfQorCX0KKworCXRpbWUgPSBydGNfdGltZSgpOworCXByaW50bXNnX3RpbWUgPSB0aW1lICsKKwkJKFhQQ19ESVNFTkdBR0VfUFJJTlRNU0dfSU5URVJWQUwgKiBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQpOworCWRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQgPSB0aW1lICsKKwkJKHhwY19kaXNlbmdhZ2VfcmVxdWVzdF90aW1lbGltaXQgKiBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQpOworCisJLyogd2FpdCBmb3IgYWxsIG90aGVyIHBhcnRpdGlvbnMgdG8gZGlzZW5nYWdlIGZyb20gdXMgKi8KKworCXdoaWxlICgxKSB7CisJCWVuZ2FnZWQgPSB4cGNfcGFydGl0aW9uX2VuZ2FnZWQoLTFVTCk7CisJCWlmICghZW5nYWdlZCkgeworCQkJZGV2X2luZm8oeHBjX3BhcnQsICJhbGwgcGFydGl0aW9ucyBoYXZlIGRpc2VuZ2FnZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQl0aW1lID0gcnRjX3RpbWUoKTsKKwkJaWYgKHRpbWUgPj0gZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dCkgeworCQkJZm9yIChwYXJ0aWQgPSAxOyBwYXJ0aWQgPCBYUF9NQVhfUEFSVElUSU9OUzsgcGFydGlkKyspIHsKKwkJCQlpZiAoZW5nYWdlZCAmICgxVUwgPDwgcGFydGlkKSkgeworCQkJCQlkZXZfaW5mbyh4cGNfcGFydCwgImRpc2VuZ2FnZSBmcm9tICIKKwkJCQkJCSJyZW1vdGUgcGFydGl0aW9uICVkIHRpbWVkICIKKwkJCQkJCSJvdXRcbiIsIHBhcnRpZCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAodGltZSA+PSBwcmludG1zZ190aW1lKSB7CisJCQlkZXZfaW5mbyh4cGNfcGFydCwgIndhaXRpbmcgZm9yIHJlbW90ZSBwYXJ0aXRpb25zIHRvICIKKwkJCQkiZGlzZW5nYWdlLCB0aW1lb3V0IGluICVsZCBzZWNvbmRzXG4iLAorCQkJCShkaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0IC0gdGltZSkgLworCQkJCQkJc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kKTsKKwkJCXByaW50bXNnX3RpbWUgPSB0aW1lICsKKwkJCQkJKFhQQ19ESVNFTkdBR0VfUFJJTlRNU0dfSU5URVJWQUwgKgorCQkJCQkJc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kKTsKKwkJfQorCX0KK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgc3lzdGVtIGlzIGJlaW5nIHJlc3RhcnRlZCBvciBoYWx0ZWQgZHVlCisgKiB0byBzb21lIHNvcnQgb2Ygc3lzdGVtIGZhaWx1cmUuIElmIHRoaXMgaXMgdGhlIGNhc2Ugd2UgbmVlZCB0byBub3RpZnkgdGhlCisgKiBvdGhlciBwYXJ0aXRpb25zIHRvIGRpc2VuZ2FnZSBmcm9tIGFsbCByZWZlcmVuY2VzIHRvIG91ciBtZW1vcnkuCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIGNhbGxlZCB3aGVuIG91ciBoZWFydGJlYXRlciBjb3VsZCBiZSBvZmZsaW5lZAorICogZm9yIGEgdGltZS4gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gbm90aWZ5IG90aGVyIHBhcnRpdGlvbnMgdG8gbm90IHdvcnJ5CisgKiBhYm91dCB0aGUgbGFjayBvZiBhIGhlYXJ0YmVhdC4KICAqLwogc3RhdGljIGludAogeHBjX3N5c3RlbV9kaWUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqdW51c2VkKQpAQCAtMTExNSwxMSArMTE2NiwyNSBAQAogCWNhc2UgRElFX01BQ0hJTkVfSEFMVDoKIAkJeHBjX2RpZV9kaXNlbmdhZ2UoKTsKIAkJYnJlYWs7CisKKwljYXNlIERJRV9LREVCVUdfRU5URVI6CisJCS8qIFNob3VsZCBsYWNrIG9mIGhlYXJ0YmVhdCBiZSBpZ25vcmVkIGJ5IG90aGVyIHBhcnRpdGlvbnM/ICovCisJCWlmICgheHBjX2tkZWJ1Z19pZ25vcmUpIHsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRElFX01DQV9NT05BUkNIX0VOVEVSOgogCWNhc2UgRElFX0lOSVRfTU9OQVJDSF9FTlRFUjoKIAkJeHBjX3ZhcnMtPmhlYXJ0YmVhdCsrOwogCQl4cGNfdmFycy0+aGVhcnRiZWF0X29mZmxpbmUgPSAxOwogCQlicmVhazsKKworCWNhc2UgRElFX0tERUJVR19MRUFWRToKKwkJLyogSXMgbGFjayBvZiBoZWFydGJlYXQgYmVpbmcgaWdub3JlZCBieSBvdGhlciBwYXJ0aXRpb25zPyAqLworCQlpZiAoIXhwY19rZGVidWdfaWdub3JlKSB7CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIERJRV9NQ0FfTU9OQVJDSF9MRUFWRToKIAljYXNlIERJRV9JTklUX01PTkFSQ0hfTEVBVkU6CiAJCXhwY192YXJzLT5oZWFydGJlYXQrKzsKQEAgLTEzNDQsMyArMTQwOSw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKHhwY19kaXNlbmdhZ2VfcmVxdWVzdF90aW1lbGltaXQsICJOdW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0ICIKIAkJImZvciBkaXNlbmdhZ2UgcmVxdWVzdCB0byBjb21wbGV0ZS4iKTsKIAorbW9kdWxlX3BhcmFtKHhwY19rZGVidWdfaWdub3JlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh4cGNfa2RlYnVnX2lnbm9yZSwgIlNob3VsZCBsYWNrIG9mIGhlYXJ0YmVhdCBiZSBpZ25vcmVkIGJ5ICIKKwkJIm90aGVyIHBhcnRpdGlvbnMgd2hlbiBkcm9wcGluZyBpbnRvIGtkZWJ1Zy4iKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfcGFydGl0aW9uLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwY19wYXJ0aXRpb24uYwppbmRleCBjZGQ2NDMxLi44OGE3MzBlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3hwY19wYXJ0aXRpb24uYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwY19wYXJ0aXRpb24uYwpAQCAtMyw3ICszLDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKi8KIAogCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgogI2luY2x1ZGUgPGFzbS9zbi9ub2RlcGRhLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+Ci0jaW5jbHVkZSAieHBjLmgiCisjaW5jbHVkZSA8YXNtL3NuL3hwYy5oPgogCiAKIC8qIFhQQyBpcyBleGl0aW5nIGZsYWcgKi8KQEAgLTc3MSw3ICs3NzEsOCBAQAogCQl9CiAJfQogCi0JaWYgKCF4cGNfcGFydGl0aW9uX2Rpc2VuZ2FnZWQocGFydCkpIHsKKwlpZiAocGFydC0+ZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dCA+IDAgJiYKKwkJCQkJIXhwY19wYXJ0aXRpb25fZGlzZW5nYWdlZChwYXJ0KSkgewogCQkvKiBzdGlsbCB3YWl0aW5nIG9uIG90aGVyIHNpZGUgdG8gZGlzZW5nYWdlIGZyb20gdXMgKi8KIAkJcmV0dXJuOwogCX0KQEAgLTg3Myw2ICs4NzQsOSBAQAogCQkJICogcmVxdWVzdCBpbiBhIHRpbWVseSBmYXNoaW9uLCBzbyBhc3N1bWUgaXQncyBkZWFkLgogCQkJICovCiAKKwkJCWRldl9pbmZvKHhwY19wYXJ0LCAiZGlzZW5nYWdlIGZyb20gcmVtb3RlIHBhcnRpdGlvbiAlZCAiCisJCQkJInRpbWVkIG91dFxuIiwgcGFydGlkKTsKKwkJCXhwY19kaXNlbmdhZ2VfcmVxdWVzdF90aW1lZG91dCA9IDE7CiAJCQl4cGNfY2xlYXJfcGFydGl0aW9uX2VuZ2FnZWQoMVVMIDw8IHBhcnRpZCk7CiAJCQlkaXNlbmdhZ2VkID0gMTsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMKaW5kZXggMzQwOTM0Ny4uZTY4MzMyZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2RtYS5jCkBAIC0yMTgsNyArMjE4LDkgQEAKIAl1aW50NjRfdCBmbGFnczsKIAl1aW50NjRfdCBpdHRlOwogCXN0cnVjdCBodWJkZXZfaW5mbyAqaHViaW5mbzsKLQl2b2xhdGlsZSBzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2xpc3QgKnA7CisJdm9sYXRpbGUgc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKnA7CisJdm9sYXRpbGUgc3RydWN0IHNuX2ZsdXNoX2RldmljZV9jb21tb24gKmNvbW1vbjsKKwogCXN0cnVjdCBzbl9mbHVzaF9uYXNpZF9lbnRyeSAqZmx1c2hfbmFzaWRfbGlzdDsKIAogCWlmICghc25faW9pZl9pbml0ZWQpCkBAIC0yNjgsMTcgKzI3MCwxNyBAQAogCXAgPSAmZmx1c2hfbmFzaWRfbGlzdC0+d2lkZ2V0X3Bbd2lkX251bV1bMF07CiAKIAkvKiBmaW5kIGEgbWF0Y2hpbmcgQkFSICovCi0JZm9yIChpID0gMDsgaSA8IERFVl9QRVJfV0lER0VUOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgREVWX1BFUl9XSURHRVQ7IGkrKyxwKyspIHsKKwkJY29tbW9uID0gcC0+Y29tbW9uOwogCQlmb3IgKGogPSAwOyBqIDwgUENJX1JPTV9SRVNPVVJDRTsgaisrKSB7Ci0JCQlpZiAocC0+c2ZkbF9iYXJfbGlzdFtqXS5zdGFydCA9PSAwKQorCQkJaWYgKGNvbW1vbi0+c2ZkbF9iYXJfbGlzdFtqXS5zdGFydCA9PSAwKQogCQkJCWJyZWFrOwotCQkJaWYgKGFkZHIgPj0gcC0+c2ZkbF9iYXJfbGlzdFtqXS5zdGFydAotCQkJICAgICYmIGFkZHIgPD0gcC0+c2ZkbF9iYXJfbGlzdFtqXS5lbmQpCisJCQlpZiAoYWRkciA+PSBjb21tb24tPnNmZGxfYmFyX2xpc3Rbal0uc3RhcnQKKwkJCSAgICAmJiBhZGRyIDw9IGNvbW1vbi0+c2ZkbF9iYXJfbGlzdFtqXS5lbmQpCiAJCQkJYnJlYWs7CiAJCX0KLQkJaWYgKGogPCBQQ0lfUk9NX1JFU09VUkNFICYmIHAtPnNmZGxfYmFyX2xpc3Rbal0uc3RhcnQgIT0gMCkKKwkJaWYgKGogPCBQQ0lfUk9NX1JFU09VUkNFICYmIGNvbW1vbi0+c2ZkbF9iYXJfbGlzdFtqXS5zdGFydCAhPSAwKQogCQkJYnJlYWs7Ci0JCXArKzsKIAl9CiAKIAkvKiBpZiBubyBtYXRjaGluZyBCQVIsIHJldHVybiB3aXRob3V0IGRvaW5nIGFueXRoaW5nLiAqLwpAQCAtMzA0LDI0ICszMDYsMjQgQEAKIAkJaWYgKCgxIDw8IFhXSURHRVRfUEFSVF9SRVZfTlVNX1JFVihyZXZudW0pKSAmIFBWOTA3NTE2KSB7CiAJCQlyZXR1cm47CiAJCX0gZWxzZSB7Ci0JCQlwY2lyZWdfd3JiX2ZsdXNoX2dldChwLT5zZmRsX3BjaWJ1c19pbmZvLAotCQkJCQkgICAgIChwLT5zZmRsX3Nsb3QgLSAxKSk7CisJCQlwY2lyZWdfd3JiX2ZsdXNoX2dldChjb21tb24tPnNmZGxfcGNpYnVzX2luZm8sCisJCQkJCSAgICAgKGNvbW1vbi0+c2ZkbF9zbG90IC0gMSkpOwogCQl9CiAJfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJigoc3RydWN0IHNuX2ZsdXNoX2RldmljZV9saXN0ICopcCktPgotCQkJCSAgc2ZkbF9mbHVzaF9sb2NrLCBmbGFncyk7Ci0KLQkJKnAtPnNmZGxfZmx1c2hfYWRkciA9IDA7CisJCXNwaW5fbG9ja19pcnFzYXZlKChzcGlubG9ja190ICopJnAtPnNmZGxfZmx1c2hfbG9jaywKKwkJCQkgIGZsYWdzKTsKKwkJKmNvbW1vbi0+c2ZkbF9mbHVzaF9hZGRyID0gMDsKIAogCQkvKiBmb3JjZSBhbiBpbnRlcnJ1cHQuICovCi0JCSoodm9sYXRpbGUgdWludDMyX3QgKikocC0+c2ZkbF9mb3JjZV9pbnRfYWRkcikgPSAxOworCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGNvbW1vbi0+c2ZkbF9mb3JjZV9pbnRfYWRkcikgPSAxOwogCiAJCS8qIHdhaXQgZm9yIHRoZSBpbnRlcnJ1cHQgdG8gY29tZSBiYWNrLiAqLwotCQl3aGlsZSAoKihwLT5zZmRsX2ZsdXNoX2FkZHIpICE9IDB4MTBmKQorCQl3aGlsZSAoKihjb21tb24tPnNmZGxfZmx1c2hfYWRkcikgIT0gMHgxMGYpCiAJCQljcHVfcmVsYXgoKTsKIAogCQkvKiBva2F5LCBldmVyeXRoaW5nIGlzIHN5bmNoZWQgdXAuICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikmcC0+c2ZkbF9mbHVzaF9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikmcC0+c2ZkbF9mbHVzaF9sb2NrLAorCQkJCSAgICAgICBmbGFncyk7CiAJfQogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYwppbmRleCAxZjUwMGM4Li5lMzI4ZTk0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCkBAIC05Miw3ICs5Miw4IEBACiAJY25vZGVpZF90IG5lYXJfY25vZGU7CiAJc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXZfaW5mbzsKIAlzdHJ1Y3QgcGNpYnVzX2luZm8gKnNvZnQ7Ci0Jc3RydWN0IHNuX2ZsdXNoX2RldmljZV9saXN0ICpzbl9mbHVzaF9kZXZpY2VfbGlzdDsKKwlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCAqc25fZmx1c2hfZGV2aWNlX2tlcm5lbDsKKwlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2NvbW1vbiAqY29tbW9uOwogCiAJaWYgKCEgSVNfUENJX0JSSURHRV9BU0lDKHByb21fYnVzc29mdC0+YnNfYXNpY190eXBlKSkgewogCQlyZXR1cm4gTlVMTDsKQEAgLTEzNywyMCArMTM4LDE5IEBACiAJaHViZGV2X2luZm8gPSAoc3RydWN0IGh1YmRldl9pbmZvICopKE5PREVQREEoY25vZGUpLT5wZGluZm8pOwogCiAJaWYgKGh1YmRldl9pbmZvLT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcCkgewotCQlzbl9mbHVzaF9kZXZpY2VfbGlzdCA9IGh1YmRldl9pbmZvLT5oZGlfZmx1c2hfbmFzaWRfbGlzdC4KKwkJc25fZmx1c2hfZGV2aWNlX2tlcm5lbCA9IGh1YmRldl9pbmZvLT5oZGlfZmx1c2hfbmFzaWRfbGlzdC4KIAkJICAgIHdpZGdldF9wWyhpbnQpc29mdC0+cGJpX2J1c2NvbW1vbi5ic194aWRdOwotCQlpZiAoc25fZmx1c2hfZGV2aWNlX2xpc3QpIHsKKwkJaWYgKHNuX2ZsdXNoX2RldmljZV9rZXJuZWwpIHsKIAkJCWZvciAoaiA9IDA7IGogPCBERVZfUEVSX1dJREdFVDsKLQkJCSAgICAgaisrLCBzbl9mbHVzaF9kZXZpY2VfbGlzdCsrKSB7Ci0JCQkJaWYgKHNuX2ZsdXNoX2RldmljZV9saXN0LT5zZmRsX3Nsb3QgPT0gLTEpCisJCQkgICAgIGorKywgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCsrKSB7CisJCQkJY29tbW9uID0gc25fZmx1c2hfZGV2aWNlX2tlcm5lbC0+Y29tbW9uOworCQkJCWlmIChjb21tb24tPnNmZGxfc2xvdCA9PSAtMSkKIAkJCQkJY29udGludWU7Ci0JCQkJaWYgKChzbl9mbHVzaF9kZXZpY2VfbGlzdC0+Ci0JCQkJICAgICBzZmRsX3BlcnNpc3RlbnRfc2VnbWVudCA9PQorCQkJCWlmICgoY29tbW9uLT5zZmRsX3BlcnNpc3RlbnRfc2VnbWVudCA9PQogCQkJCSAgICAgc29mdC0+cGJpX2J1c2NvbW1vbi5ic19wZXJzaXN0X3NlZ21lbnQpICYmCi0JCQkJICAgICAoc25fZmx1c2hfZGV2aWNlX2xpc3QtPgotCQkJCSAgICAgc2ZkbF9wZXJzaXN0ZW50X2J1c251bSA9PQorCQkJCSAgICAgKGNvbW1vbi0+c2ZkbF9wZXJzaXN0ZW50X2J1c251bSA9PQogCQkJCSAgICAgc29mdC0+cGJpX2J1c2NvbW1vbi5ic19wZXJzaXN0X2J1c251bSkpCi0JCQkJCXNuX2ZsdXNoX2RldmljZV9saXN0LT5zZmRsX3BjaWJ1c19pbmZvID0KKwkJCQkJY29tbW9uLT5zZmRsX3BjaWJ1c19pbmZvID0KIAkJCQkJICAgIHNvZnQ7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9tMzJyL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMmExZjI1MC4uNWRmYzdlYSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTI0MiwxMyArMjQyLDEwIEBACiBpbnQgY29weV90aHJlYWQoaW50IG5yLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHNwdSwKIAl1bnNpZ25lZCBsb25nIHVudXNlZCwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3M7Ci0JdW5zaWduZWQgbG9uZyBzcCA9ICh1bnNpZ25lZCBsb25nKXRzay0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRTsKKwlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRyZWdzID0gdGFza19wdF9yZWdzKHRzayk7CiAJZXh0ZXJuIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKTsKIAogCS8qIENvcHkgcmVnaXN0ZXJzICovCi0Jc3AgLT0gc2l6ZW9mIChzdHJ1Y3QgcHRfcmVncyk7Ci0JY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopc3A7CiAJKmNoaWxkcmVncyA9ICpyZWdzOwogCiAJY2hpbGRyZWdzLT5zcHUgPSBzcHU7CmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9tMzJyL2tlcm5lbC9wdHJhY2UuYwppbmRleCA5Yjc1Y2FhLi4zNDBhM2JmIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvcHRyYWNlLmMKQEAgLTM1LDIzICszNSw2IEBACiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAKIC8qCi0gKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxpdmUgcHRfcmVncyBmb3IgdGhlIHNwZWNpZmllZCB0YXNrLgotICogVGhlc2UgYXJlIHNhdmVkIG9udG8gdGhlIHRvcCBrZXJuZWwgc3RhY2sgd2hlbiB0aGUgcHJvY2VzcwotICogaXMgbm90IHJ1bm5pbmcuCi0gKgotICogTm90ZTogaWYgYSB1c2VyIHRocmVhZCBpcyBleGVjdmUnZCBmcm9tIGtlcm5lbCBzcGFjZSwgdGhlCi0gKiBrZXJuZWwgc3RhY2sgd2lsbCBub3QgYmUgZW1wdHkgb24gZW50cnkgdG8gdGhlIGtlcm5lbCwgc28KLSAqIHB0cmFjaW5nIHRoZXNlIHRhc2tzIHdpbGwgZmFpbC4KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHRfcmVncyAqCi1nZXRfdXNlcl9yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLSAgICAgICAgcmV0dXJuIChzdHJ1Y3QgcHRfcmVncyAqKQotICAgICAgICAgICAgICAgICgodW5zaWduZWQgbG9uZyl0YXNrLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFCi0gICAgICAgICAgICAgICAgIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7Ci19Ci0KLS8qCiAgKiBUaGlzIHJvdXRpbmUgd2lsbCBnZXQgYSB3b3JkIG9mZiBvZiB0aGUgcHJvY2VzcyBrZXJuZWwgc3RhY2suCiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpbnQKQEAgLTU5LDcgKzQyLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nICpzdGFjazsKIAotCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKilnZXRfdXNlcl9yZWdzKHRhc2spOworCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrX3B0X3JlZ3ModGFzayk7CiAKIAlyZXR1cm4gc3RhY2tbb2Zmc2V0XTsKIH0KQEAgLTcyLDcgKzU1LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nICpzdGFjazsKIAotCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKilnZXRfdXNlcl9yZWdzKHRhc2spOworCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrX3B0X3JlZ3ModGFzayk7CiAJc3RhY2tbb2Zmc2V0XSA9IGRhdGE7CiAKIAlyZXR1cm4gMDsKQEAgLTIwOCw3ICsxOTEsNyBAQAogICovCiBzdGF0aWMgaW50IHB0cmFjZV9nZXRyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB2b2lkIF9fdXNlciAqdXJlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfdXNlcl9yZWdzKHRzayk7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModHNrKTsKIAogCXJldHVybiBjb3B5X3RvX3VzZXIodXJlZ3MsIHJlZ3MsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpID8gLUVGQVVMVCA6IDA7CiB9CkBAIC0yMjMsNyArMjA2LDcgQEAKIAogCXJldCA9IC1FRkFVTFQ7CiAJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdyZWdzLCB1cmVncywgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkgPT0gMCkgewotCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF91c2VyX3JlZ3ModHNrKTsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModHNrKTsKIAkJKnJlZ3MgPSBuZXdyZWdzOwogCQlyZXQgPSAwOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9tMzJyL2tlcm5lbC9zbXBib290LmMKaW5kZXggYjkwYzU0MS4uZDdlYzE2ZSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zbXBib290LmMKQEAgLTI4Niw3ICsyODYsNyBAQAogCS8qIFNvIHdlIHNlZSB3aGF0J3MgdXAgICAqLwogCXByaW50aygiQm9vdGluZyBwcm9jZXNzb3IgJWQvJWRcbiIsIHBoeXNfaWQsIGNwdV9pZCk7CiAJc3RhY2tfc3RhcnQuc3BpID0gKHZvaWQgKilpZGxlLT50aHJlYWQuc3A7Ci0JaWRsZS0+dGhyZWFkX2luZm8tPmNwdSA9IGNwdV9pZDsKKwl0YXNrX3RocmVhZF9pbmZvKGlkbGUpLT5jcHUgPSBjcHVfaWQ7CiAKIAkvKgogCSAqIFNlbmQgU3RhcnR1cCBJUEkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hbWlnYS9hbWlpbnRzLmMgYi9hcmNoL202OGsvYW1pZ2EvYW1paW50cy5jCmluZGV4IGQ5ZWRmMmQuLmIwYWE2MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hbWlnYS9hbWlpbnRzLmMKKysrIGIvYXJjaC9tNjhrL2FtaWdhL2FtaWludHMuYwpAQCAtMTI2LDkgKzEyNiw5IEBACiAJCWdheWxlLmludGVuID0gR0FZTEVfSVJRX0lERTsKIAogCS8qIHR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIGFuZCBlbmFibGUgdGhlIG1hc3RlciBpbnRlcnJ1cHQgYml0ICovCi0JY3VzdG9tLmludGVuYSA9IDB4N2ZmZjsKLQljdXN0b20uaW50cmVxID0gMHg3ZmZmOwotCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9JTlRFTjsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gMHg3ZmZmOworCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSAweDdmZmY7CisJYW1pZ2FfY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX0lOVEVOOwogCiAJY2lhX2luaXRfSVJRKCZjaWFhX2Jhc2UpOwogCWNpYV9pbml0X0lSUSgmY2lhYl9iYXNlKTsKQEAgLTI0NSw3ICsyNDUsNyBAQAogCiAJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgKi8KIAlpZiAoaXJxIDwgSVJRX0FNSUdBX1BPUlRTICYmICFhbWlfYWJsZWNvdW50W2lycV0pCi0JCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBhbWlnYV9pbnRlbmFfdmFsc1tpcnFdOworCQlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTI3NCw3ICsyNzQsNyBAQAogCQlhbWlnYV9kZWxldGVfaXJxKCZhbWlfaXJxX2xpc3RbaXJxXSwgZGV2X2lkKTsKIAkJLyogaWYgc2VydmVyIGxpc3QgZW1wdHksIGRpc2FibGUgdGhlIGludGVycnVwdCAqLwogCQlpZiAoIWFtaV9pcnFfbGlzdFtpcnFdICYmIGlycSA8IElSUV9BTUlHQV9QT1JUUykKLQkJCWN1c3RvbS5pbnRlbmEgPSBhbWlnYV9pbnRlbmFfdmFsc1tpcnFdOworCQkJYW1pZ2FfY3VzdG9tLmludGVuYSA9IGFtaWdhX2ludGVuYV92YWxzW2lycV07CiAJfSBlbHNlIHsKIAkJaWYgKGFtaV9pcnFfbGlzdFtpcnFdLT5kZXZfaWQgIT0gZGV2X2lkKQogCQkJcHJpbnRrKCIlczogcmVtb3ZpbmcgcHJvYmFibHkgd3JvbmcgSVJRICVkIGZyb20gJXNcbiIsCkBAIC0yODMsNyArMjgzLDcgQEAKIAkJYW1pX2lycV9saXN0W2lycV0tPmZsYWdzICAgPSAwOwogCQlhbWlfaXJxX2xpc3RbaXJxXS0+ZGV2X2lkICA9IE5VTEw7CiAJCWFtaV9pcnFfbGlzdFtpcnFdLT5kZXZuYW1lID0gTlVMTDsKLQkJY3VzdG9tLmludGVuYSA9IGFtaWdhX2ludGVuYV92YWxzW2lycV07CisJCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBhbWlnYV9pbnRlbmFfdmFsc1tpcnFdOwogCX0KIH0KIApAQCAtMzI3LDcgKzMyNyw3IEBACiAJfQogCiAJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgKi8KLQljdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKIH0KIAogdm9pZCBhbWlnYV9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMzU4LDcgKzM1OCw3IEBACiAJfQogCiAJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCi0JY3VzdG9tLmludGVuYSA9IGFtaWdhX2ludGVuYV92YWxzW2lycV07CisJYW1pZ2FfY3VzdG9tLmludGVuYSA9IGFtaWdhX2ludGVuYV92YWxzW2lycV07CiB9CiAKIGlubGluZSB2b2lkIGFtaWdhX2RvX2lycShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApCkBAIC0zNzMsNyArMzczLDcgQEAKIAogCWtzdGF0X2NwdSgwKS5pcnFzW1NZU19JUlFTICsgaXJxXSsrOwogCi0JY3VzdG9tLmludHJlcSA9IGFtaWdhX2ludGVuYV92YWxzW2lycV07CisJYW1pZ2FfY3VzdG9tLmludHJlcSA9IGFtaWdhX2ludGVuYV92YWxzW2lycV07CiAKIAlmb3IgKG5vZGUgPSBhbWlfaXJxX2xpc3RbaXJxXTsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpCiAJCW5vZGUtPmhhbmRsZXIoaXJxLCBub2RlLT5kZXZfaWQsIGZwKTsKQEAgLTM4NSwyMyArMzg1LDIzIEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhbWlfaW50MShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKLQl1bnNpZ25lZCBzaG9ydCBpbnRzID0gY3VzdG9tLmludHJlcXIgJiBjdXN0b20uaW50ZW5hcjsKKwl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKIAogCS8qIGlmIHNlcmlhbCB0cmFuc21pdCBidWZmZXIgZW1wdHksIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfVEJFKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9UQkU7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9UQkU7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfVEJFLCBmcCk7CiAJfQogCiAJLyogaWYgZmxvcHB5IGRpc2sgdHJhbnNmZXIgY29tcGxldGUsIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfRFNLQkxLKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9EU0tCTEs7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9EU0tCTEs7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfRFNLQkxLLCBmcCk7CiAJfQogCiAJLyogaWYgc29mdHdhcmUgaW50ZXJydXB0IHNldCwgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9TT0ZUKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9TT0ZUOworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfU09GVDsKIAkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9TT0ZULCBmcCk7CiAJfQogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTQwOSwxNyArNDA5LDE3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhbWlfaW50MyhpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKLQl1bnNpZ25lZCBzaG9ydCBpbnRzID0gY3VzdG9tLmludHJlcXIgJiBjdXN0b20uaW50ZW5hcjsKKwl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKIAogCS8qIGlmIGEgYmxpdHRlciBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0JMSVQpIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX0JMSVQ7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9CTElUOwogCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0JMSVQsIGZwKTsKIAl9CiAKIAkvKiBpZiBhIGNvcHBlciBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0NPUEVSKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9DT1BFUjsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0NPUEVSOwogCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0NPUFBFUiwgZnApOwogCX0KIApAQCAtNDMxLDI5ICs0MzEsMjkgQEAKIAogc3RhdGljIGlycXJldHVybl90IGFtaV9pbnQ0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQogewotCXVuc2lnbmVkIHNob3J0IGludHMgPSBjdXN0b20uaW50cmVxciAmIGN1c3RvbS5pbnRlbmFyOworCXVuc2lnbmVkIHNob3J0IGludHMgPSBhbWlnYV9jdXN0b20uaW50cmVxciAmIGFtaWdhX2N1c3RvbS5pbnRlbmFyOwogCiAJLyogaWYgYXVkaW8gMCBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0FVRDApIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX0FVRDA7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9BVUQwOwogCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0FVRDAsIGZwKTsKIAl9CiAKIAkvKiBpZiBhdWRpbyAxIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQVVEMSkgewotCQljdXN0b20uaW50cmVxID0gSUZfQVVEMTsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0FVRDE7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQVVEMSwgZnApOwogCX0KIAogCS8qIGlmIGF1ZGlvIDIgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9BVUQyKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9BVUQyOworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMjsKIAkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9BVUQyLCBmcCk7CiAJfQogCiAJLyogaWYgYXVkaW8gMyBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0FVRDMpIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX0FVRDM7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9BVUQzOwogCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0FVRDMsIGZwKTsKIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhbWlfaW50NShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKLQl1bnNpZ25lZCBzaG9ydCBpbnRzID0gY3VzdG9tLmludHJlcXIgJiBjdXN0b20uaW50ZW5hcjsKKwl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKIAogCS8qIGlmIHNlcmlhbCByZWNlaXZlIGJ1ZmZlciBmdWxsIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfUkJGKSB7CkBAIC00NzEsNyArNDcxLDcgQEAKIAogCS8qIGlmIGEgZGlzayBzeW5jIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfRFNLU1lOKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9EU0tTWU47CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9EU0tTWU47CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfRFNLU1lOLCBmcCk7CiAJfQogCXJldHVybiBJUlFfSEFORExFRDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hbWlnYS9hbWlzb3VuZC5jIGIvYXJjaC9tNjhrL2FtaWdhL2FtaXNvdW5kLmMKaW5kZXggYmQ1ZDEzNGUuLmFlOTRkYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hbWlnYS9hbWlzb3VuZC5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9hbWlzb3VuZC5jCkBAIC0yNCw2ICsyNCw4IEBACiB9OwogI2RlZmluZSBEQVRBX1NJWkUJKHNpemVvZihzaW5lX2RhdGEpL3NpemVvZihzaW5lX2RhdGFbMF0pKQogCisjZGVmaW5lIGN1c3RvbSBhbWlnYV9jdXN0b20KKwogICAgIC8qCiAgICAgICogVGhlIG1pbmltdW0gcGVyaW9kIGZvciBhdWRpbyBtYXkgYmUgbW9kaWZpZWQgYnkgdGhlIGZyYW1lIGJ1ZmZlcgogICAgICAqIGRldmljZSBzaW5jZSBpdCBkZXBlbmRzIG9uIGh0b3RhbCAoZm9yIE9DUy9FQ1MvQUdBKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2NpYS5jIGIvYXJjaC9tNjhrL2FtaWdhL2NpYS5jCmluZGV4IDdkNTU2ODIuLjk0NzZlYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hbWlnYS9jaWEuYworKysgYi9hcmNoL202OGsvYW1pZ2EvY2lhLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAllbHNlCiAJCWJhc2UtPmljcl9kYXRhICY9IH5tYXNrOwogCWlmIChiYXNlLT5pY3JfZGF0YSAmIGJhc2UtPmljcl9tYXNrKQotCQljdXN0b20uaW50cmVxID0gSUZfU0VUQ0xSIHwgYmFzZS0+aW50X21hc2s7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9TRVRDTFIgfCBiYXNlLT5pbnRfbWFzazsKIAlyZXR1cm4gb2xkICYgYmFzZS0+aWNyX21hc2s7CiB9CiAKQEAgLTg5LDcgKzg5LDcgQEAKIAkJfQogCX0KIAlpZiAoYmFzZS0+aWNyX2RhdGEgJiBiYXNlLT5pY3JfbWFzaykKLQkJY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IGJhc2UtPmludF9tYXNrOworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfU0VUQ0xSIHwgYmFzZS0+aW50X21hc2s7CiAJcmV0dXJuIG9sZDsKIH0KIApAQCAtMTMzLDcgKzEzMyw3IEBACiAJbWFjaF9pcnEgPSBiYXNlLT5jaWFfaXJxOwogCWlycSA9IFNZU19JUlFTICsgbWFjaF9pcnE7CiAJaW50cyA9IGNpYV9zZXRfaXJxKGJhc2UsIENJQV9JQ1JfQUxMKTsKLQljdXN0b20uaW50cmVxID0gYmFzZS0+aW50X21hc2s7CisJYW1pZ2FfY3VzdG9tLmludHJlcSA9IGJhc2UtPmludF9tYXNrOwogCWZvciAoaSA9IDA7IGkgPCBDSUFfSVJRUzsgaSsrLCBpcnErKywgbWFjaF9pcnErKykgewogCQlpZiAoaW50cyAmIDEpIHsKIAkJCWtzdGF0X2NwdSgwKS5pcnFzW2lycV0rKzsKQEAgLTE2Miw3ICsxNjIsNyBAQAogCS8qIGluc3RhbGwgQ0lBIGhhbmRsZXIgKi8KIAlyZXF1ZXN0X2lycShiYXNlLT5oYW5kbGVyX2lycSwgY2lhX2hhbmRsZXIsIDAsIGJhc2UtPm5hbWUsIGJhc2UpOwogCi0JY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IGJhc2UtPmludF9tYXNrOworCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBiYXNlLT5pbnRfbWFzazsKIH0KIAogaW50IGNpYV9nZXRfaXJxX2xpc3Qoc3RydWN0IGNpYWJhc2UgKmJhc2UsIHN0cnVjdCBzZXFfZmlsZSAqcCkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hbWlnYS9jb25maWcuYyBiL2FyY2gvbTY4ay9hbWlnYS9jb25maWcuYwppbmRleCA0Nzc1ZTE4Li4xMmUzNzA2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jCkBAIC0xMDUsOSArMTA1LDYgQEAKIHN0YXRpYyBpbnQgYW1pZ2Ffc2V0X2Nsb2NrX21tc3MgKHVuc2lnbmVkIGxvbmcpOwogc3RhdGljIHVuc2lnbmVkIGludCBhbWlnYV9nZXRfc3MgKHZvaWQpOwogZXh0ZXJuIHZvaWQgYW1pZ2FfbWtzb3VuZCggdW5zaWduZWQgaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgdGlja3MgKTsKLSNpZmRlZiBDT05GSUdfQU1JR0FfRkxPUFBZCi1leHRlcm4gdm9pZCBhbWlnYV9mbG9wcHlfc2V0dXAoY2hhciAqLCBpbnQgKik7Ci0jZW5kaWYKIHN0YXRpYyB2b2lkIGFtaWdhX3Jlc2V0ICh2b2lkKTsKIGV4dGVybiB2b2lkIGFtaWdhX2luaXRfc291bmQodm9pZCk7CiBzdGF0aWMgdm9pZCBhbWlnYV9zYXZla21zZ19pbml0KHZvaWQpOwpAQCAtMjkwLDcgKzI4Nyw3IEBACiAgICAgY2FzZSBDU19PQ1M6CiAgICAgY2FzZSBDU19FQ1M6CiAgICAgY2FzZSBDU19BR0E6Ci0gICAgICBzd2l0Y2ggKGN1c3RvbS5kZW5pc2VpZCAmIDB4ZikgeworICAgICAgc3dpdGNoIChhbWlnYV9jdXN0b20uZGVuaXNlaWQgJiAweGYpIHsKICAgICAgIGNhc2UgMHgwYzoKIAlBTUlHQUhXX1NFVChERU5JU0VfSFIpOwogCWJyZWFrOwpAQCAtMzAzLDcgKzMwMCw3IEBACiAgICAgICBBTUlHQUhXX1NFVChERU5JU0UpOwogICAgICAgYnJlYWs7CiAgICAgfQotICAgIHN3aXRjaCAoKGN1c3RvbS52cG9zcj4+OCkgJiAweDdmKSB7CisgICAgc3dpdGNoICgoYW1pZ2FfY3VzdG9tLnZwb3NyPj44KSAmIDB4N2YpIHsKICAgICBjYXNlIDB4MDA6CiAgICAgICBBTUlHQUhXX1NFVChBR05VU19QQUwpOwogICAgICAgYnJlYWs7CkBAIC00MjcsMTMgKzQyNCw3IEBACiAKICAgbWFjaF9zZXRfY2xvY2tfbW1zcyAgPSBhbWlnYV9zZXRfY2xvY2tfbW1zczsKICAgbWFjaF9nZXRfc3MgICAgICAgICAgPSBhbWlnYV9nZXRfc3M7Ci0jaWZkZWYgQ09ORklHX0FNSUdBX0ZMT1BQWQotICBtYWNoX2Zsb3BweV9zZXR1cCAgICA9IGFtaWdhX2Zsb3BweV9zZXR1cDsKLSNlbmRpZgogICBtYWNoX3Jlc2V0ICAgICAgICAgICA9IGFtaWdhX3Jlc2V0OwotI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCi0gIGNvbnN3aXRjaHAgICAgICAgICAgID0gJmR1bW15X2NvbjsKLSNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQX01PRFVMRSkKICAgbWFjaF9iZWVwICAgICAgICAgICAgPSBhbWlnYV9ta3NvdW5kOwogI2VuZGlmCkBAIC00NDcsOSArNDM4LDkgQEAKICAgYW1pZ2FfY29sb3JjbG9jayA9IDUqYW1pZ2FfZWNsb2NrOwkvKiAzLjUgTUh6ICovCiAKICAgLyogY2xlYXIgYWxsIERNQSBiaXRzICovCi0gIGN1c3RvbS5kbWFjb24gPSBETUFGX0FMTDsKKyAgYW1pZ2FfY3VzdG9tLmRtYWNvbiA9IERNQUZfQUxMOwogICAvKiBlbnN1cmUgdGhhdCB0aGUgRE1BIG1hc3RlciBiaXQgaXMgc2V0ICovCi0gIGN1c3RvbS5kbWFjb24gPSBETUFGX1NFVENMUiB8IERNQUZfTUFTVEVSOworICBhbWlnYV9jdXN0b20uZG1hY29uID0gRE1BRl9TRVRDTFIgfCBETUFGX01BU1RFUjsKIAogICAvKiBkb24ndCB1c2UgWjIgUkFNIGFzIHN5c3RlbSBtZW1vcnkgb24gWjMgY2FwYWJsZSBtYWNoaW5lcyAqLwogICBpZiAoQU1JR0FIV19QUkVTRU5UKFpPUlJPMykpIHsKQEAgLTgzMCw4ICs4MjEsOCBAQAogCiBzdGF0aWMgdm9pZCBhbWlnYV9zZXJpYWxfcHV0YyhjaGFyIGMpCiB7Ci0gICAgY3VzdG9tLnNlcmRhdCA9ICh1bnNpZ25lZCBjaGFyKWMgfCAweDEwMDsKLSAgICB3aGlsZSAoIShjdXN0b20uc2VyZGF0ciAmIDB4MjAwMCkpCisgICAgYW1pZ2FfY3VzdG9tLnNlcmRhdCA9ICh1bnNpZ25lZCBjaGFyKWMgfCAweDEwMDsKKyAgICB3aGlsZSAoIShhbWlnYV9jdXN0b20uc2VyZGF0ciAmIDB4MjAwMCkpCiAJOwogfQogCkBAIC04NTUsMTEgKzg0NiwxMSBAQAogewogICAgIGludCBjaDsKIAotICAgIHdoaWxlICghKGN1c3RvbS5pbnRyZXFyICYgSUZfUkJGKSkKKyAgICB3aGlsZSAoIShhbWlnYV9jdXN0b20uaW50cmVxciAmIElGX1JCRikpCiAJYmFycmllcigpOwotICAgIGNoID0gY3VzdG9tLnNlcmRhdHIgJiAweGZmOworICAgIGNoID0gYW1pZ2FfY3VzdG9tLnNlcmRhdHIgJiAweGZmOwogICAgIC8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQsIHNvIHRoYXQgYW5vdGhlciBjaGFyYWN0ZXIgY2FuIGJlIHJlYWQgKi8KLSAgICBjdXN0b20uaW50cmVxID0gSUZfUkJGOworICAgIGFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9SQkY7CiAgICAgcmV0dXJuIGNoOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXBvbGxvL2NvbmZpZy5jIGIvYXJjaC9tNjhrL2Fwb2xsby9jb25maWcuYwppbmRleCAyNjQ5Mjk0Li5kNDAxOTYyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYXBvbGxvL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9hcG9sbG8vY29uZmlnLmMKQEAgLTE3Niw5ICsxNzYsNiBAQAogCW1hY2hfc2V0X2Nsb2NrX21tc3MgID0gZG5fZHVtbXlfc2V0X2Nsb2NrX21tc3M7IC8qICovCiAJbWFjaF9wcm9jZXNzX2ludCAgICAgPSBkbl9wcm9jZXNzX2ludDsKIAltYWNoX3Jlc2V0CSAgICAgPSBkbl9kdW1teV9yZXNldDsgIC8qICovCi0jaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKLSAgICAgICAgY29uc3dpdGNocCAgICAgICAgICAgPSAmZHVtbXlfY29uOwotI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAogCW1hY2hfaGVhcnRiZWF0ID0gZG5faGVhcnRiZWF0OwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvY29uZmlnLmMgYi9hcmNoL202OGsvYXRhcmkvY29uZmlnLmMKaW5kZXggOTI2MWQyZC4uMTAxMmIwOGU1IDEwMDY0NAotLS0gYS9hcmNoL202OGsvYXRhcmkvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL2NvbmZpZy5jCkBAIC01Miw5ICs1Miw2IEBACiAKIC8qIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIHN0YXRpYyB2b2lkIGF0YXJpX3Jlc2V0KCB2b2lkICk7Ci0jaWZkZWYgQ09ORklHX0FUQVJJX0ZMT1BQWQotZXh0ZXJuIHZvaWQgYXRhcmlfZmxvcHB5X3NldHVwKGNoYXIgKiwgaW50ICopOwotI2VuZGlmCiBzdGF0aWMgdm9pZCBhdGFyaV9nZXRfbW9kZWwoY2hhciAqbW9kZWwpOwogc3RhdGljIGludCBhdGFyaV9nZXRfaGFyZHdhcmVfbGlzdChjaGFyICpidWZmZXIpOwogCkBAIC0yNDQsMTIgKzI0MSw2IEBACiAgICAgbWFjaF9nZXRfaXJxX2xpc3QJID0gc2hvd19hdGFyaV9pbnRlcnJ1cHRzOwogICAgIG1hY2hfZ2V0dGltZW9mZnNldCAgID0gYXRhcmlfZ2V0dGltZW9mZnNldDsKICAgICBtYWNoX3Jlc2V0ICAgICAgICAgICA9IGF0YXJpX3Jlc2V0OwotI2lmZGVmIENPTkZJR19BVEFSSV9GTE9QUFkKLSAgICBtYWNoX2Zsb3BweV9zZXR1cAkgPSBhdGFyaV9mbG9wcHlfc2V0dXA7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQotICAgIGNvbnN3aXRjaHAJICAgICAgICAgPSAmZHVtbXlfY29uOwotI2VuZGlmCiAgICAgbWFjaF9tYXhfZG1hX2FkZHJlc3MgPSAweGZmZmZmZjsKICNpZiBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVApIHx8IGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUF9NT0RVTEUpCiAgICAgbWFjaF9iZWVwICAgICAgICAgID0gYXRhcmlfbWtzb3VuZDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9idm1lNjAwMC9ydGMuYyBiL2FyY2gvbTY4ay9idm1lNjAwMC9ydGMuYwppbmRleCBmNzU3M2YyLi43MDNjYmM2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvYnZtZTYwMDAvcnRjLmMKKysrIGIvYXJjaC9tNjhrL2J2bWU2MDAwL3J0Yy5jCkBAIC00Nyw2ICs0Nyw3IEBACiAJdW5zaWduZWQgY2hhciBtc3I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcnRjX3RpbWUgd3RpbWU7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgUlRDX1JEX1RJTUU6CS8qIFJlYWQgdGhlIHRpbWUvZGF0ZSBmcm9tIFJUQwkqLwpAQCAtNjksNyArNzAsNyBAQAogCQl9IHdoaWxlICh3dGltZS50bV9zZWMgIT0gQkNEMkJJTihydGMtPmJjZF9zZWMpKTsKIAkJcnRjLT5tc3IgPSBtc3I7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnd0aW1lLCBzaXplb2Ygd3RpbWUpID8KKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmd3RpbWUsIHNpemVvZiB3dGltZSkgPwogCQkJCQkJCQktRUZBVUxUIDogMDsKIAl9CiAJY2FzZSBSVENfU0VUX1RJTUU6CS8qIFNldCB0aGUgUlRDICovCkBAIC04MSw4ICs4Miw3IEBACiAJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJCXJldHVybiAtRUFDQ0VTOwogCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmcnRjX3RtLCAoc3RydWN0IHJ0Y190aW1lKilhcmcsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ0Y190bSwgYXJncCwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJeXJzID0gcnRjX3RtLnRtX3llYXI7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvaHAzMDAvY29uZmlnLmMgYi9hcmNoL202OGsvaHAzMDAvY29uZmlnLmMKaW5kZXggYTBiODU0Zi4uNmQxMjllZSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2hwMzAwL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9ocDMwMC9jb25maWcuYwpAQCAtMjYxLDkgKzI2MSw2IEBACiAjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAogCW1hY2hfaGVhcnRiZWF0ICAgICAgID0gaHAzMDBfcHVsc2U7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQotCWNvbnN3aXRjaHAJICAgICA9ICZkdW1teV9jb247Ci0jZW5kaWYKIAltYWNoX21heF9kbWFfYWRkcmVzcyA9IDB4ZmZmZmZmZmY7CiAKIAlpZiAoaHAzMDBfbW9kZWwgPj0gSFBfMzMwICYmIGhwMzAwX21vZGVsIDw9IEhQXzQzM1MgJiYgaHAzMDBfbW9kZWwgIT0gSFBfMzUwKSB7CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL202OGsva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggYzc4N2M1Yi4uMjQ2YTg4MiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtOTIsNyArOTIsNyBAQAogCURFRklORShUUkFQX1RSQUNFLCBUUkFQX1RSQUNFKTsKIAogCS8qIG9mZnNldHMgaW50byB0aGUgY3VzdG9tIHN0cnVjdCAqLwotCURFRklORShDVVNUT01CQVNFLCAmY3VzdG9tKTsKKwlERUZJTkUoQ1VTVE9NQkFTRSwgJmFtaWdhX2N1c3RvbSk7CiAJREVGSU5FKENfSU5URU5BUiwgb2Zmc2V0b2Yoc3RydWN0IENVU1RPTSwgaW50ZW5hcikpOwogCURFRklORShDX0lOVFJFUVIsIG9mZnNldG9mKHN0cnVjdCBDVVNUT00sIGludHJlcXIpKTsKIAlERUZJTkUoQ19JTlRFTkEsIG9mZnNldG9mKHN0cnVjdCBDVVNUT00sIGludGVuYSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9oZWFkLlMgYi9hcmNoL202OGsva2VybmVsL2hlYWQuUwppbmRleCBkNDMzNmQ4Li43MDAwMmMxIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2hlYWQuUworKysgYi9hcmNoL202OGsva2VybmVsL2hlYWQuUwpAQCAtMjczLDggKzI3MywxMCBAQAogICogTWFjaW50b3NoIGNvbnNvbGUgc3VwcG9ydAogICovCiAKKyNpZmRlZiBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRQogI2RlZmluZSBDT05TT0xFCiAjZGVmaW5lIENPTlNPTEVfUEVOR1VJTgorI2VuZGlmCiAKIC8qCiAgKiBNYWNpbnRvc2ggc2VyaWFsIGRlYnVnIHN1cHBvcnQ7IG91dHB1dHMgYm9vdCBpbmZvIHRvIHRoZSBwcmludGVyCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDEzZDEwOTMyLi4zZjljYjU1IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjM4LDEwICsyMzgsOSBAQAogewogCXN0cnVjdCBwdF9yZWdzICogY2hpbGRyZWdzOwogCXN0cnVjdCBzd2l0Y2hfc3RhY2sgKiBjaGlsZHN0YWNrLCAqc3RhY2s7Ci0JdW5zaWduZWQgbG9uZyBzdGFja19vZmZzZXQsICpyZXRwOworCXVuc2lnbmVkIGxvbmcgKnJldHA7CiAKLQlzdGFja19vZmZzZXQgPSBUSFJFQURfU0laRSAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncyk7Ci0JY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICgodW5zaWduZWQgbG9uZykgKHAtPnRocmVhZF9pbmZvKSArIHN0YWNrX29mZnNldCk7CisJY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICh0YXNrX3N0YWNrX3BhZ2UocCkgKyBUSFJFQURfU0laRSkgLSAxOwogCiAJKmNoaWxkcmVncyA9ICpyZWdzOwogCWNoaWxkcmVncy0+ZDAgPSAwOwpAQCAtMzg2LDcgKzM4NSw3IEBACiAJaWYgKCFwIHx8IHAgPT0gY3VycmVudCB8fCBwLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCiAJCXJldHVybiAwOwogCi0Jc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKShwLT50aHJlYWRfaW5mbyk7CisJc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKTsKIAlmcCA9ICgoc3RydWN0IHN3aXRjaF9zdGFjayAqKXAtPnRocmVhZC5rc3ApLT5hNjsKIAlkbyB7CiAJCWlmIChmcCA8IHN0YWNrX3BhZ2Urc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykgfHwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXAuYwppbmRleCBkNmNhOTkyLi43NTBkNWIzIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cC5jCkBAIC04NCw5ICs4NCw2IEBACiB2b2lkICgqbWFjaF9oYWx0KSggdm9pZCApOwogdm9pZCAoKm1hY2hfcG93ZXJfb2ZmKSggdm9pZCApOwogbG9uZyBtYWNoX21heF9kbWFfYWRkcmVzcyA9IDB4MDBmZmZmZmY7IC8qIGRlZmF1bHQgc2V0IHRvIHRoZSBsb3dlciAxNk1CICovCi0jaWYgZGVmaW5lZChDT05GSUdfQU1JR0FfRkxPUFBZKSB8fCBkZWZpbmVkKENPTkZJR19BVEFSSV9GTE9QUFkpCi12b2lkICgqbWFjaF9mbG9wcHlfc2V0dXApIChjaGFyICosIGludCAqKSBfX2luaXRkYXRhID0gTlVMTDsKLSNlbmRpZgogI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKIHZvaWQgKCptYWNoX2hlYXJ0YmVhdCkgKGludCk7CiBFWFBPUlRfU1lNQk9MKG1hY2hfaGVhcnRiZWF0KTsKQEAgLTEwMCw2ICs5Nyw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfSVNBKSAmJiBkZWZpbmVkKE1VTFRJX0lTQSkKIGludCBpc2FfdHlwZTsKIGludCBpc2Ffc2V4OworRVhQT1JUX1NZTUJPTChpc2FfdHlwZSk7CitFWFBPUlRfU1lNQk9MKGlzYV9zZXgpOwogI2VuZGlmCiAKIGV4dGVybiBpbnQgYW1pZ2FfcGFyc2VfYm9vdGluZm8oY29uc3Qgc3RydWN0IGJpX3JlY29yZCAqKTsKQEAgLTI4MCw2ICsyNzksMTAgQEAKIAkgICAgfQogCX0KIAorI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCisJY29uc3dpdGNocCA9ICZkdW1teV9jb247CisjZW5kaWYKKwogCXN3aXRjaCAobTY4a19tYWNodHlwZSkgewogI2lmZGVmIENPTkZJR19BTUlHQQogCSAgICBjYXNlIE1BQ0hfQU1JR0E6CkBAIC01MjEsMTYgKzUyNCw2IEBACiAgICAgcmV0dXJuKGxlbik7CiB9CiAKLQotI2lmIGRlZmluZWQoQ09ORklHX0FNSUdBX0ZMT1BQWSkgfHwgZGVmaW5lZChDT05GSUdfQVRBUklfRkxPUFBZKQotdm9pZCBfX2luaXQgZmxvcHB5X3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQotewotCWlmIChtYWNoX2Zsb3BweV9zZXR1cCkKLQkJbWFjaF9mbG9wcHlfc2V0dXAgKHN0ciwgaW50cyk7Ci19Ci0KLSNlbmRpZgotCiB2b2lkIGNoZWNrX2J1Z3Modm9pZCkKIHsKICNpZm5kZWYgQ09ORklHX002OEtGUFVfRU1VCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYwppbmRleCA5YzYzNmE0Li44NjY5MTdiIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMKQEAgLTk2LDcgKzk2LDcgQEAKIGFzbWxpbmthZ2UgaW50CiBkb19ydF9zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXNpZ3NldF90ICp1bmV3c2V0ID0gKHNpZ3NldF90ICopcmVncy0+ZDE7CisJc2lnc2V0X3QgX191c2VyICp1bmV3c2V0ID0gKHNpZ3NldF90IF9fdXNlciAqKXJlZ3MtPmQxOwogCXNpemVfdCBzaWdzZXRzaXplID0gKHNpemVfdClyZWdzLT5kMjsKIAlzaWdzZXRfdCBzYXZlc2V0LCBuZXdzZXQ7CiAKQEAgLTEyMiw4ICsxMjIsOCBAQAogfQogCiBhc21saW5rYWdlIGludAotc3lzX3NpZ2FjdGlvbihpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiAqYWN0LAotCSAgICAgIHN0cnVjdCBvbGRfc2lnYWN0aW9uICpvYWN0KQorc3lzX3NpZ2FjdGlvbihpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKmFjdCwKKwkgICAgICBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKm9hY3QpCiB7CiAJc3RydWN0IGtfc2lnYWN0aW9uIG5ld19rYSwgb2xkX2thOwogCWludCByZXQ7CkBAIC0xNTQsNyArMTU0LDcgQEAKIH0KIAogYXNtbGlua2FnZSBpbnQKLXN5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190ICp1c3MsIHN0YWNrX3QgKnVvc3MpCitzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MpCiB7CiAJcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmR1c3AoKSk7CiB9CkBAIC0xNjksMTAgKzE2OSwxMCBAQAogCiBzdHJ1Y3Qgc2lnZnJhbWUKIHsKLQljaGFyICpwcmV0Y29kZTsKKwljaGFyIF9fdXNlciAqcHJldGNvZGU7CiAJaW50IHNpZzsKIAlpbnQgY29kZTsKLQlzdHJ1Y3Qgc2lnY29udGV4dCAqcHNjOworCXN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqcHNjOwogCWNoYXIgcmV0Y29kZVs4XTsKIAl1bnNpZ25lZCBsb25nIGV4dHJhbWFza1tfTlNJR19XT1JEUy0xXTsKIAlzdHJ1Y3Qgc2lnY29udGV4dCBzYzsKQEAgLTE4MCwxMCArMTgwLDEwIEBACiAKIHN0cnVjdCBydF9zaWdmcmFtZQogewotCWNoYXIgKnByZXRjb2RlOworCWNoYXIgX191c2VyICpwcmV0Y29kZTsKIAlpbnQgc2lnOwotCXN0cnVjdCBzaWdpbmZvICpwaW5mbzsKLQl2b2lkICpwdWM7CisJc3RydWN0IHNpZ2luZm8gX191c2VyICpwaW5mbzsKKwl2b2lkIF9fdXNlciAqcHVjOwogCWNoYXIgcmV0Y29kZVs4XTsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCXN0cnVjdCB1Y29udGV4dCB1YzsKQEAgLTI0OCw3ICsyNDgsNyBAQAogI2RlZmluZSB1Y19mb3JtYXR2ZWMJdWNfZmlsbGVyW0ZQQ09OVEVYVF9TSVpFLzRdCiAjZGVmaW5lIHVjX2V4dHJhCXVjX2ZpbGxlcltGUENPTlRFWFRfU0laRS80KzFdCiAKLXN0YXRpYyBpbmxpbmUgaW50IHJ0X3Jlc3RvcmVfZnB1X3N0YXRlKHN0cnVjdCB1Y29udGV4dCAqdWMpCitzdGF0aWMgaW5saW5lIGludCBydF9yZXN0b3JlX2ZwdV9zdGF0ZShzdHJ1Y3QgdWNvbnRleHQgX191c2VyICp1YykKIHsKIAl1bnNpZ25lZCBjaGFyIGZwc3RhdGVbRlBDT05URVhUX1NJWkVdOwogCWludCBjb250ZXh0X3NpemUgPSBDUFVfSVNfMDYwID8gOCA6IDA7CkBAIC0yNjcsNyArMjY3LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKF9fZ2V0X3VzZXIoKihsb25nICopZnBzdGF0ZSwgKGxvbmcgKikmdWMtPnVjX2Zwc3RhdGUpKQorCWlmIChfX2dldF91c2VyKCoobG9uZyAqKWZwc3RhdGUsIChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSkpCiAJCWdvdG8gb3V0OwogCWlmIChDUFVfSVNfMDYwID8gZnBzdGF0ZVsyXSA6IGZwc3RhdGVbMF0pIHsKIAkJaWYgKCFDUFVfSVNfMDYwKQpAQCAtMzA2LDcgKzMwNiw3IEBACiAJCQkJICAgICJtIiAoKmZwcmVncy5mX2ZwY250bCkpOwogCX0KIAlpZiAoY29udGV4dF9zaXplICYmCi0JICAgIF9fY29weV9mcm9tX3VzZXIoZnBzdGF0ZSArIDQsIChsb25nICopJnVjLT51Y19mcHN0YXRlICsgMSwKKwkgICAgX19jb3B5X2Zyb21fdXNlcihmcHN0YXRlICsgNCwgKGxvbmcgX191c2VyICopJnVjLT51Y19mcHN0YXRlICsgMSwKIAkJCSAgICAgY29udGV4dF9zaXplKSkKIAkJZ290byBvdXQ7CiAJX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCkBAIC0zMTksNyArMzE5LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLXJlc3RvcmVfc2lnY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHNpZ2NvbnRleHQgKnVzYywgdm9pZCAqZnAsCityZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqdXNjLCB2b2lkIF9fdXNlciAqZnAsCiAJCSAgIGludCAqcGQwKQogewogCWludCBmc2l6ZSwgZm9ybWF0dmVjOwpAQCAtNDA0LDEwICs0MDQsMTAgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIHJ0X3Jlc3RvcmVfdWNvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3LAotCQkgICAgc3RydWN0IHVjb250ZXh0ICp1YywgaW50ICpwZDApCisJCSAgICBzdHJ1Y3QgdWNvbnRleHQgX191c2VyICp1YywgaW50ICpwZDApCiB7CiAJaW50IGZzaXplLCB0ZW1wOwotCWdyZWdfdCAqZ3JlZ3MgPSB1Yy0+dWNfbWNvbnRleHQuZ3JlZ3M7CisJZ3JlZ190IF9fdXNlciAqZ3JlZ3MgPSB1Yy0+dWNfbWNvbnRleHQuZ3JlZ3M7CiAJdW5zaWduZWQgbG9uZyB1c3A7CiAJaW50IGVycjsKIApAQCAtNTA2LDcgKzUwNiw3IEBACiAJc3RydWN0IHN3aXRjaF9zdGFjayAqc3cgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKSAmX191bnVzZWQ7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKHN3ICsgMSk7CiAJdW5zaWduZWQgbG9uZyB1c3AgPSByZHVzcCgpOwotCXN0cnVjdCBzaWdmcmFtZSAqZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lICopKHVzcCAtIDQpOworCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gKHN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKikodXNwIC0gNCk7CiAJc2lnc2V0X3Qgc2V0OwogCWludCBkMDsKIApAQCAtNTM2LDcgKzUzNiw3IEBACiAJc3RydWN0IHN3aXRjaF9zdGFjayAqc3cgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKSAmX191bnVzZWQ7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKHN3ICsgMSk7CiAJdW5zaWduZWQgbG9uZyB1c3AgPSByZHVzcCgpOwotCXN0cnVjdCBydF9zaWdmcmFtZSAqZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lICopKHVzcCAtIDQpOworCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikodXNwIC0gNCk7CiAJc2lnc2V0X3Qgc2V0OwogCWludCBkMDsKIApAQCAtNTk2LDcgKzU5Niw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIGludCBydF9zYXZlX2ZwdV9zdGF0ZShzdHJ1Y3QgdWNvbnRleHQgKnVjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbmxpbmUgaW50IHJ0X3NhdmVfZnB1X3N0YXRlKHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBjaGFyIGZwc3RhdGVbRlBDT05URVhUX1NJWkVdOwogCWludCBjb250ZXh0X3NpemUgPSBDUFVfSVNfMDYwID8gOCA6IDA7CkBAIC02MTcsNyArNjE3LDcgQEAKIAkJCSAgIi5jaGlwIDY4ayIKIAkJCSAgOiA6ICJtIiAoKmZwc3RhdGUpIDogIm1lbW9yeSIpOwogCi0JZXJyIHw9IF9fcHV0X3VzZXIoKihsb25nICopZnBzdGF0ZSwgKGxvbmcgKikmdWMtPnVjX2Zwc3RhdGUpOworCWVyciB8PSBfX3B1dF91c2VyKCoobG9uZyAqKWZwc3RhdGUsIChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSk7CiAJaWYgKENQVV9JU18wNjAgPyBmcHN0YXRlWzJdIDogZnBzdGF0ZVswXSkgewogCQlmcHJlZ3NldF90IGZwcmVnczsKIAkJaWYgKCFDUFVfSVNfMDYwKQpAQCAtNjQyLDcgKzY0Miw3IEBACiAJCQkJICAgIHNpemVvZihmcHJlZ3MpKTsKIAl9CiAJaWYgKGNvbnRleHRfc2l6ZSkKLQkJZXJyIHw9IGNvcHlfdG9fdXNlcigobG9uZyAqKSZ1Yy0+dWNfZnBzdGF0ZSArIDEsIGZwc3RhdGUgKyA0LAorCQllcnIgfD0gY29weV90b191c2VyKChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSArIDEsIGZwc3RhdGUgKyA0LAogCQkJCSAgICBjb250ZXh0X3NpemUpOwogCXJldHVybiBlcnI7CiB9CkBAIC02NjIsMTAgKzY2MiwxMCBAQAogCXNhdmVfZnB1X3N0YXRlKHNjLCByZWdzKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcnRfc2V0dXBfdWNvbnRleHQoc3RydWN0IHVjb250ZXh0ICp1Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW5saW5lIGludCBydF9zZXR1cF91Y29udGV4dChzdHJ1Y3QgdWNvbnRleHQgX191c2VyICp1Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHN3aXRjaF9zdGFjayAqc3cgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKXJlZ3MgLSAxOwotCWdyZWdfdCAqZ3JlZ3MgPSB1Yy0+dWNfbWNvbnRleHQuZ3JlZ3M7CisJZ3JlZ190IF9fdXNlciAqZ3JlZ3MgPSB1Yy0+dWNfbWNvbnRleHQuZ3JlZ3M7CiAJaW50IGVyciA9IDA7CiAKIAllcnIgfD0gX19wdXRfdXNlcihNQ09OVEVYVF9WRVJTSU9OLCAmdWMtPnVjX21jb250ZXh0LnZlcnNpb24pOwpAQCAtNzUzLDcgKzc1Myw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKgorc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqCiBnZXRfc2lnZnJhbWUoc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHNpemVfdCBmcmFtZV9zaXplKQogewogCXVuc2lnbmVkIGxvbmcgdXNwOwpAQCAtNzY2LDEzICs3NjYsMTMgQEAKIAkJaWYgKCFvbl9zaWdfc3RhY2sodXNwKSkKIAkJCXVzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOwogCX0KLQlyZXR1cm4gKHZvaWQgKikoKHVzcCAtIGZyYW1lX3NpemUpICYgLThVTCk7CisJcmV0dXJuICh2b2lkIF9fdXNlciAqKSgodXNwIC0gZnJhbWVfc2l6ZSkgJiAtOFVMKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0dXBfZnJhbWUgKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCiAJCQkgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHNpZ2ZyYW1lICpmcmFtZTsKKwlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZTsKIAlpbnQgZnNpemUgPSBmcmFtZV9leHRyYV9zaXplc1tyZWdzLT5mb3JtYXRdOwogCXN0cnVjdCBzaWdjb250ZXh0IGNvbnRleHQ7CiAJaW50IGVyciA9IDA7CkBAIC04MTMsNyArODEzLDcgQEAKIAllcnIgfD0gX19wdXRfdXNlcihmcmFtZS0+cmV0Y29kZSwgJmZyYW1lLT5wcmV0Y29kZSk7CiAJLyogbW92ZXEgIyxkMDsgdHJhcCAjMCAqLwogCWVyciB8PSBfX3B1dF91c2VyKDB4NzAwMDRlNDAgKyAoX19OUl9zaWdyZXR1cm4gPDwgMTYpLAotCQkJICAobG9uZyAqKShmcmFtZS0+cmV0Y29kZSkpOworCQkJICAobG9uZyBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUpKTsKIAogCWlmIChlcnIpCiAJCWdvdG8gZ2l2ZV9zaWdzZWd2OwpAQCAtODQ5LDcgKzg0OSw3IEBACiBzdGF0aWMgdm9pZCBzZXR1cF9ydF9mcmFtZSAoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAogCQkJICAgIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBydF9zaWdmcmFtZSAqZnJhbWU7CisJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CiAJaW50IGZzaXplID0gZnJhbWVfZXh0cmFfc2l6ZXNbcmVncy0+Zm9ybWF0XTsKIAlpbnQgZXJyID0gMDsKIApAQCAtODgwLDggKzg4MCw4IEBACiAKIAkvKiBDcmVhdGUgdGhlIHVjb250ZXh0LiAgKi8KIAllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKLQllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2xpbmspOwotCWVyciB8PSBfX3B1dF91c2VyKCh2b2lkICopY3VycmVudC0+c2FzX3NzX3NwLAorCWVyciB8PSBfX3B1dF91c2VyKE5VTEwsICZmcmFtZS0+dWMudWNfbGluayk7CisJZXJyIHw9IF9fcHV0X3VzZXIoKHZvaWQgX191c2VyICopY3VycmVudC0+c2FzX3NzX3NwLAogCQkJICAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NwKTsKIAllcnIgfD0gX19wdXRfdXNlcihzYXNfc3NfZmxhZ3MocmR1c3AoKSksCiAJCQkgICZmcmFtZS0+dWMudWNfc3RhY2suc3NfZmxhZ3MpOwpAQCAtODkzLDggKzg5Myw4IEBACiAJZXJyIHw9IF9fcHV0X3VzZXIoZnJhbWUtPnJldGNvZGUsICZmcmFtZS0+cHJldGNvZGUpOwogCS8qIG1vdmVxICMsZDA7IG5vdGIgZDA7IHRyYXAgIzAgKi8KIAllcnIgfD0gX19wdXRfdXNlcigweDcwMDA0NjAwICsgKChfX05SX3J0X3NpZ3JldHVybiBeIDB4ZmYpIDw8IDE2KSwKLQkJCSAgKGxvbmcgKikoZnJhbWUtPnJldGNvZGUgKyAwKSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoMHg0ZTQwLCAoc2hvcnQgKikoZnJhbWUtPnJldGNvZGUgKyA0KSk7CisJCQkgIChsb25nIF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSArIDApKTsKKwllcnIgfD0gX19wdXRfdXNlcigweDRlNDAsIChzaG9ydCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUgKyA0KSk7CiAKIAlpZiAoZXJyKQogCQlnb3RvIGdpdmVfc2lnc2VndjsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc3lzX202OGsuYyBiL2FyY2gvbTY4ay9rZXJuZWwvc3lzX202OGsuYwppbmRleCA2NDA4OTViLi4xNDNjNTUyIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3N5c19tNjhrLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zeXNfbTY4ay5jCkBAIC0zMiw3ICszMiw3IEBACiAgKiBzeXNfcGlwZSgpIGlzIHRoZSBub3JtYWwgQyBjYWxsaW5nIHN0YW5kYXJkIGZvciBjcmVhdGluZwogICogYSBwaXBlLiBJdCdzIG5vdCB0aGUgd2F5IHVuaXggdHJhZGl0aW9uYWxseSBkb2VzIHRoaXMsIHRob3VnaC4KICAqLwotYXNtbGlua2FnZSBpbnQgc3lzX3BpcGUodW5zaWduZWQgbG9uZyAqIGZpbGRlcykKK2FzbWxpbmthZ2UgaW50IHN5c19waXBlKHVuc2lnbmVkIGxvbmcgX191c2VyICogZmlsZGVzKQogewogCWludCBmZFsyXTsKIAlpbnQgZXJyb3I7CkBAIC05NCw3ICs5NCw3IEBACiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiB9OwogCi1hc21saW5rYWdlIGludCBvbGRfbW1hcChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0ICphcmcpCithc21saW5rYWdlIGludCBvbGRfbW1hcChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IF9fdXNlciAqYXJnKQogewogCXN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgYTsKIAlpbnQgZXJyb3IgPSAtRUZBVUxUOwpAQCAtMTYwLDExICsxNjAsMTEgQEAKIAogc3RydWN0IHNlbF9hcmdfc3RydWN0IHsKIAl1bnNpZ25lZCBsb25nIG47Ci0JZmRfc2V0ICppbnAsICpvdXRwLCAqZXhwOwotCXN0cnVjdCB0aW1ldmFsICp0dnA7CisJZmRfc2V0IF9fdXNlciAqaW5wLCAqb3V0cCwgKmV4cDsKKwlzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKnR2cDsKIH07CiAKLWFzbWxpbmthZ2UgaW50IG9sZF9zZWxlY3Qoc3RydWN0IHNlbF9hcmdfc3RydWN0ICphcmcpCithc21saW5rYWdlIGludCBvbGRfc2VsZWN0KHN0cnVjdCBzZWxfYXJnX3N0cnVjdCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgYTsKIApAQCAtMTgwLDcgKzE4MCw3IEBACiAgKiBUaGlzIGlzIHJlYWxseSBob3JyaWJseSB1Z2x5LgogICovCiBhc21saW5rYWdlIGludCBzeXNfaXBjICh1aW50IGNhbGwsIGludCBmaXJzdCwgaW50IHNlY29uZCwKLQkJCWludCB0aGlyZCwgdm9pZCAqcHRyLCBsb25nIGZpZnRoKQorCQkJaW50IHRoaXJkLCB2b2lkIF9fdXNlciAqcHRyLCBsb25nIGZpZnRoKQogewogCWludCB2ZXJzaW9uLCByZXQ7CiAKQEAgLTE5MCwxNCArMTkwLDE0IEBACiAJaWYgKGNhbGwgPD0gU0VNQ1RMKQogCQlzd2l0Y2ggKGNhbGwpIHsKIAkJY2FzZSBTRU1PUDoKLQkJCXJldHVybiBzeXNfc2Vtb3AgKGZpcnN0LCAoc3RydWN0IHNlbWJ1ZiAqKXB0ciwgc2Vjb25kKTsKKwkJCXJldHVybiBzeXNfc2Vtb3AgKGZpcnN0LCBwdHIsIHNlY29uZCk7CiAJCWNhc2UgU0VNR0VUOgogCQkJcmV0dXJuIHN5c19zZW1nZXQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkKTsKIAkJY2FzZSBTRU1DVEw6IHsKIAkJCXVuaW9uIHNlbXVuIGZvdXJ0aDsKIAkJCWlmICghcHRyKQogCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKGdldF91c2VyKGZvdXJ0aC5fX3BhZCwgKHZvaWQgKiopIHB0cikpCisJCQlpZiAoZ2V0X3VzZXIoZm91cnRoLl9fcGFkLCAodm9pZCBfX3VzZXIgKl9fdXNlciAqKSBwdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJcmV0dXJuIHN5c19zZW1jdGwgKGZpcnN0LCBzZWNvbmQsIHRoaXJkLCBmb3VydGgpOwogCQkJfQpAQCAtMjA3LDMxICsyMDcsMjYgQEAKIAlpZiAoY2FsbCA8PSBNU0dDVEwpCiAJCXN3aXRjaCAoY2FsbCkgewogCQljYXNlIE1TR1NORDoKLQkJCXJldHVybiBzeXNfbXNnc25kIChmaXJzdCwgKHN0cnVjdCBtc2didWYgKikgcHRyLAotCQkJCQkgIHNlY29uZCwgdGhpcmQpOworCQkJcmV0dXJuIHN5c19tc2dzbmQgKGZpcnN0LCBwdHIsIHNlY29uZCwgdGhpcmQpOwogCQljYXNlIE1TR1JDVjoKIAkJCXN3aXRjaCAodmVyc2lvbikgewogCQkJY2FzZSAwOiB7CiAJCQkJc3RydWN0IGlwY19rbHVkZ2UgdG1wOwogCQkJCWlmICghcHRyKQogCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIgKCZ0bXAsCi0JCQkJCQkgICAgKHN0cnVjdCBpcGNfa2x1ZGdlICopcHRyLAotCQkJCQkJICAgIHNpemVvZiAodG1wKSkpCisJCQkJaWYgKGNvcHlfZnJvbV91c2VyICgmdG1wLCBwdHIsIHNpemVvZiAodG1wKSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCXJldHVybiBzeXNfbXNncmN2IChmaXJzdCwgdG1wLm1zZ3AsIHNlY29uZCwKIAkJCQkJCSAgIHRtcC5tc2d0eXAsIHRoaXJkKTsKIAkJCQl9CiAJCQlkZWZhdWx0OgotCQkJCXJldHVybiBzeXNfbXNncmN2IChmaXJzdCwKLQkJCQkJCSAgIChzdHJ1Y3QgbXNnYnVmICopIHB0ciwKKwkJCQlyZXR1cm4gc3lzX21zZ3JjdiAoZmlyc3QsIHB0ciwKIAkJCQkJCSAgIHNlY29uZCwgZmlmdGgsIHRoaXJkKTsKIAkJCX0KIAkJY2FzZSBNU0dHRVQ6CiAJCQlyZXR1cm4gc3lzX21zZ2dldCAoKGtleV90KSBmaXJzdCwgc2Vjb25kKTsKIAkJY2FzZSBNU0dDVEw6Ci0JCQlyZXR1cm4gc3lzX21zZ2N0bCAoZmlyc3QsIHNlY29uZCwKLQkJCQkJICAgKHN0cnVjdCBtc3FpZF9kcyAqKSBwdHIpOworCQkJcmV0dXJuIHN5c19tc2djdGwgKGZpcnN0LCBzZWNvbmQsIHB0cik7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVOT1NZUzsKIAkJfQpAQCAtMjQxLDIwICsyMzYsMTggQEAKIAkJCXN3aXRjaCAodmVyc2lvbikgewogCQkJZGVmYXVsdDogewogCQkJCXVsb25nIHJhZGRyOwotCQkJCXJldCA9IGRvX3NobWF0IChmaXJzdCwgKGNoYXIgKikgcHRyLAotCQkJCQkJIHNlY29uZCwgJnJhZGRyKTsKKwkJCQlyZXQgPSBkb19zaG1hdCAoZmlyc3QsIHB0ciwgc2Vjb25kLCAmcmFkZHIpOwogCQkJCWlmIChyZXQpCiAJCQkJCXJldHVybiByZXQ7Ci0JCQkJcmV0dXJuIHB1dF91c2VyIChyYWRkciwgKHVsb25nICopIHRoaXJkKTsKKwkJCQlyZXR1cm4gcHV0X3VzZXIgKHJhZGRyLCAodWxvbmcgX191c2VyICopIHRoaXJkKTsKIAkJCX0KIAkJCX0KIAkJY2FzZSBTSE1EVDoKLQkJCXJldHVybiBzeXNfc2htZHQgKChjaGFyICopcHRyKTsKKwkJCXJldHVybiBzeXNfc2htZHQgKHB0cik7CiAJCWNhc2UgU0hNR0VUOgogCQkJcmV0dXJuIHN5c19zaG1nZXQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkKTsKIAkJY2FzZSBTSE1DVEw6Ci0JCQlyZXR1cm4gc3lzX3NobWN0bCAoZmlyc3QsIHNlY29uZCwKLQkJCQkJICAgKHN0cnVjdCBzaG1pZF9kcyAqKSBwdHIpOworCQkJcmV0dXJuIHN5c19zaG1jdGwgKGZpcnN0LCBzZWNvbmQsIHB0cik7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVOT1NZUzsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCmluZGV4IGRlYjM2ZTguLmNkZjU4ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKQEAgLTE2OSwyNSArMTY5LDI1IEBACiAKIAlpZiAoQ1BVX0lTXzA2MCAmJiAhRlBVX0lTX0VNVSkgewogCQkvKiBzZXQgdXAgSUZQU1AgZW50cnkgcG9pbnRzICovCi0JCWFzbWxpbmthZ2Ugdm9pZCBzbmFuX3ZlYyh2b2lkKSBhc20gKCJfMDYwX2Zwc3Bfc25hbiIpOwotCQlhc21saW5rYWdlIHZvaWQgb3BlcnJfdmVjKHZvaWQpIGFzbSAoIl8wNjBfZnBzcF9vcGVyciIpOwotCQlhc21saW5rYWdlIHZvaWQgb3ZmbF92ZWModm9pZCkgYXNtICgiXzA2MF9mcHNwX292ZmwiKTsKLQkJYXNtbGlua2FnZSB2b2lkIHVuZmxfdmVjKHZvaWQpIGFzbSAoIl8wNjBfZnBzcF91bmZsIik7Ci0JCWFzbWxpbmthZ2Ugdm9pZCBkel92ZWModm9pZCkgYXNtICgiXzA2MF9mcHNwX2R6Iik7Ci0JCWFzbWxpbmthZ2Ugdm9pZCBpbmV4X3ZlYyh2b2lkKSBhc20gKCJfMDYwX2Zwc3BfaW5leCIpOwotCQlhc21saW5rYWdlIHZvaWQgZmxpbmVfdmVjKHZvaWQpIGFzbSAoIl8wNjBfZnBzcF9mbGluZSIpOwotCQlhc21saW5rYWdlIHZvaWQgdW5zdXBwX3ZlYyh2b2lkKSBhc20gKCJfMDYwX2Zwc3BfdW5zdXBwIik7Ci0JCWFzbWxpbmthZ2Ugdm9pZCBlZmZhZGRfdmVjKHZvaWQpIGFzbSAoIl8wNjBfZnBzcF9lZmZhZGQiKTsKKwkJYXNtbGlua2FnZSB2b2lkIHNuYW5fdmVjNih2b2lkKSBhc20gKCJfMDYwX2Zwc3Bfc25hbiIpOworCQlhc21saW5rYWdlIHZvaWQgb3BlcnJfdmVjNih2b2lkKSBhc20gKCJfMDYwX2Zwc3Bfb3BlcnIiKTsKKwkJYXNtbGlua2FnZSB2b2lkIG92ZmxfdmVjNih2b2lkKSBhc20gKCJfMDYwX2Zwc3Bfb3ZmbCIpOworCQlhc21saW5rYWdlIHZvaWQgdW5mbF92ZWM2KHZvaWQpIGFzbSAoIl8wNjBfZnBzcF91bmZsIik7CisJCWFzbWxpbmthZ2Ugdm9pZCBkel92ZWM2KHZvaWQpIGFzbSAoIl8wNjBfZnBzcF9keiIpOworCQlhc21saW5rYWdlIHZvaWQgaW5leF92ZWM2KHZvaWQpIGFzbSAoIl8wNjBfZnBzcF9pbmV4Iik7CisJCWFzbWxpbmthZ2Ugdm9pZCBmbGluZV92ZWM2KHZvaWQpIGFzbSAoIl8wNjBfZnBzcF9mbGluZSIpOworCQlhc21saW5rYWdlIHZvaWQgdW5zdXBwX3ZlYzYodm9pZCkgYXNtICgiXzA2MF9mcHNwX3Vuc3VwcCIpOworCQlhc21saW5rYWdlIHZvaWQgZWZmYWRkX3ZlYzYodm9pZCkgYXNtICgiXzA2MF9mcHNwX2VmZmFkZCIpOwogCi0JCXZlY3RvcnNbVkVDX0ZQTkFOXSA9IHNuYW5fdmVjOwotCQl2ZWN0b3JzW1ZFQ19GUE9FXSA9IG9wZXJyX3ZlYzsKLQkJdmVjdG9yc1tWRUNfRlBPVkVSXSA9IG92ZmxfdmVjOwotCQl2ZWN0b3JzW1ZFQ19GUFVOREVSXSA9IHVuZmxfdmVjOwotCQl2ZWN0b3JzW1ZFQ19GUERJVlpdID0gZHpfdmVjOwotCQl2ZWN0b3JzW1ZFQ19GUElSXSA9IGluZXhfdmVjOwotCQl2ZWN0b3JzW1ZFQ19MSU5FMTFdID0gZmxpbmVfdmVjOwotCQl2ZWN0b3JzW1ZFQ19GUFVOU1VQXSA9IHVuc3VwcF92ZWM7Ci0JCXZlY3RvcnNbVkVDX1VOSU1QRUFdID0gZWZmYWRkX3ZlYzsKKwkJdmVjdG9yc1tWRUNfRlBOQU5dID0gc25hbl92ZWM2OworCQl2ZWN0b3JzW1ZFQ19GUE9FXSA9IG9wZXJyX3ZlYzY7CisJCXZlY3RvcnNbVkVDX0ZQT1ZFUl0gPSBvdmZsX3ZlYzY7CisJCXZlY3RvcnNbVkVDX0ZQVU5ERVJdID0gdW5mbF92ZWM2OworCQl2ZWN0b3JzW1ZFQ19GUERJVlpdID0gZHpfdmVjNjsKKwkJdmVjdG9yc1tWRUNfRlBJUl0gPSBpbmV4X3ZlYzY7CisJCXZlY3RvcnNbVkVDX0xJTkUxMV0gPSBmbGluZV92ZWM2OworCQl2ZWN0b3JzW1ZFQ19GUFVOU1VQXSA9IHVuc3VwcF92ZWM2OworCQl2ZWN0b3JzW1ZFQ19VTklNUEVBXSA9IGVmZmFkZF92ZWM2OwogCX0KIAogICAgICAgICAvKiBpZiBydW5uaW5nIG9uIGFuIGFtaWdhLCBtYWtlIHRoZSBOTUkgaW50ZXJydXB0IGRvIG5vdGhpbmcgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC1zdGQubGRzIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN0ZC5sZHMKaW5kZXggZTU4NjU0Zi4uNjlkMWQzZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN0ZC5sZHMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN0ZC5sZHMKQEAgLTEzLDYgKzEzLDcgQEAKICAgLnRleHQgOiB7CiAJKigudGV4dCkKIAlTQ0hFRF9URVhUCisJTE9DS19URVhUCiAJKiguZml4dXApCiAJKiguZ251Lndhcm5pbmcpCiAJfSA6dGV4dCA9IDB4NGU3NQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN1bjMubGRzIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN1bjMubGRzCmluZGV4IGNjMzdlOGQuLjY1Y2MzOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC1zdW4zLmxkcworKysgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3VuMy5sZHMKQEAgLTE0LDYgKzE0LDcgQEAKIAkqKC5oZWFkKQogCSooLnRleHQpCiAJU0NIRURfVEVYVAorCUxPQ0tfVEVYVAogCSooLmZpeHVwKQogCSooLmdudS53YXJuaW5nKQogCX0gOnRleHQgPSAweDRlNzUKQEAgLTY2LDcgKzY3LDcgQEAKIAlfX2luaXRyYW1mc19lbmQgPSAuOwogCS4gPSBBTElHTig4MTkyKTsKIAlfX2luaXRfZW5kID0gLjsKLQkuaW5pdC50YXNrIDogeyAqKGluaXRfdGFzaykgfQorCS5kYXRhLmluaXQudGFzayA6IHsgKiguZGF0YS5pbml0X3Rhc2spIH0KIAogCiAgIC5ic3MgOiB7ICooLmJzcykgfQkJLyogQlNTICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMgYi9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMKaW5kZXggNGE1YzU0NC4uY2IxM2M2ZSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvbTY4ay9saWIvY2hlY2tzdW0uYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAgKi8KIAogdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAogCQkJICAgIGludCBsZW4sIGludCBzdW0sIGludCAqY3N1bV9lcnIpCiB7CiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMgYi9hcmNoL202OGsvbWFjL2NvbmZpZy5jCmluZGV4IGNkMTljYmIuLjE0ZjhkM2Y0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMKQEAgLTIxMiw5ICsyMTIsNiBAQAogCW1hY2hfcmVzZXQgICAgICAgICAgID0gbWFjX3Jlc2V0OwogCW1hY2hfaGFsdCAgICAgICAgICAgID0gbWFjX3Bvd2Vyb2ZmOwogCW1hY2hfcG93ZXJfb2ZmICAgICAgID0gbWFjX3Bvd2Vyb2ZmOwotI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCi0JY29uc3dpdGNocAkgICAgICAgICA9ICZkdW1teV9jb247Ci0jZW5kaWYKIAltYWNoX21heF9kbWFfYWRkcmVzcyA9IDB4ZmZmZmZmZmY7CiAjaWYgMAogCW1hY2hfZGVidWdfaW5pdAkgPSBtYWNfZGVidWdfaW5pdDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvaW9wLmMgYi9hcmNoL202OGsvbWFjL2lvcC5jCmluZGV4IGQ4ODliYTguLjkxNzlhMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvaW9wLmMKKysrIGIvYXJjaC9tNjhrL21hYy9pb3AuYwpAQCAtMjkzLDggKzI5Myw4IEBACiAJfQogCiAJZm9yIChpID0gMCA7IGkgPCBOVU1fSU9QX0NIQU4gOyBpKyspIHsKLQkJaW9wX3NlbmRfcXVldWVbSU9QX05VTV9TQ0NdW2ldID0gMDsKLQkJaW9wX3NlbmRfcXVldWVbSU9QX05VTV9JU01dW2ldID0gMDsKKwkJaW9wX3NlbmRfcXVldWVbSU9QX05VTV9TQ0NdW2ldID0gTlVMTDsKKwkJaW9wX3NlbmRfcXVldWVbSU9QX05VTV9JU01dW2ldID0gTlVMTDsKIAkJaW9wX2xpc3RlbmVyc1tJT1BfTlVNX1NDQ11baV0uZGV2bmFtZSA9IE5VTEw7CiAJCWlvcF9saXN0ZW5lcnNbSU9QX05VTV9TQ0NdW2ldLmhhbmRsZXIgPSBOVUxMOwogCQlpb3BfbGlzdGVuZXJzW0lPUF9OVU1fSVNNXVtpXS5kZXZuYW1lID0gTlVMTDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvbWlzYy5jIGIvYXJjaC9tNjhrL21hYy9taXNjLmMKaW5kZXggNWI4MGQ3Yy4uYmJiMGMzYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9taXNjLmMKKysrIGIvYXJjaC9tNjhrL21hYy9taXNjLmMKQEAgLTM5LDcyICszOSwxNjMgQEAKIGV4dGVybiBzdHJ1Y3QgbWFjX2Jvb3Rlcl9kYXRhIG1hY19iaV9kYXRhOwogc3RhdGljIHZvaWQgKCpyb21fcmVzZXQpKHZvaWQpOwogCi0jaWZkZWYgQ09ORklHX0FEQgotLyoKLSAqIFJldHVybiB0aGUgY3VycmVudCB0aW1lIGFzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5MDQuCi0gKi8KLQotc3RhdGljIGxvbmcgYWRiX3JlYWRfdGltZSh2b2lkKQorI2lmZGVmIENPTkZJR19BREJfQ1VEQQorc3RhdGljIGxvbmcgY3VkYV9yZWFkX3RpbWUodm9pZCkKIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CiAJbG9uZyB0aW1lOwogCi0JYWRiX3JlcXVlc3QoKHN0cnVjdCBhZGJfcmVxdWVzdCAqKSAmcmVxLCBOVUxMLAotCQkJQURCUkVRX1JBV3xBREJSRVFfU1lOQywKLQkJCTIsIENVREFfUEFDS0VULCBDVURBX0dFVF9USU1FKTsKKwlpZiAoY3VkYV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDIsIENVREFfUEFDS0VULCBDVURBX0dFVF9USU1FKSA8IDApCisJCXJldHVybiAwOworCXdoaWxlICghcmVxLmNvbXBsZXRlKQorCQljdWRhX3BvbGwoKTsKIAogCXRpbWUgPSAocmVxLnJlcGx5WzNdIDw8IDI0KSB8IChyZXEucmVwbHlbNF0gPDwgMTYpCiAJCXwgKHJlcS5yZXBseVs1XSA8PCA4KSB8IHJlcS5yZXBseVs2XTsKIAlyZXR1cm4gdGltZSAtIFJUQ19PRkZTRVQ7CiB9CiAKLS8qCi0gKiBTZXQgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUKLSAqLwotCi1zdGF0aWMgdm9pZCBhZGJfd3JpdGVfdGltZShsb25nIGRhdGEpCitzdGF0aWMgdm9pZCBjdWRhX3dyaXRlX3RpbWUobG9uZyBkYXRhKQogewotCXZvbGF0aWxlIHN0cnVjdCBhZGJfcmVxdWVzdCByZXE7Ci0KKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOwogCWRhdGEgKz0gUlRDX09GRlNFVDsKKwlpZiAoY3VkYV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDYsIENVREFfUEFDS0VULCBDVURBX1NFVF9USU1FLAorCQkJKGRhdGEgPj4gMjQpICYgMHhGRiwgKGRhdGEgPj4gMTYpICYgMHhGRiwKKwkJCShkYXRhID4+IDgpICYgMHhGRiwgZGF0YSAmIDB4RkYpIDwgMCkKKwkJcmV0dXJuOworCXdoaWxlICghcmVxLmNvbXBsZXRlKQorCQljdWRhX3BvbGwoKTsKK30KIAotCWFkYl9yZXF1ZXN0KChzdHJ1Y3QgYWRiX3JlcXVlc3QgKikgJnJlcSwgTlVMTCwKLQkJCUFEQlJFUV9SQVd8QURCUkVRX1NZTkMsCi0JCQk2LCBDVURBX1BBQ0tFVCwgQ1VEQV9TRVRfVElNRSwKK3N0YXRpYyBfX3U4IGN1ZGFfcmVhZF9wcmFtKGludCBvZmZzZXQpCit7CisJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKwlpZiAoY3VkYV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDQsIENVREFfUEFDS0VULCBDVURBX0dFVF9QUkFNLAorCQkJKG9mZnNldCA+PiA4KSAmIDB4RkYsIG9mZnNldCAmIDB4RkYpIDwgMCkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKCFyZXEuY29tcGxldGUpCisJCWN1ZGFfcG9sbCgpOworCXJldHVybiByZXEucmVwbHlbM107Cit9CisKK3N0YXRpYyB2b2lkIGN1ZGFfd3JpdGVfcHJhbShpbnQgb2Zmc2V0LCBfX3U4IGRhdGEpCit7CisJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKwlpZiAoY3VkYV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDUsIENVREFfUEFDS0VULCBDVURBX1NFVF9QUkFNLAorCQkJKG9mZnNldCA+PiA4KSAmIDB4RkYsIG9mZnNldCAmIDB4RkYsIGRhdGEpIDwgMCkKKwkJcmV0dXJuOworCXdoaWxlICghcmVxLmNvbXBsZXRlKQorCQljdWRhX3BvbGwoKTsKK30KKyNlbHNlCisjZGVmaW5lIGN1ZGFfcmVhZF90aW1lKCkgMAorI2RlZmluZSBjdWRhX3dyaXRlX3RpbWUobikKKyNkZWZpbmUgY3VkYV9yZWFkX3ByYW0gTlVMTAorI2RlZmluZSBjdWRhX3dyaXRlX3ByYW0gTlVMTAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQURCX1BNVTY4Sworc3RhdGljIGxvbmcgcG11X3JlYWRfdGltZSh2b2lkKQoreworCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CisJbG9uZyB0aW1lOworCisJaWYgKHBtdV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDEsIFBNVV9SRUFEX1JUQykgPCAwKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoIXJlcS5jb21wbGV0ZSkKKwkJcG11X3BvbGwoKTsKKworCXRpbWUgPSAocmVxLnJlcGx5WzBdIDw8IDI0KSB8IChyZXEucmVwbHlbMV0gPDwgMTYpCisJCXwgKHJlcS5yZXBseVsyXSA8PCA4KSB8IHJlcS5yZXBseVszXTsKKwlyZXR1cm4gdGltZSAtIFJUQ19PRkZTRVQ7Cit9CisKK3N0YXRpYyB2b2lkIHBtdV93cml0ZV90aW1lKGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCWRhdGEgKz0gUlRDX09GRlNFVDsKKwlpZiAocG11X3JlcXVlc3QoJnJlcSwgTlVMTCwgNSwgUE1VX1NFVF9SVEMsCisJCQkoZGF0YSA+PiAyNCkgJiAweEZGLCAoZGF0YSA+PiAxNikgJiAweEZGLAorCQkJKGRhdGEgPj4gOCkgJiAweEZGLCBkYXRhICYgMHhGRikgPCAwKQorCQlyZXR1cm47CisJd2hpbGUgKCFyZXEuY29tcGxldGUpCisJCXBtdV9wb2xsKCk7Cit9CisKK3N0YXRpYyBfX3U4IHBtdV9yZWFkX3ByYW0oaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCWlmIChwbXVfcmVxdWVzdCgmcmVxLCBOVUxMLCAzLCBQTVVfUkVBRF9OVlJBTSwKKwkJCShvZmZzZXQgPj4gOCkgJiAweEZGLCBvZmZzZXQgJiAweEZGKSA8IDApCisJCXJldHVybiAwOworCXdoaWxlICghcmVxLmNvbXBsZXRlKQorCQlwbXVfcG9sbCgpOworCXJldHVybiByZXEucmVwbHlbM107Cit9CisKK3N0YXRpYyB2b2lkIHBtdV93cml0ZV9wcmFtKGludCBvZmZzZXQsIF9fdTggZGF0YSkKK3sKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCWlmIChwbXVfcmVxdWVzdCgmcmVxLCBOVUxMLCA0LCBQTVVfV1JJVEVfTlZSQU0sCisJCQkob2Zmc2V0ID4+IDgpICYgMHhGRiwgb2Zmc2V0ICYgMHhGRiwgZGF0YSkgPCAwKQorCQlyZXR1cm47CisJd2hpbGUgKCFyZXEuY29tcGxldGUpCisJCXBtdV9wb2xsKCk7Cit9CisjZWxzZQorI2RlZmluZSBwbXVfcmVhZF90aW1lKCkgMAorI2RlZmluZSBwbXVfd3JpdGVfdGltZShuKQorI2RlZmluZSBwbXVfcmVhZF9wcmFtIE5VTEwKKyNkZWZpbmUgcG11X3dyaXRlX3ByYW0gTlVMTAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQURCX01BQ0lJU0kKK2V4dGVybiBpbnQgbWFjaWlzaV9yZXF1ZXN0KHN0cnVjdCBhZGJfcmVxdWVzdCAqcmVxLAorCQkJdm9pZCAoKmRvbmUpKHN0cnVjdCBhZGJfcmVxdWVzdCAqKSwgaW50IG5ieXRlcywgLi4uKTsKKworc3RhdGljIGxvbmcgbWFjaWlzaV9yZWFkX3RpbWUodm9pZCkKK3sKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCWxvbmcgdGltZTsKKworCWlmIChtYWNpaXNpX3JlcXVlc3QoJnJlcSwgTlVMTCwgMiwgQ1VEQV9QQUNLRVQsIENVREFfR0VUX1RJTUUpKQorCQlyZXR1cm4gMDsKKworCXRpbWUgPSAocmVxLnJlcGx5WzNdIDw8IDI0KSB8IChyZXEucmVwbHlbNF0gPDwgMTYpCisJCXwgKHJlcS5yZXBseVs1XSA8PCA4KSB8IHJlcS5yZXBseVs2XTsKKwlyZXR1cm4gdGltZSAtIFJUQ19PRkZTRVQ7Cit9CisKK3N0YXRpYyB2b2lkIG1hY2lpc2lfd3JpdGVfdGltZShsb25nIGRhdGEpCit7CisJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKwlkYXRhICs9IFJUQ19PRkZTRVQ7CisJbWFjaWlzaV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDYsIENVREFfUEFDS0VULCBDVURBX1NFVF9USU1FLAogCQkJKGRhdGEgPj4gMjQpICYgMHhGRiwgKGRhdGEgPj4gMTYpICYgMHhGRiwKIAkJCShkYXRhID4+IDgpICYgMHhGRiwgZGF0YSAmIDB4RkYpOwogfQogCi0vKgotICogR2V0IGEgYnl0ZSBmcm9tIHRoZSBOVlJBTQotICovCi0KLXN0YXRpYyBfX3U4IGFkYl9yZWFkX3ByYW0oaW50IG9mZnNldCkKK3N0YXRpYyBfX3U4IG1hY2lpc2lfcmVhZF9wcmFtKGludCBvZmZzZXQpCiB7Ci0Jdm9sYXRpbGUgc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKLQotCWFkYl9yZXF1ZXN0KChzdHJ1Y3QgYWRiX3JlcXVlc3QgKikgJnJlcSwgTlVMTCwKLQkJCUFEQlJFUV9SQVd8QURCUkVRX1NZTkMsCi0JCQk0LCBDVURBX1BBQ0tFVCwgQ1VEQV9HRVRfUFJBTSwKLQkJCShvZmZzZXQgPj4gOCkgJiAweEZGLCBvZmZzZXQgJiAweEZGKTsKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCWlmIChtYWNpaXNpX3JlcXVlc3QoJnJlcSwgTlVMTCwgNCwgQ1VEQV9QQUNLRVQsIENVREFfR0VUX1BSQU0sCisJCQkob2Zmc2V0ID4+IDgpICYgMHhGRiwgb2Zmc2V0ICYgMHhGRikpCisJCXJldHVybiAwOwogCXJldHVybiByZXEucmVwbHlbM107CiB9CiAKLS8qCi0gKiBXcml0ZSBhIGJ5dGUgdG8gdGhlIE5WUkFNCi0gKi8KLQotc3RhdGljIHZvaWQgYWRiX3dyaXRlX3ByYW0oaW50IG9mZnNldCwgX191OCBkYXRhKQorc3RhdGljIHZvaWQgbWFjaWlzaV93cml0ZV9wcmFtKGludCBvZmZzZXQsIF9fdTggZGF0YSkKIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOwotCi0JYWRiX3JlcXVlc3QoKHN0cnVjdCBhZGJfcmVxdWVzdCAqKSAmcmVxLCBOVUxMLAotCQkJQURCUkVRX1JBV3xBREJSRVFfU1lOQywKLQkJCTUsIENVREFfUEFDS0VULCBDVURBX1NFVF9QUkFNLAotCQkJKG9mZnNldCA+PiA4KSAmIDB4RkYsIG9mZnNldCAmIDB4RkYsCi0JCQlkYXRhKTsKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCW1hY2lpc2lfcmVxdWVzdCgmcmVxLCBOVUxMLCA1LCBDVURBX1BBQ0tFVCwgQ1VEQV9TRVRfUFJBTSwKKwkJCShvZmZzZXQgPj4gOCkgJiAweEZGLCBvZmZzZXQgJiAweEZGLCBkYXRhKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfQURCICovCisjZWxzZQorI2RlZmluZSBtYWNpaXNpX3JlYWRfdGltZSgpIDAKKyNkZWZpbmUgbWFjaWlzaV93cml0ZV90aW1lKG4pCisjZGVmaW5lIG1hY2lpc2lfcmVhZF9wcmFtIE5VTEwKKyNkZWZpbmUgbWFjaWlzaV93cml0ZV9wcmFtIE5VTEwKKyNlbmRpZgogCiAvKgogICogVklBIFBSQU0vUlRDIGFjY2VzcyByb3V0aW5lcwpAQCAtMzA1LDQyICszOTYsNTUgQEAKIAogc3RhdGljIHZvaWQgY3VkYV9yZXN0YXJ0KHZvaWQpCiB7Ci0JYWRiX3JlcXVlc3QoTlVMTCwgTlVMTCwgQURCUkVRX1JBV3xBREJSRVFfU1lOQywKLQkJCTIsIENVREFfUEFDS0VULCBDVURBX1JFU0VUX1NZU1RFTSk7CisJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKwlpZiAoY3VkYV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDIsIENVREFfUEFDS0VULCBDVURBX1JFU0VUX1NZU1RFTSkgPCAwKQorCQlyZXR1cm47CisJd2hpbGUgKCFyZXEuY29tcGxldGUpCisJCWN1ZGFfcG9sbCgpOwogfQogCiBzdGF0aWMgdm9pZCBjdWRhX3NodXRkb3duKHZvaWQpCiB7Ci0JYWRiX3JlcXVlc3QoTlVMTCwgTlVMTCwgQURCUkVRX1JBV3xBREJSRVFfU1lOQywKLQkJCTIsIENVREFfUEFDS0VULCBDVURBX1BPV0VSRE9XTik7CisJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKwlpZiAoY3VkYV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDIsIENVREFfUEFDS0VULCBDVURBX1BPV0VSRE9XTikgPCAwKQorCQlyZXR1cm47CisJd2hpbGUgKCFyZXEuY29tcGxldGUpCisJCWN1ZGFfcG9sbCgpOwogfQogCiAjZW5kaWYgLyogQ09ORklHX0FEQl9DVURBICovCiAKLSNpZmRlZiBDT05GSUdfQURCX1BNVQorI2lmZGVmIENPTkZJR19BREJfUE1VNjhLCiAKIHZvaWQgcG11X3Jlc3RhcnQodm9pZCkKIHsKLQlhZGJfcmVxdWVzdChOVUxMLCBOVUxMLCBBREJSRVFfUkFXfEFEQlJFUV9TWU5DLAotCQkJMywgUE1VX1BBQ0tFVCwgUE1VX1NFVF9JTlRSX01BU0ssCi0JCQlQTVVfSU5UX0FEQnxQTVVfSU5UX1RJQ0spOwotCi0JYWRiX3JlcXVlc3QoTlVMTCwgTlVMTCwgQURCUkVRX1JBV3xBREJSRVFfU1lOQywKLQkJCTIsIFBNVV9QQUNLRVQsIFBNVV9SRVNFVCk7CisJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKwlpZiAocG11X3JlcXVlc3QoJnJlcSwgTlVMTCwKKwkJCTIsIFBNVV9TRVRfSU5UUl9NQVNLLCBQTVVfSU5UX0FEQnxQTVVfSU5UX1RJQ0spIDwgMCkKKwkJcmV0dXJuOworCXdoaWxlICghcmVxLmNvbXBsZXRlKQorCQlwbXVfcG9sbCgpOworCWlmIChwbXVfcmVxdWVzdCgmcmVxLCBOVUxMLCAxLCBQTVVfUkVTRVQpIDwgMCkKKwkJcmV0dXJuOworCXdoaWxlICghcmVxLmNvbXBsZXRlKQorCQlwbXVfcG9sbCgpOwogfQogCiB2b2lkIHBtdV9zaHV0ZG93bih2b2lkKQogewotCWFkYl9yZXF1ZXN0KE5VTEwsIE5VTEwsIEFEQlJFUV9SQVd8QURCUkVRX1NZTkMsCi0JCQkzLCBQTVVfUEFDS0VULCBQTVVfU0VUX0lOVFJfTUFTSywKLQkJCVBNVV9JTlRfQURCfFBNVV9JTlRfVElDSyk7Ci0KLQlhZGJfcmVxdWVzdChOVUxMLCBOVUxMLCBBREJSRVFfUkFXfEFEQlJFUV9TWU5DLAotCQkJNiwgUE1VX1BBQ0tFVCwgUE1VX1NIVVRET1dOLAotCQkJJ00nLCAnQScsICdUJywgJ1QnKTsKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCWlmIChwbXVfcmVxdWVzdCgmcmVxLCBOVUxMLAorCQkJMiwgUE1VX1NFVF9JTlRSX01BU0ssIFBNVV9JTlRfQURCfFBNVV9JTlRfVElDSykgPCAwKQorCQlyZXR1cm47CisJd2hpbGUgKCFyZXEuY29tcGxldGUpCisJCXBtdV9wb2xsKCk7CisJaWYgKHBtdV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDUsIFBNVV9TSFVURE9XTiwgJ00nLCAnQScsICdUJywgJ1QnKSA8IDApCisJCXJldHVybjsKKwl3aGlsZSAoIXJlcS5jb21wbGV0ZSkKKwkJcG11X3BvbGwoKTsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19BREJfUE1VICovCisjZW5kaWYKIAogLyoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzUxLDIxICs0NTUsMjIgQEAKIAogdm9pZCBtYWNfcHJhbV9yZWFkKGludCBvZmZzZXQsIF9fdTggKmJ1ZmZlciwgaW50IGxlbikKIHsKLQlfX3U4ICgqZnVuYykoaW50KSA9IE5VTEw7CisJX191OCAoKmZ1bmMpKGludCk7CiAJaW50IGk7CiAKLQlpZiAobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9JSVNJIHx8Ci0JICAgIG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfUEIxIHx8Ci0JICAgIG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfUEIyIHx8Ci0JICAgIG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfQ1VEQSkgewotI2lmZGVmIENPTkZJR19BREIKLQkJZnVuYyA9IGFkYl9yZWFkX3ByYW07Ci0jZWxzZQotCQlyZXR1cm47Ci0jZW5kaWYKLQl9IGVsc2UgeworCXN3aXRjaChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSkgeworCWNhc2UgTUFDX0FEQl9JSVNJOgorCQlmdW5jID0gbWFjaWlzaV9yZWFkX3ByYW07IGJyZWFrOworCWNhc2UgTUFDX0FEQl9QQjE6CisJY2FzZSBNQUNfQURCX1BCMjoKKwkJZnVuYyA9IHBtdV9yZWFkX3ByYW07IGJyZWFrOworCWNhc2UgTUFDX0FEQl9DVURBOgorCQlmdW5jID0gY3VkYV9yZWFkX3ByYW07IGJyZWFrOworCWRlZmF1bHQ6CiAJCWZ1bmMgPSB2aWFfcmVhZF9wcmFtOwogCX0KKwlpZiAoIWZ1bmMpCisJCXJldHVybjsKIAlmb3IgKGkgPSAwIDsgaSA8IGxlbiA7IGkrKykgewogCQlidWZmZXJbaV0gPSAoKmZ1bmMpKG9mZnNldCsrKTsKIAl9CkBAIC0zNzMsMjEgKzQ3OCwyMiBAQAogCiB2b2lkIG1hY19wcmFtX3dyaXRlKGludCBvZmZzZXQsIF9fdTggKmJ1ZmZlciwgaW50IGxlbikKIHsKLQl2b2lkICgqZnVuYykoaW50LCBfX3U4KSA9IE5VTEw7CisJdm9pZCAoKmZ1bmMpKGludCwgX191OCk7CiAJaW50IGk7CiAKLQlpZiAobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9JSVNJIHx8Ci0JICAgIG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfUEIxIHx8Ci0JICAgIG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfUEIyIHx8Ci0JICAgIG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfQ1VEQSkgewotI2lmZGVmIENPTkZJR19BREIKLQkJZnVuYyA9IGFkYl93cml0ZV9wcmFtOwotI2Vsc2UKLQkJcmV0dXJuOwotI2VuZGlmCi0JfSBlbHNlIHsKKwlzd2l0Y2gobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUpIHsKKwljYXNlIE1BQ19BREJfSUlTSToKKwkJZnVuYyA9IG1hY2lpc2lfd3JpdGVfcHJhbTsgYnJlYWs7CisJY2FzZSBNQUNfQURCX1BCMToKKwljYXNlIE1BQ19BREJfUEIyOgorCQlmdW5jID0gcG11X3dyaXRlX3ByYW07IGJyZWFrOworCWNhc2UgTUFDX0FEQl9DVURBOgorCQlmdW5jID0gY3VkYV93cml0ZV9wcmFtOyBicmVhazsKKwlkZWZhdWx0OgogCQlmdW5jID0gdmlhX3dyaXRlX3ByYW07CiAJfQorCWlmICghZnVuYykKKwkJcmV0dXJuOwogCWZvciAoaSA9IDAgOyBpIDwgbGVuIDsgaSsrKSB7CiAJCSgqZnVuYykob2Zmc2V0KyssIGJ1ZmZlcltpXSk7CiAJfQpAQCAtNDA4LDcgKzUxNCw3IEBACiAJfSBlbHNlIGlmIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX0NVREEpIHsKIAkJY3VkYV9zaHV0ZG93bigpOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FEQl9QTVUKKyNpZmRlZiBDT05GSUdfQURCX1BNVTY4SwogCX0gZWxzZSBpZiAobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9QQjEKIAkJfHwgbWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9QQjIpIHsKIAkJcG11X3NodXRkb3duKCk7CkBAIC00NDgsNyArNTU0LDcgQEAKIAl9IGVsc2UgaWYgKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfQ1VEQSkgewogCQljdWRhX3Jlc3RhcnQoKTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19BREJfUE1VCisjaWZkZWYgQ09ORklHX0FEQl9QTVU2OEsKIAl9IGVsc2UgaWYgKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfUEIxCiAJCXx8IG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfUEIyKSB7CiAJCXBtdV9yZXN0YXJ0KCk7CkBAIC00NjYsMTIgKzU3MiwxMyBAQAogCQkvKiBtYWtlIGEgMS10by0xIG1hcHBpbmcsIHVzaW5nIHRoZSB0cmFuc3BhcmVudCB0cmFuLiByZWcuICovCiAJCXVuc2lnbmVkIGxvbmcgdmlydCA9ICh1bnNpZ25lZCBsb25nKSBtYWNfcmVzZXQ7CiAJCXVuc2lnbmVkIGxvbmcgcGh5cyA9IHZpcnRfdG9fcGh5cyhtYWNfcmVzZXQpOworCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAocGh5cyYweEZGMDAwMDAwKXwweDg3Nzc7CiAJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcGh5cy12aXJ0OwogCQlsb2NhbF9pcnFfZGlzYWJsZSgpOyAvKiBsZXRzIG5vdCBzY3JldyB0aGlzIHVwLCBvaz8gKi8KIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oIi5jaGlwIDY4MDMwXG5cdCIKIAkJCQkgICAgICJwbW92ZSAlMCwlL3R0MFxuXHQiCiAJCQkJICAgICAiLmNoaXAgNjhrIgotCQkJCSAgICAgOiA6ICJtIiAoKHBoeXMmMHhGRjAwMDAwMCl8MHg4Nzc3KSk7CisJCQkJICAgICA6IDogIm0iIChhZGRyKSk7CiAJCS8qIE5vdyBqdW1wIHRvIHBoeXNpY2FsIGFkZHJlc3Mgc28gd2UgY2FuIGRpc2FibGUgTU1VICovCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAogICAgICAgICAgICAgICAgICAgICAiLmNoaXAgNjgwMzBcblx0IgpAQCAtNTg4LDIwICs2OTUsMjIgQEAKIAl1bnNpZ25lZCBsb25nIG5vdzsKIAogCWlmICghb3ApIHsgLyogcmVhZCAqLwotCQlpZiAobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9JSSkgeworCQlzd2l0Y2ggKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlKSB7CisJCWNhc2UgTUFDX0FEQl9JSToKKwkJY2FzZSBNQUNfQURCX0lPUDoKIAkJCW5vdyA9IHZpYV9yZWFkX3RpbWUoKTsKLQkJfSBlbHNlCi0jaWZkZWYgQ09ORklHX0FEQgotCQlpZiAoKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfSUlTSSkgfHwKLQkJCSAgIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX1BCMSkgfHwKLQkJCSAgIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX1BCMikgfHwKLQkJCSAgIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX0NVREEpKSB7Ci0JCQlub3cgPSBhZGJfcmVhZF90aW1lKCk7Ci0JCX0gZWxzZQotI2VuZGlmCi0JCWlmIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX0lPUCkgewotCQkJbm93ID0gdmlhX3JlYWRfdGltZSgpOwotCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCWNhc2UgTUFDX0FEQl9JSVNJOgorCQkJbm93ID0gbWFjaWlzaV9yZWFkX3RpbWUoKTsKKwkJCWJyZWFrOworCQljYXNlIE1BQ19BREJfUEIxOgorCQljYXNlIE1BQ19BREJfUEIyOgorCQkJbm93ID0gcG11X3JlYWRfdGltZSgpOworCQkJYnJlYWs7CisJCWNhc2UgTUFDX0FEQl9DVURBOgorCQkJbm93ID0gY3VkYV9yZWFkX3RpbWUoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJbm93ID0gMDsKIAkJfQogCkBAIC02MTksMTUgKzcyOCwyMCBAQAogCQlub3cgPSBta3RpbWUodC0+dG1feWVhciArIDE5MDAsIHQtPnRtX21vbiArIDEsIHQtPnRtX21kYXksCiAJCQkgICAgIHQtPnRtX2hvdXIsIHQtPnRtX21pbiwgdC0+dG1fc2VjKTsKIAotCQlpZiAobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9JSSkgeworCQlzd2l0Y2ggKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlKSB7CisJCWNhc2UgTUFDX0FEQl9JSToKKwkJY2FzZSBNQUNfQURCX0lPUDoKIAkJCXZpYV93cml0ZV90aW1lKG5vdyk7Ci0JCX0gZWxzZSBpZiAoKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfSUlTSSkgfHwKLQkJCSAgIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX1BCMSkgfHwKLQkJCSAgIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX1BCMikgfHwKLQkJCSAgIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX0NVREEpKSB7Ci0JCQlhZGJfd3JpdGVfdGltZShub3cpOwotCQl9IGVsc2UgaWYgKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfSU9QKSB7Ci0JCQl2aWFfd3JpdGVfdGltZShub3cpOworCQkJYnJlYWs7CisJCWNhc2UgTUFDX0FEQl9DVURBOgorCQkJY3VkYV93cml0ZV90aW1lKG5vdyk7CisJCQlicmVhazsKKwkJY2FzZSBNQUNfQURCX1BCMToKKwkJY2FzZSBNQUNfQURCX1BCMjoKKwkJCXBtdV93cml0ZV90aW1lKG5vdyk7CisJCQlicmVhazsKKwkJY2FzZSBNQUNfQURCX0lJU0k6CisJCQltYWNpaXNpX3dyaXRlX3RpbWUobm93KTsKIAkJfQogI2VuZGlmCiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hdGgtZW11L211bHRpX2FyaXRoLmggYi9hcmNoL202OGsvbWF0aC1lbXUvbXVsdGlfYXJpdGguaAppbmRleCAwMjI1MWU1Li40YWQwY2E5IDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWF0aC1lbXUvbXVsdGlfYXJpdGguaAorKysgYi9hcmNoL202OGsvbWF0aC1lbXUvbXVsdGlfYXJpdGguaApAQCAtMzY2LDcgKzM2Niw3IEBACiAKICNkZWZpbmUgZnBfbXVsNjQoZGVzdGgsIGRlc3RsLCBzcmMxLCBzcmMyKSAoewkJCQlcCiAJYXNtICgibXVsdS5sICUyLCUxOiUwIiA6ICI9ZCIgKGRlc3RsKSwgIj1kIiAoZGVzdGgpCQlcCi0JCTogImciIChzcmMxKSwgIjAiIChzcmMyKSk7CQkJCVwKKwkJOiAiZG0iIChzcmMxKSwgIjAiIChzcmMyKSk7CQkJCVwKIH0pCiAjZGVmaW5lIGZwX2RpdjY0KHF1b3QsIHJlbSwgc3JjaCwgc3JjbCwgZGl2KQkJCQlcCiAJYXNtICgiZGl2dS5sICUyLCUxOiUwIiA6ICI9ZCIgKHF1b3QpLCAiPWQiIChyZW0pCQlcCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0va21hcC5jIGIvYXJjaC9tNjhrL21tL2ttYXAuYwppbmRleCBmZTIzODNlLi44NWFkMTlhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbW0va21hcC5jCisrKyBiL2FyY2gvbTY4ay9tbS9rbWFwLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogICovCiAvKiBSZXdyaXR0ZW4gYnkgQW5kcmVhcyBTY2h3YWIgdG8gcmVtb3ZlIGFsbCByYWNlcy4gKi8KIAotdm9pZCAqX19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IGNhY2hlZmxhZykKK3ZvaWQgX19pb21lbSAqX19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IGNhY2hlZmxhZykKIHsKIAlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwogCXVuc2lnbmVkIGxvbmcgdmlydGFkZHIsIHJldGFkZHI7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAlpZiAoTUFDSF9JU19BTUlHQSkgewogCQlpZiAoKHBoeXNhZGRyID49IDB4NDAwMDAwMDApICYmIChwaHlzYWRkciArIHNpemUgPCAweDYwMDAwMDAwKQogCQkgICAgJiYgKGNhY2hlZmxhZyA9PSBJT01BUF9OT0NBQ0hFX1NFUikpCi0JCQlyZXR1cm4gKHZvaWQgKilwaHlzYWRkcjsKKwkJCXJldHVybiAodm9pZCBfX2lvbWVtICopcGh5c2FkZHI7CiAJfQogI2VuZGlmCiAKQEAgLTIxOCwyMSArMjE4LDIxIEBACiAjZW5kaWYKIAlmbHVzaF90bGJfYWxsKCk7CiAKLQlyZXR1cm4gKHZvaWQgKilyZXRhZGRyOworCXJldHVybiAodm9pZCBfX2lvbWVtICopcmV0YWRkcjsKIH0KIAogLyoKICAqIFVubWFwIGEgaW9yZW1hcCgpZWQgcmVnaW9uIGFnYWluCiAgKi8KLXZvaWQgaW91bm1hcCh2b2lkICphZGRyKQordm9pZCBpb3VubWFwKHZvaWQgX19pb21lbSAqYWRkcikKIHsKICNpZmRlZiBDT05GSUdfQU1JR0EKIAlpZiAoKCFNQUNIX0lTX0FNSUdBKSB8fAogCSAgICAoKCh1bnNpZ25lZCBsb25nKWFkZHIgPCAweDQwMDAwMDAwKSB8fAogCSAgICAgKCh1bnNpZ25lZCBsb25nKWFkZHIgPiAweDYwMDAwMDAwKSkpCi0JCQlmcmVlX2lvX2FyZWEoYWRkcik7CisJCQlmcmVlX2lvX2FyZWEoKF9fZm9yY2Ugdm9pZCAqKWFkZHIpOwogI2Vsc2UKLQlmcmVlX2lvX2FyZWEoYWRkcik7CisJZnJlZV9pb19hcmVhKChfX2ZvcmNlIHZvaWQgKilhZGRyKTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbXZtZTE2eC9ydGMuYyBiL2FyY2gvbTY4ay9tdm1lMTZ4L3J0Yy5jCmluZGV4IDMwZjU5MjEuLmE2OWZlMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tdm1lMTZ4L3J0Yy5jCisrKyBiL2FyY2gvbTY4ay9tdm1lMTZ4L3J0Yy5jCkBAIC00NSw2ICs0NSw3IEBACiAJdm9sYXRpbGUgTUs0OFQwOHB0cl90IHJ0YyA9IChNSzQ4VDA4cHRyX3QpTVZNRV9SVENfQkFTRTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBydGNfdGltZSB3dGltZTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBSVENfUkRfVElNRToJLyogUmVhZCB0aGUgdGltZS9kYXRlIGZyb20gUlRDCSovCkBAIC02NCw3ICs2NSw3IEBACiAJCXd0aW1lLnRtX3dkYXkgPSBCQ0QyQklOKHJ0Yy0+YmNkX2RvdyktMTsKIAkJcnRjLT5jdHJsID0gMDsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmd3RpbWUsIHNpemVvZiB3dGltZSkgPworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZ3dGltZSwgc2l6ZW9mIHd0aW1lKSA/CiAJCQkJCQkJCS1FRkFVTFQgOiAwOwogCX0KIAljYXNlIFJUQ19TRVRfVElNRToJLyogU2V0IHRoZSBSVEMgKi8KQEAgLTc2LDggKzc3LDcgQEAKIAkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQkJcmV0dXJuIC1FQUNDRVM7CiAKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZydGNfdG0sIChzdHJ1Y3QgcnRjX3RpbWUqKWFyZywKLQkJCQkgICBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmcnRjX3RtLCBhcmdwLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQl5cnMgPSBydGNfdG0udG1feWVhcjsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMgYi9hcmNoL202OGsvcTQwL2NvbmZpZy5jCmluZGV4IDAyYjYyNmJhZS4uNWUwZjliMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3E0MC9jb25maWcuYworKysgYi9hcmNoL202OGsvcTQwL2NvbmZpZy5jCkBAIC0zNiw4ICszNiw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vcTQwX21hc3Rlci5oPgogCi1leHRlcm4gdm9pZCBmbG9wcHlfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpOwotCiBleHRlcm4gaXJxcmV0dXJuX3QgcTQwX3Byb2Nlc3NfaW50IChpbnQgbGV2ZWwsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBpcnFyZXR1cm5fdCAoKnE0MF9kZWZhdWx0X2hhbmRsZXJbXSkgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsgIC8qIGFkZGVkIGp1c3QgZm9yIGRlYnVnZ2luZyAqLwogZXh0ZXJuIHZvaWQgcTQwX2luaXRfSVJRICh2b2lkKTsKQEAgLTE5NCw5ICsxOTIsNiBAQAogICAgIG1hY2hfaGVhcnRiZWF0ID0gcTQwX2hlYXJ0YmVhdDsKICNlbmRpZgogICAgIG1hY2hfaGFsdCA9IHE0MF9oYWx0OwotI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCi0gICAgY29uc3dpdGNocCA9ICZkdW1teV9jb247Ci0jZW5kaWYKIAogICAgIC8qIGRpc2FibGUgYSBmZXcgdGhpbmdzIHRoYXQgU01TUSBtaWdodCBoYXZlIGxlZnQgZW5hYmxlZCAqLwogICAgIHE0MF9kaXNhYmxlX2lycXMoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9zdW4zL2NvbmZpZy5jIGIvYXJjaC9tNjhrL3N1bjMvY29uZmlnLmMKaW5kZXggNzdkMDViYy4uZjFjYTBkZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3N1bjMvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL3N1bjMvY29uZmlnLmMKQEAgLTE2MCw5ICsxNjAsNiBAQAogCW1hY2hfaHdjbGsgICAgICAgICAgID0gIHN1bjNfaHdjbGs7CiAJbWFjaF9oYWx0CSAgICAgPSAgc3VuM19oYWx0OwogCW1hY2hfZ2V0X2hhcmR3YXJlX2xpc3QgPSBzdW4zX2dldF9oYXJkd2FyZV9saXN0OwotI2lmIGRlZmluZWQoQ09ORklHX0RVTU1ZX0NPTlNPTEUpCi0JY29uc3dpdGNocAkgICAgID0gJmR1bW15X2NvbjsKLSNlbmRpZgogCiAJbWVtb3J5X3N0YXJ0ID0gKCgoKGludCkmX2VuZCkgKyAweDIwMDApICYgfjB4MWZmZik7CiAvLyBQUk9NIHNlZW1zIHRvIHdhbnQgdGhlIGxhc3QgY291cGxlIG9mIHBoeXNpY2FsIHBhZ2VzLiAtLW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9zdW4zeC9jb25maWcuYyBiL2FyY2gvbTY4ay9zdW4zeC9jb25maWcuYwppbmRleCAwZWY1NDdmLi4wOTIwZjVkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvc3VuM3gvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL3N1bjN4L2NvbmZpZy5jCkBAIC03MSwxMCArNzEsNiBAQAogCW1hY2hfZ2V0X21vZGVsICAgICAgID0gc3VuM19nZXRfbW9kZWw7CiAJbWFjaF9nZXRfaGFyZHdhcmVfbGlzdCA9IHN1bjN4X2dldF9oYXJkd2FyZV9saXN0OwogCi0jaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKLQljb25zd2l0Y2hwCSAgICAgPSAmZHVtbXlfY29uOwotI2VuZGlmCi0KIAlzdW4zX2ludHJlZyA9ICh1bnNpZ25lZCBjaGFyICopU1VOM1hfSU5UUkVHOwogCiAJLyogb25seSB0aGUgc2VyaWFsIGNvbnNvbGUgaXMga25vd24gdG8gd29yayBhbnl3YXkuLi4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDhiM2NmNTcuLjk5YmY0MzggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYwpAQCAtMTk4LDEwICsxOTgsOSBAQAogewogCXN0cnVjdCBwdF9yZWdzICogY2hpbGRyZWdzOwogCXN0cnVjdCBzd2l0Y2hfc3RhY2sgKiBjaGlsZHN0YWNrLCAqc3RhY2s7Ci0JdW5zaWduZWQgbG9uZyBzdGFja19vZmZzZXQsICpyZXRwOworCXVuc2lnbmVkIGxvbmcgKnJldHA7CiAKLQlzdGFja19vZmZzZXQgPSBUSFJFQURfU0laRSAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncyk7Ci0JY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICgodW5zaWduZWQgbG9uZykgcC0+dGhyZWFkX2luZm8gKyBzdGFja19vZmZzZXQpOworCWNoaWxkcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAodGFza19zdGFja19wYWdlKHApICsgVEhSRUFEX1NJWkUpIC0gMTsKIAogCSpjaGlsZHJlZ3MgPSAqcmVnczsKIAljaGlsZHJlZ3MtPmQwID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMDQ3NmE0ZC4uZmE5OGYxMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE0MCwxMiArMTQwLDEyIEBACiBpbnQgY29weV90aHJlYWQoaW50IG5yLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHVzcCwKIAl1bnNpZ25lZCBsb25nIHVudXNlZCwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gcC0+dGhyZWFkX2luZm87CisJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHRhc2tfdGhyZWFkX2luZm8ocCk7CiAJc3RydWN0IHB0X3JlZ3MgKmNoaWxkcmVnczsKIAlsb25nIGNoaWxka3NwOwogCXAtPnNldF9jaGlsZF90aWQgPSBwLT5jbGVhcl9jaGlsZF90aWQgPSBOVUxMOwogCi0JY2hpbGRrc3AgPSAodW5zaWduZWQgbG9uZyl0aSArIFRIUkVBRF9TSVpFIC0gMzI7CisJY2hpbGRrc3AgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UocCkgKyBUSFJFQURfU0laRSAtIDMyOwogCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAKQEAgLTIyOSw5ICsyMjksNyBAQAogCiBpbnQgZHVtcF90YXNrX3JlZ3MgKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBlbGZfZ3JlZ3NldF90ICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSB0c2stPnRocmVhZF9pbmZvOwotCWxvbmcga3NwID0gKHVuc2lnbmVkIGxvbmcpdGkgKyBUSFJFQURfU0laRSAtIDMyOwotCWVsZl9kdW1wX3JlZ3MoJigqcmVncylbMF0sIChzdHJ1Y3QgcHRfcmVncyAqKSBrc3AgLSAxKTsKKwllbGZfZHVtcF9yZWdzKCpyZWdzLCB0YXNrX3B0X3JlZ3ModHNrKSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTQwOSw3ICs0MDcsNyBAQAogCWlmICghcCB8fCBwID09IGN1cnJlbnQgfHwgcC0+c3RhdGUgPT0gVEFTS19SVU5OSU5HKQogCQlyZXR1cm4gMDsKIAotCXN0YWNrX3BhZ2UgPSAodW5zaWduZWQgbG9uZylwLT50aHJlYWRfaW5mbzsKKwlzdGFja19wYWdlID0gKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHApOwogCWlmICghc3RhY2tfcGFnZSB8fCAhbWlwc19mcmFtZV9pbmZvX2luaXRpYWxpemVkKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggOGQyNTQ5My4uZjgzOGIzNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCkBAIC02NCw4ICs2NCw3IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkYXRhLCAzOCAqIDgpKQogCQlyZXR1cm4gLUVJTzsKIAotCXJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKCh1bnNpZ25lZCBsb25nKSBjaGlsZC0+dGhyZWFkX2luZm8gKwotCSAgICAgICBUSFJFQURfU0laRSAtIDMyIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisJcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKIAkJX19wdXRfdXNlciAocmVncy0+cmVnc1tpXSwgZGF0YSArIGkpOwpAQCAtOTIsOCArOTEsNyBAQAogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBkYXRhLCAzOCAqIDgpKQogCQlyZXR1cm4gLUVJTzsKIAotCXJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKCh1bnNpZ25lZCBsb25nKSBjaGlsZC0+dGhyZWFkX2luZm8gKwotCSAgICAgICBUSFJFQURfU0laRSAtIDMyIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisJcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKIAkJX19nZXRfdXNlciAocmVncy0+cmVnc1tpXSwgZGF0YSArIGkpOwpAQCAtMTk4LDggKzE5Niw3IEBACiAJCXN0cnVjdCBwdF9yZWdzICpyZWdzOwogCQl1bnNpZ25lZCBsb25nIHRtcCA9IDA7CiAKLQkJcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT50aHJlYWRfaW5mbyArCi0JCSAgICAgICBUSFJFQURfU0laRSAtIDMyIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisJCXJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCQlyZXQgPSAwOyAgLyogRGVmYXVsdCByZXR1cm4gdmFsdWUuICovCiAKIAkJc3dpdGNoIChhZGRyKSB7CkBAIC0zMTQsOCArMzExLDcgQEAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOiB7CiAJCXN0cnVjdCBwdF9yZWdzICpyZWdzOwogCQlyZXQgPSAwOwotCQlyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICgodW5zaWduZWQgbG9uZykgY2hpbGQtPnRocmVhZF9pbmZvICsKLQkJICAgICAgIFRIUkVBRF9TSVpFIC0gMzIgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKKwkJcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAKIAkJc3dpdGNoIChhZGRyKSB7CiAJCWNhc2UgMCAuLi4gMzE6CkBAIC00NDIsNyArNDM4LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUE6Ci0JCXJldCA9IHB1dF91c2VyKGNoaWxkLT50aHJlYWRfaW5mby0+dHBfdmFsdWUsCisJCXJldCA9IHB1dF91c2VyKHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT50cF92YWx1ZSwKIAkJCQkodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZTMyLmMgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZTMyLmMKaW5kZXggMWY5OThiZi4uMGM4MmIyNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UzMi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlMzIuYwpAQCAtMTI2LDggKzEyNiw3IEBACiAJCXN0cnVjdCBwdF9yZWdzICpyZWdzOwogCQl1bnNpZ25lZCBpbnQgdG1wOwogCi0JCXJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKCh1bnNpZ25lZCBsb25nKSBjaGlsZC0+dGhyZWFkX2luZm8gKwotCQkgICAgICAgVEhSRUFEX1NJWkUgLSAzMiAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCQlyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAkJcmV0ID0gMDsgIC8qIERlZmF1bHQgcmV0dXJuIHZhbHVlLiAqLwogCiAJCXN3aXRjaCAoYWRkcikgewpAQCAtMjU5LDggKzI1OCw3IEBACiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogewogCQlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKIAkJcmV0ID0gMDsKLQkJcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT50aHJlYWRfaW5mbyArCi0JCSAgICAgICBUSFJFQURfU0laRSAtIDMyIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisJCXJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCiAJCXN3aXRjaCAoYWRkcikgewogCQljYXNlIDAgLi4uIDMxOgpAQCAtMzc3LDcgKzM3NSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBOgotCQlyZXQgPSBwdXRfdXNlcihjaGlsZC0+dGhyZWFkX2luZm8tPnRwX3ZhbHVlLAorCQlyZXQgPSBwdXRfdXNlcih0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+dHBfdmFsdWUsCiAJCQkJKHVuc2lnbmVkIGludCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGRhdGEpOwogCQlicmVhazsKIApAQCAtMzkxLDcgKzM4OSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBXzMyNjQ6Ci0JCXJldCA9IHB1dF91c2VyKGNoaWxkLT50aHJlYWRfaW5mby0+dHBfdmFsdWUsCisJCXJldCA9IHB1dF91c2VyKHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT50cF92YWx1ZSwKIAkJCQkodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGRhdGEpOwogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXBfbXQuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wX210LmMKaW5kZXggZDQyOTU0NC4uNzk0YTFjMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXBfbXQuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NtcF9tdC5jCkBAIC0yODcsNiArMjg3LDcgQEAKICAqLwogdm9pZCBwcm9tX2Jvb3Rfc2Vjb25kYXJ5KGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKIHsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKmdwID0gdGFza190aHJlYWRfaW5mbyhpZGxlKTsKIAlkdnBlKCk7CiAJc2V0X2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOwogCkBAIC0zMDcsMTEgKzMwOCw5IEBACiAJd3JpdGVfdGNfZ3ByX3NwKCBfX0tTVEtfVE9TKGlkbGUpKTsKIAogCS8qIGdsb2JhbCBwb2ludGVyICovCi0Jd3JpdGVfdGNfZ3ByX2dwKCh1bnNpZ25lZCBsb25nKWlkbGUtPnRocmVhZF9pbmZvKTsKKwl3cml0ZV90Y19ncHJfZ3AoKHVuc2lnbmVkIGxvbmcpZ3ApOwogCi0JZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWlkbGUtPnRocmVhZF9pbmZvLAotCQkJCQkgICAodW5zaWduZWQgbG9uZylpZGxlLT50aHJlYWRfaW5mbyArCi0JCQkJCSAgIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKTsKKwlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpZ3AsICh1bnNpZ25lZCBsb25nKShncCArIDEpKTsKIAogCS8qIGZpbmFsbHkgb3V0IG9mIGNvbmZpZ3VyYXRpb24gYW5kIGludG8gY2hhb3MgKi8KIAljbGVhcl9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc3lzY2FsbC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMKaW5kZXggMDA2ODgxOS4uMzMyMzU4NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogCiB2b2lkIHN5c19zZXRfdGhyZWFkX2FyZWEodW5zaWduZWQgbG9uZyBhZGRyKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBjdXJyZW50LT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gdGFza190aHJlYWRfaW5mbyhjdXJyZW50KTsKIAogCXRpLT50cF92YWx1ZSA9IGFkZHI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwppbmRleCA3MDU4ODkzLi41OWExODc5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCkBAIC01MTksNyArNTE5LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgc2ltdWxhdGVfcmRod3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IGN1cnJlbnQtPnRocmVhZF9pbmZvOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSB0YXNrX3RocmVhZF9pbmZvKGN1cnJlbnQpOwogCXVuc2lnbmVkIGludCBvcGNvZGU7CiAKIAlpZiAodW5saWtlbHkoZ2V0X2luc25fb3Bjb2RlKHJlZ3MsICZvcGNvZGUpKSkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL3NtcC5jIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMKaW5kZXggMDUyNzE3MC4uZjE3ZjU3NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMKKysrIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMKQEAgLTkzLDggKzkzLDggQEAKICAqLwogdm9pZCBwcm9tX2Jvb3Rfc2Vjb25kYXJ5KGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKIHsKLQl1bnNpZ25lZCBsb25nIGdwID0gKHVuc2lnbmVkIGxvbmcpIGlkbGUtPnRocmVhZF9pbmZvOwotCXVuc2lnbmVkIGxvbmcgc3AgPSBncCArIFRIUkVBRF9TSVpFIC0gMzI7CisJdW5zaWduZWQgbG9uZyBncCA9ICh1bnNpZ25lZCBsb25nKSB0YXNrX3RocmVhZF9pbmZvKGlkbGUpOworCXVuc2lnbmVkIGxvbmcgc3AgPSBfX0tTVEtfVE9QKGlkbGUpOwogCiAJc2Vjb25kYXJ5X3NwID0gc3A7CiAJc2Vjb25kYXJ5X2dwID0gZ3A7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1zbXAuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXNtcC5jCmluZGV4IDNhODI5MWIuLmRiZWYzZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXNtcC5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXNtcC5jCkBAIC0xNjgsOCArMTY4LDggQEAKICAqLwogdm9pZCBfX2luaXQgcHJvbV9ib290X3NlY29uZGFyeShpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCiB7Ci0JdW5zaWduZWQgbG9uZyBncCA9ICh1bnNpZ25lZCBsb25nKSBpZGxlLT50aHJlYWRfaW5mbzsKLQl1bnNpZ25lZCBsb25nIHNwID0gZ3AgKyBUSFJFQURfU0laRSAtIDMyOworCXVuc2lnbmVkIGxvbmcgZ3AgPSAodW5zaWduZWQgbG9uZyl0YXNrX3RocmVhZF9pbmZvKGlkbGUpOworCXVuc2lnbmVkIGxvbmcgc3AgPSBfX0tTVEtfVE9TKGlkbGUpOwogCiAJTEFVTkNIX1NMQVZFKGNwdXRvbmFzaWQoY3B1KSxjcHV0b3NsaWNlKGNwdSksCiAJCShsYXVuY2hfcHJvY190KU1BUFBFRF9LRVJOX1JXX1RPX0swKHNtcF9ib290c3RyYXApLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9jZmUvc21wLmMgYi9hcmNoL21pcHMvc2lieXRlL2NmZS9zbXAuYwppbmRleCBlODQ4NTEyLi40NDc3YWYzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL2NmZS9zbXAuYworKysgYi9hcmNoL21pcHMvc2lieXRlL2NmZS9zbXAuYwpAQCAtNjAsNyArNjAsNyBAQAogCiAJcmV0dmFsID0gY2ZlX2NwdV9zdGFydChjcHVfbG9naWNhbF9tYXAoY3B1KSwgJnNtcF9ib290c3RyYXAsCiAJCQkgICAgICAgX19LU1RLX1RPUyhpZGxlKSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZylpZGxlLT50aHJlYWRfaW5mbywgMCk7CisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdGFza190aHJlYWRfaW5mbyhpZGxlKSwgMCk7CiAJaWYgKHJldHZhbCAhPSAwKQogCQlwcmludGsoImNmZV9zdGFydF9jcHUoJWkpIHJldHVybmVkICVpXG4iICwgY3B1LCByZXR2YWwpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2RyaXZlcnMuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9kcml2ZXJzLmMKaW5kZXggMWVhYTBkMy4uMmQ4MDRlMiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2RyaXZlcnMuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZHJpdmVycy5jCkBAIC0xNzMsOCArMTczLDYgQEAKIAlXQVJOX09OKGRyaXZlci0+ZHJ2LnByb2JlICE9IE5VTEwpOwogCVdBUk5fT04oZHJpdmVyLT5kcnYucmVtb3ZlICE9IE5VTEwpOwogCi0JZHJpdmVyLT5kcnYucHJvYmUgPSBwYXJpc2NfZHJpdmVyX3Byb2JlOwotCWRyaXZlci0+ZHJ2LnJlbW92ZSA9IHBhcmlzY19kcml2ZXJfcmVtb3ZlOwogCWRyaXZlci0+ZHJ2Lm5hbWUgPSBkcml2ZXItPm5hbWU7CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRydik7CkBAIC01NzUsNiArNTczLDggQEAKIAkubmFtZSA9ICJwYXJpc2MiLAogCS5tYXRjaCA9IHBhcmlzY19nZW5lcmljX21hdGNoLAogCS5kZXZfYXR0cnMgPSBwYXJpc2NfZGV2aWNlX2F0dHJzLAorCS5wcm9iZSA9IHBhcmlzY19kcml2ZXJfcHJvYmUsCisJLnJlbW92ZSA9IHBhcmlzY19kcml2ZXJfcmVtb3ZlLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3MuYwppbmRleCA0ZWI3MGE0Li41ZGE0MTY3IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTI5NSw3ICsyOTUsNyBAQAogCSAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBwLCBzdHJ1Y3QgcHRfcmVncyAqIHByZWdzKQogewogCXN0cnVjdCBwdF9yZWdzICogY3JlZ3MgPSAmKHAtPnRocmVhZC5yZWdzKTsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gcC0+dGhyZWFkX2luZm87CisJdm9pZCAqc3RhY2sgPSB0YXNrX3N0YWNrX3BhZ2UocCk7CiAJCiAJLyogV2UgaGF2ZSB0byB1c2Ugdm9pZCAqIGluc3RlYWQgb2YgYSBmdW5jdGlvbiBwb2ludGVyLCBiZWNhdXNlCiAJICogZnVuY3Rpb24gcG9pbnRlcnMgYXJlbid0IGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gb24gNjQtYml0LgpAQCAtMzIyLDcgKzMyMiw3IEBACiAJICovCiAJaWYgKHVzcCA9PSAxKSB7CiAJCS8qIGtlcm5lbCB0aHJlYWQgKi8KLQkJY3JlZ3MtPmtzcCA9ICgoKHVuc2lnbmVkIGxvbmcpKHRpKSkgKyBUSFJFQURfU1pfQUxHTik7CisJCWNyZWdzLT5rc3AgPSAodW5zaWduZWQgbG9uZylzdGFjayArIFRIUkVBRF9TWl9BTEdOOwogCQkvKiBNdXN0IGV4aXQgdmlhIHJldF9mcm9tX2tlcm5lbF90aHJlYWQgaW4gb3JkZXIKIAkJICogdG8gY2FsbCBzY2hlZHVsZV90YWlsKCkKIAkJICovCkBAIC0zNDQsNyArMzQ0LDcgQEAKIAkJICovCiAKIAkJLyogVXNlIHNhbWUgc3RhY2sgZGVwdGggYXMgcGFyZW50ICovCi0JCWNyZWdzLT5rc3AgPSAoKHVuc2lnbmVkIGxvbmcpKHRpKSkKKwkJY3JlZ3MtPmtzcCA9ICh1bnNpZ25lZCBsb25nKXN0YWNrCiAJCQkrIChwcmVncy0+Z3JbMjFdICYgKFRIUkVBRF9TSVpFIC0gMSkpOwogCQljcmVncy0+Z3JbMzBdID0gdXNwOwogCQlpZiAocC0+cGVyc29uYWxpdHkgPT0gUEVSX0hQVVgpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zbXAuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zbXAuYwppbmRleCAxN2YyM2MyLi4yNTU2NGI3IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3NtcC5jCkBAIC01MTcsNyArNTE3LDcgQEAKIAlpZiAoSVNfRVJSKGlkbGUpKQogCQlwYW5pYygiU01QOiBmb3JrIGZhaWxlZCBmb3IgQ1BVOiVkIiwgY3B1aWQpOwogCi0JaWRsZS0+dGhyZWFkX2luZm8tPmNwdSA9IGNwdWlkOworCXRhc2tfdGhyZWFkX2luZm8oaWRsZSktPmNwdSA9IGNwdWlkOwogCiAJLyogTGV0IF9zdGFydCBrbm93IHdoYXQgbG9naWNhbCBDUFUgd2UncmUgYm9vdGluZwogCSoqIChvZmZzZXQgaW50byBpbml0X3Rhc2tzW10sY3B1X2RhdGFbXSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQppbmRleCBkMzY1NGEyLi40NGRkODJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL01ha2VmaWxlCkBAIC0xMzksMTcgKzEzOSwxNCBAQAogCiBkcml2ZXJzLSQoQ09ORklHX09QUk9GSUxFKQkrPSBhcmNoL3Bvd2VycGMvb3Byb2ZpbGUvCiAKLWRlZmF1bHRpbWFnZS0kKENPTkZJR19QUEMzMikJOj0gekltYWdlCisjIERlZmF1bHQgdG8gekltYWdlLCBvdmVycmlkZSB3aGVuIG5lZWRlZAorZGVmYXVsdGltYWdlLXkJCQk6PSB6SW1hZ2UKIGRlZmF1bHRpbWFnZS0kKENPTkZJR19QUENfSVNFUklFUykgOj0gdm1saW51eAotZGVmYXVsdGltYWdlLSQoQ09ORklHX1BQQ19QU0VSSUVTKSA6PSB6SW1hZ2UKIEtCVUlMRF9JTUFHRSA6PSAkKGRlZmF1bHRpbWFnZS15KQogYWxsOiAkKEtCVUlMRF9JTUFHRSkKIAogQ1BQRkxBR1Nfdm1saW51eC5sZHMJOj0gLVVwb3dlcnBjCiAKLSMgQWxsIHRoZSBpbnN0cnVjdGlvbnMgdGFsayBhYm91dCAibWFrZSBiekltYWdlIi4KLWJ6SW1hZ2U6IHpJbWFnZQotCiBCT09UX1RBUkdFVFMgPSB6SW1hZ2UgekltYWdlLmluaXRyZCB6bmV0Ym9vdCB6bmV0Ym9vdC5pbml0cmQgdm1saW51eC5zbSB1SW1hZ2UKIAogLlBIT05ZOiAkKEJPT1RfVEFSR0VUUykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKaW5kZXggYjUzZDY3Ny4uNzg4ZGVjNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKQEAgLTI1LDggKzI1LDggQEAKIEJPT1RDRkxBR1MJOj0gJChIT1NUQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIC1pc3lzdGVtIFwKIAkJICAgJChzaGVsbCAkKENST1NTMzJDQykgLXByaW50LWZpbGUtbmFtZT1pbmNsdWRlKSAtZlBJQwogQk9PVEFGTEFHUwk6PSAtRF9fQVNTRU1CTFlfXyAkKEJPT1RDRkxBR1MpIC10cmFkaXRpb25hbCAtbm9zdGRpbmMKLUJPT1RMRkxBR1MJOj0gLVQgJChzcmN0cmVlKS8kKHNyYykvekltYWdlLmxkcwogT0JKQ09QWUZMQUdTICAgIDo9IGNvbnRlbnRzLGFsbG9jLGxvYWQscmVhZG9ubHksZGF0YQorT0JKQ09QWV9DT0ZGX0FSR1MgOj0gLU8gYWl4Y29mZi1yczYwMDAgLS1zZXQtc3RhcnQgMHg1MDAwMDAKIAogemxpYiAgICAgICA6PSBpbmZibG9jay5jIGluZmNvZGVzLmMgaW5mZmFzdC5jIGluZmxhdGUuYyBpbmZ0cmVlcy5jIGluZnV0aWwuYwogemxpYmhlYWRlciA6PSBpbmZibG9jay5oIGluZmNvZGVzLmggaW5mZmFzdC5oIGluZnRyZWVzLmggaW5mdXRpbC5oCkBAIC0zNSw3ICszNSw3IEBACiAkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYikgbWFpbi5vKTogJChhZGRwcmVmaXggJChvYmopLywkKHpsaWJsaW51eGhlYWRlcikpICQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliaGVhZGVyKSkKICMkKGFkZHByZWZpeCAkKG9iaikvLG1haW4ubyk6ICQoYWRkcHJlZml4ICQob2JqKS8semxpYi5oKQogCi1zcmMtYm9vdCA6PSBzdHJpbmcuUyBwcm9tLmMgbWFpbi5jIGRpdjY0LlMgY3J0MC5TCitzcmMtYm9vdCA6PSBjcnQwLlMgc3RyaW5nLlMgcHJvbS5jIHN0ZGlvLmMgbWFpbi5jIGRpdjY0LlMKIHNyYy1ib290ICs9ICQoemxpYikKIHNyYy1ib290IDo9ICQoYWRkcHJlZml4ICQob2JqKS8sICQoc3JjLWJvb3QpKQogb2JqLWJvb3QgOj0gJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChzcmMtYm9vdCkpKQpAQCAtNzAsNyArNzAsNyBAQAogICAgICAgY21kX2Jvb3RhcyA9ICQoQ1JPU1MzMkNDKSAtV3AsLU1ELCQoZGVwZmlsZSkgJChCT09UQUZMQUdTKSAtYyAtbyAkQCAkPAogCiBxdWlldF9jbWRfYm9vdGxkID0gQk9PVExEICAkQAotICAgICAgY21kX2Jvb3RsZCA9ICQoQ1JPU1MzMkxEKSAkKEJPT1RMRkxBR1MpIC1vICRAICQoMikKKyAgICAgIGNtZF9ib290bGQgPSAkKENST1NTMzJMRCkgLVQgJChzcmN0cmVlKS8kKHNyYykvJCgzKSAtbyAkQCAkKDIpCiAKICQocGF0c3Vic3QgJS5jLCUubywgJChmaWx0ZXIgJS5jLCAkKHNyYy1ib290KSkpOiAlLm86ICUuYwogCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxib290Y2MpCkBAIC04NywxMiArODcsMTQgQEAKIHNyYy1zZWMgPSAkKGZvcmVhY2ggc2VjdGlvbiwgJCgxKSwgJChwYXRzdWJzdCAlLCQob2JqKS9rZXJuZWwtJS5jLCAkKHNlY3Rpb24pKSkKIGd6LXNlYyAgPSAkKGZvcmVhY2ggc2VjdGlvbiwgJCgxKSwgJChwYXRzdWJzdCAlLCQob2JqKS9rZXJuZWwtJS5neiwgJChzZWN0aW9uKSkpCiAKLWhvc3Rwcm9ncy15CQk6PSBhZGRub3RlIGFkZFJhbURpc2sKLXRhcmdldHMgCQkrPSB6SW1hZ2Uudm1vZGUgekltYWdlLmluaXRyZC52bW9kZSB6SW1hZ2UgekltYWdlLmluaXRyZCBcCi0JCQkgICAkKHBhdHN1YnN0ICQob2JqKS8lLCUsICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpKSBcCi0JCQkgICAkKHBhdHN1YnN0ICQob2JqKS8lLCUsICQoY2FsbCBzcmMtc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpKSBcCi0JCQkgICAkKHBhdHN1YnN0ICQob2JqKS8lLCUsICQoY2FsbCBnei1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkpIFwKLQkJCSAgIHZtbGludXguaW5pdHJkCitob3N0cHJvZ3MteQkJOj0gYWRkbm90ZSBhZGRSYW1EaXNrIGhhY2stY29mZgorCit0YXJnZXRzICs9IHpJbWFnZS52bW9kZSB6SW1hZ2UuaW5pdHJkLnZtb2RlIHpJbWFnZSB6SW1hZ2UuaW5pdHJkIFwKKwkgICB6SW1hZ2UuY29mZiB6SW1hZ2UuaW5pdHJkLmNvZmYgXAorCSAgICQocGF0c3Vic3QgJChvYmopLyUsJSwgJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkpIFwKKwkgICAkKHBhdHN1YnN0ICQob2JqKS8lLCUsICQoY2FsbCBzcmMtc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpKSBcCisJICAgJChwYXRzdWJzdCAkKG9iaikvJSwlLCAkKGNhbGwgZ3otc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpKSBcCisJICAgdm1saW51eC5pbml0cmQKIGV4dHJhLXkJCQk6PSBpbml0cmQubwogCiBxdWlldF9jbWRfcmFtZGlzayA9IFJBTURJU0sgJEAKQEAgLTExNCw2ICsxMTYsMTAgQEAKIHF1aWV0X2NtZF9hZGRub3RlID0gQURETk9URSAkQAogICAgICAgY21kX2FkZG5vdGUgPSAkKG9iaikvYWRkbm90ZSAkQAogCitxdWlldF9jbWRfZ2VuY29mZiA9IENPRkYgICAgJEAKKyAgICAgIGNtZF9nZW5jb2ZmID0gJChPQkpDT1BZKSAkKE9CSkNPUFlfQ09GRl9BUkdTKSAkQCAmJiBcCisJCSAgICAkKG9iaikvaGFjay1jb2ZmICRACisKICQoY2FsbCBnei1zZWMsICQocmVxdWlyZWQpKTogJChvYmopL2tlcm5lbC0lLmd6OiAlCiAJJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKIApAQCAtMTI3LDIyICsxMzMsMzUgQEAKIAkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsYm9vdGNjKQogCSQoY2FsbCBjbWQsYWRkc2VjdGlvbikKIAotJChvYmopL3pJbWFnZS52bW9kZTogb2JqLWJvb3QgKz0gJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpKQorJChvYmopL3pJbWFnZS52bW9kZSAkKG9iaikvekltYWdlLmNvZmY6IG9iai1ib290ICs9ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSkKICQob2JqKS96SW1hZ2Uudm1vZGU6ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSkgJChvYmotYm9vdCkgJChzcmN0cmVlKS8kKHNyYykvekltYWdlLmxkcwotCSQoY2FsbCBjbWQsYm9vdGxkLCQob2JqLWJvb3QpKQorCSQoY2FsbCBjbWQsYm9vdGxkLCQob2JqLWJvb3QpLHpJbWFnZS5sZHMpCiAKLSQob2JqKS96SW1hZ2UuaW5pdHJkLnZtb2RlOiBvYmotYm9vdCArPSAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKQorJChvYmopL3pJbWFnZS5pbml0cmQudm1vZGUgJChvYmopL3pJbWFnZS5pbml0cmQuY29mZjogb2JqLWJvb3QgKz0gJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkKICQob2JqKS96SW1hZ2UuaW5pdHJkLnZtb2RlOiAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSAkKG9iai1ib290KSAkKHNyY3RyZWUpLyQoc3JjKS96SW1hZ2UubGRzCi0JJChjYWxsIGNtZCxib290bGQsJChvYmotYm9vdCkpCisJJChjYWxsIGNtZCxib290bGQsJChvYmotYm9vdCksekltYWdlLmxkcykKIAotJChvYmopL3pJbWFnZTogJChvYmopL3pJbWFnZS52bW9kZSAkKG9iaikvYWRkbm90ZQorIyBGb3IgMzItYml0IHBvd2VybWFjcywgYnVpbGQgdGhlIENPRkYgaW1hZ2VzIGFzIHdlbGwgYXMgdGhlIEVMRiBpbWFnZXMuCitjb2ZmaW1hZ2UtJChDT05GSUdfUFBDX1BNQUMpLSQoQ09ORklHX1BQQzMyKSA6PSAkKG9iaikvekltYWdlLmNvZmYKK2NvZmZyZGltZy0kKENPTkZJR19QUENfUE1BQyktJChDT05GSUdfUFBDMzIpIDo9ICQob2JqKS96SW1hZ2UuaW5pdHJkLmNvZmYKKworJChvYmopL3pJbWFnZTogJChvYmopL3pJbWFnZS52bW9kZSAkKG9iaikvYWRkbm90ZSAkKGNvZmZpbWFnZS15LXkpCiAJQGNwIC1mICQ8ICRACiAJJChjYWxsIGlmX2NoYW5nZWQsYWRkbm90ZSkKIAotJChvYmopL3pJbWFnZS5pbml0cmQ6ICQob2JqKS96SW1hZ2UuaW5pdHJkLnZtb2RlICQob2JqKS9hZGRub3RlCiskKG9iaikvekltYWdlLmluaXRyZDogJChvYmopL3pJbWFnZS5pbml0cmQudm1vZGUgJChvYmopL2FkZG5vdGUgJChjb2ZmcmRpbWcteS15KQogCUBjcCAtZiAkPCAkQAogCSQoY2FsbCBpZl9jaGFuZ2VkLGFkZG5vdGUpCiAKKyQob2JqKS96SW1hZ2UuY29mZjogJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpKSAkKG9iai1ib290KSAkKHNyY3RyZWUpLyQoc3JjKS96SW1hZ2UuY29mZi5sZHMgJChvYmopL2hhY2stY29mZgorCSQoY2FsbCBjbWQsYm9vdGxkLCQob2JqLWJvb3QpLHpJbWFnZS5jb2ZmLmxkcykKKwkkKGNhbGwgY21kLGdlbmNvZmYpCisKKyQob2JqKS96SW1hZ2UuaW5pdHJkLmNvZmY6ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpICQob2JqLWJvb3QpIFwKKwkJCSAgICQoc3JjdHJlZSkvJChzcmMpL3pJbWFnZS5jb2ZmLmxkcyAkKG9iaikvaGFjay1jb2ZmCisJJChjYWxsIGNtZCxib290bGQsJChvYmotYm9vdCksekltYWdlLmNvZmYubGRzKQorCSQoY2FsbCBjbWQsZ2VuY29mZikKKwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIGJ1aWxkIHUtYm9vdCBpbWFnZXMKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3J0MC5TIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3J0MC5TCmluZGV4IGQyZjJhY2UuLmUwMTkyYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2NydDAuUworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9jcnQwLlMKQEAgLTEyLDE3ICsxMiwyMyBAQAogI2luY2x1ZGUgInBwY19hc20uaCIKIAogCS50ZXh0CisJLyogYSBwcm9jZWR1cmUgZGVzY3JpcHRvciB1c2VkIHdoZW4gYm9vdGluZyB0aGlzIGFzIGEgQ09GRiBmaWxlICovCitfemltYWdlX3N0YXJ0X29wZDoKKwkubG9uZwlfemltYWdlX3N0YXJ0LCAwLCAwLCAwCisKIAkuZ2xvYmwJX3ppbWFnZV9zdGFydAogX3ppbWFnZV9zdGFydDoKKwkvKiBXb3JrIG91dCB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGFkZHJlc3Mgd2Ugd2VyZSBsaW5rZWQgYXQKKwkgICBhbmQgdGhlIGFkZHJlc3Mgd2hlcmUgd2UncmUgcnVubmluZy4gKi8KIAlibAkxZgotCi0xOgotCW1mbHIJcjAKKzE6CW1mbHIJcjAKIAlsaXMJcjksMWJAaGEKIAlhZGRpCXI5LHI5LDFiQGwKIAlzdWJmLglyMCxyOSxyMAotCWJlcQkzZgorCWJlcQkzZgkJLyogaWYgcnVubmluZyBhdCBzYW1lIGFkZHJlc3MgYXMgbGlua2VkICovCiAKKwkvKiBUaGUgLmdvdDIgc2VjdGlvbiBjb250YWlucyBhIGxpc3Qgb2YgYWRkcmVzc2VzLCBzbyBhZGQKKwkgICB0aGUgYWRkcmVzcyBvZmZzZXQgb250byBlYWNoIGVudHJ5LiAqLwogCWxpcwlyOSxfX2dvdDJfc3RhcnRAaGEKIAlhZGRpCXI5LHI5LF9fZ290Ml9zdGFydEBsCiAJbGlzCXI4LF9fZ290Ml9lbmRAaGEKQEAgLTMyLDE1ICszOCwxNCBAQAogCXNyd2kuCXI4LHI4LDIKIAltdGN0cglyOAogCWFkZAlyOSxyMCxyOQotMjoKLQlsd3oJcjgsMChyOSkKKzI6CWx3eglyOCwwKHI5KQogCWFkZAlyOCxyOCxyMAogCXN0dwlyOCwwKHI5KQogCWFkZGkJcjkscjksNAogCWJkbnoJMmIKIAotMzoKLQlsaXMJcjksX3N0YXJ0QGgKKwkvKiBEbyBhIGNhY2hlIGZsdXNoIGZvciBvdXIgdGV4dCwgaW4gY2FzZSBPRiBkaWRuJ3QgKi8KKzM6CWxpcwlyOSxfc3RhcnRAaAogCWFkZAlyOSxyMCxyOQogCWxpcwlyOCxfZXRleHRAaGEKIAlhZGRpCXI4LHI4LF9ldGV4dEBsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9oYWNrLWNvZmYuYyBiL2FyY2gvcG93ZXJwYy9ib290L2hhY2stY29mZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNWE2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9oYWNrLWNvZmYuYwpAQCAtMCwwICsxLDg0IEBACisvKgorICogaGFjay1jb2ZmLmMgLSBoYWNrIHRoZSBoZWFkZXIgb2YgYW4geGNvZmYgZmlsZSB0byBmaWxsIGluCisgKiBhIGZldyBmaWVsZHMgbmVlZGVkIGJ5IHRoZSBPcGVuIEZpcm13YXJlIHhjb2ZmIGxvYWRlciBvbgorICogUG93ZXIgTWFjcyBidXQgbm90IGluaXRpYWxpemVkIGJ5IG9iamNvcHkuCisgKgorICogQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAxOTk3LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAicnM2MDAwLmgiCisKKyNkZWZpbmUgQU9VVF9NQUdJQwkweDAxMGIKKworI2RlZmluZSBnZXRfMTZiZSh4KQkoKCgodW5zaWduZWQgY2hhciAqKSh4KSlbMF0gPDwgOCkgXAorCQkJICsgKCh1bnNpZ25lZCBjaGFyICopKHgpKVsxXSkKKyNkZWZpbmUgcHV0XzE2YmUoeCwgdikJKCgodW5zaWduZWQgY2hhciAqKSh4KSlbMF0gPSAodikgPj4gOCwgXAorCQkJICgodW5zaWduZWQgY2hhciAqKSh4KSlbMV0gPSAodikgJiAweGZmKQorI2RlZmluZSBnZXRfMzJiZSh4KQkoKCgodW5zaWduZWQgY2hhciAqKSh4KSlbMF0gPDwgMjQpIFwKKwkJCSArICgoKHVuc2lnbmVkIGNoYXIgKikoeCkpWzFdIDw8IDE2KSBcCisJCQkgKyAoKCh1bnNpZ25lZCBjaGFyICopKHgpKVsyXSA8PCA4KSBcCisJCQkgKyAoKHVuc2lnbmVkIGNoYXIgKikoeCkpWzNdKQorCitpbnQKK21haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisgICAgaW50IGZkOworICAgIGludCBpLCBuc2VjdDsKKyAgICBpbnQgYW91dHN6OworICAgIHN0cnVjdCBleHRlcm5hbF9maWxlaGRyIGZoZHI7CisgICAgQU9VVEhEUiBhb3V0OworICAgIHN0cnVjdCBleHRlcm5hbF9zY25oZHIgc2hkcjsKKworICAgIGlmIChhYyAhPSAyKSB7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaGFjay1jb2ZmIGNvZmYtZmlsZVxuIik7CisJZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKChmZCA9IG9wZW4oYXZbMV0sIDIpKSA9PSAtMSkgeworCXBlcnJvcihhdlsyXSk7CisJZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKHJlYWQoZmQsICZmaGRyLCBzaXplb2YoZmhkcikpICE9IHNpemVvZihmaGRyKSkKKwlnb3RvIHJlYWRlcnI7CisgICAgaSA9IGdldF8xNmJlKGZoZHIuZl9tYWdpYyk7CisgICAgaWYgKGkgIT0gVTgwMlRPQ01BR0lDICYmIGkgIT0gVTgwMldSTUFHSUMgJiYgaSAhPSBVODAyUk9NQUdJQykgeworCWZwcmludGYoc3RkZXJyLCAiJXM6IG5vdCBhbiB4Y29mZiBmaWxlXG4iLCBhdlsxXSk7CisJZXhpdCgxKTsKKyAgICB9CisgICAgYW91dHN6ID0gZ2V0XzE2YmUoZmhkci5mX29wdGhkcik7CisgICAgaWYgKHJlYWQoZmQsICZhb3V0LCBhb3V0c3opICE9IGFvdXRzeikKKwlnb3RvIHJlYWRlcnI7CisgICAgbnNlY3QgPSBnZXRfMTZiZShmaGRyLmZfbnNjbnMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuc2VjdDsgKytpKSB7CisJaWYgKHJlYWQoZmQsICZzaGRyLCBzaXplb2Yoc2hkcikpICE9IHNpemVvZihzaGRyKSkKKwkgICAgZ290byByZWFkZXJyOworCWlmIChzdHJjbXAoc2hkci5zX25hbWUsICIudGV4dCIpID09IDApIHsKKwkgICAgcHV0XzE2YmUoYW91dC5vX3NuZW50cnksIGkrMSk7CisJICAgIHB1dF8xNmJlKGFvdXQub19zbnRleHQsIGkrMSk7CisJfSBlbHNlIGlmIChzdHJjbXAoc2hkci5zX25hbWUsICIuZGF0YSIpID09IDApIHsKKwkgICAgcHV0XzE2YmUoYW91dC5vX3NuZGF0YSwgaSsxKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChzaGRyLnNfbmFtZSwgIi5ic3MiKSA9PSAwKSB7CisJICAgIHB1dF8xNmJlKGFvdXQub19zbmJzcywgaSsxKTsKKwl9CisgICAgfQorICAgIHB1dF8xNmJlKGFvdXQubWFnaWMsIEFPVVRfTUFHSUMpOworICAgIGlmIChsc2VlayhmZCwgKGxvbmcpIHNpemVvZihzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciksIDApID09IC0xCisJfHwgd3JpdGUoZmQsICZhb3V0LCBhb3V0c3opICE9IGFvdXRzeikgeworCWZwcmludGYoc3RkZXJyLCAiJXM6IHdyaXRlIGVycm9yXG4iLCBhdlsxXSk7CisJZXhpdCgxKTsKKyAgICB9CisgICAgY2xvc2UoZmQpOworICAgIGV4aXQoMCk7CisKK3JlYWRlcnI6CisgICAgZnByaW50ZihzdGRlcnIsICIlczogcmVhZCBlcnJvciBvciBmaWxlIHRvbyBzaG9ydFxuIiwgYXZbMV0pOworICAgIGV4aXQoMSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMKaW5kZXggNjRlYzkzMS4uNTVlYzU5OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L21haW4uYwpAQCAtMjEsOCArMjEsOCBAQAogCiAKIC8qIFZhbHVlIHBpY2tlZCB0byBtYXRjaCB0aGF0IHVzZWQgYnkgeWFib290ICovCi0jZGVmaW5lIFBST0dfU1RBUlQJMHgwMTQwMDAwMAotI2RlZmluZSBSQU1fRU5ECQkoNTEyPDwyMCkgLy8gRml4bWU6IHVzZSBPRiAqLworI2RlZmluZSBQUk9HX1NUQVJUCTB4MDE0MDAwMDAJLyogb25seSB1c2VkIG9uIDY0LWJpdCBzeXN0ZW1zICovCisjZGVmaW5lIFJBTV9FTkQJCSg1MTI8PDIwKQkvKiBGaXhtZTogdXNlIE9GICovCiAjZGVmaW5lCU9ORV9NQgkJMHgxMDAwMDAKIAogZXh0ZXJuIGNoYXIgX3N0YXJ0W107CkBAIC0xNjAsNiArMTYwLDE3IEBACiAJZWxmb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpZWxmNjRwaC0+cF9vZmZzZXQ7CiAJdm1saW51eC5zaXplID0gKHVuc2lnbmVkIGxvbmcpZWxmNjRwaC0+cF9maWxlc3ogKyBlbGZvZmZzZXQ7CiAJdm1saW51eC5tZW1zaXplID0gKHVuc2lnbmVkIGxvbmcpZWxmNjRwaC0+cF9tZW1zeiArIGVsZm9mZnNldDsKKworI2lmIGRlZmluZWQoUFJPR19TVEFSVCkKKwkvKgorCSAqIE1haW50YWluIGEgIm1hZ2ljIiBtaW5pbXVtIGFkZHJlc3MuIFRoaXMga2VlcHMgc29tZSBvbGRlcgorCSAqIGZpcm13YXJlIHBsYXRmb3JtcyBydW5uaW5nLgorCSAqLworCisJaWYgKGNsYWltX2Jhc2UgPCBQUk9HX1NUQVJUKQorCQljbGFpbV9iYXNlID0gUFJPR19TVEFSVDsKKyNlbmRpZgorCiAJcmV0dXJuIDE7CiB9CiAKQEAgLTIwNiwxMiArMjE3LDE4IEBACiAJCWV4aXQoKTsKIAlpZiAoZ2V0cHJvcChjaG9zZW5faGFuZGxlLCAic3Rkb3V0IiwgJnN0ZG91dCwgc2l6ZW9mKHN0ZG91dCkpICE9IDQpCiAJCWV4aXQoKTsKLQlzdGRlcnIgPSBzdGRvdXQ7Ci0JaWYgKGdldHByb3AoY2hvc2VuX2hhbmRsZSwgInN0ZGluIiwgJnN0ZGluLCBzaXplb2Yoc3RkaW4pKSAhPSA0KQotCQlleGl0KCk7CiAKIAlwcmludGYoIlxuXHJ6SW1hZ2Ugc3RhcnRpbmc6IGxvYWRlZCBhdCAweCVwIChzcDogMHglcClcblxyIiwgX3N0YXJ0LCBzcCk7CiAKKwkvKgorCSAqIFRoZSBmaXJzdCBhdmFpbGFibGUgY2xhaW1fYmFzZSBtdXN0IGJlIGFib3ZlIHRoZSBlbmQgb2YgdGhlCisJICogdGhlIGxvYWRlZCBrZXJuZWwgd3JhcHBlciBmaWxlIChfc3RhcnQgdG8gX2VuZCBpbmNsdWRlcyB0aGUKKwkgKiBpbml0cmQgaW1hZ2UgaWYgaXQgaXMgcHJlc2VudCkgYW5kIHJvdW5kZWQgdXAgdG8gYSBuaWNlCisJICogMSBNQiBib3VuZGFyeSBmb3IgZ29vZCBtZWFzdXJlLgorCSAqLworCisJY2xhaW1fYmFzZSA9IF9BTElHTl9VUCgodW5zaWduZWQgbG9uZylfZW5kLCBPTkVfTUIpOworCiAJdm1saW51ei5hZGRyID0gKHVuc2lnbmVkIGxvbmcpX3ZtbGludXhfc3RhcnQ7CiAJdm1saW51ei5zaXplID0gKHVuc2lnbmVkIGxvbmcpKF92bWxpbnV4X2VuZCAtIF92bWxpbnV4X3N0YXJ0KTsKIApAQCAtMjI4LDI1ICsyNDUsNiBAQAogCQlleGl0KCk7CiAJfQogCi0JLyoKLQkgKiBUaGUgZmlyc3QgYXZhaWxhYmxlIGNsYWltX2Jhc2UgbXVzdCBiZSBhYm92ZSB0aGUgZW5kIG9mIHRoZQotCSAqIHRoZSBsb2FkZWQga2VybmVsIHdyYXBwZXIgZmlsZSAoX3N0YXJ0IHRvIF9lbmQgaW5jbHVkZXMgdGhlCi0JICogaW5pdHJkIGltYWdlIGlmIGl0IGlzIHByZXNlbnQpIGFuZCByb3VuZGVkIHVwIHRvIGEgbmljZQotCSAqIDEgTUIgYm91bmRhcnkgZm9yIGdvb2QgbWVhc3VyZS4KLQkgKi8KLQotCWNsYWltX2Jhc2UgPSBfQUxJR05fVVAoKHVuc2lnbmVkIGxvbmcpX2VuZCwgT05FX01CKTsKLQotI2lmIGRlZmluZWQoUFJPR19TVEFSVCkKLQkvKgotCSAqIE1haW50YWluIGEgIm1hZ2ljIiBtaW5pbXVtIGFkZHJlc3MuIFRoaXMga2VlcHMgc29tZSBvbGRlcgotCSAqIGZpcm13YXJlIHBsYXRmb3JtcyBydW5uaW5nLgotCSAqLwotCi0JaWYgKGNsYWltX2Jhc2UgPCBQUk9HX1NUQVJUKQotCQljbGFpbV9iYXNlID0gUFJPR19TVEFSVDsKLSNlbmRpZgotCiAJLyogV2UgbmVlZCB0byBjbGFpbSB0aGUgbWVtc2l6ZSBwbHVzIHRoZSBmaWxlIG9mZnNldCBzaW5jZSBnemlwCiAJICogd2lsbCBleHBhbmQgdGhlIGhlYWRlciAoZmlsZSBvZmZzZXQpLCB0aGVuIHRoZSBrZXJuZWwsIHRoZW4KIAkgKiBwb3NzaWJsZSBydWJiaXNoIHdlIGRvbid0IGNhcmUgYWJvdXQuIEJ1dCB0aGUga2VybmVsIGJzcyBtdXN0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wcm9tLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9wcm9tLmMKaW5kZXggNGJlYTJmNC4uZmEwMDU3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3Byb20uYwpAQCAtMTMsNDg3ICsxMywxNTMgQEAKICNpbmNsdWRlICJwcm9tLmgiCiAKIGludCAoKnByb20pKHZvaWQgKik7CitwaGFuZGxlIGNob3Nlbl9oYW5kbGU7CitpaGFuZGxlIHN0ZG91dDsKIAotdm9pZCAqY2hvc2VuX2hhbmRsZTsKLQotdm9pZCAqc3RkaW47Ci12b2lkICpzdGRvdXQ7Ci12b2lkICpzdGRlcnI7Ci0KLQotaW50Ci13cml0ZSh2b2lkICpoYW5kbGUsIHZvaWQgKnB0ciwgaW50IG5iKQoraW50IGNhbGxfcHJvbShjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LCAuLi4pCiB7CisJaW50IGk7CiAJc3RydWN0IHByb21fYXJncyB7Ci0JCWNoYXIgKnNlcnZpY2U7CisJCWNvbnN0IGNoYXIgKnNlcnZpY2U7CiAJCWludCBuYXJnczsKIAkJaW50IG5yZXQ7Ci0JCXZvaWQgKmloYW5kbGU7Ci0JCXZvaWQgKmFkZHI7Ci0JCWludCBsZW47Ci0JCWludCBhY3R1YWw7CisJCXVuc2lnbmVkIGludCBhcmdzWzEyXTsKIAl9IGFyZ3M7CisJdmFfbGlzdCBsaXN0OwogCi0JYXJncy5zZXJ2aWNlID0gIndyaXRlIjsKLQlhcmdzLm5hcmdzID0gMzsKLQlhcmdzLm5yZXQgPSAxOwotCWFyZ3MuaWhhbmRsZSA9IGhhbmRsZTsKLQlhcmdzLmFkZHIgPSBwdHI7Ci0JYXJncy5sZW4gPSBuYjsKLQlhcmdzLmFjdHVhbCA9IC0xOwotCSgqcHJvbSkoJmFyZ3MpOwotCXJldHVybiBhcmdzLmFjdHVhbDsKKwlhcmdzLnNlcnZpY2UgPSBzZXJ2aWNlOworCWFyZ3MubmFyZ3MgPSBuYXJnczsKKwlhcmdzLm5yZXQgPSBucmV0OworCisJdmFfc3RhcnQobGlzdCwgbnJldCk7CisJZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCisJCWFyZ3MuYXJnc1tpXSA9IHZhX2FyZyhsaXN0LCB1bnNpZ25lZCBpbnQpOworCXZhX2VuZChsaXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBucmV0OyBpKyspCisJCWFyZ3MuYXJnc1tuYXJncytpXSA9IDA7CisKKwlpZiAocHJvbSgmYXJncykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gKG5yZXQgPiAwKT8gYXJncy5hcmdzW25hcmdzXTogMDsKIH0KIAotaW50Ci1yZWFkKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBpbnQgbmIpCitpbnQgY2FsbF9wcm9tX3JldChjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LAorCQkgIHVuc2lnbmVkIGludCAqcmV0cywgLi4uKQogeworCWludCBpOwogCXN0cnVjdCBwcm9tX2FyZ3MgewotCQljaGFyICpzZXJ2aWNlOworCQljb25zdCBjaGFyICpzZXJ2aWNlOwogCQlpbnQgbmFyZ3M7CiAJCWludCBucmV0OwotCQl2b2lkICppaGFuZGxlOwotCQl2b2lkICphZGRyOwotCQlpbnQgbGVuOwotCQlpbnQgYWN0dWFsOworCQl1bnNpZ25lZCBpbnQgYXJnc1sxMl07CiAJfSBhcmdzOworCXZhX2xpc3QgbGlzdDsKIAotCWFyZ3Muc2VydmljZSA9ICJyZWFkIjsKLQlhcmdzLm5hcmdzID0gMzsKLQlhcmdzLm5yZXQgPSAxOwotCWFyZ3MuaWhhbmRsZSA9IGhhbmRsZTsKLQlhcmdzLmFkZHIgPSBwdHI7Ci0JYXJncy5sZW4gPSBuYjsKLQlhcmdzLmFjdHVhbCA9IC0xOwotCSgqcHJvbSkoJmFyZ3MpOwotCXJldHVybiBhcmdzLmFjdHVhbDsKKwlhcmdzLnNlcnZpY2UgPSBzZXJ2aWNlOworCWFyZ3MubmFyZ3MgPSBuYXJnczsKKwlhcmdzLm5yZXQgPSBucmV0OworCisJdmFfc3RhcnQobGlzdCwgcmV0cyk7CisJZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCisJCWFyZ3MuYXJnc1tpXSA9IHZhX2FyZyhsaXN0LCB1bnNpZ25lZCBpbnQpOworCXZhX2VuZChsaXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBucmV0OyBpKyspCisJCWFyZ3MuYXJnc1tuYXJncytpXSA9IDA7CisKKwlpZiAocHJvbSgmYXJncykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocmV0cyAhPSAodm9pZCAqKSAwKQorCQlmb3IgKGkgPSAxOyBpIDwgbnJldDsgKytpKQorCQkJcmV0c1tpLTFdID0gYXJncy5hcmdzW25hcmdzK2ldOworCisJcmV0dXJuIChucmV0ID4gMCk/IGFyZ3MuYXJnc1tuYXJnc106IDA7CiB9CiAKLXZvaWQKLWV4aXQoKQoraW50IHdyaXRlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBpbnQgbmIpCiB7Ci0Jc3RydWN0IHByb21fYXJncyB7Ci0JCWNoYXIgKnNlcnZpY2U7Ci0JfSBhcmdzOwotCi0JZm9yICg7OykgewotCQlhcmdzLnNlcnZpY2UgPSAiZXhpdCI7Ci0JCSgqcHJvbSkoJmFyZ3MpOwotCX0KKwlyZXR1cm4gY2FsbF9wcm9tKCJ3cml0ZSIsIDMsIDEsIGhhbmRsZSwgcHRyLCBuYik7CiB9CiAKLXZvaWQKLXBhdXNlKHZvaWQpCi17Ci0Jc3RydWN0IHByb21fYXJncyB7Ci0JCWNoYXIgKnNlcnZpY2U7Ci0JfSBhcmdzOwotCi0JYXJncy5zZXJ2aWNlID0gImVudGVyIjsKLQkoKnByb20pKCZhcmdzKTsKLX0KLQotdm9pZCAqCi1maW5kZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHByb21fYXJncyB7Ci0JCWNoYXIgKnNlcnZpY2U7Ci0JCWludCBuYXJnczsKLQkJaW50IG5yZXQ7Ci0JCWNvbnN0IGNoYXIgKmRldnNwZWM7Ci0JCXZvaWQgKnBoYW5kbGU7Ci0JfSBhcmdzOwotCi0JYXJncy5zZXJ2aWNlID0gImZpbmRkZXZpY2UiOwotCWFyZ3MubmFyZ3MgPSAxOwotCWFyZ3MubnJldCA9IDE7Ci0JYXJncy5kZXZzcGVjID0gbmFtZTsKLQlhcmdzLnBoYW5kbGUgPSAodm9pZCAqKSAtMTsKLQkoKnByb20pKCZhcmdzKTsKLQlyZXR1cm4gYXJncy5waGFuZGxlOwotfQotCi12b2lkICoKLWNsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKQotewotCXN0cnVjdCBwcm9tX2FyZ3MgewotCQljaGFyICpzZXJ2aWNlOwotCQlpbnQgbmFyZ3M7Ci0JCWludCBucmV0OwotCQl1bnNpZ25lZCBpbnQgdmlydDsKLQkJdW5zaWduZWQgaW50IHNpemU7Ci0JCXVuc2lnbmVkIGludCBhbGlnbjsKLQkJdm9pZCAqcmV0OwotCX0gYXJnczsKLQotCWFyZ3Muc2VydmljZSA9ICJjbGFpbSI7Ci0JYXJncy5uYXJncyA9IDM7Ci0JYXJncy5ucmV0ID0gMTsKLQlhcmdzLnZpcnQgPSB2aXJ0OwotCWFyZ3Muc2l6ZSA9IHNpemU7Ci0JYXJncy5hbGlnbiA9IGFsaWduOwotCSgqcHJvbSkoJmFyZ3MpOwotCXJldHVybiBhcmdzLnJldDsKLX0KLQotaW50Ci1nZXRwcm9wKHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZiwgaW50IGJ1ZmxlbikKLXsKLQlzdHJ1Y3QgcHJvbV9hcmdzIHsKLQkJY2hhciAqc2VydmljZTsKLQkJaW50IG5hcmdzOwotCQlpbnQgbnJldDsKLQkJdm9pZCAqcGhhbmRsZTsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQkJdm9pZCAqYnVmOwotCQlpbnQgYnVmbGVuOwotCQlpbnQgc2l6ZTsKLQl9IGFyZ3M7Ci0KLQlhcmdzLnNlcnZpY2UgPSAiZ2V0cHJvcCI7Ci0JYXJncy5uYXJncyA9IDQ7Ci0JYXJncy5ucmV0ID0gMTsKLQlhcmdzLnBoYW5kbGUgPSBwaGFuZGxlOwotCWFyZ3MubmFtZSA9IG5hbWU7Ci0JYXJncy5idWYgPSBidWY7Ci0JYXJncy5idWZsZW4gPSBidWZsZW47Ci0JYXJncy5zaXplID0gLTE7Ci0JKCpwcm9tKSgmYXJncyk7Ci0JcmV0dXJuIGFyZ3Muc2l6ZTsKLX0KLQotaW50Ci1wdXRjKGludCBjLCB2b2lkICpmKQotewotCWNoYXIgY2ggPSBjOwotCi0JaWYgKGMgPT0gJ1xuJykKLQkJcHV0YygnXHInLCBmKTsKLQlyZXR1cm4gd3JpdGUoZiwgJmNoLCAxKSA9PSAxPyBjOiAtMTsKLX0KLQotaW50Ci1wdXRjaGFyKGludCBjKQotewotCXJldHVybiBwdXRjKGMsIHN0ZG91dCk7Ci19Ci0KLWludAotZnB1dHMoY2hhciAqc3RyLCB2b2lkICpmKQotewotCWludCBuID0gc3RybGVuKHN0cik7Ci0KLQlyZXR1cm4gd3JpdGUoZiwgc3RyLCBuKSA9PSBuPyAwOiAtMTsKLX0KLQotc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqIHMsIHNpemVfdCBjb3VudCkKLXsKLQljb25zdCBjaGFyICpzYzsKLQotCWZvciAoc2MgPSBzOyBjb3VudC0tICYmICpzYyAhPSAnXDAnOyArK3NjKQotCQkvKiBub3RoaW5nICovOwotCXJldHVybiBzYyAtIHM7Ci19Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgX19kaXY2NF8zMih1bnNpZ25lZCBsb25nIGxvbmcgKmRpdmlkZW5kLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBkaXZpc29yKTsKLQotLyogVGhlIHVubmVjZXNzYXJ5IHBvaW50ZXIgY29tcGFyZSBpcyB0aGVyZQotICogdG8gY2hlY2sgZm9yIHR5cGUgc2FmZXR5IChuIG11c3QgYmUgNjRiaXQpCisvKgorICogT2xkZXIgT0YncyByZXF1aXJlIHRoYXQgd2hlbiBjbGFpbWluZyBhIHNwZWNpZmljIHJhbmdlIG9mIGFkZHJlc3NlcywKKyAqIHdlIGNsYWltIHRoZSBwaHlzaWNhbCBzcGFjZSBpbiB0aGUgL21lbW9yeSBub2RlIGFuZCB0aGUgdmlydHVhbAorICogc3BhY2UgaW4gdGhlIGNob3NlbiBtbXUgbm9kZSwgYW5kIHRoZW4gZG8gYSBtYXAgb3BlcmF0aW9uIHRvCisgKiBtYXAgdmlydHVhbCB0byBwaHlzaWNhbC4KICAqLwotIyBkZWZpbmUgZG9fZGl2KG4sYmFzZSkgKHsJCQkJCQlcCi0JdW5zaWduZWQgaW50IF9fYmFzZSA9IChiYXNlKTsJCQkJCVwKLQl1bnNpZ25lZCBpbnQgX19yZW07CQkJCQkJXAotCSh2b2lkKSgoKHR5cGVvZigobikpICopMCkgPT0gKCh1bnNpZ25lZCBsb25nIGxvbmcgKikwKSk7CVwKLQlpZiAoKChuKSA+PiAzMikgPT0gMCkgewkJCQkJCVwKLQkJX19yZW0gPSAodW5zaWduZWQgaW50KShuKSAlIF9fYmFzZTsJCQlcCi0JCShuKSA9ICh1bnNpZ25lZCBpbnQpKG4pIC8gX19iYXNlOwkJCVwKLQl9IGVsc2UJCQkJCQkJCVwKLQkJX19yZW0gPSBfX2RpdjY0XzMyKCYobiksIF9fYmFzZSk7CQkJXAotCV9fcmVtOwkJCQkJCQkJXAotIH0pCitzdGF0aWMgaW50IG5lZWRfbWFwID0gLTE7CitzdGF0aWMgaWhhbmRsZSBjaG9zZW5fbW11Oworc3RhdGljIHBoYW5kbGUgbWVtb3J5OwogCi1zdGF0aWMgaW50IHNraXBfYXRvaShjb25zdCBjaGFyICoqcykKKy8qIHJldHVybnMgdHJ1ZSBpZiBzMiBpcyBhIHByZWZpeCBvZiBzMSAqLworc3RhdGljIGludCBzdHJpbmdfbWF0Y2goY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQogewotCWludCBpLCBjOwotCi0JZm9yIChpID0gMDsgJzAnIDw9IChjID0gKipzKSAmJiBjIDw9ICc5JzsgKysqcykKLQkJaSA9IGkqMTAgKyBjIC0gJzAnOwotCXJldHVybiBpOworCWZvciAoOyAqczI7ICsrczIpCisJCWlmICgqczErKyAhPSAqczIpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAotI2RlZmluZSBaRVJPUEFECTEJCS8qIHBhZCB3aXRoIHplcm8gKi8KLSNkZWZpbmUgU0lHTgkyCQkvKiB1bnNpZ25lZC9zaWduZWQgbG9uZyAqLwotI2RlZmluZSBQTFVTCTQJCS8qIHNob3cgcGx1cyAqLwotI2RlZmluZSBTUEFDRQk4CQkvKiBzcGFjZSBpZiBwbHVzICovCi0jZGVmaW5lIExFRlQJMTYJCS8qIGxlZnQganVzdGlmaWVkICovCi0jZGVmaW5lIFNQRUNJQUwJMzIJCS8qIDB4ICovCi0jZGVmaW5lIExBUkdFCTY0CQkvKiB1c2UgJ0FCQ0RFRicgaW5zdGVhZCBvZiAnYWJjZGVmJyAqLwotCi1zdGF0aWMgY2hhciAqIG51bWJlcihjaGFyICogc3RyLCB1bnNpZ25lZCBsb25nIGxvbmcgbnVtLCBpbnQgYmFzZSwgaW50IHNpemUsIGludCBwcmVjaXNpb24sIGludCB0eXBlKQorc3RhdGljIGludCBjaGVja19vZl92ZXJzaW9uKHZvaWQpCiB7Ci0JY2hhciBjLHNpZ24sdG1wWzY2XTsKLQljb25zdCBjaGFyICpkaWdpdHM9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7Ci0JaW50IGk7CisJcGhhbmRsZSBvcHJvbSwgY2hvc2VuOworCWNoYXIgdmVyc2lvbls2NF07CiAKLQlpZiAodHlwZSAmIExBUkdFKQotCQlkaWdpdHMgPSAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKLQlpZiAodHlwZSAmIExFRlQpCi0JCXR5cGUgJj0gflpFUk9QQUQ7Ci0JaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikKKwlvcHJvbSA9IGZpbmRkZXZpY2UoIi9vcGVucHJvbSIpOworCWlmIChvcHJvbSA9PSAocGhhbmRsZSkgLTEpCiAJCXJldHVybiAwOwotCWMgPSAodHlwZSAmIFpFUk9QQUQpID8gJzAnIDogJyAnOwotCXNpZ24gPSAwOwotCWlmICh0eXBlICYgU0lHTikgewotCQlpZiAoKHNpZ25lZCBsb25nIGxvbmcpbnVtIDwgMCkgewotCQkJc2lnbiA9ICctJzsKLQkJCW51bSA9IC0gKHNpZ25lZCBsb25nIGxvbmcpbnVtOwotCQkJc2l6ZS0tOwotCQl9IGVsc2UgaWYgKHR5cGUgJiBQTFVTKSB7Ci0JCQlzaWduID0gJysnOwotCQkJc2l6ZS0tOwotCQl9IGVsc2UgaWYgKHR5cGUgJiBTUEFDRSkgewotCQkJc2lnbiA9ICcgJzsKLQkJCXNpemUtLTsKKwlpZiAoZ2V0cHJvcChvcHJvbSwgIm1vZGVsIiwgdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKSA8PSAwKQorCQlyZXR1cm4gMDsKKwl2ZXJzaW9uW3NpemVvZih2ZXJzaW9uKS0xXSA9IDA7CisJcHJpbnRmKCJPRiB2ZXJzaW9uID0gJyVzJ1xyXG4iLCB2ZXJzaW9uKTsKKwlpZiAoIXN0cmluZ19tYXRjaCh2ZXJzaW9uLCAiT3BlbiBGaXJtd2FyZSwgMS4iKQorCSAgICAmJiAhc3RyaW5nX21hdGNoKHZlcnNpb24sICJGaXJtV29ya3MsMy4iKSkKKwkJcmV0dXJuIDA7CisJY2hvc2VuID0gZmluZGRldmljZSgiL2Nob3NlbiIpOworCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7CisJCWNob3NlbiA9IGZpbmRkZXZpY2UoIi9jaG9zZW5AMCIpOworCQlpZiAoY2hvc2VuID09IChwaGFuZGxlKSAtMSkgeworCQkJcHJpbnRmKCJubyBjaG9zZW5cbiIpOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0JaWYgKHR5cGUgJiBTUEVDSUFMKSB7Ci0JCWlmIChiYXNlID09IDE2KQotCQkJc2l6ZSAtPSAyOwotCQllbHNlIGlmIChiYXNlID09IDgpCi0JCQlzaXplLS07CisJaWYgKGdldHByb3AoY2hvc2VuLCAibW11IiwgJmNob3Nlbl9tbXUsIHNpemVvZihjaG9zZW5fbW11KSkgPD0gMCkgeworCQlwcmludGYoIm5vIG1tdVxuIik7CisJCXJldHVybiAwOwogCX0KLQlpID0gMDsKLQlpZiAobnVtID09IDApCi0JCXRtcFtpKytdPScwJzsKLQllbHNlIHdoaWxlIChudW0gIT0gMCkgewotCQl0bXBbaSsrXSA9IGRpZ2l0c1tkb19kaXYobnVtLCBiYXNlKV07Ci0JfQotCWlmIChpID4gcHJlY2lzaW9uKQotCQlwcmVjaXNpb24gPSBpOwotCXNpemUgLT0gcHJlY2lzaW9uOwotCWlmICghKHR5cGUmKFpFUk9QQUQrTEVGVCkpKQotCQl3aGlsZShzaXplLS0+MCkKLQkJCSpzdHIrKyA9ICcgJzsKLQlpZiAoc2lnbikKLQkJKnN0cisrID0gc2lnbjsKLQlpZiAodHlwZSAmIFNQRUNJQUwpIHsKLQkJaWYgKGJhc2U9PTgpCi0JCQkqc3RyKysgPSAnMCc7Ci0JCWVsc2UgaWYgKGJhc2U9PTE2KSB7Ci0JCQkqc3RyKysgPSAnMCc7Ci0JCQkqc3RyKysgPSBkaWdpdHNbMzNdOworCW1lbW9yeSA9IChpaGFuZGxlKSBjYWxsX3Byb20oIm9wZW4iLCAxLCAxLCAiL21lbW9yeSIpOworCWlmIChtZW1vcnkgPT0gKGloYW5kbGUpIC0xKSB7CisJCW1lbW9yeSA9IChpaGFuZGxlKSBjYWxsX3Byb20oIm9wZW4iLCAxLCAxLCAiL21lbW9yeUAwIik7CisJCWlmIChtZW1vcnkgPT0gKGloYW5kbGUpIC0xKSB7CisJCQlwcmludGYoIm5vIG1lbW9yeSBub2RlXG4iKTsKKwkJCXJldHVybiAwOwogCQl9CiAJfQotCWlmICghKHR5cGUgJiBMRUZUKSkKLQkJd2hpbGUgKHNpemUtLSA+IDApCi0JCQkqc3RyKysgPSBjOwotCXdoaWxlIChpIDwgcHJlY2lzaW9uLS0pCi0JCSpzdHIrKyA9ICcwJzsKLQl3aGlsZSAoaS0tID4gMCkKLQkJKnN0cisrID0gdG1wW2ldOwotCXdoaWxlIChzaXplLS0gPiAwKQotCQkqc3RyKysgPSAnICc7Ci0JcmV0dXJuIHN0cjsKKwlwcmludGYoIm9sZCBPRiBkZXRlY3RlZFxyXG4iKTsKKwlyZXR1cm4gMTsKIH0KIAotaW50IHZzcHJpbnRmKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit2b2lkICpjbGFpbSh1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbikKIHsKLQlpbnQgbGVuOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBudW07Ci0JaW50IGksIGJhc2U7Ci0JY2hhciAqIHN0cjsKLQljb25zdCBjaGFyICpzOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKIAotCWludCBmbGFnczsJCS8qIGZsYWdzIHRvIG51bWJlcigpICovCi0KLQlpbnQgZmllbGRfd2lkdGg7CS8qIHdpZHRoIG9mIG91dHB1dCBmaWVsZCAqLwotCWludCBwcmVjaXNpb247CQkvKiBtaW4uICMgb2YgZGlnaXRzIGZvciBpbnRlZ2VyczsgbWF4Ci0JCQkJICAgbnVtYmVyIG9mIGNoYXJzIGZvciBmcm9tIHN0cmluZyAqLwotCWludCBxdWFsaWZpZXI7CQkvKiAnaCcsICdsJywgb3IgJ0wnIGZvciBpbnRlZ2VyIGZpZWxkcyAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgIC8qICd6JyBzdXBwb3J0IGFkZGVkIDIzLzcvMTk5OSBTLkguICAgICovCi0JCQkJLyogJ3onIGNoYW5nZWQgdG8gJ1onIC0tZGF2aWRtIDEvMjUvOTkgKi8KLQorCWlmIChuZWVkX21hcCA8IDApCisJCW5lZWRfbWFwID0gY2hlY2tfb2ZfdmVyc2lvbigpOworCWlmIChhbGlnbiB8fCAhbmVlZF9tYXApCisJCXJldHVybiAodm9pZCAqKSBjYWxsX3Byb20oImNsYWltIiwgMywgMSwgdmlydCwgc2l6ZSwgYWxpZ24pOwogCQotCWZvciAoc3RyPWJ1ZiA7ICpmbXQgOyArK2ZtdCkgewotCQlpZiAoKmZtdCAhPSAnJScpIHsKLQkJCSpzdHIrKyA9ICpmbXQ7Ci0JCQljb250aW51ZTsKLQkJfQotCQkJCi0JCS8qIHByb2Nlc3MgZmxhZ3MgKi8KLQkJZmxhZ3MgPSAwOwotCQlyZXBlYXQ6Ci0JCQkrK2ZtdDsJCS8qIHRoaXMgYWxzbyBza2lwcyBmaXJzdCAnJScgKi8KLQkJCXN3aXRjaCAoKmZtdCkgewotCQkJCWNhc2UgJy0nOiBmbGFncyB8PSBMRUZUOyBnb3RvIHJlcGVhdDsKLQkJCQljYXNlICcrJzogZmxhZ3MgfD0gUExVUzsgZ290byByZXBlYXQ7Ci0JCQkJY2FzZSAnICc6IGZsYWdzIHw9IFNQQUNFOyBnb3RvIHJlcGVhdDsKLQkJCQljYXNlICcjJzogZmxhZ3MgfD0gU1BFQ0lBTDsgZ290byByZXBlYXQ7Ci0JCQkJY2FzZSAnMCc6IGZsYWdzIHw9IFpFUk9QQUQ7IGdvdG8gcmVwZWF0OwotCQkJCX0KLQkJCi0JCS8qIGdldCBmaWVsZCB3aWR0aCAqLwotCQlmaWVsZF93aWR0aCA9IC0xOwotCQlpZiAoJzAnIDw9ICpmbXQgJiYgKmZtdCA8PSAnOScpCi0JCQlmaWVsZF93aWR0aCA9IHNraXBfYXRvaSgmZm10KTsKLQkJZWxzZSBpZiAoKmZtdCA9PSAnKicpIHsKLQkJCSsrZm10OwotCQkJLyogaXQncyB0aGUgbmV4dCBhcmd1bWVudCAqLwotCQkJZmllbGRfd2lkdGggPSB2YV9hcmcoYXJncywgaW50KTsKLQkJCWlmIChmaWVsZF93aWR0aCA8IDApIHsKLQkJCQlmaWVsZF93aWR0aCA9IC1maWVsZF93aWR0aDsKLQkJCQlmbGFncyB8PSBMRUZUOwotCQkJfQotCQl9Ci0KLQkJLyogZ2V0IHRoZSBwcmVjaXNpb24gKi8KLQkJcHJlY2lzaW9uID0gLTE7Ci0JCWlmICgqZm10ID09ICcuJykgewotCQkJKytmbXQ7CQotCQkJaWYgKCcwJyA8PSAqZm10ICYmICpmbXQgPD0gJzknKQotCQkJCXByZWNpc2lvbiA9IHNraXBfYXRvaSgmZm10KTsKLQkJCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7Ci0JCQkJKytmbXQ7Ci0JCQkJLyogaXQncyB0aGUgbmV4dCBhcmd1bWVudCAqLwotCQkJCXByZWNpc2lvbiA9IHZhX2FyZyhhcmdzLCBpbnQpOwotCQkJfQotCQkJaWYgKHByZWNpc2lvbiA8IDApCi0JCQkJcHJlY2lzaW9uID0gMDsKLQkJfQotCi0JCS8qIGdldCB0aGUgY29udmVyc2lvbiBxdWFsaWZpZXIgKi8KLQkJcXVhbGlmaWVyID0gLTE7Ci0JCWlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJyB8fCAqZm10ID09J1onKSB7Ci0JCQlxdWFsaWZpZXIgPSAqZm10OwotCQkJKytmbXQ7Ci0JCX0KLQotCQkvKiBkZWZhdWx0IGJhc2UgKi8KLQkJYmFzZSA9IDEwOwotCi0JCXN3aXRjaCAoKmZtdCkgewotCQljYXNlICdjJzoKLQkJCWlmICghKGZsYWdzICYgTEVGVCkpCi0JCQkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQotCQkJCQkqc3RyKysgPSAnICc7Ci0JCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikgdmFfYXJnKGFyZ3MsIGludCk7Ci0JCQl3aGlsZSAoLS1maWVsZF93aWR0aCA+IDApCi0JCQkJKnN0cisrID0gJyAnOwotCQkJY29udGludWU7Ci0KLQkJY2FzZSAncyc6Ci0JCQlzID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7Ci0JCQlpZiAoIXMpCi0JCQkJcyA9ICI8TlVMTD4iOwotCi0JCQlsZW4gPSBzdHJubGVuKHMsIHByZWNpc2lvbik7Ci0KLQkJCWlmICghKGZsYWdzICYgTEVGVCkpCi0JCQkJd2hpbGUgKGxlbiA8IGZpZWxkX3dpZHRoLS0pCi0JCQkJCSpzdHIrKyA9ICcgJzsKLQkJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKLQkJCQkqc3RyKysgPSAqcysrOwotCQkJd2hpbGUgKGxlbiA8IGZpZWxkX3dpZHRoLS0pCi0JCQkJKnN0cisrID0gJyAnOwotCQkJY29udGludWU7Ci0KLQkJY2FzZSAncCc6Ci0JCQlpZiAoZmllbGRfd2lkdGggPT0gLTEpIHsKLQkJCQlmaWVsZF93aWR0aCA9IDIqc2l6ZW9mKHZvaWQgKik7Ci0JCQkJZmxhZ3MgfD0gWkVST1BBRDsKLQkJCX0KLQkJCXN0ciA9IG51bWJlcihzdHIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpIHZhX2FyZyhhcmdzLCB2b2lkICopLCAxNiwKLQkJCQlmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7Ci0JCQljb250aW51ZTsKLQotCi0JCWNhc2UgJ24nOgotCQkJaWYgKHF1YWxpZmllciA9PSAnbCcpIHsKLQkJCQlsb25nICogaXAgPSB2YV9hcmcoYXJncywgbG9uZyAqKTsKLQkJCQkqaXAgPSAoc3RyIC0gYnVmKTsKLQkJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdaJykgewotCQkJCXNpemVfdCAqIGlwID0gdmFfYXJnKGFyZ3MsIHNpemVfdCAqKTsKLQkJCQkqaXAgPSAoc3RyIC0gYnVmKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50ICogaXAgPSB2YV9hcmcoYXJncywgaW50ICopOwotCQkJCSppcCA9IChzdHIgLSBidWYpOwotCQkJfQotCQkJY29udGludWU7Ci0KLQkJY2FzZSAnJSc6Ci0JCQkqc3RyKysgPSAnJSc7Ci0JCQljb250aW51ZTsKLQotCQkvKiBpbnRlZ2VyIG51bWJlciBmb3JtYXRzIC0gc2V0IHVwIHRoZSBmbGFncyBhbmQgImJyZWFrIiAqLwotCQljYXNlICdvJzoKLQkJCWJhc2UgPSA4OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnWCc6Ci0JCQlmbGFncyB8PSBMQVJHRTsKLQkJY2FzZSAneCc6Ci0JCQliYXNlID0gMTY7Ci0JCQlicmVhazsKLQotCQljYXNlICdkJzoKLQkJY2FzZSAnaSc6Ci0JCQlmbGFncyB8PSBTSUdOOwotCQljYXNlICd1JzoKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQkqc3RyKysgPSAnJSc7Ci0JCQlpZiAoKmZtdCkKLQkJCQkqc3RyKysgPSAqZm10OwotCQkJZWxzZQotCQkJCS0tZm10OwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHF1YWxpZmllciA9PSAnbCcpIHsKLQkJCW51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKLQkJCWlmIChmbGFncyAmIFNJR04pCi0JCQkJbnVtID0gKHNpZ25lZCBsb25nKSBudW07Ci0JCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdaJykgewotCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHNpemVfdCk7Ci0JCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdoJykgewotCQkJbnVtID0gKHVuc2lnbmVkIHNob3J0KSB2YV9hcmcoYXJncywgaW50KTsKLQkJCWlmIChmbGFncyAmIFNJR04pCi0JCQkJbnVtID0gKHNpZ25lZCBzaG9ydCkgbnVtOwotCQl9IGVsc2UgewotCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7Ci0JCQlpZiAoZmxhZ3MgJiBTSUdOKQotCQkJCW51bSA9IChzaWduZWQgaW50KSBudW07Ci0JCX0KLQkJc3RyID0gbnVtYmVyKHN0ciwgbnVtLCBiYXNlLCBmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7Ci0JfQotCSpzdHIgPSAnXDAnOwotCXJldHVybiBzdHItYnVmOwotfQotCi1pbnQgc3ByaW50ZihjaGFyICogYnVmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IGFyZ3M7Ci0JaW50IGk7Ci0KLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCWk9dnNwcmludGYoYnVmLGZtdCxhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0JcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyBjaGFyIHNwcmludF9idWZbMTAyNF07Ci0KLWludAotcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQlpbnQgbjsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JbiA9IHZzcHJpbnRmKHNwcmludF9idWYsIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCXdyaXRlKHN0ZG91dCwgc3ByaW50X2J1Ziwgbik7Ci0JcmV0dXJuIG47CisJcmV0ID0gY2FsbF9wcm9tX3JldCgiY2FsbC1tZXRob2QiLCA1LCAyLCAmcmVzdWx0LCAiY2xhaW0iLCBtZW1vcnksCisJCQkgICAgYWxpZ24sIHNpemUsIHZpcnQpOworCWlmIChyZXQgIT0gMCB8fCByZXN1bHQgPT0gLTEpCisJCXJldHVybiAodm9pZCAqKSAtMTsKKwlyZXQgPSBjYWxsX3Byb21fcmV0KCJjYWxsLW1ldGhvZCIsIDUsIDIsICZyZXN1bHQsICJjbGFpbSIsIGNob3Nlbl9tbXUsCisJCQkgICAgYWxpZ24sIHNpemUsIHZpcnQpOworCS8qIDB4MTIgPT0gY29oZXJlbnQgKyByZWFkL3dyaXRlICovCisJcmV0ID0gY2FsbF9wcm9tKCJjYWxsLW1ldGhvZCIsIDYsIDEsICJtYXAiLCBjaG9zZW5fbW11LAorCQkJMHgxMiwgc2l6ZSwgdmlydCwgdmlydCk7CisJcmV0dXJuICh2b2lkICopIHZpcnQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wcm9tLmggYi9hcmNoL3Bvd2VycGMvYm9vdC9wcm9tLmgKaW5kZXggOTZhYjVhZS4uM2UyZGRkNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvcHJvbS5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3Byb20uaApAQCAtMSwxOCArMSwzNCBAQAogI2lmbmRlZiBfUFBDX0JPT1RfUFJPTV9IXwogI2RlZmluZSBfUFBDX0JPT1RfUFJPTV9IXwogCi1leHRlcm4gaW50ICgqcHJvbSkgKHZvaWQgKik7Ci1leHRlcm4gdm9pZCAqY2hvc2VuX2hhbmRsZTsKK3R5cGVkZWYgdm9pZCAqcGhhbmRsZTsKK3R5cGVkZWYgdm9pZCAqaWhhbmRsZTsKIAotZXh0ZXJuIHZvaWQgKnN0ZGluOwotZXh0ZXJuIHZvaWQgKnN0ZG91dDsKLWV4dGVybiB2b2lkICpzdGRlcnI7CitleHRlcm4gaW50ICgqcHJvbSkgKHZvaWQgKik7CitleHRlcm4gcGhhbmRsZSBjaG9zZW5faGFuZGxlOworZXh0ZXJuIGloYW5kbGUgc3Rkb3V0OworCitpbnQJY2FsbF9wcm9tKGNvbnN0IGNoYXIgKnNlcnZpY2UsIGludCBuYXJncywgaW50IG5yZXQsIC4uLik7CitpbnQJY2FsbF9wcm9tX3JldChjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LAorCQkgICAgICB1bnNpZ25lZCBpbnQgKnJldHMsIC4uLik7CiAKIGV4dGVybiBpbnQgd3JpdGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIGludCBuYik7Ci1leHRlcm4gaW50IHJlYWQodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIGludCBuYik7Ci1leHRlcm4gdm9pZCBleGl0KHZvaWQpOwotZXh0ZXJuIHZvaWQgcGF1c2Uodm9pZCk7Ci1leHRlcm4gdm9pZCAqZmluZGRldmljZShjb25zdCBjaGFyICopOwotZXh0ZXJuIHZvaWQgKmNsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKTsKLWV4dGVybiBpbnQgZ2V0cHJvcCh2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWYsIGludCBidWZsZW4pOworZXh0ZXJuIHZvaWQgKmNsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsbik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleGl0KHZvaWQpCit7CisJY2FsbF9wcm9tKCJleGl0IiwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgcGhhbmRsZSBmaW5kZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIChwaGFuZGxlKSBjYWxsX3Byb20oImZpbmRkZXZpY2UiLCAxLCAxLCBuYW1lKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0cHJvcCh2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICB2b2lkICpidWYsIGludCBidWZsZW4pCit7CisJcmV0dXJuIGNhbGxfcHJvbSgiZ2V0cHJvcCIsIDQsIDEsIHBoYW5kbGUsIG5hbWUsIGJ1ZiwgYnVmbGVuKTsKK30KKwogI2VuZGlmCQkJCS8qIF9QUENfQk9PVF9QUk9NX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9yczYwMDAuaCBiL2FyY2gvcG93ZXJwYy9ib290L3JzNjAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2Y0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9yczYwMDAuaApAQCAtMCwwICsxLDI0MyBAQAorLyogSUJNIFJTLzYwMDAgIlhDT0ZGIiBmaWxlIGRlZmluaXRpb25zIGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KKyAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCisgICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKKyAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCisgICBXcml0dGVuIGJ5IE1pbWkgUGhcMzczXDM2NG5nLVRoXDM0NW8gVlwzNjUgb2YgSUJNCisgICBhbmQgSm9obiBHaWxtb3JlIG9mIEN5Z251cyBTdXBwb3J0LiAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgeworCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKwljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KKwljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKwljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisJY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KKwljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKwljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KK307CisKKyAgICAgICAgLyogSUJNIFJTLzYwMDAgKi8KKyNkZWZpbmUgVTgwMldSTUFHSUMgICAgIDA3MzAgICAgLyogd3JpdGVhYmxlIHRleHQgc2VnbWVudHMgKipjaGgqKiAgICAgICovCisjZGVmaW5lIFU4MDJST01BR0lDICAgICAwNzM1ICAgIC8qIHJlYWRvbmx5IHNoYXJhYmxlIHRleHQgc2VnbWVudHMgICAgICAqLworI2RlZmluZSBVODAyVE9DTUFHSUMgICAgMDczNyAgICAvKiByZWFkb25seSB0ZXh0IHNlZ21lbnRzIGFuZCBUT0MgICAgICAgKi8KKworI2RlZmluZSBCQURNQUcoeCkJXAorCSgoeCkuZl9tYWdpYyAhPSBVODAyUk9NQUdJQyAmJiAoeCkuZl9tYWdpYyAhPSBVODAyV1JNQUdJQyAmJiBcCisJICh4KS5mX21hZ2ljICE9IFU4MDJUT0NNQUdJQykKKworI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKKyNkZWZpbmUJRklMSFNaCTIwCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIJbWFnaWNbMl07CS8qIHR5cGUgb2YgZmlsZQkJCSovCisgIHVuc2lnbmVkIGNoYXIJdnN0YW1wWzJdOwkvKiB2ZXJzaW9uIHN0YW1wCQkqLworICB1bnNpZ25lZCBjaGFyCXRzaXplWzRdOwkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5ICovCisgIHVuc2lnbmVkIGNoYXIJZHNpemVbNF07CS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkqLworICB1bnNpZ25lZCBjaGFyCWJzaXplWzRdOwkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJKi8KKyAgdW5zaWduZWQgY2hhcgllbnRyeVs0XTsJLyogZW50cnkgcHQuCQkJKi8KKyAgdW5zaWduZWQgY2hhcgl0ZXh0X3N0YXJ0WzRdOwkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIHVuc2lnbmVkIGNoYXIJZGF0YV9zdGFydFs0XTsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICB1bnNpZ25lZCBjaGFyCW9fdG9jWzRdOwkvKiBhZGRyZXNzIG9mIFRPQyAqLworICB1bnNpZ25lZCBjaGFyCW9fc25lbnRyeVsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgZW50cnkgcG9pbnQgKi8KKyAgdW5zaWduZWQgY2hhcglvX3NudGV4dFsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLnRleHQgc2VjdGlvbiAqLworICB1bnNpZ25lZCBjaGFyCW9fc25kYXRhWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAuZGF0YSBzZWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJb19zbnRvY1syXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgVE9DICovCisgIHVuc2lnbmVkIGNoYXIJb19zbmxvYWRlclsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLmxvYWRlciBzZWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJb19zbmJzc1syXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLmJzcyBzZWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJb19hbGdudGV4dFsyXTsJLyogLnRleHQgYWxpZ25tZW50ICovCisgIHVuc2lnbmVkIGNoYXIJb19hbGduZGF0YVsyXTsJLyogLmRhdGEgYWxpZ25tZW50ICovCisgIHVuc2lnbmVkIGNoYXIJb19tb2R0eXBlWzJdOwkvKiBtb2R1bGUgdHlwZSAoPz8pICovCisgIHVuc2lnbmVkIGNoYXIgb19jcHV0eXBlWzJdOwkvKiBjcHUgdHlwZSAqLworICB1bnNpZ25lZCBjaGFyCW9fbWF4c3RhY2tbNF07CS8qIG1heCBzdGFjayBzaXplICg/PykgKi8KKyAgdW5zaWduZWQgY2hhciBvX21heGRhdGFbNF07CS8qIG1heCBkYXRhIHNpemUgKD8/KSAqLworICB1bnNpZ25lZCBjaGFyCW9fcmVzdjJbMTJdOwkvKiByZXNlcnZlZCAqLworfQorQU9VVEhEUjsKKworI2RlZmluZSBBT1VUU1ogNzIKKyNkZWZpbmUgU01BTExfQU9VVFNaICgyOCkKKyNkZWZpbmUgQU9VVEhEUlNaIDcyCisKKyNkZWZpbmUJUlM2S19BT1VUSERSX09NQUdJQwkweDAxMDcJLyogb2xkOiB0ZXh0ICYgZGF0YSB3cml0ZWFibGUgKi8KKyNkZWZpbmUJUlM2S19BT1VUSERSX05NQUdJQwkweDAxMDgJLyogbmV3OiB0ZXh0IHIvbywgZGF0YSByL3cgKi8KKyNkZWZpbmUJUlM2S19BT1VUSERSX1pNQUdJQwkweDAxMEIJLyogcGFnZWQ6IHRleHQgci9vLCBib3RoIHBhZ2UtYWxpZ25lZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RydWN0IGV4dGVybmFsX3NjbmhkciB7CisJY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLworCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCisJY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLworCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KKwljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKwljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLworCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCisJY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KKwljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCisJY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLworfTsKKworLyoKKyAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucworICovCisjZGVmaW5lIF9URVhUCSIudGV4dCIKKyNkZWZpbmUgX0RBVEEJIi5kYXRhIgorI2RlZmluZSBfQlNTCSIuYnNzIgorI2RlZmluZSBfUEFECSIucGFkIgorI2RlZmluZSBfTE9BREVSCSIubG9hZGVyIgorCisjZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCisjZGVmaW5lCVNDTkhTWgk0MAorCisvKiBYQ09GRiB1c2VzIGEgc3BlY2lhbCAubG9hZGVyIHNlY3Rpb24gd2l0aCB0eXBlIFNUWVBfTE9BREVSLiAgKi8KKyNkZWZpbmUgU1RZUF9MT0FERVIgMHgxMDAwCisKKy8qIFhDT0ZGIHVzZXMgYSBzcGVjaWFsIC5kZWJ1ZyBzZWN0aW9uIHdpdGggdHlwZSBTVFlQX0RFQlVHLiAgKi8KKyNkZWZpbmUgU1RZUF9ERUJVRyAweDIwMDAKKworLyogWENPRkYgaGFuZGxlcyBsaW5lIG51bWJlciBvciByZWxvY2F0aW9uIG92ZXJmbG93IGJ5IGNyZWF0aW5nCisgICBhbm90aGVyIHNlY3Rpb24gaGVhZGVyIHdpdGggU1RZUF9PVlJGTE8gc2V0LiAgKi8KKyNkZWZpbmUgU1RZUF9PVlJGTE8gMHg4MDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KKyAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgorICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKKyAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAqLworc3RydWN0IGV4dGVybmFsX2xpbmVubyB7CisJdW5pb24geworCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KKwkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KKwl9IGxfYWRkcjsKKwljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCit9OworCisKKyNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KKyNkZWZpbmUJTElORVNaCTYKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCisjZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLworI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KKworc3RydWN0IGV4dGVybmFsX3N5bWVudAoreworICB1bmlvbiB7CisgICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07CisgICAgc3RydWN0IHsKKyAgICAgIGNoYXIgZV96ZXJvZXNbNF07CisgICAgICBjaGFyIGVfb2Zmc2V0WzRdOworICAgIH0gZTsKKyAgfSBlOworICBjaGFyIGVfdmFsdWVbNF07CisgIGNoYXIgZV9zY251bVsyXTsKKyAgY2hhciBlX3R5cGVbMl07CisgIGNoYXIgZV9zY2xhc3NbMV07CisgIGNoYXIgZV9udW1hdXhbMV07Cit9OworCisKKworI2RlZmluZSBOX0JUTUFTSwkoMDE3KQorI2RlZmluZSBOX1RNQVNLCQkoMDYwKQorI2RlZmluZSBOX0JUU0hGVAkoNCkKKyNkZWZpbmUgTl9UU0hJRlQJKDIpCisKKwordW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKKwlzdHJ1Y3QgeworCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCisJCXVuaW9uIHsKKwkJCXN0cnVjdCB7CisJCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLworCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KKwkJCX0geF9sbnN6OworCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCisJCX0geF9taXNjOworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCisJCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCisJCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCisJCQl9IHhfZmNuOworCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLworCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07CisJCQl9IHhfYXJ5OworCQl9IHhfZmNuYXJ5OworCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLworCX0geF9zeW07CisKKwl1bmlvbiB7CisJCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKKwkJc3RydWN0IHsKKwkJCWNoYXIgeF96ZXJvZXNbNF07CisJCQljaGFyIHhfb2Zmc2V0WzRdOworCQl9IHhfbjsKKwl9IHhfZmlsZTsKKworCXN0cnVjdCB7CisJCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KKwkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KKwkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KKwl9IHhfc2NuOworCisgICAgICAgIHN0cnVjdCB7CisJCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KKwkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCisJCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KKwl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCisKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIHhfc2NubGVuWzRdOworCQl1bnNpZ25lZCBjaGFyIHhfcGFybWhhc2hbNF07CisJCXVuc2lnbmVkIGNoYXIgeF9zbmhhc2hbMl07CisJCXVuc2lnbmVkIGNoYXIgeF9zbXR5cFsxXTsKKwkJdW5zaWduZWQgY2hhciB4X3NtY2xhc1sxXTsKKwkJdW5zaWduZWQgY2hhciB4X3N0YWJbNF07CisJCXVuc2lnbmVkIGNoYXIgeF9zbnN0YWJbMl07CisJfSB4X2NzZWN0OworCit9OworCisjZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50CisjZGVmaW5lCVNZTUVTWgkxOAorI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50CisjZGVmaW5lCUFVWEVTWgkxOAorI2RlZmluZSBEQlhNQVNLIDB4ODAJCS8qIGZvciBkYnggc3RvcmFnZSBtYXNrICovCisjZGVmaW5lIFNZTU5BTUVfSU5fREVCVUcoc3ltcHRyKSAoKHN5bXB0ciktPm5fc2NsYXNzICYgREJYTUFTSykKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0cnVjdCBleHRlcm5hbF9yZWxvYyB7CisgIGNoYXIgcl92YWRkcls0XTsKKyAgY2hhciByX3N5bW5keFs0XTsKKyAgY2hhciByX3NpemVbMV07CisgIGNoYXIgcl90eXBlWzFdOworfTsKKworCisjZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYworI2RlZmluZSBSRUxTWiAxMAorCisjZGVmaW5lIERFRkFVTFRfREFUQV9TRUNUSU9OX0FMSUdOTUVOVCA0CisjZGVmaW5lIERFRkFVTFRfQlNTX1NFQ1RJT05fQUxJR05NRU5UIDQKKyNkZWZpbmUgREVGQVVMVF9URVhUX1NFQ1RJT05fQUxJR05NRU5UIDQKKy8qIEZvciBuZXcgc2VjdGlvbnMgd2UgaGF2bid0IGhlYXJkIG9mIGJlZm9yZSAqLworI2RlZmluZSBERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UIDQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YWE1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5jCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAxOTk3LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgInByb20uaCIKKworc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqIHMsIHNpemVfdCBjb3VudCkKK3sKKwljb25zdCBjaGFyICpzYzsKKworCWZvciAoc2MgPSBzOyBjb3VudC0tICYmICpzYyAhPSAnXDAnOyArK3NjKQorCQkvKiBub3RoaW5nICovOworCXJldHVybiBzYyAtIHM7Cit9CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgX19kaXY2NF8zMih1bnNpZ25lZCBsb25nIGxvbmcgKmRpdmlkZW5kLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBkaXZpc29yKTsKKworLyogVGhlIHVubmVjZXNzYXJ5IHBvaW50ZXIgY29tcGFyZSBpcyB0aGVyZQorICogdG8gY2hlY2sgZm9yIHR5cGUgc2FmZXR5IChuIG11c3QgYmUgNjRiaXQpCisgKi8KKyMgZGVmaW5lIGRvX2RpdihuLGJhc2UpICh7CQkJCQkJXAorCXVuc2lnbmVkIGludCBfX2Jhc2UgPSAoYmFzZSk7CQkJCQlcCisJdW5zaWduZWQgaW50IF9fcmVtOwkJCQkJCVwKKwkodm9pZCkoKCh0eXBlb2YoKG4pKSAqKTApID09ICgodW5zaWduZWQgbG9uZyBsb25nICopMCkpOwlcCisJaWYgKCgobikgPj4gMzIpID09IDApIHsJCQkJCQlcCisJCV9fcmVtID0gKHVuc2lnbmVkIGludCkobikgJSBfX2Jhc2U7CQkJXAorCQkobikgPSAodW5zaWduZWQgaW50KShuKSAvIF9fYmFzZTsJCQlcCisJfSBlbHNlCQkJCQkJCQlcCisJCV9fcmVtID0gX19kaXY2NF8zMigmKG4pLCBfX2Jhc2UpOwkJCVwKKwlfX3JlbTsJCQkJCQkJCVwKKyB9KQorCitzdGF0aWMgaW50IHNraXBfYXRvaShjb25zdCBjaGFyICoqcykKK3sKKwlpbnQgaSwgYzsKKworCWZvciAoaSA9IDA7ICcwJyA8PSAoYyA9ICoqcykgJiYgYyA8PSAnOSc7ICsrKnMpCisJCWkgPSBpKjEwICsgYyAtICcwJzsKKwlyZXR1cm4gaTsKK30KKworI2RlZmluZSBaRVJPUEFECTEJCS8qIHBhZCB3aXRoIHplcm8gKi8KKyNkZWZpbmUgU0lHTgkyCQkvKiB1bnNpZ25lZC9zaWduZWQgbG9uZyAqLworI2RlZmluZSBQTFVTCTQJCS8qIHNob3cgcGx1cyAqLworI2RlZmluZSBTUEFDRQk4CQkvKiBzcGFjZSBpZiBwbHVzICovCisjZGVmaW5lIExFRlQJMTYJCS8qIGxlZnQganVzdGlmaWVkICovCisjZGVmaW5lIFNQRUNJQUwJMzIJCS8qIDB4ICovCisjZGVmaW5lIExBUkdFCTY0CQkvKiB1c2UgJ0FCQ0RFRicgaW5zdGVhZCBvZiAnYWJjZGVmJyAqLworCitzdGF0aWMgY2hhciAqIG51bWJlcihjaGFyICogc3RyLCB1bnNpZ25lZCBsb25nIGxvbmcgbnVtLCBpbnQgYmFzZSwgaW50IHNpemUsIGludCBwcmVjaXNpb24sIGludCB0eXBlKQoreworCWNoYXIgYyxzaWduLHRtcFs2Nl07CisJY29uc3QgY2hhciAqZGlnaXRzPSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCWludCBpOworCisJaWYgKHR5cGUgJiBMQVJHRSkKKwkJZGlnaXRzID0gIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7CisJaWYgKHR5cGUgJiBMRUZUKQorCQl0eXBlICY9IH5aRVJPUEFEOworCWlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpCisJCXJldHVybiAwOworCWMgPSAodHlwZSAmIFpFUk9QQUQpID8gJzAnIDogJyAnOworCXNpZ24gPSAwOworCWlmICh0eXBlICYgU0lHTikgeworCQlpZiAoKHNpZ25lZCBsb25nIGxvbmcpbnVtIDwgMCkgeworCQkJc2lnbiA9ICctJzsKKwkJCW51bSA9IC0gKHNpZ25lZCBsb25nIGxvbmcpbnVtOworCQkJc2l6ZS0tOworCQl9IGVsc2UgaWYgKHR5cGUgJiBQTFVTKSB7CisJCQlzaWduID0gJysnOworCQkJc2l6ZS0tOworCQl9IGVsc2UgaWYgKHR5cGUgJiBTUEFDRSkgeworCQkJc2lnbiA9ICcgJzsKKwkJCXNpemUtLTsKKwkJfQorCX0KKwlpZiAodHlwZSAmIFNQRUNJQUwpIHsKKwkJaWYgKGJhc2UgPT0gMTYpCisJCQlzaXplIC09IDI7CisJCWVsc2UgaWYgKGJhc2UgPT0gOCkKKwkJCXNpemUtLTsKKwl9CisJaSA9IDA7CisJaWYgKG51bSA9PSAwKQorCQl0bXBbaSsrXT0nMCc7CisJZWxzZSB3aGlsZSAobnVtICE9IDApIHsKKwkJdG1wW2krK10gPSBkaWdpdHNbZG9fZGl2KG51bSwgYmFzZSldOworCX0KKwlpZiAoaSA+IHByZWNpc2lvbikKKwkJcHJlY2lzaW9uID0gaTsKKwlzaXplIC09IHByZWNpc2lvbjsKKwlpZiAoISh0eXBlJihaRVJPUEFEK0xFRlQpKSkKKwkJd2hpbGUoc2l6ZS0tPjApCisJCQkqc3RyKysgPSAnICc7CisJaWYgKHNpZ24pCisJCSpzdHIrKyA9IHNpZ247CisJaWYgKHR5cGUgJiBTUEVDSUFMKSB7CisJCWlmIChiYXNlPT04KQorCQkJKnN0cisrID0gJzAnOworCQllbHNlIGlmIChiYXNlPT0xNikgeworCQkJKnN0cisrID0gJzAnOworCQkJKnN0cisrID0gZGlnaXRzWzMzXTsKKwkJfQorCX0KKwlpZiAoISh0eXBlICYgTEVGVCkpCisJCXdoaWxlIChzaXplLS0gPiAwKQorCQkJKnN0cisrID0gYzsKKwl3aGlsZSAoaSA8IHByZWNpc2lvbi0tKQorCQkqc3RyKysgPSAnMCc7CisJd2hpbGUgKGktLSA+IDApCisJCSpzdHIrKyA9IHRtcFtpXTsKKwl3aGlsZSAoc2l6ZS0tID4gMCkKKwkJKnN0cisrID0gJyAnOworCXJldHVybiBzdHI7Cit9CisKK2ludCB2c3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQoreworCWludCBsZW47CisJdW5zaWduZWQgbG9uZyBsb25nIG51bTsKKwlpbnQgaSwgYmFzZTsKKwljaGFyICogc3RyOworCWNvbnN0IGNoYXIgKnM7CisKKwlpbnQgZmxhZ3M7CQkvKiBmbGFncyB0byBudW1iZXIoKSAqLworCisJaW50IGZpZWxkX3dpZHRoOwkvKiB3aWR0aCBvZiBvdXRwdXQgZmllbGQgKi8KKwlpbnQgcHJlY2lzaW9uOwkJLyogbWluLiAjIG9mIGRpZ2l0cyBmb3IgaW50ZWdlcnM7IG1heAorCQkJCSAgIG51bWJlciBvZiBjaGFycyBmb3IgZnJvbSBzdHJpbmcgKi8KKwlpbnQgcXVhbGlmaWVyOwkJLyogJ2gnLCAnbCcsIG9yICdMJyBmb3IgaW50ZWdlciBmaWVsZHMgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAvKiAneicgc3VwcG9ydCBhZGRlZCAyMy83LzE5OTkgUy5ILiAgICAqLworCQkJCS8qICd6JyBjaGFuZ2VkIHRvICdaJyAtLWRhdmlkbSAxLzI1Lzk5ICovCisKKwkKKwlmb3IgKHN0cj1idWYgOyAqZm10IDsgKytmbXQpIHsKKwkJaWYgKCpmbXQgIT0gJyUnKSB7CisJCQkqc3RyKysgPSAqZm10OworCQkJY29udGludWU7CisJCX0KKwkJCQorCQkvKiBwcm9jZXNzIGZsYWdzICovCisJCWZsYWdzID0gMDsKKwkJcmVwZWF0OgorCQkJKytmbXQ7CQkvKiB0aGlzIGFsc28gc2tpcHMgZmlyc3QgJyUnICovCisJCQlzd2l0Y2ggKCpmbXQpIHsKKwkJCQljYXNlICctJzogZmxhZ3MgfD0gTEVGVDsgZ290byByZXBlYXQ7CisJCQkJY2FzZSAnKyc6IGZsYWdzIHw9IFBMVVM7IGdvdG8gcmVwZWF0OworCQkJCWNhc2UgJyAnOiBmbGFncyB8PSBTUEFDRTsgZ290byByZXBlYXQ7CisJCQkJY2FzZSAnIyc6IGZsYWdzIHw9IFNQRUNJQUw7IGdvdG8gcmVwZWF0OworCQkJCWNhc2UgJzAnOiBmbGFncyB8PSBaRVJPUEFEOyBnb3RvIHJlcGVhdDsKKwkJCQl9CisJCQorCQkvKiBnZXQgZmllbGQgd2lkdGggKi8KKwkJZmllbGRfd2lkdGggPSAtMTsKKwkJaWYgKCcwJyA8PSAqZm10ICYmICpmbXQgPD0gJzknKQorCQkJZmllbGRfd2lkdGggPSBza2lwX2F0b2koJmZtdCk7CisJCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7CisJCQkrK2ZtdDsKKwkJCS8qIGl0J3MgdGhlIG5leHQgYXJndW1lbnQgKi8KKwkJCWZpZWxkX3dpZHRoID0gdmFfYXJnKGFyZ3MsIGludCk7CisJCQlpZiAoZmllbGRfd2lkdGggPCAwKSB7CisJCQkJZmllbGRfd2lkdGggPSAtZmllbGRfd2lkdGg7CisJCQkJZmxhZ3MgfD0gTEVGVDsKKwkJCX0KKwkJfQorCisJCS8qIGdldCB0aGUgcHJlY2lzaW9uICovCisJCXByZWNpc2lvbiA9IC0xOworCQlpZiAoKmZtdCA9PSAnLicpIHsKKwkJCSsrZm10OwkKKwkJCWlmICgnMCcgPD0gKmZtdCAmJiAqZm10IDw9ICc5JykKKwkJCQlwcmVjaXNpb24gPSBza2lwX2F0b2koJmZtdCk7CisJCQllbHNlIGlmICgqZm10ID09ICcqJykgeworCQkJCSsrZm10OworCQkJCS8qIGl0J3MgdGhlIG5leHQgYXJndW1lbnQgKi8KKwkJCQlwcmVjaXNpb24gPSB2YV9hcmcoYXJncywgaW50KTsKKwkJCX0KKwkJCWlmIChwcmVjaXNpb24gPCAwKQorCQkJCXByZWNpc2lvbiA9IDA7CisJCX0KKworCQkvKiBnZXQgdGhlIGNvbnZlcnNpb24gcXVhbGlmaWVyICovCisJCXF1YWxpZmllciA9IC0xOworCQlpZiAoKmZtdCA9PSAnaCcgfHwgKmZtdCA9PSAnbCcgfHwgKmZtdCA9PSAnTCcgfHwgKmZtdCA9PSdaJykgeworCQkJcXVhbGlmaWVyID0gKmZtdDsKKwkJCSsrZm10OworCQl9CisKKwkJLyogZGVmYXVsdCBiYXNlICovCisJCWJhc2UgPSAxMDsKKworCQlzd2l0Y2ggKCpmbXQpIHsKKwkJY2FzZSAnYyc6CisJCQlpZiAoIShmbGFncyAmIExFRlQpKQorCQkJCXdoaWxlICgtLWZpZWxkX3dpZHRoID4gMCkKKwkJCQkJKnN0cisrID0gJyAnOworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpIHZhX2FyZyhhcmdzLCBpbnQpOworCQkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQorCQkJCSpzdHIrKyA9ICcgJzsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgJ3MnOgorCQkJcyA9IHZhX2FyZyhhcmdzLCBjaGFyICopOworCQkJaWYgKCFzKQorCQkJCXMgPSAiPE5VTEw+IjsKKworCQkJbGVuID0gc3RybmxlbihzLCBwcmVjaXNpb24pOworCisJCQlpZiAoIShmbGFncyAmIExFRlQpKQorCQkJCXdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKQorCQkJCQkqc3RyKysgPSAnICc7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCQkJKnN0cisrID0gKnMrKzsKKwkJCXdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKQorCQkJCSpzdHIrKyA9ICcgJzsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgJ3AnOgorCQkJaWYgKGZpZWxkX3dpZHRoID09IC0xKSB7CisJCQkJZmllbGRfd2lkdGggPSAyKnNpemVvZih2b2lkICopOworCQkJCWZsYWdzIHw9IFpFUk9QQUQ7CisJCQl9CisJCQlzdHIgPSBudW1iZXIoc3RyLAorCQkJCSh1bnNpZ25lZCBsb25nKSB2YV9hcmcoYXJncywgdm9pZCAqKSwgMTYsCisJCQkJZmllbGRfd2lkdGgsIHByZWNpc2lvbiwgZmxhZ3MpOworCQkJY29udGludWU7CisKKworCQljYXNlICduJzoKKwkJCWlmIChxdWFsaWZpZXIgPT0gJ2wnKSB7CisJCQkJbG9uZyAqIGlwID0gdmFfYXJnKGFyZ3MsIGxvbmcgKik7CisJCQkJKmlwID0gKHN0ciAtIGJ1Zik7CisJCQl9IGVsc2UgaWYgKHF1YWxpZmllciA9PSAnWicpIHsKKwkJCQlzaXplX3QgKiBpcCA9IHZhX2FyZyhhcmdzLCBzaXplX3QgKik7CisJCQkJKmlwID0gKHN0ciAtIGJ1Zik7CisJCQl9IGVsc2UgeworCQkJCWludCAqIGlwID0gdmFfYXJnKGFyZ3MsIGludCAqKTsKKwkJCQkqaXAgPSAoc3RyIC0gYnVmKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCisJCWNhc2UgJyUnOgorCQkJKnN0cisrID0gJyUnOworCQkJY29udGludWU7CisKKwkJLyogaW50ZWdlciBudW1iZXIgZm9ybWF0cyAtIHNldCB1cCB0aGUgZmxhZ3MgYW5kICJicmVhayIgKi8KKwkJY2FzZSAnbyc6CisJCQliYXNlID0gODsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1gnOgorCQkJZmxhZ3MgfD0gTEFSR0U7CisJCWNhc2UgJ3gnOgorCQkJYmFzZSA9IDE2OworCQkJYnJlYWs7CisKKwkJY2FzZSAnZCc6CisJCWNhc2UgJ2knOgorCQkJZmxhZ3MgfD0gU0lHTjsKKwkJY2FzZSAndSc6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKnN0cisrID0gJyUnOworCQkJaWYgKCpmbXQpCisJCQkJKnN0cisrID0gKmZtdDsKKwkJCWVsc2UKKwkJCQktLWZtdDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChxdWFsaWZpZXIgPT0gJ2wnKSB7CisJCQludW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgbG9uZyk7CisJCQlpZiAoZmxhZ3MgJiBTSUdOKQorCQkJCW51bSA9IChzaWduZWQgbG9uZykgbnVtOworCQl9IGVsc2UgaWYgKHF1YWxpZmllciA9PSAnWicpIHsKKwkJCW51bSA9IHZhX2FyZyhhcmdzLCBzaXplX3QpOworCQl9IGVsc2UgaWYgKHF1YWxpZmllciA9PSAnaCcpIHsKKwkJCW51bSA9ICh1bnNpZ25lZCBzaG9ydCkgdmFfYXJnKGFyZ3MsIGludCk7CisJCQlpZiAoZmxhZ3MgJiBTSUdOKQorCQkJCW51bSA9IChzaWduZWQgc2hvcnQpIG51bTsKKwkJfSBlbHNlIHsKKwkJCW51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQpOworCQkJaWYgKGZsYWdzICYgU0lHTikKKwkJCQludW0gPSAoc2lnbmVkIGludCkgbnVtOworCQl9CisJCXN0ciA9IG51bWJlcihzdHIsIG51bSwgYmFzZSwgZmllbGRfd2lkdGgsIHByZWNpc2lvbiwgZmxhZ3MpOworCX0KKwkqc3RyID0gJ1wwJzsKKwlyZXR1cm4gc3RyLWJ1ZjsKK30KKworaW50IHNwcmludGYoY2hhciAqIGJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBpOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlpPXZzcHJpbnRmKGJ1ZixmbXQsYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiBpOworfQorCitzdGF0aWMgY2hhciBzcHJpbnRfYnVmWzEwMjRdOworCitpbnQKK3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IG47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCW4gPSB2c3ByaW50ZihzcHJpbnRfYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwl3cml0ZShzdGRvdXQsIHNwcmludF9idWYsIG4pOworCXJldHVybiBuOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uaCBiL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmgKaW5kZXggMjRiZDNhOC4uZWI5ZTE2YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5oCkBAIC03LDEwICs3LDQgQEAKIAogZXh0ZXJuIGludCB2c3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKIAotZXh0ZXJuIGludCBwdXRjKGludCBjLCB2b2lkICpmKTsKLWV4dGVybiBpbnQgcHV0Y2hhcihpbnQgYyk7Ci1leHRlcm4gaW50IGdldGNoYXIodm9pZCk7Ci0KLWV4dGVybiBpbnQgZnB1dHMoY2hhciAqc3RyLCB2b2lkICpmKTsKLQogI2VuZGlmCQkJCS8qIF9QUENfQk9PVF9TVERJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RyaW5nLlMgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdHJpbmcuUwppbmRleCBiMWVlYWVkLi5hYzNkNDNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9zdHJpbmcuUworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdHJpbmcuUwpAQCAtMTA3LDEwICsxMDcsMTIgQEAKIAlybHdpbm0uCXI3LHI1LDMyLTMsMywzMQkJLyogcjcgPSByNSA+PiAzICovCiAJYWRkaQlyNixyMywtNAogCWFkZGkJcjQscjQsLTQKLQliZXEJMmYJCQkvKiBpZiBsZXNzIHRoYW4gOCBieXRlcyB0byBkbyAqLworCWJlcQkzZgkJCS8qIGlmIGxlc3MgdGhhbiA4IGJ5dGVzIHRvIGRvICovCiAJYW5kaS4JcjAscjYsMwkJCS8qIGdldCBkZXN0IHdvcmQgYWxpZ25lZCAqLwogCW10Y3RyCXI3CiAJYm5lCTVmCisJYW5kaS4JcjAscjQsMwkJCS8qIGNoZWNrIHNyYyB3b3JkIGFsaWduZWQgdG9vICovCisJYm5lCTNmCiAxOglsd3oJcjcsNChyNCkKIAlsd3p1CXI4LDgocjQpCiAJc3R3CXI3LDQocjYpCkBAIC0xMzIsNiArMTM0LDExIEBACiAJYmRuegk0YgogCWJscgogNToJc3ViZmljCXIwLHIwLDQKKwljbXB3CWNyMSxyMCxyNQorCWFkZAlyNyxyMCxyNAorCWFuZGkuCXI3LHI3LDMJCQkvKiB3aWxsIHNvdXJjZSBiZSB3b3JkLWFsaWduZWQgdG9vPyAqLworCWJsZQljcjEsM2IKKwlibmUJM2IJCQkvKiBkbyBieXRlLWJ5LWJ5dGUgaWYgbm90ICovCiAJbXRjdHIJcjAKIDY6CWxieglyNyw0KHI0KQogCWFkZGkJcjQscjQsMQpAQCAtMTQ5LDEwICsxNTYsMTIgQEAKIAlybHdpbm0uCXI3LHI1LDMyLTMsMywzMQkJLyogcjcgPSByNSA+PiAzICovCiAJYWRkCXI2LHIzLHI1CiAJYWRkCXI0LHI0LHI1Ci0JYmVxCTJmCisJYmVxCTNmCiAJYW5kaS4JcjAscjYsMwogCW10Y3RyCXI3CiAJYm5lCTVmCisJYW5kaS4JcjAscjQsMworCWJuZQkzZgogMToJbHd6CXI3LC00KHI0KQogCWx3enUJcjgsLTgocjQpCiAJc3R3CXI3LC00KHI2KQpAQCAtMTcxLDcgKzE4MCwxMiBAQAogCXN0YnUJcjAsLTEocjYpCiAJYmRuegk0YgogCWJscgotNToJbXRjdHIJcjAKKzU6CWNtcHcJY3IxLHIwLHI1CisJc3ViZglyNyxyMCxyNAorCWFuZGkuCXI3LHI3LDMKKwlibGUJY3IxLDNiCisJYm5lCTNiCisJbXRjdHIJcjAKIDY6CWxienUJcjcsLTEocjQpCiAJc3RidQlyNywtMShyNikKIAliZG56CTZiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC96SW1hZ2UuY29mZi5sZHMgYi9hcmNoL3Bvd2VycGMvYm9vdC96SW1hZ2UuY29mZi5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxNjI1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5jb2ZmLmxkcwpAQCAtMCwwICsxLDQ2IEBACitPVVRQVVRfQVJDSChwb3dlcnBjOmNvbW1vbikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC4gPSAoNSoxMDI0KjEwMjQpOworICBfc3RhcnQgPSAuOworICAudGV4dCAgICAgIDoKKyAgeworICAgICooLnRleHQpCisgICAgKiguZml4dXApCisgIH0KKyAgX2V0ZXh0ID0gLjsKKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5yb2RhdGEqKQorICAgICooLmRhdGEqKQorICAgICooLnNkYXRhKikKKyAgICBfX2dvdDJfc3RhcnQgPSAuOworICAgICooLmdvdDIpCisgICAgX19nb3QyX2VuZCA9IC47CisKKyAgICBfdm1saW51eF9zdGFydCA9ICAuOworICAgICooLmtlcm5lbDp2bWxpbnV4LnN0cmlwKQorICAgIF92bWxpbnV4X2VuZCA9ICAuOworCisgICAgX2luaXRyZF9zdGFydCA9ICAuOworICAgICooLmtlcm5lbDppbml0cmQpCisgICAgX2luaXRyZF9lbmQgPSAgLjsKKyAgfQorCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX2VkYXRhICA9ICAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKQorICAgKiguYnNzKQorICB9CisgIF9lbmQgPSAuIDsKKworICAvRElTQ0FSRC8gOgorICB7CisgICAgKiguY29tbWVudCkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODM0eF9zeXNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODM0eF9zeXNfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZmY3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4MzR4X3N5c19kZWZjb25maWcKQEAgLTAsMCArMSw5MTEgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNS1nNDYxZDRlZGYtZGlydHkKKyMgRnJpIEphbiAxMyAxMTowMTo0NyAyMDA2CisjCisjIENPTkZJR19QUEM2NCBpcyBub3Qgc2V0CitDT05GSUdfUFBDMzI9eQorQ09ORklHX1BQQ19NRVJHRT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX1BQQz15CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19HRU5FUklDX05WUkFNPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKK0NPTkZJR19QUENfT0Y9eQorQ09ORklHX1BQQ19VREJHXzE2NTUwPXkKKyMgQ09ORklHX0dFTkVSSUNfVEJTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX1VJTUFHRT15CisKKyMKKyMgUHJvY2Vzc29yIHN1cHBvcnQKKyMKKyMgQ09ORklHX0NMQVNTSUMzMiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfNTJ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0CitDT05GSUdfUFBDXzgzeHg9eQorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR184eHggaXMgbm90IHNldAorIyBDT05GSUdfRTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FNTAwIGlzIG5vdCBzZXQKK0NPTkZJR182eHg9eQorQ09ORklHXzgzeHg9eQorQ09ORklHX1BQQ19GUFU9eQorQ09ORklHX1BQQ19TVERfTU1VPXkKK0NPTkZJR19QUENfU1REX01NVV8zMj15CisjIENPTkZJR19TTVAgaXMgbm90IHNldAorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKKyMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCitDT05GSUdfU0xBQj15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBsYXllcgorIworIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfUFBDX0dFTjU1MD15CisjIENPTkZJR19XQU5UX0VBUkxZX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgUGxhdGZvcm0gc3VwcG9ydAorIworQ09ORklHX01QQzgzNHhfU1lTPXkKK0NPTkZJR19NUEM4MzR4PXkKKworIworIyBLZXJuZWwgb3B0aW9ucworIworIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisjIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19HRU5FUklDX0lTQV9ETUE9eQorIyBDT05GSUdfUFBDX0k4MjU5IGlzIG5vdCBzZXQKK0NPTkZJR19QUENfSU5ESVJFQ1RfUENJPXkKK0NPTkZJR19GU0xfU09DPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9ET01BSU5TPXkKKyMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAorQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAorQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCitDT05GSUdfQk9PVF9MT0FEPTB4MDA4MDAwMDAKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzI3NjgKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfV0lOREZBUk0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfTUFSVkVMTF9QSFk9eQorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CisjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19ER1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19FMTAwPXkKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKK0NPTkZJR19HSUFORkFSPXkKKyMgQ09ORklHX0dGQVJfTkFQSSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR184M3h4X1dEVD15CisKKyMKKyMgUENJLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19QQ0lQQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dEVFBDSSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CitDT05GSUdfR0VOX1JUQz15CisjIENPTkZJR19HRU5fUlRDX1ggaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCisjIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CitDT05GSUdfSTJDX01QQz15CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUFJPU0FWQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TQVZBR0U0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDeDIwMF9BQ0IgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NNDFUMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19YMTIwNV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBTTiBEZXZpY2VzCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfUkVMQVlGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01TRE9TX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKKworIworIyBJbnN0cnVtZW50YXRpb24gU3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19CT09UWF9URVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9URVhUX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19MUEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19HNSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfTUFQTEUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0lTRVJJRVMgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworQ09ORklHX0NSWVBUTz15CisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIFNFQzIueCBPcHRpb25zCisjCitDT05GSUdfTVBDODM0OUVfU0VDMng9eQorCisjCisjIFNFQzIueCBUZXN0IE9wdGlvbnMKKyMKK0NPTkZJR19NUEM4MzQ5RV9TRUMyeFRFU1Q9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggYmJmYTFiZC4uYTk0Njk5ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCkBAIC0xMSw3ICsxMSw4IEBACiBlbmRpZgogCiBvYmoteQkJCQk6PSBzZW1hcGhvcmUubyBjcHV0YWJsZS5vIHB0cmFjZS5vIHN5c2NhbGxzLm8gXAotCQkJCSAgIGlycS5vIGFsaWduLm8gc2lnbmFsXzMyLm8gcG1jLm8gdmRzby5vCisJCQkJICAgaXJxLm8gYWxpZ24ubyBzaWduYWxfMzIubyBwbWMubyB2ZHNvLm8gXAorCQkJCSAgIGluaXRfdGFzay5vIHByb2Nlc3Mubwogb2JqLXkJCQkJKz0gdmRzbzMyLwogb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gc2V0dXBfNjQubyBiaW5mbXRfZWxmMzIubyBzeXNfcHBjMzIubyBcCiAJCQkJICAgc2lnbmFsXzY0Lm8gcHRyYWNlMzIubyBzeXN0YmwubyBcCkBAIC00NCw4ICs0NSw3IEBACiBleHRyYS0kKENPTkZJR184eHgpCQk6PSBoZWFkXzh4eC5vCiBleHRyYS15CQkJCSs9IHZtbGludXgubGRzCiAKLW9iai15CQkJCSs9IHByb2Nlc3MubyBpbml0X3Rhc2subyB0aW1lLm8gXAotCQkJCSAgIHByb20ubyB0cmFwcy5vIHNldHVwLWNvbW1vbi5vIHVkYmcubworb2JqLXkJCQkJKz0gdGltZS5vIHByb20ubyB0cmFwcy5vIHNldHVwLWNvbW1vbi5vIHVkYmcubwogb2JqLSQoQ09ORklHX1BQQzMyKQkJKz0gZW50cnlfMzIubyBzZXR1cF8zMi5vIG1pc2NfMzIubyBzeXN0Ymwubwogb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gbWlzY182NC5vIGRtYV82NC5vIGlvbW11Lm8KIG9iai0kKENPTkZJR19QUENfTVVMVElQTEFURk9STSkJKz0gcHJvbV9pbml0Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCA1NjM5OWM1Li44NDBhYWQ0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIAlERUZJTkUoUEFDQV9FWE1DLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGV4bWMpKTsKIAlERUZJTkUoUEFDQV9FWFNMQiwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBleHNsYikpOwogCURFRklORShQQUNBRU1FUkdTUCwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBlbWVyZ2VuY3lfc3ApKTsKLQlERUZJTkUoUEFDQUxQUEFDQSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBscHBhY2EpKTsKKwlERUZJTkUoUEFDQUxQUEFDQVBUUiwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBscHBhY2FfcHRyKSk7CiAJREVGSU5FKFBBQ0FIV0NQVUlELCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGh3X2NwdV9pZCkpOwogCiAJREVGSU5FKExQUEFDQVNSUjAsIG9mZnNldG9mKHN0cnVjdCBscHBhY2EsIHNhdmVkX3NycjApKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwX3Bvd2VyNC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMKaW5kZXggY2NhOTQyZi4uYjYxZDg2ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMKQEAgLTEzMCw3ICsxMzAsNyBAQAogCW1mY3IJcjcKIAogCS8qIEdldCBzdG9yYWdlIHB0ciAqLwotCUxPQURBRERSKHI1LGNwdV9zdGF0ZV9zdG9yYWdlKQorCUxPQURfUkVHX0lNTUVESUFURShyNSxjcHVfc3RhdGVfc3RvcmFnZSkKIAogCS8qIFdlIG9ubHkgZGVhbCB3aXRoIDk3MCBmb3Igbm93ICovCiAJbWZzcHIJcjAsU1BSTl9QVlIKQEAgLTE2NCw3ICsxNjQsNyBAQAogCS8qIEdldCBzdG9yYWdlIHB0ciAoRklYTUUgd2hlbiB1c2luZyBhbnRvbiByZWxvYyBhcyB3ZQogCSAqIGFyZSBydW5uaW5nIHdpdGggdHJhbnNsYXRpb24gZGlzYWJsZWQgaGVyZQogCSAqLwotCUxPQURBRERSKHI1LGNwdV9zdGF0ZV9zdG9yYWdlKQorCUxPQURfUkVHX0lNTUVESUFURShyNSxjcHVfc3RhdGVfc3RvcmFnZSkKIAogCS8qIFdlIG9ubHkgZGVhbCB3aXRoIDk3MCBmb3Igbm93ICovCiAJbWZzcHIJcjAsU1BSTl9QVlIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwppbmRleCA0M2M3NGE2Li4xMDY5NjQ1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCkBAIC01NSw3ICs1NSw4IEBACiAjZGVmaW5lIENPTU1PTl9VU0VSX1BPV0VSNAkoQ09NTU9OX1VTRVJfUFBDNjQgfCBQUENfRkVBVFVSRV9QT1dFUjQpCiAjZGVmaW5lIENPTU1PTl9VU0VSX1BPV0VSNQkoQ09NTU9OX1VTRVJfUFBDNjQgfCBQUENfRkVBVFVSRV9QT1dFUjUpCiAjZGVmaW5lIENPTU1PTl9VU0VSX1BPV0VSNV9QTFVTCShDT01NT05fVVNFUl9QUEM2NCB8IFBQQ19GRUFUVVJFX1BPV0VSNV9QTFVTKQotCisjZGVmaW5lIENPTU1PTl9VU0VSX0JPT0tFCShQUENfRkVBVFVSRV8zMiB8IFBQQ19GRUFUVVJFX0hBU19NTVUgfCBcCisJCQkJIFBQQ19GRUFUVVJFX0JPT0tFKQogCiAvKiBXZSBvbmx5IHNldCB0aGUgc3BlIGZlYXR1cmVzIGlmIHRoZSBrZXJuZWwgd2FzIGNvbXBpbGVkIHdpdGgKICAqIHNwZSBzdXBwb3J0CkBAIC03OSw3ICs4MCw4IEBACiAJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyMyIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IFJTNjQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9SUzY0LAorCQkucGxhdGZvcm0JCT0gInBvd2VyMyIsCiAJfSwKIAl7CS8qIFBvd2VyMysgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC05Miw3ICs5NCw4IEBACiAJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyMyIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IFJTNjQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9SUzY0LAorCQkucGxhdGZvcm0JCT0gInBvd2VyMyIsCiAJfSwKIAl7CS8qIE5vcnRoc3RhciAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTEwNSw3ICsxMDgsOCBAQAogCQkubnVtX3BtY3MJCT0gOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9yczY0IiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gUlM2NCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1JTNjQsCisJCS5wbGF0Zm9ybQkJPSAicnM2NCIsCiAJfSwKIAl7CS8qIFB1bHNhciAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTExOCw3ICsxMjIsOCBAQAogCQkubnVtX3BtY3MJCT0gOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9yczY0IiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gUlM2NCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1JTNjQsCisJCS5wbGF0Zm9ybQkJPSAicnM2NCIsCiAJfSwKIAl7CS8qIEktc3RhciAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTEzMSw3ICsxMzYsOCBAQAogCQkubnVtX3BtY3MJCT0gOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9yczY0IiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gUlM2NCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1JTNjQsCisJCS5wbGF0Zm9ybQkJPSAicnM2NCIsCiAJfSwKIAl7CS8qIFMtc3RhciAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTE0NCw3ICsxNTAsOCBAQAogCQkubnVtX3BtY3MJCT0gOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9yczY0IiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gUlM2NCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1JTNjQsCisJCS5wbGF0Zm9ybQkJPSAicnM2NCIsCiAJfSwKIAl7CS8qIFBvd2VyNCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTE1Nyw3ICsxNjQsOCBAQAogCQkubnVtX3BtY3MJCT0gOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjQiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBQT1dFUjQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXI0IiwKIAl9LAogCXsJLyogUG93ZXI0KyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTE3MCw3ICsxNzgsOCBAQAogCQkubnVtX3BtY3MJCT0gOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjQiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBQT1dFUjQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXI0IiwKIAl9LAogCXsJLyogUFBDOTcwICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTg0LDcgKzE5Myw4IEBACiAJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3BwYzk3MCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0Lzk3MCIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IFBPV0VSNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM5NzAiLAogCX0sCiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDNjQpIHx8IGRlZmluZWQoQ09ORklHX1BPV0VSNCkKQEAgLTIwNCw3ICsyMTQsOCBAQAogCQkubnVtX3BtY3MJCT0gOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wcGM5NzAsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC85NzAiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBQT1dFUjQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5wbGF0Zm9ybQkJPSAicHBjOTcwIiwKIAl9LAogI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BQQzY0KSB8fCBkZWZpbmVkKENPTkZJR19QT1dFUjQpICovCiAjaWZkZWYgQ09ORklHX1BQQzY0CkBAIC0yMTksNyArMjMwLDggQEAKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcHBjOTcwLAogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvOTcwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gUE9XRVI0LAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUE9XRVI0LAorCQkucGxhdGZvcm0JCT0gInBwYzk3MCIsCiAJfSwKIAl7CS8qIFBvd2VyNSBHUiAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTIzMiw3ICsyNDQsOCBAQAogCQkubnVtX3BtY3MJCT0gNiwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjUiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBQT1dFUjQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXI1IiwKIAl9LAogCXsJLyogUG93ZXI1IEdTICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMjQ1LDcgKzI1OCw4IEBACiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNSsiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBQT1dFUjQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXI1KyIsCiAJfSwKIAl7CS8qIENlbGwgQnJvYWRiYW5kIEVuZ2luZSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTI1Nyw2ICsyNzEsNyBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfYmUsCisJCS5wbGF0Zm9ybQkJPSAicHBjLWNlbGwtYmUiLAogCX0sCiAJewkvKiBkZWZhdWx0IG1hdGNoICovCiAJCS5wdnJfbWFzawkJPSAweDAwMDAwMDAwLApAQCAtMjY4LDYgKzI4Myw3IEBACiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAogCQkubnVtX3BtY3MJCT0gNiwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXI0IiwKIAl9CiAjZW5kaWYJLyogQ09ORklHX1BQQzY0ICovCiAjaWZkZWYgQ09ORklHX1BQQzMyCkBAIC0yODEsNiArMjk3LDcgQEAKIAkJCVBQQ19GRUFUVVJFX1VOSUZJRURfQ0FDSEUgfCBQUENfRkVBVFVSRV9OT19UQiwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDEiLAogCX0sCiAJewkvKiA2MDMgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0yOTAsNyArMzA3LDggQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzLAorCQkucGxhdGZvcm0JCT0gInBwYzYwMyIsCiAJfSwKIAl7CS8qIDYwM2UgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0zMDAsNyArMzE4LDggQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzLAorCQkucGxhdGZvcm0JCT0gInBwYzYwMyIsCiAJfSwKIAl7CS8qIDYwM2V2ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMzEwLDcgKzMyOSw4IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMworCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMywKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAogCX0sCiAJewkvKiA2MDQgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0zMjEsNyArMzQxLDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDIsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0LAorCQkucGxhdGZvcm0JCT0gInBwYzYwNCIsCiAJfSwKIAl7CS8qIDYwNGUgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmYwMDAsCkBAIC0zMzIsNyArMzUzLDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0LAorCQkucGxhdGZvcm0JCT0gInBwYzYwNCIsCiAJfSwKIAl7CS8qIDYwNHIgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0zNDMsNyArMzY1LDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0LAorCQkucGxhdGZvcm0JCT0gInBwYzYwNCIsCiAJfSwKIAl7CS8qIDYwNGV2ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMzU0LDcgKzM3Nyw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwNAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDQiLAogCX0sCiAJewkvKiA3NDAvNzUwICgweDQyMDIsIGRvbid0IHN1cHBvcnQgVEFVID8pICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmZmLApAQCAtMzY1LDcgKzM4OSw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAogCX0sCiAJewkvKiA3NTBDWCAoODAxMDAgYW5kIDgwMTB4PykgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmZjAsCkBAIC0zNzYsNyArNDAxLDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwY3gKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAogCX0sCiAJewkvKiA3NTBDWCAoODIyMDEgYW5kIDgyMjAyKSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmMCwKQEAgLTM4Nyw3ICs0MTMsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGN4LAorCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCiAJfSwKIAl7CS8qIDc1MENYZSAoODIyMTQpICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmYwLApAQCAtMzk4LDcgKzQyNSw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGN4CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwY3gsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKIAl9LAogCXsJLyogNzUwQ1hlICJHZWtrbyIgKDgzMjE0KSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTQwOSw3ICs0MzcsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGN4LAorCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCiAJfSwKIAl7CS8qIDc0NS83NTUgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmYwMDAsCkBAIC00MjAsNyArNDQ5LDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwLAorCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCiAJfSwKIAl7CS8qIDc1MEZYIHJldiAxLnggKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmMDAsCkBAIC00MzEsNyArNDYxLDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwLAorCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCiAJfSwKIAl7CS8qIDc1MEZYIHJldiAyLjAgbXVzdCBkaXNhYmxlIEhJRDBbRFBNXSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTQ0Miw3ICs0NzMsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTAKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTAsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKIAl9LAogCXsJLyogNzUwRlggKEFsbCByZXZzIGV4Y2VwdCAyLjApICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNDUzLDcgKzQ4NSw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGZ4CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwZngsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKIAl9LAogCXsJLyogNzUwR1ggKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC00NjQsNyArNDk3LDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwZngKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBmeCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAogCX0sCiAJewkvKiA3NDAvNzUwIChMMkNSIGJpdCBuZWVkIGZpeHVwIGZvciA3NDApICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNDc1LDcgKzUwOSw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAogCX0sCiAJewkvKiA3NDAwIHJldiAxLjEgPyAobm8gVEFVKSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTQ4Niw3ICs1MjEsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDAwCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQwMCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDAwIiwKIAl9LAogCXsJLyogNzQwMCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTQ5Nyw3ICs1MzMsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDAwCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQwMCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDAwIiwKIAl9LAogCXsJLyogNzQxMCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTUwOCw3ICs1NDUsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDEwCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQxMCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDAwIiwKIAl9LAogCXsJLyogNzQ1MCAyLjAgLSBubyBkb3plL25hcCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTUyMSw3ICs1NTksOCBAQAogCQkubnVtX3BtY3MJCT0gNiwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDV4LAogCQkub3Byb2ZpbGVfY3B1X3R5cGUgICAgICA9ICJwcGMvNzQ1MCIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IEc0LAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRzQsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzQ1MCIsCiAJfSwKIAl7CS8qIDc0NTAgMi4xICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmZmLApAQCAtNTM0LDcgKzU3Myw4IEBACiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gRzQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDUwIiwKIAl9LAogCXsJLyogNzQ1MCAyLjMgYW5kIG5ld2VyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNTQ3LDcgKzU4Nyw4IEBACiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gRzQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDUwIiwKIAl9LAogCXsJLyogNzQ1NSByZXYgMS54ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZjAwLApAQCAtNTYwLDcgKzYwMSw4IEBACiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gRzQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDUwIiwKIAl9LAogCXsJLyogNzQ1NSByZXYgMi4wICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmZmLApAQCAtNTczLDcgKzYxNSw4IEBACiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gRzQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDUwIiwKIAl9LAogCXsJLyogNzQ1NSBvdGhlcnMgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC01ODYsNyArNjI5LDggQEAKIAkJLm51bV9wbWNzCQk9IDYsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBHNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDQ3Lzc0NTcgUmV2IDEuMCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTU5OSw3ICs2NDMsOCBAQAogCQkubnVtX3BtY3MJCT0gNiwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDV4LAogCQkub3Byb2ZpbGVfY3B1X3R5cGUgICAgICA9ICJwcGMvNzQ1MCIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IEc0LAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRzQsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzQ1MCIsCiAJfSwKIAl7CS8qIDc0NDcvNzQ1NyBSZXYgMS4xICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmZmLApAQCAtNjEyLDcgKzY1Nyw4IEBACiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gRzQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDUwIiwKIAl9LAogCXsJLyogNzQ0Ny83NDU3IFJldiAxLjIgYW5kIGxhdGVyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNjI1LDcgKzY3MSw4IEBACiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gRzQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDUwIiwKIAl9LAogCXsJLyogNzQ0N0EgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC02MzgsNyArNjg1LDggQEAKIAkJLm51bV9wbWNzCQk9IDYsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBHNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDQ4ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNjUxLDcgKzY5OSw4IEBACiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gRzQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDUwIiwKIAl9LAogCXsJLyogODJ4eCAoODI0MCwgODI0NSwgODI2MCBhcmUgYWxsIDYwM2UgY29yZXMpICovCiAJCS5wdnJfbWFzawkJPSAweDdmZmYwMDAwLApAQCAtNjYxLDcgKzcxMCw4IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMworCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMywKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAogCX0sCiAJewkvKiBBbGwgRzJfTEUgKDYwM2UgY29yZSwgcGx1cyBzb21lKSBoYXZlIHRoZSBzYW1lIHB2ciAqLwogCQkucHZyX21hc2sJCT0gMHg3ZmZmMDAwMCwKQEAgLTY3MSw3ICs3MjEsOCBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDMKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDMsCisJCS5wbGF0Zm9ybQkJPSAicHBjNjAzIiwKIAl9LAogCXsJLyogZTMwMCAoYSA2MDNlIGNvcmUsIHBsdXMgc29tZSkgb24gODN4eCAqLwogCQkucHZyX21hc2sJCT0gMHg3ZmZmMDAwMCwKQEAgLTY4MSw3ICs3MzIsOCBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDMKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDMsCisJCS5wbGF0Zm9ybQkJPSAicHBjNjAzIiwKIAl9LAogCXsJLyogZGVmYXVsdCBtYXRjaCwgd2UgYXNzdW1lIHNwbGl0IEkvRCBjYWNoZSAmIFRCIChub24tNjAxKS4uLiAqLwogCQkucHZyX21hc2sJCT0gMHgwMDAwMDAwMCwKQEAgLTY5MSw2ICs3NDMsNyBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAogCX0sCiAjZW5kaWYgLyogQ0xBU1NJQ19QUEMgKi8KICNpZmRlZiBDT05GSUdfOHh4CkBAIC03MDQsNiArNzU3LDcgQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAogCQkuaWNhY2hlX2JzaXplCQk9IDE2LAogCQkuZGNhY2hlX2JzaXplCQk9IDE2LAorCQkucGxhdGZvcm0JCT0gInBwYzgyMyIsCiAJfSwKICNlbmRpZiAvKiBDT05GSUdfOHh4ICovCiAjaWZkZWYgQ09ORklHXzQweApAQCAtNzE1LDYgKzc2OSw3IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAxNiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxNiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDMiLAogCX0sCiAJewkvKiA0MDNHQ1ggKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmMDAsCkBAIC03MjUsNiArNzgwLDcgQEAKIAkJIAlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfTk9fVEIsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTYsCiAJCS5kY2FjaGVfYnNpemUJCT0gMTYsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDAzIiwKIAl9LAogCXsJLyogNDAzRyA/PyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTczNCw2ICs3OTAsNyBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8IFBQQ19GRUFUVVJFX0hBU19NTVUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTYsCiAJCS5kY2FjaGVfYnNpemUJCT0gMTYsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDAzIiwKIAl9LAogCXsJLyogNDA1R1AgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC03NDQsNiArODAxLDcgQEAKIAkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9IQVNfNHh4TUFDLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQwNSIsCiAJfSwKIAl7CS8qIFNUQiAwM3h4eCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTc1NCw2ICs4MTIsNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsJLyogU1RCIDA0eHh4ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNzY0LDYgKzgyMyw3IEBACiAJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAogCX0sCiAJewkvKiBOUDQwNUwgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC03NzQsNiArODM0LDcgQEAKIAkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9IQVNfNHh4TUFDLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQwNSIsCiAJfSwKIAl7CS8qIE5QNEdTMyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTc4NCw2ICs4NDUsNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsgICAvKiBOUDQwNUggKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC03OTQsNiArODU2LDcgQEAKIAkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9IQVNfNHh4TUFDLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQwNSIsCiAJfSwKIAl7CS8qIDQwNUdQciAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTgwNCw2ICs4NjcsNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsgICAvKiBTVEJ4MjV4eCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTgxNCw2ICs4NzgsNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsJLyogNDA1TFAgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC04MjMsNiArODg4LDcgQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQwNSIsCiAJfSwKIAl7CS8qIFhpbGlueCBWaXJ0ZXgtSUkgUHJvICAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTgzMyw2ICs4OTksNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsJLyogNDA1RVAgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC04NDMsNiArOTEwLDcgQEAKIAkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9IQVNfNHh4TUFDLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQwNSIsCiAJfSwKIAogI2VuZGlmIC8qIENPTkZJR180MHggKi8KQEAgLTg1Miw4MSArOTIwLDkwIEBACiAJCS5wdnJfdmFsdWUJCT0gMHg0MDAwMDg1MCwKIAkJLmNwdV9uYW1lCQk9ICI0NDBFUCBSZXYuIEEiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsIC8qIDQ0MEVQIGhhcyBhbiBGUFUgKi8KKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UgfCBQUENfRkVBVFVSRV9IQVNfRlBVLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQ0MCIsCiAJfSwKIAl7CiAJCS5wdnJfbWFzawkJPSAweGYwMDAwZmZmLAogCQkucHZyX3ZhbHVlCQk9IDB4NDAwMDA4ZDMsCiAJCS5jcHVfbmFtZQkJPSAiNDQwRVAgUmV2LiBCIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLCAvKiA0NDBFUCBoYXMgYW4gRlBVICovCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFIHwgUFBDX0ZFQVRVUkVfSEFTX0ZQVSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJewkvKiA0NDBHUCBSZXYuIEIgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZjAwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg0MDAwMDQ0MCwKIAkJLmNwdV9uYW1lCQk9ICI0NDBHUCBSZXYuIEIiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDBncCIsCiAJfSwKIAl7CS8qIDQ0MEdQIFJldi4gQyAqLwogCQkucHZyX21hc2sJCT0gMHhmMDAwMGZmZiwKIAkJLnB2cl92YWx1ZQkJPSAweDQwMDAwNDgxLAogCQkuY3B1X25hbWUJCT0gIjQ0MEdQIFJldi4gQyIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDRYLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8IFBQQ19GRUFUVVJFX0hBU19NTVUsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQ0MGdwIiwKIAl9LAogCXsgLyogNDQwR1ggUmV2LiBBICovCiAJCS5wdnJfbWFzawkJPSAweGYwMDAwZmZmLAogCQkucHZyX3ZhbHVlCQk9IDB4NTAwMDA4NTAsCiAJCS5jcHVfbmFtZQkJPSAiNDQwR1ggUmV2LiBBIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsgLyogNDQwR1ggUmV2LiBCICovCiAJCS5wdnJfbWFzawkJPSAweGYwMDAwZmZmLAogCQkucHZyX3ZhbHVlCQk9IDB4NTAwMDA4NTEsCiAJCS5jcHVfbmFtZQkJPSAiNDQwR1ggUmV2LiBCIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsgLyogNDQwR1ggUmV2LiBDICovCiAJCS5wdnJfbWFzawkJPSAweGYwMDAwZmZmLAogCQkucHZyX3ZhbHVlCQk9IDB4NTAwMDA4OTIsCiAJCS5jcHVfbmFtZQkJPSAiNDQwR1ggUmV2LiBDIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsgLyogNDQwR1ggUmV2LiBGICovCiAJCS5wdnJfbWFzawkJPSAweGYwMDAwZmZmLAogCQkucHZyX3ZhbHVlCQk9IDB4NTAwMDA4OTQsCiAJCS5jcHVfbmFtZQkJPSAiNDQwR1ggUmV2LiBGIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsgLyogNDQwU1AgUmV2LiBBICovCiAJCS5wdnJfbWFzawkJPSAweGZmMDAwZmZmLAogCQkucHZyX3ZhbHVlCQk9IDB4NTMwMDA4OTEsCiAJCS5jcHVfbmFtZQkJPSAiNDQwU1AgUmV2LiBBIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsgLyogNDQwU1BlIFJldi4gQSAqLwogCQkucHZyX21hc2sJCT0gMHhmZjAwMGZmZiwKQEAgLTkzNCw5ICsxMDExLDEwIEBACiAJCS5jcHVfbmFtZQkJPSAiNDQwU1BlIFJldi4gQSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CiAJCQlDUFVfRlRSX1VTRV9UQiwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAjZW5kaWYgLyogQ09ORklHXzQ0eCAqLwogI2lmZGVmIENPTkZJR19GU0xfQk9PS0UKQEAgLTk0NiwxMCArMTAyNCwxMSBAQAogCQkuY3B1X25hbWUJCT0gImUyMDB6NSIsCiAJCS8qIHh4eCAtIGdhbGFrOiBhZGQgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSAqLwogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX0UyMDAsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwKLQkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9IQVNfRUZQX1NJTkdMRSB8CisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFIHwKKwkJCVBQQ19GRUFUVVJFX0hBU19FRlBfU0lOR0xFIHwKIAkJCVBQQ19GRUFUVVJFX1VOSUZJRURfQ0FDSEUsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNTU1NCIsCiAJfSwKIAl7CS8qIGUyMDB6NiAqLwogCQkucHZyX21hc2sJCT0gMHhmZmYwMDAwMCwKQEAgLTk1NywxMSArMTAzNiwxMiBAQAogCQkuY3B1X25hbWUJCT0gImUyMDB6NiIsCiAJCS8qIHh4eCAtIGdhbGFrOiBhZGQgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSAqLwogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX0UyMDAsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwKLQkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9TUEVfQ09NUCB8CisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFIHwKKwkJCVBQQ19GRUFUVVJFX1NQRV9DT01QIHwKIAkJCVBQQ19GRUFUVVJFX0hBU19FRlBfU0lOR0xFIHwKIAkJCVBQQ19GRUFUVVJFX1VOSUZJRURfQ0FDSEUsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNTU1NCIsCiAJfSwKIAl7CS8qIGU1MDAgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC05NjksMTQgKzEwNDksMTUgQEAKIAkJLmNwdV9uYW1lCQk9ICJlNTAwIiwKIAkJLyogeHh4IC0gZ2FsYWs6IGFkZCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFICovCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfRTUwMCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfAotCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX1NQRV9DT01QIHwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UgfAorCQkJUFBDX0ZFQVRVUkVfU1BFX0NPTVAgfAogCQkJUFBDX0ZFQVRVUkVfSEFTX0VGUF9TSU5HTEUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjL2U1MDAiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBCT09LRSwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0JPT0tFLAorCQkucGxhdGZvcm0JCT0gInBwYzg1NDAiLAogCX0sCiAJewkvKiBlNTAwdjIgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC05ODQsMTQgKzEwNjUsMTYgQEAKIAkJLmNwdV9uYW1lCQk9ICJlNTAwdjIiLAogCQkvKiB4eHggLSBnYWxhazogYWRkIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgKi8KIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU19FNTAwXzIsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwKLQkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9TUEVfQ09NUCB8Ci0JCQlQUENfRkVBVFVSRV9IQVNfRUZQX1NJTkdMRSB8IFBQQ19GRUFUVVJFX0hBU19FRlBfRE9VQkxFLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSB8CisJCQlQUENfRkVBVFVSRV9TUEVfQ09NUCB8CisJCQlQUENfRkVBVFVSRV9IQVNfRUZQX1NJTkdMRSB8CisJCQlQUENfRkVBVFVSRV9IQVNfRUZQX0RPVUJMRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGMvZTUwMCIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IEJPT0tFLAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfQk9PS0UsCisJCS5wbGF0Zm9ybQkJPSAicHBjODU0OCIsCiAJfSwKICNlbmRpZgogI2lmICFDTEFTU0lDX1BQQwpAQCAtMTAwMyw2ICsxMDg2LDcgQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXJwYyIsCiAJfQogI2VuZGlmIC8qICFDTEFTU0lDX1BQQyAqLwogI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV8zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV8zMi5TCmluZGV4IDAzNmI3MWQuLmQ4ZGEyYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzMyLlMKQEAgLTk4OCw3ICs5ODgsNyBAQAogCXN0d3UJcjEsLUlOVF9GUkFNRV9TSVpFKHIxKQogCW1mbHIJcjAKIAlzdHcJcjAsSU5UX0ZSQU1FX1NJWkUrNChyMSkKLQlMT0FEQUREUihyNCwgcnRhcykKKwlMT0FEX1JFR19BRERSKHI0LCBydGFzKQogCWxpcwlyNiwxZkBoYQkvKiBwaHlzaWNhbCByZXR1cm4gYWRkcmVzcyBmb3IgcnRhcyAqLwogCWFkZGkJcjYscjYsMWZAbAogCXRvcGh5cyhyNixyNikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUwppbmRleCBhYWNlYmIzLi41NDIwMzYzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCkBAIC01MTEsNyArNTExLDggQEAKIAljbXBkaQkwLHI1LDAKIAliZXEJNGYKIAkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzIChpU2VyaWVzKSAqLwotCWxkCXIzLFBBQ0FMUFBBQ0ErTFBQQUNBQU5ZSU5UKHIxMykKKwlsZAlyMyxQQUNBTFBQQUNBUFRSKHIxMykKKwlsZAlyMyxMUFBBQ0FBTllJTlQocjMpCiAJY21wZGkJcjMsMAogCWJlcSsJNGYJCQkvKiBza2lwIGRvX0lSUSBpZiBubyBpbnRlcnJ1cHRzICovCiAKQEAgLTY4OSw5ICs2OTAsOCBAQAogICAgICAgICBzdGQJcjYsUEFDQVNBVkVETVNSKHIxMykKIAogCS8qIFNldHVwIG91ciByZWFsIHJldHVybiBhZGRyICovCQotCVNFVF9SRUdfVE9fTEFCRUwocjQsLnJ0YXNfcmV0dXJuX2xvYykKLQlTRVRfUkVHX1RPX0NPTlNUKHI5LFBBR0VfT0ZGU0VUKQotCXN1YglyNCxyNCxyOQorCUxPQURfUkVHX0FERFIocjQsLnJ0YXNfcmV0dXJuX2xvYykKKwljbHJsZGkJcjQscjQsMgkJCS8qIGNvbnZlcnQgdG8gcmVhbG1vZGUgYWRkcmVzcyAqLwogICAgICAgIAltdGxyCXI0CiAKIAlsaQlyMCwwCkBAIC03MDYsNyArNzA2LDcgQEAKIAlzeW5jCQkJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBzbyBTUlIwLzEgKi8KIAltdG1zcmQJcjAJCQkvKiBkb24ndCBnZXQgdHJhc2hlZCAqLwogCi0JU0VUX1JFR19UT19MQUJFTChyNCxydGFzKQorCUxPQURfUkVHX0FERFIocjQsIHJ0YXMpCiAJbGQJcjUsUlRBU0VOVFJZKHI0KQkvKiBnZXQgdGhlIHJ0YXMtPmVudHJ5IHZhbHVlICovCiAJbGQJcjQsUlRBU0JBU0UocjQpCQkvKiBnZXQgdGhlIHJ0YXMtPmJhc2UgdmFsdWUgKi8KIAkKQEAgLTcxOCw4ICs3MTgsNyBAQAogX1NUQVRJQyhydGFzX3JldHVybl9sb2MpCiAJLyogcmVsb2NhdGlvbiBpcyBvZmYgYXQgdGhpcyBwb2ludCAqLwogCW1mc3ByCXI0LFNQUk5fU1BSRzMJICAgICAgICAvKiBHZXQgUEFDQSAqLwotCVNFVF9SRUdfVE9fQ09OU1QocjUsIFBBR0VfT0ZGU0VUKQotICAgICAgICBzdWIgICAgIHI0LHI0LHI1ICAgICAgICAgICAgICAgIC8qIFJFTE9DIHRoZSBQQUNBIGJhc2UgcG9pbnRlciAqLworCWNscmxkaQlyNCxyNCwyCQkJLyogY29udmVydCB0byByZWFsbW9kZSBhZGRyZXNzICovCiAKIAltZm1zciAgIHI2CiAJbGkJcjAsTVNSX1JJCkBAIC03MjgsNyArNzI3LDcgQEAKIAltdG1zcmQgIHI2CiAgICAgICAgIAogICAgICAgICBsZAlyMSxQQUNBUjEocjQpICAgICAgICAgICAvKiBSZXN0b3JlIG91ciBTUCAqLwotCUxPQURBRERSKHIzLC5ydGFzX3Jlc3RvcmVfcmVncykKKwlMT0FEX1JFR19JTU1FRElBVEUocjMsLnJ0YXNfcmVzdG9yZV9yZWdzKQogICAgICAgICBsZAlyNCxQQUNBU0FWRURNU1IocjQpICAgICAvKiBSZXN0b3JlIG91ciBNU1IgKi8KIAogCW10c3ByCVNQUk5fU1JSMCxyMwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9mcHUuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnB1LlMKaW5kZXggYjc4MGI0Mi4uZTQzNjJkZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9mcHUuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2ZwdS5TCkBAIC0zOSw5ICszOSw5IEBACiAgKiB0byBhbm90aGVyLiAgSW5zdGVhZCB3ZSBjYWxsIGdpdmV1cF9mcHUgaW4gc3dpdGNoX3RvLgogICovCiAjaWZuZGVmIENPTkZJR19TTVAKLQlMT0FEQkFTRShyMywgbGFzdF90YXNrX3VzZWRfbWF0aCkKKwlMT0FEX1JFR19BRERSQkFTRShyMywgbGFzdF90YXNrX3VzZWRfbWF0aCkKIAl0b3JlYWwocjMpCi0JUFBDX0xMCXI0LE9GRihsYXN0X3Rhc2tfdXNlZF9tYXRoKShyMykKKwlQUENfTEwJcjQsQUREUk9GRihsYXN0X3Rhc2tfdXNlZF9tYXRoKShyMykKIAlQUENfTENNUEkJMCxyNCwwCiAJYmVxCTFmCiAJdG9yZWFsKHI0KQpAQCAtNzcsNyArNzcsNyBAQAogI2lmbmRlZiBDT05GSUdfU01QCiAJc3ViaQlyNCxyNSxUSFJFQUQKIAlmcm9tcmVhbChyNCkKLQlQUENfU1RMCXI0LE9GRihsYXN0X3Rhc2tfdXNlZF9tYXRoKShyMykKKwlQUENfU1RMCXI0LEFERFJPRkYobGFzdF90YXNrX3VzZWRfbWF0aCkocjMpCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCS8qIHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCByZXR1cm4gKi8KIAkvKiB3ZSBoYXZlbid0IHVzZWQgY3RyIG9yIHhlciBvciBsciAqLwpAQCAtMTEzLDggKzExMyw4IEBACiAxOgogI2lmbmRlZiBDT05GSUdfU01QCiAJbGkJcjUsMAotCUxPQURCQVNFKHI0LGxhc3RfdGFza191c2VkX21hdGgpCi0JUFBDX1NUTAlyNSxPRkYobGFzdF90YXNrX3VzZWRfbWF0aCkocjQpCisJTE9BRF9SRUdfQUREUkJBU0UocjQsbGFzdF90YXNrX3VzZWRfbWF0aCkKKwlQUENfU1RMCXI1LEFERFJPRkYobGFzdF90YXNrX3VzZWRfbWF0aCkocjQpCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCWJscgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCmluZGV4IDFjMDY2ZDEuLjMwODI2ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCkBAIC0xNTQsMTIgKzE1NCwxMiBAQAogCWJuZQkxMDBiCiAKICNpZmRlZiBDT05GSUdfSE1UCi0JTE9BREFERFIocjQsIC5obXRfaW5pdCkKKwlTRVRfUkVHX0lNTUVESUFURShyNCwgLmhtdF9pbml0KQogCW10Y3RyCXI0CiAJYmN0cgogI2Vsc2UKICNpZmRlZiBDT05GSUdfU01QCi0JTE9BREFERFIocjQsIC5wU2VyaWVzX3NlY29uZGFyeV9zbXBfaW5pdCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjQsIC5wU2VyaWVzX3NlY29uZGFyeV9zbXBfaW5pdCkKIAltdGN0cglyNAogCW1yCXIzLHIyNAogCWJjdHIKQEAgLTIwNSw5ICsyMDUsMTAgQEAKICNkZWZpbmUgRVhfTFIJCTcyCiAKIC8qCi0gKiBXZSdyZSBzaG9ydCBvbiBzcGFjZSBhbmQgdGltZSBpbiB0aGUgZXhjZXB0aW9uIHByb2xvZywgc28gd2UgY2FuJ3QgdXNlCi0gKiB0aGUgbm9ybWFsIExPQURBRERSIG1hY3JvLiBOb3JtYWxseSB3ZSBqdXN0IG5lZWQgdGhlIGxvdyBoYWxmd29yZCBvZiB0aGUKLSAqIGFkZHJlc3MsIGJ1dCBmb3IgS2R1bXAgd2UgbmVlZCB0aGUgd2hvbGUgbG93IHdvcmQuCisgKiBXZSdyZSBzaG9ydCBvbiBzcGFjZSBhbmQgdGltZSBpbiB0aGUgZXhjZXB0aW9uIHByb2xvZywgc28gd2UgY2FuJ3QKKyAqIHVzZSB0aGUgbm9ybWFsIFNFVF9SRUdfSU1NRURJQVRFIG1hY3JvLiBOb3JtYWxseSB3ZSBqdXN0IG5lZWQgdGhlCisgKiBsb3cgaGFsZndvcmQgb2YgdGhlIGFkZHJlc3MsIGJ1dCBmb3IgS2R1bXAgd2UgbmVlZCB0aGUgd2hvbGUgbG93CisgKiB3b3JkLgogICovCiAjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKICNkZWZpbmUgTE9BRF9IQU5ETEVSKHJlZywgbGFiZWwpCQkJCQlcCkBAIC0yNTQsOCArMjU1LDkgQEAKIAogI2RlZmluZSBFWENFUFRJT05fUFJPTE9HX0lTRVJJRVNfMgkJCQkJXAogCW1mbXNyCXIxMDsJCQkJCQkJXAotCWxkCXIxMSxQQUNBTFBQQUNBK0xQUEFDQVNSUjAocjEzKTsJCQkJXAotCWxkCXIxMixQQUNBTFBQQUNBK0xQUEFDQVNSUjEocjEzKTsJCQkJXAorCWxkCXIxMixQQUNBTFBQQUNBUFRSKHIxMyk7CQkJCQlcCisJbGQJcjExLExQUEFDQVNSUjAocjEyKTsJCQkJCVwKKwlsZAlyMTIsTFBQQUNBU1JSMShyMTIpOwkJCQkJXAogCW9yaQlyMTAscjEwLE1TUl9SSTsJCQkJCQlcCiAJbXRtc3JkCXIxMCwxCiAKQEAgLTYzNCw3ICs2MzYsOCBAQAogCXN0ZAlyMTIsUEFDQV9FWFNMQitFWF9SMTIocjEzKQogCW1mc3ByCXIxMCxTUFJOX1NQUkcxCiAJc3RkCXIxMCxQQUNBX0VYU0xCK0VYX1IxMyhyMTMpCi0JbGQJcjEyLFBBQ0FMUFBBQ0ErTFBQQUNBU1JSMShyMTMpOworCWxkCXIxMixQQUNBTFBQQUNBUFRSKHIxMykKKwlsZAlyMTIsTFBQQUNBU1JSMShyMTIpCiAJYgkuc2xiX21pc3NfcmVhbG1vZGUKIAogCVNURF9FWENFUFRJT05fSVNFUklFUygweDQwMCwgaW5zdHJ1Y3Rpb25fYWNjZXNzLCBQQUNBX0VYR0VOKQpAQCAtNjQ0LDcgKzY0Nyw4IEBACiAJbXRzcHIJU1BSTl9TUFJHMSxyMTMJCS8qIHNhdmUgcjEzICovCiAJbWZzcHIJcjEzLFNQUk5fU1BSRzMJCS8qIGdldCBwYWNhIGFkZHJlc3MgaW50byByMTMgKi8KIAlzdGQJcjMsUEFDQV9FWFNMQitFWF9SMyhyMTMpCi0JbGQJcjMsUEFDQUxQUEFDQStMUFBBQ0FTUlIwKHIxMykJLyogZ2V0IFNSUjAgdmFsdWUgKi8KKwlsZAlyMyxQQUNBTFBQQUNBUFRSKHIxMykKKwlsZAlyMyxMUFBBQ0FTUlIwKHIzKQkvKiBnZXQgU1JSMCB2YWx1ZSAqLwogCXN0ZAlyOSxQQUNBX0VYU0xCK0VYX1I5KHIxMykKIAltZmNyCXI5CiAjaWZkZWYgX19ESVNBQkxFRF9fCkBAIC02NTYsNyArNjYwLDggQEAKIAlzdGQJcjEyLFBBQ0FfRVhTTEIrRVhfUjEyKHIxMykKIAltZnNwcglyMTAsU1BSTl9TUFJHMQogCXN0ZAlyMTAsUEFDQV9FWFNMQitFWF9SMTMocjEzKQotCWxkCXIxMixQQUNBTFBQQUNBK0xQUEFDQVNSUjEocjEzKTsKKwlsZAlyMTIsUEFDQUxQUEFDQVBUUihyMTMpCisJbGQJcjEyLExQUEFDQVNSUjEocjEyKQogCWIJLnNsYl9taXNzX3JlYWxtb2RlCiAKICNpZmRlZiBfX0RJU0FCTEVEX18KQEAgLTcxMyw3ICs3MTgsNyBAQAogCWxieglyMjMsUEFDQVBST0NTVEFSVChyMTMpCS8qIFRlc3QgaWYgdGhpcyBwcm9jZXNzb3IKIAkJCQkJICogc2hvdWxkIHN0YXJ0ICovCiAJc3luYwotCUxPQURBRERSKHIzLGN1cnJlbnRfc2V0KQorCUxPQURfUkVHX0lNTUVESUFURShyMyxjdXJyZW50X3NldCkKIAlzbGRpCXIyOCxyMjQsMwkJLyogZ2V0IGN1cnJlbnRfc2V0W2NwdSNdICovCiAJbGR4CXIzLHIzLHIyOAogCWFkZGkJcjEscjMsVEhSRUFEX1NJWkUKQEAgLTc0NSwxNyArNzUwLDE5IEBACiAJLmdsb2JsIGRlY3JlbWVudGVyX2lTZXJpZXNfbWFza2VkCiBkZWNyZW1lbnRlcl9pU2VyaWVzX21hc2tlZDoKIAlsaQlyMTEsMQotCXN0YglyMTEsUEFDQUxQUEFDQStMUFBBQ0FERUNSSU5UKHIxMykKLQlMT0FEQkFTRShyMTIsdGJfdGlja3NfcGVyX2ppZmZ5KQotCWx3eglyMTIsT0ZGKHRiX3RpY2tzX3Blcl9qaWZmeSkocjEyKQorCWxkCXIxMixQQUNBTFBQQUNBUFRSKHIxMykKKwlzdGIJcjExLExQUEFDQURFQ1JJTlQocjEyKQorCUxPQURfUkVHX0FERFJCQVNFKHIxMix0Yl90aWNrc19wZXJfamlmZnkpCisJbHd6CXIxMixBRERST0ZGKHRiX3RpY2tzX3Blcl9qaWZmeSkocjEyKQogCW10c3ByCVNQUk5fREVDLHIxMgogCS8qIGZhbGwgdGhyb3VnaCAqLwogCiAJLmdsb2JsIGhhcmR3YXJlX2ludGVycnVwdF9pU2VyaWVzX21hc2tlZAogaGFyZHdhcmVfaW50ZXJydXB0X2lTZXJpZXNfbWFza2VkOgogCW10Y3JmCTB4ODAscjkJCS8qIFJlc3RvcmUgcmVncyAqLwotCWxkCXIxMSxQQUNBTFBQQUNBK0xQUEFDQVNSUjAocjEzKQotCWxkCXIxMixQQUNBTFBQQUNBK0xQUEFDQVNSUjEocjEzKQorCWxkCXIxMixQQUNBTFBQQUNBUFRSKHIxMykKKwlsZAlyMTEsTFBQQUNBU1JSMChyMTIpCisJbGQJcjEyLExQUEFDQVNSUjEocjEyKQogCW10c3ByCVNQUk5fU1JSMCxyMTEKIAltdHNwcglTUFJOX1NSUjEscjEyCiAJbGQJcjksUEFDQV9FWEdFTitFWF9SOShyMTMpCkBAIC05OTQsNyArMTAwMSw4IEBACiAJbGQJcjMsUEFDQV9FWFNMQitFWF9SMyhyMTMpCiAJbHd6CXI5LFBBQ0FfRVhTTEIrRVhfQ0NSKHIxMykJLyogZ2V0IHNhdmVkIENSICovCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JbGQJcjExLFBBQ0FMUFBBQ0ErTFBQQUNBU1JSMChyMTMpCS8qIGdldCBTUlIwIHZhbHVlICovCisJbGQJcjExLFBBQ0FMUFBBQ0FQVFIocjEzKQorCWxkCXIxMSxMUFBBQ0FTUlIwKHIxMSkJCS8qIGdldCBTUlIwIHZhbHVlICovCiAjZW5kaWYgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCiAKIAltdGxyCXIxMApAQCAtMTQxMiw3ICsxNDIwLDcgQEAKIAkgKiBwaHlzaWNhbCBjcHUgaWQgaW4gcjI0LCB3ZSBuZWVkIHRvIHNlYXJjaCB0aGUgcGFjYXMgdG8gZmluZAogCSAqIHdoaWNoIGxvZ2ljYWwgaWQgbWFwcyB0byBvdXIgcGh5c2ljYWwgb25lLgogCSAqLwotCUxPQURBRERSKHIxMywgcGFjYSkgCQkvKiBHZXQgYmFzZSB2YWRkciBvZiBwYWNhIGFycmF5CSAqLworCUxPQURfUkVHX0lNTUVESUFURShyMTMsIHBhY2EpCS8qIEdldCBiYXNlIHZhZGRyIG9mIHBhY2EgYXJyYXkJICovCiAJbGkJcjUsMAkJCS8qIGxvZ2ljYWwgY3B1IGlkICAgICAgICAgICAgICAgICovCiAxOglsaHoJcjYsUEFDQUhXQ1BVSUQocjEzKQkvKiBMb2FkIEhXIHByb2NpZCBmcm9tIHBhY2EgICAgICAqLwogCWNtcHcJcjYscjI0CQkJLyogQ29tcGFyZSB0byBvdXIgaWQgICAgICAgICAgICAgKi8KQEAgLTE0NDYsOCArMTQ1NCw4IEBACiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiBfU1RBVElDKF9fc3RhcnRfaW5pdGlhbGl6YXRpb25faVNlcmllcykKIAkvKiBDbGVhciBvdXQgdGhlIEJTUyAqLwotCUxPQURBRERSKHIxMSxfX2Jzc19zdG9wKQotCUxPQURBRERSKHI4LF9fYnNzX3N0YXJ0KQorCUxPQURfUkVHX0lNTUVESUFURShyMTEsX19ic3Nfc3RvcCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjgsX19ic3Nfc3RhcnQpCiAJc3ViCXIxMSxyMTEscjgJCS8qIGJzcyBzaXplCQkJKi8KIAlhZGRpCXIxMSxyMTEsNwkJLyogcm91bmQgdXAgdG8gYW4gZXZlbiBkb3VibGUgd29yZCAqLwogCXJsZGljbC4gcjExLHIxMSw2MSwzCQkvKiBzaGlmdCByaWdodCBieSAzCQkqLwpAQCAtMTQ1OCwxNyArMTQ2NiwxNyBAQAogMzoJc3RkdQlyMCw4KHI4KQogCWJkbnoJM2IKIDQ6Ci0JTE9BREFERFIocjEsaW5pdF90aHJlYWRfdW5pb24pCisJTE9BRF9SRUdfSU1NRURJQVRFKHIxLGluaXRfdGhyZWFkX3VuaW9uKQogCWFkZGkJcjEscjEsVEhSRUFEX1NJWkUKIAlsaQlyMCwwCiAJc3RkdQlyMCwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQocjEpCiAKLQlMT0FEQUREUihyMyxjcHVfc3BlY3MpCi0JTE9BREFERFIocjQsY3VyX2NwdV9zcGVjKQorCUxPQURfUkVHX0lNTUVESUFURShyMyxjcHVfc3BlY3MpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LGN1cl9jcHVfc3BlYykKIAlsaQlyNSwwCiAJYmwJLmlkZW50aWZ5X2NwdQogCi0JTE9BREFERFIocjIsX190b2Nfc3RhcnQpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIyLF9fdG9jX3N0YXJ0KQogCWFkZGkJcjIscjIsMHg0MDAwCiAJYWRkaQlyMixyMiwweDQwMDAKIApAQCAtMTUyOCw3ICsxNTM2LDcgQEAKIAlsaQlyMjQsMAogCiAJLyogU3dpdGNoIG9mZiBNTVUgaWYgbm90IGFscmVhZHkgKi8KLQlMT0FEQUREUihyNCwgLl9fYWZ0ZXJfcHJvbV9zdGFydCAtIEtFUk5FTEJBU0UpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LCAuX19hZnRlcl9wcm9tX3N0YXJ0IC0gS0VSTkVMQkFTRSkKIAlhZGQJcjQscjQscjMwCiAJYmwJLl9fbW11X29mZgogCWIJLl9fYWZ0ZXJfcHJvbV9zdGFydApAQCAtMTU0OCw3ICsxNTU2LDcgQEAKIAkvKiBwdXQgYSByZWxvY2F0aW9uIG9mZnNldCBpbnRvIHIzICovCiAJYmwJLnJlbG9jX29mZnNldAogCi0JTE9BREFERFIocjIsX190b2Nfc3RhcnQpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIyLF9fdG9jX3N0YXJ0KQogCWFkZGkJcjIscjIsMHg0MDAwCiAJYWRkaQlyMixyMiwweDQwMDAKIApAQCAtMTU4OCw5ICsxNTk2LDkgQEAKICAqLwogCWJsCS5yZWxvY19vZmZzZXQKIAltcglyMjYscjMKLQlTRVRfUkVHX1RPX0NPTlNUKHIyNyxLRVJORUxCQVNFKQorCUxPQURfUkVHX0lNTUVESUFURShyMjcsIEtFUk5FTEJBU0UpCiAKLQlMT0FEQUREUihyMywgUEhZU0lDQUxfU1RBUlQpCS8qIHRhcmdldCBhZGRyICovCisJTE9BRF9SRUdfSU1NRURJQVRFKHIzLCBQSFlTSUNBTF9TVEFSVCkJLyogdGFyZ2V0IGFkZHIgKi8KIAogCS8vIFhYWCBGSVhNRTogVXNlIHBoeXMgcmV0dXJuZWQgYnkgT0YgKHIzMCkKIAlhZGQJcjQscjI3LHIyNiAJCS8qIHNvdXJjZSBhZGRyCQkJICovCkBAIC0xNTk4LDcgKzE2MDYsNyBAQAogCQkJCQkvKiAgIGkuZS4gd2hlcmUgd2UgYXJlIHJ1bm5pbmcJICovCiAJCQkJCS8qCXRoZSBzb3VyY2UgYWRkcgkJICovCiAKLQlMT0FEQUREUihyNSxjb3B5X3RvX2hlcmUpCS8qICMgYnl0ZXMgb2YgbWVtb3J5IHRvIGNvcHkJICovCisJTE9BRF9SRUdfSU1NRURJQVRFKHI1LGNvcHlfdG9faGVyZSkgLyogIyBieXRlcyBvZiBtZW1vcnkgdG8gY29weSAqLwogCXN1YglyNSxyNSxyMjcKIAogCWxpCXI2LDB4MTAwCQkvKiBTdGFydCBvZmZzZXQsIHRoZSBmaXJzdCAweDEwMCAqLwpAQCAtMTYwOCwxMSArMTYxNiwxMSBAQAogCQkJCQkvKiB0aGlzIGluY2x1ZGVzIHRoZSBjb2RlIGJlaW5nCSAqLwogCQkJCQkvKiBleGVjdXRlZCBoZXJlLgkJICovCiAKLQlMT0FEQUREUihyMCwgNGYpCQkvKiBKdW1wIHRvIHRoZSBjb3B5IG9mIHRoaXMgY29kZSAqLworCUxPQURfUkVHX0lNTUVESUFURShyMCwgNGYpCS8qIEp1bXAgdG8gdGhlIGNvcHkgb2YgdGhpcyBjb2RlICovCiAJbXRjdHIJcjAJCQkvKiB0aGF0IHdlIGp1c3QgbWFkZS9yZWxvY2F0ZWQJICovCiAJYmN0cgogCi00OglMT0FEQUREUihyNSxrbGltaXQpCis0OglMT0FEX1JFR19JTU1FRElBVEUocjUsa2xpbWl0KQogCWFkZAlyNSxyNSxyMjYKIAlsZAlyNSwwKHI1KQkJLyogZ2V0IHRoZSB2YWx1ZSBvZiBrbGltaXQgKi8KIAlzdWIJcjUscjUscjI3CkBAIC0xNjk0LDcgKzE3MDIsNyBAQAogCW10bXNyZAlyMwkJCS8qIFJJIG9uICovCiAKIAkvKiBTZXQgdXAgYSBwYWNhIHZhbHVlIGZvciB0aGlzIHByb2Nlc3Nvci4gKi8KLQlMT0FEQUREUihyNCwgcGFjYSkgCQkgLyogR2V0IGJhc2UgdmFkZHIgb2YgcGFjYSBhcnJheQkqLworCUxPQURfUkVHX0lNTUVESUFURShyNCwgcGFjYSkJLyogR2V0IGJhc2UgdmFkZHIgb2YgcGFjYSBhcnJheQkqLwogCW11bGxpCXIxMyxyMjQsUEFDQV9TSVpFCSAvKiBDYWxjdWxhdGUgdmFkZHIgb2YgcmlnaHQgcGFjYSAqLwogCWFkZAlyMTMscjEzLHI0CQkvKiBmb3IgdGhpcyBwcm9jZXNzb3IuCQkqLwogCW10c3ByCVNQUk5fU1BSRzMscjEzCQkgLyogU2F2ZSB2YWRkciBvZiBwYWNhIGluIFNQUkczCSovCkBAIC0xNzMxLDcgKzE3MzksNyBAQAogCWJsCS5lYXJseV9zZXR1cF9zZWNvbmRhcnkKIAogCS8qIEluaXRpYWxpemUgdGhlIGtlcm5lbCBzdGFjay4gIEp1c3QgYSByZXBlYXQgZm9yIGlTZXJpZXMuCSAqLwotCUxPQURBRERSKHIzLGN1cnJlbnRfc2V0KQorCUxPQURfUkVHX0FERFIocjMsIGN1cnJlbnRfc2V0KQogCXNsZGkJcjI4LHIyNCwzCQkvKiBnZXQgY3VycmVudF9zZXRbY3B1I10JICovCiAJbGR4CXIxLHIzLHIyOAogCWFkZGkJcjEscjEsVEhSRUFEX1NJWkUtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKQEAgLTE3NDIsOCArMTc1MCw4IEBACiAJbXRscglyNwogCiAJLyogZW5hYmxlIE1NVSBhbmQganVtcCB0byBzdGFydF9zZWNvbmRhcnkgKi8KLQlMT0FEQUREUihyMywuc3RhcnRfc2Vjb25kYXJ5X3Byb2xvZykKLQlTRVRfUkVHX1RPX0NPTlNUKHI0LCBNU1JfS0VSTkVMKQorCUxPQURfUkVHX0FERFIocjMsIC5zdGFydF9zZWNvbmRhcnlfcHJvbG9nKQorCUxPQURfUkVHX0lNTUVESUFURShyNCwgTVNSX0tFUk5FTCkKICNpZmRlZiBET19TT0ZUX0RJU0FCTEUKIAlvcmkJcjQscjQsTVNSX0VFCiAjZW5kaWYKQEAgLTE3OTIsOCArMTgwMCw4IEBACiAJICogYmUgZGV0YWNoZWQgZnJvbSB0aGUga2VybmVsIGNvbXBsZXRlbHkuIEJlc2lkZXMsIHdlIG5lZWQKIAkgKiB0byBjbGVhciBpdCBub3cgZm9yIGtleGVjLXN0eWxlIGVudHJ5LgogCSAqLwotCUxPQURBRERSKHIxMSxfX2Jzc19zdG9wKQotCUxPQURBRERSKHI4LF9fYnNzX3N0YXJ0KQorCUxPQURfUkVHX0lNTUVESUFURShyMTEsX19ic3Nfc3RvcCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjgsX19ic3Nfc3RhcnQpCiAJc3ViCXIxMSxyMTEscjgJCS8qIGJzcyBzaXplCQkJKi8KIAlhZGRpCXIxMSxyMTEsNwkJLyogcm91bmQgdXAgdG8gYW4gZXZlbiBkb3VibGUgd29yZCAqLwogCXJsZGljbC4gcjExLHIxMSw2MSwzCQkvKiBzaGlmdCByaWdodCBieSAzCQkqLwpAQCAtMTgzMSw3ICsxODM5LDcgQEAKIAkvKiB1cCB0aGUgaHRhYi4gIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHdlIGhhdmUgcmVsb2NhdGVkIHRoZSAgKi8KIAkvKiBrZXJuZWwgYnV0IGFyZSBzdGlsbCBydW5uaW5nIGluIHJlYWwgbW9kZS4gKi8KIAotCUxPQURBRERSKHIzLGluaXRfdGhyZWFkX3VuaW9uKQorCUxPQURfUkVHX0lNTUVESUFURShyMyxpbml0X3RocmVhZF91bmlvbikKIAlhZGQJcjMscjMscjI2CiAKIAkvKiBzZXQgdXAgYSBzdGFjayBwb2ludGVyIChwaHlzaWNhbCBhZGRyZXNzKSAqLwpAQCAtMTg0MCwxNCArMTg0OCwxNCBAQAogCXN0ZHUJcjAsLVNUQUNLX0ZSQU1FX09WRVJIRUFEKHIxKQogCiAJLyogc2V0IHVwIHRoZSBUT0MgKHBoeXNpY2FsIGFkZHJlc3MpICovCi0JTE9BREFERFIocjIsX190b2Nfc3RhcnQpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIyLF9fdG9jX3N0YXJ0KQogCWFkZGkJcjIscjIsMHg0MDAwCiAJYWRkaQlyMixyMiwweDQwMDAKIAlhZGQJcjIscjIscjI2CiAKLQlMT0FEQUREUihyMyxjcHVfc3BlY3MpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIzLCBjcHVfc3BlY3MpCiAJYWRkCXIzLHIzLHIyNgotCUxPQURBRERSKHI0LGN1cl9jcHVfc3BlYykKKwlMT0FEX1JFR19JTU1FRElBVEUocjQsY3VyX2NwdV9zcGVjKQogCWFkZAlyNCxyNCxyMjYKIAltcglyNSxyMjYKIAlibAkuaWRlbnRpZnlfY3B1CkBAIC0xODYzLDExICsxODcxLDExIEBACiAJICogbm93aGVyZSBpdCBjYW4gYmUgaW5pdGlhbGl6ZWQgZGlmZmVyZW50bHkgYmVmb3JlIHdlIHJlYWNoIHRoaXMKIAkgKiBjb2RlCiAJICovCi0JTE9BREFERFIocjI3LCBib290X2NwdWlkKQorCUxPQURfUkVHX0lNTUVESUFURShyMjcsIGJvb3RfY3B1aWQpCiAJYWRkCXIyNyxyMjcscjI2CiAJbHd6CXIyNywwKHIyNykKIAotCUxPQURBRERSKHIyNCwgcGFjYSkgCQkvKiBHZXQgYmFzZSB2YWRkciBvZiBwYWNhIGFycmF5CSAqLworCUxPQURfUkVHX0lNTUVESUFURShyMjQsIHBhY2EpIAkvKiBHZXQgYmFzZSB2YWRkciBvZiBwYWNhIGFycmF5CSAqLwogCW11bGxpCXIxMyxyMjcsUEFDQV9TSVpFCS8qIENhbGN1bGF0ZSB2YWRkciBvZiByaWdodCBwYWNhICovCiAJYWRkCXIxMyxyMTMscjI0CQkvKiBmb3IgdGhpcyBwcm9jZXNzb3IuCQkgKi8KIAlhZGQJcjEzLHIxMyxyMjYJCS8qIGNvbnZlcnQgdG8gcGh5c2ljYWwgYWRkcgkgKi8KQEAgLTE4ODAsOCArMTg4OCw4IEBACiAJbXIJcjMscjMxCiAgCWJsCS5lYXJseV9zZXR1cAogCi0JTE9BREFERFIocjMsLnN0YXJ0X2hlcmVfY29tbW9uKQotCVNFVF9SRUdfVE9fQ09OU1QocjQsIE1TUl9LRVJORUwpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIzLCAuc3RhcnRfaGVyZV9jb21tb24pCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LCBNU1JfS0VSTkVMKQogCW10c3ByCVNQUk5fU1JSMCxyMwogCW10c3ByCVNQUk5fU1JSMSxyNAogCXJmaWQKQEAgLTE4OTUsNyArMTkwMyw3IEBACiAJLyogVGhlIGZvbGxvd2luZyBjb2RlIHNldHMgdXAgdGhlIFNQIGFuZCBUT0Mgbm93IHRoYXQgd2UgYXJlICovCiAJLyogcnVubmluZyB3aXRoIHRyYW5zbGF0aW9uIGVuYWJsZWQuICovCiAKLQlMT0FEQUREUihyMyxpbml0X3RocmVhZF91bmlvbikKKwlMT0FEX1JFR19JTU1FRElBVEUocjMsaW5pdF90aHJlYWRfdW5pb24pCiAKIAkvKiBzZXQgdXAgdGhlIHN0YWNrICovCiAJYWRkaQlyMSxyMyxUSFJFQURfU0laRQpAQCAtMTkwOCwxNiArMTkxNiwxNiBAQAogCWxpCXIzLDAKIAlibAkuZG9fY3B1X2Z0cl9maXh1cHMKIAotCUxPQURBRERSKHIyNiwgYm9vdF9jcHVpZCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjI2LCBib290X2NwdWlkKQogCWx3eglyMjYsMChyMjYpCiAKLQlMT0FEQUREUihyMjQsIHBhY2EpIAkJLyogR2V0IGJhc2UgdmFkZHIgb2YgcGFjYSBhcnJheSAgKi8KKwlMT0FEX1JFR19JTU1FRElBVEUocjI0LCBwYWNhKQkvKiBHZXQgYmFzZSB2YWRkciBvZiBwYWNhIGFycmF5ICAqLwogCW11bGxpCXIxMyxyMjYsUEFDQV9TSVpFCS8qIENhbGN1bGF0ZSB2YWRkciBvZiByaWdodCBwYWNhICovCiAJYWRkCXIxMyxyMTMscjI0CQkvKiBmb3IgdGhpcyBwcm9jZXNzb3IuCQkgKi8KIAltdHNwcglTUFJOX1NQUkczLHIxMwogCiAJLyogcHRyIHRvIGN1cnJlbnQgKi8KLQlMT0FEQUREUihyNCxpbml0X3Rhc2spCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LCBpbml0X3Rhc2spCiAJc3RkCXI0LFBBQ0FDVVJSRU5UKHIxMykKIAogCS8qIExvYWQgdGhlIFRPQyAqLwpAQCAtMTk0MCw3ICsxOTQ4LDcgQEAKIAogX0dMT0JBTChobXRfaW5pdCkKICNpZmRlZiBDT05GSUdfSE1UCi0JTE9BREFERFIocjUsIGhtdF90aHJlYWRfZGF0YSkKKwlMT0FEX1JFR19JTU1FRElBVEUocjUsIGhtdF90aHJlYWRfZGF0YSkKIAltZnNwcglyNyxTUFJOX1BWUgogCXNyd2kJcjcscjcsMTYKIAljbXB3aQlyNywweDM0CQkJLyogUHVsc2FyICAqLwpAQCAtMTk2MSw3ICsxOTY5LDcgQEAKIAliCTEwMWYKIAogX19obXRfc2Vjb25kYXJ5X2hvbGQ6Ci0JTE9BREFERFIocjUsIGhtdF90aHJlYWRfZGF0YSkKKwlMT0FEX1JFR19JTU1FRElBVEUocjUsIGhtdF90aHJlYWRfZGF0YSkKIAljbHJsZGkJcjUscjUsNAogCWxpCXI3LDAKIAltZnNwcglyNixTUFJOX1BJUgpAQCAtMTk4OSw3ICsxOTk3LDcgQEAKIAogI2lmZGVmIENPTkZJR19ITVQKIF9HTE9CQUwoaG10X3N0YXJ0X3NlY29uZGFyeSkKLQlMT0FEQUREUihyNCxfX2htdF9zZWNvbmRhcnlfaG9sZCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjQsX19obXRfc2Vjb25kYXJ5X2hvbGQpCiAJY2xybGRpCXI0LHI0LDQKIAltdHNwcglTUFJOX05JQURPUk0sIHI0CiAJbWZzcHIJcjQsIFNQUk5fTVNSRE9STQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNC5TCmluZGV4IDE0OTRlMmYuLmMxNmI0YWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9wb3dlcjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI0LlMKQEAgLTM4LDE0ICszOCwxNCBAQAogCS8qIFdlIG11c3QgZHluYW1pY2FsbHkgY2hlY2sgZm9yIHRoZSBOQVAgZmVhdHVyZSBhcyBpdAogCSAqIGNhbiBiZSBjbGVhcmVkIGJ5IENQVSBpbml0IGFmdGVyIHRoZSBmaXh1cHMgYXJlIGRvbmUKIAkgKi8KLQlMT0FEQkFTRShyMyxjdXJfY3B1X3NwZWMpCi0JbGQJcjQsT0ZGKGN1cl9jcHVfc3BlYykocjMpCisJTE9BRF9SRUdfQUREUkJBU0UocjMsY3VyX2NwdV9zcGVjKQorCWxkCXI0LEFERFJPRkYoY3VyX2NwdV9zcGVjKShyMykKIAlsZAlyNCxDUFVfU1BFQ19GRUFUVVJFUyhyNCkKIAlhbmRpLglyMCxyNCxDUFVfRlRSX0NBTl9OQVAKIAliZXFscgogCS8qIE5vdyBjaGVjayBpZiB1c2VyIG9yIGFyY2ggZW5hYmxlZCBOQVAgbW9kZSAqLwotCUxPQURCQVNFKHIzLHBvd2Vyc2F2ZV9uYXApCi0JbHd6CXI0LE9GRihwb3dlcnNhdmVfbmFwKShyMykKKwlMT0FEX1JFR19BRERSQkFTRShyMyxwb3dlcnNhdmVfbmFwKQorCWx3eglyNCxBRERST0ZGKHBvd2Vyc2F2ZV9uYXApKHIzKQogCWNtcHdpCTAscjQsMAogCWJlcWxyCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCmluZGV4IDU2NTEwMzIuLmQxZmZmY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwpAQCAtMjM4LDE0ICsyMzgsMTAgQEAKICAgICAgICAgaXJxX2V4aXQoKTsKIAogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCXsKLQkJc3RydWN0IHBhY2Ffc3RydWN0ICpscGFjYSA9IGdldF9wYWNhKCk7Ci0KLQkJaWYgKGxwYWNhLT5scHBhY2EuaW50X2R3b3JkLmZpZWxkcy5kZWNyX2ludCkgewotCQkJbHBhY2EtPmxwcGFjYS5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50ID0gMDsKLQkJCS8qIFNpZ25hbCBhIGZha2UgZGVjcmVtZW50ZXIgaW50ZXJydXB0ICovCi0JCQl0aW1lcl9pbnRlcnJ1cHQocmVncyk7Ci0JCX0KKwlpZiAoZ2V0X2xwcGFjYSgpLT5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50KSB7CisJCWdldF9scHBhY2EoKS0+aW50X2R3b3JkLmZpZWxkcy5kZWNyX2ludCA9IDA7CisJCS8qIFNpZ25hbCBhIGZha2UgZGVjcmVtZW50ZXIgaW50ZXJydXB0ICovCisJCXRpbWVyX2ludGVycnVwdChyZWdzKTsKIAl9CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbHBhcmNmZy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKaW5kZXggOWRkYTE2Yy4uMWFlOTZhOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKQEAgLTU1LDE1ICs1NSwxMyBAQAogewogCXVuc2lnbmVkIGxvbmcgc3VtX3B1cnIgPSAwOwogCWludCBjcHU7Ci0Jc3RydWN0IHBhY2Ffc3RydWN0ICpscGFjYTsKIAogCWZvcl9lYWNoX2NwdShjcHUpIHsKLQkJbHBhY2EgPSBwYWNhICsgY3B1OwotCQlzdW1fcHVyciArPSBscGFjYS0+bHBwYWNhLmVtdWxhdGVkX3RpbWVfYmFzZTsKKwkJc3VtX3B1cnIgKz0gbHBwYWNhW2NwdV0uZW11bGF0ZWRfdGltZV9iYXNlOwogCiAjaWZkZWYgUFVSUl9ERUJVRwogCQlwcmludGsoS0VSTl9JTkZPICJnZXRfcHVyciBmb3IgY3B1ICglZCkgaGFzIHZhbHVlICglbGQpIFxuIiwKLQkJCWNwdSwgbHBhY2EtPmxwcGFjYS5lbXVsYXRlZF90aW1lX2Jhc2UpOworCQkJY3B1LCBscHBhY2FbY3B1XS5lbXVsYXRlZF90aW1lX2Jhc2UpOwogI2VuZGlmCiAJfQogCXJldHVybiBzdW1fcHVycjsKQEAgLTc5LDEyICs3NywxMSBAQAogCXVuc2lnbmVkIGxvbmcgcG9vbF9pZCwgbHBfaW5kZXg7CiAJaW50IHNoYXJlZCwgZW50aXRsZWRfY2FwYWNpdHksIG1heF9lbnRpdGxlZF9jYXBhY2l0eTsKIAlpbnQgcHJvY2Vzc29ycywgbWF4X3Byb2Nlc3NvcnM7Ci0Jc3RydWN0IHBhY2Ffc3RydWN0ICpscGFjYSA9IGdldF9wYWNhKCk7CiAJdW5zaWduZWQgbG9uZyBwdXJyID0gZ2V0X3B1cnIoKTsKIAogCXNlcV9wcmludGYobSwgIiVzICVzIFxuIiwgTU9EVUxFX05BTUUsIE1PRFVMRV9WRVJTKTsKIAotCXNoYXJlZCA9IChpbnQpKGxwYWNhLT5scHBhY2FfcHRyLT5zaGFyZWRfcHJvYyk7CisJc2hhcmVkID0gKGludCkoZ2V0X2xwcGFjYSgpLT5zaGFyZWRfcHJvYyk7CiAJc2VxX3ByaW50ZihtLCAic2VyaWFsX251bWJlcj0lYyVjJWMlYyVjJWMlY1xuIiwKIAkJICAgZTJhKHhJdEV4dFZwZFBhbmVsLm1mZ0lEWzJdKSwKIAkJICAgZTJhKHhJdEV4dFZwZFBhbmVsLm1mZ0lEWzNdKSwKQEAgLTQwMiw3ICszOTksNyBAQAogCQkJICAgKGhfcmVzb3VyY2UgPj4gMCAqIDgpICYgMHhmZmZmKTsKIAogCQkvKiBwb29sIHJlbGF0ZWQgZW50cmllcyBhcmUgYXByb3ByaWF0ZSBmb3Igc2hhcmVkIGNvbmZpZ3MgKi8KLQkJaWYgKHBhY2FbMF0ubHBwYWNhLnNoYXJlZF9wcm9jKSB7CisJCWlmIChscHBhY2FbMF0uc2hhcmVkX3Byb2MpIHsKIAogCQkJaF9waWMoJnBvb2xfaWRsZV90aW1lLCAmcG9vbF9wcm9jcyk7CiAKQEAgLTQ1MSw3ICs0NDgsNyBAQAogCXNlcV9wcmludGYobSwgInBhcnRpdGlvbl9wb3RlbnRpYWxfcHJvY2Vzc29ycz0lZFxuIiwKIAkJICAgcGFydGl0aW9uX3BvdGVudGlhbF9wcm9jZXNzb3JzKTsKIAotCXNlcV9wcmludGYobSwgInNoYXJlZF9wcm9jZXNzb3JfbW9kZT0lZFxuIiwgcGFjYVswXS5scHBhY2Euc2hhcmVkX3Byb2MpOworCXNlcV9wcmludGYobSwgInNoYXJlZF9wcm9jZXNzb3JfbW9kZT0lZFxuIiwgbHBwYWNhWzBdLnNoYXJlZF9wcm9jKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwppbmRleCAwMWQwZDk3Li5iZTk4MjAyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwpAQCAtNjgsNyArNjgsNyBAQAogCW1mbHIJcjAKIAlibAkxZgogMToJbWZscglyMwotCUxPQURBRERSKHI0LDFiKQorCUxPQURfUkVHX0lNTUVESUFURShyNCwxYikKIAlzdWJmCXIzLHI0LHIzCiAJbXRscglyMAogCWJscgpAQCAtODAsNyArODAsNyBAQAogCW1mbHIJcjAKIAlibAkxZgogMToJbWZscglyNQotCUxPQURBRERSKHI0LDFiKQorCUxPQURfUkVHX0lNTUVESUFURShyNCwxYikKIAlzdWJmCXI1LHI0LHI1CiAJYWRkCXIzLHIzLHI1CiAJbXRscglyMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUwppbmRleCBhZTQ4YTAwLi4yNzc4Y2NlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUwpAQCAtMzksNyArMzksNyBAQAogCW1mbHIJcjAKIAlibAkxZgogMToJbWZscglyMwotCUxPQURBRERSKHI0LDFiKQorCUxPQURfUkVHX0lNTUVESUFURShyNCwxYikKIAlzdWJmCXIzLHI0LHIzCiAJbXRscglyMAogCWJscgpAQCAtNTEsNyArNTEsNyBAQAogCW1mbHIJcjAKIAlibAkxZgogMToJbWZscglyNQotCUxPQURBRERSKHI0LDFiKQorCUxPQURfUkVHX0lNTUVESUFURShyNCwxYikKIAlzdWJmCXI1LHI0LHI1CiAJYWRkCXIzLHIzLHI1CiAJbXRscglyMApAQCAtNDk4LDE1ICs0OTgsMTUgQEAKICAqLwogX0dMT0JBTChkb19jcHVfZnRyX2ZpeHVwcykKIAkvKiBHZXQgQ1BVIDAgZmVhdHVyZXMgKi8KLQlMT0FEQUREUihyNixjdXJfY3B1X3NwZWMpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI2LGN1cl9jcHVfc3BlYykKIAlzdWIJcjYscjYscjMKIAlsZAlyNCwwKHI2KQogCXN1YglyNCxyNCxyMwogCWxkCXI0LENQVV9TUEVDX0ZFQVRVUkVTKHI0KQogCS8qIEdldCB0aGUgZml4dXAgdGFibGUgKi8KLQlMT0FEQUREUihyNixfX3N0YXJ0X19fZnRyX2ZpeHVwKQorCUxPQURfUkVHX0lNTUVESUFURShyNixfX3N0YXJ0X19fZnRyX2ZpeHVwKQogCXN1YglyNixyNixyMwotCUxPQURBRERSKHI3LF9fc3RvcF9fX2Z0cl9maXh1cCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjcsX19zdG9wX19fZnRyX2ZpeHVwKQogCXN1YglyNyxyNyxyMwogCS8qIERvIHRoZSBmaXh1cCAqLwogMToJY21wbGQJcjYscjcKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX2RldmljZS5jCmluZGV4IDcwNjVlNDAuLjIyZDgzZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9kZXZpY2UuYwpAQCAtMTMyLDYgKzEzMiw4IEBACiBzdHJ1Y3QgYnVzX3R5cGUgb2ZfcGxhdGZvcm1fYnVzX3R5cGUgPSB7CiAgICAgICAgLm5hbWUJPSAib2ZfcGxhdGZvcm0iLAogICAgICAgIC5tYXRjaAk9IG9mX3BsYXRmb3JtX2J1c19tYXRjaCwKKyAgICAgICAucHJvYmUJPSBvZl9kZXZpY2VfcHJvYmUsCisgICAgICAgLnJlbW92ZQk9IG9mX2RldmljZV9yZW1vdmUsCiAgICAgICAgLnN1c3BlbmQJPSBvZl9kZXZpY2Vfc3VzcGVuZCwKICAgICAgICAucmVzdW1lCT0gb2ZfZGV2aWNlX3Jlc3VtZSwKIH07CkBAIC0xNTAsOCArMTUyLDYgQEAKIAkvKiBpbml0aWFsaXplIGNvbW1vbiBkcml2ZXIgZmllbGRzICovCiAJZHJ2LT5kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsKIAlkcnYtPmRyaXZlci5idXMgPSAmb2ZfcGxhdGZvcm1fYnVzX3R5cGU7Ci0JZHJ2LT5kcml2ZXIucHJvYmUgPSBvZl9kZXZpY2VfcHJvYmU7Ci0JZHJ2LT5kcml2ZXIucmVtb3ZlID0gb2ZfZGV2aWNlX3JlbW92ZTsKIAogCS8qIHJlZ2lzdGVyIHdpdGggY29yZSAqLwogCWNvdW50ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BhY2EuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jCmluZGV4IDk5OWJkZDguLjVkMWI3MDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jCkBAIC0yNSw2ICsyNSwyOCBAQAogICogZmllbGQgY29ycmVjdGx5ICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX3RvY19zdGFydDsKIAorLyoKKyAqIGlTZXJpZXMgc3RydWN0dXJlIHdoaWNoIHRoZSBoeXBlcnZpc29yIGtub3dzIGFib3V0IC0gdGhpcyBzdHJ1Y3R1cmUKKyAqIHNob3VsZCBub3QgY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LiAgVGhlIHZwYV9pbml0L3JlZ2lzdGVyX3ZwYSBjYWxsCisgKiBpcyBub3cga25vd24gdG8gZmFpbCBpZiB0aGUgbHBwYWNhIHN0cnVjdHVyZSBjcm9zc2VzIGEgcGFnZQorICogYm91bmRhcnkuICBUaGUgbHBwYWNhIGlzIGFsc28gdXNlZCBvbiBQT1dFUjUgcFNlcmllcyBib3hlcy4gIFRoZQorICogbHBwYWNhIGlzIDY0MCBieXRlcyBsb25nLCBhbmQgY2Fubm90IHJlYWRpbHkgY2hhbmdlIHNpbmNlIHRoZQorICogaHlwZXJ2aXNvciBrbm93cyBpdHMgbGF5b3V0LCBzbyBhIDFrQiBhbGlnbm1lbnQgd2lsbCBzdWZmaWNlIHRvCisgKiBlbnN1cmUgdGhhdCBpdCBkb2Vzbid0IGNyb3NzIGEgcGFnZSBib3VuZGFyeS4KKyAqLworc3RydWN0IGxwcGFjYSBscHBhY2FbXSA9IHsKKwlbMCAuLi4gKE5SX0NQVVMtMSldID0geworCQkuZGVzYyA9IDB4ZDM5N2Q3ODEsCS8qICJMcFBhIiAqLworCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbHBwYWNhKSwKKwkJLmR5bl9wcm9jX3N0YXR1cyA9IDIsCisJCS5kZWNyX3ZhbCA9IDB4MDBmZjAwMDAsCisJCS5mcHJlZ3NfaW5fdXNlID0gMSwKKwkJLmVuZF9vZl9xdWFudHVtID0gMHhmZmZmZmZmZmZmZmZmZmZmdWwsCisJCS5zbGJfY291bnQgPSA2NCwKKwkJLnZteHJlZ3NfaW5fdXNlID0gMCwKKwl9LAorfTsKKwogLyogVGhlIFBhY2EgaXMgYW4gYXJyYXkgd2l0aCBvbmUgZW50cnkgcGVyIHByb2Nlc3Nvci4gIEVhY2ggY29udGFpbnMgYW4KICAqIGxwcGFjYSwgd2hpY2ggY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHNoYXJlZCBiZXR3ZWVuIHRoZQogICogaHlwZXJ2aXNvciBhbmQgTGludXguCkBAIC0zNSwyNyArNTcsMTcgQEAKICAqIHByb2Nlc3NvciAobm90IHRocmVhZCkuCiAgKi8KICNkZWZpbmUgUEFDQV9JTklUX0NPTU1PTihudW1iZXIsIHN0YXJ0LCBhc3JyLCBhc3J2KQkJCSAgICBcCisJLmxwcGFjYV9wdHIgPSAmbHBwYWNhW251bWJlcl0sCQkJCQkgICAgXAogCS5sb2NrX3Rva2VuID0gMHg4MDAwLAkJCQkJCSAgICBcCiAJLnBhY2FfaW5kZXggPSAobnVtYmVyKSwJCS8qIFBhY2EgSW5kZXggKi8JCSAgICBcCiAJLmtlcm5lbF90b2MgPSAodW5zaWduZWQgbG9uZykoJl9fdG9jX3N0YXJ0KSArIDB4ODAwMFVMLAkJICAgIFwKIAkuc3RhYl9yZWFsID0gKGFzcnIpLCAJCS8qIFJlYWwgcG9pbnRlciB0byBzZWdtZW50IHRhYmxlICovIFwKIAkuc3RhYl9hZGRyID0gKGFzcnYpLAkJLyogVmlydCBwb2ludGVyIHRvIHNlZ21lbnQgdGFibGUgKi8gXAogCS5jcHVfc3RhcnQgPSAoc3RhcnQpLAkJLyogUHJvY2Vzc29yIHN0YXJ0ICovCQkgICAgXAotCS5od19jcHVfaWQgPSAweGZmZmYsCQkJCQkJICAgIFwKLQkubHBwYWNhID0gewkJCQkJCQkgICAgXAotCQkuZGVzYyA9IDB4ZDM5N2Q3ODEsCS8qICJMcFBhIiAqLwkJCSAgICBcCi0JCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBscHBhY2EpLAkJCQkgICAgXAotCQkuZHluX3Byb2Nfc3RhdHVzID0gMiwJCQkJCSAgICBcCi0JCS5kZWNyX3ZhbCA9IDB4MDBmZjAwMDAsCQkJCQkgICAgXAotCQkuZnByZWdzX2luX3VzZSA9IDEsCQkJCQkgICAgXAotCQkuZW5kX29mX3F1YW50dW0gPSAweGZmZmZmZmZmZmZmZmZmZmZ1bCwJCQkgICAgXAotCQkuc2xiX2NvdW50ID0gNjQsCQkJCQkgICAgXAotCQkudm14cmVnc19pbl91c2UgPSAwLAkJCQkJICAgIFwKLQl9LAkJCQkJCQkJICAgIFwKKwkuaHdfY3B1X2lkID0gMHhmZmZmLAogCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiAjZGVmaW5lIFBBQ0FfSU5JVF9JU0VSSUVTKG51bWJlcikJCQkJCSAgICBcCi0JLmxwcGFjYV9wdHIgPSAmcGFjYVtudW1iZXJdLmxwcGFjYSwJCQkJICAgIFwKIAkucmVnX3NhdmVfcHRyID0gJmlzZXJpZXNfcmVnX3NhdmVbbnVtYmVyXSwKIAogI2RlZmluZSBQQUNBX0lOSVQobnVtYmVyKQkJCQkJCSAgICBcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYwppbmRleCAyNGZlNzBmLi5jMzY3NTIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIHN0YXRpYyB2b2lkIGZpeHVwX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHN0YXRpYyB2b2lkIGRvX2J1c19zZXR1cChzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKK3N0YXRpYyB2b2lkIHBoYnNfcmVtYXBfaW8odm9pZCk7CiAjZW5kaWYKIAogLyogcGNpX2lvX2Jhc2UgLS0gdGhlIGJhc2UgYWRkcmVzcyBmcm9tIHdoaWNoIGlvIGJhcnMgYXJlIG9mZnNldHMuCkBAIC0yNTEsNiArMjUyLDcgQEAKIAkJa2ZyZWUocGhiKTsKIH0KIAorI2lmbmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKIHZvaWQgX19kZXZpbml0IHBjaWJpb3NfY2xhaW1fb25lX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwpAQCAtMjc1LDcgKzI3Nyw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChwY2liaW9zX2NsYWltX29uZV9idXMpOwogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX1BQQ19JU0VSSUVTCiBzdGF0aWMgdm9pZCBfX2luaXQgcGNpYmlvc19jbGFpbV9vZl9zZXR1cCh2b2lkKQogewogCXN0cnVjdCBwY2lfYnVzICpiOwpAQCAtMTIxOCw3ICsxMjE5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wocmVtYXBfYnVzX3JhbmdlKTsKIAotdm9pZCBwaGJzX3JlbWFwX2lvKHZvaWQpCitzdGF0aWMgdm9pZCBwaGJzX3JlbWFwX2lvKHZvaWQpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCAxNmQ5YTkwLi5kOWE0NTljIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTIzMCw4ICsyMzAsNyBAQAogRVhQT1JUX1NZTUJPTChjcG1faW5zdGFsbF9oYW5kbGVyKTsKIEVYUE9SVF9TWU1CT0woY3BtX2ZyZWVfaGFuZGxlcik7CiAjZW5kaWYgLyogQ09ORklHXzh4eCAqLwotI2lmIGRlZmluZWQoQ09ORklHXzh4eCkgfHwgZGVmaW5lZChDT05GSUdfNDB4KSB8fCBkZWZpbmVkKENPTkZJR184NXh4KSB8fFwKLQlkZWZpbmVkKENPTkZJR184M3h4KQorI2lmIGRlZmluZWQoQ09ORklHXzh4eCkgfHwgZGVmaW5lZChDT05GSUdfNDB4KQogRVhQT1JUX1NZTUJPTChfX3Jlcyk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwppbmRleCAxMDVkNTYwLi41NzcwMzk5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjAxLDEzICsyMDEsMTMgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfU1BFICovCiAKKyNpZm5kZWYgQ09ORklHX1NNUAogLyoKICAqIElmIHdlIGFyZSBkb2luZyBsYXp5IHN3aXRjaGluZyBvZiBDUFUgc3RhdGUgKEZQLCBhbHRpdmVjIG9yIFNQRSksCiAgKiBhbmQgdGhlIGN1cnJlbnQgdGFzayBoYXMgc29tZSBzdGF0ZSwgZGlzY2FyZCBpdC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGRpc2NhcmRfbGF6eV9jcHVfc3RhdGUodm9pZCkKK3ZvaWQgZGlzY2FyZF9sYXp5X2NwdV9zdGF0ZSh2b2lkKQogewotI2lmbmRlZiBDT05GSUdfU01QCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJaWYgKGxhc3RfdGFza191c2VkX21hdGggPT0gY3VycmVudCkKIAkJbGFzdF90YXNrX3VzZWRfbWF0aCA9IE5VTEw7CkBAIC0yMjAsOSArMjIwLDEwIEBACiAJCWxhc3RfdGFza191c2VkX3NwZSA9IE5VTEw7CiAjZW5kaWYKIAlwcmVlbXB0X2VuYWJsZSgpOwotI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIH0KKyNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKKyNpZmRlZiBDT05GSUdfUFBDX01FUkdFCQkvKiBYWFggZm9yIG5vdyAqLwogaW50IHNldF9kYWJyKHVuc2lnbmVkIGxvbmcgZGFicikKIHsKIAlpZiAocHBjX21kLnNldF9kYWJyKQpAQCAtMjMxLDYgKzIzMiw3IEBACiAJbXRzcHIoU1BSTl9EQUJSLCBkYWJyKTsKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQzY0CiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1X3VzYWdlLCBjcHVfdXNhZ2VfYXJyYXkpOwpAQCAtNDI0LDcgKzQyNiw3IEBACiAJaWYgKHRyYXAgPT0gMHgzMDAgfHwgdHJhcCA9PSAweDYwMCkKIAkJcHJpbnRrKCJEQVI6ICJSRUciLCBEU0lTUjogIlJFRyJcbiIsIHJlZ3MtPmRhciwgcmVncy0+ZHNpc3IpOwogCXByaW50aygiVEFTSyA9ICVwWyVkXSAnJXMnIFRIUkVBRDogJXAiLAotCSAgICAgICBjdXJyZW50LCBjdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnRocmVhZF9pbmZvKTsKKwkgICAgICAgY3VycmVudCwgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLCB0YXNrX3RocmVhZF9pbmZvKGN1cnJlbnQpKTsKIAogI2lmZGVmIENPTkZJR19TTVAKIAlwcmludGsoIiBDUFU6ICVkIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKQEAgLTUwMyw3ICs1MDUsNyBAQAogewogCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3MsICprcmVnczsKIAlleHRlcm4gdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpOwotCXVuc2lnbmVkIGxvbmcgc3AgPSAodW5zaWduZWQgbG9uZylwLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFOworCXVuc2lnbmVkIGxvbmcgc3AgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UocCkgKyBUSFJFQURfU0laRTsKIAogCUNIRUNLX0ZVTExfUkVHUyhyZWdzKTsKIAkvKiBDb3B5IHJlZ2lzdGVycyAqLwpAQCAtNTE2LDcgKzUxOCw3IEBACiAjaWZkZWYgQ09ORklHX1BQQzMyCiAJCWNoaWxkcmVncy0+Z3ByWzJdID0gKHVuc2lnbmVkIGxvbmcpIHA7CiAjZWxzZQotCQljbGVhcl90aV90aHJlYWRfZmxhZyhwLT50aHJlYWRfaW5mbywgVElGXzMyQklUKTsKKwkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl8zMkJJVCk7CiAjZW5kaWYKIAkJcC0+dGhyZWFkLnJlZ3MgPSBOVUxMOwkvKiBubyB1c2VyIHJlZ2lzdGVyIHN0YXRlICovCiAJfSBlbHNlIHsKQEAgLTU4OCwxMCArNTkwLDggQEAKIAkgKiBzZXQuICBEbyBpdCBub3cuCiAJICovCiAJaWYgKCFjdXJyZW50LT50aHJlYWQucmVncykgewotCQl1bnNpZ25lZCBsb25nIGNoaWxkcmVncyA9ICh1bnNpZ25lZCBsb25nKWN1cnJlbnQtPnRocmVhZF9pbmZvICsKLQkJCQkJCVRIUkVBRF9TSVpFOwotCQljaGlsZHJlZ3MgLT0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKTsKLQkJY3VycmVudC0+dGhyZWFkLnJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKiljaGlsZHJlZ3M7CisJCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19zdGFja19wYWdlKGN1cnJlbnQpICsgVEhSRUFEX1NJWkU7CisJCWN1cnJlbnQtPnRocmVhZC5yZWdzID0gcmVncyAtIDE7CiAJfQogCiAJbWVtc2V0KHJlZ3MtPmdwciwgMCwgc2l6ZW9mKHJlZ3MtPmdwcikpOwpAQCAtNzY3LDcgKzc2Nyw3IEBACiBzdGF0aWMgaW50IHZhbGlkYXRlX3NwKHVuc2lnbmVkIGxvbmcgc3AsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgbmJ5dGVzKQogewotCXVuc2lnbmVkIGxvbmcgc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXAtPnRocmVhZF9pbmZvOworCXVuc2lnbmVkIGxvbmcgc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKTsKIAogCWlmIChzcCA+PSBzdGFja19wYWdlICsgc2l6ZW9mKHN0cnVjdCB0aHJlYWRfc3RydWN0KQogCSAgICAmJiBzcCA8PSBzdGFja19wYWdlICsgVEhSRUFEX1NJWkUgLSBuYnl0ZXMpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCmluZGV4IDM0YWIwZGEuLmQ1MGM4ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCkBAIC0xMTAwLDE3ICsxMTAwLDM3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9yZXNlcnZlX21lbSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgYmFzZSwgc2l6ZTsKLQl1bnNpZ25lZCBsb25nICpyZXNlcnZlX21hcDsKKwl1NjQgYmFzZSwgc2l6ZTsKKwl1NjQgKnJlc2VydmVfbWFwOwogCi0JcmVzZXJ2ZV9tYXAgPSAodW5zaWduZWQgbG9uZyAqKSgoKHVuc2lnbmVkIGxvbmcpaW5pdGlhbF9ib290X3BhcmFtcykgKworCXJlc2VydmVfbWFwID0gKHU2NCAqKSgoKHVuc2lnbmVkIGxvbmcpaW5pdGlhbF9ib290X3BhcmFtcykgKwogCQkJCQlpbml0aWFsX2Jvb3RfcGFyYW1zLT5vZmZfbWVtX3Jzdm1hcCk7CisjaWZkZWYgQ09ORklHX1BQQzMyCisJLyogCisJICogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIG1pZ2h0IGJlIGJvb3RpbmcgZnJvbSBhbiBvbGQga2V4ZWMKKwkgKiBpbWFnZSB0aGF0IHNldHVwIHRoZSBtZW1fcnN2bWFwIGFzIHBhaXJzIG9mIDMyLWJpdCB2YWx1ZXMKKwkgKi8KKwlpZiAoKnJlc2VydmVfbWFwID4gMHhmZmZmZmZmZnVsbCkgeworCQl1MzIgYmFzZV8zMiwgc2l6ZV8zMjsKKwkJdTMyICpyZXNlcnZlX21hcF8zMiA9ICh1MzIgKilyZXNlcnZlX21hcDsKKworCQl3aGlsZSAoMSkgeworCQkJYmFzZV8zMiA9ICoocmVzZXJ2ZV9tYXBfMzIrKyk7CisJCQlzaXplXzMyID0gKihyZXNlcnZlX21hcF8zMisrKTsKKwkJCWlmIChzaXplXzMyID09IDApCisJCQkJYnJlYWs7CisJCQlEQkcoInJlc2VydmluZzogJWx4IC0+ICVseFxuIiwgYmFzZV8zMiwgc2l6ZV8zMik7CisJCQlsbWJfcmVzZXJ2ZShiYXNlXzMyLCBzaXplXzMyKTsKKwkJfQorCQlyZXR1cm47CisJfQorI2VuZGlmCiAJd2hpbGUgKDEpIHsKIAkJYmFzZSA9ICoocmVzZXJ2ZV9tYXArKyk7CiAJCXNpemUgPSAqKHJlc2VydmVfbWFwKyspOwogCQlpZiAoc2l6ZSA9PSAwKQogCQkJYnJlYWs7Ci0JCURCRygicmVzZXJ2aW5nOiAlbHggLT4gJWx4XG4iLCBiYXNlLCBzaXplKTsKKwkJREJHKCJyZXNlcnZpbmc6ICVsbHggLT4gJWxseFxuIiwgYmFzZSwgc2l6ZSk7CiAJCWxtYl9yZXNlcnZlKGJhc2UsIHNpemUpOwogCX0KIApAQCAtMTYwNyw2ICsxNjI3LDExIEBACiAJCWtmcmVlKHByb3AtPnZhbHVlKTsKIAkJa2ZyZWUocHJvcCk7CiAJCXByb3AgPSBuZXh0OworCisJCWlmICghcHJvcCkgeworCQkJcHJvcCA9IG5vZGUtPmRlYWRwcm9wczsKKwkJCW5vZGUtPmRlYWRwcm9wcyA9IE5VTEw7CisJCX0KIAl9CiAJa2ZyZWUobm9kZS0+aW50cnMpOwogCWtmcmVlKG5vZGUtPmZ1bGxfbmFtZSk7CkBAIC0xNzU0LDYgKzE3NzksMjMgQEAKIF9faW5pdGNhbGwocHJvbV9yZWNvbmZpZ19zZXR1cCk7CiAjZW5kaWYKIAorc3RydWN0IHByb3BlcnR5ICpvZl9maW5kX3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICBpbnQgKmxlbnApCit7CisJc3RydWN0IHByb3BlcnR5ICpwcDsKKworCXJlYWRfbG9jaygmZGV2dHJlZV9sb2NrKTsKKwlmb3IgKHBwID0gbnAtPnByb3BlcnRpZXM7IHBwICE9IDA7IHBwID0gcHAtPm5leHQpCisJCWlmIChzdHJjbXAocHAtPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCWlmIChsZW5wICE9IDApCisJCQkJKmxlbnAgPSBwcC0+bGVuZ3RoOworCQkJYnJlYWs7CisJCX0KKwlyZWFkX3VubG9jaygmZGV2dHJlZV9sb2NrKTsKKworCXJldHVybiBwcDsKK30KKwogLyoKICAqIEZpbmQgYSBwcm9wZXJ0eSB3aXRoIGEgZ2l2ZW4gbmFtZSBmb3IgYSBnaXZlbiBub2RlCiAgKiBhbmQgcmV0dXJuIHRoZSB2YWx1ZS4KQEAgLTE3NjEsMTUgKzE4MDMsOCBAQAogdW5zaWduZWQgY2hhciAqZ2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgaW50ICpsZW5wKQogewotCXN0cnVjdCBwcm9wZXJ0eSAqcHA7Ci0KLQlmb3IgKHBwID0gbnAtPnByb3BlcnRpZXM7IHBwICE9IDA7IHBwID0gcHAtPm5leHQpCi0JCWlmIChzdHJjbXAocHAtPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCWlmIChsZW5wICE9IDApCi0JCQkJKmxlbnAgPSBwcC0+bGVuZ3RoOwotCQkJcmV0dXJuIHBwLT52YWx1ZTsKLQkJfQotCXJldHVybiBOVUxMOworCXN0cnVjdCBwcm9wZXJ0eSAqcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLG5hbWUsbGVucCk7CisJcmV0dXJuIHBwID8gcHAtPnZhbHVlIDogTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0woZ2V0X3Byb3BlcnR5KTsKIApAQCAtMTgwMyw0ICsxODM4LDgyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBSZW1vdmUgYSBwcm9wZXJ0eSBmcm9tIGEgbm9kZS4gIE5vdGUgdGhhdCB3ZSBkb24ndCBhY3R1YWxseQorICogcmVtb3ZlIGl0LCBzaW5jZSB3ZSBoYXZlIGdpdmVuIG91dCB3aG8ta25vd3MtaG93LW1hbnkgcG9pbnRlcnMKKyAqIHRvIHRoZSBkYXRhIHVzaW5nIGdldC1wcm9wZXJ0eS4gIEluc3RlYWQgd2UganVzdCBtb3ZlIHRoZSBwcm9wZXJ0eQorICogdG8gdGhlICJkZWFkIHByb3BlcnRpZXMiIGxpc3QsIHNvIGl0IHdvbid0IGJlIGZvdW5kIGFueSBtb3JlLgorICovCitpbnQgcHJvbV9yZW1vdmVfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IHByb3BlcnR5ICpwcm9wKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqKm5leHQ7CisJaW50IGZvdW5kID0gMDsKIAorCXdyaXRlX2xvY2soJmRldnRyZWVfbG9jayk7CisJbmV4dCA9ICZucC0+cHJvcGVydGllczsKKwl3aGlsZSAoKm5leHQpIHsKKwkJaWYgKCpuZXh0ID09IHByb3ApIHsKKwkJCS8qIGZvdW5kIHRoZSBub2RlICovCisJCQkqbmV4dCA9IHByb3AtPm5leHQ7CisJCQlwcm9wLT5uZXh0ID0gbnAtPmRlYWRwcm9wczsKKwkJCW5wLT5kZWFkcHJvcHMgPSBwcm9wOworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJbmV4dCA9ICYoKm5leHQpLT5uZXh0OworCX0KKwl3cml0ZV91bmxvY2soJmRldnRyZWVfbG9jayk7CisKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gLUVOT0RFVjsKKworI2lmZGVmIENPTkZJR19QUk9DX0RFVklDRVRSRUUKKwkvKiB0cnkgdG8gcmVtb3ZlIHRoZSBwcm9jIG5vZGUgYXMgd2VsbCAqLworCWlmIChucC0+cGRlKQorCQlwcm9jX2RldmljZV90cmVlX3JlbW92ZV9wcm9wKG5wLT5wZGUsIHByb3ApOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0RFVklDRVRSRUUgKi8KKworCXJldHVybiAwOworfQorCisvKgorICogVXBkYXRlIGEgcHJvcGVydHkgaW4gYSBub2RlLiAgTm90ZSB0aGF0IHdlIGRvbid0IGFjdHVhbGx5CisgKiByZW1vdmUgaXQsIHNpbmNlIHdlIGhhdmUgZ2l2ZW4gb3V0IHdoby1rbm93cy1ob3ctbWFueSBwb2ludGVycworICogdG8gdGhlIGRhdGEgdXNpbmcgZ2V0LXByb3BlcnR5LiAgSW5zdGVhZCB3ZSBqdXN0IG1vdmUgdGhlIHByb3BlcnR5CisgKiB0byB0aGUgImRlYWQgcHJvcGVydGllcyIgbGlzdCwgYW5kIGFkZCB0aGUgbmV3IHByb3BlcnR5IHRvIHRoZQorICogcHJvcGVydHkgbGlzdAorICovCitpbnQgcHJvbV91cGRhdGVfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSBzdHJ1Y3QgcHJvcGVydHkgKm5ld3Byb3AsCisJCQkgc3RydWN0IHByb3BlcnR5ICpvbGRwcm9wKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqKm5leHQ7CisJaW50IGZvdW5kID0gMDsKKworCXdyaXRlX2xvY2soJmRldnRyZWVfbG9jayk7CisJbmV4dCA9ICZucC0+cHJvcGVydGllczsKKwl3aGlsZSAoKm5leHQpIHsKKwkJaWYgKCpuZXh0ID09IG9sZHByb3ApIHsKKwkJCS8qIGZvdW5kIHRoZSBub2RlICovCisJCQluZXdwcm9wLT5uZXh0ID0gb2xkcHJvcC0+bmV4dDsKKwkJCSpuZXh0ID0gbmV3cHJvcDsKKwkJCW9sZHByb3AtPm5leHQgPSBucC0+ZGVhZHByb3BzOworCQkJbnAtPmRlYWRwcm9wcyA9IG9sZHByb3A7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCQluZXh0ID0gJigqbmV4dCktPm5leHQ7CisJfQorCXdyaXRlX3VubG9jaygmZGV2dHJlZV9sb2NrKTsKKworCWlmICghZm91bmQpCisJCXJldHVybiAtRU5PREVWOworCisjaWZkZWYgQ09ORklHX1BST0NfREVWSUNFVFJFRQorCS8qIHRyeSB0byBhZGQgdG8gcHJvYyBhcyB3ZWxsIGlmIGl0IHdhcyBpbml0aWFsaXplZCAqLworCWlmIChucC0+cGRlKQorCQlwcm9jX2RldmljZV90cmVlX3VwZGF0ZV9wcm9wKG5wLT5wZGUsIG5ld3Byb3AsIG9sZHByb3ApOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0RFVklDRVRSRUUgKi8KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKaW5kZXggZTM4MWYyZi4uZDk2M2ExMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCkBAIC0xMzcsOCArMTM3LDggQEAKIH07CiAKIHN0cnVjdCBtZW1fbWFwX2VudHJ5IHsKLQl1bnNpZ25lZCBsb25nCWJhc2U7Ci0JdW5zaWduZWQgbG9uZwlzaXplOworCXU2NAliYXNlOworCXU2NAlzaXplOwogfTsKIAogdHlwZWRlZiB1MzIgY2VsbF90OwpAQCAtODk3LDkgKzg5Nyw5IEBACiAgKiBJZiBwcm9ibGVtcyBzZWVtIHRvIHNob3cgdXAsIGl0IHdvdWxkIGJlIGEgZ29vZCBzdGFydCB0byB0cmFjawogICogdGhlbSBkb3duLgogICovCi1zdGF0aWMgdm9pZCByZXNlcnZlX21lbSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyB2b2lkIHJlc2VydmVfbWVtKHU2NCBiYXNlLCB1NjQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHRvcCA9IGJhc2UgKyBzaXplOworCXU2NCB0b3AgPSBiYXNlICsgc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGNudCA9IFJFTE9DKG1lbV9yZXNlcnZlX2NudCk7CiAKIAlpZiAoc2l6ZSA9PSAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwppbmRleCAzMDlhZTFkLi5hODA5OWM4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwpAQCAtMTEzLDcgKzExMyw4IEBACiAKIHN0YXRpYyBpbnQgb2ZfYnVzX3BjaV9tYXRjaChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXJldHVybiAhc3RyY21wKG5wLT50eXBlLCAicGNpIik7CisJLyogInZjaSIgaXMgZm9yIHRoZSAvY2hhb3MgYnJpZGdlIG9uIDFzdC1nZW4gUENJIHBvd2VybWFjcyAqLworCXJldHVybiAhc3RyY21wKG5wLT50eXBlLCAicGNpIikgfHwgIXN0cmNtcChucC0+dHlwZSwgInZjaSIpOwogfQogCiBzdGF0aWMgdm9pZCBvZl9idXNfcGNpX2NvdW50X2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS1jb21tb24uaCBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oCmluZGV4IGIxYmFiYjcuLjVjY2JkYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oCkBAIC02Miw3ICs2Miw3IEBACiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrLT50aHJlYWQucmVnczsKIAlpZiAocmVncyAhPSBOVUxMKQogCQlyZWdzLT5tc3IgfD0gTVNSX1NFOwotCXNldF90aV90aHJlYWRfZmxhZyh0YXNrLT50aHJlYWRfaW5mbywgVElGX1NJTkdMRVNURVApOworCXNldF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRVNURVApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQpAQCAtNzAsNyArNzAsNyBAQAogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFzay0+dGhyZWFkLnJlZ3M7CiAJaWYgKHJlZ3MgIT0gTlVMTCkKIAkJcmVncy0+bXNyICY9IH5NU1JfU0U7Ci0JY2xlYXJfdGlfdGhyZWFkX2ZsYWcodGFzay0+dGhyZWFkX2luZm8sIFRJRl9TSU5HTEVTVEVQKTsKKwljbGVhcl90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRVNURVApOwogfQogCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKaW5kZXggNGI5Y2ZlNC4uN2ZlNGE1YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKQEAgLTM2LDYgKzM2LDExIEBACiAJLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQKIH07CiAKK3N0cnVjdCBydGFzX3N1c3BlbmRfbWVfZGF0YSB7CisJbG9uZyB3YWl0aW5nOworCXN0cnVjdCBydGFzX2FyZ3MgKmFyZ3M7Cit9OworCiBFWFBPUlRfU1lNQk9MKHJ0YXMpOwogCiBERUZJTkVfU1BJTkxPQ0socnRhc19kYXRhX2J1Zl9sb2NrKTsKQEAgLTU1Niw2ICs1NjEsODAgQEAKIAl9IHdoaWxlIChzdGF0dXMgPT0gUlRBU19CVVNZKTsKIH0KIAorc3RhdGljIGludCBpYm1fc3VzcGVuZF9tZV90b2tlbiA9IFJUQVNfVU5LTk9XTl9TRVJWSUNFOworI2lmZGVmIENPTkZJR19QUENfUFNFUklFUworc3RhdGljIHZvaWQgcnRhc19wZXJjcHVfc3VzcGVuZF9tZSh2b2lkICppbmZvKQoreworCWxvbmcgcmM7CisJbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnRhc19zdXNwZW5kX21lX2RhdGEgKmRhdGEgPQorCQkoc3RydWN0IHJ0YXNfc3VzcGVuZF9tZV9kYXRhICopaW5mbzsKKworCS8qCisJICogV2UgdXNlICJ3YWl0aW5nIiB0byBpbmRpY2F0ZSBvdXIgc3RhdGUuICBBcyBsb25nCisJICogYXMgaXQgaXMgPjAsIHdlIGFyZSBzdGlsbCB0cnlpbmcgdG8gYWxsIGpvaW4gdXAuCisJICogSWYgaXQgZ29lcyB0byAwLCB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBqb2luZWQgdXAgYW5kCisJICogb25lIHRocmVhZCBnb3QgSF9Db250aW51ZS4gIElmIGFueSBlcnJvciBoYXBwZW5zLAorCSAqIHdlIHNldCBpdCB0byA8MC4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZG8geworCQlyYyA9IHBscGFyX2hjYWxsX25vcmV0cyhIX0pPSU4pOworCQlzbXBfcm1iKCk7CisJfSB3aGlsZSAocmMgPT0gSF9TdWNjZXNzICYmIGRhdGEtPndhaXRpbmcgPiAwKTsKKwlpZiAocmMgPT0gSF9TdWNjZXNzKQorCQlnb3RvIG91dDsKKworCWlmIChyYyA9PSBIX0NvbnRpbnVlKSB7CisJCWRhdGEtPndhaXRpbmcgPSAwOworCQlydGFzX2NhbGwoaWJtX3N1c3BlbmRfbWVfdG9rZW4sIDAsIDEsCisJCQkgIGRhdGEtPmFyZ3MtPmFyZ3MpOworCX0gZWxzZSB7CisJCWRhdGEtPndhaXRpbmcgPSAtRUJVU1k7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3Igb24gSF9Kb2luIGh5cGVydmlzb3IgY2FsbFxuIik7CisJfQorCitvdXQ6CisJLyogYmVmb3JlIHdlIHJlc3RvcmUgaW50ZXJydXB0cywgbWFrZSBzdXJlIHdlIGRvbid0CisJICogZ2VuZXJhdGUgYSBzcHVyaW91cyBzb2Z0IGxvY2t1cCBlcnJvcnMKKwkgKi8KKwl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBydGFzX2libV9zdXNwZW5kX21lKHN0cnVjdCBydGFzX2FyZ3MgKmFyZ3MpCit7CisJaW50IGk7CisKKwlzdHJ1Y3QgcnRhc19zdXNwZW5kX21lX2RhdGEgZGF0YTsKKworCWRhdGEud2FpdGluZyA9IDE7CisJZGF0YS5hcmdzID0gYXJnczsKKworCS8qIENhbGwgZnVuY3Rpb24gb24gYWxsIENQVXMuICBPbmUgb2YgdXMgd2lsbCBtYWtlIHRoZQorCSAqIHJ0YXMgY2FsbAorCSAqLworCWlmIChvbl9lYWNoX2NwdShydGFzX3BlcmNwdV9zdXNwZW5kX21lLCAmZGF0YSwgMSwgMCkpCisJCWRhdGEud2FpdGluZyA9IC1FSU5WQUw7CisKKwlpZiAoZGF0YS53YWl0aW5nICE9IDApCisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgZG9pbmcgZ2xvYmFsIGpvaW5cbiIpOworCisJLyogUHJvZCBlYWNoIENQVS4gIFRoaXMgd29uJ3QgaHVydCwgYW5kIHdpbGwgd2FrZQorCSAqIGFueW9uZSB3ZSBzdWNjZXNzZnVsbHkgcHV0IHRvIHNsZWVwIHdpdGggSF9Kb2luCisJICovCisJZm9yX2VhY2hfY3B1KGkpCisJCXBscGFyX2hjYWxsX25vcmV0cyhIX1BST0QsIGkpOworCisJcmV0dXJuIGRhdGEud2FpdGluZzsKK30KKyNlbHNlIC8qIENPTkZJR19QUENfUFNFUklFUyAqLworc3RhdGljIGludCBydGFzX2libV9zdXNwZW5kX21lKHN0cnVjdCBydGFzX2FyZ3MgKmFyZ3MpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisjZW5kaWYKIAogYXNtbGlua2FnZSBpbnQgcHBjX3J0YXMoc3RydWN0IHJ0YXNfYXJncyBfX3VzZXIgKnVhcmdzKQogewpAQCAtNTYzLDYgKzY0Miw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAljaGFyICpidWZmX2NvcHksICplcnJidWYgPSBOVUxMOwogCWludCBuYXJnczsKKwlpbnQgcmM7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CkBAIC01ODEsNiArNjYxLDE3IEBACiAJCQkgICBuYXJncyAqIHNpemVvZihydGFzX2FyZ190KSkgIT0gMCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKKwlpZiAoYXJncy50b2tlbiA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBOZWVkIHRvIGhhbmRsZSBpYm0sc3VzcGVuZF9tZSBjYWxsIHNwZWNpYWxseSAqLworCWlmIChhcmdzLnRva2VuID09IGlibV9zdXNwZW5kX21lX3Rva2VuKSB7CisJCXJjID0gcnRhc19pYm1fc3VzcGVuZF9tZSgmYXJncyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwkJZ290byBjb3B5X3JldHVybjsKKwl9CisKIAlidWZmX2NvcHkgPSBnZXRfZXJyb3Jsb2dfYnVmZmVyKCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnRhcy5sb2NrLCBmbGFncyk7CkBAIC02MDQsNiArNjk1LDcgQEAKIAkJa2ZyZWUoYnVmZl9jb3B5KTsKIAl9CiAKKyBjb3B5X3JldHVybjoKIAkvKiBDb3B5IG91dCBhcmdzLiAqLwogCWlmIChjb3B5X3RvX3VzZXIodWFyZ3MtPmFyZ3MgKyBuYXJncywKIAkJCSBhcmdzLmFyZ3MgKyBuYXJncywKQEAgLTY3NSw4ICs3NjcsMTAgQEAKIAkgKiB0aGUgc3RvcC1zZWxmIHRva2VuIGlmIGFueQogCSAqLwogI2lmZGVmIENPTkZJR19QUEM2NAotCWlmIChfbWFjaGluZSA9PSBQTEFURk9STV9QU0VSSUVTX0xQQVIpCisJaWYgKF9tYWNoaW5lID09IFBMQVRGT1JNX1BTRVJJRVNfTFBBUikgewogCQlydGFzX3JlZ2lvbiA9IG1pbihsbWIucm1vX3NpemUsIFJUQVNfSU5TVEFOVElBVEVfTUFYKTsKKwkJaWJtX3N1c3BlbmRfbWVfdG9rZW4gPSBydGFzX3Rva2VuKCJpYm0sc3VzcGVuZC1tZSIpOworCX0KICNlbmRpZgogCXJ0YXNfcm1vX2J1ZiA9IGxtYl9hbGxvY19iYXNlKFJUQVNfUk1PQlVGX01BWCwgUEFHRV9TSVpFLCBydGFzX3JlZ2lvbik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCmluZGV4IGQ1YzUyZmEuLmJlMTIwNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwpAQCAtMTAwLDcgKzEwMCw4IEBACiB2b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICpjbWQpCiB7CiAJbWFjaGluZV9zaHV0ZG93bigpOwotCXBwY19tZC5yZXN0YXJ0KGNtZCk7CisJaWYgKHBwY19tZC5yZXN0YXJ0KQorCQlwcGNfbWQucmVzdGFydChjbWQpOwogI2lmZGVmIENPTkZJR19TTVAKIAlzbXBfc2VuZF9zdG9wKCk7CiAjZW5kaWYKQEAgLTExMiw3ICsxMTMsOCBAQAogdm9pZCBtYWNoaW5lX3Bvd2VyX29mZih2b2lkKQogewogCW1hY2hpbmVfc2h1dGRvd24oKTsKLQlwcGNfbWQucG93ZXJfb2ZmKCk7CisJaWYgKHBwY19tZC5wb3dlcl9vZmYpCisJCXBwY19tZC5wb3dlcl9vZmYoKTsKICNpZmRlZiBDT05GSUdfU01QCiAJc21wX3NlbmRfc3RvcCgpOwogI2VuZGlmCkBAIC0xMjksNyArMTMxLDggQEAKIHZvaWQgbWFjaGluZV9oYWx0KHZvaWQpCiB7CiAJbWFjaGluZV9zaHV0ZG93bigpOwotCXBwY19tZC5oYWx0KCk7CisJaWYgKHBwY19tZC5oYWx0KQorCQlwcGNfbWQuaGFsdCgpOwogI2lmZGVmIENPTkZJR19TTVAKIAlzbXBfc2VuZF9zdG9wKCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCmluZGV4IGQzZjBiNmQuLjE3N2JiYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYwpAQCAtNDk3LDYgKzQ5NywxNSBAQAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCisJLyoKKwkgKiBEbyB0aGlzIGJlZm9yZSB1cGRhdGluZyB0aGUgdGhyZWFkIHN0YXRlIGluCisJICogY3VycmVudC0+dGhyZWFkLmZwci92ci9ldnIuICBUaGF0IHdheSwgaWYgd2UgZ2V0IHByZWVtcHRlZAorCSAqIGFuZCBhbm90aGVyIHRhc2sgZ3JhYnMgdGhlIEZQVS9BbHRpdmVjL1NQRSwgaXQgd29uJ3QgYmUKKwkgKiB0ZW1wdGVkIHRvIHNhdmUgdGhlIGN1cnJlbnQgQ1BVIHN0YXRlIGludG8gdGhlIHRocmVhZF9zdHJ1Y3QKKwkgKiBhbmQgY29ycnVwdCB3aGF0IHdlIGFyZSB3cml0aW5nIHRoZXJlLgorCSAqLworCWRpc2NhcmRfbGF6eV9jcHVfc3RhdGUoKTsKKwogCS8qIGZvcmNlIHRoZSBwcm9jZXNzIHRvIHJlbG9hZCB0aGUgRlAgcmVnaXN0ZXJzIGZyb20KIAkgICBjdXJyZW50LT50aHJlYWQgd2hlbiBpdCBuZXh0IGRvZXMgRlAgaW5zdHJ1Y3Rpb25zICovCiAJcmVncy0+bXNyICY9IH4oTVNSX0ZQIHwgTVNSX0ZFMCB8IE1TUl9GRTEpOwpAQCAtNTM4LDE4ICs1NDcsNiBAQAogCQlyZXR1cm4gMTsKICNlbmRpZiAvKiBDT05GSUdfU1BFICovCiAKLSNpZm5kZWYgQ09ORklHX1NNUAotCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmIChsYXN0X3Rhc2tfdXNlZF9tYXRoID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX21hdGggPSBOVUxMOwotCWlmIChsYXN0X3Rhc2tfdXNlZF9hbHRpdmVjID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX2FsdGl2ZWMgPSBOVUxMOwotI2lmZGVmIENPTkZJR19TUEUKLQlpZiAobGFzdF90YXNrX3VzZWRfc3BlID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX3NwZSA9IE5VTEw7Ci0jZW5kaWYKLQlwcmVlbXB0X2VuYWJsZSgpOwotI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCmluZGV4IDU0NjJiZWYuLjdiOWQ5OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYwpAQCAtMjA3LDEwICsyMDcsMjAgQEAKIAogCWlmICghc2lnKQogCQlyZWdzLT5ncHJbMTNdID0gc2F2ZV9yMTM7Ci0JZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC5mcHIsICZzYy0+ZnBfcmVncywgRlBfUkVHU19TSVpFKTsKIAlpZiAoc2V0ICE9IE5VTEwpCiAJCWVyciB8PSAgX19nZXRfdXNlcihzZXQtPnNpZ1swXSwgJnNjLT5vbGRtYXNrKTsKIAorCS8qCisJICogRG8gdGhpcyBiZWZvcmUgdXBkYXRpbmcgdGhlIHRocmVhZCBzdGF0ZSBpbgorCSAqIGN1cnJlbnQtPnRocmVhZC5mcHIvdnIuICBUaGF0IHdheSwgaWYgd2UgZ2V0IHByZWVtcHRlZAorCSAqIGFuZCBhbm90aGVyIHRhc2sgZ3JhYnMgdGhlIEZQVS9BbHRpdmVjLCBpdCB3b24ndCBiZQorCSAqIHRlbXB0ZWQgdG8gc2F2ZSB0aGUgY3VycmVudCBDUFUgc3RhdGUgaW50byB0aGUgdGhyZWFkX3N0cnVjdAorCSAqIGFuZCBjb3JydXB0IHdoYXQgd2UgYXJlIHdyaXRpbmcgdGhlcmUuCisJICovCisJZGlzY2FyZF9sYXp5X2NwdV9zdGF0ZSgpOworCisJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC5mcHIsICZzYy0+ZnBfcmVncywgRlBfUkVHU19TSVpFKTsKKwogI2lmZGVmIENPTkZJR19BTFRJVkVDCiAJZXJyIHw9IF9fZ2V0X3VzZXIodl9yZWdzLCAmc2MtPnZfcmVncyk7CiAJZXJyIHw9IF9fZ2V0X3VzZXIobXNyLCAmc2MtPmdwX3JlZ3NbUFRfTVNSXSk7CkBAIC0yMjksMTQgKzIzOSw2IEBACiAJCWN1cnJlbnQtPnRocmVhZC52cnNhdmUgPSAwOwogI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCiAKLSNpZm5kZWYgQ09ORklHX1NNUAotCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmIChsYXN0X3Rhc2tfdXNlZF9tYXRoID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX21hdGggPSBOVUxMOwotCWlmIChsYXN0X3Rhc2tfdXNlZF9hbHRpdmVjID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX2FsdGl2ZWMgPSBOVUxMOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0jZW5kaWYKIAkvKiBGb3JjZSByZWxvYWQgb2YgRlAvVkVDICovCiAJcmVncy0+bXNyICY9IH4oTVNSX0ZQIHwgTVNSX0ZFMCB8IE1TUl9GRTEgfCBNU1JfVkVDKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKaW5kZXggZDM4MWVjOS4uYzg0NThjNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCkBAIC0zMzgsOCArMzM4LDggQEAKICNpZmRlZiBDT05GSUdfUFBDNjQKIAlwYWNhW2NwdV0uX19jdXJyZW50ID0gcDsKICNlbmRpZgotCWN1cnJlbnRfc2V0W2NwdV0gPSBwLT50aHJlYWRfaW5mbzsKLQlwLT50aHJlYWRfaW5mby0+Y3B1ID0gY3B1OworCWN1cnJlbnRfc2V0W2NwdV0gPSB0YXNrX3RocmVhZF9pbmZvKHApOworCXRhc2tfdGhyZWFkX2luZm8ocCktPmNwdSA9IGNwdTsKIH0KIAogdm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCkBAIC0zNzUsNyArMzc1LDcgQEAKICNpZmRlZiBDT05GSUdfUFBDNjQKIAlwYWNhW2Jvb3RfY3B1aWRdLl9fY3VycmVudCA9IGN1cnJlbnQ7CiAjZW5kaWYKLQljdXJyZW50X3NldFtib290X2NwdWlkXSA9IGN1cnJlbnQtPnRocmVhZF9pbmZvOworCWN1cnJlbnRfc2V0W2Jvb3RfY3B1aWRdID0gdGFza190aHJlYWRfaW5mbyhjdXJyZW50KTsKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwppbmRleCA1NmY1MGU5Li5jNGEyOTRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwpAQCAtNDMxLDcgKzQzMSw3IEBACiAJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcsIHJlZ3MpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JZ2V0X3BhY2EoKS0+bHBwYWNhLmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQgPSAwOworCWdldF9scHBhY2EoKS0+aW50X2R3b3JkLmZpZWxkcy5kZWNyX2ludCA9IDA7CiAjZW5kaWYKIAogCXdoaWxlICgodGlja3MgPSB0Yl90aWNrc19zaW5jZShwZXJfY3B1KGxhc3RfamlmZnksIGNwdSkpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKaW5kZXggMTNjNDE0OS4uMTNjNjU1YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCkBAIC03Niw3ICs3Niw3IEBACiAJc3RydWN0IHZpb19kZXYgKnZpb2RldiA9IHRvX3Zpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgdmlvX2RyaXZlciAqdmlvZHJ2ID0gdG9fdmlvX2RyaXZlcihkZXYtPmRyaXZlcik7CiAKLQlpZiAodmlvZHJ2LT5zaHV0ZG93bikKKwlpZiAoZGV2LT5kcml2ZXIgJiYgdmlvZHJ2LT5zaHV0ZG93bikKIAkJdmlvZHJ2LT5zaHV0ZG93bih2aW9kZXYpOwogfQogCkBAIC05MSw5ICs5MSw2IEBACiAKIAkvKiBmaWxsIGluICdzdHJ1Y3QgZHJpdmVyJyBmaWVsZHMgKi8KIAl2aW9kcnYtPmRyaXZlci5idXMgPSAmdmlvX2J1c190eXBlOwotCXZpb2Rydi0+ZHJpdmVyLnByb2JlID0gdmlvX2J1c19wcm9iZTsKLQl2aW9kcnYtPmRyaXZlci5yZW1vdmUgPSB2aW9fYnVzX3JlbW92ZTsKLQl2aW9kcnYtPmRyaXZlci5zaHV0ZG93biA9IHZpb19idXNfc2h1dGRvd247CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZ2aW9kcnYtPmRyaXZlcik7CiB9CkBAIC0yOTUsNCArMjkyLDcgQEAKIAkubmFtZSA9ICJ2aW8iLAogCS51ZXZlbnQgPSB2aW9faG90cGx1ZywKIAkubWF0Y2ggPSB2aW9fYnVzX21hdGNoLAorCS5wcm9iZSA9IHZpb19idXNfcHJvYmUsCisJLnJlbW92ZSA9IHZpb19idXNfcmVtb3ZlLAorCS5zaHV0ZG93biA9IHZpb19idXNfc2h1dGRvd24sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9sb2Nrcy5jIGIvYXJjaC9wb3dlcnBjL2xpYi9sb2Nrcy5jCmluZGV4IDM1YmQwM2MuLjgzNjJmYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvbG9ja3MuYworKysgYi9hcmNoL3Bvd2VycGMvbGliL2xvY2tzLmMKQEAgLTI4LDE1ICsyOCwxMyBAQAogdm9pZCBfX3NwaW5feWllbGQocmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJdW5zaWduZWQgaW50IGxvY2tfdmFsdWUsIGhvbGRlcl9jcHUsIHlpZWxkX2NvdW50OwotCXN0cnVjdCBwYWNhX3N0cnVjdCAqaG9sZGVyX3BhY2E7CiAKIAlsb2NrX3ZhbHVlID0gbG9jay0+c2xvY2s7CiAJaWYgKGxvY2tfdmFsdWUgPT0gMCkKIAkJcmV0dXJuOwogCWhvbGRlcl9jcHUgPSBsb2NrX3ZhbHVlICYgMHhmZmZmOwogCUJVR19PTihob2xkZXJfY3B1ID49IE5SX0NQVVMpOwotCWhvbGRlcl9wYWNhID0gJnBhY2FbaG9sZGVyX2NwdV07Ci0JeWllbGRfY291bnQgPSBob2xkZXJfcGFjYS0+bHBwYWNhLnlpZWxkX2NvdW50OworCXlpZWxkX2NvdW50ID0gbHBwYWNhW2hvbGRlcl9jcHVdLnlpZWxkX2NvdW50OwogCWlmICgoeWllbGRfY291bnQgJiAxKSA9PSAwKQogCQlyZXR1cm47CQkvKiB2aXJ0dWFsIGNwdSBpcyBjdXJyZW50bHkgcnVubmluZyAqLwogCXJtYigpOwpAQCAtNjAsMTUgKzU4LDEzIEBACiB7CiAJaW50IGxvY2tfdmFsdWU7CiAJdW5zaWduZWQgaW50IGhvbGRlcl9jcHUsIHlpZWxkX2NvdW50OwotCXN0cnVjdCBwYWNhX3N0cnVjdCAqaG9sZGVyX3BhY2E7CiAKIAlsb2NrX3ZhbHVlID0gcnctPmxvY2s7CiAJaWYgKGxvY2tfdmFsdWUgPj0gMCkKIAkJcmV0dXJuOwkJLyogbm8gd3JpdGUgbG9jayBhdCBwcmVzZW50ICovCiAJaG9sZGVyX2NwdSA9IGxvY2tfdmFsdWUgJiAweGZmZmY7CiAJQlVHX09OKGhvbGRlcl9jcHUgPj0gTlJfQ1BVUyk7Ci0JaG9sZGVyX3BhY2EgPSAmcGFjYVtob2xkZXJfY3B1XTsKLQl5aWVsZF9jb3VudCA9IGhvbGRlcl9wYWNhLT5scHBhY2EueWllbGRfY291bnQ7CisJeWllbGRfY291bnQgPSBscHBhY2FbaG9sZGVyX2NwdV0ueWllbGRfY291bnQ7CiAJaWYgKCh5aWVsZF9jb3VudCAmIDEpID09IDApCiAJCXJldHVybjsJCS8qIHZpcnR1YWwgY3B1IGlzIGN1cnJlbnRseSBydW5uaW5nICovCiAJcm1iKCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggNzE2MTVlYi4uY2MyNTM1YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYwpAQCAtMTQwLDE5ICsxNDAsMTkgQEAKIAogCXN3aXRjaCAoY3VyX2NwdV9zcGVjLT5vcHJvZmlsZV90eXBlKSB7CiAjaWZkZWYgQ09ORklHX1BQQzY0Ci0JCWNhc2UgUlM2NDoKKwkJY2FzZSBQUENfT1BST0ZJTEVfUlM2NDoKIAkJCW1vZGVsID0gJm9wX21vZGVsX3JzNjQ7CiAJCQlicmVhazsKLQkJY2FzZSBQT1dFUjQ6CisJCWNhc2UgUFBDX09QUk9GSUxFX1BPV0VSNDoKIAkJCW1vZGVsID0gJm9wX21vZGVsX3Bvd2VyNDsKIAkJCWJyZWFrOwogI2Vsc2UKLQkJY2FzZSBHNDoKKwkJY2FzZSBQUENfT1BST0ZJTEVfRzQ6CiAJCQltb2RlbCA9ICZvcF9tb2RlbF83NDUwOwogCQkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCi0JCWNhc2UgQk9PS0U6CisJCWNhc2UgUFBDX09QUk9GSUxFX0JPT0tFOgogCQkJbW9kZWwgPSAmb3BfbW9kZWxfZnNsX2Jvb2tlOwogCQkJYnJlYWs7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKaW5kZXggYjIwODEyZC4uNzY3NWU2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKQEAgLTcsNiArNyw3IEBACiAKIGNvbmZpZyBNUEM4MzR4X1NZUwogCWJvb2wgIkZyZWVzY2FsZSBNUEM4MzR4IFNZUyIKKwlzZWxlY3QgREVGQVVMVF9VSU1BR0UKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEMgODM0eCBTWVMgZXZhbHVhdGlvbiBib2FyZC4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDk4ZGQwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYworICoKKyAqIE1QQzgzNHggU1lTIGJvYXJkIHNwZWNpZmljIHJvdXRpbmVzCisgKgorICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYSA8Z2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9pcGljLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vbXBjODN4eC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxtbS9tbXVfZGVjbC5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorCisjaW5jbHVkZSAibXBjODN4eC5oIgorCisjaWZuZGVmIENPTkZJR19QQ0kKK3Vuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwordW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCitleHRlcm4gaW50IG1wYzgzeHhfcGNpMl9idXNubzsKKworc3RhdGljIGludAorbXBjODN4eF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIGNoYXIgaWRzZWwsIHVuc2lnbmVkIGNoYXIgcGluKQoreworCXN0YXRpYyBjaGFyIHBjaV9pcnFfdGFibGVbXVs0XSA9CisJICAgIC8qCisJICAgICAqICAgICAgUENJIElEU0VML0lOVFBJTi0+SU5UTElORQorCSAgICAgKiAgICAgICBBICAgICAgQiAgICAgIEMgICAgICBECisJICAgICAqLworCXsKKwkJe1BJUlFBLCBQSVJRQiwgUElSUUMsIFBJUlFEfSwJLyogaWRzZWwgMHgxMSAqLworCQl7UElSUUMsIFBJUlFELCBQSVJRQSwgUElSUUJ9LAkvKiBpZHNlbCAweDEyICovCisJCXtQSVJRRCwgUElSUUEsIFBJUlFCLCBQSVJRQ30sCS8qIGlkc2VsIDB4MTMgKi8KKwkJezAsIDAsIDAsIDB9LAorCQl7UElSUUEsIFBJUlFCLCBQSVJRQywgUElSUUR9LAkvKiBpZHNlbCAweDE1ICovCisJCXtQSVJRRCwgUElSUUEsIFBJUlFCLCBQSVJRQ30sCS8qIGlkc2VsIDB4MTYgKi8KKwkJe1BJUlFDLCBQSVJRRCwgUElSUUEsIFBJUlFCfSwJLyogaWRzZWwgMHgxNyAqLworCQl7UElSUUIsIFBJUlFDLCBQSVJRRCwgUElSUUF9LAkvKiBpZHNlbCAweDE4ICovCisJCXswLCAwLCAwLCAwfSwJCQkvKiBpZHNlbCAweDE5ICovCisJCXswLCAwLCAwLCAwfSwJCQkvKiBpZHNlbCAweDIwICovCisJfTsKKworCWNvbnN0IGxvbmcgbWluX2lkc2VsID0gMHgxMSwgbWF4X2lkc2VsID0gMHgyMCwgaXJxc19wZXJfc2xvdCA9IDQ7CisJcmV0dXJuIFBDSV9JUlFfVEFCTEVfTE9PS1VQOworfQorCitzdGF0aWMgaW50CittcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKK3sKKwlpZiAoYnVzID09IDAgJiYgUENJX1NMT1QoZGV2Zm4pID09IDApCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJaWYgKG1wYzgzeHhfcGNpMl9idXNubykKKwkJaWYgKGJ1cyA9PSAobXBjODN4eF9wY2kyX2J1c25vKSAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdAorbXBjODM0eF9zeXNfc2V0dXBfYXJjaCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoIm1wYzgzNHhfc3lzX3NldHVwX2FyY2goKSIsIDApOworCisJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7CisJaWYgKG5wICE9IDApIHsKKwkJdW5zaWduZWQgaW50ICpmcCA9IChpbnQgKikgZ2V0X3Byb3BlcnR5KG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJCWlmIChmcCAhPSAwKQorCQkJbG9vcHNfcGVyX2ppZmZ5ID0gKmZwIC8gSFo7CisJCWVsc2UKKwkJCWxvb3BzX3Blcl9qaWZmeSA9IDUwMDAwMDAwIC8gSFo7CisJCW9mX25vZGVfcHV0KG5wKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfUENJCisJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQorCQlhZGRfYnJpZGdlKG5wKTsKKworCXBwY19tZC5wY2lfc3dpenpsZSA9IGNvbW1vbl9zd2l6emxlOworCXBwY19tZC5wY2lfbWFwX2lycSA9IG1wYzgzeHhfbWFwX2lycTsKKwlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODN4eF9leGNsdWRlX2RldmljZTsKKyNlbmRpZgorCisjaWZkZWYgIENPTkZJR19ST09UX05GUworCQlST09UX0RFViA9IFJvb3RfTkZTOworI2Vsc2UKKwkJUk9PVF9ERVYgPSBSb290X0hEQTE7CisjZW5kaWYKK30KKwordm9pZCBfX2luaXQKK21wYzgzNHhfc3lzX2luaXRfSVJRKHZvaWQpCit7CisJdTggc2Vuc2VzWzhdID0geworCQkwLAkJCS8qIEVYVCAwICovCisJCUlSUV9TRU5TRV9MRVZFTCwJLyogRVhUIDEgKi8KKwkJSVJRX1NFTlNFX0xFVkVMLAkvKiBFWFQgMiAqLworCQkwLAkJCS8qIEVYVCAzICovCisjaWZkZWYgQ09ORklHX1BDSQorCQlJUlFfU0VOU0VfTEVWRUwsCS8qIEVYVCA0ICovCisJCUlSUV9TRU5TRV9MRVZFTCwJLyogRVhUIDUgKi8KKwkJSVJRX1NFTlNFX0xFVkVMLAkvKiBFWFQgNiAqLworCQlJUlFfU0VOU0VfTEVWRUwsCS8qIEVYVCA3ICovCisjZWxzZQorCQkwLAkJCS8qIEVYVCA0ICovCisJCTAsCQkJLyogRVhUIDUgKi8KKwkJMCwJCQkvKiBFWFQgNiAqLworCQkwLAkJCS8qIEVYVCA3ICovCisjZW5kaWYKKwl9OworCisJaXBpY19pbml0KGdldF9pbW1yYmFzZSgpICsgMHgwMDcwMCwgMCwgMCwgc2Vuc2VzLCA4KTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW50ZXJydXB0IG1hcHBpbmcgcHJpb3JpdGllcywKKwkgKiBpbiBjYXNlIHRoZSBib290IHJvbSBjaGFuZ2VkIHNvbWV0aGluZyBvbiB1cy4KKwkgKi8KKwlpcGljX3NldF9kZWZhdWx0X3ByaW9yaXR5KCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfTVBDKSAmJiBkZWZpbmVkKENPTkZJR19TRU5TT1JTX0RTMTM3NCkKK2V4dGVybiB1bG9uZwlkczEzNzRfZ2V0X3J0Y190aW1lKHZvaWQpOworZXh0ZXJuIGludAlkczEzNzRfc2V0X3J0Y190aW1lKHVsb25nKTsKKworc3RhdGljIGludCBfX2luaXQKK21wYzgzNHhfcnRjX2hvb2t1cCh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYwl0djsKKworCXBwY19tZC5nZXRfcnRjX3RpbWUgPSBkczEzNzRfZ2V0X3J0Y190aW1lOworCXBwY19tZC5zZXRfcnRjX3RpbWUgPSBkczEzNzRfc2V0X3J0Y190aW1lOworCisJdHYudHZfbnNlYyA9IDA7CisJdHYudHZfc2VjID0gKHBwY19tZC5nZXRfcnRjX3RpbWUpKCk7CisJZG9fc2V0dGltZW9mZGF5KCZ0dik7CisKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwobXBjODM0eF9ydGNfaG9va3VwKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorbXBjODN4eF9yZXN0YXJ0KGNoYXIgKmNtZCkKK3sKKyNkZWZpbmUgUlNUX09GRlNFVAkweDAwMDAwOTAwCisjZGVmaW5lIFJTVF9QUk9UX1JFRwkweDAwMDAwMDE4CisjZGVmaW5lIFJTVF9DVFJMX1JFRwkweDAwMDAwMDFjCisJX19iZTMyIF9faW9tZW0gKnJlZzsKKworCS8vIG1hcCByZXNldCByZWdpc3RlciBzcGFjZQorCXJlZyA9IGlvcmVtYXAoZ2V0X2ltbXJiYXNlKCkgKyAweDkwMCwgMHhmZik7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogZW5hYmxlIHNvZnR3YXJlIHJlc2V0ICJSU1RFIiAqLworCW91dF9iZTMyKHJlZyArIChSU1RfUFJPVF9SRUcgPj4gMiksIDB4NTI1MzU0NDUpOworCisJLyogc2V0IHNvZnR3YXJlIGhhcmQgcmVzZXQgKi8KKwlvdXRfYmUzMihyZWcgKyAoUlNUX0NUUkxfUkVHID4+IDIpLCAweDUyNTM1NDQ1KTsKKwlmb3IoOzspOworfQorCitzdGF0aWMgbG9uZyBfX2luaXQKK21wYzgzeHhfdGltZV9pbml0KHZvaWQpCit7CisjZGVmaW5lIFNQQ1JfT0ZGU0VUCTB4MDAwMDAxMTAKKyNkZWZpbmUgU1BDUl9UQkVOCTB4MDA0MDAwMDAKKwlfX2JlMzIgX19pb21lbSAqc3BjciA9IGlvcmVtYXAoZ2V0X2ltbXJiYXNlKCkgKyBTUENSX09GRlNFVCwgNCk7CisJX19iZTMyIHRtcDsKKworCXRtcCA9IGluX2JlMzIoc3Bjcik7CisJb3V0X2JlMzIoc3BjciwgdG1wfFNQQ1JfVEJFTik7CisKKwlpb3VubWFwKHNwY3IpOworCisJcmV0dXJuIDA7Cit9Cit2b2lkIF9faW5pdAorcGxhdGZvcm1faW5pdCh2b2lkKQoreworCS8qIHNldHVwIHRoZSBQb3dlclBDIG1vZHVsZSBzdHJ1Y3QgKi8KKwlwcGNfbWQuc2V0dXBfYXJjaCA9IG1wYzgzNHhfc3lzX3NldHVwX2FyY2g7CisKKwlwcGNfbWQuaW5pdF9JUlEgPSBtcGM4MzR4X3N5c19pbml0X0lSUTsKKwlwcGNfbWQuZ2V0X2lycSA9IGlwaWNfZ2V0X2lycTsKKworCXBwY19tZC5yZXN0YXJ0ID0gbXBjODN4eF9yZXN0YXJ0OworCisJcHBjX21kLnRpbWVfaW5pdCA9IG1wYzgzeHhfdGltZV9pbml0OworCXBwY19tZC5zZXRfcnRjX3RpbWUgPSBOVUxMOworCXBwY19tZC5nZXRfcnRjX3RpbWUgPSBOVUxMOworCXBwY19tZC5jYWxpYnJhdGVfZGVjciA9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3I7CisKKwlwcGNfbWQucHJvZ3Jlc3MgPSB1ZGJnX3Byb2dyZXNzOworCisJaWYgKHBwY19tZC5wcm9ncmVzcykKKwkJcHBjX21kLnByb2dyZXNzKCJtcGM4MzR4X3N5c19pbml0KCk6IGV4aXQiLCAwKTsKKworCXJldHVybjsKK30KKworCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Y2EzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogYXJjaC9wb3dlcnBwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5oCisgKgorICogTVBDODM0WCBTWVMgY29tbW9uIGJvYXJkIGRlZmluaXRpb25zCisgKgorICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYSA8Z2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fTUFDSF9NUEM4M1hYX1NZU19IX18KKyNkZWZpbmUgX19NQUNIX01QQzgzWFhfU1lTX0hfXworCisjZGVmaW5lIFBJUlFBCU1QQzgzeHhfSVJRX0VYVDQKKyNkZWZpbmUgUElSUUIJTVBDODN4eF9JUlFfRVhUNQorI2RlZmluZSBQSVJRQwlNUEM4M3h4X0lSUV9FWFQ2CisjZGVmaW5lIFBJUlFECU1QQzgzeHhfSVJRX0VYVDcKKworI2VuZGlmICAgICAgICAgICAgICAgIC8qIF9fTUFDSF9NUEM4M1hYX1NZU19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOWU2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX19NUEM4M1hYX0hfXworI2RlZmluZSBfX01QQzgzWFhfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKy8qCisgKiBEZWNsYXJhdGlvbiBmb3IgdGhlIHZhcmlvdXMgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZQorICogbXBjODN4eF8qIGZpbGVzLiBNb3N0bHkgZm9yIHVzZSBieSBtcGM4M3h4X3NldHVwCisgKi8KKworZXh0ZXJuIGludCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKKworI2VuZGlmIC8qIF9fTVBDODNYWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjljZGFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBGU0wgU29DIHNldHVwIGNvZGUKKyAqCisgKiBNYWludGFpbmVkIGJ5IEt1bWFyIEdhbGEgKHNlZSBNQUlOVEFJTkVSUyBmb3IgY29udGFjdCBpbmZvcm1hdGlvbikKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KKworI3VuZGVmIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoeC4uLikgcHJpbnRrKHgpCisjZWxzZQorI2RlZmluZSBEQkcoeC4uLikKKyNlbmRpZgorCitpbnQgbXBjODN4eF9wY2kyX2J1c25vOworCisjaWZkZWYgQ09ORklHX1BDSQoraW50IF9faW5pdCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQoreworCWludCBsZW47CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworCXN0cnVjdCByZXNvdXJjZSByc3JjOworCWludCAqYnVzX3JhbmdlOworCWludCBwcmltYXJ5ID0gMSwgaGFzX2FkZHJlc3MgPSAwOworCXBoeXNfYWRkcl90IGltbXIgPSBnZXRfaW1tcmJhc2UoKTsKKworCURCRygiQWRkaW5nIFBDSSBob3N0IGJyaWRnZSAlc1xuIiwgZGV2LT5mdWxsX25hbWUpOworCisJLyogRmV0Y2ggaG9zdCBicmlkZ2UgcmVnaXN0ZXJzIGFkZHJlc3MgKi8KKwloYXNfYWRkcmVzcyA9IChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRldiwgMCwgJnJzcmMpID09IDApOworCisJLyogR2V0IGJ1cyByYW5nZSBpZiBhbnkgKi8KKwlidXNfcmFuZ2UgPSAoaW50ICopIGdldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKKwlpZiAoYnVzX3JhbmdlID09IE5VTEwgfHwgbGVuIDwgMiAqIHNpemVvZihpbnQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGdldCBidXMtcmFuZ2UgZm9yICVzLCBhc3N1bWUiCisJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CisJfQorCisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCWlmICghaG9zZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaG9zZS0+YXJjaF9kYXRhID0gZGV2OworCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7CisKKwlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CisJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CisKKwkvKiBNUEM4M3h4IHN1cHBvcnRzIHVwIHRvIHR3byBob3N0IGNvbnRyb2xsZXJzIG9uZSBhdCAweDg1MDAgZnJvbSBpbW1yYmFyCisJICogdGhlIG90aGVyIGF0IDB4ODYwMCwgd2UgY29uc2lkZXIgdGhlIDB4ODUwMCB0aGUgcHJpbWFyeSBjb250cm9sbGVyCisJICovCisJLyogUENJIDEgKi8KKwlpZiAoKHJzcmMuc3RhcnQgJiAweGZmZmZmKSA9PSAweDg1MDApIHsKKwkJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIGltbXIgKyAweDgzMDAsIGltbXIgKyAweDgzMDQpOworCX0KKwkvKiBQQ0kgMiovCisJaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gMHg4NjAwKSB7CisJCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCBpbW1yICsgMHg4MzgwLCBpbW1yICsgMHg4Mzg0KTsKKwkJcHJpbWFyeSA9IDA7CisJCWhvc2UtPmJ1c19vZmZzZXQgPSBob3NlLT5maXJzdF9idXNubzsKKwkJbXBjODN4eF9wY2kyX2J1c25vID0gaG9zZS0+Zmlyc3RfYnVzbm87CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTVBDODN4eCBQQ0kgaG9zdCBicmlkZ2UgYXQgMHglMDhseC4gIgorCSAgICAgICAiRmlybXdhcmUgYnVzIG51bWJlcjogJWQtPiVkXG4iLAorCQlyc3JjLnN0YXJ0LCBob3NlLT5maXJzdF9idXNubywgaG9zZS0+bGFzdF9idXNubyk7CisKKwlEQkcoIiAtPkhvc2UgYXQgMHglcCwgY2ZnX2FkZHI9MHglcCxjZmdfZGF0YT0weCVwXG4iLAorCQlob3NlLCBob3NlLT5jZmdfYWRkciwgaG9zZS0+Y2ZnX2RhdGEpOworCisJLyogSW50ZXJwcmV0IHRoZSAicmFuZ2VzIiBwcm9wZXJ0eSAqLworCS8qIFRoaXMgYWxzbyBtYXBzIHRoZSBJL08gcmVnaW9uIGFuZCBzZXRzIGlzYV9pby9tZW1fYmFzZSAqLworCXBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMoaG9zZSwgZGV2LCBwcmltYXJ5KTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wZXJ2YXNpdmUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wZXJ2YXNpdmUuYwppbmRleCA4NTE1MjU0NC4uZTBlMDUxYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BlcnZhc2l2ZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wZXJ2YXNpdmUuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJfQogfQogCi1pbnQgY2JlX3N5c3RlbV9yZXNldF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IGNiZV9zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN3aXRjaCAocmVncy0+bXNyICYgU1JSMV9XQUtFTUFTSykgewogCWNhc2UgU1JSMV9XQUtFRUU6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCmluZGV4IDE4ZTI1ZTYuLmIzM2E0NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCkBAIC01Nyw3ICs1Nyw3IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotdm9pZCBjZWxsX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCitzdGF0aWMgdm9pZCBjZWxsX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpyb290OwogCWNvbnN0IGNoYXIgKm1vZGVsID0gIiI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc21wLmMKaW5kZXggZGU5NmVhZC4uYmRmNmM1ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zbXAuYwpAQCAtODYsNyArODYsNyBAQAogCXBjcHUgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGxjcHUpOwogCiAJLyogRml4dXAgYXRvbWljIGNvdW50OiBpdCBleGl0ZWQgaW5zaWRlIElSUSBoYW5kbGVyLiAqLwotCXBhY2FbbGNwdV0uX19jdXJyZW50LT50aHJlYWRfaW5mby0+cHJlZW1wdF9jb3VudAk9IDA7CisJdGFza190aHJlYWRfaW5mbyhwYWNhW2xjcHVdLl9fY3VycmVudCktPnByZWVtcHRfY291bnQJPSAwOwogCiAJLyoKIAkgKiBJZiB0aGUgUlRBUyBzdGFydC1jcHUgdG9rZW4gZG9lcyBub3QgZXhpc3QgdGhlbiBwcmVzdW1lIHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N5c2NhbGxzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3lzY2FsbHMuYwppbmRleCBkNTQ5YWE3Li5lNjU2NWE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3lzY2FsbHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3lzY2FsbHMuYwpAQCAtMjksNyArMjksOSBAQAogICogdmFsdWUgb2YgdGhlIHNwdV9zdGF0dXMgcmVnaXN0ZXIgYWZ0ZXIgdGhlIFNQVSBoYXMgc3RvcHBlZC4KICAqCiAgKi8KLWxvbmcgZG9fc3B1X3J1bihzdHJ1Y3QgZmlsZSAqZmlscCwgX191MzIgX191c2VyICp1bnBjLCBfX3UzMiBfX3VzZXIgKnVzdGF0dXMpCitzdGF0aWMgbG9uZyBkb19zcHVfcnVuKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJX191MzIgX191c2VyICp1bnBjLAorCQkJX191MzIgX191c2VyICp1c3RhdHVzKQogewogCWxvbmcgcmV0OwogCXN0cnVjdCBzcHVmc19pbm9kZV9pbmZvICppOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCmluZGV4IDgyYzQyOWQuLjAwYzUyZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKQEAgLTEzNSwxMiArMTM1LDEzIEBACiBoeWRyYV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAogCW5wID0gZmluZF9kZXZpY2VzKCJtYWMtaW8iKTsKLQlpZiAobnAgPT0gTlVMTCB8fCBucC0+bl9hZGRycyA9PSAwKQorCWlmIChucCA9PSBOVUxMIHx8IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKSkKIAkJcmV0dXJuIDA7Ci0JSHlkcmEgPSBpb3JlbWFwKG5wLT5hZGRyc1swXS5hZGRyZXNzLCBucC0+YWRkcnNbMF0uc2l6ZSk7Ci0JcHJpbnRrKCJIeWRyYSBNYWMgSS9PIGF0ICVseFxuIiwgbnAtPmFkZHJzWzBdLmFkZHJlc3MpOworCUh5ZHJhID0gaW9yZW1hcChyLnN0YXJ0LCByLmVuZC1yLnN0YXJ0KTsKKwlwcmludGsoIkh5ZHJhIE1hYyBJL08gYXQgJWx4XG4iLCByLnN0YXJ0KTsKIAlwcmludGsoIkh5ZHJhIEZlYXR1cmVfQ29udHJvbCB3YXMgJXgiLAogCSAgICAgICBpbl9sZTMyKCZIeWRyYS0+RmVhdHVyZV9Db250cm9sKSk7CiAJb3V0X2xlMzIoJkh5ZHJhLT5GZWF0dXJlX0NvbnRyb2wsIChIWURSQV9GQ19TQ0NfQ0VMTF9FTiB8CkBAIC0xNzcsMTggKzE3OCwyNCBAQAogewogCXUzMiBfX2lvbWVtICpyZWc7CiAJdTMyIHZhbDsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSBkZXYtPmFkZHJzWzBdLmFkZHJlc3M7CisJc3RydWN0IHJlc291cmNlIHI7CiAKLQlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgYWRkciArIDB4ZjgwMDAsIGFkZHIgKyAweGY4MDEwKTsKKwlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkZXYsIDAsICZyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIGFkZHJlc3MgZm9yIFB5dGhvbiBQQ0kgY29udHJvbGxlclxuIik7CisJCXJldHVybjsKKwl9CiAKIAkvKiBDbGVhciB0aGUgbWFnaWMgZ28tc2xvdyBiaXQgKi8KLQlyZWcgPSBpb3JlbWFwKGRldi0+YWRkcnNbMF0uYWRkcmVzcyArIDB4ZjYwMDAsIDB4NDApOworCXJlZyA9IGlvcmVtYXAoci5zdGFydCArIDB4ZjYwMDAsIDB4NDApOworCUJVR19PTighcmVnKTsgCiAJdmFsID0gaW5fYmUzMigmcmVnWzEyXSk7CiAJaWYgKHZhbCAmIFBSR19DTF9SRVNFVF9WQUxJRCkgewogCQlvdXRfYmUzMigmcmVnWzEyXSwgdmFsICYgflBSR19DTF9SRVNFVF9WQUxJRCk7CiAJCWluX2JlMzIoJnJlZ1sxMl0pOwogCX0KIAlpb3VubWFwKHJlZyk7CisKKwlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgci5zdGFydCArIDB4ZjgwMDAsIHIuc3RhcnQgKyAweGY4MDEwKTsKIH0KIAogLyogTWFydmVsbCBEaXNjb3ZlcnkgSUkgYmFzZWQgUGVnYXNvcyAyICovCkBAIC0yMTgsNyArMjI1LDcgQEAKIAljaGFyICptb2RlbCwgKm1hY2hpbmU7CiAJaW50IGlzX2xvbmd0cmFpbCA9IDAsIGlzX21vdCA9IDAsIGlzX3BlZ2Fzb3MgPSAwOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdCA9IGZpbmRfcGF0aF9kZXZpY2UoIi8iKTsKLQorCXN0cnVjdCByZXNvdXJjZSByOwogCS8qCiAJICogVGhlIFBDSSBob3N0IGJyaWRnZSBub2RlcyBvbiBzb21lIG1hY2hpbmVzIGRvbid0IGhhdmUKIAkgKiBwcm9wZXJ0aWVzIHRvIGFkZXF1YXRlbHkgaWRlbnRpZnkgdGhlbSwgc28gd2UgaGF2ZSB0bwpAQCAtMjM4LDcgKzI0NSw3IEBACiAJCQljb250aW51ZTsKIAkJKytpbmRleDsKIAkJLyogVGhlIEdHMiBicmlkZ2Ugb24gdGhlIExvbmdUcmFpbCBkb2Vzbid0IGhhdmUgYW4gYWRkcmVzcyAqLwotCQlpZiAoZGV2LT5uX2FkZHJzIDwgMSAmJiAhaXNfbG9uZ3RyYWlsKSB7CisJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRldiwgMCwgJnIpICYmICFpc19sb25ndHJhaWwpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IHVzZSAlczogbm8gYWRkcmVzc1xuIiwKIAkJCSAgICAgICBkZXYtPmZ1bGxfbmFtZSk7CiAJCQljb250aW51ZTsKQEAgLTI1NSw4ICsyNjIsOCBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJIGJ1c2VzICVkLi4lZCIsCiAJCQkgICAgICAgYnVzX3JhbmdlWzBdLCBidXNfcmFuZ2VbMV0pOwogCQlwcmludGsoIiBjb250cm9sbGVkIGJ5ICVzIiwgZGV2LT50eXBlKTsKLQkJaWYgKGRldi0+bl9hZGRycyA+IDApCi0JCQlwcmludGsoIiBhdCAlbHgiLCBkZXYtPmFkZHJzWzBdLmFkZHJlc3MpOworCQlpZiAoIWlzX2xvbmd0cmFpbCkKKwkJCXByaW50aygiIGF0ICVseCIsIHIuc3RhcnQpOwogCQlwcmludGsoIlxuIik7CiAKIAkJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYwppbmRleCA0ZWM4YmE3Li4yZGM4N2FhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYwpAQCAtMzUyLDkgKzM1MiwxMCBAQAogCQlvcGFkZHIgPSBvcHByb3BbbmEtMV07CS8qIGFzc3VtZSAzMi1iaXQgKi8KIAkJb3BsZW4gLz0gbmEgKiBzaXplb2YodW5zaWduZWQgaW50KTsKIAl9IGVsc2UgewotCQlpZiAobnAtPm5fYWRkcnMgPT0gMCkKKwkJc3RydWN0IHJlc291cmNlIHI7CisJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpCiAJCQlyZXR1cm47Ci0JCW9wYWRkciA9IG5wLT5hZGRyc1swXS5hZGRyZXNzOworCQlvcGFkZHIgPSByLnN0YXJ0OwogCQlvcGxlbiA9IDA7CiAJfQogCkBAIC0zNzcsNyArMzc4LDcgQEAKIAkgKi8KIAlpZiAob3BsZW4gPCBsZW4pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJJbnN1ZmZpY2llbnQgYWRkcmVzc2VzIGZvciBkaXN0cmlidXRlZCIKLQkJICAgICAgICIgT3BlblBJQyAoJWQgPCAlZClcbiIsIG5wLT5uX2FkZHJzLCBsZW4pOworCQkgICAgICAgIiBPcGVuUElDICglZCA8ICVkKVxuIiwgb3BsZW4sIGxlbik7CiAJCWxlbiA9IG9wbGVuOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC90aW1lLmMKaW5kZXggNzM3ZWU1ZC4uMzZhMGY5NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvdGltZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbnZyYW0uaD4KQEAgLTM3LDE0ICszOCwxNiBAQAogbG9uZyBfX2luaXQgY2hycF90aW1lX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJ0Y3M7CisJc3RydWN0IHJlc291cmNlIHI7CiAJaW50IGJhc2U7CiAKIAlydGNzID0gZmluZF9jb21wYXRpYmxlX2RldmljZXMoInJ0YyIsICJwbnBQTlAsYjAwIik7CiAJaWYgKHJ0Y3MgPT0gTlVMTCkKIAkJcnRjcyA9IGZpbmRfY29tcGF0aWJsZV9kZXZpY2VzKCJydGMiLCAiZHMxMzg1LXJ0YyIpOwotCWlmIChydGNzID09IE5VTEwgfHwgcnRjcy0+YWRkcnMgPT0gTlVMTCkKKwlpZiAocnRjcyA9PSBOVUxMIHx8IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UocnRjcywgMCwgJnIpKQogCQlyZXR1cm4gMDsKLQliYXNlID0gcnRjcy0+YWRkcnNbMF0uYWRkcmVzczsKKwkKKwliYXNlID0gci5zdGFydDsKIAludnJhbV9hczEgPSAwOwogCW52cmFtX2FzMCA9IGJhc2U7CiAJbnZyYW1fZGF0YSA9IGJhc2UgKyAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL01ha2VmaWxlCmluZGV4IDEyN2I0NjUuLmNlOGMwYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvTWFrZWZpbGUKQEAgLTEsOCArMSw4IEBACiBFWFRSQV9DRkxBR1MJKz0gLW1uby1taW5pbWFsLXRvYwogCiBvYmoteSArPSBodmxvZy5vIGh2bHBjb25maWcubyBscGFyZGF0YS5vIHNldHVwLm8gbWYubyBscGV2ZW50cy5vIFwKLQlodmNhbGwubyBwcm9jLm8gaHRhYi5vIGlvbW11Lm8gbWlzYy5vCi1vYmotJChDT05GSUdfUENJKSArPSBwY2kubyBpcnEubyB2cGRpbmZvLm8KKwlodmNhbGwubyBwcm9jLm8gaHRhYi5vIGlvbW11Lm8gbWlzYy5vIGlycS5vCitvYmotJChDT05GSUdfUENJKSArPSBwY2kubyB2cGRpbmZvLm8KIG9iai0kKENPTkZJR19JQk1WSU8pICs9IHZpby5vCiBvYmotJChDT05GSUdfU01QKSArPSBzbXAubwogb2JqLSQoQ09ORklHX1ZJT1BBVEgpICs9IHZpb3BhdGgubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYwppbmRleCAyYjU0ZWViLi5iZWEwYjcwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYwpAQCAtMzQsNiArMzQsOCBAQAogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAjaW5jbHVkZSA8YXNtL2lzZXJpZXMvaHZfY2FsbF94bS5oPgogCisjaW5jbHVkZSAiaW9tbXUuaCIKKwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaVNlcmllc19HbG9iYWxfRGV2aWNlX0xpc3Q7CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjU2NThmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBfUExBVEZPUk1TX0lTRVJJRVNfSU9NTVVfSAorI2RlZmluZSBfUExBVEZPUk1TX0lTRVJJRVNfSU9NTVVfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1ICBTdGVwaGVuIFJvdGh3ZWxsLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZToKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworc3RydWN0IGRldmljZV9ub2RlOworc3RydWN0IGlvbW11X3RhYmxlOworCisvKiBDcmVhdGVzIHRhYmxlIGZvciBhbiBpbmRpdmlkdWFsIGRldmljZSBub2RlICovCitleHRlcm4gdm9pZCBpb21tdV9kZXZub2RlX2luaXRfaVNlcmllcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKKworLyogR2V0IHRhYmxlIHBhcmFtZXRlcnMgZnJvbSBIViAqLworZXh0ZXJuIHZvaWQgaW9tbXVfdGFibGVfZ2V0cGFybXNfaVNlcmllcyh1bnNpZ25lZCBsb25nIGJ1c25vLAorCQl1bnNpZ25lZCBjaGFyIHNsb3RubywgdW5zaWduZWQgY2hhciB2aXJ0YnVzLAorCQlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCk7CisKKyNlbmRpZiAvKiBfUExBVEZPUk1TX0lTRVJJRVNfSU9NTVVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5jCmluZGV4IDQyZTk3OGUuLmJlM2ZiZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaXJxLmMKQEAgLTQ4LDYgKzQ4LDggQEAKIGV4dGVybiB2b2lkIGlTZXJpZXNfc21wX21lc3NhZ2VfcmVjdihzdHJ1Y3QgcHRfcmVncyAqKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BDSQorCiBlbnVtIHBjaV9ldmVudF90eXBlIHsKIAlwZV9idXNfY3JlYXRlZAkJPSAwLAkvKiBQSEIgaGFzIGJlZW4gY3JlYXRlZCAqLwogCXBlX2J1c19lcnJvcgkJPSAxLAkvKiBQSEIgaGFzIGZhaWxlZCAqLwpAQCAtMTQ3LDIwICsxNDksMTEgQEAKIHN0YXRpYyB2b2lkIHBjaV9ldmVudF9oYW5kbGVyKHN0cnVjdCBIdkxwRXZlbnQgKmV2ZW50LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpZiAoZXZlbnQgJiYgKGV2ZW50LT54VHlwZSA9PSBIdkxwRXZlbnRfVHlwZV9QY2lJbykpIHsKLQkJc3dpdGNoIChldmVudC0+eEZsYWdzLnhGdW5jdGlvbikgewotCQljYXNlIEh2THBFdmVudF9GdW5jdGlvbl9JbnQ6CisJCWlmIChodmxwZXZlbnRfaXNfaW50KGV2ZW50KSkKIAkJCWludF9yZWNlaXZlZCgoc3RydWN0IHBjaV9ldmVudCAqKWV2ZW50LCByZWdzKTsKLQkJCWJyZWFrOwotCQljYXNlIEh2THBFdmVudF9GdW5jdGlvbl9BY2s6CisJCWVsc2UKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJCSJwY2lfZXZlbnRfaGFuZGxlcjogdW5leHBlY3RlZCBhY2sgcmVjZWl2ZWRcbiIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCQkicGNpX2V2ZW50X2hhbmRsZXI6IHVuZXhwZWN0ZWQgZXZlbnQgZnVuY3Rpb24gJWRcbiIsCi0JCQkJKGludClldmVudC0+eEZsYWdzLnhGdW5jdGlvbik7Ci0JCQlicmVhazsKLQkJfQogCX0gZWxzZSBpZiAoZXZlbnQpCiAJCXByaW50ayhLRVJOX0VSUgogCQkJInBjaV9ldmVudF9oYW5kbGVyOiBVbnJlY29nbml6ZWQgUENJIGV2ZW50IHR5cGUgMHgleFxuIiwKQEAgLTMzNCwyNSArMzI3LDI2IEBACiAJcmV0dXJuIHZpcnRpcnE7CiB9CiAKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKIC8qCiAgKiBHZXQgdGhlIG5leHQgcGVuZGluZyBJUlEuCiAgKi8KIGludCBpU2VyaWVzX2dldF9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHBhY2Ffc3RydWN0ICpscGFjYTsKIAkvKiAtMiBtZWFucyBpZ25vcmUgdGhpcyBpbnRlcnJ1cHQgKi8KIAlpbnQgaXJxID0gLTI7CiAKLQlscGFjYSA9IGdldF9wYWNhKCk7CiAjaWZkZWYgQ09ORklHX1NNUAotCWlmIChscGFjYS0+bHBwYWNhLmludF9kd29yZC5maWVsZHMuaXBpX2NudCkgewotCQlscGFjYS0+bHBwYWNhLmludF9kd29yZC5maWVsZHMuaXBpX2NudCA9IDA7CisJaWYgKGdldF9scHBhY2EoKS0+aW50X2R3b3JkLmZpZWxkcy5pcGlfY250KSB7CisJCWdldF9scHBhY2EoKS0+aW50X2R3b3JkLmZpZWxkcy5pcGlfY250ID0gMDsKIAkJaVNlcmllc19zbXBfbWVzc2FnZV9yZWN2KHJlZ3MpOwogCX0KICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAJaWYgKGh2bHBldmVudF9pc19wZW5kaW5nKCkpCiAJCXByb2Nlc3NfaHZscGV2ZW50cyhyZWdzKTsKIAorI2lmZGVmIENPTkZJR19QQ0kKIAlpZiAobnVtX3BlbmRpbmdfaXJxcykgewogCQlzcGluX2xvY2soJnBlbmRpbmdfaXJxc19sb2NrKTsKIAkJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykgewpAQCAtMzY2LDYgKzM2MCw3IEBACiAJCWlmIChpcnEgPj0gTlJfSVJRUykKIAkJCWlycSA9IC0yOwogCX0KKyNlbmRpZgogCiAJcmV0dXJuIGlycTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9scGFyZGF0YS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwYXJkYXRhLmMKaW5kZXggZWE3MjM4NS4uNDM4ZTJkYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwYXJkYXRhLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwYXJkYXRhLmMKQEAgLTkzLDEwICs5Myw3IEBACiAJLnhQaXJFbnZpcm9uTW9kZSA9IDAsCQkvKiBQaXJhbmhhIHN0dWZmICovCiAJLnhQaXJDb25zb2xlTW9kZSA9IDAsCiAJLnhQaXJEYXNkTW9kZSA9IDAsCi0JLnhMcGFySW5zdGFsbGVkID0gMCwKLQkueFN5c1BhcnRpdGlvbmVkID0gMCwKLQkueEh3U3luY2VkVEJzID0gMCwKLQkueEludFByb2NVdGlsSG10ID0gMCwKKwkuZmxhZ3MgPSAwLAogCS54U3BWcGRGb3JtYXQgPSAwLAogCS54SW50UHJvY1JhdGlvID0gMCwKIAkueFBsaWNWcm1JbmRleCA9IDAsCQkvKiBWUk0gaW5kZXggb2YgUExJQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwZXZlbnRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBldmVudHMuYwppbmRleCBlOWZiOThiLi4wYjg4NTMwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBldmVudHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBldmVudHMuYwpAQCAtNTMsNyArNTMsNyBAQAogCXN0cnVjdCBIdkxwRXZlbnQgKiBldmVudDsKIAlldmVudCA9IChzdHJ1Y3QgSHZMcEV2ZW50ICopaHZscGV2ZW50X3F1ZXVlLnhTbGljQ3VyRXZlbnRQdHI7CiAKLQlpZiAoZXZlbnQtPnhGbGFncy54VmFsaWQpIHsKKwlpZiAoaHZscGV2ZW50X2lzX3ZhbGlkKGV2ZW50KSkgewogCQkvKiBybWIoKSBuZWVkZWQgb25seSBmb3Igd2Vha2x5IGNvbnNpc3RlbnQgbWFjaGluZXMgKHJlZ2F0dGEpICovCiAJCXJtYigpOwogCQkvKiBTZXQgcG9pbnRlciB0byBuZXh0IHBvdGVudGlhbCBldmVudCAqLwpAQCAtODQsNyArODQsNyBAQAogCiAJbmV4dF9ldmVudCA9IChzdHJ1Y3QgSHZMcEV2ZW50ICopaHZscGV2ZW50X3F1ZXVlLnhTbGljQ3VyRXZlbnRQdHI7CiAKLQlyZXR1cm4gbmV4dF9ldmVudC0+eEZsYWdzLnhWYWxpZCB8CisJcmV0dXJuIGh2bHBldmVudF9pc192YWxpZChuZXh0X2V2ZW50KSB8fAogCQlodmxwZXZlbnRfcXVldWUueFBsaWNPdmVyZmxvd0ludFBlbmRpbmc7CiB9CiAKQEAgLTEwMSwxOCArMTAxLDE4IEBACiAJc3dpdGNoIChleHRyYSkgewogCWNhc2UgMzoKIAkJdG1wID0gKHN0cnVjdCBIdkxwRXZlbnQqKSgoY2hhciopZXZlbnQgKyAzICogTHBFdmVudEFsaWduKTsKLQkJdG1wLT54RmxhZ3MueFZhbGlkID0gMDsKKwkJaHZscGV2ZW50X2ludmFsaWRhdGUodG1wKTsKIAljYXNlIDI6CiAJCXRtcCA9IChzdHJ1Y3QgSHZMcEV2ZW50KikoKGNoYXIqKWV2ZW50ICsgMiAqIExwRXZlbnRBbGlnbik7Ci0JCXRtcC0+eEZsYWdzLnhWYWxpZCA9IDA7CisJCWh2bHBldmVudF9pbnZhbGlkYXRlKHRtcCk7CiAJY2FzZSAxOgogCQl0bXAgPSAoc3RydWN0IEh2THBFdmVudCopKChjaGFyKilldmVudCArIDEgKiBMcEV2ZW50QWxpZ24pOwotCQl0bXAtPnhGbGFncy54VmFsaWQgPSAwOworCQlodmxwZXZlbnRfaW52YWxpZGF0ZSh0bXApOwogCX0KIAogCW1iKCk7CiAKLQlldmVudC0+eEZsYWdzLnhWYWxpZCA9IDA7CisJaHZscGV2ZW50X2ludmFsaWRhdGUoZXZlbnQpOwogfQogCiB2b2lkIHByb2Nlc3NfaHZscGV2ZW50cyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMKaW5kZXggNDllN2U0Yi4uYTQxZDhiNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMKQEAgLTI1MSwxMCArMjUxLDcgQEAKIAl9CiAJbWVtc2V0KGV2LCAwLCBzaXplb2Yoc3RydWN0IHBlbmRpbmdfZXZlbnQpKTsKIAloZXYgPSAmZXYtPmV2ZW50LmhwX2xwX2V2ZW50OwotCWhldi0+eEZsYWdzLnhWYWxpZCA9IDE7Ci0JaGV2LT54RmxhZ3MueEFja1R5cGUgPSBIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2s7Ci0JaGV2LT54RmxhZ3MueEFja0luZCA9IEh2THBFdmVudF9BY2tJbmRfRG9BY2s7Ci0JaGV2LT54RmxhZ3MueEZ1bmN0aW9uID0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludDsKKwloZXYtPmZsYWdzID0gSFZfTFBfRVZFTlRfVkFMSUQgfCBIVl9MUF9FVkVOVF9ET19BQ0sgfCBIVl9MUF9FVkVOVF9JTlQ7CiAJaGV2LT54VHlwZSA9IEh2THBFdmVudF9UeXBlX01hY2hpbmVGYWM7CiAJaGV2LT54U291cmNlTHAgPSBIdkxwQ29uZmlnX2dldExwSW5kZXgoKTsKIAloZXYtPnhUYXJnZXRMcCA9IHByaW1hcnlfbHA7CkBAIC01MTgsMTcgKzUxNSwxMCBAQAogc3RhdGljIHZvaWQgaHZfaGFuZGxlcihzdHJ1Y3QgSHZMcEV2ZW50ICpldmVudCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaWYgKChldmVudCAhPSBOVUxMKSAmJiAoZXZlbnQtPnhUeXBlID09IEh2THBFdmVudF9UeXBlX01hY2hpbmVGYWMpKSB7Ci0JCXN3aXRjaChldmVudC0+eEZsYWdzLnhGdW5jdGlvbikgewotCQljYXNlIEh2THBFdmVudF9GdW5jdGlvbl9BY2s6CisJCWlmIChodmxwZXZlbnRfaXNfYWNrKGV2ZW50KSkKIAkJCWhhbmRsZV9hY2soKHN0cnVjdCBpb19tZl9scF9ldmVudCAqKWV2ZW50KTsKLQkJCWJyZWFrOwotCQljYXNlIEh2THBFdmVudF9GdW5jdGlvbl9JbnQ6CisJCWVsc2UKIAkJCWhhbmRsZV9pbnQoKHN0cnVjdCBpb19tZl9scF9ldmVudCAqKWV2ZW50KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJtZi5jOiBub24gYWNrL2ludCBldmVudCByZWNlaXZlZFxuIik7Ci0JCQlicmVhazsKLQkJfQogCX0gZWxzZQogCQlwcmludGsoS0VSTl9FUlIgIm1mLmM6IGFsaWVuIGV2ZW50IHJlY2VpdmVkXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9taXNjLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWlzYy5TCmluZGV4IGRmZTdhYTEuLjc2NDFmYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9taXNjLlMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21pc2MuUwpAQCAtNDQsNyArNDQsOCBAQAogCS8qIENoZWNrIHBlbmRpbmcgaW50ZXJydXB0cyAqLwogCS8qICAgQSBkZWNyZW1lbnRlciwgSVBJIG9yIFBNQyBpbnRlcnJ1cHQgbWF5IGhhdmUgb2NjdXJyZWQKIAkgKiAgIHdoaWxlIHdlIHdlcmUgaW4gdGhlIGh5cGVydmlzb3IgKHdoaWNoIGVuYWJsZXMpICovCi0JbGQJcjQsUEFDQUxQUEFDQStMUFBBQ0FBTllJTlQocjEzKQorCWxkCXI0LFBBQ0FMUFBBQ0FQVFIocjEzKQorCWxkCXI0LExQUEFDQUFOWUlOVChyNCkKIAljbXBkaQlyNCwwCiAJYmVxbHIKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCmluZGV4IGRhZmM1MTguLmExOTgzM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlICJpcnEuaCIKICNpbmNsdWRlICJwY2kuaCIKICNpbmNsdWRlICJjYWxsX3BjaS5oIgorI2luY2x1ZGUgImlvbW11LmgiCiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGlvX3BhZ2VfbWFzazsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwppbmRleCBjNmJiZTVjLi4zZjg3OTAxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwpAQCAtNTM4LDcgKzUzOCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBpU2VyaWVzX3NldHVwX2FyY2godm9pZCkKIHsKLQlpZiAoZ2V0X3BhY2EoKS0+bHBwYWNhLnNoYXJlZF9wcm9jKSB7CisJaWYgKGdldF9scHBhY2EoKS0+c2hhcmVkX3Byb2MpIHsKIAkJcHBjX21kLmlkbGVfbG9vcCA9IGlzZXJpZXNfc2hhcmVkX2lkbGU7CiAJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIHNoYXJlZCBwcm9jZXNzb3IgaWRsZSBsb29wXG4iKTsKIAl9IGVsc2UgewpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAJICogVGhlIGRlY3JlbWVudGVyIHN0b3BzIGR1cmluZyB0aGUgeWllbGQuICBGb3JjZSBhIGZha2UgZGVjcmVtZW50ZXIKIAkgKiBoZXJlIGFuZCBsZXQgdGhlIHRpbWVyX2ludGVycnVwdCBjb2RlIHNvcnQgb3V0IHRoZSBhY3R1YWwgdGltZS4KIAkgKi8KLQlnZXRfcGFjYSgpLT5scHBhY2EuaW50X2R3b3JkLmZpZWxkcy5kZWNyX2ludCA9IDE7CisJZ2V0X2xwcGFjYSgpLT5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50ID0gMTsKIAlwcm9jZXNzX2lTZXJpZXNfZXZlbnRzKCk7CiB9CiAKQEAgLTg4Myw3ICs4ODMsNyBAQAogCXBmdF9zaXplWzFdID0gX19pbG9nMihIdkNhbGxIcHRfZ2V0SHB0UGFnZXMoKSAqIEhXX1BBR0VfU0laRSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmIChwYWNhW2ldLmxwcGFjYS5keW5fcHJvY19zdGF0dXMgPj0gMikKKwkJaWYgKGxwcGFjYVtpXS5keW5fcHJvY19zdGF0dXMgPj0gMikKIAkJCWNvbnRpbnVlOwogCiAJCXNucHJpbnRmKHAsIDMyIC0gKHAgLSBidWYpLCAiQCVkIiwgaSk7CkBAIC04OTEsNyArODkxLDcgQEAKIAogCQlkdF9wcm9wX3N0cihkdCwgImRldmljZV90eXBlIiwgImNwdSIpOwogCi0JCWluZGV4ID0gcGFjYVtpXS5scHBhY2EuZHluX2h2X3BoeXNfcHJvY19pbmRleDsKKwkJaW5kZXggPSBscHBhY2FbaV0uZHluX2h2X3BoeXNfcHJvY19pbmRleDsKIAkJZCA9ICZ4SW9IcmlQcm9jZXNzb3JWcGRbaW5kZXhdOwogCiAJCWR0X3Byb3BfdTMyKGR0LCAiaS1jYWNoZS1zaXplIiwgZC0+eEluc3RDYWNoZVNpemUgKiAxMDI0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zbXAuYwppbmRleCBmY2IwOTRlLi42ZjlkNDA3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NtcC5jCkBAIC05MSw3ICs5MSw3IEBACiAJQlVHX09OKChuciA8IDApIHx8IChuciA+PSBOUl9DUFVTKSk7CiAKIAkvKiBWZXJpZnkgdGhhdCBvdXIgcGFydGl0aW9uIGhhcyBhIHByb2Nlc3NvciBuciAqLwotCWlmIChwYWNhW25yXS5scHBhY2EuZHluX3Byb2Nfc3RhdHVzID49IDIpCisJaWYgKGxwcGFjYVtucl0uZHluX3Byb2Nfc3RhdHVzID49IDIpCiAJCXJldHVybjsKIAogCS8qIFRoZSBwcm9jZXNzb3IgaXMgY3VycmVudGx5IHNwaW5uaW5nLCB3YWl0aW5nCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvLmMKaW5kZXggMzg0MzYwZS4uYWQzNmFiMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpby5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW8uYwpAQCAtMjIsNiArMjIsOCBAQAogI2luY2x1ZGUgPGFzbS9pc2VyaWVzL2h2X2xwX2NvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS9pc2VyaWVzL2h2X2NhbGxfeG0uaD4KIAorI2luY2x1ZGUgImlvbW11LmgiCisKIHN0cnVjdCBkZXZpY2UgKmlTZXJpZXNfdmlvX2RldiA9ICZ2aW9fYnVzX2RldmljZS5kZXY7CiBFWFBPUlRfU1lNQk9MKGlTZXJpZXNfdmlvX2Rldik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW9wYXRoLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvcGF0aC5jCmluZGV4IDg0MjY3MjY5Li42MjJhMzAxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvcGF0aC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW9wYXRoLmMKQEAgLTI3MCw3ICsyNzAsNyBAQAogCSAqIEZpcnN0IHNlZSBpZiB0aGlzIGlzIGp1c3QgYSBub3JtYWwgbW9uaXRvciBtZXNzYWdlIGZyb20gdGhlCiAJICogb3RoZXIgcGFydGl0aW9uCiAJICovCi0JaWYgKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9JbnQpIHsKKwlpZiAoaHZscGV2ZW50X2lzX2ludChldmVudCkpIHsKIAkJcmVtb3RlTHAgPSBldmVudC0+eFNvdXJjZUxwOwogCQlpZiAoIXZpb3BhdGhTdGF0dXNbcmVtb3RlTHBdLmlzQWN0aXZlKQogCQkJc2VuZE1vbk1zZyhyZW1vdGVMcCk7CkBAIC0zMzEsMTMgKzMzMSwxMiBAQAogewogCWlmICghZXZlbnQpCiAJCXJldHVybjsKLQlpZiAoZXZlbnQtPnhGbGFncy54RnVuY3Rpb24gPT0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludCkgeworCWlmIChodmxwZXZlbnRfaXNfaW50KGV2ZW50KSkgewogCQlwcmludGsoVklPUEFUSF9LRVJOX1dBUk4KIAkJICAgICAgICJ1bmV4cGVjdGVkIGNvbmZpZyByZXF1ZXN0IGZyb20gcGFydGl0aW9uICVkIiwKIAkJICAgICAgIGV2ZW50LT54U291cmNlTHApOwogCi0JCWlmICgoZXZlbnQtPnhGbGFncy54RnVuY3Rpb24gPT0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludCkgJiYKLQkJICAgIChldmVudC0+eEZsYWdzLnhBY2tJbmQgPT0gSHZMcEV2ZW50X0Fja0luZF9Eb0FjaykpIHsKKwkJaWYgKGh2bHBldmVudF9uZWVkX2FjayhldmVudCkpIHsKIAkJCWV2ZW50LT54UmMgPSBIdkxwRXZlbnRfUmNfSW52YWxpZFN1YnR5cGU7CiAJCQlIdkNhbGxFdmVudF9hY2tMcEV2ZW50KGV2ZW50KTsKIAkJfQpAQCAtMzc3LDcgKzM3Niw3IEBACiAJaW50IHN1YnR5cGUgPSAoZXZlbnQtPnhTdWJ0eXBlICYgVklPTUFKT1JfU1VCVFlQRV9NQVNLKQogCQk+PiBWSU9NQUpPUl9TVUJUWVBFX1NISUZUOwogCi0JaWYgKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9JbnQpIHsKKwlpZiAoaHZscGV2ZW50X2lzX2ludChldmVudCkpIHsKIAkJcmVtb3RlTHAgPSBldmVudC0+eFNvdXJjZUxwOwogCQkvKgogCQkgKiBUaGUgaXNBY3RpdmUgaXMgY2hlY2tlZCBiZWNhdXNlIGlmIHRoZSBob3N0aW5nIHBhcnRpdGlvbgpAQCAtNDM2LDggKzQzNSw3IEBACiAJCSAgICAgICAidW5leHBlY3RlZCB2aXJ0dWFsIGlvIGV2ZW50IHN1YnR5cGUgJWQgZnJvbSBwYXJ0aXRpb24gJWRcbiIsCiAJCSAgICAgICBldmVudC0+eFN1YnR5cGUsIHJlbW90ZUxwKTsKIAkJLyogTm8gaGFuZGxlci4gIEFjayBpZiBuZWNlc3NhcnkgKi8KLQkJaWYgKChldmVudC0+eEZsYWdzLnhGdW5jdGlvbiA9PSBIdkxwRXZlbnRfRnVuY3Rpb25fSW50KSAmJgotCQkgICAgKGV2ZW50LT54RmxhZ3MueEFja0luZCA9PSBIdkxwRXZlbnRfQWNrSW5kX0RvQWNrKSkgeworCQlpZiAoaHZscGV2ZW50X2lzX2ludChldmVudCkgJiYgaHZscGV2ZW50X25lZWRfYWNrKGV2ZW50KSkgewogCQkJZXZlbnQtPnhSYyA9IEh2THBFdmVudF9SY19JbnZhbGlkU3VidHlwZTsKIAkJCUh2Q2FsbEV2ZW50X2Fja0xwRXZlbnQoZXZlbnQpOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKaW5kZXggM2IxYTlkNC4uODljNGMzNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2V0dXAuYwpAQCAtMjc4LDcgKzI3OCw3IEBACiB9CiAjZW5kaWYKIAotdm9pZCBfX2luaXQgcG1hY19zZXR1cF9hcmNoKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgcG1hY19zZXR1cF9hcmNoKHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpjcHUsICppYzsKIAlpbnQgKmZwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jCmluZGV4IDE3Y2VhN2YuLjgzNTc4MzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMKQEAgLTIwOCwxMCArMjA4LDExIEBACiB7CiAJd2hpbGUgKGRuKSB7CiAJCWlmIChQQ0lfRE4oZG4pKSB7Ci0JCQlQQ0lfRE4oZG4pLT5lZWhfbW9kZSB8PSBtb2RlX2ZsYWc7Ci0KIAkJCS8qIE1hcmsgdGhlIHBjaSBkZXZpY2UgZHJpdmVyIHRvbyAqLwogCQkJc3RydWN0IHBjaV9kZXYgKmRldiA9IFBDSV9ETihkbiktPnBjaWRldjsKKworCQkJUENJX0ROKGRuKS0+ZWVoX21vZGUgfD0gbW9kZV9mbGFnOworCiAJCQlpZiAoZGV2ICYmIGRldi0+ZHJpdmVyKQogCQkJCWRldi0+ZXJyb3Jfc3RhdGUgPSBwY2lfY2hhbm5lbF9pb19mcm96ZW47CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odmNzZXJ2ZXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odmNzZXJ2ZXIuYwppbmRleCA0ZDU4NDE3Li4yMmJmYjVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZjc2VydmVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Y3NlcnZlci5jCkBAIC00MCw3ICs0MCw3IEBACiAgKiBmdW5jdGlvbnMgYXJlbid0IHBlcmZvcm1hbmNlIHNlbnNpdGl2ZSwgc28gdGhpcyBjb252ZXJzaW9uIGlzbid0IGFuCiAgKiBpc3N1ZS4KICAqLwotaW50IGh2Y3NfY29udmVydChsb25nIHRvX2NvbnZlcnQpCitzdGF0aWMgaW50IGh2Y3NfY29udmVydChsb25nIHRvX2NvbnZlcnQpCiB7CiAJc3dpdGNoICh0b19jb252ZXJ0KSB7CiAJCWNhc2UgSF9TdWNjZXNzOgpAQCAtOTEsNyArOTEsNyBAQAogRVhQT1JUX1NZTUJPTChodmNzX2ZyZWVfcGFydG5lcl9pbmZvKTsKIAogLyogSGVscGVyIGZ1bmN0aW9uIGZvciBodmNzX2dldF9wYXJ0bmVyX2luZm8gKi8KLWludCBodmNzX25leHRfcGFydG5lcih1aW50MzJfdCB1bml0X2FkZHJlc3MsCitzdGF0aWMgaW50IGh2Y3NfbmV4dF9wYXJ0bmVyKHVpbnQzMl90IHVuaXRfYWRkcmVzcywKIAkJdW5zaWduZWQgbG9uZyBsYXN0X3BfcGFydGl0aW9uX0lELAogCQl1bnNpZ25lZCBsb25nIGxhc3RfcF91bml0X2FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgKnBpX2J1ZmYpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKaW5kZXggMTY5ZjkxNC4uNDhjZmJmYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKQEAgLTUxLDggKzUxLDYgQEAKIAogI2RlZmluZSBEQkcoZm10Li4uKQogCi1leHRlcm4gaW50IGlzX3B5dGhvbihzdHJ1Y3QgZGV2aWNlX25vZGUgKik7Ci0KIHN0YXRpYyB2b2lkIHRjZV9idWlsZF9wU2VyaWVzKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIGluZGV4LCAKIAkJCSAgICAgIGxvbmcgbnBhZ2VzLCB1bnNpZ25lZCBsb25nIHVhZGRyLCAKIAkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCmluZGV4IDFmZTQ0NWEuLjg5NTI1MjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwpAQCAtMjU0LDExICsyNTQsMTEgQEAKIHZvaWQgdnBhX2luaXQoaW50IGNwdSkKIHsKIAlpbnQgaHdjcHUgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7Ci0JdW5zaWduZWQgbG9uZyB2cGEgPSBfX3BhKCZwYWNhW2NwdV0ubHBwYWNhKTsKKwl1bnNpZ25lZCBsb25nIHZwYSA9IF9fcGEoJmxwcGFjYVtjcHVdKTsKIAlsb25nIHJldDsKIAogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BTFRJVkVDKSkKLQkJcGFjYVtjcHVdLmxwcGFjYS52bXhyZWdzX2luX3VzZSA9IDE7CisJCWxwcGFjYVtjcHVdLnZteHJlZ3NfaW5fdXNlID0gMTsKIAogCXJldCA9IHJlZ2lzdGVyX3ZwYShod2NwdSwgdnBhKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwppbmRleCBkODg2NDE2Li44NmNmYTZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwpAQCAtMzUwLDYgKzM1MCwxMDAgQEAKIAlyZXR1cm4gcnY7CiB9CiAKK3N0YXRpYyBjaGFyICpwYXJzZV9ub2RlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKm5wcCkKK3sKKwljaGFyICpoYW5kbGVfc3RyOworCXBoYW5kbGUgaGFuZGxlOworCSpucHAgPSBOVUxMOworCisJaGFuZGxlX3N0ciA9IGJ1ZjsKKworCWJ1ZiA9IHN0cmNocihidWYsICcgJyk7CisJaWYgKCFidWYpCisJCXJldHVybiBOVUxMOworCSpidWYgPSAnXDAnOworCWJ1ZisrOworCisJaGFuZGxlID0gc2ltcGxlX3N0cnRvdWwoaGFuZGxlX3N0ciwgTlVMTCwgMTApOworCisJKm5wcCA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKGhhbmRsZSk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBkb19hZGRfcHJvcGVydHkoY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBOVUxMOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdW5zaWduZWQgY2hhciAqdmFsdWU7CisJY2hhciAqbmFtZSwgKmVuZDsKKwlpbnQgbGVuZ3RoOworCWVuZCA9IGJ1ZiArIGJ1ZnNpemU7CisJYnVmID0gcGFyc2Vfbm9kZShidWYsIGJ1ZnNpemUsICZucCk7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChwYXJzZV9uZXh0X3Byb3BlcnR5KGJ1ZiwgZW5kLCAmbmFtZSwgJmxlbmd0aCwgJnZhbHVlKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByb3AgPSBuZXdfcHJvcGVydHkobmFtZSwgbGVuZ3RoLCB2YWx1ZSwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByb21fYWRkX3Byb3BlcnR5KG5wLCBwcm9wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX3JlbW92ZV9wcm9wZXJ0eShjaGFyICpidWYsIHNpemVfdCBidWZzaXplKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJY2hhciAqdG1wOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlidWYgPSBwYXJzZV9ub2RlKGJ1ZiwgYnVmc2l6ZSwgJm5wKTsKKworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJdG1wID0gc3RyY2hyKGJ1ZiwnICcpOworCWlmICh0bXApCisJCSp0bXAgPSAnXDAnOworCisJaWYgKHN0cmxlbihidWYpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsIGJ1ZiwgTlVMTCk7CisKKwlyZXR1cm4gcHJvbV9yZW1vdmVfcHJvcGVydHkobnAsIHByb3ApOworfQorCitzdGF0aWMgaW50IGRvX3VwZGF0ZV9wcm9wZXJ0eShjaGFyICpidWYsIHNpemVfdCBidWZzaXplKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdW5zaWduZWQgY2hhciAqdmFsdWU7CisJY2hhciAqbmFtZSwgKmVuZDsKKwlpbnQgbGVuZ3RoOworCXN0cnVjdCBwcm9wZXJ0eSAqbmV3cHJvcCwgKm9sZHByb3A7CisJYnVmID0gcGFyc2Vfbm9kZShidWYsIGJ1ZnNpemUsICZucCk7CisJZW5kID0gYnVmICsgYnVmc2l6ZTsKKworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHBhcnNlX25leHRfcHJvcGVydHkoYnVmLCBlbmQsICZuYW1lLCAmbGVuZ3RoLCAmdmFsdWUpID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbmV3cHJvcCA9IG5ld19wcm9wZXJ0eShuYW1lLCBsZW5ndGgsIHZhbHVlLCBOVUxMKTsKKwlpZiAoIW5ld3Byb3ApCisJCXJldHVybiAtRU5PTUVNOworCisJb2xkcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsIG5hbWUsTlVMTCk7CisJaWYgKCFvbGRwcm9wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBwcm9tX3VwZGF0ZV9wcm9wZXJ0eShucCwgbmV3cHJvcCwgb2xkcHJvcCk7Cit9CisKIC8qKgogICogb2ZkdF93cml0ZSAtIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiB0aGUgT3BlbiBGaXJtd2FyZSBkZXZpY2UgdHJlZQogICoKQEAgLTM5Miw2ICs0ODYsMTIgQEAKIAkJcnYgPSBkb19hZGRfbm9kZSh0bXAsIGNvdW50IC0gKHRtcCAtIGtidWYpKTsKIAllbHNlIGlmICghc3RyY21wKGtidWYsICJyZW1vdmVfbm9kZSIpKQogCQlydiA9IGRvX3JlbW92ZV9ub2RlKHRtcCk7CisJZWxzZSBpZiAoIXN0cmNtcChrYnVmLCAiYWRkX3Byb3BlcnR5IikpCisJCXJ2ID0gZG9fYWRkX3Byb3BlcnR5KHRtcCwgY291bnQgLSAodG1wIC0ga2J1ZikpOworCWVsc2UgaWYgKCFzdHJjbXAoa2J1ZiwgInJlbW92ZV9wcm9wZXJ0eSIpKQorCQlydiA9IGRvX3JlbW92ZV9wcm9wZXJ0eSh0bXAsIGNvdW50IC0gKHRtcCAtIGtidWYpKTsKKwllbHNlIGlmICghc3RyY21wKGtidWYsICJ1cGRhdGVfcHJvcGVydHkiKSkKKwkJcnYgPSBkb191cGRhdGVfcHJvcGVydHkodG1wLCBjb3VudCAtICh0bXAgLSBrYnVmKSk7CiAJZWxzZQogCQlydiA9IC1FSU5WQUw7CiBvdXQ6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2NhbmxvZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NjYW5sb2cuYwppbmRleCAyZWRjOTQ3Li41MDY0MzQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2NhbmxvZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zY2FubG9nLmMKQEAgLTE5Miw3ICsxOTIsNyBAQAogCS5yZWxlYXNlCT0gc2NhbmxvZ19yZWxlYXNlLAogfTsKIAotaW50IF9faW5pdCBzY2FubG9nX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHNjYW5sb2dfaW5pdCh2b2lkKQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OwogCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2V4aXQgc2NhbmxvZ19jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgc2NhbmxvZ19jbGVhbnVwKHZvaWQpCiB7CiAJaWYgKHByb2NfcHBjNjRfc2Nhbl9sb2dfZHVtcCkgewogCQlrZnJlZShwcm9jX3BwYzY0X3NjYW5fbG9nX2R1bXAtPmRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwppbmRleCA4OTAzY2Y2Li5kYTZjZWJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwpAQCAtODYsNyArODYsNyBAQAogCiBzdHJ1Y3QgbXBpYyAqcFNlcmllc19tcGljOwogCi12b2lkIHBTZXJpZXNfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3N0YXRpYyB2b2lkIHBTZXJpZXNfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Q7CiAJY29uc3QgY2hhciAqbW9kZWwgPSAiIjsKQEAgLTE5MCw3ICsxOTAsNyBAQAogCiAJLyogaW5zdHJ1Y3QgaHlwZXJ2aXNvciB0byBtYWludGFpbiBQTUNzICovCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfU1BMUEFSKSkKLQkJZ2V0X3BhY2EoKS0+bHBwYWNhLnBtY3JlZ3NfaW5fdXNlID0gMTsKKwkJZ2V0X2xwcGFjYSgpLT5wbWNyZWdzX2luX3VzZSA9IDE7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBwU2VyaWVzX3NldHVwX2FyY2godm9pZCkKQEAgLTIzNCw3ICsyMzQsNyBAQAogCS8qIENob29zZSBhbiBpZGxlIGxvb3AgKi8KIAlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9TUExQQVIpKSB7CiAJCXZwYV9pbml0KGJvb3RfY3B1aWQpOwotCQlpZiAoZ2V0X3BhY2EoKS0+bHBwYWNhLnNoYXJlZF9wcm9jKSB7CisJCWlmIChnZXRfbHBwYWNhKCktPnNoYXJlZF9wcm9jKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBzaGFyZWQgcHJvY2Vzc29yIGlkbGUgbG9vcFxuIik7CiAJCQlwcGNfbWQuaWRsZV9sb29wID0gcHNlcmllc19zaGFyZWRfaWRsZTsKIAkJfSBlbHNlIHsKQEAgLTQ0NCwxMCArNDQ0LDEwIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWRpY2F0ZWRfaWRsZV9zbGVlcCh1bnNpZ25lZCBpbnQgY3B1KQogewotCXN0cnVjdCBwYWNhX3N0cnVjdCAqcHBhY2EgPSAmcGFjYVtjcHUgXiAxXTsKKwlzdHJ1Y3QgbHBwYWNhICpwbHBwYWNhID0gJmxwcGFjYVtjcHUgXiAxXTsKIAogCS8qIE9ubHkgc2xlZXAgaWYgdGhlIG90aGVyIHRocmVhZCBpcyBub3QgaWRsZSAqLwotCWlmICghKHBwYWNhLT5scHBhY2EuaWRsZSkpIHsKKwlpZiAoIShwbHBwYWNhLT5pZGxlKSkgewogCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCiAJCS8qCkBAIC00ODAsNyArNDgwLDYgQEAKIAogc3RhdGljIHZvaWQgcHNlcmllc19kZWRpY2F0ZWRfaWRsZSh2b2lkKQogeyAKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhID0gZ2V0X3BhY2EoKTsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfc25vb3plOwogCXVuc2lnbmVkIGxvbmcgKnNtdF9zbm9vemVfZGVsYXkgPSAmX19nZXRfY3B1X3ZhcihzbXRfc25vb3plX2RlbGF5KTsKQEAgLTQ5MSw3ICs0OTAsNyBAQAogCQkgKiBJbmRpY2F0ZSB0byB0aGUgSFYgdGhhdCB3ZSBhcmUgaWRsZS4gTm93IHdvdWxkIGJlCiAJCSAqIGEgZ29vZCB0aW1lIHRvIGZpbmQgb3RoZXIgd29yayB0byBkaXNwYXRjaC4KIAkJICovCi0JCWxwYWNhLT5scHBhY2EuaWRsZSA9IDE7CisJCWdldF9scHBhY2EoKS0+aWRsZSA9IDE7CiAKIAkJaWYgKCFuZWVkX3Jlc2NoZWQoKSkgewogCQkJc3RhcnRfc25vb3plID0gZ2V0X3RiKCkgKwpAQCAtNTE4LDcgKzUxNyw3IEBACiAJCQlITVRfbWVkaXVtKCk7CiAJCX0KIAotCQlscGFjYS0+bHBwYWNhLmlkbGUgPSAwOworCQlnZXRfbHBwYWNhKCktPmlkbGUgPSAwOwogCQlwcGM2NF9ydW5sYXRjaF9vbigpOwogCiAJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKQEAgLTUzMiw3ICs1MzEsNiBAQAogCiBzdGF0aWMgdm9pZCBwc2VyaWVzX3NoYXJlZF9pZGxlKHZvaWQpCiB7Ci0Jc3RydWN0IHBhY2Ffc3RydWN0ICpscGFjYSA9IGdldF9wYWNhKCk7CiAJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCXdoaWxlICgxKSB7CkBAIC01NDAsNyArNTM4LDcgQEAKIAkJICogSW5kaWNhdGUgdG8gdGhlIEhWIHRoYXQgd2UgYXJlIGlkbGUuIE5vdyB3b3VsZCBiZQogCQkgKiBhIGdvb2QgdGltZSB0byBmaW5kIG90aGVyIHdvcmsgdG8gZGlzcGF0Y2guCiAJCSAqLwotCQlscGFjYS0+bHBwYWNhLmlkbGUgPSAxOworCQlnZXRfbHBwYWNhKCktPmlkbGUgPSAxOwogCiAJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpIHsKIAkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CkBAIC01NjQsNyArNTYyLDcgQEAKIAkJCUhNVF9tZWRpdW0oKTsKIAkJfQogCi0JCWxwYWNhLT5scHBhY2EuaWRsZSA9IDA7CisJCWdldF9scHBhY2EoKS0+aWRsZSA9IDA7CiAJCXBwYzY0X3J1bmxhdGNoX29uKCk7CiAKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwpAQCAtNTg4LDcgKzU4Niw3IEBACiB7CiAJLyogRG9uJ3QgcmlzayBhIGh5cGVydmlzb3IgY2FsbCBpZiB3ZSdyZSBjcmFzaGluZyAqLwogCWlmICghY3Jhc2hfc2h1dGRvd24pIHsKLQkJdW5zaWduZWQgbG9uZyB2cGEgPSBfX3BhKCZnZXRfcGFjYSgpLT5scHBhY2EpOworCQl1bnNpZ25lZCBsb25nIHZwYSA9IF9fcGEoZ2V0X2xwcGFjYSgpKTsKIAogCQlpZiAodW5yZWdpc3Rlcl92cGEoaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCksIHZwYSkpIHsKIAkJCXByaW50aygiVlBBIGRlcmVnaXN0cmF0aW9uIG9mIGNwdSAldSAoaHdfY3B1X2lkICVkKSAiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMKaW5kZXggMjUxODFjNS4uOGU2YjFlZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zbXAuYwpAQCAtOTMsNyArOTMsNyBAQAogCXJldHVybiBjcHVfc3RhdHVzOwogfQogCi1pbnQgcFNlcmllc19jcHVfZGlzYWJsZSh2b2lkKQorc3RhdGljIGludCBwU2VyaWVzX2NwdV9kaXNhYmxlKHZvaWQpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIApAQCAtMTA5LDcgKzEwOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcFNlcmllc19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgdm9pZCBwU2VyaWVzX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgdHJpZXM7CiAJaW50IGNwdV9zdGF0dXM7CkBAIC0yODIsNyArMjgyLDcgQEAKIAlwY3B1ID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChsY3B1KTsKIAogCS8qIEZpeHVwIGF0b21pYyBjb3VudDogaXQgZXhpdGVkIGluc2lkZSBJUlEgaGFuZGxlci4gKi8KLQlwYWNhW2xjcHVdLl9fY3VycmVudC0+dGhyZWFkX2luZm8tPnByZWVtcHRfY291bnQJPSAwOworCXRhc2tfdGhyZWFkX2luZm8ocGFjYVtsY3B1XS5fX2N1cnJlbnQpLT5wcmVlbXB0X2NvdW50CT0gMDsKIAogCS8qIAogCSAqIElmIHRoZSBSVEFTIHN0YXJ0LWNwdSB0b2tlbiBkb2VzIG5vdCBleGlzdCB0aGVuIHByZXN1bWUgdGhlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYwppbmRleCAwYzBjZmEzLi5mZDgyM2M3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKQEAgLTM4MSw3ICszODEsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCi1pcnFyZXR1cm5fdCB4aWNzX2lwaV9hY3Rpb24oaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCB4aWNzX2lwaV9hY3Rpb24oaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQppbmRleCAwYWU4NDEzLi40YzJiMzU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKQEAgLTcsMyArNyw0IEBACiBvYmotJChDT05GSUdfVTNfREFSVCkJCSs9IGRhcnRfaW9tbXUubwogb2JqLSQoQ09ORklHX01NSU9fTlZSQU0pCSs9IG1taW9fbnZyYW0ubwogb2JqLSQoQ09ORklHX1BQQ184M3h4KQkJKz0gaXBpYy5vCitvYmotJChDT05GSUdfRlNMX1NPQykJCSs9IGZzbF9zb2MubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYwppbmRleCBlMDBiNDZiLi45NzdkZTlkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYwpAQCAtMTM5LDcgKzEzOSw2IEBACiAKIAkJKihkcCsrKSA9IERBUlRNQVBfVkFMSUQgfCAocnBuICYgREFSVE1BUF9SUE5NQVNLKTsKIAotCQlycG4rKzsKIAkJdWFkZHIgKz0gREFSVF9QQUdFX1NJWkU7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NGM5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIEZTTCBTb0Mgc2V0dXAgY29kZQorICoKKyAqIE1haW50YWluZWQgYnkgS3VtYXIgR2FsYSAoc2VlIE1BSU5UQUlORVJTIGZvciBjb250YWN0IGluZm9ybWF0aW9uKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+CisKK3N0YXRpYyBwaHlzX2FkZHJfdCBpbW1yYmFzZSA9IC0xOworCitwaHlzX2FkZHJfdCBnZXRfaW1tcmJhc2Uodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnNvYzsKKworCWlmIChpbW1yYmFzZSAhPSAtMSkKKwkJcmV0dXJuIGltbXJiYXNlOworCisJc29jID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInNvYyIpOworCWlmIChzb2MgIT0gMCkgeworCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwkJdm9pZCAqcHJvcCA9IGdldF9wcm9wZXJ0eShzb2MsICJyZWciLCAmc2l6ZSk7CisJCWltbXJiYXNlID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3Moc29jLCBwcm9wKTsKKwkJb2Zfbm9kZV9wdXQoc29jKTsKKwl9OworCisJcmV0dXJuIGltbXJiYXNlOworfQorRVhQT1JUX1NZTUJPTChnZXRfaW1tcmJhc2UpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGdmYXJfdHhfaW50ciA9ICJ0eCI7CitzdGF0aWMgY29uc3QgY2hhciAqIGdmYXJfcnhfaW50ciA9ICJyeCI7CitzdGF0aWMgY29uc3QgY2hhciAqIGdmYXJfZXJyX2ludHIgPSAiZXJyb3IiOworCitzdGF0aWMgaW50IF9faW5pdCBnZmFyX29mX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm1kaW9fZGV2LCAqZ2Zhcl9kZXY7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgcmV0OworCisJZm9yIChucCA9IE5VTEwsIGkgPSAwOyAobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwgIm1kaW8iLCAiZ2lhbmZhciIpKSAhPSBOVUxMOyBpKyspIHsKKwkJaW50IGs7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQgPSBOVUxMOworCQlzdHJ1Y3QgZ2lhbmZhcl9tZGlvX2RhdGEgbWRpb19kYXRhOworCisJCW1lbXNldCgmcmVzLCAwLCBzaXplb2YocmVzKSk7CisJCW1lbXNldCgmbWRpb19kYXRhLCAwLCBzaXplb2YobWRpb19kYXRhKSk7CisKKwkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG1kaW9fZXJyOworCisJCW1kaW9fZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiZnNsLWdpYW5mYXJfbWRpbyIsIHJlcy5zdGFydCwgJnJlcywgMSk7CisJCWlmIChJU19FUlIobWRpb19kZXYpKSB7CisJCQlyZXQgPSBQVFJfRVJSKG1kaW9fZGV2KTsKKwkJCWdvdG8gbWRpb19lcnI7CisJCX0KKworCQlmb3IgKGsgPSAwOyBrIDwgMzI7IGsrKykKKwkJCW1kaW9fZGF0YS5pcnFba10gPSAtMTsKKworCQl3aGlsZSAoKGNoaWxkID0gb2ZfZ2V0X25leHRfY2hpbGQobnAsIGNoaWxkKSkgIT0gTlVMTCkgeworCQkJaWYgKGNoaWxkLT5uX2ludHJzKSB7CisJCQkJdTMyICppZCA9ICh1MzIgKikgZ2V0X3Byb3BlcnR5KGNoaWxkLCAicmVnIiwgTlVMTCk7CisJCQkJbWRpb19kYXRhLmlycVsqaWRdID0gY2hpbGQtPmludHJzWzBdLmxpbmU7CisJCQl9CisJCX0KKworCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEobWRpb19kZXYsICZtZGlvX2RhdGEsIHNpemVvZihzdHJ1Y3QgZ2lhbmZhcl9tZGlvX2RhdGEpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gbWRpb191bnJlZzsKKwl9CisKKwlmb3IgKG5wID0gTlVMTCwgaSA9IDA7IChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAibmV0d29yayIsICJnaWFuZmFyIikpICE9IE5VTEw7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2Ugcls0XTsKKwkJc3RydWN0IGRldmljZV9ub2RlICpwaHksICptZGlvOworCQlzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhIGdmYXJfZGF0YTsKKwkJdW5zaWduZWQgaW50ICppZDsKKwkJY2hhciAqbW9kZWw7CisJCXZvaWQgKm1hY19hZGRyOworCQlwaGFuZGxlICpwaDsKKworCQltZW1zZXQociwgMCwgc2l6ZW9mKHIpKTsKKwkJbWVtc2V0KCZnZmFyX2RhdGEsIDAsIHNpemVvZihnZmFyX2RhdGEpKTsKKworCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmclswXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGdmYXJfZXJyOworCisJCXJbMV0uc3RhcnQgPSBucC0+aW50cnNbMF0ubGluZTsKKwkJclsxXS5lbmQgPSBucC0+aW50cnNbMF0ubGluZTsKKwkJclsxXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCisJCW1vZGVsID0gZ2V0X3Byb3BlcnR5KG5wLCAibW9kZWwiLCBOVUxMKTsKKworCQkvKiBJZiB3ZSBhcmVuJ3QgdGhlIEZFQyB3ZSBoYXZlIG11bHRpcGxlIGludGVycnVwdHMgKi8KKwkJaWYgKG1vZGVsICYmIHN0cmNhc2VjbXAobW9kZWwsICJGRUMiKSkgeworCQkJclsxXS5uYW1lID0gZ2Zhcl90eF9pbnRyOworCisJCQlyWzJdLm5hbWUgPSBnZmFyX3J4X2ludHI7CisJCQlyWzJdLnN0YXJ0ID0gbnAtPmludHJzWzFdLmxpbmU7CisJCQlyWzJdLmVuZCA9IG5wLT5pbnRyc1sxXS5saW5lOworCQkJclsyXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCisJCQlyWzNdLm5hbWUgPSBnZmFyX2Vycl9pbnRyOworCQkJclszXS5zdGFydCA9IG5wLT5pbnRyc1syXS5saW5lOworCQkJclszXS5lbmQgPSBucC0+aW50cnNbMl0ubGluZTsKKwkJCXJbM10uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKwkJfQorCisJCWdmYXJfZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiZnNsLWdpYW5mYXIiLCBpLCAmclswXSwgbnAtPm5faW50cnMgKyAxKTsKKworCQlpZiAoSVNfRVJSKGdmYXJfZGV2KSkgeworCQkJcmV0ID0gUFRSX0VSUihnZmFyX2Rldik7CisJCQlnb3RvIGdmYXJfZXJyOworCQl9CisKKwkJbWFjX2FkZHIgPSBnZXRfcHJvcGVydHkobnAsICJhZGRyZXNzIiwgTlVMTCk7CisJCW1lbWNweShnZmFyX2RhdGEubWFjX2FkZHIsIG1hY19hZGRyLCA2KTsKKworCQlpZiAobW9kZWwgJiYgIXN0cmNhc2VjbXAobW9kZWwsICJUU0VDIikpCisJCQlnZmFyX2RhdGEuZGV2aWNlX2ZsYWdzID0KKwkJCQlGU0xfR0lBTkZBUl9ERVZfSEFTX0dJR0FCSVQgfAorCQkJCUZTTF9HSUFORkFSX0RFVl9IQVNfQ09BTEVTQ0UgfAorCQkJCUZTTF9HSUFORkFSX0RFVl9IQVNfUk1PTiB8CisJCQkJRlNMX0dJQU5GQVJfREVWX0hBU19NVUxUSV9JTlRSOworCQlpZiAobW9kZWwgJiYgIXN0cmNhc2VjbXAobW9kZWwsICJlVFNFQyIpKQorCQkJZ2Zhcl9kYXRhLmRldmljZV9mbGFncyA9CisJCQkJRlNMX0dJQU5GQVJfREVWX0hBU19HSUdBQklUIHwKKwkJCQlGU0xfR0lBTkZBUl9ERVZfSEFTX0NPQUxFU0NFIHwKKwkJCQlGU0xfR0lBTkZBUl9ERVZfSEFTX1JNT04gfAorCQkJCUZTTF9HSUFORkFSX0RFVl9IQVNfTVVMVElfSU5UUiB8CisJCQkJRlNMX0dJQU5GQVJfREVWX0hBU19DU1VNIHwKKwkJCQlGU0xfR0lBTkZBUl9ERVZfSEFTX1ZMQU4gfAorCQkJCUZTTF9HSUFORkFSX0RFVl9IQVNfRVhURU5ERURfSEFTSDsKKworCQlwaCA9IChwaGFuZGxlICopIGdldF9wcm9wZXJ0eShucCwgInBoeS1oYW5kbGUiLCBOVUxMKTsKKwkJcGh5ID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoKnBoKTsKKworCQlpZiAocGh5ID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGdmYXJfdW5yZWc7CisJCX0KKworCQltZGlvID0gb2ZfZ2V0X3BhcmVudChwaHkpOworCisJCWlkID0gKHUzMiAqKSBnZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7CisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobWRpbywgMCwgJnJlcyk7CisJCWlmIChyZXQpIHsKKwkJCW9mX25vZGVfcHV0KHBoeSk7CisJCQlvZl9ub2RlX3B1dChtZGlvKTsKKwkJCWdvdG8gZ2Zhcl91bnJlZzsKKwkJfQorCisJCWdmYXJfZGF0YS5waHlfaWQgPSAqaWQ7CisJCWdmYXJfZGF0YS5idXNfaWQgPSByZXMuc3RhcnQ7CisKKwkJb2Zfbm9kZV9wdXQocGh5KTsKKwkJb2Zfbm9kZV9wdXQobWRpbyk7CisKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGdmYXJfZGV2LCAmZ2Zhcl9kYXRhLCBzaXplb2Yoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSkpOworCQlpZiAocmV0KQorCQkJZ290byBnZmFyX3VucmVnOworCX0KKworCXJldHVybiAwOworCittZGlvX3VucmVnOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG1kaW9fZGV2KTsKK21kaW9fZXJyOgorCXJldHVybiByZXQ7CisKK2dmYXJfdW5yZWc6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZ2Zhcl9kZXYpOworZ2Zhcl9lcnI6CisJcmV0dXJuIHJldDsKK30KK2FyY2hfaW5pdGNhbGwoZ2Zhcl9vZl9pbml0KTsKKworc3RhdGljIGludCBfX2luaXQgZnNsX2kyY19vZl9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppMmNfZGV2OworCWludCByZXQ7CisKKwlmb3IgKG5wID0gTlVMTCwgaSA9IDA7IChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAiaTJjIiwgImZzbC1pMmMiKSkgIT0gTlVMTDsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSByWzJdOworCQlzdHJ1Y3QgZnNsX2kyY19wbGF0Zm9ybV9kYXRhIGkyY19kYXRhOworCQl1bnNpZ25lZCBjaGFyICogZmxhZ3MgPSBOVUxMOworCisJCW1lbXNldCgmciwgMCwgc2l6ZW9mKHIpKTsKKwkJbWVtc2V0KCZpMmNfZGF0YSwgMCwgc2l6ZW9mKGkyY19kYXRhKSk7CisKKwkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJbMF0pOworCQlpZiAocmV0KQorCQkJZ290byBpMmNfZXJyOworCisJCXJbMV0uc3RhcnQgPSBucC0+aW50cnNbMF0ubGluZTsKKwkJclsxXS5lbmQgPSBucC0+aW50cnNbMF0ubGluZTsKKwkJclsxXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCisJCWkyY19kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJmc2wtaTJjIiwgaSwgciwgMik7CisJCWlmIChJU19FUlIoaTJjX2RldikpIHsKKwkJCXJldCA9IFBUUl9FUlIoaTJjX2Rldik7CisJCQlnb3RvIGkyY19lcnI7CisJCX0KKworCQlpMmNfZGF0YS5kZXZpY2VfZmxhZ3MgPSAwOworCQlmbGFncyA9IGdldF9wcm9wZXJ0eShucCwgImRmc3JyIiwgTlVMTCk7CisJCWlmIChmbGFncykKKwkJCWkyY19kYXRhLmRldmljZV9mbGFncyB8PSBGU0xfSTJDX0RFVl9TRVBBUkFURV9ERlNSUjsKKworCQlmbGFncyA9IGdldF9wcm9wZXJ0eShucCwgImZzbDUyMDAtY2xvY2tpbmciLCBOVUxMKTsKKwkJaWYgKGZsYWdzKQorCQkJaTJjX2RhdGEuZGV2aWNlX2ZsYWdzIHw9IEZTTF9JMkNfREVWX0NMT0NLXzUyMDA7CisKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGkyY19kZXYsICZpMmNfZGF0YSwgc2l6ZW9mKHN0cnVjdCBmc2xfaTJjX3BsYXRmb3JtX2RhdGEpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gaTJjX3VucmVnOworCX0KKworCXJldHVybiAwOworCitpMmNfdW5yZWc6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoaTJjX2Rldik7CitpMmNfZXJyOgorCXJldHVybiByZXQ7Cit9CithcmNoX2luaXRjYWxsKGZzbF9pMmNfb2ZfaW5pdCk7CisKKyNpZmRlZiBDT05GSUdfUFBDXzgzeHgKK3N0YXRpYyBpbnQgX19pbml0IG1wYzgzeHhfd2R0X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnNvYywgKm5wOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBpbnQgKmZyZXE7CisJaW50IHJldDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgIndhdGNoZG9nIiwgIm1wYzgzeHhfd2R0Iik7CisKKwlpZiAoIW5wKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gbXBjODN4eF93ZHRfbm9kZXY7CisJfQorCisJc29jID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInNvYyIpOworCisJaWYgKCFzb2MpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBtcGM4M3h4X3dkdF9ub3NvYzsKKwl9CisKKwlmcmVxID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShzb2MsICJidXMtZnJlcXVlbmN5IiwgTlVMTCk7CisJaWYgKCFmcmVxKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gbXBjODN4eF93ZHRfZXJyOworCX0KKworCW1lbXNldCgmciwgMCwgc2l6ZW9mKHIpKTsKKworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKTsKKwlpZiAocmV0KQorCQlnb3RvIG1wYzgzeHhfd2R0X2VycjsKKworCWRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoIm1wYzgzeHhfd2R0IiwgMCwgJnIsIDEpOworCWlmIChJU19FUlIoZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKGRldik7CisJCWdvdG8gbXBjODN4eF93ZHRfZXJyOworCX0KKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShkZXYsIGZyZXEsIHNpemVvZihpbnQpKTsKKwlpZiAocmV0KQorCQlnb3RvIG1wYzgzeHhfd2R0X3VucmVnOworCisJb2Zfbm9kZV9wdXQoc29jKTsKKwlvZl9ub2RlX3B1dChucCk7CisKKwlyZXR1cm4gMDsKKworbXBjODN4eF93ZHRfdW5yZWc6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKK21wYzgzeHhfd2R0X2VycjoKKwlvZl9ub2RlX3B1dChzb2MpOworbXBjODN4eF93ZHRfbm9zb2M6CisJb2Zfbm9kZV9wdXQobnApOworbXBjODN4eF93ZHRfbm9kZXY6CisJcmV0dXJuIHJldDsKK30KK2FyY2hfaW5pdGNhbGwobXBjODN4eF93ZHRfaW5pdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzM2QzZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfX1BQQ19GU0xfU09DX0gKKyNkZWZpbmUgX19QUENfRlNMX1NPQ19ICisjaWZkZWYgX19LRVJORUxfXworCitleHRlcm4gcGh5c19hZGRyX3QgZ2V0X2ltbXJiYXNlKHZvaWQpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCmluZGV4IDIyNjEyZWQuLjdkMDJmYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYworKysgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKQEAgLTMxMSw3ICszMTEsNyBAQAogfQogI2VuZGlmCiAKLWludCB4bW9uX2NvcmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBmcm9taXBpKQorc3RhdGljIGludCB4bW9uX2NvcmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBmcm9taXBpKQogewogCWludCBjbWQgPSAwOwogCXVuc2lnbmVkIGxvbmcgbXNyOwpAQCAtNTI4LDcgKzUyOCw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1pbnQgeG1vbl9icHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IHhtb25fYnB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBicHQgKmJwOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwpAQCAtNTU0LDcgKzU1NCw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLWludCB4bW9uX3NzdGVwKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCB4bW9uX3NzdGVwKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWlmICh1c2VyX21vZGUocmVncykpCiAJCXJldHVybiAwOwpAQCAtNTYyLDcgKzU2Miw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLWludCB4bW9uX2RhYnJfbWF0Y2goc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IHhtb25fZGFicl9tYXRjaChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpZiAoKHJlZ3MtPm1zciAmIChNU1JfSVJ8TVNSX1BSfE1TUl9TRikpICE9IChNU1JfSVJ8TVNSX1NGKSkKIAkJcmV0dXJuIDA7CkBAIC01NzIsNyArNTcyLDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotaW50IHhtb25faWFicl9tYXRjaChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbnQgeG1vbl9pYWJyX21hdGNoKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWlmICgocmVncy0+bXNyICYgKE1TUl9JUnxNU1JfUFJ8TVNSX1NGKSkgIT0gKE1TUl9JUnxNU1JfU0YpKQogCQlyZXR1cm4gMDsKQEAgLTU4Miw3ICs1ODIsNyBAQAogCXJldHVybiAxOwogfQogCi1pbnQgeG1vbl9pcGkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IHhtb25faXBpKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogI2lmZGVmIENPTkZJR19TTVAKIAlpZiAoaW5feG1vbiAmJiAhY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1c19pbl94bW9uKSkKQEAgLTU5MSw3ICs1OTEsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgeG1vbl9mYXVsdF9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCB4bW9uX2ZhdWx0X2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGJwdCAqYnA7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy80eHhfaW8vc2VyaWFsX3NpY2MuYyBiL2FyY2gvcHBjLzR4eF9pby9zZXJpYWxfc2ljYy5jCmluZGV4IGViYzRkYjguLjhhY2UyYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjLzR4eF9pby9zZXJpYWxfc2ljYy5jCisrKyBiL2FyY2gvcHBjLzR4eF9pby9zZXJpYWxfc2ljYy5jCkBAIC0yMTUsNyArMjE1LDYgQEAKICAqIG1lbW9yeSBpZiBsYXJnZSBudW1iZXJzIG9mIHNlcmlhbCBwb3J0cyBhcmUgb3Blbi4KICAqLwogc3RhdGljIHVfY2hhciAqdG1wX2J1ZjsKLXN0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogI2RlZmluZSBISUdIX0JJVFNfT0ZGU0VUICAgICgoc2l6ZW9mKGxvbmcpLXNpemVvZihpbnQpKSo4KQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9hbWlnYS9hbWlpbnRzLmMgYi9hcmNoL3BwYy9hbWlnYS9hbWlpbnRzLmMKaW5kZXggOTExOTVlMi4uNWYzNWNmMyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYW1pZ2EvYW1paW50cy5jCisrKyBiL2FyY2gvcHBjL2FtaWdhL2FtaWludHMuYwpAQCAtOTYsOCArOTYsOCBAQAogCQlnYXlsZS5pbnRlbiA9IEdBWUxFX0lSUV9JREU7CiAKIAkvKiB0dXJuIG9mZiBhbGwgaW50ZXJydXB0cy4uLiAqLwotCWN1c3RvbS5pbnRlbmEgPSAweDdmZmY7Ci0JY3VzdG9tLmludHJlcSA9IDB4N2ZmZjsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gMHg3ZmZmOworCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSAweDdmZmY7CiAKICNpZmRlZiBDT05GSUdfQVBVUwogCS8qIENsZWFyIGFueSBpbnRlci1DUFUgaW50ZXJydXB0IHJlcXVlc3RzLiBDaXJjdW12ZW50cyBidWcgaW4KQEAgLTExMCw3ICsxMTAsNyBAQAogCUFQVVNfV1JJVEUoQVBVU19JUExfRU1VLCBJUExFTVVfU0VUUkVTRVQgfCBJUExFTVVfSVBMTUFTSyk7CiAjZW5kaWYKIAkvKiAuLi4gYW5kIGVuYWJsZSB0aGUgbWFzdGVyIGludGVycnVwdCBiaXQgKi8KLQljdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgSUZfSU5URU47CisJYW1pZ2FfY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX0lOVEVOOwogCiAJY2lhX2luaXRfSVJRKCZjaWFhX2Jhc2UpOwogCWNpYV9pbml0X0lSUSgmY2lhYl9iYXNlKTsKQEAgLTE1MSw3ICsxNTEsNyBAQAogCX0KIAogCS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0ICovCi0JY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IGFtaV9pbnRlbmFfdmFsc1tpcnFdOworCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBhbWlfaW50ZW5hX3ZhbHNbaXJxXTsKIH0KIAogdm9pZCBhbWlnYV9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJfQogCiAJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCi0JY3VzdG9tLmludGVuYSA9IGFtaV9pbnRlbmFfdmFsc1tpcnFdOworCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBhbWlfaW50ZW5hX3ZhbHNbaXJxXTsKIH0KIAogaW5saW5lIHZvaWQgYW1pZ2FfZG9faXJxKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCkKQEAgLTE5Niw3ICsxOTYsNyBAQAogCiAJa3N0YXRfY3B1KDApLmlycXNbaXJxXSsrOwogCi0JY3VzdG9tLmludHJlcSA9IGFtaV9pbnRlbmFfdmFsc1tpcnFdOworCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBhbWlfaW50ZW5hX3ZhbHNbaXJxXTsKIAogCWZvciAoYWN0aW9uID0gZGVzYy0+YWN0aW9uOyBhY3Rpb247IGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkKIAkJYWN0aW9uLT5oYW5kbGVyKGlycSwgYWN0aW9uLT5kZXZfaWQsIGZwKTsKQEAgLTIwOCw0MCArMjA4LDQwIEBACiAKIHN0YXRpYyB2b2lkIGFtaV9pbnQxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQogewotCXVuc2lnbmVkIHNob3J0IGludHMgPSBjdXN0b20uaW50cmVxciAmIGN1c3RvbS5pbnRlbmFyOworCXVuc2lnbmVkIHNob3J0IGludHMgPSBhbWlnYV9jdXN0b20uaW50cmVxciAmIGFtaWdhX2N1c3RvbS5pbnRlbmFyOwogCiAJLyogaWYgc2VyaWFsIHRyYW5zbWl0IGJ1ZmZlciBlbXB0eSwgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9UQkUpIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX1RCRTsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1RCRTsKIAkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9UQkUsIGZwKTsKIAl9CiAKIAkvKiBpZiBmbG9wcHkgZGlzayB0cmFuc2ZlciBjb21wbGV0ZSwgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9EU0tCTEspIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX0RTS0JMSzsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0RTS0JMSzsKIAkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9EU0tCTEssIGZwKTsKIAl9CiAKIAkvKiBpZiBzb2Z0d2FyZSBpbnRlcnJ1cHQgc2V0LCBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX1NPRlQpIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX1NPRlQ7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9TT0ZUOwogCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX1NPRlQsIGZwKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGFtaV9pbnQzKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQogewotCXVuc2lnbmVkIHNob3J0IGludHMgPSBjdXN0b20uaW50cmVxciAmIGN1c3RvbS5pbnRlbmFyOworCXVuc2lnbmVkIHNob3J0IGludHMgPSBhbWlnYV9jdXN0b20uaW50cmVxciAmIGFtaWdhX2N1c3RvbS5pbnRlbmFyOwogCiAJLyogaWYgYSBibGl0dGVyIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQkxJVCkgewotCQljdXN0b20uaW50cmVxID0gSUZfQkxJVDsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0JMSVQ7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQkxJVCwgZnApOwogCX0KIAogCS8qIGlmIGEgY29wcGVyIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQ09QRVIpIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX0NPUEVSOworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQ09QRVI7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQ09QUEVSLCBmcCk7CiAJfQogCkBAIC0yNTIsMzYgKzI1MiwzNiBAQAogCiBzdGF0aWMgdm9pZCBhbWlfaW50NChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKLQl1bnNpZ25lZCBzaG9ydCBpbnRzID0gY3VzdG9tLmludHJlcXIgJiBjdXN0b20uaW50ZW5hcjsKKwl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKIAogCS8qIGlmIGF1ZGlvIDAgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9BVUQwKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9BVUQwOworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMDsKIAkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9BVUQwLCBmcCk7CiAJfQogCiAJLyogaWYgYXVkaW8gMSBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0FVRDEpIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX0FVRDE7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9BVUQxOwogCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0FVRDEsIGZwKTsKIAl9CiAKIAkvKiBpZiBhdWRpbyAyIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQVVEMikgewotCQljdXN0b20uaW50cmVxID0gSUZfQVVEMjsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0FVRDI7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQVVEMiwgZnApOwogCX0KIAogCS8qIGlmIGF1ZGlvIDMgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9BVUQzKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9BVUQzOworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMzsKIAkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9BVUQzLCBmcCk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBhbWlfaW50NShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKLQl1bnNpZ25lZCBzaG9ydCBpbnRzID0gY3VzdG9tLmludHJlcXIgJiBjdXN0b20uaW50ZW5hcjsKKwl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKIAogCS8qIGlmIHNlcmlhbCByZWNlaXZlIGJ1ZmZlciBmdWxsIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfUkJGKSB7CkBAIC0yOTEsNyArMjkxLDcgQEAKIAogCS8qIGlmIGEgZGlzayBzeW5jIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfRFNLU1lOKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9EU0tTWU47CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9EU0tTWU47CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfRFNLU1lOLCBmcCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvYW1pZ2EvY2lhLmMgYi9hcmNoL3BwYy9hbWlnYS9jaWEuYwppbmRleCBhZDk2MTQ2Li40NDMxYzU4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9hbWlnYS9jaWEuYworKysgYi9hcmNoL3BwYy9hbWlnYS9jaWEuYwpAQCAtNjYsNyArNjYsNyBAQAogCWVsc2UKIAkJYmFzZS0+aWNyX2RhdGEgJj0gfm1hc2s7CiAJaWYgKGJhc2UtPmljcl9kYXRhICYgYmFzZS0+aWNyX21hc2spCi0JCWN1c3RvbS5pbnRyZXEgPSBJRl9TRVRDTFIgfCBiYXNlLT5pbnRfbWFzazsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IGJhc2UtPmludF9tYXNrOwogCXJldHVybiBvbGQgJiBiYXNlLT5pY3JfbWFzazsKIH0KIApAQCAtMTE0LDcgKzExNCw3IEBACiAJYmFzZS0+aWNyX21hc2sgJj0gQ0lBX0lDUl9BTEw7CiAKIAlpZiAoYmFzZS0+aWNyX2RhdGEgJiBiYXNlLT5pY3JfbWFzaykKLQkJY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IGJhc2UtPmludF9tYXNrOworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfU0VUQ0xSIHwgYmFzZS0+aW50X21hc2s7CiAJcmV0dXJuIG9sZDsKIH0KIApAQCAtMTQ1LDcgKzE0NSw3IEBACiAJaXJxID0gYmFzZS0+Y2lhX2lycTsKIAlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CiAJaW50cyA9IGNpYV9zZXRfaXJxX3ByaXZhdGUoYmFzZSwgQ0lBX0lDUl9BTEwpOwotCWN1c3RvbS5pbnRyZXEgPSBiYXNlLT5pbnRfbWFzazsKKwlhbWlnYV9jdXN0b20uaW50cmVxID0gYmFzZS0+aW50X21hc2s7CiAJZm9yIChpID0gMDsgaSA8IENJQV9JUlFTOyBpKyssIGlycSsrKSB7CiAJCWlmIChpbnRzICYgMSkgewogCQkJa3N0YXRfY3B1KDApLmlycXNbaXJxXSsrOwpAQCAtMTc0LDUgKzE3NCw1IEBACiAJYWN0aW9uLT5uYW1lID0gYmFzZS0+bmFtZTsKIAlzZXR1cF9pcnEoYmFzZS0+aGFuZGxlcl9pcnEsICZhbWlnYV9zeXNfaXJxYWN0aW9uW2Jhc2UtPmhhbmRsZXJfaXJxLUlSUV9BTUlHQV9BVVRPXSk7CiAKLQljdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgYmFzZS0+aW50X21hc2s7CisJYW1pZ2FfY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IGJhc2UtPmludF9tYXNrOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvYW1pZ2EvY29uZmlnLmMgYi9hcmNoL3BwYy9hbWlnYS9jb25maWcuYwppbmRleCBhZjg4MWQ3Li42MGUyZGExIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9hbWlnYS9jb25maWcuYworKysgYi9hcmNoL3BwYy9hbWlnYS9jb25maWcuYwpAQCAtOTAsOSArOTAsNiBAQAogc3RhdGljIHZvaWQgYTIwMDBfZ2V0dG9kIChpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKIHN0YXRpYyBpbnQgYW1pZ2FfaHdjbGsgKGludCwgc3RydWN0IGh3Y2xrX3RpbWUgKik7CiBzdGF0aWMgaW50IGFtaWdhX3NldF9jbG9ja19tbXNzICh1bnNpZ25lZCBsb25nKTsKLSNpZmRlZiBDT05GSUdfQU1JR0FfRkxPUFBZCi1leHRlcm4gdm9pZCBhbWlnYV9mbG9wcHlfc2V0dXAoY2hhciAqLCBpbnQgKik7Ci0jZW5kaWYKIHN0YXRpYyB2b2lkIGFtaWdhX3Jlc2V0ICh2b2lkKTsKIGV4dGVybiB2b2lkIGFtaWdhX2luaXRfc291bmQodm9pZCk7CiBzdGF0aWMgdm9pZCBhbWlnYV9zYXZla21zZ19pbml0KHZvaWQpOwpAQCAtMjgxLDcgKzI3OCw3IEBACiAgICAgY2FzZSBDU19PQ1M6CiAgICAgY2FzZSBDU19FQ1M6CiAgICAgY2FzZSBDU19BR0E6Ci0gICAgICBzd2l0Y2ggKGN1c3RvbS5kZW5pc2VpZCAmIDB4ZikgeworICAgICAgc3dpdGNoIChhbWlnYV9jdXN0b20uZGVuaXNlaWQgJiAweGYpIHsKICAgICAgIGNhc2UgMHgwYzoKIAlBTUlHQUhXX1NFVChERU5JU0VfSFIpOwogCWJyZWFrOwpAQCAtMjk0LDcgKzI5MSw3IEBACiAgICAgICBBTUlHQUhXX1NFVChERU5JU0UpOwogICAgICAgYnJlYWs7CiAgICAgfQotICAgIHN3aXRjaCAoKGN1c3RvbS52cG9zcj4+OCkgJiAweDdmKSB7CisgICAgc3dpdGNoICgoYW1pZ2FfY3VzdG9tLnZwb3NyPj44KSAmIDB4N2YpIHsKICAgICBjYXNlIDB4MDA6CiAgICAgICBBTUlHQUhXX1NFVChBR05VU19QQUwpOwogICAgICAgYnJlYWs7CkBAIC00MTksOSArNDE2LDYgQEAKIAogICBtYWNoX2h3Y2xrICAgICAgICAgICA9IGFtaWdhX2h3Y2xrOwogICBtYWNoX3NldF9jbG9ja19tbXNzICA9IGFtaWdhX3NldF9jbG9ja19tbXNzOwotI2lmZGVmIENPTkZJR19BTUlHQV9GTE9QUFkKLSAgbWFjaF9mbG9wcHlfc2V0dXAgICAgPSBhbWlnYV9mbG9wcHlfc2V0dXA7Ci0jZW5kaWYKICAgbWFjaF9yZXNldCAgICAgICAgICAgPSBhbWlnYV9yZXNldDsKICNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCiAgIG1hY2hfaGVhcnRiZWF0ID0gYW1pZ2FfaGVhcnRiZWF0OwpAQCAtNDMyLDkgKzQyNiw5IEBACiAgIGFtaWdhX2NvbG9yY2xvY2sgPSA1KmFtaWdhX2VjbG9jazsJLyogMy41IE1IeiAqLwogCiAgIC8qIGNsZWFyIGFsbCBETUEgYml0cyAqLwotICBjdXN0b20uZG1hY29uID0gRE1BRl9BTEw7CisgIGFtaWdhX2N1c3RvbS5kbWFjb24gPSBETUFGX0FMTDsKICAgLyogZW5zdXJlIHRoYXQgdGhlIERNQSBtYXN0ZXIgYml0IGlzIHNldCAqLwotICBjdXN0b20uZG1hY29uID0gRE1BRl9TRVRDTFIgfCBETUFGX01BU1RFUjsKKyAgYW1pZ2FfY3VzdG9tLmRtYWNvbiA9IERNQUZfU0VUQ0xSIHwgRE1BRl9NQVNURVI7CiAKICAgLyogcmVxdWVzdCBhbGwgUkFNICovCiAgIGZvciAoaSA9IDA7IGkgPCBtNjhrX251bV9tZW1vcnk7IGkrKykgewpAQCAtNzUzLDkgKzc0Nyw5IEBACiAKIHN0YXRpYyB2b2lkIGFtaWdhX3NlcmlhbF9wdXRjKGNoYXIgYykKIHsKLSAgICBjdXN0b20uc2VyZGF0ID0gKHVuc2lnbmVkIGNoYXIpYyB8IDB4MTAwOworICAgIGFtaWdhX2N1c3RvbS5zZXJkYXQgPSAodW5zaWduZWQgY2hhciljIHwgMHgxMDA7CiAgICAgbWIoKTsKLSAgICB3aGlsZSAoIShjdXN0b20uc2VyZGF0ciAmIDB4MjAwMCkpCisgICAgd2hpbGUgKCEoYW1pZ2FfY3VzdG9tLnNlcmRhdHIgJiAweDIwMDApKQogICAgICAgIDsKIH0KIApAQCAtNzg1LDExICs3NzksMTEgQEAKIHsKICAgICBpbnQgY2g7CiAKLSAgICB3aGlsZSAoIShjdXN0b20uaW50cmVxciAmIElGX1JCRikpCisgICAgd2hpbGUgKCEoYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBJRl9SQkYpKQogCWJhcnJpZXIoKTsKLSAgICBjaCA9IGN1c3RvbS5zZXJkYXRyICYgMHhmZjsKKyAgICBjaCA9IGFtaWdhX2N1c3RvbS5zZXJkYXRyICYgMHhmZjsKICAgICAvKiBjbGVhciB0aGUgaW50ZXJydXB0LCBzbyB0aGF0IGFub3RoZXIgY2hhcmFjdGVyIGNhbiBiZSByZWFkICovCi0gICAgY3VzdG9tLmludHJlcSA9IElGX1JCRjsKKyAgICBhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfUkJGOwogICAgIHJldHVybiBjaDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wcGMva2VybmVsL01ha2VmaWxlCmluZGV4IGU2YzFkNjE1Li5jYTAyMDEzIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMva2VybmVsL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw2IEBACiBleHRyYS15CQkJCSs9IHZtbGludXgubGRzCiAKIG9iai15CQkJCTo9IGVudHJ5Lm8gdHJhcHMubyBpZGxlLm8gdGltZS5vIG1pc2MubyBcCi0JCQkJCXByb2Nlc3MubyBcCiAJCQkJCXNldHVwLm8gXAogCQkJCQlwcGNfaHRhYi5vCiBvYmotJChDT05GSUdfNnh4KQkJKz0gbDJjci5vIGNwdV9zZXR1cF82eHgubwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2hlYWRfOHh4LlMgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUwppbmRleCBkZTA5Nzg3Li4zZTZjYTdmIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUworKysgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUwpAQCAtMzc1LDYgKzM3NSw4IEBACiAJbGlzCXIxMSwgc3dhcHBlcl9wZ19kaXJAaAogCW9yaQlyMTEsIHIxMSwgc3dhcHBlcl9wZ19kaXJAbAogCXJsd2ltaQlyMTAsIHIxMSwgMCwgMiwgMTkKKwlzdHcJcjEyLCAxNihyMCkKKwliIExvYWRMYXJnZURUTEIKIDM6CiAJbHd6CXIxMSwgMChyMTApCS8qIEdldCB0aGUgbGV2ZWwgMSBlbnRyeSAqLwogCXJsd2lubS4JcjEwLCByMTEsMCwwLDE5CS8qIEV4dHJhY3QgcGFnZSBkZXNjcmlwdG9yIHBhZ2UgYWRkcmVzcyAqLwpAQCAtNDMwLDYgKzQzMiw4MSBAQAogSW5zdHJ1Y3Rpb25UTEJFcnJvcjoKIAliCUluc3RydWN0aW9uQWNjZXNzCiAKK0xvYWRMYXJnZURUTEI6CisJbGkJcjEyLCAwCisJbHd6CXIxMSwgMChyMTApCS8qIEdldCB0aGUgbGV2ZWwgMSBlbnRyeSAqLworCXJsd2lubS4JcjEwLCByMTEsMCwwLDE5CS8qIEV4dHJhY3QgcGFnZSBkZXNjcmlwdG9yIHBhZ2UgYWRkcmVzcyAqLworCWJlcQkzZgkJLyogSWYgemVybywgZG9uJ3QgdHJ5IHRvIGZpbmQgYSBwdGUgKi8KKworCS8qIFdlIGhhdmUgYSBwdGUgdGFibGUsIHNvIGxvYWQgZmV0Y2ggdGhlIHB0ZSBmcm9tIHRoZSB0YWJsZS4KKwkgKi8KKwlvcmkJcjExLCByMTEsIDEJLyogU2V0IHZhbGlkIGJpdCBpbiBwaHlzaWNhbCBMMiBwYWdlICovCisJRE9fOHh4X0NQVTYoMHgzYjgwLCByMykKKwltdHNwcglTUFJOX01EX1RXQywgcjExCS8qIExvYWQgcHRlIHRhYmxlIGJhc2UgYWRkcmVzcyAqLworCW1mc3ByCXIxMCwgU1BSTl9NRF9UV0MJLyogLi4uLmFuZCBnZXQgdGhlIHB0ZSBhZGRyZXNzICovCisJbHd6CXIxMCwgMChyMTApCS8qIEdldCB0aGUgcHRlICovCisKKwkvKiBJbnNlcnQgdGhlIEd1YXJkZWQgZmxhZyBpbnRvIHRoZSBUV0MgZnJvbSB0aGUgTGludXggUFRFLgorCSAqIEl0IGlzIGJpdCAyNyBvZiBib3RoIHRoZSBMaW51eCBQVEUgYW5kIHRoZSBUV0MgKGF0IGxlYXN0CisJICogSSBnb3QgdGhhdCByaWdodCA6LSkuICBJdCB3aWxsIGJlIGJldHRlciB3aGVuIHdlIGNhbiBwdXQKKwkgKiB0aGlzIGludG8gdGhlIExpbnV4IHBnZC9wbWQgYW5kIGxvYWQgaXQgaW4gdGhlIG9wZXJhdGlvbgorCSAqIGFib3ZlLgorCSAqLworCXJsd2ltaQlyMTEsIHIxMCwgMCwgMjcsIDI3CisKKwlybHdpbWkgIHIxMiwgcjEwLCAwLCAwLCA5CS8qIGV4dHJhY3QgcGh5cy4gYWRkciAqLworCW1mc3ByCXIzLCBTUFJOX01EX0VQTgorCXJsd2lubQlyMywgcjMsIDAsIDAsIDkJCS8qIGV4dHJhY3QgdmlydHVhbCBhZGRyZXNzICovCisJdG9waHlzKHIzLCByMykKKwljbXB3CXIzLCByMTIJCQkvKiBvbmx5IHVzZSA4TSBwYWdlIGlmIGl0IGlzIGEgZGlyZWN0IAorCQkJCQkgICBrZXJuZWwgbWFwcGluZyAqLworCWJuZQkxZgorCW9yaSAgICAgcjExLCByMTEsIE1EX1BTOE1FRworCWxpCXIxMiwgMQorCWIJMmYKKzE6CisJbGkJcjEyLCAwCQkvKiBjYW4ndCB1c2UgOE1CIFRMQiwgc28gemVybyByMTIuICovCisyOgorCURPXzh4eF9DUFU2KDB4M2I4MCwgcjMpCisJbXRzcHIJU1BSTl9NRF9UV0MsIHIxMQorCisJLyogVGhlIExpbnV4IFBURSB3b24ndCBnbyBleGFjdGx5IGludG8gdGhlIE1NVSBUTEIuCisJICogU29mdHdhcmUgaW5kaWNhdG9yIGJpdHMgMjEsIDIyIGFuZCAyOCBtdXN0IGJlIGNsZWFyLgorCSAqIFNvZnR3YXJlIGluZGljYXRvciBiaXRzIDI0LCAyNSwgMjYsIGFuZCAyNyBtdXN0IGJlCisJICogc2V0LiAgQWxsIG90aGVyIExpbnV4IFBURSBiaXRzIGNvbnRyb2wgdGhlIGJlaGF2aW9yCisJICogb2YgdGhlIE1NVS4KKwkgKi8KKzM6CWxpCXIxMSwgMHgwMGYwCisJcmx3aW1pCXIxMCwgcjExLCAwLCAyNCwgMjgJLyogU2V0IDI0LTI3LCBjbGVhciAyOCAqLworCWNtcHdpICAgcjEyLCAxCisJYm5lIDRmCisJb3JpICAgICByMTAsIHIxMCwgMHg4CisKKwltZnNwcglyMTIsIFNQUk5fTURfRVBOCisJbGlzCXIzLCAweGZmODAJCS8qIDEwLTE5IG11c3QgYmUgY2xlYXIgZm9yIDhNQiBUTEIgKi8KKwlvcmkJcjMsIHIzLCAweDBmZmYKKwlhbmQJcjEyLCByMywgcjEyCisJRE9fOHh4X0NQVTYoMHgzNzgwLCByMykKKwltdHNwcglTUFJOX01EX0VQTiwgcjEyCisKKwlsaXMJcjMsIDB4ZmY4MAkJLyogMTAtMTkgbXVzdCBiZSBjbGVhciBmb3IgOE1CIFRMQiAqLworCW9yaQlyMywgcjMsIDB4MGZmZgorCWFuZAlyMTAsIHIzLCByMTAKKzQ6CisJRE9fOHh4X0NQVTYoMHgzZDgwLCByMykKKwltdHNwcglTUFJOX01EX1JQTiwgcjEwCS8qIFVwZGF0ZSBUTEIgZW50cnkgKi8KKworCW1mc3ByCXIxMCwgU1BSTl9NX1RXCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCisJbHd6CXIxMSwgMChyMCkKKwltdGNyCXIxMQorCWx3eglyMTEsIDQocjApCisKKwlsd3oJcjEyLCAxNihyMCkKKyNpZmRlZiBDT05GSUdfOHh4X0NQVTYKKwlsd3oJcjMsIDgocjApCisjZW5kaWYKKwlyZmkKKwogLyogVGhpcyBpcyB0aGUgZGF0YSBUTEIgZXJyb3Igb24gdGhlIE1QQzh4eC4gIFRoaXMgY291bGQgYmUgZHVlIHRvCiAgKiBtYW55IHJlYXNvbnMsIGluY2x1ZGluZyBhIGRpcnR5IHVwZGF0ZSB0byBhIHB0ZS4gIFdlIGNhbiBjYXRjaCB0aGF0CiAgKiBvbmUgaGVyZSwgYnV0IGFueXRoaW5nIGVsc2UgaXMgYW4gZXJyb3IuICBGaXJzdCwgd2UgdHJhY2sgZG93biB0aGUKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYyBiL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCA5NTA3NWY5Li5mYjBkYTdjIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3BwY19rc3ltcy5jCkBAIC0yNzAsNyArMjcwLDYgQEAKIEVYUE9SVF9TWU1CT0wodGltZXJfaW50ZXJydXB0KTsKIEVYUE9SVF9TWU1CT0woaXJxX2Rlc2MpOwogRVhQT1JUX1NZTUJPTCh0Yl90aWNrc19wZXJfamlmZnkpOwotRVhQT1JUX1NZTUJPTChnZXRfd2NoYW4pOwogRVhQT1JUX1NZTUJPTChjb25zb2xlX2RyaXZlcnMpOwogI2lmZGVmIENPTkZJR19YTU9OCiBFWFBPUlRfU1lNQk9MKHhtb24pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcHBjL2tlcm5lbC9wcm9jZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2JkYzguLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMva2VybmVsL3Byb2Nlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDg1MSArMCwwIEBACi0vKgotICogIGFyY2gvcHBjL2tlcm5lbC9wcm9jZXNzLmMKLSAqCi0gKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYyIKLSAqICAgIENvcHlyaWdodCAoQykgMTk5NSAgTGludXMgVG9ydmFsZHMKLSAqCi0gKiAgVXBkYXRlZCBhbmQgbW9kaWZpZWQgYnkgQ29ydCBEb3VnYW4gKGNvcnRAY3Mubm10LmVkdSkgYW5kCi0gKiAgUGF1bCBNYWNrZXJyYXMgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQotICoKLSAqICBQb3dlclBDIHZlcnNpb24KLSAqICAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEdhcnkgVGhvbWFzIChnZHRAbGludXhwcGMub3JnKQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+Ci0jaW5jbHVkZSA8bGludXgvbXF1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgotCi0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL21tdS5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIF9nZXRfU1Aodm9pZCk7Ci0KLXN0cnVjdCB0YXNrX3N0cnVjdCAqbGFzdF90YXNrX3VzZWRfbWF0aCA9IE5VTEw7Ci1zdHJ1Y3QgdGFza19zdHJ1Y3QgKmxhc3RfdGFza191c2VkX2FsdGl2ZWMgPSBOVUxMOwotc3RydWN0IHRhc2tfc3RydWN0ICpsYXN0X3Rhc2tfdXNlZF9zcGUgPSBOVUxMOwotCi1zdGF0aWMgc3RydWN0IGZzX3N0cnVjdCBpbml0X2ZzID0gSU5JVF9GUzsKLXN0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0IGluaXRfZmlsZXMgPSBJTklUX0ZJTEVTOwotc3RhdGljIHN0cnVjdCBzaWduYWxfc3RydWN0IGluaXRfc2lnbmFscyA9IElOSVRfU0lHTkFMUyhpbml0X3NpZ25hbHMpOwotc3RhdGljIHN0cnVjdCBzaWdoYW5kX3N0cnVjdCBpbml0X3NpZ2hhbmQgPSBJTklUX1NJR0hBTkQoaW5pdF9zaWdoYW5kKTsKLXN0cnVjdCBtbV9zdHJ1Y3QgaW5pdF9tbSA9IElOSVRfTU0oaW5pdF9tbSk7Ci1FWFBPUlRfU1lNQk9MKGluaXRfbW0pOwotCi0vKiB0aGlzIGlzIDhrQi1hbGlnbmVkIHNvIHdlIGNhbiBnZXQgdG8gdGhlIHRocmVhZF9pbmZvIHN0cnVjdAotICAgYXQgdGhlIGJhc2Ugb2YgaXQgZnJvbSB0aGUgc3RhY2sgcG9pbnRlciB3aXRoIDEgaW50ZWdlciBpbnN0cnVjdGlvbi4gKi8KLXVuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbgotCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSkpID0KLXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07Ci0KLS8qIGluaXRpYWwgdGFzayBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCB0YXNrX3N0cnVjdCBpbml0X3Rhc2sgPSBJTklUX1RBU0soaW5pdF90YXNrKTsKLUVYUE9SVF9TWU1CT0woaW5pdF90YXNrKTsKLQotLyogb25seSB1c2VkIHRvIGdldCBzZWNvbmRhcnkgcHJvY2Vzc29yIHVwICovCi1zdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnJlbnRfc2V0W05SX0NQVVNdID0geyZpbml0X3Rhc2ssIH07Ci0KLSN1bmRlZiBTSE9XX1RBU0tfU1dJVENIRVMKLSN1bmRlZiBDSEVDS19TVEFDSwotCi0jaWYgZGVmaW5lZChDSEVDS19TVEFDSykKLXVuc2lnbmVkIGxvbmcKLWtlcm5lbF9zdGFja190b3Aoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JcmV0dXJuICgodW5zaWduZWQgbG9uZyl0c2spICsgc2l6ZW9mKHVuaW9uIHRhc2tfdW5pb24pOwotfQotCi11bnNpZ25lZCBsb25nCi10YXNrX3RvcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKXRzaykgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKTsKLX0KLQotLyogY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBrZXJuZWwgc3RhY2sgaXMgaGVhbHRoeSAqLwotaW50IGNoZWNrX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQotewotCXVuc2lnbmVkIGxvbmcgc3RhY2tfdG9wID0ga2VybmVsX3N0YWNrX3RvcCh0c2spOwotCXVuc2lnbmVkIGxvbmcgdHNrX3RvcCA9IHRhc2tfdG9wKHRzayk7Ci0JaW50IHJldCA9IDA7Ci0KLSNpZiAwCi0JLyogY2hlY2sgdGhyZWFkIG1hZ2ljICovCi0JaWYgKCB0c2stPnRocmVhZC5tYWdpYyAhPSBUSFJFQURfTUFHSUMgKQotCXsKLQkJcmV0IHw9IDE7Ci0JCXByaW50aygidGhyZWFkLm1hZ2ljIGJhZDogJTA4eFxuIiwgdHNrLT50aHJlYWQubWFnaWMpOwotCX0KLSNlbmRpZgotCi0JaWYgKCAhdHNrICkKLQkJcHJpbnRrKCJjaGVja19zdGFjaygpOiB0c2sgYmFkIHRzayAlcFxuIix0c2spOwotCi0JLyogY2hlY2sgaWYgc3RvcmVkIGtzcCBpcyBiYWQgKi8KLQlpZiAoICh0c2stPnRocmVhZC5rc3AgPiBzdGFja190b3ApIHx8ICh0c2stPnRocmVhZC5rc3AgPCB0c2tfdG9wKSApCi0JewotCQlwcmludGsoInN0YWNrIG91dCBvZiBib3VuZHM6ICVzLyVkXG4iCi0JCSAgICAgICAiIHRza190b3AgJTA4bHgga3NwICUwOGx4IHN0YWNrX3RvcCAlMDhseFxuIiwKLQkJICAgICAgIHRzay0+Y29tbSx0c2stPnBpZCwKLQkJICAgICAgIHRza190b3AsIHRzay0+dGhyZWFkLmtzcCwgc3RhY2tfdG9wKTsKLQkJcmV0IHw9IDI7Ci0JfQotCi0JLyogY2hlY2sgaWYgc3RhY2sgcHRyIFJJR0hUIE5PVyBpcyBiYWQgKi8KLQlpZiAoICh0c2sgPT0gY3VycmVudCkgJiYgKChfZ2V0X1NQKCkgPiBzdGFja190b3AgKSB8fCAoX2dldF9TUCgpIDwgdHNrX3RvcCkpICkKLQl7Ci0JCXByaW50aygiY3VycmVudCBzdGFjayBwdHIgb3V0IG9mIGJvdW5kczogJXMvJWRcbiIKLQkJICAgICAgICIgdHNrX3RvcCAlMDhseCBzcCAlMDhseCBzdGFja190b3AgJTA4bHhcbiIsCi0JCSAgICAgICBjdXJyZW50LT5jb21tLGN1cnJlbnQtPnBpZCwKLQkJICAgICAgIHRza190b3AsIF9nZXRfU1AoKSwgc3RhY2tfdG9wKTsKLQkJcmV0IHw9IDQ7Ci0JfQotCi0jaWYgMAotCS8qIGNoZWNrIGFtb3VudCBvZiBmcmVlIHN0YWNrICovCi0JZm9yICggaSA9ICh1bnNpZ25lZCBsb25nICopdGFza190b3AodHNrKSA7IGkgPCBrZXJuZWxfc3RhY2tfdG9wKHRzaykgOyBpKysgKQotCXsKLQkJaWYgKCAhaSApCi0JCQlwcmludGsoImNoZWNrX3N0YWNrKCk6IGkgPSAlcFxuIiwgaSk7Ci0JCWlmICggKmkgIT0gMCApCi0JCXsKLQkJCS8qIG9ubHkgbm90aWZ5IGlmIGl0J3MgbGVzcyB0aGFuIDkwMCBieXRlcyAqLwotCQkJaWYgKCAoaSAtICh1bnNpZ25lZCBsb25nICopdGFza190b3AodHNrKSkgIDwgOTAwICkKLQkJCQlwcmludGsoIiVkIGJ5dGVzIGZyZWUgb24gc3RhY2tcbiIsCi0JCQkJICAgICAgIGkgLSB0YXNrX3RvcCh0c2spKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotI2VuZGlmCi0KLQlpZiAocmV0KQotCXsKLQkJcGFuaWMoImJhZCBrZXJuZWwgc3RhY2siKTsKLQl9Ci0JcmV0dXJuKHJldCk7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZChDSEVDS19TVEFDSykgKi8KLQotLyoKLSAqIE1ha2Ugc3VyZSB0aGUgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXIgc3RhdGUgaW4gdGhlCi0gKiB0aGUgdGhyZWFkX3N0cnVjdCBpcyB1cCB0byBkYXRlIGZvciB0YXNrIHRzay4KLSAqLwotdm9pZCBmbHVzaF9mcF90b190aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JaWYgKHRzay0+dGhyZWFkLnJlZ3MpIHsKLQkJLyoKLQkJICogV2UgbmVlZCB0byBkaXNhYmxlIHByZWVtcHRpb24gaGVyZSBiZWNhdXNlIGlmIHdlIGRpZG4ndCwKLQkJICogYW5vdGhlciBwcm9jZXNzIGNvdWxkIGdldCBzY2hlZHVsZWQgYWZ0ZXIgdGhlIHJlZ3MtPm1zcgotCQkgKiB0ZXN0IGJ1dCBiZWZvcmUgd2UgaGF2ZSBmaW5pc2hlZCBzYXZpbmcgdGhlIEZQIHJlZ2lzdGVycwotCQkgKiB0byB0aGUgdGhyZWFkX3N0cnVjdC4gIFRoYXQgcHJvY2VzcyBjb3VsZCB0YWtlIG92ZXIgdGhlCi0JCSAqIEZQVSwgYW5kIHRoZW4gd2hlbiB3ZSBnZXQgc2NoZWR1bGVkIGFnYWluIHdlIHdvdWxkIHN0b3JlCi0JCSAqIGJvZ3VzIHZhbHVlcyBmb3IgdGhlIHJlbWFpbmluZyBGUCByZWdpc3RlcnMuCi0JCSAqLwotCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJaWYgKHRzay0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9GUCkgewotI2lmZGVmIENPTkZJR19TTVAKLQkJCS8qCi0JCQkgKiBUaGlzIHNob3VsZCBvbmx5IGV2ZXIgYmUgY2FsbGVkIGZvciBjdXJyZW50IG9yCi0JCQkgKiBmb3IgYSBzdG9wcGVkIGNoaWxkIHByb2Nlc3MuICBTaW5jZSB3ZSBzYXZlIGF3YXkKLQkJCSAqIHRoZSBGUCByZWdpc3RlciBzdGF0ZSBvbiBjb250ZXh0IHN3aXRjaCBvbiBTTVAsCi0JCQkgKiB0aGVyZSBpcyBzb21ldGhpbmcgd3JvbmcgaWYgYSBzdG9wcGVkIGNoaWxkIGFwcGVhcnMKLQkJCSAqIHRvIHN0aWxsIGhhdmUgaXRzIEZQIHN0YXRlIGluIHRoZSBDUFUgcmVnaXN0ZXJzLgotCQkJICovCi0JCQlCVUdfT04odHNrICE9IGN1cnJlbnQpOwotI2VuZGlmCi0JCQlnaXZldXBfZnB1KGN1cnJlbnQpOwotCQl9Ci0JCXByZWVtcHRfZW5hYmxlKCk7Ci0JfQotfQotCi12b2lkIGVuYWJsZV9rZXJuZWxfZnAodm9pZCkKLXsKLQlXQVJOX09OKHByZWVtcHRpYmxlKCkpOwotCi0jaWZkZWYgQ09ORklHX1NNUAotCWlmIChjdXJyZW50LT50aHJlYWQucmVncyAmJiAoY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9GUCkpCi0JCWdpdmV1cF9mcHUoY3VycmVudCk7Ci0JZWxzZQotCQlnaXZldXBfZnB1KE5VTEwpOwkvKiBqdXN0IGVuYWJsZXMgRlAgZm9yIGtlcm5lbCAqLwotI2Vsc2UKLQlnaXZldXBfZnB1KGxhc3RfdGFza191c2VkX21hdGgpOwotI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KLX0KLUVYUE9SVF9TWU1CT0woZW5hYmxlX2tlcm5lbF9mcCk7Ci0KLWludCBkdW1wX3Rhc2tfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBlbGZfZnByZWdzZXRfdCAqZnByZWdzKQotewotCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmICh0c2stPnRocmVhZC5yZWdzICYmICh0c2stPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfRlApKQotCQlnaXZldXBfZnB1KHRzayk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKLQltZW1jcHkoZnByZWdzLCAmdHNrLT50aHJlYWQuZnByWzBdLCBzaXplb2YoKmZwcmVncykpOwotCXJldHVybiAxOwotfQotCi0jaWZkZWYgQ09ORklHX0FMVElWRUMKLXZvaWQgZW5hYmxlX2tlcm5lbF9hbHRpdmVjKHZvaWQpCi17Ci0JV0FSTl9PTihwcmVlbXB0aWJsZSgpKTsKLQotI2lmZGVmIENPTkZJR19TTVAKLQlpZiAoY3VycmVudC0+dGhyZWFkLnJlZ3MgJiYgKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfVkVDKSkKLQkJZ2l2ZXVwX2FsdGl2ZWMoY3VycmVudCk7Ci0JZWxzZQotCQlnaXZldXBfYWx0aXZlYyhOVUxMKTsJLyoganVzdCBlbmFibGUgQWx0aVZlYyBmb3Iga2VybmVsIC0gZm9yY2UgKi8KLSNlbHNlCi0JZ2l2ZXVwX2FsdGl2ZWMobGFzdF90YXNrX3VzZWRfYWx0aXZlYyk7Ci0jZW5kaWYgLyogX19TTVAgX18gKi8KLX0KLUVYUE9SVF9TWU1CT0woZW5hYmxlX2tlcm5lbF9hbHRpdmVjKTsKLQotLyoKLSAqIE1ha2Ugc3VyZSB0aGUgVk1YL0FsdGl2ZWMgcmVnaXN0ZXIgc3RhdGUgaW4gdGhlCi0gKiB0aGUgdGhyZWFkX3N0cnVjdCBpcyB1cCB0byBkYXRlIGZvciB0YXNrIHRzay4KLSAqLwotdm9pZCBmbHVzaF9hbHRpdmVjX3RvX3RocmVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlpZiAodHNrLT50aHJlYWQucmVncykgewotCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJaWYgKHRzay0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9WRUMpIHsKLSNpZmRlZiBDT05GSUdfU01QCi0JCQlCVUdfT04odHNrICE9IGN1cnJlbnQpOwotI2VuZGlmCi0JCQlnaXZldXBfYWx0aXZlYyhjdXJyZW50KTsKLQkJfQotCQlwcmVlbXB0X2VuYWJsZSgpOwotCX0KLX0KLQotaW50IGR1bXBfYWx0aXZlYyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgZWxmX3ZycmVnc2V0X3QgKnZycmVncykKLXsKLQlpZiAocmVncy0+bXNyICYgTVNSX1ZFQykKLQkJZ2l2ZXVwX2FsdGl2ZWMoY3VycmVudCk7Ci0JbWVtY3B5KHZycmVncywgJmN1cnJlbnQtPnRocmVhZC52clswXSwgc2l6ZW9mKCp2cnJlZ3MpKTsKLQlyZXR1cm4gMTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLwotCi0jaWZkZWYgQ09ORklHX1NQRQotdm9pZAotZW5hYmxlX2tlcm5lbF9zcGUodm9pZCkKLXsKLQlXQVJOX09OKHByZWVtcHRpYmxlKCkpOwotCi0jaWZkZWYgQ09ORklHX1NNUAotCWlmIChjdXJyZW50LT50aHJlYWQucmVncyAmJiAoY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9TUEUpKQotCQlnaXZldXBfc3BlKGN1cnJlbnQpOwotCWVsc2UKLQkJZ2l2ZXVwX3NwZShOVUxMKTsJLyoganVzdCBlbmFibGUgU1BFIGZvciBrZXJuZWwgLSBmb3JjZSAqLwotI2Vsc2UKLQlnaXZldXBfc3BlKGxhc3RfdGFza191c2VkX3NwZSk7Ci0jZW5kaWYgLyogX19TTVAgX18gKi8KLX0KLUVYUE9SVF9TWU1CT0woZW5hYmxlX2tlcm5lbF9zcGUpOwotCi12b2lkIGZsdXNoX3NwZV90b190aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JaWYgKHRzay0+dGhyZWFkLnJlZ3MpIHsKLQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCWlmICh0c2stPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfU1BFKSB7Ci0jaWZkZWYgQ09ORklHX1NNUAotCQkJQlVHX09OKHRzayAhPSBjdXJyZW50KTsKLSNlbmRpZgotCQkJZ2l2ZXVwX3NwZShjdXJyZW50KTsKLQkJfQotCQlwcmVlbXB0X2VuYWJsZSgpOwotCX0KLX0KLQotaW50IGR1bXBfc3BlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBlbGZfdnJyZWdzZXRfdCAqZXZycmVncykKLXsKLQlpZiAocmVncy0+bXNyICYgTVNSX1NQRSkKLQkJZ2l2ZXVwX3NwZShjdXJyZW50KTsKLQkvKiBXZSBjb3B5IHUzMiBldnJbMzJdICsgdTY0IGFjYyArIHUzMiBzcGVmc2NyIC0+IDM1ICovCi0JbWVtY3B5KGV2cnJlZ3MsICZjdXJyZW50LT50aHJlYWQuZXZyWzBdLCBzaXplb2YodTMyKSAqIDM1KTsKLQlyZXR1cm4gMTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfU1BFICovCi0KLXN0cnVjdCB0YXNrX3N0cnVjdCAqX19zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAotCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3KQotewotCXN0cnVjdCB0aHJlYWRfc3RydWN0ICpuZXdfdGhyZWFkLCAqb2xkX3RocmVhZDsKLQl1bnNpZ25lZCBsb25nIHM7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpsYXN0OwotCi0JbG9jYWxfaXJxX3NhdmUocyk7Ci0jaWZkZWYgQ0hFQ0tfU1RBQ0sKLQljaGVja19zdGFjayhwcmV2KTsKLQljaGVja19zdGFjayhuZXcpOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfU01QCi0JLyogYXZvaWQgY29tcGxleGl0eSBvZiBsYXp5IHNhdmUvcmVzdG9yZSBvZiBmcHUKLQkgKiBieSBqdXN0IHNhdmluZyBpdCBldmVyeSB0aW1lIHdlIHN3aXRjaCBvdXQgaWYKLQkgKiB0aGlzIHRhc2sgdXNlZCB0aGUgZnB1IGR1cmluZyB0aGUgbGFzdCBxdWFudHVtLgotCSAqCi0JICogSWYgaXQgdHJpZXMgdG8gdXNlIHRoZSBmcHUgYWdhaW4sIGl0J2xsIHRyYXAgYW5kCi0JICogcmVsb2FkIGl0cyBmcCByZWdzLiAgU28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBhIHJlc3RvcmUKLQkgKiBldmVyeSBzd2l0Y2gsIGp1c3QgYSBzYXZlLgotCSAqICAtLSBDb3J0Ci0JICovCi0JaWYgKHByZXYtPnRocmVhZC5yZWdzICYmIChwcmV2LT50aHJlYWQucmVncy0+bXNyICYgTVNSX0ZQKSkKLQkJZ2l2ZXVwX2ZwdShwcmV2KTsKLSNpZmRlZiBDT05GSUdfQUxUSVZFQwotCS8qCi0JICogSWYgdGhlIHByZXZpb3VzIHRocmVhZCB1c2VkIGFsdGl2ZWMgaW4gdGhlIGxhc3QgcXVhbnR1bQotCSAqICh0aHVzIGNoYW5naW5nIGFsdGl2ZWMgcmVncykgdGhlbiBzYXZlIHRoZW0uCi0JICogV2UgdXNlZCB0byBjaGVjayB0aGUgVlJTQVZFIHJlZ2lzdGVyIGJ1dCBub3QgYWxsIGFwcHMKLQkgKiBzZXQgaXQsIHNvIHdlIGRvbid0IHJlbHkgb24gaXQgbm93IChhbmQgaW4gZmFjdCB3ZSBuZWVkCi0JICogdG8gc2F2ZSAmIHJlc3RvcmUgVlNDUiBldmVuIGlmIFZSU0FWRSA9PSAwKS4gIC0tIHBhdWx1cwotCSAqCi0JICogT24gU01QIHdlIGFsd2F5cyBzYXZlL3Jlc3RvcmUgYWx0aXZlYyByZWdzIGp1c3QgdG8gYXZvaWQgdGhlCi0JICogY29tcGxleGl0eSBvZiBjaGFuZ2luZyBwcm9jZXNzb3JzLgotCSAqICAtLSBDb3J0Ci0JICovCi0JaWYgKChwcmV2LT50aHJlYWQucmVncyAmJiAocHJldi0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9WRUMpKSkKLQkJZ2l2ZXVwX2FsdGl2ZWMocHJldik7Ci0jZW5kaWYgLyogQ09ORklHX0FMVElWRUMgKi8KLSNpZmRlZiBDT05GSUdfU1BFCi0JLyoKLQkgKiBJZiB0aGUgcHJldmlvdXMgdGhyZWFkIHVzZWQgc3BlIGluIHRoZSBsYXN0IHF1YW50dW0KLQkgKiAodGh1cyBjaGFuZ2luZyBzcGUgcmVncykgdGhlbiBzYXZlIHRoZW0uCi0JICoKLQkgKiBPbiBTTVAgd2UgYWx3YXlzIHNhdmUvcmVzdG9yZSBzcGUgcmVncyBqdXN0IHRvIGF2b2lkIHRoZQotCSAqIGNvbXBsZXhpdHkgb2YgY2hhbmdpbmcgcHJvY2Vzc29ycy4KLQkgKi8KLQlpZiAoKHByZXYtPnRocmVhZC5yZWdzICYmIChwcmV2LT50aHJlYWQucmVncy0+bXNyICYgTVNSX1NQRSkpKQotCQlnaXZldXBfc3BlKHByZXYpOwotI2VuZGlmIC8qIENPTkZJR19TUEUgKi8KLSNlbmRpZiAvKiBDT05GSUdfU01QICovCi0KLSNpZmRlZiBDT05GSUdfQUxUSVZFQwotCS8qIEF2b2lkIHRoZSB0cmFwLiAgT24gc21wIHRoaXMgdGhpcyBuZXZlciBoYXBwZW5zIHNpbmNlCi0JICogd2UgZG9uJ3Qgc2V0IGxhc3RfdGFza191c2VkX2FsdGl2ZWMgLS0gQ29ydAotCSAqLwotCWlmIChuZXctPnRocmVhZC5yZWdzICYmIGxhc3RfdGFza191c2VkX2FsdGl2ZWMgPT0gbmV3KQotCQluZXctPnRocmVhZC5yZWdzLT5tc3IgfD0gTVNSX1ZFQzsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19TUEUKLQkvKiBBdm9pZCB0aGUgdHJhcC4gIE9uIHNtcCB0aGlzIHRoaXMgbmV2ZXIgaGFwcGVucyBzaW5jZQotCSAqIHdlIGRvbid0IHNldCBsYXN0X3Rhc2tfdXNlZF9zcGUKLQkgKi8KLQlpZiAobmV3LT50aHJlYWQucmVncyAmJiBsYXN0X3Rhc2tfdXNlZF9zcGUgPT0gbmV3KQotCQluZXctPnRocmVhZC5yZWdzLT5tc3IgfD0gTVNSX1NQRTsKLSNlbmRpZiAvKiBDT05GSUdfU1BFICovCi0JbmV3X3RocmVhZCA9ICZuZXctPnRocmVhZDsKLQlvbGRfdGhyZWFkID0gJmN1cnJlbnQtPnRocmVhZDsKLQlsYXN0ID0gX3N3aXRjaChvbGRfdGhyZWFkLCBuZXdfdGhyZWFkKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShzKTsKLQlyZXR1cm4gbGFzdDsKLX0KLQotdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKiByZWdzKQotewotCWludCBpLCB0cmFwOwotCi0JcHJpbnRrKCJOSVA6ICUwOGxYIExSOiAlMDhsWCBTUDogJTA4bFggUkVHUzogJXAgVFJBUDogJTA0bHggICAgJXNcbiIsCi0JICAgICAgIHJlZ3MtPm5pcCwgcmVncy0+bGluaywgcmVncy0+Z3ByWzFdLCByZWdzLCByZWdzLT50cmFwLAotCSAgICAgICBwcmludF90YWludGVkKCkpOwotCXByaW50aygiTVNSOiAlMDhseCBFRTogJTAxeCBQUjogJTAxeCBGUDogJTAxeCBNRTogJTAxeCBJUi9EUjogJTAxeCUwMXhcbiIsCi0JICAgICAgIHJlZ3MtPm1zciwgcmVncy0+bXNyJk1TUl9FRSA/IDEgOiAwLCByZWdzLT5tc3ImTVNSX1BSID8gMSA6IDAsCi0JICAgICAgIHJlZ3MtPm1zciAmIE1TUl9GUCA/IDEgOiAwLHJlZ3MtPm1zciZNU1JfTUUgPyAxIDogMCwKLQkgICAgICAgcmVncy0+bXNyJk1TUl9JUiA/IDEgOiAwLAotCSAgICAgICByZWdzLT5tc3ImTVNSX0RSID8gMSA6IDApOwotCXRyYXAgPSBUUkFQKHJlZ3MpOwotCWlmICh0cmFwID09IDB4MzAwIHx8IHRyYXAgPT0gMHg2MDApCi0JCXByaW50aygiREFSOiAlMDhsWCwgRFNJU1I6ICUwOGxYXG4iLCByZWdzLT5kYXIsIHJlZ3MtPmRzaXNyKTsKLQlwcmludGsoIlRBU0sgPSAlcFslZF0gJyVzJyBUSFJFQUQ6ICVwXG4iLAotCSAgICAgICBjdXJyZW50LCBjdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnRocmVhZF9pbmZvKTsKLQlwcmludGsoIkxhc3Qgc3lzY2FsbDogJWxkICIsIGN1cnJlbnQtPnRocmVhZC5sYXN0X3N5c2NhbGwpOwotCi0jaWZkZWYgQ09ORklHX1NNUAotCXByaW50aygiIENQVTogJWQiLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwotI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KLQotCWZvciAoaSA9IDA7ICBpIDwgMzI7ICBpKyspIHsKLQkJbG9uZyByOwotCQlpZiAoKGkgJSA4KSA9PSAwKQotCQkJcHJpbnRrKCJcbiIgS0VSTl9JTkZPICJHUFIlMDJkOiAiLCBpKTsKLQkJaWYgKF9fZ2V0X3VzZXIociwgJnJlZ3MtPmdwcltpXSkpCi0JCQlicmVhazsKLQkJcHJpbnRrKCIlMDhsWCAiLCByKTsKLQkJaWYgKGkgPT0gMTIgJiYgIUZVTExfUkVHUyhyZWdzKSkKLQkJCWJyZWFrOwotCX0KLQlwcmludGsoIlxuIik7Ci0jaWZkZWYgQ09ORklHX0tBTExTWU1TCi0JLyoKLQkgKiBMb29rdXAgTklQIGxhdGUgc28gd2UgaGF2ZSB0aGUgYmVzdCBjaGFuZ2Ugb2YgZ2V0dGluZyB0aGUKLQkgKiBhYm92ZSBpbmZvIG91dCB3aXRob3V0IGZhaWxpbmcKLQkgKi8KLQlwcmludGsoIk5JUCBbJTA4bHhdICIsIHJlZ3MtPm5pcCk7Ci0JcHJpbnRfc3ltYm9sKCIlc1xuIiwgcmVncy0+bmlwKTsKLQlwcmludGsoIkxSIFslMDhseF0gIiwgcmVncy0+bGluayk7Ci0JcHJpbnRfc3ltYm9sKCIlc1xuIiwgcmVncy0+bGluayk7Ci0jZW5kaWYKLQlzaG93X3N0YWNrKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopIHJlZ3MtPmdwclsxXSk7Ci19Ci0KLXZvaWQgZXhpdF90aHJlYWQodm9pZCkKLXsKLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlpZiAobGFzdF90YXNrX3VzZWRfbWF0aCA9PSBjdXJyZW50KQotCQlsYXN0X3Rhc2tfdXNlZF9tYXRoID0gTlVMTDsKLQlpZiAobGFzdF90YXNrX3VzZWRfYWx0aXZlYyA9PSBjdXJyZW50KQotCQlsYXN0X3Rhc2tfdXNlZF9hbHRpdmVjID0gTlVMTDsKLSNpZmRlZiBDT05GSUdfU1BFCi0JaWYgKGxhc3RfdGFza191c2VkX3NwZSA9PSBjdXJyZW50KQotCQlsYXN0X3Rhc2tfdXNlZF9zcGUgPSBOVUxMOwotI2VuZGlmCi0JcHJlZW1wdF9lbmFibGUoKTsKLX0KLQotdm9pZCBmbHVzaF90aHJlYWQodm9pZCkKLXsKLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlpZiAobGFzdF90YXNrX3VzZWRfbWF0aCA9PSBjdXJyZW50KQotCQlsYXN0X3Rhc2tfdXNlZF9tYXRoID0gTlVMTDsKLQlpZiAobGFzdF90YXNrX3VzZWRfYWx0aXZlYyA9PSBjdXJyZW50KQotCQlsYXN0X3Rhc2tfdXNlZF9hbHRpdmVjID0gTlVMTDsKLSNpZmRlZiBDT05GSUdfU1BFCi0JaWYgKGxhc3RfdGFza191c2VkX3NwZSA9PSBjdXJyZW50KQotCQlsYXN0X3Rhc2tfdXNlZF9zcGUgPSBOVUxMOwotI2VuZGlmCi0JcHJlZW1wdF9lbmFibGUoKTsKLX0KLQotdm9pZAotcmVsZWFzZV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICp0KQotewotfQotCi0vKgotICogVGhpcyBnZXRzIGNhbGxlZCBiZWZvcmUgd2UgYWxsb2NhdGUgYSBuZXcgdGhyZWFkIGFuZCBjb3B5Ci0gKiB0aGUgY3VycmVudCB0YXNrIGludG8gaXQuCi0gKi8KLXZvaWQgcHJlcGFyZV90b19jb3B5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQotewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdHNrLT50aHJlYWQucmVnczsKLQotCWlmIChyZWdzID09IE5VTEwpCi0JCXJldHVybjsKLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlpZiAocmVncy0+bXNyICYgTVNSX0ZQKQotCQlnaXZldXBfZnB1KGN1cnJlbnQpOwotI2lmZGVmIENPTkZJR19BTFRJVkVDCi0JaWYgKHJlZ3MtPm1zciAmIE1TUl9WRUMpCi0JCWdpdmV1cF9hbHRpdmVjKGN1cnJlbnQpOwotI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCi0jaWZkZWYgQ09ORklHX1NQRQotCWlmIChyZWdzLT5tc3IgJiBNU1JfU1BFKQotCQlnaXZldXBfc3BlKGN1cnJlbnQpOwotI2VuZGlmIC8qIENPTkZJR19TUEUgKi8KLQlwcmVlbXB0X2VuYWJsZSgpOwotfQotCi0vKgotICogQ29weSBhIHRocmVhZC4uCi0gKi8KLWludAotY29weV90aHJlYWQoaW50IG5yLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHVzcCwKLQkgICAgdW5zaWduZWQgbG9uZyB1bnVzZWQsCi0JICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHB0X3JlZ3MgKmNoaWxkcmVncywgKmtyZWdzOwotCWV4dGVybiB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCk7Ci0JdW5zaWduZWQgbG9uZyBzcCA9ICh1bnNpZ25lZCBsb25nKXAtPnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkU7Ci0JdW5zaWduZWQgbG9uZyBjaGlsZGZyYW1lOwotCi0JQ0hFQ0tfRlVMTF9SRUdTKHJlZ3MpOwotCS8qIENvcHkgcmVnaXN0ZXJzICovCi0Jc3AgLT0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKTsKLQljaGlsZHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgc3A7Ci0JKmNoaWxkcmVncyA9ICpyZWdzOwotCWlmICgoY2hpbGRyZWdzLT5tc3IgJiBNU1JfUFIpID09IDApIHsKLQkJLyogZm9yIGtlcm5lbCB0aHJlYWQsIHNldCBgY3VycmVudCcgYW5kIHN0YWNrcHRyIGluIG5ldyB0YXNrICovCi0JCWNoaWxkcmVncy0+Z3ByWzFdID0gc3AgKyBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpOwotCQljaGlsZHJlZ3MtPmdwclsyXSA9ICh1bnNpZ25lZCBsb25nKSBwOwotCQlwLT50aHJlYWQucmVncyA9IE5VTEw7CS8qIG5vIHVzZXIgcmVnaXN0ZXIgc3RhdGUgKi8KLQl9IGVsc2UgewotCQljaGlsZHJlZ3MtPmdwclsxXSA9IHVzcDsKLQkJcC0+dGhyZWFkLnJlZ3MgPSBjaGlsZHJlZ3M7Ci0JCWlmIChjbG9uZV9mbGFncyAmIENMT05FX1NFVFRMUykKLQkJCWNoaWxkcmVncy0+Z3ByWzJdID0gY2hpbGRyZWdzLT5ncHJbNl07Ci0JfQotCWNoaWxkcmVncy0+Z3ByWzNdID0gMDsgIC8qIFJlc3VsdCBmcm9tIGZvcmsoKSAqLwotCXNwIC09IFNUQUNLX0ZSQU1FX09WRVJIRUFEOwotCWNoaWxkZnJhbWUgPSBzcDsKLQotCS8qCi0JICogVGhlIHdheSB0aGlzIHdvcmtzIGlzIHRoYXQgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlCi0JICogc29tZSB0YXNrIHdpbGwgY2FsbCBfc3dpdGNoIHRvIHN3aXRjaCB0byB0aGUgbmV3IHRhc2suCi0JICogVGhhdCB3aWxsIHBvcCBvZmYgdGhlIHN0YWNrIGZyYW1lIGNyZWF0ZWQgYmVsb3cgYW5kIHN0YXJ0Ci0JICogdGhlIG5ldyB0YXNrIHJ1bm5pbmcgYXQgcmV0X2Zyb21fZm9yay4gIFRoZSBuZXcgdGFzayB3aWxsCi0JICogZG8gc29tZSBob3VzZSBrZWVwaW5nIGFuZCB0aGVuIHJldHVybiBmcm9tIHRoZSBmb3JrIG9yIGNsb25lCi0JICogc3lzdGVtIGNhbGwsIHVzaW5nIHRoZSBzdGFjayBmcmFtZSBjcmVhdGVkIGFib3ZlLgotCSAqLwotCXNwIC09IHNpemVvZihzdHJ1Y3QgcHRfcmVncyk7Ci0Ja3JlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgc3A7Ci0Jc3AgLT0gU1RBQ0tfRlJBTUVfT1ZFUkhFQUQ7Ci0JcC0+dGhyZWFkLmtzcCA9IHNwOwotCWtyZWdzLT5uaXAgPSAodW5zaWduZWQgbG9uZylyZXRfZnJvbV9mb3JrOwotCi0JcC0+dGhyZWFkLmxhc3Rfc3lzY2FsbCA9IC0xOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgYSB0aHJlYWQgZm9yIGV4ZWN1dGluZyBhIG5ldyBwcm9ncmFtCi0gKi8KLXZvaWQgc3RhcnRfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIG5pcCwgdW5zaWduZWQgbG9uZyBzcCkKLXsKLQlzZXRfZnMoVVNFUl9EUyk7Ci0JbWVtc2V0KHJlZ3MtPmdwciwgMCwgc2l6ZW9mKHJlZ3MtPmdwcikpOwotCXJlZ3MtPmN0ciA9IDA7Ci0JcmVncy0+bGluayA9IDA7Ci0JcmVncy0+eGVyID0gMDsKLQlyZWdzLT5jY3IgPSAwOwotCXJlZ3MtPm1xID0gMDsKLQlyZWdzLT5uaXAgPSBuaXA7Ci0JcmVncy0+Z3ByWzFdID0gc3A7Ci0JcmVncy0+bXNyID0gTVNSX1VTRVI7Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JaWYgKGxhc3RfdGFza191c2VkX21hdGggPT0gY3VycmVudCkKLQkJbGFzdF90YXNrX3VzZWRfbWF0aCA9IE5VTEw7Ci0JaWYgKGxhc3RfdGFza191c2VkX2FsdGl2ZWMgPT0gY3VycmVudCkKLQkJbGFzdF90YXNrX3VzZWRfYWx0aXZlYyA9IE5VTEw7Ci0jaWZkZWYgQ09ORklHX1NQRQotCWlmIChsYXN0X3Rhc2tfdXNlZF9zcGUgPT0gY3VycmVudCkKLQkJbGFzdF90YXNrX3VzZWRfc3BlID0gTlVMTDsKLSNlbmRpZgotCXByZWVtcHRfZW5hYmxlKCk7Ci0JbWVtc2V0KGN1cnJlbnQtPnRocmVhZC5mcHIsIDAsIHNpemVvZihjdXJyZW50LT50aHJlYWQuZnByKSk7Ci0JY3VycmVudC0+dGhyZWFkLmZwc2NyLnZhbCA9IDA7Ci0jaWZkZWYgQ09ORklHX0FMVElWRUMKLQltZW1zZXQoY3VycmVudC0+dGhyZWFkLnZyLCAwLCBzaXplb2YoY3VycmVudC0+dGhyZWFkLnZyKSk7Ci0JbWVtc2V0KCZjdXJyZW50LT50aHJlYWQudnNjciwgMCwgc2l6ZW9mKGN1cnJlbnQtPnRocmVhZC52c2NyKSk7Ci0JY3VycmVudC0+dGhyZWFkLnZyc2F2ZSA9IDA7Ci0JY3VycmVudC0+dGhyZWFkLnVzZWRfdnIgPSAwOwotI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCi0jaWZkZWYgQ09ORklHX1NQRQotCW1lbXNldChjdXJyZW50LT50aHJlYWQuZXZyLCAwLCBzaXplb2YoY3VycmVudC0+dGhyZWFkLmV2cikpOwotCWN1cnJlbnQtPnRocmVhZC5hY2MgPSAwOwotCWN1cnJlbnQtPnRocmVhZC5zcGVmc2NyID0gMDsKLQljdXJyZW50LT50aHJlYWQudXNlZF9zcGUgPSAwOwotI2VuZGlmIC8qIENPTkZJR19TUEUgKi8KLX0KLQotI2RlZmluZSBQUl9GUF9BTExfRVhDRVBUIChQUl9GUF9FWENfRElWIHwgUFJfRlBfRVhDX09WRiB8IFBSX0ZQX0VYQ19VTkQgXAotCQl8IFBSX0ZQX0VYQ19SRVMgfCBQUl9GUF9FWENfSU5WKQotCi1pbnQgc2V0X2ZwZXhjX21vZGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGludCB2YWwpCi17Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0c2stPnRocmVhZC5yZWdzOwotCi0JLyogVGhpcyBpcyBhIGJpdCBoYWlyeS4gIElmIHdlIGFyZSBhbiBTUEUgZW5hYmxlZCAgcHJvY2Vzc29yCi0JICogKGhhdmUgZW1iZWRkZWQgZnApIHdlIHN0b3JlIHRoZSBJRUVFIGV4Y2VwdGlvbiBlbmFibGUgZmxhZ3MgaW4KLQkgKiBmcGV4Y19tb2RlLiAgZnBleGNfbW9kZSBpcyBhbHNvIHVzZWQgZm9yIHNldHRpbmcgRlAgZXhjZXB0aW9uCi0JICogbW9kZSAoYXN5biwgcHJlY2lzZSwgZGlzYWJsZWQpIGZvciAnQ2xhc3NpYycgRlAuICovCi0JaWYgKHZhbCAmIFBSX0ZQX0VYQ19TV19FTkFCTEUpIHsKLSNpZmRlZiBDT05GSUdfU1BFCi0JCXRzay0+dGhyZWFkLmZwZXhjX21vZGUgPSB2YWwgJgotCQkJKFBSX0ZQX0VYQ19TV19FTkFCTEUgfCBQUl9GUF9BTExfRVhDRVBUKTsKLSNlbHNlCi0JCXJldHVybiAtRUlOVkFMOwotI2VuZGlmCi0JfSBlbHNlIHsKLQkJLyogb24gYSBDT05GSUdfU1BFIHRoaXMgZG9lcyBub3QgaHVydCB1cy4gIFRoZSBiaXRzIHRoYXQKLQkJICogX19wYWNrX2ZlMDEgdXNlIGRvIG5vdCBvdmVybGFwIHdpdGggYml0cyB1c2VkIGZvcgotCQkgKiBQUl9GUF9FWENfU1dfRU5BQkxFLiAgQWRkaXRpb25hbGx5LCB0aGUgTVNSW0ZFMCxGRTFdIGJpdHMKLQkJICogb24gQ09ORklHX1NQRSBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlc2VydmVkIHNvIHdyaXRpbmcgdG8KLQkJICogdGhlbSBkb2VzIG5vdCBjaGFuZ2UgYW55dGhpbmcgKi8KLQkJaWYgKHZhbCA+IFBSX0ZQX0VYQ19QUkVDSVNFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXRzay0+dGhyZWFkLmZwZXhjX21vZGUgPSBfX3BhY2tfZmUwMSh2YWwpOwotCQlpZiAocmVncyAhPSBOVUxMICYmIChyZWdzLT5tc3IgJiBNU1JfRlApICE9IDApCi0JCQlyZWdzLT5tc3IgPSAocmVncy0+bXNyICYgfihNU1JfRkUwfE1TUl9GRTEpKQotCQkJCXwgdHNrLT50aHJlYWQuZnBleGNfbW9kZTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBnZXRfZnBleGNfbW9kZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBhZHIpCi17Ci0JdW5zaWduZWQgaW50IHZhbDsKLQotCWlmICh0c2stPnRocmVhZC5mcGV4Y19tb2RlICYgUFJfRlBfRVhDX1NXX0VOQUJMRSkKLSNpZmRlZiBDT05GSUdfU1BFCi0JCXZhbCA9IHRzay0+dGhyZWFkLmZwZXhjX21vZGU7Ci0jZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgotCWVsc2UKLQkJdmFsID0gX191bnBhY2tfZmUwMSh0c2stPnRocmVhZC5mcGV4Y19tb2RlKTsKLQlyZXR1cm4gcHV0X3VzZXIodmFsLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBhZHIpOwotfQotCi1pbnQgc3lzX2Nsb25lKHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgdXNwLAotCSAgICAgIGludCBfX3VzZXIgKnBhcmVudF90aWRwLCB2b2lkIF9fdXNlciAqY2hpbGRfdGhyZWFkcHRyLAotCSAgICAgIGludCBfX3VzZXIgKmNoaWxkX3RpZHAsIGludCBwNiwKLQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlDSEVDS19GVUxMX1JFR1MocmVncyk7Ci0JaWYgKHVzcCA9PSAwKQotCQl1c3AgPSByZWdzLT5ncHJbMV07CS8qIHN0YWNrIHBvaW50ZXIgZm9yIGNoaWxkICovCi0gCXJldHVybiBkb19mb3JrKGNsb25lX2ZsYWdzLCB1c3AsIHJlZ3MsIDAsIHBhcmVudF90aWRwLCBjaGlsZF90aWRwKTsKLX0KLQotaW50IHN5c19mb3JrKHVuc2lnbmVkIGxvbmcgcDEsIHVuc2lnbmVkIGxvbmcgcDIsIHVuc2lnbmVkIGxvbmcgcDMsCi0JICAgICB1bnNpZ25lZCBsb25nIHA0LCB1bnNpZ25lZCBsb25nIHA1LCB1bnNpZ25lZCBsb25nIHA2LAotCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JQ0hFQ0tfRlVMTF9SRUdTKHJlZ3MpOwotCXJldHVybiBkb19mb3JrKFNJR0NITEQsIHJlZ3MtPmdwclsxXSwgcmVncywgMCwgTlVMTCwgTlVMTCk7Ci19Ci0KLWludCBzeXNfdmZvcmsodW5zaWduZWQgbG9uZyBwMSwgdW5zaWduZWQgbG9uZyBwMiwgdW5zaWduZWQgbG9uZyBwMywKLQkgICAgICB1bnNpZ25lZCBsb25nIHA0LCB1bnNpZ25lZCBsb25nIHA1LCB1bnNpZ25lZCBsb25nIHA2LAotCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCUNIRUNLX0ZVTExfUkVHUyhyZWdzKTsKLQlyZXR1cm4gZG9fZm9yayhDTE9ORV9WRk9SSyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgcmVncy0+Z3ByWzFdLAotCQkJcmVncywgMCwgTlVMTCwgTlVMTCk7Ci19Ci0KLWludCBzeXNfZXhlY3ZlKHVuc2lnbmVkIGxvbmcgYTAsIHVuc2lnbmVkIGxvbmcgYTEsIHVuc2lnbmVkIGxvbmcgYTIsCi0JICAgICAgIHVuc2lnbmVkIGxvbmcgYTMsIHVuc2lnbmVkIGxvbmcgYTQsIHVuc2lnbmVkIGxvbmcgYTUsCi0JICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWludCBlcnJvcjsKLQljaGFyICogZmlsZW5hbWU7Ci0KLQlmaWxlbmFtZSA9IGdldG5hbWUoKGNoYXIgX191c2VyICopIGEwKTsKLQllcnJvciA9IFBUUl9FUlIoZmlsZW5hbWUpOwotCWlmIChJU19FUlIoZmlsZW5hbWUpKQotCQlnb3RvIG91dDsKLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlpZiAocmVncy0+bXNyICYgTVNSX0ZQKQotCQlnaXZldXBfZnB1KGN1cnJlbnQpOwotI2lmZGVmIENPTkZJR19BTFRJVkVDCi0JaWYgKHJlZ3MtPm1zciAmIE1TUl9WRUMpCi0JCWdpdmV1cF9hbHRpdmVjKGN1cnJlbnQpOwotI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCi0jaWZkZWYgQ09ORklHX1NQRQotCWlmIChyZWdzLT5tc3IgJiBNU1JfU1BFKQotCQlnaXZldXBfc3BlKGN1cnJlbnQpOwotI2VuZGlmIC8qIENPTkZJR19TUEUgKi8KLQlwcmVlbXB0X2VuYWJsZSgpOwotCWVycm9yID0gZG9fZXhlY3ZlKGZpbGVuYW1lLCAoY2hhciBfX3VzZXIgKl9fdXNlciAqKSBhMSwKLQkJCSAgKGNoYXIgX191c2VyICpfX3VzZXIgKikgYTIsIHJlZ3MpOwotCWlmIChlcnJvciA9PSAwKSB7Ci0JCXRhc2tfbG9jayhjdXJyZW50KTsKLQkJY3VycmVudC0+cHRyYWNlICY9IH5QVF9EVFJBQ0U7Ci0JCXRhc2tfdW5sb2NrKGN1cnJlbnQpOwotCX0KLQlwdXRuYW1lKGZpbGVuYW1lKTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXZvaWQgZHVtcF9zdGFjayh2b2lkKQotewotCXNob3dfc3RhY2soY3VycmVudCwgTlVMTCk7Ci19Ci0KLUVYUE9SVF9TWU1CT0woZHVtcF9zdGFjayk7Ci0KLXZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyAqc3RhY2spCi17Ci0JdW5zaWduZWQgbG9uZyBzcCwgc3RhY2tfdG9wLCBwcmV2X3NwLCByZXQ7Ci0JaW50IGNvdW50ID0gMDsKLQl1bnNpZ25lZCBsb25nIG5leHRfZXhjID0gMDsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKLQlleHRlcm4gY2hhciByZXRfZnJvbV9leGNlcHQsIHJldF9mcm9tX2V4Y2VwdF9mdWxsLCByZXRfZnJvbV9zeXNjYWxsOwotCi0Jc3AgPSAodW5zaWduZWQgbG9uZykgc3RhY2s7Ci0JaWYgKHRzayA9PSBOVUxMKQotCQl0c2sgPSBjdXJyZW50OwotCWlmIChzcCA9PSAwKSB7Ci0JCWlmICh0c2sgPT0gY3VycmVudCkKLQkJCWFzbSgibXIgJTAsMSIgOiAiPXIiIChzcCkpOwotCQllbHNlCi0JCQlzcCA9IHRzay0+dGhyZWFkLmtzcDsKLQl9Ci0KLQlwcmV2X3NwID0gKHVuc2lnbmVkIGxvbmcpICh0c2stPnRocmVhZF9pbmZvICsgMSk7Ci0Jc3RhY2tfdG9wID0gKHVuc2lnbmVkIGxvbmcpIHRzay0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRTsKLQl3aGlsZSAoY291bnQgPCAxNiAmJiBzcCA+IHByZXZfc3AgJiYgc3AgPCBzdGFja190b3AgJiYgKHNwICYgMykgPT0gMCkgewotCQlpZiAoY291bnQgPT0gMCkgewotCQkJcHJpbnRrKCJDYWxsIHRyYWNlOiIpOwotI2lmZGVmIENPTkZJR19LQUxMU1lNUwotCQkJcHJpbnRrKCJcbiIpOwotI2VuZGlmCi0JCX0gZWxzZSB7Ci0JCQlpZiAobmV4dF9leGMpIHsKLQkJCQlyZXQgPSBuZXh0X2V4YzsKLQkJCQluZXh0X2V4YyA9IDA7Ci0JCQl9IGVsc2UKLQkJCQlyZXQgPSAqKHVuc2lnbmVkIGxvbmcgKikoc3AgKyA0KTsKLQkJCXByaW50aygiIFslMDhseF0gIiwgcmV0KTsKLSNpZmRlZiBDT05GSUdfS0FMTFNZTVMKLQkJCXByaW50X3N5bWJvbCgiJXMiLCByZXQpOwotCQkJcHJpbnRrKCJcbiIpOwotI2VuZGlmCi0JCQlpZiAocmV0ID09ICh1bnNpZ25lZCBsb25nKSAmcmV0X2Zyb21fZXhjZXB0Ci0JCQkgICAgfHwgcmV0ID09ICh1bnNpZ25lZCBsb25nKSAmcmV0X2Zyb21fZXhjZXB0X2Z1bGwKLQkJCSAgICB8fCByZXQgPT0gKHVuc2lnbmVkIGxvbmcpICZyZXRfZnJvbV9zeXNjYWxsKSB7Ci0JCQkJLyogc3AgKyAxNiBwb2ludHMgdG8gYW4gZXhjZXB0aW9uIGZyYW1lICovCi0JCQkJcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoc3AgKyAxNik7Ci0JCQkJaWYgKHNwICsgMTYgKyBzaXplb2YoKnJlZ3MpIDw9IHN0YWNrX3RvcCkKLQkJCQkJbmV4dF9leGMgPSByZWdzLT5uaXA7Ci0JCQl9Ci0JCX0KLQkJKytjb3VudDsKLQkJc3AgPSAqKHVuc2lnbmVkIGxvbmcgKilzcDsKLQl9Ci0jaWZuZGVmIENPTkZJR19LQUxMU1lNUwotCWlmIChjb3VudCA+IDApCi0JCXByaW50aygiXG4iKTsKLSNlbmRpZgotfQotCi0jaWYgMAotLyoKLSAqIExvdyBsZXZlbCBwcmludCBmb3IgZGVidWdnaW5nIC0gQ29ydAotICovCi1pbnQgX19pbml0IGxsX3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotCWNoYXIgYnVmWzI1Nl07Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gICAgICAgIGk9dnNwcmludGYoYnVmLGZtdCxhcmdzKTsKLQlsbF9wdXRzKGJ1Zik7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIGk7Ci19Ci0KLWludCBsaW5lcyA9IDI0LCBjb2xzID0gODA7Ci1pbnQgb3JpZ194ID0gMCwgb3JpZ195ID0gMDsKLQotdm9pZCBwdXRoZXgodW5zaWduZWQgbG9uZyB2YWwpCi17Ci0JdW5zaWduZWQgY2hhciBidWZbMTBdOwotCWludCBpOwotCWZvciAoaSA9IDc7ICBpID49IDA7ICBpLS0pCi0JewotCQlidWZbaV0gPSAiMDEyMzQ1Njc4OUFCQ0RFRiJbdmFsICYgMHgwRl07Ci0JCXZhbCA+Pj0gNDsKLQl9Ci0JYnVmWzhdID0gJ1wwJzsKLQlwcm9tX3ByaW50KGJ1Zik7Ci19Ci0KLXZvaWQgX19pbml0IGxsX3B1dHMoY29uc3QgY2hhciAqcykKLXsKLQlpbnQgeCx5OwotCWNoYXIgKnZpZG1lbSA9IChjaGFyICopLyooX0lTQV9NRU1fQkFTRSArIDB4QjgwMDApICovMHhEMDBCODAwMDsKLQljaGFyIGM7Ci0JZXh0ZXJuIGludCBtZW1faW5pdF9kb25lOwotCi0JaWYgKCBtZW1faW5pdF9kb25lICkgLyogYXNzdW1lIHRoaXMgbWVhbnMgd2UgY2FuIHByaW50ayAqLwotCXsKLQkJcHJpbnRrKHMpOwotCQlyZXR1cm47Ci0JfQotCi0jaWYgMAotCWlmICggaGF2ZV9vZiApCi0JewotCQlwcm9tX3ByaW50KHMpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0KLQkvKgotCSAqIGNhbid0IGxsX3B1dHMgb24gY2hycCB3aXRob3V0IG9wZW5maXJtd2FyZSB5ZXQuCi0JICogdmlkbWVtIGp1c3QgbmVlZHMgdG8gYmUgc2V0dXAgZm9yIGl0LgotCSAqIC0tIENvcnQKLQkgKi8KLQlpZiAoIF9tYWNoaW5lICE9IF9NQUNIX3ByZXAgKQotCQlyZXR1cm47Ci0JeCA9IG9yaWdfeDsKLQl5ID0gb3JpZ195OwotCi0Jd2hpbGUgKCAoIGMgPSAqcysrICkgIT0gJ1wwJyApIHsKLQkJaWYgKCBjID09ICdcbicgKSB7Ci0JCQl4ID0gMDsKLQkJCWlmICggKyt5ID49IGxpbmVzICkgewotCQkJCS8qc2Nyb2xsKCk7Ki8KLQkJCQkvKnktLTsqLwotCQkJCXkgPSAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJdmlkbWVtIFsgKCB4ICsgY29scyAqIHkgKSAqIDIgXSA9IGM7Ci0JCQlpZiAoICsreCA+PSBjb2xzICkgewotCQkJCXggPSAwOwotCQkJCWlmICggKyt5ID49IGxpbmVzICkgewotCQkJCQkvKnNjcm9sbCgpOyovCi0JCQkJCS8qeS0tOyovCi0JCQkJCXkgPSAwOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCW9yaWdfeCA9IHg7Ci0Jb3JpZ195ID0geTsKLX0KLSNlbmRpZgotCi11bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCi17Ci0JdW5zaWduZWQgbG9uZyBpcCwgc3A7Ci0JdW5zaWduZWQgbG9uZyBzdGFja19wYWdlID0gKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvOwotCWludCBjb3VudCA9IDA7Ci0JaWYgKCFwIHx8IHAgPT0gY3VycmVudCB8fCBwLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCi0JCXJldHVybiAwOwotCXNwID0gcC0+dGhyZWFkLmtzcDsKLQlkbyB7Ci0JCXNwID0gKih1bnNpZ25lZCBsb25nICopc3A7Ci0JCWlmIChzcCA8IHN0YWNrX3BhZ2UgfHwgc3AgPj0gc3RhY2tfcGFnZSArIDgxODgpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKGNvdW50ID4gMCkgewotCQkJaXAgPSAqKHVuc2lnbmVkIGxvbmcgKikoc3AgKyA0KTsKLQkJCWlmICghaW5fc2NoZWRfZnVuY3Rpb25zKGlwKSkKLQkJCQlyZXR1cm4gaXA7Ci0JCX0KLQl9IHdoaWxlIChjb3VudCsrIDwgMTYpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3NtcC5jIGIvYXJjaC9wcGMva2VybmVsL3NtcC5jCmluZGV4IGJlY2JmYTMuLmU1NWNkZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvc21wLmMKQEAgLTMxOCw3ICszMTgsNyBAQAogCQlwID0gZm9ya19pZGxlKGNwdSk7CiAJCWlmIChJU19FUlIocCkpCiAJCQlwYW5pYygiZmFpbGVkIGZvcmsgZm9yIENQVSAldTogJWxpIiwgY3B1LCBQVFJfRVJSKHApKTsKLQkJcC0+dGhyZWFkX2luZm8tPmNwdSA9IGNwdTsKKwkJdGFza190aHJlYWRfaW5mbyhwKS0+Y3B1ID0gY3B1OwogCQlpZGxlX3Rhc2tzW2NwdV0gPSBwOwogCX0KIH0KQEAgLTM2OSw3ICszNjksNyBAQAogCWNoYXIgYnVmWzMyXTsKIAlpbnQgYzsKIAotCXNlY29uZGFyeV90aSA9IGlkbGVfdGFza3NbY3B1XS0+dGhyZWFkX2luZm87CisJc2Vjb25kYXJ5X3RpID0gdGFza190aHJlYWRfaW5mbyhpZGxlX3Rhc2tzW2NwdV0pOwogCW1iKCk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmMKaW5kZXggMDRiZGMzOS4uMDEyZTFlNiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCkBAIC01MSw5ICs1MSw2IEBACiAKICNpbmNsdWRlIDxzeXNsaWIvcHBjODN4eF9zZXR1cC5oPgogCi1zdGF0aWMgY29uc3QgY2hhciAqR0ZBUl9QSFlfMCA9ICJwaHkwOjAiOwotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzEgPSAicGh5MDoxIjsKLQogI2lmbmRlZiBDT05GSUdfUENJCiB1bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKIHVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKQEAgLTEyOSwyMCArMTI2LDIxIEBACiAJbWRhdGEtPmlycVsxXSA9IE1QQzgzeHhfSVJRX0VYVDI7CiAJbWRhdGEtPmlycVsyXSA9IC0xOwogCW1kYXRhLT5pcnFbMzFdID0gLTE7Ci0JbWRhdGEtPnBhZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzgzeHhfVFNFQzEpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMDsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAwOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldGFkZHIsIDYpOwogCX0KIAogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODN4eF9UU0VDMik7CiAJaWYgKHBkYXRhKSB7CiAJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7Ci0JCXBkYXRhLT5idXNfaWQgPSBHRkFSX1BIWV8xOworCQlwZGF0YS0+YnVzX2lkID0gMDsKKwkJcGRhdGEtPnBoeV9pZCA9IDE7CiAJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MWFkZHIsIDYpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0MF9hZHMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDBfYWRzLmMKaW5kZXggYzVjZGU5Ny4uMmVjZWIxZSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0MF9hZHMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQwX2Fkcy5jCkBAIC01MiwxMCArNTIsNiBAQAogCiAjaW5jbHVkZSA8c3lzbGliL3BwYzg1eHhfc2V0dXAuaD4KIAotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzAgPSAicGh5MDowIjsKLXN0YXRpYyBjb25zdCBjaGFyICpHRkFSX1BIWV8xID0gInBoeTA6MSI7Ci1zdGF0aWMgY29uc3QgY2hhciAqR0ZBUl9QSFlfMyA9ICJwaHkwOjMiOwotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC0xMDIsMjcgKzk4LDI5IEBACiAJbWRhdGEtPmlycVsyXSA9IC0xOwogCW1kYXRhLT5pcnFbM10gPSBNUEM4NXh4X0lSUV9FWFQ1OwogCW1kYXRhLT5pcnFbMzFdID0gLTE7Ci0JbWRhdGEtPnBhZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzEpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMDsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAwOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldGFkZHIsIDYpOwogCX0KIAogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMik7CiAJaWYgKHBkYXRhKSB7CiAJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7Ci0JCXBkYXRhLT5idXNfaWQgPSBHRkFSX1BIWV8xOworCQlwZGF0YS0+YnVzX2lkID0gMDsKKwkJcGRhdGEtPnBoeV9pZCA9IDE7CiAJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MWFkZHIsIDYpOwogCX0KIAogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9GRUMpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSAwOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMzsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAzOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDJhZGRyLCA2KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NjBfYWRzLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTYwX2Fkcy5jCmluZGV4IDhlMzlhNTUuLjQ0MmM3ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NjBfYWRzLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU2MF9hZHMuYwpAQCAtNTYsMTAgKzU2LDYgQEAKICNpbmNsdWRlIDxzeXNsaWIvcHBjODV4eF9zZXR1cC5oPgogCiAKLXN0YXRpYyBjb25zdCBjaGFyICpHRkFSX1BIWV8wID0gInBoeTA6MCI7Ci1zdGF0aWMgY29uc3QgY2hhciAqR0ZBUl9QSFlfMSA9ICJwaHkwOjEiOwotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzMgPSAicGh5MDozIjsKLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQpAQCAtOTksMjAgKzk1LDIxIEBACiAJbWRhdGEtPmlycVsyXSA9IC0xOwogCW1kYXRhLT5pcnFbM10gPSBNUEM4NXh4X0lSUV9FWFQ1OwogCW1kYXRhLT5pcnFbMzFdID0gLTE7Ci0JbWRhdGEtPnBhZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzEpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMDsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAwOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldGFkZHIsIDYpOwogCX0KIAogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMik7CiAJaWYgKHBkYXRhKSB7CiAJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7Ci0JCXBkYXRhLT5idXNfaWQgPSBHRkFSX1BIWV8xOworCQlwZGF0YS0+YnVzX2lkID0gMDsKKwkJcGRhdGEtPnBoeV9pZCA9IDE7CiAJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MWFkZHIsIDYpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHNfY29tbW9uLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkc19jb21tb24uYwppbmRleCAyOTU5ZTNjLi5iMzMyZWJhIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkc19jb21tb24uYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkc19jb21tb24uYwpAQCAtMzk1LDkgKzM5NSw2IEBACiAKIFRPRENfQUxMT0MoKTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzAgPSAicGh5MDowIjsKLXN0YXRpYyBjb25zdCBjaGFyICpHRkFSX1BIWV8xID0gInBoeTA6MSI7Ci0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKQEAgLTQ2MSwzNCArNDU4LDM3IEBACiAJbWRhdGEtPmlycVsyXSA9IC0xOwogCW1kYXRhLT5pcnFbM10gPSAtMTsKIAltZGF0YS0+aXJxWzMxXSA9IC0xOwotCW1kYXRhLT5wYWRkciArPSBiaW5mby0+YmlfaW1tcl9iYXNlOwogCiAJLyogc2V0dXAgdGhlIGJvYXJkIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBlbmV0IGNvbnRyb2xsZXJzICovCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4NXh4X1RTRUMxKTsKIAlpZiAocGRhdGEpIHsKIAkJcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsKLQkJcGRhdGEtPmJ1c19pZCA9IEdGQVJfUEhZXzA7CisJCXBkYXRhLT5idXNfaWQgPSAwOworCQlwZGF0YS0+cGh5X2lkID0gMDsKIAkJbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXRhZGRyLCA2KTsKIAl9CiAKIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzIpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMTsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAxOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDFhZGRyLCA2KTsKIAl9CiAKIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfZVRTRUMxKTsKIAlpZiAocGRhdGEpIHsKIAkJcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsKLQkJcGRhdGEtPmJ1c19pZCA9IEdGQVJfUEhZXzA7CisJCXBkYXRhLT5idXNfaWQgPSAwOworCQlwZGF0YS0+cGh5X2lkID0gMDsKIAkJbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXRhZGRyLCA2KTsKIAl9CiAKIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfZVRTRUMyKTsKIAlpZiAocGRhdGEpIHsKIAkJcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsKLQkJcGRhdGEtPmJ1c19pZCA9IEdGQVJfUEhZXzE7CisJCXBkYXRhLT5idXNfaWQgPSAwOworCQlwZGF0YS0+cGh5X2lkID0gMTsKIAkJbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXQxYWRkciwgNik7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMKaW5kZXggNDVhNWI4MS4uZTc3N2JhOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvc2JjODU2MC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYwpAQCAtOTEsOSArOTEsNiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBjaGFyICpHRkFSX1BIWV8yNSA9ICJwaHkwOjI1IjsKLXN0YXRpYyBjb25zdCBjaGFyICpHRkFSX1BIWV8yNiA9ICJwaHkwOjI2IjsKLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQpAQCAtMTM2LDIwICsxMzMsMjEgQEAKIAltZGF0YS0+aXJxWzI1XSA9IE1QQzg1eHhfSVJRX0VYVDY7CiAJbWRhdGEtPmlycVsyNl0gPSBNUEM4NXh4X0lSUV9FWFQ3OwogCW1kYXRhLT5pcnFbMzFdID0gLTE7Ci0JbWRhdGEtPnBhZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzEpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMjU7CisJCXBkYXRhLT5idXNfaWQgPSAwOworCQlwZGF0YS0+cGh5X2lkID0gMjU7CiAJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0YWRkciwgNik7CiAJfQogCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4NXh4X1RTRUMyKTsKIAlpZiAocGRhdGEpIHsKIAkJcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsKLQkJcGRhdGEtPmJ1c19pZCA9IEdGQVJfUEhZXzI2OworCQlwZGF0YS0+YnVzX2lkID0gMDsKKwkJcGRhdGEtPnBoeV9pZCA9IDI2OwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDFhZGRyLCA2KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3N0eF9ncDMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3N0eF9ncDMuYwppbmRleCAxNWNlOWQwLi4wNjFiYjdjIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zdHhfZ3AzLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvc3R4X2dwMy5jCkBAIC05Myw5ICs5Myw2IEBACiAJMHgwLAkJCQkvKiBFeHRlcm5hbCAxMTogKi8KIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpHRkFSX1BIWV8yID0gInBoeTA6MiI7Ci1zdGF0aWMgY29uc3QgY2hhciAqR0ZBUl9QSFlfNCA9ICJwaHkwOjQiOwotCiAvKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQogICovCkBAIC0xMzAsMjAgKzEyNywyMSBAQAogCW1kYXRhLT5pcnFbMl0gPSBNUEM4NXh4X0lSUV9FWFQ1OwogCW1kYXRhLT5pcnFbNF0gPSBNUEM4NXh4X0lSUV9FWFQ1OwogCW1kYXRhLT5pcnFbMzFdID0gLTE7Ci0JbWRhdGEtPnBhZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzEpOwogCWlmIChwZGF0YSkgewogCS8qCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7ICovCi0JCXBkYXRhLT5idXNfaWQgPSBHRkFSX1BIWV8yOworCQlwZGF0YS0+YnVzX2lkID0gMDsKKwkJcGRhdGEtPnBoeV9pZCA9IDI7CiAJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0YWRkciwgNik7CiAJfQogCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4NXh4X1RTRUMyKTsKIAlpZiAocGRhdGEpIHsKIAkvKglwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOyAqLwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfNDsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSA0OwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDFhZGRyLCA2KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguYwppbmRleCBjNmRmZDhmLi5iNDM2ZjRkIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5jCkBAIC05MSwxMiArOTEsNiBAQAogCTB4MCwJCQkJLyogRXh0ZXJuYWwgMTE6ICovCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqR0ZBUl9QSFlfMCA9ICJwaHkwOjIiOwotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzEgPSAicGh5MDoxIjsKLSNpZmRlZiBDT05GSUdfTVBDODU0MAotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzMgPSAicGh5MDozIjsKLSNlbmRpZgotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC0xNDksMjAgKzE0MywyMSBAQAogCW1kYXRhLT5pcnFbMl0gPSAtMTsKIAltZGF0YS0+aXJxWzNdID0gTVBDODV4eF9JUlFfRVhUODsKIAltZGF0YS0+aXJxWzMxXSA9IC0xOwotCW1kYXRhLT5wYWRkciArPSBiaW5mby0+YmlfaW1tcl9iYXNlOwogCiAJLyogc2V0dXAgdGhlIGJvYXJkIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBlbmV0IGNvbnRyb2xsZXJzICovCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4NXh4X1RTRUMxKTsKIAlpZiAocGRhdGEpIHsKIAkJcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsKLQkJcGRhdGEtPmJ1c19pZCA9IEdGQVJfUEhZXzA7CisJCXBkYXRhLT5idXNfaWQgPSAwOworCQlwZGF0YS0+cGh5X2lkID0gMjsKIAkJbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXRhZGRyLCA2KTsKIAl9CiAKIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzIpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMTsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAxOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDFhZGRyLCA2KTsKIAl9CiAKQEAgLTE3MCw3ICsxNjUsOCBAQAogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9GRUMpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSAwOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMzsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAzOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDJhZGRyLCA2KTsKIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9hcHVzX3NldHVwLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvYXB1c19zZXR1cC5jCmluZGV4IDJmNzRmZGUuLmM0MmM1MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9hcHVzX3NldHVwLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2FwdXNfc2V0dXAuYwpAQCAtNTUsOSArNTUsNiBAQAogaW50ICgqbWFjaF9zZXRfY2xvY2tfbW1zcykgKHVuc2lnbmVkIGxvbmcpID0gTlVMTDsKIHZvaWQgKCptYWNoX3Jlc2V0KSggdm9pZCApOwogbG9uZyBtYWNoX21heF9kbWFfYWRkcmVzcyA9IDB4MDBmZmZmZmY7IC8qIGRlZmF1bHQgc2V0IHRvIHRoZSBsb3dlciAxNk1CICovCi0jaWYgZGVmaW5lZChDT05GSUdfQU1JR0FfRkxPUFBZKQotdm9pZCAoKm1hY2hfZmxvcHB5X3NldHVwKSAoY2hhciAqLCBpbnQgKikgX19pbml0ZGF0YSA9IE5VTEw7Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCiB2b2lkICgqbWFjaF9oZWFydGJlYXQpIChpbnQpID0gTlVMTDsKIGV4dGVybiB2b2lkIGFwdXNfaGVhcnRiZWF0ICh2b2lkKTsKQEAgLTc2LDcgKzczLDYgQEAKIAogc3RydWN0IG1lbV9pbmZvIHJhbWRpc2s7CiAKLWV4dGVybiB2b2lkIGFtaWdhX2Zsb3BweV9zZXR1cChjaGFyICosIGludCAqKTsKIGV4dGVybiB2b2lkIGNvbmZpZ19hbWlnYSh2b2lkKTsKIAogc3RhdGljIGludCBfXzYwbnNyYW0gPSAwOwpAQCAtMzA1LDE2ICszMDEsNiBAQAogewogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRkxPUFBZICovCi0jaWYgZGVmaW5lZChDT05GSUdfQU1JR0FfRkxPUFBZKQotX19pbml0Ci12b2lkIGZsb3BweV9zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKLXsKLQlpZiAobWFjaF9mbG9wcHlfc2V0dXApCi0JCW1hY2hfZmxvcHB5X3NldHVwIChzdHIsIGludHMpOwotfQotI2VuZGlmCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNRU1PUlkgKi8KICNkZWZpbmUgS01BUF9NQVggMzIKIHVuc2lnbmVkIGxvbmcga21hcF9jaHVua3NbS01BUF9NQVgqM107CkBAIC01NzQsOSArNTYwLDkgQEAKIAogaW50IF9fZGVidWdfc2VyX291dCggdW5zaWduZWQgY2hhciBjICkKIHsKLQljdXN0b20uc2VyZGF0ID0gYyB8IDB4MTAwOworCWFtaWdhX2N1c3RvbS5zZXJkYXQgPSBjIHwgMHgxMDA7CiAJbWIoKTsKLQl3aGlsZSAoIShjdXN0b20uc2VyZGF0ciAmIDB4MjAwMCkpCisJd2hpbGUgKCEoYW1pZ2FfY3VzdG9tLnNlcmRhdHIgJiAweDIwMDApKQogCQliYXJyaWVyKCk7CiAJcmV0dXJuIDE7CiB9CkBAIC01ODYsMTEgKzU3MiwxMSBAQAogCXVuc2lnbmVkIGNoYXIgYzsKIAogCS8qIFhYWDogaXMgdGhhdCBvaz8/IGRlcml2ZWQgZnJvbSBhbWlnYV9zZXIuYy4uLiAqLwotCXdoaWxlKCAhKGN1c3RvbS5pbnRyZXFyICYgSUZfUkJGKSApCisJd2hpbGUoICEoYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBJRl9SQkYpICkKIAkJYmFycmllcigpOwotCWMgPSBjdXN0b20uc2VyZGF0cjsKKwljID0gYW1pZ2FfY3VzdG9tLnNlcmRhdHI7CiAJLyogY2xlYXIgdGhlIGludGVycnVwdCwgc28gdGhhdCBhbm90aGVyIGNoYXJhY3RlciBjYW4gYmUgcmVhZCAqLwotCWN1c3RvbS5pbnRyZXEgPSBJRl9SQkY7CisJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1JCRjsKIAlyZXR1cm4gYzsKIH0KIApAQCAtNjAxLDEwICs1ODcsMTAgQEAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAkvKiB0dXJuIG9mZiBSeCBhbmQgVHggaW50ZXJydXB0cyAqLwotCWN1c3RvbS5pbnRlbmEgPSBJRl9SQkYgfCBJRl9UQkU7CisJYW1pZ2FfY3VzdG9tLmludGVuYSA9IElGX1JCRiB8IElGX1RCRTsKIAogCS8qIGNsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdCAqLwotCWN1c3RvbS5pbnRyZXEgPSBJRl9SQkYgfCBJRl9UQkU7CisJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1JCRiB8IElGX1RCRTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIApAQCAtNjE3LDcgKzYwMyw3IEBACiAKICNpZmRlZiBDT05GSUdfS0dEQgogCS8qIHR1cm4gUnggaW50ZXJydXB0cyBvbiBmb3IgR0RCICovCi0JY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX1JCRjsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgSUZfUkJGOwogCXNlcl9SVFNvbigpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9tcGM4M3h4X2RldmljZXMuYyBiL2FyY2gvcHBjL3N5c2xpYi9tcGM4M3h4X2RldmljZXMuYwppbmRleCA4NDdkZjQ0Li5mOWI5NWRlIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvbXBjODN4eF9kZXZpY2VzLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL21wYzgzeHhfZGV2aWNlcy5jCkBAIC0yOCw3ICsyOCw2IEBACiAgKi8KIAogc3RydWN0IGdpYW5mYXJfbWRpb19kYXRhIG1wYzgzeHhfbWRpb19wZGF0YSA9IHsKLQkucGFkZHIgPSAweDI0NTIwLAogfTsKIAogc3RhdGljIHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgbXBjODN4eF90c2VjMV9wZGF0YSA9IHsKQEAgLTIyNiw3ICsyMjUsMTQgQEAKIAkJLm5hbWUgPSAiZnNsLWdpYW5mYXJfbWRpbyIsCiAJCS5pZCA9IDAsCiAJCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZtcGM4M3h4X21kaW9fcGRhdGEsCi0JCS5udW1fcmVzb3VyY2VzID0gMCwKKwkJLm51bV9yZXNvdXJjZXMgPSAxLAorCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkuc3RhcnQJPSAweDI0NTIwLAorCQkJCS5lbmQJPSAweDI0NTNmLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJfSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL21wYzg1eHhfZGV2aWNlcy5jIGIvYXJjaC9wcGMvc3lzbGliL21wYzg1eHhfZGV2aWNlcy5jCmluZGV4IDY5OTQ5ZDIuLjAwZTliNmZmIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvbXBjODV4eF9kZXZpY2VzLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL21wYzg1eHhfZGV2aWNlcy5jCkBAIC0yNiw3ICsyNiw2IEBACiAgKiB3aGF0IENDU1JCQVIgaXMsIHdpbGwgZ2V0IGZpeGVkIHVwIGJ5IG1hY2hfbXBjODV4eF9maXh1cAogICovCiBzdHJ1Y3QgZ2lhbmZhcl9tZGlvX2RhdGEgbXBjODV4eF9tZGlvX3BkYXRhID0gewotCS5wYWRkciA9IE1QQzg1eHhfTUlJTV9PRkZTRVQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSBtcGM4NXh4X3RzZWMxX3BkYXRhID0gewpAQCAtNzIwLDcgKzcxOSwxNCBAQAogCQkubmFtZSA9ICJmc2wtZ2lhbmZhcl9tZGlvIiwKIAkJLmlkID0gMCwKIAkJLmRldi5wbGF0Zm9ybV9kYXRhID0gJm1wYzg1eHhfbWRpb19wZGF0YSwKLQkJLm51bV9yZXNvdXJjZXMgPSAwLAorCQkubnVtX3Jlc291cmNlcyA9IDEsCisJCS5yZXNvdXJjZSA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeworCQkJeworCQkJCS5zdGFydAk9IDB4MjQ1MjAsCisJCQkJLmVuZAk9IDB4MjQ1M2YsCisJCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJCQl9LAorCQl9LAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvb2NwLmMgYi9hcmNoL3BwYy9zeXNsaWIvb2NwLmMKaW5kZXggOWNjY2U0My4uYWIzNGIxZCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL29jcC5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9vY3AuYwpAQCAtMTg5LDYgKzE4OSw4IEBACiBzdHJ1Y3QgYnVzX3R5cGUgb2NwX2J1c190eXBlID0gewogCS5uYW1lID0gIm9jcCIsCiAJLm1hdGNoID0gb2NwX2RldmljZV9tYXRjaCwKKwkucHJvYmUgPSBvY3BfZHJpdmVyX3Byb2JlLAorCS5yZW1vdmUgPSBvY3BfZHJpdmVyX3JlbW92ZSwKIAkuc3VzcGVuZCA9IG9jcF9kZXZpY2Vfc3VzcGVuZCwKIAkucmVzdW1lID0gb2NwX2RldmljZV9yZXN1bWUsCiB9OwpAQCAtMjEwLDggKzIxMiw2IEBACiAJLyogaW5pdGlhbGl6ZSBjb21tb24gZHJpdmVyIGZpZWxkcyAqLwogCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7CiAJZHJ2LT5kcml2ZXIuYnVzID0gJm9jcF9idXNfdHlwZTsKLQlkcnYtPmRyaXZlci5wcm9iZSA9IG9jcF9kZXZpY2VfcHJvYmU7Ci0JZHJ2LT5kcml2ZXIucmVtb3ZlID0gb2NwX2RldmljZV9yZW1vdmU7CiAKIAkvKiByZWdpc3RlciB3aXRoIGNvcmUgKi8KIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy94bW9uL3htb24uYyBiL2FyY2gvcHBjL3htb24veG1vbi5jCmluZGV4IDJiNDgzYjQuLjkwNzVhNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3htb24veG1vbi5jCisrKyBiL2FyY2gvcHBjL3htb24veG1vbi5jCkBAIC05OSw3ICs5OSw3IEBACiBzdGF0aWMgdm9pZCBpbnNlcnRfYnB0cyh2b2lkKTsKIHN0YXRpYyBzdHJ1Y3QgYnB0ICphdF9icmVha3BvaW50KHVuc2lnbmVkIHBjKTsKIHN0YXRpYyB2b2lkIGJwdF9jbWRzKHZvaWQpOwotc3RhdGljIHZvaWQgY2FjaGVmbHVzaCh2b2lkKTsKK3ZvaWQgY2FjaGVmbHVzaCh2b2lkKTsKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBjcHVfY21kKHZvaWQpOwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvYmluZm10X2VsZjMyLmMgYi9hcmNoL3MzOTAva2VybmVsL2JpbmZtdF9lbGYzMi5jCmluZGV4IDAzYmE1ODkuLjFmNDUxYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvYmluZm10X2VsZjMyLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9iaW5mbXRfZWxmMzIuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGR1bXBfdGFza19yZWdzMzIoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGVsZl9ncmVnc2V0X3QgKnJlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnB0cmVncyA9IF9fS1NUS19QVFJFR1ModHNrKTsKKwlzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzID0gdGFza19wdF9yZWdzKHRzayk7CiAJaW50IGk7CiAKIAltZW1jcHkoJnJlZ3MtPnBzdy5tYXNrLCAmcHRyZWdzLT5wc3cubWFzaywgNCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDdkZDU4ZjguLjJmZjkwYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAKLSAgICAgICAgcHJpbnRrKCJDUFU6ICAgICVkICAgICVzXG4iLCB0c2stPnRocmVhZF9pbmZvLT5jcHUsIHByaW50X3RhaW50ZWQoKSk7CisgICAgICAgIHByaW50aygiQ1BVOiAgICAlZCAgICAlc1xuIiwgdGFza190aHJlYWRfaW5mbyh0c2spLT5jcHUsIHByaW50X3RhaW50ZWQoKSk7CiAgICAgICAgIHByaW50aygiUHJvY2VzcyAlcyAocGlkOiAlZCwgdGFzazogJXAsIGtzcDogJXApXG4iLAogCSAgICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsICh2b2lkICopIHRzaywKIAkgICAgICAgKHZvaWQgKikgdHNrLT50aHJlYWQua3NwKTsKQEAgLTIxNyw4ICsyMTcsNyBAQAogICAgICAgICAgICAgc3RydWN0IHB0X3JlZ3MgY2hpbGRyZWdzOwogICAgICAgICAgIH0gKmZyYW1lOwogCi0gICAgICAgIGZyYW1lID0gKChzdHJ1Y3QgZmFrZV9mcmFtZSAqKQotCQkgKFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvKSkgLSAxOworICAgICAgICBmcmFtZSA9IGNvbnRhaW5lcl9vZih0YXNrX3B0X3JlZ3MocCksIHN0cnVjdCBmYWtlX2ZyYW1lLCBjaGlsZHJlZ3MpOwogICAgICAgICBwLT50aHJlYWQua3NwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOwogCS8qIFN0b3JlIGFjY2VzcyByZWdpc3RlcnMgdG8ga2VybmVsIHN0YWNrIG9mIG5ldyBwcm9jZXNzLiAqLwogICAgICAgICBmcmFtZS0+Y2hpbGRyZWdzID0gKnJlZ3M7CkBAIC0zNTgsMTEgKzM1NywxMCBAQAogCXVuc2lnbmVkIGxvbmcgcmV0dXJuX2FkZHJlc3M7CiAJaW50IGNvdW50OwogCi0JaWYgKCFwIHx8IHAgPT0gY3VycmVudCB8fCBwLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcgfHwgIXAtPnRocmVhZF9pbmZvKQorCWlmICghcCB8fCBwID09IGN1cnJlbnQgfHwgcC0+c3RhdGUgPT0gVEFTS19SVU5OSU5HIHx8ICF0YXNrX3N0YWNrX3BhZ2UocCkpCiAJCXJldHVybiAwOwotCWxvdyA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKikgcC0+dGhyZWFkX2luZm87Ci0JaGlnaCA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKikKLQkJKCh1bnNpZ25lZCBsb25nKSBwLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFKSAtIDE7CisJbG93ID0gdGFza19zdGFja19wYWdlKHApOworCWhpZ2ggPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopIHRhc2tfcHRfcmVncyhwKTsKIAlzZiA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKikgKHAtPnRocmVhZC5rc3AgJiBQU1dfQUREUl9JTlNOKTsKIAlpZiAoc2YgPD0gbG93IHx8IHNmID4gaGlnaCkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYwppbmRleCBjYzAyMjMyLi4zN2RmZTMzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKIAlwZXJfc3RydWN0ICpwZXJfaW5mbzsKIAotCXJlZ3MgPSBfX0tTVEtfUFRSRUdTKHRhc2spOworCXJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CiAJcGVyX2luZm8gPSAocGVyX3N0cnVjdCAqKSAmdGFzay0+dGhyZWFkLnBlcl9pbmZvOwogCXBlcl9pbmZvLT5jb250cm9sX3JlZ3MuYml0cy5lbV9pbnN0cnVjdGlvbl9mZXRjaCA9CiAJCXBlcl9pbmZvLT5zaW5nbGVfc3RlcCB8IHBlcl9pbmZvLT5pbnN0cnVjdGlvbl9mZXRjaDsKQEAgLTE1MCw3ICsxNTAsNyBAQAogCQkvKgogCQkgKiBwc3cgYW5kIGdwcnMgYXJlIHN0b3JlZCBvbiB0aGUgc3RhY2sKIAkJICovCi0JCXRtcCA9ICooYWRkcl90ICopKChhZGRyX3QpICZfX0tTVEtfUFRSRUdTKGNoaWxkKS0+cHN3ICsgYWRkcik7CisJCXRtcCA9ICooYWRkcl90ICopKChhZGRyX3QpICZ0YXNrX3B0X3JlZ3MoY2hpbGQpLT5wc3cgKyBhZGRyKTsKIAkJaWYgKGFkZHIgPT0gKGFkZHJfdCkgJmR1bW15LT5yZWdzLnBzdy5tYXNrKQogCQkJLyogUmVtb3ZlIHBlciBiaXQgZnJvbSB1c2VyIHBzdy4gKi8KIAkJCXRtcCAmPSB+UFNXX01BU0tfUEVSOwpAQCAtMTc2LDcgKzE3Niw3IEBACiAJCS8qCiAJCSAqIG9yaWdfZ3ByMiBpcyBzdG9yZWQgb24gdGhlIGtlcm5lbCBzdGFjawogCQkgKi8KLQkJdG1wID0gKGFkZHJfdCkgX19LU1RLX1BUUkVHUyhjaGlsZCktPm9yaWdfZ3ByMjsKKwkJdG1wID0gKGFkZHJfdCkgdGFza19wdF9yZWdzKGNoaWxkKS0+b3JpZ19ncHIyOwogCiAJfSBlbHNlIGlmIChhZGRyIDwgKGFkZHJfdCkgKCZkdW1teS0+cmVncy5mcF9yZWdzICsgMSkpIHsKIAkJLyogCkBAIC0yNDMsNyArMjQzLDcgQEAKIAkJCSAgIGhpZ2ggb3JkZXIgYml0IGJ1dCBvbGRlciBnZGIncyByZWx5IG9uIGl0ICovCiAJCQlkYXRhIHw9IFBTV19BRERSX0FNT0RFOwogI2VuZGlmCi0JCSooYWRkcl90ICopKChhZGRyX3QpICZfX0tTVEtfUFRSRUdTKGNoaWxkKS0+cHN3ICsgYWRkcikgPSBkYXRhOworCQkqKGFkZHJfdCAqKSgoYWRkcl90KSAmdGFza19wdF9yZWdzKGNoaWxkKS0+cHN3ICsgYWRkcikgPSBkYXRhOwogCiAJfSBlbHNlIGlmIChhZGRyIDwgKGFkZHJfdCkgKCZkdW1teS0+cmVncy5vcmlnX2dwcjIpKSB7CiAJCS8qCkBAIC0yNjcsNyArMjY3LDcgQEAKIAkJLyoKIAkJICogb3JpZ19ncHIyIGlzIHN0b3JlZCBvbiB0aGUga2VybmVsIHN0YWNrCiAJCSAqLwotCQlfX0tTVEtfUFRSRUdTKGNoaWxkKS0+b3JpZ19ncHIyID0gZGF0YTsKKwkJdGFza19wdF9yZWdzKGNoaWxkKS0+b3JpZ19ncHIyID0gZGF0YTsKIAogCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXktPnJlZ3MuZnBfcmVncyArIDEpKSB7CiAJCS8qCkBAIC0zOTMsMTUgKzM5MywxNSBAQAogCQkgKi8KIAkJaWYgKGFkZHIgPT0gKGFkZHJfdCkgJmR1bW15MzItPnJlZ3MucHN3Lm1hc2spIHsKIAkJCS8qIEZha2UgYSAzMSBiaXQgcHN3IG1hc2suICovCi0JCQl0bXAgPSAoX191MzIpKF9fS1NUS19QVFJFR1MoY2hpbGQpLT5wc3cubWFzayA+PiAzMik7CisJCQl0bXAgPSAoX191MzIpKHRhc2tfcHRfcmVncyhjaGlsZCktPnBzdy5tYXNrID4+IDMyKTsKIAkJCXRtcCA9IFBTVzMyX01BU0tfTUVSR0UoUFNXMzJfVVNFUl9CSVRTLCB0bXApOwogCQl9IGVsc2UgaWYgKGFkZHIgPT0gKGFkZHJfdCkgJmR1bW15MzItPnJlZ3MucHN3LmFkZHIpIHsKIAkJCS8qIEZha2UgYSAzMSBiaXQgcHN3IGFkZHJlc3MuICovCi0JCQl0bXAgPSAoX191MzIpIF9fS1NUS19QVFJFR1MoY2hpbGQpLT5wc3cuYWRkciB8CisJCQl0bXAgPSAoX191MzIpIHRhc2tfcHRfcmVncyhjaGlsZCktPnBzdy5hZGRyIHwKIAkJCQlQU1czMl9BRERSX0FNT0RFMzE7CiAJCX0gZWxzZSB7CiAJCQkvKiBncHIgMC0xNSAqLwotCQkJdG1wID0gKihfX3UzMiAqKSgoYWRkcl90KSAmX19LU1RLX1BUUkVHUyhjaGlsZCktPnBzdyArCisJCQl0bXAgPSAqKF9fdTMyICopKChhZGRyX3QpICZ0YXNrX3B0X3JlZ3MoY2hpbGQpLT5wc3cgKwogCQkJCQkgYWRkcioyICsgNCk7CiAJCX0KIAl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAoJmR1bW15MzItPnJlZ3Mub3JpZ19ncHIyKSkgewpAQCAtNDE1LDcgKzQxNSw3IEBACiAJCS8qCiAJCSAqIG9yaWdfZ3ByMiBpcyBzdG9yZWQgb24gdGhlIGtlcm5lbCBzdGFjawogCQkgKi8KLQkJdG1wID0gKihfX3UzMiopKChhZGRyX3QpICZfX0tTVEtfUFRSRUdTKGNoaWxkKS0+b3JpZ19ncHIyICsgNCk7CisJCXRtcCA9ICooX191MzIqKSgoYWRkcl90KSAmdGFza19wdF9yZWdzKGNoaWxkKS0+b3JpZ19ncHIyICsgNCk7CiAKIAl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAoJmR1bW15MzItPnJlZ3MuZnBfcmVncyArIDEpKSB7CiAJCS8qCkBAIC00NzIsMTUgKzQ3MiwxNSBAQAogCQkJaWYgKHRtcCAhPSBQU1czMl9NQVNLX01FUkdFKFBTVzMyX1VTRVJfQklUUywgdG1wKSkKIAkJCQkvKiBJbnZhbGlkIHBzdyBtYXNrLiAqLwogCQkJCXJldHVybiAtRUlOVkFMOwotCQkJX19LU1RLX1BUUkVHUyhjaGlsZCktPnBzdy5tYXNrID0KKwkJCXRhc2tfcHRfcmVncyhjaGlsZCktPnBzdy5tYXNrID0KIAkJCQlQU1dfTUFTS19NRVJHRShQU1dfVVNFUjMyX0JJVFMsIChfX3U2NCkgdG1wIDw8IDMyKTsKIAkJfSBlbHNlIGlmIChhZGRyID09IChhZGRyX3QpICZkdW1teTMyLT5yZWdzLnBzdy5hZGRyKSB7CiAJCQkvKiBCdWlsZCBhIDY0IGJpdCBwc3cgYWRkcmVzcyBmcm9tIDMxIGJpdCBhZGRyZXNzLiAqLwotCQkJX19LU1RLX1BUUkVHUyhjaGlsZCktPnBzdy5hZGRyID0gCisJCQl0YXNrX3B0X3JlZ3MoY2hpbGQpLT5wc3cuYWRkciA9CiAJCQkJKF9fdTY0KSB0bXAgJiBQU1czMl9BRERSX0lOU047CiAJCX0gZWxzZSB7CiAJCQkvKiBncHIgMC0xNSAqLwotCQkJKihfX3UzMiopKChhZGRyX3QpICZfX0tTVEtfUFRSRUdTKGNoaWxkKS0+cHN3CisJCQkqKF9fdTMyKikoKGFkZHJfdCkgJnRhc2tfcHRfcmVncyhjaGlsZCktPnBzdwogCQkJCSAgKyBhZGRyKjIgKyA0KSA9IHRtcDsKIAkJfQogCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXkzMi0+cmVncy5vcmlnX2dwcjIpKSB7CkBAIC00OTQsNyArNDk0LDcgQEAKIAkJLyoKIAkJICogb3JpZ19ncHIyIGlzIHN0b3JlZCBvbiB0aGUga2VybmVsIHN0YWNrCiAJCSAqLwotCQkqKF9fdTMyKikoKGFkZHJfdCkgJl9fS1NUS19QVFJFR1MoY2hpbGQpLT5vcmlnX2dwcjIgKyA0KSA9IHRtcDsKKwkJKihfX3UzMiopKChhZGRyX3QpICZ0YXNrX3B0X3JlZ3MoY2hpbGQpLT5vcmlnX2dwcjIgKyA0KSA9IHRtcDsKIAogCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXkzMi0+cmVncy5mcF9yZWdzICsgMSkpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc21wLmMgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCmluZGV4IGUxMGY0Y2EuLmNiZmNmZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwpAQCAtNjU3LDcgKzY1Nyw3IEBACiAJaWRsZSA9IGN1cnJlbnRfc2V0W2NwdV07CiAgICAgICAgIGNwdV9sb3djb3JlID0gbG93Y29yZV9wdHJbY3B1XTsKIAljcHVfbG93Y29yZS0+a2VybmVsX3N0YWNrID0gKHVuc2lnbmVkIGxvbmcpCi0JCWlkbGUtPnRocmVhZF9pbmZvICsgKFRIUkVBRF9TSVpFKTsKKwkJdGFza19zdGFja19wYWdlKGlkbGUpICsgKFRIUkVBRF9TSVpFKTsKIAlzZiA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKikgKGNwdV9sb3djb3JlLT5rZXJuZWxfc3RhY2sKIAkJCQkgICAgIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKQogCQkJCSAgICAgLSBzaXplb2Yoc3RydWN0IHN0YWNrX2ZyYW1lKSk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3RpbWUuYyBiL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCmluZGV4IGMzNjM1M2UuLmIwZDhjYTggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCkBAIC0yODIsNyArMjgyLDcgQEAKIHsKIAlpZiAoIWNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIG5vaHpfY3B1X21hc2spKQogCQlyZXR1cm47Ci0JYWNjb3VudF90aWNrcyhfX0tTVEtfUFRSRUdTKGN1cnJlbnQpKTsKKwlhY2NvdW50X3RpY2tzKHRhc2tfcHRfcmVncyhjdXJyZW50KSk7CiAJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgbm9oel9jcHVfbWFzayk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwppbmRleCA5NWQxMDk5Li41ZDIxZTllIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCkBAIC0xMzYsOCArMTM2LDggQEAKIAlzcCA9IF9fc2hvd190cmFjZShzcCwgUzM5MF9sb3djb3JlLmFzeW5jX3N0YWNrIC0gQVNZTkNfU0laRSwKIAkJCSAgUzM5MF9sb3djb3JlLmFzeW5jX3N0YWNrKTsKIAlpZiAodGFzaykKLQkJX19zaG93X3RyYWNlKHNwLCAodW5zaWduZWQgbG9uZykgdGFzay0+dGhyZWFkX2luZm8sCi0JCQkgICAgICh1bnNpZ25lZCBsb25nKSB0YXNrLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFKTsKKwkJX19zaG93X3RyYWNlKHNwLCAodW5zaWduZWQgbG9uZykgdGFza19zdGFja19wYWdlKHRhc2spLAorCQkJICAgICAodW5zaWduZWQgbG9uZykgdGFza19zdGFja19wYWdlKHRhc2spICsgVEhSRUFEX1NJWkUpOwogCWVsc2UKIAkJX19zaG93X3RyYWNlKHNwLCBTMzkwX2xvd2NvcmUudGhyZWFkX2luZm8sCiAJCQkgICAgIFMzOTBfbG93Y29yZS50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFKTsKQEAgLTI0MCw3ICsyNDAsNyBAQAogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzOwogCi0JcmVncyA9IF9fS1NUS19QVFJFR1ModGFzayk7CisJcmVncyA9IHRhc2tfcHRfcmVncyh0YXNrKTsKIAlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICJ0YXNrOiAlcCwga3NwOiAlcFxuIiwKIAkJICAgICAgIHRhc2ssICh2b2lkICopdGFzay0+dGhyZWFkLmtzcCk7CiAJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiVXNlciBQU1cgOiAlcCAlcFxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9idXMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9idXMuYwppbmRleCBkNGZlZTJhNy4uMzI3OGQyMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2J1cy5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9idXMuYwpAQCAtNTMsMjEgKzUzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2Ugc2hfYnVzX2RldmljZXNbU0hfTlJfQlVTRVNdID0gewotCXsKLQkJLmJ1c19pZAkJPSBTSF9CVVNfTkFNRV9WSVJULAotCX0sCi19OwotCi1zdHJ1Y3QgYnVzX3R5cGUgc2hfYnVzX3R5cGVzW1NIX05SX0JVU0VTXSA9IHsKLQl7Ci0JCS5uYW1lCQk9IFNIX0JVU19OQU1FX1ZJUlQsCi0JCS5tYXRjaAkJPSBzaF9idXNfbWF0Y2gsCi0JCS5zdXNwZW5kCT0gc2hfYnVzX3N1c3BlbmQsCi0JCS5yZXN1bWUJCT0gc2hfYnVzX3Jlc3VtZSwKLQl9LAotfTsKLQogc3RhdGljIGludCBzaF9kZXZpY2VfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBzaF9kZXYgKnNoZGV2ID0gdG9fc2hfZGV2KGRldik7CkBAIC05MCw2ICs3NSwyMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGRldmljZSBzaF9idXNfZGV2aWNlc1tTSF9OUl9CVVNFU10gPSB7CisJeworCQkuYnVzX2lkCQk9IFNIX0JVU19OQU1FX1ZJUlQsCisJfSwKK307CisKK3N0cnVjdCBidXNfdHlwZSBzaF9idXNfdHlwZXNbU0hfTlJfQlVTRVNdID0geworCXsKKwkJLm5hbWUJCT0gU0hfQlVTX05BTUVfVklSVCwKKwkJLm1hdGNoCQk9IHNoX2J1c19tYXRjaCwKKwkJLnByb2JlCQk9IHNoX2J1c19wcm9iZSwKKwkJLnJlbW92ZQkJPSBzaF9idXNfcmVtb3ZlLAorCQkuc3VzcGVuZAk9IHNoX2J1c19zdXNwZW5kLAorCQkucmVzdW1lCQk9IHNoX2J1c19yZXN1bWUsCisJfSwKK307CisKIGludCBzaF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHNoX2RldiAqZGV2KQogewogCWlmICghZGV2KQpAQCAtMTMzLDggKzEzNSw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRydi0+ZHJ2LnByb2JlICA9IHNoX2RldmljZV9wcm9iZTsKLQlkcnYtPmRydi5yZW1vdmUgPSBzaF9kZXZpY2VfcmVtb3ZlOwogCWRydi0+ZHJ2LmJ1cyAgICA9ICZzaF9idXNfdHlwZXNbZHJ2LT5idXNfaWRdOwogCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcnYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDhhMmJlYTMuLmFhYzE1ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE5MSwxMyArMTkxLDggQEAKIHsKICNpZiBkZWZpbmVkKENPTkZJR19TSF9GUFUpCiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopCi0JCQkJKCh1bnNpZ25lZCBsb25nKXRzay0+dGhyZWFkX2luZm8KLQkJCQkgKyBUSFJFQURfU0laRSAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykKLQkJCQkgLSBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCiAJLyogRm9yZ2V0IGxhenkgRlBVIHN0YXRlICovCi0JY2xlYXJfZnB1KHRzaywgcmVncyk7CisJY2xlYXJfZnB1KHRzaywgdGFza19wdF9yZWdzKHRzaykpOwogCWNsZWFyX3VzZWRfbWF0aCgpOwogI2VuZGlmCiB9CkBAIC0yMzIsMTMgKzIyNyw3IEBACiB7CiAJc3RydWN0IHB0X3JlZ3MgcHRyZWdzOwogCQotCXB0cmVncyA9ICooc3RydWN0IHB0X3JlZ3MgKikKLQkJKCh1bnNpZ25lZCBsb25nKXRzay0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRQotCQkgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpCi0jaWZkZWYgQ09ORklHX1NIX0RTUAotCQkgLSBzaXplb2Yoc3RydWN0IHB0X2RzcHJlZ3MpCi0jZW5kaWYKLQkJIC0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlwdHJlZ3MgPSAqdGFza19wdF9yZWdzKHRzayk7CiAJZWxmX2NvcmVfY29weV9yZWdzKHJlZ3MsICZwdHJlZ3MpOwogCiAJcmV0dXJuIDE7CkBAIC0yNTIsMTEgKzI0MSw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU0hfRlBVKQogCWZwdmFsaWQgPSAhIXRza191c2VkX21hdGgodHNrKTsKIAlpZiAoZnB2YWxpZCkgewotCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKQotCQkJCQkoKHVuc2lnbmVkIGxvbmcpdHNrLT50aHJlYWRfaW5mbwotCQkJCQkgKyBUSFJFQURfU0laRSAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykKLQkJCQkJIC0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQkJdW5sYXp5X2ZwdSh0c2ssIHJlZ3MpOworCQl1bmxhenlfZnB1KHRzaywgdGFza19wdF9yZWdzKHRzaykpOwogCQltZW1jcHkoZnB1LCAmdHNrLT50aHJlYWQuZnB1LmhhcmQsIHNpemVvZigqZnB1KSk7CiAJfQogI2VuZGlmCkBAIC0yNzksMTggKzI2NCwxMyBAQAogCWNvcHlfdG9fc3RvcHBlZF9jaGlsZF91c2VkX21hdGgocCk7CiAjZW5kaWYKIAotCWNoaWxkcmVncyA9ICgoc3RydWN0IHB0X3JlZ3MgKikKLQkJKFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvKQotI2lmZGVmIENPTkZJR19TSF9EU1AKLQkJLSBzaXplb2Yoc3RydWN0IHB0X2RzcHJlZ3MpCi0jZW5kaWYKLQkJLSBzaXplb2YodW5zaWduZWQgbG9uZykpIC0gMTsKKwljaGlsZHJlZ3MgPSB0YXNrX3B0X3JlZ3MocCk7CiAJKmNoaWxkcmVncyA9ICpyZWdzOwogCiAJaWYgKHVzZXJfbW9kZShyZWdzKSkgewogCQljaGlsZHJlZ3MtPnJlZ3NbMTVdID0gdXNwOwogCX0gZWxzZSB7Ci0JCWNoaWxkcmVncy0+cmVnc1sxNV0gPSAodW5zaWduZWQgbG9uZylwLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFOworCQljaGlsZHJlZ3MtPnJlZ3NbMTVdID0gKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHApICsgVEhSRUFEX1NJWkU7CiAJfQogICAgICAgICBpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TRVRUTFMpIHsKIAkJY2hpbGRyZWdzLT5nYnIgPSBjaGlsZHJlZ3MtPnJlZ3NbMF07CkBAIC0zMzMsMTEgKzMxMyw3IEBACiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQogewogI2lmIGRlZmluZWQoQ09ORklHX1NIX0ZQVSkKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKQotCQkJCSgodW5zaWduZWQgbG9uZylwcmV2LT50aHJlYWRfaW5mbwotCQkJCSArIFRIUkVBRF9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKQotCQkJCSAtIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JdW5sYXp5X2ZwdShwcmV2LCByZWdzKTsKKwl1bmxhenlfZnB1KHByZXYsIHRhc2tfcHRfcmVncyhwcmV2KSk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUkVFTVBUCkBAIC0zNDYsMTMgKzMyMiw3IEBACiAJCXN0cnVjdCBwdF9yZWdzICpyZWdzOwogCiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKQotCQkJKCh1bnNpZ25lZCBsb25nKXByZXYtPnRocmVhZF9pbmZvCi0JCQkgKyBUSFJFQURfU0laRSAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykKLSNpZmRlZiBDT05GSUdfU0hfRFNQCi0JCQkgLSBzaXplb2Yoc3RydWN0IHB0X2RzcHJlZ3MpCi0jZW5kaWYKLQkJCSAtIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCXJlZ3MgPSB0YXNrX3B0X3JlZ3MocHJldik7CiAJCWlmICh1c2VyX21vZGUocmVncykgJiYgcmVncy0+cmVnc1sxNV0gPj0gMHhjMDAwMDAwMCkgewogCQkJaW50IG9mZnNldCA9IChpbnQpcmVncy0+cmVnc1sxNV07CiAKQEAgLTM3Miw3ICszNDIsNyBAQAogCSAqLwogCWFzbSB2b2xhdGlsZSgibGRjCSUwLCByN19iYW5rIgogCQkgICAgIDogLyogbm8gb3V0cHV0ICovCi0JCSAgICAgOiAiciIgKG5leHQtPnRocmVhZF9pbmZvKSk7CisJCSAgICAgOiAiciIgKHRhc2tfdGhyZWFkX2luZm8obmV4dCkpKTsKIAogI2lmZGVmIENPTkZJR19NTVUKIAkvKiBJZiBubyB0YXNrcyBhcmUgdXNpbmcgdGhlIFVCQywgd2UncmUgZG9uZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3NoL2tlcm5lbC9wdHJhY2UuYwppbmRleCAxYThiZTA2Li4zODg3YjRmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3NoL2tlcm5lbC9wdHJhY2UuYwpAQCAtNDEsMTIgKzQxLDcgQEAKIHsKIAl1bnNpZ25lZCBjaGFyICpzdGFjazsKIAotCXN0YWNrID0gKHVuc2lnbmVkIGNoYXIgKikKLQkJdGFzay0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRQktIHNpemVvZihzdHJ1Y3QgcHRfcmVncykKLSNpZmRlZiBDT05GSUdfU0hfRFNQCi0JCS0gc2l6ZW9mKHN0cnVjdCBwdF9kc3ByZWdzKQotI2VuZGlmCi0JCS0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCXN0YWNrID0gKHVuc2lnbmVkIGNoYXIgKil0YXNrX3B0X3JlZ3ModGFzayk7CiAJc3RhY2sgKz0gb2Zmc2V0OwogCXJldHVybiAoKigoaW50ICopc3RhY2spKTsKIH0KQEAgLTU5LDEyICs1NCw3IEBACiB7CiAJdW5zaWduZWQgY2hhciAqc3RhY2s7CiAKLQlzdGFjayA9ICh1bnNpZ25lZCBjaGFyICopCi0JCXRhc2stPnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkUgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpCi0jaWZkZWYgQ09ORklHX1NIX0RTUAotCQktIHNpemVvZihzdHJ1Y3QgcHRfZHNwcmVncykKLSNlbmRpZgotCQktIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwlzdGFjayA9ICh1bnNpZ25lZCBjaGFyICopdGFza19wdF9yZWdzKHRhc2spOwogCXN0YWNrICs9IG9mZnNldDsKIAkqKHVuc2lnbmVkIGxvbmcgKikgc3RhY2sgPSBkYXRhOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc21wLmMgYi9hcmNoL3NoL2tlcm5lbC9zbXAuYwppbmRleCA1OWU0OWIxLi42MmM3ZDFjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zbXAuYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJaWYgKElTX0VSUih0c2spKQogCQlwYW5pYygiRmFpbGVkIGZvcmtpbmcgaWRsZSB0YXNrIGZvciBjcHUgJWRcbiIsIGNwdSk7CiAJCi0JdHNrLT50aHJlYWRfaW5mby0+Y3B1ID0gY3B1OworCXRhc2tfdGhyZWFkX2luZm8odHNrKS0+Y3B1ID0gY3B1OwogCiAJY3B1X3NldChjcHUsIGNwdV9vbmxpbmVfbWFwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NoNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCA0MTliNWE3Li4xZGE5YzYxIDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NoNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtNzQ0LDcgKzc0NCw3IEBACiAJfQogI2VuZGlmCiAJLyogQ29weSBmcm9tIHNoIHZlcnNpb24gKi8KLQljaGlsZHJlZ3MgPSAoKHN0cnVjdCBwdF9yZWdzICopKFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvICkpIC0gMTsKKwljaGlsZHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikoVEhSRUFEX1NJWkUgKyB0YXNrX3N0YWNrX3BhZ2UocCkpIC0gMTsKIAogCSpjaGlsZHJlZ3MgPSAqcmVnczsKIApAQCAtNzUyLDcgKzc1Miw3IEBACiAJCWNoaWxkcmVncy0+cmVnc1sxNV0gPSB1c3A7CiAJCXAtPnRocmVhZC51cmVncyA9IGNoaWxkcmVnczsKIAl9IGVsc2UgewotCQljaGlsZHJlZ3MtPnJlZ3NbMTVdID0gKHVuc2lnbmVkIGxvbmcpcC0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRTsKKwkJY2hpbGRyZWdzLT5yZWdzWzE1XSA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKSArIFRIUkVBRF9TSVpFOwogCX0KIAogCWNoaWxkcmVncy0+cmVnc1s5XSA9IDA7IC8qIFNldCByZXR1cm4gdmFsdWUgZm9yIGNoaWxkICovCmRpZmYgLS1naXQgYS9hcmNoL3NoNjQvbGliL2RiZy5jIGIvYXJjaC9zaDY0L2xpYi9kYmcuYwppbmRleCA1MjZmZWRhLi41ODA4NzMzIDEwMDY0NAotLS0gYS9hcmNoL3NoNjQvbGliL2RiZy5jCisrKyBiL2FyY2gvc2g2NC9saWIvZGJnLmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCXN0cnVjdCByaW5nX25vZGUgKnJyOwogCiAJcGlkID0gY3VycmVudC0+cGlkOwotCXN0YWNrX2JvdHRvbSA9ICh1bnNpZ25lZCBsb25nKSBjdXJyZW50LT50aHJlYWRfaW5mbzsKKwlzdGFja19ib3R0b20gPSAodW5zaWduZWQgbG9uZykgdGFza19zdGFja19wYWdlKGN1cnJlbnQpOwogCWFzbSB2b2xhdGlsZSgib3JpIHIxNSwgMCwgJTAiIDogIj1yIiAoc3ApKTsKIAlyciA9IGV2ZW50X3JpbmcgKyBldmVudF9wdHI7CiAJcnItPmV2dCA9IGV2dDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3MuYwppbmRleCBlYTg2NDc0Li5mYmIwNWE0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zMDIsNyArMzAyLDcgQEAKIAlpbnQgY291bnQgPSAwOwogCiAJaWYgKHRzayAhPSBOVUxMKQotCQl0YXNrX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgdHNrLT50aHJlYWRfaW5mbzsKKwkJdGFza19iYXNlID0gKHVuc2lnbmVkIGxvbmcpIHRhc2tfc3RhY2tfcGFnZSh0c2spOwogCWVsc2UKIAkJdGFza19iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKIApAQCAtMzM3LDcgKzMzNyw3IEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCXJldHVybiB0c2stPnRocmVhZF9pbmZvLT5rcGM7CisJcmV0dXJuIHRhc2tfdGhyZWFkX2luZm8odHNrKS0+a3BjOwogfQogCiAvKgpAQCAtMzkyLDcgKzM5Miw3IEBACiAJCS8qIFdlIG11c3QgZml4dXAga3JlZ3MgYXMgd2VsbC4gKi8KIAkJLyogWFhYIFRoaXMgd2FzIG5vdCBmaXhlZCBmb3IgdGkgZm9yIGEgd2hpbGUsIHdvcmtlZC4gVW51c2VkPyAqLwogCQljdXJyZW50LT50aHJlYWQua3JlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikKLQkJICAgICgoY2hhciAqKWN1cnJlbnQtPnRocmVhZF9pbmZvICsgKFRIUkVBRF9TSVpFIC0gVFJBQ0VSRUdfU1opKTsKKwkJICAgICh0YXNrX3N0YWNrX3BhZ2UoY3VycmVudCkgKyAoVEhSRUFEX1NJWkUgLSBUUkFDRVJFR19TWikpOwogCX0KIH0KIApAQCAtNDU5LDcgKzQ1OSw3IEBACiAJCXVuc2lnbmVkIGxvbmcgdW51c2VkLAogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBwLT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gdGFza190aHJlYWRfaW5mbyhwKTsKIAlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRyZWdzOwogCWNoYXIgKm5ld19zdGFjazsKIApAQCAtNDgyLDcgKzQ4Miw3IEBACiAJICogIFYgICAgICAgICAgICAgICAgICAgICAgViAoc3RrLmZyLikgViAgKHB0X3JlZ3MpICB7IChzdGsuZnIuKSB9CiAJICogICstLS0tLSAtIC0gLSAtIC0gLS0tLS0tKz09PT09PT09PT09Kz09PT09PT09PT09PT17Kz09PT09PT09PT19KwogCSAqLwotCW5ld19zdGFjayA9IChjaGFyKil0aSArIFRIUkVBRF9TSVpFOworCW5ld19zdGFjayA9IHRhc2tfc3RhY2tfcGFnZShwKSArIFRIUkVBRF9TSVpFOwogCWlmIChyZWdzLT5wc3IgJiBQU1JfUFMpCiAJCW5ld19zdGFjayAtPSBTVEFDS0ZSQU1FX1NaOwogCW5ld19zdGFjayAtPSBTVEFDS0ZSQU1FX1NaICsgVFJBQ0VSRUdfU1o7CkBAIC03MjQsNyArNzI0LDcgQEAKICAgICAgICAgICAgIHRhc2stPnN0YXRlID09IFRBU0tfUlVOTklORykKIAkJZ290byBvdXQ7CiAKLQlmcCA9IHRhc2stPnRocmVhZF9pbmZvLT5rc3AgKyBiaWFzOworCWZwID0gdGFza190aHJlYWRfaW5mbyh0YXNrKS0+a3NwICsgYmlhczsKIAlkbyB7CiAJCS8qIEJvZ3VzIGZyYW1lIHBvaW50ZXI/ICovCiAJCWlmIChmcCA8ICh0YXNrX2Jhc2UgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSkgfHwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggZmM0NzBjMC4uMWJhZjEzZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAkJCQkgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgbG9uZyBfX3VzZXIgKmFkZHIpCiB7CiAJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gdHNrLT50aHJlYWQua3JlZ3M7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0ID0gdHNrLT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnQgPSB0YXNrX3RocmVhZF9pbmZvKHRzayk7CiAJaW50IHY7CiAJCiAJaWYob2Zmc2V0ID49IDEwMjQpCkBAIC0xNzAsNyArMTcwLDcgQEAKIAkJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gdHNrLT50aHJlYWQua3JlZ3M7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0ID0gdHNrLT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnQgPSB0YXNrX3RocmVhZF9pbmZvKHRzayk7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZSA9IHJlZ3MtPnVfcmVnc1tVUkVHX0kzXTsKIAogCWlmKG9mZnNldCA+PSAxMDI0KQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGRfc21wLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9zbXAuYwppbmRleCBjYzFmYzg5Li40MGQ0MjZjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9zbXAuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9zbXAuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJCQkvKiBDb29rIHVwIGFuIGlkbGVyIGZvciB0aGlzIGd1eS4gKi8KIAkJCXAgPSBmb3JrX2lkbGUoaSk7CiAJCQljcHVjb3VudCsrOwotCQkJY3VycmVudF9zZXRbaV0gPSBwLT50aHJlYWRfaW5mbzsKKwkJCWN1cnJlbnRfc2V0W2ldID0gdGFza190aHJlYWRfaW5mbyhwKTsKIAkJCWZvciAobm8gPSAwOyAhY3B1X2ZpbmRfYnlfaW5zdGFuY2Uobm8sIE5VTEwsICZtaWQpCiAJCQkJICAgICAmJiBtaWQgIT0gaTsgbm8rKykgOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9zbXAuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N1bjRtX3NtcC5jCmluZGV4IGYxMTM0MjIuLmEyMWYyN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRtX3NtcC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N1bjRtX3NtcC5jCkBAIC0xNzMsNyArMTczLDcgQEAKIAkJCS8qIENvb2sgdXAgYW4gaWRsZXIgZm9yIHRoaXMgZ3V5LiAqLwogCQkJcCA9IGZvcmtfaWRsZShpKTsKIAkJCWNwdWNvdW50Kys7Ci0JCQljdXJyZW50X3NldFtpXSA9IHAtPnRocmVhZF9pbmZvOworCQkJY3VycmVudF9zZXRbaV0gPSB0YXNrX3RocmVhZF9pbmZvKHApOwogCQkJLyogU2VlIHRyYW1wb2xpbmUuUyBmb3IgZGV0YWlscy4uLiAqLwogCQkJZW50cnkgKz0gKChpLTEpICogMyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jCmluZGV4IDNmNDUxYWUuLjQxZDQ1YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHMuYwpAQCAtMjkxLDcgKzI5MSw3IEBACiAjaWZuZGVmIENPTkZJR19TTVAKIAlpZighZnB0KSB7CiAjZWxzZQotICAgICAgICBpZighKGZwdC0+dGhyZWFkX2luZm8tPmZsYWdzICYgX1RJRl9VU0VERlBVKSkgeworICAgICAgICBpZighKHRhc2tfdGhyZWFkX2luZm8oZnB0KS0+ZmxhZ3MgJiBfVElGX1VTRURGUFUpKSB7CiAjZW5kaWYKIAkJZnBzYXZlKCZmYWtlX3JlZ3NbMF0sICZmYWtlX2ZzciwgJmZha2VfcXVldWVbMF0sICZmYWtlX2RlcHRoKTsKIAkJcmVncy0+cHNyICY9IH5QU1JfRUY7CkBAIC0zMzQsNyArMzM0LDcgQEAKIAkvKiBub3BlLCBiZXR0ZXIgU0lHRlBFIHRoZSBvZmZlbmRpbmcgcHJvY2Vzcy4uLiAqLwogCSAgICAgICAKICNpZmRlZiBDT05GSUdfU01QCi0JZnB0LT50aHJlYWRfaW5mby0+ZmxhZ3MgJj0gfl9USUZfVVNFREZQVTsKKwl0YXNrX3RocmVhZF9pbmZvKGZwdCktPmZsYWdzICY9IH5fVElGX1VTRURGUFU7CiAjZW5kaWYKIAlpZihwc3IgJiBQU1JfUFMpIHsKIAkJLyogVGhlIGZpcnN0IGZzciBzdG9yZS9sb2FkIHdlIHRyaWVkIHRyYXBwZWQsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDAyZjlkZWMuLjFkYzM2NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zOTAsNyArMzkwLDcgQEAKIAogdW5zaWduZWQgbG9uZyB0aHJlYWRfc2F2ZWRfcGMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHRzay0+dGhyZWFkX2luZm87CisJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHRhc2tfdGhyZWFkX2luZm8odHNrKTsKIAl1bnNpZ25lZCBsb25nIHJldCA9IDB4ZGVhZGJlZWZVTDsKIAkKIAlpZiAodGkgJiYgdGktPmtzcCkgewpAQCAtNjE2LDExICs2MTYsMTEgQEAKIAkJdW5zaWduZWQgbG9uZyB1bnVzZWQsCiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0ID0gcC0+dGhyZWFkX2luZm87CisJc3RydWN0IHRocmVhZF9pbmZvICp0ID0gdGFza190aHJlYWRfaW5mbyhwKTsKIAljaGFyICpjaGlsZF90cmFwX2ZyYW1lOwogCiAJLyogQ2FsY3VsYXRlIG9mZnNldCB0byBzdGFja19mcmFtZSAmIHB0X3JlZ3MgKi8KLQljaGlsZF90cmFwX2ZyYW1lID0gKChjaGFyICopdCkgKyAoVEhSRUFEX1NJWkUgLSAoVFJBQ0VSRUdfU1orU1RBQ0tGUkFNRV9TWikpOworCWNoaWxkX3RyYXBfZnJhbWUgPSB0YXNrX3N0YWNrX3BhZ2UocCkgKyAoVEhSRUFEX1NJWkUgLSAoVFJBQ0VSRUdfU1orU1RBQ0tGUkFNRV9TWikpOwogCW1lbWNweShjaGlsZF90cmFwX2ZyYW1lLCAoKChzdHJ1Y3Qgc3BhcmNfc3RhY2tmICopcmVncyktMSksIChUUkFDRVJFR19TWitTVEFDS0ZSQU1FX1NaKSk7CiAKIAl0LT5mbGFncyA9ICh0LT5mbGFncyAmIH4oKDB4ZmZVTCA8PCBUSV9GTEFHX0NXUF9TSElGVCkgfCAoMHhmZlVMIDw8IFRJX0ZMQUdfQ1VSUkVOVF9EU19TSElGVCkpKSB8CkBAIC04NDUsOSArODQ1LDkgQEAKICAgICAgICAgICAgIHRhc2stPnN0YXRlID09IFRBU0tfUlVOTklORykKIAkJZ290byBvdXQ7CiAKLQl0aHJlYWRfaW5mb19iYXNlID0gKHVuc2lnbmVkIGxvbmcpIHRhc2stPnRocmVhZF9pbmZvOworCXRocmVhZF9pbmZvX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgdGFza19zdGFja19wYWdlKHRhc2spOwogCWJpYXMgPSBTVEFDS19CSUFTOwotCWZwID0gdGFzay0+dGhyZWFkX2luZm8tPmtzcCArIGJpYXM7CisJZnAgPSB0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5rc3AgKyBiaWFzOwogCiAJZG8gewogCQkvKiBCb2d1cyBmcmFtZSBwb2ludGVyPyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggODRkM2RmMi4uM2Y5NzQ2ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3B0cmFjZS5jCkBAIC0yOTYsNyArMjk2LDcgQEAKIAljYXNlIFBUUkFDRV9HRVRSRUdTOiB7CiAJCXN0cnVjdCBwdF9yZWdzMzIgX191c2VyICpwcmVncyA9CiAJCQkoc3RydWN0IHB0X3JlZ3MzMiBfX3VzZXIgKikgYWRkcjsKLQkJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gY2hpbGQtPnRocmVhZF9pbmZvLT5rcmVnczsKKwkJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAkJaW50IHJ2YWw7CiAKIAkJaWYgKF9fcHV0X3VzZXIodHN0YXRlX3RvX3BzcihjcmVncy0+dHN0YXRlKSwgKCZwcmVncy0+cHNyKSkgfHwKQEAgLTMyMCwxMSArMzIwLDExIEBACiAKIAljYXNlIFBUUkFDRV9HRVRSRUdTNjQ6IHsKIAkJc3RydWN0IHB0X3JlZ3MgX191c2VyICpwcmVncyA9IChzdHJ1Y3QgcHRfcmVncyBfX3VzZXIgKikgYWRkcjsKLQkJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gY2hpbGQtPnRocmVhZF9pbmZvLT5rcmVnczsKKwkJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAkJdW5zaWduZWQgbG9uZyB0cGMgPSBjcmVncy0+dHBjOwogCQlpbnQgcnZhbDsKIAotCQlpZiAoKGNoaWxkLT50aHJlYWRfaW5mby0+ZmxhZ3MgJiBfVElGXzMyQklUKSAhPSAwKQorCQlpZiAoKHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5mbGFncyAmIF9USUZfMzJCSVQpICE9IDApCiAJCQl0cGMgJj0gMHhmZmZmZmZmZjsKIAkJaWYgKF9fcHV0X3VzZXIoY3JlZ3MtPnRzdGF0ZSwgKCZwcmVncy0+dHN0YXRlKSkgfHwKIAkJICAgIF9fcHV0X3VzZXIodHBjLCAoJnByZWdzLT50cGMpKSB8fApAQCAtMzQ4LDcgKzM0OCw3IEBACiAJY2FzZSBQVFJBQ0VfU0VUUkVHUzogewogCQlzdHJ1Y3QgcHRfcmVnczMyIF9fdXNlciAqcHJlZ3MgPQogCQkJKHN0cnVjdCBwdF9yZWdzMzIgX191c2VyICopIGFkZHI7Ci0JCXN0cnVjdCBwdF9yZWdzICpjcmVncyA9IGNoaWxkLT50aHJlYWRfaW5mby0+a3JlZ3M7CisJCXN0cnVjdCBwdF9yZWdzICpjcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJCXVuc2lnbmVkIGludCBwc3IsIHBjLCBucGMsIHk7CiAJCWludCBpOwogCkBAIC0zODEsNyArMzgxLDcgQEAKIAogCWNhc2UgUFRSQUNFX1NFVFJFR1M2NDogewogCQlzdHJ1Y3QgcHRfcmVncyBfX3VzZXIgKnByZWdzID0gKHN0cnVjdCBwdF9yZWdzIF9fdXNlciAqKSBhZGRyOwotCQlzdHJ1Y3QgcHRfcmVncyAqY3JlZ3MgPSBjaGlsZC0+dGhyZWFkX2luZm8tPmtyZWdzOworCQlzdHJ1Y3QgcHRfcmVncyAqY3JlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCQl1bnNpZ25lZCBsb25nIHRzdGF0ZSwgdHBjLCB0bnBjLCB5OwogCQlpbnQgaTsKIApAQCAtMzk1LDcgKzM5NSw3IEBACiAJCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRUZBVUxUKTsKIAkJCWdvdG8gb3V0X3RzazsKIAkJfQotCQlpZiAoKGNoaWxkLT50aHJlYWRfaW5mby0+ZmxhZ3MgJiBfVElGXzMyQklUKSAhPSAwKSB7CisJCWlmICgodGFza190aHJlYWRfaW5mbyhjaGlsZCktPmZsYWdzICYgX1RJRl8zMkJJVCkgIT0gMCkgewogCQkJdHBjICY9IDB4ZmZmZmZmZmY7CiAJCQl0bnBjICY9IDB4ZmZmZmZmZmY7CiAJCX0KQEAgLTQzMCwxMSArNDMwLDExIEBACiAJCQl9IGZwcVsxNl07CiAJCX07CiAJCXN0cnVjdCBmcHMgX191c2VyICpmcHMgPSAoc3RydWN0IGZwcyBfX3VzZXIgKikgYWRkcjsKLQkJdW5zaWduZWQgbG9uZyAqZnByZWdzID0gY2hpbGQtPnRocmVhZF9pbmZvLT5mcHJlZ3M7CisJCXVuc2lnbmVkIGxvbmcgKmZwcmVncyA9IHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5mcHJlZ3M7CiAKIAkJaWYgKGNvcHlfdG9fdXNlcigmZnBzLT5yZWdzWzBdLCBmcHJlZ3MsCiAJCQkJICgzMiAqIHNpemVvZih1bnNpZ25lZCBpbnQpKSkgfHwKLQkJICAgIF9fcHV0X3VzZXIoY2hpbGQtPnRocmVhZF9pbmZvLT54ZnNyWzBdLCAoJmZwcy0+ZnNyKSkgfHwKKwkJICAgIF9fcHV0X3VzZXIodGFza190aHJlYWRfaW5mbyhjaGlsZCktPnhmc3JbMF0sICgmZnBzLT5mc3IpKSB8fAogCQkgICAgX19wdXRfdXNlcigwLCAoJmZwcy0+ZnBxZCkpIHx8CiAJCSAgICBfX3B1dF91c2VyKDAsICgmZnBzLT5mbGFncykpIHx8CiAJCSAgICBfX3B1dF91c2VyKDAsICgmZnBzLT5leHRyYSkpIHx8CkBAIC00NTIsMTEgKzQ1MiwxMSBAQAogCQkJdW5zaWduZWQgbG9uZyBmc3I7CiAJCX07CiAJCXN0cnVjdCBmcHMgX191c2VyICpmcHMgPSAoc3RydWN0IGZwcyBfX3VzZXIgKikgYWRkcjsKLQkJdW5zaWduZWQgbG9uZyAqZnByZWdzID0gY2hpbGQtPnRocmVhZF9pbmZvLT5mcHJlZ3M7CisJCXVuc2lnbmVkIGxvbmcgKmZwcmVncyA9IHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5mcHJlZ3M7CiAKIAkJaWYgKGNvcHlfdG9fdXNlcigmZnBzLT5yZWdzWzBdLCBmcHJlZ3MsCiAJCQkJICg2NCAqIHNpemVvZih1bnNpZ25lZCBpbnQpKSkgfHwKLQkJICAgIF9fcHV0X3VzZXIoY2hpbGQtPnRocmVhZF9pbmZvLT54ZnNyWzBdLCAoJmZwcy0+ZnNyKSkpIHsKKwkJICAgIF9fcHV0X3VzZXIodGFza190aHJlYWRfaW5mbyhjaGlsZCktPnhmc3JbMF0sICgmZnBzLT5mc3IpKSkgewogCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVGQVVMVCk7CiAJCQlnb3RvIG91dF90c2s7CiAJCX0KQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCQkJfSBmcHFbMTZdOwogCQl9OwogCQlzdHJ1Y3QgZnBzIF9fdXNlciAqZnBzID0gKHN0cnVjdCBmcHMgX191c2VyICopIGFkZHI7Ci0JCXVuc2lnbmVkIGxvbmcgKmZwcmVncyA9IGNoaWxkLT50aHJlYWRfaW5mby0+ZnByZWdzOworCQl1bnNpZ25lZCBsb25nICpmcHJlZ3MgPSB0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+ZnByZWdzOwogCQl1bnNpZ25lZCBmc3I7CiAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGZwcmVncywgJmZwcy0+cmVnc1swXSwKQEAgLTQ4NiwxMSArNDg2LDExIEBACiAJCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRUZBVUxUKTsKIAkJCWdvdG8gb3V0X3RzazsKIAkJfQotCQljaGlsZC0+dGhyZWFkX2luZm8tPnhmc3JbMF0gJj0gMHhmZmZmZmZmZjAwMDAwMDAwVUw7Ci0JCWNoaWxkLT50aHJlYWRfaW5mby0+eGZzclswXSB8PSBmc3I7Ci0JCWlmICghKGNoaWxkLT50aHJlYWRfaW5mby0+ZnBzYXZlZFswXSAmIEZQUlNfRkVGKSkKLQkJCWNoaWxkLT50aHJlYWRfaW5mby0+Z3NyWzBdID0gMDsKLQkJY2hpbGQtPnRocmVhZF9pbmZvLT5mcHNhdmVkWzBdIHw9IChGUFJTX0ZFRiB8IEZQUlNfREwpOworCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+eGZzclswXSAmPSAweGZmZmZmZmZmMDAwMDAwMDBVTDsKKwkJdGFza190aHJlYWRfaW5mbyhjaGlsZCktPnhmc3JbMF0gfD0gZnNyOworCQlpZiAoISh0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+ZnBzYXZlZFswXSAmIEZQUlNfRkVGKSkKKwkJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5nc3JbMF0gPSAwOworCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+ZnBzYXZlZFswXSB8PSAoRlBSU19GRUYgfCBGUFJTX0RMKTsKIAkJcHRfc3VjY19yZXR1cm4ocmVncywgMCk7CiAJCWdvdG8gb3V0X3RzazsKIAl9CkBAIC01MDEsMTcgKzUwMSwxNyBAQAogCQkJdW5zaWduZWQgbG9uZyBmc3I7CiAJCX07CiAJCXN0cnVjdCBmcHMgX191c2VyICpmcHMgPSAoc3RydWN0IGZwcyBfX3VzZXIgKikgYWRkcjsKLQkJdW5zaWduZWQgbG9uZyAqZnByZWdzID0gY2hpbGQtPnRocmVhZF9pbmZvLT5mcHJlZ3M7CisJCXVuc2lnbmVkIGxvbmcgKmZwcmVncyA9IHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5mcHJlZ3M7CiAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGZwcmVncywgJmZwcy0+cmVnc1swXSwKIAkJCQkgICAoNjQgKiBzaXplb2YodW5zaWduZWQgaW50KSkpIHx8Ci0JCSAgICBfX2dldF91c2VyKGNoaWxkLT50aHJlYWRfaW5mby0+eGZzclswXSwgKCZmcHMtPmZzcikpKSB7CisJCSAgICBfX2dldF91c2VyKHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT54ZnNyWzBdLCAoJmZwcy0+ZnNyKSkpIHsKIAkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFRkFVTFQpOwogCQkJZ290byBvdXRfdHNrOwogCQl9Ci0JCWlmICghKGNoaWxkLT50aHJlYWRfaW5mby0+ZnBzYXZlZFswXSAmIEZQUlNfRkVGKSkKLQkJCWNoaWxkLT50aHJlYWRfaW5mby0+Z3NyWzBdID0gMDsKLQkJY2hpbGQtPnRocmVhZF9pbmZvLT5mcHNhdmVkWzBdIHw9IChGUFJTX0ZFRiB8IEZQUlNfREwgfCBGUFJTX0RVKTsKKwkJaWYgKCEodGFza190aHJlYWRfaW5mbyhjaGlsZCktPmZwc2F2ZWRbMF0gJiBGUFJTX0ZFRikpCisJCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+Z3NyWzBdID0gMDsKKwkJdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmZwc2F2ZWRbMF0gfD0gKEZQUlNfRkVGIHwgRlBSU19ETCB8IEZQUlNfRFUpOwogCQlwdF9zdWNjX3JldHVybihyZWdzLCAwKTsKIAkJZ290byBvdXRfdHNrOwogCX0KQEAgLTU2Miw4ICs1NjIsOCBAQAogI2lmZGVmIERFQlVHX1BUUkFDRQogCQlwcmludGsoIkNPTlQ6ICVzIFslZF06IHNldCBleGl0X2NvZGUgPSAleCAlbHggJWx4XG4iLCBjaGlsZC0+Y29tbSwKIAkJCWNoaWxkLT5waWQsIGNoaWxkLT5leGl0X2NvZGUsCi0JCQljaGlsZC0+dGhyZWFkX2luZm8tPmtyZWdzLT50cGMsCi0JCQljaGlsZC0+dGhyZWFkX2luZm8tPmtyZWdzLT50bnBjKTsKKwkJCXRhc2tfcHRfcmVncyhjaGlsZCktPnRwYywKKwkJCXRhc2tfcHRfcmVncyhjaGlsZCktPnRucGMpOwogCQkgICAgICAgCiAjZW5kaWYKIAkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYwppbmRleCA0ODE4MDUzLi4yNTA3NDU4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCkBAIC01MjAsNyArNTIwLDcgQEAKIAlyZF9kb2xvYWQgPSAoKHJhbV9mbGFncyAmIFJBTURJU0tfTE9BRF9GTEFHKSAhPSAwKTsJCiAjZW5kaWYKIAotCWluaXRfdGFzay50aHJlYWRfaW5mby0+a3JlZ3MgPSAmZmFrZV9zd2FwcGVyX3JlZ3M7CisJdGFza190aHJlYWRfaW5mbygmaW5pdF90YXNrKS0+a3JlZ3MgPSAmZmFrZV9zd2FwcGVyX3JlZ3M7CiAKICNpZmRlZiBDT05GSUdfSVBfUE5QCiAJaWYgKCFpY19zZXRfbWFudWFsbHkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCmluZGV4IDZlZmMwM2RmLi4xZmI2MzIzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKQEAgLTMzNSw3ICszMzUsNyBAQAogCiAJcCA9IGZvcmtfaWRsZShjcHUpOwogCWNhbGxpbl9mbGFnID0gMDsKLQljcHVfbmV3X3RocmVhZCA9IHAtPnRocmVhZF9pbmZvOworCWNwdV9uZXdfdGhyZWFkID0gdGFza190aHJlYWRfaW5mbyhwKTsKIAljcHVfc2V0KGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsKIAogCWNwdV9maW5kX2J5X21pZChjcHUsICZjcHVfbm9kZSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKaW5kZXggNTU3MGU3Yi4uOGQ0NGFlNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYwpAQCAtMTgwOCw3ICsxODA4LDcgQEAKIHZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyAqX2tzcCkKIHsKIAl1bnNpZ25lZCBsb25nIHBjLCBmcCwgdGhyZWFkX2Jhc2UsIGtzcDsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRwID0gdHNrLT50aHJlYWRfaW5mbzsKKwl2b2lkICp0cCA9IHRhc2tfc3RhY2tfcGFnZSh0c2spOwogCXN0cnVjdCByZWdfd2luZG93ICpydzsKIAlpbnQgY291bnQgPSAwOwogCkBAIC0xODYyLDcgKzE4NjIsNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JdGhyZWFkX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgdGFzay0+dGhyZWFkX2luZm87CisJdGhyZWFkX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgdGFza19zdGFja19wYWdlKHRhc2spOwogCXRocmVhZF9lbmQgPSB0aHJlYWRfYmFzZSArIHNpemVvZih1bmlvbiB0aHJlYWRfdW5pb24pOwogCWlmIChyd19hZGRyID49IHRocmVhZF9iYXNlICYmCiAJICAgIHJ3X2FkZHIgPCB0aHJlYWRfZW5kICYmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3Nfa2Vybi5jCmluZGV4IGQyZDNmMjUuLjdmMTNiODUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3Nfa2Vybi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3Nfa2Vybi5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSB0OwogCi0JY3B1X3Rhc2tzW3Rhc2stPnRocmVhZF9pbmZvLT5jcHVdID0gKChzdHJ1Y3QgY3B1X3Rhc2spIAorCWNwdV90YXNrc1t0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5jcHVdID0gKChzdHJ1Y3QgY3B1X3Rhc2spCiAJCXsgZXh0ZXJuYWxfcGlkKHRhc2spLCB0YXNrIH0pOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3Nfa2Vybi5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzX2tlcm4uYwppbmRleCAwOTc5MGNjLi5kYzQxYzZkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3Nfa2Vybi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzc19rZXJuLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCQloYW5kbGVyID0gbmV3X3RocmVhZF9oYW5kbGVyOwogCX0KIAotCW5ld190aHJlYWQocC0+dGhyZWFkX2luZm8sICZwLT50aHJlYWQubW9kZS5za2FzLnN3aXRjaF9idWYsCisJbmV3X3RocmVhZCh0YXNrX3N0YWNrX3BhZ2UocCksICZwLT50aHJlYWQubW9kZS5za2FzLnN3aXRjaF9idWYsCiAJCSAgICZwLT50aHJlYWQubW9kZS5za2FzLmZvcmtfYnVmLCBoYW5kbGVyKTsKIAlyZXR1cm4oMCk7CiB9CkBAIC0xODUsNyArMTg1LDcgQEAKIAogCWluaXRfdGFzay50aHJlYWQucmVxdWVzdC51LnRocmVhZC5wcm9jID0gc3RhcnRfa2VybmVsX3Byb2M7CiAJaW5pdF90YXNrLnRocmVhZC5yZXF1ZXN0LnUudGhyZWFkLmFyZyA9IE5VTEw7Ci0JcmV0dXJuKHN0YXJ0X2lkbGVfdGhyZWFkKGluaXRfdGFzay50aHJlYWRfaW5mbywKKwlyZXR1cm4oc3RhcnRfaWRsZV90aHJlYWQodGFza19zdGFja19wYWdlKCZpbml0X3Rhc2spLAogCQkJCSAmaW5pdF90YXNrLnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwKIAkJCQkgJmluaXRfdGFzay50aHJlYWQubW9kZS5za2FzLmZvcmtfYnVmKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC9leGVjX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3R0L2V4ZWNfa2Vybi5jCmluZGV4IDEzNmU1NGMuLjhmNDBlNDggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3R0L2V4ZWNfa2Vybi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L2V4ZWNfa2Vybi5jCkBAIC0zOSw3ICszOSw3IEBACiAJCWRvX2V4aXQoU0lHS0lMTCk7CiAJfQogCQkKLQluZXdfcGlkID0gc3RhcnRfZm9ya190cmFtcChjdXJyZW50LT50aHJlYWRfaW5mbywgc3RhY2ssIDAsIGV4ZWNfdHJhbXApOworCW5ld19waWQgPSBzdGFydF9mb3JrX3RyYW1wKHRhc2tfc3RhY2tfcGFnZShjdXJyZW50KSwgc3RhY2ssIDAsIGV4ZWNfdHJhbXApOwogCWlmKG5ld19waWQgPCAwKXsKIAkJcHJpbnRrKEtFUk5fRVJSIAogCQkgICAgICAgImZsdXNoX3RocmVhZCA6IG5ldyB0aHJlYWQgZmFpbGVkLCBlcnJubyA9ICVkXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHQvcHJvY2Vzc19rZXJuLmMgYi9hcmNoL3VtL2tlcm5lbC90dC9wcm9jZXNzX2tlcm4uYwppbmRleCAxNGQ0NjIyLi42MjUzNTMwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90dC9wcm9jZXNzX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC90dC9wcm9jZXNzX2tlcm4uYwpAQCAtMzYsNyArMzYsNyBAQAogCWZyb20gPSBwcmV2OwogCXRvID0gbmV4dDsKIAotCWNwdSA9IGZyb20tPnRocmVhZF9pbmZvLT5jcHU7CisJY3B1ID0gdGFza190aHJlYWRfaW5mbyhmcm9tKS0+Y3B1OwogCWlmKGNwdSA9PSAwKQogCQlmb3J3YXJkX2ludGVycnVwdHModG8tPnRocmVhZC5tb2RlLnR0LmV4dGVybl9waWQpOwogI2lmZGVmIENPTkZJR19TTVAKQEAgLTI1Myw3ICsyNTMsNyBAQAogCiAJY2xvbmVfZmxhZ3MgJj0gQ0xPTkVfVk07CiAJcC0+dGhyZWFkLnRlbXBfc3RhY2sgPSBzdGFjazsKLQluZXdfcGlkID0gc3RhcnRfZm9ya190cmFtcChwLT50aHJlYWRfaW5mbywgc3RhY2ssIGNsb25lX2ZsYWdzLCB0cmFtcCk7CisJbmV3X3BpZCA9IHN0YXJ0X2ZvcmtfdHJhbXAodGFza19zdGFja19wYWdlKHApLCBzdGFjaywgY2xvbmVfZmxhZ3MsIHRyYW1wKTsKIAlpZihuZXdfcGlkIDwgMCl7CiAJCXByaW50ayhLRVJOX0VSUiAiY29weV90aHJlYWQgOiBjbG9uZSBmYWlsZWQgLSBlcnJubyA9ICVkXG4iLCAKIAkJICAgICAgIC1uZXdfcGlkKTsKQEAgLTM0Myw3ICszNDMsNyBAQAogCQlwaWQgPSB0aHJlYWQtPnJlcXVlc3QudS5leGVjLnBpZDsKIAkJZG9fZXhlYyh0aHJlYWQtPm1vZGUudHQuZXh0ZXJuX3BpZCwgcGlkKTsKIAkJdGhyZWFkLT5tb2RlLnR0LmV4dGVybl9waWQgPSBwaWQ7Ci0JCWNwdV90YXNrc1t0YXNrLT50aHJlYWRfaW5mby0+Y3B1XS5waWQgPSBwaWQ7CisJCWNwdV90YXNrc1t0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5jcHVdLnBpZCA9IHBpZDsKIAkJYnJlYWs7CiAJY2FzZSBPUF9GT1JLOgogCQlhdHRhY2hfcHJvY2Vzcyh0aHJlYWQtPnJlcXVlc3QudS5mb3JrLnBpZCk7CkBAIC00MjUsNyArNDI1LDcgQEAKIAlpbnQgcGFnZXM7CiAKIAlwYWdlcyA9ICgxIDw8IENPTkZJR19LRVJORUxfU1RBQ0tfT1JERVIpOwotCXNwID0gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBpbml0X3Rhc2sudGhyZWFkX2luZm8pICsKKwlzcCA9IHRhc2tfc3RhY2tfcGFnZSgmaW5pdF90YXNrKSArCiAJCXBhZ2VzICogUEFHRV9TSVpFIC0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwogCXJldHVybih0cmFjZXIoc3RhcnRfa2VybmVsX3Byb2MsIHNwKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvdjg1MC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDA2MmZmYTAuLmViOTA5OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvdjg1MC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJLyogU3RhcnQgcHVzaGluZyBzdHVmZiBmcm9tIHRoZSB0b3Agb2YgdGhlIGNoaWxkJ3Mga2VybmVsIHN0YWNrLiAgKi8KLQl1bnNpZ25lZCBsb25nIG9yaWdfa3NwID0gKHVuc2lnbmVkIGxvbmcpcC0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRTsKKwl1bnNpZ25lZCBsb25nIG9yaWdfa3NwID0gdGFza190b3MocCk7CiAJdW5zaWduZWQgbG9uZyBrc3AgPSBvcmlnX2tzcDsKIAkvKiBXZSBwdXNoIHR3byBgc3RhdGUgc2F2ZScgc3RhY2sgZmFtZXMgKHNlZSBlbnRyeS5TKSBvbiB0aGUgbmV3CiAJICAga2VybmVsIHN0YWNrOgpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvdjg1MC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMTg0OTJkMC4uNjdlMDU3NSAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3Y4NTAva2VybmVsL3B0cmFjZS5jCkBAIC01OCw3ICs1OCw3IEBACiAJCXJlZ3MgPSB0aHJlYWRfc2F2ZWRfcmVncyAodCk7CiAJZWxzZQogCQkvKiBSZWdpc3RlciBzYXZlZCBkdXJpbmcga2VybmVsIGVudHJ5IChvciBub3QgYXZhaWxhYmxlKS4gICovCi0JCXJlZ3MgPSB0YXNrX3JlZ3MgKHQpOworCQlyZWdzID0gdGFza19wdF9yZWdzICh0KTsKIAogCXJldHVybiAodjg1MF9yZWdfdCAqKSgoY2hhciAqKXJlZ3MgKyByZWdfb2Zmcyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfYmluZm10LmMgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfYmluZm10LmMKaW5kZXggMmI3NjBkMC4uMDI5YmRkYSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyX2JpbmZtdC5jCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9iaW5mbXQuYwpAQCAtMTk3LDggKzE5Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGVsZl9jb3JlX2NvcHlfdGFza19yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgZWxmX2dyZWdzZXRfdCogZWxmcmVncykKIHsJCi0Jc3RydWN0IHB0X3JlZ3MgKnBwID0gKHN0cnVjdCBwdF9yZWdzICopKHQtPnRocmVhZC5yc3AwKTsKLQktLXBwOworCXN0cnVjdCBwdF9yZWdzICpwcCA9IHRhc2tfcHRfcmVncyh0KTsKIAlFTEZfQ09SRV9DT1BZX1JFR1MoKCplbGZyZWdzKSwgcHApOwogCS8qIGZpeCB3cm9uZyBzZWdtZW50cyAqLyAKIAkoKmVsZnJlZ3MpWzddID0gdC0+dGhyZWFkLmRzOyAKQEAgLTIxNyw3ICsyMTYsNyBAQAogCWlmICghdHNrX3VzZWRfbWF0aCh0c2spKQogCQlyZXR1cm4gMDsKIAlpZiAoIXJlZ3MpCi0JCXJlZ3MgPSAoKHN0cnVjdCBwdF9yZWdzICopdHNrLT50aHJlYWQucnNwMCkgLSAxOworCQlyZWdzID0gdGFza19wdF9yZWdzKHRzayk7CiAJaWYgKHRzayA9PSBjdXJyZW50KQogCQl1bmxhenlfZnB1KHRzayk7CiAJc2V0X2ZzKEtFUk5FTF9EUyk7IApAQCAtMjMzLDcgKzIzMiw3IEBACiBzdGF0aWMgaW5saW5lIGludCAKIGVsZl9jb3JlX2NvcHlfdGFza194ZnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgZWxmX2ZweHJlZ3NldF90ICp4ZnB1KQogewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKChzdHJ1Y3QgcHRfcmVncyAqKSh0LT50aHJlYWQucnNwMCkpLTE7IAorCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHQpOwogCWlmICghdHNrX3VzZWRfbWF0aCh0KSkKIAkJcmV0dXJuIDA7CiAJaWYgKHQgPT0gY3VycmVudCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvcHRyYWNlMzIuYyBiL2FyY2gveDg2XzY0L2lhMzIvcHRyYWNlMzIuYwppbmRleCBlYTQzOTRlLi4yM2E0NTE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL3B0cmFjZTMyLmMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9wdHJhY2UzMi5jCkBAIC00MSw3ICs0MSw3IEBACiBzdGF0aWMgaW50IHB1dHJlZzMyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHVuc2lnbmVkIHJlZ25vLCB1MzIgdmFsKQogewogCWludCBpOwotCV9fdTY0ICpzdGFjayA9IChfX3U2NCAqKShjaGlsZC0+dGhyZWFkLnJzcDAgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsgCisJX191NjQgKnN0YWNrID0gKF9fdTY0ICopdGFza19wdF9yZWdzKGNoaWxkKTsKIAogCXN3aXRjaCAocmVnbm8pIHsKIAljYXNlIG9mZnNldG9mKHN0cnVjdCB1c2VyMzIsIHJlZ3MuZnMpOgpAQCAtMTM3LDcgKzEzNyw3IEBACiAKIHN0YXRpYyBpbnQgZ2V0cmVnMzIoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgdW5zaWduZWQgcmVnbm8sIHUzMiAqdmFsKQogewotCV9fdTY0ICpzdGFjayA9IChfX3U2NCAqKShjaGlsZC0+dGhyZWFkLnJzcDAgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsgCisJX191NjQgKnN0YWNrID0gKF9fdTY0ICopdGFza19wdF9yZWdzKGNoaWxkKTsKIAogCXN3aXRjaCAocmVnbm8pIHsKIAljYXNlIG9mZnNldG9mKHN0cnVjdCB1c2VyMzIsIHJlZ3MuZnMpOgpAQCAtMjM4LDcgKzIzOCw3IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopKGNoaWxkLT50aHJlYWQucnNwMCAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOyAKKwljaGlsZHJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTM4Ny5jIGIvYXJjaC94ODZfNjQva2VybmVsL2kzODcuYwppbmRleCBkOWIyMmI2Li5hNWQ3ZTE2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTM4Ny5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pMzg3LmMKQEAgLTk1LDcgKzk1LDcgQEAKIAlpZiAoIXVzZWRfbWF0aCgpKQogCQlyZXR1cm4gMDsKIAljbGVhcl91c2VkX21hdGgoKTsgLyogdHJpZ2dlciBmaW5pdCAqLwotCWlmICh0c2stPnRocmVhZF9pbmZvLT5zdGF0dXMgJiBUU19VU0VERlBVKSB7CisJaWYgKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICYgVFNfVVNFREZQVSkgewogCQllcnIgPSBzYXZlX2kzODdfY2hlY2tpbmcoKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgX191c2VyICopYnVmKTsKIAkJaWYgKGVycikgcmV0dXJuIGVycjsKIAkJc3R0cygpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYwppbmRleCBiNjE5NjVmLi41ZWNkMzRhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiB7CiAJaWYgKGlycSA+IDI1NikgeyAKIAkJY2hhciB2YXI7Ci0JCXByaW50aygicmV0dXJuICVwIHN0YWNrICVwIHRpICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksICZ2YXIsIGN1cnJlbnQtPnRocmVhZF9pbmZvKTsgCisJCXByaW50aygicmV0dXJuICVwIHN0YWNrICVwIHRpICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksICZ2YXIsIHRhc2tfdGhyZWFkX2luZm8oY3VycmVudCkpOwogCiAJCUJVRygpOyAKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCA2NjljZjBlLi44ZGVkNDA3IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTQ1MSw3ICs0NTEsNyBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqbWUgPSBjdXJyZW50OwogCiAJY2hpbGRyZWdzID0gKChzdHJ1Y3QgcHRfcmVncyAqKQotCQkJKFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvKSkgLSAxOworCQkJKFRIUkVBRF9TSVpFICsgdGFza19zdGFja19wYWdlKHApKSkgLSAxOwogCSpjaGlsZHJlZ3MgPSAqcmVnczsKIAogCWNoaWxkcmVncy0+cmF4ID0gMDsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCXAtPnRocmVhZC5yc3AwID0gKHVuc2lnbmVkIGxvbmcpIChjaGlsZHJlZ3MrMSk7CiAJcC0+dGhyZWFkLnVzZXJyc3AgPSBtZS0+dGhyZWFkLnVzZXJyc3A7IAogCi0Jc2V0X3RpX3RocmVhZF9mbGFnKHAtPnRocmVhZF9pbmZvLCBUSUZfRk9SSyk7CisJc2V0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfRk9SSyk7CiAKIAlwLT50aHJlYWQuZnMgPSBtZS0+dGhyZWFkLmZzOwogCXAtPnRocmVhZC5ncyA9IG1lLT50aHJlYWQuZ3M7CkBAIC01OTAsNyArNTkwLDcgQEAKIAl3cml0ZV9wZGEob2xkcnNwLCBuZXh0LT51c2VycnNwKTsgCiAJd3JpdGVfcGRhKHBjdXJyZW50LCBuZXh0X3ApOyAKIAl3cml0ZV9wZGEoa2VybmVsc3RhY2ssCi0JICAgICh1bnNpZ25lZCBsb25nKW5leHRfcC0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRSAtIFBEQV9TVEFDS09GRlNFVCk7CisJCSAgdGFza19zdGFja19wYWdlKG5leHRfcCkgKyBUSFJFQURfU0laRSAtIFBEQV9TVEFDS09GRlNFVCk7CiAKIAkvKgogCSAqIE5vdyBtYXliZSByZWxvYWQgdGhlIGRlYnVnIHJlZ2lzdGVycwpAQCAtNzA0LDcgKzcwNCw3IEBACiAKIAlpZiAoIXAgfHwgcCA9PSBjdXJyZW50IHx8IHAtPnN0YXRlPT1UQVNLX1JVTk5JTkcpCiAJCXJldHVybiAwOyAKLQlzdGFjayA9ICh1bnNpZ25lZCBsb25nKXAtPnRocmVhZF9pbmZvOyAKKwlzdGFjayA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKTsKIAlpZiAocC0+dGhyZWFkLnJzcCA8IHN0YWNrIHx8IHAtPnRocmVhZC5yc3AgPiBzdGFjaytUSFJFQURfU0laRSkKIAkJcmV0dXJuIDA7CiAJZnAgPSAqKHU2NCAqKShwLT50aHJlYWQucnNwKTsKQEAgLTgyMiw4ICs4MjIsNyBAQAogewogCXN0cnVjdCBwdF9yZWdzICpwcCwgcHRyZWdzOwogCi0JcHAgPSAoc3RydWN0IHB0X3JlZ3MgKikodHNrLT50aHJlYWQucnNwMCk7Ci0JLS1wcDsgCisJcHAgPSB0YXNrX3B0X3JlZ3ModHNrKTsKIAogCXB0cmVncyA9ICpwcDsgCiAJcHRyZWdzLmNzICY9IDB4ZmZmZjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wdHJhY2UuYwppbmRleCA4NjI0OGJjLi41MzIwNTYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jCkBAIC02NywxMiArNjcsNiBAQAogCXJldHVybiAoKigodW5zaWduZWQgbG9uZyAqKXN0YWNrKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHB0X3JlZ3MgKmdldF9jaGlsZF9yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9ICh2b2lkICopdGFzay0+dGhyZWFkLnJzcDA7Ci0JcmV0dXJuIHJlZ3MgLSAxOwotfQotCiAvKgogICogdGhpcyByb3V0aW5lIHdpbGwgcHV0IGEgd29yZCBvbiB0aGUgcHJvY2Vzc2VzIHByaXZpbGVnZWQgc3RhY2suIAogICogdGhlIG9mZnNldCBpcyBob3cgZmFyIGZyb20gdGhlIGJhc2UgYWRkciBhcyBzdG9yZWQgaW4gdGhlIFRTUy4gIApAQCAtMTcwLDcgKzE2NCw3IEBACiAKIHN0YXRpYyB2b2lkIHNldF9zaW5nbGVzdGVwKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfY2hpbGRfcmVncyhjaGlsZCk7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCiAJLyoKIAkgKiBBbHdheXMgc2V0IFRJRl9TSU5HTEVTVEVQIC0gdGhpcyBndWFyYW50ZWVzIHRoYXQKQEAgLTIwOCw3ICsyMDIsNyBAQAogCiAJLyogQnV0IHRvdWNoIFRGIG9ubHkgaWYgaXQgd2FzIHNldCBieSB1cy4uICovCiAJaWYgKGNoaWxkLT5wdHJhY2UgJiBQVF9EVFJBQ0UpIHsKLQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfY2hpbGRfcmVncyhjaGlsZCk7CisJCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAkJcmVncy0+ZWZsYWdzICY9IH5UUkFQX0ZMQUc7CiAJCWNoaWxkLT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYwppbmRleCBjOWU5NDFhLi5hMjg3NTZlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKQEAgLTc3Niw3ICs3NzYsNyBAQAogCiAJaWYgKGNfaWRsZS5pZGxlKSB7CiAJCWNfaWRsZS5pZGxlLT50aHJlYWQucnNwID0gKHVuc2lnbmVkIGxvbmcpICgoKHN0cnVjdCBwdF9yZWdzICopCi0JCQkoVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZykgY19pZGxlLmlkbGUtPnRocmVhZF9pbmZvKSkgLSAxKTsKKwkJCShUSFJFQURfU0laRSArICB0YXNrX3N0YWNrX3BhZ2UoY19pZGxlLmlkbGUpKSkgLSAxKTsKIAkJaW5pdF9pZGxlKGNfaWRsZS5pZGxlLCBjcHUpOwogCQlnb3RvIGRvX3Jlc3Q7CiAJfQpAQCAtODE0LDcgKzgxNCw3IEBACiAJaW5pdF9yc3AgPSBjX2lkbGUuaWRsZS0+dGhyZWFkLnJzcDsKIAlwZXJfY3B1KGluaXRfdHNzLGNwdSkucnNwMCA9IGluaXRfcnNwOwogCWluaXRpYWxfY29kZSA9IHN0YXJ0X3NlY29uZGFyeTsKLQljbGVhcl90aV90aHJlYWRfZmxhZyhjX2lkbGUuaWRsZS0+dGhyZWFkX2luZm8sIFRJRl9GT1JLKTsKKwljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY19pZGxlLmlkbGUsIFRJRl9GT1JLKTsKIAogCXByaW50ayhLRVJOX0lORk8gIkJvb3RpbmcgcHJvY2Vzc29yICVkLyVkIEFQSUMgMHgleFxuIiwgY3B1LAogCQljcHVzX3dlaWdodChjcHVfcHJlc2VudF9tYXApLApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYwppbmRleCAyNjcxZmQ0Li44YmIwYWVkIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYwpAQCAtMzA4LDcgKzMwOCw3IEBACiAJcHJpbnRrKCJDUFUgJWQgIiwgY3B1KTsKIAlfX3Nob3dfcmVncyhyZWdzKTsKIAlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHRocmVhZGluZm8gJXAsIHRhc2sgJXApXG4iLAotCQljdXItPmNvbW0sIGN1ci0+cGlkLCBjdXItPnRocmVhZF9pbmZvLCBjdXIpOworCQljdXItPmNvbW0sIGN1ci0+cGlkLCB0YXNrX3RocmVhZF9pbmZvKGN1ciksIGN1cik7CiAKIAkvKgogCSAqIFdoZW4gaW4ta2VybmVsLCB3ZSBhbHNvIHByaW50IG91dCB0aGUgc3RhY2sgYW5kIGNvZGUgYXQgdGhlCkBAIC02NjYsNyArNjY2LDcgQEAKIAkJOwogCS8qIEV4Y2VwdGlvbiBmcm9tIHVzZXIgc3BhY2UgKi8KIAllbHNlIGlmICh1c2VyX21vZGUoZXJlZ3MpKQotCQlyZWdzID0gKChzdHJ1Y3QgcHRfcmVncyAqKWN1cnJlbnQtPnRocmVhZC5yc3AwKSAtIDE7CisJCXJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJLyogRXhjZXB0aW9uIGZyb20ga2VybmVsIGFuZCBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLiBNb3ZlIHRvCiAgCSAgIGtlcm5lbCBwcm9jZXNzIHN0YWNrLiAqLwogCWVsc2UgaWYgKGVyZWdzLT5lZmxhZ3MgJiBYODZfRUZMQUdTX0lGKQpAQCAtOTEyLDcgKzkxMiw3IEBACiAJaWYgKCF1c2VkX21hdGgoKSkKIAkJaW5pdF9mcHUobWUpOwogCXJlc3RvcmVfZnB1X2NoZWNraW5nKCZtZS0+dGhyZWFkLmkzODcuZnhzYXZlKTsKLQltZS0+dGhyZWFkX2luZm8tPnN0YXR1cyB8PSBUU19VU0VERlBVOworCXRhc2tfdGhyZWFkX2luZm8obWUpLT5zdGF0dXMgfD0gVFNfVVNFREZQVTsKIH0KIAogdm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3Byb2Nlc3MuYwppbmRleCA2YTQ0YjU0Li5mMWY1OTY2IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCWludCB1c2VyX21vZGUgPSB1c2VyX21vZGUocmVncyk7CiAKIAkvKiBTZXQgdXAgbmV3IFRTUy4gKi8KLQl0b3MgPSAodW5zaWduZWQgbG9uZylwLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFOworCXRvcyA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKSArIFRIUkVBRF9TSVpFOwogCWlmICh1c2VyX21vZGUpCiAJCWNoaWxkcmVncyA9IChzdHJ1Y3QgcHRfcmVncyopKHRvcyAtIFBUX1VTRVJfU0laRSk7CiAJZWxzZQpAQCAtMjE3LDcgKzIxNyw3IEBACiB1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJdW5zaWduZWQgbG9uZyBzcCwgcGM7Ci0JdW5zaWduZWQgbG9uZyBzdGFja19wYWdlID0gKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvOworCXVuc2lnbmVkIGxvbmcgc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKSB0YXNrX3N0YWNrX3BhZ2UocCk7CiAJaW50IGNvdW50ID0gMDsKIAogCWlmICghcCB8fCBwID09IGN1cnJlbnQgfHwgcC0+c3RhdGUgPT0gVEFTS19SVU5OSU5HKQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3B0cmFjZS5jCmluZGV4IGFiNWM0YzYuLjRjYzg1MjggMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvcHRyYWNlLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAkJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CiAJCXVuc2lnbmVkIGxvbmcgdG1wOwogCi0JCXJlZ3MgPSB4dGVuc2FfcHRfcmVncyhjaGlsZCk7CisJCXJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCQl0bXAgPSAwOyAgLyogRGVmYXVsdCByZXR1cm4gdmFsdWUuICovCiAKIAkJc3dpdGNoKGFkZHIpIHsKQEAgLTE0OSw3ICsxNDksNyBAQAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6CiAJCXsKIAkJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7Ci0JCXJlZ3MgPSB4dGVuc2FfcHRfcmVncyhjaGlsZCk7CisJCXJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCiAJCXN3aXRjaCAoYWRkcikgewogCQljYXNlIFJFR19BUl9CQVNFIC4uLiBSRUdfQVJfQkFTRSArIFhDSEFMX05VTV9BUkVHUyAtIDE6CkBAIC0yNDAsNyArMjQwLDcgQEAKIAkJICogZWxmX2dyZWdzZXRfdCBmb3JtYXQuICovCiAKIAkJeHRlbnNhX2dyZWdzZXRfdCBmb3JtYXQ7Ci0JCXN0cnVjdCBwdF9yZWdzICpyZWdzID0geHRlbnNhX3B0X3JlZ3MoY2hpbGQpOworCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAKIAkJZG9fY29weV9yZWdzICgmZm9ybWF0LCByZWdzLCBjaGlsZCk7CiAKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQkgKiB2YWx1ZXMgaW4gdGhlIGVsZl9ncmVnc2V0X3QgZm9ybWF0LiAqLwogCiAJCXh0ZW5zYV9ncmVnc2V0X3QgZm9ybWF0OwotCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHh0ZW5zYV9wdF9yZWdzKGNoaWxkKTsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCiAJCWlmIChjb3B5X2Zyb21fdXNlcigmZm9ybWF0LCh2b2lkICopZGF0YSxzaXplb2YoZWxmX2dyZWdzZXRfdCkpKXsKIAkJCXJldCA9IC1FRkFVTFQ7CkBAIC0yODEsNyArMjgxLDcgQEAKIAkJICogZWxmX2ZwcmVnc2V0X3QgZm9ybWF0LiAqLwogCiAJCWVsZl9mcHJlZ3NldF90IGZwcmVnczsKLQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB4dGVuc2FfcHRfcmVncyhjaGlsZCk7CisJCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAogCQlkb19zYXZlX2ZwcmVncyAoJmZwcmVncywgcmVncywgY2hpbGQpOwogCkBAIC0yOTksNyArMjk5LDcgQEAKIAkJICogdmFsdWVzIGluIHRoZSBlbGZfZnByZWdzZXRfdCBmb3JtYXQuCiAJCSAqLwogCQllbGZfZnByZWdzZXRfdCBmcHJlZ3M7Ci0JCXN0cnVjdCBwdF9yZWdzICpyZWdzID0geHRlbnNhX3B0X3JlZ3MoY2hpbGQpOworCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAKIAkJcmV0ID0gMDsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZmcHJlZ3MsICh2b2lkICopZGF0YSwgc2l6ZW9mKGVsZl9mcHJlZ3NldF90KSkpIHsKZGlmZiAtLWdpdCBhL2Jsb2NrL2VsZXZhdG9yLmMgYi9ibG9jay9lbGV2YXRvci5jCmluZGV4IDk5YTRkN2IuLjFkMDc1OTE3IDEwMDY0NAotLS0gYS9ibG9jay9lbGV2YXRvci5jCisrKyBiL2Jsb2NrL2VsZXZhdG9yLmMKQEAgLTYxMCwyMyArNjEwLDIzIEBACiAJICogcmVxdWVzdCBpcyByZWxlYXNlZCBmcm9tIHRoZSBkcml2ZXIsIGlvIG11c3QgYmUgZG9uZQogCSAqLwogCWlmIChibGtfYWNjb3VudF9ycShycSkpIHsKLQkJc3RydWN0IHJlcXVlc3QgKmZpcnN0X3JxID0gbGlzdF9lbnRyeV9ycShxLT5xdWV1ZV9oZWFkLm5leHQpOwotCiAJCXEtPmluX2ZsaWdodC0tOworCQlpZiAoYmxrX3NvcnRlZF9ycShycSkgJiYgZS0+b3BzLT5lbGV2YXRvcl9jb21wbGV0ZWRfcmVxX2ZuKQorCQkJZS0+b3BzLT5lbGV2YXRvcl9jb21wbGV0ZWRfcmVxX2ZuKHEsIHJxKTsKKwl9CiAKLQkJLyoKLQkJICogQ2hlY2sgaWYgdGhlIHF1ZXVlIGlzIHdhaXRpbmcgZm9yIGZzIHJlcXVlc3RzIHRvIGJlCi0JCSAqIGRyYWluZWQgZm9yIGZsdXNoIHNlcXVlbmNlLgotCQkgKi8KLQkJaWYgKHEtPm9yZHNlcSAmJiBxLT5pbl9mbGlnaHQgPT0gMCAmJgorCS8qCisJICogQ2hlY2sgaWYgdGhlIHF1ZXVlIGlzIHdhaXRpbmcgZm9yIGZzIHJlcXVlc3RzIHRvIGJlCisJICogZHJhaW5lZCBmb3IgZmx1c2ggc2VxdWVuY2UuCisJICovCisJaWYgKHVubGlrZWx5KHEtPm9yZHNlcSkpIHsKKwkJc3RydWN0IHJlcXVlc3QgKmZpcnN0X3JxID0gbGlzdF9lbnRyeV9ycShxLT5xdWV1ZV9oZWFkLm5leHQpOworCQlpZiAocS0+aW5fZmxpZ2h0ID09IDAgJiYKIAkJICAgIGJsa19vcmRlcmVkX2N1cl9zZXEocSkgPT0gUVVFVUVfT1JEU0VRX0RSQUlOICYmCiAJCSAgICBibGtfb3JkZXJlZF9yZXFfc2VxKGZpcnN0X3JxKSA+IFFVRVVFX09SRFNFUV9EUkFJTikgewogCQkJYmxrX29yZGVyZWRfY29tcGxldGVfc2VxKHEsIFFVRVVFX09SRFNFUV9EUkFJTiwgMCk7CiAJCQlxLT5yZXF1ZXN0X2ZuKHEpOwogCQl9Ci0KLQkJaWYgKGJsa19zb3J0ZWRfcnEocnEpICYmIGUtPm9wcy0+ZWxldmF0b3JfY29tcGxldGVkX3JlcV9mbikKLQkJCWUtPm9wcy0+ZWxldmF0b3JfY29tcGxldGVkX3JlcV9mbihxLCBycSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL0tjb25maWcgYi9kcml2ZXJzL0tjb25maWcKaW5kZXggNDhmNDQ2ZC4uMjgzYzA4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9LY29uZmlnCisrKyBiL2RyaXZlcnMvS2NvbmZpZwpAQCAtNDQsNiArNDQsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvaTJjL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zcGkvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3cxL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9od21vbi9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggN2ZjM2YwZi4uN2M0NTA1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL01ha2VmaWxlCkBAIC00MSw2ICs0MSw3IEBACiBvYmotJChDT05GSUdfSUVFRTEzOTQpCQkrPSBpZWVlMTM5NC8KIG9iai15CQkJCSs9IGNkcm9tLwogb2JqLSQoQ09ORklHX01URCkJCSs9IG10ZC8KK29iai0kKENPTkZJR19TUEkpCQkrPSBzcGkvCiBvYmotJChDT05GSUdfUENDQVJEKQkJKz0gcGNtY2lhLwogb2JqLSQoQ09ORklHX0RJTykJCSs9IGRpby8KIG9iai0kKENPTkZJR19TQlVTKQkJKz0gc2J1cy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIvZHJpdmVycy9iYXNlL2RkLmMKaW5kZXggMmI5MDUwMS4uNzMwYTljZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RkLmMKKysrIGIvZHJpdmVycy9iYXNlL2RkLmMKQEAgLTc4LDcgKzc4LDEzIEBACiAJcHJfZGVidWcoIiVzOiBNYXRjaGVkIERldmljZSAlcyB3aXRoIERyaXZlciAlc1xuIiwKIAkJIGRydi0+YnVzLT5uYW1lLCBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKIAlkZXYtPmRyaXZlciA9IGRydjsKLQlpZiAoZHJ2LT5wcm9iZSkgeworCWlmIChkZXYtPmJ1cy0+cHJvYmUpIHsKKwkJcmV0ID0gZGV2LT5idXMtPnByb2JlKGRldik7CisJCWlmIChyZXQpIHsKKwkJCWRldi0+ZHJpdmVyID0gTlVMTDsKKwkJCWdvdG8gUHJvYmVGYWlsZWQ7CisJCX0KKwl9IGVsc2UgaWYgKGRydi0+cHJvYmUpIHsKIAkJcmV0ID0gZHJ2LT5wcm9iZShkZXYpOwogCQlpZiAocmV0KSB7CiAJCQlkZXYtPmRyaXZlciA9IE5VTEw7CkBAIC0yMDMsNyArMjA5LDkgQEAKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRyaXZlciIpOwogCQlrbGlzdF9yZW1vdmUoJmRldi0+a25vZGVfZHJpdmVyKTsKIAotCQlpZiAoZHJ2LT5yZW1vdmUpCisJCWlmIChkZXYtPmJ1cy0+cmVtb3ZlKQorCQkJZGV2LT5idXMtPnJlbW92ZShkZXYpOworCQllbHNlIGlmIChkcnYtPnJlbW92ZSkKIAkJCWRydi0+cmVtb3ZlKGRldik7CiAJCWRldi0+ZHJpdmVyID0gTlVMTDsKIAkJcHV0X2RyaXZlcihkcnYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RyaXZlci5jIGIvZHJpdmVycy9iYXNlL2RyaXZlci5jCmluZGV4IDE2MWYzYTMuLmI0MDAzMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kcml2ZXIuYworKysgYi9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKQEAgLTE3MSw2ICsxNzEsMTEgQEAKICAqLwogaW50IGRyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydikKIHsKKwlpZiAoKGRydi0+YnVzLT5wcm9iZSAmJiBkcnYtPnByb2JlKSB8fAorCSAgICAoZHJ2LT5idXMtPnJlbW92ZSAmJiBkcnYtPnJlbW92ZSkgfHwKKwkgICAgKGRydi0+YnVzLT5zaHV0ZG93biAmJiBkcnYtPnNodXRkb3duKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJEcml2ZXIgJyVzJyBuZWVkcyB1cGRhdGluZyAtIHBsZWFzZSB1c2UgYnVzX3R5cGUgbWV0aG9kc1xuIiwgZHJ2LT5uYW1lKTsKKwl9CiAJa2xpc3RfaW5pdCgmZHJ2LT5rbGlzdF9kZXZpY2VzLCBrbGlzdF9kZXZpY2VzX2dldCwga2xpc3RfZGV2aWNlc19wdXQpOwogCWluaXRfY29tcGxldGlvbigmZHJ2LT51bmxvYWRlZCk7CiAJcmV0dXJuIGJ1c19hZGRfZHJpdmVyKGRydik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCmluZGV4IDBmODE3MzEuLjQ2MTU1NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCkBAIC0zMjcsNyArMzI3LDcgQEAKICAqCUBwZGV2OglwbGF0Zm9ybSBkZXZpY2Ugd2UncmUgdW5yZWdpc3RlcmluZwogICoKICAqCVVucmVnaXN0cmF0aW9uIGlzIGRvbmUgaW4gMiBzdGVwcy4gRmlzcnQgd2UgcmVsZWFzZSBhbGwgcmVzb3VyY2VzCi0gKglhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHN5YnN5c3RlbSwgdGhlbiB3ZSBkcm9wIHJlZmVyZW5jZSBjb3VudCBieQorICoJYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBzdWJzeXN0ZW0sIHRoZW4gd2UgZHJvcCByZWZlcmVuY2UgY291bnQgYnkKICAqCWNhbGxpbmcgcGxhdGZvcm1fZGV2aWNlX3B1dCgpLgogICovCiB2b2lkIHBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiBwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3NodXRkb3duLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYwppbmRleCBmNTBhMDhiLi5jMjQ3NWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYwpAQCAtMzUsMTIgKzM1LDE1IEBACiAgKi8KIHZvaWQgZGV2aWNlX3NodXRkb3duKHZvaWQpCiB7Ci0Jc3RydWN0IGRldmljZSAqIGRldjsKKwlzdHJ1Y3QgZGV2aWNlICogZGV2LCAqZGV2bjsKIAogCWRvd25fd3JpdGUoJmRldmljZXNfc3Vic3lzLnJ3c2VtKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoZGV2LCAmZGV2aWNlc19zdWJzeXMua3NldC5saXN0LAorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKGRldiwgZGV2biwgJmRldmljZXNfc3Vic3lzLmtzZXQubGlzdCwKIAkJCQlrb2JqLmVudHJ5KSB7Ci0JCWlmIChkZXYtPmRyaXZlciAmJiBkZXYtPmRyaXZlci0+c2h1dGRvd24pIHsKKwkJaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5zaHV0ZG93bikgeworCQkJZGV2X2RiZyhkZXYsICJzaHV0ZG93blxuIik7CisJCQlkZXYtPmJ1cy0+c2h1dGRvd24oZGV2KTsKKwkJfSBlbHNlIGlmIChkZXYtPmRyaXZlciAmJiBkZXYtPmRyaXZlci0+c2h1dGRvd24pIHsKIAkJCWRldl9kYmcoZGV2LCAic2h1dGRvd25cbiIpOwogCQkJZGV2LT5kcml2ZXItPnNodXRkb3duKGRldik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW1pZmxvcC5jIGIvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMKaW5kZXggM2M2NzlkMy4uYjZlMjkwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMKKysrIGIvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMKQEAgLTE5NCw2ICsxOTQsOCBAQAogICovCiAjZGVmaW5lIE1BWF9FUlJPUlMgMTIKIAorI2RlZmluZSBjdXN0b20gYW1pZ2FfY3VzdG9tCisKIC8qIFByZXZlbnQgImFsaWFzZWQiIGFjY2Vzc2VzLiAqLwogc3RhdGljIGludCBmZF9yZWZbNF0gPSB7IDAsMCwwLDAgfTsKIHN0YXRpYyBpbnQgZmRfZGV2aWNlWzRdID0geyAwLCAwLCAwLCAwIH07CkBAIC0xNDM5LDYgKzE0NDEsNyBAQAogewogCWludCBkcml2ZSA9IGltaW5vcihpbm9kZSkgJiAzOwogCXN0YXRpYyBzdHJ1Y3QgZmxvcHB5X3N0cnVjdCBnZXRwcm07CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilwYXJhbTsKIAogCXN3aXRjaChjbWQpewogCWNhc2UgRkRGTVRCRUc6CkBAIC0xNDg0LDkgKzE0ODcsNyBAQAogCQlnZXRwcm0uaGVhZD11bml0W2RyaXZlXS50eXBlLT5oZWFkczsKIAkJZ2V0cHJtLnNlY3Q9dW5pdFtkcml2ZV0uZHR5cGUtPnNlY3RzICogdW5pdFtkcml2ZV0udHlwZS0+c2VjdF9tdWx0OwogCQlnZXRwcm0uc2l6ZT11bml0W2RyaXZlXS5ibG9ja3M7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilwYXJhbSwKLQkJCQkgKHZvaWQgKikmZ2V0cHJtLAotCQkJCSBzaXplb2Yoc3RydWN0IGZsb3BweV9zdHJ1Y3QpKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZ2V0cHJtLCBzaXplb2Yoc3RydWN0IGZsb3BweV9zdHJ1Y3QpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlicmVhazsKIAljYXNlIEZEU0VUUFJNOgpAQCAtMTQ5OCw4ICsxNDk5LDcgQEAKIAkJYnJlYWs7CiAjaWZkZWYgUkFXX0lPQ1RMCiAJY2FzZSBJT0NUTF9SQVdfVFJBQ0s6Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilwYXJhbSwgcmF3X2J1ZiwKLQkJCQkgdW5pdFtkcml2ZV0udHlwZS0+cmVhZF9zaXplKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCByYXdfYnVmLCB1bml0W2RyaXZlXS50eXBlLT5yZWFkX3NpemUpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWVsc2UKIAkJCXJldHVybiB1bml0W2RyaXZlXS50eXBlLT5yZWFkX3NpemU7CkBAIC0xNjU0LDEyICsxNjU0LDYgQEAKIAkubWVkaWFfY2hhbmdlZAk9IGFtaWdhX2Zsb3BweV9jaGFuZ2UsCiB9OwogCi12b2lkIF9faW5pdCBhbWlnYV9mbG9wcHlfc2V0dXAgKGNoYXIgKnN0ciwgaW50ICppbnRzKQotewotCXByaW50ayAoS0VSTl9JTkZPICJhbWlmbG9wOiBTZXR0aW5nIGRlZmF1bHQgZGYwIHRvICV4XG4iLCBpbnRzWzFdKTsKLQlmZF9kZWZfZGYwID0gaW50c1sxXTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgZmRfcHJvYmVfZHJpdmVzKHZvaWQpCiB7CiAJaW50IGRyaXZlLGRyaXZlcyxub21lbTsKQEAgLTE4NDUsNCArMTgzOSwxOCBAQAogCXVucmVnaXN0ZXJfYmxrZGV2KEZMT1BQWV9NQUpPUiwgImZkIik7CiB9CiAjZW5kaWYKKworI2Vsc2UKK3N0YXRpYyBpbnQgX19pbml0IGFtaWdhX2Zsb3BweV9zZXR1cCAoY2hhciAqc3RyKQoreworCWludCBuOworCWlmICghTUFDSF9JU19BTUlHQSkKKwkJcmV0dXJuIDA7CisJaWYgKCFnZXRfb3B0aW9uKCZzdHIsICZuKSkKKwkJcmV0dXJuIDA7CisJcHJpbnRrIChLRVJOX0lORk8gImFtaWZsb3A6IFNldHRpbmcgZGVmYXVsdCBkZjAgdG8gJXhcbiIsIG4pOworCWZkX2RlZl9kZjAgPSBuOworfQorCitfX3NldHVwKCJmbG9wcHk9IiwgYW1pZ2FfZmxvcHB5X3NldHVwKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hdGFmbG9wLmMgYi9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYwppbmRleCAzYWE2OGE1Li5mOGNlMjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYwpAQCAtMTM2MSw3ICsxMzYxLDcgQEAKIAkJICAgZm9ybWF0cywgZm9yICdwZXJtYW5lbnQgdXNlci1kZWZpbmVkJyBwYXJhbWV0ZXI6CiAJCSAgIHJlc3RvcmUgZGVmYXVsdF9wYXJhbXNbXSBoZXJlIGlmIGZsYWdnZWQgdmFsaWQhICovCiAJCWlmIChkZWZhdWx0X3BhcmFtc1tkcml2ZV0uYmxvY2tzID09IDApCi0JCQlVRFQgPSAwOworCQkJVURUID0gTlVMTDsKIAkJZWxzZQogCQkJVURUID0gJmRlZmF1bHRfcGFyYW1zW2RyaXZlXTsKIAl9CkBAIC0xNDk1LDYgKzE0OTUsNyBAQAogCXN0cnVjdCBmbG9wcHlfc3RydWN0IGdldHBybTsKIAlpbnQgc2V0dHlwZTsKIAlzdHJ1Y3QgZmxvcHB5X3N0cnVjdCBzZXRwcm07CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilwYXJhbTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBGREdFVFBSTToKQEAgLTE1MjEsNyArMTUyMiw3IEBACiAJCWdldHBybS5oZWFkID0gMjsKIAkJZ2V0cHJtLnRyYWNrID0gZHRwLT5ibG9ja3MvZHRwLT5zcHQvMjsKIAkJZ2V0cHJtLnN0cmV0Y2ggPSBkdHAtPnN0cmV0Y2g7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilwYXJhbSwgJmdldHBybSwgc2l6ZW9mKGdldHBybSkpKQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZnZXRwcm0sIHNpemVvZihnZXRwcm0pKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNTQwLDcgKzE1NDEsNyBAQAogCQkvKiBnZXQgdGhlIHBhcmFtZXRlcnMgZnJvbSB1c2VyIHNwYWNlICovCiAJCWlmIChmbG9wcHktPnJlZiAhPSAxICYmIGZsb3BweS0+cmVmICE9IC0xKQogCQkJcmV0dXJuIC1FQlVTWTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZXRwcm0sICh2b2lkICopIHBhcmFtLCBzaXplb2Yoc2V0cHJtKSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0cHJtLCBhcmdwLCBzaXplb2Yoc2V0cHJtKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJLyogCiAJCSAqIGZpcnN0IG9mIGFsbDogY2hlY2sgZm9yIGZsb3BweSBjaGFuZ2UgYW5kIHJldmFsaWRhdGUsIApAQCAtMTY0Nyw3ICsxNjQ4LDcgQEAKIAljYXNlIEZERk1UVFJLOgogCQlpZiAoZmxvcHB5LT5yZWYgIT0gMSAmJiBmbG9wcHktPnJlZiAhPSAtMSkKIAkJCXJldHVybiAtRUJVU1k7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZm10X2Rlc2MsICh2b2lkICopIHBhcmFtLCBzaXplb2YoZm10X2Rlc2MpKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmbXRfZGVzYywgYXJncCwgc2l6ZW9mKGZtdF9kZXNjKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmV0dXJuIGRvX2Zvcm1hdChkcml2ZSwgdHlwZSwgJmZtdF9kZXNjKTsKIAljYXNlIEZEQ0xSUFJNOgpAQCAtMTk1MCwxNCArMTk1MSwyMCBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi0KLXZvaWQgX19pbml0IGF0YXJpX2Zsb3BweV9zZXR1cCggY2hhciAqc3RyLCBpbnQgKmludHMgKQorI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGF0YXJpX2Zsb3BweV9zZXR1cChjaGFyICpzdHIpCiB7CisJaW50IGludHNbMyArIEZEX01BWF9VTklUU107CiAJaW50IGk7CisKKwlpZiAoIU1BQ0hfSVNfQVRBUkkpCisJCXJldHVybiAwOworCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCAzICsgRkRfTUFYX1VOSVRTLCBpbnRzKTsKIAkKIAlpZiAoaW50c1swXSA8IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhdGFmbG9wX3NldHVwOiBubyBhcmd1bWVudHMhXG4iICk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCWVsc2UgaWYgKGludHNbMF0gPiAyK0ZEX01BWF9VTklUUykgewogCQlwcmludGsoS0VSTl9FUlIgImF0YWZsb3Bfc2V0dXA6IHRvbyBtYW55IGFyZ3VtZW50c1xuIiApOwpAQCAtMTk3Nyw5ICsxOTg0LDEzIEBACiAJCWVsc2UKIAkJCVVzZXJTdGVwcmF0ZVtpLTNdID0gaW50c1tpXTsKIAl9CisJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIGF0YXJpX2Zsb3BweV9leGl0KHZvaWQpCitfX3NldHVwKCJmbG9wcHk9IiwgYXRhcmlfZmxvcHB5X3NldHVwKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRhcmlfZmxvcHB5X2V4aXQodm9pZCkKIHsKIAlpbnQgaTsKIAlibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoRkxPUFBZX01BSk9SLCAwKSwgMjU2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jIGIvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKaW5kZXggZDFhYWYzMWIuLmY2M2UwN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jCkBAIC0yOTMsNiArMjkzLDcgQEAKIAl1MTYgdmlvY21kOwogCUh2THBFdmVudF9SYyBodnJjOwogCXN0cnVjdCB2aW9ibG9ja2xwZXZlbnQgKmJldmVudDsKKwlzdHJ1Y3QgSHZMcEV2ZW50ICpoZXY7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnW1ZJT01BWEJMT0NLRE1BXTsKIAlpbnQgc2dpbmRleDsKIAlpbnQgc3RhdGluZGV4OwpAQCAtMzQ3LDIyICszNDgsMTkgQEAKIAkJICogdG9rZW4gc28gd2UgY2FuIG1hdGNoIHRoZSByZXNwb25zZSB1cCBsYXRlcgogCQkgKi8KIAkJbWVtc2V0KGJldmVudCwgMCwgc2l6ZW9mKHN0cnVjdCB2aW9ibG9ja2xwZXZlbnQpKTsKLQkJYmV2ZW50LT5ldmVudC54RmxhZ3MueFZhbGlkID0gMTsKLQkJYmV2ZW50LT5ldmVudC54RmxhZ3MueEZ1bmN0aW9uID0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludDsKLQkJYmV2ZW50LT5ldmVudC54RmxhZ3MueEFja0luZCA9IEh2THBFdmVudF9BY2tJbmRfRG9BY2s7Ci0JCWJldmVudC0+ZXZlbnQueEZsYWdzLnhBY2tUeXBlID0gSHZMcEV2ZW50X0Fja1R5cGVfSW1tZWRpYXRlQWNrOwotCQliZXZlbnQtPmV2ZW50LnhUeXBlID0gSHZMcEV2ZW50X1R5cGVfVmlydHVhbElvOwotCQliZXZlbnQtPmV2ZW50LnhTdWJ0eXBlID0gdmlvY21kOwotCQliZXZlbnQtPmV2ZW50LnhTb3VyY2VMcCA9IEh2THBDb25maWdfZ2V0THBJbmRleCgpOwotCQliZXZlbnQtPmV2ZW50LnhUYXJnZXRMcCA9IHZpb3BhdGhfaG9zdExwOwotCQliZXZlbnQtPmV2ZW50LnhTaXplTWludXMxID0KKwkJaGV2ID0gJmJldmVudC0+ZXZlbnQ7CisJCWhldi0+ZmxhZ3MgPSBIVl9MUF9FVkVOVF9WQUxJRCB8IEhWX0xQX0VWRU5UX0RPX0FDSyB8CisJCQlIVl9MUF9FVkVOVF9JTlQ7CisJCWhldi0+eFR5cGUgPSBIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsSW87CisJCWhldi0+eFN1YnR5cGUgPSB2aW9jbWQ7CisJCWhldi0+eFNvdXJjZUxwID0gSHZMcENvbmZpZ19nZXRMcEluZGV4KCk7CisJCWhldi0+eFRhcmdldExwID0gdmlvcGF0aF9ob3N0THA7CisJCWhldi0+eFNpemVNaW51czEgPQogCQkJb2Zmc2V0b2Yoc3RydWN0IHZpb2Jsb2NrbHBldmVudCwgdS5yd19kYXRhLmRtYV9pbmZvKSArCiAJCQkoc2l6ZW9mKGJldmVudC0+dS5yd19kYXRhLmRtYV9pbmZvWzBdKSAqIG5zZykgLSAxOwotCQliZXZlbnQtPmV2ZW50LnhTb3VyY2VJbnN0YW5jZUlkID0KLQkJCXZpb3BhdGhfc291cmNlaW5zdCh2aW9wYXRoX2hvc3RMcCk7Ci0JCWJldmVudC0+ZXZlbnQueFRhcmdldEluc3RhbmNlSWQgPQotCQkJdmlvcGF0aF90YXJnZXRpbnN0KHZpb3BhdGhfaG9zdExwKTsKLQkJYmV2ZW50LT5ldmVudC54Q29ycmVsYXRpb25Ub2tlbiA9ICh1NjQpcmVxOworCQloZXYtPnhTb3VyY2VJbnN0YW5jZUlkID0gdmlvcGF0aF9zb3VyY2VpbnN0KHZpb3BhdGhfaG9zdExwKTsKKwkJaGV2LT54VGFyZ2V0SW5zdGFuY2VJZCA9IHZpb3BhdGhfdGFyZ2V0aW5zdCh2aW9wYXRoX2hvc3RMcCk7CisJCWhldi0+eENvcnJlbGF0aW9uVG9rZW4gPSAodTY0KXJlcTsKIAkJYmV2ZW50LT52ZXJzaW9uID0gVklPVkVSU0lPTjsKIAkJYmV2ZW50LT5kaXNrID0gREVWSUNFX05PKGQpOwogCQliZXZlbnQtPnUucndfZGF0YS5vZmZzZXQgPSBzdGFydDsKQEAgLTY0OSwxMCArNjQ3LDEwIEBACiAJCS8qIE5vdGlmaWNhdGlvbiB0aGF0IGEgcGFydGl0aW9uIHdlbnQgYXdheSEgKi8KIAkJcmV0dXJuOwogCS8qIEZpcnN0LCB3ZSBzaG91bGQgTkVWRVIgZ2V0IGFuIGludCBoZXJlLi4ub25seSBhY2tzICovCi0JaWYgKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9JbnQpIHsKKwlpZiAoaHZscGV2ZW50X2lzX2ludChldmVudCkpIHsKIAkJcHJpbnRrKFZJT0RfS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiWWlrZXMhIGdvdCBhbiBpbnQgaW4gdmlvZGFzZCBldmVudCBoYW5kbGVyIVxuIik7Ci0JCWlmIChldmVudC0+eEZsYWdzLnhBY2tJbmQgPT0gSHZMcEV2ZW50X0Fja0luZF9Eb0FjaykgeworCQlpZiAoaHZscGV2ZW50X25lZWRfYWNrKGV2ZW50KSkgewogCQkJZXZlbnQtPnhSYyA9IEh2THBFdmVudF9SY19JbnZhbGlkU3VidHlwZTsKIAkJCUh2Q2FsbEV2ZW50X2Fja0xwRXZlbnQoZXZlbnQpOwogCQl9CkBAIC02OTUsNyArNjkzLDcgQEAKIAogCWRlZmF1bHQ6CiAJCXByaW50ayhWSU9EX0tFUk5fV0FSTklORyAiaW52YWxpZCBzdWJ0eXBlISIpOwotCQlpZiAoZXZlbnQtPnhGbGFncy54QWNrSW5kID09IEh2THBFdmVudF9BY2tJbmRfRG9BY2spIHsKKwkJaWYgKGh2bHBldmVudF9uZWVkX2FjayhldmVudCkpIHsKIAkJCWV2ZW50LT54UmMgPSBIdkxwRXZlbnRfUmNfSW52YWxpZFN1YnR5cGU7CiAJCQlIdkNhbGxFdmVudF9hY2tMcEV2ZW50KGV2ZW50KTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS92aW9jZC5jIGIvZHJpdmVycy9jZHJvbS92aW9jZC5jCmluZGV4IGI1MTkxNzguLjE5MzQ0NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vdmlvY2QuYworKysgYi9kcml2ZXJzL2Nkcm9tL3Zpb2NkLmMKQEAgLTU0MiwxMCArNTQyLDEwIEBACiAJCS8qIE5vdGlmaWNhdGlvbiB0aGF0IGEgcGFydGl0aW9uIHdlbnQgYXdheSEgKi8KIAkJcmV0dXJuOwogCS8qIEZpcnN0LCB3ZSBzaG91bGQgTkVWRVIgZ2V0IGFuIGludCBoZXJlLi4ub25seSBhY2tzICovCi0JaWYgKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9JbnQpIHsKKwlpZiAoaHZscGV2ZW50X2lzX2ludChldmVudCkpIHsKIAkJcHJpbnRrKFZJT0NEX0tFUk5fV0FSTklORwogCQkJCSJZaWtlcyEgZ290IGFuIGludCBpbiB2aW9jZCBldmVudCBoYW5kbGVyIVxuIik7Ci0JCWlmIChldmVudC0+eEZsYWdzLnhBY2tJbmQgPT0gSHZMcEV2ZW50X0Fja0luZF9Eb0FjaykgeworCQlpZiAoaHZscGV2ZW50X25lZWRfYWNrKGV2ZW50KSkgewogCQkJZXZlbnQtPnhSYyA9IEh2THBFdmVudF9SY19JbnZhbGlkU3VidHlwZTsKIAkJCUh2Q2FsbEV2ZW50X2Fja0xwRXZlbnQoZXZlbnQpOwogCQl9CkBAIC02MTYsNyArNjE2LDcgQEAKIAkJcHJpbnRrKFZJT0NEX0tFUk5fV0FSTklORwogCQkJCSJtZXNzYWdlIHdpdGggaW52YWxpZCBzdWJ0eXBlICUweDA0WCFcbiIsCiAJCQkJZXZlbnQtPnhTdWJ0eXBlICYgVklPTUlOT1JfU1VCVFlQRV9NQVNLKTsKLQkJaWYgKGV2ZW50LT54RmxhZ3MueEFja0luZCA9PSBIdkxwRXZlbnRfQWNrSW5kX0RvQWNrKSB7CisJCWlmIChodmxwZXZlbnRfbmVlZF9hY2soZXZlbnQpKSB7CiAJCQlldmVudC0+eFJjID0gSHZMcEV2ZW50X1JjX0ludmFsaWRTdWJ0eXBlOwogCQkJSHZDYWxsRXZlbnRfYWNrTHBFdmVudChldmVudCk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYyBiL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYwppbmRleCA4Njk1MThlLi43YWMzNjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKKysrIGIvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCkBAIC05OSw2ICs5OSw3IEBACiAjZGVmaW5lIF9JTkxJTkVfIGlubGluZQogI2VuZGlmCiAKKyNkZWZpbmUgY3VzdG9tIGFtaWdhX2N1c3RvbQogc3RhdGljIGNoYXIgKnNlcmlhbF9uYW1lID0gIkFtaWdhLWJ1aWx0aW4gc2VyaWFsIGRyaXZlciI7CiAKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKQEAgLTEyOCw3ICsxMjksNiBAQAogICogbWVtb3J5IGlmIGxhcmdlIG51bWJlcnMgb2Ygc2VyaWFsIHBvcnRzIGFyZSBvcGVuLgogICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciAqdG1wX2J1ZjsKLXN0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTEwODgsNyArMTA4OCw3IEBACiAgKi8KIAogc3RhdGljIGludCBnZXRfc2VyaWFsX2luZm8oc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8sCi0JCQkgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqIHJldGluZm8pCisJCQkgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiByZXRpbmZvKQogewogCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKIAlzdHJ1Y3Qgc2VyaWFsX3N0YXRlICpzdGF0ZSA9IGluZm8tPnN0YXRlOwpAQCAtMTExMiw3ICsxMTEyLDcgQEAKIH0KIAogc3RhdGljIGludCBzZXRfc2VyaWFsX2luZm8oc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8sCi0JCQkgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqIG5ld19pbmZvKQorCQkJICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICogbmV3X2luZm8pCiB7CiAJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKICAJc3RydWN0IHNlcmlhbF9zdGF0ZSBvbGRfc3RhdGUsICpzdGF0ZTsKQEAgLTExOTMsNyArMTE5Myw3IEBACiAgKiAJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKICAqIAkgICAgYWxsb3dzIGFuIFJTNDg1IGRyaXZlciB0byBiZSB3cml0dGVuIGluIHVzZXIgc3BhY2UuIAogICovCi1zdGF0aWMgaW50IGdldF9sc3JfaW5mbyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbywgdW5zaWduZWQgaW50ICp2YWx1ZSkKK3N0YXRpYyBpbnQgZ2V0X2xzcl9pbmZvKHN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgcmVzdWx0OwpAQCAtMTI4NCw2ICsxMjg0LDcgQEAKIAlzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgYXN5bmNfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNwcmV2LCBjbm93OwkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLwogCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IGljb3VudDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19pb2N0bCIpKQpAQCAtMTI5OCwxOSArMTI5OSwxNyBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBUSU9DR1NFUklBTDoKLQkJCXJldHVybiBnZXRfc2VyaWFsX2luZm8oaW5mbywKLQkJCQkJICAgICAgIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOworCQkJcmV0dXJuIGdldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKIAkJY2FzZSBUSU9DU1NFUklBTDoKLQkJCXJldHVybiBzZXRfc2VyaWFsX2luZm8oaW5mbywKLQkJCQkJICAgICAgIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOworCQkJcmV0dXJuIHNldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKIAkJY2FzZSBUSU9DU0VSQ09ORklHOgogCQkJcmV0dXJuIDA7CiAKIAkJY2FzZSBUSU9DU0VSR0VUTFNSOiAvKiBHZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCXJldHVybiBnZXRfbHNyX2luZm8oaW5mbywgKHVuc2lnbmVkIGludCAqKSBhcmcpOworCQkJcmV0dXJuIGdldF9sc3JfaW5mbyhpbmZvLCBhcmdwKTsKIAogCQljYXNlIFRJT0NTRVJHU1RSVUNUOgotCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGFzeW5jX3N0cnVjdCAqKSBhcmcsCisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsCiAJCQkJCSBpbmZvLCBzaXplb2Yoc3RydWN0IGFzeW5jX3N0cnVjdCkpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJcmV0dXJuIDA7CkBAIC0xMzY5LDcgKzEzNjgsNyBAQAogCQkJaWNvdW50LmJyayA9IGNub3cuYnJrOwogCQkJaWNvdW50LmJ1Zl9vdmVycnVuID0gY25vdy5idWZfb3ZlcnJ1bjsKIAotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmljb3VudCwgc2l6ZW9mKGljb3VudCkpKQorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWNvdW50LCBzaXplb2YoaWNvdW50KSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlyZXR1cm4gMDsKIAkJY2FzZSBUSU9DU0VSR1dJTEQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZQppbmRleCBlNDEwNjBjLi45ZDE4MGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUKQEAgLTMsNyArMyw3IEBACiAjIERpcmVjdCBSZW5kZXJpbmcgSW5mcmFzdHJ1Y3R1cmUgKERSSSkgaW4gWEZyZWU4NiA0LjEuMCBhbmQgaGlnaGVyLgogCiBkcm0tb2JqcyAgICA6PQlkcm1fYXV0aC5vIGRybV9idWZzLm8gZHJtX2NvbnRleHQubyBkcm1fZG1hLm8gZHJtX2RyYXdhYmxlLm8gXAotCQlkcm1fZHJ2Lm8gZHJtX2ZvcHMubyBkcm1faW5pdC5vIGRybV9pb2N0bC5vIGRybV9pcnEubyBcCisJCWRybV9kcnYubyBkcm1fZm9wcy5vIGRybV9pb2N0bC5vIGRybV9pcnEubyBcCiAJCWRybV9sb2NrLm8gZHJtX21lbW9yeS5vIGRybV9wcm9jLm8gZHJtX3N0dWIubyBkcm1fdm0ubyBcCiAJCWRybV9hZ3BzdXBwb3J0Lm8gZHJtX3NjYXR0ZXIubyBhdGlfcGNpZ2FydC5vIGRybV9wY2kubyBcCiAJCWRybV9zeXNmcy5vCkBAIC0xOCw3ICsxOCw3IEBACiBmZmItb2JqcyAgICA6PSBmZmJfZHJ2Lm8gZmZiX2NvbnRleHQubwogc2lzLW9ianMgICAgOj0gc2lzX2Rydi5vIHNpc19kcy5vIHNpc19tbS5vCiBzYXZhZ2Utb2JqcyA6PSBzYXZhZ2VfZHJ2Lm8gc2F2YWdlX2JjaS5vIHNhdmFnZV9zdGF0ZS5vCi12aWEtb2JqcyAgICA6PSB2aWFfaXJxLm8gdmlhX2Rydi5vIHZpYV9kcy5vIHZpYV9tYXAubyB2aWFfbW0ubyB2aWFfZG1hLm8gdmlhX3ZlcmlmaWVyLm8gdmlhX3ZpZGVvLm8KK3ZpYS1vYmpzICAgIDo9IHZpYV9pcnEubyB2aWFfZHJ2Lm8gdmlhX2RzLm8gdmlhX21hcC5vIHZpYV9tbS5vIHZpYV9kbWEubyB2aWFfdmVyaWZpZXIubyB2aWFfdmlkZW8ubyB2aWFfZG1hYmxpdC5vCiAKIGlmZXEgKCQoQ09ORklHX0NPTVBBVCkseSkKIGRybS1vYmpzICAgICs9IGRybV9pb2MzMi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMKaW5kZXggZWZmZjBlZS4uNTQ4NTM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYwpAQCAtNTIsNyArNTIsNyBAQAogIyBkZWZpbmUgQVRJX01BWF9QQ0lHQVJUX1BBR0VTCQk4MTkyCS8qKjwgMzIgTUIgYXBlcnR1cmUsIDRLIHBhZ2VzICovCiAjIGRlZmluZSBBVElfUENJR0FSVF9QQUdFX1NJWkUJCTQwOTYJLyoqPCBQQ0kgR0FSVCBwYWdlIHNpemUgKi8KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZHJtX2F0aV9hbGxvY19wY2lnYXJ0X3RhYmxlKHZvaWQpCitzdGF0aWMgdm9pZCAqZHJtX2F0aV9hbGxvY19wY2lnYXJ0X3RhYmxlKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtNzIsMjcgKzcyLDI2IEBACiAJfQogCiAJRFJNX0RFQlVHKCIlczogcmV0dXJuaW5nIDB4JTA4bHhcbiIsIF9fRlVOQ1RJT05fXywgYWRkcmVzcyk7Ci0JcmV0dXJuIGFkZHJlc3M7CisJcmV0dXJuICh2b2lkICopYWRkcmVzczsKIH0KIAotc3RhdGljIHZvaWQgZHJtX2F0aV9mcmVlX3BjaWdhcnRfdGFibGUodW5zaWduZWQgbG9uZyBhZGRyZXNzKQorc3RhdGljIHZvaWQgZHJtX2F0aV9mcmVlX3BjaWdhcnRfdGFibGUodm9pZCAqYWRkcmVzcykKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgaTsKIAlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JcGFnZSA9IHZpcnRfdG9fcGFnZShhZGRyZXNzKTsKKwlwYWdlID0gdmlydF90b19wYWdlKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MpOwogCiAJZm9yIChpID0gMDsgaSA8IEFUSV9QQ0lHQVJUX1RBQkxFX1BBR0VTOyBpKyssIHBhZ2UrKykgewogCQlfX3B1dF9wYWdlKHBhZ2UpOwogCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKIAl9CiAKLQlmcmVlX3BhZ2VzKGFkZHJlc3MsIEFUSV9QQ0lHQVJUX1RBQkxFX09SREVSKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MsIEFUSV9QQ0lHQVJUX1RBQkxFX09SREVSKTsKIH0KIAotaW50IGRybV9hdGlfcGNpZ2FydF9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCSAgICBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqIGdhcnRfaW5mbykKK2ludCBkcm1fYXRpX3BjaWdhcnRfY2xlYW51cChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKmdhcnRfaW5mbykKIHsKIAlkcm1fc2dfbWVtX3QgKmVudHJ5ID0gZGV2LT5zZzsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzOwpAQCAtMTM2LDEwICsxMzUsMTAgQEAKIAogRVhQT1JUX1NZTUJPTChkcm1fYXRpX3BjaWdhcnRfY2xlYW51cCk7CiAKLWludCBkcm1fYXRpX3BjaWdhcnRfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9hdGlfcGNpZ2FydF9pbmZvICogZ2FydF9pbmZvKQoraW50IGRybV9hdGlfcGNpZ2FydF9pbml0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqZ2FydF9pbmZvKQogewogCWRybV9zZ19tZW1fdCAqZW50cnkgPSBkZXYtPnNnOwotCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IDA7CisJdm9pZCAqYWRkcmVzcyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBwYWdlczsKIAl1MzIgKnBjaV9nYXJ0LCBwYWdlX2Jhc2UsIGJ1c19hZGRyZXNzID0gMDsKIAlpbnQgaSwgaiwgcmV0ID0gMDsKQEAgLTE2Myw3ICsxNjIsNyBAQAogCQkJZ290byBkb25lOwogCQl9CiAKLQkJYnVzX2FkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsICh2b2lkICopYWRkcmVzcywKKwkJYnVzX2FkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsIGFkZHJlc3MsCiAJCQkJCSAgICAgQVRJX1BDSUdBUlRfVEFCTEVfUEFHRVMgKgogCQkJCQkgICAgIFBBR0VfU0laRSwgUENJX0RNQV9UT0RFVklDRSk7CiAJCWlmIChidXNfYWRkcmVzcyA9PSAwKSB7CkBAIC0xNzYsNyArMTc1LDcgQEAKIAkJYWRkcmVzcyA9IGdhcnRfaW5mby0+YWRkcjsKIAkJYnVzX2FkZHJlc3MgPSBnYXJ0X2luZm8tPmJ1c19hZGRyOwogCQlEUk1fREVCVUcoIlBDSTogR2FydCBUYWJsZTogVlJBTSAlMDhYIG1hcHBlZCBhdCAlMDhsWFxuIiwKLQkJCSAgYnVzX2FkZHJlc3MsIGFkZHJlc3MpOworCQkJICBidXNfYWRkcmVzcywgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyk7CiAJfQogCiAJcGNpX2dhcnQgPSAodTMyICopIGFkZHJlc3M7CkBAIC0xOTUsNyArMTk0LDcgQEAKIAkJaWYgKGVudHJ5LT5idXNhZGRyW2ldID09IDApIHsKIAkJCURSTV9FUlJPUigidW5hYmxlIHRvIG1hcCBQQ0lHQVJUIHBhZ2VzIVxuIik7CiAJCQlkcm1fYXRpX3BjaWdhcnRfY2xlYW51cChkZXYsIGdhcnRfaW5mbyk7Ci0JCQlhZGRyZXNzID0gMDsKKwkJCWFkZHJlc3MgPSBOVUxMOwogCQkJYnVzX2FkZHJlc3MgPSAwOwogCQkJZ290byBkb25lOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm0uaAppbmRleCA2NGQ2MjM3Li45ZGEwZGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtLmgKQEAgLTkwLDggKzkwLDggQEAKICNkZWZpbmUgRFJNX01BWF9PUkRFUgkyMgkgIC8qKjwgVXAgdG8gMl4yMiBieXRlcyA9IDRNQiAqLwogI2RlZmluZSBEUk1fUkFNX1BFUkNFTlQgMTAJICAvKio8IEhvdyBtdWNoIHN5c3RlbSByYW0gY2FuIHdlIGxvY2s/ICovCiAKLSNkZWZpbmUgX0RSTV9MT0NLX0hFTEQJMHg4MDAwMDAwMCAvKio8IEhhcmR3YXJlIGxvY2sgaXMgaGVsZCAqLwotI2RlZmluZSBfRFJNX0xPQ0tfQ09OVAkweDQwMDAwMDAwIC8qKjwgSGFyZHdhcmUgbG9jayBpcyBjb250ZW5kZWQgKi8KKyNkZWZpbmUgX0RSTV9MT0NLX0hFTEQJMHg4MDAwMDAwMFUgLyoqPCBIYXJkd2FyZSBsb2NrIGlzIGhlbGQgKi8KKyNkZWZpbmUgX0RSTV9MT0NLX0NPTlQJMHg0MDAwMDAwMFUgLyoqPCBIYXJkd2FyZSBsb2NrIGlzIGNvbnRlbmRlZCAqLwogI2RlZmluZSBfRFJNX0xPQ0tfSVNfSEVMRChsb2NrKQkgICAoKGxvY2spICYgX0RSTV9MT0NLX0hFTEQpCiAjZGVmaW5lIF9EUk1fTE9DS19JU19DT05UKGxvY2spCSAgICgobG9jaykgJiBfRFJNX0xPQ0tfQ09OVCkKICNkZWZpbmUgX0RSTV9MT0NLSU5HX0NPTlRFWFQobG9jaykgKChsb2NrKSAmIH4oX0RSTV9MT0NLX0hFTER8X0RSTV9MT0NLX0NPTlQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1QLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaAppbmRleCAzZGMzYzlkLi41NGI1NjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaApAQCAtMTQ0LDIwICsxNDQsNiBAQAogLyoqIFxuYW1lIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgc2VjdGlvbiAqLwogLypAeyovCiAKLSNpZm5kZWYgTU9EVUxFX0xJQ0VOU0UKLSNkZWZpbmUgTU9EVUxFX0xJQ0VOU0UoeCkKLSNlbmRpZgotCi0jaWZuZGVmIHByZWVtcHRfZGlzYWJsZQotI2RlZmluZSBwcmVlbXB0X2Rpc2FibGUoKQotI2RlZmluZSBwcmVlbXB0X2VuYWJsZSgpCi0jZW5kaWYKLQotI2lmbmRlZiBwdGVfb2Zmc2V0X21hcAotI2RlZmluZSBwdGVfb2Zmc2V0X21hcCBwdGVfb2Zmc2V0Ci0jZGVmaW5lIHB0ZV91bm1hcChwdGUpCi0jZW5kaWYKLQogI2RlZmluZSBEUk1fUlBSX0FSRyh2bWEpIHZtYSwKIAogI2RlZmluZSBWTV9PRkZTRVQodm1hKSAoKHZtYSktPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpCkBAIC0yODYsMTAgKzI3MiwxMyBAQAogdHlwZWRlZiBpbnQgZHJtX2lvY3RsX2NvbXBhdF90KHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAorI2RlZmluZSBEUk1fQVVUSAkweDEKKyNkZWZpbmUJRFJNX01BU1RFUgkweDIKKyNkZWZpbmUgRFJNX1JPT1RfT05MWQkweDQKKwogdHlwZWRlZiBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2MgewogCWRybV9pb2N0bF90ICpmdW5jOwotCWludCBhdXRoX25lZWRlZDsKLQlpbnQgcm9vdF9vbmx5OworCWludCBmbGFnczsKIH0gZHJtX2lvY3RsX2Rlc2NfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX2RldnN0YXRlIHsKQEAgLTM4NCw2ICszNzMsNyBAQAogLyoqIEZpbGUgcHJpdmF0ZSBkYXRhICovCiB0eXBlZGVmIHN0cnVjdCBkcm1fZmlsZSB7CiAJaW50IGF1dGhlbnRpY2F0ZWQ7CisJaW50IG1hc3RlcjsKIAlpbnQgbWlub3I7CiAJcGlkX3QgcGlkOwogCXVpZF90IHVpZDsKQEAgLTUzMiw4ICs1MjIsOSBAQAogdHlwZWRlZiBzdHJ1Y3QgYXRpX3BjaWdhcnRfaW5mbyB7CiAJaW50IGdhcnRfdGFibGVfbG9jYXRpb247CiAJaW50IGlzX3BjaWU7Ci0JdW5zaWduZWQgbG9uZyBhZGRyOworCXZvaWQgKmFkZHI7CiAJZG1hX2FkZHJfdCBidXNfYWRkcjsKKwlkcm1fbG9jYWxfbWFwX3QgbWFwcGluZzsKIH0gZHJtX2F0aV9wY2lnYXJ0X2luZm87CiAKIC8qKgpAQCAtNTQ0LDE2ICs1MzUsMTQgQEAKIHN0cnVjdCBkcm1fZGV2aWNlOwogCiBzdHJ1Y3QgZHJtX2RyaXZlciB7Ci0JaW50ICgqcHJlaW5pdCkgKHN0cnVjdCBkcm1fZGV2aWNlICosIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotCXZvaWQgKCpwcmVyZWxlYXNlKSAoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGZpbGUgKiBmaWxwKTsKLQl2b2lkICgqcHJldGFrZWRvd24pIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLQlpbnQgKCpwb3N0Y2xlYW51cCkgKHN0cnVjdCBkcm1fZGV2aWNlICopOwotCWludCAoKnByZXNldHVwKSAoc3RydWN0IGRybV9kZXZpY2UgKik7Ci0JaW50ICgqcG9zdHNldHVwKSAoc3RydWN0IGRybV9kZXZpY2UgKik7CisJaW50ICgqbG9hZCkgKHN0cnVjdCBkcm1fZGV2aWNlICosIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCWludCAoKmZpcnN0b3BlbikgKHN0cnVjdCBkcm1fZGV2aWNlICopOworCWludCAoKm9wZW4pIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBkcm1fZmlsZV90ICopOworCXZvaWQgKCpwcmVjbG9zZSkgKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBmaWxlICogZmlscCk7CisJdm9pZCAoKnBvc3RjbG9zZSkgKHN0cnVjdCBkcm1fZGV2aWNlICosIGRybV9maWxlX3QgKik7CisJdm9pZCAoKmxhc3RjbG9zZSkgKHN0cnVjdCBkcm1fZGV2aWNlICopOworCWludCAoKnVubG9hZCkgKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCWludCAoKmRtYV9pb2N0bCkgKERSTV9JT0NUTF9BUkdTKTsKLQlpbnQgKCpvcGVuX2hlbHBlcikgKHN0cnVjdCBkcm1fZGV2aWNlICosIGRybV9maWxlX3QgKik7Ci0Jdm9pZCAoKmZyZWVfZmlscF9wcml2KSAoc3RydWN0IGRybV9kZXZpY2UgKiwgZHJtX2ZpbGVfdCAqKTsKLQl2b2lkICgqcmVsZWFzZSkgKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBmaWxlICogZmlscCk7CiAJdm9pZCAoKmRtYV9yZWFkeSkgKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCWludCAoKmRtYV9xdWllc2NlbnQpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAlpbnQgKCpjb250ZXh0X2N0b3IpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGNvbnRleHQpOwpAQCAtNTYxLDggKzU1MCw5IEBACiAJaW50ICgqa2VybmVsX2NvbnRleHRfc3dpdGNoKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBvbGQsCiAJCQkJICAgICAgaW50IG5ldyk7CiAJdm9pZCAoKmtlcm5lbF9jb250ZXh0X3N3aXRjaF91bmxvY2spIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKLQkJCQkJICAgICAgZHJtX2xvY2tfdCAqIGxvY2spOworCQkJCQkgICAgICBkcm1fbG9ja190ICpsb2NrKTsKIAlpbnQgKCp2Ymxhbmtfd2FpdCkgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKKwlpbnQgKCpkcmlfbGlicmFyeV9uYW1lKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgY2hhciAqYnVmKTsKIAogCS8qKgogCSAqIENhbGxlZCBieSBcYyBkcm1fZGV2aWNlX2lzX2FncC4gIFR5cGljYWxseSB1c2VkIHRvIGRldGVybWluZSBpZiBhCkBAIC01NzksMTYgKzU2OSwyNCBAQAogCiAJLyogdGhlc2UgaGF2ZSB0byBiZSBmaWxsZWQgaW4gKi8KIAotCWludCAoKnBvc3Rpbml0KSAoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci0JIGlycXJldHVybl90KCppcnFfaGFuZGxlcikgKERSTV9JUlFfQVJHUyk7CisJaXJxcmV0dXJuX3QoKmlycV9oYW5kbGVyKSAoRFJNX0lSUV9BUkdTKTsKIAl2b2lkICgqaXJxX3ByZWluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAJdm9pZCAoKmlycV9wb3N0aW5zdGFsbCkgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAl2b2lkICgqaXJxX3VuaW5zdGFsbCkgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAl2b2lkICgqcmVjbGFpbV9idWZmZXJzKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBmaWxlICogZmlscCk7CisJdm9pZCAoKnJlY2xhaW1fYnVmZmVyc19sb2NrZWQpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCk7CiAJdW5zaWduZWQgbG9uZyAoKmdldF9tYXBfb2ZzKSAoZHJtX21hcF90ICogbWFwKTsKIAl1bnNpZ25lZCBsb25nICgqZ2V0X3JlZ19vZnMpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAJdm9pZCAoKnNldF92ZXJzaW9uKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9zZXRfdmVyc2lvbl90ICogc3YpOwotCWludCAoKnZlcnNpb24pIChkcm1fdmVyc2lvbl90ICogdmVyc2lvbik7CisKKwlpbnQgbWFqb3I7CisJaW50IG1pbm9yOworCWludCBwYXRjaGxldmVsOworCWNoYXIgKm5hbWU7CisJY2hhciAqZGVzYzsKKwljaGFyICpkYXRlOworCiAJdTMyIGRyaXZlcl9mZWF0dXJlczsKIAlpbnQgZGV2X3ByaXZfc2l6ZTsKIAlkcm1faW9jdGxfZGVzY190ICppb2N0bHM7CkBAIC03NTIsMTkgKzc1MCw0MyBAQAogewogCXJldHVybiBkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1VTRV9NVFJSKTsKIH0KKworI2RlZmluZSBEUk1fTVRSUl9XQwkJTVRSUl9UWVBFX1dSQ09NQgorCitzdGF0aWMgaW5saW5lIGludCBkcm1fbXRycl9hZGQodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIG10cnJfYWRkKG9mZnNldCwgc2l6ZSwgZmxhZ3MsIDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkcm1fbXRycl9kZWwoaW50IGhhbmRsZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIG10cnJfZGVsKGhhbmRsZSwgb2Zmc2V0LCBzaXplKTsKK30KKwogI2Vsc2UKICNkZWZpbmUgZHJtX2NvcmVfaGFzX01UUlIoZGV2KSAoMCkKKworI2RlZmluZSBEUk1fTVRSUl9XQwkJMAorCitzdGF0aWMgaW5saW5lIGludCBkcm1fbXRycl9hZGQodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRybV9tdHJyX2RlbChpbnQgaGFuZGxlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqIFxuYW1lIEludGVybmFsIGZ1bmN0aW9uIGRlZmluaXRpb25zICovCiAvKkB7Ki8KIAotCQkJCS8qIE1pc2MuIHN1cHBvcnQgKGRybV9pbml0LmgpICovCi1leHRlcm4gaW50IGRybV9mbGFnczsKLWV4dGVybiB2b2lkIGRybV9wYXJzZV9vcHRpb25zKGNoYXIgKnMpOwotZXh0ZXJuIGludCBkcm1fY3B1X3ZhbGlkKHZvaWQpOwotCiAJCQkJLyogRHJpdmVyIHN1cHBvcnQgKGRybV9kcnYuaCkgKi8KIGV4dGVybiBpbnQgZHJtX2luaXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcik7CiBleHRlcm4gdm9pZCBkcm1fZXhpdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKTsKQEAgLTc3MiwxMiArNzk0LDExIEBACiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGxvbmcgZHJtX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fdGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgZHJtX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKmRldik7CiAKIAkJCQkvKiBEZXZpY2Ugc3VwcG9ydCAoZHJtX2ZvcHMuaCkgKi8KIGV4dGVybiBpbnQgZHJtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogZXh0ZXJuIGludCBkcm1fc3R1Yl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKLWV4dGVybiBpbnQgZHJtX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgZHJtX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pOwogZXh0ZXJuIGludCBkcm1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiAKQEAgLTgxOSw2ICs4NDAsOCBAQAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGludCBkcm1fc2V0dmVyc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCBkcm1fbm9vcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogCQkJCS8qIENvbnRleHQgSU9DVEwgc3VwcG9ydCAoZHJtX2NvbnRleHQuaCkgKi8KIGV4dGVybiBpbnQgZHJtX3Jlc2N0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKQEAgLTg1NywxMCArODgwLDYgQEAKIGV4dGVybiBpbnQgZHJtX2F1dGhtYWdpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKLQkJCQkvKiBQbGFjZWhvbGRlciBmb3IgaW9jdGxzIHBhc3QgKi8KLWV4dGVybiBpbnQgZHJtX25vb3Aoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci0KIAkJCQkvKiBMb2NraW5nIElPQ1RMIHN1cHBvcnQgKGRybV9sb2NrLmgpICovCiBleHRlcm4gaW50IGRybV9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwpAQCAtODczLDYgKzg5Miw3IEBACiAJCQkJLyogQnVmZmVyIG1hbmFnZW1lbnQgc3VwcG9ydCAoZHJtX2J1ZnMuaCkgKi8KIGV4dGVybiBpbnQgZHJtX2FkZGJ1ZnNfYWdwKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9kZXNjX3QgKiByZXF1ZXN0KTsKIGV4dGVybiBpbnQgZHJtX2FkZGJ1ZnNfcGNpKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9kZXNjX3QgKiByZXF1ZXN0KTsKK2V4dGVybiBpbnQgZHJtX2FkZGJ1ZnNfZmIoZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfZGVzY190ICpyZXF1ZXN0KTsKIGV4dGVybiBpbnQgZHJtX2FkZG1hcChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsCiAJCSAgICAgIHVuc2lnbmVkIGludCBzaXplLCBkcm1fbWFwX3R5cGVfdCB0eXBlLAogCQkgICAgICBkcm1fbWFwX2ZsYWdzX3QgZmxhZ3MsIGRybV9sb2NhbF9tYXBfdCAqKiBtYXBfcHRyKTsKQEAgLTkwOCw4ICs5MjgsOCBAQAogCQkJCS8qIElSUSBzdXBwb3J0IChkcm1faXJxLmgpICovCiBleHRlcm4gaW50IGRybV9jb250cm9sKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1faXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIGlycXJldHVybl90IGRybV9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOworZXh0ZXJuIGludCBkcm1faXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIHZvaWQgZHJtX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIHZvaWQgZHJtX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiB2b2lkIGRybV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwpAQCAtOTMzLDEzICs5NTMsMTcgQEAKIGV4dGVybiBpbnQgZHJtX2FncF9pbmZvKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2FncF9pbmZvX3QgKiBpbmZvKTsKIGV4dGVybiBpbnQgZHJtX2FncF9pbmZvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX2FsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorZXh0ZXJuIGludCBkcm1fYWdwX2FsbG9jKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2J1ZmZlcl90ICpyZXF1ZXN0KTsKK2V4dGVybiBpbnQgZHJtX2FncF9hbGxvY19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9hZ3BfZnJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2V4dGVybiBpbnQgZHJtX2FncF9mcmVlKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2J1ZmZlcl90ICpyZXF1ZXN0KTsKK2V4dGVybiBpbnQgZHJtX2FncF9mcmVlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX3VuYmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2V4dGVybiBpbnQgZHJtX2FncF91bmJpbmQoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYmluZGluZ190ICpyZXF1ZXN0KTsKK2V4dGVybiBpbnQgZHJtX2FncF91bmJpbmRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2FncF9iaW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorZXh0ZXJuIGludCBkcm1fYWdwX2JpbmQoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYmluZGluZ190ICpyZXF1ZXN0KTsKK2V4dGVybiBpbnQgZHJtX2FncF9iaW5kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIERSTV9BR1BfTUVNICpkcm1fYWdwX2FsbG9jYXRlX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCiAJCQkJCSAgICBzaXplX3QgcGFnZXMsIHUzMiB0eXBlKTsKQEAgLTk5MSwxMCArMTAxNSw4IEBACiAJCQkJCQljaGFyICpuYW1lKTsKIGV4dGVybiB2b2lkIGRybV9zeXNmc19kZXN0cm95KHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MgKmNzKTsKIGV4dGVybiBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkcm1fc3lzZnNfZGV2aWNlX2FkZChzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzICpjcywKLQkJCQkJCSBkZXZfdCBkZXYsCi0JCQkJCQkgc3RydWN0IGRldmljZSAqZGV2aWNlLAotCQkJCQkJIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLWV4dGVybiB2b2lkIGRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKGRldl90IGRldik7CisJCQkJCQkgZHJtX2hlYWRfdCAqaGVhZCk7CitleHRlcm4gdm9pZCBkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpOwogCiAvKiBJbmxpbmUgcmVwbGFjZW1lbnRzIGZvciBEUk1fSU9SRU1BUCBtYWNyb3MgKi8KIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgZHJtX2NvcmVfaW9yZW1hcChzdHJ1Y3QgZHJtX21hcCAqbWFwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jCmluZGV4IDJiNjQ1M2EuLmZhYmM5MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9hZ3BzdXBwb3J0LmMKQEAgLTEsNSArMSw1IEBACiAvKioKLSAqIFxmaWxlIGRybV9hZ3BzdXBwb3J0LmgKKyAqIFxmaWxlIGRybV9hZ3BzdXBwb3J0LmMKICAqIERSTSBzdXBwb3J0IGZvciBBR1AvR0FSVCBiYWNrZW5kCiAgKgogICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KQEAgLTkxLDcgKzkxLDcgQEAKIC8qKgogICogQWNxdWlyZSB0aGUgQUdQIGRldmljZS4KICAqCi0gKiBccGFyYW0gZGV2IERSTSBkZXZpY2UgdGhhdCBpcyB0byBhY3F1aXJlIEFHUAorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlIHRoYXQgaXMgdG8gYWNxdWlyZSBBR1AuCiAgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgogICoKICAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGhhc24ndCBiZWVuIGFjcXVpcmVkIGJlZm9yZSBhbmQgY2FsbHMKQEAgLTEzNCw3ICsxMzQsNyBAQAogLyoqCiAgKiBSZWxlYXNlIHRoZSBBR1AgZGV2aWNlLgogICoKLSAqIFxwYXJhbSBkZXYgRFJNIGRldmljZSB0aGF0IGlzIHRvIHJlbGVhc2UgQUdQCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UgdGhhdCBpcyB0byByZWxlYXNlIEFHUC4KICAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCiAgKgogICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaGFzIGJlZW4gYWNxdWlyZWQgYW5kIGNhbGxzIFxjIGFncF9iYWNrZW5kX3JlbGVhc2UuCkBAIC0xNDcsNyArMTQ3LDYgQEAKIAlkZXYtPmFncC0+YWNxdWlyZWQgPSAwOwogCXJldHVybiAwOwogfQotCiBFWFBPUlRfU1lNQk9MKGRybV9hZ3BfcmVsZWFzZSk7CiAKIGludCBkcm1fYWdwX3JlbGVhc2VfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCkBAIC0yMDgsMzAgKzIwNywyMiBAQAogICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaXMgcHJlc2VudCBhbmQgaGFzIGJlZW4gYWNxdWlyZWQsIGFsbG9jYXRlcyB0aGUKICAqIG1lbW9yeSB2aWEgYWxsb2NfYWdwKCkgYW5kIGNyZWF0ZXMgYSBkcm1fYWdwX21lbSBlbnRyeSBmb3IgaXQuCiAgKi8KLWludCBkcm1fYWdwX2FsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoraW50IGRybV9hZ3BfYWxsb2MoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYnVmZmVyX3QgKnJlcXVlc3QpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYWdwX2J1ZmZlcl90IHJlcXVlc3Q7CiAJZHJtX2FncF9tZW1fdCAqZW50cnk7CiAJRFJNX0FHUF9NRU0gKm1lbW9yeTsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzOwogCXUzMiB0eXBlOwotCWRybV9hZ3BfYnVmZmVyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCiAJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsIGFyZ3AsIHNpemVvZihyZXF1ZXN0KSkpCi0JCXJldHVybiAtRUZBVUxUOwogCWlmICghKGVudHJ5ID0gZHJtX2FsbG9jKHNpemVvZigqZW50cnkpLCBEUk1fTUVNX0FHUExJU1RTKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CiAKLQlwYWdlcyA9IChyZXF1ZXN0LnNpemUgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKLQl0eXBlID0gKHUzMikgcmVxdWVzdC50eXBlOwotCisJcGFnZXMgPSAocmVxdWVzdC0+c2l6ZSArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCXR5cGUgPSAodTMyKSByZXF1ZXN0LT50eXBlOwogCWlmICghKG1lbW9yeSA9IGRybV9hbGxvY19hZ3AoZGV2LCBwYWdlcywgdHlwZSkpKSB7CiAJCWRybV9mcmVlKGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9BR1BMSVNUUyk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjQ3LDE2ICsyMzgsMzkgQEAKIAkJZGV2LT5hZ3AtPm1lbW9yeS0+cHJldiA9IGVudHJ5OwogCWRldi0+YWdwLT5tZW1vcnkgPSBlbnRyeTsKIAotCXJlcXVlc3QuaGFuZGxlID0gZW50cnktPmhhbmRsZTsKLQlyZXF1ZXN0LnBoeXNpY2FsID0gbWVtb3J5LT5waHlzaWNhbDsKKwlyZXF1ZXN0LT5oYW5kbGUgPSBlbnRyeS0+aGFuZGxlOworCXJlcXVlc3QtPnBoeXNpY2FsID0gbWVtb3J5LT5waHlzaWNhbDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fYWdwX2FsbG9jKTsKKworaW50IGRybV9hZ3BfYWxsb2NfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9hZ3BfYnVmZmVyX3QgcmVxdWVzdDsKKwlkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgZXJyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCBhcmdwLCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRybV9hZ3BfYWxsb2MoZGV2LCAmcmVxdWVzdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSkpIHsKKwkJZHJtX2FncF9tZW1fdCAqZW50cnkgPSBkZXYtPmFncC0+bWVtb3J5OworCiAJCWRldi0+YWdwLT5tZW1vcnkgPSBlbnRyeS0+bmV4dDsKIAkJZGV2LT5hZ3AtPm1lbW9yeS0+cHJldiA9IE5VTEw7Ci0JCWRybV9mcmVlX2FncChtZW1vcnksIHBhZ2VzKTsKKwkJZHJtX2ZyZWVfYWdwKGVudHJ5LT5tZW1vcnksIGVudHJ5LT5wYWdlcyk7CiAJCWRybV9mcmVlKGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9BR1BMSVNUUyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0yOTMsMjEgKzMwNywxNCBAQAogICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaXMgcHJlc2VudCBhbmQgYWNxdWlyZWQsIGxvb2tzLXVwIHRoZSBBR1AgbWVtb3J5CiAgKiBlbnRyeSBhbmQgcGFzc2VzIGl0IHRvIHRoZSB1bmJpbmRfYWdwKCkgZnVuY3Rpb24uCiAgKi8KLWludCBkcm1fYWdwX3VuYmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitpbnQgZHJtX2FncF91bmJpbmQoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYmluZGluZ190ICpyZXF1ZXN0KQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2FncF9iaW5kaW5nX3QgcmVxdWVzdDsKIAlkcm1fYWdwX21lbV90ICplbnRyeTsKIAlpbnQgcmV0OwogCiAJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoY29weV9mcm9tX3VzZXIKLQkgICAgKCZyZXF1ZXN0LCAoZHJtX2FncF9iaW5kaW5nX3QgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKCEoZW50cnkgPSBkcm1fYWdwX2xvb2t1cF9lbnRyeShkZXYsIHJlcXVlc3QuaGFuZGxlKSkpCisJaWYgKCEoZW50cnkgPSBkcm1fYWdwX2xvb2t1cF9lbnRyeShkZXYsIHJlcXVlc3QtPmhhbmRsZSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIWVudHJ5LT5ib3VuZCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMTYsNiArMzIzLDIxIEBACiAJCWVudHJ5LT5ib3VuZCA9IDA7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0woZHJtX2FncF91bmJpbmQpOworCitpbnQgZHJtX2FncF91bmJpbmRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fYWdwX2JpbmRpbmdfdCByZXF1ZXN0OworCisJaWYgKGNvcHlfZnJvbV91c2VyCisJICAgICgmcmVxdWVzdCwgKGRybV9hZ3BfYmluZGluZ190IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9hZ3BfdW5iaW5kKGRldiwgJnJlcXVlc3QpOworfQogCiAvKioKICAqIEJpbmQgQUdQIG1lbW9yeSBpbnRvIHRoZSBHQVRUIChpb2N0bCkKQEAgLTMzMCwyNiArMzUyLDE5IEBACiAgKiBpcyBjdXJyZW50bHkgYm91bmQgaW50byB0aGUgR0FUVC4gTG9va3MtdXAgdGhlIEFHUCBtZW1vcnkgZW50cnkgYW5kIHBhc3NlcwogICogaXQgdG8gYmluZF9hZ3AoKSBmdW5jdGlvbi4KICAqLwotaW50IGRybV9hZ3BfYmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoraW50IGRybV9hZ3BfYmluZChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9iaW5kaW5nX3QgKnJlcXVlc3QpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYWdwX2JpbmRpbmdfdCByZXF1ZXN0OwogCWRybV9hZ3BfbWVtX3QgKmVudHJ5OwogCWludCByZXRjb2RlOwogCWludCBwYWdlOwogCiAJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoY29weV9mcm9tX3VzZXIKLQkgICAgKCZyZXF1ZXN0LCAoZHJtX2FncF9iaW5kaW5nX3QgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKCEoZW50cnkgPSBkcm1fYWdwX2xvb2t1cF9lbnRyeShkZXYsIHJlcXVlc3QuaGFuZGxlKSkpCisJaWYgKCEoZW50cnkgPSBkcm1fYWdwX2xvb2t1cF9lbnRyeShkZXYsIHJlcXVlc3QtPmhhbmRsZSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoZW50cnktPmJvdW5kKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlwYWdlID0gKHJlcXVlc3Qub2Zmc2V0ICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJcGFnZSA9IChyZXF1ZXN0LT5vZmZzZXQgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKIAlpZiAoKHJldGNvZGUgPSBkcm1fYmluZF9hZ3AoZW50cnktPm1lbW9yeSwgcGFnZSkpKQogCQlyZXR1cm4gcmV0Y29kZTsKIAllbnRyeS0+Ym91bmQgPSBkZXYtPmFncC0+YmFzZSArIChwYWdlIDw8IFBBR0VfU0hJRlQpOwpAQCAtMzU3LDYgKzM3MiwyMSBAQAogCQkgIGRldi0+YWdwLT5iYXNlLCBlbnRyeS0+Ym91bmQpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChkcm1fYWdwX2JpbmQpOworCitpbnQgZHJtX2FncF9iaW5kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fYWdwX2JpbmRpbmdfdCByZXF1ZXN0OworCisJaWYgKGNvcHlfZnJvbV91c2VyCisJICAgICgmcmVxdWVzdCwgKGRybV9hZ3BfYmluZGluZ190IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9hZ3BfYmluZChkZXYsICZyZXF1ZXN0KTsKK30KIAogLyoqCiAgKiBGcmVlIEFHUCBtZW1vcnkgKGlvY3RsKS4KQEAgLTM3MiwyMCArNDAyLDEzIEBACiAgKiB1bmJpbmRfYWdwKCkuIEZyZWVzIGl0IHZpYSBmcmVlX2FncCgpIGFzIHdlbGwgYXMgdGhlIGVudHJ5IGl0c2VsZgogICogYW5kIHVubGlua3MgZnJvbSB0aGUgZG91Ymx5IGxpbmtlZCBsaXN0IGl0J3MgaW5zZXJ0ZWQgaW4uCiAgKi8KLWludCBkcm1fYWdwX2ZyZWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK2ludCBkcm1fYWdwX2ZyZWUoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYnVmZmVyX3QgKnJlcXVlc3QpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYWdwX2J1ZmZlcl90IHJlcXVlc3Q7CiAJZHJtX2FncF9tZW1fdCAqZW50cnk7CiAKIAlpZiAoIWRldi0+YWdwIHx8ICFkZXYtPmFncC0+YWNxdWlyZWQpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChjb3B5X2Zyb21fdXNlcgotCSAgICAoJnJlcXVlc3QsIChkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmICghKGVudHJ5ID0gZHJtX2FncF9sb29rdXBfZW50cnkoZGV2LCByZXF1ZXN0LmhhbmRsZSkpKQorCWlmICghKGVudHJ5ID0gZHJtX2FncF9sb29rdXBfZW50cnkoZGV2LCByZXF1ZXN0LT5oYW5kbGUpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGVudHJ5LT5ib3VuZCkKIAkJZHJtX3VuYmluZF9hZ3AoZW50cnktPm1lbW9yeSk7CkBAIC00MDIsMTIgKzQyNSwzMCBAQAogCWRybV9mcmVlKGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9BR1BMSVNUUyk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGRybV9hZ3BfZnJlZSk7CisKK2ludCBkcm1fYWdwX2ZyZWVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9hZ3BfYnVmZmVyX3QgcmVxdWVzdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcgorCSAgICAoJnJlcXVlc3QsIChkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9hZ3BfZnJlZShkZXYsICZyZXF1ZXN0KTsKK30KIAogLyoqCiAgKiBJbml0aWFsaXplIHRoZSBBR1AgcmVzb3VyY2VzLgogICoKICAqIFxyZXR1cm4gcG9pbnRlciB0byBhIGRybV9hZ3BfaGVhZCBzdHJ1Y3R1cmUuCiAgKgorICogR2V0cyB0aGUgZHJtX2FncF90IHN0cnVjdHVyZSB3aGljaCBpcyBtYWRlIGF2YWlsYWJsZSBieSB0aGUgYWdwZ2FydCBtb2R1bGUKKyAqIHZpYSB0aGUgaW50ZXJfbW9kdWxlXyogZnVuY3Rpb25zLiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIGRybV9hZ3BfaGVhZAorICogc3RydWN0dXJlLgogICovCiBkcm1fYWdwX2hlYWRfdCAqZHJtX2FncF9pbml0KGRybV9kZXZpY2VfdCAqIGRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwppbmRleCAzMTliZGVhLi4xZGIxMmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCkBAIC0zNiwyMiArMzYsMjEgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogCi11bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpCit1bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCByZXNvdXJjZSkKIHsKIAlyZXR1cm4gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgcmVzb3VyY2UpOwogfQotCiBFWFBPUlRfU1lNQk9MKGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQpOwogCi11bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2VfbGVuKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IHJlc291cmNlKQordW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX2xlbihkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50IHJlc291cmNlKQogewogCXJldHVybiBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgcmVzb3VyY2UpOwogfQogCiBFWFBPUlRfU1lNQk9MKGRybV9nZXRfcmVzb3VyY2VfbGVuKTsKIAotc3RhdGljIGRybV9tYXBfbGlzdF90ICpkcm1fZmluZF9tYXRjaGluZ19tYXAoZHJtX2RldmljZV90ICogZGV2LAotCQkJCQkgICAgIGRybV9sb2NhbF9tYXBfdCAqIG1hcCkKK3N0YXRpYyBkcm1fbWFwX2xpc3RfdCAqZHJtX2ZpbmRfbWF0Y2hpbmdfbWFwKGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCQkgICAgIGRybV9sb2NhbF9tYXBfdCAqbWFwKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAKQEAgLTc0LDcgKzczLDcgQEAKIAogI2lmZGVmIF9MUDY0CiBzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgSGFuZGxlSUQodW5zaWduZWQgbG9uZyBsaGFuZGxlLAotCQkJCQlkcm1fZGV2aWNlX3QgKiBkZXYpCisJCQkJCWRybV9kZXZpY2VfdCAqZGV2KQogewogCXN0YXRpYyB1bnNpZ25lZCBpbnQgbWFwMzJfaGFuZGxlID0gU1RBUlRfUkFOR0U7CiAJdW5zaWduZWQgaW50IGhhc2g7CkBAIC0xNTUsNyArMTU0LDcgQEAKIAljYXNlIF9EUk1fUkVHSVNURVJTOgogCWNhc2UgX0RSTV9GUkFNRV9CVUZGRVI6CiAjaWYgIWRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChfX2FscGhhX18pICYmICFkZWZpbmVkKF9faWE2NF9fKSAmJiAhZGVmaW5lZChfX3Bvd2VycGM2NF9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKQotCQlpZiAobWFwLT5vZmZzZXQgKyBtYXAtPnNpemUgPCBtYXAtPm9mZnNldCB8fAorCQlpZiAobWFwLT5vZmZzZXQgKyAobWFwLT5zaXplLTEpIDwgbWFwLT5vZmZzZXQgfHwKIAkJICAgIG1hcC0+b2Zmc2V0IDwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSkgewogCQkJZHJtX2ZyZWUobWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMwMSw2ICszMDAsOSBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKKwlpZiAoIShjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IG1hcC50eXBlID09IF9EUk1fQUdQKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwogCWVyciA9IGRybV9hZGRtYXBfY29yZShkZXYsIG1hcC5vZmZzZXQsIG1hcC5zaXplLCBtYXAudHlwZSwgbWFwLmZsYWdzLAogCQkJICAgICAgJm1hcGxpc3QpOwogCkBAIC0zMzIsNyArMzM0LDcgQEAKICAqCiAgKiBcc2EgZHJtX2FkZG1hcAogICovCi1pbnQgZHJtX3JtbWFwX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9sb2NhbF9tYXBfdCAqIG1hcCkKK2ludCBkcm1fcm1tYXBfbG9ja2VkKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbG9jYWxfbWFwX3QgKm1hcCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBOVUxMOwpAQCAtMzg0LDEwICszODYsOSBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZHJtX3JtbWFwX2xvY2tlZCk7CiAKLWludCBkcm1fcm1tYXAoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbG9jYWxfbWFwX3QgKiBtYXApCitpbnQgZHJtX3JtbWFwKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbG9jYWxfbWFwX3QgKm1hcCkKIHsKIAlpbnQgcmV0OwogCkBAIC0zOTcsNyArMzk4LDYgQEAKIAogCXJldHVybiByZXQ7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZHJtX3JtbWFwKTsKIAogLyogVGhlIHJtbWFwIGlvY3RsIGFwcGVhcnMgdG8gYmUgdW5uZWNlc3NhcnkuICBBbGwgbWFwcGluZ3MgYXJlIHRvcm4gZG93biBvbgpAQCAtNTQ4LDcgKzU0OCw3IEBACiAJRFJNX0RFQlVHKCJjb3VudDogICAgICAlZFxuIiwgY291bnQpOwogCURSTV9ERUJVRygib3JkZXI6ICAgICAgJWRcbiIsIG9yZGVyKTsKIAlEUk1fREVCVUcoInNpemU6ICAgICAgICVkXG4iLCBzaXplKTsKLQlEUk1fREVCVUcoImFncF9vZmZzZXQ6ICVsdVxuIiwgYWdwX29mZnNldCk7CisJRFJNX0RFQlVHKCJhZ3Bfb2Zmc2V0OiAlbHhcbiIsIGFncF9vZmZzZXQpOwogCURSTV9ERUJVRygiYWxpZ25tZW50OiAgJWRcbiIsIGFsaWdubWVudCk7CiAJRFJNX0RFQlVHKCJwYWdlX29yZGVyOiAlZFxuIiwgcGFnZV9vcmRlcik7CiAJRFJNX0RFQlVHKCJ0b3RhbDogICAgICAlZFxuIiwgdG90YWwpOwpAQCAtNjQ5LDYgKzY0OSw4IEBACiAJfQogCiAJZG1hLT5idWZfY291bnQgKz0gZW50cnktPmJ1Zl9jb3VudDsKKwlkbWEtPnNlZ19jb3VudCArPSBlbnRyeS0+c2VnX2NvdW50OworCWRtYS0+cGFnZV9jb3VudCArPSBieXRlX2NvdW50ID4+IFBBR0VfU0hJRlQ7CiAJZG1hLT5ieXRlX2NvdW50ICs9IGJ5dGVfY291bnQ7CiAKIAlEUk1fREVCVUcoImRtYS0+YnVmX2NvdW50IDogJWRcbiIsIGRtYS0+YnVmX2NvdW50KTsKQEAgLTY2NCw3ICs2NjYsNiBAQAogCWF0b21pY19kZWMoJmRldi0+YnVmX2FsbG9jKTsKIAlyZXR1cm4gMDsKIH0KLQogRVhQT1JUX1NZTUJPTChkcm1fYWRkYnVmc19hZ3ApOwogI2VuZGlmCQkJCS8qIF9fT1NfSEFTX0FHUCAqLwogCkBAIC02ODksOSArNjkwLDEzIEBACiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfUENJX0RNQSkpCiAJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKCFkbWEpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCiAJY291bnQgPSByZXF1ZXN0LT5jb3VudDsKIAlvcmRlciA9IGRybV9vcmRlcihyZXF1ZXN0LT5zaXplKTsKIAlzaXplID0gMSA8PCBvcmRlcjsKQEAgLTg4Miw3ICs4ODcsNiBAQAogCXJldHVybiAwOwogCiB9Ci0KIEVYUE9SVF9TWU1CT0woZHJtX2FkZGJ1ZnNfcGNpKTsKIAogc3RhdGljIGludCBkcm1fYWRkYnVmc19zZyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCkKQEAgLTkwOCw2ICs5MTIsOSBAQAogCWlmICghZG1hKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwogCWNvdW50ID0gcmVxdWVzdC0+Y291bnQ7CiAJb3JkZXIgPSBkcm1fb3JkZXIocmVxdWVzdC0+c2l6ZSk7CiAJc2l6ZSA9IDEgPDwgb3JkZXI7CkBAIC0xMDI2LDYgKzEwMzMsOCBAQAogCX0KIAogCWRtYS0+YnVmX2NvdW50ICs9IGVudHJ5LT5idWZfY291bnQ7CisJZG1hLT5zZWdfY291bnQgKz0gZW50cnktPnNlZ19jb3VudDsKKwlkbWEtPnBhZ2VfY291bnQgKz0gYnl0ZV9jb3VudCA+PiBQQUdFX1NISUZUOwogCWRtYS0+Ynl0ZV9jb3VudCArPSBieXRlX2NvdW50OwogCiAJRFJNX0RFQlVHKCJkbWEtPmJ1Zl9jb3VudCA6ICVkXG4iLCBkbWEtPmJ1Zl9jb3VudCk7CkBAIC0xMDQyLDcgKzEwNTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRybV9hZGRidWZzX2ZiKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9kZXNjX3QgKiByZXF1ZXN0KQoraW50IGRybV9hZGRidWZzX2ZiKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9kZXNjX3QgKiByZXF1ZXN0KQogewogCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9idWZfZW50cnlfdCAqZW50cnk7CkBAIC0xMDY1LDYgKzEwNzQsOSBAQAogCWlmICghZG1hKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwogCWNvdW50ID0gcmVxdWVzdC0+Y291bnQ7CiAJb3JkZXIgPSBkcm1fb3JkZXIocmVxdWVzdC0+c2l6ZSk7CiAJc2l6ZSA9IDEgPDwgb3JkZXI7CkBAIC0xMTgxLDYgKzExOTMsOCBAQAogCX0KIAogCWRtYS0+YnVmX2NvdW50ICs9IGVudHJ5LT5idWZfY291bnQ7CisJZG1hLT5zZWdfY291bnQgKz0gZW50cnktPnNlZ19jb3VudDsKKwlkbWEtPnBhZ2VfY291bnQgKz0gYnl0ZV9jb3VudCA+PiBQQUdFX1NISUZUOwogCWRtYS0+Ynl0ZV9jb3VudCArPSBieXRlX2NvdW50OwogCiAJRFJNX0RFQlVHKCJkbWEtPmJ1Zl9jb3VudCA6ICVkXG4iLCBkbWEtPmJ1Zl9jb3VudCk7CkBAIC0xMTk2LDYgKzEyMTAsOCBAQAogCWF0b21pY19kZWMoJmRldi0+YnVmX2FsbG9jKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZHJtX2FkZGJ1ZnNfZmIpOworCiAKIC8qKgogICogQWRkIGJ1ZmZlcnMgZm9yIERNQSB0cmFuc2ZlcnMgKGlvY3RsKS4KQEAgLTE1NzcsNSArMTU5Myw2IEBACiAKIAlyZXR1cm4gb3JkZXI7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZHJtX29yZGVyKTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKaW5kZXggYmQ5NThkNi4uZjg0MjU0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYwpAQCAtNDMzLDcgKzQzMyw3IEBACiAJaWYgKGN0eC5oYW5kbGUgIT0gRFJNX0tFUk5FTF9DT05URVhUKSB7CiAJCWlmIChkZXYtPmRyaXZlci0+Y29udGV4dF9jdG9yKQogCQkJaWYgKCFkZXYtPmRyaXZlci0+Y29udGV4dF9jdG9yKGRldiwgY3R4LmhhbmRsZSkpIHsKLQkJCQlEUk1fREVCVUcoICJSdW5uaW5nIG91dCBvZiBjdHhzIG9yIG1lbW9yeS5cbiIpOworCQkJCURSTV9ERUJVRygiUnVubmluZyBvdXQgb2YgY3R4cyBvciBtZW1vcnkuXG4iKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb3JlLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb3JlLmgKaW5kZXggY2M5N2JiOS4uZjRmOWRiNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvcmUuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb3JlLmgKQEAgLTI0LDExICsyNCwxMSBAQAogCiAjZGVmaW5lIENPUkVfTkFNRQkJImRybSIKICNkZWZpbmUgQ09SRV9ERVNDCQkiRFJNIHNoYXJlZCBjb3JlIHJvdXRpbmVzIgotI2RlZmluZSBDT1JFX0RBVEUJCSIyMDA0MDkyNSIKKyNkZWZpbmUgQ09SRV9EQVRFCQkiMjAwNTExMDIiCiAKICNkZWZpbmUgRFJNX0lGX01BSk9SCTEKICNkZWZpbmUgRFJNX0lGX01JTk9SCTIKIAogI2RlZmluZSBDT1JFX01BSk9SCTEKICNkZWZpbmUgQ09SRV9NSU5PUgkwCi0jZGVmaW5lIENPUkVfUEFUQ0hMRVZFTCAwCisjZGVmaW5lIENPUkVfUEFUQ0hMRVZFTCAxCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jCmluZGV4IDRkZmY3NTUuLmM0ZmE1YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jCkBAIC01Niw2NiArNTYsNjYgQEAKIAogLyoqIElvY3RsIHRhYmxlICovCiBzdGF0aWMgZHJtX2lvY3RsX2Rlc2NfdCBkcm1faW9jdGxzW10gPSB7Ci0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfVkVSU0lPTildID0ge2RybV92ZXJzaW9uLCAwLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfVU5JUVVFKV0gPSB7ZHJtX2dldHVuaXF1ZSwgMCwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX01BR0lDKV0gPSB7ZHJtX2dldG1hZ2ljLCAwLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9JUlFfQlVTSUQpXSA9IHtkcm1faXJxX2J5X2J1c2lkLCAwLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfTUFQKV0gPSB7ZHJtX2dldG1hcCwgMCwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX0NMSUVOVCldID0ge2RybV9nZXRjbGllbnQsIDAsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9TVEFUUyldID0ge2RybV9nZXRzdGF0cywgMCwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU0VUX1ZFUlNJT04pXSA9IHtkcm1fc2V0dmVyc2lvbiwgMCwgMX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfVkVSU0lPTildID0ge2RybV92ZXJzaW9uLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfVU5JUVVFKV0gPSB7ZHJtX2dldHVuaXF1ZSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX01BR0lDKV0gPSB7ZHJtX2dldG1hZ2ljLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9JUlFfQlVTSUQpXSA9IHtkcm1faXJxX2J5X2J1c2lkLCBEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9NQVApXSA9IHtkcm1fZ2V0bWFwLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfQ0xJRU5UKV0gPSB7ZHJtX2dldGNsaWVudCwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX1NUQVRTKV0gPSB7ZHJtX2dldHN0YXRzLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TRVRfVkVSU0lPTildID0ge2RybV9zZXR2ZXJzaW9uLCBEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NFVF9VTklRVUUpXSA9IHtkcm1fc2V0dW5pcXVlLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0JMT0NLKV0gPSB7ZHJtX25vb3AsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfVU5CTE9DSyldID0ge2RybV9ub29wLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FVVEhfTUFHSUMpXSA9IHtkcm1fYXV0aG1hZ2ljLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAogCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU0VUX1VOSVFVRSldID0ge2RybV9zZXR1bmlxdWUsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0JMT0NLKV0gPSB7ZHJtX25vb3AsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1VOQkxPQ0spXSA9IHtkcm1fbm9vcCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQVVUSF9NQUdJQyldID0ge2RybV9hdXRobWFnaWMsIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FERF9NQVApXSA9IHtkcm1fYWRkbWFwX2lvY3RsLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JNX01BUCldID0ge2RybV9ybW1hcF9pb2N0bCwgRFJNX0FVVEh9LAogCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUREX01BUCldID0ge2RybV9hZGRtYXBfaW9jdGwsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JNX01BUCldID0ge2RybV9ybW1hcF9pb2N0bCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU0VUX1NBUkVBX0NUWCldID0ge2RybV9zZXRzYXJlYWN0eCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfU0FSRUFfQ1RYKV0gPSB7ZHJtX2dldHNhcmVhY3R4LCBEUk1fQVVUSH0sCiAKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TRVRfU0FSRUFfQ1RYKV0gPSB7ZHJtX3NldHNhcmVhY3R4LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfU0FSRUFfQ1RYKV0gPSB7ZHJtX2dldHNhcmVhY3R4LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BRERfQ1RYKV0gPSB7ZHJtX2FkZGN0eCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9STV9DVFgpXSA9IHtkcm1fcm1jdHgsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTU9EX0NUWCldID0ge2RybV9tb2RjdHgsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX0NUWCldID0ge2RybV9nZXRjdHgsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TV0lUQ0hfQ1RYKV0gPSB7ZHJtX3N3aXRjaGN0eCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9ORVdfQ1RYKV0gPSB7ZHJtX25ld2N0eCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9SRVNfQ1RYKV0gPSB7ZHJtX3Jlc2N0eCwgRFJNX0FVVEh9LAogCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUREX0NUWCldID0ge2RybV9hZGRjdHgsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JNX0NUWCldID0ge2RybV9ybWN0eCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTU9EX0NUWCldID0ge2RybV9tb2RjdHgsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9DVFgpXSA9IHtkcm1fZ2V0Y3R4LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TV0lUQ0hfQ1RYKV0gPSB7ZHJtX3N3aXRjaGN0eCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTkVXX0NUWCldID0ge2RybV9uZXdjdHgsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JFU19DVFgpXSA9IHtkcm1fcmVzY3R4LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BRERfRFJBVyldID0ge2RybV9hZGRkcmF3LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JNX0RSQVcpXSA9IHtkcm1fcm1kcmF3LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAogCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUREX0RSQVcpXSA9IHtkcm1fYWRkZHJhdywgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfUk1fRFJBVyldID0ge2RybV9ybWRyYXcsIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0xPQ0spXSA9IHtkcm1fbG9jaywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1VOTE9DSyldID0ge2RybV91bmxvY2ssIERSTV9BVVRIfSwKIAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0xPQ0spXSA9IHtkcm1fbG9jaywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfVU5MT0NLKV0gPSB7ZHJtX3VubG9jaywgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfRklOSVNIKV0gPSB7ZHJtX25vb3AsIERSTV9BVVRIfSwKIAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0ZJTklTSCldID0ge2RybV9ub29wLCAxLCAwfSwKLQotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FERF9CVUZTKV0gPSB7ZHJtX2FkZGJ1ZnMsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX01BUktfQlVGUyldID0ge2RybV9tYXJrYnVmcywgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfSU5GT19CVUZTKV0gPSB7ZHJtX2luZm9idWZzLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9NQVBfQlVGUyldID0ge2RybV9tYXBidWZzLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9GUkVFX0JVRlMpXSA9IHtkcm1fZnJlZWJ1ZnMsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FERF9CVUZTKV0gPSB7ZHJtX2FkZGJ1ZnMsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTUFSS19CVUZTKV0gPSB7ZHJtX21hcmtidWZzLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0lORk9fQlVGUyldID0ge2RybV9pbmZvYnVmcywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX01BUF9CVUZTKV0gPSB7ZHJtX21hcGJ1ZnMsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9GUkVFX0JVRlMpXSA9IHtkcm1fZnJlZWJ1ZnMsIERSTV9BVVRIfSwKIAkvKiBUaGUgRFJNX0lPQ1RMX0RNQSBpb2N0bCBzaG91bGQgYmUgZGVmaW5lZCBieSB0aGUgZHJpdmVyLiAqLworCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0RNQSldID0ge05VTEwsIERSTV9BVVRIfSwKIAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0NPTlRST0wpXSA9IHtkcm1fY29udHJvbCwgMSwgMX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQ09OVFJPTCldID0ge2RybV9jb250cm9sLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAogCiAjaWYgX19PU19IQVNfQUdQCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0FDUVVJUkUpXSA9IHtkcm1fYWdwX2FjcXVpcmVfaW9jdGwsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9SRUxFQVNFKV0gPSB7ZHJtX2FncF9yZWxlYXNlX2lvY3RsLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfRU5BQkxFKV0gPSB7ZHJtX2FncF9lbmFibGVfaW9jdGwsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9JTkZPKV0gPSB7ZHJtX2FncF9pbmZvX2lvY3RsLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfQUxMT0MpXSA9IHtkcm1fYWdwX2FsbG9jLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfRlJFRSldID0ge2RybV9hZ3BfZnJlZSwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0JJTkQpXSA9IHtkcm1fYWdwX2JpbmQsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9VTkJJTkQpXSA9IHtkcm1fYWdwX3VuYmluZCwgMSwgMX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0FDUVVJUkUpXSA9IHtkcm1fYWdwX2FjcXVpcmVfaW9jdGwsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX1JFTEVBU0UpXSA9IHtkcm1fYWdwX3JlbGVhc2VfaW9jdGwsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0VOQUJMRSldID0ge2RybV9hZ3BfZW5hYmxlX2lvY3RsLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9JTkZPKV0gPSB7ZHJtX2FncF9pbmZvX2lvY3RsLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0FMTE9DKV0gPSB7ZHJtX2FncF9hbGxvY19pb2N0bCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfRlJFRSldID0ge2RybV9hZ3BfZnJlZV9pb2N0bCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfQklORCldID0ge2RybV9hZ3BfYmluZF9pb2N0bCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfVU5CSU5EKV0gPSB7ZHJtX2FncF91bmJpbmRfaW9jdGwsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCiAjZW5kaWYKIAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NHX0FMTE9DKV0gPSB7ZHJtX3NnX2FsbG9jLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TR19GUkVFKV0gPSB7ZHJtX3NnX2ZyZWUsIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NHX0FMTE9DKV0gPSB7ZHJtX3NnX2FsbG9jLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NHX0ZSRUUpXSA9IHtkcm1fc2dfZnJlZSwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKIAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1dBSVRfVkJMQU5LKV0gPSB7ZHJtX3dhaXRfdmJsYW5rLCAwLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9XQUlUX1ZCTEFOSyldID0ge2RybV93YWl0X3ZibGFuaywgMH0sCiB9OwogCiAjZGVmaW5lIERSSVZFUl9JT0NUTF9DT1VOVAlEUk1fQVJSQVlfU0laRSggZHJtX2lvY3RscyApCkBAIC0xMjksNyArMTI5LDcgQEAKICAqCiAgKiBcc2EgZHJtX2RldmljZQogICovCi1pbnQgZHJtX3Rha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBkcm1fbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKIHsKIAlkcm1fbWFnaWNfZW50cnlfdCAqcHQsICpuZXh0OwogCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7CkBAIC0xMzgsOSArMTM4LDkgQEAKIAogCURSTV9ERUJVRygiXG4iKTsKIAotCWlmIChkZXYtPmRyaXZlci0+cHJldGFrZWRvd24pCi0JCWRldi0+ZHJpdmVyLT5wcmV0YWtlZG93bihkZXYpOwotCURSTV9ERUJVRygiZHJpdmVyIHByZXRha2Vkb3duIGNvbXBsZXRlZFxuIik7CisJaWYgKGRldi0+ZHJpdmVyLT5sYXN0Y2xvc2UpCisJCWRldi0+ZHJpdmVyLT5sYXN0Y2xvc2UoZGV2KTsKKwlEUk1fREVCVUcoImRyaXZlciBsYXN0Y2xvc2UgY29tcGxldGVkXG4iKTsKIAogCWlmIChkZXYtPnVuaXF1ZSkgewogCQlkcm1fZnJlZShkZXYtPnVuaXF1ZSwgc3RybGVuKGRldi0+dW5pcXVlKSArIDEsIERSTV9NRU1fRFJJVkVSKTsKQEAgLTIzMyw3ICsyMzMsNyBAQAogCX0KIAl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKIAotCURSTV9ERUJVRygidGFrZWRvd24gY29tcGxldGVkXG4iKTsKKwlEUk1fREVCVUcoImxhc3RjbG9zZSBjb21wbGV0ZWRcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yODEsNyArMjgxLDcgQEAKIC8qKgogICogQ2FsbGVkIHZpYSBjbGVhbnVwX21vZHVsZSgpIGF0IG1vZHVsZSB1bmxvYWQgdGltZS4KICAqCi0gKiBDbGVhbnMgdXAgYWxsIERSTSBkZXZpY2UsIGNhbGxpbmcgdGFrZWRvd24oKS4KKyAqIENsZWFucyB1cCBhbGwgRFJNIGRldmljZSwgY2FsbGluZyBkcm1fbGFzdGNsb3NlKCkuCiAgKgogICogXHNhIGRybV9pbml0CiAgKi8KQEAgLTI5NCw3ICsyOTQsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JZHJtX3Rha2Vkb3duKGRldik7CisJZHJtX2xhc3RjbG9zZShkZXYpOwogCiAJaWYgKGRldi0+bWFwbGlzdCkgewogCQlkcm1fZnJlZShkZXYtPm1hcGxpc3QsIHNpemVvZigqZGV2LT5tYXBsaXN0KSwgRFJNX01FTV9NQVBTKTsKQEAgLTMxNyw4ICszMTcsOCBAQAogCQlkZXYtPmFncCA9IE5VTEw7CiAJfQogCi0JaWYgKGRldi0+ZHJpdmVyLT5wb3N0Y2xlYW51cCkKLQkJZGV2LT5kcml2ZXItPnBvc3RjbGVhbnVwKGRldik7CisJaWYgKGRldi0+ZHJpdmVyLT51bmxvYWQpCisJCWRldi0+ZHJpdmVyLT51bmxvYWQoZGV2KTsKIAogCWRybV9wdXRfaGVhZCgmZGV2LT5wcmltYXJ5KTsKIAlpZiAoZHJtX3B1dF9kZXYoZGV2KSkKQEAgLTM0MiwxMiArMzQyLDEyIEBACiAJCWlmIChoZWFkLT5kZXYtPmRyaXZlciAhPSBkcml2ZXIpCiAJCQljb250aW51ZTsKIAkJZGV2ID0gaGVhZC0+ZGV2OwotCX0KLQlpZiAoZGV2KSB7Ci0JCS8qIHJlbGVhc2UgdGhlIHBjaSBkcml2ZXIgKi8KLQkJaWYgKGRldi0+cGRldikKLQkJCXBjaV9kZXZfcHV0KGRldi0+cGRldik7Ci0JCWRybV9jbGVhbnVwKGRldik7CisJCWlmIChkZXYpIHsKKwkJCS8qIHJlbGVhc2UgdGhlIHBjaSBkcml2ZXIgKi8KKwkJCWlmIChkZXYtPnBkZXYpCisJCQkJcGNpX2Rldl9wdXQoZGV2LT5wZGV2KTsKKwkJCWRybV9jbGVhbnVwKGRldik7CisJCX0KIAl9CiAJRFJNX0lORk8oIk1vZHVsZSB1bmxvYWRlZFxuIik7CiB9CkBAIC00MzIsMTQgKzQzMiwxNyBAQAogCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV92ZXJzaW9uX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV92ZXJzaW9uX3QgdmVyc2lvbjsKLQlpbnQgcmV0OworCWludCBsZW47CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnZlcnNpb24sIGFyZ3AsIHNpemVvZih2ZXJzaW9uKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JLyogdmVyc2lvbiBpcyBhIHJlcXVpcmVkIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgcGVyc29uYWxpdHkgbW9kdWxlIHZlcnNpb24gKi8KLQlpZiAoKHJldCA9IGRldi0+ZHJpdmVyLT52ZXJzaW9uKCZ2ZXJzaW9uKSkpCi0JCXJldHVybiByZXQ7CisJdmVyc2lvbi52ZXJzaW9uX21ham9yID0gZGV2LT5kcml2ZXItPm1ham9yOworCXZlcnNpb24udmVyc2lvbl9taW5vciA9IGRldi0+ZHJpdmVyLT5taW5vcjsKKwl2ZXJzaW9uLnZlcnNpb25fcGF0Y2hsZXZlbCA9IGRldi0+ZHJpdmVyLT5wYXRjaGxldmVsOworCURSTV9DT1BZKHZlcnNpb24ubmFtZSwgZGV2LT5kcml2ZXItPm5hbWUpOworCURSTV9DT1BZKHZlcnNpb24uZGF0ZSwgZGV2LT5kcml2ZXItPmRhdGUpOworCURSTV9DT1BZKHZlcnNpb24uZGVzYywgZGV2LT5kcml2ZXItPmRlc2MpOwogCiAJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC00OTMsOCArNDk2LDkgQEAKIAlpZiAoIWZ1bmMpIHsKIAkJRFJNX0RFQlVHKCJubyBmdW5jdGlvblxuIik7CiAJCXJldGNvZGUgPSAtRUlOVkFMOwotCX0gZWxzZSBpZiAoKGlvY3RsLT5yb290X29ubHkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHx8Ci0JCSAgIChpb2N0bC0+YXV0aF9uZWVkZWQgJiYgIXByaXYtPmF1dGhlbnRpY2F0ZWQpKSB7CisJfSBlbHNlIGlmICgoKGlvY3RsLT5mbGFncyAmIERSTV9ST09UX09OTFkpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB8fAorCQkgICAoKGlvY3RsLT5mbGFncyAmIERSTV9BVVRIKSAmJiAhcHJpdi0+YXV0aGVudGljYXRlZCkgfHwKKwkJICAgKChpb2N0bC0+ZmxhZ3MgJiBEUk1fTUFTVEVSKSAmJiAhcHJpdi0+bWFzdGVyKSkgewogCQlyZXRjb2RlID0gLUVBQ0NFUzsKIAl9IGVsc2UgewogCQlyZXRjb2RlID0gZnVuYyhpbm9kZSwgZmlscCwgY21kLCBhcmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jCmluZGV4IGJmMGE3NDAuLjQwM2Y0NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9mb3BzLmMKQEAgLTM1LDYgKzM1LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9zYXJlYS5oIgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KIAogc3RhdGljIGludCBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCkBAIC00MiwxNSArNDMsMjEgQEAKIAogc3RhdGljIGludCBkcm1fc2V0dXAoZHJtX2RldmljZV90ICogZGV2KQogeworCWRybV9sb2NhbF9tYXBfdCAqbWFwOwogCWludCBpOwogCWludCByZXQ7CiAKLQlpZiAoZGV2LT5kcml2ZXItPnByZXNldHVwKSB7Ci0JCXJldCA9IGRldi0+ZHJpdmVyLT5wcmVzZXR1cChkZXYpOworCWlmIChkZXYtPmRyaXZlci0+Zmlyc3RvcGVuKSB7CisJCXJldCA9IGRldi0+ZHJpdmVyLT5maXJzdG9wZW4oZGV2KTsKIAkJaWYgKHJldCAhPSAwKQogCQkJcmV0dXJuIHJldDsKIAl9CiAKKwkvKiBwcmVidWlsZCB0aGUgU0FSRUEgKi8KKwlpID0gZHJtX2FkZG1hcChkZXYsIDAsIFNBUkVBX01BWCwgX0RSTV9TSE0sIF9EUk1fQ09OVEFJTlNfTE9DSywgJm1hcCk7CisJaWYgKGkgIT0gMCkKKwkJcmV0dXJuIGk7CisKIAlhdG9taWNfc2V0KCZkZXYtPmlvY3RsX2NvdW50LCAwKTsKIAlhdG9taWNfc2V0KCZkZXYtPnZtYV9jb3VudCwgMCk7CiAJZGV2LT5idWZfdXNlID0gMDsKQEAgLTEwOSw4ICsxMTYsNiBAQAogCSAqIGRybV9zZWxlY3RfcXVldWUgZmFpbHMgYmV0d2VlbiB0aGUgdGltZSB0aGUgaW50ZXJydXB0IGlzCiAJICogaW5pdGlhbGl6ZWQgYW5kIHRoZSB0aW1lIHRoZSBxdWV1ZXMgYXJlIGluaXRpYWxpemVkLgogCSAqLwotCWlmIChkZXYtPmRyaXZlci0+cG9zdHNldHVwKQotCQlkZXYtPmRyaXZlci0+cG9zdHNldHVwKGRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1NCwxMCArMTU5LDE2OCBAQAogCiAJcmV0dXJuIHJldGNvZGU7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZHJtX29wZW4pOwogCiAvKioKKyAqIEZpbGUgXGMgb3BlbiBvcGVyYXRpb24uCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqCisgKiBQdXRzIHRoZSBkZXYtPmZvcHMgY29ycmVzcG9uZGluZyB0byB0aGUgZGV2aWNlIG1pbm9yIG51bWJlciBpbnRvCisgKiBccCBmaWxwLCBjYWxsIHRoZSBcYyBvcGVuIG1ldGhvZCwgYW5kIHJlc3RvcmUgdGhlIGZpbGUgb3BlcmF0aW9ucy4KKyAqLworaW50IGRybV9zdHViX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJZHJtX2RldmljZV90ICpkZXYgPSBOVUxMOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJaW50IGVyciA9IC1FTk9ERVY7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb2xkX2ZvcHM7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlpZiAoISgobWlub3IgPj0gMCkgJiYgKG1pbm9yIDwgZHJtX2NhcmRzX2xpbWl0KSkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFkcm1faGVhZHNbbWlub3JdKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghKGRldiA9IGRybV9oZWFkc1ttaW5vcl0tPmRldikpCisJCXJldHVybiAtRU5PREVWOworCisJb2xkX2ZvcHMgPSBmaWxwLT5mX29wOworCWZpbHAtPmZfb3AgPSBmb3BzX2dldCgmZGV2LT5kcml2ZXItPmZvcHMpOworCWlmIChmaWxwLT5mX29wLT5vcGVuICYmIChlcnIgPSBmaWxwLT5mX29wLT5vcGVuKGlub2RlLCBmaWxwKSkpIHsKKwkJZm9wc19wdXQoZmlscC0+Zl9vcCk7CisJCWZpbHAtPmZfb3AgPSBmb3BzX2dldChvbGRfZm9wcyk7CisJfQorCWZvcHNfcHV0KG9sZF9mb3BzKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciBEUkkgd2lsbCBydW4gb24gdGhpcyBDUFUuCisgKgorICogXHJldHVybiBub24temVybyBpZiB0aGUgRFJJIHdpbGwgcnVuIG9uIHRoaXMgQ1BVLCBvciB6ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBkcm1fY3B1X3ZhbGlkKHZvaWQpCit7CisjaWYgZGVmaW5lZChfX2kzODZfXykKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMykKKwkJcmV0dXJuIDA7CS8qIE5vIGNtcHhjaGcgb24gYSAzODYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChfX3NwYXJjX3Y5X18pCisJcmV0dXJuIDA7CQkvKiBObyBjbXB4Y2hnIGJlZm9yZSB2OSBzcGFyYy4gKi8KKyNlbmRpZgorCXJldHVybiAxOworfQorCisvKioKKyAqIENhbGxlZCB3aGVuZXZlciBhIHByb2Nlc3Mgb3BlbnMgL2Rldi9kcm0uCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBkZXYgZGV2aWNlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIGRybV9maWxlIHN0cnVjdHVyZSBmb3IgdGhlIGZpbGUgcHJpdmF0ZSBkYXRhIGluIFxwCisgKiBmaWxwIGFuZCBhZGQgaXQgaW50byB0aGUgZG91YmxlIGxpbmtlZCBsaXN0IGluIFxwIGRldi4KKyAqLworc3RhdGljIGludCBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICBkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlkcm1fZmlsZV90ICpwcml2OworCWludCByZXQ7CisKKwlpZiAoZmlscC0+Zl9mbGFncyAmIE9fRVhDTCkKKwkJcmV0dXJuIC1FQlVTWTsJLyogTm8gZXhjbHVzaXZlIG9wZW5zICovCisJaWYgKCFkcm1fY3B1X3ZhbGlkKCkpCisJCXJldHVybiAtRUlOVkFMOworCisJRFJNX0RFQlVHKCJwaWQgPSAlZCwgbWlub3IgPSAlZFxuIiwgY3VycmVudC0+cGlkLCBtaW5vcik7CisKKwlwcml2ID0gZHJtX2FsbG9jKHNpemVvZigqcHJpdiksIERSTV9NRU1fRklMRVMpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gcHJpdjsKKwlwcml2LT51aWQgPSBjdXJyZW50LT5ldWlkOworCXByaXYtPnBpZCA9IGN1cnJlbnQtPnBpZDsKKwlwcml2LT5taW5vciA9IG1pbm9yOworCXByaXYtPmhlYWQgPSBkcm1faGVhZHNbbWlub3JdOworCXByaXYtPmlvY3RsX2NvdW50ID0gMDsKKwkvKiBmb3IgY29tcGF0aWJpbGl0eSByb290IGlzIGFsd2F5cyBhdXRoZW50aWNhdGVkICovCisJcHJpdi0+YXV0aGVudGljYXRlZCA9IGNhcGFibGUoQ0FQX1NZU19BRE1JTik7CisJcHJpdi0+bG9ja19jb3VudCA9IDA7CisKKwlpZiAoZGV2LT5kcml2ZXItPm9wZW4pIHsKKwkJcmV0ID0gZGV2LT5kcml2ZXItPm9wZW4oZGV2LCBwcml2KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dF9mcmVlOworCX0KKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJaWYgKCFkZXYtPmZpbGVfbGFzdCkgeworCQlwcml2LT5uZXh0ID0gTlVMTDsKKwkJcHJpdi0+cHJldiA9IE5VTEw7CisJCWRldi0+ZmlsZV9maXJzdCA9IHByaXY7CisJCWRldi0+ZmlsZV9sYXN0ID0gcHJpdjsKKwkJLyogZmlyc3Qgb3BlbmVyIGF1dG9tYXRpY2FsbHkgYmVjb21lcyBtYXN0ZXIgKi8KKwkJcHJpdi0+bWFzdGVyID0gMTsKKwl9IGVsc2UgeworCQlwcml2LT5uZXh0ID0gTlVMTDsKKwkJcHJpdi0+cHJldiA9IGRldi0+ZmlsZV9sYXN0OworCQlkZXYtPmZpbGVfbGFzdC0+bmV4dCA9IHByaXY7CisJCWRldi0+ZmlsZV9sYXN0ID0gcHJpdjsKKwl9CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisKKyNpZmRlZiBfX2FscGhhX18KKwkvKgorCSAqIERlZmF1bHQgdGhlIGhvc2UKKwkgKi8KKwlpZiAoIWRldi0+aG9zZSkgeworCQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwkJcGNpX2RldiA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIE5VTEwpOworCQlpZiAocGNpX2RldikgeworCQkJZGV2LT5ob3NlID0gcGNpX2Rldi0+c3lzZGF0YTsKKwkJCXBjaV9kZXZfcHV0KHBjaV9kZXYpOworCQl9CisJCWlmICghZGV2LT5ob3NlKSB7CisJCQlzdHJ1Y3QgcGNpX2J1cyAqYiA9IHBjaV9idXNfYihwY2lfcm9vdF9idXNlcy5uZXh0KTsKKwkJCWlmIChiKQorCQkJCWRldi0+aG9zZSA9IGItPnN5c2RhdGE7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiAwOworICAgICAgb3V0X2ZyZWU6CisJZHJtX2ZyZWUocHJpdiwgc2l6ZW9mKCpwcml2KSwgRFJNX01FTV9GSUxFUyk7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorCisvKiogTm8tb3AuICovCitpbnQgZHJtX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlpbnQgcmV0Y29kZTsKKworCURSTV9ERUJVRygiZmQgPSAlZCwgZGV2aWNlID0gMHglbHhcbiIsIGZkLAorCQkgIChsb25nKW9sZF9lbmNvZGVfZGV2KHByaXYtPmhlYWQtPmRldmljZSkpOworCXJldGNvZGUgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCBvbiwgJmRldi0+YnVmX2FzeW5jKTsKKwlpZiAocmV0Y29kZSA8IDApCisJCXJldHVybiByZXRjb2RlOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fZmFzeW5jKTsKKworLyoqCiAgKiBSZWxlYXNlIGZpbGUuCiAgKgogICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZQpAQCAtMTY3LDcgKzMzMCw3IEBACiAgKiBJZiB0aGUgaGFyZHdhcmUgbG9jayBpcyBoZWxkIHRoZW4gZnJlZSBpdCwgYW5kIHRha2UgaXQgYWdhaW4gZm9yIHRoZSBrZXJuZWwKICAqIGNvbnRleHQgc2luY2UgaXQncyBuZWNlc3NhcnkgdG8gcmVjbGFpbSBidWZmZXJzLiBVbmxpbmsgdGhlIGZpbGUgcHJpdmF0ZQogICogZGF0YSBmcm9tIGl0cyBsaXN0IGFuZCBmcmVlIGl0LiBEZWNyZWFzZXMgdGhlIG9wZW4gY291bnQgYW5kIGlmIGl0IHJlYWNoZXMKLSAqIHplcm8gY2FsbHMgdGFrZWRvd24oKS4KKyAqIHplcm8gY2FsbHMgZHJtX2xhc3RjbG9zZSgpLgogICovCiBpbnQgZHJtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CkBAIC0xODAsOCArMzQzLDggQEAKIAogCURSTV9ERUJVRygib3Blbl9jb3VudCA9ICVkXG4iLCBkZXYtPm9wZW5fY291bnQpOwogCi0JaWYgKGRldi0+ZHJpdmVyLT5wcmVyZWxlYXNlKQotCQlkZXYtPmRyaXZlci0+cHJlcmVsZWFzZShkZXYsIGZpbHApOworCWlmIChkZXYtPmRyaXZlci0+cHJlY2xvc2UpCisJCWRldi0+ZHJpdmVyLT5wcmVjbG9zZShkZXYsIGZpbHApOwogCiAJLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAkgKiBCZWdpbiBpbmxpbmUgZHJtX3JlbGVhc2UKQEAgLTE5Nyw4ICszNjAsOCBAQAogCQlEUk1fREVCVUcoIkZpbGUgJXAgcmVsZWFzZWQsIGZyZWVpbmcgbG9jayBmb3IgY29udGV4dCAlZFxuIiwKIAkJCSAgZmlscCwgX0RSTV9MT0NLSU5HX0NPTlRFWFQoZGV2LT5sb2NrLmh3X2xvY2stPmxvY2spKTsKIAotCQlpZiAoZGV2LT5kcml2ZXItPnJlbGVhc2UpCi0JCQlkZXYtPmRyaXZlci0+cmVsZWFzZShkZXYsIGZpbHApOworCQlpZiAoZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVyc19sb2NrZWQpCisJCQlkZXYtPmRyaXZlci0+cmVjbGFpbV9idWZmZXJzX2xvY2tlZChkZXYsIGZpbHApOwogCiAJCWRybV9sb2NrX2ZyZWUoZGV2LCAmZGV2LT5sb2NrLmh3X2xvY2stPmxvY2ssCiAJCQkgICAgICBfRFJNX0xPQ0tJTkdfQ09OVEVYVChkZXYtPmxvY2suaHdfbG9jay0+bG9jaykpOwpAQCAtMjA3LDcgKzM3MCw3IEBACiAJCSAgIGhhcmR3YXJlIGF0IHRoaXMgcG9pbnQsIHBvc3NpYmx5CiAJCSAgIHByb2Nlc3NlZCB2aWEgYSBjYWxsYmFjayB0byB0aGUgWAogCQkgICBzZXJ2ZXIuICovCi0JfSBlbHNlIGlmIChkZXYtPmRyaXZlci0+cmVsZWFzZSAmJiBwcml2LT5sb2NrX2NvdW50CisJfSBlbHNlIGlmIChkZXYtPmRyaXZlci0+cmVjbGFpbV9idWZmZXJzX2xvY2tlZCAmJiBwcml2LT5sb2NrX2NvdW50CiAJCSAgICYmIGRldi0+bG9jay5od19sb2NrKSB7CiAJCS8qIFRoZSBsb2NrIGlzIHJlcXVpcmVkIHRvIHJlY2xhaW0gYnVmZmVycyAqLwogCQlERUNMQVJFX1dBSVRRVUVVRShlbnRyeSwgY3VycmVudCk7CkBAIC0yMzcsMTUgKzQwMCwxNCBAQAogCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJCXJlbW92ZV93YWl0X3F1ZXVlKCZkZXYtPmxvY2subG9ja19xdWV1ZSwgJmVudHJ5KTsKIAkJaWYgKCFyZXRjb2RlKSB7Ci0JCQlpZiAoZGV2LT5kcml2ZXItPnJlbGVhc2UpCi0JCQkJZGV2LT5kcml2ZXItPnJlbGVhc2UoZGV2LCBmaWxwKTsKKwkJCWRldi0+ZHJpdmVyLT5yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRldiwgZmlscCk7CiAJCQlkcm1fbG9ja19mcmVlKGRldiwgJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAogCQkJCSAgICAgIERSTV9LRVJORUxfQ09OVEVYVCk7CiAJCX0KIAl9CiAKLQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkKLQkgICAgJiYgIWRldi0+ZHJpdmVyLT5yZWxlYXNlKSB7CisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpICYmCisJICAgICFkZXYtPmRyaXZlci0+cmVjbGFpbV9idWZmZXJzX2xvY2tlZCkgewogCQlkZXYtPmRyaXZlci0+cmVjbGFpbV9idWZmZXJzKGRldiwgZmlscCk7CiAJfQogCkBAIC0yOTIsOSArNDU0LDggQEAKIAl9CiAJdXAoJmRldi0+c3RydWN0X3NlbSk7CiAKLQlpZiAoZGV2LT5kcml2ZXItPmZyZWVfZmlscF9wcml2KQotCQlkZXYtPmRyaXZlci0+ZnJlZV9maWxwX3ByaXYoZGV2LCBwcml2KTsKLQorCWlmIChkZXYtPmRyaXZlci0+cG9zdGNsb3NlKQorCQlkZXYtPmRyaXZlci0+cG9zdGNsb3NlKGRldiwgcHJpdik7CiAJZHJtX2ZyZWUocHJpdiwgc2l6ZW9mKCpwcml2KSwgRFJNX01FTV9GSUxFUyk7CiAKIAkvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMzEzLDcgKzQ3NCw3IEBACiAJCX0KIAkJc3Bpbl91bmxvY2soJmRldi0+Y291bnRfbG9jayk7CiAJCXVubG9ja19rZXJuZWwoKTsKLQkJcmV0dXJuIGRybV90YWtlZG93bihkZXYpOworCQlyZXR1cm4gZHJtX2xhc3RjbG9zZShkZXYpOwogCX0KIAlzcGluX3VubG9jaygmZGV2LT5jb3VudF9sb2NrKTsKIApAQCAtMzIxLDEyOSArNDgyLDExIEBACiAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KLQogRVhQT1JUX1NZTUJPTChkcm1fcmVsZWFzZSk7CiAKLS8qKgotICogQ2FsbGVkIHdoZW5ldmVyIGEgcHJvY2VzcyBvcGVucyAvZGV2L2RybS4KLSAqCi0gKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgotICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgotICogXHBhcmFtIGRldiBkZXZpY2UuCi0gKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgotICoKLSAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgZHJtX2ZpbGUgc3RydWN0dXJlIGZvciB0aGUgZmlsZSBwcml2YXRlIGRhdGEgaW4gXHAKLSAqIGZpbHAgYW5kIGFkZCBpdCBpbnRvIHRoZSBkb3VibGUgbGlua2VkIGxpc3QgaW4gXHAgZGV2LgotICovCi1zdGF0aWMgaW50IGRybV9vcGVuX2hlbHBlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSAgIGRybV9kZXZpY2VfdCAqIGRldikKLXsKLQlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCWRybV9maWxlX3QgKnByaXY7Ci0JaW50IHJldDsKLQotCWlmIChmaWxwLT5mX2ZsYWdzICYgT19FWENMKQotCQlyZXR1cm4gLUVCVVNZOwkvKiBObyBleGNsdXNpdmUgb3BlbnMgKi8KLQlpZiAoIWRybV9jcHVfdmFsaWQoKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlEUk1fREVCVUcoInBpZCA9ICVkLCBtaW5vciA9ICVkXG4iLCBjdXJyZW50LT5waWQsIG1pbm9yKTsKLQotCXByaXYgPSBkcm1fYWxsb2Moc2l6ZW9mKCpwcml2KSwgRFJNX01FTV9GSUxFUyk7Ci0JaWYgKCFwcml2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKLQlmaWxwLT5wcml2YXRlX2RhdGEgPSBwcml2OwotCXByaXYtPnVpZCA9IGN1cnJlbnQtPmV1aWQ7Ci0JcHJpdi0+cGlkID0gY3VycmVudC0+cGlkOwotCXByaXYtPm1pbm9yID0gbWlub3I7Ci0JcHJpdi0+aGVhZCA9IGRybV9oZWFkc1ttaW5vcl07Ci0JcHJpdi0+aW9jdGxfY291bnQgPSAwOwotCXByaXYtPmF1dGhlbnRpY2F0ZWQgPSBjYXBhYmxlKENBUF9TWVNfQURNSU4pOwotCXByaXYtPmxvY2tfY291bnQgPSAwOwotCi0JaWYgKGRldi0+ZHJpdmVyLT5vcGVuX2hlbHBlcikgewotCQlyZXQgPSBkZXYtPmRyaXZlci0+b3Blbl9oZWxwZXIoZGV2LCBwcml2KTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCWRvd24oJmRldi0+c3RydWN0X3NlbSk7Ci0JaWYgKCFkZXYtPmZpbGVfbGFzdCkgewotCQlwcml2LT5uZXh0ID0gTlVMTDsKLQkJcHJpdi0+cHJldiA9IE5VTEw7Ci0JCWRldi0+ZmlsZV9maXJzdCA9IHByaXY7Ci0JCWRldi0+ZmlsZV9sYXN0ID0gcHJpdjsKLQl9IGVsc2UgewotCQlwcml2LT5uZXh0ID0gTlVMTDsKLQkJcHJpdi0+cHJldiA9IGRldi0+ZmlsZV9sYXN0OwotCQlkZXYtPmZpbGVfbGFzdC0+bmV4dCA9IHByaXY7Ci0JCWRldi0+ZmlsZV9sYXN0ID0gcHJpdjsKLQl9Ci0JdXAoJmRldi0+c3RydWN0X3NlbSk7Ci0KLSNpZmRlZiBfX2FscGhhX18KLQkvKgotCSAqIERlZmF1bHQgdGhlIGhvc2UKLQkgKi8KLQlpZiAoIWRldi0+aG9zZSkgewotCQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKLQkJcGNpX2RldiA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIE5VTEwpOwotCQlpZiAocGNpX2RldikgewotCQkJZGV2LT5ob3NlID0gcGNpX2Rldi0+c3lzZGF0YTsKLQkJCXBjaV9kZXZfcHV0KHBjaV9kZXYpOwotCQl9Ci0JCWlmICghZGV2LT5ob3NlKSB7Ci0JCQlzdHJ1Y3QgcGNpX2J1cyAqYiA9IHBjaV9idXNfYihwY2lfcm9vdF9idXNlcy5uZXh0KTsKLQkJCWlmIChiKQotCQkJCWRldi0+aG9zZSA9IGItPnN5c2RhdGE7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCXJldHVybiAwOwotICAgICAgb3V0X2ZyZWU6Ci0JZHJtX2ZyZWUocHJpdiwgc2l6ZW9mKCpwcml2KSwgRFJNX01FTV9GSUxFUyk7Ci0JZmlscC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlyZXR1cm4gcmV0OwotfQotCi0vKiogTm8tb3AuICovCi1pbnQgZHJtX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwKQotewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0KLQlEUk1fREVCVUcoInBpZCA9ICVkLCBkZXZpY2UgPSAweCVseCwgb3Blbl9jb3VudCA9ICVkXG4iLAotCQkgIGN1cnJlbnQtPnBpZCwgKGxvbmcpb2xkX2VuY29kZV9kZXYocHJpdi0+aGVhZC0+ZGV2aWNlKSwKLQkJICBkZXYtPm9wZW5fY291bnQpOwotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKGRybV9mbHVzaCk7Ci0KLS8qKiBOby1vcC4gKi8KLWludCBkcm1fZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKLXsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWludCByZXRjb2RlOwotCi0JRFJNX0RFQlVHKCJmZCA9ICVkLCBkZXZpY2UgPSAweCVseFxuIiwgZmQsCi0JCSAgKGxvbmcpb2xkX2VuY29kZV9kZXYocHJpdi0+aGVhZC0+ZGV2aWNlKSk7Ci0JcmV0Y29kZSA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCAmZGV2LT5idWZfYXN5bmMpOwotCWlmIChyZXRjb2RlIDwgMCkKLQkJcmV0dXJuIHJldGNvZGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0woZHJtX2Zhc3luYyk7Ci0KIC8qKiBOby1vcC4gKi8KIHVuc2lnbmVkIGludCBkcm1fcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQogewogCXJldHVybiAwOwogfQotCiBFWFBPUlRfU1lNQk9MKGRybV9wb2xsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2luaXQuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0YjkzNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioKLSAqIFxmaWxlIGRybV9pbml0LmMKLSAqIFNldHVwL0NsZWFudXAgZm9yIERSTQotICoKLSAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+Ci0gKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KLSAqLwotCi0vKgotICogQ3JlYXRlZDogTW9uIEphbiAgNCAwODo1ODozMSAxOTk5IGJ5IGZhaXRoQHZhbGludXguY29tCi0gKgotICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLSAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLSAqIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAotICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgotICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi0gKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKLSAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSAiZHJtUC5oIgotCi0vKioKLSAqIENoZWNrIHdoZXRoZXIgRFJJIHdpbGwgcnVuIG9uIHRoaXMgQ1BVLgotICoKLSAqIFxyZXR1cm4gbm9uLXplcm8gaWYgdGhlIERSSSB3aWxsIHJ1biBvbiB0aGlzIENQVSwgb3IgemVybyBvdGhlcndpc2UuCi0gKi8KLWludCBkcm1fY3B1X3ZhbGlkKHZvaWQpCi17Ci0jaWYgZGVmaW5lZChfX2kzODZfXykKLQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMykKLQkJcmV0dXJuIDA7CS8qIE5vIGNtcHhjaGcgb24gYSAzODYgKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChfX3NwYXJjX3Y5X18pCi0JcmV0dXJuIDA7CQkvKiBObyBjbXB4Y2hnIGJlZm9yZSB2OSBzcGFyYy4gKi8KLSNlbmRpZgotCXJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvY3RsLmMKaW5kZXggOWIwZmViYS4uYmNkNGU2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jCkBAIC0xMzcsMTcgKzEzNywyMiBAQAogCiBzdGF0aWMgaW50IGRybV9zZXRfYnVzaWQoZHJtX2RldmljZV90ICogZGV2KQogeworCWludCBsZW47CisKIAlpZiAoZGV2LT51bmlxdWUgIT0gTlVMTCkKIAkJcmV0dXJuIEVCVVNZOwogCi0JZGV2LT51bmlxdWVfbGVuID0gMjA7CisJZGV2LT51bmlxdWVfbGVuID0gNDA7CiAJZGV2LT51bmlxdWUgPSBkcm1fYWxsb2MoZGV2LT51bmlxdWVfbGVuICsgMSwgRFJNX01FTV9EUklWRVIpOwogCWlmIChkZXYtPnVuaXF1ZSA9PSBOVUxMKQogCQlyZXR1cm4gRU5PTUVNOwogCi0Jc25wcmludGYoZGV2LT51bmlxdWUsIGRldi0+dW5pcXVlX2xlbiwgInBjaTolMDR4OiUwMng6JTAyeC4lZCIsCisJbGVuID0gc25wcmludGYoZGV2LT51bmlxdWUsIGRldi0+dW5pcXVlX2xlbiwgInBjaTolMDR4OiUwMng6JTAyeC4lZCIsCiAJCSBkZXYtPnBjaV9kb21haW4sIGRldi0+cGNpX2J1cywgZGV2LT5wY2lfc2xvdCwgZGV2LT5wY2lfZnVuYyk7CiAKKwlpZiAobGVuID4gZGV2LT51bmlxdWVfbGVuKQorCQlEUk1fRVJST1IoIlVuaXF1ZSBidWZmZXIgb3ZlcmZsb3dlZFxuIik7CisKIAlkZXYtPmRldm5hbWUgPQogCSAgICBkcm1fYWxsb2Moc3RybGVuKGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUpICsgZGV2LT51bmlxdWVfbGVuICsKIAkJICAgICAgMiwgRFJNX01FTV9EUklWRVIpOwpAQCAtMjM5LDcgKzI0NCw3IEBACiB7CiAJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fY2xpZW50X3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9jbGllbnRfdCBfX3VzZXIgKmFyZ3AgPSAoZHJtX2NsaWVudF90IF9fdXNlciAqKWFyZzsKIAlkcm1fY2xpZW50X3QgY2xpZW50OwogCWRybV9maWxlX3QgKnB0OwogCWludCBpZHg7CkBAIC0yNjIsNyArMjY3LDcgQEAKIAljbGllbnQuaW9jcyA9IHB0LT5pb2N0bF9jb3VudDsKIAl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoKGRybV9jbGllbnRfdCBfX3VzZXIgKikgYXJnLCAmY2xpZW50LCBzaXplb2YoY2xpZW50KSkpCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2xpZW50LCBzaXplb2YoY2xpZW50KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtMzI1LDE3ICszMzAsMTMgQEAKIAlkcm1fc2V0X3ZlcnNpb25fdCByZXR2OwogCWludCBpZl92ZXJzaW9uOwogCWRybV9zZXRfdmVyc2lvbl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7Ci0JZHJtX3ZlcnNpb25fdCB2ZXJzaW9uOwogCiAJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKHN2LCBhcmdwLCBzaXplb2Yoc3YpKTsKIAotCW1lbXNldCgmdmVyc2lvbiwgMCwgc2l6ZW9mKHZlcnNpb24pKTsKLQotCWRldi0+ZHJpdmVyLT52ZXJzaW9uKCZ2ZXJzaW9uKTsKIAlyZXR2LmRybV9kaV9tYWpvciA9IERSTV9JRl9NQUpPUjsKIAlyZXR2LmRybV9kaV9taW5vciA9IERSTV9JRl9NSU5PUjsKLQlyZXR2LmRybV9kZF9tYWpvciA9IHZlcnNpb24udmVyc2lvbl9tYWpvcjsKLQlyZXR2LmRybV9kZF9taW5vciA9IHZlcnNpb24udmVyc2lvbl9taW5vcjsKKwlyZXR2LmRybV9kZF9tYWpvciA9IGRldi0+ZHJpdmVyLT5tYWpvcjsKKwlyZXR2LmRybV9kZF9taW5vciA9IGRldi0+ZHJpdmVyLT5taW5vcjsKIAogCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoYXJncCwgcmV0diwgc2l6ZW9mKHN2KSk7CiAKQEAgLTM0Myw3ICszNDQsNyBAQAogCQlpZiAoc3YuZHJtX2RpX21ham9yICE9IERSTV9JRl9NQUpPUiB8fAogCQkgICAgc3YuZHJtX2RpX21pbm9yIDwgMCB8fCBzdi5kcm1fZGlfbWlub3IgPiBEUk1fSUZfTUlOT1IpCiAJCQlyZXR1cm4gRUlOVkFMOwotCQlpZl92ZXJzaW9uID0gRFJNX0lGX1ZFUlNJT04oc3YuZHJtX2RpX21ham9yLCBzdi5kcm1fZGRfbWlub3IpOworCQlpZl92ZXJzaW9uID0gRFJNX0lGX1ZFUlNJT04oc3YuZHJtX2RpX21ham9yLCBzdi5kcm1fZGlfbWlub3IpOwogCQlkZXYtPmlmX3ZlcnNpb24gPSBEUk1fTUFYKGlmX3ZlcnNpb24sIGRldi0+aWZfdmVyc2lvbik7CiAJCWlmIChzdi5kcm1fZGlfbWlub3IgPj0gMSkgewogCQkJLyoKQEAgLTM1NCw5ICszNTUsOSBAQAogCX0KIAogCWlmIChzdi5kcm1fZGRfbWFqb3IgIT0gLTEpIHsKLQkJaWYgKHN2LmRybV9kZF9tYWpvciAhPSB2ZXJzaW9uLnZlcnNpb25fbWFqb3IgfHwKKwkJaWYgKHN2LmRybV9kZF9tYWpvciAhPSBkZXYtPmRyaXZlci0+bWFqb3IgfHwKIAkJICAgIHN2LmRybV9kZF9taW5vciA8IDAKLQkJICAgIHx8IHN2LmRybV9kZF9taW5vciA+IHZlcnNpb24udmVyc2lvbl9taW5vcikKKwkJICAgIHx8IHN2LmRybV9kZF9taW5vciA+IGRldi0+ZHJpdmVyLT5taW5vcikKIAkJCXJldHVybiBFSU5WQUw7CiAKIAkJaWYgKGRldi0+ZHJpdmVyLT5zZXRfdmVyc2lvbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYwppbmRleCBiNDhhNTk1Li5mOWU0NTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jCkBAIC0xMzAsNyArMTMwLDYgQEAKIAkvKiBkZXYtPmRyaXZlci0+a2VybmVsX2NvbnRleHRfc3dpdGNoIGlzbid0IHVzZWQgYnkgYW55IG9mIHRoZSB4ODYKIAkgKiAgZHJpdmVycyBidXQgaXMgdXNlZCBieSB0aGUgU3BhcmMgZHJpdmVyLgogCSAqLwotCiAJaWYgKGRldi0+ZHJpdmVyLT5rZXJuZWxfY29udGV4dF9zd2l0Y2ggJiYKIAkgICAgZGV2LT5sYXN0X2NvbnRleHQgIT0gbG9jay5jb250ZXh0KSB7CiAJCWRldi0+ZHJpdmVyLT5rZXJuZWxfY29udGV4dF9zd2l0Y2goZGV2LCBkZXYtPmxhc3RfY29udGV4dCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMKaW5kZXggYWJlZjJhYy4uODA3NDc3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMKQEAgLTE0NSwzMCArMTQ1LDIyIEBACiAJcmV0dXJuIGRybV9hZ3BfYWxsb2NhdGVfbWVtb3J5KGRldi0+YWdwLT5icmlkZ2UsIHBhZ2VzLCB0eXBlKTsKIH0KIAotRVhQT1JUX1NZTUJPTChkcm1fYWxsb2NfYWdwKTsKLQogLyoqIFdyYXBwZXIgYXJvdW5kIGFncF9mcmVlX21lbW9yeSgpICovCiBpbnQgZHJtX2ZyZWVfYWdwKERSTV9BR1BfTUVNICogaGFuZGxlLCBpbnQgcGFnZXMpCiB7CiAJcmV0dXJuIGRybV9hZ3BfZnJlZV9tZW1vcnkoaGFuZGxlKSA/IDAgOiAtRUlOVkFMOwogfQogCi1FWFBPUlRfU1lNQk9MKGRybV9mcmVlX2FncCk7Ci0KIC8qKiBXcmFwcGVyIGFyb3VuZCBhZ3BfYmluZF9tZW1vcnkoKSAqLwogaW50IGRybV9iaW5kX2FncChEUk1fQUdQX01FTSAqIGhhbmRsZSwgdW5zaWduZWQgaW50IHN0YXJ0KQogewogCXJldHVybiBkcm1fYWdwX2JpbmRfbWVtb3J5KGhhbmRsZSwgc3RhcnQpOwogfQogCi1FWFBPUlRfU1lNQk9MKGRybV9iaW5kX2FncCk7Ci0KIC8qKiBXcmFwcGVyIGFyb3VuZCBhZ3BfdW5iaW5kX21lbW9yeSgpICovCiBpbnQgZHJtX3VuYmluZF9hZ3AoRFJNX0FHUF9NRU0gKiBoYW5kbGUpCiB7CiAJcmV0dXJuIGRybV9hZ3BfdW5iaW5kX21lbW9yeShoYW5kbGUpOwogfQotCi1FWFBPUlRfU1lNQk9MKGRybV91bmJpbmRfYWdwKTsKICNlbmRpZgkJCQkvKiBhZ3AgKi8KICNlbmRpZgkJCQkvKiBkZWJ1Z19tZW1vcnkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeV9kZWJ1Zy5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5X2RlYnVnLmgKaW5kZXggYjM3MGFjYS4uZTg0NjA1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5X2RlYnVnLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5X2RlYnVnLmgKQEAgLTEsNSArMSw1IEBACiAvKioKLSAqIFxmaWxlIGRybV9tZW1vcnkuaAorICogXGZpbGUgZHJtX21lbW9yeV9kZWJ1Zy5oCiAgKiBNZW1vcnkgbWFuYWdlbWVudCB3cmFwcGVycyBmb3IgRFJNLgogICoKICAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CkBAIC00Myw0MiArNDMsNDEgQEAKIAl1bnNpZ25lZCBsb25nIGJ5dGVzX2ZyZWVkOwogfSBkcm1fbWVtX3N0YXRzX3Q7CiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soRFJNKG1lbV9sb2NrKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBEUk0ocmFtX2F2YWlsYWJsZSkgPSAwOwkvKiBJbiBwYWdlcyAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgRFJNKHJhbV91c2VkKSA9IDA7Ci1zdGF0aWMgZHJtX21lbV9zdGF0c190IERSTShtZW1fc3RhdHMpW10gPQorc3RhdGljIHNwaW5sb2NrX3QgZHJtX21lbV9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZHJtX3JhbV9hdmFpbGFibGUgPSAwOwkvKiBJbiBwYWdlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZHJtX3JhbV91c2VkID0gMDsKK3N0YXRpYyBkcm1fbWVtX3N0YXRzX3QgZHJtX21lbV9zdGF0c1tdID0KIHsKLQlbRFJNX01FTV9ETUFdID0gewotCSJkbWFidWZzIn0sW0RSTV9NRU1fU0FSRUFdID0gewotCSJzYXJlYXMifSxbRFJNX01FTV9EUklWRVJdID0gewotCSJkcml2ZXIifSxbRFJNX01FTV9NQUdJQ10gPSB7Ci0JIm1hZ2ljIn0sW0RSTV9NRU1fSU9DVExTXSA9IHsKLQkiaW9jdGx0YWIifSxbRFJNX01FTV9NQVBTXSA9IHsKLQkibWFwbGlzdCJ9LFtEUk1fTUVNX1ZNQVNdID0gewotCSJ2bWFsaXN0In0sW0RSTV9NRU1fQlVGU10gPSB7Ci0JImJ1Zmxpc3QifSxbRFJNX01FTV9TRUdTXSA9IHsKLQkic2VnbGlzdCJ9LFtEUk1fTUVNX1BBR0VTXSA9IHsKLQkicGFnZWxpc3QifSxbRFJNX01FTV9GSUxFU10gPSB7Ci0JImZpbGVzIn0sW0RSTV9NRU1fUVVFVUVTXSA9IHsKLQkicXVldWVzIn0sW0RSTV9NRU1fQ01EU10gPSB7Ci0JImNvbW1hbmRzIn0sW0RSTV9NRU1fTUFQUElOR1NdID0gewotCSJtYXBwaW5ncyJ9LFtEUk1fTUVNX0JVRkxJU1RTXSA9IHsKLQkiYnVmbGlzdHMifSxbRFJNX01FTV9BR1BMSVNUU10gPSB7Ci0JImFncGxpc3QifSxbRFJNX01FTV9TR0xJU1RTXSA9IHsKLQkic2dsaXN0In0sW0RSTV9NRU1fVE9UQUxBR1BdID0gewotCSJ0b3RhbGFncCJ9LFtEUk1fTUVNX0JPVU5EQUdQXSA9IHsKLQkiYm91bmRhZ3AifSxbRFJNX01FTV9DVFhCSVRNQVBdID0gewotCSJjdHhiaXRtYXAifSxbRFJNX01FTV9DVFhMSVNUXSA9IHsKLQkiY3R4bGlzdCJ9LFtEUk1fTUVNX1NUVUJdID0gewotCSJzdHViIn0sIHsKLQlOVUxMLCAwLH0JCS8qIExhc3QgZW50cnkgbXVzdCBiZSBudWxsICovCisJW0RSTV9NRU1fRE1BXSA9IHsiZG1hYnVmcyJ9LAorCVtEUk1fTUVNX1NBUkVBXSA9IHsic2FyZWFzIn0sCisJW0RSTV9NRU1fRFJJVkVSXSA9IHsiZHJpdmVyIn0sCisJW0RSTV9NRU1fTUFHSUNdID0geyJtYWdpYyJ9LAorCVtEUk1fTUVNX0lPQ1RMU10gPSB7ImlvY3RsdGFiIn0sCisJW0RSTV9NRU1fTUFQU10gPSB7Im1hcGxpc3QifSwKKwlbRFJNX01FTV9WTUFTXSA9IHsidm1hbGlzdCJ9LAorCVtEUk1fTUVNX0JVRlNdID0geyJidWZsaXN0In0sCisJW0RSTV9NRU1fU0VHU10gPSB7InNlZ2xpc3QifSwKKwlbRFJNX01FTV9QQUdFU10gPSB7InBhZ2VsaXN0In0sCisJW0RSTV9NRU1fRklMRVNdID0geyJmaWxlcyJ9LAorCVtEUk1fTUVNX1FVRVVFU10gPSB7InF1ZXVlcyJ9LAorCVtEUk1fTUVNX0NNRFNdID0geyJjb21tYW5kcyJ9LAorCVtEUk1fTUVNX01BUFBJTkdTXSA9IHsibWFwcGluZ3MifSwKKwlbRFJNX01FTV9CVUZMSVNUU10gPSB7ImJ1Zmxpc3RzIn0sCisJW0RSTV9NRU1fQUdQTElTVFNdID0geyJhZ3BsaXN0In0sCisJW0RSTV9NRU1fU0dMSVNUU10gPSB7InNnbGlzdCJ9LAorCVtEUk1fTUVNX1RPVEFMQUdQXSA9IHsidG90YWxhZ3AifSwKKwlbRFJNX01FTV9CT1VOREFHUF0gPSB7ImJvdW5kYWdwIn0sCisJW0RSTV9NRU1fQ1RYQklUTUFQXSA9IHsiY3R4Yml0bWFwIn0sCisJW0RSTV9NRU1fQ1RYTElTVF0gPSB7ImN0eGxpc3QifSwKKwlbRFJNX01FTV9TVFVCXSA9IHsic3R1YiJ9LAorCXtOVUxMLCAwLH0JCS8qIExhc3QgZW50cnkgbXVzdCBiZSBudWxsICovCiB9OwogCi12b2lkIERSTShtZW1faW5pdCkgKHZvaWQpIHsKK3ZvaWQgZHJtX21lbV9pbml0ICh2b2lkKSB7CiAJZHJtX21lbV9zdGF0c190ICptZW07CiAJc3RydWN0IHN5c2luZm8gc2k7CiAKLQlmb3IgKG1lbSA9IERSTShtZW1fc3RhdHMpOyBtZW0tPm5hbWU7ICsrbWVtKSB7CisJZm9yIChtZW0gPSBkcm1fbWVtX3N0YXRzOyBtZW0tPm5hbWU7ICsrbWVtKSB7CiAJCW1lbS0+c3VjY2VlZF9jb3VudCA9IDA7CiAJCW1lbS0+ZnJlZV9jb3VudCA9IDA7CiAJCW1lbS0+ZmFpbF9jb3VudCA9IDA7CkBAIC04NywxMyArODYsMTMgQEAKIAl9CiAKIAlzaV9tZW1pbmZvKCZzaSk7Ci0JRFJNKHJhbV9hdmFpbGFibGUpID0gc2kudG90YWxyYW07Ci0JRFJNKHJhbV91c2VkKSA9IDA7CisJZHJtX3JhbV9hdmFpbGFibGUgPSBzaS50b3RhbHJhbTsKKwlkcm1fcmFtX3VzZWQgPSAwOwogfQogCiAvKiBkcm1fbWVtX2luZm8gaXMgY2FsbGVkIHdoZW5ldmVyIGEgcHJvY2VzcyByZWFkcyAvZGV2L2RybS9tZW0uICovCiAKLXN0YXRpYyBpbnQgRFJNKF9tZW1faW5mbykgKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCitzdGF0aWMgaW50IGRybV9fbWVtX2luZm8gKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAJCQkgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpIHsKIAlkcm1fbWVtX3N0YXRzX3QgKnB0OwogCWludCBsZW4gPSAwOwpAQCAtMTEyLDExICsxMTEsMTEgQEAKIAkJICAgICAgICIgfCBhbGxvY3MgICAgICBieXRlc1xuXG4iKTsKIAlEUk1fUFJPQ19QUklOVCgiJS05LjlzICU1ZCAlNWQgJTRkICUxMGx1IGtCICAgICAgICAgfFxuIiwKIAkJICAgICAgICJzeXN0ZW0iLCAwLCAwLCAwLAotCQkgICAgICAgRFJNKHJhbV9hdmFpbGFibGUpIDw8IChQQUdFX1NISUZUIC0gMTApKTsKKwkJICAgICAgIGRybV9yYW1fYXZhaWxhYmxlIDw8IChQQUdFX1NISUZUIC0gMTApKTsKIAlEUk1fUFJPQ19QUklOVCgiJS05LjlzICU1ZCAlNWQgJTRkICUxMGx1IGtCICAgICAgICAgfFxuIiwKLQkJICAgICAgICJsb2NrZWQiLCAwLCAwLCAwLCBEUk0ocmFtX3VzZWQpID4+IDEwKTsKKwkJICAgICAgICJsb2NrZWQiLCAwLCAwLCAwLCBkcm1fcmFtX3VzZWQgPj4gMTApOwogCURSTV9QUk9DX1BSSU5UKCJcbiIpOwotCWZvciAocHQgPSBEUk0obWVtX3N0YXRzKTsgcHQtPm5hbWU7IHB0KyspIHsKKwlmb3IgKHB0ID0gZHJtX21lbV9zdGF0czsgcHQtPm5hbWU7IHB0KyspIHsKIAkJRFJNX1BST0NfUFJJTlQoIiUtOS45cyAlNWQgJTVkICU0ZCAlMTBsdSAlMTBsdSB8ICU2ZCAlMTBsZFxuIiwKIAkJCSAgICAgICBwdC0+bmFtZSwKIAkJCSAgICAgICBwdC0+c3VjY2VlZF9jb3VudCwKQEAgLTEzNSwxNyArMTM0LDE3IEBACiAJcmV0dXJuIGxlbiAtIG9mZnNldDsKIH0KIAotaW50IERSTShtZW1faW5mbykgKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCitpbnQgZHJtX21lbV9pbmZvIChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAogCQkgICBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkgewogCWludCByZXQ7CiAKLQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOwotCXJldCA9IERSTShfbWVtX2luZm8pIChidWYsIHN0YXJ0LCBvZmZzZXQsIGxlbiwgZW9mLCBkYXRhKTsKLQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCXJldCA9IGRybV9fbWVtX2luZm8gKGJ1Ziwgc3RhcnQsIG9mZnNldCwgbGVuLCBlb2YsIGRhdGEpOworCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgKkRSTShhbGxvYykgKHNpemVfdCBzaXplLCBpbnQgYXJlYSkgewordm9pZCAqZHJtX2FsbG9jIChzaXplX3Qgc2l6ZSwgaW50IGFyZWEpIHsKIAl2b2lkICpwdDsKIAogCWlmICghc2l6ZSkgewpAQCAtMTU0LDQxICsxNTMsNDEgQEAKIAl9CiAKIAlpZiAoIShwdCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7Ci0JCSsrRFJNKG1lbV9zdGF0cylbYXJlYV0uZmFpbF9jb3VudDsKLQkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJCSsrZHJtX21lbV9zdGF0c1thcmVhXS5mYWlsX2NvdW50OworCQlzcGluX3VubG9jaygmZHJtX21lbV9sb2NrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7Ci0JKytEUk0obWVtX3N0YXRzKVthcmVhXS5zdWNjZWVkX2NvdW50OwotCURSTShtZW1fc3RhdHMpW2FyZWFdLmJ5dGVzX2FsbG9jYXRlZCArPSBzaXplOwotCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJKytkcm1fbWVtX3N0YXRzW2FyZWFdLnN1Y2NlZWRfY291bnQ7CisJZHJtX21lbV9zdGF0c1thcmVhXS5ieXRlc19hbGxvY2F0ZWQgKz0gc2l6ZTsKKwlzcGluX3VubG9jaygmZHJtX21lbV9sb2NrKTsKIAlyZXR1cm4gcHQ7CiB9CiAKLXZvaWQgKkRSTShjYWxsb2MpIChzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLCBpbnQgYXJlYSkgewordm9pZCAqZHJtX2NhbGxvYyAoc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpIHsKIAl2b2lkICphZGRyOwogCi0JYWRkciA9IERSTShhbGxvYykgKG5tZW1iICogc2l6ZSwgYXJlYSk7CisJYWRkciA9IGRybV9hbGxvYyAobm1lbWIgKiBzaXplLCBhcmVhKTsKIAlpZiAoYWRkciAhPSBOVUxMKQogCQltZW1zZXQoKHZvaWQgKilhZGRyLCAwLCBzaXplICogbm1lbWIpOwogCiAJcmV0dXJuIGFkZHI7CiB9CiAKLXZvaWQgKkRSTShyZWFsbG9jKSAodm9pZCAqb2xkcHQsIHNpemVfdCBvbGRzaXplLCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpIHsKK3ZvaWQgKmRybV9yZWFsbG9jICh2b2lkICpvbGRwdCwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplLCBpbnQgYXJlYSkgewogCXZvaWQgKnB0OwogCi0JaWYgKCEocHQgPSBEUk0oYWxsb2MpIChzaXplLCBhcmVhKSkpCisJaWYgKCEocHQgPSBkcm1fYWxsb2MgKHNpemUsIGFyZWEpKSkKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKG9sZHB0ICYmIG9sZHNpemUpIHsKIAkJbWVtY3B5KHB0LCBvbGRwdCwgb2xkc2l6ZSk7Ci0JCURSTShmcmVlKSAob2xkcHQsIG9sZHNpemUsIGFyZWEpOworCQlkcm1fZnJlZSAob2xkcHQsIG9sZHNpemUsIGFyZWEpOwogCX0KIAlyZXR1cm4gcHQ7CiB9CiAKLXZvaWQgRFJNKGZyZWUpICh2b2lkICpwdCwgc2l6ZV90IHNpemUsIGludCBhcmVhKSB7Cit2b2lkIGRybV9mcmVlICh2b2lkICpwdCwgc2l6ZV90IHNpemUsIGludCBhcmVhKSB7CiAJaW50IGFsbG9jX2NvdW50OwogCWludCBmcmVlX2NvdW50OwogCkBAIC0xOTYsNDMgKzE5NSw0MyBAQAogCQlEUk1fTUVNX0VSUk9SKGFyZWEsICJBdHRlbXB0IHRvIGZyZWUgTlVMTCBwb2ludGVyXG4iKTsKIAllbHNlCiAJCWtmcmVlKHB0KTsKLQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOwotCURSTShtZW1fc3RhdHMpW2FyZWFdLmJ5dGVzX2ZyZWVkICs9IHNpemU7Ci0JZnJlZV9jb3VudCA9ICsrRFJNKG1lbV9zdGF0cylbYXJlYV0uZnJlZV9jb3VudDsKLQlhbGxvY19jb3VudCA9IERSTShtZW1fc3RhdHMpW2FyZWFdLnN1Y2NlZWRfY291bnQ7Ci0Jc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwlkcm1fbWVtX3N0YXRzW2FyZWFdLmJ5dGVzX2ZyZWVkICs9IHNpemU7CisJZnJlZV9jb3VudCA9ICsrZHJtX21lbV9zdGF0c1thcmVhXS5mcmVlX2NvdW50OworCWFsbG9jX2NvdW50ID0gZHJtX21lbV9zdGF0c1thcmVhXS5zdWNjZWVkX2NvdW50OworCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCWlmIChmcmVlX2NvdW50ID4gYWxsb2NfY291bnQpIHsKIAkJRFJNX01FTV9FUlJPUihhcmVhLCAiRXhjZXNzIGZyZWVzOiAlZCBmcmVlcywgJWQgYWxsb2NzXG4iLAogCQkJICAgICAgZnJlZV9jb3VudCwgYWxsb2NfY291bnQpOwogCX0KIH0KIAotdW5zaWduZWQgbG9uZyBEUk0oYWxsb2NfcGFnZXMpIChpbnQgb3JkZXIsIGludCBhcmVhKSB7Cit1bnNpZ25lZCBsb25nIGRybV9hbGxvY19wYWdlcyAoaW50IG9yZGVyLCBpbnQgYXJlYSkgewogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKIAl1bnNpZ25lZCBsb25nIGJ5dGVzID0gUEFHRV9TSVpFIDw8IG9yZGVyOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAl1bnNpZ25lZCBpbnQgc3o7CiAKLQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOwotCWlmICgoRFJNKHJhbV91c2VkKSA+PiBQQUdFX1NISUZUKQotCSAgICA+IChEUk1fUkFNX1BFUkNFTlQgKiBEUk0ocmFtX2F2YWlsYWJsZSkpIC8gMTAwKSB7Ci0JCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJaWYgKChkcm1fcmFtX3VzZWQgPj4gUEFHRV9TSElGVCkKKwkgICAgPiAoRFJNX1JBTV9QRVJDRU5UICogZHJtX3JhbV9hdmFpbGFibGUpIC8gMTAwKSB7CisJCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCQlyZXR1cm4gMDsKIAl9Ci0Jc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCiAJYWRkcmVzcyA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9DT01QLCBvcmRlcik7CiAJaWYgKCFhZGRyZXNzKSB7Ci0JCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7Ci0JCSsrRFJNKG1lbV9zdGF0cylbYXJlYV0uZmFpbF9jb3VudDsKLQkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJCSsrZHJtX21lbV9zdGF0c1thcmVhXS5mYWlsX2NvdW50OworCQlzcGluX3VubG9jaygmZHJtX21lbV9sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQotCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7Ci0JKytEUk0obWVtX3N0YXRzKVthcmVhXS5zdWNjZWVkX2NvdW50OwotCURSTShtZW1fc3RhdHMpW2FyZWFdLmJ5dGVzX2FsbG9jYXRlZCArPSBieXRlczsKLQlEUk0ocmFtX3VzZWQpICs9IGJ5dGVzOwotCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJKytkcm1fbWVtX3N0YXRzW2FyZWFdLnN1Y2NlZWRfY291bnQ7CisJZHJtX21lbV9zdGF0c1thcmVhXS5ieXRlc19hbGxvY2F0ZWQgKz0gYnl0ZXM7CisJZHJtX3JhbV91c2VkICs9IGJ5dGVzOworCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCiAJLyogWmVybyBvdXRzaWRlIHRoZSBsb2NrICovCiAJbWVtc2V0KCh2b2lkICopYWRkcmVzcywgMCwgYnl0ZXMpOwpAQCAtMjQ2LDcgKzI0NSw3IEBACiAJcmV0dXJuIGFkZHJlc3M7CiB9CiAKLXZvaWQgRFJNKGZyZWVfcGFnZXMpICh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCBvcmRlciwgaW50IGFyZWEpIHsKK3ZvaWQgZHJtX2ZyZWVfcGFnZXMgKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IG9yZGVyLCBpbnQgYXJlYSkgewogCXVuc2lnbmVkIGxvbmcgYnl0ZXMgPSBQQUdFX1NJWkUgPDwgb3JkZXI7CiAJaW50IGFsbG9jX2NvdW50OwogCWludCBmcmVlX2NvdW50OwpAQCAtMjY0LDEyICsyNjMsMTIgQEAKIAkJZnJlZV9wYWdlcyhhZGRyZXNzLCBvcmRlcik7CiAJfQogCi0Jc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQlmcmVlX2NvdW50ID0gKytEUk0obWVtX3N0YXRzKVthcmVhXS5mcmVlX2NvdW50OwotCWFsbG9jX2NvdW50ID0gRFJNKG1lbV9zdGF0cylbYXJlYV0uc3VjY2VlZF9jb3VudDsKLQlEUk0obWVtX3N0YXRzKVthcmVhXS5ieXRlc19mcmVlZCArPSBieXRlczsKLQlEUk0ocmFtX3VzZWQpIC09IGJ5dGVzOwotCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJZnJlZV9jb3VudCA9ICsrZHJtX21lbV9zdGF0c1thcmVhXS5mcmVlX2NvdW50OworCWFsbG9jX2NvdW50ID0gZHJtX21lbV9zdGF0c1thcmVhXS5zdWNjZWVkX2NvdW50OworCWRybV9tZW1fc3RhdHNbYXJlYV0uYnl0ZXNfZnJlZWQgKz0gYnl0ZXM7CisJZHJtX3JhbV91c2VkIC09IGJ5dGVzOworCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCWlmIChmcmVlX2NvdW50ID4gYWxsb2NfY291bnQpIHsKIAkJRFJNX01FTV9FUlJPUihhcmVhLAogCQkJICAgICAgIkV4Y2VzcyBmcmVlczogJWQgZnJlZXMsICVkIGFsbG9jc1xuIiwKQEAgLTI3Nyw3ICsyNzYsNyBAQAogCX0KIH0KIAotdm9pZCAqRFJNKGlvcmVtYXApICh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLAordm9pZCAqZHJtX2lvcmVtYXAgKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCSAgICBkcm1fZGV2aWNlX3QgKiBkZXYpIHsKIAl2b2lkICpwdDsKIApAQCAtMjg4LDE5ICsyODcsMTkgQEAKIAl9CiAKIAlpZiAoIShwdCA9IGRybV9pb3JlbWFwKG9mZnNldCwgc2l6ZSwgZGV2KSkpIHsKLQkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQkJKytEUk0obWVtX3N0YXRzKVtEUk1fTUVNX01BUFBJTkdTXS5mYWlsX2NvdW50OwotCQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkJKytkcm1fbWVtX3N0YXRzW0RSTV9NRU1fTUFQUElOR1NdLmZhaWxfY291bnQ7CisJCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0Jc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQkrK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fTUFQUElOR1NdLnN1Y2NlZWRfY291bnQ7Ci0JRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uYnl0ZXNfYWxsb2NhdGVkICs9IHNpemU7Ci0Jc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkrK2RybV9tZW1fc3RhdHNbRFJNX01FTV9NQVBQSU5HU10uc3VjY2VlZF9jb3VudDsKKwlkcm1fbWVtX3N0YXRzW0RSTV9NRU1fTUFQUElOR1NdLmJ5dGVzX2FsbG9jYXRlZCArPSBzaXplOworCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCXJldHVybiBwdDsKIH0KIAotdm9pZCAqRFJNKGlvcmVtYXBfbm9jYWNoZSkgKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCit2b2lkICpkcm1faW9yZW1hcF9ub2NhY2hlICh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJICAgIGRybV9kZXZpY2VfdCAqIGRldikgewogCXZvaWQgKnB0OwogCkBAIC0zMTEsMTkgKzMxMCwxOSBAQAogCX0KIAogCWlmICghKHB0ID0gZHJtX2lvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemUsIGRldikpKSB7Ci0JCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7Ci0JCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uZmFpbF9jb3VudDsKLQkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJCSsrZHJtX21lbV9zdGF0c1tEUk1fTUVNX01BUFBJTkdTXS5mYWlsX2NvdW50OworCQlzcGluX3VubG9jaygmZHJtX21lbV9sb2NrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7Ci0JKytEUk0obWVtX3N0YXRzKVtEUk1fTUVNX01BUFBJTkdTXS5zdWNjZWVkX2NvdW50OwotCURSTShtZW1fc3RhdHMpW0RSTV9NRU1fTUFQUElOR1NdLmJ5dGVzX2FsbG9jYXRlZCArPSBzaXplOwotCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJKytkcm1fbWVtX3N0YXRzW0RSTV9NRU1fTUFQUElOR1NdLnN1Y2NlZWRfY291bnQ7CisJZHJtX21lbV9zdGF0c1tEUk1fTUVNX01BUFBJTkdTXS5ieXRlc19hbGxvY2F0ZWQgKz0gc2l6ZTsKKwlzcGluX3VubG9jaygmZHJtX21lbV9sb2NrKTsKIAlyZXR1cm4gcHQ7CiB9CiAKLXZvaWQgRFJNKGlvcmVtYXBmcmVlKSAodm9pZCAqcHQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgZHJtX2RldmljZV90ICogZGV2KSB7Cit2b2lkIGRybV9pb3JlbWFwZnJlZSAodm9pZCAqcHQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgZHJtX2RldmljZV90ICogZGV2KSB7CiAJaW50IGFsbG9jX2NvdW50OwogCWludCBmcmVlX2NvdW50OwogCkBAIC0zMzMsMTEgKzMzMiwxMSBAQAogCWVsc2UKIAkJZHJtX2lvcmVtYXBmcmVlKHB0LCBzaXplLCBkZXYpOwogCi0Jc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQlEUk0obWVtX3N0YXRzKVtEUk1fTUVNX01BUFBJTkdTXS5ieXRlc19mcmVlZCArPSBzaXplOwotCWZyZWVfY291bnQgPSArK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fTUFQUElOR1NdLmZyZWVfY291bnQ7Ci0JYWxsb2NfY291bnQgPSBEUk0obWVtX3N0YXRzKVtEUk1fTUVNX01BUFBJTkdTXS5zdWNjZWVkX2NvdW50OwotCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJZHJtX21lbV9zdGF0c1tEUk1fTUVNX01BUFBJTkdTXS5ieXRlc19mcmVlZCArPSBzaXplOworCWZyZWVfY291bnQgPSArK2RybV9tZW1fc3RhdHNbRFJNX01FTV9NQVBQSU5HU10uZnJlZV9jb3VudDsKKwlhbGxvY19jb3VudCA9IGRybV9tZW1fc3RhdHNbRFJNX01FTV9NQVBQSU5HU10uc3VjY2VlZF9jb3VudDsKKwlzcGluX3VubG9jaygmZHJtX21lbV9sb2NrKTsKIAlpZiAoZnJlZV9jb3VudCA+IGFsbG9jX2NvdW50KSB7CiAJCURSTV9NRU1fRVJST1IoRFJNX01FTV9NQVBQSU5HUywKIAkJCSAgICAgICJFeGNlc3MgZnJlZXM6ICVkIGZyZWVzLCAlZCBhbGxvY3NcbiIsCkBAIC0zNDcsNyArMzQ2LDcgQEAKIAogI2lmIF9fT1NfSEFTX0FHUAogCi1EUk1fQUdQX01FTSAqRFJNKGFsbG9jX2FncCkgKGludCBwYWdlcywgdTMyIHR5cGUpIHsKK0RSTV9BR1BfTUVNICpkcm1fYWxsb2NfYWdwIChkcm1fZGV2aWNlX3QgKmRldiwgaW50IHBhZ2VzLCB1MzIgdHlwZSkgewogCURSTV9BR1BfTUVNICpoYW5kbGU7CiAKIAlpZiAoIXBhZ2VzKSB7CkBAIC0zNTUsMjEgKzM1NCwyMSBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlpZiAoKGhhbmRsZSA9IERSTShhZ3BfYWxsb2NhdGVfbWVtb3J5KSAocGFnZXMsIHR5cGUpKSkgewotCQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOwotCQkrK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fVE9UQUxBR1BdLnN1Y2NlZWRfY291bnQ7Ci0JCURSTShtZW1fc3RhdHMpW0RSTV9NRU1fVE9UQUxBR1BdLmJ5dGVzX2FsbG9jYXRlZAorCWlmICgoaGFuZGxlID0gZHJtX2FncF9hbGxvY2F0ZV9tZW1vcnkgKHBhZ2VzLCB0eXBlKSkpIHsKKwkJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCQkrK2RybV9tZW1fc3RhdHNbRFJNX01FTV9UT1RBTEFHUF0uc3VjY2VlZF9jb3VudDsKKwkJZHJtX21lbV9zdGF0c1tEUk1fTUVNX1RPVEFMQUdQXS5ieXRlc19hbGxvY2F0ZWQKIAkJICAgICs9IHBhZ2VzIDw8IFBBR0VfU0hJRlQ7Ci0JCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAJCXJldHVybiBoYW5kbGU7CiAJfQotCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7Ci0JKytEUk0obWVtX3N0YXRzKVtEUk1fTUVNX1RPVEFMQUdQXS5mYWlsX2NvdW50OwotCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJKytkcm1fbWVtX3N0YXRzW0RSTV9NRU1fVE9UQUxBR1BdLmZhaWxfY291bnQ7CisJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLWludCBEUk0oZnJlZV9hZ3ApIChEUk1fQUdQX01FTSAqIGhhbmRsZSwgaW50IHBhZ2VzKSB7CitpbnQgZHJtX2ZyZWVfYWdwIChEUk1fQUdQX01FTSAqIGhhbmRsZSwgaW50IHBhZ2VzKSB7CiAJaW50IGFsbG9jX2NvdW50OwogCWludCBmcmVlX2NvdW50OwogCWludCByZXR2YWwgPSAtRUlOVkFMOwpAQCAtMzgwLDEzICszNzksMTMgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlpZiAoRFJNKGFncF9mcmVlX21lbW9yeSkgKGhhbmRsZSkpIHsKLQkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQkJZnJlZV9jb3VudCA9ICsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9UT1RBTEFHUF0uZnJlZV9jb3VudDsKLQkJYWxsb2NfY291bnQgPSBEUk0obWVtX3N0YXRzKVtEUk1fTUVNX1RPVEFMQUdQXS5zdWNjZWVkX2NvdW50OwotCQlEUk0obWVtX3N0YXRzKVtEUk1fTUVNX1RPVEFMQUdQXS5ieXRlc19mcmVlZAorCWlmIChkcm1fYWdwX2ZyZWVfbWVtb3J5IChoYW5kbGUpKSB7CisJCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkJZnJlZV9jb3VudCA9ICsrZHJtX21lbV9zdGF0c1tEUk1fTUVNX1RPVEFMQUdQXS5mcmVlX2NvdW50OworCQlhbGxvY19jb3VudCA9IGRybV9tZW1fc3RhdHNbRFJNX01FTV9UT1RBTEFHUF0uc3VjY2VlZF9jb3VudDsKKwkJZHJtX21lbV9zdGF0c1tEUk1fTUVNX1RPVEFMQUdQXS5ieXRlc19mcmVlZAogCQkgICAgKz0gcGFnZXMgPDwgUEFHRV9TSElGVDsKLQkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlzcGluX3VubG9jaygmZHJtX21lbV9sb2NrKTsKIAkJaWYgKGZyZWVfY291bnQgPiBhbGxvY19jb3VudCkgewogCQkJRFJNX01FTV9FUlJPUihEUk1fTUVNX1RPVEFMQUdQLAogCQkJCSAgICAgICJFeGNlc3MgZnJlZXM6ICVkIGZyZWVzLCAlZCBhbGxvY3NcbiIsCkBAIC0zOTcsNyArMzk2LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1pbnQgRFJNKGJpbmRfYWdwKSAoRFJNX0FHUF9NRU0gKiBoYW5kbGUsIHVuc2lnbmVkIGludCBzdGFydCkgeworaW50IGRybV9iaW5kX2FncCAoRFJNX0FHUF9NRU0gKiBoYW5kbGUsIHVuc2lnbmVkIGludCBzdGFydCkgewogCWludCByZXRjb2RlID0gLUVJTlZBTDsKIAogCWlmICghaGFuZGxlKSB7CkBAIC00MDYsMjEgKzQwNSwyMSBAQAogCQlyZXR1cm4gcmV0Y29kZTsKIAl9CiAKLQlpZiAoIShyZXRjb2RlID0gRFJNKGFncF9iaW5kX21lbW9yeSkgKGhhbmRsZSwgc3RhcnQpKSkgewotCQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOwotCQkrK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fQk9VTkRBR1BdLnN1Y2NlZWRfY291bnQ7Ci0JCURSTShtZW1fc3RhdHMpW0RSTV9NRU1fQk9VTkRBR1BdLmJ5dGVzX2FsbG9jYXRlZAorCWlmICghKHJldGNvZGUgPSBkcm1fYWdwX2JpbmRfbWVtb3J5IChoYW5kbGUsIHN0YXJ0KSkpIHsKKwkJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCQkrK2RybV9tZW1fc3RhdHNbRFJNX01FTV9CT1VOREFHUF0uc3VjY2VlZF9jb3VudDsKKwkJZHJtX21lbV9zdGF0c1tEUk1fTUVNX0JPVU5EQUdQXS5ieXRlc19hbGxvY2F0ZWQKIAkJICAgICs9IGhhbmRsZS0+cGFnZV9jb3VudCA8PCBQQUdFX1NISUZUOwotCQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCQlyZXR1cm4gcmV0Y29kZTsKIAl9Ci0Jc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQkrK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fQk9VTkRBR1BdLmZhaWxfY291bnQ7Ci0Jc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkrK2RybV9tZW1fc3RhdHNbRFJNX01FTV9CT1VOREFHUF0uZmFpbF9jb3VudDsKKwlzcGluX3VubG9jaygmZHJtX21lbV9sb2NrKTsKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotaW50IERSTSh1bmJpbmRfYWdwKSAoRFJNX0FHUF9NRU0gKiBoYW5kbGUpIHsKK2ludCBkcm1fdW5iaW5kX2FncCAoRFJNX0FHUF9NRU0gKiBoYW5kbGUpIHsKIAlpbnQgYWxsb2NfY291bnQ7CiAJaW50IGZyZWVfY291bnQ7CiAJaW50IHJldGNvZGUgPSAtRUlOVkFMOwpAQCAtNDMxLDE0ICs0MzAsMTQgQEAKIAkJcmV0dXJuIHJldGNvZGU7CiAJfQogCi0JaWYgKChyZXRjb2RlID0gRFJNKGFncF91bmJpbmRfbWVtb3J5KSAoaGFuZGxlKSkpCisJaWYgKChyZXRjb2RlID0gZHJtX2FncF91bmJpbmRfbWVtb3J5IChoYW5kbGUpKSkKIAkJcmV0dXJuIHJldGNvZGU7Ci0Jc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQlmcmVlX2NvdW50ID0gKytEUk0obWVtX3N0YXRzKVtEUk1fTUVNX0JPVU5EQUdQXS5mcmVlX2NvdW50OwotCWFsbG9jX2NvdW50ID0gRFJNKG1lbV9zdGF0cylbRFJNX01FTV9CT1VOREFHUF0uc3VjY2VlZF9jb3VudDsKLQlEUk0obWVtX3N0YXRzKVtEUk1fTUVNX0JPVU5EQUdQXS5ieXRlc19mcmVlZAorCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwlmcmVlX2NvdW50ID0gKytkcm1fbWVtX3N0YXRzW0RSTV9NRU1fQk9VTkRBR1BdLmZyZWVfY291bnQ7CisJYWxsb2NfY291bnQgPSBkcm1fbWVtX3N0YXRzW0RSTV9NRU1fQk9VTkRBR1BdLnN1Y2NlZWRfY291bnQ7CisJZHJtX21lbV9zdGF0c1tEUk1fTUVNX0JPVU5EQUdQXS5ieXRlc19mcmVlZAogCSAgICArPSBoYW5kbGUtPnBhZ2VfY291bnQgPDwgUEFHRV9TSElGVDsKLQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAJaWYgKGZyZWVfY291bnQgPiBhbGxvY19jb3VudCkgewogCQlEUk1fTUVNX0VSUk9SKERSTV9NRU1fQk9VTkRBR1AsCiAJCQkgICAgICAiRXhjZXNzIGZyZWVzOiAlZCBmcmVlcywgJWQgYWxsb2NzXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX29zX2xpbnV4LmgKaW5kZXggZDUxYWViNC4uNjk1MTE1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9vc19saW51eC5oCkBAIC0xMyw2ICsxMyw3IEBACiAjZGVmaW5lIERSTV9FUlIoZCkJCQktKGQpCiAvKiogQ3VycmVudCBwcm9jZXNzIElEICovCiAjZGVmaW5lIERSTV9DVVJSRU5UUElECQkJY3VycmVudC0+cGlkCisjZGVmaW5lIERSTV9TVVNFUihwKQkJCWNhcGFibGUoQ0FQX1NZU19BRE1JTikKICNkZWZpbmUgRFJNX1VERUxBWShkKQkJCXVkZWxheShkKQogLyoqIFJlYWQgYSBieXRlIGZyb20gYSBNTUlPIHJlZ2lvbiAqLwogI2RlZmluZSBEUk1fUkVBRDgobWFwLCBvZmZzZXQpCQlyZWFkYigoKHZvaWQgX19pb21lbSAqKShtYXApLT5oYW5kbGUpICsgKG9mZnNldCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2lpZHMuaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaWlkcy5oCmluZGV4IGQ2NmRjNTUuLjViMWQzYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaWlkcy5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaWlkcy5oCkBAIC00Niw2ICs0Niw3IEBACiAJezB4MTAwMiwgMHg0RTUwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMzUwfENISVBfSVNfTU9CSUxJVFl9LCBcCiAJezB4MTAwMiwgMHg0RTUxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMzUwfENISVBfSVNfTU9CSUxJVFl9LCBcCiAJezB4MTAwMiwgMHg0RTU0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMzUwfENISVBfSVNfTU9CSUxJVFl9LCBcCisJezB4MTAwMiwgMHg0RTU2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMzUwfENISVBfSVNfTU9CSUxJVFl9LCBcCiAJezB4MTAwMiwgMHg1MTQ0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IxMDB8Q0hJUF9TSU5HTEVfQ1JUQ30sIFwKIAl7MHgxMDAyLCAweDUxNDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjEwMHxDSElQX1NJTkdMRV9DUlRDfSwgXAogCXsweDEwMDIsIDB4NTE0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMTAwfENISVBfU0lOR0xFX0NSVEN9LCBcCkBAIC02OSw2ICs3MCw3IEBACiAJezB4MTAwMiwgMHg1MTZCLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCiAJezB4MTAwMiwgMHg1MTZDLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCiAJezB4MTAwMiwgMHg1NDYwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMzUwfSwgXAorCXsweDEwMDIsIDB4NTU0RiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzUwfSwgXAogCXsweDEwMDIsIDB4NTgzNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzMwMHxDSElQX0lTX0lHUH0sIFwKIAl7MHgxMDAyLCAweDU4MzUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlMzMDB8Q0hJUF9JU19JR1B8Q0hJUF9JU19NT0JJTElUWX0sIFwKIAl7MHgxMDAyLCAweDU4MzYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlMzMDB8Q0hJUF9JU19JR1B9LCBcCkBAIC04MiwxMCArODQsMTMgQEAKIAl7MHgxMDAyLCAweDU5NjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYxMDB9LCBcCiAJezB4MTAwMiwgMHg1OTZBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAogCXsweDEwMDIsIDB4NTk2QiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjI4MH0sIFwKKwl7MHgxMDAyLCAweDViNjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB9LCBcCiAJezB4MTAwMiwgMHg1YzYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfENISVBfSVNfTU9CSUxJVFl9LCBcCiAJezB4MTAwMiwgMHg1YzYyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAogCXsweDEwMDIsIDB4NWM2MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjI4MHxDSElQX0lTX01PQklMSVRZfSwgXAogCXsweDEwMDIsIDB4NWM2NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjI4MH0sIFwKKwl7MHgxMDAyLCAweDVkNGQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjM1MH0sIFwKKwl7MHgxMDAyLCAweDVlNGIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjQyMH0sIFwKIAl7MCwgMCwgMH0KIAogI2RlZmluZSByMTI4X1BDSV9JRFMgXApAQCAtMTc2LDcgKzE4MSw3IEBACiAKICNkZWZpbmUgdmlhZHJ2X1BDSV9JRFMgXAogCXsweDExMDYsIDB4MzAyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKLQl7MHgxMTA2LCAweDMxMTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTEwNiwgMHgzMTE4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBWSUFfUFJPX0dST1VQX0F9LCBcCiAJezB4MTEwNiwgMHgzMTIyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAogCXsweDExMDYsIDB4NzIwNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKIAl7MHgxMTA2LCAweDMxMDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCkBAIC0xOTYsNiArMjAxLDEwIEBACiAJezB4ODA4NiwgMHgyNTcyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAogCXswLCAwLCAwfQogCisjZGVmaW5lIGdhbW1hX1BDSV9JRFMgXAorCXsweDNkM2QsIDB4MDAwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKwogI2RlZmluZSBzYXZhZ2VfUENJX0lEUyBcCiAJezB4NTMzMywgMHg4YTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTM19TQVZBR0UzRH0sIFwKIAl7MHg1MzMzLCAweDhhMjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFMzX1NBVkFHRTNEfSwgXApAQCAtMjM0LDMgKzI0Myw0IEBACiAJezB4ODA4NiwgMHgyNTkyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAogCXsweDgwODYsIDB4Mjc3MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKIAl7MCwgMCwgMH0KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCmluZGV4IDNmNDUyZjcuLjZmOTQzZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKQEAgLTYxLDE2ICs2MSwxNCBAQAogCWNvbnN0IGNoYXIgKm5hbWU7CS8qKjwgZmlsZSBuYW1lICovCiAJaW50ICgqZikgKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CQkvKio8IHByb2MgY2FsbGJhY2sqLwogfSBkcm1fcHJvY19saXN0W10gPSB7Ci0JewotCSJuYW1lIiwgZHJtX25hbWVfaW5mb30sIHsKLQkibWVtIiwgZHJtX21lbV9pbmZvfSwgewotCSJ2bSIsIGRybV92bV9pbmZvfSwgewotCSJjbGllbnRzIiwgZHJtX2NsaWVudHNfaW5mb30sIHsKLQkicXVldWVzIiwgZHJtX3F1ZXVlc19pbmZvfSwgewotCSJidWZzIiwgZHJtX2J1ZnNfaW5mb30sCisJeyJuYW1lIiwgZHJtX25hbWVfaW5mb30sCisJeyJtZW0iLCBkcm1fbWVtX2luZm99LAorCXsidm0iLCBkcm1fdm1faW5mb30sCisJeyJjbGllbnRzIiwgZHJtX2NsaWVudHNfaW5mb30sCisJeyJxdWV1ZXMiLCBkcm1fcXVldWVzX2luZm99LAorCXsiYnVmcyIsIGRybV9idWZzX2luZm99LAogI2lmIERSTV9ERUJVR19DT0RFCi0JewotCSJ2bWEiLCBkcm1fdm1hX2luZm99LAorCXsidm1hIiwgZHJtX3ZtYV9pbmZvfSwKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCmluZGV4IDYwYjZmOGUuLjQyZDc2NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMKQEAgLTkzLDggKzkzLDggQEAKIAogCWRldi0+ZHJpdmVyID0gZHJpdmVyOwogCi0JaWYgKGRldi0+ZHJpdmVyLT5wcmVpbml0KQotCQlpZiAoKHJldGNvZGUgPSBkZXYtPmRyaXZlci0+cHJlaW5pdChkZXYsIGVudC0+ZHJpdmVyX2RhdGEpKSkKKwlpZiAoZGV2LT5kcml2ZXItPmxvYWQpCisJCWlmICgocmV0Y29kZSA9IGRldi0+ZHJpdmVyLT5sb2FkKGRldiwgZW50LT5kcml2ZXJfZGF0YSkpKQogCQkJZ290byBlcnJvcl9vdXRfdW5yZWc7CiAKIAlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpKSB7CkBAIC0xMjQsNDcgKzEyNCwxMCBAQAogCXJldHVybiAwOwogCiAgICAgICBlcnJvcl9vdXRfdW5yZWc6Ci0JZHJtX3Rha2Vkb3duKGRldik7CisJZHJtX2xhc3RjbG9zZShkZXYpOwogCXJldHVybiByZXRjb2RlOwogfQogCi0vKioKLSAqIEZpbGUgXGMgb3BlbiBvcGVyYXRpb24uCi0gKgotICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KLSAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KLSAqCi0gKiBQdXRzIHRoZSBkZXYtPmZvcHMgY29ycmVzcG9uZGluZyB0byB0aGUgZGV2aWNlIG1pbm9yIG51bWJlciBpbnRvCi0gKiBccCBmaWxwLCBjYWxsIHRoZSBcYyBvcGVuIG1ldGhvZCwgYW5kIHJlc3RvcmUgdGhlIGZpbGUgb3BlcmF0aW9ucy4KLSAqLwotaW50IGRybV9zdHViX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0JZHJtX2RldmljZV90ICpkZXYgPSBOVUxMOwotCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0JaW50IGVyciA9IC1FTk9ERVY7Ci0Jc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb2xkX2ZvcHM7Ci0KLQlEUk1fREVCVUcoIlxuIik7Ci0KLQlpZiAoISgobWlub3IgPj0gMCkgJiYgKG1pbm9yIDwgZHJtX2NhcmRzX2xpbWl0KSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKCFkcm1faGVhZHNbbWlub3JdKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghKGRldiA9IGRybV9oZWFkc1ttaW5vcl0tPmRldikpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jb2xkX2ZvcHMgPSBmaWxwLT5mX29wOwotCWZpbHAtPmZfb3AgPSBmb3BzX2dldCgmZGV2LT5kcml2ZXItPmZvcHMpOwotCWlmIChmaWxwLT5mX29wLT5vcGVuICYmIChlcnIgPSBmaWxwLT5mX29wLT5vcGVuKGlub2RlLCBmaWxwKSkpIHsKLQkJZm9wc19wdXQoZmlscC0+Zl9vcCk7Ci0JCWZpbHAtPmZfb3AgPSBmb3BzX2dldChvbGRfZm9wcyk7Ci0JfQotCWZvcHNfcHV0KG9sZF9mb3BzKTsKLQotCXJldHVybiBlcnI7Ci19CiAKIC8qKgogICogR2V0IGEgc2Vjb25kYXJ5IG1pbm9yIG51bWJlci4KQEAgLTIwMCwxMSArMTYzLDcgQEAKIAkJCQlnb3RvIGVycl9nMTsKIAkJCX0KIAotCQkJaGVhZC0+ZGV2X2NsYXNzID0gZHJtX3N5c2ZzX2RldmljZV9hZGQoZHJtX2NsYXNzLAotCQkJCQkJCSAgICAgICBNS0RFVihEUk1fTUFKT1IsCi0JCQkJCQkJCSAgICAgbWlub3IpLAotCQkJCQkJCSAgICAgICAmZGV2LT5wZGV2LT5kZXYsCi0JCQkJCQkJICAgICAgICJjYXJkJWQiLCBtaW5vcik7CisJCQloZWFkLT5kZXZfY2xhc3MgPSBkcm1fc3lzZnNfZGV2aWNlX2FkZChkcm1fY2xhc3MsIGhlYWQpOwogCQkJaWYgKElTX0VSUihoZWFkLT5kZXZfY2xhc3MpKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkJICAgICAgICJEUk06IEVycm9yIHN5c2ZzX2RldmljZV9hZGQuXG4iKTsKQEAgLTI1OCwxMSArMjE3LDEwIEBACiAJfQogCWlmICgocmV0ID0gZHJtX2dldF9oZWFkKGRldiwgJmRldi0+cHJpbWFyeSkpKQogCQlnb3RvIGVycl9nMTsKLQotCS8qIHBvc3Rpbml0IGlzIGEgcmVxdWlyZWQgZnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgc2lnbm9uIGJhbm5lciAqLwotCS8qIGRyaXZlcnMgYWRkIHNlY29uZGFyeSBoZWFkcyBoZXJlIGlmIG5lZWRlZCAqLwotCWlmICgocmV0ID0gZGV2LT5kcml2ZXItPnBvc3Rpbml0KGRldiwgZW50LT5kcml2ZXJfZGF0YSkpKQotCQlnb3RvIGVycl9nMTsKKwkKKwlEUk1fSU5GTygiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWRcbiIsCisJCSBkcml2ZXItPm5hbWUsIGRyaXZlci0+bWFqb3IsIGRyaXZlci0+bWlub3IsIGRyaXZlci0+cGF0Y2hsZXZlbCwKKwkJIGRyaXZlci0+ZGF0ZSwgZGV2LT5wcmltYXJ5Lm1pbm9yKTsKIAogCXJldHVybiAwOwogCkBAIC0zMTgsMTAgKzI3Niw5IEBACiAJRFJNX0RFQlVHKCJyZWxlYXNlIHNlY29uZGFyeSBtaW5vciAlZFxuIiwgbWlub3IpOwogCiAJZHJtX3Byb2NfY2xlYW51cChtaW5vciwgZHJtX3Byb2Nfcm9vdCwgaGVhZC0+ZGV2X3Jvb3QpOwotCWRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKE1LREVWKERSTV9NQUpPUiwgaGVhZC0+bWlub3IpKTsKKwlkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZShoZWFkLT5kZXZfY2xhc3MpOwogCi0JKmhlYWQgPSAoZHJtX2hlYWRfdCkgewotCS5kZXYgPSBOVUxMfTsKKwkqaGVhZCA9IChkcm1faGVhZF90KSB7LmRldiA9IE5VTEx9OwogCiAJZHJtX2hlYWRzW21pbm9yXSA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jCmluZGV4IDZkMzQ0OTcuLjY4ZTQzZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYwpAQCAtMTUsOCArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAogI2luY2x1ZGUgImRybV9jb3JlLmgiCiAjaW5jbHVkZSAiZHJtUC5oIgpAQCAtMjgsMTUgKzI2LDExIEBACiAjZGVmaW5lIHRvX2RybV9zeXNmc19jbGFzcyhkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGRybV9zeXNmc19jbGFzcywgY2xhc3MpCiAKIHN0cnVjdCBzaW1wbGVfZGV2IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiAJZGV2X3QgZGV2OwogCXN0cnVjdCBjbGFzc19kZXZpY2UgY2xhc3NfZGV2OwogfTsKICNkZWZpbmUgdG9fc2ltcGxlX2RldihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHNpbXBsZV9kZXYsIGNsYXNzX2RldikKIAotc3RhdGljIExJU1RfSEVBRChzaW1wbGVfZGV2X2xpc3QpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhzaW1wbGVfZGV2X2xpc3RfbG9jayk7Ci0KIHN0YXRpYyB2b2lkIHJlbGVhc2Vfc2ltcGxlX2RldihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpCiB7CiAJc3RydWN0IHNpbXBsZV9kZXYgKnNfZGV2ID0gdG9fc2ltcGxlX2RldihjbGFzc19kZXYpOwpAQCAtMTI0LDYgKzExOCwxOCBAQAogCWNsYXNzX3VucmVnaXN0ZXIoJmNzLT5jbGFzcyk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfZHJpKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQoreworCWRybV9kZXZpY2VfdCAqIGRldiA9ICgoZHJtX2hlYWRfdCAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSkpLT5kZXY7CisJaWYgKGRldi0+ZHJpdmVyLT5kcmlfbGlicmFyeV9uYW1lKQorCQlyZXR1cm4gZGV2LT5kcml2ZXItPmRyaV9saWJyYXJ5X25hbWUoZGV2LCBidWYpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIGNsYXNzX2RldmljZV9hdHRyc1tdID0geworCV9fQVRUUihkcmlfbGlicmFyeV9uYW1lLCBTX0lSVUdPLCBzaG93X2RyaSwgTlVMTCksCit9OworCiAvKioKICAqIGRybV9zeXNmc19kZXZpY2VfYWRkIC0gYWRkcyBhIGNsYXNzIGRldmljZSB0byBzeXNmcyBmb3IgYSBjaGFyYWN0ZXIgZHJpdmVyCiAgKiBAY3M6IHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MgdGhhdCB0aGlzIGRldmljZSBzaG91bGQgYmUgcmVnaXN0ZXJlZCB0by4KQEAgLTEzOCwxMyArMTQ0LDExIEBACiAgKiBOb3RlOiB0aGUgc3RydWN0IGRybV9zeXNmc19jbGFzcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuCiAgKiBjcmVhdGVkIHdpdGggYSBjYWxsIHRvIGRybV9zeXNmc19jcmVhdGUoKS4KICAqLwotc3RydWN0IGNsYXNzX2RldmljZSAqZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGRybV9zeXNmc19jbGFzcyAqY3MsIGRldl90IGRldiwKLQkJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCi0JCQkJCSAgY29uc3QgY2hhciAqZm10LCAuLi4pCitzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkcm1fc3lzZnNfZGV2aWNlX2FkZChzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzICpjcywKKwkJCQkJICBkcm1faGVhZF90ICpoZWFkKQogewotCXZhX2xpc3QgYXJnczsKIAlzdHJ1Y3Qgc2ltcGxlX2RldiAqc19kZXYgPSBOVUxMOwotCWludCByZXR2YWw7CisJaW50IGksIHJldHZhbDsKIAogCWlmICgoY3MgPT0gTlVMTCkgfHwgKElTX0VSUihjcykpKSB7CiAJCXJldHZhbCA9IC1FTk9ERVY7CkBAIC0xNTgsMjYgKzE2MiwyMyBAQAogCX0KIAltZW1zZXQoc19kZXYsIDB4MDAsIHNpemVvZigqc19kZXYpKTsKIAotCXNfZGV2LT5kZXYgPSBkZXY7Ci0Jc19kZXYtPmNsYXNzX2Rldi5kZXYgPSBkZXZpY2U7CisJc19kZXYtPmRldiA9IE1LREVWKERSTV9NQUpPUiwgaGVhZC0+bWlub3IpOworCXNfZGV2LT5jbGFzc19kZXYuZGV2ID0gJihoZWFkLT5kZXYtPnBkZXYpLT5kZXY7CiAJc19kZXYtPmNsYXNzX2Rldi5jbGFzcyA9ICZjcy0+Y2xhc3M7CiAKLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCXZzbnByaW50ZihzX2Rldi0+Y2xhc3NfZGV2LmNsYXNzX2lkLCBCVVNfSURfU0laRSwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7CisJc25wcmludGYoc19kZXYtPmNsYXNzX2Rldi5jbGFzc19pZCwgQlVTX0lEX1NJWkUsICJjYXJkJWQiLCBoZWFkLT5taW5vcik7CiAJcmV0dmFsID0gY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZzX2Rldi0+Y2xhc3NfZGV2KTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycm9yOwogCiAJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZzX2Rldi0+Y2xhc3NfZGV2LCAmY3MtPmF0dHIpOworCWNsYXNzX3NldF9kZXZkYXRhKCZzX2Rldi0+Y2xhc3NfZGV2LCBoZWFkKTsKIAotCXNwaW5fbG9jaygmc2ltcGxlX2Rldl9saXN0X2xvY2spOwotCWxpc3RfYWRkKCZzX2Rldi0+bm9kZSwgJnNpbXBsZV9kZXZfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnNpbXBsZV9kZXZfbGlzdF9sb2NrKTsKLQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzX2RldmljZV9hdHRycyk7IGkrKykKKwkJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZzX2Rldi0+Y2xhc3NfZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKIAlyZXR1cm4gJnNfZGV2LT5jbGFzc19kZXY7CiAKLSAgICAgIGVycm9yOgorZXJyb3I6CiAJa2ZyZWUoc19kZXYpOwogCXJldHVybiBFUlJfUFRSKHJldHZhbCk7CiB9CkBAIC0xODksMjMgKzE5MCwxMiBAQAogICogVGhpcyBjYWxsIHVucmVnaXN0ZXJzIGFuZCBjbGVhbnMgdXAgYSBjbGFzcyBkZXZpY2UgdGhhdCB3YXMgY3JlYXRlZCB3aXRoIGEKICAqIGNhbGwgdG8gZHJtX3N5c2ZzX2RldmljZV9hZGQoKQogICovCi12b2lkIGRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKGRldl90IGRldikKK3ZvaWQgZHJtX3N5c2ZzX2RldmljZV9yZW1vdmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQogewotCXN0cnVjdCBzaW1wbGVfZGV2ICpzX2RldiA9IE5VTEw7Ci0JaW50IGZvdW5kID0gMDsKKwlzdHJ1Y3Qgc2ltcGxlX2RldiAqc19kZXYgPSB0b19zaW1wbGVfZGV2KGNsYXNzX2Rldik7CisJaW50IGk7CiAKLQlzcGluX2xvY2soJnNpbXBsZV9kZXZfbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNfZGV2LCAmc2ltcGxlX2Rldl9saXN0LCBub2RlKSB7Ci0JCWlmIChzX2Rldi0+ZGV2ID09IGRldikgewotCQkJZm91bmQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGZvdW5kKSB7Ci0JCWxpc3RfZGVsKCZzX2Rldi0+bm9kZSk7Ci0JCXNwaW5fdW5sb2NrKCZzaW1wbGVfZGV2X2xpc3RfbG9jayk7Ci0JCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZzX2Rldi0+Y2xhc3NfZGV2KTsKLQl9IGVsc2UgewotCQlzcGluX3VubG9jaygmc2ltcGxlX2Rldl9saXN0X2xvY2spOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGFzc19kZXZpY2VfYXR0cnMpOyBpKyspCisJCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZSgmc19kZXYtPmNsYXNzX2RldiwgJmNsYXNzX2RldmljZV9hdHRyc1tpXSk7CisJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJnNfZGV2LT5jbGFzc19kZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jCmluZGV4IGRiYTUwMjMuLmNjMWI4OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKQEAgLTExNCw3ICsxMTQsNiBAQAogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpODEwX2J1ZmZlcl9mb3BzID0gewogCS5vcGVuID0gZHJtX29wZW4sCi0JLmZsdXNoID0gZHJtX2ZsdXNoLAogCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCiAJLmlvY3RsID0gZHJtX2lvY3RsLAogCS5tbWFwID0gaTgxMF9tbWFwX2J1ZmZlcnMsCkBAIC0xMzE5LDEyICsxMzE4LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaTgxMF9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KQoraW50IGk4MTBfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJLyogaTgxMCBoYXMgNCBtb3JlIGNvdW50ZXJzICovCisJZGV2LT5jb3VudGVycyArPSA0OworCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROworCWRldi0+dHlwZXNbN10gPSBfRFJNX1NUQVRfUFJJTUFSWTsKKwlkZXYtPnR5cGVzWzhdID0gX0RSTV9TVEFUX1NFQ09OREFSWTsKKwlkZXYtPnR5cGVzWzldID0gX0RSTV9TVEFUX0RNQTsKKworCXJldHVybiAwOworfQorCit2b2lkIGk4MTBfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCiB7CiAJaTgxMF9kbWFfY2xlYW51cChkZXYpOwogfQogCi12b2lkIGk4MTBfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIGk4MTBfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTMzNCw3ICsxMzQ1LDcgQEAKIAl9CiB9CiAKLXZvaWQgaTgxMF9kcml2ZXJfcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQordm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaTgxMF9yZWNsYWltX2J1ZmZlcnMoZGV2LCBmaWxwKTsKIH0KQEAgLTEzNDYsMjEgKzEzNTcsMjEgQEAKIH0KIAogZHJtX2lvY3RsX2Rlc2NfdCBpODEwX2lvY3Rsc1tdID0gewotCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfSU5JVCldID0ge2k4MTBfZG1hX2luaXQsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfVkVSVEVYKV0gPSB7aTgxMF9kbWFfdmVydGV4LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0NMRUFSKV0gPSB7aTgxMF9jbGVhcl9idWZzLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0ZMVVNIKV0gPSB7aTgxMF9mbHVzaF9pb2N0bCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9HRVRBR0UpXSA9IHtpODEwX2dldGFnZSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9HRVRCVUYpXSA9IHtpODEwX2dldGJ1ZiwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9TV0FQKV0gPSB7aTgxMF9zd2FwX2J1ZnMsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfQ09QWSldID0ge2k4MTBfY29weWJ1ZiwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9ET0NPUFkpXSA9IHtpODEwX2RvY29weSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9PVjBJTkZPKV0gPSB7aTgxMF9vdjBfaW5mbywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9GU1RBVFVTKV0gPSB7aTgxMF9mc3RhdHVzLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODEwX09WMEZMSVApXSA9IHtpODEwX292MF9mbGlwLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODEwX01DKV0gPSB7aTgxMF9kbWFfbWMsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfUlNUQVRVUyldID0ge2k4MTBfcnN0YXR1cywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9GTElQKV0gPSB7aTgxMF9mbGlwX2J1ZnMsIDEsIDB9CisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9JTklUKV0gPSB7aTgxMF9kbWFfaW5pdCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX1ZFUlRFWCldID0ge2k4MTBfZG1hX3ZlcnRleCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfQ0xFQVIpXSA9IHtpODEwX2NsZWFyX2J1ZnMsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0ZMVVNIKV0gPSB7aTgxMF9mbHVzaF9pb2N0bCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfR0VUQUdFKV0gPSB7aTgxMF9nZXRhZ2UsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0dFVEJVRildID0ge2k4MTBfZ2V0YnVmLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9TV0FQKV0gPSB7aTgxMF9zd2FwX2J1ZnMsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0NPUFkpXSA9IHtpODEwX2NvcHlidWYsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0RPQ09QWSldID0ge2k4MTBfZG9jb3B5LCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9PVjBJTkZPKV0gPSB7aTgxMF9vdjBfaW5mbywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfRlNUQVRVUyldID0ge2k4MTBfZnN0YXR1cywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfT1YwRkxJUCldID0ge2k4MTBfb3YwX2ZsaXAsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX01DKV0gPSB7aTgxMF9kbWFfbWMsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9SU1RBVFVTKV0gPSB7aTgxMF9yc3RhdHVzLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9GTElQKV0gPSB7aTgxMF9mbGlwX2J1ZnMsIERSTV9BVVRIfQogfTsKIAogaW50IGk4MTBfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoaTgxMF9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5jCmluZGV4IDA3MGNlZjYuLmRmZTZhZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmMKQEAgLTM4LDM4ICszOCw2IEBACiAKICNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCiAKLXN0YXRpYyBpbnQgcG9zdGluaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQkvKiBpODEwIGhhcyA0IG1vcmUgY291bnRlcnMgKi8KLQlkZXYtPmNvdW50ZXJzICs9IDQ7Ci0JZGV2LT50eXBlc1s2XSA9IF9EUk1fU1RBVF9JUlE7Ci0JZGV2LT50eXBlc1s3XSA9IF9EUk1fU1RBVF9QUklNQVJZOwotCWRldi0+dHlwZXNbOF0gPSBfRFJNX1NUQVRfU0VDT05EQVJZOwotCWRldi0+dHlwZXNbOV0gPSBfRFJNX1NUQVRfRE1BOwotCi0JRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKLQkJIERSSVZFUl9OQU1FLAotCQkgRFJJVkVSX01BSk9SLAotCQkgRFJJVkVSX01JTk9SLAotCQkgRFJJVkVSX1BBVENITEVWRUwsCi0JCSBEUklWRVJfREFURSwgZGV2LT5wcmltYXJ5Lm1pbm9yLCBwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQotCSAgICApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZlcnNpb24oZHJtX3ZlcnNpb25fdCAqIHZlcnNpb24pCi17Ci0JaW50IGxlbjsKLQotCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKLQl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSk7Ci0JRFJNX0NPUFkodmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0gewogCWk4MTBfUENJX0lEUwogfTsKQEAgLTc5LDE2ICs0NywxNCBAQAogCSAgICBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9SRVFVSVJFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8CiAJICAgIERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9ETUFfUVVFVUUsCiAJLmRldl9wcml2X3NpemUgPSBzaXplb2YoZHJtX2k4MTBfYnVmX3ByaXZfdCksCi0JLnByZXRha2Vkb3duID0gaTgxMF9kcml2ZXJfcHJldGFrZWRvd24sCi0JLnByZXJlbGVhc2UgPSBpODEwX2RyaXZlcl9wcmVyZWxlYXNlLAorCS5sb2FkID0gaTgxMF9kcml2ZXJfbG9hZCwKKwkubGFzdGNsb3NlID0gaTgxMF9kcml2ZXJfbGFzdGNsb3NlLAorCS5wcmVjbG9zZSA9IGk4MTBfZHJpdmVyX3ByZWNsb3NlLAogCS5kZXZpY2VfaXNfYWdwID0gaTgxMF9kcml2ZXJfZGV2aWNlX2lzX2FncCwKLQkucmVsZWFzZSA9IGk4MTBfZHJpdmVyX3JlbGVhc2UsCisJLnJlY2xhaW1fYnVmZmVyc19sb2NrZWQgPSBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkLAogCS5kbWFfcXVpZXNjZW50ID0gaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudCwKLQkucmVjbGFpbV9idWZmZXJzID0gaTgxMF9yZWNsYWltX2J1ZmZlcnMsCiAJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCiAJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCi0JLnBvc3Rpbml0ID0gcG9zdGluaXQsCi0JLnZlcnNpb24gPSB2ZXJzaW9uLAogCS5pb2N0bHMgPSBpODEwX2lvY3RscywKIAkuZm9wcyA9IHsKIAkJIC5vd25lciA9IFRISVNfTU9EVUxFLApAQCAtOTgsMTMgKzY0LDE5IEBACiAJCSAubW1hcCA9IGRybV9tbWFwLAogCQkgLnBvbGwgPSBkcm1fcG9sbCwKIAkJIC5mYXN5bmMgPSBkcm1fZmFzeW5jLAotCQkgfQotCSwKKwl9LAorCiAJLnBjaV9kcml2ZXIgPSB7Ci0JCSAgICAgICAubmFtZSA9IERSSVZFUl9OQU1FLAotCQkgICAgICAgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAotCQkgICAgICAgfQotCSwKKwkJIC5uYW1lID0gRFJJVkVSX05BTUUsCisJCSAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCisJfSwKKworCS5uYW1lID0gRFJJVkVSX05BTUUsCisJLmRlc2MgPSBEUklWRVJfREVTQywKKwkuZGF0ZSA9IERSSVZFUl9EQVRFLAorCS5tYWpvciA9IERSSVZFUl9NQUpPUiwKKwkubWlub3IgPSBEUklWRVJfTUlOT1IsCisJLnBhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGk4MTBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCmluZGV4IGM3OGYzNmEuLmExOGI4MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKQEAgLTExNiw5ICsxMTYsMTMgQEAKIGV4dGVybiB2b2lkIGk4MTBfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApOwogCiBleHRlcm4gaW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1leHRlcm4gdm9pZCBpODEwX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7CitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKTsKK2V4dGVybiBpbnQgaTgxMF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB2b2lkIGk4MTBfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gaW50IGk4MTBfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KTsKIAogZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3QgaTgxMF9pb2N0bHNbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYwppbmRleCBkYzk0ZjE5Li40ZmVhMzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCkBAIC0xMTYsNyArMTE2LDYgQEAKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTgzMF9idWZmZXJfZm9wcyA9IHsKIAkub3BlbiA9IGRybV9vcGVuLAotCS5mbHVzaCA9IGRybV9mbHVzaCwKIAkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAogCS5pb2N0bCA9IGRybV9pb2N0bCwKIAkubW1hcCA9IGk4MzBfbW1hcF9idWZmZXJzLApAQCAtMTUxNywxMiArMTUxNiwyNCBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGk4MzBfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBpODMwX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCS8qIGk4MzAgaGFzIDQgbW9yZSBjb3VudGVycyAqLworCWRldi0+Y291bnRlcnMgKz0gNDsKKwlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKKwlkZXYtPnR5cGVzWzddID0gX0RSTV9TVEFUX1BSSU1BUlk7CisJZGV2LT50eXBlc1s4XSA9IF9EUk1fU1RBVF9TRUNPTkRBUlk7CisJZGV2LT50eXBlc1s5XSA9IF9EUk1fU1RBVF9ETUE7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpODMwX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KQogewogCWk4MzBfZG1hX2NsZWFudXAoZGV2KTsKIH0KIAotdm9pZCBpODMwX2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQordm9pZCBpODMwX2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE1MzIsNyArMTU0Myw3IEBACiAJfQogfQogCi12b2lkIGk4MzBfZHJpdmVyX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3ZvaWQgaTgzMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWk4MzBfcmVjbGFpbV9idWZmZXJzKGRldiwgZmlscCk7CiB9CkBAIC0xNTQ0LDIwICsxNTU1LDIwIEBACiB9CiAKIGRybV9pb2N0bF9kZXNjX3QgaTgzMF9pb2N0bHNbXSA9IHsKLQlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0lOSVQpXSA9IHtpODMwX2RtYV9pbml0LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODMwX1ZFUlRFWCldID0ge2k4MzBfZG1hX3ZlcnRleCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9DTEVBUildID0ge2k4MzBfY2xlYXJfYnVmcywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9GTFVTSCldID0ge2k4MzBfZmx1c2hfaW9jdGwsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfR0VUQUdFKV0gPSB7aTgzMF9nZXRhZ2UsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfR0VUQlVGKV0gPSB7aTgzMF9nZXRidWYsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfU1dBUCldID0ge2k4MzBfc3dhcF9idWZzLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0NPUFkpXSA9IHtpODMwX2NvcHlidWYsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfRE9DT1BZKV0gPSB7aTgzMF9kb2NvcHksIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfRkxJUCldID0ge2k4MzBfZmxpcF9idWZzLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0lSUV9FTUlUKV0gPSB7aTgzMF9pcnFfZW1pdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9JUlFfV0FJVCldID0ge2k4MzBfaXJxX3dhaXQsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfR0VUUEFSQU0pXSA9IHtpODMwX2dldHBhcmFtLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODMwX1NFVFBBUkFNKV0gPSB7aTgzMF9zZXRwYXJhbSwgMSwgMH0KKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0lOSVQpXSA9IHtpODMwX2RtYV9pbml0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfVkVSVEVYKV0gPSB7aTgzMF9kbWFfdmVydGV4LCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9DTEVBUildID0ge2k4MzBfY2xlYXJfYnVmcywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfRkxVU0gpXSA9IHtpODMwX2ZsdXNoX2lvY3RsLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9HRVRBR0UpXSA9IHtpODMwX2dldGFnZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfR0VUQlVGKV0gPSB7aTgzMF9nZXRidWYsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX1NXQVApXSA9IHtpODMwX3N3YXBfYnVmcywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfQ09QWSldID0ge2k4MzBfY29weWJ1ZiwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfRE9DT1BZKV0gPSB7aTgzMF9kb2NvcHksIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0ZMSVApXSA9IHtpODMwX2ZsaXBfYnVmcywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfSVJRX0VNSVQpXSA9IHtpODMwX2lycV9lbWl0LCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9JUlFfV0FJVCldID0ge2k4MzBfaXJxX3dhaXQsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0dFVFBBUkFNKV0gPSB7aTgzMF9nZXRwYXJhbSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfU0VUUEFSQU0pXSA9IHtpODMwX3NldHBhcmFtLCBEUk1fQVVUSH0KIH07CiAKIGludCBpODMwX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk4MzBfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuYwppbmRleCBhY2Q4MjFlOC4uNzIyNjU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuYwpAQCAtNDAsMzcgKzQwLDYgQEAKIAogI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKIAotc3RhdGljIGludCBwb3N0aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCWRldi0+Y291bnRlcnMgKz0gNDsKLQlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKLQlkZXYtPnR5cGVzWzddID0gX0RSTV9TVEFUX1BSSU1BUlk7Ci0JZGV2LT50eXBlc1s4XSA9IF9EUk1fU1RBVF9TRUNPTkRBUlk7Ci0JZGV2LT50eXBlc1s5XSA9IF9EUk1fU1RBVF9ETUE7Ci0KLQlEUk1fSU5GTygiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWQ6ICVzXG4iLAotCQkgRFJJVkVSX05BTUUsCi0JCSBEUklWRVJfTUFKT1IsCi0JCSBEUklWRVJfTUlOT1IsCi0JCSBEUklWRVJfUEFUQ0hMRVZFTCwKLQkJIERSSVZFUl9EQVRFLCBkZXYtPnByaW1hcnkubWlub3IsIHBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCi0JICAgICk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmVyc2lvbihkcm1fdmVyc2lvbl90ICogdmVyc2lvbikKLXsKLQlpbnQgbGVuOwotCi0JdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKLQl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOwotCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOwotCURSTV9DT1BZKHZlcnNpb24tPm5hbWUsIERSSVZFUl9OQU1FKTsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSk7Ci0JRFJNX0NPUFkodmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CiAJaTgzMF9QQ0lfSURTCiB9OwpAQCAtODMsMTIgKzUyLDEyIEBACiAJLmRyaXZlcl9mZWF0dXJlcyB8PSBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfU0hBUkVEX0lSUSwKICNlbmRpZgogCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9pODMwX2J1Zl9wcml2X3QpLAotCS5wcmV0YWtlZG93biA9IGk4MzBfZHJpdmVyX3ByZXRha2Vkb3duLAotCS5wcmVyZWxlYXNlID0gaTgzMF9kcml2ZXJfcHJlcmVsZWFzZSwKKwkubG9hZCA9IGk4MzBfZHJpdmVyX2xvYWQsCisJLmxhc3RjbG9zZSA9IGk4MzBfZHJpdmVyX2xhc3RjbG9zZSwKKwkucHJlY2xvc2UgPSBpODMwX2RyaXZlcl9wcmVjbG9zZSwKIAkuZGV2aWNlX2lzX2FncCA9IGk4MzBfZHJpdmVyX2RldmljZV9pc19hZ3AsCi0JLnJlbGVhc2UgPSBpODMwX2RyaXZlcl9yZWxlYXNlLAorCS5yZWNsYWltX2J1ZmZlcnNfbG9ja2VkID0gaTgzMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZCwKIAkuZG1hX3F1aWVzY2VudCA9IGk4MzBfZHJpdmVyX2RtYV9xdWllc2NlbnQsCi0JLnJlY2xhaW1fYnVmZmVycyA9IGk4MzBfcmVjbGFpbV9idWZmZXJzLAogCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAogCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAogI2lmIFVTRV9JUlFTCkBAIC05Nyw4ICs2Niw2IEBACiAJLmlycV91bmluc3RhbGwgPSBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsLAogCS5pcnFfaGFuZGxlciA9IGk4MzBfZHJpdmVyX2lycV9oYW5kbGVyLAogI2VuZGlmCi0JLnBvc3Rpbml0ID0gcG9zdGluaXQsCi0JLnZlcnNpb24gPSB2ZXJzaW9uLAogCS5pb2N0bHMgPSBpODMwX2lvY3RscywKIAkuZm9wcyA9IHsKIAkJIC5vd25lciA9IFRISVNfTU9EVUxFLApAQCAtMTA4LDEzICs3NSwxOSBAQAogCQkgLm1tYXAgPSBkcm1fbW1hcCwKIAkJIC5wb2xsID0gZHJtX3BvbGwsCiAJCSAuZmFzeW5jID0gZHJtX2Zhc3luYywKLQkJIH0KLQksCi0JLnBjaV9kcml2ZXIgPSB7Ci0JCSAgICAgICAubmFtZSA9IERSSVZFUl9OQU1FLAotCQkgICAgICAgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAotCQkgICAgICAgfQorCX0sCiAKKwkucGNpX2RyaXZlciA9IHsKKwkJIC5uYW1lID0gRFJJVkVSX05BTUUsCisJCSAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCisJfSwKKworCS5uYW1lID0gRFJJVkVSX05BTUUsCisJLmRlc2MgPSBEUklWRVJfREVTQywKKwkuZGF0ZSA9IERSSVZFUl9EQVRFLAorCS5tYWpvciA9IERSSVZFUl9NQUpPUiwKKwkubWlub3IgPSBEUklWRVJfTUlOT1IsCisJLnBhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGk4MzBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCmluZGV4IGJjNGJkNDkuLmJmOTA3NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKQEAgLTEzNiwxMCArMTM2LDEyIEBACiBleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CiBleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpODMwX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKK2V4dGVybiBpbnQgaTgzMF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gaW50IGk4MzBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOwogZXh0ZXJuIGludCBpODMwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldik7CiAKICNkZWZpbmUgSTgzMF9SRUFEKHJlZykgICAgICAgICAgRFJNX1JFQUQzMihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYwppbmRleCBmM2FhMGMzLi45MTQwNzAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCkBAIC0xLDcgKzEsNiBAQAogLyogaTkxNV9kbWEuYyAtLSBETUEgc3VwcG9ydCBmb3IgdGhlIEk5MTUgLSotIGxpbnV4LWMgLSotCiAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKKy8qCiAgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKQEAgLTI1LDcgKzI0LDcgQEAKICAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCiAgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKQEAgLTE5Niw3ICsxOTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfcmVzdW1lKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTkxNV9kbWFfcmVzdW1lKGRybV9kZXZpY2VfdCAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0yNTMsNyArMjUyLDcgQEAKIAkJcmV0Y29kZSA9IGk5MTVfZG1hX2NsZWFudXAoZGV2KTsKIAkJYnJlYWs7CiAJY2FzZSBJOTE1X1JFU1VNRV9ETUE6Ci0JCXJldGNvZGUgPSBpOTE1X3Jlc3VtZShkZXYpOworCQlyZXRjb2RlID0gaTkxNV9kbWFfcmVzdW1lKGRldik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldGNvZGUgPSAtRUlOVkFMOwpAQCAtNjU0LDYgKzY1Myw5IEBACiAJY2FzZSBJOTE1X1BBUkFNX0FMTE9XX0JBVENIQlVGRkVSOgogCQl2YWx1ZSA9IGRldl9wcml2LT5hbGxvd19iYXRjaGJ1ZmZlciA/IDEgOiAwOwogCQlicmVhazsKKwljYXNlIEk5MTVfUEFSQU1fTEFTVF9ESVNQQVRDSDoKKwkJdmFsdWUgPSBSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlEUk1fRVJST1IoIlVua293biBwYXJhbWV0ZXIgJWRcbiIsIHBhcmFtLnBhcmFtKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKQEAgLTY5OSw3ICs3MDEsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpOTE1X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgaTkxNV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwkvKiBpOTE1IGhhcyA0IG1vcmUgY291bnRlcnMgKi8KKwlkZXYtPmNvdW50ZXJzICs9IDQ7CisJZGV2LT50eXBlc1s2XSA9IF9EUk1fU1RBVF9JUlE7CisJZGV2LT50eXBlc1s3XSA9IF9EUk1fU1RBVF9QUklNQVJZOworCWRldi0+dHlwZXNbOF0gPSBfRFJNX1NUQVRfU0VDT05EQVJZOworCWRldi0+dHlwZXNbOV0gPSBfRFJNX1NUQVRfRE1BOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaTkxNV9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTcwOCw3ICs3MjIsNyBAQAogCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKIH0KIAotdm9pZCBpOTE1X2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQordm9pZCBpOTE1X2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTcxNywxOCArNzMxLDE4IEBACiB9CiAKIGRybV9pb2N0bF9kZXNjX3QgaTkxNV9pb2N0bHNbXSA9IHsKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lOSVQpXSA9IHtpOTE1X2RtYV9pbml0LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZMVVNIKV0gPSB7aTkxNV9mbHVzaF9pb2N0bCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GTElQKV0gPSB7aTkxNV9mbGlwX2J1ZnMsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQkFUQ0hCVUZGRVIpXSA9IHtpOTE1X2JhdGNoYnVmZmVyLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lSUV9FTUlUKV0gPSB7aTkxNV9pcnFfZW1pdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JUlFfV0FJVCldID0ge2k5MTVfaXJxX3dhaXQsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfR0VUUEFSQU0pXSA9IHtpOTE1X2dldHBhcmFtLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X1NFVFBBUkFNKV0gPSB7aTkxNV9zZXRwYXJhbSwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9BTExPQyldID0ge2k5MTVfbWVtX2FsbG9jLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZSRUUpXSA9IHtpOTE1X21lbV9mcmVlLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lOSVRfSEVBUCldID0ge2k5MTVfbWVtX2luaXRfaGVhcCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9DTURCVUZGRVIpXSA9IHtpOTE1X2NtZGJ1ZmZlciwgMSwgMH0KKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lOSVQpXSA9IHtpOTE1X2RtYV9pbml0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRkxVU0gpXSA9IHtpOTE1X2ZsdXNoX2lvY3RsLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GTElQKV0gPSB7aTkxNV9mbGlwX2J1ZnMsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0JBVENIQlVGRkVSKV0gPSB7aTkxNV9iYXRjaGJ1ZmZlciwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSVJRX0VNSVQpXSA9IHtpOTE1X2lycV9lbWl0LCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JUlFfV0FJVCldID0ge2k5MTVfaXJxX3dhaXQsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0dFVFBBUkFNKV0gPSB7aTkxNV9nZXRwYXJhbSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfU0VUUEFSQU0pXSA9IHtpOTE1X3NldHBhcmFtLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQUxMT0MpXSA9IHtpOTE1X21lbV9hbGxvYywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRlJFRSldID0ge2k5MTVfbWVtX2ZyZWUsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lOSVRfSEVBUCldID0ge2k5MTVfbWVtX2luaXRfaGVhcCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0NNREJVRkZFUildID0ge2k5MTVfY21kYnVmZmVyLCBEUk1fQVVUSH0KIH07CiAKIGludCBpOTE1X21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk5MTVfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaAppbmRleCAyM2UwMjdkLi43NzQxMmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCkBAIC0xLDUgKzEsNCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgorLyoKICAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgpAQCAtMjMsNyArMjIsNyBAQAogICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKICAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogCiAjaWZuZGVmIF9JOTE1X0RSTV9IXwogI2RlZmluZSBfSTkxNV9EUk1fSF8KQEAgLTE1Miw2ICsxNTEsNyBAQAogICovCiAjZGVmaW5lIEk5MTVfUEFSQU1fSVJRX0FDVElWRSAgICAgICAgICAgIDEKICNkZWZpbmUgSTkxNV9QQVJBTV9BTExPV19CQVRDSEJVRkZFUiAgICAgMgorI2RlZmluZSBJOTE1X1BBUkFNX0xBU1RfRElTUEFUQ0ggICAgICAgICAzCiAKIHR5cGVkZWYgc3RydWN0IGRybV9pOTE1X2dldHBhcmFtIHsKIAlpbnQgcGFyYW07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMKaW5kZXggMDUwODI0MC4uOGUyZTYwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIGk5MTVfZHJ2LmMgLS0gaTgzMCxpODQ1LGk4NTUsaTg2NSxpOTE1IGRyaXZlciAtKi0gbGludXgtYyAtKi0KICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKgogICoKICAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkBAIC0yNSw3ICsyNSw3IEBACiAgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCkBAIC0zNCw0OCArMzQsMjIgQEAKIAogI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKIAotc3RhdGljIGludCBwb3N0aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCWRldi0+Y291bnRlcnMgKz0gNDsKLQlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKLQlkZXYtPnR5cGVzWzddID0gX0RSTV9TVEFUX1BSSU1BUlk7Ci0JZGV2LT50eXBlc1s4XSA9IF9EUk1fU1RBVF9TRUNPTkRBUlk7Ci0JZGV2LT50eXBlc1s5XSA9IF9EUk1fU1RBVF9ETUE7Ci0KLQlEUk1fSU5GTygiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWQ6ICVzXG4iLAotCQkgRFJJVkVSX05BTUUsCi0JCSBEUklWRVJfTUFKT1IsCi0JCSBEUklWRVJfTUlOT1IsCi0JCSBEUklWRVJfUEFUQ0hMRVZFTCwKLQkJIERSSVZFUl9EQVRFLCBkZXYtPnByaW1hcnkubWlub3IsIHBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCi0JICAgICk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmVyc2lvbihkcm1fdmVyc2lvbl90ICogdmVyc2lvbikKLXsKLQlpbnQgbGVuOwotCi0JdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKLQl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOwotCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOwotCURSTV9DT1BZKHZlcnNpb24tPm5hbWUsIERSSVZFUl9OQU1FKTsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSk7Ci0JRFJNX0NPUFkodmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CiAJaTkxNV9QQ0lfSURTCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0geworCS8qIGRvbid0IHVzZSBtdHJyJ3MgaGVyZSwgdGhlIFhzZXJ2ZXIgb3IgdXNlciBzcGFjZSBhcHAgc2hvdWxkCisJICogZGVhbCB3aXRoIHRoZW0gZm9yIGludGVsIGhhcmR3YXJlLgorCSAqLwogCS5kcml2ZXJfZmVhdHVyZXMgPQotCSAgICBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9SRVFVSVJFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8Ci0JICAgIERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9JUlFfU0hBUkVELAotCS5wcmV0YWtlZG93biA9IGk5MTVfZHJpdmVyX3ByZXRha2Vkb3duLAotCS5wcmVyZWxlYXNlID0gaTkxNV9kcml2ZXJfcHJlcmVsZWFzZSwKKwkgICAgRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfUkVRVUlSRV9BR1AgfCAvKiBEUklWRVJfVVNFX01UUlIgfCovCisJICAgIERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9JUlFfU0hBUkVEIHwgRFJJVkVSX0lSUV9WQkwsCisJLmxvYWQgPSBpOTE1X2RyaXZlcl9sb2FkLAorCS5sYXN0Y2xvc2UgPSBpOTE1X2RyaXZlcl9sYXN0Y2xvc2UsCisJLnByZWNsb3NlID0gaTkxNV9kcml2ZXJfcHJlY2xvc2UsCiAJLmRldmljZV9pc19hZ3AgPSBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwLAorCS52Ymxhbmtfd2FpdCA9IGk5MTVfZHJpdmVyX3ZibGFua193YWl0LAogCS5pcnFfcHJlaW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsLAogCS5pcnFfcG9zdGluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwsCiAJLmlycV91bmluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsLApAQCAtODMsOCArNTcsNiBAQAogCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCiAJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCiAJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCi0JLnBvc3Rpbml0ID0gcG9zdGluaXQsCi0JLnZlcnNpb24gPSB2ZXJzaW9uLAogCS5pb2N0bHMgPSBpOTE1X2lvY3RscywKIAkuZm9wcyA9IHsKIAkJIC5vd25lciA9IFRISVNfTU9EVUxFLApAQCAtOTcsMTEgKzY5LDE5IEBACiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCQkgLmNvbXBhdF9pb2N0bCA9IGk5MTVfY29tcGF0X2lvY3RsLAogI2VuZGlmCi0JCSB9LAorCX0sCisKIAkucGNpX2RyaXZlciA9IHsKLQkJICAgICAgIC5uYW1lID0gRFJJVkVSX05BTUUsCi0JCSAgICAgICAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCi0JCSAgICAgICB9CisJCSAubmFtZSA9IERSSVZFUl9OQU1FLAorCQkgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAorCX0sCisJCisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuZGVzYyA9IERSSVZFUl9ERVNDLAorCS5kYXRlID0gRFJJVkVSX0RBVEUsCisJLm1ham9yID0gRFJJVkVSX01BSk9SLAorCS5taW5vciA9IERSSVZFUl9NSU5PUiwKKwkucGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaTkxNV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKaW5kZXggMTdlNDU3Yy4uYzZjNzFiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaApAQCAtMSw2ICsxLDYgQEAKIC8qIGk5MTVfZHJ2LmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIHRoZSBJOTE1IGRyaXZlciAtKi0gbGludXgtYyAtKi0KICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKgogICoKICAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkBAIC0yNSw3ICsyNSw3IEBACiAgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiAKICNpZm5kZWYgX0k5MTVfRFJWX0hfCiAjZGVmaW5lIF9JOTE1X0RSVl9IXwpAQCAtMzcsMjEgKzM3LDE4IEBACiAKICNkZWZpbmUgRFJJVkVSX05BTUUJCSJpOTE1IgogI2RlZmluZSBEUklWRVJfREVTQwkJIkludGVsIEdyYXBoaWNzIgotI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDQwNDA1IgorI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDUxMjA5IgogCiAvKiBJbnRlcmZhY2UgaGlzdG9yeToKICAqCiAgKiAxLjE6IE9yaWdpbmFsLgorICogMS4yOiBBZGQgUG93ZXIgTWFuYWdlbWVudAorICogMS4zOiBBZGQgdmJsYW5rIHN1cHBvcnQKICAqLwogI2RlZmluZSBEUklWRVJfTUFKT1IJCTEKLSNkZWZpbmUgRFJJVkVSX01JTk9SCQkxCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMwogI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkwCiAKLS8qIFdlIHVzZSBvdXIgb3duIGRtYSBtZWNoYW5pc21zLCBub3QgdGhlIGRybSB0ZW1wbGF0ZSBjb2RlLiAgSG93ZXZlciwKLSAqIHRoZSBzaGFyZWQgSVJRIGNvZGUgaXMgdXNlZnVsIHRvIHVzOgotICovCi0jZGVmaW5lIF9fSEFWRV9QTQkJMQotCiB0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfcmluZ19idWZmZXIgewogCWludCB0YWlsX21hc2s7CiAJdW5zaWduZWQgbG9uZyBTdGFydDsKQEAgLTk3LDYgKzk0LDcgQEAKIAlpbnQgdGV4X2xydV9sb2dfZ3JhbnVsYXJpdHk7CiAJaW50IGFsbG93X2JhdGNoYnVmZmVyOwogCXN0cnVjdCBtZW1fYmxvY2sgKmFncF9oZWFwOworCXVuc2lnbmVkIGludCBzcjAxLCBhZHBhLCBwcGNyLCBkdm9iLCBkdm9jLCBsdmRzOwogfSBkcm1faTkxNV9wcml2YXRlX3Q7CiAKIGV4dGVybiBkcm1faW9jdGxfZGVzY190IGk5MTVfaW9jdGxzW107CkBAIC0xMDQsMTQgKzEwMiwxOCBAQAogCiAJCQkJLyogaTkxNV9kbWEuYyAqLwogZXh0ZXJuIHZvaWQgaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7CitleHRlcm4gaW50IGk5MTVfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKIGV4dGVybiBpbnQgaTkxNV9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGxvbmcgaTkxNV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CiAKIC8qIGk5MTVfaXJxLmMgKi8KIGV4dGVybiBpbnQgaTkxNV9pcnFfZW1pdChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IGk5MTVfaXJxX3dhaXQoRFJNX0lPQ1RMX0FSR1MpOwogCitleHRlcm4gaW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKIGV4dGVybiBpcnFyZXR1cm5fdCBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwogZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwpAQCAtMTI1LDEzICsxMjcsMTAgQEAKIGV4dGVybiB2b2lkIGk5MTVfbWVtX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LAogCQkJICAgICBEUk1GSUxFIGZpbHAsIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXApOwogCi1leHRlcm4gbG9uZyBpOTE1X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKLQotI2RlZmluZSBJOTE1X1JFQUQocmVnKSAgICAgICAgICBEUk1fUkVBRDMyKGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQotI2RlZmluZSBJOTE1X1dSSVRFKHJlZyx2YWwpICAgICBEUk1fV1JJVEUzMihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZywgdmFsKQotI2RlZmluZSBJOTE1X1JFQUQxNihyZWcpIAlEUk1fUkVBRDE2KGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQotI2RlZmluZSBJOTE1X1dSSVRFMTYocmVnLHZhbCkJRFJNX1dSSVRFMTYoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcsIHZhbCkKKyNkZWZpbmUgSTkxNV9SRUFEKHJlZykgICAgICAgICAgRFJNX1JFQUQzMihkZXZfcHJpdi0+bW1pb19tYXAsIChyZWcpKQorI2RlZmluZSBJOTE1X1dSSVRFKHJlZyx2YWwpICAgICBEUk1fV1JJVEUzMihkZXZfcHJpdi0+bW1pb19tYXAsIChyZWcpLCAodmFsKSkKKyNkZWZpbmUgSTkxNV9SRUFEMTYocmVnKSAJRFJNX1JFQUQxNihkZXZfcHJpdi0+bW1pb19tYXAsIChyZWcpKQorI2RlZmluZSBJOTE1X1dSSVRFMTYocmVnLHZhbCkJRFJNX1dSSVRFMTYoZGV2X3ByaXYtPm1taW9fbWFwLCAocmVnKSwgKHZhbCkpCiAKICNkZWZpbmUgSTkxNV9WRVJCT1NFIDAKIApAQCAtMTk1LDYgKzE5NCwxMyBAQAogI2RlZmluZSBQUENSCQkJMHg2MTIwNAogI2RlZmluZSBQUENSX09OCQkJKDE8PDApCiAKKyNkZWZpbmUgRFZPQgkJCTB4NjExNDAKKyNkZWZpbmUgRFZPQl9PTgkJCSgxPDwzMSkKKyNkZWZpbmUgRFZPQwkJCTB4NjExNjAKKyNkZWZpbmUgRFZPQ19PTgkJCSgxPDwzMSkKKyNkZWZpbmUgTFZEUwkJCTB4NjExODAKKyNkZWZpbmUgTFZEU19PTgkJCSgxPDwzMSkKKwogI2RlZmluZSBBRFBBCQkJMHg2MTEwMAogI2RlZmluZSBBRFBBX0RQTVNfTUFTSwkJKH4oMzw8MTApKQogI2RlZmluZSBBRFBBX0RQTVNfT04JCSgwPDwxMCkKQEAgLTI1OCw0ICsyNjQsNiBAQAogCiAjZGVmaW5lIENNRF9PUF9ERVNUQlVGRkVSX0lORk8JICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4ZTw8MTYpfDEpCiAKKyNkZWZpbmUgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSAoKCh1MzIgKikoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKSlbNV0pCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCmluZGV4IDRmYTQ0OGUuLmExMzgxYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKQEAgLTEsNyArMSw2IEBACi0vKiBpOTE1X2RtYS5jIC0tIERNQSBzdXBwb3J0IGZvciB0aGUgSTkxNSAtKi0gbGludXgtYyAtKi0KKy8qIGk5MTVfaXJxLmMgLS0gSVJRIHN1cHBvcnQgZm9yIHRoZSBJOTE1IC0qLSBsaW51eC1jIC0qLQogICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCisvKgogICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCkBAIC0yNSwxNiArMjQsMTggQEAKICAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCiAgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJpOTE1X2RybS5oIgogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiAKLSNkZWZpbmUgVVNFUl9JTlRfRkxBRyAweDIKKyNkZWZpbmUgVVNFUl9JTlRfRkxBRyAoMTw8MSkKKyNkZWZpbmUgVlNZTkNfUElQRUJfRkxBRyAoMTw8NSkKKyNkZWZpbmUgVlNZTkNfUElQRUFfRkxBRyAoMTw8NykKKwogI2RlZmluZSBNQVhfTk9QSUQgKCh1MzIpfjApCi0jZGVmaW5lIFJFQURfQlJFQURDUlVNQihkZXZfcHJpdikgICgoKHUzMiopKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkpWzVdKQogCiBpcnFyZXR1cm5fdCBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCiB7CkBAIC00Myw3ICs0NCw3IEBACiAJdTE2IHRlbXA7CiAKIAl0ZW1wID0gSTkxNV9SRUFEMTYoSTkxNVJFR19JTlRfSURFTlRJVFlfUik7Ci0JdGVtcCAmPSBVU0VSX0lOVF9GTEFHOworCXRlbXAgJj0gKFVTRVJfSU5UX0ZMQUcgfCBWU1lOQ19QSVBFQV9GTEFHKTsKIAogCURSTV9ERUJVRygiJXMgZmxhZz0lMDh4XG4iLCBfX0ZVTkNUSU9OX18sIHRlbXApOwogCkBAIC01MSw3ICs1MiwxNSBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAKIAlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfSURFTlRJVFlfUiwgdGVtcCk7Ci0JRFJNX1dBS0VVUCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CisKKwlpZiAodGVtcCAmIFVTRVJfSU5UX0ZMQUcpCisJCURSTV9XQUtFVVAoJmRldl9wcml2LT5pcnFfcXVldWUpOworCisJaWYgKHRlbXAgJiBWU1lOQ19QSVBFQV9GTEFHKSB7CisJCWF0b21pY19pbmMoJmRldi0+dmJsX3JlY2VpdmVkKTsKKwkJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWUpOworCQlkcm1fdmJsX3NlbmRfc2lnbmFscyhkZXYpOworCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTEwMiw2ICsxMTEsMjcgQEAKIAlyZXR1cm4gcmV0OwogfQogCitpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX1dBSVRfT04ocmV0LCBkZXYtPnZibF9xdWV1ZSwgMyAqIERSTV9IWiwKKwkJICAgICgoKGN1cl92YmxhbmsgPSBhdG9taWNfcmVhZCgmZGV2LT52YmxfcmVjZWl2ZWQpKQorCQkJLSAqc2VxdWVuY2UpIDw9ICgxPDwyMykpKTsKKwkKKwkqc2VxdWVuY2UgPSBjdXJfdmJsYW5rOworCisJcmV0dXJuIHJldDsKK30KKworCiAvKiBOZWVkcyB0aGUgbG9jayBhcyBpdCB0b3VjaGVzIHRoZSByaW5nLgogICovCiBpbnQgaTkxNV9pcnFfZW1pdChEUk1fSU9DVExfQVJHUykKQEAgLTE2NSw3ICsxOTUsNyBAQAogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfRU5BQkxFX1IsIFVTRVJfSU5UX0ZMQUcpOworCUk5MTVfV1JJVEUxNihJOTE1UkVHX0lOVF9FTkFCTEVfUiwgVVNFUl9JTlRfRkxBRyB8IFZTWU5DX1BJUEVBX0ZMQUcpOwogCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYwppbmRleCAxMzE3NmQxLi5iYTg3ZmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jCkBAIC0xLDcgKzEsNiBAQAogLyogaTkxNV9tZW0uYyAtLSBTaW1wbGUgYWdwL2ZiIG1lbW9yeSBtYW5hZ2VyIGZvciBpOTE1IC0qLSBsaW51eC1jIC0qLQogICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCisvKgogICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCkBAIC0yNSw3ICsyNCw3IEBACiAgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCmluZGV4IDcwZGM3ZjYuLmMyYTRiYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCkBAIC00NCw3ICs0NCw5IEBACiAjZGVmaW5lIE1HQV9ERUZBVUxUX1VTRUNfVElNRU9VVAkxMDAwMAogI2RlZmluZSBNR0FfRlJFRUxJU1RfREVCVUcJCTAKIAotc3RhdGljIGludCBtZ2FfZG9fY2xlYW51cF9kbWEoZHJtX2RldmljZV90ICogZGV2KTsKKyNkZWZpbmUgTUlOSU1BTF9DTEVBTlVQIDAKKyNkZWZpbmUgRlVMTF9DTEVBTlVQIDEKK3N0YXRpYyBpbnQgbWdhX2RvX2NsZWFudXBfZG1hKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZnVsbF9jbGVhbnVwKTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogRW5naW5lIGNvbnRyb2wKQEAgLTM5MSw3ICszOTMsNyBAQAogICogRE1BIGluaXRpYWxpemF0aW9uLCBjbGVhbnVwCiAgKi8KIAotaW50IG1nYV9kcml2ZXJfcHJlaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitpbnQgbWdhX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXY7CiAKQEAgLTQwNSw2ICs0MDcsMTQgQEAKIAlkZXZfcHJpdi0+dXNlY190aW1lb3V0ID0gTUdBX0RFRkFVTFRfVVNFQ19USU1FT1VUOwogCWRldl9wcml2LT5jaGlwc2V0ID0gZmxhZ3M7CiAKKwlkZXZfcHJpdi0+bW1pb19iYXNlID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChkZXYsIDEpOworCWRldl9wcml2LT5tbWlvX3NpemUgPSBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDEpOworCisJZGV2LT5jb3VudGVycyArPSAzOworCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROworCWRldi0+dHlwZXNbN10gPSBfRFJNX1NUQVRfUFJJTUFSWTsKKwlkZXYtPnR5cGVzWzhdID0gX0RSTV9TVEFUX1NFQ09OREFSWTsKKwogCXJldHVybiAwOwogfQogCkBAIC00MzgsMTcgKzQ0OCwxOSBAQAogCWRybV9idWZfZGVzY190IHJlcTsKIAlkcm1fYWdwX21vZGVfdCBtb2RlOwogCWRybV9hZ3BfaW5mb190IGluZm87CisJZHJtX2FncF9idWZmZXJfdCBhZ3BfcmVxOworCWRybV9hZ3BfYmluZGluZ190IGJpbmRfcmVxOwogCiAJLyogQWNxdWlyZSBBR1AuICovCiAJZXJyID0gZHJtX2FncF9hY3F1aXJlKGRldik7CiAJaWYgKGVycikgewotCQlEUk1fRVJST1IoIlVuYWJsZSB0byBhY3F1aXJlIEFHUFxuIik7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIGFjcXVpcmUgQUdQOiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAllcnIgPSBkcm1fYWdwX2luZm8oZGV2LCAmaW5mbyk7CiAJaWYgKGVycikgewotCQlEUk1fRVJST1IoIlVuYWJsZSB0byBnZXQgQUdQIGluZm9cbiIpOworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBnZXQgQUdQIGluZm86ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNDcyLDE4ICs0ODQsMjQgQEAKIAl9CiAKIAkvKiBBbGxvY2F0ZSBhbmQgYmluZCBBR1AgbWVtb3J5LiAqLwotCWRldl9wcml2LT5hZ3BfcGFnZXMgPSBhZ3Bfc2l6ZSAvIFBBR0VfU0laRTsKLQlkZXZfcHJpdi0+YWdwX21lbSA9IGRybV9hbGxvY19hZ3AoZGV2LCBkZXZfcHJpdi0+YWdwX3BhZ2VzLCAwKTsKLQlpZiAoZGV2X3ByaXYtPmFncF9tZW0gPT0gTlVMTCkgewotCQlkZXZfcHJpdi0+YWdwX3BhZ2VzID0gMDsKKwlhZ3BfcmVxLnNpemUgPSBhZ3Bfc2l6ZTsKKwlhZ3BfcmVxLnR5cGUgPSAwOworCWVyciA9IGRybV9hZ3BfYWxsb2MoZGV2LCAmYWdwX3JlcSk7CisJaWYgKGVycikgeworCQlkZXZfcHJpdi0+YWdwX3NpemUgPSAwOwogCQlEUk1fRVJST1IoIlVuYWJsZSB0byBhbGxvY2F0ZSAldU1CIEFHUCBtZW1vcnlcbiIsCiAJCQkgIGRtYV9icy0+YWdwX3NpemUpOwotCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCQlyZXR1cm4gZXJyOwogCX0KKwkKKwlkZXZfcHJpdi0+YWdwX3NpemUgPSBhZ3Bfc2l6ZTsKKwlkZXZfcHJpdi0+YWdwX2hhbmRsZSA9IGFncF9yZXEuaGFuZGxlOwogCi0JZXJyID0gZHJtX2JpbmRfYWdwKGRldl9wcml2LT5hZ3BfbWVtLCAwKTsKKwliaW5kX3JlcS5oYW5kbGUgPSBhZ3BfcmVxLmhhbmRsZTsKKwliaW5kX3JlcS5vZmZzZXQgPSAwOworCWVyciA9IGRybV9hZ3BfYmluZChkZXYsICZiaW5kX3JlcSk7CiAJaWYgKGVycikgewotCQlEUk1fRVJST1IoIlVuYWJsZSB0byBiaW5kIEFHUCBtZW1vcnlcbiIpOworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBiaW5kIEFHUCBtZW1vcnk6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNDk3LDcgKzUxNSw3IEBACiAJZXJyID0gZHJtX2FkZG1hcChkZXYsIG9mZnNldCwgd2FycF9zaXplLAogCQkJIF9EUk1fQUdQLCBfRFJNX1JFQURfT05MWSwgJmRldl9wcml2LT53YXJwKTsKIAlpZiAoZXJyKSB7Ci0JCURSTV9FUlJPUigiVW5hYmxlIHRvIG1hcCBXQVJQIG1pY3JvY29kZVxuIik7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIG1hcCBXQVJQIG1pY3JvY29kZTogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC01MDUsNyArNTIzLDcgQEAKIAllcnIgPSBkcm1fYWRkbWFwKGRldiwgb2Zmc2V0LCBkbWFfYnMtPnByaW1hcnlfc2l6ZSwKIAkJCSBfRFJNX0FHUCwgX0RSTV9SRUFEX09OTFksICZkZXZfcHJpdi0+cHJpbWFyeSk7CiAJaWYgKGVycikgewotCQlEUk1fRVJST1IoIlVuYWJsZSB0byBtYXAgcHJpbWFyeSBETUEgcmVnaW9uXG4iKTsKKwkJRFJNX0VSUk9SKCJVbmFibGUgdG8gbWFwIHByaW1hcnkgRE1BIHJlZ2lvbjogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC01MTMsNyArNTMxLDcgQEAKIAllcnIgPSBkcm1fYWRkbWFwKGRldiwgb2Zmc2V0LCBzZWNvbmRhcnlfc2l6ZSwKIAkJCSBfRFJNX0FHUCwgMCwgJmRldi0+YWdwX2J1ZmZlcl9tYXApOwogCWlmIChlcnIpIHsKLQkJRFJNX0VSUk9SKCJVbmFibGUgdG8gbWFwIHNlY29uZGFyeSBETUEgcmVnaW9uXG4iKTsKKwkJRFJNX0VSUk9SKCJVbmFibGUgdG8gbWFwIHNlY29uZGFyeSBETUEgcmVnaW9uOiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTUyNSwxNSArNTQzLDI5IEBACiAKIAllcnIgPSBkcm1fYWRkYnVmc19hZ3AoZGV2LCAmcmVxKTsKIAlpZiAoZXJyKSB7Ci0JCURSTV9FUlJPUigiVW5hYmxlIHRvIGFkZCBzZWNvbmRhcnkgRE1BIGJ1ZmZlcnNcbiIpOworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBhZGQgc2Vjb25kYXJ5IERNQSBidWZmZXJzOiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKKwl7CisJCWRybV9tYXBfbGlzdF90ICpfZW50cnk7CisJCXVuc2lnbmVkIGxvbmcgYWdwX3Rva2VuID0gMDsKKwkJCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LT5oZWFkLCBoZWFkKSB7CisJCQlpZiAoX2VudHJ5LT5tYXAgPT0gZGV2LT5hZ3BfYnVmZmVyX21hcCkKKwkJCQlhZ3BfdG9rZW4gPSBfZW50cnktPnVzZXJfdG9rZW47CisJCX0KKwkJaWYgKCFhZ3BfdG9rZW4pCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlkZXYtPmFncF9idWZmZXJfdG9rZW4gPSBhZ3BfdG9rZW47CisJfQorCiAJb2Zmc2V0ICs9IHNlY29uZGFyeV9zaXplOwogCWVyciA9IGRybV9hZGRtYXAoZGV2LCBvZmZzZXQsIGFncF9zaXplIC0gb2Zmc2V0LAogCQkJIF9EUk1fQUdQLCAwLCAmZGV2X3ByaXYtPmFncF90ZXh0dXJlcyk7CiAJaWYgKGVycikgewotCQlEUk1fRVJST1IoIlVuYWJsZSB0byBtYXAgQUdQIHRleHR1cmUgcmVnaW9uXG4iKTsKKwkJRFJNX0VSUk9SKCJVbmFibGUgdG8gbWFwIEFHUCB0ZXh0dXJlIHJlZ2lvbiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTYwMyw3ICs2MzUsOCBAQAogCWVyciA9IGRybV9hZGRtYXAoZGV2LCAwLCB3YXJwX3NpemUsIF9EUk1fQ09OU0lTVEVOVCwKIAkJCSBfRFJNX1JFQURfT05MWSwgJmRldl9wcml2LT53YXJwKTsKIAlpZiAoZXJyICE9IDApIHsKLQkJRFJNX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIG1hcHBpbmcgZm9yIFdBUlAgbWljcm9jb2RlXG4iKTsKKwkJRFJNX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIG1hcHBpbmcgZm9yIFdBUlAgbWljcm9jb2RlOiAlZFxuIiwKKwkJCSAgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTYyMiw3ICs2NTUsNyBAQAogCX0KIAogCWlmIChlcnIgIT0gMCkgewotCQlEUk1fRVJST1IoIlVuYWJsZSB0byBhbGxvY2F0ZSBwcmltYXJ5IERNQSByZWdpb25cbiIpOworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBhbGxvY2F0ZSBwcmltYXJ5IERNQSByZWdpb246ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOwogCX0KIApAQCAtNjQ2LDcgKzY3OSw3IEBACiAJfQogCiAJaWYgKGJpbl9jb3VudCA9PSAwKSB7Ci0JCURSTV9FUlJPUigiVW5hYmxlIHRvIGFkZCBzZWNvbmRhcnkgRE1BIGJ1ZmZlcnNcbiIpOworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBhZGQgc2Vjb25kYXJ5IERNQSBidWZmZXJzOiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTY4Miw3ICs3MTUsNyBAQAogCWVyciA9IGRybV9hZGRtYXAoZGV2LCBkZXZfcHJpdi0+bW1pb19iYXNlLCBkZXZfcHJpdi0+bW1pb19zaXplLAogCQkJIF9EUk1fUkVHSVNURVJTLCBfRFJNX1JFQURfT05MWSwgJmRldl9wcml2LT5tbWlvKTsKIAlpZiAoZXJyKSB7Ci0JCURSTV9FUlJPUigiVW5hYmxlIHRvIG1hcCBNTUlPIHJlZ2lvblxuIik7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIG1hcCBNTUlPIHJlZ2lvbjogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC02OTAsNyArNzIzLDcgQEAKIAkJCSBfRFJNX1JFQURfT05MWSB8IF9EUk1fTE9DS0VEIHwgX0RSTV9LRVJORUwsCiAJCQkgJmRldl9wcml2LT5zdGF0dXMpOwogCWlmIChlcnIpIHsKLQkJRFJNX0VSUk9SKCJVbmFibGUgdG8gbWFwIHN0YXR1cyByZWdpb25cbiIpOworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBtYXAgc3RhdHVzIHJlZ2lvbjogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC03MDgsNyArNzQxLDcgQEAKIAkgKi8KIAogCWlmIChlcnIpIHsKLQkJbWdhX2RvX2NsZWFudXBfZG1hKGRldik7CisJCW1nYV9kb19jbGVhbnVwX2RtYShkZXYsIE1JTklNQUxfQ0xFQU5VUCk7CiAJfQogCiAJLyogTm90IG9ubHkgZG8gd2Ugd2FudCB0byB0cnkgYW5kIGluaXRpYWxpemVkIFBDSSBjYXJkcyBmb3IgUENJIERNQSwKQEAgLTczMSwzNSArNzY0LDMyIEBACiAJRFJNX0RFVklDRTsKIAlkcm1fbWdhX2RtYV9ib290c3RyYXBfdCBib290c3RyYXA7CiAJaW50IGVycjsKKwlzdGF0aWMgY29uc3QgaW50IG1vZGVzW10gPSB7IDAsIDEsIDIsIDIsIDQsIDQsIDQsIDQgfTsKKwljb25zdCBkcm1fbWdhX3ByaXZhdGVfdCAqY29uc3QgZGV2X3ByaXYgPQorCQkoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAogCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChib290c3RyYXAsCiAJCQkJIChkcm1fbWdhX2RtYV9ib290c3RyYXBfdCBfX3VzZXIgKikgZGF0YSwKIAkJCQkgc2l6ZW9mKGJvb3RzdHJhcCkpOwogCiAJZXJyID0gbWdhX2RvX2RtYV9ib290c3RyYXAoZGV2LCAmYm9vdHN0cmFwKTsKLQlpZiAoIWVycikgewotCQlzdGF0aWMgY29uc3QgaW50IG1vZGVzW10gPSB7IDAsIDEsIDIsIDIsIDQsIDQsIDQsIDQgfTsKLQkJY29uc3QgZHJtX21nYV9wcml2YXRlX3QgKmNvbnN0IGRldl9wcml2ID0KLQkJICAgIChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwotCi0JCWlmIChkZXZfcHJpdi0+YWdwX3RleHR1cmVzICE9IE5VTEwpIHsKLQkJCWJvb3RzdHJhcC50ZXh0dXJlX2hhbmRsZSA9Ci0JCQkgICAgZGV2X3ByaXYtPmFncF90ZXh0dXJlcy0+b2Zmc2V0OwotCQkJYm9vdHN0cmFwLnRleHR1cmVfc2l6ZSA9IGRldl9wcml2LT5hZ3BfdGV4dHVyZXMtPnNpemU7Ci0JCX0gZWxzZSB7Ci0JCQlib290c3RyYXAudGV4dHVyZV9oYW5kbGUgPSAwOwotCQkJYm9vdHN0cmFwLnRleHR1cmVfc2l6ZSA9IDA7Ci0JCX0KLQotCQlib290c3RyYXAuYWdwX21vZGUgPSBtb2Rlc1tib290c3RyYXAuYWdwX21vZGUgJiAweDA3XTsKLQkJaWYgKERSTV9DT1BZX1RPX1VTRVIoKHZvaWQgX191c2VyICopZGF0YSwgJmJvb3RzdHJhcCwKLQkJCQkgICAgIHNpemVvZihib290c3RyYXApKSkgewotCQkJZXJyID0gRFJNX0VSUihFRkFVTFQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJbWdhX2RvX2NsZWFudXBfZG1hKGRldik7CisJaWYgKGVycikgeworCQltZ2FfZG9fY2xlYW51cF9kbWEoZGV2LCBGVUxMX0NMRUFOVVApOworCQlyZXR1cm4gZXJyOwogCX0KIAorCWlmIChkZXZfcHJpdi0+YWdwX3RleHR1cmVzICE9IE5VTEwpIHsKKwkJYm9vdHN0cmFwLnRleHR1cmVfaGFuZGxlID0gZGV2X3ByaXYtPmFncF90ZXh0dXJlcy0+b2Zmc2V0OworCQlib290c3RyYXAudGV4dHVyZV9zaXplID0gZGV2X3ByaXYtPmFncF90ZXh0dXJlcy0+c2l6ZTsKKwl9IGVsc2UgeworCQlib290c3RyYXAudGV4dHVyZV9oYW5kbGUgPSAwOworCQlib290c3RyYXAudGV4dHVyZV9zaXplID0gMDsKKwl9CisKKwlib290c3RyYXAuYWdwX21vZGUgPSBtb2Rlc1tib290c3RyYXAuYWdwX21vZGUgJiAweDA3XTsKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChkcm1fbWdhX2RtYV9ib290c3RyYXBfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICAgIGJvb3RzdHJhcCwgc2l6ZW9mKGJvb3RzdHJhcCkpOworCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtODUzLDEzICs4ODMsMTMgQEAKIAogCXJldCA9IG1nYV93YXJwX2luc3RhbGxfbWljcm9jb2RlKGRldl9wcml2KTsKIAlpZiAocmV0IDwgMCkgewotCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbnN0YWxsIFdBUlAgdWNvZGUhXG4iKTsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5zdGFsbCBXQVJQIHVjb2RlITogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gbWdhX3dhcnBfaW5pdChkZXZfcHJpdik7CiAJaWYgKHJldCA8IDApIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdCBXQVJQIGVuZ2luZSFcbiIpOworCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0IFdBUlAgZW5naW5lITogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC05MDQsNyArOTM0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtZ2FfZG9fY2xlYW51cF9kbWEoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBtZ2FfZG9fY2xlYW51cF9kbWEoZHJtX2RldmljZV90ICpkZXYsIGludCBmdWxsX2NsZWFudXApCiB7CiAJaW50IGVyciA9IDA7CiAJRFJNX0RFQlVHKCJcbiIpOwpAQCAtOTMyLDMxICs5NjIsMzkgQEAKIAogCQlpZiAoZGV2X3ByaXYtPnVzZWRfbmV3X2RtYV9pbml0KSB7CiAjaWYgX19PU19IQVNfQUdQCi0JCQlpZiAoZGV2X3ByaXYtPmFncF9tZW0gIT0gTlVMTCkgewotCQkJCWRldl9wcml2LT5hZ3BfdGV4dHVyZXMgPSBOVUxMOwotCQkJCWRybV91bmJpbmRfYWdwKGRldl9wcml2LT5hZ3BfbWVtKTsKKwkJCWlmIChkZXZfcHJpdi0+YWdwX2hhbmRsZSAhPSAwKSB7CisJCQkJZHJtX2FncF9iaW5kaW5nX3QgdW5iaW5kX3JlcTsKKwkJCQlkcm1fYWdwX2J1ZmZlcl90IGZyZWVfcmVxOwogCi0JCQkJZHJtX2ZyZWVfYWdwKGRldl9wcml2LT5hZ3BfbWVtLAotCQkJCQkgICAgIGRldl9wcml2LT5hZ3BfcGFnZXMpOwotCQkJCWRldl9wcml2LT5hZ3BfcGFnZXMgPSAwOwotCQkJCWRldl9wcml2LT5hZ3BfbWVtID0gTlVMTDsKKwkJCQl1bmJpbmRfcmVxLmhhbmRsZSA9IGRldl9wcml2LT5hZ3BfaGFuZGxlOworCQkJCWRybV9hZ3BfdW5iaW5kKGRldiwgJnVuYmluZF9yZXEpOworCisJCQkJZnJlZV9yZXEuaGFuZGxlID0gZGV2X3ByaXYtPmFncF9oYW5kbGU7CisJCQkJZHJtX2FncF9mcmVlKGRldiwgJmZyZWVfcmVxKTsKKwkKKwkJCQlkZXZfcHJpdi0+YWdwX3RleHR1cmVzID0gTlVMTDsKKwkJCQlkZXZfcHJpdi0+YWdwX3NpemUgPSAwOworCQkJCWRldl9wcml2LT5hZ3BfaGFuZGxlID0gMDsKIAkJCX0KIAogCQkJaWYgKChkZXYtPmFncCAhPSBOVUxMKSAmJiBkZXYtPmFncC0+YWNxdWlyZWQpIHsKIAkJCQllcnIgPSBkcm1fYWdwX3JlbGVhc2UoZGV2KTsKIAkJCX0KICNlbmRpZgotCQkJZGV2X3ByaXYtPnVzZWRfbmV3X2RtYV9pbml0ID0gMDsKIAkJfQogCiAJCWRldl9wcml2LT53YXJwID0gTlVMTDsKIAkJZGV2X3ByaXYtPnByaW1hcnkgPSBOVUxMOwotCQlkZXZfcHJpdi0+bW1pbyA9IE5VTEw7Ci0JCWRldl9wcml2LT5zdGF0dXMgPSBOVUxMOwogCQlkZXZfcHJpdi0+c2FyZWEgPSBOVUxMOwogCQlkZXZfcHJpdi0+c2FyZWFfcHJpdiA9IE5VTEw7CiAJCWRldi0+YWdwX2J1ZmZlcl9tYXAgPSBOVUxMOwogCisJCWlmIChmdWxsX2NsZWFudXApIHsKKwkJCWRldl9wcml2LT5tbWlvID0gTlVMTDsKKwkJCWRldl9wcml2LT5zdGF0dXMgPSBOVUxMOworCQkJZGV2X3ByaXYtPnVzZWRfbmV3X2RtYV9pbml0ID0gMDsKKwkJfQorCiAJCW1lbXNldCgmZGV2X3ByaXYtPnByaW0sIDAsIHNpemVvZihkZXZfcHJpdi0+cHJpbSkpOwogCQlkZXZfcHJpdi0+d2FycF9waXBlID0gMDsKIAkJbWVtc2V0KGRldl9wcml2LT53YXJwX3BpcGVfcGh5cywgMCwKQEAgLTk2Nyw3ICsxMDA1LDcgQEAKIAkJfQogCX0KIAotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKIGludCBtZ2FfZG1hX2luaXQoRFJNX0lPQ1RMX0FSR1MpCkBAIC05ODUsMTEgKzEwMjMsMTEgQEAKIAljYXNlIE1HQV9JTklUX0RNQToKIAkJZXJyID0gbWdhX2RvX2luaXRfZG1hKGRldiwgJmluaXQpOwogCQlpZiAoZXJyKSB7Ci0JCQkodm9pZCltZ2FfZG9fY2xlYW51cF9kbWEoZGV2KTsKKwkJCSh2b2lkKW1nYV9kb19jbGVhbnVwX2RtYShkZXYsIEZVTExfQ0xFQU5VUCk7CiAJCX0KIAkJcmV0dXJuIGVycjsKIAljYXNlIE1HQV9DTEVBTlVQX0RNQToKLQkJcmV0dXJuIG1nYV9kb19jbGVhbnVwX2RtYShkZXYpOworCQlyZXR1cm4gbWdhX2RvX2NsZWFudXBfZG1hKGRldiwgRlVMTF9DTEVBTlVQKTsKIAl9CiAKIAlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwpAQCAtMTExOCw3ICsxMTU2LDcgQEAKIC8qKgogICogQ2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBtb2R1bGUgaXMgdW5sb2FkZWQuCiAgKi8KLWludCBtZ2FfZHJpdmVyX3Bvc3RjbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBtZ2FfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKiBkZXYpCiB7CiAJZHJtX2ZyZWUoZGV2LT5kZXZfcHJpdmF0ZSwgc2l6ZW9mKGRybV9tZ2FfcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIpOwogCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOwpAQCAtMTEyOSw5ICsxMTY3LDkgQEAKIC8qKgogICogQ2FsbGVkIHdoZW4gdGhlIGxhc3Qgb3BlbmVyIG9mIHRoZSBkZXZpY2UgaXMgY2xvc2VkLgogICovCi12b2lkIG1nYV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KQordm9pZCBtZ2FfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCiB7Ci0JbWdhX2RvX2NsZWFudXBfZG1hKGRldik7CisJbWdhX2RvX2NsZWFudXBfZG1hKGRldiwgRlVMTF9DTEVBTlVQKTsKIH0KIAogaW50IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCmluZGV4IDE3MTM0NTEuLjlmN2VkMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCkBAIC0zOCw0MSArMzgsNiBAQAogI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKIAogc3RhdGljIGludCBtZ2FfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KTsKLXN0YXRpYyBpbnQgcG9zdGluaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlkcm1fbWdhX3ByaXZhdGVfdCAqY29uc3QgZGV2X3ByaXYgPQotCSAgICAoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKLQotCWRldl9wcml2LT5tbWlvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAxKTsKLQlkZXZfcHJpdi0+bW1pb19zaXplID0gcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDEpOwotCi0JZGV2LT5jb3VudGVycyArPSAzOwotCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROwotCWRldi0+dHlwZXNbN10gPSBfRFJNX1NUQVRfUFJJTUFSWTsKLQlkZXYtPnR5cGVzWzhdID0gX0RSTV9TVEFUX1NFQ09OREFSWTsKLQotCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCi0JCSBEUklWRVJfTkFNRSwKLQkJIERSSVZFUl9NQUpPUiwKLQkJIERSSVZFUl9NSU5PUiwKLQkJIERSSVZFUl9QQVRDSExFVkVMLAotCQkgRFJJVkVSX0RBVEUsIGRldi0+cHJpbWFyeS5taW5vciwgcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKLQkgICAgKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZXJzaW9uKGRybV92ZXJzaW9uX3QgKiB2ZXJzaW9uKQotewotCWludCBsZW47Ci0KLQl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOwotCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7Ci0JRFJNX0NPUFkodmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFKTsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyk7Ci0JcmV0dXJuIDA7Ci19CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKIAltZ2FfUENJX0lEUwpAQCAtODAsMTIgKzQ1LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CiAJLmRyaXZlcl9mZWF0dXJlcyA9Ci0JICAgIERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1JFUVVJUkVfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwKKwkgICAgRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfUENJX0RNQSB8CiAJICAgIERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9JUlFfU0hBUkVEIHwKIAkgICAgRFJJVkVSX0lSUV9WQkwsCi0JLnByZWluaXQgPSBtZ2FfZHJpdmVyX3ByZWluaXQsCi0JLnBvc3RjbGVhbnVwID0gbWdhX2RyaXZlcl9wb3N0Y2xlYW51cCwKLQkucHJldGFrZWRvd24gPSBtZ2FfZHJpdmVyX3ByZXRha2Vkb3duLAorCS5sb2FkID0gbWdhX2RyaXZlcl9sb2FkLAorCS51bmxvYWQgPSBtZ2FfZHJpdmVyX3VubG9hZCwKKwkubGFzdGNsb3NlID0gbWdhX2RyaXZlcl9sYXN0Y2xvc2UsCiAJLmRtYV9xdWllc2NlbnQgPSBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQsCiAJLmRldmljZV9pc19hZ3AgPSBtZ2FfZHJpdmVyX2RldmljZV9pc19hZ3AsCiAJLnZibGFua193YWl0ID0gbWdhX2RyaXZlcl92Ymxhbmtfd2FpdCwKQEAgLTk2LDggKzYxLDYgQEAKIAkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAogCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAogCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAotCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAotCS52ZXJzaW9uID0gdmVyc2lvbiwKIAkuaW9jdGxzID0gbWdhX2lvY3RscywKIAkuZG1hX2lvY3RsID0gbWdhX2RtYV9idWZmZXJzLAogCS5mb3BzID0gewpAQCAtMTEzLDkgKzc2LDE2IEBACiAjZW5kaWYKIAkJIH0sCiAJLnBjaV9kcml2ZXIgPSB7Ci0JCSAgICAgICAubmFtZSA9IERSSVZFUl9OQU1FLAotCQkgICAgICAgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAotCQkgICAgICAgfQorCQkgLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKKwl9LAorCisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuZGVzYyA9IERSSVZFUl9ERVNDLAorCS5kYXRlID0gRFJJVkVSX0RBVEUsCisJLm1ham9yID0gRFJJVkVSX01BSk9SLAorCS5taW5vciA9IERSSVZFUl9NSU5PUiwKKwkucGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgbWdhX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKaW5kZXggNDYxNzI4ZS4uNmIwYzUzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKQEAgLTM4LDExICszOCwxMSBAQAogCiAjZGVmaW5lIERSSVZFUl9OQU1FCQkibWdhIgogI2RlZmluZSBEUklWRVJfREVTQwkJIk1hdHJveCBHMjAwL0c0MDAiCi0jZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwNTA2MDciCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwNTExMDIiCiAKICNkZWZpbmUgRFJJVkVSX01BSk9SCQkzCiAjZGVmaW5lIERSSVZFUl9NSU5PUgkJMgotI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkwCisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTEKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9wcmltYXJ5X2J1ZmZlciB7CiAJdTggKnN0YXJ0OwpAQCAtMTQ0LDIyICsxNDQsMjIgQEAKIAlkcm1fbG9jYWxfbWFwX3QgKnByaW1hcnk7CiAJZHJtX2xvY2FsX21hcF90ICphZ3BfdGV4dHVyZXM7CiAKLQlEUk1fQUdQX01FTSAqYWdwX21lbTsKLQl1bnNpZ25lZCBpbnQgYWdwX3BhZ2VzOworCXVuc2lnbmVkIGxvbmcgYWdwX2hhbmRsZTsKKwl1bnNpZ25lZCBpbnQgYWdwX3NpemU7CiB9IGRybV9tZ2FfcHJpdmF0ZV90OwogCiBleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBtZ2FfaW9jdGxzW107CiBleHRlcm4gaW50IG1nYV9tYXhfaW9jdGw7CiAKIAkJCQkvKiBtZ2FfZG1hLmMgKi8KLWV4dGVybiBpbnQgbWdhX2RyaXZlcl9wcmVpbml0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiBleHRlcm4gaW50IG1nYV9kbWFfYm9vdHN0cmFwKERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgbWdhX2RtYV9pbml0KERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgbWdhX2RtYV9mbHVzaChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IG1nYV9kbWFfcmVzZXQoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBtZ2FfZG1hX2J1ZmZlcnMoRFJNX0lPQ1RMX0FSR1MpOwotZXh0ZXJuIGludCBtZ2FfZHJpdmVyX3Bvc3RjbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBtZ2FfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KTsKIAogZXh0ZXJuIGludCBtZ2FfZG9fd2FpdF9mb3JfaWRsZShkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jCmluZGV4IDQ3ZjU0YjUuLjI4MzdlNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYwpAQCAtMTEyNywxOSArMTEyNywxOSBAQAogfQogCiBkcm1faW9jdGxfZGVzY190IG1nYV9pb2N0bHNbXSA9IHsKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfSU5JVCldID0ge21nYV9kbWFfaW5pdCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fTUdBX0ZMVVNIKV0gPSB7bWdhX2RtYV9mbHVzaCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fTUdBX1JFU0VUKV0gPSB7bWdhX2RtYV9yZXNldCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fTUdBX1NXQVApXSA9IHttZ2FfZG1hX3N3YXAsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX01HQV9DTEVBUildID0ge21nYV9kbWFfY2xlYXIsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX01HQV9WRVJURVgpXSA9IHttZ2FfZG1hX3ZlcnRleCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fTUdBX0lORElDRVMpXSA9IHttZ2FfZG1hX2luZGljZXMsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX01HQV9JTE9BRCldID0ge21nYV9kbWFfaWxvYWQsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX01HQV9CTElUKV0gPSB7bWdhX2RtYV9ibGl0LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfR0VUUEFSQU0pXSA9IHttZ2FfZ2V0cGFyYW0sIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX01HQV9TRVRfRkVOQ0UpXSA9IHttZ2Ffc2V0X2ZlbmNlLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfV0FJVF9GRU5DRSldID0ge21nYV93YWl0X2ZlbmNlLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfRE1BX0JPT1RTVFJBUCldID0ge21nYV9kbWFfYm9vdHN0cmFwLCAxLCAxfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfSU5JVCldID0ge21nYV9kbWFfaW5pdCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfRkxVU0gpXSA9IHttZ2FfZG1hX2ZsdXNoLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX1JFU0VUKV0gPSB7bWdhX2RtYV9yZXNldCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9TV0FQKV0gPSB7bWdhX2RtYV9zd2FwLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0NMRUFSKV0gPSB7bWdhX2RtYV9jbGVhciwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9WRVJURVgpXSA9IHttZ2FfZG1hX3ZlcnRleCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9JTkRJQ0VTKV0gPSB7bWdhX2RtYV9pbmRpY2VzLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0lMT0FEKV0gPSB7bWdhX2RtYV9pbG9hZCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9CTElUKV0gPSB7bWdhX2RtYV9ibGl0LCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0dFVFBBUkFNKV0gPSB7bWdhX2dldHBhcmFtLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX1NFVF9GRU5DRSldID0ge21nYV9zZXRfZmVuY2UsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfV0FJVF9GRU5DRSldID0ge21nYV93YWl0X2ZlbmNlLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0RNQV9CT09UU1RSQVApXSA9IHttZ2FfZG1hX2Jvb3RzdHJhcCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKIH07CiAKIGludCBtZ2FfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUobWdhX2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMKaW5kZXggNzQ1Mjc1My4uZGI1YTYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYwpAQCAtMSw2ICsxLDcgQEAKLS8qIHIxMjhfY2NlLmMgLS0gQVRJIFJhZ2UgMTI4IGRyaXZlciAtKi0gbGludXgtYyAtKi0KKy8qIHIxMjhfY2NlLmMgLS0gQVRJIFJhZ2UgMTI4IGRyaXZlciAtKi0gbGludXgtYyAtKi0gCiAgKiBDcmVhdGVkOiBXZWQgQXByICA1IDE5OjI0OjE5IDIwMDAgYnkga2V2aW5AcHJlY2lzaW9uaW5zaWdodC5jb20KLSAqCisgKi8KKy8qCiAgKiBDb3B5cmlnaHQgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCiAgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgpAQCAtNTU5LDcgKzU2MCw4IEBACiAJaWYgKGRldl9wcml2LT5pc19wY2kpIHsKICNlbmRpZgogCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmdhcnRfdGFibGVfbG9jYXRpb24gPSBEUk1fQVRJX0dBUlRfTUFJTjsKLQkJZGV2X3ByaXYtPmdhcnRfaW5mby5hZGRyID0gZGV2X3ByaXYtPmdhcnRfaW5mby5idXNfYWRkciA9IDA7CisJCWRldl9wcml2LT5nYXJ0X2luZm8uYWRkciA9IE5VTEw7CisJCWRldl9wcml2LT5nYXJ0X2luZm8uYnVzX2FkZHIgPSAwOwogCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmlzX3BjaWUgPSAwOwogCQlpZiAoIWRybV9hdGlfcGNpZ2FydF9pbml0KGRldiwgJmRldl9wcml2LT5nYXJ0X2luZm8pKSB7CiAJCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0IFBDSSBHQVJUIVxuIik7CkBAIC02MDEsMTUgKzYwMywxNiBAQAogCQkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKGRldl9wcml2LT5jY2VfcmluZywgZGV2KTsKIAkJCWlmIChkZXZfcHJpdi0+cmluZ19ycHRyICE9IE5VTEwpCiAJCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoZGV2X3ByaXYtPnJpbmdfcnB0ciwgZGV2KTsKLQkJCWlmIChkZXYtPmFncF9idWZmZXJfbWFwICE9IE5VTEwpCisJCQlpZiAoZGV2LT5hZ3BfYnVmZmVyX21hcCAhPSBOVUxMKSB7CiAJCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2KTsKKwkJCQlkZXYtPmFncF9idWZmZXJfbWFwID0gTlVMTDsKKwkJCX0KIAkJfSBlbHNlCiAjZW5kaWYKIAkJewogCQkJaWYgKGRldl9wcml2LT5nYXJ0X2luZm8uYnVzX2FkZHIpCiAJCQkJaWYgKCFkcm1fYXRpX3BjaWdhcnRfY2xlYW51cChkZXYsCi0JCQkJCQkJICAgICAmZGV2X3ByaXYtPgotCQkJCQkJCSAgICAgZ2FydF9pbmZvKSkKKwkJCQkJCQkmZGV2X3ByaXYtPmdhcnRfaW5mbykpCiAJCQkJCURSTV9FUlJPUgogCQkJCQkgICAgKCJmYWlsZWQgdG8gY2xlYW51cCBQQ0kgR0FSVCFcbiIpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJtLmgKaW5kZXggNWRkYzAzMi4uNWQ4MzViMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcm0uaApAQCAtMSw3ICsxLDcgQEAKIC8qIHIxMjhfZHJtLmggLS0gUHVibGljIGhlYWRlciBmb3IgdGhlIHIxMjggZHJpdmVyIC0qLSBsaW51eC1jIC0qLQogICogQ3JlYXRlZDogV2VkIEFwciAgNSAxOToyNDoxOSAyMDAwIGJ5IGtldmluQHByZWNpc2lvbmluc2lnaHQuY29tCi0gKgotICogQ29weXJpZ2h0IDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICovCisvKiBDb3B5cmlnaHQgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCiAgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuYwppbmRleCAxNjYxZTczLi5lMjA0NTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5jCkBAIC0zNywzMSArMzcsNiBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1zdGF0aWMgaW50IHBvc3Rpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKLQkJIERSSVZFUl9OQU1FLAotCQkgRFJJVkVSX01BSk9SLAotCQkgRFJJVkVSX01JTk9SLAotCQkgRFJJVkVSX1BBVENITEVWRUwsCi0JCSBEUklWRVJfREFURSwgZGV2LT5wcmltYXJ5Lm1pbm9yLCBwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQotCSAgICApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZlcnNpb24oZHJtX3ZlcnNpb25fdCAqIHZlcnNpb24pCi17Ci0JaW50IGxlbjsKLQotCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKLQl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSk7Ci0JRFJNX0NPUFkodmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0gewogCXIxMjhfUENJX0lEUwogfTsKQEAgLTcyLDggKzQ3LDggQEAKIAkgICAgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0lSUV9TSEFSRUQgfAogCSAgICBEUklWRVJfSVJRX1ZCTCwKIAkuZGV2X3ByaXZfc2l6ZSA9IHNpemVvZihkcm1fcjEyOF9idWZfcHJpdl90KSwKLQkucHJlcmVsZWFzZSA9IHIxMjhfZHJpdmVyX3ByZXJlbGVhc2UsCi0JLnByZXRha2Vkb3duID0gcjEyOF9kcml2ZXJfcHJldGFrZWRvd24sCisJLnByZWNsb3NlID0gcjEyOF9kcml2ZXJfcHJlY2xvc2UsCisJLmxhc3RjbG9zZSA9IHIxMjhfZHJpdmVyX2xhc3RjbG9zZSwKIAkudmJsYW5rX3dhaXQgPSByMTI4X2RyaXZlcl92Ymxhbmtfd2FpdCwKIAkuaXJxX3ByZWluc3RhbGwgPSByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbCwKIAkuaXJxX3Bvc3RpbnN0YWxsID0gcjEyOF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLApAQCAtODIsOCArNTcsNiBAQAogCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCiAJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCiAJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCi0JLnBvc3Rpbml0ID0gcG9zdGluaXQsCi0JLnZlcnNpb24gPSB2ZXJzaW9uLAogCS5pb2N0bHMgPSByMTI4X2lvY3RscywKIAkuZG1hX2lvY3RsID0gcjEyOF9jY2VfYnVmZmVycywKIAkuZm9wcyA9IHsKQEAgLTk3LDEyICs3MCwxOSBAQAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkJIC5jb21wYXRfaW9jdGwgPSByMTI4X2NvbXBhdF9pb2N0bCwKICNlbmRpZgotCQkgfQotCSwKKwl9LAorCiAJLnBjaV9kcml2ZXIgPSB7Ci0JCSAgICAgICAubmFtZSA9IERSSVZFUl9OQU1FLAotCQkgICAgICAgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAotCQkgICAgICAgfQorCQkgLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKKwl9LAorCisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuZGVzYyA9IERSSVZFUl9ERVNDLAorCS5kYXRlID0gRFJJVkVSX0RBVEUsCisJLm1ham9yID0gRFJJVkVSX01BSk9SLAorCS5taW5vciA9IERSSVZFUl9NSU5PUiwKKwkucGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcjEyOF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKaW5kZXggNWM3OWU0MC4uOTRhYmZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaApAQCAtMSw3ICsxLDcgQEAKIC8qIHIxMjhfZHJ2LmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIHIxMjggZHJpdmVyIC0qLSBsaW51eC1jIC0qLQogICogQ3JlYXRlZDogTW9uIERlYyAxMyAwOTo1MToxMSAxOTk5IGJ5IGZhaXRoQHByZWNpc2lvbmluc2lnaHQuY29tCi0gKgotICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICovCisvKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCiAgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTE1NCw4ICsxNTQsOCBAQAogZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7CiAKIGV4dGVybiBsb25nIHIxMjhfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lycS5jCmluZGV4IDI3ZWIwZTMuLjg3ZjhjYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaXJxLmMKQEAgLTEsNSArMSw1IEBACi0vKiByMTI4X2lycS5jIC0tIElSUSBoYW5kbGluZyBmb3IgcmFkZW9uIC0qLSBsaW51eC1jIC0qLQotICoKKy8qIHIxMjhfaXJxLmMgLS0gSVJRIGhhbmRsaW5nIGZvciByYWRlb24gLSotIGxpbnV4LWMgLSotICovCisvKgogICogQ29weXJpZ2h0IChDKSBUaGUgV2VhdGhlciBDaGFubmVsLCBJbmMuICAyMDAyLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGUgV2VhdGhlciBDaGFubmVsIChUTSkgZnVuZGVkIFR1bmdzdGVuIEdyYXBoaWNzIHRvIGRldmVsb3AgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jCmluZGV4IDE0NDc5Y2MuLmNhZWVjYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jCkBAIC0xLDcgKzEsNyBAQAogLyogcjEyOF9zdGF0ZS5jIC0tIFN0YXRlIHN1cHBvcnQgZm9yIHIxMjggLSotIGxpbnV4LWMgLSotCiAgKiBDcmVhdGVkOiBUaHUgSmFuIDI3IDAyOjUzOjQzIDIwMDAgYnkgZ2FyZXRoQHZhbGludXguY29tCi0gKgotICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICovCisvKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCkBAIC0xNjc0LDcgKzE2NzQsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHIxMjhfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIHIxMjhfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTY4NCwyOSArMTY4NCwyOSBAQAogCX0KIH0KIAotdm9pZCByMTI4X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHIxMjhfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCiB7CiAJcjEyOF9kb19jbGVhbnVwX2NjZShkZXYpOwogfQogCiBkcm1faW9jdGxfZGVzY190IHIxMjhfaW9jdGxzW10gPSB7Ci0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9JTklUKV0gPSB7cjEyOF9jY2VfaW5pdCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DQ0VfU1RBUlQpXSA9IHtyMTI4X2NjZV9zdGFydCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DQ0VfU1RPUCldID0ge3IxMjhfY2NlX3N0b3AsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0NFX1JFU0VUKV0gPSB7cjEyOF9jY2VfcmVzZXQsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0NFX0lETEUpXSA9IHtyMTI4X2NjZV9pZGxlLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X1JFU0VUKV0gPSB7cjEyOF9lbmdpbmVfcmVzZXQsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfRlVMTFNDUkVFTildID0ge3IxMjhfZnVsbHNjcmVlbiwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9TV0FQKV0gPSB7cjEyOF9jY2Vfc3dhcCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9GTElQKV0gPSB7cjEyOF9jY2VfZmxpcCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DTEVBUildID0ge3IxMjhfY2NlX2NsZWFyLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X1ZFUlRFWCldID0ge3IxMjhfY2NlX3ZlcnRleCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9JTkRJQ0VTKV0gPSB7cjEyOF9jY2VfaW5kaWNlcywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9CTElUKV0gPSB7cjEyOF9jY2VfYmxpdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9ERVBUSCldID0ge3IxMjhfY2NlX2RlcHRoLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X1NUSVBQTEUpXSA9IHtyMTI4X2NjZV9zdGlwcGxlLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0lORElSRUNUKV0gPSB7cjEyOF9jY2VfaW5kaXJlY3QsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfR0VUUEFSQU0pXSA9IHtyMTI4X2dldHBhcmFtLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0lOSVQpXSA9IHtyMTI4X2NjZV9pbml0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0NFX1NUQVJUKV0gPSB7cjEyOF9jY2Vfc3RhcnQsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DQ0VfU1RPUCldID0ge3IxMjhfY2NlX3N0b3AsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DQ0VfUkVTRVQpXSA9IHtyMTI4X2NjZV9yZXNldCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0NDRV9JRExFKV0gPSB7cjEyOF9jY2VfaWRsZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfUkVTRVQpXSA9IHtyMTI4X2VuZ2luZV9yZXNldCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfRlVMTFNDUkVFTildID0ge3IxMjhfZnVsbHNjcmVlbiwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfU1dBUCldID0ge3IxMjhfY2NlX3N3YXAsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0ZMSVApXSA9IHtyMTI4X2NjZV9mbGlwLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DTEVBUildID0ge3IxMjhfY2NlX2NsZWFyLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9WRVJURVgpXSA9IHtyMTI4X2NjZV92ZXJ0ZXgsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0lORElDRVMpXSA9IHtyMTI4X2NjZV9pbmRpY2VzLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9CTElUKV0gPSB7cjEyOF9jY2VfYmxpdCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfREVQVEgpXSA9IHtyMTI4X2NjZV9kZXB0aCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfU1RJUFBMRSldID0ge3IxMjhfY2NlX3N0aXBwbGUsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0lORElSRUNUKV0gPSB7cjEyOF9jY2VfaW5kaXJlY3QsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9HRVRQQVJBTSldID0ge3IxMjhfZ2V0cGFyYW0sIERSTV9BVVRIfSwKIH07CiAKIGludCByMTI4X21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKHIxMjhfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9jbWRidWYuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9jbWRidWYuYwppbmRleCAzYTFhYzVmLi4yOTFkYmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jCkBAIC01Miw4ICs1Miw4IEBACiAgKiBFbWl0IHVwIHRvIFIzMDBfU0lNVUxUQU5FT1VTX0NMSVBSRUNUUyBjbGlwcmVjdHMgZnJvbSB0aGUgZ2l2ZW4gY29tbWFuZAogICogYnVmZmVyLCBzdGFydGluZyB3aXRoIGluZGV4IG4uCiAgKi8KLXN0YXRpYyBpbnQgcjMwMF9lbWl0X2NsaXByZWN0cyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJICAgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqIGNtZGJ1ZiwgaW50IG4pCitzdGF0aWMgaW50IHIzMDBfZW1pdF9jbGlwcmVjdHMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJICAgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmLCBpbnQgbikKIHsKIAlkcm1fY2xpcF9yZWN0X3QgYm94OwogCWludCBucjsKQEAgLTIxNiw2ICsyMTYsNyBAQAogCUFERF9SQU5HRShSMzAwX1RYX1VOSzFfMCwgMTYpOwogCUFERF9SQU5HRShSMzAwX1RYX1NJWkVfMCwgMTYpOwogCUFERF9SQU5HRShSMzAwX1RYX0ZPUk1BVF8wLCAxNik7CisJQUREX1JBTkdFKFIzMDBfVFhfUElUQ0hfMCwgMTYpOwogCS8qIFRleHR1cmUgb2Zmc2V0IGlzIGRhbmdlcm91cyBhbmQgbmVlZHMgbW9yZSBjaGVja2luZyAqLwogCUFERF9SQU5HRV9NQVJLKFIzMDBfVFhfT0ZGU0VUXzAsIDE2LCBNQVJLX0NIRUNLX09GRlNFVCk7CiAJQUREX1JBTkdFKFIzMDBfVFhfVU5LNF8wLCAxNik7CkBAIC0yNDIsNyArMjQzLDcgQEAKIAogICAvKiB3ZSBleHBlY3Qgb2Zmc2V0cyBwYXNzZWQgdG8gdGhlIGZyYW1lYnVmZmVyIHRvIGJlIGVpdGhlciB3aXRoaW4gdmlkZW8gbWVtb3J5IG9yCiAgICAgIHdpdGhpbiBBR1Agc3BhY2UgKi8KLXN0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2NoZWNrX29mZnNldChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAorc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfY2hlY2tfb2Zmc2V0KGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKIAkJCQkJdTMyIG9mZnNldCkKIHsKIAkvKiB3ZSByZWFseSB3YW50IHRvIGNoZWNrIGFnYWluc3QgZW5kIG9mIHZpZGVvIGFwZXJ0dXJlCkBAIC0zMTcsOCArMzE4LDggQEAKICAqCiAgKiBOb3RlIHRoYXQgY2hlY2tzIGFyZSBwZXJmb3JtZWQgb24gY29udGVudHMgYW5kIGFkZHJlc3NlcyBvZiB0aGUgcmVnaXN0ZXJzCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfcGFja2V0MChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCQlkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKiBjbWRidWYsCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcjMwMF9lbWl0X3BhY2tldDAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCQlkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZiwKIAkJCQkJZHJtX3IzMDBfY21kX2hlYWRlcl90IGhlYWRlcikKIHsKIAlpbnQgcmVnOwpAQCAtMzYzLDggKzM2NCw4IEBACiAgKiB0aGUgZ3JhcGhpY3MgY2FyZC4KICAqIENhbGxlZCBieSByMzAwX2RvX2NwX2NtZGJ1Zi4KICAqLwotc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfZW1pdF92cHUoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICogY21kYnVmLAorc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfZW1pdF92cHUoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCSAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZiwKIAkJCQkgICAgZHJtX3IzMDBfY21kX2hlYWRlcl90IGhlYWRlcikKIHsKIAlpbnQgc3o7CkBAIC00MDAsOCArNDAxLDggQEAKICAqIEVtaXQgYSBjbGVhciBwYWNrZXQgZnJvbSB1c2Vyc3BhY2UuCiAgKiBDYWxsZWQgYnkgcjMwMF9lbWl0X3BhY2tldDMuCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfY2xlYXIoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkgICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKiBjbWRidWYpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcjMwMF9lbWl0X2NsZWFyKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkgICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZikKIHsKIAlSSU5HX0xPQ0FMUzsKIApAQCAtNDIxLDggKzQyMiw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfM2RfbG9hZF92YnBudHIoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkJICAgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqIGNtZGJ1ZiwKK3N0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfM2RfbG9hZF92YnBudHIoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCQkgICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYsCiAJCQkJCSAgICAgICB1MzIgaGVhZGVyKQogewogCWludCBjb3VudCwgaSwgazsKQEAgLTQ4OSw4ICs0OTAsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgcjMwMF9lbWl0X3Jhd19wYWNrZXQzKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJCSAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKiBjbWRidWYpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcjMwMF9lbWl0X3Jhd19wYWNrZXQzKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkJICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmKQogewogCXUzMiBoZWFkZXI7CiAJaW50IGNvdW50OwpAQCAtNTU0LDggKzU1NSw4IEBACiAgKiBFbWl0IGEgcmVuZGVyaW5nIHBhY2tldDMgZnJvbSB1c2Vyc3BhY2UuCiAgKiBDYWxsZWQgYnkgcjMwMF9kb19jcF9jbWRidWYuCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfcGFja2V0Myhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCQlkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKiBjbWRidWYsCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcjMwMF9lbWl0X3BhY2tldDMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCQlkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZiwKIAkJCQkJZHJtX3IzMDBfY21kX2hlYWRlcl90IGhlYWRlcikKIHsKIAlpbnQgbjsKQEAgLTYyMyw3ICs2MjQsNyBAQAogLyoqCiAgKiBFbWl0IHRoZSBzZXF1ZW5jZSB0byBwYWNpZnkgUjMwMC4KICAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCByMzAwX3BhY2lmeShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIF9faW5saW5lX18gdm9pZCByMzAwX3BhY2lmeShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJUklOR19MT0NBTFM7CiAKQEAgLTY1Nyw5ICs2NTgsMTAgQEAKICAqIGNvbW1hbmRzIG9uIHRoZSBETUEgcmluZyBidWZmZXIuCiAgKiBDYWxsZWQgYnkgdGhlIGlvY3RsIGhhbmRsZXIgZnVuY3Rpb24gcmFkZW9uX2NwX2NtZGJ1Zi4KICAqLwotaW50IHIzMDBfZG9fY3BfY21kYnVmKGRybV9kZXZpY2VfdCAqIGRldiwKK2ludCByMzAwX2RvX2NwX2NtZGJ1Zihkcm1fZGV2aWNlX3QgKmRldiwKIAkJICAgICAgRFJNRklMRSBmaWxwLAotCQkgICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LCBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKiBjbWRidWYpCisJCSAgICAgIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKKwkJICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9yZWcuaCBiL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9yZWcuaAppbmRleCBlNWI3M2MwLi5hMGVkMjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfcmVnLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX3JlZy5oCkBAIC03OTcsNiArNzk3LDcgQEAKIAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfWVVWX01PREUJCTB4MDA4MDAwMDAKIAorI2RlZmluZSBSMzAwX1RYX1BJVENIXzAJCQkgICAgMHg0NTAwCiAjZGVmaW5lIFIzMDBfVFhfT0ZGU0VUXzAgICAgICAgICAgICAgICAgICAgIDB4NDU0MAogLyogQkVHSU46IEd1ZXNzIGZyb20gUjIwMCAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fRU5ESUFOX05PX1NXQVAgICAgICAgICAgICgwIDw8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYwppbmRleCAzNDIzMDJkLi45MTU2NjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMKQEAgLTEsNSArMSw1IEBACi0vKiByYWRlb25fY3AuYyAtLSBDUCBzdXBwb3J0IGZvciBSYWRlb24gLSotIGxpbnV4LWMgLSotCi0gKgorLyogcmFkZW9uX2NwLmMgLS0gQ1Agc3VwcG9ydCBmb3IgUmFkZW9uIC0qLSBsaW51eC1jIC0qLSAqLworLyoKICAqIENvcHlyaWdodCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KICAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIEZyZW1vbnQsIENhbGlmb3JuaWEuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgpAQCAtODI0LDcgKzgyNCw3IEBACiAJcmV0dXJuIFJBREVPTl9SRUFEKFJBREVPTl9DTE9DS19DTlRMX0RBVEEpOwogfQogCi1zdGF0aWMgaW50IFJBREVPTl9SRUFEX1BDSUUoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwgaW50IGFkZHIpCitzdGF0aWMgaW50IFJBREVPTl9SRUFEX1BDSUUoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgYWRkcikKIHsKIAlSQURFT05fV1JJVEU4KFJBREVPTl9QQ0lFX0lOREVYLCBhZGRyICYgMHhmZik7CiAJcmV0dXJuIFJBREVPTl9SRUFEKFJBREVPTl9QQ0lFX0RBVEEpOwpAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAkJICAgICB8IChkZXZfcHJpdi0+ZmJfbG9jYXRpb24gPj4gMTYpKTsKIAogI2lmIF9fT1NfSEFTX0FHUAotCWlmICghZGV2X3ByaXYtPmlzX3BjaSkgeworCWlmIChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0lTX0FHUCkgewogCQlSQURFT05fV1JJVEUoUkFERU9OX01DX0FHUF9MT0NBVElPTiwKIAkJCSAgICAgKCgoZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgLSAxICsKIAkJCQlkZXZfcHJpdi0+Z2FydF9zaXplKSAmIDB4ZmZmZjAwMDApIHwKQEAgLTExNTIsNyArMTE1Miw3IEBACiAJZGV2X3ByaXYtPnJpbmcudGFpbCA9IGN1cl9yZWFkX3B0cjsKIAogI2lmIF9fT1NfSEFTX0FHUAotCWlmICghZGV2X3ByaXYtPmlzX3BjaSkgeworCWlmIChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0lTX0FHUCkgewogCQkvKiBzZXQgUkFERU9OX0FHUF9CQVNFIGhlcmUgaW5zdGVhZCBvZiByZWx5aW5nIG9uIFggZnJvbSB1c2VyIHNwYWNlICovCiAJCVJBREVPTl9XUklURShSQURFT05fQUdQX0JBU0UsICh1bnNpZ25lZCBpbnQpZGV2LT5hZ3AtPmJhc2UpOwogCQlSQURFT05fV1JJVEUoUkFERU9OX0NQX1JCX1JQVFJfQUREUiwKQEAgLTEyNzgsMTMgKzEyNzgsMTUgQEAKIC8qIEVuYWJsZSBvciBkaXNhYmxlIFBDSSBHQVJUIG9uIHRoZSBjaGlwICovCiBzdGF0aWMgdm9pZCByYWRlb25fc2V0X3BjaWdhcnQoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwgaW50IG9uKQogewotCXUzMiB0bXAgPSBSQURFT05fUkVBRChSQURFT05fQUlDX0NOVEwpOworCXUzMiB0bXA7CiAKIAlpZiAoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19QQ0lFKSB7CiAJCXJhZGVvbl9zZXRfcGNpZWdhcnQoZGV2X3ByaXYsIG9uKTsKIAkJcmV0dXJuOwogCX0KIAorIAl0bXAgPSBSQURFT05fUkVBRChSQURFT05fQUlDX0NOVEwpOworCiAJaWYgKG9uKSB7CiAJCVJBREVPTl9XUklURShSQURFT05fQUlDX0NOVEwsCiAJCQkgICAgIHRtcCB8IFJBREVPTl9QQ0lHQVJUX1RSQU5TTEFURV9FTik7CkBAIC0xMzEyLDEzICsxMzE0LDE3IEBACiBzdGF0aWMgaW50IHJhZGVvbl9kb19pbml0X2NwKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX3JhZGVvbl9pbml0X3QgKiBpbml0KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKIAlEUk1fREVCVUcoIlxuIik7CiAKLQlkZXZfcHJpdi0+aXNfcGNpID0gaW5pdC0+aXNfcGNpOworCWlmIChpbml0LT5pc19wY2kgJiYgKGRldl9wcml2LT5mbGFncyAmIENISVBfSVNfQUdQKSkKKwl7CisJCURSTV9ERUJVRygiRm9yY2luZyBBR1AgY2FyZCB0byBQQ0kgbW9kZVxuIik7CisJCWRldl9wcml2LT5mbGFncyAmPSB+Q0hJUF9JU19BR1A7CisJfQogCi0JaWYgKGRldl9wcml2LT5pc19wY2kgJiYgIWRldi0+c2cpIHsKKwlpZiAoKCEoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19BR1ApKSAmJiAhZGV2LT5zZykgewogCQlEUk1fRVJST1IoIlBDSSBHQVJUIG1lbW9yeSBub3QgYWxsb2NhdGVkIVxuIik7Ci0JCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCQlyYWRlb25fZG9fY2xlYW51cF9jcChkZXYpOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KQEAgLTEzMjcsMTIgKzEzMzMsMTEgQEAKIAlpZiAoZGV2X3ByaXYtPnVzZWNfdGltZW91dCA8IDEgfHwKIAkgICAgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA+IFJBREVPTl9NQVhfVVNFQ19USU1FT1VUKSB7CiAJCURSTV9ERUJVRygiVElNRU9VVCBwcm9ibGVtIVxuIik7Ci0JCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCQlyYWRlb25fZG9fY2xlYW51cF9jcChkZXYpOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCXN3aXRjaCAoaW5pdC0+ZnVuYykgeworCXN3aXRjaChpbml0LT5mdW5jKSB7CiAJY2FzZSBSQURFT05fSU5JVF9SMjAwX0NQOgogCQlkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb24gPSBVQ09ERV9SMjAwOwogCQlicmVhazsKQEAgLTEzNTMsNyArMTM1OCw2IEBACiAJaWYgKChpbml0LT5jcF9tb2RlICE9IFJBREVPTl9DU1FfUFJJQk1fSU5ERElTKSAmJgogCSAgICAoaW5pdC0+Y3BfbW9kZSAhPSBSQURFT05fQ1NRX1BSSUJNX0lOREJNKSkgewogCQlEUk1fREVCVUcoIkJBRCBjcF9tb2RlICgleCkhXG4iLCBpbml0LT5jcF9tb2RlKTsKLQkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CiAJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQpAQCAtMTQxNiw4ICsxNDIwLDYgQEAKIAogCURSTV9HRVRTQVJFQSgpOwogCi0JZGV2X3ByaXYtPmZiX29mZnNldCA9IGluaXQtPmZiX29mZnNldDsKLQlkZXZfcHJpdi0+bW1pb19vZmZzZXQgPSBpbml0LT5tbWlvX29mZnNldDsKIAlkZXZfcHJpdi0+cmluZ19vZmZzZXQgPSBpbml0LT5yaW5nX29mZnNldDsKIAlkZXZfcHJpdi0+cmluZ19ycHRyX29mZnNldCA9IGluaXQtPnJpbmdfcnB0cl9vZmZzZXQ7CiAJZGV2X3ByaXYtPmJ1ZmZlcnNfb2Zmc2V0ID0gaW5pdC0+YnVmZmVyc19vZmZzZXQ7CkBAIC0xNDI1LDI5ICsxNDI3LDE5IEBACiAKIAlpZiAoIWRldl9wcml2LT5zYXJlYSkgewogCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHNhcmVhIVxuIik7Ci0JCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCQlyYWRlb25fZG9fY2xlYW51cF9jcChkZXYpOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCWRldl9wcml2LT5tbWlvID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPm1taW9fb2Zmc2V0KTsKLQlpZiAoIWRldl9wcml2LT5tbWlvKSB7Ci0JCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgbW1pbyByZWdpb24hXG4iKTsKLQkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7Ci0JCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7Ci0JCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Ci0JfQogCWRldl9wcml2LT5jcF9yaW5nID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPnJpbmdfb2Zmc2V0KTsKIAlpZiAoIWRldl9wcml2LT5jcF9yaW5nKSB7CiAJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgY3AgcmluZyByZWdpb24hXG4iKTsKLQkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CiAJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCWRldl9wcml2LT5yaW5nX3JwdHIgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+cmluZ19ycHRyX29mZnNldCk7CiAJaWYgKCFkZXZfcHJpdi0+cmluZ19ycHRyKSB7CiAJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgcmluZyByZWFkIHBvaW50ZXIhXG4iKTsKLQkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CiAJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQpAQCAtMTQ1NSw3ICsxNDQ3LDYgQEAKIAlkZXYtPmFncF9idWZmZXJfbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KTsKIAlpZiAoIWRldi0+YWdwX2J1ZmZlcl9tYXApIHsKIAkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBkbWEgYnVmZmVyIHJlZ2lvbiFcbiIpOwotCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKIAkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CkBAIC0xNDY1LDcgKzE0NTYsNiBAQAogCQkgICAgZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0KTsKIAkJaWYgKCFkZXZfcHJpdi0+Z2FydF90ZXh0dXJlcykgewogCQkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBHQVJUIHRleHR1cmUgcmVnaW9uIVxuIik7Ci0JCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKIAkJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CiAJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCQl9CkBAIC0xNDc2LDcgKzE0NjYsNyBAQAogCQkJCSAgICBpbml0LT5zYXJlYV9wcml2X29mZnNldCk7CiAKICNpZiBfX09TX0hBU19BR1AKLQlpZiAoIWRldl9wcml2LT5pc19wY2kpIHsKKwlpZiAoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19BR1ApIHsKIAkJZHJtX2NvcmVfaW9yZW1hcChkZXZfcHJpdi0+Y3BfcmluZywgZGV2KTsKIAkJZHJtX2NvcmVfaW9yZW1hcChkZXZfcHJpdi0+cmluZ19ycHRyLCBkZXYpOwogCQlkcm1fY29yZV9pb3JlbWFwKGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldik7CkBAIC0xNDg0LDcgKzE0NzQsNiBAQAogCQkgICAgIWRldl9wcml2LT5yaW5nX3JwdHItPmhhbmRsZSB8fAogCQkgICAgIWRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSkgewogCQkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBpb3JlbWFwIGFncCByZWdpb25zIVxuIik7Ci0JCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKIAkJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CiAJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCQl9CkBAIC0xNTI1LDcgKzE1MTQsNyBAQAogCSAgICArIFJBREVPTl9SRUFEKFJBREVPTl9DT05GSUdfQVBFUl9TSVpFKTsKIAogI2lmIF9fT1NfSEFTX0FHUAotCWlmICghZGV2X3ByaXYtPmlzX3BjaSkKKwlpZiAoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19BR1ApCiAJCWRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0ID0gKGRldi0+YWdwX2J1ZmZlcl9tYXAtPm9mZnNldAogCQkJCQkJIC0gZGV2LT5hZ3AtPmJhc2UKIAkJCQkJCSArIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0KTsKQEAgLTE1NTEsNyArMTU0MCw3IEBACiAJZGV2X3ByaXYtPnJpbmcuaGlnaF9tYXJrID0gUkFERU9OX1JJTkdfSElHSF9NQVJLOwogCiAjaWYgX19PU19IQVNfQUdQCi0JaWYgKCFkZXZfcHJpdi0+aXNfcGNpKSB7CisJaWYgKGRldl9wcml2LT5mbGFncyAmIENISVBfSVNfQUdQKSB7CiAJCS8qIFR1cm4gb2ZmIFBDSSBHQVJUICovCiAJCXJhZGVvbl9zZXRfcGNpZ2FydChkZXZfcHJpdiwgMCk7CiAJfSBlbHNlCkBAIC0xNTYxLDI1ICsxNTUwLDI4IEBACiAJCWlmIChkZXZfcHJpdi0+cGNpZ2FydF9vZmZzZXQpIHsKIAkJCWRldl9wcml2LT5nYXJ0X2luZm8uYnVzX2FkZHIgPQogCQkJICAgIGRldl9wcml2LT5wY2lnYXJ0X29mZnNldCArIGRldl9wcml2LT5mYl9sb2NhdGlvbjsKKwkJCWRldl9wcml2LT5nYXJ0X2luZm8ubWFwcGluZy5vZmZzZXQgPQorCQkJICAgIGRldl9wcml2LT5nYXJ0X2luZm8uYnVzX2FkZHI7CisJCQlkZXZfcHJpdi0+Z2FydF9pbmZvLm1hcHBpbmcuc2l6ZSA9CisJCQkgICAgUkFERU9OX1BDSUdBUlRfVEFCTEVfU0laRTsKKworCQkJZHJtX2NvcmVfaW9yZW1hcCgmZGV2X3ByaXYtPmdhcnRfaW5mby5tYXBwaW5nLCBkZXYpOwogCQkJZGV2X3ByaXYtPmdhcnRfaW5mby5hZGRyID0KLQkJCSAgICAodW5zaWduZWQgbG9uZylkcm1faW9yZW1hcChkZXZfcHJpdi0+Z2FydF9pbmZvLgotCQkJCQkJICAgICAgIGJ1c19hZGRyLAotCQkJCQkJICAgICAgIFJBREVPTl9QQ0lHQVJUX1RBQkxFX1NJWkUsCi0JCQkJCQkgICAgICAgZGV2KTsKKwkJCSAgICBkZXZfcHJpdi0+Z2FydF9pbmZvLm1hcHBpbmcuaGFuZGxlOwogCiAJCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmlzX3BjaWUgPQogCQkJICAgICEhKGRldl9wcml2LT5mbGFncyAmIENISVBfSVNfUENJRSk7CiAJCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmdhcnRfdGFibGVfbG9jYXRpb24gPQogCQkJICAgIERSTV9BVElfR0FSVF9GQjsKIAotCQkJRFJNX0RFQlVHKCJTZXR0aW5nIHBoeXNfcGNpX2dhcnQgdG8gJTA4bFggJTA4bFhcbiIsCisJCQlEUk1fREVCVUcoIlNldHRpbmcgcGh5c19wY2lfZ2FydCB0byAlcCAlMDhsWFxuIiwKIAkJCQkgIGRldl9wcml2LT5nYXJ0X2luZm8uYWRkciwKIAkJCQkgIGRldl9wcml2LT5wY2lnYXJ0X29mZnNldCk7CiAJCX0gZWxzZSB7CiAJCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmdhcnRfdGFibGVfbG9jYXRpb24gPQogCQkJICAgIERSTV9BVElfR0FSVF9NQUlOOwotCQkJZGV2X3ByaXYtPmdhcnRfaW5mby5hZGRyID0KLQkJCSAgICBkZXZfcHJpdi0+Z2FydF9pbmZvLmJ1c19hZGRyID0gMDsKKwkJCWRldl9wcml2LT5nYXJ0X2luZm8uYWRkciA9IE5VTEw7CisJCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmJ1c19hZGRyID0gMDsKIAkJCWlmIChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0lTX1BDSUUpIHsKIAkJCQlEUk1fRVJST1IKIAkJCQkgICAgKCJDYW5ub3QgdXNlIFBDSSBFeHByZXNzIHdpdGhvdXQgR0FSVCBpbiBGQiBtZW1vcnlcbiIpOwpAQCAtMTU5MCw3ICsxNTgyLDYgQEAKIAogCQlpZiAoIWRybV9hdGlfcGNpZ2FydF9pbml0KGRldiwgJmRldl9wcml2LT5nYXJ0X2luZm8pKSB7CiAJCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0IFBDSSBHQVJUIVxuIik7Ci0JCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKIAkJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CiAJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOwogCQl9CkBAIC0xNjA0LDggKzE1OTUsNiBAQAogCiAJZGV2X3ByaXYtPmxhc3RfYnVmID0gMDsKIAotCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwotCiAJcmFkZW9uX2RvX2VuZ2luZV9yZXNldChkZXYpOwogCiAJcmV0dXJuIDA7CkBAIC0xNjI0LDExICsxNjEzLDE1IEBACiAJCWRybV9pcnFfdW5pbnN0YWxsKGRldik7CiAKICNpZiBfX09TX0hBU19BR1AKLQlpZiAoIWRldl9wcml2LT5pc19wY2kpIHsKLQkJaWYgKGRldl9wcml2LT5jcF9yaW5nICE9IE5VTEwpCisJaWYgKGRldl9wcml2LT5mbGFncyAmIENISVBfSVNfQUdQKSB7CisJCWlmIChkZXZfcHJpdi0+Y3BfcmluZyAhPSBOVUxMKSB7CiAJCQlkcm1fY29yZV9pb3JlbWFwZnJlZShkZXZfcHJpdi0+Y3BfcmluZywgZGV2KTsKLQkJaWYgKGRldl9wcml2LT5yaW5nX3JwdHIgIT0gTlVMTCkKKwkJCWRldl9wcml2LT5jcF9yaW5nID0gTlVMTDsKKwkJfQorCQlpZiAoZGV2X3ByaXYtPnJpbmdfcnB0ciAhPSBOVUxMKSB7CiAJCQlkcm1fY29yZV9pb3JlbWFwZnJlZShkZXZfcHJpdi0+cmluZ19ycHRyLCBkZXYpOworCQkJZGV2X3ByaXYtPnJpbmdfcnB0ciA9IE5VTEw7CisJCX0KIAkJaWYgKGRldi0+YWdwX2J1ZmZlcl9tYXAgIT0gTlVMTCkgewogCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2KTsKIAkJCWRldi0+YWdwX2J1ZmZlcl9tYXAgPSBOVUxMOwpAQCAtMTYzNiwxNyArMTYyOSwyMCBAQAogCX0gZWxzZQogI2VuZGlmCiAJewotCQlpZiAoZGV2X3ByaXYtPmdhcnRfaW5mby5idXNfYWRkcikKKworCQlpZiAoZGV2X3ByaXYtPmdhcnRfaW5mby5idXNfYWRkcikgeworCQkJLyogVHVybiBvZmYgUENJIEdBUlQgKi8KKwkJCXJhZGVvbl9zZXRfcGNpZ2FydChkZXZfcHJpdiwgMCk7CiAJCQlpZiAoIWRybV9hdGlfcGNpZ2FydF9jbGVhbnVwKGRldiwgJmRldl9wcml2LT5nYXJ0X2luZm8pKQogCQkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGNsZWFudXAgUENJIEdBUlQhXG4iKTsKKwkJfQogCi0JCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLmdhcnRfdGFibGVfbG9jYXRpb24gPT0gRFJNX0FUSV9HQVJUX0ZCKSB7Ci0JCQlkcm1faW9yZW1hcGZyZWUoKHZvaWQgKilkZXZfcHJpdi0+Z2FydF9pbmZvLmFkZHIsCi0JCQkJCVJBREVPTl9QQ0lHQVJUX1RBQkxFX1NJWkUsIGRldik7CisJCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLmdhcnRfdGFibGVfbG9jYXRpb24gPT0gRFJNX0FUSV9HQVJUX0ZCKQorCQl7CisJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSgmZGV2X3ByaXYtPmdhcnRfaW5mby5tYXBwaW5nLCBkZXYpOwogCQkJZGV2X3ByaXYtPmdhcnRfaW5mby5hZGRyID0gMDsKIAkJfQogCX0KLQogCS8qIG9ubHkgY2xlYXIgdG8gdGhlIHN0YXJ0IG9mIGZsYWdzICovCiAJbWVtc2V0KGRldl9wcml2LCAwLCBvZmZzZXRvZihkcm1fcmFkZW9uX3ByaXZhdGVfdCwgZmxhZ3MpKTsKIApAQCAtMTY3Miw3ICsxNjY4LDcgQEAKIAlEUk1fREVCVUcoIlN0YXJ0aW5nIHJhZGVvbl9kb19yZXN1bWVfY3AoKVxuIik7CiAKICNpZiBfX09TX0hBU19BR1AKLQlpZiAoIWRldl9wcml2LT5pc19wY2kpIHsKKwlpZiAoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19BR1ApIHsKIAkJLyogVHVybiBvZmYgUENJIEdBUlQgKi8KIAkJcmFkZW9uX3NldF9wY2lnYXJ0KGRldl9wcml2LCAwKTsKIAl9IGVsc2UKQEAgLTIxMDMsNyArMjA5OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHJhZGVvbl9kcml2ZXJfcHJlaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoraW50IHJhZGVvbl9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdjsKIAlpbnQgcmV0ID0gMDsKQEAgLTIxMzYsMTEgKzIxMzIsMTQgQEAKIAkJZGV2X3ByaXYtPmZsYWdzIHw9IENISVBfSVNfUENJRTsKIAogCURSTV9ERUJVRygiJXMgY2FyZCBkZXRlY3RlZFxuIiwKLQkJICAoKGRldl9wcml2LT5mbGFncyAmIENISVBfSVNfQUdQKSA/ICJBR1AiIDogIlBDSSIpKTsKKwkJICAoKGRldl9wcml2LT5mbGFncyAmIENISVBfSVNfQUdQKSA/ICJBR1AiIDogKCgoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19QQ0lFKSA/ICJQQ0lFIiA6ICJQQ0kiKSkpKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgcmFkZW9uX3ByZXNldHVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCisvKiBDcmVhdGUgbWFwcGluZ3MgZm9yIHJlZ2lzdGVycyBhbmQgZnJhbWVidWZmZXIgc28gdXNlcmxhbmQgZG9lc24ndCBuZWNlc3NhcmlseQorICogaGF2ZSB0byBmaW5kIHRoZW0uCisgKi8KK2ludCByYWRlb25fZHJpdmVyX2ZpcnN0b3BlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWludCByZXQ7CiAJZHJtX2xvY2FsX21hcF90ICptYXA7CkBAIC0yMTYxLDEyICsyMTYwLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCByYWRlb25fZHJpdmVyX3Bvc3RjbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitpbnQgcmFkZW9uX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJRFJNX0RFQlVHKCJcbiIpOwotCiAJZHJtX2ZyZWUoZGV2X3ByaXYsIHNpemVvZigqZGV2X3ByaXYpLCBEUk1fTUVNX0RSSVZFUik7CiAKIAlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKaW5kZXggMWNkODFhNi4uOWMxNzdhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKQEAgLTYyNCw2ICs2MjQsMTEgQEAKIAlpbnQgZGlzY2FyZDsKIH0gZHJtX3JhZGVvbl9pbmRpcmVjdF90OwogCisvKiBlbnVtIGZvciBjYXJkIHR5cGUgcGFyYW1ldGVycyAqLworI2RlZmluZSBSQURFT05fQ0FSRF9QQ0kgMAorI2RlZmluZSBSQURFT05fQ0FSRF9BR1AgMQorI2RlZmluZSBSQURFT05fQ0FSRF9QQ0lFIDIKKwogLyogMS4zOiBBbiBpb2N0bCB0byBnZXQgcGFyYW1ldGVycyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgdG8gdGhlIDNkCiAgKiBjbGllbnQgYW55IG90aGVyIHdheS4KICAqLwpAQCAtNjQwLDYgKzY0NSw3IEBACiAjZGVmaW5lIFJBREVPTl9QQVJBTV9TQVJFQV9IQU5ETEUgICAgICAgICAgOQogI2RlZmluZSBSQURFT05fUEFSQU1fR0FSVF9URVhfSEFORExFICAgICAgIDEwCiAjZGVmaW5lIFJBREVPTl9QQVJBTV9TQ1JBVENIX09GRlNFVCAgICAgICAgMTEKKyNkZWZpbmUgUkFERU9OX1BBUkFNX0NBUkRfVFlQRSAgICAgICAgICAgICAxMgogCiB0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2dldHBhcmFtIHsKIAlpbnQgcGFyYW07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jCmluZGV4IGVlNDk2NzBkLi5iMDRlZDFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuYwpAQCAtNDIsMjkgKzQyLDE1IEBACiBNT0RVTEVfUEFSTV9ERVNDKG5vX3diLCAiRGlzYWJsZSBBR1Agd3JpdGViYWNrIGZvciBzY3JhdGNoIHJlZ2lzdGVyc1xuIik7CiBtb2R1bGVfcGFyYW1fbmFtZWQobm9fd2IsIHJhZGVvbl9ub193YiwgaW50LCAwNDQ0KTsKIAotc3RhdGljIGludCBwb3N0aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGludCBkcmlfbGlicmFyeV9uYW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKIHsKLQlEUk1fSU5GTygiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWQ6ICVzXG4iLAotCQkgRFJJVkVSX05BTUUsCi0JCSBEUklWRVJfTUFKT1IsCi0JCSBEUklWRVJfTUlOT1IsCi0JCSBEUklWRVJfUEFUQ0hMRVZFTCwKLQkJIERSSVZFUl9EQVRFLCBkZXYtPnByaW1hcnkubWlub3IsIHBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCi0JICAgICk7Ci0JcmV0dXJuIDA7Ci19CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgZmFtaWx5ID0gZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9GQU1JTFlfTUFTSzsKIAotc3RhdGljIGludCB2ZXJzaW9uKGRybV92ZXJzaW9uX3QgKiB2ZXJzaW9uKQotewotCWludCBsZW47Ci0KLQl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOwotCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7Ci0JRFJNX0NPUFkodmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFKTsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCisJCSAgICAgICAgKGZhbWlseSA8IENISVBfUjIwMCkgPyAicmFkZW9uIiA6CisJCSAgICAgICAgKChmYW1pbHkgPCBDSElQX1IzMDApID8gInIyMDAiIDoKKwkJICAgICAgICAicjMwMCIpKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0gewpAQCAtNzcsMjMgKzYzLDIyIEBACiAJICAgIERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9JUlFfU0hBUkVEIHwKIAkgICAgRFJJVkVSX0lSUV9WQkwsCiAJLmRldl9wcml2X3NpemUgPSBzaXplb2YoZHJtX3JhZGVvbl9idWZfcHJpdl90KSwKLQkucHJlaW5pdCA9IHJhZGVvbl9kcml2ZXJfcHJlaW5pdCwKLQkucHJlc2V0dXAgPSByYWRlb25fcHJlc2V0dXAsCi0JLnBvc3RjbGVhbnVwID0gcmFkZW9uX2RyaXZlcl9wb3N0Y2xlYW51cCwKLQkucHJlcmVsZWFzZSA9IHJhZGVvbl9kcml2ZXJfcHJlcmVsZWFzZSwKLQkucHJldGFrZWRvd24gPSByYWRlb25fZHJpdmVyX3ByZXRha2Vkb3duLAotCS5vcGVuX2hlbHBlciA9IHJhZGVvbl9kcml2ZXJfb3Blbl9oZWxwZXIsCisJLmxvYWQgPSByYWRlb25fZHJpdmVyX2xvYWQsCisJLmZpcnN0b3BlbiA9IHJhZGVvbl9kcml2ZXJfZmlyc3RvcGVuLAorCS5vcGVuID0gcmFkZW9uX2RyaXZlcl9vcGVuLAorCS5wcmVjbG9zZSA9IHJhZGVvbl9kcml2ZXJfcHJlY2xvc2UsCisJLnBvc3RjbG9zZSA9IHJhZGVvbl9kcml2ZXJfcG9zdGNsb3NlLAorCS5sYXN0Y2xvc2UgPSByYWRlb25fZHJpdmVyX2xhc3RjbG9zZSwKKwkudW5sb2FkID0gcmFkZW9uX2RyaXZlcl91bmxvYWQsCiAJLnZibGFua193YWl0ID0gcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdCwKKwkuZHJpX2xpYnJhcnlfbmFtZSA9IGRyaV9saWJyYXJ5X25hbWUsCiAJLmlycV9wcmVpbnN0YWxsID0gcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCwKIAkuaXJxX3Bvc3RpbnN0YWxsID0gcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwsCiAJLmlycV91bmluc3RhbGwgPSByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGwsCiAJLmlycV9oYW5kbGVyID0gcmFkZW9uX2RyaXZlcl9pcnFfaGFuZGxlciwKLQkuZnJlZV9maWxwX3ByaXYgPSByYWRlb25fZHJpdmVyX2ZyZWVfZmlscF9wcml2LAogCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCiAJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCiAJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCi0JLnBvc3Rpbml0ID0gcG9zdGluaXQsCi0JLnZlcnNpb24gPSB2ZXJzaW9uLAogCS5pb2N0bHMgPSByYWRlb25faW9jdGxzLAogCS5kbWFfaW9jdGwgPSByYWRlb25fY3BfYnVmZmVycywKIAkuZm9wcyA9IHsKQEAgLTEwNywxMiArOTIsMTkgQEAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJCSAuY29tcGF0X2lvY3RsID0gcmFkZW9uX2NvbXBhdF9pb2N0bCwKICNlbmRpZgotCQkgfQotCSwKKwl9LAorCiAJLnBjaV9kcml2ZXIgPSB7Ci0JCSAgICAgICAubmFtZSA9IERSSVZFUl9OQU1FLAotCQkgICAgICAgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAotCQkgICAgICAgfQorCQkgLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKKwl9LAorCisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuZGVzYyA9IERSSVZFUl9ERVNDLAorCS5kYXRlID0gRFJJVkVSX0RBVEUsCisJLm1ham9yID0gRFJJVkVSX01BSk9SLAorCS5taW5vciA9IERSSVZFUl9NSU5PUiwKKwkucGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcmFkZW9uX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKaW5kZXggZDkyY2NlZS4uNDk4YjE5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKQEAgLTM4LDcgKzM4LDcgQEAKIAogI2RlZmluZSBEUklWRVJfTkFNRQkJInJhZGVvbiIKICNkZWZpbmUgRFJJVkVSX0RFU0MJCSJBVEkgUmFkZW9uIgotI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDUwOTExIgorI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDUxMjI5IgogCiAvKiBJbnRlcmZhY2UgaGlzdG9yeToKICAqCkBAIC03Myw3ICs3Myw3IEBACiAgKiAxLjExLSBBZGQgcGFja2V0IFIyMDBfRU1JVF9SQjNEX0JMRU5EQ09MT1IgdG8gc3VwcG9ydCBHTF9FWFRfYmxlbmRfY29sb3IKICAqICAgICAgIGFuZCBHTF9FWFRfYmxlbmRfW2Z1bmN8ZXF1YXRpb25dX3NlcGFyYXRlIG9uIHIyMDAKICAqIDEuMTItIEFkZCBSMzAwIENQIG1pY3JvY29kZSBzdXBwb3J0IC0gdGhpcyBqdXN0IGxvYWRzIHRoZSBDUCBvbiByMzAwCi0gKiAgICAgICAoTm8gM0Qgc3VwcG9ydCB5ZXQgLSBqdXN0IG1pY3JvY29kZSBsb2FkaW5nKQorICogICAgICAgKE5vIDNEIHN1cHBvcnQgeWV0IC0ganVzdCBtaWNyb2NvZGUgbG9hZGluZykuCiAgKiAxLjEzLSBBZGQgcGFja2V0IFIyMDBfRU1JVF9UQ0xfUE9JTlRfU1BSSVRFX0NOVEwgZm9yIEFSQl9wb2ludF9wYXJhbWV0ZXJzCiAgKiAgICAgLSBBZGQgaHlwZXJ6IHN1cHBvcnQsIGFkZCBoeXBlcnogZmxhZ3MgdG8gY2xlYXIgaW9jdGwuCiAgKiAxLjE0LSBBZGQgc3VwcG9ydCBmb3IgY29sb3IgdGlsaW5nCkBAIC04OCwxNCArODgsMTMgQEAKICAqICAgICAgIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl8wLTUsIDIgbW9yZSByZWdzKSBhbmQgUjIwMF9FTUlUX0FURl9URkFDVE9SCiAgKiAgICAgICAocmVwbGFjZXMgUjIwMF9FTUlUX1RGQUNUT1JfMCAoOCBjb25zdHMgaW5zdGVhZCBvZiA2KQogICogMS4xOS0gQWRkIHN1cHBvcnQgZm9yIGdhcnQgdGFibGUgaW4gRkIgbWVtb3J5IGFuZCBQQ0lFIHIzMDAKKyAqIDEuMjAtIEFkZCBzdXBwb3J0IGZvciByMzAwIHRleHJlY3QKKyAqIDEuMjEtIEFkZCBzdXBwb3J0IGZvciBjYXJkIHR5cGUgZ2V0cGFyYW0KICAqLwogI2RlZmluZSBEUklWRVJfTUFKT1IJCTEKLSNkZWZpbmUgRFJJVkVSX01JTk9SCQkxOQorI2RlZmluZSBEUklWRVJfTUlOT1IJCTIxCiAjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKIAotI2RlZmluZSBHRVRfUklOR19IRUFEKGRldl9wcml2KQkJRFJNX1JFQUQzMiggIChkZXZfcHJpdiktPnJpbmdfcnB0ciwgMCApCi0jZGVmaW5lIFNFVF9SSU5HX0hFQUQoZGV2X3ByaXYsdmFsKQlEUk1fV1JJVEUzMiggKGRldl9wcml2KS0+cmluZ19ycHRyLCAwLCAodmFsKSApCi0KIC8qCiAgKiBSYWRlb24gY2hpcCBmYW1pbGllcwogICovCkBAIC0xMDMsOCArMTAyLDggQEAKIAlDSElQX1IxMDAsCiAJQ0hJUF9SUzEwMCwKIAlDSElQX1JWMTAwLAotCUNISVBfUjIwMCwKIAlDSElQX1JWMjAwLAorCUNISVBfUjIwMCwKIAlDSElQX1JTMjAwLAogCUNISVBfUjI1MCwKIAlDSElQX1JTMjUwLApAQCAtMTM4LDYgKzEzNyw5IEBACiAJQ0hJUF9JU19QQ0lFID0gMHgwMDIwMDAwMFVMLAogfTsKIAorI2RlZmluZSBHRVRfUklOR19IRUFEKGRldl9wcml2KQkJRFJNX1JFQUQzMiggIChkZXZfcHJpdiktPnJpbmdfcnB0ciwgMCApCisjZGVmaW5lIFNFVF9SSU5HX0hFQUQoZGV2X3ByaXYsdmFsKQlEUk1fV1JJVEUzMiggKGRldl9wcml2KS0+cmluZ19ycHRyLCAwLCAodmFsKSApCisKIHR5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fZnJlZWxpc3QgewogCXVuc2lnbmVkIGludCBhZ2U7CiAJZHJtX2J1Zl90ICpidWY7CkBAIC0yNDUsOCArMjQ3LDYgQEAKIAogCWRybV9yYWRlb25fZGVwdGhfY2xlYXJfdCBkZXB0aF9jbGVhcjsKIAotCXVuc2lnbmVkIGxvbmcgZmJfb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbW1pb19vZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyByaW5nX29mZnNldDsKIAl1bnNpZ25lZCBsb25nIHJpbmdfcnB0cl9vZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKQEAgLTI3Myw3ICsyNzMsNiBAQAogCiAJLyogc3RhcnRpbmcgZnJvbSBoZXJlIG9uLCBkYXRhIGlzIHByZXNlcnZlZCBhY2Nyb3NzIGFuIG9wZW4gKi8KIAl1aW50MzJfdCBmbGFnczsJCS8qIHNlZSByYWRlb25fY2hpcF9mbGFncyAqLwotCWludCBpc19wY2k7CiB9IGRybV9yYWRlb25fcHJpdmF0ZV90OwogCiB0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2J1Zl9wcml2IHsKQEAgLTMzMCwxNyArMzI5LDE0IEBACiBleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CiBleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX29wZW5faGVscGVyKGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYpOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9mcmVlX2ZpbHBfcHJpdihkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJCSBkcm1fZmlsZV90ICogZmlscF9wcml2KTsKIAotZXh0ZXJuIGludCByYWRlb25fcHJlaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiBpbnQgcmFkZW9uX3Bvc3Rpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIGludCByYWRlb25fcG9zdGNsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci0KK2V4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl9maXJzdG9wZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfcG9zdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIGZpbHApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl9vcGVuKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdik7CiBleHRlcm4gbG9uZyByYWRlb25fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJCXVuc2lnbmVkIGxvbmcgYXJnKTsKIApAQCAtMzY0LDYgKzM2MCw4IEBACiAgKi8KIAogI2RlZmluZSBSQURFT05fQUdQX0NPTU1BTkQJCTB4MGY2MAorI2RlZmluZSBSQURFT05fQUdQX0NPTU1BTkRfUENJX0NPTkZJRyAgIDB4MDA2MAkvKiBvZmZzZXQgaW4gUENJIGNvbmZpZyAqLworIwlkZWZpbmUgUkFERU9OX0FHUF9FTkFCTEUJKDE8PDgpCiAjZGVmaW5lIFJBREVPTl9BVVhfU0NJU1NPUl9DTlRMCQkweDI2ZjAKICMJZGVmaW5lIFJBREVPTl9FWENMVVNJVkVfU0NJU1NPUl8wCSgxIDw8IDI0KQogIwlkZWZpbmUgUkFERU9OX0VYQ0xVU0lWRV9TQ0lTU09SXzEJKDEgPDwgMjUpCkBAIC02NTEsNiArNjQ5LDggQEAKIAogI2RlZmluZSBSQURFT05fV0FJVF9VTlRJTAkJMHgxNzIwCiAjCWRlZmluZSBSQURFT05fV0FJVF9DUlRDX1BGTElQCQkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX1dBSVRfMkRfSURMRQkJKDEgPDwgMTQpCisjCWRlZmluZSBSQURFT05fV0FJVF8zRF9JRExFCQkoMSA8PCAxNSkKICMJZGVmaW5lIFJBREVPTl9XQUlUXzJEX0lETEVDTEVBTgkJKDEgPDwgMTYpCiAjCWRlZmluZSBSQURFT05fV0FJVF8zRF9JRExFQ0xFQU4JCSgxIDw8IDE3KQogIwlkZWZpbmUgUkFERU9OX1dBSVRfSE9TVF9JRExFQ0xFQU4JKDEgPDwgMTgpCkBAIC0xMTA1LDcgKzExMDUsNiBAQAogCQl3cml0ZSA9IDA7CQkJCQlcCiAJCV90YWIgKz0gX2k7CQkJCQlcCiAJfQkJCQkJCQlcCi0JCQkJCQkJCVwKIAl3aGlsZSAoX3NpemUgPiAwKSB7CQkJCQlcCiAJCSoocmluZyArIHdyaXRlKSA9ICpfdGFiKys7CQkJXAogCQl3cml0ZSsrOwkJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKaW5kZXggMjMxYWMxNC4uN2JjMjc1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCkBAIC0xLDUgKzEsNSBAQAotLyogcmFkZW9uX3N0YXRlLmMgLS0gU3RhdGUgc3VwcG9ydCBmb3IgUmFkZW9uIC0qLSBsaW51eC1jIC0qLQotICoKKy8qIHJhZGVvbl9zdGF0ZS5jIC0tIFN0YXRlIHN1cHBvcnQgZm9yIFJhZGVvbiAtKi0gbGludXgtYyAtKi0gKi8KKy8qCiAgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBGcmVtb250LCBDYWxpZm9ybmlhLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCkBAIC03MiwxMCArNzIsNyBAQAogCiAJY2FzZSBSQURFT05fRU1JVF9QUF9NSVNDOgogCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwKLQkJCQkJCSAgJmRhdGFbKFJBREVPTl9SQjNEX0RFUFRIT0ZGU0VUCi0JCQkJCQkJIC0KLQkJCQkJCQkgUkFERU9OX1BQX01JU0MpIC8KLQkJCQkJCQk0XSkpIHsKKwkJICAgICZkYXRhWyhSQURFT05fUkIzRF9ERVBUSE9GRlNFVCAtIFJBREVPTl9QUF9NSVNDKSAvIDRdKSkgewogCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGRlcHRoIGJ1ZmZlciBvZmZzZXRcbiIpOwogCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAkJfQpAQCAtODMsMTAgKzgwLDcgQEAKIAogCWNhc2UgUkFERU9OX0VNSVRfUFBfQ05UTDoKIAkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsCi0JCQkJCQkgICZkYXRhWyhSQURFT05fUkIzRF9DT0xPUk9GRlNFVAotCQkJCQkJCSAtCi0JCQkJCQkJIFJBREVPTl9QUF9DTlRMKSAvCi0JCQkJCQkJNF0pKSB7CisJCSAgICAmZGF0YVsoUkFERU9OX1JCM0RfQ09MT1JPRkZTRVQgLSBSQURFT05fUFBfQ05UTCkgLyA0XSkpIHsKIAkJCURSTV9FUlJPUigiSW52YWxpZCBjb2xvdXIgYnVmZmVyIG9mZnNldFxuIik7CiAJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCQl9CkBAIC0xMDksMTAgKzEwMyw3IEBACiAJY2FzZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8xOgogCWNhc2UgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMjoKIAkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsCi0JCQkJCQkgICZkYXRhWyhSQURFT05fUFBfVFhPRkZTRVRfMAotCQkJCQkJCSAtCi0JCQkJCQkJIFJBREVPTl9QUF9UWEZJTFRFUl8wKSAvCi0JCQkJCQkJNF0pKSB7CisJCSAgICAmZGF0YVsoUkFERU9OX1BQX1RYT0ZGU0VUXzAgLSBSQURFT05fUFBfVFhGSUxURVJfMCkgLyA0XSkpIHsKIAkJCURSTV9FUlJPUigiSW52YWxpZCBSMTAwIHRleHR1cmUgb2Zmc2V0XG4iKTsKIAkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJCX0KQEAgLTEyNiw4ICsxMTcsOSBAQAogCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfNTp7CiAJCQlpbnQgaTsKIAkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQKLQkJCQkgICAgKGRldl9wcml2LCBmaWxwX3ByaXYsICZkYXRhW2ldKSkgeworCQkJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwKKwkJCQkJCQkJICBmaWxwX3ByaXYsCisJCQkJCQkJCSAgJmRhdGFbaV0pKSB7CiAJCQkJCURSTV9FUlJPUgogCQkJCQkgICAgKCJJbnZhbGlkIFIyMDAgY3ViaWMgdGV4dHVyZSBvZmZzZXRcbiIpOwogCQkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwpAQCAtMjM5LDggKzIzMSw5IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldDMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKgogCQkJCQkJICAgICBkZXZfcHJpdiwKLQkJCQkJCSAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKLQkJCQkJCSAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYsCisJCQkJCQkgICAgIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKKwkJCQkJCSAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICoKKwkJCQkJCSAgICAgY21kYnVmLAogCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgKmNtZHN6KQogewogCXUzMiAqY21kID0gKHUzMiAqKSBjbWRidWYtPmJ1ZjsKQEAgLTU1NSw3ICs1NDgsOCBAQAogCXtSMjAwX1BQX1RYT0ZGU0VUXzQsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzQifSwKIAl7UjIwMF9QUF9UWE9GRlNFVF81LCAxLCAiUjIwMF9QUF9UWE9GRlNFVF81In0sCiAJe1IyMDBfU0VfVlRFX0NOVEwsIDEsICJSMjAwX1NFX1ZURV9DTlRMIn0sCi0Je1IyMDBfU0VfVENMX09VVFBVVF9WVFhfQ09NUF9TRUwsIDEsICJSMjAwX1NFX1RDTF9PVVRQVVRfVlRYX0NPTVBfU0VMIn0sCisJe1IyMDBfU0VfVENMX09VVFBVVF9WVFhfQ09NUF9TRUwsIDEsCisJICJSMjAwX1NFX1RDTF9PVVRQVVRfVlRYX0NPTVBfU0VMIn0sCiAJe1IyMDBfUFBfVEFNX0RFQlVHMywgMSwgIlIyMDBfUFBfVEFNX0RFQlVHMyJ9LAogCXtSMjAwX1BQX0NOVExfWCwgMSwgIlIyMDBfUFBfQ05UTF9YIn0sCiAJe1IyMDBfUkIzRF9ERVBUSFhZX09GRlNFVCwgMSwgIlIyMDBfUkIzRF9ERVBUSFhZX09GRlNFVCJ9LApAQCAtNTY5LDcgKzU2Myw3IEBACiAJe1IyMDBfU0VfVENMX0lOUFVUX1ZUWF9WRUNUT1JfQUREUl8wLCA0LAogCQkgICAgIlIyMDBfU0VfVENMX0lOUFVUX1ZUWF9WRUNUT1JfQUREUl8wIn0sCiAJe1IyMDBfUFBfQ1VCSUNfRkFDRVNfMCwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMCJ9LAkvKiA2MSAqLwotCXtSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8wLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMCJ9LAkvKiA2MiAqLworCXtSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8wLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMCJ9LCAvKiA2MiAqLwogCXtSMjAwX1BQX0NVQklDX0ZBQ0VTXzEsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzEifSwKIAl7UjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMSwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzEifSwKIAl7UjIwMF9QUF9DVUJJQ19GQUNFU18yLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18yIn0sCkBAIC01OTIsNyArNTg2LDcgQEAKIAl7UkFERU9OX1BQX0NVQklDX0ZBQ0VTXzIsIDEsICJSQURFT05fUFBfQ1VCSUNfRkFDRVNfMiJ9LAogCXtSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QyXzAsIDUsICJSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QyXzAifSwKIAl7UjIwMF9QUF9UUklfUEVSRiwgMiwgIlIyMDBfUFBfVFJJX1BFUkYifSwKLQl7UjIwMF9QUF9BRlNfMCwgMzIsICJSMjAwX1BQX0FGU18wIn0sCS8qIDg1ICovCisJe1IyMDBfUFBfQUZTXzAsIDMyLCAiUjIwMF9QUF9BRlNfMCJ9LCAgICAgLyogODUgKi8KIAl7UjIwMF9QUF9BRlNfMSwgMzIsICJSMjAwX1BQX0FGU18xIn0sCiAJe1IyMDBfUFBfVEZBQ1RPUl8wLCA4LCAiUjIwMF9BVEZfVEZBQ1RPUiJ9LAogCXtSMjAwX1BQX1RYRklMVEVSXzAsIDgsICJSMjAwX1BQX1RYQ1RMQUxMXzAifSwKQEAgLTk4NSw4ICs5NzksOCBAQAogCSAqIHJlbmRlcmluZyBhIHF1YWQgaW50byBqdXN0IHRob3NlIGJ1ZmZlcnMuICBUaHVzLCB3ZSBoYXZlIHRvCiAJICogbWFrZSBzdXJlIHRoZSAzRCBlbmdpbmUgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkuCiAJICovCi0JaWYgKChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb24gPT0gVUNPREVfUjIwMCkgJiYKLQkgICAgKGZsYWdzICYgKFJBREVPTl9ERVBUSCB8IFJBREVPTl9TVEVOQ0lMKSkpIHsKKwllbHNlIGlmICgoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uID09IFVDT0RFX1IyMDApICYmCisJCShmbGFncyAmIChSQURFT05fREVQVEggfCBSQURFT05fU1RFTkNJTCkpKSB7CiAKIAkJaW50IHRlbXBQUF9DTlRMOwogCQlpbnQgdGVtcFJFX0NOVEw7CkBAIC0xNjM3LDYgKzE2MzEsMTQgQEAKIAkJICAgICh1MzIgKikgKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICsgYnVmLT5vZmZzZXQpOwogCQlkd29yZHMgPSBzaXplIC8gNDsKIAorI2RlZmluZSBSQURFT05fQ09QWV9NVChfYnVmLCBfZGF0YSwgX3dpZHRoKSBcCisJZG8geyBcCisJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoX2J1ZiwgX2RhdGEsIChfd2lkdGgpKSkge1wKKwkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsIChfd2lkdGgpKTsgXAorCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsgXAorCQl9IFwKKwl9IHdoaWxlKDApCisKIAkJaWYgKG1pY3JvdGlsZSkgewogCQkJLyogdGV4dHVyZSBtaWNybyB0aWxpbmcgaW4gdXNlLCBtaW5pbXVtIHRleHR1cmUgd2lkdGggaXMgdGh1cyAxNiBieXRlcy4KIAkJCSAgIGhvd2V2ZXIsIHdlIGNhbm5vdCB1c2UgYmxpdHRlciBkaXJlY3RseSBmb3IgdGV4dHVyZSB3aWR0aCA8IDY0IGJ5dGVzLApAQCAtMTY0OCw0NiArMTY1MCwxOSBAQAogCQkJICAgZnJvbSB1c2VyIHNwYWNlLiAqLwogCQkJaWYgKHRleC0+aGVpZ2h0ID09IDEpIHsKIAkJCQlpZiAodGV4X3dpZHRoID49IDY0IHx8IHRleF93aWR0aCA8PSAxNikgewotCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwKLQkJCQkJCQkgICAgICAgdGV4X3dpZHRoICoKLQkJCQkJCQkgICAgICAgc2l6ZW9mKHUzMikpKSB7Ci0JCQkJCQlEUk1fRVJST1IKLQkJCQkJCSAgICAoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAotCQkJCQkJICAgICB0ZXhfd2lkdGgpOwotCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKLQkJCQkJfQorCQkJCQlSQURFT05fQ09QWV9NVChidWZmZXIsIGRhdGEsCisJCQkJCQkoaW50KSh0ZXhfd2lkdGggKiBzaXplb2YodTMyKSkpOwogCQkJCX0gZWxzZSBpZiAodGV4X3dpZHRoID09IDMyKSB7Ci0JCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIKLQkJCQkJICAgIChidWZmZXIsIGRhdGEsIDE2KSkgewotCQkJCQkJRFJNX0VSUk9SCi0JCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKLQkJCQkJCSAgICAgdGV4X3dpZHRoKTsKLQkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7Ci0JCQkJCX0KLQkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgotCQkJCQkgICAgKGJ1ZmZlciArIDgsIGRhdGEgKyAxNiwgMTYpKSB7Ci0JCQkJCQlEUk1fRVJST1IKLQkJCQkJCSAgICAoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAotCQkJCQkJICAgICB0ZXhfd2lkdGgpOwotCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKLQkJCQkJfQorCQkJCQlSQURFT05fQ09QWV9NVChidWZmZXIsIGRhdGEsIDE2KTsKKwkJCQkJUkFERU9OX0NPUFlfTVQoYnVmZmVyICsgOCwKKwkJCQkJCSAgICAgICBkYXRhICsgMTYsIDE2KTsKIAkJCQl9CiAJCQl9IGVsc2UgaWYgKHRleF93aWR0aCA+PSA2NCB8fCB0ZXhfd2lkdGggPT0gMTYpIHsKLQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwKLQkJCQkJCSAgICAgICBkd29yZHMgKiBzaXplb2YodTMyKSkpIHsKLQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gZGF0YSwgJWQgZHdvcmRzXG4iLAotCQkJCQkJICBkd29yZHMpOwotCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwotCQkJCX0KKwkJCQlSQURFT05fQ09QWV9NVChidWZmZXIsIGRhdGEsCisJCQkJCSAgICAgICAoaW50KShkd29yZHMgKiBzaXplb2YodTMyKSkpOwogCQkJfSBlbHNlIGlmICh0ZXhfd2lkdGggPCAxNikgewogCQkJCWZvciAoaSA9IDA7IGkgPCB0ZXgtPmhlaWdodDsgaSsrKSB7Ci0JCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIKLQkJCQkJICAgIChidWZmZXIsIGRhdGEsIHRleF93aWR0aCkpIHsKLQkJCQkJCURSTV9FUlJPUgotCQkJCQkJICAgICgiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCi0JCQkJCQkgICAgIHRleF93aWR0aCk7Ci0JCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwotCQkJCQl9CisJCQkJCVJBREVPTl9DT1BZX01UKGJ1ZmZlciwgZGF0YSwgdGV4X3dpZHRoKTsKIAkJCQkJYnVmZmVyICs9IDQ7CiAJCQkJCWRhdGEgKz0gdGV4X3dpZHRoOwogCQkJCX0KQEAgLTE2OTUsMzcgKzE2NzAsMTMgQEAKIAkJCQkvKiBUT0RPOiBtYWtlIHN1cmUgdGhpcyB3b3JrcyB3aGVuIG5vdCBmaXR0aW5nIGluIG9uZSBidWZmZXIKIAkJCQkgICAoaS5lLiAzMmJ5dGVzIHggMjA0OC4uLikgKi8KIAkJCQlmb3IgKGkgPSAwOyBpIDwgdGV4LT5oZWlnaHQ7IGkgKz0gMikgewotCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSCi0JCQkJCSAgICAoYnVmZmVyLCBkYXRhLCAxNikpIHsKLQkJCQkJCURSTV9FUlJPUgotCQkJCQkJICAgICgiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCi0JCQkJCQkgICAgIHRleF93aWR0aCk7Ci0JCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwotCQkJCQl9CisJCQkJCVJBREVPTl9DT1BZX01UKGJ1ZmZlciwgZGF0YSwgMTYpOwogCQkJCQlkYXRhICs9IDE2OwotCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSCi0JCQkJCSAgICAoYnVmZmVyICsgOCwgZGF0YSwgMTYpKSB7Ci0JCQkJCQlEUk1fRVJST1IKLQkJCQkJCSAgICAoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAotCQkJCQkJICAgICB0ZXhfd2lkdGgpOwotCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKLQkJCQkJfQorCQkJCQlSQURFT05fQ09QWV9NVChidWZmZXIgKyA4LCBkYXRhLCAxNik7CiAJCQkJCWRhdGEgKz0gMTY7Ci0JCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIKLQkJCQkJICAgIChidWZmZXIgKyA0LCBkYXRhLCAxNikpIHsKLQkJCQkJCURSTV9FUlJPUgotCQkJCQkJICAgICgiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCi0JCQkJCQkgICAgIHRleF93aWR0aCk7Ci0JCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwotCQkJCQl9CisJCQkJCVJBREVPTl9DT1BZX01UKGJ1ZmZlciArIDQsIGRhdGEsIDE2KTsKIAkJCQkJZGF0YSArPSAxNjsKLQkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgotCQkJCQkgICAgKGJ1ZmZlciArIDEyLCBkYXRhLCAxNikpIHsKLQkJCQkJCURSTV9FUlJPUgotCQkJCQkJICAgICgiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCi0JCQkJCQkgICAgIHRleF93aWR0aCk7Ci0JCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwotCQkJCQl9CisJCQkJCVJBREVPTl9DT1BZX01UKGJ1ZmZlciArIDEyLCBkYXRhLCAxNik7CiAJCQkJCWRhdGEgKz0gMTY7CiAJCQkJCWJ1ZmZlciArPSAxNjsKIAkJCQl9CkBAIC0xNzM1LDMxICsxNjg2LDIyIEBACiAJCQkJLyogVGV4dHVyZSBpbWFnZSB3aWR0aCBpcyBsYXJnZXIgdGhhbiB0aGUgbWluaW11bSwgc28gd2UKIAkJCQkgKiBjYW4gdXBsb2FkIGl0IGRpcmVjdGx5LgogCQkJCSAqLwotCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLAotCQkJCQkJICAgICAgIGR3b3JkcyAqIHNpemVvZih1MzIpKSkgewotCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBkYXRhLCAlZCBkd29yZHNcbiIsCi0JCQkJCQkgIGR3b3Jkcyk7Ci0JCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7Ci0JCQkJfQorCQkJCVJBREVPTl9DT1BZX01UKGJ1ZmZlciwgZGF0YSwKKwkJCQkJICAgICAgIChpbnQpKGR3b3JkcyAqIHNpemVvZih1MzIpKSk7CiAJCQl9IGVsc2UgewogCQkJCS8qIFRleHR1cmUgaW1hZ2Ugd2lkdGggaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtLCBzbyB3ZQogCQkJCSAqIG5lZWQgdG8gcGFkIG91dCBlYWNoIGltYWdlIHNjYW5saW5lIHRvIHRoZSBtaW5pbXVtCiAJCQkJICogd2lkdGguCiAJCQkJICovCiAJCQkJZm9yIChpID0gMDsgaSA8IHRleC0+aGVpZ2h0OyBpKyspIHsKLQkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgotCQkJCQkgICAgKGJ1ZmZlciwgZGF0YSwgdGV4X3dpZHRoKSkgewotCQkJCQkJRFJNX0VSUk9SCi0JCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKLQkJCQkJCSAgICAgdGV4X3dpZHRoKTsKLQkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7Ci0JCQkJCX0KKwkJCQkJUkFERU9OX0NPUFlfTVQoYnVmZmVyLCBkYXRhLCB0ZXhfd2lkdGgpOwogCQkJCQlidWZmZXIgKz0gODsKIAkJCQkJZGF0YSArPSB0ZXhfd2lkdGg7CiAJCQkJfQogCQkJfQogCQl9CiAKKyN1bmRlZiBSQURFT05fQ09QWV9NVAogCQlidWYtPmZpbHAgPSBmaWxwOwogCQlidWYtPnVzZWQgPSBzaXplOwogCQlvZmZzZXQgPSBkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldCArIGJ1Zi0+b2Zmc2V0OwpAQCAtMTgyMSw3ICsxNzYzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgcmFkZW9uX2FwcGx5X3N1cmZhY2VfcmVncyhpbnQgc3VyZl9pbmRleCwKLQkJCQkgICAgICBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2KQorCQkJCSAgICAgIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlpZiAoIWRldl9wcml2LT5tbWlvKQogCQlyZXR1cm47CkBAIC0xODQ3LDggKzE3ODksOCBAQAogICogZnJlZWQsIHdlIHN1ZGRlbmx5IG5lZWQgdHdvIHN1cmZhY2VzIHRvIHN0b3JlIEEgYW5kIEMsIHdoaWNoIG1pZ2h0CiAgKiBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4KICAqLwotc3RhdGljIGludCBhbGxvY19zdXJmYWNlKGRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190ICogbmV3LAotCQkJIGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsIERSTUZJTEUgZmlscCkKK3N0YXRpYyBpbnQgYWxsb2Nfc3VyZmFjZShkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdCAqbmV3LAorCQkJIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwgRFJNRklMRSBmaWxwKQogewogCXN0cnVjdCByYWRlb25fdmlydF9zdXJmYWNlICpzOwogCWludCBpOwpAQCAtMjE1OCw2ICsyMTAwLDExIEBACiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKIAorCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKIAlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oZmlscF9wcml2LCBmaWxwKTsKIAogCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCh2ZXJ0ZXgsIChkcm1fcmFkZW9uX3ZlcnRleF90IF9fdXNlciAqKSBkYXRhLApAQCAtMjU5Niw5ICsyNTQzLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKK3N0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fZW1pdF9zY2FsYXJzKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKIAkJCQkJICBkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCi0JCQkJCSAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICogY21kYnVmKQorCQkJCQkgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmKQogewogCWludCBzeiA9IGhlYWRlci5zY2FsYXJzLmNvdW50OwogCWludCBzdGFydCA9IGhlYWRlci5zY2FsYXJzLm9mZnNldDsKQEAgLTI2MTgsOSArMjU2NSw5IEBACiAKIC8qIEdvZCB0aGlzIGlzIHVnbHkKICAqLwotc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMyKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfc2NhbGFyczIoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAogCQkJCQkgICBkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCi0JCQkJCSAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqIGNtZGJ1ZikKKwkJCQkJICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCiB7CiAJaW50IHN6ID0gaGVhZGVyLnNjYWxhcnMuY291bnQ7CiAJaW50IHN0YXJ0ID0gKCh1bnNpZ25lZCBpbnQpaGVhZGVyLnNjYWxhcnMub2Zmc2V0KSArIDB4MTAwOwpAQCAtMjYzOCw5ICsyNTg1LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3ZlY3RvcnMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKK3N0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fZW1pdF92ZWN0b3JzKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKIAkJCQkJICBkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCi0JCQkJCSAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICogY21kYnVmKQorCQkJCQkgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmKQogewogCWludCBzeiA9IGhlYWRlci52ZWN0b3JzLmNvdW50OwogCWludCBzdGFydCA9IGhlYWRlci52ZWN0b3JzLm9mZnNldDsKQEAgLTI2ODUsOCArMjYzMiw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0M19jbGlwcmVjdChkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJCWRybV9maWxlX3QgKiBmaWxwX3ByaXYsCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldDNfY2xpcHJlY3QoZHJtX2RldmljZV90ICpkZXYsCisJCQkJCWRybV9maWxlX3QgKmZpbHBfcHJpdiwKIAkJCQkJZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYsCiAJCQkJCWludCBvcmlnX25ib3gpCiB7CkBAIC0yODE4LDcgKzI3NjUsOCBAQAogCQlrYnVmID0gZHJtX2FsbG9jKGNtZGJ1Zi5idWZzeiwgRFJNX01FTV9EUklWRVIpOwogCQlpZiAoa2J1ZiA9PSBOVUxMKQogCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKLQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihrYnVmLCAodm9pZCBfX3VzZXIgKiljbWRidWYuYnVmLCBjbWRidWYuYnVmc3opKSB7CisJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoa2J1ZiwgKHZvaWQgX191c2VyICopY21kYnVmLmJ1ZiwKKwkJCQkgICAgICAgY21kYnVmLmJ1ZnN6KSkgewogCQkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOwogCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKIAkJfQpAQCAtMjk4MSw3ICsyOTI5LDcgQEAKIAkJdmFsdWUgPSBkZXZfcHJpdi0+Z2FydF92bV9zdGFydDsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fUEFSQU1fUkVHSVNURVJfSEFORExFOgotCQl2YWx1ZSA9IGRldl9wcml2LT5tbWlvX29mZnNldDsKKwkJdmFsdWUgPSBkZXZfcHJpdi0+bW1pby0+b2Zmc2V0OwogCQlicmVhazsKIAljYXNlIFJBREVPTl9QQVJBTV9TVEFUVVNfSEFORExFOgogCQl2YWx1ZSA9IGRldl9wcml2LT5yaW5nX3JwdHJfb2Zmc2V0OwpAQCAtMzAwNCw2ICsyOTUyLDE1IEBACiAJY2FzZSBSQURFT05fUEFSQU1fR0FSVF9URVhfSEFORExFOgogCQl2YWx1ZSA9IGRldl9wcml2LT5nYXJ0X3RleHR1cmVzX29mZnNldDsKIAkJYnJlYWs7CisJCisJY2FzZSBSQURFT05fUEFSQU1fQ0FSRF9UWVBFOgorCQlpZiAoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19QQ0lFKQorCQkJdmFsdWUgPSBSQURFT05fQ0FSRF9QQ0lFOworCQllbHNlIGlmIChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0lTX0FHUCkKKwkJCXZhbHVlID0gUkFERU9OX0NBUkRfQUdQOworCQllbHNlCisJCQl2YWx1ZSA9IFJBREVPTl9DQVJEX1BDSTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CkBAIC0zMDY2LDEwICszMDIzLDExIEBACiAvKiBXaGVuIGEgY2xpZW50IGRpZXM6CiAgKiAgICAtIENoZWNrIGZvciBhbmQgY2xlYW4gdXAgZmxpcHBlZCBwYWdlIHN0YXRlCiAgKiAgICAtIEZyZWUgYW55IGFsbG9jZWQgR0FSVCBtZW1vcnkuCisgKiAgICAtIEZyZWUgYW55IGFsbG9jZWQgcmFkZW9uIHN1cmZhY2VzLgogICoKICAqIERSTSBpbmZyYXN0cnVjdHVyZSB0YWtlcyBjYXJlIG9mIHJlY2xhaW1pbmcgZG1hIGJ1ZmZlcnMuCiAgKi8KLXZvaWQgcmFkZW9uX2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQordm9pZCByYWRlb25fZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0zMDgyLDE2ICszMDQwLDE3IEBACiAJfQogfQogCi12b2lkIHJhZGVvbl9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KQordm9pZCByYWRlb25fZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCiB7CiAJcmFkZW9uX2RvX3JlbGVhc2UoZGV2KTsKIH0KIAotaW50IHJhZGVvbl9kcml2ZXJfb3Blbl9oZWxwZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogZmlscF9wcml2KQoraW50IHJhZGVvbl9kcml2ZXJfb3Blbihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBmaWxwX3ByaXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKnJhZGVvbl9wcml2OwogCisJRFJNX0RFQlVHKCJcbiIpOwogCXJhZGVvbl9wcml2ID0KIAkgICAgKHN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqKQogCSAgICBkcm1fYWxsb2Moc2l6ZW9mKCpyYWRlb25fcHJpdiksIERSTV9NRU1fRklMRVMpOwpAQCAtMzEwMCw2ICszMDU5LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlmaWxwX3ByaXYtPmRyaXZlcl9wcml2ID0gcmFkZW9uX3ByaXY7CisKIAlpZiAoZGV2X3ByaXYpCiAJCXJhZGVvbl9wcml2LT5yYWRlb25fZmJfZGVsdGEgPSBkZXZfcHJpdi0+ZmJfbG9jYXRpb247CiAJZWxzZQpAQCAtMzEwNyw3ICszMDY3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCByYWRlb25fZHJpdmVyX2ZyZWVfZmlscF9wcml2KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdikKK3ZvaWQgcmFkZW9uX2RyaXZlcl9wb3N0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogZmlscF9wcml2KQogewogCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXYgPQogCSAgICBmaWxwX3ByaXYtPmRyaXZlcl9wcml2OwpAQCAtMzExNiwzMyArMzA3NiwzMyBAQAogfQogCiBkcm1faW9jdGxfZGVzY190IHJhZGVvbl9pb2N0bHNbXSA9IHsKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfSU5JVCldID0ge3JhZGVvbl9jcF9pbml0LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfU1RBUlQpXSA9IHtyYWRlb25fY3Bfc3RhcnQsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9TVE9QKV0gPSB7cmFkZW9uX2NwX3N0b3AsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9SRVNFVCldID0ge3JhZGVvbl9jcF9yZXNldCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX0lETEUpXSA9IHtyYWRlb25fY3BfaWRsZSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1JFU1VNRSldID0ge3JhZGVvbl9jcF9yZXN1bWUsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9SRVNFVCldID0ge3JhZGVvbl9lbmdpbmVfcmVzZXQsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9GVUxMU0NSRUVOKV0gPSB7cmFkZW9uX2Z1bGxzY3JlZW4sIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TV0FQKV0gPSB7cmFkZW9uX2NwX3N3YXAsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DTEVBUildID0ge3JhZGVvbl9jcF9jbGVhciwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1ZFUlRFWCldID0ge3JhZGVvbl9jcF92ZXJ0ZXgsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTkRJQ0VTKV0gPSB7cmFkZW9uX2NwX2luZGljZXMsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9URVhUVVJFKV0gPSB7cmFkZW9uX2NwX3RleHR1cmUsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TVElQUExFKV0gPSB7cmFkZW9uX2NwX3N0aXBwbGUsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTkRJUkVDVCldID0ge3JhZGVvbl9jcF9pbmRpcmVjdCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1ZFUlRFWDIpXSA9IHtyYWRlb25fY3BfdmVydGV4MiwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NNREJVRildID0ge3JhZGVvbl9jcF9jbWRidWYsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9HRVRQQVJBTSldID0ge3JhZGVvbl9jcF9nZXRwYXJhbSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZMSVApXSA9IHtyYWRlb25fY3BfZmxpcCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0FMTE9DKV0gPSB7cmFkZW9uX21lbV9hbGxvYywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZSRUUpXSA9IHtyYWRlb25fbWVtX2ZyZWUsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTklUX0hFQVApXSA9IHtyYWRlb25fbWVtX2luaXRfaGVhcCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lSUV9FTUlUKV0gPSB7cmFkZW9uX2lycV9lbWl0LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSVJRX1dBSVQpXSA9IHtyYWRlb25faXJxX3dhaXQsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TRVRQQVJBTSldID0ge3JhZGVvbl9jcF9zZXRwYXJhbSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NVUkZfQUxMT0MpXSA9IHtyYWRlb25fc3VyZmFjZV9hbGxvYywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NVUkZfRlJFRSldID0ge3JhZGVvbl9zdXJmYWNlX2ZyZWUsIDEsIDB9CisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX0lOSVQpXSA9IHtyYWRlb25fY3BfaW5pdCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfU1RBUlQpXSA9IHtyYWRlb25fY3Bfc3RhcnQsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1NUT1ApXSA9IHtyYWRlb25fY3Bfc3RvcCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfUkVTRVQpXSA9IHtyYWRlb25fY3BfcmVzZXQsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX0lETEUpXSA9IHtyYWRlb25fY3BfaWRsZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9SRVNVTUUpXSA9IHtyYWRlb25fY3BfcmVzdW1lLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1JFU0VUKV0gPSB7cmFkZW9uX2VuZ2luZV9yZXNldCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9GVUxMU0NSRUVOKV0gPSB7cmFkZW9uX2Z1bGxzY3JlZW4sIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1dBUCldID0ge3JhZGVvbl9jcF9zd2FwLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NMRUFSKV0gPSB7cmFkZW9uX2NwX2NsZWFyLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1ZFUlRFWCldID0ge3JhZGVvbl9jcF92ZXJ0ZXgsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSU5ESUNFUyldID0ge3JhZGVvbl9jcF9pbmRpY2VzLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1RFWFRVUkUpXSA9IHtyYWRlb25fY3BfdGV4dHVyZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TVElQUExFKV0gPSB7cmFkZW9uX2NwX3N0aXBwbGUsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSU5ESVJFQ1QpXSA9IHtyYWRlb25fY3BfaW5kaXJlY3QsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1ZFUlRFWDIpXSA9IHtyYWRlb25fY3BfdmVydGV4MiwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DTURCVUYpXSA9IHtyYWRlb25fY3BfY21kYnVmLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0dFVFBBUkFNKV0gPSB7cmFkZW9uX2NwX2dldHBhcmFtLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZMSVApXSA9IHtyYWRlb25fY3BfZmxpcCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9BTExPQyldID0ge3JhZGVvbl9tZW1fYWxsb2MsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRlJFRSldID0ge3JhZGVvbl9tZW1fZnJlZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTklUX0hFQVApXSA9IHtyYWRlb25fbWVtX2luaXRfaGVhcCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSVJRX0VNSVQpXSA9IHtyYWRlb25faXJxX2VtaXQsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSVJRX1dBSVQpXSA9IHtyYWRlb25faXJxX3dhaXQsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU0VUUEFSQU0pXSA9IHtyYWRlb25fY3Bfc2V0cGFyYW0sIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1VSRl9BTExPQyldID0ge3JhZGVvbl9zdXJmYWNlX2FsbG9jLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NVUkZfRlJFRSldID0ge3JhZGVvbl9zdXJmYWNlX2ZyZWUsIERSTV9BVVRIfQogfTsKIAogaW50IHJhZGVvbl9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShyYWRlb25faW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2JjaS5jIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMKaW5kZXggNmQxMDUxNS4uMGQ0MjZkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMKQEAgLTUzMywyMyArNTMzLDkgQEAKIAlkZXZfcHJpdi0+Zmlyc3RfZG1hX3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9kbWFfcGFnZSA9IDA7CiB9CiAKLS8qCi0gKiBJbml0YWxpemUgbWFwcGluZ3MuIE9uIFNhdmFnZTQgYW5kIFNhdmFnZUlYIHRoZSBhbGlnbm1lbnQKLSAqIGFuZCBzaXplIG9mIHRoZSBhcGVydHVyZSBpcyBub3Qgc3VpdGFibGUgZm9yIGF1dG9tYXRpYyBNVFJSIHNldHVwCi0gKiBpbiBkcm1fYWRkbWFwLiBUaGVyZWZvcmUgd2UgZG8gaXQgbWFudWFsbHkgYmVmb3JlIHRoZSBtYXBzIGFyZQotICogaW5pdGlhbGl6ZWQuIFdlIGFsc28gbmVlZCB0byB0YWtlIGNhcmUgb2YgZGVsZXRpbmcgdGhlIE1UUlJzIGluCi0gKiBwb3N0Y2xlYW51cC4KLSAqLwotaW50IHNhdmFnZV9wcmVpbml0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQoraW50IHNhdmFnZV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQogewogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdjsKLQl1bnNpZ25lZCBsb25nIG1taW9fYmFzZSwgZmJfYmFzZSwgZmJfc2l6ZSwgYXBlcnR1cmVfYmFzZTsKLQkvKiBmYl9yc3JjIGFuZCBhcGVyX3JzcmMgYXJlbid0IHJlYWxseSB1c2VkIGN1cnJlbnRseSwgYnV0IHN0aWxsIGV4aXN0Ci0JICogaW4gY2FzZSB3ZSBkZWNpZGUgd2UgbmVlZCBpbmZvcm1hdGlvbiBvbiB0aGUgQkFSIGZvciBCU0QgaW4gdGhlCi0JICogZnV0dXJlLgotCSAqLwotCXVuc2lnbmVkIGludCBmYl9yc3JjLCBhcGVyX3JzcmM7Ci0JaW50IHJldCA9IDA7CiAKIAlkZXZfcHJpdiA9IGRybV9hbGxvYyhzaXplb2YoZHJtX3NhdmFnZV9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUik7CiAJaWYgKGRldl9wcml2ID09IE5VTEwpCkBAIC01NTcsOCArNTQzLDMwIEBACiAKIAltZW1zZXQoZGV2X3ByaXYsIDAsIHNpemVvZihkcm1fc2F2YWdlX3ByaXZhdGVfdCkpOwogCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCiAJZGV2X3ByaXYtPmNoaXBzZXQgPSAoZW51bSBzYXZhZ2VfZmFtaWx5KWNoaXBzZXQ7CiAKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogSW5pdGFsaXplIG1hcHBpbmdzLiBPbiBTYXZhZ2U0IGFuZCBTYXZhZ2VJWCB0aGUgYWxpZ25tZW50CisgKiBhbmQgc2l6ZSBvZiB0aGUgYXBlcnR1cmUgaXMgbm90IHN1aXRhYmxlIGZvciBhdXRvbWF0aWMgTVRSUiBzZXR1cAorICogaW4gZHJtX2FkZG1hcC4gVGhlcmVmb3JlIHdlIGFkZCB0aGVtIG1hbnVhbGx5IGJlZm9yZSB0aGUgbWFwcyBhcmUKKyAqIGluaXRpYWxpemVkLCBhbmQgdGVhciB0aGVtIGRvd24gb24gbGFzdCBjbG9zZS4KKyAqLworaW50IHNhdmFnZV9kcml2ZXJfZmlyc3RvcGVuKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBtbWlvX2Jhc2UsIGZiX2Jhc2UsIGZiX3NpemUsIGFwZXJ0dXJlX2Jhc2U7CisJLyogZmJfcnNyYyBhbmQgYXBlcl9yc3JjIGFyZW4ndCByZWFsbHkgdXNlZCBjdXJyZW50bHksIGJ1dCBzdGlsbCBleGlzdAorCSAqIGluIGNhc2Ugd2UgZGVjaWRlIHdlIG5lZWQgaW5mb3JtYXRpb24gb24gdGhlIEJBUiBmb3IgQlNEIGluIHRoZQorCSAqIGZ1dHVyZS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgZmJfcnNyYywgYXBlcl9yc3JjOworCWludCByZXQgPSAwOworCiAJZGV2X3ByaXYtPm10cnJbMF0uaGFuZGxlID0gLTE7CiAJZGV2X3ByaXYtPm10cnJbMV0uaGFuZGxlID0gLTE7CiAJZGV2X3ByaXYtPm10cnJbMl0uaGFuZGxlID0gLTE7CkBAIC01NzYsMjYgKzU4NCwyNCBAQAogCQkJZGV2X3ByaXYtPm10cnJbMF0uYmFzZSA9IGZiX2Jhc2U7CiAJCQlkZXZfcHJpdi0+bXRyclswXS5zaXplID0gMHgwMTAwMDAwMDsKIAkJCWRldl9wcml2LT5tdHJyWzBdLmhhbmRsZSA9Ci0JCQkgICAgbXRycl9hZGQoZGV2X3ByaXYtPm10cnJbMF0uYmFzZSwKLQkJCQkgICAgIGRldl9wcml2LT5tdHJyWzBdLnNpemUsIE1UUlJfVFlQRV9XUkNPTUIsCi0JCQkJICAgICAxKTsKKwkJCSAgICBkcm1fbXRycl9hZGQoZGV2X3ByaXYtPm10cnJbMF0uYmFzZSwKKwkJCQkgICAgICAgICBkZXZfcHJpdi0+bXRyclswXS5zaXplLCBEUk1fTVRSUl9XQyk7CiAJCQlkZXZfcHJpdi0+bXRyclsxXS5iYXNlID0gZmJfYmFzZSArIDB4MDIwMDAwMDA7CiAJCQlkZXZfcHJpdi0+bXRyclsxXS5zaXplID0gMHgwMjAwMDAwMDsKIAkJCWRldl9wcml2LT5tdHJyWzFdLmhhbmRsZSA9Ci0JCQkgICAgbXRycl9hZGQoZGV2X3ByaXYtPm10cnJbMV0uYmFzZSwKLQkJCQkgICAgIGRldl9wcml2LT5tdHJyWzFdLnNpemUsIE1UUlJfVFlQRV9XUkNPTUIsCi0JCQkJICAgICAxKTsKKwkJCSAgICBkcm1fbXRycl9hZGQoZGV2X3ByaXYtPm10cnJbMV0uYmFzZSwKKwkJCQkJIGRldl9wcml2LT5tdHJyWzFdLnNpemUsIERSTV9NVFJSX1dDKTsKIAkJCWRldl9wcml2LT5tdHJyWzJdLmJhc2UgPSBmYl9iYXNlICsgMHgwNDAwMDAwMDsKIAkJCWRldl9wcml2LT5tdHJyWzJdLnNpemUgPSAweDA0MDAwMDAwOwogCQkJZGV2X3ByaXYtPm10cnJbMl0uaGFuZGxlID0KLQkJCSAgICBtdHJyX2FkZChkZXZfcHJpdi0+bXRyclsyXS5iYXNlLAotCQkJCSAgICAgZGV2X3ByaXYtPm10cnJbMl0uc2l6ZSwgTVRSUl9UWVBFX1dSQ09NQiwKLQkJCQkgICAgIDEpOworCQkJICAgIGRybV9tdHJyX2FkZChkZXZfcHJpdi0+bXRyclsyXS5iYXNlLAorCQkJCQkgZGV2X3ByaXYtPm10cnJbMl0uc2l6ZSwgRFJNX01UUlJfV0MpOwogCQl9IGVsc2UgewogCQkJRFJNX0VSUk9SKCJzdHJhbmdlIHBjaV9yZXNvdXJjZV9sZW4gJTA4bHhcbiIsCiAJCQkJICBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDApKTsKIAkJfQotCX0gZWxzZSBpZiAoY2hpcHNldCAhPSBTM19TVVBFUlNBVkFHRSAmJiBjaGlwc2V0ICE9IFMzX1NBVkFHRTIwMDApIHsKKwl9IGVsc2UgaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IFMzX1NVUEVSU0FWQUdFICYmCisJCSAgIGRldl9wcml2LT5jaGlwc2V0ICE9IFMzX1NBVkFHRTIwMDApIHsKIAkJbW1pb19iYXNlID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChkZXYsIDApOwogCQlmYl9yc3JjID0gMTsKIAkJZmJfYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKTsKQEAgLTYwOSw5ICs2MTUsOCBAQAogCQkJZGV2X3ByaXYtPm10cnJbMF0uYmFzZSA9IGZiX2Jhc2U7CiAJCQlkZXZfcHJpdi0+bXRyclswXS5zaXplID0gMHgwODAwMDAwMDsKIAkJCWRldl9wcml2LT5tdHJyWzBdLmhhbmRsZSA9Ci0JCQkgICAgbXRycl9hZGQoZGV2X3ByaXYtPm10cnJbMF0uYmFzZSwKLQkJCQkgICAgIGRldl9wcml2LT5tdHJyWzBdLnNpemUsIE1UUlJfVFlQRV9XUkNPTUIsCi0JCQkJICAgICAxKTsKKwkJCSAgICBkcm1fbXRycl9hZGQoZGV2X3ByaXYtPm10cnJbMF0uYmFzZSwKKwkJCQkJIGRldl9wcml2LT5tdHJyWzBdLnNpemUsIERSTV9NVFJSX1dDKTsKIAkJfSBlbHNlIHsKIAkJCURSTV9FUlJPUigic3RyYW5nZSBwY2lfcmVzb3VyY2VfbGVuICUwOGx4XG4iLAogCQkJCSAgZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAxKSk7CkBAIC02NDgsMTYgKzY1MywyMSBAQAogLyoKICAqIERlbGV0ZSBNVFJScyBhbmQgZnJlZSBkZXZpY2UtcHJpdmF0ZSBkYXRhLgogICovCi1pbnQgc2F2YWdlX3Bvc3RjbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgc2F2YWdlX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICpkZXYpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpCiAJCWlmIChkZXZfcHJpdi0+bXRycltpXS5oYW5kbGUgPj0gMCkKLQkJCW10cnJfZGVsKGRldl9wcml2LT5tdHJyW2ldLmhhbmRsZSwKKwkJCWRybV9tdHJyX2RlbChkZXZfcHJpdi0+bXRycltpXS5oYW5kbGUsCiAJCQkJIGRldl9wcml2LT5tdHJyW2ldLmJhc2UsCi0JCQkJIGRldl9wcml2LT5tdHJyW2ldLnNpemUpOworCQkJCSBkZXZfcHJpdi0+bXRycltpXS5zaXplLCBEUk1fTVRSUl9XQyk7Cit9CisKK2ludCBzYXZhZ2VfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJZHJtX2ZyZWUoZGV2X3ByaXYsIHNpemVvZihkcm1fc2F2YWdlX3ByaXZhdGVfdCksIERSTV9NRU1fRFJJVkVSKTsKIApAQCAtOTk0LDggKzEwMDQsNyBAQAogICogRE1BIGJ1ZmZlciBtYW5hZ2VtZW50CiAgKi8KIAotc3RhdGljIGludCBzYXZhZ2VfYmNpX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgZHJtX2RldmljZV90ICogZGV2LAotCQkJCSAgZHJtX2RtYV90ICogZCkKK3N0YXRpYyBpbnQgc2F2YWdlX2JjaV9nZXRfYnVmZmVycyhEUk1GSUxFIGZpbHAsIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZG1hX3QgKmQpCiB7CiAJZHJtX2J1Zl90ICpidWY7CiAJaW50IGk7CkBAIC0xMDU3LDcgKzEwNjYsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgc2F2YWdlX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgc2F2YWdlX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKQogewogCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMDkwLDEwICsxMDk5LDEwIEBACiB9CiAKIGRybV9pb2N0bF9kZXNjX3Qgc2F2YWdlX2lvY3Rsc1tdID0gewotCVtEUk1fSU9DVExfTlIoRFJNX1NBVkFHRV9CQ0lfSU5JVCldID0ge3NhdmFnZV9iY2lfaW5pdCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fU0FWQUdFX0JDSV9DTURCVUYpXSA9IHtzYXZhZ2VfYmNpX2NtZGJ1ZiwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fU0FWQUdFX0JDSV9FVkVOVF9FTUlUKV0gPSB7c2F2YWdlX2JjaV9ldmVudF9lbWl0LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9TQVZBR0VfQkNJX0VWRU5UX1dBSVQpXSA9IHtzYXZhZ2VfYmNpX2V2ZW50X3dhaXQsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NBVkFHRV9CQ0lfSU5JVCldID0ge3NhdmFnZV9iY2lfaW5pdCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9TQVZBR0VfQkNJX0NNREJVRildID0ge3NhdmFnZV9iY2lfY21kYnVmLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0FWQUdFX0JDSV9FVkVOVF9FTUlUKV0gPSB7c2F2YWdlX2JjaV9ldmVudF9lbWl0LCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0FWQUdFX0JDSV9FVkVOVF9XQUlUKV0gPSB7c2F2YWdlX2JjaV9ldmVudF93YWl0LCBEUk1fQVVUSH0sCiB9OwogCiBpbnQgc2F2YWdlX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKHNhdmFnZV9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuYwppbmRleCAyMmQ3OTljLi5hYTZjMGQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuYwpAQCAtMzAsMzEgKzMwLDYgQEAKIAogI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKIAotc3RhdGljIGludCBwb3N0aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCi0JCSBEUklWRVJfTkFNRSwKLQkJIERSSVZFUl9NQUpPUiwKLQkJIERSSVZFUl9NSU5PUiwKLQkJIERSSVZFUl9QQVRDSExFVkVMLAotCQkgRFJJVkVSX0RBVEUsIGRldi0+cHJpbWFyeS5taW5vciwgcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKLQkgICAgKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZXJzaW9uKGRybV92ZXJzaW9uX3QgKiB2ZXJzaW9uKQotewotCWludCBsZW47Ci0KLQl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOwotCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7Ci0JRFJNX0NPUFkodmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFKTsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKIAlzYXZhZ2VfUENJX0lEUwogfTsKQEAgLTYzLDEzICszOCwxMyBAQAogCS5kcml2ZXJfZmVhdHVyZXMgPQogCSAgICBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8IERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9QQ0lfRE1BLAogCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9zYXZhZ2VfYnVmX3ByaXZfdCksCi0JLnByZWluaXQgPSBzYXZhZ2VfcHJlaW5pdCwKLQkucG9zdGluaXQgPSBwb3N0aW5pdCwKLQkucG9zdGNsZWFudXAgPSBzYXZhZ2VfcG9zdGNsZWFudXAsCisJLmxvYWQgPSBzYXZhZ2VfZHJpdmVyX2xvYWQsCisJLmZpcnN0b3BlbiA9IHNhdmFnZV9kcml2ZXJfZmlyc3RvcGVuLAorCS5sYXN0Y2xvc2UgPSBzYXZhZ2VfZHJpdmVyX2xhc3RjbG9zZSwKKwkudW5sb2FkID0gc2F2YWdlX2RyaXZlcl91bmxvYWQsCiAJLnJlY2xhaW1fYnVmZmVycyA9IHNhdmFnZV9yZWNsYWltX2J1ZmZlcnMsCiAJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCiAJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCi0JLnZlcnNpb24gPSB2ZXJzaW9uLAogCS5pb2N0bHMgPSBzYXZhZ2VfaW9jdGxzLAogCS5kbWFfaW9jdGwgPSBzYXZhZ2VfYmNpX2J1ZmZlcnMsCiAJLmZvcHMgPSB7CkBAIC04MCwxMiArNTUsMTkgQEAKIAkJIC5tbWFwID0gZHJtX21tYXAsCiAJCSAucG9sbCA9IGRybV9wb2xsLAogCQkgLmZhc3luYyA9IGRybV9mYXN5bmMsCi0JCSB9Ci0JLAorCX0sCisKIAkucGNpX2RyaXZlciA9IHsKLQkJICAgICAgIC5uYW1lID0gRFJJVkVSX05BTUUsCi0JCSAgICAgICAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCi0JCSAgICAgICB9CisJCSAubmFtZSA9IERSSVZFUl9OQU1FLAorCQkgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAorCX0sCisKKwkubmFtZSA9IERSSVZFUl9OQU1FLAorCS5kZXNjID0gRFJJVkVSX0RFU0MsCisJLmRhdGUgPSBEUklWRVJfREFURSwKKwkubWFqb3IgPSBEUklWRVJfTUFKT1IsCisJLm1pbm9yID0gRFJJVkVSX01JTk9SLAorCS5wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUwsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzYXZhZ2VfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuaAppbmRleCBhNGIwZmE5Li5kZDQ2Y2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuaApAQCAtMSw1ICsxLDUgQEAKLS8qIHNhdmFnZV9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgdGhlIHNhdmFnZSBkcml2ZXIKLSAqCisvKiBzYXZhZ2VfZHJ2LmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIHRoZSBzYXZhZ2UgZHJpdmVyICovCisvKgogICogQ29weXJpZ2h0IDIwMDQgIEZlbGl4IEt1ZWhsaW5nCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKQEAgLTE5Miw3ICsxOTIsNyBAQAogCS8qIEVyciwgdGhlcmUgaXMgYSBtYWNybyB3YWl0X2V2ZW50IGluIGluY2x1ZGUvbGludXgvd2FpdC5oLgogCSAqIEF2b2lkIHVud2FudGVkIG1hY3JvIGV4cGFuc2lvbi4gKi8KIAl2b2lkICgqZW1pdF9jbGlwX3JlY3QpIChzdHJ1Y3QgZHJtX3NhdmFnZV9wcml2YXRlICogZGV2X3ByaXYsCi0JCQkJZHJtX2NsaXBfcmVjdF90ICogcGJveCk7CisJCQkJY29uc3QgZHJtX2NsaXBfcmVjdF90ICogcGJveCk7CiAJdm9pZCAoKmRtYV9mbHVzaCkgKHN0cnVjdCBkcm1fc2F2YWdlX3ByaXZhdGUgKiBkZXZfcHJpdik7CiB9IGRybV9zYXZhZ2VfcHJpdmF0ZV90OwogCkBAIC0yMDgsMTYgKzIwOCwxOCBAQAogZXh0ZXJuIHZvaWQgc2F2YWdlX2RtYV93YWl0KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsIHVuc2lnbmVkIGludCBwYWdlKTsKIGV4dGVybiB1aW50MzJfdCAqc2F2YWdlX2RtYV9hbGxvYyhkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJCSAgdW5zaWduZWQgaW50IG4pOwotZXh0ZXJuIGludCBzYXZhZ2VfcHJlaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCk7Ci1leHRlcm4gaW50IHNhdmFnZV9wb3N0Y2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCBzYXZhZ2VfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCk7CitleHRlcm4gaW50IHNhdmFnZV9kcml2ZXJfZmlyc3RvcGVuKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkIHNhdmFnZV9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiBpbnQgc2F2YWdlX2RyaXZlcl91bmxvYWQoZHJtX2RldmljZV90ICpkZXYpOwogZXh0ZXJuIGludCBzYXZhZ2VfZG9fY2xlYW51cF9iY2koZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiB2b2lkIHNhdmFnZV9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOwogCiAvKiBzdGF0ZSBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIHNhdmFnZV9lbWl0X2NsaXBfcmVjdF9zM2QoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkgICAgICBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KTsKKwkJCQkgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KTsKIGV4dGVybiB2b2lkIHNhdmFnZV9lbWl0X2NsaXBfcmVjdF9zNChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCSAgICAgZHJtX2NsaXBfcmVjdF90ICogcGJveCk7CisJCQkJICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KTsKIAogI2RlZmluZSBTQVZBR0VfRkJfU0laRV9TMwkweDAxMDAwMDAwCS8qICAxNk1CICovCiAjZGVmaW5lIFNBVkFHRV9GQl9TSVpFX1M0CTB4MDIwMDAwMDAJLyogIDMyTUIgKi8KQEAgLTUwMCwxNSArNTAyLDYgQEAKIAogI2RlZmluZSBCQ0lfV1JJVEUoIHZhbCApICpiY2lfcHRyKysgPSAodWludDMyX3QpKHZhbCkKIAotI2RlZmluZSBCQ0lfQ09QWV9GUk9NX1VTRVIoc3JjLG4pIGRvIHsJCQkJXAotICAgIHVuc2lnbmVkIGludCBpOwkJCQkJCVwKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CQkJCQlcCi0JdWludDMyX3QgdmFsOwkJCQkJCVwKLQlEUk1fR0VUX1VTRVJfVU5DSEVDS0VEKHZhbCwgJigodWludDMyX3QqKShzcmMpKVtpXSk7CVwKLQlCQ0lfV1JJVEUodmFsKTsJCQkJCQlcCi0gICAgfQkJCQkJCQkJXAotfSB3aGlsZSgwKQotCiAvKgogICogY29tbWFuZCBETUEgc3VwcG9ydAogICovCkBAIC01MzQsOCArNTI3LDggQEAKIAogI2RlZmluZSBETUFfV1JJVEUoIHZhbCApICpkbWFfcHRyKysgPSAodWludDMyX3QpKHZhbCkKIAotI2RlZmluZSBETUFfQ09QWV9GUk9NX1VTRVIoc3JjLG4pIGRvIHsJCQkJXAotCURSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoZG1hX3B0ciwgKHNyYyksIChuKSo0KTsJXAorI2RlZmluZSBETUFfQ09QWShzcmMsIG4pIGRvIHsJCQkJCVwKKwltZW1jcHkoZG1hX3B0ciwgKHNyYyksIChuKSo0KTsJCQkJXAogCWRtYV9wdHIgKz0gbjsJCQkJCQlcCiB9IHdoaWxlKDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jCmluZGV4IGU4N2E1ZDUuLmVmMjU4MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2Vfc3RhdGUuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgInNhdmFnZV9kcnYuaCIKIAogdm9pZCBzYXZhZ2VfZW1pdF9jbGlwX3JlY3RfczNkKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkgICAgICAgZHJtX2NsaXBfcmVjdF90ICogcGJveCkKKwkJCSAgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KQogewogCXVpbnQzMl90IHNjc3RhcnQgPSBkZXZfcHJpdi0+c3RhdGUuczNkLm5ld19zY3N0YXJ0OwogCXVpbnQzMl90IHNjZW5kID0gZGV2X3ByaXYtPnN0YXRlLnMzZC5uZXdfc2NlbmQ7CkBAIC01Myw3ICs1Myw3IEBACiB9CiAKIHZvaWQgc2F2YWdlX2VtaXRfY2xpcF9yZWN0X3M0KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkgICAgICBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KQorCQkJICAgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICogcGJveCkKIHsKIAl1aW50MzJfdCBkcmF3Y3RybDAgPSBkZXZfcHJpdi0+c3RhdGUuczQubmV3X2RyYXdjdHJsMDsKIAl1aW50MzJfdCBkcmF3Y3RybDEgPSBkZXZfcHJpdi0+c3RhdGUuczQubmV3X2RyYXdjdHJsMTsKQEAgLTExNSwxOCArMTE1LDE5IEBACiAKICNkZWZpbmUgU0FWRV9TVEFURShyZWcsd2hlcmUpCQkJXAogCWlmKHN0YXJ0IDw9IHJlZyAmJiBzdGFydCtjb3VudCA+IHJlZykJXAotCQlEUk1fR0VUX1VTRVJfVU5DSEVDS0VEKGRldl9wcml2LT5zdGF0ZS53aGVyZSwgJnJlZ3NbcmVnLXN0YXJ0XSkKKwkJZGV2X3ByaXYtPnN0YXRlLndoZXJlID0gcmVnc1tyZWcgLSBzdGFydF0KICNkZWZpbmUgU0FWRV9TVEFURV9NQVNLKHJlZyx3aGVyZSxtYXNrKSBkbyB7CQkJXAogCWlmKHN0YXJ0IDw9IHJlZyAmJiBzdGFydCtjb3VudCA+IHJlZykgewkJCVwKIAkJdWludDMyX3QgdG1wOwkJCQkJXAotCQlEUk1fR0VUX1VTRVJfVU5DSEVDS0VEKHRtcCwgJnJlZ3NbcmVnLXN0YXJ0XSk7CVwKKwkJdG1wID0gcmVnc1tyZWcgLSBzdGFydF07CQkJXAogCQlkZXZfcHJpdi0+c3RhdGUud2hlcmUgPSAodG1wICYgKG1hc2spKSB8CVwKIAkJCShkZXZfcHJpdi0+c3RhdGUud2hlcmUgJiB+KG1hc2spKTsJXAogCX0JCQkJCQkJXAogfSB3aGlsZSAoMCkKKwogc3RhdGljIGludCBzYXZhZ2VfdmVyaWZ5X3N0YXRlX3MzZChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJCSAgIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGNvdW50LAotCQkJCSAgIGNvbnN0IHVpbnQzMl90IF9fdXNlciAqIHJlZ3MpCisJCQkJICAgY29uc3QgdWludDMyX3QgKnJlZ3MpCiB7CiAJaWYgKHN0YXJ0IDwgU0FWQUdFX1RFWFBBTEFERFJfUzNEIHx8CiAJICAgIHN0YXJ0ICsgY291bnQgLSAxID4gU0FWQUdFX0RFU1RURVhSV1dBVEVSTUFSS19TM0QpIHsKQEAgLTE0OCw4ICsxNDksNyBAQAogCQlTQVZFX1NUQVRFKFNBVkFHRV9URVhBRERSX1MzRCwgczNkLnRleGFkZHIpOwogCQlpZiAoZGV2X3ByaXYtPnN0YXRlLnMzZC50ZXhjdHJsICYgU0FWQUdFX1RFWENUUkxfVEVYRU5fTUFTSykKIAkJCXJldHVybiBzYXZhZ2VfdmVyaWZ5X3RleGFkZHIoZGV2X3ByaXYsIDAsCi0JCQkJCQkgICAgIGRldl9wcml2LT5zdGF0ZS5zM2QuCi0JCQkJCQkgICAgIHRleGFkZHIpOworCQkJCQkJZGV2X3ByaXYtPnN0YXRlLnMzZC50ZXhhZGRyKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCiBzdGF0aWMgaW50IHNhdmFnZV92ZXJpZnlfc3RhdGVfczQoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCQkgIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGNvdW50LAotCQkJCSAgY29uc3QgdWludDMyX3QgX191c2VyICogcmVncykKKwkJCQkgIGNvbnN0IHVpbnQzMl90ICpyZWdzKQogewogCWludCByZXQgPSAwOwogCkBAIC0xNzQsMTkgKzE3NCwxOCBAQAogCQkJflNBVkFHRV9TQ0lTU09SX01BU0tfUzQpOwogCiAJLyogaWYgYW55IHRleHR1cmUgcmVncyB3ZXJlIGNoYW5nZWQgLi4uICovCi0JaWYgKHN0YXJ0IDw9IFNBVkFHRV9URVhERVNDUl9TNCAmJiBzdGFydCArIGNvdW50ID4gU0FWQUdFX1RFWFBBTEFERFJfUzQpIHsKKwlpZiAoc3RhcnQgPD0gU0FWQUdFX1RFWERFU0NSX1M0ICYmCisJICAgIHN0YXJ0ICsgY291bnQgPiBTQVZBR0VfVEVYUEFMQUREUl9TNCkgewogCQkvKiAuLi4gY2hlY2sgdGV4dHVyZSBzdGF0ZSAqLwogCQlTQVZFX1NUQVRFKFNBVkFHRV9URVhERVNDUl9TNCwgczQudGV4ZGVzY3IpOwogCQlTQVZFX1NUQVRFKFNBVkFHRV9URVhBRERSMF9TNCwgczQudGV4YWRkcjApOwogCQlTQVZFX1NUQVRFKFNBVkFHRV9URVhBRERSMV9TNCwgczQudGV4YWRkcjEpOwogCQlpZiAoZGV2X3ByaXYtPnN0YXRlLnM0LnRleGRlc2NyICYgU0FWQUdFX1RFWERFU0NSX1RFWDBFTl9NQVNLKQotCQkJcmV0IHw9Ci0JCQkgICAgc2F2YWdlX3ZlcmlmeV90ZXhhZGRyKGRldl9wcml2LCAwLAotCQkJCQkJICBkZXZfcHJpdi0+c3RhdGUuczQudGV4YWRkcjApOworCQkJcmV0IHw9IHNhdmFnZV92ZXJpZnlfdGV4YWRkcihkZXZfcHJpdiwgMCwKKwkJCQkJCWRldl9wcml2LT5zdGF0ZS5zNC50ZXhhZGRyMCk7CiAJCWlmIChkZXZfcHJpdi0+c3RhdGUuczQudGV4ZGVzY3IgJiBTQVZBR0VfVEVYREVTQ1JfVEVYMUVOX01BU0spCi0JCQlyZXQgfD0KLQkJCSAgICBzYXZhZ2VfdmVyaWZ5X3RleGFkZHIoZGV2X3ByaXYsIDEsCi0JCQkJCQkgIGRldl9wcml2LT5zdGF0ZS5zNC50ZXhhZGRyMSk7CisJCQlyZXQgfD0gc2F2YWdlX3ZlcmlmeV90ZXhhZGRyKGRldl9wcml2LCAxLAorCQkJCQkJZGV2X3ByaXYtPnN0YXRlLnM0LnRleGFkZHIxKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTk3LDcgKzE5Niw3IEBACiAKIHN0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX3N0YXRlKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICogY21kX2hlYWRlciwKLQkJCQkgY29uc3QgdWludDMyX3QgX191c2VyICogcmVncykKKwkJCQkgY29uc3QgdWludDMyX3QgKnJlZ3MpCiB7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gY21kX2hlYWRlci0+c3RhdGUuY291bnQ7CiAJdW5zaWduZWQgaW50IHN0YXJ0ID0gY21kX2hlYWRlci0+c3RhdGUuc3RhcnQ7CkBAIC0yMDksOSArMjA4LDYgQEAKIAlpZiAoIWNvdW50KQogCQlyZXR1cm4gMDsKIAotCWlmIChEUk1fVkVSSUZZQVJFQV9SRUFEKHJlZ3MsIGNvdW50ICogNCkpCi0JCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7Ci0KIAlpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSkgewogCQlyZXQgPSBzYXZhZ2VfdmVyaWZ5X3N0YXRlX3MzZChkZXZfcHJpdiwgc3RhcnQsIGNvdW50LCByZWdzKTsKIAkJaWYgKHJldCAhPSAwKQpAQCAtMjM2LDggKzIzMiw4IEBACiAJCS8qIHNjaXNzb3IgcmVncyBhcmUgZW1pdHRlZCBpbiBzYXZhZ2VfZGlzcGF0Y2hfZHJhdyAqLwogCQlpZiAoc3RhcnQgPCBTQVZBR0VfRFJBV0NUUkwwX1M0KSB7CiAJCQlpZiAoc3RhcnQgKyBjb3VudCA+IFNBVkFHRV9EUkFXQ1RSTDFfUzQgKyAxKQotCQkJCWNvdW50MiA9Ci0JCQkJICAgIGNvdW50IC0gKFNBVkFHRV9EUkFXQ1RSTDFfUzQgKyAxIC0gc3RhcnQpOworCQkJCWNvdW50MiA9IGNvdW50IC0KKwkJCQkJIChTQVZBR0VfRFJBV0NUUkwxX1M0ICsgMSAtIHN0YXJ0KTsKIAkJCWlmIChzdGFydCArIGNvdW50ID4gU0FWQUdFX0RSQVdDVFJMMF9TNCkKIAkJCQljb3VudCA9IFNBVkFHRV9EUkFXQ1RSTDBfUzQgLSBzdGFydDsKIAkJfSBlbHNlIGlmIChzdGFydCA8PSBTQVZBR0VfRFJBV0NUUkwxX1M0KSB7CkBAIC0yNjMsNyArMjU5LDcgQEAKIAkJd2hpbGUgKGNvdW50ID4gMCkgewogCQkJdW5zaWduZWQgaW50IG4gPSBjb3VudCA8IDI1NSA/IGNvdW50IDogMjU1OwogCQkJRE1BX1NFVF9SRUdJU1RFUlMoc3RhcnQsIG4pOwotCQkJRE1BX0NPUFlfRlJPTV9VU0VSKHJlZ3MsIG4pOworCQkJRE1BX0NPUFkocmVncywgbik7CiAJCQljb3VudCAtPSBuOwogCQkJc3RhcnQgKz0gbjsKIAkJCXJlZ3MgKz0gbjsKQEAgLTQyMSw4ICs0MTcsOCBAQAogCiBzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF92Yl9wcmltKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJICAgY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKiBjbWRfaGVhZGVyLAotCQkJCSAgIGNvbnN0IHVpbnQzMl90IF9fdXNlciAqIHZ0eGJ1ZiwKLQkJCQkgICB1bnNpZ25lZCBpbnQgdmJfc2l6ZSwgdW5zaWduZWQgaW50IHZiX3N0cmlkZSkKKwkJCQkgICBjb25zdCB1aW50MzJfdCAqdnR4YnVmLCB1bnNpZ25lZCBpbnQgdmJfc2l6ZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdmJfc3RyaWRlKQogewogCXVuc2lnbmVkIGNoYXIgcmVvcmRlciA9IDA7CiAJdW5zaWduZWQgaW50IHByaW0gPSBjbWRfaGVhZGVyLT5wcmltLnByaW07CkBAIC01MDcsOCArNTAzLDcgQEAKIAogCQkJZm9yIChpID0gc3RhcnQ7IGkgPCBzdGFydCArIGNvdW50OyArK2kpIHsKIAkJCQl1bnNpZ25lZCBpbnQgaiA9IGkgKyByZW9yZGVyW2kgJSAzXTsKLQkJCQlETUFfQ09QWV9GUk9NX1VTRVIoJnZ0eGJ1Zlt2Yl9zdHJpZGUgKiBqXSwKLQkJCQkJCSAgIHZ0eF9zaXplKTsKKwkJCQlETUFfQ09QWSgmdnR4YnVmW3ZiX3N0cmlkZSAqIGpdLCB2dHhfc2l6ZSk7CiAJCQl9CiAKIAkJCURNQV9DT01NSVQoKTsKQEAgLTUxNywxMyArNTEyLDEyIEBACiAJCQlETUFfRFJBV19QUklNSVRJVkUoY291bnQsIHByaW0sIHNraXApOwogCiAJCQlpZiAodmJfc3RyaWRlID09IHZ0eF9zaXplKSB7Ci0JCQkJRE1BX0NPUFlfRlJPTV9VU0VSKCZ2dHhidWZbdmJfc3RyaWRlICogc3RhcnRdLAotCQkJCQkJICAgdnR4X3NpemUgKiBjb3VudCk7CisJCQkJRE1BX0NPUFkoJnZ0eGJ1Zlt2Yl9zdHJpZGUgKiBzdGFydF0sIAorCQkJCQkgdnR4X3NpemUgKiBjb3VudCk7CiAJCQl9IGVsc2UgewogCQkJCWZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgKytpKSB7Ci0JCQkJCURNQV9DT1BZX0ZST01fVVNFUigmdnR4YnVmCi0JCQkJCQkJICAgW3ZiX3N0cmlkZSAqIGldLAotCQkJCQkJCSAgIHZ0eF9zaXplKTsKKwkJCQkJRE1BX0NPUFkoJnZ0eGJ1ZiBbdmJfc3RyaWRlICogaV0sCisJCQkJCQkgdnR4X3NpemUpOwogCQkJCX0KIAkJCX0KIApAQCAtNTQxLDcgKzUzNSw3IEBACiAKIHN0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX2RtYV9pZHgoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCQkgICBjb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqIGNtZF9oZWFkZXIsCi0JCQkJICAgY29uc3QgdWludDE2X3QgX191c2VyICogdXNyX2lkeCwKKwkJCQkgICBjb25zdCB1aW50MTZfdCAqaWR4LAogCQkJCSAgIGNvbnN0IGRybV9idWZfdCAqIGRtYWJ1ZikKIHsKIAl1bnNpZ25lZCBjaGFyIHJlb3JkZXIgPSAwOwpAQCAtNjI4LDExICs2MjIsOCBAQAogCXdoaWxlIChuICE9IDApIHsKIAkJLyogQ2FuIGVtaXQgdXAgdG8gMjU1IGluZGljZXMgKDg1IHRyaWFuZ2xlcykgYXQgb25jZS4gKi8KIAkJdW5zaWduZWQgaW50IGNvdW50ID0gbiA+IDI1NSA/IDI1NSA6IG47Ci0JCS8qIElzIGl0IG9rIHRvIGFsbG9jYXRlIDUxMCBieXRlcyBvbiB0aGUgc3RhY2sgaW4gYW4gaW9jdGw/ICovCi0JCXVpbnQxNl90IGlkeFsyNTVdOwogCi0JCS8qIENvcHkgYW5kIGNoZWNrIGluZGljZXMgKi8KLQkJRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRChpZHgsIHVzcl9pZHgsIGNvdW50ICogMik7CisJCS8qIGNoZWNrIGluZGljZXMgKi8KIAkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKIAkJCWlmIChpZHhbaV0gPiBkbWFidWYtPnRvdGFsIC8gMzIpIHsKIAkJCQlEUk1fRVJST1IoImlkeFsldV09JXUgb3V0IG9mIHJhbmdlICgwLSV1KVxuIiwKQEAgLTY1Miw4ICs2NDMsOCBAQAogCiAJCQlmb3IgKGkgPSAxOyBpICsgMSA8IGNvdW50OyBpICs9IDIpCiAJCQkJQkNJX1dSSVRFKGlkeFtpICsgcmVvcmRlcltpICUgM11dIHwKLQkJCQkJICAoaWR4W2kgKyAxICsgcmVvcmRlclsoaSArIDEpICUgM11dIDw8Ci0JCQkJCSAgIDE2KSk7CisJCQkJCSAgKGlkeFtpICsgMSArCisJCQkJCSAgIHJlb3JkZXJbKGkgKyAxKSAlIDNdXSA8PCAxNikpOwogCQkJaWYgKGkgPCBjb3VudCkKIAkJCQlCQ0lfV1JJVEUoaWR4W2kgKyByZW9yZGVyW2kgJSAzXV0pOwogCQl9IGVsc2UgaWYgKFMzX1NBVkFHRTNEX1NFUklFUyhkZXZfcHJpdi0+Y2hpcHNldCkpIHsKQEAgLTY3NCw3ICs2NjUsNyBAQAogCQkJCUJDSV9XUklURShpZHhbaV0pOwogCQl9CiAKLQkJdXNyX2lkeCArPSBjb3VudDsKKwkJaWR4ICs9IGNvdW50OwogCQluIC09IGNvdW50OwogCiAJCXByaW0gfD0gQkNJX0NNRF9EUkFXX0NPTlQ7CkBAIC02ODUsOCArNjc2LDggQEAKIAogc3RhdGljIGludCBzYXZhZ2VfZGlzcGF0Y2hfdmJfaWR4KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJICBjb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqIGNtZF9oZWFkZXIsCi0JCQkJICBjb25zdCB1aW50MTZfdCBfX3VzZXIgKiB1c3JfaWR4LAotCQkJCSAgY29uc3QgdWludDMyX3QgX191c2VyICogdnR4YnVmLAorCQkJCSAgY29uc3QgdWludDE2X3QgKmlkeCwKKwkJCQkgIGNvbnN0IHVpbnQzMl90ICp2dHhidWYsCiAJCQkJICB1bnNpZ25lZCBpbnQgdmJfc2l6ZSwgdW5zaWduZWQgaW50IHZiX3N0cmlkZSkKIHsKIAl1bnNpZ25lZCBjaGFyIHJlb3JkZXIgPSAwOwpAQCAtNzUxLDExICs3NDIsOCBAQAogCXdoaWxlIChuICE9IDApIHsKIAkJLyogQ2FuIGVtaXQgdXAgdG8gMjU1IHZlcnRpY2VzICg4NSB0cmlhbmdsZXMpIGF0IG9uY2UuICovCiAJCXVuc2lnbmVkIGludCBjb3VudCA9IG4gPiAyNTUgPyAyNTUgOiBuOwotCQkvKiBJcyBpdCBvayB0byBhbGxvY2F0ZSA1MTAgYnl0ZXMgb24gdGhlIHN0YWNrIGluIGFuIGlvY3RsPyAqLwotCQl1aW50MTZfdCBpZHhbMjU1XTsKLQotCQkvKiBDb3B5IGFuZCBjaGVjayBpbmRpY2VzICovCi0JCURSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoaWR4LCB1c3JfaWR4LCBjb3VudCAqIDIpOworCQkKKwkJLyogQ2hlY2sgaW5kaWNlcyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogCQkJaWYgKGlkeFtpXSA+IHZiX3NpemUgLyAodmJfc3RyaWRlICogNCkpIHsKIAkJCQlEUk1fRVJST1IoImlkeFsldV09JXUgb3V0IG9mIHJhbmdlICgwLSV1KVxuIiwKQEAgLTc3NSw4ICs3NjMsNyBAQAogCiAJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogCQkJCXVuc2lnbmVkIGludCBqID0gaWR4W2kgKyByZW9yZGVyW2kgJSAzXV07Ci0JCQkJRE1BX0NPUFlfRlJPTV9VU0VSKCZ2dHhidWZbdmJfc3RyaWRlICogal0sCi0JCQkJCQkgICB2dHhfc2l6ZSk7CisJCQkJRE1BX0NPUFkoJnZ0eGJ1Zlt2Yl9zdHJpZGUgKiBqXSwgdnR4X3NpemUpOwogCQkJfQogCiAJCQlETUFfQ09NTUlUKCk7CkBAIC03ODYsMTQgKzc3MywxMyBAQAogCiAJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogCQkJCXVuc2lnbmVkIGludCBqID0gaWR4W2ldOwotCQkJCURNQV9DT1BZX0ZST01fVVNFUigmdnR4YnVmW3ZiX3N0cmlkZSAqIGpdLAotCQkJCQkJICAgdnR4X3NpemUpOworCQkJCURNQV9DT1BZKCZ2dHhidWZbdmJfc3RyaWRlICogal0sIHZ0eF9zaXplKTsKIAkJCX0KIAogCQkJRE1BX0NPTU1JVCgpOwogCQl9CiAKLQkJdXNyX2lkeCArPSBjb3VudDsKKwkJaWR4ICs9IGNvdW50OwogCQluIC09IGNvdW50OwogCiAJCXByaW0gfD0gQkNJX0NNRF9EUkFXX0NPTlQ7CkBAIC04MDQsMTEgKzc5MCwxMSBAQAogCiBzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF9jbGVhcihkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJCSBjb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqIGNtZF9oZWFkZXIsCi0JCQkJIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90IF9fdXNlciAqIGRhdGEsCisJCQkJIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpkYXRhLAogCQkJCSB1bnNpZ25lZCBpbnQgbmJveCwKLQkJCQkgY29uc3QgZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqIHVzcl9ib3hlcykKKwkJCQkgY29uc3QgZHJtX2NsaXBfcmVjdF90ICpib3hlcykKIHsKLQl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjbWRfaGVhZGVyLT5jbGVhcjAuZmxhZ3MsIG1hc2ssIHZhbHVlOworCXVuc2lnbmVkIGludCBmbGFncyA9IGNtZF9oZWFkZXItPmNsZWFyMC5mbGFnczsKIAl1bnNpZ25lZCBpbnQgY2xlYXJfY21kOwogCXVuc2lnbmVkIGludCBpLCBuYnVmczsKIAlETUFfTE9DQUxTOwpAQCAtODE2LDkgKzgwMiw2IEBACiAJaWYgKG5ib3ggPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlEUk1fR0VUX1VTRVJfVU5DSEVDS0VEKG1hc2ssICZkYXRhLT5jbGVhcjEubWFzayk7Ci0JRFJNX0dFVF9VU0VSX1VOQ0hFQ0tFRCh2YWx1ZSwgJmRhdGEtPmNsZWFyMS52YWx1ZSk7Ci0KIAljbGVhcl9jbWQgPSBCQ0lfQ01EX1JFQ1QgfCBCQ0lfQ01EX1JFQ1RfWFAgfCBCQ0lfQ01EX1JFQ1RfWVAgfAogCSAgICBCQ0lfQ01EX1NFTkRfQ09MT1IgfCBCQ0lfQ01EX0RFU1RfUEJEX05FVzsKIAlCQ0lfQ01EX1NFVF9ST1AoY2xlYXJfY21kLCAweENDKTsKQEAgLTgyOCwyMSArODExLDE5IEBACiAJaWYgKG5idWZzID09IDApCiAJCXJldHVybiAwOwogCi0JaWYgKG1hc2sgIT0gMHhmZmZmZmZmZikgeworCWlmIChkYXRhLT5jbGVhcjEubWFzayAhPSAweGZmZmZmZmZmKSB7CiAJCS8qIHNldCBtYXNrICovCiAJCUJFR0lOX0RNQSgyKTsKIAkJRE1BX1NFVF9SRUdJU1RFUlMoU0FWQUdFX0JJVFBMQU5FV1RNQVNLLCAxKTsKLQkJRE1BX1dSSVRFKG1hc2spOworCQlETUFfV1JJVEUoZGF0YS0+Y2xlYXIxLm1hc2spOwogCQlETUFfQ09NTUlUKCk7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBuYm94OyArK2kpIHsKLQkJZHJtX2NsaXBfcmVjdF90IGJveDsKIAkJdW5zaWduZWQgaW50IHgsIHksIHcsIGg7CiAJCXVuc2lnbmVkIGludCBidWY7Ci0JCURSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoJmJveCwgJnVzcl9ib3hlc1tpXSwgc2l6ZW9mKGJveCkpOwotCQl4ID0gYm94LngxLCB5ID0gYm94LnkxOwotCQl3ID0gYm94LngyIC0gYm94LngxOwotCQloID0gYm94LnkyIC0gYm94LnkxOworCQl4ID0gYm94ZXNbaV0ueDEsIHkgPSBib3hlc1tpXS55MTsKKwkJdyA9IGJveGVzW2ldLngyIC0gYm94ZXNbaV0ueDE7CisJCWggPSBib3hlc1tpXS55MiAtIGJveGVzW2ldLnkxOwogCQlCRUdJTl9ETUEobmJ1ZnMgKiA2KTsKIAkJZm9yIChidWYgPSBTQVZBR0VfRlJPTlQ7IGJ1ZiA8PSBTQVZBR0VfREVQVEg7IGJ1ZiA8PD0gMSkgewogCQkJaWYgKCEoZmxhZ3MgJiBidWYpKQpAQCAtODYyLDEzICs4NDMsMTMgQEAKIAkJCQlETUFfV1JJVEUoZGV2X3ByaXYtPmRlcHRoX2JkKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCURNQV9XUklURSh2YWx1ZSk7CisJCQlETUFfV1JJVEUoZGF0YS0+Y2xlYXIxLnZhbHVlKTsKIAkJCURNQV9XUklURShCQ0lfWF9ZKHgsIHkpKTsKIAkJCURNQV9XUklURShCQ0lfV19IKHcsIGgpKTsKIAkJfQogCQlETUFfQ09NTUlUKCk7CiAJfQotCWlmIChtYXNrICE9IDB4ZmZmZmZmZmYpIHsKKwlpZiAoZGF0YS0+Y2xlYXIxLm1hc2sgIT0gMHhmZmZmZmZmZikgewogCQkvKiByZXNldCBtYXNrICovCiAJCUJFR0lOX0RNQSgyKTsKIAkJRE1BX1NFVF9SRUdJU1RFUlMoU0FWQUdFX0JJVFBMQU5FV1RNQVNLLCAxKTsKQEAgLTg4MCw4ICs4NjEsNyBAQAogfQogCiBzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF9zd2FwKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJdW5zaWduZWQgaW50IG5ib3gsCi0JCQkJY29uc3QgZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqIHVzcl9ib3hlcykKKwkJCQl1bnNpZ25lZCBpbnQgbmJveCwgY29uc3QgZHJtX2NsaXBfcmVjdF90ICpib3hlcykKIHsKIAl1bnNpZ25lZCBpbnQgc3dhcF9jbWQ7CiAJdW5zaWduZWQgaW50IGk7CkBAIC04OTUsMTYgKzg3NSwxNCBAQAogCUJDSV9DTURfU0VUX1JPUChzd2FwX2NtZCwgMHhDQyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbmJveDsgKytpKSB7Ci0JCWRybV9jbGlwX3JlY3RfdCBib3g7Ci0JCURSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoJmJveCwgJnVzcl9ib3hlc1tpXSwgc2l6ZW9mKGJveCkpOwotCiAJCUJFR0lOX0RNQSg2KTsKIAkJRE1BX1dSSVRFKHN3YXBfY21kKTsKIAkJRE1BX1dSSVRFKGRldl9wcml2LT5iYWNrX29mZnNldCk7CiAJCURNQV9XUklURShkZXZfcHJpdi0+YmFja19iZCk7Ci0JCURNQV9XUklURShCQ0lfWF9ZKGJveC54MSwgYm94LnkxKSk7Ci0JCURNQV9XUklURShCQ0lfWF9ZKGJveC54MSwgYm94LnkxKSk7Ci0JCURNQV9XUklURShCQ0lfV19IKGJveC54MiAtIGJveC54MSwgYm94LnkyIC0gYm94LnkxKSk7CisJCURNQV9XUklURShCQ0lfWF9ZKGJveGVzW2ldLngxLCBib3hlc1tpXS55MSkpOworCQlETUFfV1JJVEUoQkNJX1hfWShib3hlc1tpXS54MSwgYm94ZXNbaV0ueTEpKTsKKwkJRE1BX1dSSVRFKEJDSV9XX0goYm94ZXNbaV0ueDIgLSBib3hlc1tpXS54MSwKKwkJCQkgIGJveGVzW2ldLnkyIC0gYm94ZXNbaV0ueTEpKTsKIAkJRE1BX0NPTU1JVCgpOwogCX0KIApAQCAtOTEyLDY4ICs4OTAsNTIgQEAKIH0KIAogc3RhdGljIGludCBzYXZhZ2VfZGlzcGF0Y2hfZHJhdyhkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCWNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90IF9fdXNlciAqIHN0YXJ0LAotCQkJCWNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90IF9fdXNlciAqIGVuZCwKKwkJCQljb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqc3RhcnQsCisJCQkJY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmVuZCwKIAkJCQljb25zdCBkcm1fYnVmX3QgKiBkbWFidWYsCi0JCQkJY29uc3QgdW5zaWduZWQgaW50IF9fdXNlciAqIHVzcl92dHhidWYsCisJCQkJY29uc3QgdW5zaWduZWQgaW50ICp2dHhidWYsCiAJCQkJdW5zaWduZWQgaW50IHZiX3NpemUsIHVuc2lnbmVkIGludCB2Yl9zdHJpZGUsCiAJCQkJdW5zaWduZWQgaW50IG5ib3gsCi0JCQkJY29uc3QgZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqIHVzcl9ib3hlcykKKwkJCQljb25zdCBkcm1fY2xpcF9yZWN0X3QgKmJveGVzKQogewogCXVuc2lnbmVkIGludCBpLCBqOwogCWludCByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbmJveDsgKytpKSB7Ci0JCWRybV9jbGlwX3JlY3RfdCBib3g7Ci0JCWNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90IF9fdXNlciAqdXNyX2NtZGJ1ZjsKLQkJRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRCgmYm94LCAmdXNyX2JveGVzW2ldLCBzaXplb2YoYm94KSk7Ci0JCWRldl9wcml2LT5lbWl0X2NsaXBfcmVjdChkZXZfcHJpdiwgJmJveCk7CisJCWNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpjbWRidWY7CisJCWRldl9wcml2LT5lbWl0X2NsaXBfcmVjdChkZXZfcHJpdiwgJmJveGVzW2ldKTsKIAotCQl1c3JfY21kYnVmID0gc3RhcnQ7Ci0JCXdoaWxlICh1c3JfY21kYnVmIDwgZW5kKSB7CisJCWNtZGJ1ZiA9IHN0YXJ0OworCQl3aGlsZSAoY21kYnVmIDwgZW5kKSB7CiAJCQlkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCBjbWRfaGVhZGVyOwotCQkJRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRCgmY21kX2hlYWRlciwgdXNyX2NtZGJ1ZiwKLQkJCQkJCSAgICAgc2l6ZW9mKGNtZF9oZWFkZXIpKTsKLQkJCXVzcl9jbWRidWYrKzsKKwkJCWNtZF9oZWFkZXIgPSAqY21kYnVmOworCQkJY21kYnVmKys7CiAJCQlzd2l0Y2ggKGNtZF9oZWFkZXIuY21kLmNtZCkgewogCQkJY2FzZSBTQVZBR0VfQ01EX0RNQV9QUklNOgotCQkJCXJldCA9Ci0JCQkJICAgIHNhdmFnZV9kaXNwYXRjaF9kbWFfcHJpbShkZXZfcHJpdiwKLQkJCQkJCQkgICAgICZjbWRfaGVhZGVyLAotCQkJCQkJCSAgICAgZG1hYnVmKTsKKwkJCQlyZXQgPSBzYXZhZ2VfZGlzcGF0Y2hfZG1hX3ByaW0oCisJCQkJCWRldl9wcml2LCAmY21kX2hlYWRlciwgZG1hYnVmKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgU0FWQUdFX0NNRF9WQl9QUklNOgotCQkJCXJldCA9Ci0JCQkJICAgIHNhdmFnZV9kaXNwYXRjaF92Yl9wcmltKGRldl9wcml2LAotCQkJCQkJCSAgICAmY21kX2hlYWRlciwKLQkJCQkJCQkgICAgKGNvbnN0IHVpbnQzMl90Ci0JCQkJCQkJICAgICBfX3VzZXIgKikKLQkJCQkJCQkgICAgdXNyX3Z0eGJ1ZiwgdmJfc2l6ZSwKLQkJCQkJCQkgICAgdmJfc3RyaWRlKTsKKwkJCQlyZXQgPSBzYXZhZ2VfZGlzcGF0Y2hfdmJfcHJpbSgKKwkJCQkJZGV2X3ByaXYsICZjbWRfaGVhZGVyLAorCQkJCQl2dHhidWYsIHZiX3NpemUsIHZiX3N0cmlkZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFNBVkFHRV9DTURfRE1BX0lEWDoKIAkJCQlqID0gKGNtZF9oZWFkZXIuaWR4LmNvdW50ICsgMykgLyA0OwogCQkJCS8qIGogd2FzIGNoZWNrIGluIHNhdmFnZV9iY2lfY21kYnVmICovCi0JCQkJcmV0ID0KLQkJCQkgICAgc2F2YWdlX2Rpc3BhdGNoX2RtYV9pZHgoZGV2X3ByaXYsCi0JCQkJCQkJICAgICZjbWRfaGVhZGVyLAotCQkJCQkJCSAgICAoY29uc3QgdWludDE2X3QKLQkJCQkJCQkgICAgIF9fdXNlciAqKQotCQkJCQkJCSAgICB1c3JfY21kYnVmLCBkbWFidWYpOwotCQkJCXVzcl9jbWRidWYgKz0gajsKKwkJCQlyZXQgPSBzYXZhZ2VfZGlzcGF0Y2hfZG1hX2lkeChkZXZfcHJpdiwKKwkJCQkJJmNtZF9oZWFkZXIsIChjb25zdCB1aW50MTZfdCAqKWNtZGJ1ZiwKKwkJCQkJZG1hYnVmKTsKKwkJCQljbWRidWYgKz0gajsKIAkJCQlicmVhazsKIAkJCWNhc2UgU0FWQUdFX0NNRF9WQl9JRFg6CiAJCQkJaiA9IChjbWRfaGVhZGVyLmlkeC5jb3VudCArIDMpIC8gNDsKIAkJCQkvKiBqIHdhcyBjaGVjayBpbiBzYXZhZ2VfYmNpX2NtZGJ1ZiAqLwotCQkJCXJldCA9Ci0JCQkJICAgIHNhdmFnZV9kaXNwYXRjaF92Yl9pZHgoZGV2X3ByaXYsCi0JCQkJCQkJICAgJmNtZF9oZWFkZXIsCi0JCQkJCQkJICAgKGNvbnN0IHVpbnQxNl90Ci0JCQkJCQkJICAgIF9fdXNlciAqKXVzcl9jbWRidWYsCi0JCQkJCQkJICAgKGNvbnN0IHVpbnQzMl90Ci0JCQkJCQkJICAgIF9fdXNlciAqKXVzcl92dHhidWYsCi0JCQkJCQkJICAgdmJfc2l6ZSwgdmJfc3RyaWRlKTsKLQkJCQl1c3JfY21kYnVmICs9IGo7CisJCQkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX3ZiX2lkeChkZXZfcHJpdiwKKwkJCQkJJmNtZF9oZWFkZXIsIChjb25zdCB1aW50MTZfdCAqKWNtZGJ1ZiwKKwkJCQkJKGNvbnN0IHVpbnQzMl90ICopdnR4YnVmLCB2Yl9zaXplLCAKKwkJCQkJdmJfc3RyaWRlKTsKKwkJCQljbWRidWYgKz0gajsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJLyogV2hhdCdzIHRoZSBiZXN0IHJldHVybiBjb2RlPyBFRkFVTFQ/ICovCkBAIC05OTgsMTAgKzk2MCwxMCBAQAogCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9idWZfdCAqZG1hYnVmOwogCWRybV9zYXZhZ2VfY21kYnVmX3QgY21kYnVmOwotCWRybV9zYXZhZ2VfY21kX2hlYWRlcl90IF9fdXNlciAqdXNyX2NtZGJ1ZjsKLQlkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCBfX3VzZXIgKmZpcnN0X2RyYXdfY21kOwotCXVuc2lnbmVkIGludCBfX3VzZXIgKnVzcl92dHhidWY7Ci0JZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqdXNyX2JveGVzOworCWRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICprY21kX2FkZHIgPSBOVUxMOworCWRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpmaXJzdF9kcmF3X2NtZDsKKwl1bnNpZ25lZCBpbnQgKmt2Yl9hZGRyID0gTlVMTDsKKwlkcm1fY2xpcF9yZWN0X3QgKmtib3hfYWRkciA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGksIGo7CiAJaW50IHJldCA9IDA7CiAKQEAgLTEwMjQsMTUgKzk4Niw1MyBAQAogCQlkbWFidWYgPSBOVUxMOwogCX0KIAotCXVzcl9jbWRidWYgPSAoZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgX191c2VyICopIGNtZGJ1Zi5jbWRfYWRkcjsKLQl1c3JfdnR4YnVmID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKiljbWRidWYudmJfYWRkcjsKLQl1c3JfYm94ZXMgPSAoZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqKSBjbWRidWYuYm94X2FkZHI7Ci0JaWYgKChjbWRidWYuc2l6ZSAmJiBEUk1fVkVSSUZZQVJFQV9SRUFEKHVzcl9jbWRidWYsIGNtZGJ1Zi5zaXplICogOCkpIHx8Ci0JICAgIChjbWRidWYudmJfc2l6ZSAmJiBEUk1fVkVSSUZZQVJFQV9SRUFEKHVzcl92dHhidWYsIGNtZGJ1Zi52Yl9zaXplKSkKLQkgICAgfHwgKGNtZGJ1Zi5uYm94Ci0JCSYmIERSTV9WRVJJRllBUkVBX1JFQUQodXNyX2JveGVzLAotCQkJCSAgICAgICBjbWRidWYubmJveCAqIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpKSkpCi0JCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJLyogQ29weSB0aGUgdXNlciBidWZmZXJzIGludG8ga2VybmVsIHRlbXBvcmFyeSBhcmVhcy4gIFRoaXMgaGFzbid0IGJlZW4KKwkgKiBhIHBlcmZvcm1hbmNlIGxvc3MgY29tcGFyZWQgdG8gVkVSSUZZQVJFQV9SRUFELworCSAqIENPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRCB3aGVuIGRvbmUgaW4gb3RoZXIgZHJpdmVycywgYW5kIGlzIGNvcnJlY3QKKwkgKiBmb3IgbG9ja2luZyBvbiBGcmVlQlNELgorCSAqLworCWlmIChjbWRidWYuc2l6ZSkgeworCQlrY21kX2FkZHIgPSBkcm1fYWxsb2MoY21kYnVmLnNpemUgKiA4LCBEUk1fTUVNX0RSSVZFUik7CisJCWlmIChrY21kX2FkZHIgPT0gTlVMTCkKKwkJCXJldHVybiBFTk9NRU07CisKKwkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihrY21kX2FkZHIsIGNtZGJ1Zi5jbWRfYWRkciwKKwkJCQkgICAgICAgY21kYnVmLnNpemUgKiA4KSkKKwkJeworCQkJZHJtX2ZyZWUoa2NtZF9hZGRyLCBjbWRidWYuc2l6ZSAqIDgsIERSTV9NRU1fRFJJVkVSKTsKKwkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCX0KKwkJY21kYnVmLmNtZF9hZGRyID0ga2NtZF9hZGRyOworCX0KKwlpZiAoY21kYnVmLnZiX3NpemUpIHsKKwkJa3ZiX2FkZHIgPSBkcm1fYWxsb2MoY21kYnVmLnZiX3NpemUsIERSTV9NRU1fRFJJVkVSKTsKKwkJaWYgKGt2Yl9hZGRyID09IE5VTEwpIHsKKwkJCXJldCA9IERSTV9FUlIoRU5PTUVNKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoa3ZiX2FkZHIsIGNtZGJ1Zi52Yl9hZGRyLAorCQkJCSAgICAgICBjbWRidWYudmJfc2l6ZSkpIHsKKwkJCXJldCA9IERSTV9FUlIoRUZBVUxUKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQljbWRidWYudmJfYWRkciA9IGt2Yl9hZGRyOworCX0KKwlpZiAoY21kYnVmLm5ib3gpIHsKKwkJa2JveF9hZGRyID0gZHJtX2FsbG9jKGNtZGJ1Zi5uYm94ICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksCisJCQkJICAgICAgIERSTV9NRU1fRFJJVkVSKTsKKwkJaWYgKGtib3hfYWRkciA9PSBOVUxMKSB7CisJCQlyZXQgPSBEUk1fRVJSKEVOT01FTSk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGtib3hfYWRkciwgY21kYnVmLmJveF9hZGRyLAorCQkJCSAgICAgICBjbWRidWYubmJveCAqIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpKSkgeworCQkJcmV0ID0gRFJNX0VSUihFRkFVTFQpOworCQkJZ290byBkb25lOworCQl9CisJY21kYnVmLmJveF9hZGRyID0ga2JveF9hZGRyOworCX0KIAogCS8qIE1ha2Ugc3VyZSB3cml0ZXMgdG8gRE1BIGJ1ZmZlcnMgYXJlIGZpbmlzaGVkIGJlZm9yZSBzZW5kaW5nCiAJICogRE1BIGNvbW1hbmRzIHRvIHRoZSBncmFwaGljcyBoYXJkd2FyZS4gKi8KQEAgLTEwNDYsOSArMTA0Niw4IEBACiAJZmlyc3RfZHJhd19jbWQgPSBOVUxMOwogCXdoaWxlIChpIDwgY21kYnVmLnNpemUpIHsKIAkJZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgY21kX2hlYWRlcjsKLQkJRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRCgmY21kX2hlYWRlciwgdXNyX2NtZGJ1ZiwKLQkJCQkJICAgICBzaXplb2YoY21kX2hlYWRlcikpOwotCQl1c3JfY21kYnVmKys7CisJCWNtZF9oZWFkZXIgPSAqKGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICopY21kYnVmLmNtZF9hZGRyOworCQljbWRidWYuY21kX2FkZHIrKzsKIAkJaSsrOwogCiAJCS8qIEdyb3VwIGRyYXdpbmcgY29tbWFuZHMgd2l0aCBzYW1lIHN0YXRlIHRvIG1pbmltaXplCkBAIC0xMDY4LDIxICsxMDY3LDE4IEBACiAJCWNhc2UgU0FWQUdFX0NNRF9ETUFfUFJJTToKIAkJY2FzZSBTQVZBR0VfQ01EX1ZCX1BSSU06CiAJCQlpZiAoIWZpcnN0X2RyYXdfY21kKQotCQkJCWZpcnN0X2RyYXdfY21kID0gdXNyX2NtZGJ1ZiAtIDE7Ci0JCQl1c3JfY21kYnVmICs9IGo7CisJCQkJZmlyc3RfZHJhd19jbWQgPSBjbWRidWYuY21kX2FkZHIgLSAxOworCQkJY21kYnVmLmNtZF9hZGRyICs9IGo7CiAJCQlpICs9IGo7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWlmIChmaXJzdF9kcmF3X2NtZCkgewotCQkJCXJldCA9Ci0JCQkJICAgIHNhdmFnZV9kaXNwYXRjaF9kcmF3KGRldl9wcml2LAotCQkJCQkJCSBmaXJzdF9kcmF3X2NtZCwKLQkJCQkJCQkgdXNyX2NtZGJ1ZiAtIDEsIGRtYWJ1ZiwKLQkJCQkJCQkgdXNyX3Z0eGJ1ZiwKLQkJCQkJCQkgY21kYnVmLnZiX3NpemUsCi0JCQkJCQkJIGNtZGJ1Zi52Yl9zdHJpZGUsCi0JCQkJCQkJIGNtZGJ1Zi5uYm94LAotCQkJCQkJCSB1c3JfYm94ZXMpOworCQkJCXJldCA9IHNhdmFnZV9kaXNwYXRjaF9kcmF3KAorCQkJCSAgICAgIGRldl9wcml2LCBmaXJzdF9kcmF3X2NtZCwKKwkJCQkgICAgICBjbWRidWYuY21kX2FkZHIgLSAxLAorCQkJCSAgICAgIGRtYWJ1ZiwgY21kYnVmLnZiX2FkZHIsIGNtZGJ1Zi52Yl9zaXplLAorCQkJCSAgICAgIGNtZGJ1Zi52Yl9zdHJpZGUsCisJCQkJICAgICAgY21kYnVmLm5ib3gsIGNtZGJ1Zi5ib3hfYWRkcik7CiAJCQkJaWYgKHJldCAhPSAwKQogCQkJCQlyZXR1cm4gcmV0OwogCQkJCWZpcnN0X2RyYXdfY21kID0gTlVMTDsKQEAgLTEwOTgsMTIgKzEwOTQsMTIgQEAKIAkJCQlEUk1fRVJST1IoImNvbW1hbmQgU0FWQUdFX0NNRF9TVEFURSBleHRlbmRzICIKIAkJCQkJICAiYmV5b25kIGVuZCBvZiBjb21tYW5kIGJ1ZmZlclxuIik7CiAJCQkJRE1BX0ZMVVNIKCk7Ci0JCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJCQlyZXQgPSBEUk1fRVJSKEVJTlZBTCk7CisJCQkJZ290byBkb25lOwogCQkJfQogCQkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX3N0YXRlKGRldl9wcml2LCAmY21kX2hlYWRlciwKLQkJCQkJCSAgICAodWludDMyX3QgX191c2VyICopCi0JCQkJCQkgICAgdXNyX2NtZGJ1Zik7Ci0JCQl1c3JfY21kYnVmICs9IGo7CisJCQkJKGNvbnN0IHVpbnQzMl90ICopY21kYnVmLmNtZF9hZGRyKTsKKwkJCWNtZGJ1Zi5jbWRfYWRkciArPSBqOwogCQkJaSArPSBqOwogCQkJYnJlYWs7CiAJCWNhc2UgU0FWQUdFX0NNRF9DTEVBUjoKQEAgLTExMTEsMzkgKzExMDcsNDAgQEAKIAkJCQlEUk1fRVJST1IoImNvbW1hbmQgU0FWQUdFX0NNRF9DTEVBUiBleHRlbmRzICIKIAkJCQkJICAiYmV5b25kIGVuZCBvZiBjb21tYW5kIGJ1ZmZlclxuIik7CiAJCQkJRE1BX0ZMVVNIKCk7Ci0JCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJCQlyZXQgPSBEUk1fRVJSKEVJTlZBTCk7CisJCQkJZ290byBkb25lOwogCQkJfQogCQkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX2NsZWFyKGRldl9wcml2LCAmY21kX2hlYWRlciwKLQkJCQkJCSAgICB1c3JfY21kYnVmLAotCQkJCQkJICAgIGNtZGJ1Zi5uYm94LCB1c3JfYm94ZXMpOwotCQkJdXNyX2NtZGJ1ZisrOworCQkJCQkJICAgIGNtZGJ1Zi5jbWRfYWRkciwKKwkJCQkJCSAgICBjbWRidWYubmJveCwgY21kYnVmLmJveF9hZGRyKTsKKwkJCWNtZGJ1Zi5jbWRfYWRkcisrOwogCQkJaSsrOwogCQkJYnJlYWs7CiAJCWNhc2UgU0FWQUdFX0NNRF9TV0FQOgotCQkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX3N3YXAoZGV2X3ByaXYsCi0JCQkJCQkgICBjbWRidWYubmJveCwgdXNyX2JveGVzKTsKKwkJCXJldCA9IHNhdmFnZV9kaXNwYXRjaF9zd2FwKGRldl9wcml2LCBjbWRidWYubmJveCwKKwkJCQkJCSAgIGNtZGJ1Zi5ib3hfYWRkcik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCURSTV9FUlJPUigiaW52YWxpZCBjb21tYW5kIDB4JXhcbiIsIGNtZF9oZWFkZXIuY21kLmNtZCk7CiAJCQlETUFfRkxVU0goKTsKLQkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCQlyZXQgPSBEUk1fRVJSKEVJTlZBTCk7CisJCQlnb3RvIGRvbmU7CiAJCX0KIAogCQlpZiAocmV0ICE9IDApIHsKIAkJCURNQV9GTFVTSCgpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gZG9uZTsKIAkJfQogCX0KIAogCWlmIChmaXJzdF9kcmF3X2NtZCkgewotCQlyZXQgPQotCQkgICAgc2F2YWdlX2Rpc3BhdGNoX2RyYXcoZGV2X3ByaXYsIGZpcnN0X2RyYXdfY21kLCB1c3JfY21kYnVmLAotCQkJCQkgZG1hYnVmLCB1c3JfdnR4YnVmLCBjbWRidWYudmJfc2l6ZSwKLQkJCQkJIGNtZGJ1Zi52Yl9zdHJpZGUsIGNtZGJ1Zi5uYm94LAotCQkJCQkgdXNyX2JveGVzKTsKKwkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX2RyYXcgKAorCQkJZGV2X3ByaXYsIGZpcnN0X2RyYXdfY21kLCBjbWRidWYuY21kX2FkZHIsIGRtYWJ1ZiwKKwkJCWNtZGJ1Zi52Yl9hZGRyLCBjbWRidWYudmJfc2l6ZSwgY21kYnVmLnZiX3N0cmlkZSwKKwkJCWNtZGJ1Zi5uYm94LCBjbWRidWYuYm94X2FkZHIpOwogCQlpZiAocmV0ICE9IDApIHsKIAkJCURNQV9GTFVTSCgpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gZG9uZTsKIAkJfQogCX0KIApAQCAtMTE1Nyw1ICsxMTU0LDEyIEBACiAJCXNhdmFnZV9mcmVlbGlzdF9wdXQoZGV2LCBkbWFidWYpOwogCX0KIAotCXJldHVybiAwOworZG9uZToKKwkvKiBJZiB3ZSBkaWRuJ3QgbmVlZCB0byBhbGxvY2F0ZSB0aGVtLCB0aGVzZSdsbCBiZSBOVUxMICovCisJZHJtX2ZyZWUoa2NtZF9hZGRyLCBjbWRidWYuc2l6ZSAqIDgsIERSTV9NRU1fRFJJVkVSKTsKKwlkcm1fZnJlZShrdmJfYWRkciwgY21kYnVmLnZiX3NpemUsIERSTV9NRU1fRFJJVkVSKTsKKwlkcm1fZnJlZShrYm94X2FkZHIsIGNtZGJ1Zi5uYm94ICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksCisJCSBEUk1fTUVNX0RSSVZFUik7CisKKwlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcm0uaAppbmRleCA4ZjI3M2RhLi4zMGY3YjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcm0uaApAQCAtMSwzICsxLDI4IEBACisvKiBzaXNfZHJ2LmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIHNpcyBkcml2ZXIgLSotIGxpbnV4LWMgLSotICovCisvKgorICogQ29weXJpZ2h0IDIwMDUgRXJpYyBBbmhvbHQKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLwogCiAjaWZuZGVmIF9fU0lTX0RSTV9IX18KICNkZWZpbmUgX19TSVNfRFJNX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYwppbmRleCAzY2VmMTA2Li42ZjZkN2Q2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYwpAQCAtMzIsMzEgKzMyLDYgQEAKIAogI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKIAotc3RhdGljIGludCBwb3N0aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCi0JCSBEUklWRVJfTkFNRSwKLQkJIERSSVZFUl9NQUpPUiwKLQkJIERSSVZFUl9NSU5PUiwKLQkJIERSSVZFUl9QQVRDSExFVkVMLAotCQkgRFJJVkVSX0RBVEUsIGRldi0+cHJpbWFyeS5taW5vciwgcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKLQkgICAgKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZXJzaW9uKGRybV92ZXJzaW9uX3QgKiB2ZXJzaW9uKQotewotCWludCBsZW47Ci0KLQl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOwotCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7Ci0JRFJNX0NPUFkodmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFKTsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKIAlzaXNkcnZfUENJX0lEUwogfTsKQEAgLTY4LDggKzQzLDYgQEAKIAkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAogCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAogCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAotCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAotCS52ZXJzaW9uID0gdmVyc2lvbiwKIAkuaW9jdGxzID0gc2lzX2lvY3RscywKIAkuZm9wcyA9IHsKIAkJIC5vd25lciA9IFRISVNfTU9EVUxFLApAQCAtNzksMTEgKzUyLDE4IEBACiAJCSAubW1hcCA9IGRybV9tbWFwLAogCQkgLnBvbGwgPSBkcm1fcG9sbCwKIAkJIC5mYXN5bmMgPSBkcm1fZmFzeW5jLAotCQkgfSwKKwl9LAogCS5wY2lfZHJpdmVyID0gewotCQkgICAgICAgLm5hbWUgPSBEUklWRVJfTkFNRSwKLQkJICAgICAgIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKLQkJICAgICAgIH0KKwkJIC5uYW1lID0gRFJJVkVSX05BTUUsCisJCSAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCisJfSwKKworCS5uYW1lID0gRFJJVkVSX05BTUUsCisJLmRlc2MgPSBEUklWRVJfREVTQywKKwkuZGF0ZSA9IERSSVZFUl9EQVRFLAorCS5tYWpvciA9IERSSVZFUl9NQUpPUiwKKwkubWlub3IgPSBEUklWRVJfTUlOT1IsCisJLnBhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNpc19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5oCmluZGV4IGIxZmRkYWQuLmUyMThlNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5oCkBAIC0xLDUgKzEsNSBAQAotLyogc2lzX2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciBzaXMgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQotICoKKy8qIHNpc19kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3Igc2lzIGRyaXZlciAtKi0gbGludXgtYyAtKi0gKi8KKy8qCiAgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCiAgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHMuaCBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2RzLmgKaW5kZXggZGE4NTBiNC4uOTRmMmI0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHMuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcy5oCkBAIC0xLDYgKzEsNyBAQAotLyogc2lzX2RzLmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIERpcmVjdCBSZW5kZXJpbmcgTWFuYWdlciAtKi0gbGludXgtYyAtKi0KKy8qIHNpc19kcy5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciBEaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXIgLSotIGxpbnV4LWMgLSotIAogICogQ3JlYXRlZDogTW9uIEphbiAgNCAxMDowNTowNSAxOTk5IGJ5IHNjbGluQHNpcy5jb20udHcKLSAqCisgKi8KKy8qCiAgKiBDb3B5cmlnaHQgMjAwMCBTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtcyBDb3JwLCBJbmMuLCBIc2luQ2h1LCBUYWl3YW4uCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTM1LDcgKzM2LDcgQEAKIAogI2RlZmluZSBTRVRfU0laRSA1MDAwCiAKLXR5cGVkZWYgdW5zaWduZWQgaW50IElURU1fVFlQRTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBJVEVNX1RZUEU7CiAKIHR5cGVkZWYgc3RydWN0IHsKIAlJVEVNX1RZUEUgdmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX21tLmMKaW5kZXggYTg1Mjk3Mi4uNjc3NGQyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19tbS5jCkBAIC04Niw3ICs4Niw3IEBACiB7CiAJZHJtX3Npc19tZW1fdCBmYjsKIAlzdHJ1Y3Qgc2lzX21lbXJlcSByZXE7Ci0JZHJtX3Npc19tZW1fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWRybV9zaXNfbWVtX3QgX191c2VyICphcmdwID0gKGRybV9zaXNfbWVtX3QgX191c2VyICopZGF0YTsKIAlpbnQgcmV0dmFsID0gMDsKIAogCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChmYiwgYXJncCwgc2l6ZW9mKGZiKSk7CkBAIC0xMTAsNyArMTEwLDcgQEAKIAogCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoYXJncCwgZmIsIHNpemVvZihmYikpOwogCi0JRFJNX0RFQlVHKCJhbGxvYyBmYiwgc2l6ZSA9ICVkLCBvZmZzZXQgPSAlZFxuIiwgZmIuc2l6ZSwgcmVxLm9mZnNldCk7CisJRFJNX0RFQlVHKCJhbGxvYyBmYiwgc2l6ZSA9ICVkLCBvZmZzZXQgPSAlbGRcbiIsIGZiLnNpemUsIHJlcS5vZmZzZXQpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTEyNyw5ICsxMjcsOSBAQAogCiAJaWYgKCFkZWxfYWxsb2Nfc2V0KGZiLmNvbnRleHQsIFZJREVPX1RZUEUsIGZiLmZyZWUpKQogCQlyZXR2YWwgPSBEUk1fRVJSKEVJTlZBTCk7Ci0Jc2lzX2ZyZWUoKHUzMikgZmIuZnJlZSk7CisJc2lzX2ZyZWUoZmIuZnJlZSk7CiAKLQlEUk1fREVCVUcoImZyZWUgZmIsIG9mZnNldCA9ICVsdVxuIiwgZmIuZnJlZSk7CisJRFJNX0RFQlVHKCJmcmVlIGZiLCBvZmZzZXQgPSAweCVseFxuIiwgZmIuZnJlZSk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMTc2LDcgKzE3Niw3IEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9zaXNfbWVtX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlkcm1fc2lzX21lbV90IF9fdXNlciAqYXJncCA9IChkcm1fc2lzX21lbV90IF9fdXNlciAqKWRhdGE7CiAJZHJtX3Npc19tZW1fdCBmYjsKIAlQTWVtQmxvY2sgYmxvY2s7CiAJaW50IHJldHZhbCA9IDA7CkBAIC0yNjcsNyArMjY3LDcgQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX3Npc19tZW1fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWRybV9zaXNfbWVtX3QgX191c2VyICphcmdwID0gKGRybV9zaXNfbWVtX3QgX191c2VyICopZGF0YTsKIAlkcm1fc2lzX21lbV90IGFncDsKIAlQTWVtQmxvY2sgYmxvY2s7CiAJaW50IHJldHZhbCA9IDA7CkBAIC0zNjcsNyArMzY3LDcgQEAKIAogCWlmIChpIDwgTUFYX0NPTlRFWFQpIHsKIAkJc2V0X3QgKnNldDsKLQkJdW5zaWduZWQgaW50IGl0ZW07CisJCUlURU1fVFlQRSBpdGVtOwogCQlpbnQgcmV0dmFsOwogCiAJCURSTV9ERUJVRygiZmluZCBzb2NrZXQgJWQsIGNvbnRleHQgPSAlZFxuIiwgaSwgY29udGV4dCk7CkBAIC0zNzYsNyArMzc2LDcgQEAKIAkJc2V0ID0gZ2xvYmFsX3Bwcml2W2ldLnNldHNbMF07CiAJCXJldHZhbCA9IHNldEZpcnN0KHNldCwgJml0ZW0pOwogCQl3aGlsZSAocmV0dmFsKSB7Ci0JCQlEUk1fREVCVUcoImZyZWUgdmlkZW8gbWVtb3J5IDB4JXhcbiIsIGl0ZW0pOworCQkJRFJNX0RFQlVHKCJmcmVlIHZpZGVvIG1lbW9yeSAweCVseFxuIiwgaXRlbSk7CiAjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoQ09ORklHX0ZCX1NJUykKIAkJCXNpc19mcmVlKGl0ZW0pOwogI2Vsc2UKQEAgLTM5MCw3ICszOTAsNyBAQAogCQlzZXQgPSBnbG9iYWxfcHByaXZbaV0uc2V0c1sxXTsKIAkJcmV0dmFsID0gc2V0Rmlyc3Qoc2V0LCAmaXRlbSk7CiAJCXdoaWxlIChyZXR2YWwpIHsKLQkJCURSTV9ERUJVRygiZnJlZSBhZ3AgbWVtb3J5IDB4JXhcbiIsIGl0ZW0pOworCQkJRFJNX0RFQlVHKCJmcmVlIGFncCBtZW1vcnkgMHglbHhcbiIsIGl0ZW0pOwogCQkJbW1GcmVlTWVtKChQTWVtQmxvY2spIGl0ZW0pOwogCQkJcmV0dmFsID0gc2V0TmV4dChzZXQsICZpdGVtKTsKIAkJfQpAQCAtNDAzLDEyICs0MDMsMTIgQEAKIH0KIAogZHJtX2lvY3RsX2Rlc2NfdCBzaXNfaW9jdGxzW10gPSB7Ci0JW0RSTV9JT0NUTF9OUihEUk1fU0lTX0ZCX0FMTE9DKV0gPSB7c2lzX2ZiX2FsbG9jLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9TSVNfRkJfRlJFRSldID0ge3Npc19mYl9mcmVlLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9TSVNfQUdQX0lOSVQpXSA9IHtzaXNfaW9jdGxfYWdwX2luaXQsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfQUxMT0MpXSA9IHtzaXNfaW9jdGxfYWdwX2FsbG9jLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9TSVNfQUdQX0ZSRUUpXSA9IHtzaXNfaW9jdGxfYWdwX2ZyZWUsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1NJU19GQl9JTklUKV0gPSB7c2lzX2ZiX2luaXQsIDEsIDF9CisJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0ZCX0FMTE9DKV0gPSB7c2lzX2ZiX2FsbG9jLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0ZCX0ZSRUUpXSA9IHtzaXNfZmJfZnJlZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfSU5JVCldID0ge3Npc19pb2N0bF9hZ3BfaW5pdCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9TSVNfQUdQX0FMTE9DKV0gPSB7c2lzX2lvY3RsX2FncF9hbGxvYywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfRlJFRSldID0ge3Npc19pb2N0bF9hZ3BfZnJlZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19GQl9JTklUKV0gPSB7c2lzX2ZiX2luaXQsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0KIH07CiAKIGludCBzaXNfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoc2lzX2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3RkZnhfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3RkZnhfZHJ2LmMKaW5kZXggYzI3NWNiYi4uYmFhNDQxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS90ZGZ4X2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuYwpAQCAtMzYsMzEgKzM2LDYgQEAKIAogI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKIAotc3RhdGljIGludCBwb3N0aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCi0JCSBEUklWRVJfTkFNRSwKLQkJIERSSVZFUl9NQUpPUiwKLQkJIERSSVZFUl9NSU5PUiwKLQkJIERSSVZFUl9QQVRDSExFVkVMLAotCQkgRFJJVkVSX0RBVEUsIGRldi0+cHJpbWFyeS5taW5vciwgcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKLQkgICAgKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZXJzaW9uKGRybV92ZXJzaW9uX3QgKiB2ZXJzaW9uKQotewotCWludCBsZW47Ci0KLQl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOwotCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7Ci0JRFJNX0NPUFkodmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFKTsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKIAl0ZGZ4X1BDSV9JRFMKIH07CkBAIC03MCw4ICs0NSw2IEBACiAJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKIAkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKIAkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKLQkucG9zdGluaXQgPSBwb3N0aW5pdCwKLQkudmVyc2lvbiA9IHZlcnNpb24sCiAJLmZvcHMgPSB7CiAJCSAub3duZXIgPSBUSElTX01PRFVMRSwKIAkJIC5vcGVuID0gZHJtX29wZW4sCkBAIC04MCwxMSArNTMsMTggQEAKIAkJIC5tbWFwID0gZHJtX21tYXAsCiAJCSAucG9sbCA9IGRybV9wb2xsLAogCQkgLmZhc3luYyA9IGRybV9mYXN5bmMsCi0JCSB9LAorCX0sCiAJLnBjaV9kcml2ZXIgPSB7Ci0JCSAgICAgICAubmFtZSA9IERSSVZFUl9OQU1FLAotCQkgICAgICAgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAotCQkgICAgICAgfQorCQkgLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKKwl9LAorCisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuZGVzYyA9IERSSVZFUl9ERVNDLAorCS5kYXRlID0gRFJJVkVSX0RBVEUsCisJLm1ham9yID0gRFJJVkVSX01BSk9SLAorCS5taW5vciA9IERSSVZFUl9NSU5PUiwKKwkucGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdGRmeF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3RkZnhfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3RkZnhfZHJ2LmgKaW5kZXggYTU4MmEzZC4uODQyMDRlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS90ZGZ4X2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuaApAQCAtMSw2ICsxLDcgQEAKIC8qIHRkZnguaCAtLSAzZGZ4IERSTSB0ZW1wbGF0ZSBjdXN0b21pemF0aW9uIC0qLSBsaW51eC1jIC0qLQogICogQ3JlYXRlZDogV2VkIEZlYiAxNCAxMjozMjozMiAyMDAxIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQotICoKKyAqLworLyoKICAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgpAQCAtMzAsMTAgKzMxLDYgQEAKICNpZm5kZWYgX19UREZYX0hfXwogI2RlZmluZSBfX1RERlhfSF9fCiAKLS8qIFRoaXMgcmVtYWlucyBjb25zdGFudCBmb3IgYWxsIERSTSB0ZW1wbGF0ZSBmaWxlcy4KLSAqLwotI2RlZmluZSBEUk0oeCkgdGRmeF8jI3gKLQogLyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hLmMKaW5kZXggZDRiMTc2Ni4uNTkzYzBiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hLmMKQEAgLTIxMyw3ICsyMTMsOSBAQAogCWRldl9wcml2LT5kbWFfd3JhcCA9IGluaXQtPnNpemU7CiAJZGV2X3ByaXYtPmRtYV9vZmZzZXQgPSBpbml0LT5vZmZzZXQ7CiAJZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyID0gTlVMTDsKLQlkZXZfcHJpdi0+aHdfYWRkcl9wdHIgPSBkZXZfcHJpdi0+bW1pby0+aGFuZGxlICsgaW5pdC0+cmVnX3BhdXNlX2FkZHI7CisJZGV2X3ByaXYtPmh3X2FkZHJfcHRyID0KKwkJKHZvbGF0aWxlIHVpbnQzMl90ICopKChjaGFyICopZGV2X3ByaXYtPm1taW8tPmhhbmRsZSArCisJCWluaXQtPnJlZ19wYXVzZV9hZGRyKTsKIAogCXZpYV9jbWRidWZfc3RhcnQoZGV2X3ByaXYpOwogCkBAIC0yMzIsMTMgKzIzNCwxMyBAQAogCiAJc3dpdGNoIChpbml0LmZ1bmMpIHsKIAljYXNlIFZJQV9JTklUX0RNQToKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlpZiAoIURSTV9TVVNFUihEUk1fQ1VSUFJPQykpCiAJCQlyZXRjb2RlID0gRFJNX0VSUihFUEVSTSk7CiAJCWVsc2UKIAkJCXJldGNvZGUgPSB2aWFfaW5pdGlhbGl6ZShkZXYsIGRldl9wcml2LCAmaW5pdCk7CiAJCWJyZWFrOwogCWNhc2UgVklBX0NMRUFOVVBfRE1BOgotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCWlmICghRFJNX1NVU0VSKERSTV9DVVJQUk9DKSkKIAkJCXJldGNvZGUgPSBEUk1fRVJSKEVQRVJNKTsKIAkJZWxzZQogCQkJcmV0Y29kZSA9IHZpYV9kbWFfY2xlYW51cChkZXYpOwpAQCAtMzQ5LDkgKzM1MSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWV4dGVybiBpbnQKLXZpYV9wYXJzZV9jb21tYW5kX3N0cmVhbShkcm1fZGV2aWNlX3QgKiBkZXYsIGNvbnN0IHVpbnQzMl90ICogYnVmLAotCQkJIHVuc2lnbmVkIGludCBzaXplKTsKIHN0YXRpYyBpbnQgdmlhX2Rpc3BhdGNoX3BjaV9jbWRidWZmZXIoZHJtX2RldmljZV90ICogZGV2LAogCQkJCSAgICAgIGRybV92aWFfY21kYnVmZmVyX3QgKiBjbWQpCiB7CkBAIC00NTAsOSArNDQ5LDkgQEAKIAlpZiAoKGNvdW50IDw9IDgpICYmIChjb3VudCA+PSAwKSkgewogCQl1aW50MzJfdCByZ3RyLCBwdHI7CiAJCXJndHIgPSAqKGRldl9wcml2LT5od19hZGRyX3B0cik7Ci0JCXB0ciA9ICgoY2hhciAqKWRldl9wcml2LT5sYXN0X3BhdXNlX3B0ciAtIGRldl9wcml2LT5kbWFfcHRyKSArCi0JCSAgICBkZXZfcHJpdi0+ZG1hX29mZnNldCArICh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHIgKyA0IC0KLQkJICAgIENNREJVRl9BTElHTk1FTlRfU0laRTsKKwkJcHRyID0gKCh2b2xhdGlsZSBjaGFyICopZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyIC0KKwkJICAgICAgZGV2X3ByaXYtPmRtYV9wdHIpICsgZGV2X3ByaXYtPmRtYV9vZmZzZXQgKworCQkgICAgICAodWludDMyX3QpIGRldl9wcml2LT5hZ3BBZGRyICsgNCAtIENNREJVRl9BTElHTk1FTlRfU0laRTsKIAkJaWYgKHJndHIgPD0gcHRyKSB7CiAJCQlEUk1fRVJST1IKIAkJCSAgICAoIkNvbW1hbmQgcmVndWxhdG9yXG5wYXVzZWQgYXQgY291bnQgJWQsIGFkZHJlc3MgJXgsICIKQEAgLTQ3Miw3ICs0NzEsNyBAQAogCQkgICAgICAgJiYgY291bnQtLSkgOwogCiAJCXJndHIgPSAqKGRldl9wcml2LT5od19hZGRyX3B0cik7Ci0JCXB0ciA9ICgoY2hhciAqKXBhdXNlZF9hdCAtIGRldl9wcml2LT5kbWFfcHRyKSArCisJCXB0ciA9ICgodm9sYXRpbGUgY2hhciAqKXBhdXNlZF9hdCAtIGRldl9wcml2LT5kbWFfcHRyKSArCiAJCSAgICBkZXZfcHJpdi0+ZG1hX29mZnNldCArICh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHIgKyA0OwogCiAJCXB0cl9sb3cgPSAocHRyID4gMyAqIENNREJVRl9BTElHTk1FTlRfU0laRSkgPwpAQCAtNzI0LDMgKzcyMywyMiBAQAogCQkJICAgICAgIHNpemVvZihkX3NpeikpOwogCXJldHVybiByZXQ7CiB9CisKK2RybV9pb2N0bF9kZXNjX3QgdmlhX2lvY3Rsc1tdID0geworCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9BTExPQ01FTSldID0ge3ZpYV9tZW1fYWxsb2MsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfRlJFRU1FTSldID0ge3ZpYV9tZW1fZnJlZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9BR1BfSU5JVCldID0ge3ZpYV9hZ3BfaW5pdCwgRFJNX0FVVEh8RFJNX01BU1RFUn0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0ZCX0lOSVQpXSA9IHt2aWFfZmJfaW5pdCwgRFJNX0FVVEh8RFJNX01BU1RFUn0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX01BUF9JTklUKV0gPSB7dmlhX21hcF9pbml0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfREVDX0ZVVEVYKV0gPSB7dmlhX2RlY29kZXJfZnV0ZXgsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfRE1BX0lOSVQpXSA9IHt2aWFfZG1hX2luaXQsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfQ01EQlVGRkVSKV0gPSB7dmlhX2NtZGJ1ZmZlciwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9GTFVTSCldID0ge3ZpYV9mbHVzaF9pb2N0bCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9QQ0lDTUQpXSA9IHt2aWFfcGNpX2NtZGJ1ZmZlciwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9DTURCVUZfU0laRSldID0ge3ZpYV9jbWRidWZfc2l6ZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9XQUlUX0lSUSldID0ge3ZpYV93YWl0X2lycSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9ETUFfQkxJVCldID0ge3ZpYV9kbWFfYmxpdCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9CTElUX1NZTkMpXSA9IHt2aWFfZG1hX2JsaXRfc3luYywgRFJNX0FVVEh9Cit9OworCitpbnQgdmlhX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKHZpYV9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNWUwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmMKQEAgLTAsMCArMSw4MDUgQEAKKy8qIHZpYV9kbWFibGl0LmMgLS0gUENJIERNQSBCaXRCbHQgc3VwcG9ydCBmb3IgdGhlIFZJQSBVbmljaHJvbWUvUHJvCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaG9tYXMgSGVsbHN0cm9tLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IAorICogICAgVGhvbWFzIEhlbGxzdHJvbS4KKyAqICAgIFBhcnRpYWxseSBiYXNlZCBvbiBjb2RlIG9idGFpbmVkIGZyb20gRGlnZW8gSW5jLgorICovCisKKworLyoKKyAqIFVubWFwcyB0aGUgRE1BIG1hcHBpbmdzLiAKKyAqIEZJWE1FOiBJcyB0aGlzIGEgTm9PcCBvbiB4ODY/IEFsc28gCisgKiBGSVhNRTogV2hhdCBoYXBwZW5zIGlmIHRoaXMgb25lIGlzIGNhbGxlZCBhbmQgYSBwZW5kaW5nIGJsaXQgaGFzIHByZXZpb3VzbHkgZG9uZSAKKyAqIHRoZSBzYW1lIERNQSBtYXBwaW5ncz8gCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJ2aWFfZHJtLmgiCisjaW5jbHVkZSAidmlhX2Rydi5oIgorI2luY2x1ZGUgInZpYV9kbWFibGl0LmgiCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKKyNkZWZpbmUgVklBX1BHRE4oeCkgICAgICAgICAgICAgKCgodW5zaWduZWQgbG9uZykoeCkpICYgUEFHRV9NQVNLKQorI2RlZmluZSBWSUFfUEdPRkYoeCkgICAgICAgICAgICAoKCh1bnNpZ25lZCBsb25nKSh4KSkgJiB+UEFHRV9NQVNLKQorI2RlZmluZSBWSUFfUEZOKHgpICAgICAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcpKHgpID4+IFBBR0VfU0hJRlQpCisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2Rlc2NyaXB0b3IgeworCXVpbnQzMl90IG1lbV9hZGRyOworCXVpbnQzMl90IGRldl9hZGRyOworCXVpbnQzMl90IHNpemU7CisJdWludDMyX3QgbmV4dDsKK30gZHJtX3ZpYV9kZXNjcmlwdG9yX3Q7CisKKworLyoKKyAqIFVubWFwIGEgRE1BIG1hcHBpbmcuCisgKi8KKworCisKK3N0YXRpYyB2b2lkCit2aWFfdW5tYXBfYmxpdF9mcm9tX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZykKK3sKKwlpbnQgbnVtX2Rlc2MgPSB2c2ctPm51bV9kZXNjOworCXVuc2lnbmVkIGN1cl9kZXNjcmlwdG9yX3BhZ2UgPSBudW1fZGVzYyAvIHZzZy0+ZGVzY3JpcHRvcnNfcGVyX3BhZ2U7CisJdW5zaWduZWQgZGVzY3JpcHRvcl90aGlzX3BhZ2UgPSBudW1fZGVzYyAlIHZzZy0+ZGVzY3JpcHRvcnNfcGVyX3BhZ2U7CisJZHJtX3ZpYV9kZXNjcmlwdG9yX3QgKmRlc2NfcHRyID0gdnNnLT5kZXNjX3BhZ2VzW2N1cl9kZXNjcmlwdG9yX3BhZ2VdICsgCisJCWRlc2NyaXB0b3JfdGhpc19wYWdlOworCWRtYV9hZGRyX3QgbmV4dCA9IHZzZy0+Y2hhaW5fc3RhcnQ7CisKKwl3aGlsZShudW1fZGVzYy0tKSB7CisJCWlmIChkZXNjcmlwdG9yX3RoaXNfcGFnZS0tID09IDApIHsKKwkJCWN1cl9kZXNjcmlwdG9yX3BhZ2UtLTsKKwkJCWRlc2NyaXB0b3JfdGhpc19wYWdlID0gdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZSAtIDE7CisJCQlkZXNjX3B0ciA9IHZzZy0+ZGVzY19wYWdlc1tjdXJfZGVzY3JpcHRvcl9wYWdlXSArIAorCQkJCWRlc2NyaXB0b3JfdGhpc19wYWdlOworCQl9CisJCWRtYV91bm1hcF9zaW5nbGUoJnBkZXYtPmRldiwgbmV4dCwgc2l6ZW9mKCpkZXNjX3B0ciksIERNQV9UT19ERVZJQ0UpOworCQlkbWFfdW5tYXBfcGFnZSgmcGRldi0+ZGV2LCBkZXNjX3B0ci0+bWVtX2FkZHIsIGRlc2NfcHRyLT5zaXplLCB2c2ctPmRpcmVjdGlvbik7CisJCW5leHQgPSAoZG1hX2FkZHJfdCkgZGVzY19wdHItPm5leHQ7CisJCWRlc2NfcHRyLS07CisJfQorfQorCisvKgorICogSWYgbW9kZSA9IDAsIGNvdW50IGhvdyBtYW55IGRlc2NyaXB0b3JzIGFyZSBuZWVkZWQuCisgKiBJZiBtb2RlID0gMSwgTWFwIHRoZSBETUEgcGFnZXMgZm9yIHRoZSBkZXZpY2UsIHB1dCB0b2dldGhlciBhbmQgbWFwIGFsc28gdGhlIGRlc2NyaXB0b3JzLgorICogRGVzY3JpcHRvcnMgYXJlIHJ1biBpbiByZXZlcnNlIG9yZGVyIGJ5IHRoZSBoYXJkd2FyZSBiZWNhdXNlIHdlIGFyZSBub3QgYWxsb3dlZCB0byB1cGRhdGUgdGhlCisgKiAnbmV4dCcgZmllbGQgd2l0aG91dCBzeW5jaW5nIGNhbGxzIHdoZW4gdGhlIGRlc2NyaXB0b3IgaXMgYWxyZWFkeSBtYXBwZWQuCisgKi8KKworc3RhdGljIHZvaWQKK3ZpYV9tYXBfYmxpdF9mb3JfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkgICBjb25zdCBkcm1fdmlhX2RtYWJsaXRfdCAqeGZlciwKKwkJICAgZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZywgCisJCSAgIGludCBtb2RlKQoreworCXVuc2lnbmVkIGN1cl9kZXNjcmlwdG9yX3BhZ2UgPSAwOworCXVuc2lnbmVkIG51bV9kZXNjcmlwdG9yc190aGlzX3BhZ2UgPSAwOworCXVuc2lnbmVkIGNoYXIgKm1lbV9hZGRyID0geGZlci0+bWVtX2FkZHI7CisJdW5zaWduZWQgY2hhciAqY3VyX21lbTsKKwl1bnNpZ25lZCBjaGFyICpmaXJzdF9hZGRyID0gKHVuc2lnbmVkIGNoYXIgKilWSUFfUEdETihtZW1fYWRkcik7CisJdWludDMyX3QgZmJfYWRkciA9IHhmZXItPmZiX2FkZHI7CisJdWludDMyX3QgY3VyX2ZiOworCXVuc2lnbmVkIGxvbmcgbGluZV9sZW47CisJdW5zaWduZWQgcmVtYWluaW5nX2xlbjsKKwlpbnQgbnVtX2Rlc2MgPSAwOworCWludCBjdXJfbGluZTsKKwlkbWFfYWRkcl90IG5leHQgPSAwIHwgVklBX0RNQV9EUFJfRUM7CisJZHJtX3ZpYV9kZXNjcmlwdG9yX3QgKmRlc2NfcHRyID0gMDsKKworCWlmIChtb2RlID09IDEpIAorCQlkZXNjX3B0ciA9IHZzZy0+ZGVzY19wYWdlc1tjdXJfZGVzY3JpcHRvcl9wYWdlXTsKKworCWZvciAoY3VyX2xpbmUgPSAwOyBjdXJfbGluZSA8IHhmZXItPm51bV9saW5lczsgKytjdXJfbGluZSkgeworCisJCWxpbmVfbGVuID0geGZlci0+bGluZV9sZW5ndGg7CisJCWN1cl9mYiA9IGZiX2FkZHI7CisJCWN1cl9tZW0gPSBtZW1fYWRkcjsKKwkJCisJCXdoaWxlIChsaW5lX2xlbiA+IDApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nX2xlbiA9IG1pbihQQUdFX1NJWkUtVklBX1BHT0ZGKGN1cl9tZW0pLCBsaW5lX2xlbik7CisJCQlsaW5lX2xlbiAtPSByZW1haW5pbmdfbGVuOworCisJCQlpZiAobW9kZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NfcHRyLT5tZW1fYWRkciA9IAorCQkJCQlkbWFfbWFwX3BhZ2UoJnBkZXYtPmRldiwgCisJCQkJCQkgICAgIHZzZy0+cGFnZXNbVklBX1BGTihjdXJfbWVtKSAtIAorCQkJCQkJCQlWSUFfUEZOKGZpcnN0X2FkZHIpXSwKKwkJCQkJCSAgICAgVklBX1BHT0ZGKGN1cl9tZW0pLCByZW1haW5pbmdfbGVuLCAKKwkJCQkJCSAgICAgdnNnLT5kaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjX3B0ci0+ZGV2X2FkZHIgPSBjdXJfZmI7CisJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NfcHRyLT5zaXplID0gcmVtYWluaW5nX2xlbjsKKwkJCQlkZXNjX3B0ci0+bmV4dCA9ICh1aW50MzJfdCkgbmV4dDsKKwkJCQluZXh0ID0gZG1hX21hcF9zaW5nbGUoJnBkZXYtPmRldiwgZGVzY19wdHIsIHNpemVvZigqZGVzY19wdHIpLCAKKwkJCQkJCSAgICAgIERNQV9UT19ERVZJQ0UpOworCQkJCWRlc2NfcHRyKys7CisJCQkJaWYgKCsrbnVtX2Rlc2NyaXB0b3JzX3RoaXNfcGFnZSA+PSB2c2ctPmRlc2NyaXB0b3JzX3Blcl9wYWdlKSB7CisJCQkJCW51bV9kZXNjcmlwdG9yc190aGlzX3BhZ2UgPSAwOworCQkJCQlkZXNjX3B0ciA9IHZzZy0+ZGVzY19wYWdlc1srK2N1cl9kZXNjcmlwdG9yX3BhZ2VdOworCQkJCX0KKwkJCX0KKwkJCQorCQkJbnVtX2Rlc2MrKzsKKwkJCWN1cl9tZW0gKz0gcmVtYWluaW5nX2xlbjsKKwkJCWN1cl9mYiArPSByZW1haW5pbmdfbGVuOworCQl9CisJCQorCQltZW1fYWRkciArPSB4ZmVyLT5tZW1fc3RyaWRlOworCQlmYl9hZGRyICs9IHhmZXItPmZiX3N0cmlkZTsKKwl9CisKKwlpZiAobW9kZSA9PSAxKSB7CisJCXZzZy0+Y2hhaW5fc3RhcnQgPSBuZXh0OworCQl2c2ctPnN0YXRlID0gZHJfdmlhX2RldmljZV9tYXBwZWQ7CisJfQorCXZzZy0+bnVtX2Rlc2MgPSBudW1fZGVzYzsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHRoYXQgZnJlZXMgdXAgYWxsIHJlc291cmNlcyBmb3IgYSBibGl0LiBJdCBpcyB1c2FibGUgZXZlbiBpZiB0aGUgCisgKiBibGl0IGluZm8gaGFzIG9ubHkgYmUgcGFydGlhbGx5IGJ1aWx0IGFzIGxvbmcgYXMgdGhlIHN0YXR1cyBlbnVtIGlzIGNvbnNpc3RlbnQKKyAqIHdpdGggdGhlIGFjdHVhbCBzdGF0dXMgb2YgdGhlIHVzZWQgcmVzb3VyY2VzLgorICovCisKKwordm9pZAordmlhX2ZyZWVfc2dfaW5mbyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZykgCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGk7CisKKwlzd2l0Y2godnNnLT5zdGF0ZSkgeworCWNhc2UgZHJfdmlhX2RldmljZV9tYXBwZWQ6CisJCXZpYV91bm1hcF9ibGl0X2Zyb21fZGV2aWNlKHBkZXYsIHZzZyk7CisJY2FzZSBkcl92aWFfZGVzY19wYWdlc19hbGxvYzoKKwkJZm9yIChpPTA7IGk8dnNnLT5udW1fZGVzY19wYWdlczsgKytpKSB7CisJCQlpZiAodnNnLT5kZXNjX3BhZ2VzW2ldICE9IE5VTEwpCisJCQkgIGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2c2ctPmRlc2NfcGFnZXNbaV0pOworCQl9CisJCWtmcmVlKHZzZy0+ZGVzY19wYWdlcyk7CisJY2FzZSBkcl92aWFfcGFnZXNfbG9ja2VkOgorCQlmb3IgKGk9MDsgaTx2c2ctPm51bV9wYWdlczsgKytpKSB7CisJCQlpZiAoIE5VTEwgIT0gKHBhZ2UgPSB2c2ctPnBhZ2VzW2ldKSkgeworCQkJCWlmICghIFBhZ2VSZXNlcnZlZChwYWdlKSAmJiAoRE1BX0ZST01fREVWSUNFID09IHZzZy0+ZGlyZWN0aW9uKSkgCisJCQkJCVNldFBhZ2VEaXJ0eShwYWdlKTsKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQl9CisJCX0KKwljYXNlIGRyX3ZpYV9wYWdlc19hbGxvYzoKKwkJdmZyZWUodnNnLT5wYWdlcyk7CisJZGVmYXVsdDoKKwkJdnNnLT5zdGF0ZSA9IGRyX3ZpYV9zZ19pbml0OworCX0KKwlpZiAodnNnLT5ib3VuY2VfYnVmZmVyKSB7CisJCXZmcmVlKHZzZy0+Ym91bmNlX2J1ZmZlcik7CisJCXZzZy0+Ym91bmNlX2J1ZmZlciA9IE5VTEw7CisJfQorCXZzZy0+ZnJlZV9vbl9zZXF1ZW5jZSA9IDA7Cit9CQkKKworLyoKKyAqIEZpcmUgYSBibGl0IGVuZ2luZS4KKyAqLworCitzdGF0aWMgdm9pZAordmlhX2ZpcmVfZG1hYmxpdChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZywgaW50IGVuZ2luZSkKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJVklBX1dSSVRFKFZJQV9QQ0lfRE1BX01BUjAgKyBlbmdpbmUqMHgxMCwgMCk7CisJVklBX1dSSVRFKFZJQV9QQ0lfRE1BX0RBUjAgKyBlbmdpbmUqMHgxMCwgMCk7CisJVklBX1dSSVRFKFZJQV9QQ0lfRE1BX0NTUjAgKyBlbmdpbmUqMHgwNCwgVklBX0RNQV9DU1JfREQgfCBWSUFfRE1BX0NTUl9URCB8IAorCQkgIFZJQV9ETUFfQ1NSX0RFKTsKKwlWSUFfV1JJVEUoVklBX1BDSV9ETUFfTVIwICArIGVuZ2luZSoweDA0LCBWSUFfRE1BX01SX0NNIHwgVklBX0RNQV9NUl9URElFKTsKKwlWSUFfV1JJVEUoVklBX1BDSV9ETUFfQkNSMCArIGVuZ2luZSoweDEwLCAwKTsKKwlWSUFfV1JJVEUoVklBX1BDSV9ETUFfRFBSMCArIGVuZ2luZSoweDEwLCB2c2ctPmNoYWluX3N0YXJ0KTsKKwlWSUFfV1JJVEUoVklBX1BDSV9ETUFfQ1NSMCArIGVuZ2luZSoweDA0LCBWSUFfRE1BX0NTUl9ERSB8IFZJQV9ETUFfQ1NSX1RTKTsKK30KKworLyoKKyAqIE9idGFpbiBhIHBhZ2UgcG9pbnRlciBhcnJheSBhbmQgbG9jayBhbGwgcGFnZXMgaW50byBzeXN0ZW0gbWVtb3J5LiBBIHNlZ21lbnRhdGlvbiB2aW9sYXRpb24gd2lsbAorICogb2NjdXIgaGVyZSBpZiB0aGUgY2FsbGluZyB1c2VyIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBzdWJtaXR0ZWQgYWRkcmVzcy4KKyAqLworCitzdGF0aWMgaW50Cit2aWFfbG9ja19hbGxfZG1hX3BhZ2VzKGRybV92aWFfc2dfaW5mb190ICp2c2csICBkcm1fdmlhX2RtYWJsaXRfdCAqeGZlcikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmlyc3RfcGZuID0gVklBX1BGTih4ZmVyLT5tZW1fYWRkcik7CisJdnNnLT5udW1fcGFnZXMgPSBWSUFfUEZOKHhmZXItPm1lbV9hZGRyICsgKHhmZXItPm51bV9saW5lcyAqIHhmZXItPm1lbV9zdHJpZGUgLTEpKSAtIAorCQlmaXJzdF9wZm4gKyAxOworCQorCWlmIChOVUxMID09ICh2c2ctPnBhZ2VzID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiB2c2ctPm51bV9wYWdlcykpKQorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCW1lbXNldCh2c2ctPnBhZ2VzLCAwLCBzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiB2c2ctPm51bV9wYWdlcyk7CisJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCAodW5zaWduZWQgbG9uZykgeGZlci0+bWVtX2FkZHIsCisJCQkgICAgIHZzZy0+bnVtX3BhZ2VzLCB2c2ctPmRpcmVjdGlvbiwgMCwgdnNnLT5wYWdlcywgTlVMTCk7CisKKwl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWlmIChyZXQgIT0gdnNnLT5udW1fcGFnZXMpIHsKKwkJaWYgKHJldCA8IDApIAorCQkJcmV0dXJuIHJldDsKKwkJdnNnLT5zdGF0ZSA9IGRyX3ZpYV9wYWdlc19sb2NrZWQ7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCXZzZy0+c3RhdGUgPSBkcl92aWFfcGFnZXNfbG9ja2VkOworCURSTV9ERUJVRygiRE1BIHBhZ2VzIGxvY2tlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBETUEgY2FwYWJsZSBtZW1vcnkgZm9yIHRoZSBibGl0IGRlc2NyaXB0b3IgY2hhaW4sIGFuZCBhbiBhcnJheSB0aGF0IGtlZXBzIHRyYWNrIG9mIHRoZQorICogcGFnZXMgd2UgYWxsb2NhdGUuIFdlIGRvbid0IHdhbnQgdG8gdXNlIGttYWxsb2MgZm9yIHRoZSBkZXNjcmlwdG9yIGNoYWluIGJlY2F1c2UgaXQgbWF5IGJlCisgKiBxdWl0ZSBsYXJnZSBmb3Igc29tZSBibGl0cywgYW5kIHBhZ2VzIGRvbid0IG5lZWQgdG8gYmUgY29udGluZ291cy4KKyAqLworCitzdGF0aWMgaW50IAordmlhX2FsbG9jX2Rlc2NfcGFnZXMoZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZykKK3sKKwlpbnQgaTsKKwkKKwl2c2ctPmRlc2NyaXB0b3JzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gc2l6ZW9mKCBkcm1fdmlhX2Rlc2NyaXB0b3JfdCk7CisJdnNnLT5udW1fZGVzY19wYWdlcyA9ICh2c2ctPm51bV9kZXNjICsgdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZSAtIDEpIC8gCisJCXZzZy0+ZGVzY3JpcHRvcnNfcGVyX3BhZ2U7CisKKwlpZiAoTlVMTCA9PSAgKHZzZy0+ZGVzY19wYWdlcyA9IGttYWxsb2Moc2l6ZW9mKHZvaWQgKikgKiB2c2ctPm51bV9kZXNjX3BhZ2VzLCBHRlBfS0VSTkVMKSkpIAorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCQorCW1lbXNldCh2c2ctPmRlc2NfcGFnZXMsIDAsIHNpemVvZih2b2lkICopICogdnNnLT5udW1fZGVzY19wYWdlcyk7CisJdnNnLT5zdGF0ZSA9IGRyX3ZpYV9kZXNjX3BhZ2VzX2FsbG9jOworCWZvciAoaT0wOyBpPHZzZy0+bnVtX2Rlc2NfcGFnZXM7ICsraSkgeworCQlpZiAoTlVMTCA9PSAodnNnLT5kZXNjX3BhZ2VzW2ldID0gCisJCQkgICAgIChkcm1fdmlhX2Rlc2NyaXB0b3JfdCAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQorCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisJRFJNX0RFQlVHKCJBbGxvY2F0ZWQgJWQgcGFnZXMgZm9yICVkIGRlc2NyaXB0b3JzLlxuIiwgdnNnLT5udW1fZGVzY19wYWdlcywKKwkJICB2c2ctPm51bV9kZXNjKTsKKwlyZXR1cm4gMDsKK30KKwkJCQorc3RhdGljIHZvaWQKK3ZpYV9hYm9ydF9kbWFibGl0KGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZW5naW5lKQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwlWSUFfV1JJVEUoVklBX1BDSV9ETUFfQ1NSMCArIGVuZ2luZSoweDA0LCBWSUFfRE1BX0NTUl9UQSk7Cit9CisKK3N0YXRpYyB2b2lkCit2aWFfZG1hYmxpdF9lbmdpbmVfb2ZmKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZW5naW5lKQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwlWSUFfV1JJVEUoVklBX1BDSV9ETUFfQ1NSMCArIGVuZ2luZSoweDA0LCBWSUFfRE1BX0NTUl9URCB8IFZJQV9ETUFfQ1NSX0REKTsgCit9CisKKworCisvKgorICogVGhlIGRtYWJsaXQgcGFydCBvZiB0aGUgSVJRIGhhbmRsZXIuIFRyeWluZyB0byBkbyBvbmx5IHJlYXNvbmFibHkgZmFzdCB0aGluZ3MgaGVyZS4KKyAqIFRoZSByZXN0LCBsaWtlIHVubWFwcGluZyBhbmQgZnJlZWluZyBtZW1vcnkgZm9yIGRvbmUgYmxpdHMgaXMgZG9uZSBpbiBhIHNlcGFyYXRlIHdvcmtxdWV1ZQorICogdGFzay4gQmFzaWNhbGx5IHRoZSB0YXNrIG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcyB0byBzdWJtaXQgYSBuZXcgYmxpdCB0byB0aGUgZW5naW5lLCB3aGlsZQorICogdGhlIHdvcmtxdWV1ZSB0YXNrIHRha2VzIGNhcmUgb2YgcHJvY2Vzc2luZyBhc3NvY2lhdGVkIHdpdGggdGhlIG9sZCBibGl0LgorICovCisJCQordm9pZAordmlhX2RtYWJsaXRfaGFuZGxlcihkcm1fZGV2aWNlX3QgKmRldiwgaW50IGVuZ2luZSwgaW50IGZyb21faXJxKQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3ZpYV9ibGl0cV90ICpibGl0cSA9IGRldl9wcml2LT5ibGl0X3F1ZXVlcyArIGVuZ2luZTsKKwlpbnQgY3VyOworCWludCBkb25lX3RyYW5zZmVyOworCXVuc2lnbmVkIGxvbmcgaXJxc2F2ZT0wOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisKKwlEUk1fREVCVUcoIkRNQSBibGl0IGhhbmRsZXIgY2FsbGVkLiBlbmdpbmUgPSAlZCwgZnJvbV9pcnEgPSAlZCwgYmxpdHEgPSAweCVseFxuIiwKKwkJICBlbmdpbmUsIGZyb21faXJxLCAodW5zaWduZWQgbG9uZykgYmxpdHEpOworCisJaWYgKGZyb21faXJxKSB7CisJCXNwaW5fbG9jaygmYmxpdHEtPmJsaXRfbG9jayk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCX0KKworCWRvbmVfdHJhbnNmZXIgPSBibGl0cS0+aXNfYWN0aXZlICYmIAorCSAgKCggc3RhdHVzID0gVklBX1JFQUQoVklBX1BDSV9ETUFfQ1NSMCArIGVuZ2luZSoweDA0KSkgJiBWSUFfRE1BX0NTUl9URCk7CisJZG9uZV90cmFuc2ZlciA9IGRvbmVfdHJhbnNmZXIgfHwgKCBibGl0cS0+YWJvcnRpbmcgJiYgIShzdGF0dXMgJiBWSUFfRE1BX0NTUl9ERSkpOyAKKworCWN1ciA9IGJsaXRxLT5jdXI7CisJaWYgKGRvbmVfdHJhbnNmZXIpIHsKKworCQlibGl0cS0+YmxpdHNbY3VyXS0+YWJvcnRlZCA9IGJsaXRxLT5hYm9ydGluZzsKKwkJYmxpdHEtPmRvbmVfYmxpdF9oYW5kbGUrKzsKKwkJRFJNX1dBS0VVUChibGl0cS0+YmxpdF9xdWV1ZSArIGN1cik7CQkKKworCQljdXIrKzsKKwkJaWYgKGN1ciA+PSBWSUFfTlVNX0JMSVRfU0xPVFMpIAorCQkJY3VyID0gMDsKKwkJYmxpdHEtPmN1ciA9IGN1cjsKKworCQkvKgorCQkgKiBDbGVhciB0cmFuc2ZlciBkb25lIGZsYWcuCisJCSAqLworCisJCVZJQV9XUklURShWSUFfUENJX0RNQV9DU1IwICsgZW5naW5lKjB4MDQsICBWSUFfRE1BX0NTUl9URCk7CisKKwkJYmxpdHEtPmlzX2FjdGl2ZSA9IDA7CisJCWJsaXRxLT5hYm9ydGluZyA9IDA7CisJCXNjaGVkdWxlX3dvcmsoJmJsaXRxLT53cSk7CQorCisJfSBlbHNlIGlmIChibGl0cS0+aXNfYWN0aXZlICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgYmxpdHEtPmVuZCkpIHsKKworCQkvKgorCQkgKiBBYm9ydCB0cmFuc2ZlciBhZnRlciBvbmUgc2Vjb25kLgorCQkgKi8KKworCQl2aWFfYWJvcnRfZG1hYmxpdChkZXYsIGVuZ2luZSk7CisJCWJsaXRxLT5hYm9ydGluZyA9IDE7CisJCWJsaXRxLT5lbmQgPSBqaWZmaWVzICsgRFJNX0haOworCX0KKwkgIAkJCisJaWYgKCFibGl0cS0+aXNfYWN0aXZlKSB7CisJCWlmIChibGl0cS0+bnVtX291dHN0YW5kaW5nKSB7CisJCQl2aWFfZmlyZV9kbWFibGl0KGRldiwgYmxpdHEtPmJsaXRzW2N1cl0sIGVuZ2luZSk7CisJCQlibGl0cS0+aXNfYWN0aXZlID0gMTsKKwkJCWJsaXRxLT5jdXIgPSBjdXI7CisJCQlibGl0cS0+bnVtX291dHN0YW5kaW5nLS07CisJCQlibGl0cS0+ZW5kID0gamlmZmllcyArIERSTV9IWjsKKwkJCWlmICghdGltZXJfcGVuZGluZygmYmxpdHEtPnBvbGxfdGltZXIpKSB7CisJCQkJYmxpdHEtPnBvbGxfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMrMTsKKwkJCQlhZGRfdGltZXIoJmJsaXRxLT5wb2xsX3RpbWVyKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh0aW1lcl9wZW5kaW5nKCZibGl0cS0+cG9sbF90aW1lcikpIHsKKwkJCQlkZWxfdGltZXIoJmJsaXRxLT5wb2xsX3RpbWVyKTsKKwkJCX0KKwkJCXZpYV9kbWFibGl0X2VuZ2luZV9vZmYoZGV2LCBlbmdpbmUpOworCQl9CisJfQkJCisKKwlpZiAoZnJvbV9pcnEpIHsKKwkJc3Bpbl91bmxvY2soJmJsaXRxLT5ibGl0X2xvY2spOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCX0KK30gCisKKworCisvKgorICogQ2hlY2sgd2hldGhlciB0aGlzIGJsaXQgaXMgc3RpbGwgYWN0aXZlLCBwZXJmb3JtaW5nIG5lY2Vzc2FyeSBsb2NraW5nLgorICovCisKK3N0YXRpYyBpbnQKK3ZpYV9kbWFibGl0X2FjdGl2ZShkcm1fdmlhX2JsaXRxX3QgKmJsaXRxLCBpbnQgZW5naW5lLCB1aW50MzJfdCBoYW5kbGUsIHdhaXRfcXVldWVfaGVhZF90ICoqcXVldWUpCit7CisJdW5zaWduZWQgbG9uZyBpcnFzYXZlOworCXVpbnQzMl90IHNsb3Q7CisJaW50IGFjdGl2ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKKworCS8qCisJICogQWxsb3cgZm9yIGhhbmRsZSB3cmFwYXJvdW5kcy4KKwkgKi8KKworCWFjdGl2ZSA9ICgoYmxpdHEtPmRvbmVfYmxpdF9oYW5kbGUgLSBoYW5kbGUpID4gKDEgPDwgMjMpKSAmJgorCQkoKGJsaXRxLT5jdXJfYmxpdF9oYW5kbGUgLSBoYW5kbGUpIDw9ICgxIDw8IDIzKSk7CisKKwlpZiAocXVldWUgJiYgYWN0aXZlKSB7CisJCXNsb3QgPSBoYW5kbGUgLSBibGl0cS0+ZG9uZV9ibGl0X2hhbmRsZSArIGJsaXRxLT5jdXIgLTE7CisJCWlmIChzbG90ID49IFZJQV9OVU1fQkxJVF9TTE9UUykgeworCQkJc2xvdCAtPSBWSUFfTlVNX0JMSVRfU0xPVFM7CisJCX0KKwkJKnF1ZXVlID0gYmxpdHEtPmJsaXRfcXVldWUgKyBzbG90OworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCisJcmV0dXJuIGFjdGl2ZTsKK30KKwkKKy8qCisgKiBTeW5jLiBXYWl0IGZvciBhdCBsZWFzdCB0aHJlZSBzZWNvbmRzIGZvciB0aGUgYmxpdCB0byBiZSBwZXJmb3JtZWQuCisgKi8KKworc3RhdGljIGludAordmlhX2RtYWJsaXRfc3luYyhkcm1fZGV2aWNlX3QgKmRldiwgdWludDMyX3QgaGFuZGxlLCBpbnQgZW5naW5lKSAKK3sKKworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3ZpYV9ibGl0cV90ICpibGl0cSA9IGRldl9wcml2LT5ibGl0X3F1ZXVlcyArIGVuZ2luZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqcXVldWU7CisJaW50IHJldCA9IDA7CisKKwlpZiAodmlhX2RtYWJsaXRfYWN0aXZlKGJsaXRxLCBlbmdpbmUsIGhhbmRsZSwgJnF1ZXVlKSkgeworCQlEUk1fV0FJVF9PTihyZXQsICpxdWV1ZSwgMyAqIERSTV9IWiwgCisJCQkgICAgIXZpYV9kbWFibGl0X2FjdGl2ZShibGl0cSwgZW5naW5lLCBoYW5kbGUsIE5VTEwpKTsKKwl9CisJRFJNX0RFQlVHKCJETUEgYmxpdCBzeW5jIGhhbmRsZSAweCV4IGVuZ2luZSAlZCByZXR1cm5lZCAlZFxuIiwKKwkJICBoYW5kbGUsIGVuZ2luZSwgcmV0KTsKKwkKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBBIHRpbWVyIHRoYXQgcmVndWxhcmx5IHBvbGxzIHRoZSBibGl0IGVuZ2luZSBpbiBjYXNlcyB3aGVyZSB3ZSBkb24ndCBoYXZlIGludGVycnVwdHM6CisgKiBhKSBCcm9rZW4gaGFyZHdhcmUgKHR5cGljYWxseSB0aG9zZSB0aGF0IGRvbid0IGhhdmUgYW55IHZpZGVvIGNhcHR1cmUgZmFjaWxpdHkpLgorICogYikgQmxpdCBhYm9ydC4gVGhlIGhhcmR3YXJlIGRvZXNuJ3Qgc2VuZCBhbiBpbnRlcnJ1cHQgd2hlbiBhIGJsaXQgaXMgYWJvcnRlZC4KKyAqIFRoZSB0aW1lciBhbmQgaGFyZHdhcmUgSVJRJ3MgY2FuIGFuZCBkbyB3b3JrIGluIHBhcmFsbGVsLiBJZiB0aGUgaGFyZHdhcmUgaGFzCisgKiBpcnFzLCBpdCB3aWxsIHNob3J0ZW4gdGhlIGxhdGVuY3kgc29tZXdoYXQuCisgKi8KKworCisKK3N0YXRpYyB2b2lkCit2aWFfZG1hYmxpdF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJZHJtX3ZpYV9ibGl0cV90ICpibGl0cSA9IChkcm1fdmlhX2JsaXRxX3QgKikgZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IGJsaXRxLT5kZXY7CisJaW50IGVuZ2luZSA9IChpbnQpCisJCShibGl0cSAtICgoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlKS0+YmxpdF9xdWV1ZXMpOworCQkKKwlEUk1fREVCVUcoIlBvbGxpbmcgdGltZXIgY2FsbGVkIGZvciBlbmdpbmUgJWQsIGppZmZpZXMgJWx1XG4iLCBlbmdpbmUsIAorCQkgICh1bnNpZ25lZCBsb25nKSBqaWZmaWVzKTsKKworCXZpYV9kbWFibGl0X2hhbmRsZXIoZGV2LCBlbmdpbmUsIDApOworCQorCWlmICghdGltZXJfcGVuZGluZygmYmxpdHEtPnBvbGxfdGltZXIpKSB7CisJCWJsaXRxLT5wb2xsX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzKzE7CisJCWFkZF90aW1lcigmYmxpdHEtPnBvbGxfdGltZXIpOworCX0KKwl2aWFfZG1hYmxpdF9oYW5kbGVyKGRldiwgZW5naW5lLCAwKTsKKworfQorCisKKworCisvKgorICogV29ya3F1ZXVlIHRhc2sgdGhhdCBmcmVlcyBkYXRhIGFuZCBtYXBwaW5ncyBhc3NvY2lhdGVkIHdpdGggYSBibGl0LgorICogQWxzbyB3YWtlcyB1cCB3YWl0aW5nIHByb2Nlc3Nlcy4gRWFjaCBvZiB0aGVzZSB0YXNrcyBoYW5kbGVzIG9uZQorICogYmxpdCBlbmdpbmUgb25seSBhbmQgbWF5IG5vdCBiZSBjYWxsZWQgb24gZWFjaCBpbnRlcnJ1cHQuCisgKi8KKworCitzdGF0aWMgdm9pZCAKK3ZpYV9kbWFibGl0X3dvcmtxdWV1ZSh2b2lkICpkYXRhKQoreworCWRybV92aWFfYmxpdHFfdCAqYmxpdHEgPSAoZHJtX3ZpYV9ibGl0cV90ICopIGRhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBibGl0cS0+ZGV2OworCXVuc2lnbmVkIGxvbmcgaXJxc2F2ZTsKKwlkcm1fdmlhX3NnX2luZm9fdCAqY3VyX3NnOworCWludCBjdXJfcmVsZWFzZWQ7CisJCisJCisJRFJNX0RFQlVHKCJXb3JrcXVldWUgdGFzayBjYWxsZWQgZm9yIGJsaXQgZW5naW5lICVsZFxuIiwodW5zaWduZWQgbG9uZykgCisJCSAgKGJsaXRxIC0gKChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGUpLT5ibGl0X3F1ZXVlcykpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCQorCXdoaWxlKGJsaXRxLT5zZXJ2aWNlZCAhPSBibGl0cS0+Y3VyKSB7CisKKwkJY3VyX3JlbGVhc2VkID0gYmxpdHEtPnNlcnZpY2VkKys7CisKKwkJRFJNX0RFQlVHKCJSZWxlYXNpbmcgYmxpdCBzbG90ICVkXG4iLCBjdXJfcmVsZWFzZWQpOworCisJCWlmIChibGl0cS0+c2VydmljZWQgPj0gVklBX05VTV9CTElUX1NMT1RTKSAKKwkJCWJsaXRxLT5zZXJ2aWNlZCA9IDA7CisJCQorCQljdXJfc2cgPSBibGl0cS0+YmxpdHNbY3VyX3JlbGVhc2VkXTsKKwkJYmxpdHEtPm51bV9mcmVlKys7CisJCQkJCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCQkKKwkJRFJNX1dBS0VVUCgmYmxpdHEtPmJ1c3lfcXVldWUpOworCQkKKwkJdmlhX2ZyZWVfc2dfaW5mbyhkZXYtPnBkZXYsIGN1cl9zZyk7CisJCWtmcmVlKGN1cl9zZyk7CisJCQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7Cit9CisJCisKKy8qCisgKiBJbml0IGFsbCBibGl0IGVuZ2luZXMuIEN1cnJlbnRseSB3ZSB1c2UgdHdvLCBidXQgc29tZSBoYXJkd2FyZSBoYXZlIDQuCisgKi8KKworCit2b2lkCit2aWFfaW5pdF9kbWFibGl0KGRybV9kZXZpY2VfdCAqZGV2KQoreworCWludCBpLGo7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fdmlhX2JsaXRxX3QgKmJsaXRxOworCisJcGNpX3NldF9tYXN0ZXIoZGV2LT5wZGV2KTsJCisJCisJZm9yIChpPTA7IGk8IFZJQV9OVU1fQkxJVF9FTkdJTkVTOyArK2kpIHsKKwkJYmxpdHEgPSBkZXZfcHJpdi0+YmxpdF9xdWV1ZXMgKyBpOworCQlibGl0cS0+ZGV2ID0gZGV2OworCQlibGl0cS0+Y3VyX2JsaXRfaGFuZGxlID0gMDsKKwkJYmxpdHEtPmRvbmVfYmxpdF9oYW5kbGUgPSAwOworCQlibGl0cS0+aGVhZCA9IDA7CisJCWJsaXRxLT5jdXIgPSAwOworCQlibGl0cS0+c2VydmljZWQgPSAwOworCQlibGl0cS0+bnVtX2ZyZWUgPSBWSUFfTlVNX0JMSVRfU0xPVFM7CisJCWJsaXRxLT5udW1fb3V0c3RhbmRpbmcgPSAwOworCQlibGl0cS0+aXNfYWN0aXZlID0gMDsKKwkJYmxpdHEtPmFib3J0aW5nID0gMDsKKwkJYmxpdHEtPmJsaXRfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwkJZm9yIChqPTA7IGo8VklBX05VTV9CTElUX1NMT1RTOyArK2opIHsKKwkJCURSTV9JTklUX1dBSVRRVUVVRShibGl0cS0+YmxpdF9xdWV1ZSArIGopOworCQl9CisJCURSTV9JTklUX1dBSVRRVUVVRSgmYmxpdHEtPmJ1c3lfcXVldWUpOworCQlJTklUX1dPUksoJmJsaXRxLT53cSwgdmlhX2RtYWJsaXRfd29ya3F1ZXVlLCBibGl0cSk7CisJCWluaXRfdGltZXIoJmJsaXRxLT5wb2xsX3RpbWVyKTsKKwkJYmxpdHEtPnBvbGxfdGltZXIuZnVuY3Rpb24gPSAmdmlhX2RtYWJsaXRfdGltZXI7CisJCWJsaXRxLT5wb2xsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYmxpdHE7CisJfQkKK30KKworLyoKKyAqIEJ1aWxkIGFsbCBpbmZvIGFuZCBkbyBhbGwgbWFwcGluZ3MgcmVxdWlyZWQgZm9yIGEgYmxpdC4KKyAqLworCQkKKworc3RhdGljIGludAordmlhX2J1aWxkX3NnX2luZm8oZHJtX2RldmljZV90ICpkZXYsIGRybV92aWFfc2dfaW5mb190ICp2c2csIGRybV92aWFfZG1hYmxpdF90ICp4ZmVyKQoreworCWludCBkcmF3ID0geGZlci0+dG9fZmI7CisJaW50IHJldCA9IDA7CisJCisJdnNnLT5kaXJlY3Rpb24gPSAoZHJhdykgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFOworCXZzZy0+Ym91bmNlX2J1ZmZlciA9IDA7CisKKwl2c2ctPnN0YXRlID0gZHJfdmlhX3NnX2luaXQ7CisKKwlpZiAoeGZlci0+bnVtX2xpbmVzIDw9IDAgfHwgeGZlci0+bGluZV9sZW5ndGggPD0gMCkgeworCQlEUk1fRVJST1IoIlplcm8gc2l6ZSBiaXRibHQuXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwkvKgorCSAqIEJlbG93IGNoZWNrIGlzIGEgZHJpdmVyIGxpbWl0YXRpb24sIG5vdCBhIGhhcmR3YXJlIG9uZS4gV2UKKwkgKiBkb24ndCB3YW50IHRvIGxvY2sgdW51c2VkIHBhZ2VzLCBhbmQgZG9uJ3Qgd2FudCB0byBpbmNvcG9yYXRlIHRoZQorCSAqIGV4dHJhIGxvZ2ljIG9mIGF2b2lkaW5nIHRoZW0uIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8uIAorCSAqIChOb3QgYSBiaWcgbGltaXRhdGlvbiBhbnl3YXkuKQorCSAqLworCisJaWYgKCgoeGZlci0+bWVtX3N0cmlkZSAtIHhmZXItPmxpbmVfbGVuZ3RoKSA+PSBQQUdFX1NJWkUpIHx8CisJICAgICh4ZmVyLT5tZW1fc3RyaWRlID4gMjA0OCo0KSkgeworCQlEUk1fRVJST1IoIlRvbyBsYXJnZSBzeXN0ZW0gbWVtb3J5IHN0cmlkZS4gU3RyaWRlOiAlZCwgIgorCQkJICAiTGVuZ3RoOiAlZFxuIiwgeGZlci0+bWVtX3N0cmlkZSwgeGZlci0+bGluZV9sZW5ndGgpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICh4ZmVyLT5udW1fbGluZXMgPiAyMDQ4KSB7CisJCURSTV9FUlJPUigiVG9vIG1hbnkgUENJIERNQSBiaXRibHQgbGluZXMuXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CQkKKworCS8qIAorCSAqIHdlIGFsbG93IGEgbmVnYXRpdmUgZmIgc3RyaWRlIHRvIGFsbG93IGZsaXBwaW5nIG9mIGltYWdlcyBpbgorCSAqIHRyYW5zZmVyLiAKKwkgKi8KKworCWlmICh4ZmVyLT5tZW1fc3RyaWRlIDwgeGZlci0+bGluZV9sZW5ndGggfHwKKwkJYWJzKHhmZXItPmZiX3N0cmlkZSkgPCB4ZmVyLT5saW5lX2xlbmd0aCkgeworCQlEUk1fRVJST1IoIkludmFsaWQgZnJhbWUtYnVmZmVyIC8gbWVtb3J5IHN0cmlkZS5cbiIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qCisJICogQSBoYXJkd2FyZSBidWcgc2VlbXMgdG8gYmUgd29ya2VkIGFyb3VuZCBpZiBzeXN0ZW0gbWVtb3J5IGFkZHJlc3NlcyBzdGFydCBvbgorCSAqIDE2IGJ5dGUgYm91bmRhcmllcy4gVGhpcyBzZWVtcyBhIGJpdCByZXN0cmljdGl2ZSBob3dldmVyLiBWSUEgaXMgY29udGFjdGVkCisJICogYWJvdXQgdGhpcy4gTWVhbndoaWxlLCBpbXBvc2UgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisJICovCisKKyNpZmRlZiBWSUFfQlVHRlJFRQorCWlmICgoKCh1bnNpZ25lZCBsb25nKXhmZXItPm1lbV9hZGRyICYgMykgIT0gKCh1bnNpZ25lZCBsb25nKXhmZXItPmZiX2FkZHIgJiAzKSkgfHwKKwkgICAgKCh4ZmVyLT5tZW1fc3RyaWRlICYgMykgIT0gKHhmZXItPmZiX3N0cmlkZSAmIDMpKSkgeworCQlEUk1fRVJST1IoIkludmFsaWQgRFJNIGJpdGJsdCBhbGlnbm1lbnQuXG4iKTsKKwkgICAgICAgIHJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorI2Vsc2UKKwlpZiAoKCgodW5zaWduZWQgbG9uZyl4ZmVyLT5tZW1fYWRkciAmIDE1KSB8fAorCSAgICAoKHVuc2lnbmVkIGxvbmcpeGZlci0+ZmJfYWRkciAmIDMpKSB8fCAoeGZlci0+bWVtX3N0cmlkZSAmIDE1KSB8fAorCSAgICAoeGZlci0+ZmJfc3RyaWRlICYgMykpIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIERSTSBiaXRibHQgYWxpZ25tZW50LlxuIik7CisJICAgICAgICByZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0JCisjZW5kaWYKKworCWlmICgwICE9IChyZXQgPSB2aWFfbG9ja19hbGxfZG1hX3BhZ2VzKHZzZywgeGZlcikpKSB7CisJCURSTV9FUlJPUigiQ291bGQgbm90IGxvY2sgRE1BIHBhZ2VzLlxuIik7CisJCXZpYV9mcmVlX3NnX2luZm8oZGV2LT5wZGV2LCB2c2cpOworCQlyZXR1cm4gcmV0OworCX0KKworCXZpYV9tYXBfYmxpdF9mb3JfZGV2aWNlKGRldi0+cGRldiwgeGZlciwgdnNnLCAwKTsKKwlpZiAoMCAhPSAocmV0ID0gdmlhX2FsbG9jX2Rlc2NfcGFnZXModnNnKSkpIHsKKwkJRFJNX0VSUk9SKCJDb3VsZCBub3QgYWxsb2NhdGUgRE1BIGRlc2NyaXB0b3IgcGFnZXMuXG4iKTsKKwkJdmlhX2ZyZWVfc2dfaW5mbyhkZXYtPnBkZXYsIHZzZyk7CisJCXJldHVybiByZXQ7CisJfQorCXZpYV9tYXBfYmxpdF9mb3JfZGV2aWNlKGRldi0+cGRldiwgeGZlciwgdnNnLCAxKTsKKwkKKwlyZXR1cm4gMDsKK30KKwkKKworLyoKKyAqIFJlc2VydmUgb25lIGZyZWUgc2xvdCBpbiB0aGUgYmxpdCBxdWV1ZS4gV2lsbCB3YWl0IGZvciBvbmUgc2Vjb25kIGZvciBvbmUKKyAqIHRvIGJlY29tZSBhdmFpbGFibGUuIE90aGVyd2lzZSAtRUJVU1kgaXMgcmV0dXJuZWQuCisgKi8KKworc3RhdGljIGludCAKK3ZpYV9kbWFibGl0X2dyYWJfc2xvdChkcm1fdmlhX2JsaXRxX3QgKmJsaXRxLCBpbnQgZW5naW5lKQoreworCWludCByZXQ9MDsKKwl1bnNpZ25lZCBsb25nIGlycXNhdmU7CisKKwlEUk1fREVCVUcoIk51bSBmcmVlIGlzICVkXG4iLCBibGl0cS0+bnVtX2ZyZWUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKKwl3aGlsZShibGl0cS0+bnVtX2ZyZWUgPT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKKworCQlEUk1fV0FJVF9PTihyZXQsIGJsaXRxLT5idXN5X3F1ZXVlLCBEUk1fSFosIGJsaXRxLT5udW1fZnJlZSA+IDApOworCQlpZiAocmV0KSB7CisJCQlyZXR1cm4gKERSTV9FUlIoRUlOVFIpID09IHJldCkgPyBEUk1fRVJSKEVBR0FJTikgOiByZXQ7CisJCX0KKwkJCisJCXNwaW5fbG9ja19pcnFzYXZlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKKwl9CisJCisJYmxpdHEtPm51bV9mcmVlLS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhhbmQgYmFjayBhIGZyZWUgc2xvdCBpZiB3ZSBjaGFuZ2VkIG91ciBtaW5kLgorICovCisKK3N0YXRpYyB2b2lkIAordmlhX2RtYWJsaXRfcmVsZWFzZV9zbG90KGRybV92aWFfYmxpdHFfdCAqYmxpdHEpCit7CisJdW5zaWduZWQgbG9uZyBpcnFzYXZlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCWJsaXRxLT5udW1fZnJlZSsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCURSTV9XQUtFVVAoICZibGl0cS0+YnVzeV9xdWV1ZSApOworfQorCisvKgorICogR3JhYiBhIGZyZWUgc2xvdC4gQnVpbGQgYmxpdCBpbmZvIGFuZCBxdWV1ZSBhIGJsaXQuCisgKi8KKworCitzdGF0aWMgaW50IAordmlhX2RtYWJsaXQoZHJtX2RldmljZV90ICpkZXYsIGRybV92aWFfZG1hYmxpdF90ICp4ZmVyKQkgCit7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fdmlhX3NnX2luZm9fdCAqdnNnOworCWRybV92aWFfYmxpdHFfdCAqYmxpdHE7CisgICAgICAgIGludCByZXQ7CisJaW50IGVuZ2luZTsKKwl1bnNpZ25lZCBsb25nIGlycXNhdmU7CisKKwlpZiAoZGV2X3ByaXYgPT0gTlVMTCkgeworCQlEUk1fRVJST1IoIkNhbGxlZCB3aXRob3V0IGluaXRpYWxpemF0aW9uLlxuIik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZW5naW5lID0gKHhmZXItPnRvX2ZiKSA/IDAgOiAxOworCWJsaXRxID0gZGV2X3ByaXYtPmJsaXRfcXVldWVzICsgZW5naW5lOworCWlmICgwICE9IChyZXQgPSB2aWFfZG1hYmxpdF9ncmFiX3Nsb3QoYmxpdHEsIGVuZ2luZSkpKSB7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChOVUxMID09ICh2c2cgPSBrbWFsbG9jKHNpemVvZigqdnNnKSwgR0ZQX0tFUk5FTCkpKSB7CisJCXZpYV9kbWFibGl0X3JlbGVhc2Vfc2xvdChibGl0cSk7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCWlmICgwICE9IChyZXQgPSB2aWFfYnVpbGRfc2dfaW5mbyhkZXYsIHZzZywgeGZlcikpKSB7CisJCXZpYV9kbWFibGl0X3JlbGVhc2Vfc2xvdChibGl0cSk7CisJCWtmcmVlKHZzZyk7CisJCXJldHVybiByZXQ7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKKworCWJsaXRxLT5ibGl0c1tibGl0cS0+aGVhZCsrXSA9IHZzZzsKKwlpZiAoYmxpdHEtPmhlYWQgPj0gVklBX05VTV9CTElUX1NMT1RTKSAKKwkJYmxpdHEtPmhlYWQgPSAwOworCWJsaXRxLT5udW1fb3V0c3RhbmRpbmcrKzsKKwl4ZmVyLT5zeW5jLnN5bmNfaGFuZGxlID0gKytibGl0cS0+Y3VyX2JsaXRfaGFuZGxlOyAKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCXhmZXItPnN5bmMuZW5naW5lID0gZW5naW5lOworCisgICAgICAgCXZpYV9kbWFibGl0X2hhbmRsZXIoZGV2LCBlbmdpbmUsIDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTeW5jIG9uIGEgcHJldmlvdXNseSBzdWJtaXR0ZWQgYmxpdC4gTm90ZSB0aGF0IHRoZSBYIHNlcnZlciB1c2Ugc2lnbmFscyBleHRlbnNpdmVseSwgYW5kCisgKiB0aGF0IHRoZXJlIGlzIGEgdmVyeSBiaWcgcHJvYWJpbGl0eSB0aGF0IHRoaXMgSU9DVEwgd2lsbCBiZSBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4gSW4gdGhhdAorICogY2FzZSBpdCByZXR1cm5zIHdpdGggLUVBR0FJTiBmb3IgdGhlIHNpZ25hbCB0byBiZSBkZWxpdmVyZWQuIAorICogVGhlIGNhbGxlciBzaG91bGQgdGhlbiByZWlzc3VlIHRoZSBJT0NUTC4gVGhpcyBpcyBzaW1pbGFyIHRvIHdoYXQgaXMgYmVpbmcgZG9uZSBmb3IgZHJtR2V0TG9jaygpLgorICovCisKK2ludAordmlhX2RtYV9ibGl0X3N5bmMoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlkcm1fdmlhX2JsaXRzeW5jX3Qgc3luYzsKKwlpbnQgZXJyOworCURSTV9ERVZJQ0U7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoc3luYywgKGRybV92aWFfYmxpdHN5bmNfdCAqKWRhdGEsIHNpemVvZihzeW5jKSk7CisJCisJaWYgKHN5bmMuZW5naW5lID49IFZJQV9OVU1fQkxJVF9FTkdJTkVTKSAKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCWVyciA9IHZpYV9kbWFibGl0X3N5bmMoZGV2LCBzeW5jLnN5bmNfaGFuZGxlLCBzeW5jLmVuZ2luZSk7CisKKwlpZiAoRFJNX0VSUihFSU5UUikgPT0gZXJyKQorCQllcnIgPSBEUk1fRVJSKEVBR0FJTik7CisKKwlyZXR1cm4gZXJyOworfQorCQorCisvKgorICogUXVldWUgYSBibGl0IGFuZCBoYW5kIGJhY2sgYSBoYW5kbGUgdG8gYmUgdXNlZCBmb3Igc3luYy4gVGhpcyBJT0NUTCBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwKKyAqIHdoaWxlIHdhaXRpbmcgZm9yIGEgZnJlZSBzbG90IGluIHRoZSBibGl0IHF1ZXVlLiBJbiB0aGF0IGNhc2UgaXQgcmV0dXJucyB3aXRoIC1FQUdBSU4gYW5kIHNob3VsZCAKKyAqIGJlIHJlaXNzdWVkLiBTZWUgdGhlIGFib3ZlIElPQ1RMIGNvZGUuCisgKi8KKworaW50IAordmlhX2RtYV9ibGl0KCBEUk1fSU9DVExfQVJHUyApCit7CisJZHJtX3ZpYV9kbWFibGl0X3QgeGZlcjsKKwlpbnQgZXJyOworCURSTV9ERVZJQ0U7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoeGZlciwgKGRybV92aWFfZG1hYmxpdF90IF9fdXNlciAqKWRhdGEsIHNpemVvZih4ZmVyKSk7CisKKwllcnIgPSB2aWFfZG1hYmxpdChkZXYsICZ4ZmVyKTsKKworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKHZvaWQgX191c2VyICopZGF0YSwgeGZlciwgc2l6ZW9mKHhmZXIpKTsKKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwMzZjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuaApAQCAtMCwwICsxLDE0MCBAQAorLyogdmlhX2RtYWJsaXQuaCAtLSBQQ0kgRE1BIEJpdEJsdCBzdXBwb3J0IGZvciB0aGUgVklBIFVuaWNocm9tZS9Qcm8KKyAqIAorICogQ29weXJpZ2h0IDIwMDUgVGhvbWFzIEhlbGxzdHJvbS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSAKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogCisgKiAgICBUaG9tYXMgSGVsbHN0cm9tLgorICogICAgUmVnaXN0ZXIgaW5mbyBmcm9tIERpZ2VvIEluYy4KKyAqLworCisjaWZuZGVmIF9WSUFfRE1BQkxJVF9ICisjZGVmaW5lIF9WSUFfRE1BQkxJVF9ICisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjZGVmaW5lIFZJQV9OVU1fQkxJVF9FTkdJTkVTIDIKKyNkZWZpbmUgVklBX05VTV9CTElUX1NMT1RTIDgKKworc3RydWN0IF9kcm1fdmlhX2Rlc2NyaXB0b3I7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX3NnX2luZm8geworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisJdW5zaWduZWQgbG9uZyBudW1fcGFnZXM7CisJc3RydWN0IF9kcm1fdmlhX2Rlc2NyaXB0b3IgKipkZXNjX3BhZ2VzOworCWludCBudW1fZGVzY19wYWdlczsKKwlpbnQgbnVtX2Rlc2M7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uOworCXVuc2lnbmVkIGNoYXIgKmJvdW5jZV9idWZmZXI7CisgICAgICAgIGRtYV9hZGRyX3QgY2hhaW5fc3RhcnQ7CisJdWludDMyX3QgZnJlZV9vbl9zZXF1ZW5jZTsKKyAgICAgICAgdW5zaWduZWQgaW50IGRlc2NyaXB0b3JzX3Blcl9wYWdlOworCWludCBhYm9ydGVkOworCWVudW0geworCSAgICAgICAgZHJfdmlhX2RldmljZV9tYXBwZWQsCisJCWRyX3ZpYV9kZXNjX3BhZ2VzX2FsbG9jLAorCQlkcl92aWFfcGFnZXNfbG9ja2VkLAorCQlkcl92aWFfcGFnZXNfYWxsb2MsCisJCWRyX3ZpYV9zZ19pbml0CisJfSBzdGF0ZTsKK30gZHJtX3ZpYV9zZ19pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2JsaXRxIHsKKwlkcm1fZGV2aWNlX3QgKmRldjsKKwl1aW50MzJfdCBjdXJfYmxpdF9oYW5kbGU7CisJdWludDMyX3QgZG9uZV9ibGl0X2hhbmRsZTsKKwl1bnNpZ25lZCBzZXJ2aWNlZDsKKwl1bnNpZ25lZCBoZWFkOworCXVuc2lnbmVkIGN1cjsKKwl1bnNpZ25lZCBudW1fZnJlZTsKKwl1bnNpZ25lZCBudW1fb3V0c3RhbmRpbmc7CisJdW5zaWduZWQgbG9uZyBlbmQ7ICAKKyAgICAgICAgaW50IGFib3J0aW5nOworCWludCBpc19hY3RpdmU7CisJZHJtX3ZpYV9zZ19pbmZvX3QgKmJsaXRzW1ZJQV9OVU1fQkxJVF9TTE9UU107CisJc3BpbmxvY2tfdCBibGl0X2xvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QgYmxpdF9xdWV1ZVtWSUFfTlVNX0JMSVRfU0xPVFNdOworCXdhaXRfcXVldWVfaGVhZF90IGJ1c3lfcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0IHdxOworCXN0cnVjdCB0aW1lcl9saXN0IHBvbGxfdGltZXI7Cit9IGRybV92aWFfYmxpdHFfdDsKKwkKKworLyogCisgKiAgUENJIERNQSBSZWdpc3RlcnMKKyAqICBDaGFubmVscyAyICYgMyBkb24ndCBzZWVtIHRvIGJlIGltcGxlbWVudGVkIGluIGhhcmR3YXJlLgorICovCisgCisjZGVmaW5lIFZJQV9QQ0lfRE1BX01BUjAgICAgICAgICAgICAweEU0MCAgIC8qIE1lbW9yeSBBZGRyZXNzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMCAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfREFSMCAgICAgICAgICAgIDB4RTQ0ICAgLyogRGV2aWNlIEFkZHJlc3MgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAwICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9CQ1IwICAgICAgICAgICAgMHhFNDggICAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIG9mIENoYW5uZWwgMCAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfRFBSMCAgICAgICAgICAgIDB4RTRDICAgLyogRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyIG9mIENoYW5uZWwgMCAqLyAKKworI2RlZmluZSBWSUFfUENJX0RNQV9NQVIxICAgICAgICAgICAgMHhFNTAgICAvKiBNZW1vcnkgQWRkcmVzcyBSZWdpc3RlciBvZiBDaGFubmVsIDEgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0RBUjEgICAgICAgICAgICAweEU1NCAgIC8qIERldmljZSBBZGRyZXNzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMSAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfQkNSMSAgICAgICAgICAgIDB4RTU4ICAgLyogQnl0ZSBDb3VudCBSZWdpc3RlciBvZiBDaGFubmVsIDEgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0RQUjEgICAgICAgICAgICAweEU1QyAgIC8qIERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciBvZiBDaGFubmVsIDEgKi8gCisKKyNkZWZpbmUgVklBX1BDSV9ETUFfTUFSMiAgICAgICAgICAgIDB4RTYwICAgLyogTWVtb3J5IEFkZHJlc3MgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAyICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9EQVIyICAgICAgICAgICAgMHhFNjQgICAvKiBEZXZpY2UgQWRkcmVzcyBSZWdpc3RlciBvZiBDaGFubmVsIDIgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0JDUjIgICAgICAgICAgICAweEU2OCAgIC8qIEJ5dGUgQ291bnQgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAyICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9EUFIyICAgICAgICAgICAgMHhFNkMgICAvKiBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAyICovIAorCisjZGVmaW5lIFZJQV9QQ0lfRE1BX01BUjMgICAgICAgICAgICAweEU3MCAgIC8qIE1lbW9yeSBBZGRyZXNzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMyAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfREFSMyAgICAgICAgICAgIDB4RTc0ICAgLyogRGV2aWNlIEFkZHJlc3MgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAzICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9CQ1IzICAgICAgICAgICAgMHhFNzggICAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIG9mIENoYW5uZWwgMyAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfRFBSMyAgICAgICAgICAgIDB4RTdDICAgLyogRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyIG9mIENoYW5uZWwgMyAqLyAKKworI2RlZmluZSBWSUFfUENJX0RNQV9NUjAgICAgICAgICAgICAgMHhFODAgICAvKiBNb2RlIFJlZ2lzdGVyIG9mIENoYW5uZWwgMCAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfTVIxICAgICAgICAgICAgIDB4RTg0ICAgLyogTW9kZSBSZWdpc3RlciBvZiBDaGFubmVsIDEgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX01SMiAgICAgICAgICAgICAweEU4OCAgIC8qIE1vZGUgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAyICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9NUjMgICAgICAgICAgICAgMHhFOEMgICAvKiBNb2RlIFJlZ2lzdGVyIG9mIENoYW5uZWwgMyAqLyAKKworI2RlZmluZSBWSUFfUENJX0RNQV9DU1IwICAgICAgICAgICAgMHhFOTAgICAvKiBDb21tYW5kL1N0YXR1cyBSZWdpc3RlciBvZiBDaGFubmVsIDAgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0NTUjEgICAgICAgICAgICAweEU5NCAgIC8qIENvbW1hbmQvU3RhdHVzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMSAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfQ1NSMiAgICAgICAgICAgIDB4RTk4ICAgLyogQ29tbWFuZC9TdGF0dXMgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAyICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9DU1IzICAgICAgICAgICAgMHhFOUMgICAvKiBDb21tYW5kL1N0YXR1cyBSZWdpc3RlciBvZiBDaGFubmVsIDMgKi8gCisKKyNkZWZpbmUgVklBX1BDSV9ETUFfUFRSICAgICAgICAgICAgIDB4RUEwICAgLyogUHJpb3JpdHkgVHlwZSBSZWdpc3RlciAqLyAKKworLyogRGVmaW5lIGZvciBETUEgZW5naW5lICovIAorLyogRFBSICovCisjZGVmaW5lIFZJQV9ETUFfRFBSX0VDCQkoMTw8MSkJLyogZW5kIG9mIGNoYWluICovCisjZGVmaW5lIFZJQV9ETUFfRFBSX0RESUUJKDE8PDIpCS8qIGRlc2NyaXB0b3IgZG9uZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFZJQV9ETUFfRFBSX0RUCQkoMTw8MykJLyogZGlyZWN0aW9uIG9mIHRyYW5zZmVyIChSTykgKi8KKworLyogTVIgKi8KKyNkZWZpbmUgVklBX0RNQV9NUl9DTQkJKDE8PDApCS8qIGNoYWluaW5nIG1vZGUgKi8KKyNkZWZpbmUgVklBX0RNQV9NUl9URElFCQkoMTw8MSkJLyogdHJhbnNmZXIgZG9uZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFZJQV9ETUFfTVJfSEVORE1BQ01ECQkoMTw8NykgLyogPyAqLworCisvKiBDU1IgKi8KKyNkZWZpbmUgVklBX0RNQV9DU1JfREUJCSgxPDwwKQkvKiBETUEgZW5hYmxlICovCisjZGVmaW5lIFZJQV9ETUFfQ1NSX1RTCQkoMTw8MSkJLyogdHJhbnNmZXIgc3RhcnQgKi8KKyNkZWZpbmUgVklBX0RNQV9DU1JfVEEJCSgxPDwyKQkvKiB0cmFuc2ZlciBhYm9ydCAqLworI2RlZmluZSBWSUFfRE1BX0NTUl9URAkJKDE8PDMpCS8qIHRyYW5zZmVyIGRvbmUgKi8KKyNkZWZpbmUgVklBX0RNQV9DU1JfREQJCSgxPDw0KQkvKiBkZXNjcmlwdG9yIGRvbmUgKi8KKyNkZWZpbmUgVklBX0RNQV9EUFJfRUMgICAgICAgICAgKDE8PDEpICAvKiBlbmQgb2YgY2hhaW4gKi8KKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcm0uaAppbmRleCBlYmRlOTIwLi40N2YwYjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcm0uaApAQCAtNzUsNiArNzUsOCBAQAogI2RlZmluZSBEUk1fVklBX0NNREJVRl9TSVpFCTB4MGIKICNkZWZpbmUgTk9UX1VTRUQKICNkZWZpbmUgRFJNX1ZJQV9XQUlUX0lSUSAgICAgICAgMHgwZAorI2RlZmluZSBEUk1fVklBX0RNQV9CTElUICAgICAgICAweDBlCisjZGVmaW5lIERSTV9WSUFfQkxJVF9TWU5DICAgICAgIDB4MGYKIAogI2RlZmluZSBEUk1fSU9DVExfVklBX0FMTE9DTUVNCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfQUxMT0NNRU0sIGRybV92aWFfbWVtX3QpCiAjZGVmaW5lIERSTV9JT0NUTF9WSUFfRlJFRU1FTQkgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0ZSRUVNRU0sIGRybV92aWFfbWVtX3QpCkBAIC04OSw2ICs5MSw4IEBACiAjZGVmaW5lIERSTV9JT0NUTF9WSUFfQ01EQlVGX1NJWkUgRFJNX0lPV1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0NNREJVRl9TSVpFLCBcCiAJCQkJCSAgICBkcm1fdmlhX2NtZGJ1Zl9zaXplX3QpCiAjZGVmaW5lIERSTV9JT0NUTF9WSUFfV0FJVF9JUlEgICAgRFJNX0lPV1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX1dBSVRfSVJRLCBkcm1fdmlhX2lycXdhaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9ETUFfQkxJVCAgICBEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0RNQV9CTElULCBkcm1fdmlhX2RtYWJsaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9CTElUX1NZTkMgICBEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0JMSVRfU1lOQywgZHJtX3ZpYV9ibGl0c3luY190KQogCiAvKiBJbmRpY2VzIGludG8gYnVmLlNldHVwIHdoZXJlIHZhcmlvdXMgYml0cyBvZiBzdGF0ZSBhcmUgbWlycm9yZWQgcGVyCiAgKiBjb250ZXh0IGFuZCBwZXIgYnVmZmVyLiAgVGhlc2UgY2FuIGJlIGZpcmVkIGF0IHRoZSBjYXJkIGFzIGEgdW5pdCwKQEAgLTEwMyw4ICsxMDcsMTIgQEAKICNkZWZpbmUgVklBX0JBQ0sgICAgMHgyCiAjZGVmaW5lIFZJQV9ERVBUSCAgIDB4NAogI2RlZmluZSBWSUFfU1RFTkNJTCAweDgKLSNkZWZpbmUgVklERU8gMAotI2RlZmluZSBBR1AgMQorI2RlZmluZSBWSUFfTUVNX1ZJREVPICAgMAkvKiBtYXRjaGVzIGRybSBjb25zdGFudCAqLworI2RlZmluZSBWSUFfTUVNX0FHUCAgICAgMQkvKiBtYXRjaGVzIGRybSBjb25zdGFudCAqLworI2RlZmluZSBWSUFfTUVNX1NZU1RFTSAgMgorI2RlZmluZSBWSUFfTUVNX01JWEVEICAgMworI2RlZmluZSBWSUFfTUVNX1VOS05PV04gNAorCiB0eXBlZGVmIHN0cnVjdCB7CiAJdWludDMyX3Qgb2Zmc2V0OwogCXVpbnQzMl90IHNpemU7CkBAIC0xOTIsNiArMjAwLDkgQEAKIAl1bnNpZ25lZCBpbnQgWHZNQ1N1YlBpY09uW1ZJQV9OUl9YVk1DX1BPUlRTXTsKIAl1bnNpZ25lZCBpbnQgWHZNQ0N0eE5vR3JhYmJlZDsJLyogTGFzdCBjb250ZXh0IHRvIGhvbGQgZGVjb2RlciAqLwogCisJLyogVXNlZCBieSB0aGUgM2QgZHJpdmVyIG9ubHkgYXQgdGhpcyBwb2ludCwgZm9yIHBhZ2VmbGlwcGluZzoKKwkgKi8KKwl1bnNpZ25lZCBpbnQgcGZDdXJyZW50T2Zmc2V0OwogfSBkcm1fdmlhX3NhcmVhX3Q7CiAKIHR5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2NtZGJ1Zl9zaXplIHsKQEAgLTIxMiw2ICsyMjMsMTYgQEAKIAogI2RlZmluZSBWSUFfSVJRX0ZMQUdTX01BU0sgMHhGMDAwMDAwMAogCitlbnVtIGRybV92aWFfaXJxcyB7CisJZHJtX3ZpYV9pcnFfaHF2MCA9IDAsCisJZHJtX3ZpYV9pcnFfaHF2MSwKKwlkcm1fdmlhX2lycV9kbWEwX2RkLAorCWRybV92aWFfaXJxX2RtYTBfdGQsCisJZHJtX3ZpYV9pcnFfZG1hMV9kZCwKKwlkcm1fdmlhX2lycV9kbWExX3RkLAorCWRybV92aWFfaXJxX251bQorfTsKKwogc3RydWN0IGRybV92aWFfd2FpdF9pcnFfcmVxdWVzdCB7CiAJdW5zaWduZWQgaXJxOwogCXZpYV9pcnFfc2VxX3R5cGVfdCB0eXBlOwpAQCAtMjI0LDIwICsyNDUsMjUgQEAKIAlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5IHJlcGx5OwogfSBkcm1fdmlhX2lycXdhaXRfdDsKIAotI2lmZGVmIF9fS0VSTkVMX18KK3R5cGVkZWYgc3RydWN0IGRybV92aWFfYmxpdHN5bmMgeworCXVpbnQzMl90IHN5bmNfaGFuZGxlOworCXVuc2lnbmVkIGVuZ2luZTsKK30gZHJtX3ZpYV9ibGl0c3luY190OwogCi1pbnQgdmlhX2ZiX2luaXQoRFJNX0lPQ1RMX0FSR1MpOwotaW50IHZpYV9tZW1fYWxsb2MoRFJNX0lPQ1RMX0FSR1MpOwotaW50IHZpYV9tZW1fZnJlZShEUk1fSU9DVExfQVJHUyk7Ci1pbnQgdmlhX2FncF9pbml0KERSTV9JT0NUTF9BUkdTKTsKLWludCB2aWFfbWFwX2luaXQoRFJNX0lPQ1RMX0FSR1MpOwotaW50IHZpYV9kZWNvZGVyX2Z1dGV4KERSTV9JT0NUTF9BUkdTKTsKLWludCB2aWFfZG1hX2luaXQoRFJNX0lPQ1RMX0FSR1MpOwotaW50IHZpYV9jbWRidWZmZXIoRFJNX0lPQ1RMX0FSR1MpOwotaW50IHZpYV9mbHVzaF9pb2N0bChEUk1fSU9DVExfQVJHUyk7Ci1pbnQgdmlhX3BjaV9jbWRidWZmZXIoRFJNX0lPQ1RMX0FSR1MpOwotaW50IHZpYV9jbWRidWZfc2l6ZShEUk1fSU9DVExfQVJHUyk7Ci1pbnQgdmlhX3dhaXRfaXJxKERSTV9JT0NUTF9BUkdTKTsKK3R5cGVkZWYgc3RydWN0IGRybV92aWFfZG1hYmxpdCB7CisJdWludDMyX3QgbnVtX2xpbmVzOworCXVpbnQzMl90IGxpbmVfbGVuZ3RoOworCQorCXVpbnQzMl90IGZiX2FkZHI7CisJdWludDMyX3QgZmJfc3RyaWRlOwogCi0jZW5kaWYKKwl1bnNpZ25lZCBjaGFyICptZW1fYWRkcjsKKwl1aW50MzJfdCBtZW1fc3RyaWRlOworCisJaW50IGJvdW5jZV9idWZmZXI7CisJaW50IHRvX2ZiOworCisJZHJtX3ZpYV9ibGl0c3luY190IHN5bmM7Cit9IGRybV92aWFfZG1hYmxpdF90OworCiAjZW5kaWYJCQkJLyogX1ZJQV9EUk1fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmMKaW5kZXggMDE2NjY1ZS4uM2YwMTIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmMKQEAgLTI5LDU0ICsyOSwyMSBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1zdGF0aWMgaW50IHBvc3Rpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgaW50IGRyaV9saWJyYXJ5X25hbWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgY2hhciAqYnVmKQogewotCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCi0JCSBEUklWRVJfTkFNRSwKLQkJIERSSVZFUl9NQUpPUiwKLQkJIERSSVZFUl9NSU5PUiwKLQkJIERSSVZFUl9QQVRDSExFVkVMLAotCQkgRFJJVkVSX0RBVEUsIGRldi0+cHJpbWFyeS5taW5vciwgcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKLQkgICAgKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZXJzaW9uKGRybV92ZXJzaW9uX3QgKiB2ZXJzaW9uKQotewotCWludCBsZW47Ci0KLQl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOwotCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7Ci0JRFJNX0NPUFkodmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFKTsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAidW5pY2hyb21lIik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKIAl2aWFkcnZfUENJX0lEUwogfTsKIAotc3RhdGljIGRybV9pb2N0bF9kZXNjX3QgaW9jdGxzW10gPSB7Ci0JW0RSTV9JT0NUTF9OUihEUk1fVklBX0FMTE9DTUVNKV0gPSB7dmlhX21lbV9hbGxvYywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fVklBX0ZSRUVNRU0pXSA9IHt2aWFfbWVtX2ZyZWUsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9BR1BfSU5JVCldID0ge3ZpYV9hZ3BfaW5pdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fVklBX0ZCX0lOSVQpXSA9IHt2aWFfZmJfaW5pdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fVklBX01BUF9JTklUKV0gPSB7dmlhX21hcF9pbml0LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9WSUFfREVDX0ZVVEVYKV0gPSB7dmlhX2RlY29kZXJfZnV0ZXgsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9ETUFfSU5JVCldID0ge3ZpYV9kbWFfaW5pdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fVklBX0NNREJVRkZFUildID0ge3ZpYV9jbWRidWZmZXIsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9GTFVTSCldID0ge3ZpYV9mbHVzaF9pb2N0bCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fVklBX1BDSUNNRCldID0ge3ZpYV9wY2lfY21kYnVmZmVyLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9WSUFfQ01EQlVGX1NJWkUpXSA9IHt2aWFfY21kYnVmX3NpemUsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9XQUlUX0lSUSldID0ge3ZpYV93YWl0X2lycSwgMSwgMH0KLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CiAJLmRyaXZlcl9mZWF0dXJlcyA9CiAJICAgIERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwgRFJJVkVSX0hBVkVfSVJRIHwKIAkgICAgRFJJVkVSX0lSUV9TSEFSRUQgfCBEUklWRVJfSVJRX1ZCTCwKKwkubG9hZCA9IHZpYV9kcml2ZXJfbG9hZCwKKwkudW5sb2FkID0gdmlhX2RyaXZlcl91bmxvYWQsCiAJLmNvbnRleHRfY3RvciA9IHZpYV9pbml0X2NvbnRleHQsCiAJLmNvbnRleHRfZHRvciA9IHZpYV9maW5hbF9jb250ZXh0LAogCS52Ymxhbmtfd2FpdCA9IHZpYV9kcml2ZXJfdmJsYW5rX3dhaXQsCkBAIC04NSwxMyArNTIsMTEgQEAKIAkuaXJxX3VuaW5zdGFsbCA9IHZpYV9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKIAkuaXJxX2hhbmRsZXIgPSB2aWFfZHJpdmVyX2lycV9oYW5kbGVyLAogCS5kbWFfcXVpZXNjZW50ID0gdmlhX2RyaXZlcl9kbWFfcXVpZXNjZW50LAorCS5kcmlfbGlicmFyeV9uYW1lID0gZHJpX2xpYnJhcnlfbmFtZSwKIAkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAogCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAogCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAotCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAotCS52ZXJzaW9uID0gdmVyc2lvbiwKLQkuaW9jdGxzID0gaW9jdGxzLAotCS5udW1faW9jdGxzID0gRFJNX0FSUkFZX1NJWkUoaW9jdGxzKSwKKwkuaW9jdGxzID0gdmlhX2lvY3RscywKIAkuZm9wcyA9IHsKIAkJIC5vd25lciA9IFRISVNfTU9EVUxFLAogCQkgLm9wZW4gPSBkcm1fb3BlbiwKQEAgLTEwMCwxNSArNjUsMjMgQEAKIAkJIC5tbWFwID0gZHJtX21tYXAsCiAJCSAucG9sbCA9IGRybV9wb2xsLAogCQkgLmZhc3luYyA9IGRybV9mYXN5bmMsCi0JCSB9LAorCX0sCiAJLnBjaV9kcml2ZXIgPSB7Ci0JCSAgICAgICAubmFtZSA9IERSSVZFUl9OQU1FLAotCQkgICAgICAgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAotCQkgICAgICAgfQorCQkgLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKKwl9LAorCQorCS5uYW1lID0gRFJJVkVSX05BTUUsCisJLmRlc2MgPSBEUklWRVJfREVTQywKKwkuZGF0ZSA9IERSSVZFUl9EQVRFLAorCS5tYWpvciA9IERSSVZFUl9NQUpPUiwKKwkubWlub3IgPSBEUklWRVJfTUlOT1IsCisJLnBhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHZpYV9pbml0KHZvaWQpCiB7CisJZHJpdmVyLm51bV9pb2N0bHMgPSB2aWFfbWF4X2lvY3RsOwogCXZpYV9pbml0X2NvbW1hbmRfdmVyaWZpZXIoKTsKIAlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oCmluZGV4IDdkNWRhZjQuLmFhZDRmOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oCkBAIC0yNCwyNCArMjQsMjYgQEAKICNpZm5kZWYgX1ZJQV9EUlZfSF8KICNkZWZpbmUgX1ZJQV9EUlZfSF8KIAotI2RlZmluZSBEUklWRVJfQVVUSE9SCSJWSUEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJIlZhcmlvdXMiCiAKICNkZWZpbmUgRFJJVkVSX05BTUUJCSJ2aWEiCiAjZGVmaW5lIERSSVZFUl9ERVNDCQkiVklBIFVuaWNocm9tZSAvIFBybyIKLSNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDA1MDUyMyIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDA1MTExNiIKIAogI2RlZmluZSBEUklWRVJfTUFKT1IJCTIKLSNkZWZpbmUgRFJJVkVSX01JTk9SCQk2Ci0jZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTMKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQk3CisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTQKIAogI2luY2x1ZGUgInZpYV92ZXJpZmllci5oIgogCisjaW5jbHVkZSAidmlhX2RtYWJsaXQuaCIKKwogI2RlZmluZSBWSUFfUENJX0JVRl9TSVpFIDYwMDAwCiAjZGVmaW5lIFZJQV9GSVJFX0JVRl9TSVpFICAxMDI0Ci0jZGVmaW5lIFZJQV9OVU1fSVJRUyAyCisjZGVmaW5lIFZJQV9OVU1fSVJRUyA0CiAKIHR5cGVkZWYgc3RydWN0IGRybV92aWFfcmluZ19idWZmZXIgewotCWRybV9tYXBfdCBtYXA7CisJZHJtX2xvY2FsX21hcF90IG1hcDsKIAljaGFyICp2aXJ0dWFsX3N0YXJ0OwogfSBkcm1fdmlhX3JpbmdfYnVmZmVyX3Q7CiAKQEAgLTU2LDkgKzU4LDkgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX3ZpYV9wcml2YXRlIHsKIAlkcm1fdmlhX3NhcmVhX3QgKnNhcmVhX3ByaXY7Ci0JZHJtX21hcF90ICpzYXJlYTsKLQlkcm1fbWFwX3QgKmZiOwotCWRybV9tYXBfdCAqbW1pbzsKKwlkcm1fbG9jYWxfbWFwX3QgKnNhcmVhOworCWRybV9sb2NhbF9tYXBfdCAqZmI7CisJZHJtX2xvY2FsX21hcF90ICptbWlvOwogCXVuc2lnbmVkIGxvbmcgYWdwQWRkcjsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBkZWNvZGVyX3F1ZXVlW1ZJQV9OUl9YVk1DX0xPQ0tTXTsKIAljaGFyICpkbWFfcHRyOwpAQCAtODIsOCArODQsMTUgQEAKIAltYXNrYXJyYXlfdCAqaXJxX21hc2tzOwogCXVpbnQzMl90IGlycV9lbmFibGVfbWFzazsKIAl1aW50MzJfdCBpcnFfcGVuZGluZ19tYXNrOworCWludCAqaXJxX21hcDsKKwlkcm1fdmlhX2JsaXRxX3QgYmxpdF9xdWV1ZXNbVklBX05VTV9CTElUX0VOR0lORVNdOwogfSBkcm1fdmlhX3ByaXZhdGVfdDsKIAorZW51bSB2aWFfZmFtaWx5IHsKKwlWSUFfT1RIRVIgPSAwLAorCVZJQV9QUk9fR1JPVVBfQSwKK307CisKIC8qIFZJQSBNTUlPIHJlZ2lzdGVyIGFjY2VzcyAqLwogI2RlZmluZSBWSUFfQkFTRSAoKGRldl9wcml2LT5tbWlvKSkKIApAQCAtOTIsMTIgKzEwMSwzMSBAQAogI2RlZmluZSBWSUFfUkVBRDgocmVnKQkJRFJNX1JFQUQ4KFZJQV9CQVNFLCByZWcpCiAjZGVmaW5lIFZJQV9XUklURTgocmVnLHZhbCkJRFJNX1dSSVRFOChWSUFfQkFTRSwgcmVnLCB2YWwpCiAKK2V4dGVybiBkcm1faW9jdGxfZGVzY190IHZpYV9pb2N0bHNbXTsKK2V4dGVybiBpbnQgdmlhX21heF9pb2N0bDsKKworZXh0ZXJuIGludCB2aWFfZmJfaW5pdChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IHZpYV9tZW1fYWxsb2MoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCB2aWFfbWVtX2ZyZWUoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCB2aWFfYWdwX2luaXQoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCB2aWFfbWFwX2luaXQoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCB2aWFfZGVjb2Rlcl9mdXRleChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IHZpYV9kbWFfaW5pdChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IHZpYV9jbWRidWZmZXIoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCB2aWFfZmx1c2hfaW9jdGwoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCB2aWFfcGNpX2NtZGJ1ZmZlcihEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IHZpYV9jbWRidWZfc2l6ZShEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IHZpYV93YWl0X2lycShEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IHZpYV9kbWFfYmxpdF9zeW5jKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCB2aWFfZG1hX2JsaXQoIERSTV9JT0NUTF9BUkdTICk7CisKK2V4dGVybiBpbnQgdmlhX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpOworZXh0ZXJuIGludCB2aWFfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKmRldik7CisKIGV4dGVybiBpbnQgdmlhX2luaXRfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBjb250ZXh0KTsKIGV4dGVybiBpbnQgdmlhX2ZpbmFsX2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2LCBpbnQgY29udGV4dCk7CiAKIGV4dGVybiBpbnQgdmlhX2RvX2NsZWFudXBfbWFwKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IHZpYV9tYXBfaW5pdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBpbnQgdmlhX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogCiBleHRlcm4gaXJxcmV0dXJuX3QgdmlhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwpAQCAtMTExLDggKzEzOSwxMCBAQAogZXh0ZXJuIHZvaWQgdmlhX2luaXRfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CiBleHRlcm4gdm9pZCB2aWFfY2xlYW51cF9mdXRleChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIGV4dGVybiB2b2lkIHZpYV9yZWxlYXNlX2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsIGludCBjb250ZXh0KTsKK2V4dGVybiBpbnQgdmlhX2RyaXZlcl9pcnFfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCBpcnEsCisJCQkgICAgICAgaW50IGZvcmNlX3NlcXVlbmNlLCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKIAotZXh0ZXJuIGludCB2aWFfcGFyc2VfY29tbWFuZF9zdHJlYW0oZHJtX2RldmljZV90ICogZGV2LCBjb25zdCB1aW50MzJfdCAqIGJ1ZiwKLQkJCQkgICAgdW5zaWduZWQgaW50IHNpemUpOworZXh0ZXJuIHZvaWQgdmlhX2RtYWJsaXRfaGFuZGxlcihkcm1fZGV2aWNlX3QgKmRldiwgaW50IGVuZ2luZSwgaW50IGZyb21faXJxKTsKK2V4dGVybiB2b2lkIHZpYV9pbml0X2RtYWJsaXQoZHJtX2RldmljZV90ICpkZXYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcy5jCmluZGV4IDVjNzFlMDguLjk0Mjk3MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHMuYwpAQCAtMjIsMTQgKzIyLDcgQEAKICAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgogICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAiZHJtUC5oIgogCiAjaW5jbHVkZSAidmlhX2RzLmgiCiBleHRlcm4gdW5zaWduZWQgaW50IFZJQV9ERUJVRzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMKaW5kZXggZDAyM2FkZC4uNTZkN2UzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMKQEAgLTUwLDYgKzUwLDE1IEBACiAjZGVmaW5lIFZJQV9JUlFfSFFWMV9FTkFCTEUgICAgICgxIDw8IDI1KQogI2RlZmluZSBWSUFfSVJRX0hRVjBfUEVORElORyAgICAoMSA8PCA5KQogI2RlZmluZSBWSUFfSVJRX0hRVjFfUEVORElORyAgICAoMSA8PCAxMCkKKyNkZWZpbmUgVklBX0lSUV9ETUEwX0REX0VOQUJMRSAgKDEgPDwgMjApCisjZGVmaW5lIFZJQV9JUlFfRE1BMF9URF9FTkFCTEUgICgxIDw8IDIxKQorI2RlZmluZSBWSUFfSVJRX0RNQTFfRERfRU5BQkxFICAoMSA8PCAyMikKKyNkZWZpbmUgVklBX0lSUV9ETUExX1REX0VOQUJMRSAgKDEgPDwgMjMpCisjZGVmaW5lIFZJQV9JUlFfRE1BMF9ERF9QRU5ESU5HICgxIDw8IDQpCisjZGVmaW5lIFZJQV9JUlFfRE1BMF9URF9QRU5ESU5HICgxIDw8IDUpCisjZGVmaW5lIFZJQV9JUlFfRE1BMV9ERF9QRU5ESU5HICgxIDw8IDYpCisjZGVmaW5lIFZJQV9JUlFfRE1BMV9URF9QRU5ESU5HICgxIDw8IDcpCisKIAogLyoKICAqIERldmljZS1zcGVjaWZpYyBJUlFzIGdvIGhlcmUuIFRoaXMgdHlwZSBtaWdodCBuZWVkIHRvIGJlIGV4dGVuZGVkIHdpdGgKQEAgLTYxLDEzICs3MCwyNCBAQAogCXtWSUFfSVJRX0hRVjBfRU5BQkxFLCBWSUFfSVJRX0hRVjBfUEVORElORywgMHgwMDAwMDNEMCwgMHgwMDAwODAxMCwKIAkgMHgwMDAwMDAwMH0sCiAJe1ZJQV9JUlFfSFFWMV9FTkFCTEUsIFZJQV9JUlFfSFFWMV9QRU5ESU5HLCAweDAwMDAxM0QwLCAweDAwMDA4MDEwLAotCSAweDAwMDAwMDAwfQorCSAweDAwMDAwMDAwfSwKKwl7VklBX0lSUV9ETUEwX1REX0VOQUJMRSwgVklBX0lSUV9ETUEwX1REX1BFTkRJTkcsIFZJQV9QQ0lfRE1BX0NTUjAsCisJIFZJQV9ETUFfQ1NSX1RBIHwgVklBX0RNQV9DU1JfVEQsIDB4MDAwMDAwMDh9LAorCXtWSUFfSVJRX0RNQTFfVERfRU5BQkxFLCBWSUFfSVJRX0RNQTFfVERfUEVORElORywgVklBX1BDSV9ETUFfQ1NSMSwKKwkgVklBX0RNQV9DU1JfVEEgfCBWSUFfRE1BX0NTUl9URCwgMHgwMDAwMDAwOH0sCiB9Owogc3RhdGljIGludCB2aWFfbnVtX3Byb19ncm91cF9hID0KICAgICBzaXplb2YodmlhX3Byb19ncm91cF9hX2lycXMpIC8gc2l6ZW9mKG1hc2thcnJheV90KTsKK3N0YXRpYyBpbnQgdmlhX2lycW1hcF9wcm9fZ3JvdXBfYVtdID0gezAsIDEsIC0xLCAyLCAtMSwgM307CiAKLXN0YXRpYyBtYXNrYXJyYXlfdCB2aWFfdW5pY2hyb21lX2lycXNbXSA9IHsgfTsKK3N0YXRpYyBtYXNrYXJyYXlfdCB2aWFfdW5pY2hyb21lX2lycXNbXSA9IHsKKwl7VklBX0lSUV9ETUEwX1REX0VOQUJMRSwgVklBX0lSUV9ETUEwX1REX1BFTkRJTkcsIFZJQV9QQ0lfRE1BX0NTUjAsCisJIFZJQV9ETUFfQ1NSX1RBIHwgVklBX0RNQV9DU1JfVEQsIDB4MDAwMDAwMDh9LAorCXtWSUFfSVJRX0RNQTFfVERfRU5BQkxFLCBWSUFfSVJRX0RNQTFfVERfUEVORElORywgVklBX1BDSV9ETUFfQ1NSMSwKKwkgVklBX0RNQV9DU1JfVEEgfCBWSUFfRE1BX0NTUl9URCwgMHgwMDAwMDAwOH0KK307CiBzdGF0aWMgaW50IHZpYV9udW1fdW5pY2hyb21lID0gc2l6ZW9mKHZpYV91bmljaHJvbWVfaXJxcykgLyBzaXplb2YobWFza2FycmF5X3QpOworc3RhdGljIGludCB2aWFfaXJxbWFwX3VuaWNocm9tZVtdID0gey0xLCAtMSwgLTEsIDAsIC0xLCAxfTsKIAogc3RhdGljIHVuc2lnbmVkIHRpbWVfZGlmZihzdHJ1Y3QgdGltZXZhbCAqbm93LCBzdHJ1Y3QgdGltZXZhbCAqdGhlbikKIHsKQEAgLTExMyw2ICsxMzMsMTEgQEAKIAkJCWF0b21pY19pbmMoJmN1cl9pcnEtPmlycV9yZWNlaXZlZCk7CiAJCQlEUk1fV0FLRVVQKCZjdXJfaXJxLT5pcnFfcXVldWUpOwogCQkJaGFuZGxlZCA9IDE7CisJCQlpZiAoZGV2X3ByaXYtPmlycV9tYXBbZHJtX3ZpYV9pcnFfZG1hMF90ZF0gPT0gaSkgeworCQkJCXZpYV9kbWFibGl0X2hhbmRsZXIoZGV2LCAwLCAxKTsKKwkJCX0gZWxzZSBpZiAoZGV2X3ByaXYtPmlycV9tYXBbZHJtX3ZpYV9pcnFfZG1hMV90ZF0gPT0gaSkgeworCQkJCXZpYV9kbWFibGl0X2hhbmRsZXIoZGV2LCAxLCAxKTsKKwkJCX0KIAkJfQogCQljdXJfaXJxKys7CiAJfQpAQCAtMTY1LDcgKzE5MCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludAoraW50CiB2aWFfZHJpdmVyX2lycV93YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IGlycSwgaW50IGZvcmNlX3NlcXVlbmNlLAogCQkgICAgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKIHsKQEAgLTE3NCw2ICsxOTksNyBAQAogCWRybV92aWFfaXJxX3QgKmN1cl9pcnEgPSBkZXZfcHJpdi0+dmlhX2lycXM7CiAJaW50IHJldCA9IDA7CiAJbWFza2FycmF5X3QgKm1hc2tzID0gZGV2X3ByaXYtPmlycV9tYXNrczsKKwlpbnQgcmVhbF9pcnE7CiAKIAlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0xODIsMTUgKzIwOCwyMyBAQAogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCWlmIChpcnEgPj0gZGV2X3ByaXYtPm51bV9pcnFzKSB7CisJaWYgKGlycSA+PSBkcm1fdmlhX2lycV9udW0pIHsKIAkJRFJNX0VSUk9SKCIlcyBUcnlpbmcgdG8gd2FpdCBvbiB1bmtub3duIGlycSAlZFxuIiwgX19GVU5DVElPTl9fLAogCQkJICBpcnEpOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCWN1cl9pcnEgKz0gaXJxOworCXJlYWxfaXJxID0gZGV2X3ByaXYtPmlycV9tYXBbaXJxXTsKIAotCWlmIChtYXNrc1tpcnFdWzJdICYmICFmb3JjZV9zZXF1ZW5jZSkgeworCWlmIChyZWFsX2lycSA8IDApIHsKKwkJRFJNX0VSUk9SKCIlcyBWaWRlbyBJUlEgJWQgbm90IGF2YWlsYWJsZSBvbiB0aGlzIGhhcmR3YXJlLlxuIiwKKwkJCSAgX19GVU5DVElPTl9fLCBpcnEpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwkKKwljdXJfaXJxICs9IHJlYWxfaXJxOworCisJaWYgKG1hc2tzW3JlYWxfaXJxXVsyXSAmJiAhZm9yY2Vfc2VxdWVuY2UpIHsKIAkJRFJNX1dBSVRfT04ocmV0LCBjdXJfaXJxLT5pcnFfcXVldWUsIDMgKiBEUk1fSFosCiAJCQkgICAgKChWSUFfUkVBRChtYXNrc1tpcnFdWzJdKSAmIG1hc2tzW2lycV1bM10pID09CiAJCQkgICAgIG1hc2tzW2lycV1bNF0pKTsKQEAgLTIyNiw2ICsyNjAsOCBAQAogCQkgICAgdmlhX3Byb19ncm91cF9hX2lycXMgOiB2aWFfdW5pY2hyb21lX2lycXM7CiAJCWRldl9wcml2LT5udW1faXJxcyA9IChkZXZfcHJpdi0+cHJvX2dyb3VwX2EpID8KIAkJICAgIHZpYV9udW1fcHJvX2dyb3VwX2EgOiB2aWFfbnVtX3VuaWNocm9tZTsKKwkJZGV2X3ByaXYtPmlycV9tYXAgPSAoZGV2X3ByaXYtPnByb19ncm91cF9hKSA/CisJCQl2aWFfaXJxbWFwX3Byb19ncm91cF9hIDogdmlhX2lycW1hcF91bmljaHJvbWU7CiAKIAkJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5udW1faXJxczsgKytpKSB7CiAJCQlhdG9taWNfc2V0KCZjdXJfaXJxLT5pcnFfcmVjZWl2ZWQsIDApOwpAQCAtMjQxLDcgKzI3Nyw3IEBACiAKIAkJZGV2X3ByaXYtPmxhc3RfdmJsYW5rX3ZhbGlkID0gMDsKIAotCQkvLyBDbGVhciBWU3luYyBpbnRlcnJ1cHQgcmVncworCQkvKiBDbGVhciBWU3luYyBpbnRlcnJ1cHQgcmVncyAqLwogCQlzdGF0dXMgPSBWSUFfUkVBRChWSUFfUkVHX0lOVEVSUlVQVCk7CiAJCVZJQV9XUklURShWSUFfUkVHX0lOVEVSUlVQVCwgc3RhdHVzICYKIAkJCSAgfihkZXZfcHJpdi0+aXJxX2VuYWJsZV9tYXNrKSk7CkBAIC0yOTEsOCArMzI3LDcgQEAKIAogaW50IHZpYV93YWl0X2lycShEUk1fSU9DVExfQVJHUykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCURSTV9ERVZJQ0U7CiAJZHJtX3ZpYV9pcnF3YWl0X3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKIAlkcm1fdmlhX2lycXdhaXRfdCBpcnF3YWl0OwogCXN0cnVjdCB0aW1ldmFsIG5vdzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbWFwLmMKaW5kZXggNmJkNmFjNS4uYzZhMDhlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfbWFwLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbWFwLmMKQEAgLTI3LDE2ICsyNywxMCBAQAogCiBzdGF0aWMgaW50IHZpYV9kb19pbml0X21hcChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV92aWFfaW5pdF90ICogaW5pdCkKIHsKLQlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXY7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAogCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlkZXZfcHJpdiA9IGRybV9hbGxvYyhzaXplb2YoZHJtX3ZpYV9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUik7Ci0JaWYgKGRldl9wcml2ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX3ZpYV9wcml2YXRlX3QpKTsKLQogCURSTV9HRVRTQVJFQSgpOwogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CiAJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgc2FyZWEhXG4iKTsKQEAgLTY3LDcgKzYxLDggQEAKIAlkZXZfcHJpdi0+YWdwQWRkciA9IGluaXQtPmFncEFkZHI7CiAKIAl2aWFfaW5pdF9mdXRleChkZXZfcHJpdik7Ci0JZGV2X3ByaXYtPnByb19ncm91cF9hID0gKGRldi0+cGRldi0+ZGV2aWNlID09IDB4MzExOCk7CisKKwl2aWFfaW5pdF9kbWFibGl0KGRldik7CiAKIAlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKIAlyZXR1cm4gMDsKQEAgLTc1LDE1ICs3MCw3IEBACiAKIGludCB2aWFfZG9fY2xlYW51cF9tYXAoZHJtX2RldmljZV90ICogZGV2KQogewotCWlmIChkZXYtPmRldl9wcml2YXRlKSB7Ci0KLQkJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCQl2aWFfZG1hX2NsZWFudXAoZGV2KTsKLQotCQlkcm1fZnJlZShkZXZfcHJpdiwgc2l6ZW9mKGRybV92aWFfcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIpOwotCQlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKLQl9CisJdmlhX2RtYV9jbGVhbnVwKGRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNywzICs5NCwyOSBAQAogCiAJcmV0dXJuIC1FSU5WQUw7CiB9CisKK2ludCB2aWFfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCkKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXY7CisKKwlkZXZfcHJpdiA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKGRybV92aWFfcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIpOworCWlmIChkZXZfcHJpdiA9PSBOVUxMKQorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisKKwlpZiAoY2hpcHNldCA9PSBWSUFfUFJPX0dST1VQX0EpCisJCWRldl9wcml2LT5wcm9fZ3JvdXBfYSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZpYV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlkcm1fZnJlZShkZXZfcHJpdiwgc2l6ZW9mKGRybV92aWFfcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tbS5jCmluZGV4IDNiYWRkYWMuLjMzZTBjYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYwpAQCAtNDIsNyArNDIsNyBAQAogc3RhdGljIGludCB2aWFfZmJfYWxsb2MoZHJtX3ZpYV9tZW1fdCAqIG1lbSk7CiBzdGF0aWMgaW50IHZpYV9mYl9mcmVlKGRybV92aWFfbWVtX3QgKiBtZW0pOwogCi1zdGF0aWMgaW50IGFkZF9hbGxvY19zZXQoaW50IGNvbnRleHQsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgdmFsKQorc3RhdGljIGludCBhZGRfYWxsb2Nfc2V0KGludCBjb250ZXh0LCBpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJaW50IGksIHJldHZhbCA9IDA7CiAKQEAgLTU2LDcgKzU2LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IGRlbF9hbGxvY19zZXQoaW50IGNvbnRleHQsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgdmFsKQorc3RhdGljIGludCBkZWxfYWxsb2Nfc2V0KGludCBjb250ZXh0LCBpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJaW50IGksIHJldHZhbCA9IDA7CiAKQEAgLTE5OSwxMyArMTk5LDEzIEBACiAJCQkJIHNpemVvZihtZW0pKTsKIAogCXN3aXRjaCAobWVtLnR5cGUpIHsKLQljYXNlIFZJREVPOgorCWNhc2UgVklBX01FTV9WSURFTzoKIAkJaWYgKHZpYV9mYl9hbGxvYygmbWVtKSA8IDApCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCgoZHJtX3ZpYV9tZW1fdCBfX3VzZXIgKikgZGF0YSwgbWVtLAogCQkJCSAgICAgICBzaXplb2YobWVtKSk7CiAJCXJldHVybiAwOwotCWNhc2UgQUdQOgorCWNhc2UgVklBX01FTV9BR1A6CiAJCWlmICh2aWFfYWdwX2FsbG9jKCZtZW0pIDwgMCkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChkcm1fdmlhX21lbV90IF9fdXNlciAqKSBkYXRhLCBtZW0sCkBAIC0yMzIsNyArMjMyLDcgQEAKIAlpZiAoYmxvY2spIHsKIAkJZmIub2Zmc2V0ID0gYmxvY2stPm9mczsKIAkJZmIuZnJlZSA9ICh1bnNpZ25lZCBsb25nKWJsb2NrOwotCQlpZiAoIWFkZF9hbGxvY19zZXQoZmIuY29udGV4dCwgVklERU8sIGZiLmZyZWUpKSB7CisJCWlmICghYWRkX2FsbG9jX3NldChmYi5jb250ZXh0LCBWSUFfTUVNX1ZJREVPLCBmYi5mcmVlKSkgewogCQkJRFJNX0RFQlVHKCJhZGRpbmcgdG8gYWxsb2NhdGlvbiBzZXQgZmFpbHNcbiIpOwogCQkJdmlhX21tRnJlZU1lbSgoUE1lbUJsb2NrKSBmYi5mcmVlKTsKIAkJCXJldHZhbCA9IC0xOwpAQCAtMjY5LDcgKzI2OSw3IEBACiAJaWYgKGJsb2NrKSB7CiAJCWFncC5vZmZzZXQgPSBibG9jay0+b2ZzOwogCQlhZ3AuZnJlZSA9ICh1bnNpZ25lZCBsb25nKWJsb2NrOwotCQlpZiAoIWFkZF9hbGxvY19zZXQoYWdwLmNvbnRleHQsIEFHUCwgYWdwLmZyZWUpKSB7CisJCWlmICghYWRkX2FsbG9jX3NldChhZ3AuY29udGV4dCwgVklBX01FTV9BR1AsIGFncC5mcmVlKSkgewogCQkJRFJNX0RFQlVHKCJhZGRpbmcgdG8gYWxsb2NhdGlvbiBzZXQgZmFpbHNcbiIpOwogCQkJdmlhX21tRnJlZU1lbSgoUE1lbUJsb2NrKSBhZ3AuZnJlZSk7CiAJCQlyZXR2YWwgPSAtMTsKQEAgLTI5NywxMSArMjk3LDExIEBACiAKIAlzd2l0Y2ggKG1lbS50eXBlKSB7CiAKLQljYXNlIFZJREVPOgorCWNhc2UgVklBX01FTV9WSURFTzoKIAkJaWYgKHZpYV9mYl9mcmVlKCZtZW0pID09IDApCiAJCQlyZXR1cm4gMDsKIAkJYnJlYWs7Ci0JY2FzZSBBR1A6CisJY2FzZSBWSUFfTUVNX0FHUDoKIAkJaWYgKHZpYV9hZ3BfZnJlZSgmbWVtKSA9PSAwKQogCQkJcmV0dXJuIDA7CiAJCWJyZWFrOwpAQCAtMzI5LDcgKzMyOSw3IEBACiAKIAl2aWFfbW1GcmVlTWVtKChQTWVtQmxvY2spIGZiLmZyZWUpOwogCi0JaWYgKCFkZWxfYWxsb2Nfc2V0KGZiLmNvbnRleHQsIFZJREVPLCBmYi5mcmVlKSkgeworCWlmICghZGVsX2FsbG9jX3NldChmYi5jb250ZXh0LCBWSUFfTUVNX1ZJREVPLCBmYi5mcmVlKSkgewogCQlyZXR2YWwgPSAtMTsKIAl9CiAKQEAgLTM1Miw3ICszNTIsNyBAQAogCiAJdmlhX21tRnJlZU1lbSgoUE1lbUJsb2NrKSBhZ3AuZnJlZSk7CiAKLQlpZiAoIWRlbF9hbGxvY19zZXQoYWdwLmNvbnRleHQsIEFHUCwgYWdwLmZyZWUpKSB7CisJaWYgKCFkZWxfYWxsb2Nfc2V0KGFncC5jb250ZXh0LCBWSUFfTUVNX0FHUCwgYWdwLmZyZWUpKSB7CiAJCXJldHZhbCA9IC0xOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmMKaW5kZXggNGFjNDk1Zi4uNzBjODk3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5jCkBAIC0yMzcsNyArMjM3LDcgQEAKIHN0YXRpYyBfX2lubGluZV9fIGludAogZWF0X3dvcmRzKGNvbnN0IHVpbnQzMl90ICoqIGJ1ZiwgY29uc3QgdWludDMyX3QgKiBidWZfZW5kLCB1bnNpZ25lZCBudW1fd29yZHMpCiB7Ci0JaWYgKCgqYnVmIC0gYnVmX2VuZCkgPj0gbnVtX3dvcmRzKSB7CisJaWYgKChidWZfZW5kIC0gKmJ1ZikgPj0gbnVtX3dvcmRzKSB7CiAJCSpidWYgKz0gbnVtX3dvcmRzOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yNDksMTQgKzI0OSwxNCBAQAogICogUGFydGlhbGx5IHN0b2xlbiBmcm9tIGRybV9tZW1vcnkuaAogICovCiAKLXN0YXRpYyBfX2lubGluZV9fIGRybV9tYXBfdCAqdmlhX2RybV9sb29rdXBfYWdwX21hcChkcm1fdmlhX3N0YXRlX3QgKiBzZXEsCitzdGF0aWMgX19pbmxpbmVfXyBkcm1fbG9jYWxfbWFwX3QgKnZpYV9kcm1fbG9va3VwX2FncF9tYXAoZHJtX3ZpYV9zdGF0ZV90ICpzZXEsCiAJCQkJCQkgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAJCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCQkJICAgIGRybV9kZXZpY2VfdCAqIGRldikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7Ci0JZHJtX21hcF90ICptYXAgPSBzZXEtPm1hcF9jYWNoZTsKKwlkcm1fbG9jYWxfbWFwX3QgKm1hcCA9IHNlcS0+bWFwX2NhY2hlOwogCiAJaWYgKG1hcCAmJiBtYXAtPm9mZnNldCA8PSBvZmZzZXQKIAkgICAgJiYgKG9mZnNldCArIHNpemUpIDw9IChtYXAtPm9mZnNldCArIG1hcC0+c2l6ZSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5oCmluZGV4IGViNGVkYTMuLjI1NjU5MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuaApAQCAtNDcsNyArNDcsNyBAQAogCWludCBhZ3BfdGV4dHVyZTsKIAlpbnQgbXVsdGl0ZXg7CiAJZHJtX2RldmljZV90ICpkZXY7Ci0JZHJtX21hcF90ICptYXBfY2FjaGU7CisJZHJtX2xvY2FsX21hcF90ICptYXBfY2FjaGU7CiAJdWludDMyX3QgdmVydGV4X2NvdW50OwogCWludCBhZ3A7CiAJY29uc3QgdWludDMyX3QgKmJ1Zl9zdGFydDsKQEAgLTU1LDUgKzU1LDcgQEAKIAogZXh0ZXJuIGludCB2aWFfdmVyaWZ5X2NvbW1hbmRfc3RyZWFtKGNvbnN0IHVpbnQzMl90ICogYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJCQkgICAgIGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGFncCk7CitleHRlcm4gaW50IHZpYV9wYXJzZV9jb21tYW5kX3N0cmVhbShkcm1fZGV2aWNlX3QgKmRldiwgY29uc3QgdWludDMyX3QgKmJ1ZiwKKwkJCQkgICAgdW5zaWduZWQgaW50IHNpemUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZpZGVvLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92aWRlby5jCmluZGV4IDdmYWI5ZmIuLjMwMGFjNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZpZGVvLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmlkZW8uYwpAQCAtNTAsOCArNTAsMTEgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAl2b2xhdGlsZSBpbnQgKmxvY2s7CiAKKwlpZiAoIWRldl9wcml2LT5zYXJlYV9wcml2KQorCQlyZXR1cm47CisKIAlmb3IgKGkgPSAwOyBpIDwgVklBX05SX1hWTUNfTE9DS1M7ICsraSkgewotCQlsb2NrID0gKGludCAqKVhWTUNMT0NLUFRSKGRldl9wcml2LT5zYXJlYV9wcml2LCBpKTsKKwkJbG9jayA9ICh2b2xhdGlsZSBpbnQgKilYVk1DTE9DS1BUUihkZXZfcHJpdi0+c2FyZWFfcHJpdiwgaSk7CiAJCWlmICgoX0RSTV9MT0NLSU5HX0NPTlRFWFQoKmxvY2spID09IGNvbnRleHQpKSB7CiAJCQlpZiAoX0RSTV9MT0NLX0lTX0hFTEQoKmxvY2spCiAJCQkgICAgJiYgKCpsb2NrICYgX0RSTV9MT0NLX0NPTlQpKSB7CkBAIC03OSw3ICs4Miw3IEBACiAJaWYgKGZ4LmxvY2sgPiBWSUFfTlJfWFZNQ19MT0NLUykKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlsb2NrID0gKGludCAqKVhWTUNMT0NLUFRSKHNBUHJpdiwgZngubG9jayk7CisJbG9jayA9ICh2b2xhdGlsZSBpbnQgKilYVk1DTE9DS1BUUihzQVByaXYsIGZ4LmxvY2spOwogCiAJc3dpdGNoIChmeC5mdW5jKSB7CiAJY2FzZSBWSUFfRlVURVhfV0FJVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kc3A1NmsuYyBiL2RyaXZlcnMvY2hhci9kc3A1NmsuYwppbmRleCA4NjkzODM1Li5lMjMzY2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHNwNTZrLmMKKysrIGIvZHJpdmVycy9jaGFyL2RzcDU2ay5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkc3A1NmtfdXBsb2FkKHVfY2hhciAqYmluLCBpbnQgbGVuKQorc3RhdGljIGludCBkc3A1NmtfdXBsb2FkKHVfY2hhciBfX3VzZXIgKmJpbiwgaW50IGxlbikKIHsKIAlpbnQgaTsKIAl1X2NoYXIgKnA7CkBAIC0xOTksNyArMTk5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3QgZHNwNTZrX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorc3RhdGljIHNzaXplX3QgZHNwNTZrX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKIAkJCSAgIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CkBAIC0yMjUsMTAgKzIyNSwxMCBAQAogCQl9CiAJCWNhc2UgMjogIC8qIDE2IGJpdCAqLwogCQl7Ci0JCQlzaG9ydCAqZGF0YTsKKwkJCXNob3J0IF9fdXNlciAqZGF0YTsKIAogCQkJY291bnQgLz0gMjsKLQkJCWRhdGEgPSAoc2hvcnQqKSBidWY7CisJCQlkYXRhID0gKHNob3J0IF9fdXNlciAqKSBidWY7CiAJCQloYW5kc2hha2UoY291bnQsIGRzcDU2ay5tYXhpbywgZHNwNTZrLnRpbWVvdXQsIERTUDU2S19SRUNFSVZFLAogCQkJCSAgcHV0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEud1sxXSwgZGF0YStuKyspKTsKIAkJCXJldHVybiAyKm47CkBAIC0yNDQsMTAgKzI0NCwxMCBAQAogCQl9CiAJCWNhc2UgNDogIC8qIDMyIGJpdCAqLwogCQl7Ci0JCQlsb25nICpkYXRhOworCQkJbG9uZyBfX3VzZXIgKmRhdGE7CiAKIAkJCWNvdW50IC89IDQ7Ci0JCQlkYXRhID0gKGxvbmcqKSBidWY7CisJCQlkYXRhID0gKGxvbmcgX191c2VyICopIGJ1ZjsKIAkJCWhhbmRzaGFrZShjb3VudCwgZHNwNTZrLm1heGlvLCBkc3A1NmsudGltZW91dCwgRFNQNTZLX1JFQ0VJVkUsCiAJCQkJICBwdXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5sLCBkYXRhK24rKykpOwogCQkJcmV0dXJuIDQqbjsKQEAgLTI2Miw3ICsyNjIsNyBAQAogCX0KIH0KIAotc3RhdGljIHNzaXplX3QgZHNwNTZrX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKK3N0YXRpYyBzc2l6ZV90IGRzcDU2a193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAogCQkJICAgIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CkBAIC0yODcsMTAgKzI4NywxMCBAQAogCQl9CiAJCWNhc2UgMjogIC8qIDE2IGJpdCAqLwogCQl7Ci0JCQljb25zdCBzaG9ydCAqZGF0YTsKKwkJCWNvbnN0IHNob3J0IF9fdXNlciAqZGF0YTsKIAogCQkJY291bnQgLz0gMjsKLQkJCWRhdGEgPSAoY29uc3Qgc2hvcnQgKilidWY7CisJCQlkYXRhID0gKGNvbnN0IHNob3J0IF9fdXNlciAqKWJ1ZjsKIAkJCWhhbmRzaGFrZShjb3VudCwgZHNwNTZrLm1heGlvLCBkc3A1NmsudGltZW91dCwgRFNQNTZLX1RSQU5TTUlULAogCQkJCSAgZ2V0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEud1sxXSwgZGF0YStuKyspKTsKIAkJCXJldHVybiAyKm47CkBAIC0zMDYsMTAgKzMwNiwxMCBAQAogCQl9CiAJCWNhc2UgNDogIC8qIDMyIGJpdCAqLwogCQl7Ci0JCQljb25zdCBsb25nICpkYXRhOworCQkJY29uc3QgbG9uZyBfX3VzZXIgKmRhdGE7CiAKIAkJCWNvdW50IC89IDQ7Ci0JCQlkYXRhID0gKGNvbnN0IGxvbmcgKilidWY7CisJCQlkYXRhID0gKGNvbnN0IGxvbmcgX191c2VyICopYnVmOwogCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfVFJBTlNNSVQsCiAJCQkJICBnZXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5sLCBkYXRhK24rKykpOwogCQkJcmV0dXJuIDQqbjsKQEAgLTMyOCw2ICszMjgsNyBAQAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJaW50IGRldiA9IGltaW5vcihpbm9kZSkgJiAweDBmOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCiAJc3dpdGNoKGRldikKIAl7CkBAIC0zMzYsOSArMzM3LDkgQEAKIAkJc3dpdGNoKGNtZCkgewogCQljYXNlIERTUDU2S19VUExPQUQ6CiAJCXsKLQkJCWNoYXIgKmJpbjsKKwkJCWNoYXIgX191c2VyICpiaW47CiAJCQlpbnQgciwgbGVuOwotCQkJc3RydWN0IGRzcDU2a191cGxvYWQgKmJpbmFyeSA9IChzdHJ1Y3QgZHNwNTZrX3VwbG9hZCAqKSBhcmc7CisJCQlzdHJ1Y3QgZHNwNTZrX3VwbG9hZCBfX3VzZXIgKmJpbmFyeSA9IGFyZ3A7CiAgICAgCiAJCQlpZihnZXRfdXNlcihsZW4sICZiaW5hcnktPmxlbikgPCAwKQogCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtMzcyLDcgKzM3Myw3IEBACiAJCWNhc2UgRFNQNTZLX0hPU1RfRkxBR1M6CiAJCXsKIAkJCWludCBkaXIsIG91dCwgc3RhdHVzOwotCQkJc3RydWN0IGRzcDU2a19ob3N0X2ZsYWdzICpoZiA9IChzdHJ1Y3QgZHNwNTZrX2hvc3RfZmxhZ3MqKSBhcmc7CisJCQlzdHJ1Y3QgZHNwNTZrX2hvc3RfZmxhZ3MgX191c2VyICpoZiA9IGFyZ3A7CiAgICAgCiAJCQlpZihnZXRfdXNlcihkaXIsICZoZi0+ZGlyKSA8IDApCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZXNwLmMgYi9kcml2ZXJzL2NoYXIvZXNwLmMKaW5kZXggZTQ2OWY2NC4uZGQ1ZGM4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2VzcC5jCisrKyBiL2RyaXZlcnMvY2hhci9lc3AuYwpAQCAtMTYwLDcgKzE2MCw2IEBACiAgKiBtZW1vcnkgaWYgbGFyZ2UgbnVtYmVycyBvZiBzZXJpYWwgcG9ydHMgYXJlIG9wZW4uCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmOwotc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOwogCiBzdGF0aWMgaW5saW5lIGludCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sCiAJCQkJCWNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYyBiL2RyaXZlcnMvY2hhci9nZW5lcmljX3NlcmlhbC5jCmluZGV4IDIwNGE3MzAuLmUzOGE1ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9nZW5lcmljX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvY2hhci9nZW5lcmljX3NlcmlhbC5jCkBAIC0zNCw3ICszNCw2IEBACiAjZGVmaW5lIERFQlVHIAogCiBzdGF0aWMgY2hhciAqICAgICAgICAgICAgICAgICAgdG1wX2J1ZjsgCi1zdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CiAKIHN0YXRpYyBpbnQgZ3NfZGVidWc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCA3MDRjM2MwLi4yOWM0MWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC01MzQsNyArNTM0LDcgQEAKICAJcmV0dXJuIHZpcnRyICsgd3JvdGU7CiB9CiAKLSNpZiAoZGVmaW5lZChDT05GSUdfSVNBKSB8fCAhZGVmaW5lZChfX21jNjgwMDBfXykpICYmICghZGVmaW5lZChDT05GSUdfUFBDX0lTRVJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1BDSSkpCisjaWYgZGVmaW5lZChDT05GSUdfSVNBKSB8fCAhZGVmaW5lZChfX21jNjgwMDBfXykKIHN0YXRpYyBzc2l6ZV90IHJlYWRfcG9ydChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAogCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewpAQCAtNzk1LDcgKzc5NSw3IEBACiAJLndyaXRlCQk9IHdyaXRlX251bGwsCiB9OwogCi0jaWYgKGRlZmluZWQoQ09ORklHX0lTQSkgfHwgIWRlZmluZWQoX19tYzY4MDAwX18pKSAmJiAoIWRlZmluZWQoQ09ORklHX1BQQ19JU0VSSUVTKSB8fCBkZWZpbmVkKENPTkZJR19QQ0kpKQorI2lmIGRlZmluZWQoQ09ORklHX0lTQSkgfHwgIWRlZmluZWQoX19tYzY4MDAwX18pCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwb3J0X2ZvcHMgPSB7CiAJLmxsc2VlawkJPSBtZW1vcnlfbHNlZWssCiAJLnJlYWQJCT0gcmVhZF9wb3J0LApAQCAtODY1LDcgKzg2NSw3IEBACiAJCWNhc2UgMzoKIAkJCWZpbHAtPmZfb3AgPSAmbnVsbF9mb3BzOwogCQkJYnJlYWs7Ci0jaWYgKGRlZmluZWQoQ09ORklHX0lTQSkgfHwgIWRlZmluZWQoX19tYzY4MDAwX18pKSAmJiAoIWRlZmluZWQoQ09ORklHX1BQQ19JU0VSSUVTKSB8fCBkZWZpbmVkKENPTkZJR19QQ0kpKQorI2lmIGRlZmluZWQoQ09ORklHX0lTQSkgfHwgIWRlZmluZWQoX19tYzY4MDAwX18pCiAJCWNhc2UgNDoKIAkJCWZpbHAtPmZfb3AgPSAmcG9ydF9mb3BzOwogCQkJYnJlYWs7CkBAIC05MTIsNyArOTEyLDcgQEAKIAl7MSwgIm1lbSIsICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAsICZtZW1fZm9wc30sCiAJezIsICJrbWVtIiwgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQLCAma21lbV9mb3BzfSwKIAl7MywgIm51bGwiLCAgICBTX0lSVUdPIHwgU19JV1VHTywgICAgICAgICAgICZudWxsX2ZvcHN9LAotI2lmIChkZWZpbmVkKENPTkZJR19JU0EpIHx8ICFkZWZpbmVkKF9fbWM2ODAwMF9fKSkgJiYgKCFkZWZpbmVkKENPTkZJR19QUENfSVNFUklFUykgfHwgZGVmaW5lZChDT05GSUdfUENJKSkKKyNpZiBkZWZpbmVkKENPTkZJR19JU0EpIHx8ICFkZWZpbmVkKF9fbWM2ODAwMF9fKQogCXs0LCAicG9ydCIsICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCwgJnBvcnRfZm9wc30sCiAjZW5kaWYKIAl7NSwgInplcm8iLCAgICBTX0lSVUdPIHwgU19JV1VHTywgICAgICAgICAgICZ6ZXJvX2ZvcHN9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYyBiL2RyaXZlcnMvY2hhci9yaXNjb204LmMKaW5kZXggMDUwZTcwZS4uMTE5ZTYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYworKysgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCkBAIC04Miw3ICs4Miw2IEBACiBzdGF0aWMgc3RydWN0IHJpc2NvbV9ib2FyZCAqIElSUV90b19ib2FyZFsxNl07CiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnJpc2NvbV9kcml2ZXI7CiBzdGF0aWMgdW5zaWduZWQgY2hhciAqIHRtcF9idWY7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGJhdWRfdGFibGVbXSA9ICB7CiAJMCwgNTAsIDc1LCAxMTAsIDEzNCwgMTUwLCAyMDAsIDMwMCwgNjAwLCAxMjAwLCAxODAwLCAyNDAwLCA0ODAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NjYy5oIGIvZHJpdmVycy9jaGFyL3NjYy5oCmluZGV4IDUxODEwZjcuLjkzOTk4ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zY2MuaAorKysgYi9kcml2ZXJzL2NoYXIvc2NjLmgKQEAgLTM5OSw3ICszOTksNyBAQAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJ0c3RiICUwIiA6IDogImciICgqX3NjY19kZWwpIDogImNjIiApO1wKICAgICB9IHdoaWxlICgwKQogCi1leHRlcm4gdW5zaWduZWQgY2hhciBzY2Nfc2hhZG93WzJdWzE2XTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNjY19zaGFkb3dbMl1bMTZdOwogCiAvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBzaG91bGQgcmVsYXggdGhlIHNvbWVob3cgY29tcGxpY2F0ZWQKICAqIHJlZ2lzdGVyIGFjY2VzcyBvZiB0aGUgU0NDLiBfU0NDd3JpdGUoKSBzdG9yZXMgYWxsIHdyaXR0ZW4gdmFsdWVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc2VyaWFsMTY3LmMgYi9kcml2ZXJzL2NoYXIvc2VyaWFsMTY3LmMKaW5kZXggZjM2MzQyYS4uMDM3Yzk0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jCisrKyBiL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYwpAQCAtMTI5LDcgKzEyOSw2IEBACiAgKiBtZW1vcnkgaWYgbGFyZ2UgbnVtYmVycyBvZiBzZXJpYWwgcG9ydHMgYXJlIG9wZW4uCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmID0gMDsKLURFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOwogCiAvKgogICogVGhpcyBpcyB1c2VkIHRvIGxvb2sgdXAgdGhlIGRpdmlzb3Igc3BlZWRzIGFuZCB0aGUgdGltZW91dHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYwppbmRleCAwYTU3NGJkLi41MzQzZTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKKysrIGIvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCkBAIC0xODQsNyArMTg0LDYgQEAKIAogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpzcGVjaWFsaXhfZHJpdmVyOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKiB0bXBfYnVmOwotc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBiYXVkX3RhYmxlW10gPSAgewogCTAsIDUwLCA3NSwgMTEwLCAxMzQsIDE1MCwgMjAwLCAzMDAsIDYwMCwgMTIwMCwgMTgwMCwgMjQwMCwgNDgwMCwKQEAgLTI1NTYsOCArMjU1NSw2IEBACiAKIAlmdW5jX2VudGVyKCk7CiAKLQlpbml0X01VVEVYKCZ0bXBfYnVmX3NlbSk7IC8qIEluaXQgZGUgdGhlIHNlbWFwaG9yZSAtIHB2ZGwgKi8KLQogCWlmIChpb2Jhc2VbMF0gfHwgaW9iYXNlWzFdIHx8IGlvYmFzZVsyXSB8fCBpb2Jhc2VbM10pIHsKIAkJZm9yKGkgPSAwOyBpIDwgU1hfTkJPQVJEOyBpKyspIHsKIAkJCXN4X2JvYXJkW2ldLmJhc2UgPSBpb2Jhc2VbaV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCmluZGV4IDlmMWI0NjYuLmVkZTY4OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCisrKyBiL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCkBAIC05NTEsNyArOTUxLDYgQEAKICAqIG1lbW9yeSBpZiBsYXJnZSBudW1iZXJzIG9mIHNlcmlhbCBwb3J0cyBhcmUgb3Blbi4KICAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKnRtcF9idWY7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1nc2xfcGFyYW5vaWFfY2hlY2soc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLAogCQkJCQljaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Zpb2NvbnMuYyBiL2RyaXZlcnMvY2hhci92aW9jb25zLmMKaW5kZXggZmFlZTVlNy4uNGU1MzYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Zpb2NvbnMuYworKysgYi9kcml2ZXJzL2NoYXIvdmlvY29ucy5jCkBAIC00NzYsMTkgKzQ3NiwxOSBAQAogICovCiBzdGF0aWMgdm9pZCBpbml0RGF0YUV2ZW50KHN0cnVjdCB2aW9jaGFybHBldmVudCAqdmlvY2hhciwgSHZMcEluZGV4IGxwKQogeworCXN0cnVjdCBIdkxwRXZlbnQgKmhldiA9ICZ2aW9jaGFyLT5ldmVudDsKKwogCW1lbXNldCh2aW9jaGFyLCAwLCBzaXplb2Yoc3RydWN0IHZpb2NoYXJscGV2ZW50KSk7CiAKLQl2aW9jaGFyLT5ldmVudC54RmxhZ3MueFZhbGlkID0gMTsKLQl2aW9jaGFyLT5ldmVudC54RmxhZ3MueEZ1bmN0aW9uID0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludDsKLQl2aW9jaGFyLT5ldmVudC54RmxhZ3MueEFja0luZCA9IEh2THBFdmVudF9BY2tJbmRfTm9BY2s7Ci0JdmlvY2hhci0+ZXZlbnQueEZsYWdzLnhBY2tUeXBlID0gSHZMcEV2ZW50X0Fja1R5cGVfRGVmZXJyZWRBY2s7Ci0JdmlvY2hhci0+ZXZlbnQueFR5cGUgPSBIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsSW87Ci0JdmlvY2hhci0+ZXZlbnQueFN1YnR5cGUgPSB2aW9tYWpvcnN1YnR5cGVfY2hhcmlvIHwgdmlvY2hhcmRhdGE7Ci0JdmlvY2hhci0+ZXZlbnQueFNvdXJjZUxwID0gSHZMcENvbmZpZ19nZXRMcEluZGV4KCk7Ci0JdmlvY2hhci0+ZXZlbnQueFRhcmdldExwID0gbHA7Ci0JdmlvY2hhci0+ZXZlbnQueFNpemVNaW51czEgPSBzaXplb2Yoc3RydWN0IHZpb2NoYXJscGV2ZW50KTsKLQl2aW9jaGFyLT5ldmVudC54U291cmNlSW5zdGFuY2VJZCA9IHZpb3BhdGhfc291cmNlaW5zdChscCk7Ci0JdmlvY2hhci0+ZXZlbnQueFRhcmdldEluc3RhbmNlSWQgPSB2aW9wYXRoX3RhcmdldGluc3QobHApOworCWhldi0+ZmxhZ3MgPSBIVl9MUF9FVkVOVF9WQUxJRCB8IEhWX0xQX0VWRU5UX0RFRkVSUkVEX0FDSyB8CisJCUhWX0xQX0VWRU5UX0lOVDsKKwloZXYtPnhUeXBlID0gSHZMcEV2ZW50X1R5cGVfVmlydHVhbElvOworCWhldi0+eFN1YnR5cGUgPSB2aW9tYWpvcnN1YnR5cGVfY2hhcmlvIHwgdmlvY2hhcmRhdGE7CisJaGV2LT54U291cmNlTHAgPSBIdkxwQ29uZmlnX2dldExwSW5kZXgoKTsKKwloZXYtPnhUYXJnZXRMcCA9IGxwOworCWhldi0+eFNpemVNaW51czEgPSBzaXplb2Yoc3RydWN0IHZpb2NoYXJscGV2ZW50KTsKKwloZXYtPnhTb3VyY2VJbnN0YW5jZUlkID0gdmlvcGF0aF9zb3VyY2VpbnN0KGxwKTsKKwloZXYtPnhUYXJnZXRJbnN0YW5jZUlkID0gdmlvcGF0aF90YXJnZXRpbnN0KGxwKTsKIH0KIAogLyoKQEAgLTc1Miw3ICs3NTIsNyBAQAogCXN0cnVjdCBwb3J0X2luZm8gKnBpOwogCWludCByZWplY3QgPSAwOwogCi0JaWYgKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9BY2spIHsKKwlpZiAoaHZscGV2ZW50X2lzX2FjayhldmVudCkpIHsKIAkJaWYgKHBvcnQgPj0gVlRUWV9QT1JUUykKIAkJCXJldHVybjsKIApAQCAtNzg4LDcgKzc4OCw3IEBACiAJfQogCiAJLyogVGhpcyBoYWQgYmV0dGVyIHJlcXVpcmUgYW4gYWNrLCBvdGhlcndpc2UgY29tcGxhaW4gKi8KLQlpZiAoZXZlbnQtPnhGbGFncy54QWNrSW5kICE9IEh2THBFdmVudF9BY2tJbmRfRG9BY2spIHsKKwlpZiAoIWh2bHBldmVudF9uZWVkX2FjayhldmVudCkpIHsKIAkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOICJ2aW9jaGFyb3BlbiB3aXRob3V0IGFjayBiaXQhXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTg1Niw3ICs4NTYsNyBAQAogCXN0cnVjdCB2aW9jaGFybHBldmVudCAqY2V2ZW50ID0gKHN0cnVjdCB2aW9jaGFybHBldmVudCAqKWV2ZW50OwogCXU4IHBvcnQgPSBjZXZlbnQtPnZpcnR1YWxfZGV2aWNlOwogCi0JaWYgKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9JbnQpIHsKKwlpZiAoaHZscGV2ZW50X2lzX2ludChldmVudCkpIHsKIAkJaWYgKHBvcnQgPj0gVlRUWV9QT1JUUykgewogCQkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOCiAJCQkJCSJjbG9zZSBtZXNzYWdlIGZyb20gaW52YWxpZCB2aXJ0dWFsIGRldmljZS5cbiIpOwpAQCAtMTA1Niw4ICsxMDU2LDcgQEAKIAkJdmlvSGFuZGxlQ29uZmlnKGV2ZW50KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJaWYgKChldmVudC0+eEZsYWdzLnhGdW5jdGlvbiA9PSBIdkxwRXZlbnRfRnVuY3Rpb25fSW50KSAmJgotCQkgICAgKGV2ZW50LT54RmxhZ3MueEFja0luZCA9PSBIdkxwRXZlbnRfQWNrSW5kX0RvQWNrKSkgeworCQlpZiAoaHZscGV2ZW50X2lzX2ludChldmVudCkgJiYgaHZscGV2ZW50X25lZWRfYWNrKGV2ZW50KSkgewogCQkJZXZlbnQtPnhSYyA9IEh2THBFdmVudF9SY19JbnZhbGlkU3VidHlwZTsKIAkJCUh2Q2FsbEV2ZW50X2Fja0xwRXZlbnQoZXZlbnQpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Rpby9kaW8tZHJpdmVyLmMgYi9kcml2ZXJzL2Rpby9kaW8tZHJpdmVyLmMKaW5kZXggZmZlNmY0NC4uY2E4ZTY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kaW8vZGlvLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvZGlvL2Rpby1kcml2ZXIuYwpAQCAtODMsNyArODMsNiBAQAogCS8qIGluaXRpYWxpemUgY29tbW9uIGRyaXZlciBmaWVsZHMgKi8KIAlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZkaW9fYnVzX3R5cGU7Ci0JZHJ2LT5kcml2ZXIucHJvYmUgPSBkaW9fZGV2aWNlX3Byb2JlOwogCiAJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJY291bnQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKQEAgLTE0NSw3ICsxNDQsOCBAQAogCiBzdHJ1Y3QgYnVzX3R5cGUgZGlvX2J1c190eXBlID0gewogCS5uYW1lCT0gImRpbyIsCi0JLm1hdGNoCT0gZGlvX2J1c19tYXRjaAorCS5tYXRjaAk9IGRpb19idXNfbWF0Y2gsCisJLnByb2JlCT0gZGlvX2RldmljZV9wcm9iZSwKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKaW5kZXggNzBmN2FiOC4uODZlMjIzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCkBAIC04OTksNiArODk5LDEyIEBACiAJc3RydWN0IHB4YV9pMmMgKmkyYyA9IGFkYXAtPmFsZ29fZGF0YTsKIAlpbnQgcmV0LCBpOwogCisJLyogSWYgdGhlIEkyQyBjb250cm9sbGVyIGlzIGRpc2FibGVkIHdlIG5lZWQgdG8gcmVzZXQgaXQgKHByb2JhYmx5IGR1ZQorIAkgICB0byBhIHN1c3BlbmQvcmVzdW1lIGRlc3Ryb3lpbmcgc3RhdGUpLiBXZSBkbyB0aGlzIGhlcmUgYXMgd2UgY2FuIHRoZW4KKyAJICAgYXZvaWQgd29ycnlpbmcgYWJvdXQgcmVzdW1pbmcgdGhlIGNvbnRyb2xsZXIgYmVmb3JlIGl0cyB1c2Vycy4gKi8KKwlpZiAoIShJQ1IgJiBJQ1JfSVVFKSkKKwkJaTJjX3B4YV9yZXNldChpMmMpOworCiAJZm9yIChpID0gYWRhcC0+cmV0cmllczsgaSA+PSAwOyBpLS0pIHsKIAkJcmV0ID0gaTJjX3B4YV9kb194ZmVyKGkyYywgbXNncywgbnVtKTsKIAkJaWYgKHJldCAhPSBJMkNfUkVUUlkpCkBAIC05MzksNyArOTQ1LDkgQEAKIHN0YXRpYyBpbnQgaTJjX3B4YV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHB4YV9pMmMgKmkyYyA9ICZpMmNfcHhhOworI2lmZGVmIENPTkZJR19JMkNfUFhBX1NMQVZFCiAJc3RydWN0IGkyY19weGFfcGxhdGZvcm1fZGF0YSAqcGxhdCA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisjZW5kaWYKIAlpbnQgcmV0OwogCiAjaWZkZWYgQ09ORklHX1BYQTI3eApAQCAtMTAyNCw1ICsxMDMyLDcgQEAKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmkyY19weGFfZHJpdmVyKTsKIH0KIAorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCiBtb2R1bGVfaW5pdChpMmNfYWRhcF9weGFfaW5pdCk7CiBtb2R1bGVfZXhpdChpMmNfYWRhcF9weGFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9pMmMtY29yZS5jIGIvZHJpdmVycy9pMmMvaTJjLWNvcmUuYwppbmRleCA1MmI3NzQ3Li4wY2U1OGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCisrKyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKQEAgLTYzLDEzICs2Myw2IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdHJ1Y3QgYnVzX3R5cGUgaTJjX2J1c190eXBlID0gewotCS5uYW1lID0JCSJpMmMiLAotCS5tYXRjaCA9CWkyY19kZXZpY2VfbWF0Y2gsCi0JLnN1c3BlbmQgPSAgICAgIGkyY19idXNfc3VzcGVuZCwKLQkucmVzdW1lID0gICAgICAgaTJjX2J1c19yZXN1bWUsCi19OwotCiBzdGF0aWMgaW50IGkyY19kZXZpY2VfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXJldHVybiAtRU5PREVWOwpAQCAtODAsNiArNzMsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RydWN0IGJ1c190eXBlIGkyY19idXNfdHlwZSA9IHsKKwkubmFtZSA9CQkiaTJjIiwKKwkubWF0Y2ggPQlpMmNfZGV2aWNlX21hdGNoLAorCS5wcm9iZSA9CWkyY19kZXZpY2VfcHJvYmUsCisJLnJlbW92ZSA9CWkyY19kZXZpY2VfcmVtb3ZlLAorCS5zdXNwZW5kID0gICAgICBpMmNfYnVzX3N1c3BlbmQsCisJLnJlc3VtZSA9ICAgICAgIGkyY19idXNfcmVzdW1lLAorfTsKKwogdm9pZCBpMmNfYWRhcHRlcl9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gZGV2X3RvX2kyY19hZGFwdGVyKGRldik7CkBAIC05MCw4ICs5Miw2IEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLm5hbWUgPQkiaTJjX2FkYXB0ZXIiLAogCS5idXMgPSAmaTJjX2J1c190eXBlLAotCS5wcm9iZSA9IGkyY19kZXZpY2VfcHJvYmUsCi0JLnJlbW92ZSA9IGkyY19kZXZpY2VfcmVtb3ZlLAogfTsKIAogc3RhdGljIHZvaWQgaTJjX2FkYXB0ZXJfY2xhc3NfZGV2X3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2KQpAQCAtMjk0LDggKzI5NCw2IEBACiAJLyogYWRkIHRoZSBkcml2ZXIgdG8gdGhlIGxpc3Qgb2YgaTJjIGRyaXZlcnMgaW4gdGhlIGRyaXZlciBjb3JlICovCiAJZHJpdmVyLT5kcml2ZXIub3duZXIgPSBvd25lcjsKIAlkcml2ZXItPmRyaXZlci5idXMgPSAmaTJjX2J1c190eXBlOwotCWRyaXZlci0+ZHJpdmVyLnByb2JlID0gaTJjX2RldmljZV9wcm9iZTsKLQlkcml2ZXItPmRyaXZlci5yZW1vdmUgPSBpMmNfZGV2aWNlX3JlbW92ZTsKIAogCXJlcyA9IGRyaXZlcl9yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOwogCWlmIChyZXMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtY2QuYyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCmluZGV4IDliMmViZDIuLmVmMDlhN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCkBAIC0zMjU2LDkgKzMyNTYsOCBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgaWRlX2NkX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpZGVfY2RfcmVtb3ZlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7CiAJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CiAKIAlpZGVfdW5yZWdpc3Rlcl9zdWJkcml2ZXIoZHJpdmUsIGluZm8tPmRyaXZlcik7CkBAIC0zMjY2LDggKzMyNjUsNiBAQAogCWRlbF9nZW5kaXNrKGluZm8tPmRpc2spOwogCiAJaWRlX2NkX3B1dChpbmZvKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpZGVfY2RfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKQEAgLTMyOTEsNyArMzI4OCw3IEBACiAJa2ZyZWUoaW5mbyk7CiB9CiAKLXN0YXRpYyBpbnQgaWRlX2NkX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IGlkZV9jZF9wcm9iZShpZGVfZHJpdmVfdCAqKTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgaW50IHByb2NfaWRlY2RfcmVhZF9jYXBhY2l0eQpAQCAtMzMxNyw5ICszMzE0LDkgQEAKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkubmFtZQkJPSAiaWRlLWNkcm9tIiwKIAkJLmJ1cwkJPSAmaWRlX2J1c190eXBlLAotCQkucHJvYmUJCT0gaWRlX2NkX3Byb2JlLAotCQkucmVtb3ZlCQk9IGlkZV9jZF9yZW1vdmUsCiAJfSwKKwkucHJvYmUJCQk9IGlkZV9jZF9wcm9iZSwKKwkucmVtb3ZlCQkJPSBpZGVfY2RfcmVtb3ZlLAogCS52ZXJzaW9uCQk9IElERUNEX1ZFUlNJT04sCiAJLm1lZGlhCQkJPSBpZGVfY2Ryb20sCiAJLnN1cHBvcnRzX2RzY19vdmVybGFwCT0gMSwKQEAgLTM0MTMsOSArMzQxMCw4IEBACiBtb2R1bGVfcGFyYW0oaWdub3JlLCBjaGFycCwgMDQwMCk7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFUQVBJIENELVJPTSBEcml2ZXIiKTsKIAotc3RhdGljIGludCBpZGVfY2RfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBpZGVfY2RfcHJvYmUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbzsKIAlzdHJ1Y3QgZ2VuZGlzayAqZzsKIAlzdHJ1Y3QgcmVxdWVzdF9zZW5zZSBzZW5zZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMgYi9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCmluZGV4IGNhYjM2MmUuLjI0NWI1MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRpc2suYwpAQCAtOTk3LDkgKzk5Nyw4IEBACiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiB3Y2FjaGUgZmx1c2ggZmFpbGVkIVxuIiwgZHJpdmUtPm5hbWUpOwogfQogCi1zdGF0aWMgaW50IGlkZV9kaXNrX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpZGVfZGlza19yZW1vdmUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgaWRlX2Rpc2tfb2JqICppZGtwID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBnZW5kaXNrICpnID0gaWRrcC0+ZGlzazsKIApAQCAtMTAxMCw4ICsxMDA5LDYgQEAKIAlpZGVfY2FjaGVmbHVzaF9wKGRyaXZlKTsKIAogCWlkZV9kaXNrX3B1dChpZGtwKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpZGVfZGlza19yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQpAQCAtMTAyNywxMiArMTAyNCwxMCBAQAogCWtmcmVlKGlka3ApOwogfQogCi1zdGF0aWMgaW50IGlkZV9kaXNrX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlkZV9kaXNrX3Byb2JlKGlkZV9kcml2ZV90ICpkcml2ZSk7CiAKLXN0YXRpYyB2b2lkIGlkZV9kZXZpY2Vfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaWRlX2RldmljZV9zaHV0ZG93bihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gY29udGFpbmVyX29mKGRldiwgaWRlX2RyaXZlX3QsIGdlbmRldik7Ci0KICNpZmRlZglDT05GSUdfQUxQSEEKIAkvKiBPbiBBbHBoYSwgaGFsdCg4KSBkb2Vzbid0IGFjdHVhbGx5IHR1cm4gdGhlIG1hY2hpbmUgb2ZmLAogCSAgIGl0IHB1dHMgeW91IGludG8gdGhlIHNvcnQgb2YgZmlybXdhcmUgbW9uaXRvci4gVHlwaWNhbGx5LApAQCAtMTA1NCw3ICsxMDQ5LDcgQEAKIAl9CiAKIAlwcmludGsoIlNodXRkb3duOiAlc1xuIiwgZHJpdmUtPm5hbWUpOwotCWRldi0+YnVzLT5zdXNwZW5kKGRldiwgUE1TR19TVVNQRU5EKTsKKwlkcml2ZS0+Z2VuZGV2LmJ1cy0+c3VzcGVuZCgmZHJpdmUtPmdlbmRldiwgUE1TR19TVVNQRU5EKTsKIH0KIAogc3RhdGljIGlkZV9kcml2ZXJfdCBpZGVkaXNrX2RyaXZlciA9IHsKQEAgLTEwNjIsMTAgKzEwNTcsMTAgQEAKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkubmFtZQkJPSAiaWRlLWRpc2siLAogCQkuYnVzCQk9ICZpZGVfYnVzX3R5cGUsCi0JCS5wcm9iZQkJPSBpZGVfZGlza19wcm9iZSwKLQkJLnJlbW92ZQkJPSBpZGVfZGlza19yZW1vdmUsCi0JCS5zaHV0ZG93bgk9IGlkZV9kZXZpY2Vfc2h1dGRvd24sCiAJfSwKKwkucHJvYmUJCQk9IGlkZV9kaXNrX3Byb2JlLAorCS5yZW1vdmUJCQk9IGlkZV9kaXNrX3JlbW92ZSwKKwkuc2h1dGRvd24JCT0gaWRlX2RldmljZV9zaHV0ZG93biwKIAkudmVyc2lvbgkJPSBJREVESVNLX1ZFUlNJT04sCiAJLm1lZGlhCQkJPSBpZGVfZGlzaywKIAkuc3VwcG9ydHNfZHNjX292ZXJsYXAJPSAwLApAQCAtMTE4Miw5ICsxMTc3LDggQEAKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBVEEgRElTSyBEcml2ZXIiKTsKIAotc3RhdGljIGludCBpZGVfZGlza19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGlkZV9kaXNrX3Byb2JlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7CiAJc3RydWN0IGlkZV9kaXNrX29iaiAqaWRrcDsKIAlzdHJ1Y3QgZ2VuZGlzayAqZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCmluZGV4IDU5NDVmNTUuLjFmOGRiOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKQEAgLTE4NzEsOSArMTg3MSw4IEBACiAJaWRlZmxvcHB5X2FkZF9zZXR0aW5ncyhkcml2ZSk7CiB9CiAKLXN0YXRpYyBpbnQgaWRlX2Zsb3BweV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaWRlX2Zsb3BweV9yZW1vdmUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKIAlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgZ2VuZGlzayAqZyA9IGZsb3BweS0+ZGlzazsKIApAQCAtMTg4Miw4ICsxODgxLDYgQEAKIAlkZWxfZ2VuZGlzayhnKTsKIAogCWlkZV9mbG9wcHlfcHV0KGZsb3BweSk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgaWRlX2Zsb3BweV9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQpAQCAtMTkyMiwxNiArMTkxOSwxNiBAQAogCiAjZW5kaWYJLyogQ09ORklHX1BST0NfRlMgKi8KIAotc3RhdGljIGludCBpZGVfZmxvcHB5X3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IGlkZV9mbG9wcHlfcHJvYmUoaWRlX2RyaXZlX3QgKik7CiAKIHN0YXRpYyBpZGVfZHJpdmVyX3QgaWRlZmxvcHB5X2RyaXZlciA9IHsKIAkuZ2VuX2RyaXZlciA9IHsKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkubmFtZQkJPSAiaWRlLWZsb3BweSIsCiAJCS5idXMJCT0gJmlkZV9idXNfdHlwZSwKLQkJLnByb2JlCQk9IGlkZV9mbG9wcHlfcHJvYmUsCi0JCS5yZW1vdmUJCT0gaWRlX2Zsb3BweV9yZW1vdmUsCiAJfSwKKwkucHJvYmUJCQk9IGlkZV9mbG9wcHlfcHJvYmUsCisJLnJlbW92ZQkJCT0gaWRlX2Zsb3BweV9yZW1vdmUsCiAJLnZlcnNpb24JCT0gSURFRkxPUFBZX1ZFUlNJT04sCiAJLm1lZGlhCQkJPSBpZGVfZmxvcHB5LAogCS5zdXBwb3J0c19kc2Nfb3ZlcmxhcAk9IDAsCkBAIC0yMTM2LDkgKzIxMzMsOCBAQAogCS5yZXZhbGlkYXRlX2Rpc2s9IGlkZWZsb3BweV9yZXZhbGlkYXRlX2Rpc2sKIH07CiAKLXN0YXRpYyBpbnQgaWRlX2Zsb3BweV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGlkZV9mbG9wcHlfcHJvYmUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKIAlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweTsKIAlzdHJ1Y3QgZ2VuZGlzayAqZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWlvLmMgYi9kcml2ZXJzL2lkZS9pZGUtaW8uYwppbmRleCBiY2JhZWI1Li44ZDUwZGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtaW8uYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaW8uYwpAQCAtNTUsMjIgKzU1LDkgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAKLXZvaWQgaWRlX3NvZnRpcnFfZG9uZShzdHJ1Y3QgcmVxdWVzdCAqcnEpCi17Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gcnEtPnE7Ci0KLQlhZGRfZGlza19yYW5kb21uZXNzKHJxLT5ycV9kaXNrKTsKLQllbmRfdGhhdF9yZXF1ZXN0X2NodW5rKHJxLCAxLCBycS0+ZGF0YV9sZW4pOwotCi0Jc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKLQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocnEsIDEpOwotCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKLX0KLQogaW50IF9faWRlX2VuZF9yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgdXB0b2RhdGUsCiAJCSAgICAgIGludCBucl9zZWN0b3JzKQogewotCXVuc2lnbmVkIGludCBuYnl0ZXM7CiAJaW50IHJldCA9IDE7CiAKIAlCVUdfT04oIShycS0+ZmxhZ3MgJiBSRVFfU1RBUlRFRCkpOwpAQCAtOTQsMjcgKzgxLDEyIEBACiAJCUhXR1JPVVAoZHJpdmUpLT5od2lmLT5pZGVfZG1hX29uKGRyaXZlKTsKIAl9CiAKLQkvKgotCSAqIEZvciBwYXJ0aWFsIGNvbXBsZXRpb25zIChvciBub24gZnMvcGMgcmVxdWVzdHMpLCB1c2UgdGhlIHJlZ3VsYXIKLQkgKiBkaXJlY3QgY29tcGxldGlvbiBwYXRoLiBTYW1lIHRoaW5nIGZvciByZXF1ZXN0cyB0aGF0IGZhaWxlZCwgdG8KLQkgKiBwcmVzZXJ2ZSB0aGUgLT5lcnJvcnMgdmFsdWUgd2UgdXNlIHRoZSBub3JtYWwgY29tcGxldGlvbiBwYXRoCi0JICogZm9yIHRob3NlCi0JICovCi0JbmJ5dGVzID0gbnJfc2VjdG9ycyA8PCA5OwotCWlmICghcnEtPmVycm9ycyAmJiBycV9hbGxfZG9uZShycSwgbmJ5dGVzKSkgewotCQlycS0+ZGF0YV9sZW4gPSBuYnl0ZXM7CisJaWYgKCFlbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0KHJxLCB1cHRvZGF0ZSwgbnJfc2VjdG9ycykpIHsKKwkJYWRkX2Rpc2tfcmFuZG9tbmVzcyhycS0+cnFfZGlzayk7CiAJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocnEpOwogCQlIV0dST1VQKGRyaXZlKS0+cnEgPSBOVUxMOwotCQlibGtfY29tcGxldGVfcmVxdWVzdChycSk7CisJCWVuZF90aGF0X3JlcXVlc3RfbGFzdChycSwgdXB0b2RhdGUpOwogCQlyZXQgPSAwOwotCX0gZWxzZSB7Ci0JCWlmICghZW5kX3RoYXRfcmVxdWVzdF9maXJzdChycSwgdXB0b2RhdGUsIG5yX3NlY3RvcnMpKSB7Ci0JCQlhZGRfZGlza19yYW5kb21uZXNzKHJxLT5ycV9kaXNrKTsKLQkJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocnEpOwotCQkJSFdHUk9VUChkcml2ZSktPnJxID0gTlVMTDsKLQkJCWVuZF90aGF0X3JlcXVlc3RfbGFzdChycSwgdXB0b2RhdGUpOwotCQkJcmV0ID0gMDsKLQkJfQogCX0KIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCmluZGV4IDdjYjJkODYuLmU3NDI1NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCkBAIC0xMDExLDggKzEwMTEsNiBAQAogCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMocSwgbWF4X3NnX2VudHJpZXMpOwogCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxLCBtYXhfc2dfZW50cmllcyk7CiAKLQlibGtfcXVldWVfc29mdGlycV9kb25lKHEsIGlkZV9zb2Z0aXJxX2RvbmUpOwotCiAJLyogYXNzaWduIGRyaXZlIHF1ZXVlICovCiAJZHJpdmUtPnF1ZXVlID0gcTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXRhcGUuYyBiL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKaW5kZXggZmFiOWIyYi4uMDEwMWQwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXRhcGUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCkBAIC00NjgyLDkgKzQ2ODIsOCBAQAogCWlkZXRhcGVfYWRkX3NldHRpbmdzKGRyaXZlKTsKIH0KIAotc3RhdGljIGludCBpZGVfdGFwZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaWRlX3RhcGVfcmVtb3ZlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7CiAJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CiAKIAlpZGVfdW5yZWdpc3Rlcl9zdWJkcml2ZXIoZHJpdmUsIHRhcGUtPmRyaXZlcik7CkBAIC00NjkyLDggKzQ2OTEsNiBAQAogCWlkZV91bnJlZ2lzdGVyX3JlZ2lvbih0YXBlLT5kaXNrKTsKIAogCWlkZV90YXBlX3B1dCh0YXBlKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpZGVfdGFwZV9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQpAQCAtNDc0NSwxNiArNDc0MiwxNiBAQAogCiAjZW5kaWYKIAotc3RhdGljIGludCBpZGVfdGFwZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIGludCBpZGVfdGFwZV9wcm9iZShpZGVfZHJpdmVfdCAqKTsKIAogc3RhdGljIGlkZV9kcml2ZXJfdCBpZGV0YXBlX2RyaXZlciA9IHsKIAkuZ2VuX2RyaXZlciA9IHsKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkubmFtZQkJPSAiaWRlLXRhcGUiLAogCQkuYnVzCQk9ICZpZGVfYnVzX3R5cGUsCi0JCS5wcm9iZQkJPSBpZGVfdGFwZV9wcm9iZSwKLQkJLnJlbW92ZQkJPSBpZGVfdGFwZV9yZW1vdmUsCiAJfSwKKwkucHJvYmUJCQk9IGlkZV90YXBlX3Byb2JlLAorCS5yZW1vdmUJCQk9IGlkZV90YXBlX3JlbW92ZSwKIAkudmVyc2lvbgkJPSBJREVUQVBFX1ZFUlNJT04sCiAJLm1lZGlhCQkJPSBpZGVfdGFwZSwKIAkuc3VwcG9ydHNfZHNjX292ZXJsYXAgCT0gMSwKQEAgLTQ4MjUsOSArNDgyMiw4IEBACiAJLmlvY3RsCQk9IGlkZXRhcGVfaW9jdGwsCiB9OwogCi1zdGF0aWMgaW50IGlkZV90YXBlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaWRlX3RhcGVfcHJvYmUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKIAlpZGV0YXBlX3RhcGVfdCAqdGFwZTsKIAlzdHJ1Y3QgZ2VuZGlzayAqZzsKIAlpbnQgbWlub3I7CkBAIC00ODgzLDkgKzQ4NzksOSBAQAogCWlkZXRhcGVfc2V0dXAoZHJpdmUsIHRhcGUsIG1pbm9yKTsKIAogCWNsYXNzX2RldmljZV9jcmVhdGUoaWRldGFwZV9zeXNmc19jbGFzcywgTlVMTCwKLQkJCU1LREVWKElERVRBUEVfTUFKT1IsIG1pbm9yKSwgZGV2LCAiJXMiLCB0YXBlLT5uYW1lKTsKKwkJCU1LREVWKElERVRBUEVfTUFKT1IsIG1pbm9yKSwgJmRyaXZlLT5nZW5kZXYsICIlcyIsIHRhcGUtPm5hbWUpOwogCWNsYXNzX2RldmljZV9jcmVhdGUoaWRldGFwZV9zeXNmc19jbGFzcywgTlVMTCwKLQkJCU1LREVWKElERVRBUEVfTUFKT1IsIG1pbm9yICsgMTI4KSwgZGV2LCAibiVzIiwgdGFwZS0+bmFtZSk7CisJCQlNS0RFVihJREVUQVBFX01BSk9SLCBtaW5vciArIDEyOCksICZkcml2ZS0+Z2VuZGV2LCAibiVzIiwgdGFwZS0+bmFtZSk7CiAKIAlkZXZmc19ta19jZGV2KE1LREVWKEhXSUYoZHJpdmUpLT5tYWpvciwgbWlub3IpLAogCQkJU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLmMgYi9kcml2ZXJzL2lkZS9pZGUuYwppbmRleCBlYzVhNGNiLi5hZmViMDJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLmMKQEAgLTE5NDksMTAgKzE5NDksNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBnZW5lcmljX2lkZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOworCWlkZV9kcml2ZXJfdCAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlyZXR1cm4gZHJ2LT5wcm9iZSA/IGRydi0+cHJvYmUoZHJpdmUpIDogLUVOT0RFVjsKK30KKworc3RhdGljIGludCBnZW5lcmljX2lkZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKKwlpZGVfZHJpdmVyX3QgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKGRydi0+cmVtb3ZlKQorCQlkcnYtPnJlbW92ZShkcml2ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJpY19pZGVfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKKwlpZGVfZHJpdmVyX3QgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c2h1dGRvd24pCisJCWRydi0+c2h1dGRvd24oZHJpdmUpOworfQorCiBzdHJ1Y3QgYnVzX3R5cGUgaWRlX2J1c190eXBlID0gewogCS5uYW1lCQk9ICJpZGUiLAogCS5tYXRjaAkJPSBpZGVfYnVzX21hdGNoLAogCS51ZXZlbnQJCT0gaWRlX3VldmVudCwKKwkucHJvYmUJCT0gZ2VuZXJpY19pZGVfcHJvYmUsCisJLnJlbW92ZQkJPSBnZW5lcmljX2lkZV9yZW1vdmUsCisJLnNodXRkb3duCT0gZ2VuZXJpY19pZGVfc2h1dGRvd24sCiAJLmRldl9hdHRycwk9IGlkZV9kZXZfYXR0cnMsCiAJLnN1c3BlbmQJPSBnZW5lcmljX2lkZV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gZ2VuZXJpY19pZGVfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtLmMKaW5kZXggM2E2MTFmZS4uYzA2YjE4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbS5jCkBAIC0zMTYzLDIyICszMTYzLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWJfY21faW5pdF9xcF9hdHRyKTsKIAotc3RhdGljIF9fYmU2NCBjbV9nZXRfY2FfZ3VpZChzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IGliX2RldmljZV9hdHRyICpkZXZpY2VfYXR0cjsKLQlfX2JlNjQgZ3VpZDsKLQlpbnQgcmV0OwotCi0JZGV2aWNlX2F0dHIgPSBrbWFsbG9jKHNpemVvZiAqZGV2aWNlX2F0dHIsIEdGUF9LRVJORUwpOwotCWlmICghZGV2aWNlX2F0dHIpCi0JCXJldHVybiAwOwotCi0JcmV0ID0gaWJfcXVlcnlfZGV2aWNlKGRldmljZSwgZGV2aWNlX2F0dHIpOwotCWd1aWQgPSByZXQgPyAwIDogZGV2aWNlX2F0dHItPm5vZGVfZ3VpZDsKLQlrZnJlZShkZXZpY2VfYXR0cik7Ci0JcmV0dXJuIGd1aWQ7Ci19Ci0KIHN0YXRpYyB2b2lkIGNtX2FkZF9vbmUoc3RydWN0IGliX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBjbV9kZXZpY2UgKmNtX2RldjsKQEAgLTMyMDAsOSArMzE4NCw3IEBACiAJCXJldHVybjsKIAogCWNtX2Rldi0+ZGV2aWNlID0gZGV2aWNlOwotCWNtX2Rldi0+Y2FfZ3VpZCA9IGNtX2dldF9jYV9ndWlkKGRldmljZSk7Ci0JaWYgKCFjbV9kZXYtPmNhX2d1aWQpCi0JCWdvdG8gZXJyb3IxOworCWNtX2Rldi0+Y2FfZ3VpZCA9IGRldmljZS0+bm9kZV9ndWlkOwogCiAJc2V0X2JpdChJQl9NR01UX01FVEhPRF9TRU5ELCByZWdfcmVxLm1ldGhvZF9tYXNrKTsKIAlmb3IgKGkgPSAxOyBpIDw9IGRldmljZS0+cGh5c19wb3J0X2NudDsgaSsrKSB7CkBAIC0zMjE3LDExICszMTk5LDExIEBACiAJCQkJCQkJY21fcmVjdl9oYW5kbGVyLAogCQkJCQkJCXBvcnQpOwogCQlpZiAoSVNfRVJSKHBvcnQtPm1hZF9hZ2VudCkpCi0JCQlnb3RvIGVycm9yMjsKKwkJCWdvdG8gZXJyb3IxOwogCiAJCXJldCA9IGliX21vZGlmeV9wb3J0KGRldmljZSwgaSwgMCwgJnBvcnRfbW9kaWZ5KTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3IzOworCQkJZ290byBlcnJvcjI7CiAJfQogCWliX3NldF9jbGllbnRfZGF0YShkZXZpY2UsICZjbV9jbGllbnQsIGNtX2Rldik7CiAKQEAgLTMyMzAsOSArMzIxMiw5IEBACiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmNtLmRldmljZV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuOwogCi1lcnJvcjM6Ci0JaWJfdW5yZWdpc3Rlcl9tYWRfYWdlbnQocG9ydC0+bWFkX2FnZW50KTsKIGVycm9yMjoKKwlpYl91bnJlZ2lzdGVyX21hZF9hZ2VudChwb3J0LT5tYWRfYWdlbnQpOworZXJyb3IxOgogCXBvcnRfbW9kaWZ5LnNldF9wb3J0X2NhcF9tYXNrID0gMDsKIAlwb3J0X21vZGlmeS5jbHJfcG9ydF9jYXBfbWFzayA9IElCX1BPUlRfQ01fU1VQOwogCXdoaWxlICgtLWkpIHsKQEAgLTMyNDAsNyArMzIyMiw2IEBACiAJCWliX21vZGlmeV9wb3J0KGRldmljZSwgcG9ydC0+cG9ydF9udW0sIDAsICZwb3J0X21vZGlmeSk7CiAJCWliX3VucmVnaXN0ZXJfbWFkX2FnZW50KHBvcnQtPm1hZF9hZ2VudCk7CiAJfQotZXJyb3IxOgogCWtmcmVlKGNtX2Rldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2RldmljZS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvZGV2aWNlLmMKaW5kZXggZTE2OWU3OS4uYjJmM2NiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvZGV2aWNlLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvZGV2aWNlLmMKQEAgLTM4LDggKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgImNvcmVfcHJpdi5oIgogCkBAIC01NywxMyArNTYsMTMgQEAKIHN0YXRpYyBMSVNUX0hFQUQoY2xpZW50X2xpc3QpOwogCiAvKgotICogZGV2aWNlX3NlbSBwcm90ZWN0cyBhY2Nlc3MgdG8gYm90aCBkZXZpY2VfbGlzdCBhbmQgY2xpZW50X2xpc3QuCisgKiBkZXZpY2VfbXV0ZXggcHJvdGVjdHMgYWNjZXNzIHRvIGJvdGggZGV2aWNlX2xpc3QgYW5kIGNsaWVudF9saXN0LgogICogVGhlcmUncyBubyByZWFsIHBvaW50IHRvIHVzaW5nIG11bHRpcGxlIGxvY2tzIG9yIHNvbWV0aGluZyBmYW5jaWVyCiAgKiBsaWtlIGFuIHJ3c2VtOiB3ZSBhbHdheXMgYWNjZXNzIGJvdGggbGlzdHMsIGFuZCB3ZSdyZSBhbHdheXMKICAqIG1vZGlmeWluZyBvbmUgbGlzdCBvciB0aGUgb3RoZXIgbGlzdC4gIEluIGFueSBjYXNlIHRoaXMgaXMgbm90IGEKICAqIGhvdCBwYXRoIHNvIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIG9wdGltaXplLgogICovCi1zdGF0aWMgREVDTEFSRV9NVVRFWChkZXZpY2Vfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoZGV2aWNlX211dGV4KTsKIAogc3RhdGljIGludCBpYl9kZXZpY2VfY2hlY2tfbWFuZGF0b3J5KHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSkKIHsKQEAgLTIyMSw3ICsyMjAsNyBAQAogewogCWludCByZXQ7CiAKLQlkb3duKCZkZXZpY2Vfc2VtKTsKKwltdXRleF9sb2NrKCZkZXZpY2VfbXV0ZXgpOwogCiAJaWYgKHN0cmNocihkZXZpY2UtPm5hbWUsICclJykpIHsKIAkJcmV0ID0gYWxsb2NfbmFtZShkZXZpY2UtPm5hbWUpOwpAQCAtMjU5LDcgKzI1OCw3IEBACiAJfQogCiAgb3V0OgotCXVwKCZkZXZpY2Vfc2VtKTsKKwltdXRleF91bmxvY2soJmRldmljZV9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woaWJfcmVnaXN0ZXJfZGV2aWNlKTsKQEAgLTI3Niw3ICsyNzUsNyBAQAogCXN0cnVjdCBpYl9jbGllbnRfZGF0YSAqY29udGV4dCwgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZG93bigmZGV2aWNlX3NlbSk7CisJbXV0ZXhfbG9jaygmZGV2aWNlX211dGV4KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShjbGllbnQsICZjbGllbnRfbGlzdCwgbGlzdCkKIAkJaWYgKGNsaWVudC0+cmVtb3ZlKQpAQCAtMjg0LDcgKzI4Myw3IEBACiAKIAlsaXN0X2RlbCgmZGV2aWNlLT5jb3JlX2xpc3QpOwogCi0JdXAoJmRldmljZV9zZW0pOworCW11dGV4X3VubG9jaygmZGV2aWNlX211dGV4KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPmNsaWVudF9kYXRhX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29udGV4dCwgdG1wLCAmZGV2aWNlLT5jbGllbnRfZGF0YV9saXN0LCBsaXN0KQpAQCAtMzEyLDE0ICszMTEsMTQgQEAKIHsKIAlzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2U7CiAKLQlkb3duKCZkZXZpY2Vfc2VtKTsKKwltdXRleF9sb2NrKCZkZXZpY2VfbXV0ZXgpOwogCiAJbGlzdF9hZGRfdGFpbCgmY2xpZW50LT5saXN0LCAmY2xpZW50X2xpc3QpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmZGV2aWNlX2xpc3QsIGNvcmVfbGlzdCkKIAkJaWYgKGNsaWVudC0+YWRkICYmICFhZGRfY2xpZW50X2NvbnRleHQoZGV2aWNlLCBjbGllbnQpKQogCQkJY2xpZW50LT5hZGQoZGV2aWNlKTsKIAotCXVwKCZkZXZpY2Vfc2VtKTsKKwltdXRleF91bmxvY2soJmRldmljZV9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMzOSw3ICszMzgsNyBAQAogCXN0cnVjdCBpYl9kZXZpY2UgKmRldmljZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZG93bigmZGV2aWNlX3NlbSk7CisJbXV0ZXhfbG9jaygmZGV2aWNlX211dGV4KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmZGV2aWNlX2xpc3QsIGNvcmVfbGlzdCkgewogCQlpZiAoY2xpZW50LT5yZW1vdmUpCkBAIC0zNTUsNyArMzU0LDcgQEAKIAl9CiAJbGlzdF9kZWwoJmNsaWVudC0+bGlzdCk7CiAKLQl1cCgmZGV2aWNlX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZpY2VfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChpYl91bnJlZ2lzdGVyX2NsaWVudCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCmluZGV4IDFmMTc0M2MuLjU5ODJkNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYwpAQCAtNDQ1LDEzICs0NDUsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qCi0JICogSXQgbWlnaHQgYmUgbmljZSB0byBwYXNzIHRoZSBub2RlIEdVSUQgd2l0aCB0aGUgZXZlbnQsIGJ1dAotCSAqIHJpZ2h0IG5vdyB0aGUgb25seSB3YXkgdG8gZ2V0IGl0IGlzIHRvIHF1ZXJ5IHRoZSBkZXZpY2UKLQkgKiBwcm92aWRlciwgYW5kIHRoaXMgY2FuIGNyYXNoIGR1cmluZyBkZXZpY2UgcmVtb3ZhbCBiZWNhdXNlCi0JICogd2UgYXJlIHdpbGwgYmUgcnVubmluZyBhZnRlciBkcml2ZXIgcmVtb3ZhbCBoYXMgc3RhcnRlZC4KLQkgKiBXZSBjb3VsZCBhZGQgYSBub2RlX2d1aWQgZmllbGQgdG8gc3RydWN0IGliX2RldmljZSwgb3Igd2UKLQkgKiBjb3VsZCBqdXN0IGxldCB1c2Vyc3BhY2UgcmVhZCB0aGUgbm9kZSBHVUlEIGZyb20gc3lzZnMgd2hlbgotCSAqIGRldmljZXMgYXJlIGFkZGVkLgorCSAqIEl0IHdvdWxkIGJlIG5pY2UgdG8gcGFzcyB0aGUgbm9kZSBHVUlEIHdpdGggdGhlIGV2ZW50Li4uCiAJICovCiAKIAllbnZwW2ldID0gTlVMTDsKQEAgLTYyMywyMSArNjE3LDE1IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X25vZGVfZ3VpZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGliX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCBpYl9kZXZpY2UsIGNsYXNzX2Rldik7Ci0Jc3RydWN0IGliX2RldmljZV9hdHRyIGF0dHI7Ci0Jc3NpemVfdCByZXQ7CiAKIAlpZiAoIWliZGV2X2lzX2FsaXZlKGRldikpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0ID0gaWJfcXVlcnlfZGV2aWNlKGRldiwgJmF0dHIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAlyZXR1cm4gc3ByaW50ZihidWYsICIlMDR4OiUwNHg6JTA0eDolMDR4XG4iLAotCQkgICAgICAgYmUxNl90b19jcHUoKChfX2JlMTYgKikgJmF0dHIubm9kZV9ndWlkKVswXSksCi0JCSAgICAgICBiZTE2X3RvX2NwdSgoKF9fYmUxNiAqKSAmYXR0ci5ub2RlX2d1aWQpWzFdKSwKLQkJICAgICAgIGJlMTZfdG9fY3B1KCgoX19iZTE2ICopICZhdHRyLm5vZGVfZ3VpZClbMl0pLAotCQkgICAgICAgYmUxNl90b19jcHUoKChfX2JlMTYgKikgJmF0dHIubm9kZV9ndWlkKVszXSkpOworCQkgICAgICAgYmUxNl90b19jcHUoKChfX2JlMTYgKikgJmRldi0+bm9kZV9ndWlkKVswXSksCisJCSAgICAgICBiZTE2X3RvX2NwdSgoKF9fYmUxNiAqKSAmZGV2LT5ub2RlX2d1aWQpWzFdKSwKKwkJICAgICAgIGJlMTZfdG9fY3B1KCgoX19iZTE2ICopICZkZXYtPm5vZGVfZ3VpZClbMl0pLAorCQkgICAgICAgYmUxNl90b19jcHUoKChfX2JlMTYgKikgJmRldi0+bm9kZV9ndWlkKVszXSkpOwogfQogCiBzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobm9kZV90eXBlLCBTX0lSVUdPLCBzaG93X25vZGVfdHlwZSwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCmluZGV4IDZlMTU3ODcuLmU5NWM0MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTExMyw3ICsxMTQsNyBAQAogCS5yZW1vdmUgPSBpYl91Y21fcmVtb3ZlX29uZQogfTsKIAotc3RhdGljIERFQ0xBUkVfTVVURVgoY3R4X2lkX211dGV4KTsKK3N0YXRpYyBERUZJTkVfTVVURVgoY3R4X2lkX211dGV4KTsKIHN0YXRpYyBERUZJTkVfSURSKGN0eF9pZF90YWJsZSk7CiBzdGF0aWMgREVDTEFSRV9CSVRNQVAoZGV2X21hcCwgSUJfVUNNX01BWF9ERVZJQ0VTKTsKIApAQCAtMTIxLDcgKzEyMiw3IEBACiB7CiAJc3RydWN0IGliX3VjbV9jb250ZXh0ICpjdHg7CiAKLQlkb3duKCZjdHhfaWRfbXV0ZXgpOworCW11dGV4X2xvY2soJmN0eF9pZF9tdXRleCk7CiAJY3R4ID0gaWRyX2ZpbmQoJmN0eF9pZF90YWJsZSwgaWQpOwogCWlmICghY3R4KQogCQljdHggPSBFUlJfUFRSKC1FTk9FTlQpOwpAQCAtMTI5LDcgKzEzMCw3IEBACiAJCWN0eCA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJZWxzZQogCQlhdG9taWNfaW5jKCZjdHgtPnJlZik7Ci0JdXAoJmN0eF9pZF9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjdHhfaWRfbXV0ZXgpOwogCiAJcmV0dXJuIGN0eDsKIH0KQEAgLTE4Niw5ICsxODcsOSBAQAogCQlpZiAoIXJlc3VsdCkKIAkJCWdvdG8gZXJyb3I7CiAKLQkJZG93bigmY3R4X2lkX211dGV4KTsKKwkJbXV0ZXhfbG9jaygmY3R4X2lkX211dGV4KTsKIAkJcmVzdWx0ID0gaWRyX2dldF9uZXcoJmN0eF9pZF90YWJsZSwgY3R4LCAmY3R4LT5pZCk7Ci0JCXVwKCZjdHhfaWRfbXV0ZXgpOworCQltdXRleF91bmxvY2soJmN0eF9pZF9tdXRleCk7CiAJfSB3aGlsZSAocmVzdWx0ID09IC1FQUdBSU4pOwogCiAJaWYgKHJlc3VsdCkKQEAgLTU1MCw5ICs1NTEsOSBAQAogZXJyMjoKIAlpYl9kZXN0cm95X2NtX2lkKGN0eC0+Y21faWQpOwogZXJyMToKLQlkb3duKCZjdHhfaWRfbXV0ZXgpOworCW11dGV4X2xvY2soJmN0eF9pZF9tdXRleCk7CiAJaWRyX3JlbW92ZSgmY3R4X2lkX3RhYmxlLCBjdHgtPmlkKTsKLQl1cCgmY3R4X2lkX211dGV4KTsKKwltdXRleF91bmxvY2soJmN0eF9pZF9tdXRleCk7CiAJa2ZyZWUoY3R4KTsKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtNTcyLDcgKzU3Myw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGluYnVmLCBzaXplb2YoY21kKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZG93bigmY3R4X2lkX211dGV4KTsKKwltdXRleF9sb2NrKCZjdHhfaWRfbXV0ZXgpOwogCWN0eCA9IGlkcl9maW5kKCZjdHhfaWRfdGFibGUsIGNtZC5pZCk7CiAJaWYgKCFjdHgpCiAJCWN0eCA9IEVSUl9QVFIoLUVOT0VOVCk7CkBAIC01ODAsNyArNTgxLDcgQEAKIAkJY3R4ID0gRVJSX1BUUigtRUlOVkFMKTsKIAllbHNlCiAJCWlkcl9yZW1vdmUoJmN0eF9pZF90YWJsZSwgY3R4LT5pZCk7Ci0JdXAoJmN0eF9pZF9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjdHhfaWRfbXV0ZXgpOwogCiAJaWYgKElTX0VSUihjdHgpKQogCQlyZXR1cm4gUFRSX0VSUihjdHgpOwpAQCAtMTI4MCw5ICsxMjgxLDkgQEAKIAkJCQkgc3RydWN0IGliX3VjbV9jb250ZXh0LCBmaWxlX2xpc3QpOwogCQl1cCgmZmlsZS0+bXV0ZXgpOwogCi0JCWRvd24oJmN0eF9pZF9tdXRleCk7CisJCW11dGV4X2xvY2soJmN0eF9pZF9tdXRleCk7CiAJCWlkcl9yZW1vdmUoJmN0eF9pZF90YWJsZSwgY3R4LT5pZCk7Ci0JCXVwKCZjdHhfaWRfbXV0ZXgpOworCQltdXRleF91bmxvY2soJmN0eF9pZF9tdXRleCk7CiAKIAkJaWJfZGVzdHJveV9jbV9pZChjdHgtPmNtX2lkKTsKIAkJaWJfdWNtX2NsZWFudXBfZXZlbnRzKGN0eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oCmluZGV4IDcxMTRlM2YuLmY3ZWVjYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oCkBAIC00MSw2ICs0MSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPHJkbWEvaWJfdmVyYnMuaD4KICNpbmNsdWRlIDxyZG1hL2liX3VzZXJfdmVyYnMuaD4KQEAgLTg4LDcgKzg5LDcgQEAKIAogc3RydWN0IGliX3V2ZXJic19maWxlIHsKIAlzdHJ1Y3Qga3JlZgkJCQlyZWY7Ci0Jc3RydWN0IHNlbWFwaG9yZQkJCW11dGV4OworCXN0cnVjdCBtdXRleAkJCQltdXRleDsKIAlzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZQkJICAgICAgICpkZXZpY2U7CiAJc3RydWN0IGliX3Vjb250ZXh0CQkgICAgICAgKnVjb250ZXh0OwogCXN0cnVjdCBpYl9ldmVudF9oYW5kbGVyCQkJZXZlbnRfaGFuZGxlcjsKQEAgLTEzMSw3ICsxMzIsNyBAQAogCXUzMgkJCWFzeW5jX2V2ZW50c19yZXBvcnRlZDsKIH07CiAKLWV4dGVybiBzdHJ1Y3Qgc2VtYXBob3JlIGliX3V2ZXJic19pZHJfbXV0ZXg7CitleHRlcm4gc3RydWN0IG11dGV4IGliX3V2ZXJic19pZHJfbXV0ZXg7CiBleHRlcm4gc3RydWN0IGlkciBpYl91dmVyYnNfcGRfaWRyOwogZXh0ZXJuIHN0cnVjdCBpZHIgaWJfdXZlcmJzX21yX2lkcjsKIGV4dGVybiBzdHJ1Y3QgaWRyIGliX3V2ZXJic19td19pZHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMKaW5kZXggYTAyYzVhMC4uNDA3YjYyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYwpAQCAtNjcsNyArNjcsNyBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWRvd24oJmZpbGUtPm11dGV4KTsKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAKIAlpZiAoZmlsZS0+dWNvbnRleHQpIHsKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTExOSw3ICsxMTksNyBAQAogCiAJZmRfaW5zdGFsbChyZXNwLmFzeW5jX2ZkLCBmaWxwKTsKIAotCXVwKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CiAKIAlyZXR1cm4gaW5fbGVuOwogCkBAIC0xMzEsNyArMTMxLDcgQEAKIAlpYmRldi0+ZGVhbGxvY191Y29udGV4dCh1Y29udGV4dCk7CiAKIGVycjoKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOwogCiAJcmVzcC5md192ZXIgCQkgICAgICAgPSBhdHRyLmZ3X3ZlcjsKLQlyZXNwLm5vZGVfZ3VpZCAJCSAgICAgICA9IGF0dHIubm9kZV9ndWlkOworCXJlc3Aubm9kZV9ndWlkIAkJICAgICAgID0gZmlsZS0+ZGV2aWNlLT5pYl9kZXYtPm5vZGVfZ3VpZDsKIAlyZXNwLnN5c19pbWFnZV9ndWlkIAkgICAgICAgPSBhdHRyLnN5c19pbWFnZV9ndWlkOwogCXJlc3AubWF4X21yX3NpemUgCSAgICAgICA9IGF0dHIubWF4X21yX3NpemU7CiAJcmVzcC5wYWdlX3NpemVfY2FwIAkgICAgICAgPSBhdHRyLnBhZ2Vfc2l6ZV9jYXA7CkBAIC0yOTAsNyArMjkwLDcgQEAKIAlwZC0+dW9iamVjdCA9IHVvYmo7CiAJYXRvbWljX3NldCgmcGQtPnVzZWNudCwgMCk7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogcmV0cnk6CiAJaWYgKCFpZHJfcHJlX2dldCgmaWJfdXZlcmJzX3BkX2lkciwgR0ZQX0tFUk5FTCkpIHsKQEAgLTMxNCwxMSArMzE0LDExIEBACiAJCWdvdG8gZXJyX2lkcjsKIAl9CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJnVvYmotPmxpc3QsICZmaWxlLT51Y29udGV4dC0+cGRfbGlzdCk7Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIGluX2xlbjsKIApAQCAtMzI2LDcgKzMyNiw3IEBACiAJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX3BkX2lkciwgdW9iai0+aWQpOwogCiBlcnJfdXA6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAJaWJfZGVhbGxvY19wZChwZCk7CiAKIGVycjoKQEAgLTM0Niw3ICszNDYsNyBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcGQgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3BkX2lkciwgY21kLnBkX2hhbmRsZSk7CiAJaWYgKCFwZCB8fCBwZC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKQEAgLTM2MCwxNCArMzYwLDE0IEBACiAKIAlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfcGRfaWRyLCBjbWQucGRfaGFuZGxlKTsKIAotCWRvd24oJmZpbGUtPm11dGV4KTsKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAJbGlzdF9kZWwoJnVvYmotPmxpc3QpOwotCXVwKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CiAKIAlrZnJlZSh1b2JqKTsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKIH0KQEAgLTQyNiw3ICs0MjYsNyBAQAogCiAJb2JqLT51bWVtLnZpcnRfYmFzZSA9IGNtZC5oY2FfdmE7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXBkID0gaWRyX2ZpbmQoJmliX3V2ZXJic19wZF9pZHIsIGNtZC5wZF9oYW5kbGUpOwogCWlmICghcGQgfHwgcGQtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpIHsKQEAgLTQ3NiwxMSArNDc2LDExIEBACiAJCWdvdG8gZXJyX2lkcjsKIAl9CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJm9iai0+dW9iamVjdC5saXN0LCAmZmlsZS0+dWNvbnRleHQtPm1yX2xpc3QpOwotCXVwKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CiAKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiBpbl9sZW47CiAKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCWF0b21pY19kZWMoJnBkLT51c2VjbnQpOwogCiBlcnJfdXA6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlpYl91bWVtX3JlbGVhc2UoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsICZvYmotPnVtZW0pOwogCkBAIC01MTMsNyArNTEzLDcgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCW1yID0gaWRyX2ZpbmQoJmliX3V2ZXJic19tcl9pZHIsIGNtZC5tcl9oYW5kbGUpOwogCWlmICghbXIgfHwgbXItPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCkBAIC01MjcsMTUgKzUyNywxNSBAQAogCiAJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX21yX2lkciwgY21kLm1yX2hhbmRsZSk7CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfZGVsKCZtZW1vYmotPnVvYmplY3QubGlzdCk7Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAogCWliX3VtZW1fcmVsZWFzZShmaWxlLT5kZXZpY2UtPmliX2RldiwgJm1lbW9iai0+dW1lbSk7CiAJa2ZyZWUobWVtb2JqKTsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKIH0KQEAgLTYyOCw3ICs2MjgsNyBAQAogCWNxLT5jcV9jb250ZXh0ICAgID0gZXZfZmlsZTsKIAlhdG9taWNfc2V0KCZjcS0+dXNlY250LCAwKTsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiByZXRyeToKIAlpZiAoIWlkcl9wcmVfZ2V0KCZpYl91dmVyYnNfY3FfaWRyLCBHRlBfS0VSTkVMKSkgewpAQCAtNjUzLDExICs2NTMsMTEgQEAKIAkJZ290byBlcnJfaWRyOwogCX0KIAotCWRvd24oJmZpbGUtPm11dGV4KTsKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmdW9iai0+dW9iamVjdC5saXN0LCAmZmlsZS0+dWNvbnRleHQtPmNxX2xpc3QpOwotCXVwKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CiAKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiBpbl9sZW47CiAKQEAgLTY2NSw3ICs2NjUsNyBAQAogCWlkcl9yZW1vdmUoJmliX3V2ZXJic19jcV9pZHIsIHVvYmotPnVvYmplY3QuaWQpOwogCiBlcnJfdXA6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAJaWJfZGVzdHJveV9jcShjcSk7CiAKIGVycjoKQEAgLTcwMSw3ICs3MDEsNyBAQAogCQlnb3RvIG91dF93YzsKIAl9CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAljcSA9IGlkcl9maW5kKCZpYl91dmVyYnNfY3FfaWRyLCBjbWQuY3FfaGFuZGxlKTsKIAlpZiAoIWNxIHx8IGNxLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KSB7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC03MzEsNyArNzMxLDcgQEAKIAkJcmV0ID0gLUVGQVVMVDsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCWtmcmVlKHJlc3ApOwogCiBvdXRfd2M6CkBAIC03NTAsMTQgKzc1MCwxNCBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCWNxID0gaWRyX2ZpbmQoJmliX3V2ZXJic19jcV9pZHIsIGNtZC5jcV9oYW5kbGUpOwogCWlmIChjcSAmJiBjcS0+dW9iamVjdC0+Y29udGV4dCA9PSBmaWxlLT51Y29udGV4dCkgewogCQlpYl9yZXFfbm90aWZ5X2NxKGNxLCBjbWQuc29saWNpdGVkX29ubHkgPwogCQkJCQlJQl9DUV9TT0xJQ0lURUQgOiBJQl9DUV9ORVhUX0NPTVApOwogCQlyZXQgPSBpbl9sZW47CiAJfQotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTc3OSw3ICs3NzksNyBAQAogCiAJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCWNxID0gaWRyX2ZpbmQoJmliX3V2ZXJic19jcV9pZHIsIGNtZC5jcV9oYW5kbGUpOwogCWlmICghY3EgfHwgY3EtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCkBAIC03OTUsOSArNzk1LDkgQEAKIAogCWlkcl9yZW1vdmUoJmliX3V2ZXJic19jcV9pZHIsIGNtZC5jcV9oYW5kbGUpOwogCi0JZG93bigmZmlsZS0+bXV0ZXgpOworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKIAlsaXN0X2RlbCgmdW9iai0+dW9iamVjdC5saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCiAJaWJfdXZlcmJzX3JlbGVhc2VfdWNxKGZpbGUsIGV2X2ZpbGUsIHVvYmopOwogCkBAIC04MTEsNyArODExLDcgQEAKIAkJcmV0ID0gLUVGQVVMVDsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKIH0KQEAgLTg0NSw3ICs4NDUsNyBAQAogCWlmICghdW9iaikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXBkICA9IGlkcl9maW5kKCZpYl91dmVyYnNfcGRfaWRyLCBjbWQucGRfaGFuZGxlKTsKIAlzY3EgPSBpZHJfZmluZCgmaWJfdXZlcmJzX2NxX2lkciwgY21kLnNlbmRfY3FfaGFuZGxlKTsKQEAgLTkzMCwxMSArOTMwLDExIEBACiAJCWdvdG8gZXJyX2lkcjsKIAl9CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJnVvYmotPnVldmVudC51b2JqZWN0Lmxpc3QsICZmaWxlLT51Y29udGV4dC0+cXBfbGlzdCk7Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIGluX2xlbjsKIApAQCAtOTUwLDcgKzk1MCw3IEBACiAJCWF0b21pY19kZWMoJmF0dHIuc3JxLT51c2VjbnQpOwogCiBlcnJfdXA6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlrZnJlZSh1b2JqKTsKIAlyZXR1cm4gcmV0OwpAQCAtOTcyLDcgKzk3Miw3IEBACiAJaWYgKCFhdHRyKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CiAJaWYgKCFxcCB8fCBxcC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkgewpAQCAtMTAzMyw3ICsxMDMzLDcgQEAKIAlyZXQgPSBpbl9sZW47CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAlrZnJlZShhdHRyKTsKIAogCXJldHVybiByZXQ7CkBAIC0xMDU0LDcgKzEwNTQsNyBAQAogCiAJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXFwID0gaWRyX2ZpbmQoJmliX3V2ZXJic19xcF9pZHIsIGNtZC5xcF9oYW5kbGUpOwogCWlmICghcXAgfHwgcXAtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCkBAIC0xMDczLDkgKzEwNzMsOSBAQAogCiAJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfZGVsKCZ1b2JqLT51ZXZlbnQudW9iamVjdC5saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCiAJaWJfdXZlcmJzX3JlbGVhc2VfdWV2ZW50KGZpbGUsICZ1b2JqLT51ZXZlbnQpOwogCkBAIC0xMDg4LDcgKzEwODgsNyBAQAogCQlyZXQgPSAtRUZBVUxUOwogCiBvdXQ6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOwogfQpAQCAtMTExOSw3ICsxMTE5LDcgQEAKIAlpZiAoIXVzZXJfd3IpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlxcCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcXBfaWRyLCBjbWQucXBfaGFuZGxlKTsKIAlpZiAoIXFwIHx8IHFwLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQpAQCAtMTIyNCw3ICsxMjI0LDcgQEAKIAkJcmV0ID0gLUVGQVVMVDsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJd2hpbGUgKHdyKSB7CiAJCW5leHQgPSB3ci0+bmV4dDsKQEAgLTEzNDEsNyArMTM0MSw3IEBACiAJaWYgKElTX0VSUih3cikpCiAJCXJldHVybiBQVFJfRVJSKHdyKTsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CiAJaWYgKCFxcCB8fCBxcC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKQEAgLTEzNjIsNyArMTM2Miw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXdoaWxlICh3cikgewogCQluZXh0ID0gd3ItPm5leHQ7CkBAIC0xMzkyLDcgKzEzOTIsNyBAQAogCWlmIChJU19FUlIod3IpKQogCQlyZXR1cm4gUFRSX0VSUih3cik7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXNycSA9IGlkcl9maW5kKCZpYl91dmVyYnNfc3JxX2lkciwgY21kLnNycV9oYW5kbGUpOwogCWlmICghc3JxIHx8IHNycS0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKQEAgLTE0MTMsNyArMTQxMyw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXdoaWxlICh3cikgewogCQluZXh0ID0gd3ItPm5leHQ7CkBAIC0xNDQ2LDcgKzE0NDYsNyBAQAogCWlmICghdW9iaikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXBkID0gaWRyX2ZpbmQoJmliX3V2ZXJic19wZF9pZHIsIGNtZC5wZF9oYW5kbGUpOwogCWlmICghcGQgfHwgcGQtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpIHsKQEAgLTE0OTgsMTEgKzE0OTgsMTEgQEAKIAkJZ290byBlcnJfaWRyOwogCX0KIAotCWRvd24oJmZpbGUtPm11dGV4KTsKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmdW9iai0+bGlzdCwgJmZpbGUtPnVjb250ZXh0LT5haF9saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCi0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gaW5fbGVuOwogCkBAIC0xNTEzLDcgKzE1MTMsNyBAQAogCWliX2Rlc3Ryb3lfYWgoYWgpOwogCiBlcnJfdXA6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlrZnJlZSh1b2JqKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTUzMCw3ICsxNTMwLDcgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCWFoID0gaWRyX2ZpbmQoJmliX3V2ZXJic19haF9pZHIsIGNtZC5haF9oYW5kbGUpOwogCWlmICghYWggfHwgYWgtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCkBAIC0xNTQ0LDE0ICsxNTQ0LDE0IEBACiAKIAlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfYWhfaWRyLCBjbWQuYWhfaGFuZGxlKTsKIAotCWRvd24oJmZpbGUtPm11dGV4KTsKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAJbGlzdF9kZWwoJnVvYmotPmxpc3QpOwotCXVwKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CiAKIAlrZnJlZSh1b2JqKTsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKIH0KQEAgLTE1NjksNyArMTU2OSw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlxcCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcXBfaWRyLCBjbWQucXBfaGFuZGxlKTsKIAlpZiAoIXFwIHx8IHFwLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQpAQCAtMTYwMiw3ICsxNjAyLDcgQEAKIAkJa2ZyZWUobWNhc3QpOwogCiBvdXQ6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOwogfQpAQCAtMTYyMCw3ICsxNjIwLDcgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXFwID0gaWRyX2ZpbmQoJmliX3V2ZXJic19xcF9pZHIsIGNtZC5xcF9oYW5kbGUpOwogCWlmICghcXAgfHwgcXAtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCkBAIC0xNjQxLDcgKzE2NDEsNyBAQAogCQl9CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47CiB9CkBAIC0xNjczLDcgKzE2NzMsNyBAQAogCWlmICghdW9iaikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXBkICA9IGlkcl9maW5kKCZpYl91dmVyYnNfcGRfaWRyLCBjbWQucGRfaGFuZGxlKTsKIApAQCAtMTczMCwxMSArMTczMCwxMSBAQAogCQlnb3RvIGVycl9pZHI7CiAJfQogCi0JZG93bigmZmlsZS0+bXV0ZXgpOworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKIAlsaXN0X2FkZF90YWlsKCZ1b2JqLT51b2JqZWN0Lmxpc3QsICZmaWxlLT51Y29udGV4dC0+c3JxX2xpc3QpOwotCXVwKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CiAKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiBpbl9sZW47CiAKQEAgLTE3NDYsNyArMTc0Niw3IEBACiAJYXRvbWljX2RlYygmcGQtPnVzZWNudCk7CiAKIGVycl91cDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCWtmcmVlKHVvYmopOwogCXJldHVybiByZXQ7CkBAIC0xNzY0LDcgKzE3NjQsNyBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJc3JxID0gaWRyX2ZpbmQoJmliX3V2ZXJic19zcnFfaWRyLCBjbWQuc3JxX2hhbmRsZSk7CiAJaWYgKCFzcnEgfHwgc3JxLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KSB7CkBAIC0xNzc4LDcgKzE3NzgsNyBAQAogCXJldCA9IGliX21vZGlmeV9zcnEoc3JxLCAmYXR0ciwgY21kLmF0dHJfbWFzayk7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47CiB9CkBAIC0xNzk2LDcgKzE3OTYsNyBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CiAKQEAgLTE4MTIsOSArMTgxMiw5IEBACiAKIAlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfc3JxX2lkciwgY21kLnNycV9oYW5kbGUpOwogCi0JZG93bigmZmlsZS0+bXV0ZXgpOworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKIAlsaXN0X2RlbCgmdW9iai0+dW9iamVjdC5saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCiAJaWJfdXZlcmJzX3JlbGVhc2VfdWV2ZW50KGZpbGUsIHVvYmopOwogCkBAIC0xODI3LDcgKzE4MjcsNyBAQAogCQlyZXQgPSAtRUZBVUxUOwogCiBvdXQ6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKaW5kZXggODE3MzdiZC4uOTZlYTc5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCkBAIC02Niw3ICs2Niw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKnV2ZXJic19jbGFzczsKIAotREVDTEFSRV9NVVRFWChpYl91dmVyYnNfaWRyX211dGV4KTsKK0RFRklORV9NVVRFWChpYl91dmVyYnNfaWRyX211dGV4KTsKIERFRklORV9JRFIoaWJfdXZlcmJzX3BkX2lkcik7CiBERUZJTkVfSURSKGliX3V2ZXJic19tcl9pZHIpOwogREVGSU5FX0lEUihpYl91dmVyYnNfbXdfaWRyKTsKQEAgLTE4MCw3ICsxODAsNyBAQAogCWlmICghY29udGV4dCkKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1b2JqLCB0bXAsICZjb250ZXh0LT5haF9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBpYl9haCAqYWggPSBpZHJfZmluZCgmaWJfdXZlcmJzX2FoX2lkciwgdW9iai0+aWQpOwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJCWtmcmVlKHVvYmopOwogCX0KIAotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIGNvbnRleHQtPmRldmljZS0+ZGVhbGxvY191Y29udGV4dChjb250ZXh0KTsKIH0KQEAgLTY1Myw3ICs2NTMsNyBAQAogCWZpbGUtPnVjb250ZXh0CSA9IE5VTEw7CiAJZmlsZS0+YXN5bmNfZmlsZSA9IE5VTEw7CiAJa3JlZl9pbml0KCZmaWxlLT5yZWYpOwotCWluaXRfTVVURVgoJmZpbGUtPm11dGV4KTsKKwltdXRleF9pbml0KCZmaWxlLT5tdXRleCk7CiAKIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBmaWxlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9hdi5jCmluZGV4IDIyZmRjNDQuLmExNGVlZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9hdi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9hdi5jCkBAIC0xNjMsNiArMTYzLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBtdGhjYV9haF9ncmhfcHJlc2VudChzdHJ1Y3QgbXRoY2FfYWggKmFoKQoreworCXJldHVybiAhIShhaC0+YXYtPmdfc2xpZCAmIDB4ODApOworfQorCiBpbnQgbXRoY2FfcmVhZF9haChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9haCAqYWgsCiAJCSAgc3RydWN0IGliX3VkX2hlYWRlciAqaGVhZGVyKQogewpAQCAtMTcyLDggKzE3Nyw3IEBACiAJaGVhZGVyLT5scmguc2VydmljZV9sZXZlbCAgID0gYmUzMl90b19jcHUoYWgtPmF2LT5zbF90Y2xhc3NfZmxvd2xhYmVsKSA+PiAyODsKIAloZWFkZXItPmxyaC5kZXN0aW5hdGlvbl9saWQgPSBhaC0+YXYtPmRsaWQ7CiAJaGVhZGVyLT5scmguc291cmNlX2xpZCAgICAgID0gY3B1X3RvX2JlMTYoYWgtPmF2LT5nX3NsaWQgJiAweDdmKTsKLQlpZiAoYWgtPmF2LT5nX3NsaWQgJiAweDgwKSB7Ci0JCWhlYWRlci0+Z3JoX3ByZXNlbnQgPSAxOworCWlmIChtdGhjYV9haF9ncmhfcHJlc2VudChhaCkpIHsKIAkJaGVhZGVyLT5ncmgudHJhZmZpY19jbGFzcyA9CiAJCQkoYmUzMl90b19jcHUoYWgtPmF2LT5zbF90Y2xhc3NfZmxvd2xhYmVsKSA+PiAyMCkgJiAweGZmOwogCQloZWFkZXItPmdyaC5mbG93X2xhYmVsICAgID0KQEAgLTE4NCw4ICsxODgsNiBAQAogCQkJCSAgJmhlYWRlci0+Z3JoLnNvdXJjZV9naWQpOwogCQltZW1jcHkoaGVhZGVyLT5ncmguZGVzdGluYXRpb25fZ2lkLnJhdywKIAkJICAgICAgIGFoLT5hdi0+ZGdpZCwgMTYpOwotCX0gZWxzZSB7Ci0JCWhlYWRlci0+Z3JoX3ByZXNlbnQgPSAwOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jCmluZGV4IDIyYWM3MmIuLmJlMTc5MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMKQEAgLTYwNiw3ICs2MDYsNyBAQAogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBtdGhjYV9pY21fc2l6ZSgmaXRlcikgLyAoMSA8PCBsZyk7ICsraSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbXRoY2FfaWNtX3NpemUoJml0ZXIpID4+IGxnOyArK2kpIHsKIAkJCWlmICh2aXJ0ICE9IC0xKSB7CiAJCQkJcGFnZXNbbmVudCAqIDJdID0gY3B1X3RvX2JlNjQodmlydCk7CiAJCQkJdmlydCArPSAxIDw8IGxnOwpAQCAtNzI3LDggKzcyNyw4IEBACiAJCSAqIHN5c3RlbSBwYWdlcyBuZWVkZWQuCiAJCSAqLwogCQlkZXYtPmZ3LmFyYmVsLmZ3X3BhZ2VzID0KLQkJCShkZXYtPmZ3LmFyYmVsLmZ3X3BhZ2VzICsgKDEgPDwgKFBBR0VfU0hJRlQgLSAxMikpIC0gMSkgPj4KLQkJCShQQUdFX1NISUZUIC0gMTIpOworCQkJQUxJR04oZGV2LT5mdy5hcmJlbC5md19wYWdlcywgUEFHRV9TSVpFID4+IDEyKSA+PgorCQkJCShQQUdFX1NISUZUIC0gMTIpOwogCiAJCW10aGNhX2RiZyhkZXYsICJDbGVhciBpbnQgQCAlbGx4LCBFUSBhcm0gQCAlbGx4LCBFUSBzZXQgQ0kgQCAlbGx4XG4iLAogCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBkZXYtPmZ3LmFyYmVsLmNscl9pbnRfYmFzZSwKQEAgLTE0NDUsNiArMTQ0NSw3IEBACiAJICogcGFnZXMgbmVlZGVkLgogCSAqLwogCSphdXhfcGFnZXMgPSAoKmF1eF9wYWdlcyArICgxIDw8IChQQUdFX1NISUZUIC0gMTIpKSAtIDEpID4+IChQQUdFX1NISUZUIC0gMTIpOworCSphdXhfcGFnZXMgPSBBTElHTigqYXV4X3BhZ2VzLCBQQUdFX1NJWkUgPj4gMTIpID4+IChQQUdFX1NISUZUIC0gMTIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZGV2LmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZGV2LmgKaW5kZXggNzk1YjM3OS4uYTEwNGFiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2Rldi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9kZXYuaApAQCAtNTIwLDYgKzUyMCw3IEBACiBpbnQgbXRoY2FfZGVzdHJveV9haChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9haCAqYWgpOwogaW50IG10aGNhX3JlYWRfYWgoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfYWggKmFoLAogCQkgIHN0cnVjdCBpYl91ZF9oZWFkZXIgKmhlYWRlcik7CitpbnQgbXRoY2FfYWhfZ3JoX3ByZXNlbnQoc3RydWN0IG10aGNhX2FoICphaCk7CiAKIGludCBtdGhjYV9tdWx0aWNhc3RfYXR0YWNoKHN0cnVjdCBpYl9xcCAqaWJxcCwgdW5pb24gaWJfZ2lkICpnaWQsIHUxNiBsaWQpOwogaW50IG10aGNhX211bHRpY2FzdF9kZXRhY2goc3RydWN0IGliX3FwICppYnFwLCB1bmlvbiBpYl9naWQgKmdpZCwgdTE2IGxpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9lcS5jCmluZGV4IGU4YTk0OGYuLjJlYWJiMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9lcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9lcS5jCkBAIC00NSw2ICs0NSw3IEBACiBlbnVtIHsKIAlNVEhDQV9OVU1fQVNZTkNfRVFFID0gMHg4MCwKIAlNVEhDQV9OVU1fQ01EX0VRRSAgID0gMHg4MCwKKwlNVEhDQV9OVU1fU1BBUkVfRVFFID0gMHg4MCwKIAlNVEhDQV9FUV9FTlRSWV9TSVpFID0gMHgyMAogfTsKIApAQCAtMjc3LDExICsyNzgsMTAgQEAKIHsKIAlzdHJ1Y3QgbXRoY2FfZXFlICplcWU7CiAJaW50IGRpc2FybV9jcW47Ci0JaW50ICBlcWVzX2ZvdW5kID0gMDsKKwlpbnQgZXFlc19mb3VuZCA9IDA7CisJaW50IHNldF9jaSA9IDA7CiAKIAl3aGlsZSAoKGVxZSA9IG5leHRfZXFlX3N3KGVxKSkpIHsKLQkJaW50IHNldF9jaSA9IDA7Ci0KIAkJLyoKIAkJICogTWFrZSBzdXJlIHdlIHJlYWQgRVEgZW50cnkgY29udGVudHMgYWZ0ZXIgd2UndmUKIAkJICogY2hlY2tlZCB0aGUgb3duZXJzaGlwIGJpdC4KQEAgLTM0NSwxMiArMzQ1LDYgQEAKIAkJCQkJYmUxNl90b19jcHUoZXFlLT5ldmVudC5jbWQudG9rZW4pLAogCQkJCQllcWUtPmV2ZW50LmNtZC5zdGF0dXMsCiAJCQkJCWJlNjRfdG9fY3B1KGVxZS0+ZXZlbnQuY21kLm91dF9wYXJhbSkpOwotCQkJLyoKLQkJCSAqIGNtZF9ldmVudCgpIG1heSBhZGQgbW9yZSBjb21tYW5kcy4KLQkJCSAqIFRoZSBjYXJkIHdpbGwgdGhpbmsgdGhlIHF1ZXVlIGhhcyBvdmVyZmxvd2VkIGlmCi0JCQkgKiB3ZSBkb24ndCB0ZWxsIGl0IHdlJ3ZlIGJlZW4gcHJvY2Vzc2luZyBldmVudHMuCi0JCQkgKi8KLQkJCXNldF9jaSA9IDE7CiAJCQlicmVhazsKIAogCQljYXNlIE1USENBX0VWRU5UX1RZUEVfUE9SVF9DSEFOR0U6CkBAIC0zODUsOCArMzc5LDE2IEBACiAJCXNldF9lcWVfaHcoZXFlKTsKIAkJKytlcS0+Y29uc19pbmRleDsKIAkJZXFlc19mb3VuZCA9IDE7CisJCSsrc2V0X2NpOwogCi0JCWlmICh1bmxpa2VseShzZXRfY2kpKSB7CisJCS8qCisJCSAqIFRoZSBIQ0Egd2lsbCB0aGluayB0aGUgcXVldWUgaGFzIG92ZXJmbG93ZWQgaWYgd2UKKwkJICogZG9uJ3QgdGVsbCBpdCB3ZSd2ZSBiZWVuIHByb2Nlc3NpbmcgZXZlbnRzLiAgV2UKKwkJICogY3JlYXRlIG91ciBFUXMgd2l0aCBNVEhDQV9OVU1fU1BBUkVfRVFFIGV4dHJhCisJCSAqIGVudHJpZXMsIHNvIHdlIG11c3QgdXBkYXRlIG91ciBjb25zdW1lciBpbmRleCBhdAorCQkgKiBsZWFzdCB0aGF0IG9mdGVuLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHNldF9jaSA+PSBNVEhDQV9OVU1fU1BBUkVfRVFFKSkgewogCQkJLyoKIAkJCSAqIENvbmRpdGlvbmFsIG9uIGhjYV90eXBlIGlzIE9LIGhlcmUgYmVjYXVzZQogCQkJICogdGhpcyBpcyBhIHJhcmUgY2FzZSwgbm90IHRoZSBmYXN0IHBhdGguCkBAIC04NjIsMTkgKzg2NCwxOSBAQAogCWludHIgPSAoZGV2LT5tdGhjYV9mbGFncyAmIE1USENBX0ZMQUdfTVNJKSA/CiAJCTEyOCA6IGRldi0+ZXFfdGFibGUuaW50YV9waW47CiAKLQllcnIgPSBtdGhjYV9jcmVhdGVfZXEoZGV2LCBkZXYtPmxpbWl0cy5udW1fY3FzLAorCWVyciA9IG10aGNhX2NyZWF0ZV9lcShkZXYsIGRldi0+bGltaXRzLm51bV9jcXMgKyBNVEhDQV9OVU1fU1BBUkVfRVFFLAogCQkJICAgICAgKGRldi0+bXRoY2FfZmxhZ3MgJiBNVEhDQV9GTEFHX01TSV9YKSA/IDEyOCA6IGludHIsCiAJCQkgICAgICAmZGV2LT5lcV90YWJsZS5lcVtNVEhDQV9FUV9DT01QXSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfb3V0X3VubWFwOwogCi0JZXJyID0gbXRoY2FfY3JlYXRlX2VxKGRldiwgTVRIQ0FfTlVNX0FTWU5DX0VRRSwKKwllcnIgPSBtdGhjYV9jcmVhdGVfZXEoZGV2LCBNVEhDQV9OVU1fQVNZTkNfRVFFICsgTVRIQ0FfTlVNX1NQQVJFX0VRRSwKIAkJCSAgICAgIChkZXYtPm10aGNhX2ZsYWdzICYgTVRIQ0FfRkxBR19NU0lfWCkgPyAxMjkgOiBpbnRyLAogCQkJICAgICAgJmRldi0+ZXFfdGFibGUuZXFbTVRIQ0FfRVFfQVNZTkNdKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9vdXRfY29tcDsKIAotCWVyciA9IG10aGNhX2NyZWF0ZV9lcShkZXYsIE1USENBX05VTV9DTURfRVFFLAorCWVyciA9IG10aGNhX2NyZWF0ZV9lcShkZXYsIE1USENBX05VTV9DTURfRVFFICsgTVRIQ0FfTlVNX1NQQVJFX0VRRSwKIAkJCSAgICAgIChkZXYtPm10aGNhX2ZsYWdzICYgTVRIQ0FfRkxBR19NU0lfWCkgPyAxMzAgOiBpbnRyLAogCQkJICAgICAgJmRldi0+ZXFfdGFibGUuZXFbTVRIQ0FfRVFfQ01EXSk7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKaW5kZXggNGNjN2UyOC4uNDg0YTdlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKQEAgLTMzLDcgKzMzLDcgQEAKICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKICAqIFNPRlRXQVJFLgogICoKLSAqICRJZDogbXRoY2FfcHJvdmlkZXIuYyAxMzk3IDIwMDQtMTItMjggMDU6MDk6MDBaIHJvbGFuZCAkCisgKiAkSWQ6IG10aGNhX3Byb3ZpZGVyLmMgNDg1OSAyMDA2LTAxLTA5IDIxOjU1OjEwWiByb2xhbmQgJAogICovCiAKICNpbmNsdWRlIDxyZG1hL2liX3NtaS5oPgpAQCAtNDUsNiArNDUsMTQgQEAKICNpbmNsdWRlICJtdGhjYV91c2VyLmgiCiAjaW5jbHVkZSAibXRoY2FfbWVtZnJlZS5oIgogCitzdGF0aWMgdm9pZCBpbml0X3F1ZXJ5X21hZChzdHJ1Y3QgaWJfc21wICptYWQpCit7CisJbWFkLT5iYXNlX3ZlcnNpb24gID0gMTsKKwltYWQtPm1nbXRfY2xhc3MgICAgPSBJQl9NR01UX0NMQVNTX1NVQk5fTElEX1JPVVRFRDsKKwltYWQtPmNsYXNzX3ZlcnNpb24gPSAxOworCW1hZC0+bWV0aG9kICAgIAkgICA9IElCX01HTVRfTUVUSE9EX0dFVDsKK30KKwogc3RhdGljIGludCBtdGhjYV9xdWVyeV9kZXZpY2Uoc3RydWN0IGliX2RldmljZSAqaWJkZXYsCiAJCQkgICAgICBzdHJ1Y3QgaWJfZGV2aWNlX2F0dHIgKnByb3BzKQogewpAQCAtNTUsNyArNjMsNyBAQAogCiAJdTggc3RhdHVzOwogCi0JaW5fbWFkICA9IGttYWxsb2Moc2l6ZW9mICppbl9tYWQsIEdGUF9LRVJORUwpOworCWluX21hZCAgPSBremFsbG9jKHNpemVvZiAqaW5fbWFkLCBHRlBfS0VSTkVMKTsKIAlvdXRfbWFkID0ga21hbGxvYyhzaXplb2YgKm91dF9tYWQsIEdGUF9LRVJORUwpOwogCWlmICghaW5fbWFkIHx8ICFvdXRfbWFkKQogCQlnb3RvIG91dDsKQEAgLTY0LDEyICs3Miw4IEBACiAKIAlwcm9wcy0+ZndfdmVyICAgICAgICAgICAgICA9IG1kZXYtPmZ3X3ZlcjsKIAotCW1lbXNldChpbl9tYWQsIDAsIHNpemVvZiAqaW5fbWFkKTsKLQlpbl9tYWQtPmJhc2VfdmVyc2lvbiAgICAgICA9IDE7Ci0JaW5fbWFkLT5tZ210X2NsYXNzICAgICAJICAgPSBJQl9NR01UX0NMQVNTX1NVQk5fTElEX1JPVVRFRDsKLQlpbl9tYWQtPmNsYXNzX3ZlcnNpb24gIAkgICA9IDE7Ci0JaW5fbWFkLT5tZXRob2QgICAgICAgICAJICAgPSBJQl9NR01UX01FVEhPRF9HRVQ7Ci0JaW5fbWFkLT5hdHRyX2lkICAgCSAgID0gSUJfU01QX0FUVFJfTk9ERV9JTkZPOworCWluaXRfcXVlcnlfbWFkKGluX21hZCk7CisJaW5fbWFkLT5hdHRyX2lkID0gSUJfU01QX0FUVFJfTk9ERV9JTkZPOwogCiAJZXJyID0gbXRoY2FfTUFEX0lGQyhtZGV2LCAxLCAxLAogCQkJICAgIDEsIE5VTEwsIE5VTEwsIGluX21hZCwgb3V0X21hZCwKQEAgLTg3LDcgKzkxLDYgQEAKIAlwcm9wcy0+dmVuZG9yX3BhcnRfaWQgICAgICA9IGJlMTZfdG9fY3B1cCgoX19iZTE2ICopIChvdXRfbWFkLT5kYXRhICsgMzApKTsKIAlwcm9wcy0+aHdfdmVyICAgICAgICAgICAgICA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopIChvdXRfbWFkLT5kYXRhICsgMzIpKTsKIAltZW1jcHkoJnByb3BzLT5zeXNfaW1hZ2VfZ3VpZCwgb3V0X21hZC0+ZGF0YSArICA0LCA4KTsKLQltZW1jcHkoJnByb3BzLT5ub2RlX2d1aWQsICAgICAgb3V0X21hZC0+ZGF0YSArIDEyLCA4KTsKIAogCXByb3BzLT5tYXhfbXJfc2l6ZSAgICAgICAgID0gfjB1bGw7CiAJcHJvcHMtPnBhZ2Vfc2l6ZV9jYXAgICAgICAgPSBtZGV2LT5saW1pdHMucGFnZV9zaXplX2NhcDsKQEAgLTEyOCwyMCArMTMxLDE2IEBACiAJaW50IGVyciA9IC1FTk9NRU07CiAJdTggc3RhdHVzOwogCi0JaW5fbWFkICA9IGttYWxsb2Moc2l6ZW9mICppbl9tYWQsIEdGUF9LRVJORUwpOworCWluX21hZCAgPSBremFsbG9jKHNpemVvZiAqaW5fbWFkLCBHRlBfS0VSTkVMKTsKIAlvdXRfbWFkID0ga21hbGxvYyhzaXplb2YgKm91dF9tYWQsIEdGUF9LRVJORUwpOwogCWlmICghaW5fbWFkIHx8ICFvdXRfbWFkKQogCQlnb3RvIG91dDsKIAogCW1lbXNldChwcm9wcywgMCwgc2l6ZW9mICpwcm9wcyk7CiAKLQltZW1zZXQoaW5fbWFkLCAwLCBzaXplb2YgKmluX21hZCk7Ci0JaW5fbWFkLT5iYXNlX3ZlcnNpb24gICAgICAgPSAxOwotCWluX21hZC0+bWdtdF9jbGFzcyAgICAgCSAgID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQ7Ci0JaW5fbWFkLT5jbGFzc192ZXJzaW9uICAJICAgPSAxOwotCWluX21hZC0+bWV0aG9kICAgICAgICAgCSAgID0gSUJfTUdNVF9NRVRIT0RfR0VUOwotCWluX21hZC0+YXR0cl9pZCAgIAkgICA9IElCX1NNUF9BVFRSX1BPUlRfSU5GTzsKLQlpbl9tYWQtPmF0dHJfbW9kICAgICAgICAgICA9IGNwdV90b19iZTMyKHBvcnQpOworCWluaXRfcXVlcnlfbWFkKGluX21hZCk7CisJaW5fbWFkLT5hdHRyX2lkICA9IElCX1NNUF9BVFRSX1BPUlRfSU5GTzsKKwlpbl9tYWQtPmF0dHJfbW9kID0gY3B1X3RvX2JlMzIocG9ydCk7CiAKIAllcnIgPSBtdGhjYV9NQURfSUZDKHRvX21kZXYoaWJkZXYpLCAxLCAxLAogCQkJICAgIHBvcnQsIE5VTEwsIE5VTEwsIGluX21hZCwgb3V0X21hZCwKQEAgLTIyMCwxOCArMjE5LDE0IEBACiAJaW50IGVyciA9IC1FTk9NRU07CiAJdTggc3RhdHVzOwogCi0JaW5fbWFkICA9IGttYWxsb2Moc2l6ZW9mICppbl9tYWQsIEdGUF9LRVJORUwpOworCWluX21hZCAgPSBremFsbG9jKHNpemVvZiAqaW5fbWFkLCBHRlBfS0VSTkVMKTsKIAlvdXRfbWFkID0ga21hbGxvYyhzaXplb2YgKm91dF9tYWQsIEdGUF9LRVJORUwpOwogCWlmICghaW5fbWFkIHx8ICFvdXRfbWFkKQogCQlnb3RvIG91dDsKIAotCW1lbXNldChpbl9tYWQsIDAsIHNpemVvZiAqaW5fbWFkKTsKLQlpbl9tYWQtPmJhc2VfdmVyc2lvbiAgICAgICA9IDE7Ci0JaW5fbWFkLT5tZ210X2NsYXNzICAgICAJICAgPSBJQl9NR01UX0NMQVNTX1NVQk5fTElEX1JPVVRFRDsKLQlpbl9tYWQtPmNsYXNzX3ZlcnNpb24gIAkgICA9IDE7Ci0JaW5fbWFkLT5tZXRob2QgICAgICAgICAJICAgPSBJQl9NR01UX01FVEhPRF9HRVQ7Ci0JaW5fbWFkLT5hdHRyX2lkICAgCSAgID0gSUJfU01QX0FUVFJfUEtFWV9UQUJMRTsKLQlpbl9tYWQtPmF0dHJfbW9kICAgICAgICAgICA9IGNwdV90b19iZTMyKGluZGV4IC8gMzIpOworCWluaXRfcXVlcnlfbWFkKGluX21hZCk7CisJaW5fbWFkLT5hdHRyX2lkICA9IElCX1NNUF9BVFRSX1BLRVlfVEFCTEU7CisJaW5fbWFkLT5hdHRyX21vZCA9IGNwdV90b19iZTMyKGluZGV4IC8gMzIpOwogCiAJZXJyID0gbXRoY2FfTUFEX0lGQyh0b19tZGV2KGliZGV2KSwgMSwgMSwKIAkJCSAgICBwb3J0LCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQsCkBAIC0yNTksMTggKzI1NCwxNCBAQAogCWludCBlcnIgPSAtRU5PTUVNOwogCXU4IHN0YXR1czsKIAotCWluX21hZCAgPSBrbWFsbG9jKHNpemVvZiAqaW5fbWFkLCBHRlBfS0VSTkVMKTsKKwlpbl9tYWQgID0ga3phbGxvYyhzaXplb2YgKmluX21hZCwgR0ZQX0tFUk5FTCk7CiAJb3V0X21hZCA9IGttYWxsb2Moc2l6ZW9mICpvdXRfbWFkLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluX21hZCB8fCAhb3V0X21hZCkKIAkJZ290byBvdXQ7CiAKLQltZW1zZXQoaW5fbWFkLCAwLCBzaXplb2YgKmluX21hZCk7Ci0JaW5fbWFkLT5iYXNlX3ZlcnNpb24gICAgICAgPSAxOwotCWluX21hZC0+bWdtdF9jbGFzcyAgICAgCSAgID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQ7Ci0JaW5fbWFkLT5jbGFzc192ZXJzaW9uICAJICAgPSAxOwotCWluX21hZC0+bWV0aG9kICAgICAgICAgCSAgID0gSUJfTUdNVF9NRVRIT0RfR0VUOwotCWluX21hZC0+YXR0cl9pZCAgIAkgICA9IElCX1NNUF9BVFRSX1BPUlRfSU5GTzsKLQlpbl9tYWQtPmF0dHJfbW9kICAgICAgICAgICA9IGNwdV90b19iZTMyKHBvcnQpOworCWluaXRfcXVlcnlfbWFkKGluX21hZCk7CisJaW5fbWFkLT5hdHRyX2lkICA9IElCX1NNUF9BVFRSX1BPUlRfSU5GTzsKKwlpbl9tYWQtPmF0dHJfbW9kID0gY3B1X3RvX2JlMzIocG9ydCk7CiAKIAllcnIgPSBtdGhjYV9NQURfSUZDKHRvX21kZXYoaWJkZXYpLCAxLCAxLAogCQkJICAgIHBvcnQsIE5VTEwsIE5VTEwsIGluX21hZCwgb3V0X21hZCwKQEAgLTI4NCwxMyArMjc1LDkgQEAKIAogCW1lbWNweShnaWQtPnJhdywgb3V0X21hZC0+ZGF0YSArIDgsIDgpOwogCi0JbWVtc2V0KGluX21hZCwgMCwgc2l6ZW9mICppbl9tYWQpOwotCWluX21hZC0+YmFzZV92ZXJzaW9uICAgICAgID0gMTsKLQlpbl9tYWQtPm1nbXRfY2xhc3MgICAgIAkgICA9IElCX01HTVRfQ0xBU1NfU1VCTl9MSURfUk9VVEVEOwotCWluX21hZC0+Y2xhc3NfdmVyc2lvbiAgCSAgID0gMTsKLQlpbl9tYWQtPm1ldGhvZCAgICAgICAgIAkgICA9IElCX01HTVRfTUVUSE9EX0dFVDsKLQlpbl9tYWQtPmF0dHJfaWQgICAJICAgPSBJQl9TTVBfQVRUUl9HVUlEX0lORk87Ci0JaW5fbWFkLT5hdHRyX21vZCAgICAgICAgICAgPSBjcHVfdG9fYmUzMihpbmRleCAvIDgpOworCWluaXRfcXVlcnlfbWFkKGluX21hZCk7CisJaW5fbWFkLT5hdHRyX2lkICA9IElCX1NNUF9BVFRSX0dVSURfSU5GTzsKKwlpbl9tYWQtPmF0dHJfbW9kID0gY3B1X3RvX2JlMzIoaW5kZXggLyA4KTsKIAogCWVyciA9IG10aGNhX01BRF9JRkModG9fbWRldihpYmRldiksIDEsIDEsCiAJCQkgICAgcG9ydCwgTlVMTCwgTlVMTCwgaW5fbWFkLCBvdXRfbWFkLApAQCAtNDU4LDggKzQ0NSwxMCBAQAogCWlmIChwZC0+dW9iamVjdCkgewogCQljb250ZXh0ID0gdG9fbXVjb250ZXh0KHBkLT51b2JqZWN0LT5jb250ZXh0KTsKIAotCQlpZiAoaWJfY29weV9mcm9tX3VkYXRhKCZ1Y21kLCB1ZGF0YSwgc2l6ZW9mIHVjbWQpKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisJCWlmIChpYl9jb3B5X2Zyb21fdWRhdGEoJnVjbWQsIHVkYXRhLCBzaXplb2YgdWNtZCkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycl9mcmVlOworCQl9CiAKIAkJZXJyID0gbXRoY2FfbWFwX3VzZXJfZGIodG9fbWRldihwZC0+ZGV2aWNlKSwgJmNvbnRleHQtPnVhciwKIAkJCQkJY29udGV4dC0+ZGJfdGFiLCB1Y21kLmRiX2luZGV4LApAQCAtNTM1LDggKzUyNCwxMCBAQAogCQlpZiAocGQtPnVvYmplY3QpIHsKIAkJCWNvbnRleHQgPSB0b19tdWNvbnRleHQocGQtPnVvYmplY3QtPmNvbnRleHQpOwogCi0JCQlpZiAoaWJfY29weV9mcm9tX3VkYXRhKCZ1Y21kLCB1ZGF0YSwgc2l6ZW9mIHVjbWQpKQorCQkJaWYgKGliX2NvcHlfZnJvbV91ZGF0YSgmdWNtZCwgdWRhdGEsIHNpemVvZiB1Y21kKSkgeworCQkJCWtmcmVlKHFwKTsKIAkJCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwkJCX0KIAogCQkJZXJyID0gbXRoY2FfbWFwX3VzZXJfZGIodG9fbWRldihwZC0+ZGV2aWNlKSwgJmNvbnRleHQtPnVhciwKIAkJCQkJCWNvbnRleHQtPmRiX3RhYiwKQEAgLTc4MywyNCArNzc0LDIwIEBACiAJaWYgKCgqaW92YV9zdGFydCAmIH5QQUdFX01BU0spICE9IChidWZmZXJfbGlzdFswXS5hZGRyICYgflBBR0VfTUFTSykpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi0JaWYgKG51bV9waHlzX2J1ZiA+IDEgJiYKLQkgICAgKChidWZmZXJfbGlzdFswXS5hZGRyICsgYnVmZmVyX2xpc3RbMF0uc2l6ZSkgJiB+UEFHRV9NQVNLKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KIAltYXNrID0gMDsKIAl0b3RhbF9zaXplID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3BoeXNfYnVmOyArK2kpIHsKLQkJaWYgKGkgIT0gMCAmJiBidWZmZXJfbGlzdFtpXS5hZGRyICYgflBBR0VfTUFTSykKLQkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCQlpZiAoaSAhPSAwICYmIGkgIT0gbnVtX3BoeXNfYnVmIC0gMSAmJgotCQkgICAgKGJ1ZmZlcl9saXN0W2ldLnNpemUgJiB+UEFHRV9NQVNLKSkKLQkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQlpZiAoaSAhPSAwKQorCQkJbWFzayB8PSBidWZmZXJfbGlzdFtpXS5hZGRyOworCQlpZiAoaSAhPSBudW1fcGh5c19idWYgLSAxKQorCQkJbWFzayB8PSBidWZmZXJfbGlzdFtpXS5hZGRyICsgYnVmZmVyX2xpc3RbaV0uc2l6ZTsKIAogCQl0b3RhbF9zaXplICs9IGJ1ZmZlcl9saXN0W2ldLnNpemU7Ci0JCWlmIChpID4gMCkKLQkJCW1hc2sgfD0gYnVmZmVyX2xpc3RbaV0uYWRkcjsKIAl9CiAKKwlpZiAobWFzayAmIH5QQUdFX01BU0spCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCiAJLyogRmluZCBsYXJnZXN0IHBhZ2Ugc2hpZnQgd2UgY2FuIHVzZSB0byBjb3ZlciBidWZmZXJzICovCiAJZm9yIChzaGlmdCA9IFBBR0VfU0hJRlQ7IHNoaWZ0IDwgMzE7ICsrc2hpZnQpCiAJCWlmIChudW1fcGh5c19idWYgPiAxKSB7CkBAIC0xMDcwLDExICsxMDU3LDQ4IEBACiAJJmNsYXNzX2RldmljZV9hdHRyX2JvYXJkX2lkCiB9OwogCitzdGF0aWMgaW50IG10aGNhX2luaXRfbm9kZV9kYXRhKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgaWJfc21wICppbl9tYWQgID0gTlVMTDsKKwlzdHJ1Y3QgaWJfc21wICpvdXRfbWFkID0gTlVMTDsKKwlpbnQgZXJyID0gLUVOT01FTTsKKwl1OCBzdGF0dXM7CisKKwlpbl9tYWQgID0ga3phbGxvYyhzaXplb2YgKmluX21hZCwgR0ZQX0tFUk5FTCk7CisJb3V0X21hZCA9IGttYWxsb2Moc2l6ZW9mICpvdXRfbWFkLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluX21hZCB8fCAhb3V0X21hZCkKKwkJZ290byBvdXQ7CisKKwlpbml0X3F1ZXJ5X21hZChpbl9tYWQpOworCWluX21hZC0+YXR0cl9pZCA9IElCX1NNUF9BVFRSX05PREVfSU5GTzsKKworCWVyciA9IG10aGNhX01BRF9JRkMoZGV2LCAxLCAxLAorCQkJICAgIDEsIE5VTEwsIE5VTEwsIGluX21hZCwgb3V0X21hZCwKKwkJCSAgICAmc3RhdHVzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCW1lbWNweSgmZGV2LT5pYl9kZXYubm9kZV9ndWlkLCBvdXRfbWFkLT5kYXRhICsgMTIsIDgpOworCitvdXQ6CisJa2ZyZWUoaW5fbWFkKTsKKwlrZnJlZShvdXRfbWFkKTsKKwlyZXR1cm4gZXJyOworfQorCiBpbnQgbXRoY2FfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAlpbnQgcmV0OwogCWludCBpOwogCisJcmV0ID0gbXRoY2FfaW5pdF9ub2RlX2RhdGEoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJc3RybGNweShkZXYtPmliX2Rldi5uYW1lLCAibXRoY2ElZCIsIElCX0RFVklDRV9OQU1FX01BWCk7CiAJZGV2LT5pYl9kZXYub3duZXIgICAgICAgICAgICAgICAgPSBUSElTX01PRFVMRTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcXAuYwppbmRleCA1NjRiNmQ1Li5mYmE2MDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcXAuYwpAQCAtMTQzNCw3ICsxNDM0LDcgQEAKIAl1MTYgcGtleTsKIAogCWliX3VkX2hlYWRlcl9pbml0KDI1NiwgLyogYXNzdW1lIGEgTUFEICovCi0JCQkgIHNxcC0+dWRfaGVhZGVyLmdyaF9wcmVzZW50LAorCQkJICBtdGhjYV9haF9ncmhfcHJlc2VudCh0b19tYWgod3ItPndyLnVkLmFoKSksCiAJCQkgICZzcXAtPnVkX2hlYWRlcik7CiAKIAllcnIgPSBtdGhjYV9yZWFkX2FoKGRldiwgdG9fbWFoKHdyLT53ci51ZC5haCksICZzcXAtPnVkX2hlYWRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmggYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmgKaW5kZXggOTkyM2ExNS4uZTBhNTQxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaApAQCAtNDUsMTEgKzQ1LDExIEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2luZmluaWJhbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KIAogI2luY2x1ZGUgPHJkbWEvaWJfdmVyYnMuaD4KICNpbmNsdWRlIDxyZG1hL2liX3BhY2suaD4KQEAgLTEyMyw4ICsxMjMsOCBAQAogCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXN0cnVjdCBzZW1hcGhvcmUgbWNhc3RfbXV0ZXg7Ci0Jc3RydWN0IHNlbWFwaG9yZSB2bGFuX211dGV4OworCXN0cnVjdCBtdXRleCBtY2FzdF9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggdmxhbl9tdXRleDsKIAogCXN0cnVjdCByYl9yb290ICBwYXRoX3RyZWU7CiAJc3RydWN0IGxpc3RfaGVhZCBwYXRoX2xpc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKaW5kZXggMjM4ODU4MC4uODZiY2RkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwpAQCAtNTIsNyArNTIsNyBAQAogCiAjZGVmaW5lCUlQT0lCX09QX1JFQ1YJKDF1bCA8PCAzMSkKIAotc3RhdGljIERFQ0xBUkVfTVVURVgocGtleV9zZW0pOworc3RhdGljIERFRklORV9NVVRFWChwa2V5X211dGV4KTsKIAogc3RydWN0IGlwb2liX2FoICppcG9pYl9jcmVhdGVfYWgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IGliX3BkICpwZCwgc3RydWN0IGliX2FoX2F0dHIgKmF0dHIpCkBAIC00NDUsMjUgKzQ0NSwxNiBAQAogCiAJLyogU2h1dGRvd24gdGhlIFBfS2V5IHRocmVhZCBpZiBzdGlsbCBhY3RpdmUgKi8KIAlpZiAoIXRlc3RfYml0KElQT0lCX1BLRVlfQVNTSUdORUQsICZwcml2LT5mbGFncykpIHsKLQkJZG93bigmcGtleV9zZW0pOworCQltdXRleF9sb2NrKCZwa2V5X211dGV4KTsKIAkJc2V0X2JpdChJUE9JQl9QS0VZX1NUT1AsICZwcml2LT5mbGFncyk7CiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnBrZXlfdGFzayk7Ci0JCXVwKCZwa2V5X3NlbSk7CisJCW11dGV4X3VubG9jaygmcGtleV9tdXRleCk7CiAJCWZsdXNoX3dvcmtxdWV1ZShpcG9pYl93b3JrcXVldWUpOwogCX0KIAogCWlwb2liX21jYXN0X3N0b3BfdGhyZWFkKGRldiwgMSk7Ci0KLQkvKgotCSAqIEZsdXNoIHRoZSBtdWx0aWNhc3QgZ3JvdXBzIGZpcnN0IHNvIHdlIHN0b3AgYW55IG11bHRpY2FzdCBqb2lucy4gVGhlCi0JICogY29tcGxldGlvbiB0aHJlYWQgbWF5IGhhdmUgYWxyZWFkeSBkaWVkIGFuZCB3ZSBtYXkgZGVhZGxvY2sgd2FpdGluZwotCSAqIGZvciB0aGUgY29tcGxldGlvbiB0aHJlYWQgdG8gZmluaXNoIHNvbWUgbXVsdGljYXN0IGpvaW5zLgotCSAqLwogCWlwb2liX21jYXN0X2Rldl9mbHVzaChkZXYpOwogCi0JLyogRGVsZXRlIGJyb2FkY2FzdCBhbmQgbG9jYWwgYWRkcmVzc2VzIHNpbmNlIHRoZXkgd2lsbCBiZSByZWNyZWF0ZWQgKi8KLQlpcG9pYl9tY2FzdF9kZXZfZG93bihkZXYpOwotCiAJaXBvaWJfZmx1c2hfcGF0aHMoZGV2KTsKIAogCXJldHVybiAwOwpAQCAtNjA4LDEzICs1OTksMTMgQEAKIAlpZiAodGVzdF9iaXQoSVBPSUJfRkxBR19BRE1JTl9VUCwgJnByaXYtPmZsYWdzKSkKIAkJaXBvaWJfaWJfZGV2X3VwKGRldik7CiAKLQlkb3duKCZwcml2LT52bGFuX211dGV4KTsKKwltdXRleF9sb2NrKCZwcml2LT52bGFuX211dGV4KTsKIAogCS8qIEZsdXNoIGFueSBjaGlsZCBpbnRlcmZhY2VzIHRvbyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3ByaXYsICZwcml2LT5jaGlsZF9pbnRmcywgbGlzdCkKIAkJaXBvaWJfaWJfZGV2X2ZsdXNoKCZjcHJpdi0+ZGV2KTsKIAotCXVwKCZwcml2LT52bGFuX211dGV4KTsKKwltdXRleF91bmxvY2soJnByaXYtPnZsYW5fbXV0ZXgpOwogfQogCiB2b2lkIGlwb2liX2liX2Rldl9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC02MjQsOSArNjE1LDcgQEAKIAlpcG9pYl9kYmcocHJpdiwgImNsZWFuaW5nIHVwIGliX2RldlxuIik7CiAKIAlpcG9pYl9tY2FzdF9zdG9wX3RocmVhZChkZXYsIDEpOwotCi0JLyogRGVsZXRlIHRoZSBicm9hZGNhc3QgYWRkcmVzcyBhbmQgdGhlIGxvY2FsIGFkZHJlc3MgKi8KLQlpcG9pYl9tY2FzdF9kZXZfZG93bihkZXYpOworCWlwb2liX21jYXN0X2Rldl9mbHVzaChkZXYpOwogCiAJaXBvaWJfdHJhbnNwb3J0X2Rldl9jbGVhbnVwKGRldik7CiB9CkBAIC02NjIsMTIgKzY1MSwxMiBAQAogCWlmICh0ZXN0X2JpdChJUE9JQl9QS0VZX0FTU0lHTkVELCAmcHJpdi0+ZmxhZ3MpKQogCQlpcG9pYl9vcGVuKGRldik7CiAJZWxzZSB7Ci0JCWRvd24oJnBrZXlfc2VtKTsKKwkJbXV0ZXhfbG9jaygmcGtleV9tdXRleCk7CiAJCWlmICghdGVzdF9iaXQoSVBPSUJfUEtFWV9TVE9QLCAmcHJpdi0+ZmxhZ3MpKQogCQkJcXVldWVfZGVsYXllZF93b3JrKGlwb2liX3dvcmtxdWV1ZSwKIAkJCQkJICAgJnByaXYtPnBrZXlfdGFzaywKIAkJCQkJICAgSFopOwotCQl1cCgmcGtleV9zZW0pOworCQltdXRleF91bmxvY2soJnBrZXlfbXV0ZXgpOwogCX0KIH0KIApAQCAtNjgxLDEyICs2NzAsMTIgQEAKIAogCS8qIFBfS2V5IHZhbHVlIG5vdCBhc3NpZ25lZCB5ZXQgLSBzdGFydCBwb2xsaW5nICovCiAJaWYgKCF0ZXN0X2JpdChJUE9JQl9QS0VZX0FTU0lHTkVELCAmcHJpdi0+ZmxhZ3MpKSB7Ci0JCWRvd24oJnBrZXlfc2VtKTsKKwkJbXV0ZXhfbG9jaygmcGtleV9tdXRleCk7CiAJCWNsZWFyX2JpdChJUE9JQl9QS0VZX1NUT1AsICZwcml2LT5mbGFncyk7CiAJCXF1ZXVlX2RlbGF5ZWRfd29yayhpcG9pYl93b3JrcXVldWUsCiAJCQkJICAgJnByaXYtPnBrZXlfdGFzaywKIAkJCQkgICBIWik7Ci0JCXVwKCZwa2V5X3NlbSk7CisJCW11dGV4X3VubG9jaygmcGtleV9tdXRleCk7CiAJCXJldHVybiAxOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwppbmRleCA3ODAwMDljLi5mZDNmNWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqY3ByaXY7CiAKIAkJLyogQnJpbmcgdXAgYW55IGNoaWxkIGludGVyZmFjZXMgdG9vICovCi0JCWRvd24oJnByaXYtPnZsYW5fbXV0ZXgpOworCQltdXRleF9sb2NrKCZwcml2LT52bGFuX211dGV4KTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjcHJpdiwgJnByaXYtPmNoaWxkX2ludGZzLCBsaXN0KSB7CiAJCQlpbnQgZmxhZ3M7CiAKQEAgLTExNSw3ICsxMTUsNyBAQAogCiAJCQlkZXZfY2hhbmdlX2ZsYWdzKGNwcml2LT5kZXYsIGZsYWdzIHwgSUZGX1VQKTsKIAkJfQotCQl1cCgmcHJpdi0+dmxhbl9tdXRleCk7CisJCW11dGV4X3VubG9jaygmcHJpdi0+dmxhbl9tdXRleCk7CiAJfQogCiAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKQEAgLTE0MCw3ICsxNDAsNyBAQAogCQlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKmNwcml2OwogCiAJCS8qIEJyaW5nIGRvd24gYW55IGNoaWxkIGludGVyZmFjZXMgdG9vICovCi0JCWRvd24oJnByaXYtPnZsYW5fbXV0ZXgpOworCQltdXRleF9sb2NrKCZwcml2LT52bGFuX211dGV4KTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjcHJpdiwgJnByaXYtPmNoaWxkX2ludGZzLCBsaXN0KSB7CiAJCQlpbnQgZmxhZ3M7CiAKQEAgLTE1MCw3ICsxNTAsNyBAQAogCiAJCQlkZXZfY2hhbmdlX2ZsYWdzKGNwcml2LT5kZXYsIGZsYWdzICYgfklGRl9VUCk7CiAJCX0KLQkJdXAoJnByaXYtPnZsYW5fbXV0ZXgpOworCQltdXRleF91bmxvY2soJnByaXYtPnZsYW5fbXV0ZXgpOwogCX0KIAogCXJldHVybiAwOwpAQCAtODkyLDggKzg5Miw4IEBACiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZwcml2LT50eF9sb2NrKTsKIAotCWluaXRfTVVURVgoJnByaXYtPm1jYXN0X211dGV4KTsKLQlpbml0X01VVEVYKCZwcml2LT52bGFuX211dGV4KTsKKwltdXRleF9pbml0KCZwcml2LT5tY2FzdF9tdXRleCk7CisJbXV0ZXhfaW5pdCgmcHJpdi0+dmxhbl9tdXRleCk7CiAKIAlJTklUX0xJU1RfSEVBRCgmcHJpdi0+cGF0aF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmcHJpdi0+Y2hpbGRfaW50ZnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKaW5kZXggZWQwYzJlYS4uOTgwMzlkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCkBAIC01NSw3ICs1NSw3IEBACiAJCSAiRW5hYmxlIG11bHRpY2FzdCBkZWJ1ZyB0cmFjaW5nIGlmID4gMCIpOwogI2VuZGlmCiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKG1jYXN0X211dGV4KTsKK3N0YXRpYyBERUZJTkVfTVVURVgobWNhc3RfbXV0ZXgpOwogCiAvKiBVc2VkIGZvciBhbGwgbXVsdGljYXN0IGpvaW5zIChicm9hZGNhc3QsIElQdjQgbWNhc3QgYW5kIElQdjYgbWNhc3QpICovCiBzdHJ1Y3QgaXBvaWJfbWNhc3QgewpAQCAtOTcsOCArOTcsNiBAQAogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGlwb2liX25laWdoICpuZWlnaCwgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCUxJU1RfSEVBRChhaF9saXN0KTsKLQlzdHJ1Y3QgaXBvaWJfYWggKmFoLCAqdGFoOwogCiAJaXBvaWJfZGJnX21jYXN0KG5ldGRldl9wcml2KGRldiksCiAJCQkiZGVsZXRpbmcgbXVsdGljYXN0IGdyb3VwICIgSVBPSUJfR0lEX0ZNVCAiXG4iLApAQCAtMTA3LDggKzEwNSwxNCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmVpZ2gsIHRtcCwgJm1jYXN0LT5uZWlnaF9saXN0LCBsaXN0KSB7CisJCS8qCisJCSAqIEl0J3Mgc2FmZSB0byBjYWxsIGlwb2liX3B1dF9haCgpIGluc2lkZSBwcml2LT5sb2NrCisJCSAqIGhlcmUsIGJlY2F1c2Ugd2Uga25vdyB0aGF0IG1jYXN0LT5haCB3aWxsIGFsd2F5cworCQkgKiBob2xkIG9uZSBtb3JlIHJlZmVyZW5jZSwgc28gaXBvaWJfcHV0X2FoKCkgd2lsbAorCQkgKiBuZXZlciBkbyBtb3JlIHRoYW4gZGVjcmVtZW50IHRoZSByZWYgY291bnQuCisJCSAqLwogCQlpZiAobmVpZ2gtPmFoKQotCQkJbGlzdF9hZGRfdGFpbCgmbmVpZ2gtPmFoLT5saXN0LCAmYWhfbGlzdCk7CisJCQlpcG9pYl9wdXRfYWgobmVpZ2gtPmFoKTsKIAkJKnRvX2lwb2liX25laWdoKG5laWdoLT5uZWlnaGJvdXIpID0gTlVMTDsKIAkJbmVpZ2gtPm5laWdoYm91ci0+b3BzLT5kZXN0cnVjdG9yID0gTlVMTDsKIAkJa2ZyZWUobmVpZ2gpOwpAQCAtMTE2LDkgKzEyMCw2IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWgsIHRhaCwgJmFoX2xpc3QsIGxpc3QpCi0JCWlwb2liX3B1dF9haChhaCk7Ci0KIAlpZiAobWNhc3QtPmFoKQogCQlpcG9pYl9wdXRfYWgobWNhc3QtPmFoKTsKIApAQCAtMzg0LDEwICszODUsMTAgQEAKIAogCWlmICghc3RhdHVzICYmICFpcG9pYl9tY2FzdF9qb2luX2ZpbmlzaChtY2FzdCwgbWNtZW1iZXIpKSB7CiAJCW1jYXN0LT5iYWNrb2ZmID0gMTsKLQkJZG93bigmbWNhc3RfbXV0ZXgpOworCQltdXRleF9sb2NrKCZtY2FzdF9tdXRleCk7CiAJCWlmICh0ZXN0X2JpdChJUE9JQl9NQ0FTVF9SVU4sICZwcml2LT5mbGFncykpCiAJCQlxdWV1ZV93b3JrKGlwb2liX3dvcmtxdWV1ZSwgJnByaXYtPm1jYXN0X3Rhc2spOwotCQl1cCgmbWNhc3RfbXV0ZXgpOworCQltdXRleF91bmxvY2soJm1jYXN0X211dGV4KTsKIAkJY29tcGxldGUoJm1jYXN0LT5kb25lKTsKIAkJcmV0dXJuOwogCX0KQEAgLTQxNyw3ICs0MTgsNyBAQAogCiAJbWNhc3QtPnF1ZXJ5ID0gTlVMTDsKIAotCWRvd24oJm1jYXN0X211dGV4KTsKKwltdXRleF9sb2NrKCZtY2FzdF9tdXRleCk7CiAJaWYgKHRlc3RfYml0KElQT0lCX01DQVNUX1JVTiwgJnByaXYtPmZsYWdzKSkgewogCQlpZiAoc3RhdHVzID09IC1FVElNRURPVVQpCiAJCQlxdWV1ZV93b3JrKGlwb2liX3dvcmtxdWV1ZSwgJnByaXYtPm1jYXN0X3Rhc2spOwpAQCAtNDI2LDcgKzQyNyw3IEBACiAJCQkJCSAgIG1jYXN0LT5iYWNrb2ZmICogSFopOwogCX0gZWxzZQogCQljb21wbGV0ZSgmbWNhc3QtPmRvbmUpOwotCXVwKCZtY2FzdF9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZtY2FzdF9tdXRleCk7CiAKIAlyZXR1cm47CiB9CkBAIC00ODEsMTIgKzQ4MiwxMiBAQAogCQlpZiAobWNhc3QtPmJhY2tvZmYgPiBJUE9JQl9NQVhfQkFDS09GRl9TRUNPTkRTKQogCQkJbWNhc3QtPmJhY2tvZmYgPSBJUE9JQl9NQVhfQkFDS09GRl9TRUNPTkRTOwogCi0JCWRvd24oJm1jYXN0X211dGV4KTsKKwkJbXV0ZXhfbG9jaygmbWNhc3RfbXV0ZXgpOwogCQlpZiAodGVzdF9iaXQoSVBPSUJfTUNBU1RfUlVOLCAmcHJpdi0+ZmxhZ3MpKQogCQkJcXVldWVfZGVsYXllZF93b3JrKGlwb2liX3dvcmtxdWV1ZSwKIAkJCQkJICAgJnByaXYtPm1jYXN0X3Rhc2ssCiAJCQkJCSAgIG1jYXN0LT5iYWNrb2ZmICogSFopOwotCQl1cCgmbWNhc3RfbXV0ZXgpOworCQltdXRleF91bmxvY2soJm1jYXN0X211dGV4KTsKIAl9IGVsc2UKIAkJbWNhc3QtPnF1ZXJ5X2lkID0gcmV0OwogfQpAQCAtNTE5LDExICs1MjAsMTEgQEAKIAkJcHJpdi0+YnJvYWRjYXN0ID0gaXBvaWJfbWNhc3RfYWxsb2MoZGV2LCAxKTsKIAkJaWYgKCFwcml2LT5icm9hZGNhc3QpIHsKIAkJCWlwb2liX3dhcm4ocHJpdiwgImZhaWxlZCB0byBhbGxvY2F0ZSBicm9hZGNhc3QgZ3JvdXBcbiIpOwotCQkJZG93bigmbWNhc3RfbXV0ZXgpOworCQkJbXV0ZXhfbG9jaygmbWNhc3RfbXV0ZXgpOwogCQkJaWYgKHRlc3RfYml0KElQT0lCX01DQVNUX1JVTiwgJnByaXYtPmZsYWdzKSkKIAkJCQlxdWV1ZV9kZWxheWVkX3dvcmsoaXBvaWJfd29ya3F1ZXVlLAogCQkJCQkJICAgJnByaXYtPm1jYXN0X3Rhc2ssIEhaKTsKLQkJCXVwKCZtY2FzdF9tdXRleCk7CisJCQltdXRleF91bmxvY2soJm1jYXN0X211dGV4KTsKIAkJCXJldHVybjsKIAkJfQogCkBAIC01NzksMTAgKzU4MCwxMCBAQAogCiAJaXBvaWJfZGJnX21jYXN0KHByaXYsICJzdGFydGluZyBtdWx0aWNhc3QgdGhyZWFkXG4iKTsKIAotCWRvd24oJm1jYXN0X211dGV4KTsKKwltdXRleF9sb2NrKCZtY2FzdF9tdXRleCk7CiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KElQT0lCX01DQVNUX1JVTiwgJnByaXYtPmZsYWdzKSkKIAkJcXVldWVfd29yayhpcG9pYl93b3JrcXVldWUsICZwcml2LT5tY2FzdF90YXNrKTsKLQl1cCgmbWNhc3RfbXV0ZXgpOworCW11dGV4X3VubG9jaygmbWNhc3RfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01OTQsMTAgKzU5NSwxMCBAQAogCiAJaXBvaWJfZGJnX21jYXN0KHByaXYsICJzdG9wcGluZyBtdWx0aWNhc3QgdGhyZWFkXG4iKTsKIAotCWRvd24oJm1jYXN0X211dGV4KTsKKwltdXRleF9sb2NrKCZtY2FzdF9tdXRleCk7CiAJY2xlYXJfYml0KElQT0lCX01DQVNUX1JVTiwgJnByaXYtPmZsYWdzKTsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5tY2FzdF90YXNrKTsKLQl1cCgmbWNhc3RfbXV0ZXgpOworCW11dGV4X3VubG9jaygmbWNhc3RfbXV0ZXgpOwogCiAJaWYgKGZsdXNoKQogCQlmbHVzaF93b3JrcXVldWUoaXBvaWJfd29ya3F1ZXVlKTsKQEAgLTc0MSw0OCArNzQyLDIzIEBACiB7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlMSVNUX0hFQUQocmVtb3ZlX2xpc3QpOwotCXN0cnVjdCBpcG9pYl9tY2FzdCAqbWNhc3QsICp0bWNhc3QsICpubWNhc3Q7CisJc3RydWN0IGlwb2liX21jYXN0ICptY2FzdCwgKnRtY2FzdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaXBvaWJfZGJnX21jYXN0KHByaXYsICJmbHVzaGluZyBtdWx0aWNhc3QgbGlzdFxuIik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1jYXN0LCB0bWNhc3QsICZwcml2LT5tdWx0aWNhc3RfbGlzdCwgbGlzdCkgewotCQlubWNhc3QgPSBpcG9pYl9tY2FzdF9hbGxvYyhkZXYsIDApOwotCQlpZiAobm1jYXN0KSB7Ci0JCQlubWNhc3QtPmZsYWdzID0KLQkJCQltY2FzdC0+ZmxhZ3MgJiAoMSA8PCBJUE9JQl9NQ0FTVF9GTEFHX1NFTkRPTkxZKTsKLQotCQkJbm1jYXN0LT5tY21lbWJlci5tZ2lkID0gbWNhc3QtPm1jbWVtYmVyLm1naWQ7Ci0KLQkJCS8qIEFkZCB0aGUgbmV3IGdyb3VwIGluIGJlZm9yZSB0aGUgdG8tYmUtZGVzdHJveWVkIGdyb3VwICovCi0JCQlsaXN0X2FkZF90YWlsKCZubWNhc3QtPmxpc3QsICZtY2FzdC0+bGlzdCk7Ci0JCQlsaXN0X2RlbF9pbml0KCZtY2FzdC0+bGlzdCk7Ci0KLQkJCXJiX3JlcGxhY2Vfbm9kZSgmbWNhc3QtPnJiX25vZGUsICZubWNhc3QtPnJiX25vZGUsCi0JCQkJCSZwcml2LT5tdWx0aWNhc3RfdHJlZSk7Ci0KLQkJCWxpc3RfYWRkX3RhaWwoJm1jYXN0LT5saXN0LCAmcmVtb3ZlX2xpc3QpOwotCQl9IGVsc2UgewotCQkJaXBvaWJfd2Fybihwcml2LCAiY291bGQgbm90IHJlYWxsb2NhdGUgbXVsdGljYXN0IGdyb3VwICIKLQkJCQkgICBJUE9JQl9HSURfRk1UICJcbiIsCi0JCQkJICAgSVBPSUJfR0lEX0FSRyhtY2FzdC0+bWNtZW1iZXIubWdpZCkpOwotCQl9CisJCWxpc3RfZGVsKCZtY2FzdC0+bGlzdCk7CisJCXJiX2VyYXNlKCZtY2FzdC0+cmJfbm9kZSwgJnByaXYtPm11bHRpY2FzdF90cmVlKTsKKwkJbGlzdF9hZGRfdGFpbCgmbWNhc3QtPmxpc3QsICZyZW1vdmVfbGlzdCk7CiAJfQogCiAJaWYgKHByaXYtPmJyb2FkY2FzdCkgewotCQlubWNhc3QgPSBpcG9pYl9tY2FzdF9hbGxvYyhkZXYsIDApOwotCQlpZiAobm1jYXN0KSB7Ci0JCQlubWNhc3QtPm1jbWVtYmVyLm1naWQgPSBwcml2LT5icm9hZGNhc3QtPm1jbWVtYmVyLm1naWQ7Ci0KLQkJCXJiX3JlcGxhY2Vfbm9kZSgmcHJpdi0+YnJvYWRjYXN0LT5yYl9ub2RlLAotCQkJCQkmbm1jYXN0LT5yYl9ub2RlLAotCQkJCQkmcHJpdi0+bXVsdGljYXN0X3RyZWUpOwotCi0JCQlsaXN0X2FkZF90YWlsKCZwcml2LT5icm9hZGNhc3QtPmxpc3QsICZyZW1vdmVfbGlzdCk7Ci0JCX0KLQotCQlwcml2LT5icm9hZGNhc3QgPSBubWNhc3Q7CisgCQlyYl9lcmFzZSgmcHJpdi0+YnJvYWRjYXN0LT5yYl9ub2RlLCAmcHJpdi0+bXVsdGljYXN0X3RyZWUpOworCQlsaXN0X2FkZF90YWlsKCZwcml2LT5icm9hZGNhc3QtPmxpc3QsICZyZW1vdmVfbGlzdCk7CisJCXByaXYtPmJyb2FkY2FzdCA9IE5VTEw7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtNzkzLDI0ICs3NjksNiBAQAogCX0KIH0KIAotdm9pZCBpcG9pYl9tY2FzdF9kZXZfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIERlbGV0ZSBicm9hZGNhc3Qgc2luY2UgaXQgd2lsbCBiZSByZWNyZWF0ZWQgKi8KLQlpZiAocHJpdi0+YnJvYWRjYXN0KSB7Ci0JCWlwb2liX2RiZ19tY2FzdChwcml2LCAiZGVsZXRpbmcgYnJvYWRjYXN0IGdyb3VwXG4iKTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlyYl9lcmFzZSgmcHJpdi0+YnJvYWRjYXN0LT5yYl9ub2RlLCAmcHJpdi0+bXVsdGljYXN0X3RyZWUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCWlwb2liX21jYXN0X2xlYXZlKGRldiwgcHJpdi0+YnJvYWRjYXN0KTsKLQkJaXBvaWJfbWNhc3RfZnJlZShwcml2LT5icm9hZGNhc3QpOwotCQlwcml2LT5icm9hZGNhc3QgPSBOVUxMOwotCX0KLX0KLQogdm9pZCBpcG9pYl9tY2FzdF9yZXN0YXJ0X3Rhc2sodm9pZCAqZGV2X3B0cikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X3B0cjsKQEAgLTgyNCw3ICs3ODIsOCBAQAogCiAJaXBvaWJfbWNhc3Rfc3RvcF90aHJlYWQoZGV2LCAwKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+eG1pdF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKIAogCS8qCiAJICogVW5mb3J0dW5hdGVseSwgdGhlIG5ldHdvcmtpbmcgY29yZSBvbmx5IGdpdmVzIHVzIGEgbGlzdCBvZiBhbGwgb2YKQEAgLTg5Niw3ICs4NTUsOSBAQAogCQkJbGlzdF9hZGRfdGFpbCgmbWNhc3QtPmxpc3QsICZyZW1vdmVfbGlzdCk7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+eG1pdF9sb2NrLCBmbGFncyk7CiAKIAkvKiBXZSBoYXZlIHRvIGNhbmNlbCBvdXRzaWRlIG9mIHRoZSBzcGlubG9jayAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtY2FzdCwgdG1jYXN0LCAmcmVtb3ZlX2xpc3QsIGxpc3QpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmVyYnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmVyYnMuYwppbmRleCBlODI5ZTEwLi5mYWFmMTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl92ZXJicy5jCkBAIC02NSw5ICs2NSw5IEBACiAJfQogCiAJLyogYXR0YWNoIFFQIHRvIG11bHRpY2FzdCBncm91cCAqLwotCWRvd24oJnByaXYtPm1jYXN0X211dGV4KTsKKwltdXRleF9sb2NrKCZwcml2LT5tY2FzdF9tdXRleCk7CiAJcmV0ID0gaWJfYXR0YWNoX21jYXN0KHByaXYtPnFwLCBtZ2lkLCBtbGlkKTsKLQl1cCgmcHJpdi0+bWNhc3RfbXV0ZXgpOworCW11dGV4X3VubG9jaygmcHJpdi0+bWNhc3RfbXV0ZXgpOwogCWlmIChyZXQpCiAJCWlwb2liX3dhcm4ocHJpdiwgImZhaWxlZCB0byBhdHRhY2ggdG8gbXVsdGljYXN0IGdyb3VwLCByZXQgPSAlZFxuIiwgcmV0KTsKIApAQCAtODEsOSArODEsOSBAQAogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJldDsKIAotCWRvd24oJnByaXYtPm1jYXN0X211dGV4KTsKKwltdXRleF9sb2NrKCZwcml2LT5tY2FzdF9tdXRleCk7CiAJcmV0ID0gaWJfZGV0YWNoX21jYXN0KHByaXYtPnFwLCBtZ2lkLCBtbGlkKTsKLQl1cCgmcHJpdi0+bWNhc3RfbXV0ZXgpOworCW11dGV4X3VubG9jaygmcHJpdi0+bWNhc3RfbXV0ZXgpOwogCWlmIChyZXQpCiAJCWlwb2liX3dhcm4ocHJpdiwgImliX2RldGFjaF9tY2FzdCBmYWlsZWQgKHJlc3VsdCA9ICVkKVxuIiwgcmV0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl92bGFuLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZsYW4uYwppbmRleCBkMjgwYjM0Li40Y2ExNzU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZsYW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZsYW4uYwpAQCAtNjMsNyArNjMsNyBAQAogCiAJcHByaXYgPSBuZXRkZXZfcHJpdihwZGV2KTsKIAotCWRvd24oJnBwcml2LT52bGFuX211dGV4KTsKKwltdXRleF9sb2NrKCZwcHJpdi0+dmxhbl9tdXRleCk7CiAKIAkvKgogCSAqIEZpcnN0IGVuc3VyZSB0aGlzIGlzbid0IGEgZHVwbGljYXRlLiBXZSBjaGVjayB0aGUgcGFyZW50IGRldmljZSBhbmQKQEAgLTEyNCw3ICsxMjQsNyBAQAogCiAJbGlzdF9hZGRfdGFpbCgmcHJpdi0+bGlzdCwgJnBwcml2LT5jaGlsZF9pbnRmcyk7CiAKLQl1cCgmcHByaXYtPnZsYW5fbXV0ZXgpOworCW11dGV4X3VubG9jaygmcHByaXYtPnZsYW5fbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTEzOSw3ICsxMzksNyBAQAogCWZyZWVfbmV0ZGV2KHByaXYtPmRldik7CiAKIGVycjoKLQl1cCgmcHByaXYtPnZsYW5fbXV0ZXgpOworCW11dGV4X3VubG9jaygmcHByaXYtPnZsYW5fbXV0ZXgpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTE1Myw3ICsxNTMsNyBAQAogCiAJcHByaXYgPSBuZXRkZXZfcHJpdihwZGV2KTsKIAotCWRvd24oJnBwcml2LT52bGFuX211dGV4KTsKKwltdXRleF9sb2NrKCZwcHJpdi0+dmxhbl9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHByaXYsIHRwcml2LCAmcHByaXYtPmNoaWxkX2ludGZzLCBsaXN0KSB7CiAJCWlmIChwcml2LT5wa2V5ID09IHBrZXkpIHsKIAkJCXVucmVnaXN0ZXJfbmV0ZGV2KHByaXYtPmRldik7CkBAIC0xNjcsNyArMTY3LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCXVwKCZwcHJpdi0+dmxhbl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZwcHJpdi0+dmxhbl9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwppbmRleCBkZDQ4OGQzLi4zMTIwN2U2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKQEAgLTE1MTYsOCArMTUxNiw3IEBACiAKIHN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihwb3J0LCBTX0lSVUdPLCBzaG93X3BvcnQsIE5VTEwpOwogCi1zdGF0aWMgc3RydWN0IHNycF9ob3N0ICpzcnBfYWRkX3BvcnQoc3RydWN0IGliX2RldmljZSAqZGV2aWNlLAotCQkJCSAgICAgX19iZTY0IG5vZGVfZ3VpZCwgdTggcG9ydCkKK3N0YXRpYyBzdHJ1Y3Qgc3JwX2hvc3QgKnNycF9hZGRfcG9ydChzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UsIHU4IHBvcnQpCiB7CiAJc3RydWN0IHNycF9ob3N0ICpob3N0OwogCkBAIC0xNTMyLDcgKzE1MzEsNyBAQAogCWhvc3QtPnBvcnQgPSBwb3J0OwogCiAJaG9zdC0+aW5pdGlhdG9yX3BvcnRfaWRbN10gPSBwb3J0OwotCW1lbWNweShob3N0LT5pbml0aWF0b3JfcG9ydF9pZCArIDgsICZub2RlX2d1aWQsIDgpOworCW1lbWNweShob3N0LT5pbml0aWF0b3JfcG9ydF9pZCArIDgsICZkZXZpY2UtPm5vZGVfZ3VpZCwgOCk7CiAKIAlob3N0LT5wZCAgID0gaWJfYWxsb2NfcGQoZGV2aWNlKTsKIAlpZiAoSVNfRVJSKGhvc3QtPnBkKSkKQEAgLTE1ODAsMjIgKzE1NzksMTEgQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfbGlzdDsKIAlzdHJ1Y3Qgc3JwX2hvc3QgKmhvc3Q7Ci0Jc3RydWN0IGliX2RldmljZV9hdHRyICpkZXZfYXR0cjsKIAlpbnQgcywgZSwgcDsKIAotCWRldl9hdHRyID0ga21hbGxvYyhzaXplb2YgKmRldl9hdHRyLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldl9hdHRyKQotCQlyZXR1cm47Ci0KLQlpZiAoaWJfcXVlcnlfZGV2aWNlKGRldmljZSwgZGV2X2F0dHIpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJDb3VsZG4ndCBxdWVyeSBub2RlIEdVSUQgZm9yICVzLlxuIiwKLQkJICAgICAgIGRldmljZS0+bmFtZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQogCWRldl9saXN0ID0ga21hbGxvYyhzaXplb2YgKmRldl9saXN0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldl9saXN0KQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJSU5JVF9MSVNUX0hFQUQoZGV2X2xpc3QpOwogCkBAIC0xNjA4LDE1ICsxNTk2LDEyIEBACiAJfQogCiAJZm9yIChwID0gczsgcCA8PSBlOyArK3ApIHsKLQkJaG9zdCA9IHNycF9hZGRfcG9ydChkZXZpY2UsIGRldl9hdHRyLT5ub2RlX2d1aWQsIHApOworCQlob3N0ID0gc3JwX2FkZF9wb3J0KGRldmljZSwgcCk7CiAJCWlmIChob3N0KQogCQkJbGlzdF9hZGRfdGFpbCgmaG9zdC0+bGlzdCwgZGV2X2xpc3QpOwogCX0KIAogCWliX3NldF9jbGllbnRfZGF0YShkZXZpY2UsICZzcnBfY2xpZW50LCBkZXZfbGlzdCk7Ci0KLW91dDoKLQlrZnJlZShkZXZfYXR0cik7CiB9CiAKIHN0YXRpYyB2b2lkIHNycF9yZW1vdmVfb25lKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYyBiL2RyaXZlcnMvaW5wdXQvZXZkZXYuYwppbmRleCAzNjJiMzM1Li43NDU5NzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCkBAIC0xNTksNyArMTU5LDcgQEAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAjICBkZWZpbmUgQ09NUEFUX1RFU1QgaXNfY29tcGF0X3Rhc2soKQogI2VsaWYgZGVmaW5lZChDT05GSUdfSUE2NCkKLSMgIGRlZmluZSBDT01QQVRfVEVTVCBJU19JQTMyX1BST0NFU1MoaWE2NF90YXNrX3JlZ3MoY3VycmVudCkpCisjICBkZWZpbmUgQ09NUEFUX1RFU1QgSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyhjdXJyZW50KSkKICNlbGlmIGRlZmluZWQoQ09ORklHX1MzOTApCiAjICBkZWZpbmUgQ09NUEFUX1RFU1QgdGVzdF90aHJlYWRfZmxhZyhUSUZfMzFCSVQpCiAjZWxpZiBkZWZpbmVkKENPTkZJR19NSVBTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCmluZGV4IGNhYWM2ZDYuLmI3NjVhMTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCkBAIC01MCw5ICs1MCw3IEBACiAKIHN0YXRpYyBMSVNUX0hFQUQoZ2FtZXBvcnRfbGlzdCk7CiAKLXN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgZ2FtZXBvcnRfYnVzID0gewotCS5uYW1lID0JImdhbWVwb3J0IiwKLX07CitzdGF0aWMgc3RydWN0IGJ1c190eXBlIGdhbWVwb3J0X2J1czsKIAogc3RhdGljIHZvaWQgZ2FtZXBvcnRfYWRkX3BvcnQoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCk7CiBzdGF0aWMgdm9pZCBnYW1lcG9ydF9kZXN0cm95X3BvcnQoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCk7CkBAIC03MDMsMTEgKzcwMSwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIGdhbWVwb3J0X2J1cyA9IHsKKwkubmFtZSA9CSJnYW1lcG9ydCIsCisJLnByb2JlID0gZ2FtZXBvcnRfZHJpdmVyX3Byb2JlLAorCS5yZW1vdmUgPSBnYW1lcG9ydF9kcml2ZXJfcmVtb3ZlLAorfTsKKwogdm9pZCBfX2dhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ2FtZXBvcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQogewogCWRydi0+ZHJpdmVyLmJ1cyA9ICZnYW1lcG9ydF9idXM7Ci0JZHJ2LT5kcml2ZXIucHJvYmUgPSBnYW1lcG9ydF9kcml2ZXJfcHJvYmU7Ci0JZHJ2LT5kcml2ZXIucmVtb3ZlID0gZ2FtZXBvcnRfZHJpdmVyX3JlbW92ZTsKIAlnYW1lcG9ydF9xdWV1ZV9ldmVudChkcnYsIG93bmVyLCBHQU1FUE9SVF9SRUdJU1RFUl9EUklWRVIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKaW5kZXggZmUzM2ZmMy4uNGZlM2RhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQuYwpAQCAtNTI4LDQwICs1MjgsNTYgQEAKIElOUFVUX0RFVl9TVFJJTkdfQVRUUl9TSE9XKHBoeXMpOwogSU5QVVRfREVWX1NUUklOR19BVFRSX1NIT1codW5pcSk7CiAKLXN0YXRpYyBpbnQgcHJpbnRfbW9kYWxpYXNfYml0cyhjaGFyICpidWYsIGNoYXIgcHJlZml4LCB1bnNpZ25lZCBsb25nICphcnIsCitzdGF0aWMgaW50IHByaW50X21vZGFsaWFzX2JpdHMoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY2hhciBwcmVmaXgsIHVuc2lnbmVkIGxvbmcgKmFyciwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4KQogewogCWludCBsZW4sIGk7CiAKLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVjIiwgcHJlZml4KTsKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemUsICIlYyIsIHByZWZpeCk7CiAJZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAJCWlmIChhcnJbTE9ORyhpKV0gJiBCSVQoaSkpCi0JCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiJVgsIiwgaSk7CisJCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAiJVgsIiwgaSk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBwcmludF9tb2RhbGlhcyhjaGFyICpidWYsIGludCBzaXplLCBzdHJ1Y3QgaW5wdXRfZGV2ICppZCkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplLCAiaW5wdXQ6YiUwNFh2JTA0WHAlMDRYZSUwNFgtIiwKKwkJICAgICAgIGlkLT5pZC5idXN0eXBlLAorCQkgICAgICAgaWQtPmlkLnZlbmRvciwKKwkJICAgICAgIGlkLT5pZC5wcm9kdWN0LAorCQkgICAgICAgaWQtPmlkLnZlcnNpb24pOworCisJbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAnZScsIGlkLT5ldmJpdCwKKwkJCQkgICAwLCBFVl9NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ2snLCBpZC0+a2V5Yml0LAorCQkJCSAgIEtFWV9NSU5fSU5URVJFU1RJTkcsIEtFWV9NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ3InLCBpZC0+cmVsYml0LAorCQkJCSAgIDAsIFJFTF9NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ2EnLCBpZC0+YWJzYml0LAorCQkJCSAgIDAsIEFCU19NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ20nLCBpZC0+bXNjYml0LAorCQkJCSAgIDAsIE1TQ19NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ2wnLCBpZC0+bGVkYml0LAorCQkJCSAgIDAsIExFRF9NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ3MnLCBpZC0+c25kYml0LAorCQkJCSAgIDAsIFNORF9NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ2YnLCBpZC0+ZmZiaXQsCisJCQkJICAgMCwgRkZfTUFYKTsKKwlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYgKyBsZW4sIHNpemUgLSBsZW4sICd3JywgaWQtPnN3Yml0LAorCQkJCSAgIDAsIFNXX01BWCk7CiAJcmV0dXJuIGxlbjsKIH0KIAogc3RhdGljIHNzaXplX3QgaW5wdXRfZGV2X3Nob3dfbW9kYWxpYXMoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqaWQgPSB0b19pbnB1dF9kZXYoZGV2KTsKLQlzc2l6ZV90IGxlbiA9IDA7CisJc3NpemVfdCBsZW47CiAKLQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiaW5wdXQ6YiUwNFh2JTA0WHAlMDRYZSUwNFgtIiwKLQkJICAgICAgIGlkLT5pZC5idXN0eXBlLAotCQkgICAgICAgaWQtPmlkLnZlbmRvciwKLQkJICAgICAgIGlkLT5pZC5wcm9kdWN0LAotCQkgICAgICAgaWQtPmlkLnZlcnNpb24pOwotCi0JbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmK2xlbiwgJ2UnLCBpZC0+ZXZiaXQsIDAsIEVWX01BWCk7Ci0JbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmK2xlbiwgJ2snLCBpZC0+a2V5Yml0LAotCQkJCSAgIEtFWV9NSU5fSU5URVJFU1RJTkcsIEtFWV9NQVgpOwotCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZitsZW4sICdyJywgaWQtPnJlbGJpdCwgMCwgUkVMX01BWCk7Ci0JbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmK2xlbiwgJ2EnLCBpZC0+YWJzYml0LCAwLCBBQlNfTUFYKTsKLQlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYrbGVuLCAnbScsIGlkLT5tc2NiaXQsIDAsIE1TQ19NQVgpOwotCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZitsZW4sICdsJywgaWQtPmxlZGJpdCwgMCwgTEVEX01BWCk7Ci0JbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmK2xlbiwgJ3MnLCBpZC0+c25kYml0LCAwLCBTTkRfTUFYKTsKLQlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYrbGVuLCAnZicsIGlkLT5mZmJpdCwgMCwgRkZfTUFYKTsKLQlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYrbGVuLCAndycsIGlkLT5zd2JpdCwgMCwgU1dfTUFYKTsKLQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiXG4iKTsKKwlsZW4gPSBwcmludF9tb2RhbGlhcyhidWYsIFBBR0VfU0laRSwgaWQpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRS1sZW4sICJcbiIpOwogCXJldHVybiBsZW47CiB9CiBzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobW9kYWxpYXMsIFNfSVJVR08sIGlucHV0X2Rldl9zaG93X21vZGFsaWFzLCBOVUxMKTsKQEAgLTcyOCw4ICs3NDQsMTEgQEAKIAlpZiAodGVzdF9iaXQoRVZfU1csIGRldi0+ZXZiaXQpKQogCQlJTlBVVF9BRERfSE9UUExVR19CTV9WQVIoIlNXPSIsIGRldi0+c3diaXQsIFNXX01BWCk7CiAKLQllbnZwW2ldID0gTlVMTDsKKwllbnZwW2krK10gPSBidWZmZXIgKyBsZW47CisJbGVuICs9IHNucHJpbnRmKGJ1ZmZlciArIGxlbiwgYnVmZmVyX3NpemUgLSBsZW4sICJNT0RBTElBUz0iKTsKKwlsZW4gKz0gcHJpbnRfbW9kYWxpYXMoYnVmZmVyICsgbGVuLCBidWZmZXJfc2l6ZSAtIGxlbiwgZGV2KSArIDE7CiAKKwllbnZwW2ldID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbWlqb3kuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW1pam95LmMKaW5kZXggODU1OGE5OS4uZWM1NWEyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbWlqb3kuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FtaWpveS5jCkBAIC02NCw4ICs2NCw4IEBACiAJCWlmIChhbWlqb3lbaV0pIHsKIAogCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwOiBkYXRhID0gfmN1c3RvbS5qb3kwZGF0OyBidXR0b24gPSAofmNpYWEucHJhID4+IDYpICYgMTsgYnJlYWs7Ci0JCQkJY2FzZSAxOiBkYXRhID0gfmN1c3RvbS5qb3kxZGF0OyBidXR0b24gPSAofmNpYWEucHJhID4+IDcpICYgMTsgYnJlYWs7CisJCQkJY2FzZSAwOiBkYXRhID0gfmFtaWdhX2N1c3RvbS5qb3kwZGF0OyBidXR0b24gPSAofmNpYWEucHJhID4+IDYpICYgMTsgYnJlYWs7CisJCQkJY2FzZSAxOiBkYXRhID0gfmFtaWdhX2N1c3RvbS5qb3kxZGF0OyBidXR0b24gPSAofmNpYWEucHJhID4+IDcpICYgMTsgYnJlYWs7CiAJCQl9CiAKIAkJCWlucHV0X3JlZ3MoYW1pam95X2RldltpXSwgZnApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYwppbmRleCAyNDQ3NDMzLi4yMTQxNTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYwpAQCAtMzQ4LDYgKzM0OCw0MCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogYWxwc19wb2xsKCkgLSBwb2xsIHRoZSB0b3VjaHBhZCBmb3IgY3VycmVudCBtb3Rpb24gcGFja2V0LgorICogVXNlZCBpbiByZXN5bmMuCisgKi8KK3N0YXRpYyBpbnQgYWxwc19wb2xsKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBhbHBzX2RhdGEgKnByaXYgPSBwc21vdXNlLT5wcml2YXRlOworCXVuc2lnbmVkIGNoYXIgYnVmWzZdOworCWludCBwb2xsX2ZhaWxlZDsKKworCWlmIChwcml2LT5pLT5mbGFncyAmIEFMUFNfUEFTUykKKwkJYWxwc19wYXNzdGhyb3VnaF9tb2RlKHBzbW91c2UsIDEpOworCisJcG9sbF9mYWlsZWQgPSBwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBidWYsCisJCQkJICBQU01PVVNFX0NNRF9QT0xMIHwgKHBzbW91c2UtPnBrdHNpemUgPDwgOCkpIDwgMDsKKworCWlmIChwcml2LT5pLT5mbGFncyAmIEFMUFNfUEFTUykKKwkJYWxwc19wYXNzdGhyb3VnaF9tb2RlKHBzbW91c2UsIDApOworCisJaWYgKHBvbGxfZmFpbGVkIHx8IChidWZbMF0gJiBwcml2LT5pLT5tYXNrMCkgIT0gcHJpdi0+aS0+Ynl0ZTApCisJCXJldHVybiAtMTsKKworCWlmICgocHNtb3VzZS0+YmFkYnl0ZSAmIDB4YzgpID09IDB4MDgpIHsKKy8qCisgKiBQb2xsIHRoZSB0cmFjayBzdGljayAuLi4KKyAqLworCQlpZiAocHMyX2NvbW1hbmQoJnBzbW91c2UtPnBzMmRldiwgYnVmLCBQU01PVVNFX0NNRF9QT0xMIHwgKDMgPDwgOCkpKQorCQkJcmV0dXJuIC0xOworCX0KKworCW1lbWNweShwc21vdXNlLT5wYWNrZXQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGFscHNfcmVjb25uZWN0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQogewogCXN0cnVjdCBhbHBzX2RhdGEgKnByaXYgPSBwc21vdXNlLT5wcml2YXRlOwpAQCAtNDUxLDEwICs0ODUsMTQgQEAKIAlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UocHJpdi0+ZGV2Mik7CiAKIAlwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyID0gYWxwc19wcm9jZXNzX2J5dGU7CisJcHNtb3VzZS0+cG9sbCA9IGFscHNfcG9sbDsKIAlwc21vdXNlLT5kaXNjb25uZWN0ID0gYWxwc19kaXNjb25uZWN0OwogCXBzbW91c2UtPnJlY29ubmVjdCA9IGFscHNfcmVjb25uZWN0OwogCXBzbW91c2UtPnBrdHNpemUgPSA2OwogCisJLyogV2UgYXJlIGhhdmluZyB0cm91YmxlIHJlc3luY2luZyBBTFBTIHRvdWNocGFkcyBzbyBkaXNhYmxlIGl0IGZvciBub3cgKi8KKwlwc21vdXNlLT5yZXN5bmNfdGltZSA9IDA7CisKIAlyZXR1cm4gMDsKIAogaW5pdF9mYWlsOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbWltb3VzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hbWltb3VzZS5jCmluZGV4IGQxM2Q0YzguLmM4YjJjYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYW1pbW91c2UuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FtaW1vdXNlLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBqb3kwZGF0LCBwb3Rnb3I7CiAJaW50IG54LCBueSwgZHgsIGR5OwogCi0Jam95MGRhdCA9IGN1c3RvbS5qb3kwZGF0OworCWpveTBkYXQgPSBhbWlnYV9jdXN0b20uam95MGRhdDsKIAogCW54ID0gam95MGRhdCAmIDB4ZmY7CiAJbnkgPSBqb3kwZGF0ID4+IDg7CkBAIC01Nyw3ICs1Nyw3IEBACiAJYW1pbW91c2VfbGFzdHggPSBueDsKIAlhbWltb3VzZV9sYXN0eSA9IG55OwogCi0JcG90Z29yID0gY3VzdG9tLnBvdGdvcjsKKwlwb3Rnb3IgPSBhbWlnYV9jdXN0b20ucG90Z29yOwogCiAJaW5wdXRfcmVncyhhbWltb3VzZV9kZXYsIGZwKTsKIApAQCAtNzcsNyArNzcsNyBAQAogewogCXVuc2lnbmVkIHNob3J0IGpveTBkYXQ7CiAKLQlqb3kwZGF0ID0gY3VzdG9tLmpveTBkYXQ7CisJam95MGRhdCA9IGFtaWdhX2N1c3RvbS5qb3kwZGF0OwogCiAJYW1pbW91c2VfbGFzdHggPSBqb3kwZGF0ICYgMHhmZjsKIAlhbWltb3VzZV9sYXN0eSA9IGpveTBkYXQgPj4gODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jCmluZGV4IDAyNWE3MWQuLmM4ODUyMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAJaWYgKHBzbW91c2Vfc2xpY2VkX2NvbW1hbmQocHNtb3VzZSwgY29tbWFuZCkpCiAJCXJldHVybiAtMTsKIAotCWlmIChwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBwYXJhbSwgUFNNT1VTRV9DTURfUE9MTCkpCisJaWYgKHBzMl9jb21tYW5kKCZwc21vdXNlLT5wczJkZXYsIHBhcmFtLCBQU01PVVNFX0NNRF9QT0xMIHwgMHgwMzAwKSkKIAkJcmV0dXJuIC0xOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYwppbmRleCA0ZDVlY2MwLi43NjY1ZmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKQEAgLTU0LDEwICs1NCwxNCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKHNtYXJ0c2Nyb2xsLCBwc21vdXNlX3NtYXJ0c2Nyb2xsLCBib29sLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc21hcnRzY3JvbGwsICJMb2dpdGVjaCBTbWFydHNjcm9sbCBhdXRvcmVwZWF0LCAxID0gZW5hYmxlZCAoZGVmYXVsdCksIDAgPSBkaXNhYmxlZC4iKTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBwc21vdXNlX3Jlc2V0YWZ0ZXI7CitzdGF0aWMgdW5zaWduZWQgaW50IHBzbW91c2VfcmVzZXRhZnRlciA9IDU7CiBtb2R1bGVfcGFyYW1fbmFtZWQocmVzZXRhZnRlciwgcHNtb3VzZV9yZXNldGFmdGVyLCB1aW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocmVzZXRhZnRlciwgIlJlc2V0IGRldmljZSBhZnRlciBzbyBtYW55IGJhZCBwYWNrZXRzICgwID0gbmV2ZXIpLiIpOwogCitzdGF0aWMgdW5zaWduZWQgaW50IHBzbW91c2VfcmVzeW5jX3RpbWUgPSA1OworbW9kdWxlX3BhcmFtX25hbWVkKHJlc3luY190aW1lLCBwc21vdXNlX3Jlc3luY190aW1lLCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVzeW5jX3RpbWUsICJIb3cgbG9uZyBjYW4gbW91c2Ugc3RheSBpZGxlIGJlZm9yZSBmb3JjaW5nIHJlc3luYyAoaW4gc2Vjb25kcywgMCA9IG5ldmVyKS4iKTsKKwogUFNNT1VTRV9ERUZJTkVfQVRUUihwcm90b2NvbCwgU19JV1VTUiB8IFNfSVJVR08sCiAJCQlOVUxMLAogCQkJcHNtb3VzZV9hdHRyX3Nob3dfcHJvdG9jb2wsIHBzbW91c2VfYXR0cl9zZXRfcHJvdG9jb2wpOwpAQCAtNzAsMTIgKzc0LDE2IEBACiBQU01PVVNFX0RFRklORV9BVFRSKHJlc2V0YWZ0ZXIsIFNfSVdVU1IgfCBTX0lSVUdPLAogCQkJKHZvaWQgKikgb2Zmc2V0b2Yoc3RydWN0IHBzbW91c2UsIHJlc2V0YWZ0ZXIpLAogCQkJcHNtb3VzZV9zaG93X2ludF9hdHRyLCBwc21vdXNlX3NldF9pbnRfYXR0cik7CitQU01PVVNFX0RFRklORV9BVFRSKHJlc3luY190aW1lLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSh2b2lkICopIG9mZnNldG9mKHN0cnVjdCBwc21vdXNlLCByZXN5bmNfdGltZSksCisJCQlwc21vdXNlX3Nob3dfaW50X2F0dHIsIHBzbW91c2Vfc2V0X2ludF9hdHRyKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBzbW91c2VfYXR0cmlidXRlc1tdID0gewogCSZwc21vdXNlX2F0dHJfcHJvdG9jb2wuZGF0dHIuYXR0ciwKIAkmcHNtb3VzZV9hdHRyX3JhdGUuZGF0dHIuYXR0ciwKIAkmcHNtb3VzZV9hdHRyX3Jlc29sdXRpb24uZGF0dHIuYXR0ciwKIAkmcHNtb3VzZV9hdHRyX3Jlc2V0YWZ0ZXIuZGF0dHIuYXR0ciwKKwkmcHNtb3VzZV9hdHRyX3Jlc3luY190aW1lLmRhdHRyLmF0dHIsCiAJTlVMTAogfTsKIApAQCAtOTgsNiArMTA2LDggQEAKICAqLwogc3RhdGljIERFQ0xBUkVfTVVURVgocHNtb3VzZV9zZW0pOwogCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmtwc21vdXNlZF93cTsKKwogc3RydWN0IHBzbW91c2VfcHJvdG9jb2wgewogCWVudW0gcHNtb3VzZV90eXBlIHR5cGU7CiAJY2hhciAqbmFtZTsKQEAgLTE3OCwxNSArMTg4LDc5IEBACiB9CiAKIC8qCi0gKiBwc21vdXNlX2ludGVycnVwdCgpIGhhbmRsZXMgaW5jb21pbmcgY2hhcmFjdGVycywgZWl0aGVyIGdhdGhlcmluZyB0aGVtIGludG8KLSAqIHBhY2tldHMgb3IgcGFzc2luZyB0aGVtIHRvIHRoZSBjb21tYW5kIHJvdXRpbmUgYXMgY29tbWFuZCBvdXRwdXQuCisgKiBfX3BzbW91c2Vfc2V0X3N0YXRlKCkgc2V0cyBuZXcgcHNtb3VzZSBzdGF0ZSBhbmQgcmVzZXRzIGFsbCBmbGFncy4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgX19wc21vdXNlX3NldF9zdGF0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgZW51bSBwc21vdXNlX3N0YXRlIG5ld19zdGF0ZSkKK3sKKwlwc21vdXNlLT5zdGF0ZSA9IG5ld19zdGF0ZTsKKwlwc21vdXNlLT5wa3RjbnQgPSBwc21vdXNlLT5vdXRfb2Zfc3luYyA9IDA7CisJcHNtb3VzZS0+cHMyZGV2LmZsYWdzID0gMDsKKwlwc21vdXNlLT5sYXN0ID0gamlmZmllczsKK30KKworCisvKgorICogcHNtb3VzZV9zZXRfc3RhdGUoKSBzZXRzIG5ldyBwc21vdXNlIHN0YXRlIGFuZCByZXNldHMgYWxsIGZsYWdzIGFuZAorICogY291bnRlcnMgd2hpbGUgaG9sZGluZyBzZXJpbyBsb2NrIHNvIGZpZ2h0aW5nIHdpdGggaW50ZXJydXB0IGhhbmRsZXIKKyAqIGlzIG5vdCBhIGNvbmNlcm4uCisgKi8KKworc3RhdGljIHZvaWQgcHNtb3VzZV9zZXRfc3RhdGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGVudW0gcHNtb3VzZV9zdGF0ZSBuZXdfc3RhdGUpCit7CisJc2VyaW9fcGF1c2VfcngocHNtb3VzZS0+cHMyZGV2LnNlcmlvKTsKKwlfX3BzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIG5ld19zdGF0ZSk7CisJc2VyaW9fY29udGludWVfcngocHNtb3VzZS0+cHMyZGV2LnNlcmlvKTsKK30KKworLyoKKyAqIHBzbW91c2VfaGFuZGxlX2J5dGUoKSBwcm9jZXNzZXMgb25lIGJ5dGUgb2YgdGhlIGlucHV0IGRhdGEgc3RyZWFtCisgKiBieSBjYWxsaW5nIGNvcnJlc3BvbmRpbmcgcHJvdG9jb2wgaGFuZGxlci4KKyAqLworCitzdGF0aWMgaW50IHBzbW91c2VfaGFuZGxlX2J5dGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXBzbW91c2VfcmV0X3QgcmMgPSBwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyKHBzbW91c2UsIHJlZ3MpOworCisJc3dpdGNoIChyYykgeworCQljYXNlIFBTTU9VU0VfQkFEX0RBVEE6CisJCQlpZiAocHNtb3VzZS0+c3RhdGUgPT0gUFNNT1VTRV9BQ1RJVkFURUQpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJwc21vdXNlLmM6ICVzIGF0ICVzIGxvc3Qgc3luYyBhdCBieXRlICVkXG4iLAorCQkJCQlwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzLCBwc21vdXNlLT5wa3RjbnQpOworCQkJCWlmICgrK3BzbW91c2UtPm91dF9vZl9zeW5jID09IHBzbW91c2UtPnJlc2V0YWZ0ZXIpIHsKKwkJCQkJX19wc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0lHTk9SRSk7CisJCQkJCXByaW50ayhLRVJOX05PVElDRSAicHNtb3VzZS5jOiBpc3N1aW5nIHJlY29ubmVjdCByZXF1ZXN0XG4iKTsKKwkJCQkJc2VyaW9fcmVjb25uZWN0KHBzbW91c2UtPnBzMmRldi5zZXJpbyk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCQlwc21vdXNlLT5wa3RjbnQgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBQU01PVVNFX0ZVTExfUEFDS0VUOgorCQkJcHNtb3VzZS0+cGt0Y250ID0gMDsKKwkJCWlmIChwc21vdXNlLT5vdXRfb2Zfc3luYykgeworCQkJCXBzbW91c2UtPm91dF9vZl9zeW5jID0gMDsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgInBzbW91c2UuYzogJXMgYXQgJXMgLSBkcml2ZXIgcmVzeW5jaGVkLlxuIiwKKwkJCQkJcHNtb3VzZS0+bmFtZSwgcHNtb3VzZS0+cGh5cyk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBTTU9VU0VfR09PRF9EQVRBOgorCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogcHNtb3VzZV9pbnRlcnJ1cHQoKSBoYW5kbGVzIGluY29taW5nIGNoYXJhY3RlcnMsIGVpdGhlciBwYXNzaW5nIHRoZW0KKyAqIGZvciBub3JtYWwgcHJvY2Vzc2luZyBvciBnYXRoZXJpbmcgdGhlbSBhcyBjb21tYW5kIHJlc3BvbnNlLgogICovCiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBwc21vdXNlX2ludGVycnVwdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvLAogCQl1bnNpZ25lZCBjaGFyIGRhdGEsIHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHBzbW91c2UgKnBzbW91c2UgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyk7Ci0JcHNtb3VzZV9yZXRfdCByYzsKIAogCWlmIChwc21vdXNlLT5zdGF0ZSA9PSBQU01PVVNFX0lHTk9SRSkKIAkJZ290byBvdXQ7CkBAIC0yMDgsNjcgKzI4Miw1OCBAQAogCQlpZiAgKHBzMl9oYW5kbGVfcmVzcG9uc2UoJnBzbW91c2UtPnBzMmRldiwgZGF0YSkpCiAJCQlnb3RvIG91dDsKIAotCWlmIChwc21vdXNlLT5zdGF0ZSA9PSBQU01PVVNFX0lOSVRJQUxJWklORykKKwlpZiAocHNtb3VzZS0+c3RhdGUgPD0gUFNNT1VTRV9SRVNZTkNJTkcpCiAJCWdvdG8gb3V0OwogCiAJaWYgKHBzbW91c2UtPnN0YXRlID09IFBTTU9VU0VfQUNUSVZBVEVEICYmCiAJICAgIHBzbW91c2UtPnBrdGNudCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIHBzbW91c2UtPmxhc3QgKyBIWi8yKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwc21vdXNlLmM6ICVzIGF0ICVzIGxvc3Qgc3luY2hyb25pemF0aW9uLCB0aHJvd2luZyAlZCBieXRlcyBhd2F5LlxuIiwKKwkJcHJpbnRrKEtFUk5fSU5GTyAicHNtb3VzZS5jOiAlcyBhdCAlcyBsb3N0IHN5bmNocm9uaXphdGlvbiwgdGhyb3dpbmcgJWQgYnl0ZXMgYXdheS5cbiIsCiAJCSAgICAgICBwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzLCBwc21vdXNlLT5wa3RjbnQpOwotCQlwc21vdXNlLT5wa3RjbnQgPSAwOworCQlwc21vdXNlLT5iYWRieXRlID0gcHNtb3VzZS0+cGFja2V0WzBdOworCQlfX3BzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfUkVTWU5DSU5HKTsKKwkJcXVldWVfd29yayhrcHNtb3VzZWRfd3EsICZwc21vdXNlLT5yZXN5bmNfd29yayk7CisJCWdvdG8gb3V0OwogCX0KIAotCXBzbW91c2UtPmxhc3QgPSBqaWZmaWVzOwogCXBzbW91c2UtPnBhY2tldFtwc21vdXNlLT5wa3RjbnQrK10gPSBkYXRhOwotCi0JaWYgKHBzbW91c2UtPnBhY2tldFswXSA9PSBQU01PVVNFX1JFVF9CQVQpIHsKKy8qCisgKiBDaGVjayBpZiB0aGlzIGlzIGEgbmV3IGRldmljZSBhbm5vdW5jZW1lbnQgKDB4QUEgMHgwMCkKKyAqLworCWlmICh1bmxpa2VseShwc21vdXNlLT5wYWNrZXRbMF0gPT0gUFNNT1VTRV9SRVRfQkFUICYmIHBzbW91c2UtPnBrdGNudCA8PSAyKSkgewogCQlpZiAocHNtb3VzZS0+cGt0Y250ID09IDEpCiAJCQlnb3RvIG91dDsKIAotCQlpZiAocHNtb3VzZS0+cGt0Y250ID09IDIpIHsKLQkJCWlmIChwc21vdXNlLT5wYWNrZXRbMV0gPT0gUFNNT1VTRV9SRVRfSUQpIHsKLQkJCQlwc21vdXNlLT5zdGF0ZSA9IFBTTU9VU0VfSUdOT1JFOwotCQkJCXNlcmlvX3JlY29ubmVjdChzZXJpbyk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlpZiAocHNtb3VzZS0+dHlwZSA9PSBQU01PVVNFX1NZTkFQVElDUykgewotCQkJCS8qIG5laXRoZXIgMHhBQSBub3IgMHgwMCBhcmUgdmFsaWQgZmlyc3QgYnl0ZXMKLQkJCQkgKiBmb3IgYSBwYWNrZXQgaW4gYWJzb2x1dGUgbW9kZQotCQkJCSAqLwotCQkJCXBzbW91c2UtPnBrdGNudCA9IDA7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9CisJCWlmIChwc21vdXNlLT5wYWNrZXRbMV0gPT0gUFNNT1VTRV9SRVRfSUQpIHsKKwkJCV9fcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9JR05PUkUpOworCQkJc2VyaW9fcmVjb25uZWN0KHNlcmlvKTsKKwkJCWdvdG8gb3V0OwogCQl9CisvKgorICogTm90IGEgbmV3IGRldmljZSwgdHJ5IHByb2Nlc3NpbmcgZmlyc3QgYnl0ZSBub3JtYWxseQorICovCisJCXBzbW91c2UtPnBrdGNudCA9IDE7CisJCWlmIChwc21vdXNlX2hhbmRsZV9ieXRlKHBzbW91c2UsIHJlZ3MpKQorCQkJZ290byBvdXQ7CisKKwkJcHNtb3VzZS0+cGFja2V0W3BzbW91c2UtPnBrdGNudCsrXSA9IGRhdGE7CiAJfQogCi0JcmMgPSBwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyKHBzbW91c2UsIHJlZ3MpOwotCi0Jc3dpdGNoIChyYykgewotCQljYXNlIFBTTU9VU0VfQkFEX0RBVEE6Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJwc21vdXNlLmM6ICVzIGF0ICVzIGxvc3Qgc3luYyBhdCBieXRlICVkXG4iLAotCQkJCXBzbW91c2UtPm5hbWUsIHBzbW91c2UtPnBoeXMsIHBzbW91c2UtPnBrdGNudCk7Ci0JCQlwc21vdXNlLT5wa3RjbnQgPSAwOwotCi0JCQlpZiAoKytwc21vdXNlLT5vdXRfb2Zfc3luYyA9PSBwc21vdXNlLT5yZXNldGFmdGVyKSB7Ci0JCQkJcHNtb3VzZS0+c3RhdGUgPSBQU01PVVNFX0lHTk9SRTsKLQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgInBzbW91c2UuYzogaXNzdWluZyByZWNvbm5lY3QgcmVxdWVzdFxuIik7Ci0JCQkJc2VyaW9fcmVjb25uZWN0KHBzbW91c2UtPnBzMmRldi5zZXJpbyk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFBTTU9VU0VfRlVMTF9QQUNLRVQ6Ci0JCQlwc21vdXNlLT5wa3RjbnQgPSAwOwotCQkJaWYgKHBzbW91c2UtPm91dF9vZl9zeW5jKSB7Ci0JCQkJcHNtb3VzZS0+b3V0X29mX3N5bmMgPSAwOwotCQkJCXByaW50ayhLRVJOX05PVElDRSAicHNtb3VzZS5jOiAlcyBhdCAlcyAtIGRyaXZlciByZXN5bmNoZWQuXG4iLAotCQkJCQlwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgUFNNT1VTRV9HT09EX0RBVEE6Ci0JCQlicmVhazsKKy8qCisgKiBTZWUgaWYgd2UgbmVlZCB0byBmb3JjZSByZXN5bmMgYmVjYXVzZSBtb3VzZSB3YXMgaWRsZSBmb3IgdG9vIGxvbmcKKyAqLworCWlmIChwc21vdXNlLT5zdGF0ZSA9PSBQU01PVVNFX0FDVElWQVRFRCAmJgorCSAgICBwc21vdXNlLT5wa3RjbnQgPT0gMSAmJiBwc21vdXNlLT5yZXN5bmNfdGltZSAmJgorCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHBzbW91c2UtPmxhc3QgKyBwc21vdXNlLT5yZXN5bmNfdGltZSAqIEhaKSkgeworCQlwc21vdXNlLT5iYWRieXRlID0gcHNtb3VzZS0+cGFja2V0WzBdOworCQlfX3BzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfUkVTWU5DSU5HKTsKKwkJcXVldWVfd29yayhrcHNtb3VzZWRfd3EsICZwc21vdXNlLT5yZXN5bmNfd29yayk7CisJCWdvdG8gb3V0OwogCX0KLW91dDoKKworCXBzbW91c2UtPmxhc3QgPSBqaWZmaWVzOworCXBzbW91c2VfaGFuZGxlX2J5dGUocHNtb3VzZSwgcmVncyk7CisKKyBvdXQ6CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC03NTIsMjEgKzgxNyw2IEBACiB9CiAKIC8qCi0gKiBwc21vdXNlX3NldF9zdGF0ZSgpIHNldHMgbmV3IHBzbW91c2Ugc3RhdGUgYW5kIHJlc2V0cyBhbGwgZmxhZ3MgYW5kCi0gKiBjb3VudGVycyB3aGlsZSBob2xkaW5nIHNlcmlvIGxvY2sgc28gZmlnaHRpbmcgd2l0aCBpbnRlcnJ1cHQgaGFuZGxlcgotICogaXMgbm90IGEgY29uY2Vybi4KLSAqLwotCi1zdGF0aWMgdm9pZCBwc21vdXNlX3NldF9zdGF0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgZW51bSBwc21vdXNlX3N0YXRlIG5ld19zdGF0ZSkKLXsKLQlzZXJpb19wYXVzZV9yeChwc21vdXNlLT5wczJkZXYuc2VyaW8pOwotCXBzbW91c2UtPnN0YXRlID0gbmV3X3N0YXRlOwotCXBzbW91c2UtPnBrdGNudCA9IHBzbW91c2UtPm91dF9vZl9zeW5jID0gMDsKLQlwc21vdXNlLT5wczJkZXYuZmxhZ3MgPSAwOwotCXNlcmlvX2NvbnRpbnVlX3J4KHBzbW91c2UtPnBzMmRldi5zZXJpbyk7Ci19Ci0KLS8qCiAgKiBwc21vdXNlX2FjdGl2YXRlKCkgZW5hYmxlcyB0aGUgbW91c2Ugc28gdGhhdCB3ZSBnZXQgbW90aW9uIHJlcG9ydHMgZnJvbSBpdC4KICAqLwogCkBAIC03OTQsNiArODQ0LDExMSBAQAogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQ01EX01PREUpOwogfQogCisvKgorICogcHNtb3VzZV9wb2xsKCkgLSBkZWZhdWx0IHBvbGwgaGFubGRlci4gRXZlcnlvbmUgZXhjZXB0IGZvciBBTFBTIHVzZXMgaXQuCisgKi8KKworc3RhdGljIGludCBwc21vdXNlX3BvbGwoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJcmV0dXJuIHBzMl9jb21tYW5kKCZwc21vdXNlLT5wczJkZXYsIHBzbW91c2UtPnBhY2tldCwKKwkJCSAgIFBTTU9VU0VfQ01EX1BPTEwgfCAocHNtb3VzZS0+cGt0c2l6ZSA8PCA4KSk7Cit9CisKKworLyoKKyAqIHBzbW91c2VfcmVzeW5jKCkgYXR0ZW1wdHMgdG8gcmUtdmFsaWRhdGUgY3VycmVudCBwcm90b2NvbC4KKyAqLworCitzdGF0aWMgdm9pZCBwc21vdXNlX3Jlc3luYyh2b2lkICpwKQoreworCXN0cnVjdCBwc21vdXNlICpwc21vdXNlID0gcCwgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IHNlcmlvICpzZXJpbyA9IHBzbW91c2UtPnBzMmRldi5zZXJpbzsKKwlwc21vdXNlX3JldF90IHJjID0gUFNNT1VTRV9HT09EX0RBVEE7CisJaW50IGZhaWxlZCA9IDAsIGVuYWJsZWQgPSAwOworCWludCBpOworCisJZG93bigmcHNtb3VzZV9zZW0pOworCisJaWYgKHBzbW91c2UtPnN0YXRlICE9IFBTTU9VU0VfUkVTWU5DSU5HKQorCQlnb3RvIG91dDsKKworCWlmIChzZXJpby0+cGFyZW50ICYmIHNlcmlvLT5pZC50eXBlID09IFNFUklPX1BTX1BTVEhSVSkgeworCQlwYXJlbnQgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpby0+cGFyZW50KTsKKwkJcHNtb3VzZV9kZWFjdGl2YXRlKHBhcmVudCk7CisJfQorCisvKgorICogU29tZSBtaWNlIGRvbid0IEFDSyBjb21tYW5kcyBzZW50IHdoaWxlIHRoZXkgYXJlIGluIHRoZSBtaWRkbGUgb2YKKyAqIHRyYW5zbWl0dGluZyBtb3Rpb24gcGFja2V0LiBUbyBhdm9pZCBkZWxheSB3ZSB1c2UgcHMyX3NlbmRieXRlKCkKKyAqIGluc3RlYWQgb2YgcHMyX2NvbW1hbmQoKSB3aGljaCB3b3VsZCB3YWl0IGZvciAyMDBtcyBmb3IgYW4gQUNLCisgKiB0aGF0IG1heSBuZXZlciBjb21lLgorICogQXMgYW4gYWRkaXRpb25hbCBxdWlyayBBTFBTIHRvdWNocGFkcyBtYXkgbm90IG9ubHkgZm9yZ2V0IHRvIEFDSworICogZGlzYWJsZSBjb21tYW5kIGJ1dCB3aWxsIHN0b3AgcmVwb3J0aW5nIHRhcHMsIHNvIGlmIHdlIHNlZSB0aGF0CisgKiBtb3VzZSBhdCBsZWFzdCBvbmNlIEFDS3MgZGlzYWJsZSB3ZSB3aWxsIGRvIGZ1bGwgcmVjb25uZWN0IGlmIEFDSworICogaXMgbWlzc2luZy4KKyAqLworCXBzbW91c2UtPm51bV9yZXN5bmNzKys7CisKKwlpZiAocHMyX3NlbmRieXRlKCZwc21vdXNlLT5wczJkZXYsIFBTTU9VU0VfQ01EX0RJU0FCTEUsIDIwKSkgeworCQlpZiAocHNtb3VzZS0+bnVtX3Jlc3luY3MgPCAzIHx8IHBzbW91c2UtPmFja3NfZGlzYWJsZV9jb21tYW5kKQorCQkJZmFpbGVkID0gMTsKKwl9IGVsc2UKKwkJcHNtb3VzZS0+YWNrc19kaXNhYmxlX2NvbW1hbmQgPSAxOworCisvKgorICogUG9sbCB0aGUgbW91c2UuIElmIGl0IHdhcyByZXNldCB0aGUgcGFja2V0IHdpbGwgYmUgc2hvcnRlciB0aGFuCisgKiBwc21vdXNlLT5wa3RzaXplIGFuZCBwczJfY29tbWFuZCB3aWxsIGZhaWwuIFdlIGRvIG5vdCBleHBlY3QgYW5kCisgKiBkbyBub3QgaGFuZGxlIHNjZW5hcmlvIHdoZW4gbW91c2UgInVwZ3JhZGVzIiBpdHMgcHJvdG9jb2wgd2hpbGUKKyAqIGRpc2Nvbm5lY3RlZCBzaW5jZSBpdCB3b3VsZCByZXF1aXJlIGFkZGl0aW9uYWwgZGVsYXkuIElmIHdlIGV2ZXIKKyAqIHNlZSBhIG1vdXNlIHRoYXQgZG9lcyBpdCB3ZSdsbCBhZGp1c3QgdGhlIGNvZGUuCisgKi8KKwlpZiAoIWZhaWxlZCkgeworCQlpZiAocHNtb3VzZS0+cG9sbChwc21vdXNlKSkKKwkJCWZhaWxlZCA9IDE7CisJCWVsc2UgeworCQkJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9DTURfTU9ERSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgcHNtb3VzZS0+cGt0c2l6ZTsgaSsrKSB7CisJCQkJcHNtb3VzZS0+cGt0Y250Kys7CisJCQkJcmMgPSBwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyKHBzbW91c2UsIE5VTEwpOworCQkJCWlmIChyYyAhPSBQU01PVVNFX0dPT0RfREFUQSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocmMgIT0gUFNNT1VTRV9GVUxMX1BBQ0tFVCkKKwkJCQlmYWlsZWQgPSAxOworCQkJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9SRVNZTkNJTkcpOworCQl9CisJfQorLyoKKyAqIE5vdyB0cnkgdG8gZW5hYmxlIG1vdXNlLiBXZSB0cnkgdG8gZG8gdGhhdCBldmVuIGlmIHBvbGwgZmFpbGVkIGFuZCBhbHNvCisgKiByZXBlYXQgb3VyIGF0dGVtcHRzIDUgdGltZXMsIG90aGVyd2lzZSB3ZSBtYXkgYmUgbGVmdCBvdXQgd2l0aCBkaXNhYmxlZAorICogbW91c2UuCisgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWlmICghcHMyX2NvbW1hbmQoJnBzbW91c2UtPnBzMmRldiwgTlVMTCwgUFNNT1VTRV9DTURfRU5BQkxFKSkgeworCQkJZW5hYmxlZCA9IDE7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMjAwKTsKKwl9CisKKwlpZiAoIWVuYWJsZWQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiBmYWlsZWQgdG8gcmUtZW5hYmxlIG1vdXNlIG9uICVzXG4iLAorCQkJcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5waHlzKTsKKwkJZmFpbGVkID0gMTsKKwl9CisKKwlpZiAoZmFpbGVkKSB7CisJCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfSUdOT1JFKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicHNtb3VzZS5jOiByZXN5bmMgZmFpbGVkLCBpc3N1aW5nIHJlY29ubmVjdCByZXF1ZXN0XG4iKTsKKwkJc2VyaW9fcmVjb25uZWN0KHNlcmlvKTsKKwl9IGVsc2UKKwkJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9BQ1RJVkFURUQpOworCisJaWYgKHBhcmVudCkKKwkJcHNtb3VzZV9hY3RpdmF0ZShwYXJlbnQpOworIG91dDoKKwl1cCgmcHNtb3VzZV9zZW0pOworfQogCiAvKgogICogcHNtb3VzZV9jbGVhbnVwKCkgcmVzZXRzIHRoZSBtb3VzZSBpbnRvIHBvd2VyLW9uIHN0YXRlLgpAQCAtODIyLDYgKzk3NywxMSBAQAogCiAJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9DTURfTU9ERSk7CiAKKwkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBhIHJlc3luYyBpbiBwcm9ncmVzcyAqLworCXVwKCZwc21vdXNlX3NlbSk7CisJZmx1c2hfd29ya3F1ZXVlKGtwc21vdXNlZF93cSk7CisJZG93bigmcHNtb3VzZV9zZW0pOworCiAJaWYgKHNlcmlvLT5wYXJlbnQgJiYgc2VyaW8tPmlkLnR5cGUgPT0gU0VSSU9fUFNfUFNUSFJVKSB7CiAJCXBhcmVudCA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvLT5wYXJlbnQpOwogCQlwc21vdXNlX2RlYWN0aXZhdGUocGFyZW50KTsKQEAgLTg1OSw2ICsxMDE5LDcgQEAKIAogCXBzbW91c2UtPnNldF9yYXRlID0gcHNtb3VzZV9zZXRfcmF0ZTsKIAlwc21vdXNlLT5zZXRfcmVzb2x1dGlvbiA9IHBzbW91c2Vfc2V0X3Jlc29sdXRpb247CisJcHNtb3VzZS0+cG9sbCA9IHBzbW91c2VfcG9sbDsKIAlwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyID0gcHNtb3VzZV9wcm9jZXNzX2J5dGU7CiAJcHNtb3VzZS0+cGt0c2l6ZSA9IDM7CiAKQEAgLTg3NCw2ICsxMDM1LDIzIEBACiAJZWxzZQogCQlwc21vdXNlLT50eXBlID0gcHNtb3VzZV9leHRlbnNpb25zKHBzbW91c2UsIHBzbW91c2VfbWF4X3Byb3RvLCAxKTsKIAorCS8qCisJICogSWYgbW91c2UncyBwYWNrZXQgc2l6ZSBpcyAzIHRoZXJlIGlzIG5vIHBvaW50IGluIHBvbGxpbmcgdGhlCisJICogZGV2aWNlIGluIGhvcGVzIHRvIGRldGVjdCBwcm90b2NvbCByZXNldCAtIHdlIHdvbid0IGdldCBsZXNzCisJICogdGhhbiAzIGJ5dGVzIHJlc3BvbnNlIGFueWhvdy4KKwkgKi8KKwlpZiAocHNtb3VzZS0+cGt0c2l6ZSA9PSAzKQorCQlwc21vdXNlLT5yZXN5bmNfdGltZSA9IDA7CisKKwkvKgorCSAqIFNvbWUgc21hcnQgS1ZNcyBmYWtlIHJlc3BvbnNlIHRvIFBPTEwgY29tbWFuZCByZXR1cm5pbmcganVzdAorCSAqIDMgYnl0ZXMgYW5kIG1lc3NpbmcgdXAgb3VyIHJlc3luYyBsb2dpYywgc28gaWYgaW5pdGlhbCBwb2xsCisJICogZmFpbHMgd2Ugd29uJ3QgdHJ5IHBvbGxpbmcgdGhlIGRldmljZSBhbnltb3JlLiBIb3BlZnVsbHkKKwkgKiBzdWNoIEtWTSB3aWxsIG1haW50YWluIGluaXRpYWxseSBzZWxlY3RlZCBwcm90b2NvbC4KKwkgKi8KKwlpZiAocHNtb3VzZS0+cmVzeW5jX3RpbWUgJiYgcHNtb3VzZS0+cG9sbChwc21vdXNlKSkKKwkJcHNtb3VzZS0+cmVzeW5jX3RpbWUgPSAwOworCiAJc3ByaW50Zihwc21vdXNlLT5kZXZuYW1lLCAiJXMgJXMgJXMiLAogCQlwc21vdXNlX3Byb3RvY29sX2J5X3R5cGUocHNtb3VzZS0+dHlwZSktPm5hbWUsIHBzbW91c2UtPnZlbmRvciwgcHNtb3VzZS0+bmFtZSk7CiAKQEAgLTkxNCw2ICsxMDkyLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlwczJfaW5pdCgmcHNtb3VzZS0+cHMyZGV2LCBzZXJpbyk7CisJSU5JVF9XT1JLKCZwc21vdXNlLT5yZXN5bmNfd29yaywgcHNtb3VzZV9yZXN5bmMsIHBzbW91c2UpOwogCXBzbW91c2UtPmRldiA9IGlucHV0X2RldjsKIAlzcHJpbnRmKHBzbW91c2UtPnBoeXMsICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CiAKQEAgLTkzNCw2ICsxMTEzLDcgQEAKIAlwc21vdXNlLT5yYXRlID0gcHNtb3VzZV9yYXRlOwogCXBzbW91c2UtPnJlc29sdXRpb24gPSBwc21vdXNlX3Jlc29sdXRpb247CiAJcHNtb3VzZS0+cmVzZXRhZnRlciA9IHBzbW91c2VfcmVzZXRhZnRlcjsKKwlwc21vdXNlLT5yZXN5bmNfdGltZSA9IHBhcmVudCA/IDAgOiBwc21vdXNlX3Jlc3luY190aW1lOwogCXBzbW91c2UtPnNtYXJ0c2Nyb2xsID0gcHNtb3VzZV9zbWFydHNjcm9sbDsKIAogCXBzbW91c2Vfc3dpdGNoX3Byb3RvY29sKHBzbW91c2UsIE5VTEwpOwpAQCAtMTI3OCwxMyArMTQ1OCwyMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwc21vdXNlX2luaXQodm9pZCkKIHsKKwlrcHNtb3VzZWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia3BzbW91c2VkIik7CisJaWYgKCFrcHNtb3VzZWRfd3EpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwc21vdXNlOiBmYWlsZWQgdG8gY3JlYXRlIGtwc21vdXNlZCB3b3JrcXVldWVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnBzbW91c2VfZHJ2KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcHNtb3VzZV9leGl0KHZvaWQpCiB7CiAJc2VyaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnBzbW91c2VfZHJ2KTsKKwlkZXN0cm95X3dvcmtxdWV1ZShrcHNtb3VzZWRfd3EpOwogfQogCiBtb2R1bGVfaW5pdChwc21vdXNlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmggYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UuaAppbmRleCA3YzQxOTJiLi40ZDkxMDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UuaAorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UuaApAQCAtNyw3ICs3LDcgQEAKICNkZWZpbmUgUFNNT1VTRV9DTURfR0VUSU5GTwkweDAzZTkKICNkZWZpbmUgUFNNT1VTRV9DTURfU0VUU1RSRUFNCTB4MDBlYQogI2RlZmluZSBQU01PVVNFX0NNRF9TRVRQT0xMCTB4MDBmMAotI2RlZmluZSBQU01PVVNFX0NNRF9QT0xMCTB4MDNlYgorI2RlZmluZSBQU01PVVNFX0NNRF9QT0xMCTB4MDBlYgkvKiBjYWxsZXIgc2V0cyBudW1iZXIgb2YgYnl0ZXMgdG8gcmVjZWl2ZSAqLwogI2RlZmluZSBQU01PVVNFX0NNRF9HRVRJRAkweDAyZjIKICNkZWZpbmUgUFNNT1VTRV9DTURfU0VUUkFURQkweDEwZjMKICNkZWZpbmUgUFNNT1VTRV9DTURfRU5BQkxFCTB4MDBmNApAQCAtMjMsNiArMjMsNyBAQAogZW51bSBwc21vdXNlX3N0YXRlIHsKIAlQU01PVVNFX0lHTk9SRSwKIAlQU01PVVNFX0lOSVRJQUxJWklORywKKwlQU01PVVNFX1JFU1lOQ0lORywKIAlQU01PVVNFX0NNRF9NT0RFLAogCVBTTU9VU0VfQUNUSVZBVEVELAogfTsKQEAgLTM4LDE1ICszOSwxOSBAQAogCXZvaWQgKnByaXZhdGU7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2OwogCXN0cnVjdCBwczJkZXYgcHMyZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXN5bmNfd29yazsKIAljaGFyICp2ZW5kb3I7CiAJY2hhciAqbmFtZTsKIAl1bnNpZ25lZCBjaGFyIHBhY2tldFs4XTsKKwl1bnNpZ25lZCBjaGFyIGJhZGJ5dGU7CiAJdW5zaWduZWQgY2hhciBwa3RjbnQ7CiAJdW5zaWduZWQgY2hhciBwa3RzaXplOwogCXVuc2lnbmVkIGNoYXIgdHlwZTsKKwl1bnNpZ25lZCBjaGFyIGFja3NfZGlzYWJsZV9jb21tYW5kOwogCXVuc2lnbmVkIGludCBtb2RlbDsKIAl1bnNpZ25lZCBsb25nIGxhc3Q7CiAJdW5zaWduZWQgbG9uZyBvdXRfb2Zfc3luYzsKKwl1bnNpZ25lZCBsb25nIG51bV9yZXN5bmNzOwogCWVudW0gcHNtb3VzZV9zdGF0ZSBzdGF0ZTsKIAljaGFyIGRldm5hbWVbNjRdOwogCWNoYXIgcGh5c1szMl07CkBAIC01NCw2ICs1OSw3IEBACiAJdW5zaWduZWQgaW50IHJhdGU7CiAJdW5zaWduZWQgaW50IHJlc29sdXRpb247CiAJdW5zaWduZWQgaW50IHJlc2V0YWZ0ZXI7CisJdW5zaWduZWQgaW50IHJlc3luY190aW1lOwogCXVuc2lnbmVkIGludCBzbWFydHNjcm9sbDsJLyogTG9naXRlY2ggb25seSAqLwogCiAJcHNtb3VzZV9yZXRfdCAoKnByb3RvY29sX2hhbmRsZXIpKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CkBAIC02Miw2ICs2OCw3IEBACiAKIAlpbnQgKCpyZWNvbm5lY3QpKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKTsKIAl2b2lkICgqZGlzY29ubmVjdCkoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpOworCWludCAoKnBvbGwpKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKTsKIAogCXZvaWQgKCpwdF9hY3RpdmF0ZSkoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpOwogCXZvaWQgKCpwdF9kZWFjdGl2YXRlKShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYwppbmRleCA5N2NkZmQ2Li4yMDUxYmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKQEAgLTY1Miw2ICs2NTIsOCBAQAogCXBzbW91c2UtPmRpc2Nvbm5lY3QgPSBzeW5hcHRpY3NfZGlzY29ubmVjdDsKIAlwc21vdXNlLT5yZWNvbm5lY3QgPSBzeW5hcHRpY3NfcmVjb25uZWN0OwogCXBzbW91c2UtPnBrdHNpemUgPSA2OworCS8qIFN5bmFwdGljcyBjYW4gdXN1YWxseSBzdGF5IGluIHN5bmMgd2l0aG91dCBleHRyYSBoZWxwICovCisJcHNtb3VzZS0+cmVzeW5jX3RpbWUgPSAwOwogCiAJaWYgKFNZTl9DQVBfUEFTU19USFJPVUdIKHByaXYtPmNhcGFiaWxpdGllcykpCiAJCXN5bmFwdGljc19wdF9jcmVhdGUocHNtb3VzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaAppbmRleCAyZDJmOWZiLi5hNGM2ZjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKQEAgLTE3Myw2ICsxNzMsMTMgQEAKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUEMtTU0yMCBTZXJpZXMiKSwKIAkJfSwKIAl9LAorCXsKKwkJLmlkZW50ID0gIlNvbnkgVmFpbyBGUy0xMTViIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTb255IENvcnBvcmF0aW9uIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi1GUzExNUIiKSwKKwkJfSwKKwl9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCmluZGV4IDhlNTMwY2MuLjJmNzY4MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKQEAgLTU5LDkgKzU5LDcgQEAKIAogc3RhdGljIExJU1RfSEVBRChzZXJpb19saXN0KTsKIAotc3RhdGljIHN0cnVjdCBidXNfdHlwZSBzZXJpb19idXMgPSB7Ci0JLm5hbWUgPQkic2VyaW8iLAotfTsKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgc2VyaW9fYnVzOwogCiBzdGF0aWMgdm9pZCBzZXJpb19hZGRfcG9ydChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKTsKIHN0YXRpYyB2b2lkIHNlcmlvX2Rlc3Ryb3lfcG9ydChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKTsKQEAgLTc1MCwxMSArNzQ4LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgc2VyaW9fYnVzID0geworCS5uYW1lID0JInNlcmlvIiwKKwkucHJvYmUgPSBzZXJpb19kcml2ZXJfcHJvYmUsCisJLnJlbW92ZSA9IHNlcmlvX2RyaXZlcl9yZW1vdmUsCit9OworCiB2b2lkIF9fc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIpCiB7CiAJZHJ2LT5kcml2ZXIuYnVzID0gJnNlcmlvX2J1czsKLQlkcnYtPmRyaXZlci5wcm9iZSA9IHNlcmlvX2RyaXZlcl9wcm9iZTsKLQlkcnYtPmRyaXZlci5yZW1vdmUgPSBzZXJpb19kcml2ZXJfcmVtb3ZlOwogCiAJc2VyaW9fcXVldWVfZXZlbnQoZHJ2LCBvd25lciwgU0VSSU9fUkVHSVNURVJfRFJJVkVSKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwppbmRleCAyMWQ1NWVkLi4yYzY3NDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCkBAIC0xMSw2ICsxMSwxOSBAQAogCiBpZiBJTlBVVF9UT1VDSFNDUkVFTgogCitjb25maWcgVE9VQ0hTQ1JFRU5fQURTNzg0NgorCXRyaXN0YXRlICJBRFMgNzg0NiBiYXNlZCB0b3VjaHNjcmVlbnMiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIHRvdWNoc2NyZWVuIGludGVyZmFjZSB1c2luZyB0aGUKKwkgIEFEUzc4NDYgY29udHJvbGxlciwgYW5kIHlvdXIgYm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKwkgIGNvZGUgaW5jbHVkZXMgdGhhdCBpbiBpdHMgdGFibGUgb2YgU1BJIGRldmljZXMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4gKGJ1dCBpdCdzIHNhZmUgdG8gc2F5ICJZIikuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkczc4NDYuCisKIGNvbmZpZyBUT1VDSFNDUkVFTl9CSVRTWQogCXRyaXN0YXRlICJDb21wYXEgaVBBUSBIMzYwMCAoQml0c3kpIHRvdWNoc2NyZWVuIgogCWRlcGVuZHMgb24gU0ExMTAwX0JJVFNZCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQppbmRleCA2ODQyODY5Li41ZTU1NTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKQEAgLTQsNiArNCw3IEBACiAKICMgRWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBlbmFibGVzIGEgbGlzdCBvZiBmaWxlcy4KIAorb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDYpCSs9IGFkczc4NDYubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0JJVFNZKQkrPSBoMzYwMF90c19pbnB1dC5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fQ09SR0kpCSs9IGNvcmdpX3RzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSkJKz0gZ3VuemUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDhjNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKQEAgLTAsMCArMSw2MjUgQEAKKy8qCisgKiBBRFM3ODQ2IGJhc2VkIHRvdWNoc2NyZWVuIGFuZCBzZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIEJyb3duZWxsCisgKgorICogVXNpbmcgY29kZSBmcm9tOgorICogIC0gY29yZ2lfdHMuYworICoJQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgUmljaGFyZCBQdXJkaWUKKyAqICAtIG9tYXBfdHMuW2hjXSwgYWRzNzg0Ni5oLCB0c19vc2suYworICoJQ29weXJpZ2h0IChDKSAyMDAyIE1vbnRhVmlzdGEgU29mdHdhcmUKKyAqCUNvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICoJQ29weXJpZ2h0IChDKSAyMDA1IERpcmsgQmVobWUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9hZHM3ODQ2Lmg+CisKKyNpZmRlZglDT05GSUdfQVJNCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpZmRlZglDT05GSUdfQVJDSF9PTUFQCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2VuZGlmCisKKyNlbHNlCisjZGVmaW5lCXNldF9pcnFfdHlwZShpcnEsdHlwZSkJZG97fXdoaWxlKDApCisjZW5kaWYKKworCisvKgorICogVGhpcyBjb2RlIGhhcyBiZWVuIGxpZ2h0bHkgdGVzdGVkIG9uIGFuIGFkczc4NDYuCisgKiBTdXBwb3J0IGZvciBhZHM3ODQzIGFuZCBhZHM3ODQ1IGhhcyBvbmx5IGJlZW4gc3R1YmJlZCBpbi4KKyAqCisgKiBOb3QgeWV0IGRvbmU6ICBpbnZlc3RpZ2F0ZSB0aGUgdmFsdWVzIHJlcG9ydGVkLiAgQXJlIHgveS9wcmVzc3VyZQorICogZXZlbnQgdmFsdWVzIHNhbmUgZW5vdWdoIGZvciBYMTE/ICBIb3cgYWNjdXJhdGUgYXJlIHRoZSB0ZW1wZXJhdHVyZQorICogYW5kIHZvbHRhZ2UgcmVhZGluZ3M/ICAoU3lzdGVtLXNwZWNpZmljIGNhbGlicmF0aW9uIHNob3VsZCBzdXBwb3J0CisgKiBhY2N1cmFjeSBvZiAwLjMgZGVncmVlcyBDOyBvdGhlcndpc2UgaXQncyAyLjAgZGVncmVlcy4pCisgKgorICogYXBwIG5vdGUgc2JhYTAzNiB0YWxrcyBpbiBtb3JlIGRldGFpbCBhYm91dCBhY2N1cmF0ZSBzYW1wbGluZy4uLgorICogdGhhdCBvdWdodCB0byBoZWxwIGluIHNpdHVhdGlvbnMgbGlrZSBMQ0RzIGluZHVjaW5nIG5vaXNlICh3aGljaAorICogY2FuIGFsc28gYmUgaGVscGVkIGJ5IHVzaW5nIHN5bmNoIHNpZ25hbHMpIGFuZCBtb3JlIGdlbmVyYWxseS4KKyAqLworCisjZGVmaW5lCVRTX1BPTExfUEVSSU9ECW1zZWNzX3RvX2ppZmZpZXMoMTApCisKK3N0cnVjdCB0c19ldmVudCB7CisJLyogRm9yIHBvcnRhYmlsaXR5LCB3ZSBjYW4ndCByZWFkIDEyIGJpdCB2YWx1ZXMgdXNpbmcgU1BJICh3aGljaAorCSAqIHdvdWxkIG1ha2UgdGhlIGNvbnRyb2xsZXIgZGVsaXZlciB0aGVtIGFzIG5hdGl2ZSBieXRlb3JkZXIgdTE2CisJICogd2l0aCBtc2JzIHplcm9lZCkuICBJbnN0ZWFkLCB3ZSByZWFkIHRoZW0gYXMgdHdvIDgtYnl0ZSB2YWx1ZXMsCisJICogd2hpY2ggbmVlZCBieXRlc3dhcHBpbmcgdGhlbiByYW5nZSBhZGp1c3RtZW50LgorCSAqLworCV9fYmUxNiB4OworCV9fYmUxNiB5OworCV9fYmUxNiB6MSwgejI7Cit9OworCitzdHJ1Y3QgYWRzNzg0NiB7CisJc3RydWN0IGlucHV0X2RldglpbnB1dDsKKwljaGFyCQkJcGh5c1szMl07CisKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCXUxNgkJCW1vZGVsOworCXUxNgkJCXZyZWZfZGVsYXlfdXNlY3M7CisJdTE2CQkJeF9wbGF0ZV9vaG1zOworCisJc3RydWN0IHRzX2V2ZW50CQl0YzsKKworCXN0cnVjdCBzcGlfdHJhbnNmZXIJeGZlcls4XTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbXNnOworCisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsJCS8qIFA6IGxvY2sgKi8KKwl1bnNpZ25lZAkJcGVuZG93bjoxOwkvKiBQOiBsb2NrICovCisJdW5zaWduZWQJCXBlbmRpbmc6MTsJLyogUDogbG9jayAqLworLy8gRklYTUUgcmVtb3ZlICJpcnFfZGlzYWJsZWQiCisJdW5zaWduZWQJCWlycV9kaXNhYmxlZDoxOwkvKiBQOiBsb2NrICovCit9OworCisvKiBsZWF2ZSBjaGlwIHNlbGVjdGVkIHdoZW4gd2UncmUgZG9uZSwgZm9yIHF1aWNrZXIgcmUtc2VsZWN0PyAqLworI2lmCTAKKyNkZWZpbmUJQ1NfQ0hBTkdFKHhmZXIpCSgoeGZlcikuY3NfY2hhbmdlID0gMSkKKyNlbHNlCisjZGVmaW5lCUNTX0NIQU5HRSh4ZmVyKQkoKHhmZXIpLmNzX2NoYW5nZSA9IDApCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoZSBBRFM3ODQ2IGhhcyB0b3VjaHNjcmVlbiBhbmQgb3RoZXIgc2Vuc29ycy4KKyAqIEVhcmxpZXIgYWRzNzg0eCBjaGlwcyBhcmUgc29tZXdoYXQgY29tcGF0aWJsZS4KKyAqLworI2RlZmluZQlBRFNfU1RBUlQJCSgxIDw8IDcpCisjZGVmaW5lCUFEU19BMkExQTBfZF95CQkoMSA8PCA0KQkvKiBkaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUJQURTX0EyQTFBMF9kX3oxCQkoMyA8PCA0KQkvKiBkaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUJQURTX0EyQTFBMF9kX3oyCQkoNCA8PCA0KQkvKiBkaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUJQURTX0EyQTFBMF9kX3gJCSg1IDw8IDQpCS8qIGRpZmZlcmVudGlhbCAqLworI2RlZmluZQlBRFNfQTJBMUEwX3RlbXAwCSgwIDw8IDQpCS8qIG5vbi1kaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUJQURTX0EyQTFBMF92YmF0dAkoMiA8PCA0KQkvKiBub24tZGlmZmVyZW50aWFsICovCisjZGVmaW5lCUFEU19BMkExQTBfdmF1eAkJKDYgPDwgNCkJLyogbm9uLWRpZmZlcmVudGlhbCAqLworI2RlZmluZQlBRFNfQTJBMUEwX3RlbXAxCSg3IDw8IDQpCS8qIG5vbi1kaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUJQURTXzhfQklUCQkoMSA8PCAzKQorI2RlZmluZQlBRFNfMTJfQklUCQkoMCA8PCAzKQorI2RlZmluZQlBRFNfU0VSCQkJKDEgPDwgMikJLyogbm9uLWRpZmZlcmVudGlhbCAqLworI2RlZmluZQlBRFNfREZSCQkJKDAgPDwgMikJLyogZGlmZmVyZW50aWFsICovCisjZGVmaW5lCUFEU19QRDEwX1BET1dOCQkoMCA8PCAwKQkvKiBsb3dwb3dlciBtb2RlICsgcGVuaXJxICovCisjZGVmaW5lCUFEU19QRDEwX0FEQ19PTgkJKDEgPDwgMCkJLyogQURDIG9uICovCisjZGVmaW5lCUFEU19QRDEwX1JFRl9PTgkJKDIgPDwgMCkJLyogdlJFRiBvbiArIHBlbmlycSAqLworI2RlZmluZQlBRFNfUEQxMF9BTExfT04JCSgzIDw8IDApCS8qIEFEQyArIHZSRUYgb24gKi8KKworI2RlZmluZQlNQVhfMTJCSVQJKCgxPDwxMiktMSkKKworLyogbGVhdmUgQURDIHBvd2VyZWQgdXAgKGRpc2FibGVzIHBlbmlycSkgYmV0d2VlbiBkaWZmZXJlbnRpYWwgc2FtcGxlcyAqLworI2RlZmluZQlSRUFEXzEyQklUX0RGUih4KSAoQURTX1NUQVJUIHwgQURTX0EyQTFBMF9kXyAjIyB4IFwKKwl8IEFEU18xMl9CSVQgfCBBRFNfREZSKQorCitzdGF0aWMgY29uc3QgdTgJcmVhZF95ICA9IFJFQURfMTJCSVRfREZSKHkpICB8IEFEU19QRDEwX0FEQ19PTjsKK3N0YXRpYyBjb25zdCB1OAlyZWFkX3oxID0gUkVBRF8xMkJJVF9ERlIoejEpIHwgQURTX1BEMTBfQURDX09OOworc3RhdGljIGNvbnN0IHU4CXJlYWRfejIgPSBSRUFEXzEyQklUX0RGUih6MikgfCBBRFNfUEQxMF9BRENfT047CitzdGF0aWMgY29uc3QgdTgJcmVhZF94ICA9IFJFQURfMTJCSVRfREZSKHgpICB8IEFEU19QRDEwX1BET1dOOwkvKiBMQVNUICovCisKKy8qIHNpbmdsZS1lbmRlZCBzYW1wbGVzIG5lZWQgdG8gZmlyc3QgcG93ZXIgdXAgcmVmZXJlbmNlIHZvbHRhZ2U7CisgKiB3ZSBsZWF2ZSBib3RoIEFEQyBhbmQgVlJFRiBwb3dlcmVkCisgKi8KKyNkZWZpbmUJUkVBRF8xMkJJVF9TRVIoeCkgKEFEU19TVEFSVCB8IEFEU19BMkExQTBfICMjIHggXAorCXwgQURTXzEyX0JJVCB8IEFEU19TRVIpCisKK3N0YXRpYyBjb25zdCB1OAlyZWZfb24gPSBSRUFEXzEyQklUX0RGUih4KSB8IEFEU19QRDEwX0FMTF9PTjsKK3N0YXRpYyBjb25zdCB1OAlyZWZfb2ZmID0gUkVBRF8xMkJJVF9ERlIoeSkgfCBBRFNfUEQxMF9QRE9XTjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBOb24tdG91Y2hzY3JlZW4gc2Vuc29ycyBvbmx5IHVzZSBzaW5nbGUtZW5kZWQgY29udmVyc2lvbnMuCisgKi8KKworc3RydWN0IHNlcl9yZXEgeworCXU4CQkJY29tbWFuZDsKKwl1MTYJCQlzY3JhdGNoOworCV9fYmUxNgkJCXNhbXBsZTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJeGZlcls2XTsKK307CisKK3N0YXRpYyBpbnQgYWRzNzg0Nl9yZWFkMTJfc2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY29tbWFuZCkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXN0cnVjdCBhZHM3ODQ2CQkqdHMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc2VyX3JlcQkJKnJlcSA9IGt6YWxsb2Moc2l6ZW9mICpyZXEsIFNMQUJfS0VSTkVMKTsKKwlpbnQJCQlzdGF0dXM7CisJaW50CQkJc2FtcGxlOworCWludCAJCQlpOworCisJaWYgKCFyZXEpCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+bXNnLnRyYW5zZmVycyk7CisKKwkvKiBhY3RpdmF0ZSByZWZlcmVuY2UsIHNvIGl0IGhhcyB0aW1lIHRvIHNldHRsZTsgKi8KKwlyZXEtPnhmZXJbMF0udHhfYnVmID0gJnJlZl9vbjsKKwlyZXEtPnhmZXJbMF0ubGVuID0gMTsKKwlyZXEtPnhmZXJbMV0ucnhfYnVmID0gJnJlcS0+c2NyYXRjaDsKKwlyZXEtPnhmZXJbMV0ubGVuID0gMjsKKworCS8qCisJICogZm9yIGV4dGVybmFsIFZSRUYsIDAgdXNlYyAoYW5kIGFzc3VtZSBpdCdzIGFsd2F5cyBvbik7CisJICogZm9yIDF1RiwgdXNlIDgwMCB1c2VjOworCSAqIG5vIGNhcCwgMTAwIHVzZWMuCisJICovCisJcmVxLT54ZmVyWzFdLmRlbGF5X3VzZWNzID0gdHMtPnZyZWZfZGVsYXlfdXNlY3M7CisKKwkvKiB0YWtlIHNhbXBsZSAqLworCXJlcS0+Y29tbWFuZCA9ICh1OCkgY29tbWFuZDsKKwlyZXEtPnhmZXJbMl0udHhfYnVmID0gJnJlcS0+Y29tbWFuZDsKKwlyZXEtPnhmZXJbMl0ubGVuID0gMTsKKwlyZXEtPnhmZXJbM10ucnhfYnVmID0gJnJlcS0+c2FtcGxlOworCXJlcS0+eGZlclszXS5sZW4gPSAyOworCisJLyogUkVWSVNJVDogIHRha2UgYSBmZXcgbW9yZSBzYW1wbGVzLCBhbmQgY29tcGFyZSAuLi4gKi8KKworCS8qIHR1cm4gb2ZmIHJlZmVyZW5jZSAqLworCXJlcS0+eGZlcls0XS50eF9idWYgPSAmcmVmX29mZjsKKwlyZXEtPnhmZXJbNF0ubGVuID0gMTsKKwlyZXEtPnhmZXJbNV0ucnhfYnVmID0gJnJlcS0+c2NyYXRjaDsKKwlyZXEtPnhmZXJbNV0ubGVuID0gMjsKKworCUNTX0NIQU5HRShyZXEtPnhmZXJbNV0pOworCisJLyogZ3JvdXAgYWxsIHRoZSB0cmFuc2ZlcnMgdG9nZXRoZXIsIHNvIHdlIGNhbid0IGludGVyZmVyZSB3aXRoCisJICogcmVhZGluZyB0b3VjaHNjcmVlbiBzdGF0ZTsgZGlzYWJsZSBwZW5pcnEgd2hpbGUgc2FtcGxpbmcKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmcmVxLT54ZmVyW2ldLCAmcmVxLT5tc2cpOworCisJZGlzYWJsZV9pcnEoc3BpLT5pcnEpOworCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJnJlcS0+bXNnKTsKKwllbmFibGVfaXJxKHNwaS0+aXJxKTsKKworCWlmIChyZXEtPm1zZy5zdGF0dXMpCisJCXN0YXR1cyA9IHJlcS0+bXNnLnN0YXR1czsKKwlzYW1wbGUgPSBiZTE2X3RvX2NwdShyZXEtPnNhbXBsZSk7CisJc2FtcGxlID0gc2FtcGxlID4+IDQ7CisJa2ZyZWUocmVxKTsKKworCXJldHVybiBzdGF0dXMgPyBzdGF0dXMgOiBzYW1wbGU7Cit9CisKKyNkZWZpbmUgU0hPVyhuYW1lKSBzdGF0aWMgc3NpemVfdCBcCituYW1lICMjIF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3NpemVfdCB2ID0gYWRzNzg0Nl9yZWFkMTJfc2VyKGRldiwgXAorCQkJUkVBRF8xMkJJVF9TRVIobmFtZSkgfCBBRFNfUEQxMF9BTExfT04pOyBcCisJaWYgKHYgPCAwKSBcCisJCXJldHVybiB2OyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsICh1bnNpZ25lZCkgdik7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIG5hbWUgIyMgX3Nob3csIE5VTEwpOworCitTSE9XKHRlbXAwKQorU0hPVyh0ZW1wMSkKK1NIT1codmF1eCkKK1NIT1codmJhdHQpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogUEVOSVJRIG9ubHkga2lja3MgdGhlIHRpbWVyLiAgVGhlIHRpbWVyIG9ubHkgcmVpc3N1ZXMgdGhlIFNQSSB0cmFuc2ZlciwKKyAqIHRvIHJldHJpZXZlIHRvdWNoc2NyZWVuIHN0YXR1cy4KKyAqCisgKiBUaGUgU1BJIHRyYW5zZmVyIGNvbXBsZXRpb24gY2FsbGJhY2sgZG9lcyB0aGUgcmVhbCB3b3JrLiAgSXQgcmVwb3J0cworICogdG91Y2hzY3JlZW4gZXZlbnRzIGFuZCByZWFjdGl2YXRlcyB0aGUgdGltZXIgKG9yIElSUSkgYXMgYXBwcm9wcmlhdGUuCisgKi8KKworc3RhdGljIHZvaWQgYWRzNzg0Nl9yeCh2b2lkICphZHMpCit7CisJc3RydWN0IGFkczc4NDYJKnRzID0gYWRzOworCXVuc2lnbmVkCVJ0OworCXVuc2lnbmVkCXN5bmMgPSAwOworCXUxNgkJeCwgeSwgejEsIHoyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwkvKiBhZGp1c3Q6ICAxMiBiaXQgc2FtcGxlcyAobGVmdCBhbGlnbmVkKSwgYnVpbHQgZnJvbQorCSAqIHR3byA4IGJpdCB2YWx1ZXMgd3JpdGVuIG1zYi1maXJzdC4KKwkgKi8KKwl4ID0gYmUxNl90b19jcHUodHMtPnRjLngpID4+IDQ7CisJeSA9IGJlMTZfdG9fY3B1KHRzLT50Yy55KSA+PiA0OworCXoxID0gYmUxNl90b19jcHUodHMtPnRjLnoxKSA+PiA0OworCXoyID0gYmUxNl90b19jcHUodHMtPnRjLnoyKSA+PiA0OworCisJLyogcmFuZ2UgZmlsdGVyaW5nICovCisJaWYgKHggPT0gTUFYXzEyQklUKQorCQl4ID0gMDsKKworCWlmICh4ICYmIHoxICYmIHRzLT5zcGktPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9PTikgeworCQkvKiBjb21wdXRlIHRvdWNoIHByZXNzdXJlIHJlc2lzdGFuY2UgdXNpbmcgZXF1YXRpb24gIzIgKi8KKwkJUnQgPSB6MjsKKwkJUnQgLT0gejE7CisJCVJ0ICo9IHg7CisJCVJ0ICo9IHRzLT54X3BsYXRlX29obXM7CisJCVJ0IC89IHoxOworCQlSdCA9IChSdCArIDIwNDcpID4+IDEyOworCX0gZWxzZQorCQlSdCA9IDA7CisKKwkvKiBOT1RFOiAgInBlbmRvd24iIGlzIGluZmVycmVkIGZyb20gcHJlc3N1cmU7IHdlIGRvbid0IHJlbHkgb24KKwkgKiBiZWluZyBhYmxlIHRvIGNoZWNrIG5QRU5JUlEgc3RhdHVzLCBvciAiZnJpZW5kbHkiIHRyaWdnZXIgbW9kZXMKKwkgKiAoYm90aC1lZGdlcyBpcyBtdWNoIGJldHRlciB0aGFuIGp1c3QtZmFsbGluZyBvciBsb3ctbGV2ZWwpLgorCSAqCisJICogUkVWSVNJVDogIHNvbWUgYm9hcmRzIG1heSByZXF1aXJlIHJlYWRpbmcgblBFTklSUTsgaXQncworCSAqIG5lZWRlZCBvbiA3ODQzLiAgYW5kIDc4NDUgcmVhZHMgcHJlc3N1cmUgZGlmZmVyZW50bHkuLi4KKwkgKgorCSAqIFJFVklTSVQ6ICB0aGUgdG91Y2hzY3JlZW4gbWlnaHQgbm90IGJlIGNvbm5lY3RlZDsgdGhpcyBjb2RlCisJICogd29uJ3Qgbm90aWNlIHRoYXQsIGV2ZW4gaWYgblBFTklSUSBuZXZlciBmaXJlcyAuLi4KKwkgKi8KKwlpZiAoIXRzLT5wZW5kb3duICYmIFJ0ICE9IDApIHsKKwkJaW5wdXRfcmVwb3J0X2tleSgmdHMtPmlucHV0LCBCVE5fVE9VQ0gsIDEpOworCQlzeW5jID0gMTsKKwl9IGVsc2UgaWYgKHRzLT5wZW5kb3duICYmIFJ0ID09IDApIHsKKwkJaW5wdXRfcmVwb3J0X2tleSgmdHMtPmlucHV0LCBCVE5fVE9VQ0gsIDApOworCQlzeW5jID0gMTsKKwl9CisKKwlpZiAoUnQpIHsKKwkJaW5wdXRfcmVwb3J0X2FicygmdHMtPmlucHV0LCBBQlNfWCwgeCk7CisJCWlucHV0X3JlcG9ydF9hYnMoJnRzLT5pbnB1dCwgQUJTX1ksIHkpOworCQlpbnB1dF9yZXBvcnRfYWJzKCZ0cy0+aW5wdXQsIEFCU19QUkVTU1VSRSwgUnQpOworCQlzeW5jID0gMTsKKwl9CisJaWYgKHN5bmMpCisJCWlucHV0X3N5bmMoJnRzLT5pbnB1dCk7CisKKyNpZmRlZglWRVJCT1NFCisJaWYgKFJ0IHx8IHRzLT5wZW5kb3duKQorCQlwcl9kZWJ1ZygiJXM6ICVkLyVkLyVkJXNcbiIsIHRzLT5zcGktPmRldi5idXNfaWQsCisJCQl4LCB5LCBSdCwgUnQgPyAiIiA6ICIgVVAiKTsKKyNlbmRpZgorCisJLyogZG9uJ3QgcmV0cmlnZ2VyIHdoaWxlIHdlJ3JlIHN1c3BlbmRlZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cy0+bG9jaywgZmxhZ3MpOworCisJdHMtPnBlbmRvd24gPSAoUnQgIT0gMCk7CisJdHMtPnBlbmRpbmcgPSAwOworCisJaWYgKHRzLT5zcGktPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9PTikgeworCQlpZiAodHMtPnBlbmRvd24pCisJCQltb2RfdGltZXIoJnRzLT50aW1lciwgamlmZmllcyArIFRTX1BPTExfUEVSSU9EKTsKKwkJZWxzZSBpZiAodHMtPmlycV9kaXNhYmxlZCkgeworCQkJdHMtPmlycV9kaXNhYmxlZCA9IDA7CisJCQllbmFibGVfaXJxKHRzLT5zcGktPmlycSk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhZHM3ODQ2X3RpbWVyKHVuc2lnbmVkIGxvbmcgaGFuZGxlKQoreworCXN0cnVjdCBhZHM3ODQ2CSp0cyA9ICh2b2lkICopaGFuZGxlOworCWludAkJc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRzLT5sb2NrLCBmbGFncyk7CisJaWYgKCF0cy0+cGVuZGluZykgeworCQl0cy0+cGVuZGluZyA9IDE7CisJCWlmICghdHMtPmlycV9kaXNhYmxlZCkgeworCQkJdHMtPmlycV9kaXNhYmxlZCA9IDE7CisJCQlkaXNhYmxlX2lycSh0cy0+c3BpLT5pcnEpOworCQl9CisJCXN0YXR1cyA9IHNwaV9hc3luYyh0cy0+c3BpLCAmdHMtPm1zZyk7CisJCWlmIChzdGF0dXMpCisJCQlkZXZfZXJyKCZ0cy0+c3BpLT5kZXYsICJzcGlfYXN5bmMgLS0+ICVkXG4iLAorCQkJCQlzdGF0dXMpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWRzNzg0Nl9pcnEoaW50IGlycSwgdm9pZCAqaGFuZGxlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlhZHM3ODQ2X3RpbWVyKCh1bnNpZ25lZCBsb25nKSBoYW5kbGUpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQKK2Fkczc4NDZfc3VzcGVuZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgYWRzNzg0NiAqdHMgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRzLT5sb2NrLCBmbGFncyk7CisKKwlzcGktPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IG1lc3NhZ2U7CisKKwkvKiBhcmUgd2Ugd2FpdGluZyBmb3IgSVJRLCBvciBwb2xsaW5nPyAqLworCWlmICghdHMtPnBlbmRvd24pIHsKKwkJaWYgKCF0cy0+aXJxX2Rpc2FibGVkKSB7CisJCQl0cy0+aXJxX2Rpc2FibGVkID0gMTsKKwkJCWRpc2FibGVfaXJxKHRzLT5zcGktPmlycSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBwb2xsaW5nOyBmb3JjZSBhIGZpbmFsIFNQSSBjb21wbGV0aW9uOworCQkgKiB0aGF0IHdpbGwgY2xlYW4gdGhpbmdzIHVwIG5lYXRseQorCQkgKi8KKwkJaWYgKCF0cy0+cGVuZGluZykKKwkJCW1vZF90aW1lcigmdHMtPnRpbWVyLCBqaWZmaWVzKTsKKworCQl3aGlsZSAodHMtPnBlbmRvd24gfHwgdHMtPnBlbmRpbmcpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzLT5sb2NrLCBmbGFncyk7CisJCQl1ZGVsYXkoMTApOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnRzLT5sb2NrLCBmbGFncyk7CisJCX0KKwl9CisKKwkvKiB3ZSBrbm93IHRoZSBjaGlwJ3MgaW4gbG93cG93ZXIgbW9kZSBzaW5jZSB3ZSBhbHdheXMKKwkgKiBsZWF2ZSBpdCB0aGF0IHdheSBhZnRlciBldmVyeSByZXF1ZXN0CisJICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkczc4NDZfcmVzdW1lKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkczc4NDYgKnRzID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisKKwl0cy0+aXJxX2Rpc2FibGVkID0gMDsKKwllbmFibGVfaXJxKHRzLT5zcGktPmlycSk7CisJc3BpLT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHM3ODQ2X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkczc4NDYJCQkqdHM7CisJc3RydWN0IGFkczc4NDZfcGxhdGZvcm1fZGF0YQkqcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJCSp4OworCWludAkJCQlpOworCisJaWYgKCFzcGktPmlycSkgeworCQlkZXZfZGJnKCZzcGktPmRldiwgIm5vIElSUT9cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YT9cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBkb24ndCBleGNlZWQgbWF4IHNwZWNpZmllZCBzYW1wbGUgcmF0ZSAqLworCWlmIChzcGktPm1heF9zcGVlZF9oeiA+ICgxMjUwMDAgKiAxNikpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJmKHNhbXBsZSkgJWQgS0h6P1xuIiwKKwkJCQkoc3BpLT5tYXhfc3BlZWRfaHovMTYpLzEwMDApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBXZSdkIHNldCB0aGUgd29yZHNpemUgdG8gMTIgYml0cyAuLi4gZXhjZXB0IHRoYXQgc29tZSBjb250cm9sbGVycworCSAqIHdpbGwgdGhlbiB0cmVhdCB0aGUgOCBiaXQgY29tbWFuZCB3b3JkcyBhcyAxMiBiaXRzIChhbmQgZHJvcCB0aGUKKwkgKiBmb3VyIE1TQnMgb2YgdGhlIDEyIGJpdCByZXN1bHQpLiAgUmVzdWx0OiBpbnB1dHMgbXVzdCBiZSBzaGlmdGVkCisJICogdG8gZGlzY2FyZCB0aGUgZm91ciBnYXJiYWdlIExTQnMuCisJICovCisKKwlpZiAoISh0cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHM3ODQ2KSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIHRzKTsKKworCXRzLT5zcGkgPSBzcGk7CisJc3BpLT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOworCisJaW5pdF90aW1lcigmdHMtPnRpbWVyKTsKKwl0cy0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0czsKKwl0cy0+dGltZXIuZnVuY3Rpb24gPSBhZHM3ODQ2X3RpbWVyOworCisJdHMtPm1vZGVsID0gcGRhdGEtPm1vZGVsID8gOiA3ODQ2OworCXRzLT52cmVmX2RlbGF5X3VzZWNzID0gcGRhdGEtPnZyZWZfZGVsYXlfdXNlY3MgPyA6IDEwMDsKKwl0cy0+eF9wbGF0ZV9vaG1zID0gcGRhdGEtPnhfcGxhdGVfb2htcyA/IDogNDAwOworCisJaW5pdF9pbnB1dF9kZXYoJnRzLT5pbnB1dCk7CisKKwl0cy0+aW5wdXQuZGV2ID0gJnNwaS0+ZGV2OworCXRzLT5pbnB1dC5uYW1lID0gIkFEUzc4NHggVG91Y2hzY3JlZW4iOworCXNucHJpbnRmKHRzLT5waHlzLCBzaXplb2YgdHMtPnBoeXMsICIlcy9pbnB1dDAiLCBzcGktPmRldi5idXNfaWQpOworCXRzLT5pbnB1dC5waHlzID0gdHMtPnBoeXM7CisKKwl0cy0+aW5wdXQuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9BQlMpOworCXRzLT5pbnB1dC5rZXliaXRbTE9ORyhCVE5fVE9VQ0gpXSA9IEJJVChCVE5fVE9VQ0gpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKCZ0cy0+aW5wdXQsIEFCU19YLAorCQkJcGRhdGEtPnhfbWluID8gOiAwLAorCQkJcGRhdGEtPnhfbWF4ID8gOiBNQVhfMTJCSVQsCisJCQkwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcygmdHMtPmlucHV0LCBBQlNfWSwKKwkJCXBkYXRhLT55X21pbiA/IDogMCwKKwkJCXBkYXRhLT55X21heCA/IDogTUFYXzEyQklULAorCQkJMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoJnRzLT5pbnB1dCwgQUJTX1BSRVNTVVJFLAorCQkJcGRhdGEtPnByZXNzdXJlX21pbiwgcGRhdGEtPnByZXNzdXJlX21heCwgMCwgMCk7CisKKwlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJnRzLT5pbnB1dCk7CisKKwkvKiBzZXQgdXAgdGhlIHRyYW5zZmVycyB0byByZWFkIHRvdWNoc2NyZWVuIHN0YXRlOyB0aGlzIGFzc3VtZXMgd2UKKwkgKiB1c2UgZm9ybXVsYSAjMiBmb3IgcHJlc3N1cmUsIG5vdCAjMy4KKwkgKi8KKwl4ID0gdHMtPnhmZXI7CisKKwkvKiB5LSBzdGlsbCBvbjsgdHVybiBvbiBvbmx5IHkrIChhbmQgQURDKSAqLworCXgtPnR4X2J1ZiA9ICZyZWFkX3k7CisJeC0+bGVuID0gMTsKKwl4Kys7CisJeC0+cnhfYnVmID0gJnRzLT50Yy55OworCXgtPmxlbiA9IDI7CisJeCsrOworCisJLyogdHVybiB5KyBvZmYsIHgtIG9uOyB3ZSdsbCB1c2UgZm9ybXVsYSAjMiAqLworCWlmICh0cy0+bW9kZWwgPT0gNzg0NikgeworCQl4LT50eF9idWYgPSAmcmVhZF96MTsKKwkJeC0+bGVuID0gMTsKKwkJeCsrOworCQl4LT5yeF9idWYgPSAmdHMtPnRjLnoxOworCQl4LT5sZW4gPSAyOworCQl4Kys7CisKKwkJeC0+dHhfYnVmID0gJnJlYWRfejI7CisJCXgtPmxlbiA9IDE7CisJCXgrKzsKKwkJeC0+cnhfYnVmID0gJnRzLT50Yy56MjsKKwkJeC0+bGVuID0gMjsKKwkJeCsrOworCX0KKworCS8qIHR1cm4geS0gb2ZmLCB4KyBvbiwgdGhlbiBsZWF2ZSBpbiBsb3dwb3dlciAqLworCXgtPnR4X2J1ZiA9ICZyZWFkX3g7CisJeC0+bGVuID0gMTsKKwl4Kys7CisJeC0+cnhfYnVmID0gJnRzLT50Yy54OworCXgtPmxlbiA9IDI7CisJeCsrOworCisJQ1NfQ0hBTkdFKHhbLTFdKTsKKworCWZvciAoaSA9IDA7IGkgPCB4IC0gdHMtPnhmZXI7IGkrKykKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRzLT54ZmVyW2ldLCAmdHMtPm1zZyk7CisJdHMtPm1zZy5jb21wbGV0ZSA9IGFkczc4NDZfcng7CisJdHMtPm1zZy5jb250ZXh0ID0gdHM7CisKKwlpZiAocmVxdWVzdF9pcnEoc3BpLT5pcnEsIGFkczc4NDZfaXJxLCBTQV9TQU1QTEVfUkFORE9NLAorCQkJCXNwaS0+ZGV2LmJ1c19pZCwgdHMpKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAiaXJxICVkIGJ1c3k/XG4iLCBzcGktPmlycSk7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZ0cy0+aW5wdXQpOworCQlrZnJlZSh0cyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXNldF9pcnFfdHlwZShzcGktPmlycSwgSVJRVF9GQUxMSU5HKTsKKworCWRldl9pbmZvKCZzcGktPmRldiwgInRvdWNoc2NyZWVuLCBpcnEgJWRcbiIsIHNwaS0+aXJxKTsKKworCS8qIHRha2UgYSBmaXJzdCBzYW1wbGUsIGxlYXZpbmcgblBFTklSUSBhY3RpdmU7IGF2b2lkCisJICogdGhlIHRvdWNoc2NyZWVuLCBpbiBjYXNlIGl0J3Mgbm90IGNvbm5lY3RlZC4KKwkgKi8KKwkodm9pZCkgYWRzNzg0Nl9yZWFkMTJfc2VyKCZzcGktPmRldiwKKwkJCSAgUkVBRF8xMkJJVF9TRVIodmF1eCkgfCBBRFNfUEQxMF9BTExfT04pOworCisJLyogYWRzNzg0My83ODQ1IGRvbid0IGhhdmUgdGVtcGVyYXR1cmUgc2Vuc29ycywgYW5kCisJICogdXNlIHRoZSBvdGhlciBzZW5zb3JzIGEgYml0IGRpZmZlcmVudGx5IHRvbworCSAqLworCWlmICh0cy0+bW9kZWwgPT0gNzg0NikgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfdGVtcDApOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfdGVtcDEpOworCX0KKwlpZiAodHMtPm1vZGVsICE9IDc4NDUpCisJCWRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl92YmF0dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3ZhdXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkczc4NDZfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkczc4NDYJCSp0cyA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOworCisJYWRzNzg0Nl9zdXNwZW5kKHNwaSwgUE1TR19TVVNQRU5EKTsKKwlmcmVlX2lycSh0cy0+c3BpLT5pcnEsIHRzKTsKKwlpZiAodHMtPmlycV9kaXNhYmxlZCkKKwkJZW5hYmxlX2lycSh0cy0+c3BpLT5pcnEpOworCisJaWYgKHRzLT5tb2RlbCA9PSA3ODQ2KSB7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl90ZW1wMCk7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl90ZW1wMSk7CisJfQorCWlmICh0cy0+bW9kZWwgIT0gNzg0NSkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3ZiYXR0KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfdmF1eCk7CisKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmdHMtPmlucHV0KTsKKwlrZnJlZSh0cyk7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgInVucmVnaXN0ZXJlZCB0b3VjaHNjcmVlblxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZHM3ODQ2X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZHM3ODQ2IiwKKwkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGFkczc4NDZfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZHM3ODQ2X3JlbW92ZSksCisJLnN1c3BlbmQJPSBhZHM3ODQ2X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhZHM3ODQ2X3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkczc4NDZfaW5pdCh2b2lkKQoreworCS8qIGdyciwgYm9hcmQtc3BlY2lmaWMgaW5pdCBzaG91bGQgc3RheSBvdXQgb2YgZHJpdmVycyEhICovCisKKyNpZmRlZglDT05GSUdfQVJDSF9PTUFQCisJaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkgeworCQkvKiBHUElPNCA9IFBFTklSUTsgR1BJTzYgPSBCVVNZICovCisJCW9tYXBfcmVxdWVzdF9ncGlvKDQpOworCQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbig0LCAxKTsKKwkJb21hcF9yZXF1ZXN0X2dwaW8oNik7CisJCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDYsIDEpOworCX0KKwkvLyBhbHNvIFRJIDE1MTAgSW5ub3ZhdG9yLCBiaXRiYW5naW5nIHRocm91Z2ggRlBHQQorCS8vIGFsc28gTm9raWEgNzcwCisJLy8gYWxzbyBQYWxtIFR1bmdzdGVuIFQyCisjZW5kaWYKKworCS8vIFBYQToKKwkvLyBhbHNvIERlbGwgQXhpbSBYNTAKKwkvLyBhbHNvIEhQIGlQYXEgSDE5MXgvSDE5MngvSDQxNXgvSDQzNXgKKwkvLyBhbHNvIEludGVsIEx1YmJvY2sgKGFkZGl0aW9uYWwgdG8gVUNCMTQwMDsgYXMgdGVtcGVyYXR1cmUgc2Vuc29yKQorCS8vIGFsc28gU2hhcnAgWmF1cnVzIEM3eHgsIEM4eHggKGNvcmdpL3NoZXBlcmQvaHVza3kpCisKKwkvLyBBdG1lbCBhdDkxc2FtOTI2MS1FSyB1c2VzIGFkczc4NDMKKworCS8vIGFsc28gdmFyaW91cyBBTUQgQXUxeDAwIGRldmVsIGJvYXJkcworCisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkczc4NDZfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkczc4NDZfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZHM3ODQ2X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkczc4NDZfZHJpdmVyKTsKKworI2lmZGVmCUNPTkZJR19BUkNIX09NQVAKKwlpZiAobWFjaGluZV9pc19vbWFwX29zaygpKSB7CisJCW9tYXBfZnJlZV9ncGlvKDQpOworCQlvbWFwX2ZyZWVfZ3Bpbyg2KTsKKwl9CisjZW5kaWYKKworfQorbW9kdWxlX2V4aXQoYWRzNzg0Nl9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBRFM3ODQ2IFRvdWNoU2NyZWVuIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvYWRiLWlvcC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvYWRiLWlvcC5jCmluZGV4IDcxYWViOTEuLmQ1NmQ0MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYi1pb3AuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9hZGItaW9wLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0JcmVxLT5uZXh0ID0gMDsKKwlyZXEtPm5leHQgPSBOVUxMOwogCXJlcS0+c2VudCA9IDA7CiAJcmVxLT5jb21wbGV0ZSA9IDA7CiAJcmVxLT5yZXBseV9sZW4gPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW8tYWRiLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpby1hZGIuYwppbmRleCBjZjZhNmYyLi4zMTRmYzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpby1hZGIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpby1hZGIuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCiBzdHJ1Y3QgcHJlZyB7CiAJdW5zaWduZWQgY2hhciByOwpAQCAtODgsMjQgKzg5LDI2IEBACiBpbnQgbWFjaW9faW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYWRiczsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAogCWFkYnMgPSBmaW5kX2NvbXBhdGlibGVfZGV2aWNlcygiYWRiIiwgImNocnAsYWRiMCIpOwogCWlmIChhZGJzID09IDApCiAJCXJldHVybiAtRU5YSU87CiAKICNpZiAwCi0JeyBpbnQgaTsKKwl7IGludCBpID0gMDsKIAogCXByaW50aygibWFjaW9fYWRiX2luaXQ6IG5vZGUgPSAlcCwgYWRkcnMgPSIsIGFkYnMtPm5vZGUpOwotCWZvciAoaSA9IDA7IGkgPCBhZGJzLT5uX2FkZHJzOyArK2kpCi0JCXByaW50aygiICV4KCV4KSIsIGFkYnMtPmFkZHJzW2ldLmFkZHJlc3MsIGFkYnMtPmFkZHJzW2ldLnNpemUpOworCXdoaWxlKCFvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGFkYnMsIGksICZyKSkKKwkJcHJpbnRrKCIgJXgoJXgpIiwgci5zdGFydCwgci5lbmQgLSByLnN0YXJ0KTsKIAlwcmludGsoIiwgaW50cnMgPSIpOwogCWZvciAoaSA9IDA7IGkgPCBhZGJzLT5uX2ludHJzOyArK2kpCiAJCXByaW50aygiICV4IiwgYWRicy0+aW50cnNbaV0ubGluZSk7CiAJcHJpbnRrKCJcbiIpOyB9CiAjZW5kaWYKLQkKLQlhZGIgPSBpb3JlbWFwKGFkYnMtPmFkZHJzLT5hZGRyZXNzLCBzaXplb2Yoc3RydWN0IGFkYl9yZWdzKSk7CisJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoYWRicywgMCwgJnIpKQorCQlyZXR1cm4gLUVOWElPOworCWFkYiA9IGlvcmVtYXAoci5zdGFydCwgc2l6ZW9mKHN0cnVjdCBhZGJfcmVncykpOwogCiAJb3V0XzgoJmFkYi0+Y3RybC5yLCAwKTsKIAlvdXRfOCgmYWRiLT5pbnRyLnIsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCmluZGV4IDJhNTQ1Y2UuLmVkNmQzMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKQEAgLTIxMSw2ICsyMTEsOSBAQAogICAgICAgIC5uYW1lCT0gIm1hY2lvIiwKICAgICAgICAubWF0Y2gJPSBtYWNpb19idXNfbWF0Y2gsCiAgICAgICAgLnVldmVudCA9IG1hY2lvX3VldmVudCwKKyAgICAgICAucHJvYmUJPSBtYWNpb19kZXZpY2VfcHJvYmUsCisgICAgICAgLnJlbW92ZQk9IG1hY2lvX2RldmljZV9yZW1vdmUsCisgICAgICAgLnNodXRkb3duID0gbWFjaW9fZGV2aWNlX3NodXRkb3duLAogICAgICAgIC5zdXNwZW5kCT0gbWFjaW9fZGV2aWNlX3N1c3BlbmQsCiAgICAgICAgLnJlc3VtZQk9IG1hY2lvX2RldmljZV9yZXN1bWUsCiAgICAgICAgLmRldl9hdHRycyA9IG1hY2lvX2Rldl9hdHRycywKQEAgLTUyOCw5ICs1MzEsNiBAQAogCS8qIGluaXRpYWxpemUgY29tbW9uIGRyaXZlciBmaWVsZHMgKi8KIAlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZtYWNpb19idXNfdHlwZTsKLQlkcnYtPmRyaXZlci5wcm9iZSA9IG1hY2lvX2RldmljZV9wcm9iZTsKLQlkcnYtPmRyaXZlci5yZW1vdmUgPSBtYWNpb19kZXZpY2VfcmVtb3ZlOwotCWRydi0+ZHJpdmVyLnNodXRkb3duID0gbWFjaW9fZGV2aWNlX3NodXRkb3duOwogCiAJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJY291bnQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1tYWNpaS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLW1hY2lpLmMKaW5kZXggZTlhMTU5YS4uMmEyZmZlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLW1hY2lpLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLW1hY2lpLmMKQEAgLTI2MCw3ICsyNjAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJCi0JcmVxLT5uZXh0ID0gMDsKKwlyZXEtPm5leHQgPSBOVUxMOwogCXJlcS0+c2VudCA9IDA7CiAJcmVxLT5jb21wbGV0ZSA9IDA7CiAJcmVxLT5yZXBseV9sZW4gPSAwOwpAQCAtMjk1LDcgKzI5NSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAodmlhW0lGUl0gJiBTUl9JTlQpIG1hY2lpX2ludGVycnVwdCgwLCAwLCAwKTsKKwlpZiAodmlhW0lGUl0gJiBTUl9JTlQpIG1hY2lpX2ludGVycnVwdCgwLCBOVUxMLCBOVUxMKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1tYWNpaXNpLmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtbWFjaWlzaS5jCmluZGV4IGExOTY2OTcuLjAxMjlmY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1tYWNpaXNpLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLW1hY2lpc2kuYwpAQCAtMjk0LDYgKzI5NCwyNCBAQAogCQlwcmludGsoS0VSTl9FUlIgIm1hY2lpc2lfc2VuZF9yZXF1ZXN0OiBwb2xsIHRpbWVkIG91dCFcbiIpOwogfQogCitpbnQKK21hY2lpc2lfcmVxdWVzdChzdHJ1Y3QgYWRiX3JlcXVlc3QgKnJlcSwgdm9pZCAoKmRvbmUpKHN0cnVjdCBhZGJfcmVxdWVzdCAqKSwKKwkgICAgaW50IG5ieXRlcywgLi4uKQoreworCXZhX2xpc3QgbGlzdDsKKwlpbnQgaTsKKworCXJlcS0+bmJ5dGVzID0gbmJ5dGVzOworCXJlcS0+ZG9uZSA9IGRvbmU7CisJcmVxLT5yZXBseV9leHBlY3RlZCA9IDA7CisJdmFfc3RhcnQobGlzdCwgbmJ5dGVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspCisJCXJlcS0+ZGF0YVtpKytdID0gdmFfYXJnKGxpc3QsIGludCk7CisJdmFfZW5kKGxpc3QpOworCisJcmV0dXJuIG1hY2lpc2lfc2VuZF9yZXF1ZXN0KHJlcSwgMSk7Cit9CisKIC8qIEVucXVldWUgYSByZXF1ZXN0LCBhbmQgcnVuIHRoZSBxdWV1ZSBpZiBwb3NzaWJsZSAqLwogc3RhdGljIGludAogbWFjaWlzaV93cml0ZShzdHJ1Y3QgYWRiX3JlcXVlc3QqIHJlcSkKQEAgLTMwOCw3ICszMjYsNyBAQAogCQlyZXEtPmNvbXBsZXRlID0gMTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXJlcS0+bmV4dCA9IDA7CisJcmVxLT5uZXh0ID0gTlVMTDsKIAlyZXEtPnNlbnQgPSAwOwogCXJlcS0+Y29tcGxldGUgPSAwOwogCXJlcS0+cmVwbHlfbGVuID0gMDsKQEAgLTQwMyw3ICs0MjEsNyBAQAogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWlmICh2aWFbSUZSXSAmIFNSX0lOVCkgewotCQltYWNpaXNpX2ludGVycnVwdCgwLCAwLCAwKTsKKwkJbWFjaWlzaV9pbnRlcnJ1cHQoMCwgTlVMTCwgTlVMTCk7CiAJfQogCWVsc2UgLyogYXZvaWQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRvbyBxdWlja2x5IGluIGEgbG9vcCAqLwogCQl1ZGVsYXkoQURCX0RFTEFZKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXU2OGsuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXU2OGsuYwppbmRleCA2ZjgwZDc2Li5mMDhlNTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11NjhrLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdTY4ay5jCkBAIC00OTMsNyArNDkzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmVxLT5uZXh0ID0gMDsKKwlyZXEtPm5leHQgPSBOVUxMOwogCXJlcS0+c2VudCA9IDA7CiAJcmVxLT5jb21wbGV0ZSA9IDA7CiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpAQCAtNzE3LDcgKzcxNyw3IEBACiAJCQkJcHJpbnRrKEtFUk5fRVJSICJQTVU6IGV4dHJhIEFEQiByZXBseVxuIik7CiAJCQkJcmV0dXJuOwogCQkJfQotCQkJcmVxX2F3YWl0aW5nX3JlcGx5ID0gMDsKKwkJCXJlcV9hd2FpdGluZ19yZXBseSA9IE5VTEw7CiAJCQlpZiAobGVuIDw9IDIpCiAJCQkJcmVxLT5yZXBseV9sZW4gPSAwOwogCQkJZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmMgYi9kcml2ZXJzL21kL21kLmMKaW5kZXggMDMwMjcyM2YuLjE3NzgxMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuYworKysgYi9kcml2ZXJzL21kL21kLmMKQEAgLTEyMzgsNiArMTIzOCw3IEBACiAJbWRrX3JkZXZfdCAqc2FtZV9wZGV2OwogCWNoYXIgYltCREVWTkFNRV9TSVpFXSwgYjJbQkRFVk5BTUVfU0laRV07CiAJc3RydWN0IGtvYmplY3QgKmtvOworCWNoYXIgKnM7CiAKIAlpZiAocmRldi0+bWRkZXYpIHsKIAkJTURfQlVHKCk7CkBAIC0xMjc3LDYgKzEyNzgsOCBAQAogCWJkZXZuYW1lKHJkZXYtPmJkZXYsYik7CiAJaWYgKGtvYmplY3Rfc2V0X25hbWUoJnJkZXYtPmtvYmosICJkZXYtJXMiLCBiKSA8IDApCiAJCXJldHVybiAtRU5PTUVNOworCXdoaWxlICggKHM9c3RyY2hyKHJkZXYtPmtvYmoua19uYW1lLCAnLycpKSAhPSBOVUxMKQorCQkqcyA9ICchJzsKIAkJCQogCWxpc3RfYWRkKCZyZGV2LT5zYW1lX3NldCwgJm1kZGV2LT5kaXNrcyk7CiAJcmRldi0+bWRkZXYgPSBtZGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMKaW5kZXggZjY1ZjY0Yi4uNDRmY2JlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMKQEAgLTc3OSw5ICs3NzksOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGR2Yl9idDh4eF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGR2Yl9idDh4eF9wcm9iZShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpCiB7Ci0Jc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViID0gdG9fYnR0dl9zdWJfZGV2KGRldik7CiAJc3RydWN0IGR2Yl9idDh4eF9jYXJkICpjYXJkOwogCXN0cnVjdCBwY2lfZGV2KiBidHR2X3BjaV9kZXY7CiAJaW50IHJldDsKQEAgLTg5MCwxMyArODg5LDEzIEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JZGV2X3NldF9kcnZkYXRhKGRldiwgY2FyZCk7CisJZGV2X3NldF9kcnZkYXRhKCZzdWItPmRldiwgY2FyZCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHZiX2J0OHh4X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGR2Yl9idDh4eF9yZW1vdmUoc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViKQogewotCXN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3ViLT5kZXYpOwogCiAJZHByaW50aygiZHZiX2J0OHh4OiB1bmxvYWRpbmcgY2FyZCVkXG4iLCBjYXJkLT5idHR2X25yKTsKIApAQCAtOTE5LDE0ICs5MTgsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyIGRyaXZlciA9IHsKIAkuZHJ2ID0gewogCQkubmFtZQkJPSAiZHZiLWJ0OHh4IiwKLQkJLnByb2JlCQk9IGR2Yl9idDh4eF9wcm9iZSwKLQkJLnJlbW92ZQkJPSBkdmJfYnQ4eHhfcmVtb3ZlLAotCQkvKiBGSVhNRToKLQkJICogLnNodXRkb3duCT0gZHZiX2J0OHh4X3NodXRkb3duLAotCQkgKiAuc3VzcGVuZAk9IGR2Yl9idDh4eF9zdXNwZW5kLAotCQkgKiAucmVzdW1lCT0gZHZiX2J0OHh4X3Jlc3VtZSwKLQkJICovCiAJfSwKKwkucHJvYmUJCT0gZHZiX2J0OHh4X3Byb2JlLAorCS5yZW1vdmUJCT0gZHZiX2J0OHh4X3JlbW92ZSwKKwkvKiBGSVhNRToKKwkgKiAuc2h1dGRvd24JPSBkdmJfYnQ4eHhfc2h1dGRvd24sCisJICogLnN1c3BlbmQJPSBkdmJfYnQ4eHhfc3VzcGVuZCwKKwkgKiAucmVzdW1lCT0gZHZiX2J0OHh4X3Jlc3VtZSwKKwkgKi8KIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGR2Yl9idDh4eF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZ3Bpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWdwaW8uYwppbmRleCBkNjRhY2NjLi5jNGQ1ZTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZ3Bpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1ncGlvLmMKQEAgLTQ3LDkgKzQ3LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYnR0dl9zdWJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnNkZXYgPSB0b19idHR2X3N1Yl9kZXYoZGV2KTsKKwlzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyICpzdWIgPSB0b19idHR2X3N1Yl9kcnYoZGV2LT5kcml2ZXIpOworCisJcmV0dXJuIHN1Yi0+cHJvYmUgPyBzdWItPnByb2JlKHNkZXYpIDogLUVOT0RFVjsKK30KKworc3RhdGljIGludCBidHR2X3N1Yl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnNkZXYgPSB0b19idHR2X3N1Yl9kZXYoZGV2KTsKKwlzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyICpzdWIgPSB0b19idHR2X3N1Yl9kcnYoZGV2LT5kcml2ZXIpOworCisJaWYgKHN1Yi0+cmVtb3ZlKQorCQlzdWItPnJlbW92ZShzZGV2KTsKKwlyZXR1cm4gMDsKK30KKwogc3RydWN0IGJ1c190eXBlIGJ0dHZfc3ViX2J1c190eXBlID0gewotCS5uYW1lICA9ICJidHR2LXN1YiIsCi0JLm1hdGNoID0gJmJ0dHZfc3ViX2J1c19tYXRjaCwKKwkubmFtZSAgID0gImJ0dHYtc3ViIiwKKwkubWF0Y2ggID0gJmJ0dHZfc3ViX2J1c19tYXRjaCwKKwkucHJvYmUgID0gYnR0dl9zdWJfcHJvYmUsCisJLnJlbW92ZSA9IGJ0dHZfc3ViX3JlbW92ZSwKIH07CiBFWFBPUlRfU1lNQk9MKGJ0dHZfc3ViX2J1c190eXBlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYuaAppbmRleCBlMzcwZDc0Li45OTA4YzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYuaApAQCAtMzY1LDYgKzM2NSw4IEBACiBzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyIHsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAgIGRydjsKIAljaGFyICAgICAgICAgICAgICAgICAgIHdhbnRlZFtCVVNfSURfU0laRV07CisJaW50ICAgICAgICAgICAgICAgICAgICAoKnByb2JlKShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpOworCXZvaWQgICAgICAgICAgICAgICAgICAgKCpyZW1vdmUpKHN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnN1Yik7CiAJdm9pZCAgICAgICAgICAgICAgICAgICAoKmdwaW9faXJxKShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpOwogfTsKICNkZWZpbmUgdG9fYnR0dl9zdWJfZHJ2KHgpIGNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBidHR2X3N1Yl9kcml2ZXIsIGRydikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL21jcC1jb3JlLmMgYi9kcml2ZXJzL21mZC9tY3AtY29yZS5jCmluZGV4IDU1YmEyMzAuLjc1ZjQwMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL21jcC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvbWNwLWNvcmUuYwpAQCAtNzcsNiArNzcsOCBAQAogc3RhdGljIHN0cnVjdCBidXNfdHlwZSBtY3BfYnVzX3R5cGUgPSB7CiAJLm5hbWUJCT0gIm1jcCIsCiAJLm1hdGNoCQk9IG1jcF9idXNfbWF0Y2gsCisJLnByb2JlCQk9IG1jcF9idXNfcHJvYmUsCisJLnJlbW92ZQkJPSBtY3BfYnVzX3JlbW92ZSwKIAkuc3VzcGVuZAk9IG1jcF9idXNfc3VzcGVuZCwKIAkucmVzdW1lCQk9IG1jcF9idXNfcmVzdW1lLAogfTsKQEAgLTIyNyw4ICsyMjksNiBAQAogaW50IG1jcF9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IG1jcF9kcml2ZXIgKm1jcGRydikKIHsKIAltY3BkcnYtPmRydi5idXMgPSAmbWNwX2J1c190eXBlOwotCW1jcGRydi0+ZHJ2LnByb2JlID0gbWNwX2J1c19wcm9iZTsKLQltY3BkcnYtPmRydi5yZW1vdmUgPSBtY3BfYnVzX3JlbW92ZTsKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZtY3BkcnYtPmRydik7CiB9CiBFWFBPUlRfU1lNQk9MKG1jcF9kcml2ZXJfcmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdWNiMXgwMC1jb3JlLmMgYi9kcml2ZXJzL21mZC91Y2IxeDAwLWNvcmUuYwppbmRleCBiNDJlMGZiLi5hZmY4M2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC91Y2IxeDAwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC91Y2IxeDAwLWNvcmUuYwpAQCAtMjQsMTMgKzI0LDE0IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogCiAjaW5jbHVkZSAidWNiMXgwMC5oIgogCi1zdGF0aWMgREVDTEFSRV9NVVRFWCh1Y2IxeDAwX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKHVjYjF4MDBfbXV0ZXgpOwogc3RhdGljIExJU1RfSEVBRCh1Y2IxeDAwX2RyaXZlcnMpOwogc3RhdGljIExJU1RfSEVBRCh1Y2IxeDAwX2RldmljZXMpOwogCkBAIC01MjEsMTIgKzUyMiwxMiBAQAogCQlnb3RvIGVycl9pcnE7CiAKIAlJTklUX0xJU1RfSEVBRCgmdWNiLT5kZXZzKTsKLQlkb3duKCZ1Y2IxeDAwX3NlbSk7CisJbXV0ZXhfbG9jaygmdWNiMXgwMF9tdXRleCk7CiAJbGlzdF9hZGQoJnVjYi0+bm9kZSwgJnVjYjF4MDBfZGV2aWNlcyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkcnYsICZ1Y2IxeDAwX2RyaXZlcnMsIG5vZGUpIHsKIAkJdWNiMXgwMF9hZGRfZGV2KHVjYiwgZHJ2KTsKIAl9Ci0JdXAoJnVjYjF4MDBfc2VtKTsKKwltdXRleF91bmxvY2soJnVjYjF4MDBfbXV0ZXgpOwogCWdvdG8gb3V0OwogCiAgZXJyX2lycToKQEAgLTU0NCwxMyArNTQ1LDEzIEBACiAJc3RydWN0IHVjYjF4MDAgKnVjYiA9IG1jcF9nZXRfZHJ2ZGF0YShtY3ApOwogCXN0cnVjdCBsaXN0X2hlYWQgKmwsICpuOwogCi0JZG93bigmdWNiMXgwMF9zZW0pOworCW11dGV4X2xvY2soJnVjYjF4MDBfbXV0ZXgpOwogCWxpc3RfZGVsKCZ1Y2ItPm5vZGUpOwogCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBuLCAmdWNiLT5kZXZzKSB7CiAJCXN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2ID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgdWNiMXgwMF9kZXYsIGRldl9ub2RlKTsKIAkJdWNiMXgwMF9yZW1vdmVfZGV2KGRldik7CiAJfQotCXVwKCZ1Y2IxeDAwX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZ1Y2IxeDAwX211dGV4KTsKIAogCWZyZWVfaXJxKHVjYi0+aXJxLCB1Y2IpOwogCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZ1Y2ItPmNkZXYpOwpAQCAtNTYxLDEyICs1NjIsMTIgQEAKIAlzdHJ1Y3QgdWNiMXgwMCAqdWNiOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRydi0+ZGV2cyk7Ci0JZG93bigmdWNiMXgwMF9zZW0pOworCW11dGV4X2xvY2soJnVjYjF4MDBfbXV0ZXgpOwogCWxpc3RfYWRkKCZkcnYtPm5vZGUsICZ1Y2IxeDAwX2RyaXZlcnMpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodWNiLCAmdWNiMXgwMF9kZXZpY2VzLCBub2RlKSB7CiAJCXVjYjF4MDBfYWRkX2Rldih1Y2IsIGRydik7CiAJfQotCXVwKCZ1Y2IxeDAwX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZ1Y2IxeDAwX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTc0LDEzICs1NzUsMTMgQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpuLCAqbDsKIAotCWRvd24oJnVjYjF4MDBfc2VtKTsKKwltdXRleF9sb2NrKCZ1Y2IxeDAwX211dGV4KTsKIAlsaXN0X2RlbCgmZHJ2LT5ub2RlKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgbiwgJmRydi0+ZGV2cykgewogCQlzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldiA9IGxpc3RfZW50cnkobCwgc3RydWN0IHVjYjF4MDBfZGV2LCBkcnZfbm9kZSk7CiAJCXVjYjF4MDBfcmVtb3ZlX2RldihkZXYpOwogCX0KLQl1cCgmdWNiMXgwMF9zZW0pOworCW11dGV4X3VubG9jaygmdWNiMXgwMF9tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQgdWNiMXgwMF9zdXNwZW5kKHN0cnVjdCBtY3AgKm1jcCwgcG1fbWVzc2FnZV90IHN0YXRlKQpAQCAtNTg4LDEyICs1ODksMTIgQEAKIAlzdHJ1Y3QgdWNiMXgwMCAqdWNiID0gbWNwX2dldF9kcnZkYXRhKG1jcCk7CiAJc3RydWN0IHVjYjF4MDBfZGV2ICpkZXY7CiAKLQlkb3duKCZ1Y2IxeDAwX3NlbSk7CisJbXV0ZXhfbG9jaygmdWNiMXgwMF9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ1Y2ItPmRldnMsIGRldl9ub2RlKSB7CiAJCWlmIChkZXYtPmRydi0+c3VzcGVuZCkKIAkJCWRldi0+ZHJ2LT5zdXNwZW5kKGRldiwgc3RhdGUpOwogCX0KLQl1cCgmdWNiMXgwMF9zZW0pOworCW11dGV4X3VubG9jaygmdWNiMXgwMF9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYwMiwxMiArNjAzLDEyIEBACiAJc3RydWN0IHVjYjF4MDAgKnVjYiA9IG1jcF9nZXRfZHJ2ZGF0YShtY3ApOwogCXN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2OwogCi0JZG93bigmdWNiMXgwMF9zZW0pOworCW11dGV4X2xvY2soJnVjYjF4MDBfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmdWNiLT5kZXZzLCBkZXZfbm9kZSkgewogCQlpZiAoZGV2LT5kcnYtPnJlc3VtZSkKIAkJCWRldi0+ZHJ2LT5yZXN1bWUoZGV2KTsKIAl9Ci0JdXAoJnVjYjF4MDBfc2VtKTsKKwltdXRleF91bmxvY2soJnVjYjF4MDBfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWNfYmxvY2suYyBiL2RyaXZlcnMvbW1jL21tY19ibG9jay5jCmluZGV4IGYyYzQyYjEuLjliN2MzN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL21tY19ibG9jay5jCisrKyBiL2RyaXZlcnMvbW1jL21tY19ibG9jay5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL3Byb3RvY29sLmg+CkBAIC01NywzMyArNTgsMzMgQEAKIAl1bnNpZ25lZCBpbnQJcmVhZF9vbmx5OwogfTsKIAotc3RhdGljIERFQ0xBUkVfTVVURVgob3Blbl9sb2NrKTsKK3N0YXRpYyBERUZJTkVfTVVURVgob3Blbl9sb2NrKTsKIAogc3RhdGljIHN0cnVjdCBtbWNfYmxrX2RhdGEgKm1tY19ibGtfZ2V0KHN0cnVjdCBnZW5kaXNrICpkaXNrKQogewogCXN0cnVjdCBtbWNfYmxrX2RhdGEgKm1kOwogCi0JZG93bigmb3Blbl9sb2NrKTsKKwltdXRleF9sb2NrKCZvcGVuX2xvY2spOwogCW1kID0gZGlzay0+cHJpdmF0ZV9kYXRhOwogCWlmIChtZCAmJiBtZC0+dXNhZ2UgPT0gMCkKIAkJbWQgPSBOVUxMOwogCWlmIChtZCkKIAkJbWQtPnVzYWdlKys7Ci0JdXAoJm9wZW5fbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZvcGVuX2xvY2spOwogCiAJcmV0dXJuIG1kOwogfQogCiBzdGF0aWMgdm9pZCBtbWNfYmxrX3B1dChzdHJ1Y3QgbW1jX2Jsa19kYXRhICptZCkKIHsKLQlkb3duKCZvcGVuX2xvY2spOworCW11dGV4X2xvY2soJm9wZW5fbG9jayk7CiAJbWQtPnVzYWdlLS07CiAJaWYgKG1kLT51c2FnZSA9PSAwKSB7CiAJCXB1dF9kaXNrKG1kLT5kaXNrKTsKIAkJbW1jX2NsZWFudXBfcXVldWUoJm1kLT5xdWV1ZSk7CiAJCWtmcmVlKG1kKTsKIAl9Ci0JdXAoJm9wZW5fbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZvcGVuX2xvY2spOwogfQogCiBzdGF0aWMgaW50IG1tY19ibGtfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL21tY19zeXNmcy5jIGIvZHJpdmVycy9tbWMvbW1jX3N5c2ZzLmMKaW5kZXggZWM3MDE2Ni4uYTJhMzVmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvbW1jX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9tbWMvbW1jX3N5c2ZzLmMKQEAgLTEzNiwxNyArMTM2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGJ1c190eXBlIG1tY19idXNfdHlwZSA9IHsKLQkubmFtZQkJPSAibW1jIiwKLQkuZGV2X2F0dHJzCT0gbW1jX2Rldl9hdHRycywKLQkubWF0Y2gJCT0gbW1jX2J1c19tYXRjaCwKLQkudWV2ZW50CQk9IG1tY19idXNfdWV2ZW50LAotCS5zdXNwZW5kCT0gbW1jX2J1c19zdXNwZW5kLAotCS5yZXN1bWUJCT0gbW1jX2J1c19yZXN1bWUsCi19OwotCi0KLXN0YXRpYyBpbnQgbW1jX2Rydl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IG1tY19idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBtbWNfZHJpdmVyICpkcnYgPSB0b19tbWNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQgPSBkZXZfdG9fbW1jX2NhcmQoZGV2KTsKQEAgLTE1NCw3ICsxNDQsNyBAQAogCXJldHVybiBkcnYtPnByb2JlKGNhcmQpOwogfQogCi1zdGF0aWMgaW50IG1tY19kcnZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgbW1jX2J1c19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBtbWNfZHJpdmVyICpkcnYgPSB0b19tbWNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQgPSBkZXZfdG9fbW1jX2NhcmQoZGV2KTsKQEAgLTE2NCw2ICsxNTQsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBidXNfdHlwZSBtbWNfYnVzX3R5cGUgPSB7CisJLm5hbWUJCT0gIm1tYyIsCisJLmRldl9hdHRycwk9IG1tY19kZXZfYXR0cnMsCisJLm1hdGNoCQk9IG1tY19idXNfbWF0Y2gsCisJLnVldmVudAkJPSBtbWNfYnVzX3VldmVudCwKKwkucHJvYmUJCT0gbW1jX2J1c19wcm9iZSwKKwkucmVtb3ZlCQk9IG1tY19idXNfcmVtb3ZlLAorCS5zdXNwZW5kCT0gbW1jX2J1c19zdXNwZW5kLAorCS5yZXN1bWUJCT0gbW1jX2J1c19yZXN1bWUsCit9OwogCiAvKioKICAqCW1tY19yZWdpc3Rlcl9kcml2ZXIgLSByZWdpc3RlciBhIG1lZGlhIGRyaXZlcgpAQCAtMTcyLDggKzE3Miw2IEBACiBpbnQgbW1jX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgbW1jX2RyaXZlciAqZHJ2KQogewogCWRydi0+ZHJ2LmJ1cyA9ICZtbWNfYnVzX3R5cGU7Ci0JZHJ2LT5kcnYucHJvYmUgPSBtbWNfZHJ2X3Byb2JlOwotCWRydi0+ZHJ2LnJlbW92ZSA9IG1tY19kcnZfcmVtb3ZlOwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJ2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnCmluZGV4IDlhMmFhNDAuLjUwMzhlOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcKQEAgLTQ3LDYgKzQ3LDIyIEBACiAJICBhY2NlbGVyYXRvci4gIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBERUNzdGF0aW9uIDUwMDAvMngwIG9yIGEKIAkgIERFQ3N5c3RlbSA1OTAwIGVxdWlwcGVkIHdpdGggc3VjaCBhIG1vZHVsZS4KIAorY29uZmlnIE1URF9EQVRBRkxBU0gKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgQVQ0NXh4eCBEYXRhRmxhc2giCisJZGVwZW5kcyBvbiBNVEQgJiYgU1BJX01BU1RFUiAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIEFUNDV4eHggRGF0YUZsYXNoIGNoaXBzLCB1c2luZyBTUEkuCisJICBTb21ldGltZXMgRGF0YUZsYXNoIGNoaXBzIGFyZSBwYWNrYWdlZCBpbnNpZGUgTU1DLWZvcm1hdAorCSAgY2FyZHM7IGF0IHRoaXMgd3JpdGluZywgdGhlIE1NQyBzdGFjayB3b24ndCBoYW5kbGUgdGhvc2UuCisKK2NvbmZpZyBNVERfTTI1UDgwCisJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIE0yNSBTUEkgRmxhc2giCisJZGVwZW5kcyBvbiBNVEQgJiYgU1BJX01BU1RFUiAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIFNUIE0yNVA4MCBhbmQgc2ltaWxhciBTUEkgZmxhc2ggY2hpcHMsCisJICB1c2VkIGZvciBwcm9ncmFtIGFuZCBkYXRhIHN0b3JhZ2UuICBTZXQgdXAgeW91ciBzcGkgZGV2aWNlcworCSAgd2l0aCB0aGUgcmlnaHQgYm9hcmQtc3BlY2lmaWMgcGxhdGZvcm0gZGF0YS4KKwogY29uZmlnIE1URF9TTFJBTQogCXRyaXN0YXRlICJVbmNhY2hlZCBzeXN0ZW0gUkFNIgogCWRlcGVuZHMgb24gTVRECmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9NYWtlZmlsZQppbmRleCBlMzhkYjM0Li43YzVlZDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvTWFrZWZpbGUKQEAgLTIzLDMgKzIzLDUgQEAKIG9iai0kKENPTkZJR19NVERfTEFSVCkJCSs9IGxhcnQubwogb2JqLSQoQ09ORklHX01URF9CTEtNVEQpCSs9IGJsa210ZC5vCiBvYmotJChDT05GSUdfTVREX0JMT0NLMk1URCkJKz0gYmxvY2sybXRkLm8KK29iai0kKENPTkZJR19NVERfREFUQUZMQVNIKQkrPSBtdGRfZGF0YWZsYXNoLm8KK29iai0kKENPTkZJR19NVERfTTI1UDgwKQkrPSBtMjVwODAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmMjQwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKQEAgLTAsMCArMSw1ODIgQEAKKy8qCisgKiBNVEQgU1BJIGRyaXZlciBmb3IgU1QgTTI1UHh4IGZsYXNoIGNoaXBzCisgKgorICogQXV0aG9yOiBNaWtlIExhdmVuZGVyLCBtaWtlQHN0ZXJvaWRtaWNyb3MuY29tCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBJbnRlYyBBdXRvbWF0aW9uIEluYy4KKyAqCisgKiBTb21lIHBhcnRzIGFyZSBiYXNlZCBvbiBsYXJ0LmMgYnkgQWJyYWhhbSBWYW4gRGVyIE1lcndlCisgKgorICogQ2xlYW5lZCB1cCBhbmQgZ2VuZXJhbGl6ZWQgYmFzZWQgb24gbXRkX2RhdGFmbGFzaC5jCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKworLyogTk9URTogQVQgMjVGIGFuZCBTU1QgMjVMRiBzZXJpZXMgYXJlIHZlcnkgc2ltaWxhciwKKyAqIGJ1dCBjb21tYW5kcyBmb3Igc2VjdG9yIGVyYXNlIGFuZCBjaGlwIGlkIGRpZmZlci4uLgorICovCisKKyNkZWZpbmUgRkxBU0hfUEFHRVNJWkUJCTI1NgorCisvKiBGbGFzaCBvcGNvZGVzLiAqLworI2RlZmluZQlPUENPREVfV1JFTgkJNgkvKiBXcml0ZSBlbmFibGUgKi8KKyNkZWZpbmUJT1BDT0RFX1JEU1IJCTUJLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJT1BDT0RFX1JFQUQJCTMJLyogUmVhZCBkYXRhIGJ5dGVzICovCisjZGVmaW5lCU9QQ09ERV9QUAkJMgkvKiBQYWdlIHByb2dyYW0gKi8KKyNkZWZpbmUJT1BDT0RFX1NFCQkweGQ4CS8qIFNlY3RvciBlcmFzZSAqLworI2RlZmluZQlPUENPREVfUkVTCQkweGFiCS8qIFJlYWQgRWxlY3Ryb25pYyBTaWduYXR1cmUgKi8KKyNkZWZpbmUJT1BDT0RFX1JESUQJCTB4OWYJLyogUmVhZCBKRURFQyBJRCAqLworCisvKiBTdGF0dXMgUmVnaXN0ZXIgYml0cy4gKi8KKyNkZWZpbmUJU1JfV0lQCQkJMQkvKiBXcml0ZSBpbiBwcm9ncmVzcyAqLworI2RlZmluZQlTUl9XRUwJCQkyCS8qIFdyaXRlIGVuYWJsZSBsYXRjaCAqLworI2RlZmluZQlTUl9CUDAJCQk0CS8qIEJsb2NrIHByb3RlY3QgMCAqLworI2RlZmluZQlTUl9CUDEJCQk4CS8qIEJsb2NrIHByb3RlY3QgMSAqLworI2RlZmluZQlTUl9CUDIJCQkweDEwCS8qIEJsb2NrIHByb3RlY3QgMiAqLworI2RlZmluZQlTUl9TUldECQkJMHg4MAkvKiBTUiB3cml0ZSBwcm90ZWN0ICovCisKKy8qIERlZmluZSBtYXggdGltZXMgdG8gY2hlY2sgc3RhdHVzIHJlZ2lzdGVyIGJlZm9yZSB3ZSBnaXZlIHVwLiAqLworI2RlZmluZQlNQVhfUkVBRFlfV0FJVF9DT1VOVAkxMDAwMDAKKworCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisjZGVmaW5lCW10ZF9oYXNfcGFydGl0aW9ucygpCSgxKQorI2Vsc2UKKyNkZWZpbmUJbXRkX2hhc19wYXJ0aXRpb25zKCkJKDApCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBtMjVwIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCXN0cnVjdCBzZW1hcGhvcmUJbG9jazsKKwlzdHJ1Y3QgbXRkX2luZm8JCW10ZDsKKwl1bnNpZ25lZAkJcGFydGl0aW9uZWQ7CisJdTgJCQljb21tYW5kWzRdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbTI1cCAqbXRkX3RvX20yNXAoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihtdGQsIHN0cnVjdCBtMjVwLCBtdGQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMKKyAqLworCisvKgorICogUmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyLCByZXR1cm5pbmcgaXRzIHZhbHVlIGluIHRoZSBsb2NhdGlvbgorICogUmV0dXJuIHRoZSBzdGF0dXMgcmVnaXN0ZXIgdmFsdWUuCisgKiBSZXR1cm5zIG5lZ2F0aXZlIGlmIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgaW50IHJlYWRfc3Ioc3RydWN0IG0yNXAgKmZsYXNoKQoreworCXNzaXplX3QgcmV0dmFsOworCXU4IGNvZGUgPSBPUENPREVfUkRTUjsKKwl1OCB2YWw7CisKKwlyZXR2YWwgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKGZsYXNoLT5zcGksICZjb2RlLCAxLCAmdmFsLCAxKTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIoJmZsYXNoLT5zcGktPmRldiwgImVycm9yICVkIHJlYWRpbmcgU1JcbiIsCisJCQkJKGludCkgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCisKKy8qCisgKiBTZXQgd3JpdGUgZW5hYmxlIGxhdGNoIHdpdGggV3JpdGUgRW5hYmxlIGNvbW1hbmQuCisgKiBSZXR1cm5zIG5lZ2F0aXZlIGlmIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgaW5saW5lIGludCB3cml0ZV9lbmFibGUoc3RydWN0IG0yNXAgKmZsYXNoKQoreworCXU4CWNvZGUgPSBPUENPREVfV1JFTjsKKworCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKGZsYXNoLT5zcGksICZjb2RlLCAxLCBOVUxMLCAwKTsKK30KKworCisvKgorICogU2VydmljZSByb3V0aW5lIHRvIHJlYWQgc3RhdHVzIHJlZ2lzdGVyIHVudGlsIHJlYWR5LCBvciB0aW1lb3V0IG9jY3Vycy4KKyAqIFJldHVybnMgbm9uLXplcm8gaWYgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgd2FpdF90aWxsX3JlYWR5KHN0cnVjdCBtMjVwICpmbGFzaCkKK3sKKwlpbnQgY291bnQ7CisJaW50IHNyOworCisJLyogb25lIGNoaXAgZ3VhcmFudGVlcyBtYXggNSBtc2VjIHdhaXQgaGVyZSBhZnRlciBwYWdlIHdyaXRlcywKKwkgKiBidXQgcG90ZW50aWFsbHkgdGhyZWUgc2Vjb25kcyAoISkgYWZ0ZXIgcGFnZSBlcmFzZS4KKwkgKi8KKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNQVhfUkVBRFlfV0FJVF9DT1VOVDsgY291bnQrKykgeworCQlpZiAoKHNyID0gcmVhZF9zcihmbGFzaCkpIDwgMCkKKwkJCWJyZWFrOworCQllbHNlIGlmICghKHNyICYgU1JfV0lQKSkKKwkJCXJldHVybiAwOworCisJCS8qIFJFVklTSVQgc29tZXRpbWVzIHNsZWVwaW5nIHdvdWxkIGJlIGJlc3QgKi8KKwl9CisKKwlyZXR1cm4gMTsKK30KKworCisvKgorICogRXJhc2Ugb25lIHNlY3RvciBvZiBmbGFzaCBtZW1vcnkgYXQgb2Zmc2V0IGBgb2Zmc2V0Jycgd2hpY2ggaXMgYW55CisgKiBhZGRyZXNzIHdpdGhpbiB0aGUgc2VjdG9yIHdoaWNoIHNob3VsZCBiZSBlcmFzZWQuCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBlcmFzZV9zZWN0b3Ioc3RydWN0IG0yNXAgKmZsYXNoLCB1MzIgb2Zmc2V0KQoreworCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogJXMgYXQgMHglMDh4XG4iLCBmbGFzaC0+c3BpLT5kZXYuYnVzX2lkLAorCQkJX19GVU5DVElPTl9fLCBvZmZzZXQpOworCisJLyogV2FpdCB1bnRpbCBmaW5pc2hlZCBwcmV2aW91cyB3cml0ZSBjb21tYW5kLiAqLworCWlmICh3YWl0X3RpbGxfcmVhZHkoZmxhc2gpKQorCQlyZXR1cm4gMTsKKworCS8qIFNlbmQgd3JpdGUgZW5hYmxlLCB0aGVuIGVyYXNlIGNvbW1hbmRzLiAqLworCXdyaXRlX2VuYWJsZShmbGFzaCk7CisKKwkvKiBTZXQgdXAgY29tbWFuZCBidWZmZXIuICovCisJZmxhc2gtPmNvbW1hbmRbMF0gPSBPUENPREVfU0U7CisJZmxhc2gtPmNvbW1hbmRbMV0gPSBvZmZzZXQgPj4gMTY7CisJZmxhc2gtPmNvbW1hbmRbMl0gPSBvZmZzZXQgPj4gODsKKwlmbGFzaC0+Y29tbWFuZFszXSA9IG9mZnNldDsKKworCXNwaV93cml0ZShmbGFzaC0+c3BpLCBmbGFzaC0+Y29tbWFuZCwgc2l6ZW9mKGZsYXNoLT5jb21tYW5kKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBNVEQgaW1wbGVtZW50YXRpb24KKyAqLworCisvKgorICogRXJhc2UgYW4gYWRkcmVzcyByYW5nZSBvbiB0aGUgZmxhc2ggY2hpcC4gIFRoZSBhZGRyZXNzIHJhbmdlIG1heSBleHRlbmQKKyAqIG9uZSBvciBtb3JlIGVyYXNlIHNlY3RvcnMuICBSZXR1cm4gYW4gZXJyb3IgaXMgdGhlcmUgaXMgYSBwcm9ibGVtIGVyYXNpbmcuCisgKi8KK3N0YXRpYyBpbnQgbTI1cDgwX2VyYXNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpCit7CisJc3RydWN0IG0yNXAgKmZsYXNoID0gbXRkX3RvX20yNXAobXRkKTsKKwl1MzIgYWRkcixsZW47CisKKwlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6ICVzICVzIDB4JTA4eCwgbGVuICV6ZFxuIiwKKwkJCWZsYXNoLT5zcGktPmRldi5idXNfaWQsIF9fRlVOQ1RJT05fXywgImF0IiwKKwkJCSh1MzIpaW5zdHItPmFkZHIsIGluc3RyLT5sZW4pOworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmIChpbnN0ci0+YWRkciArIGluc3RyLT5sZW4gPiBmbGFzaC0+bXRkLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgoaW5zdHItPmFkZHIgJSBtdGQtPmVyYXNlc2l6ZSkgIT0gMAorCQkJfHwgKGluc3RyLT5sZW4gJSBtdGQtPmVyYXNlc2l6ZSkgIT0gMCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhZGRyID0gaW5zdHItPmFkZHI7CisJbGVuID0gaW5zdHItPmxlbjsKKworICAJZG93bigmZmxhc2gtPmxvY2spOworCisJLyogbm93IGVyYXNlIHRob3NlIHNlY3RvcnMgKi8KKwl3aGlsZSAobGVuKSB7CisJCWlmIChlcmFzZV9zZWN0b3IoZmxhc2gsIGFkZHIpKSB7CisJCQlpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRkFJTEVEOworCQkJdXAoJmZsYXNoLT5sb2NrKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJYWRkciArPSBtdGQtPmVyYXNlc2l6ZTsKKwkJbGVuIC09IG10ZC0+ZXJhc2VzaXplOworCX0KKworICAJdXAoJmZsYXNoLT5sb2NrKTsKKworCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9ET05FOworCW10ZF9lcmFzZV9jYWxsYmFjayhpbnN0cik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgYW4gYWRkcmVzcyByYW5nZSBmcm9tIHRoZSBmbGFzaCBjaGlwLiAgVGhlIGFkZHJlc3MgcmFuZ2UKKyAqIG1heSBiZSBhbnkgc2l6ZSBwcm92aWRlZCBpdCBpcyB3aXRoaW4gdGhlIHBoeXNpY2FsIGJvdW5kYXJpZXMuCisgKi8KK3N0YXRpYyBpbnQgbTI1cDgwX3JlYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLAorCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbTI1cCAqZmxhc2ggPSBtdGRfdG9fbTI1cChtdGQpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgdFsyXTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAorCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19GVU5DVElPTl9fLCAiZnJvbSIsCisJCQkodTMyKWZyb20sIGxlbik7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJaWYgKGZyb20gKyBsZW4gPiBmbGFzaC0+bXRkLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CisJbWVtc2V0KHQsIDAsIChzaXplb2YgdCkpOworCisJdFswXS50eF9idWYgPSBmbGFzaC0+Y29tbWFuZDsKKwl0WzBdLmxlbiA9IHNpemVvZihmbGFzaC0+Y29tbWFuZCk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMF0sICZtKTsKKworCXRbMV0ucnhfYnVmID0gYnVmOworCXRbMV0ubGVuID0gbGVuOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzFdLCAmbSk7CisKKwkvKiBCeXRlIGNvdW50IHN0YXJ0cyBhdCB6ZXJvLiAqLworCWlmIChyZXRsZW4pCisJCSpyZXRsZW4gPSAwOworCisJZG93bigmZmxhc2gtPmxvY2spOworCisJLyogV2FpdCB0aWxsIHByZXZpb3VzIHdyaXRlL2VyYXNlIGlzIGRvbmUuICovCisJaWYgKHdhaXRfdGlsbF9yZWFkeShmbGFzaCkpIHsKKwkJLyogUkVWSVNJVCBzdGF0dXMgcmV0dXJuPz8gKi8KKwkJdXAoJmZsYXNoLT5sb2NrKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogTk9URTogIE9QQ09ERV9GQVNUX1JFQUQgKGlmIGF2YWlsYWJsZSkgaXMgZmFzdGVyLi4uICovCisKKwkvKiBTZXQgdXAgdGhlIHdyaXRlIGRhdGEgYnVmZmVyLiAqLworCWZsYXNoLT5jb21tYW5kWzBdID0gT1BDT0RFX1JFQUQ7CisJZmxhc2gtPmNvbW1hbmRbMV0gPSBmcm9tID4+IDE2OworCWZsYXNoLT5jb21tYW5kWzJdID0gZnJvbSA+PiA4OworCWZsYXNoLT5jb21tYW5kWzNdID0gZnJvbTsKKworCXNwaV9zeW5jKGZsYXNoLT5zcGksICZtKTsKKworCSpyZXRsZW4gPSBtLmFjdHVhbF9sZW5ndGggLSBzaXplb2YoZmxhc2gtPmNvbW1hbmQpOworCisgIAl1cCgmZmxhc2gtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZSBhbiBhZGRyZXNzIHJhbmdlIHRvIHRoZSBmbGFzaCBjaGlwLiAgRGF0YSBtdXN0IGJlIHdyaXR0ZW4gaW4KKyAqIEZMQVNIX1BBR0VTSVpFIGNodW5rcy4gIFRoZSBhZGRyZXNzIHJhbmdlIG1heSBiZSBhbnkgc2l6ZSBwcm92aWRlZAorICogaXQgaXMgd2l0aGluIHRoZSBwaHlzaWNhbCBib3VuZGFyaWVzLgorICovCitzdGF0aWMgaW50IG0yNXA4MF93cml0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLAorCXNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbTI1cCAqZmxhc2ggPSBtdGRfdG9fbTI1cChtdGQpOworCXUzMiBwYWdlX29mZnNldCwgcGFnZV9zaXplOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgdFsyXTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAorCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19GVU5DVElPTl9fLCAidG8iLAorCQkJKHUzMil0bywgbGVuKTsKKworCWlmIChyZXRsZW4pCisJCSpyZXRsZW4gPSAwOworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmICghbGVuKQorCQlyZXR1cm4oMCk7CisKKwlpZiAodG8gKyBsZW4gPiBmbGFzaC0+bXRkLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CisJbWVtc2V0KHQsIDAsIChzaXplb2YgdCkpOworCisJdFswXS50eF9idWYgPSBmbGFzaC0+Y29tbWFuZDsKKwl0WzBdLmxlbiA9IHNpemVvZihmbGFzaC0+Y29tbWFuZCk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMF0sICZtKTsKKworCXRbMV0udHhfYnVmID0gYnVmOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzFdLCAmbSk7CisKKyAgCWRvd24oJmZsYXNoLT5sb2NrKTsKKworCS8qIFdhaXQgdW50aWwgZmluaXNoZWQgcHJldmlvdXMgd3JpdGUgY29tbWFuZC4gKi8KKwlpZiAod2FpdF90aWxsX3JlYWR5KGZsYXNoKSkKKwkJcmV0dXJuIDE7CisKKwl3cml0ZV9lbmFibGUoZmxhc2gpOworCisJLyogU2V0IHVwIHRoZSBvcGNvZGUgaW4gdGhlIHdyaXRlIGJ1ZmZlci4gKi8KKwlmbGFzaC0+Y29tbWFuZFswXSA9IE9QQ09ERV9QUDsKKwlmbGFzaC0+Y29tbWFuZFsxXSA9IHRvID4+IDE2OworCWZsYXNoLT5jb21tYW5kWzJdID0gdG8gPj4gODsKKwlmbGFzaC0+Y29tbWFuZFszXSA9IHRvOworCisJLyogd2hhdCBwYWdlIGRvIHdlIHN0YXJ0IHdpdGg/ICovCisJcGFnZV9vZmZzZXQgPSB0byAlIEZMQVNIX1BBR0VTSVpFOworCisJLyogZG8gYWxsIHRoZSBieXRlcyBmaXQgb250byBvbmUgcGFnZT8gKi8KKwlpZiAocGFnZV9vZmZzZXQgKyBsZW4gPD0gRkxBU0hfUEFHRVNJWkUpIHsKKwkJdFsxXS5sZW4gPSBsZW47CisKKwkJc3BpX3N5bmMoZmxhc2gtPnNwaSwgJm0pOworCisJCSpyZXRsZW4gPSBtLmFjdHVhbF9sZW5ndGggLSBzaXplb2YoZmxhc2gtPmNvbW1hbmQpOworCX0gZWxzZSB7CisJCXUzMiBpOworCisJCS8qIHRoZSBzaXplIG9mIGRhdGEgcmVtYWluaW5nIG9uIHRoZSBmaXJzdCBwYWdlICovCisJCXBhZ2Vfc2l6ZSA9IEZMQVNIX1BBR0VTSVpFIC0gcGFnZV9vZmZzZXQ7CisKKwkJdFsxXS5sZW4gPSBwYWdlX3NpemU7CisJCXNwaV9zeW5jKGZsYXNoLT5zcGksICZtKTsKKworCQkqcmV0bGVuID0gbS5hY3R1YWxfbGVuZ3RoIC0gc2l6ZW9mKGZsYXNoLT5jb21tYW5kKTsKKworCQkvKiB3cml0ZSBldmVyeXRoaW5nIGluIFBBR0VTSVpFIGNodW5rcyAqLworCQlmb3IgKGkgPSBwYWdlX3NpemU7IGkgPCBsZW47IGkgKz0gcGFnZV9zaXplKSB7CisJCQlwYWdlX3NpemUgPSBsZW4gLSBpOworCQkJaWYgKHBhZ2Vfc2l6ZSA+IEZMQVNIX1BBR0VTSVpFKQorCQkJCXBhZ2Vfc2l6ZSA9IEZMQVNIX1BBR0VTSVpFOworCisJCQkvKiB3cml0ZSB0aGUgbmV4dCBwYWdlIHRvIGZsYXNoICovCisJCQlmbGFzaC0+Y29tbWFuZFsxXSA9ICh0byArIGkpID4+IDE2OworCQkJZmxhc2gtPmNvbW1hbmRbMl0gPSAodG8gKyBpKSA+PiA4OworCQkJZmxhc2gtPmNvbW1hbmRbM10gPSAodG8gKyBpKTsKKworCQkJdFsxXS50eF9idWYgPSBidWYgKyBpOworCQkJdFsxXS5sZW4gPSBwYWdlX3NpemU7CisKKwkJCXdhaXRfdGlsbF9yZWFkeShmbGFzaCk7CisKKwkJCXdyaXRlX2VuYWJsZShmbGFzaCk7CisKKwkJCXNwaV9zeW5jKGZsYXNoLT5zcGksICZtKTsKKworCQkJaWYgKHJldGxlbikKKwkJCQkqcmV0bGVuICs9IG0uYWN0dWFsX2xlbmd0aAorCQkJCQktIHNpemVvZihmbGFzaC0+Y29tbWFuZCk7CisJICAgICAgICB9CisgCX0KKworCXVwKCZmbGFzaC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNQSSBkZXZpY2UgZHJpdmVyIHNldHVwIGFuZCB0ZWFyZG93bgorICovCisKK3N0cnVjdCBmbGFzaF9pbmZvIHsKKwljaGFyCQkqbmFtZTsKKwl1OAkJaWQ7CisJdTE2CQlqZWRlY19pZDsKKwl1bnNpZ25lZAlzZWN0b3Jfc2l6ZTsKKwl1bnNpZ25lZAluX3NlY3RvcnM7Cit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX2luZm8gX19kZXZpbml0ZGF0YSBtMjVwX2RhdGEgW10gPSB7CisJLyogUkVWSVNJVDogZmlsbCBpbiBKRURFQyBpZHMsIGZvciBwYXJ0cyB0aGF0IGhhdmUgdGhlbSAqLworCXsgIm0yNXAwNSIsIDB4MDUsIDB4MDAwMCwgMzIgKiAxMDI0LCAyIH0sCisJeyAibTI1cDEwIiwgMHgxMCwgMHgwMDAwLCAzMiAqIDEwMjQsIDQgfSwKKwl7ICJtMjVwMjAiLCAweDExLCAweDAwMDAsIDY0ICogMTAyNCwgNCB9LAorCXsgIm0yNXA0MCIsIDB4MTIsIDB4MDAwMCwgNjQgKiAxMDI0LCA4IH0sCisJeyAibTI1cDgwIiwgMHgxMywgMHgwMDAwLCA2NCAqIDEwMjQsIDE2IH0sCisJeyAibTI1cDE2IiwgMHgxNCwgMHgwMDAwLCA2NCAqIDEwMjQsIDMyIH0sCisJeyAibTI1cDMyIiwgMHgxNSwgMHgwMDAwLCA2NCAqIDEwMjQsIDY0IH0sCisJeyAibTI1cDY0IiwgMHgxNiwgMHgyMDE3LCA2NCAqIDEwMjQsIDEyOCB9LAorfTsKKworLyoKKyAqIGJvYXJkIHNwZWNpZmljIHNldHVwIHNob3VsZCBoYXZlIGVuc3VyZWQgdGhlIFNQSSBjbG9jayB1c2VkIGhlcmUKKyAqIG1hdGNoZXMgd2hhdCB0aGUgUkVBRCBjb21tYW5kIHN1cHBvcnRzLCBhdCBsZWFzdCB1bnRpbCB0aGlzIGRyaXZlcgorICogdW5kZXJzdGFuZHMgRkFTVF9SRUFEIChmb3IgY2xvY2tzIG92ZXIgMjUgTUh6KS4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgbTI1cF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhCSpkYXRhOworCXN0cnVjdCBtMjVwCQkJKmZsYXNoOworCXN0cnVjdCBmbGFzaF9pbmZvCQkqaW5mbzsKKwl1bnNpZ25lZAkJCWk7CisKKwkvKiBQbGF0Zm9ybSBkYXRhIGhlbHBzIHNvcnQgb3V0IHdoaWNoIGNoaXAgdHlwZSB3ZSBoYXZlLCBhcworCSAqIHdlbGwgYXMgaG93IHRoaXMgYm9hcmQgcGFydGl0aW9ucyBpdC4KKwkgKi8KKwlkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIWRhdGEgfHwgIWRhdGEtPnR5cGUpIHsKKwkJLyogRklYTUUgc29tZSBjaGlwcyBjYW4gaWRlbnRpZnkgdGhlbXNlbHZlcyB3aXRoIFJFUworCQkgKiBvciBKRURFQyBnZXQtaWQgY29tbWFuZHMuICBUcnkgdGhlbSAuLi4KKwkJICovCisJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogbm8gY2hpcCBpZFxuIiwKKwkJCQlmbGFzaC0+c3BpLT5kZXYuYnVzX2lkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMCwgaW5mbyA9IG0yNXBfZGF0YTsgaSA8IEFSUkFZX1NJWkUobTI1cF9kYXRhKTsgaSsrLCBpbmZvKyspIHsKKwkJaWYgKHN0cmNtcChkYXRhLT50eXBlLCBpbmZvLT5uYW1lKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChpID09IEFSUkFZX1NJWkUobTI1cF9kYXRhKSkgeworCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHVucmVjb2duaXplZCBpZCAlc1xuIiwKKwkJCQlmbGFzaC0+c3BpLT5kZXYuYnVzX2lkLCBkYXRhLT50eXBlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZmxhc2ggPSBremFsbG9jKHNpemVvZiAqZmxhc2gsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWZsYXNoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZsYXNoLT5zcGkgPSBzcGk7CisJaW5pdF9NVVRFWCgmZmxhc2gtPmxvY2spOworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIGZsYXNoKTsKKworCWlmIChkYXRhLT5uYW1lKQorCQlmbGFzaC0+bXRkLm5hbWUgPSBkYXRhLT5uYW1lOworCWVsc2UKKwkJZmxhc2gtPm10ZC5uYW1lID0gc3BpLT5kZXYuYnVzX2lkOworCisJZmxhc2gtPm10ZC50eXBlID0gTVREX05PUkZMQVNIOworCWZsYXNoLT5tdGQuZmxhZ3MgPSBNVERfQ0FQX05PUkZMQVNIOworCWZsYXNoLT5tdGQuc2l6ZSA9IGluZm8tPnNlY3Rvcl9zaXplICogaW5mby0+bl9zZWN0b3JzOworCWZsYXNoLT5tdGQuZXJhc2VzaXplID0gaW5mby0+c2VjdG9yX3NpemU7CisJZmxhc2gtPm10ZC5lcmFzZSA9IG0yNXA4MF9lcmFzZTsKKwlmbGFzaC0+bXRkLnJlYWQgPSBtMjVwODBfcmVhZDsKKwlmbGFzaC0+bXRkLndyaXRlID0gbTI1cDgwX3dyaXRlOworCisJZGV2X2luZm8oJnNwaS0+ZGV2LCAiJXMgKCVkIEtieXRlcylcbiIsIGluZm8tPm5hbWUsCisJCQlmbGFzaC0+bXRkLnNpemUgLyAxMDI0KTsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDIsCisJCSJtdGQgLm5hbWUgPSAlcywgLnNpemUgPSAweCUuOHggKCV1TSkgIgorCQkJIi5lcmFzZXNpemUgPSAweCUuOHggKCV1SykgLm51bWVyYXNlcmVnaW9ucyA9ICVkXG4iLAorCQlmbGFzaC0+bXRkLm5hbWUsCisJCWZsYXNoLT5tdGQuc2l6ZSwgZmxhc2gtPm10ZC5zaXplIC8gKDEwMjQqMTAyNCksCisJCWZsYXNoLT5tdGQuZXJhc2VzaXplLCBmbGFzaC0+bXRkLmVyYXNlc2l6ZSAvIDEwMjQsCisJCWZsYXNoLT5tdGQubnVtZXJhc2VyZWdpb25zKTsKKworCWlmIChmbGFzaC0+bXRkLm51bWVyYXNlcmVnaW9ucykKKwkJZm9yIChpID0gMDsgaSA8IGZsYXNoLT5tdGQubnVtZXJhc2VyZWdpb25zOyBpKyspCisJCQlERUJVRyhNVERfREVCVUdfTEVWRUwyLAorCQkJCSJtdGQuZXJhc2VyZWdpb25zWyVkXSA9IHsgLm9mZnNldCA9IDB4JS44eCwgIgorCQkJCSIuZXJhc2VzaXplID0gMHglLjh4ICgldUspLCAiCisJCQkJIi5udW1ibG9ja3MgPSAlZCB9XG4iLAorCQkJCWksIGZsYXNoLT5tdGQuZXJhc2VyZWdpb25zW2ldLm9mZnNldCwKKwkJCQlmbGFzaC0+bXRkLmVyYXNlcmVnaW9uc1tpXS5lcmFzZXNpemUsCisJCQkJZmxhc2gtPm10ZC5lcmFzZXJlZ2lvbnNbaV0uZXJhc2VzaXplIC8gMTAyNCwKKwkJCQlmbGFzaC0+bXRkLmVyYXNlcmVnaW9uc1tpXS5udW1ibG9ja3MpOworCisKKwkvKiBwYXJ0aXRpb25zIHNob3VsZCBtYXRjaCBzZWN0b3IgYm91bmRhcmllczsgYW5kIGl0IG1heSBiZSBnb29kIHRvCisJICogdXNlIHJlYWRvbmx5IHBhcnRpdGlvbnMgZm9yIHdyaXRlcHJvdGVjdGVkIHNlY3RvcnMgKEJQMi4uQlAwKS4KKwkgKi8KKwlpZiAobXRkX2hhc19wYXJ0aXRpb25zKCkpIHsKKwkJc3RydWN0IG10ZF9wYXJ0aXRpb24JKnBhcnRzID0gTlVMTDsKKwkJaW50CQkJbnJfcGFydHMgPSAwOworCisjaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCisJCXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMLCB9OworCisJCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJmZsYXNoLT5tdGQsCisJCQkJcGFydF9wcm9iZXMsICZwYXJ0cywgMCk7CisjZW5kaWYKKworCQlpZiAobnJfcGFydHMgPD0gMCAmJiBkYXRhICYmIGRhdGEtPnBhcnRzKSB7CisJCQlwYXJ0cyA9IGRhdGEtPnBhcnRzOworCQkJbnJfcGFydHMgPSBkYXRhLT5ucl9wYXJ0czsKKwkJfQorCisJCWlmIChucl9wYXJ0cyA+IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5ucl9wYXJ0czsgaSsrKSB7CisJCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgInBhcnRpdGlvbnNbJWRdID0gIgorCQkJCQkiey5uYW1lID0gJXMsIC5vZmZzZXQgPSAweCUuOHgsICIKKwkJCQkJCSIuc2l6ZSA9IDB4JS44eCAoJXVLKSB9XG4iLAorCQkJCQlpLCBkYXRhLT5wYXJ0c1tpXS5uYW1lLAorCQkJCQlkYXRhLT5wYXJ0c1tpXS5vZmZzZXQsCisJCQkJCWRhdGEtPnBhcnRzW2ldLnNpemUsCisJCQkJCWRhdGEtPnBhcnRzW2ldLnNpemUgLyAxMDI0KTsKKwkJCX0KKwkJCWZsYXNoLT5wYXJ0aXRpb25lZCA9IDE7CisJCQlyZXR1cm4gYWRkX210ZF9wYXJ0aXRpb25zKCZmbGFzaC0+bXRkLCBwYXJ0cywgbnJfcGFydHMpOworCQl9CisJfSBlbHNlIGlmIChkYXRhLT5ucl9wYXJ0cykKKwkJZGV2X3dhcm4oJnNwaS0+ZGV2LCAiaWdub3JpbmcgJWQgZGVmYXVsdCBwYXJ0aXRpb25zIG9uICVzXG4iLAorCQkJCWRhdGEtPm5yX3BhcnRzLCBkYXRhLT5uYW1lKTsKKworCXJldHVybiBhZGRfbXRkX2RldmljZSgmZmxhc2gtPm10ZCkgPT0gMSA/IC1FTk9ERVYgOiAwOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG0yNXBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IG0yNXAJKmZsYXNoID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisJaW50CQlzdGF0dXM7CisKKwkvKiBDbGVhbiB1cCBNVEQgc3R1ZmYuICovCisJaWYgKG10ZF9oYXNfcGFydGl0aW9ucygpICYmIGZsYXNoLT5wYXJ0aXRpb25lZCkKKwkJc3RhdHVzID0gZGVsX210ZF9wYXJ0aXRpb25zKCZmbGFzaC0+bXRkKTsKKwllbHNlCisJCXN0YXR1cyA9IGRlbF9tdGRfZGV2aWNlKCZmbGFzaC0+bXRkKTsKKwlpZiAoc3RhdHVzID09IDApCisJCWtmcmVlKGZsYXNoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgbTI1cDgwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJtMjVwODAiLAorCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJPSBtMjVwX3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChtMjVwX3JlbW92ZSksCit9OworCisKK3N0YXRpYyBpbnQgbTI1cDgwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmbTI1cDgwX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgbTI1cDgwX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJm0yNXA4MF9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KG0yNXA4MF9pbml0KTsKK21vZHVsZV9leGl0KG0yNXA4MF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWlrZSBMYXZlbmRlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgU1BJIGRyaXZlciBmb3IgU1QgTTI1UHh4IGZsYXNoIGNoaXBzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTczN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYwpAQCAtMCwwICsxLDYyOSBAQAorLyoKKyAqIEF0bWVsIEFUNDV4eHggRGF0YUZsYXNoIE1URCBkcml2ZXIgZm9yIGxpZ2h0d2VpZ2h0IFNQSSBmcmFtZXdvcmsKKyAqCisgKiBMYXJnZWx5IGRlcml2ZWQgZnJvbSBhdDkxX2RhdGFmbGFzaC5jOgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IFNBTiBQZW9wbGUgKFB0eSkgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisKKy8qCisgKiBEYXRhRmxhc2ggaXMgYSBraW5kIG9mIFNQSSBmbGFzaC4gIE1vc3QgQVQ0NSBjaGlwcyBoYXZlIHR3byBidWZmZXJzIGluCisgKiBlYWNoIGNoaXAsIHdoaWNoIG1heSBiZSB1c2VkIGZvciBkb3VibGUgYnVmZmVyZWQgSS9POyBidXQgdGhpcyBkcml2ZXIKKyAqIGRvZXNuJ3QgKHlldCkgdXNlIHRoZXNlIGZvciBhbnkga2luZCBvZiBpL28gb3ZlcmxhcCBvciBwcmVmZXRjaGluZy4KKyAqCisgKiBTb21ldGltZXMgRGF0YUZsYXNoIGlzIHBhY2thZ2VkIGluIE1NQy1mb3JtYXQgY2FyZHMsIGFsdGhvdWdoIHRoZQorICogTU1DIHN0YWNrIGNhbid0IHVzZSBTUEkgKHlldCksIG9yIGRpc3Rpbmd1aXNoIGJldHdlZW4gTU1DIGFuZCBEYXRhRmxhc2gKKyAqIHByb3RvY29scyBkdXJpbmcgZW51bWVyYXRpb24uCisgKi8KKworI2RlZmluZSBDT05GSUdfREFUQUZMQVNIX1dSSVRFX1ZFUklGWQorCisvKiByZWFkcyBjYW4gYnlwYXNzIHRoZSBidWZmZXJzICovCisjZGVmaW5lIE9QX1JFQURfQ09OVElOVU9VUwkweEU4CisjZGVmaW5lIE9QX1JFQURfUEFHRQkJMHhEMgorCisvKiBncm91cCBCIHJlcXVlc3RzIGNhbiBydW4gZXZlbiB3aGlsZSBzdGF0dXMgcmVwb3J0cyAiYnVzeSIgKi8KKyNkZWZpbmUgT1BfUkVBRF9TVEFUVVMJCTB4RDcJLyogZ3JvdXAgQiAqLworCisvKiBtb3ZlIGRhdGEgYmV0d2VlbiBob3N0IGFuZCBidWZmZXIgKi8KKyNkZWZpbmUgT1BfUkVBRF9CVUZGRVIxCQkweEQ0CS8qIGdyb3VwIEIgKi8KKyNkZWZpbmUgT1BfUkVBRF9CVUZGRVIyCQkweEQ2CS8qIGdyb3VwIEIgKi8KKyNkZWZpbmUgT1BfV1JJVEVfQlVGRkVSMQkweDg0CS8qIGdyb3VwIEIgKi8KKyNkZWZpbmUgT1BfV1JJVEVfQlVGRkVSMgkweDg3CS8qIGdyb3VwIEIgKi8KKworLyogZXJhc2luZyBmbGFzaCAqLworI2RlZmluZSBPUF9FUkFTRV9QQUdFCQkweDgxCisjZGVmaW5lIE9QX0VSQVNFX0JMT0NLCQkweDUwCisKKy8qIG1vdmUgZGF0YSBiZXR3ZWVuIGJ1ZmZlciBhbmQgZmxhc2ggKi8KKyNkZWZpbmUgT1BfVFJBTlNGRVJfQlVGMQkweDUzCisjZGVmaW5lIE9QX1RSQU5TRkVSX0JVRjIJMHg1NQorI2RlZmluZSBPUF9NUkVBRF9CVUZGRVIxCTB4RDQKKyNkZWZpbmUgT1BfTVJFQURfQlVGRkVSMgkweEQ2CisjZGVmaW5lIE9QX01XRVJBU0VfQlVGRkVSMQkweDgzCisjZGVmaW5lIE9QX01XRVJBU0VfQlVGRkVSMgkweDg2CisjZGVmaW5lIE9QX01XUklURV9CVUZGRVIxCTB4ODgJLyogc2VjdG9yIG11c3QgYmUgcHJlLWVyYXNlZCAqLworI2RlZmluZSBPUF9NV1JJVEVfQlVGRkVSMgkweDg5CS8qIHNlY3RvciBtdXN0IGJlIHByZS1lcmFzZWQgKi8KKworLyogd3JpdGUgdG8gYnVmZmVyLCB0aGVuIHdyaXRlLWVyYXNlIHRvIGZsYXNoICovCisjZGVmaW5lIE9QX1BST0dSQU1fVklBX0JVRjEJMHg4MgorI2RlZmluZSBPUF9QUk9HUkFNX1ZJQV9CVUYyCTB4ODUKKworLyogY29tcGFyZSBidWZmZXIgdG8gZmxhc2ggKi8KKyNkZWZpbmUgT1BfQ09NUEFSRV9CVUYxCQkweDYwCisjZGVmaW5lIE9QX0NPTVBBUkVfQlVGMgkJMHg2MQorCisvKiByZWFkIGZsYXNoIHRvIGJ1ZmZlciwgdGhlbiB3cml0ZS1lcmFzZSB0byBmbGFzaCAqLworI2RlZmluZSBPUF9SRVdSSVRFX1ZJQV9CVUYxCTB4NTgKKyNkZWZpbmUgT1BfUkVXUklURV9WSUFfQlVGMgkweDU5CisKKy8qIG5ld2VyIGNoaXBzIHJlcG9ydCBKRURFQyBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBJRHM7IGNoaXAKKyAqIHNlcmlhbCBudW1iZXIgYW5kIE9UUCBiaXRzOyBhbmQgcGVyLXNlY3RvciB3cml0ZXByb3RlY3QuCisgKi8KKyNkZWZpbmUgT1BfUkVBRF9JRAkJMHg5RgorI2RlZmluZSBPUF9SRUFEX1NFQ1VSSVRZCTB4NzcKKyNkZWZpbmUgT1BfV1JJVEVfU0VDVVJJVFkJMHg5QQkvKiBPVFAgYml0cyAqLworCisKK3N0cnVjdCBkYXRhZmxhc2ggeworCXU4CQkJY29tbWFuZFs0XTsKKwljaGFyCQkJbmFtZVsyNF07CisKKwl1bnNpZ25lZAkJcGFydGl0aW9uZWQ6MTsKKworCXVuc2lnbmVkIHNob3J0CQlwYWdlX29mZnNldDsJLyogb2Zmc2V0IGluIGZsYXNoIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQJCXBhZ2Vfc2l6ZTsJLyogb2YgYnl0ZXMgcGVyIHBhZ2UgKi8KKworCXN0cnVjdCBzZW1hcGhvcmUJbG9jazsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCisJc3RydWN0IG10ZF9pbmZvCQltdGQ7Cit9OworCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisjZGVmaW5lCW10ZF9oYXNfcGFydGl0aW9ucygpCSgxKQorI2Vsc2UKKyNkZWZpbmUJbXRkX2hhc19wYXJ0aXRpb25zKCkJKDApCisjZW5kaWYKKworLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLworCisvKgorICogUmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIERhdGFGbGFzaCBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRhdGFmbGFzaF9zdGF0dXMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwkvKiBOT1RFOiAgYXQ0NWRiMzIxYyBvdmVyIDI1IE1IeiB3YW50cyB0byB3cml0ZQorCSAqIGEgZHVtbXkgYnl0ZSBhZnRlciB0aGUgb3Bjb2RlLi4uCisJICovCisJcmV0dXJuIHNwaV93OHI4KHNwaSwgT1BfUkVBRF9TVEFUVVMpOworfQorCisvKgorICogUG9sbCB0aGUgRGF0YUZsYXNoIGRldmljZSB1bnRpbCBpdCBpcyBSRUFEWS4KKyAqIFRoaXMgdXN1YWxseSB0YWtlcyA1LTIwIG1zZWMgb3Igc287IG1vcmUgZm9yIHNlY3RvciBlcmFzZS4KKyAqLworc3RhdGljIGludCBkYXRhZmxhc2hfd2FpdHJlYWR5KHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50CXN0YXR1czsKKworCWZvciAoOzspIHsKKwkJc3RhdHVzID0gZGF0YWZsYXNoX3N0YXR1cyhzcGkpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBzdGF0dXMgJWQ/XG4iLAorCQkJCQlzcGktPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCQlzdGF0dXMgPSAwOworCQl9CisKKwkJaWYgKHN0YXR1cyAmICgxIDw8IDcpKQkvKiBSRFkvbkJTWSAqLworCQkJcmV0dXJuIHN0YXR1czsKKworCQltc2xlZXAoMyk7CisJfQorfQorCisvKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCisKKy8qCisgKiBFcmFzZSBwYWdlcyBvZiBmbGFzaC4KKyAqLworc3RhdGljIGludCBkYXRhZmxhc2hfZXJhc2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKK3sKKwlzdHJ1Y3QgZGF0YWZsYXNoCSpwcml2ID0gKHN0cnVjdCBkYXRhZmxhc2ggKiltdGQtPnByaXY7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IHByaXYtPnNwaTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXggPSB7IC50eF9kbWEgPSAwLCB9OworCXN0cnVjdCBzcGlfbWVzc2FnZQltc2c7CisJdW5zaWduZWQJCWJsb2Nrc2l6ZSA9IHByaXYtPnBhZ2Vfc2l6ZSA8PCAzOworCXU4CQkJKmNvbW1hbmQ7CisKKwlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6IGVyYXNlIGFkZHI9MHgleCBsZW4gMHgleFxuIiwKKwkJCXNwaS0+ZGV2LmJ1c19pZCwKKwkJCWluc3RyLT5hZGRyLCBpbnN0ci0+bGVuKTsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoKGluc3RyLT5hZGRyICsgaW5zdHItPmxlbikgPiBtdGQtPnNpemUKKwkJCXx8IChpbnN0ci0+bGVuICUgcHJpdi0+cGFnZV9zaXplKSAhPSAwCisJCQl8fCAoaW5zdHItPmFkZHIgJSBwcml2LT5wYWdlX3NpemUpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKworCXgudHhfYnVmID0gY29tbWFuZCA9IHByaXYtPmNvbW1hbmQ7CisJeC5sZW4gPSA0OworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4LCAmbXNnKTsKKworCWRvd24oJnByaXYtPmxvY2spOworCXdoaWxlIChpbnN0ci0+bGVuID4gMCkgeworCQl1bnNpZ25lZCBpbnQJcGFnZWFkZHI7CisJCWludAkJc3RhdHVzOworCQlpbnQJCWRvX2Jsb2NrOworCisJCS8qIENhbGN1bGF0ZSBmbGFzaCBwYWdlIGFkZHJlc3M7IHVzZSBibG9jayBlcmFzZSAoZm9yIHNwZWVkKSBpZgorCQkgKiB3ZSdyZSBhdCBhIGJsb2NrIGJvdW5kYXJ5IGFuZCBuZWVkIHRvIGVyYXNlIHRoZSB3aG9sZSBibG9jay4KKwkJICovCisJCXBhZ2VhZGRyID0gaW5zdHItPmFkZHIgLyBwcml2LT5wYWdlX3NpemU7CisJCWRvX2Jsb2NrID0gKHBhZ2VhZGRyICYgMHg3KSA9PSAwICYmIGluc3RyLT5sZW4gPD0gYmxvY2tzaXplOworCQlwYWdlYWRkciA9IHBhZ2VhZGRyIDw8IHByaXYtPnBhZ2Vfb2Zmc2V0OworCisJCWNvbW1hbmRbMF0gPSBkb19ibG9jayA/IE9QX0VSQVNFX0JMT0NLIDogT1BfRVJBU0VfUEFHRTsKKwkJY29tbWFuZFsxXSA9ICh1OCkocGFnZWFkZHIgPj4gMTYpOworCQljb21tYW5kWzJdID0gKHU4KShwYWdlYWRkciA+PiA4KTsKKwkJY29tbWFuZFszXSA9IDA7CisKKwkJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIkVSQVNFICVzOiAoJXgpICV4ICV4ICV4IFslaV1cbiIsCisJCQlkb19ibG9jayA/ICJibG9jayIgOiAicGFnZSIsCisJCQljb21tYW5kWzBdLCBjb21tYW5kWzFdLCBjb21tYW5kWzJdLCBjb21tYW5kWzNdLAorCQkJcGFnZWFkZHIpOworCisJCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJCSh2b2lkKSBkYXRhZmxhc2hfd2FpdHJlYWR5KHNwaSk7CisKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVyYXNlICV4LCBlcnIgJWRcbiIsCisJCQkJc3BpLT5kZXYuYnVzX2lkLCBwYWdlYWRkciwgc3RhdHVzKTsKKwkJCS8qIFJFVklTSVQ6ICBjYW4gcmV0cnkgaW5zdHItPnJldHJpZXMgdGltZXM7IG9yCisJCQkgKiBnaXZldXAgYW5kIGluc3RyLT5mYWlsX2FkZHIgPSBpbnN0ci0+YWRkcjsKKwkJCSAqLworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoZG9fYmxvY2spIHsKKwkJCWluc3RyLT5hZGRyICs9IGJsb2Nrc2l6ZTsKKwkJCWluc3RyLT5sZW4gLT0gYmxvY2tzaXplOworCQl9IGVsc2UgeworCQkJaW5zdHItPmFkZHIgKz0gcHJpdi0+cGFnZV9zaXplOworCQkJaW5zdHItPmxlbiAtPSBwcml2LT5wYWdlX3NpemU7CisJCX0KKwl9CisJdXAoJnByaXYtPmxvY2spOworCisJLyogSW5mb3JtIE1URCBzdWJzeXN0ZW0gdGhhdCBlcmFzZSBpcyBjb21wbGV0ZSAqLworCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9ET05FOworCW10ZF9lcmFzZV9jYWxsYmFjayhpbnN0cik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgZnJvbSB0aGUgRGF0YUZsYXNoIGRldmljZS4KKyAqICAgZnJvbSAgIDogU3RhcnQgb2Zmc2V0IGluIGZsYXNoIGRldmljZQorICogICBsZW4gICAgOiBBbW91bnQgdG8gcmVhZAorICogICByZXRsZW4gOiBBYm91dCBvZiBkYXRhIGFjdHVhbGx5IHJlYWQKKyAqICAgYnVmICAgIDogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEKKyAqLworc3RhdGljIGludCBkYXRhZmxhc2hfcmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCisJCQkgICAgICAgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQoreworCXN0cnVjdCBkYXRhZmxhc2gJKnByaXYgPSAoc3RydWN0IGRhdGFmbGFzaCAqKW10ZC0+cHJpdjsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXhbMl0gPSB7IHsgLnR4X2RtYSA9IDAsIH0sIH07CisJc3RydWN0IHNwaV9tZXNzYWdlCW1zZzsKKwl1bnNpZ25lZCBpbnQJCWFkZHI7CisJdTgJCQkqY29tbWFuZDsKKwlpbnQJCQlzdGF0dXM7CisKKwlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6IHJlYWQgMHgleC4uMHgleFxuIiwKKwkJcHJpdi0+c3BpLT5kZXYuYnVzX2lkLCAodW5zaWduZWQpZnJvbSwgKHVuc2lnbmVkKShmcm9tICsgbGVuKSk7CisKKwkqcmV0bGVuID0gMDsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisJaWYgKGZyb20gKyBsZW4gPiBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2FsY3VsYXRlIGZsYXNoIHBhZ2UvYnl0ZSBhZGRyZXNzICovCisJYWRkciA9ICgoKHVuc2lnbmVkKWZyb20gLyBwcml2LT5wYWdlX3NpemUpIDw8IHByaXYtPnBhZ2Vfb2Zmc2V0KQorCQkrICgodW5zaWduZWQpZnJvbSAlIHByaXYtPnBhZ2Vfc2l6ZSk7CisKKwljb21tYW5kID0gcHJpdi0+Y29tbWFuZDsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJSRUFEOiAoJXgpICV4ICV4ICV4XG4iLAorCQljb21tYW5kWzBdLCBjb21tYW5kWzFdLCBjb21tYW5kWzJdLCBjb21tYW5kWzNdKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisKKwl4WzBdLnR4X2J1ZiA9IGNvbW1hbmQ7CisJeFswXS5sZW4gPSA4OworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4WzBdLCAmbXNnKTsKKworCXhbMV0ucnhfYnVmID0gYnVmOworCXhbMV0ubGVuID0gbGVuOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4WzFdLCAmbXNnKTsKKworCWRvd24oJnByaXYtPmxvY2spOworCisJLyogQ29udGludW91cyByZWFkLCBtYXggY2xvY2sgPSBmKGNhcikgd2hpY2ggbWF5IGJlIGxlc3MgdGhhbgorCSAqIHRoZSBwZWFrIHJhdGUgYXZhaWxhYmxlLiAgU29tZSBjaGlwcyBzdXBwb3J0IGNvbW1hbmRzIHdpdGgKKwkgKiBmZXdlciAiZG9uJ3QgY2FyZSIgYnl0ZXMuICBCb3RoIGJ1ZmZlcnMgc3RheSB1bmNoYW5nZWQuCisJICovCisJY29tbWFuZFswXSA9IE9QX1JFQURfQ09OVElOVU9VUzsKKwljb21tYW5kWzFdID0gKHU4KShhZGRyID4+IDE2KTsKKwljb21tYW5kWzJdID0gKHU4KShhZGRyID4+IDgpOworCWNvbW1hbmRbM10gPSAodTgpKGFkZHIgPj4gMCk7CisJLyogcGx1cyA0ICJkb24ndCBjYXJlIiBieXRlcyAqLworCisJc3RhdHVzID0gc3BpX3N5bmMocHJpdi0+c3BpLCAmbXNnKTsKKwl1cCgmcHJpdi0+bG9jayk7CisKKwlpZiAoc3RhdHVzID49IDApIHsKKwkJKnJldGxlbiA9IG1zZy5hY3R1YWxfbGVuZ3RoIC0gODsKKwkJc3RhdHVzID0gMDsKKwl9IGVsc2UKKwkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiByZWFkICV4Li4leCAtLT4gJWRcbiIsCisJCQlwcml2LT5zcGktPmRldi5idXNfaWQsCisJCQkodW5zaWduZWQpZnJvbSwgKHVuc2lnbmVkKShmcm9tICsgbGVuKSwKKwkJCXN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFdyaXRlIHRvIHRoZSBEYXRhRmxhc2ggZGV2aWNlLgorICogICB0byAgICAgOiBTdGFydCBvZmZzZXQgaW4gZmxhc2ggZGV2aWNlCisgKiAgIGxlbiAgICA6IEFtb3VudCB0byB3cml0ZQorICogICByZXRsZW4gOiBBbW91bnQgb2YgZGF0YSBhY3R1YWxseSB3cml0dGVuCisgKiAgIGJ1ZiAgICA6IEJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhCisgKi8KK3N0YXRpYyBpbnQgZGF0YWZsYXNoX3dyaXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sCisJCQkJc2l6ZV90ICogcmV0bGVuLCBjb25zdCB1X2NoYXIgKiBidWYpCit7CisJc3RydWN0IGRhdGFmbGFzaAkqcHJpdiA9IChzdHJ1Y3QgZGF0YWZsYXNoICopbXRkLT5wcml2OworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSBwcml2LT5zcGk7CisJc3RydWN0IHNwaV90cmFuc2Zlcgl4WzJdID0geyB7IC50eF9kbWEgPSAwLCB9LCB9OworCXN0cnVjdCBzcGlfbWVzc2FnZQltc2c7CisJdW5zaWduZWQgaW50CQlwYWdlYWRkciwgYWRkciwgb2Zmc2V0LCB3cml0ZWxlbjsKKwlzaXplX3QJCQlyZW1haW5pbmcgPSBsZW47CisJdV9jaGFyCQkJKndyaXRlYnVmID0gKHVfY2hhciAqKSBidWY7CisJaW50CQkJc3RhdHVzID0gLUVJTlZBTDsKKwl1OAkJCSpjb21tYW5kOworCisJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiB3cml0ZSAweCV4Li4weCV4XG4iLAorCQlzcGktPmRldi5idXNfaWQsICh1bnNpZ25lZCl0bywgKHVuc2lnbmVkKSh0byArIGxlbikpOworCisJKnJldGxlbiA9IDA7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCWlmICgodG8gKyBsZW4pID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisKKwl4WzBdLnR4X2J1ZiA9IGNvbW1hbmQgPSBwcml2LT5jb21tYW5kOworCXhbMF0ubGVuID0gNDsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeFswXSwgJm1zZyk7CisKKwlwYWdlYWRkciA9ICgodW5zaWduZWQpdG8gLyBwcml2LT5wYWdlX3NpemUpOworCW9mZnNldCA9ICgodW5zaWduZWQpdG8gJSBwcml2LT5wYWdlX3NpemUpOworCWlmIChvZmZzZXQgKyBsZW4gPiBwcml2LT5wYWdlX3NpemUpCisJCXdyaXRlbGVuID0gcHJpdi0+cGFnZV9zaXplIC0gb2Zmc2V0OworCWVsc2UKKwkJd3JpdGVsZW4gPSBsZW47CisKKwlkb3duKCZwcml2LT5sb2NrKTsKKwl3aGlsZSAocmVtYWluaW5nID4gMCkgeworCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAid3JpdGUgQCAlaTolaSBsZW49JWlcbiIsCisJCQlwYWdlYWRkciwgb2Zmc2V0LCB3cml0ZWxlbik7CisKKwkJLyogUkVWSVNJVDoKKwkJICogKGEpIGVhY2ggcGFnZSBpbiBhIHNlY3RvciBtdXN0IGJlIHJld3JpdHRlbiBhdCBsZWFzdAorCQkgKiAgICAgb25jZSBldmVyeSAxMEsgc2libGluZyBlcmFzZS9wcm9ncmFtIG9wZXJhdGlvbnMuCisJCSAqIChiKSBmb3IgcGFnZXMgdGhhdCBhcmUgYWxyZWFkeSBlcmFzZWQsIHdlIGNvdWxkCisJCSAqICAgICB1c2UgV1JJVEUrTVdSSVRFIG5vdCBQUk9HUkFNIGZvciB+MzAlIHNwZWVkdXAuCisJCSAqIChjKSBXUklURSB0byBidWZmZXIgY291bGQgYmUgZG9uZSB3aGlsZSB3YWl0aW5nIGZvcgorCQkgKiAgICAgYSBwcmV2aW91cyBNV1JJVEUvTVdFUkFTRSB0byBjb21wbGV0ZSAuLi4KKwkJICogKGQpIGVycm9yIGhhbmRsaW5nIGhlcmUgc2VlbXMgdG8gYmUgbW9zdGx5IG1pc3NpbmcuCisJCSAqCisJCSAqIFR3byBwZXJzaXN0ZW50IGJpdHMgcGVyIHBhZ2UsIHBsdXMgYSBwZXItc2VjdG9yIGNvdW50ZXIsCisJCSAqIGNvdWxkIHN1cHBvcnQgKGEpIGFuZCAoYikgLi4uIHdlIG1pZ2h0IGNvbnNpZGVyIHVzaW5nCisJCSAqIHRoZSBzZWNvbmQgaGFsZiBvZiBzZWN0b3IgemVybywgd2hpY2ggaXMganVzdCBvbmUgYmxvY2ssCisJCSAqIHRvIHRyYWNrIHRoYXQgc3RhdGUuICAoT24gQVQ5MSwgdGhhdCBzZWN0b3Igc2hvdWxkIGFsc28KKwkJICogc3VwcG9ydCBib290LWZyb20tRGF0YUZsYXNoLikKKwkJICovCisKKwkJYWRkciA9IHBhZ2VhZGRyIDw8IHByaXYtPnBhZ2Vfb2Zmc2V0OworCisJCS8qICgxKSBNYXliZSB0cmFuc2ZlciBwYXJ0aWFsIHBhZ2UgdG8gQnVmZmVyMSAqLworCQlpZiAod3JpdGVsZW4gIT0gcHJpdi0+cGFnZV9zaXplKSB7CisJCQljb21tYW5kWzBdID0gT1BfVFJBTlNGRVJfQlVGMTsKKwkJCWNvbW1hbmRbMV0gPSAoYWRkciAmIDB4MDBGRjAwMDApID4+IDE2OworCQkJY29tbWFuZFsyXSA9IChhZGRyICYgMHgwMDAwRkYwMCkgPj4gODsKKwkJCWNvbW1hbmRbM10gPSAwOworCisJCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiVFJBTlNGRVI6ICgleCkgJXggJXggJXhcbiIsCisJCQkJY29tbWFuZFswXSwgY29tbWFuZFsxXSwgY29tbWFuZFsyXSwgY29tbWFuZFszXSk7CisKKwkJCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHhmZXIgJXUgLT4gJWQgXG4iLAorCQkJCQlzcGktPmRldi5idXNfaWQsIGFkZHIsIHN0YXR1cyk7CisKKwkJCSh2b2lkKSBkYXRhZmxhc2hfd2FpdHJlYWR5KHByaXYtPnNwaSk7CisJCX0KKworCQkvKiAoMikgUHJvZ3JhbSBmdWxsIHBhZ2UgdmlhIEJ1ZmZlcjEgKi8KKwkJYWRkciArPSBvZmZzZXQ7CisJCWNvbW1hbmRbMF0gPSBPUF9QUk9HUkFNX1ZJQV9CVUYxOworCQljb21tYW5kWzFdID0gKGFkZHIgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJY29tbWFuZFsyXSA9IChhZGRyICYgMHgwMDAwRkYwMCkgPj4gODsKKwkJY29tbWFuZFszXSA9IChhZGRyICYgMHgwMDAwMDBGRik7CisKKwkJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIlBST0dSQU06ICgleCkgJXggJXggJXhcbiIsCisJCQljb21tYW5kWzBdLCBjb21tYW5kWzFdLCBjb21tYW5kWzJdLCBjb21tYW5kWzNdKTsKKworCQl4WzFdLnR4X2J1ZiA9IHdyaXRlYnVmOworCQl4WzFdLmxlbiA9IHdyaXRlbGVuOworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ICsgMSwgJm1zZyk7CisJCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJCXNwaV90cmFuc2Zlcl9kZWwoeCArIDEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogcGdtICV1LyV1IC0+ICVkIFxuIiwKKwkJCQlzcGktPmRldi5idXNfaWQsIGFkZHIsIHdyaXRlbGVuLCBzdGF0dXMpOworCisJCSh2b2lkKSBkYXRhZmxhc2hfd2FpdHJlYWR5KHByaXYtPnNwaSk7CisKKworI2lmZGVmCUNPTkZJR19EQVRBRkxBU0hfV1JJVEVfVkVSSUZZCisKKwkJLyogKDMpIENvbXBhcmUgdG8gQnVmZmVyMSAqLworCQlhZGRyID0gcGFnZWFkZHIgPDwgcHJpdi0+cGFnZV9vZmZzZXQ7CisJCWNvbW1hbmRbMF0gPSBPUF9DT01QQVJFX0JVRjE7CisJCWNvbW1hbmRbMV0gPSAoYWRkciAmIDB4MDBGRjAwMDApID4+IDE2OworCQljb21tYW5kWzJdID0gKGFkZHIgJiAweDAwMDBGRjAwKSA+PiA4OworCQljb21tYW5kWzNdID0gMDsKKworCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiQ09NUEFSRTogKCV4KSAleCAleCAleFxuIiwKKwkJCWNvbW1hbmRbMF0sIGNvbW1hbmRbMV0sIGNvbW1hbmRbMl0sIGNvbW1hbmRbM10pOworCisJCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBjb21wYXJlICV1IC0+ICVkIFxuIiwKKwkJCQlzcGktPmRldi5idXNfaWQsIGFkZHIsIHN0YXR1cyk7CisKKwkJc3RhdHVzID0gZGF0YWZsYXNoX3dhaXRyZWFkeShwcml2LT5zcGkpOworCisJCS8qIENoZWNrIHJlc3VsdCBvZiB0aGUgY29tcGFyZSBvcGVyYXRpb24gKi8KKwkJaWYgKChzdGF0dXMgJiAoMSA8PCA2KSkgPT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY29tcGFyZSBwYWdlICV1LCBlcnIgJWRcbiIsCisJCQkJc3BpLT5kZXYuYnVzX2lkLCBwYWdlYWRkciwgc3RhdHVzKTsKKwkJCXJlbWFpbmluZyA9IDA7CisJCQlzdGF0dXMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0gZWxzZQorCQkJc3RhdHVzID0gMDsKKworI2VuZGlmCS8qIENPTkZJR19EQVRBRkxBU0hfV1JJVEVfVkVSSUZZICovCisKKwkJcmVtYWluaW5nID0gcmVtYWluaW5nIC0gd3JpdGVsZW47CisJCXBhZ2VhZGRyKys7CisJCW9mZnNldCA9IDA7CisJCXdyaXRlYnVmICs9IHdyaXRlbGVuOworCQkqcmV0bGVuICs9IHdyaXRlbGVuOworCisJCWlmIChyZW1haW5pbmcgPiBwcml2LT5wYWdlX3NpemUpCisJCQl3cml0ZWxlbiA9IHByaXYtPnBhZ2Vfc2l6ZTsKKwkJZWxzZQorCQkJd3JpdGVsZW4gPSByZW1haW5pbmc7CisJfQorCXVwKCZwcml2LT5sb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworLyoKKyAqIFJlZ2lzdGVyIERhdGFGbGFzaCBkZXZpY2Ugd2l0aCBNVEQgc3Vic3lzdGVtLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdAorYWRkX2RhdGFmbGFzaChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBjaGFyICpuYW1lLAorCQlpbnQgbnJfcGFnZXMsIGludCBwYWdlc2l6ZSwgaW50IHBhZ2VvZmZzZXQpCit7CisJc3RydWN0IGRhdGFmbGFzaAkJKnByaXY7CisJc3RydWN0IG10ZF9pbmZvCQkJKmRldmljZTsKKwlzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YQkqcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCisJcHJpdiA9IChzdHJ1Y3QgZGF0YWZsYXNoICopIGt6YWxsb2Moc2l6ZW9mICpwcml2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5pdF9NVVRFWCgmcHJpdi0+bG9jayk7CisJcHJpdi0+c3BpID0gc3BpOworCXByaXYtPnBhZ2Vfc2l6ZSA9IHBhZ2VzaXplOworCXByaXYtPnBhZ2Vfb2Zmc2V0ID0gcGFnZW9mZnNldDsKKworCS8qIG5hbWUgbXVzdCBiZSB1c2FibGUgd2l0aCBjbWRsaW5lcGFydCAqLworCXNwcmludGYocHJpdi0+bmFtZSwgInNwaSVkLiVkLSVzIiwKKwkJCXNwaS0+bWFzdGVyLT5idXNfbnVtLCBzcGktPmNoaXBfc2VsZWN0LAorCQkJbmFtZSk7CisKKwlkZXZpY2UgPSAmcHJpdi0+bXRkOworCWRldmljZS0+bmFtZSA9IChwZGF0YSAmJiBwZGF0YS0+bmFtZSkgPyBwZGF0YS0+bmFtZSA6IHByaXYtPm5hbWU7CisJZGV2aWNlLT5zaXplID0gbnJfcGFnZXMgKiBwYWdlc2l6ZTsKKwlkZXZpY2UtPmVyYXNlc2l6ZSA9IHBhZ2VzaXplOworCWRldmljZS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlkZXZpY2UtPnR5cGUgPSBNVERfREFUQUZMQVNIOworCWRldmljZS0+ZmxhZ3MgPSBNVERfQ0FQX05PUkZMQVNIOworCWRldmljZS0+ZXJhc2UgPSBkYXRhZmxhc2hfZXJhc2U7CisJZGV2aWNlLT5yZWFkID0gZGF0YWZsYXNoX3JlYWQ7CisJZGV2aWNlLT53cml0ZSA9IGRhdGFmbGFzaF93cml0ZTsKKwlkZXZpY2UtPnByaXYgPSBwcml2OworCisJZGV2X2luZm8oJnNwaS0+ZGV2LCAiJXMgKCVkIEtCeXRlcylcbiIsIG5hbWUsIGRldmljZS0+c2l6ZS8xMDI0KTsKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBwcml2KTsKKworCWlmIChtdGRfaGFzX3BhcnRpdGlvbnMoKSkgeworCQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydHM7CisJCWludAkJCW5yX3BhcnRzID0gMDsKKworI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUworCQlzdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCwgfTsKKworCQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGRldmljZSwgcGFydF9wcm9iZXMsICZwYXJ0cywgMCk7CisjZW5kaWYKKworCQlpZiAobnJfcGFydHMgPD0gMCAmJiBwZGF0YSAmJiBwZGF0YS0+cGFydHMpIHsKKwkJCXBhcnRzID0gcGRhdGEtPnBhcnRzOworCQkJbnJfcGFydHMgPSBwZGF0YS0+bnJfcGFydHM7CisJCX0KKworCQlpZiAobnJfcGFydHMgPiAwKSB7CisJCQlwcml2LT5wYXJ0aXRpb25lZCA9IDE7CisJCQlyZXR1cm4gYWRkX210ZF9wYXJ0aXRpb25zKGRldmljZSwgcGFydHMsIG5yX3BhcnRzKTsKKwkJfQorCX0gZWxzZSBpZiAocGRhdGEgJiYgcGRhdGEtPm5yX3BhcnRzKQorCQlkZXZfd2Fybigmc3BpLT5kZXYsICJpZ25vcmluZyAlZCBkZWZhdWx0IHBhcnRpdGlvbnMgb24gJXNcbiIsCisJCQkJcGRhdGEtPm5yX3BhcnRzLCBkZXZpY2UtPm5hbWUpOworCisJcmV0dXJuIGFkZF9tdGRfZGV2aWNlKGRldmljZSkgPT0gMSA/IC1FTk9ERVYgOiAwOworfQorCisvKgorICogRGV0ZWN0IGFuZCBpbml0aWFsaXplIERhdGFGbGFzaCBkZXZpY2U6CisgKgorICogICBEZXZpY2UgICAgICBEZW5zaXR5ICAgICAgICAgSUQgY29kZSAgICAgICAgICAjUGFnZXMgUGFnZVNpemUgIE9mZnNldAorICogICBBVDQ1REIwMTFCICAxTWJpdCAgICgxMjhLKSAgeHgwMDExeHggKDB4MGMpICAgIDUxMiAgICAyNjQgICAgICA5CisgKiAgIEFUNDVEQjAyMUIgIDJNYml0ICAgKDI1NkspICB4eDAxMDF4eCAoMHgxNCkgICAxMDI1ICAgIDI2NCAgICAgIDkKKyAqICAgQVQ0NURCMDQxQiAgNE1iaXQgICAoNTEySykgIHh4MDExMXh4ICgweDFjKSAgIDIwNDggICAgMjY0ICAgICAgOQorICogICBBVDQ1REIwODFCICA4TWJpdCAgICgxTSkgICAgeHgxMDAxeHggKDB4MjQpICAgNDA5NiAgICAyNjQgICAgICA5CisgKiAgIEFUNDVEQjAxNjFCIDE2TWJpdCAgKDJNKSAgICB4eDEwMTF4eCAoMHgyYykgICA0MDk2ICAgIDUyOCAgICAgMTAKKyAqICAgQVQ0NURCMDMyMUIgMzJNYml0ICAoNE0pICAgIHh4MTEwMXh4ICgweDM0KSAgIDgxOTIgICAgNTI4ICAgICAxMAorICogICBBVDQ1REIwNjQyICA2NE1iaXQgICg4TSkgICAgeHgxMTF4eHggKDB4M2MpICAgODE5MiAgIDEwNTYgICAgIDExCisgKiAgIEFUNDVEQjEyODIgIDEyOE1iaXQgKDE2TSkgICB4eDAxMDB4eCAoMHgxMCkgIDE2Mzg0ICAgMTA1NiAgICAgMTEKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgZGF0YWZsYXNoX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRhdGFmbGFzaF9zdGF0dXMoc3BpKTsKKwlpZiAoc3RhdHVzIDw9IDAgfHwgc3RhdHVzID09IDB4ZmYpIHsKKwkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBzdGF0dXMgZXJyb3IgJWRcbiIsCisJCQkJc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQlpZiAoc3RhdHVzID09IDB4ZmYpCisJCQlzdGF0dXMgPSAtRU5PREVWOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIGlmIHRoZXJlJ3MgYSBkZXZpY2UgdGhlcmUsIGFzc3VtZSBpdCdzIGRhdGFmbGFzaC4KKwkgKiBib2FyZCBzZXR1cCBzaG91bGQgaGF2ZSBzZXQgc3BpLT5tYXhfc3BlZWRfbWF4IHRvCisJICogbWF0Y2ggZihjYXIpIGZvciBjb250aW51b3VzIHJlYWRzLCBtb2RlIDAgb3IgMy4KKwkgKi8KKwlzd2l0Y2ggKHN0YXR1cyAmIDB4M2MpIHsKKwljYXNlIDB4MGM6CS8qIDAgMCAxIDEgeCB4ICovCisJCXN0YXR1cyA9IGFkZF9kYXRhZmxhc2goc3BpLCAiQVQ0NURCMDExQiIsIDUxMiwgMjY0LCA5KTsKKwkJYnJlYWs7CisJY2FzZSAweDE0OgkvKiAwIDEgMCAxIHggeCAqLworCQlzdGF0dXMgPSBhZGRfZGF0YWZsYXNoKHNwaSwgIkFUNDVEQjAyMUIiLCAxMDI1LCAyNjQsIDkpOworCQlicmVhazsKKwljYXNlIDB4MWM6CS8qIDAgMSAxIDEgeCB4ICovCisJCXN0YXR1cyA9IGFkZF9kYXRhZmxhc2goc3BpLCAiQVQ0NURCMDQxeCIsIDIwNDgsIDI2NCwgOSk7CisJCWJyZWFrOworCWNhc2UgMHgyNDoJLyogMSAwIDAgMSB4IHggKi8KKwkJc3RhdHVzID0gYWRkX2RhdGFmbGFzaChzcGksICJBVDQ1REIwODFCIiwgNDA5NiwgMjY0LCA5KTsKKwkJYnJlYWs7CisJY2FzZSAweDJjOgkvKiAxIDAgMSAxIHggeCAqLworCQlzdGF0dXMgPSBhZGRfZGF0YWZsYXNoKHNwaSwgIkFUNDVEQjE2MXgiLCA0MDk2LCA1MjgsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSAweDM0OgkvKiAxIDEgMCAxIHggeCAqLworCQlzdGF0dXMgPSBhZGRfZGF0YWZsYXNoKHNwaSwgIkFUNDVEQjMyMXgiLCA4MTkyLCA1MjgsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSAweDM4OgkvKiAxIDEgMSB4IHggeCAqLworCWNhc2UgMHgzYzoKKwkJc3RhdHVzID0gYWRkX2RhdGFmbGFzaChzcGksICJBVDQ1REI2NDJ4IiwgODE5MiwgMTA1NiwgMTEpOworCQlicmVhazsKKwkvKiBvYnNvbGV0ZSBBVDQ1REIxMjgyIG5vdCAoeWV0Pykgc3VwcG9ydGVkICovCisJZGVmYXVsdDoKKwkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiB1bnN1cHBvcnRlZCBkZXZpY2UgKCV4KVxuIiwKKwkJCQlzcGktPmRldi5idXNfaWQsIHN0YXR1cyAmIDB4M2MpOworCQlzdGF0dXMgPSAtRU5PREVWOworCX0KKworCWlmIChzdGF0dXMgPCAwKQorCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IGFkZF9kYXRhZmxhc2ggLS0+ICVkXG4iLAorCQkJCXNwaS0+ZGV2LmJ1c19pZCwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRhdGFmbGFzaF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgZGF0YWZsYXNoCSpmbGFzaCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOworCWludAkJCXN0YXR1czsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogcmVtb3ZlXG4iLCBzcGktPmRldi5idXNfaWQpOworCisJaWYgKG10ZF9oYXNfcGFydGl0aW9ucygpICYmIGZsYXNoLT5wYXJ0aXRpb25lZCkKKwkJc3RhdHVzID0gZGVsX210ZF9wYXJ0aXRpb25zKCZmbGFzaC0+bXRkKTsKKwllbHNlCisJCXN0YXR1cyA9IGRlbF9tdGRfZGV2aWNlKCZmbGFzaC0+bXRkKTsKKwlpZiAoc3RhdHVzID09IDApCisJCWtmcmVlKGZsYXNoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgZGF0YWZsYXNoX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAibXRkX2RhdGFmbGFzaCIsCisJCS5idXMJCT0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCX0sCisKKwkucHJvYmUJCT0gZGF0YWZsYXNoX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZGF0YWZsYXNoX3JlbW92ZSksCisKKwkvKiBGSVhNRTogIGludmVzdGlnYXRlIHN1c3BlbmQgYW5kIHJlc3VtZS4uLiAqLworfTsKKworc3RhdGljIGludCBfX2luaXQgZGF0YWZsYXNoX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmZGF0YWZsYXNoX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChkYXRhZmxhc2hfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkYXRhZmxhc2hfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmZGF0YWZsYXNoX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChkYXRhZmxhc2hfZXhpdCk7CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQW5kcmV3IFZpY3RvciwgRGF2aWQgQnJvd25lbGwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVREIERhdGFGbGFzaCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwppbmRleCA4NTRkZGZiLi5mMmE2MzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCkBAIC0xNjksOSArMTY5LDkgQEAKIAkJaW5kZXggPSBuZXh0X2luZGV4OwogCX0KIAotCV91bmxvY2tfdHhfaGFzaHRibChib25kKTsKLQogCXRsYl9pbml0X3NsYXZlKHNsYXZlKTsKKworCV91bmxvY2tfdHhfaGFzaHRibChib25kKTsKIH0KIAogLyogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBtb25pdG9yIHRpbWVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaCBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oCmluZGV4IGYyMGJiODUuLjNkZDc4ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oCkBAIC0yMiw4ICsyMiw4IEBACiAjaW5jbHVkZSAiYm9uZF8zYWQuaCIKICNpbmNsdWRlICJib25kX2FsYi5oIgogCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIzLjAuMCIKLSNkZWZpbmUgRFJWX1JFTERBVEUJIk5vdmVtYmVyIDgsIDIwMDUiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIzLjAuMSIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIkphbnVhcnkgOSwgMjAwNiIKICNkZWZpbmUgRFJWX05BTUUJImJvbmRpbmciCiAjZGVmaW5lIERSVl9ERVNDUklQVElPTgkiRXRoZXJuZXQgQ2hhbm5lbCBCb25kaW5nIERyaXZlciIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMC5jIGIvZHJpdmVycy9uZXQvZTEwMC5jCmluZGV4IDIyY2QwNDUuLjIzZGUyMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAuYworKysgYi9kcml2ZXJzL25ldC9lMTAwLmMKQEAgLTEzMiw2ICsxMzIsMTAgQEAKICAqIAlUT0RPOgogICogCW8gc2V2ZXJhbCBlbnRyeSBwb2ludHMgcmFjZSB3aXRoIGRldi0+Y2xvc2UKICAqIAlvIGNoZWNrIGZvciB0eC1uby1yZXNvdXJjZXMvc3RvcCBRIHJhY2VzIHdpdGggdHggY2xlYW4vd2FrZSBRCisgKgorICoJRklYRVM6CisgKiAyMDA1LzEyLzAyIC0gTWljaGFlbCBPJ0Rvbm5lbGwgPE1pY2hhZWwuT0Rvbm5lbGwgYXQgc3RyYXR1cyBkb3QgY29tPgorICoJLSBTdHJhdHVzODcyNDc6IHByb3RlY3QgTURJIGNvbnRyb2wgcmVnaXN0ZXIgbWFuaXB1bGF0aW9ucwogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTU3OCw2ICs1ODIsNyBAQAogCXUxNiBsZWRzOwogCXUxNiBlZXByb21fd2M7CiAJdTE2IGVlcHJvbVsyNTZdOworCXNwaW5sb2NrX3QgbWRpb19sb2NrOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIGUxMDBfd3JpdGVfZmx1c2goc3RydWN0IG5pYyAqbmljKQpAQCAtODc2LDE1ICs4ODEsMzUgQEAKIHsKIAl1MzIgZGF0YV9vdXQgPSAwOwogCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKworCS8qCisJICogU3RyYXR1czg3MjQ3OiB3ZSBzaG91bGRuJ3QgYmUgd3JpdGluZyB0aGUgTURJIGNvbnRyb2wKKwkgKiByZWdpc3RlciB1bnRpbCB0aGUgUmVhZHkgYml0IHNob3dzIFRydWUuICBBbHNvLCBzaW5jZQorCSAqIG1hbmlwdWxhdGlvbiBvZiB0aGUgTURJIGNvbnRyb2wgcmVnaXN0ZXJzIGlzIGEgbXVsdGktc3RlcAorCSAqIHByb2NlZHVyZSBpdCBzaG91bGQgYmUgZG9uZSB1bmRlciBsb2NrLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZuaWMtPm1kaW9fbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDEwMDsgaTsgLS1pKSB7CisJCWlmIChyZWFkbCgmbmljLT5jc3ItPm1kaV9jdHJsKSAmIG1kaV9yZWFkeSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMjApOworCX0KKwlpZiAodW5saWtlbHkoIWkpKSB7CisJCXByaW50aygiZTEwMC5tZGlvX2N0cmwoJXMpIHdvbid0IGdvIFJlYWR5XG4iLAorCQkJbmljLT5uZXRkZXYtPm5hbWUgKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmljLT5tZGlvX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CQkvKiBObyB3YXkgdG8gaW5kaWNhdGUgdGltZW91dCBlcnJvciAqLworCX0KIAl3cml0ZWwoKHJlZyA8PCAxNikgfCAoYWRkciA8PCAyMSkgfCBkaXIgfCBkYXRhLCAmbmljLT5jc3ItPm1kaV9jdHJsKTsKIAotCWZvcihpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAJCXVkZWxheSgyMCk7Ci0JCWlmKChkYXRhX291dCA9IHJlYWRsKCZuaWMtPmNzci0+bWRpX2N0cmwpKSAmIG1kaV9yZWFkeSkKKwkJaWYgKChkYXRhX291dCA9IHJlYWRsKCZuaWMtPmNzci0+bWRpX2N0cmwpKSAmIG1kaV9yZWFkeSkKIAkJCWJyZWFrOwogCX0KLQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5pYy0+bWRpb19sb2NrLCBmbGFncyk7CiAJRFBSSU5USyhIVywgREVCVUcsCiAJCSIlczphZGRyPSVkLCByZWc9JWQsIGRhdGFfaW49MHglMDRYLCBkYXRhX291dD0weCUwNFhcbiIsCiAJCWRpciA9PSBtZGlfcmVhZCA/ICJSRUFEIiA6ICJXUklURSIsIGFkZHIsIHJlZywgZGF0YSwgZGF0YV9vdXQpOwpAQCAtMjU2Miw2ICsyNTg3LDcgQEAKIAkvKiBsb2NrcyBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIGh3X3Jlc2V0ICovCiAJc3Bpbl9sb2NrX2luaXQoJm5pYy0+Y2JfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJm5pYy0+Y21kX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZuaWMtPm1kaW9fbG9jayk7CiAKIAkvKiBSZXNldCB0aGUgZGV2aWNlIGJlZm9yZSBwY2lfc2V0X21hc3RlcigpIGluIGNhc2UgZGV2aWNlIGlzIGluIHNvbWUKIAkgKiBmdW5reSBzdGF0ZSBhbmQgaGFzIGFuIGludGVycnVwdCBwZW5kaW5nIC0gaGludDogd2UgZG9uJ3QgaGF2ZSB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwppbmRleCAxNDZmOTUxLi4wYzE4ZGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyLmMKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCkBAIC04NCw2ICs4NCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMzk4LDEyICszOTksMTUgQEAKIAkJcHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfR0lHQUJJVCA/CiAJCVNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCA6IDA7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKKwljaGFyIHBoeV9pZFtCVVNfSURfU0laRV07CiAKIAlwcml2LT5vbGRsaW5rID0gMDsKIAlwcml2LT5vbGRzcGVlZCA9IDA7CiAJcHJpdi0+b2xkZHVwbGV4ID0gLTE7CiAKLQlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHByaXYtPmVpbmZvLT5idXNfaWQsICZhZGp1c3RfbGluaywgMCk7CisJc25wcmludGYocGh5X2lkLCBCVVNfSURfU0laRSwgUEhZX0lEX0ZNVCwgcHJpdi0+ZWluZm8tPmJ1c19pZCwgcHJpdi0+ZWluZm8tPnBoeV9pZCk7CisKKwlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHBoeV9pZCwgJmFkanVzdF9saW5rLCAwKTsKIAogCWlmIChJU19FUlIocGh5ZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYXR0YWNoIHRvIFBIWVxuIiwgZGV2LT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmMgYi9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jCmluZGV4IDA0YTQ2MmMuLjc0ZTUyZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmMKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9taWkuYwpAQCAtMTI4LDYgKzEyOCw3IEBACiAJc3RydWN0IGdpYW5mYXJfbWRpb19kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgZ2Zhcl9taWkgKnJlZ3M7CiAJc3RydWN0IG1paV9idXMgKm5ld19idXM7CisJc3RydWN0IHJlc291cmNlICpyOwogCWludCBlcnIgPSAwOwogCiAJaWYgKE5VTEwgPT0gZGV2KQpAQCAtMTUxLDggKzE1MiwxMCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwogCS8qIFNldCB0aGUgUEhZIGJhc2UgYWRkcmVzcyAqLwotCXJlZ3MgPSAoc3RydWN0IGdmYXJfbWlpICopIGlvcmVtYXAocGRhdGEtPnBhZGRyLCAKKwlyZWdzID0gKHN0cnVjdCBnZmFyX21paSAqKSBpb3JlbWFwKHItPnN0YXJ0LAogCQkJc2l6ZW9mIChzdHJ1Y3QgZ2Zhcl9taWkpKTsKIAogCWlmIChOVUxMID09IHJlZ3MpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwbGFuY2UuYyBiL2RyaXZlcnMvbmV0L2hwbGFuY2UuYwppbmRleCAwODcwM2Q2Li5kODQxMDYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ocGxhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvaHBsYW5jZS5jCkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgICAgbHAtPmxhbmNlLm5hbWUgPSAoY2hhciopZC0+bmFtZTsgICAgICAgICAgICAgICAgLyogZGlzY2FyZHMgY29uc3QsIHNodXQgdXAgZ2NjICovCiAgICAgICAgIGxwLT5sYW5jZS5iYXNlID0gdmE7CiAgICAgICAgIGxwLT5sYW5jZS5pbml0X2Jsb2NrID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopKHZhICsgSFBMQU5DRV9NRU1PRkYpOyAvKiBDUFUgYWRkciAqLwotICAgICAgICBscC0+bGFuY2UubGFuY2VfaW5pdF9ibG9jayA9IDA7ICAgICAgICAgICAgICAgICAvKiBMQU5DRSBhZGRyIG9mIHNhbWUgUkFNICovCisgICAgICAgIGxwLT5sYW5jZS5sYW5jZV9pbml0X2Jsb2NrID0gTlVMTDsgICAgICAgICAgICAgIC8qIExBTkNFIGFkZHIgb2Ygc2FtZSBSQU0gKi8KICAgICAgICAgbHAtPmxhbmNlLmJ1c21hc3Rlcl9yZWd2YWwgPSBMRV9DM19CU1dQOyAgICAgICAgLyogd2UncmUgYmlnZW5kaWFuICovCiAgICAgICAgIGxwLT5sYW5jZS5pcnEgPSBkLT5pcGw7CiAgICAgICAgIGxwLT5sYW5jZS53cml0ZXJhcCA9IGhwbGFuY2Vfd3JpdGVyYXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYyBiL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jCmluZGV4IDc3ZWFkZjguLmYwZjA0YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jCkBAIC01OTAsOSArNTkwLDkgQEAKIHsKIAlzdHJ1Y3QgdmV0aF9scGV2ZW50ICp2ZXRoX2V2ZW50ID0gKHN0cnVjdCB2ZXRoX2xwZXZlbnQgKilldmVudDsKIAotCWlmIChldmVudC0+eEZsYWdzLnhGdW5jdGlvbiA9PSBIdkxwRXZlbnRfRnVuY3Rpb25fQWNrKQorCWlmIChodmxwZXZlbnRfaXNfYWNrKGV2ZW50KSkKIAkJdmV0aF9oYW5kbGVfYWNrKHZldGhfZXZlbnQpOwotCWVsc2UgaWYgKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9JbnQpCisJZWxzZQogCQl2ZXRoX2hhbmRsZV9pbnQodmV0aF9ldmVudCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hYzgzOTAuYyBiL2RyaXZlcnMvbmV0L21hYzgzOTAuYwppbmRleCBkOGM5OWYwLi4wNmNiNDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWM4MzkwLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjODM5MC5jCkBAIC01NTksNTUgKzU1OSw1MiBAQAogLyogZGlyZWN0bHkgZnJvbSBkYXluYXBvcnQuYyBieSBBbGFuIENveCAqLwogc3RhdGljIHZvaWQgZGF5bmFfbWVtY3B5X2Zyb21jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnRvLCBpbnQgZnJvbSwgaW50IGNvdW50KQogewotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpwdHI7Ci0JdW5zaWduZWQgc2hvcnQgKnRhcmdldD10bzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwdHI7CisJdW5zaWduZWQgY2hhciAqdGFyZ2V0PXRvOwogCWZyb208PD0xOwkvKiB3b3JkLCBza2lwIG92ZXJoZWFkICovCi0JcHRyPSh1bnNpZ25lZCBzaG9ydCAqKShkZXYtPm1lbV9zdGFydCtmcm9tKTsKKwlwdHI9KHVuc2lnbmVkIGNoYXIgKikoZGV2LT5tZW1fc3RhcnQrZnJvbSk7CiAJLyogTGVhZGluZyBieXRlPyAqLwogCWlmIChmcm9tJjIpIHsKLQkJKigoY2hhciAqKXRhcmdldCkrKyA9ICooKChjaGFyICopcHRyKyspLTEpOworCQkqdGFyZ2V0KysgPSBwdHJbLTFdOworCQlwdHIgKz0gMjsKIAkJY291bnQtLTsKIAl9CiAJd2hpbGUoY291bnQ+PTIpCiAJewotCQkqdGFyZ2V0Kys9KnB0cisrOwkvKiBDb3B5IGFuZCAqLwotCQlwdHIrKzsJCQkvKiBza2lwIGNydWZ0ICovCisJCSoodW5zaWduZWQgc2hvcnQgKil0YXJnZXQgPSAqKHVuc2lnbmVkIHNob3J0IHZvbGF0aWxlICopcHRyOworCQlwdHIgKz0gNDsJCQkvKiBza2lwIGNydWZ0ICovCisJCXRhcmdldCArPSAyOwogCQljb3VudC09MjsKIAl9CiAJLyogVHJhaWxpbmcgYnl0ZT8gKi8KIAlpZihjb3VudCkKLQl7Ci0JCS8qIEJpZyBlbmRpYW4gKi8KLQkJdW5zaWduZWQgc2hvcnQgdj0qcHRyOwotCQkqKChjaGFyICopdGFyZ2V0KT12Pj44OwotCX0KKwkJKnRhcmdldCA9ICpwdHI7CiB9CiAKIHN0YXRpYyB2b2lkIGRheW5hX21lbWNweV90b2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgY291bnQpCiB7CiAJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnB0cjsKLQljb25zdCB1bnNpZ25lZCBzaG9ydCAqc3JjPWZyb207CisJY29uc3QgdW5zaWduZWQgY2hhciAqc3JjPWZyb207CiAJdG88PD0xOwkvKiB3b3JkLCBza2lwIG92ZXJoZWFkICovCiAJcHRyPSh1bnNpZ25lZCBzaG9ydCAqKShkZXYtPm1lbV9zdGFydCt0byk7CiAJLyogTGVhZGluZyBieXRlPyAqLwogCWlmICh0byYyKSB7IC8qIGF2b2lkIGEgYnl0ZSB3cml0ZSAoc3RvbXBzIG9uIG90aGVyIGRhdGEpICovCi0JCXB0clstMV0gPSAocHRyWy0xXSYweEZGMDApfCooKHVuc2lnbmVkIGNoYXIgKilzcmMpKys7CisJCXB0clstMV0gPSAocHRyWy0xXSYweEZGMDApfCpzcmMrKzsKIAkJcHRyKys7CiAJCWNvdW50LS07CiAJfQogCXdoaWxlKGNvdW50Pj0yKQogCXsKLQkJKnB0cisrPSpzcmMrKzsJCS8qIENvcHkgYW5kICovCisJCSpwdHIrKz0qKHVuc2lnbmVkIHNob3J0ICopc3JjOwkJLyogQ29weSBhbmQgKi8KIAkJcHRyKys7CQkJLyogc2tpcCBjcnVmdCAqLworCQlzcmMgKz0gMjsKIAkJY291bnQtPTI7CiAJfQogCS8qIFRyYWlsaW5nIGJ5dGU/ICovCiAJaWYoY291bnQpCiAJewotCQkvKiBCaWcgZW5kaWFuICovCi0JCXVuc2lnbmVkIHNob3J0IHY9KnNyYzsKIAkJLyogY2FyZCBkb2Vzbid0IGxpa2UgYnl0ZSB3cml0ZXMgKi8KLQkJKnB0cj0oKnB0ciYweDAwRkYpfCh2JjB4RkYwMCk7CisJCSpwdHI9KCpwdHImMHgwMEZGKXwoKnNyYyA8PCA4KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9tZGlvX2J1cy5jIGIvZHJpdmVycy9uZXQvcGh5L21kaW9fYnVzLmMKaW5kZXggMDI5NDBjMC4uNDU5NDQzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L21kaW9fYnVzLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L21kaW9fYnVzLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAogCQkJcGh5ZGV2LT5kZXYucGFyZW50ID0gYnVzLT5kZXY7CiAJCQlwaHlkZXYtPmRldi5idXMgPSAmbWRpb19idXNfdHlwZTsKLQkJCXNwcmludGYocGh5ZGV2LT5kZXYuYnVzX2lkLCAicGh5JWQ6JWQiLCBidXMtPmlkLCBpKTsKKwkJCXNucHJpbnRmKHBoeWRldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsIFBIWV9JRF9GTVQsIGJ1cy0+aWQsIGkpOwogCiAJCQlwaHlkZXYtPmJ1cyA9IGJ1czsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeS5jIGIvZHJpdmVycy9uZXQvcGh5L3BoeS5jCmluZGV4IGI4Njg2ZTQuLjE0NzRiN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9waHkuYworKysgYi9kcml2ZXJzL25ldC9waHkvcGh5LmMKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogdm9pZCBwaHlfcHJpbnRfc3RhdHVzKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7Ci0JcHJfaW5mbygiJXM6IExpbmsgaXMgJXMiLCBwaHlkZXYtPmRldi5idXNfaWQsCisJcHJfaW5mbygiUEhZOiAlcyAtIExpbmsgaXMgJXMiLCBwaHlkZXYtPmRldi5idXNfaWQsCiAJCQlwaHlkZXYtPmxpbmsgPyAiVXAiIDogIkRvd24iKTsKIAlpZiAocGh5ZGV2LT5saW5rKQogCQlwcmludGsoIiAtICVkLyVzIiwgcGh5ZGV2LT5zcGVlZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jIGIvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMKaW5kZXggNWM4ZmNkNC4uMDFiZGIyMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCkBAIC0zODksNyArMzg5LDcgQEAKIAlkZXYtPnN0b3AgPSAmbGFuY2VfY2xvc2U7CiAJZGV2LT5nZXRfc3RhdHMgPSAmbGFuY2VfZ2V0X3N0YXRzOwogCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKLQlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IDA7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBOVUxMOwogLy8JS0xVREdFIC0tIFJFTU9WRSBNRQogCXNldF9iaXQoX19MSU5LX1NUQVRFX1BSRVNFTlQsICZkZXYtPnN0YXRlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdWxpNTI2eC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvdWxpNTI2eC5jCmluZGV4IDFhNDMxNjMzLi45ODM5ODE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvdWxpNTI2eC5jCkBAIC0xNjg5LDkgKzE2ODksOSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJVTGkgTTUyNjEvTTUyNjMgZmFzdCBldGhlcm5ldCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotTU9EVUxFX1BBUk0oZGVidWcsICJpIik7Ci1NT0RVTEVfUEFSTShtb2RlLCAiaSIpOwotTU9EVUxFX1BBUk0oY3I2c2V0LCAiaSIpOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKG1vZGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY3I2c2V0LCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlVMaSBNNTI2MS9NNTI2MyBlbmFibGUgZGVidWdnaW5nICgwLTEpIik7CiBNT0RVTEVfUEFSTV9ERVNDKG1vZGUsICJVTGkgTTUyNjEvTTUyNjM6IEJpdCAwOiAxMC8xMDBNYnBzLCBiaXQgMjogZHVwbGV4LCBiaXQgODogSG9tZVBOQSIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYyBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCmluZGV4IDgyYzZiNzUuLmMyZDU5MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCkBAIC03OTEsNyArNzkxLDcgQEAKICNlbmRpZgogCiAJaWYgKHZwdHItPmZsYWdzICYgVkVMT0NJVFlfRkxBR1NfVFhfQ1NVTSkgewotCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfQ1NVTTsKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU07CiAJfQogCiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZwppbmRleCAyNGY3OTY3Li5jMWE2ZTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKQEAgLTI0Myw3ICsyNDMsNyBAQAogCiBjb25maWcgQUlSTwogCXRyaXN0YXRlICJDaXNjby9BaXJvbmV0IDM0WC8zNVgvNDUwMC80ODAwIElTQSBhbmQgUENJIGNhcmRzIgotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIElTQV9ETUFfQVBJICYmIChQQ0kgfHwgQlJPS0VOKQorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIElTQV9ETUFfQVBJICYmIENSWVBUTyAmJiAoUENJIHx8IEJST0tFTikKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIHRoZSBzdGFuZGFyZCBMaW51eCBkcml2ZXIgdG8gc3VwcG9ydCBDaXNjby9BaXJvbmV0IElTQSBhbmQKIAkgIFBDSSA4MDIuMTEgd2lyZWxlc3MgY2FyZHMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwppbmRleCBlNDcyOWRkLi5mMGNjZmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKQEAgLTE0MDcsNiArMTQwNywxNyBAQAogewogCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCS8qIFNlbmQgZXZlbnQgdG8gdXNlcnNwYWNlIHRoYXQgd2UgYXJlIGRpc2Fzc29jaWF0aW5nICovCisJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9SRUFEWSkgeworCQl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisKKwkJd3JxdS5kYXRhLmxlbmd0aCA9IDA7CisJCXdycXUuZGF0YS5mbGFncyA9IDA7CisJCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCQl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisJfQorCiAJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9ET1dOKTsKIAogCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpCkBAIC0xNzgwLDEwICsxNzkxLDEwIEBACiAJCQlwcml2LT53ZXBfaXNfb24gPSAxOwogCQkJcHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZCA9IDE7CiAJCQlpZiAocHJpdi0+d2VwX2tleV9sZW5baW5kZXhdID4gNSkgewotCQkJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9XRVBfNjQ7CisJCQkJcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX1dFUF8xMjg7CiAJCQkJcHJpdi0+ZW5jcnlwdGlvbl9sZXZlbCA9IDI7CiAJCQl9IGVsc2UgewotCQkJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9XRVBfMTI4OworCQkJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9XRVBfNjQ7CiAJCQkJcHJpdi0+ZW5jcnlwdGlvbl9sZXZlbCA9IDE7CiAJCQl9CiAJCX0KQEAgLTE4NTMsNiArMTg2NCwxODEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhdG1lbF9zZXRfZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKwlpbnQgaWR4LCBrZXlfbGVuOworCisJLyogRGV0ZXJtaW5lIGFuZCB2YWxpZGF0ZSB0aGUga2V5IGluZGV4ICovCisJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChpZHgpIHsKKwkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWR4LS07CisJfSBlbHNlCisJCWlkeCA9IHByaXYtPmRlZmF1bHRfa2V5OworCisJaWYgKChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHx8CisJICAgIGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfTk9ORSkgeworCQlwcml2LT53ZXBfaXNfb24gPSAwOworCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMDsKKwkJcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX05PTkU7CisJfQorCisJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorCQlwcml2LT5kZWZhdWx0X2tleSA9IGlkeDsKKworCS8qIFNldCB0aGUgcmVxdWVzdGVkIGtleSAqLworCXN3aXRjaCAoZXh0LT5hbGcpIHsKKwljYXNlIElXX0VOQ09ERV9BTEdfTk9ORToKKwkJYnJlYWs7CisJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKKwkJaWYgKGV4dC0+a2V5X2xlbiA+IDUpIHsKKwkJCXByaXYtPndlcF9rZXlfbGVuW2lkeF0gPSAxMzsKKwkJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9XRVBfMTI4OworCQkJcHJpdi0+ZW5jcnlwdGlvbl9sZXZlbCA9IDI7CisJCX0gZWxzZSBpZiAoZXh0LT5rZXlfbGVuID4gMCkgeworCQkJcHJpdi0+d2VwX2tleV9sZW5baWR4XSA9IDU7CisJCQlwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPSBDSVBIRVJfU1VJVEVfV0VQXzY0OworCQkJcHJpdi0+ZW5jcnlwdGlvbl9sZXZlbCA9IDE7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwcml2LT53ZXBfaXNfb24gPSAxOworCQltZW1zZXQocHJpdi0+d2VwX2tleXNbaWR4XSwgMCwgMTMpOworCQlrZXlfbGVuID0gbWluICgoaW50KWV4dC0+a2V5X2xlbiwgcHJpdi0+d2VwX2tleV9sZW5baWR4XSk7CisJCW1lbWNweShwcml2LT53ZXBfa2V5c1tpZHhdLCBleHQtPmtleSwga2V5X2xlbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJaW50IGlkeCwgbWF4X2tleV9sZW47CisKKwltYXhfa2V5X2xlbiA9IGVuY29kaW5nLT5sZW5ndGggLSBzaXplb2YoKmV4dCk7CisJaWYgKG1heF9rZXlfbGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGlkeCkgeworCQlpZiAoaWR4IDwgMSB8fCBpZHggPiBXRVBfS0VZUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHgtLTsKKwl9IGVsc2UKKwkJaWR4ID0gcHJpdi0+ZGVmYXVsdF9rZXk7CisKKwllbmNvZGluZy0+ZmxhZ3MgPSBpZHggKyAxOworCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CisJCisJaWYgKCFwcml2LT53ZXBfaXNfb24pIHsKKwkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX05PTkU7CisJCWV4dC0+a2V5X2xlbiA9IDA7CisJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJfSBlbHNlIHsKKwkJaWYgKHByaXYtPmVuY3J5cHRpb25fbGV2ZWwgPiAwKQorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZXh0LT5rZXlfbGVuID0gcHJpdi0+d2VwX2tleV9sZW5baWR4XTsKKwkJbWVtY3B5KGV4dC0+a2V5LCBwcml2LT53ZXBfa2V5c1tpZHhdLCBleHQtPmtleV9sZW4pOworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKwljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisJY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgorCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CisJCS8qCisJCSAqIGF0bWVsIGRvZXMgbm90IHVzZSB0aGVzZSBwYXJhbWV0ZXJzCisJCSAqLworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorCQlwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkID0gcGFyYW0tPnZhbHVlID8gMSA6IDA7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOiB7CisJCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkgeworCQkJCXByaXYtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQgPSAxOworCQkJfSBlbHNlIGlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkgeworCQkJCXByaXYtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQgPSAwOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQkvKiBTaWxlbnRseSBhY2NlcHQgZGlzYWJsZSBvZiBXUEEgKi8KKwkJaWYgKHBhcmFtLT52YWx1ZSA+IDApCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9hdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgeworCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorCQlwYXJhbS0+dmFsdWUgPSBwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJaWYgKHByaXYtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQgPT0gMSkKKwkJCXBhcmFtLT52YWx1ZSA9IElXX0FVVEhfQUxHX1NIQVJFRF9LRVk7CisJCWVsc2UKKwkJCXBhcmFtLT52YWx1ZSA9IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJcGFyYW0tPnZhbHVlID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiAwOworfQorCisKIHN0YXRpYyBpbnQgYXRtZWxfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgY2hhciAqY3dycSwKQEAgLTIyODksMTMgKzI0NzUsMTUgQEAKIHsKIAlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGk7Ci0Jc3RhdGljIGNvbnN0IHU4IGJjYXN0W10gPSB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfTsKKwlzdGF0aWMgY29uc3QgdTggYW55W10gPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKKwlzdGF0aWMgY29uc3QgdTggb2ZmW10gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGF3cnEtPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKG1lbWNtcChiY2FzdCwgYXdycS0+c2FfZGF0YSwgNikgPT0gMCkgeworCWlmICghbWVtY21wKGFueSwgYXdycS0+c2FfZGF0YSwgNikgfHwKKwkgICAgIW1lbWNtcChvZmYsIGF3cnEtPnNhX2RhdGEsIDYpKSB7CiAJCWRlbF90aW1lcl9zeW5jKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKIAkJYXRtZWxfc2Nhbihwcml2LCAxKTsKQEAgLTIzNzgsNiArMjU2NiwxNSBAQAogCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfZW5jb2RlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLwogCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfcG93ZXIsCQkvKiBTSU9DU0lXUE9XRVIgKi8KIAkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X3Bvd2VyLAkJLyogU0lPQ0dJV1BPV0VSICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DU0lXR0VOSUUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DR0lXR0VOSUUgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X2F1dGgsCQkvKiBTSU9DU0lXQVVUSCAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfYXV0aCwJCS8qIFNJT0NHSVdBVVRIICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9lbmNvZGVleHQsCS8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X2VuY29kZWV4dCwJLyogU0lPQ0dJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdQTUtTQSAqLwogfTsKIAogc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgYXRtZWxfcHJpdmF0ZV9oYW5kbGVyW10gPQpAQCAtMjkyNCw2ICszMTIxLDggQEAKIAl1MTYgYXNzX2lkID0gbGUxNl90b19jcHUoYXNzX3Jlc3AtPmFzc19pZCk7CiAJdTE2IHJhdGVzX2xlbiA9IGFzc19yZXNwLT5sZW5ndGggPiA0ID8gNCA6IGFzc19yZXNwLT5sZW5ndGg7CiAKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisKIAlpZiAoZnJhbWVfbGVuIDwgOCArIHJhdGVzX2xlbikKIAkJcmV0dXJuOwogCkBAIC0yOTU0LDYgKzMxNTMsMTQgQEAKIAkJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMTsKIAkJcHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCA9IDE7CiAJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfUkVBRFkpOworCisJCS8qIFNlbmQgYXNzb2NpYXRpb24gZXZlbnQgdG8gdXNlcnNwYWNlICovCisJCXdycXUuZGF0YS5sZW5ndGggPSAwOworCQl3cnF1LmRhdGEuZmxhZ3MgPSAwOworCQltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHByaXYtPkN1cnJlbnRCU1NJRCwgRVRIX0FMRU4pOworCQl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKIAkJcmV0dXJuOwogCX0KIApAQCAtMzYzMiw2ICszODM5LDcgQEAKIAogCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OCBjb25maWd1cmF0aW9uOworCWludCBvbGRfc3RhdGUgPSBwcml2LT5zdGF0aW9uX3N0YXRlOwogCiAJLyogZGF0YSB0byBhZGQgdG8gdGhlIGZpcm13YXJlIG5hbWVzLCBpbiBwcmlvcml0eSBvcmRlcgogCSAgIHRoaXMgaW1wbGVtZW5lbnRzIGZpcm13YXJlIHZlcnNpb25pbmcgKi8KQEAgLTM3OTIsNiArNDAwMCwxNyBAQAogCWVsc2UKIAkJYnVpbGRfd2VwX21pYihwcml2KTsKIAorCWlmIChvbGRfc3RhdGUgPT0gU1RBVElPTl9TVEFURV9SRUFEWSkKKwl7CisJCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKworCQl3cnF1LmRhdGEubGVuZ3RoID0gMDsKKwkJd3JxdS5kYXRhLmZsYWdzID0gMDsKKwkJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKwl9CisKIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCmluZGV4IDcxNDZiNjkuLjBhYTE0YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKQEAgLTM4MCw4ICszODAsNiBAQAogCS8qIGluaXRpYWxpemUgY29tbW9uIGRyaXZlciBmaWVsZHMgKi8KIAlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZwY2lfYnVzX3R5cGU7Ci0JZHJ2LT5kcml2ZXIucHJvYmUgPSBwY2lfZGV2aWNlX3Byb2JlOwotCWRydi0+ZHJpdmVyLnJlbW92ZSA9IHBjaV9kZXZpY2VfcmVtb3ZlOwogCS8qIEZJWE1FLCBvbmNlIGFsbCBvZiB0aGUgZXhpc3RpbmcgUENJIGRyaXZlcnMgaGF2ZSBiZWVuIGZpeGVkIHRvIHNldAogCSAqIHRoZSBwY2kgc2h1dGRvd24gZnVuY3Rpb24sIHRoaXMgdGVzdCBjYW4gZ28gYXdheS4gKi8KIAlpZiAoIWRydi0+ZHJpdmVyLnNodXRkb3duKQpAQCAtNTEzLDYgKzUxMSw4IEBACiAJLm5hbWUJCT0gInBjaSIsCiAJLm1hdGNoCQk9IHBjaV9idXNfbWF0Y2gsCiAJLnVldmVudAkJPSBwY2lfdWV2ZW50LAorCS5wcm9iZQkJPSBwY2lfZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUJCT0gcGNpX2RldmljZV9yZW1vdmUsCiAJLnN1c3BlbmQJPSBwY2lfZGV2aWNlX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBwY2lfZGV2aWNlX3Jlc3VtZSwKIAkuZGV2X2F0dHJzCT0gcGNpX2Rldl9hdHRycywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2RzLmMgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCmluZGV4IDAyNTI1ODIuLjBhNDI0YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2RzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvZHMuYwpAQCAtMzExLDggKzMxMSw2IEBACiAJLyogaW5pdGlhbGl6ZSBjb21tb24gZmllbGRzICovCiAJZHJpdmVyLT5kcnYuYnVzID0gJnBjbWNpYV9idXNfdHlwZTsKIAlkcml2ZXItPmRydi5vd25lciA9IGRyaXZlci0+b3duZXI7Ci0JZHJpdmVyLT5kcnYucHJvYmUgPSBwY21jaWFfZGV2aWNlX3Byb2JlOwotCWRyaXZlci0+ZHJ2LnJlbW92ZSA9IHBjbWNpYV9kZXZpY2VfcmVtb3ZlOwogCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJpdmVyLT5kcnYpOwogfQpAQCAtOTIwLDYgKzkxOCwzNyBAQAogcGNtY2lhX2RldmljZV9zdHJpbmdhdHRyKHByb2RfaWQzLCBwcm9kX2lkWzJdKTsKIHBjbWNpYV9kZXZpY2Vfc3RyaW5nYXR0cihwcm9kX2lkNCwgcHJvZF9pZFszXSk7CiAKKworc3RhdGljIHNzaXplX3QgcGNtY2lhX3Nob3dfcG1fc3RhdGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKKworCWlmIChwX2Rldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ICE9IFBNX0VWRU5UX09OKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJvZmZcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAib25cbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBwY21jaWFfc3RvcmVfcG1fc3RhdGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworICAgICAgICBpZiAoIWNvdW50KQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJaWYgKChwX2Rldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX09OKSAmJgorCSAgICAoIXN0cm5jbXAoYnVmLCAib2ZmIiwgMykpKQorCQlyZXQgPSBkcG1fcnVudGltZV9zdXNwZW5kKGRldiwgUE1TR19TVVNQRU5EKTsKKwllbHNlIGlmICgocF9kZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9PTikgJiYKKwkJICghc3RybmNtcChidWYsICJvbiIsIDIpKSkKKwkJZHBtX3J1bnRpbWVfcmVzdW1lKGRldik7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7Cit9CisKKwogc3RhdGljIHNzaXplX3QgbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOwpAQCAtOTQ1LDggKzk3NCw5IEBACiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7Ci0gICAgICAgIGlmICghY291bnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRvd24oJnBfZGV2LT5zb2NrZXQtPnNrdF9zZW0pOwogCXBfZGV2LT5hbGxvd19mdW5jX2lkX21hdGNoID0gMTsKQEAgLTk1OSw2ICs5ODksNyBAQAogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcGNtY2lhX2Rldl9hdHRyc1tdID0gewogCV9fQVRUUihmdW5jdGlvbiwgMDQ0NCwgZnVuY19zaG93LCBOVUxMKSwKKwlfX0FUVFIocG1fc3RhdGUsIDA2NDQsIHBjbWNpYV9zaG93X3BtX3N0YXRlLCBwY21jaWFfc3RvcmVfcG1fc3RhdGUpLAogCV9fQVRUUl9STyhmdW5jX2lkKSwKIAlfX0FUVFJfUk8obWFuZl9pZCksCiAJX19BVFRSX1JPKGNhcmRfaWQpLApAQCAtMTE2Nyw2ICsxMTk4LDggQEAKIAkudWV2ZW50ID0gcGNtY2lhX2J1c191ZXZlbnQsCiAJLm1hdGNoID0gcGNtY2lhX2J1c19tYXRjaCwKIAkuZGV2X2F0dHJzID0gcGNtY2lhX2Rldl9hdHRycywKKwkucHJvYmUgPSBwY21jaWFfZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUgPSBwY21jaWFfZGV2aWNlX3JlbW92ZSwKIAkuc3VzcGVuZCA9IHBjbWNpYV9kZXZfc3VzcGVuZCwKIAkucmVzdW1lID0gcGNtY2lhX2Rldl9yZXN1bWUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X21haW5zdG9uZS5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X21haW5zdG9uZS5jCmluZGV4IDVkOTU3ZGYuLmZkYTA2OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9tYWluc3RvbmUuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfbWFpbnN0b25lLmMKQEAgLTE3MSwyNyArMTcxLDIyIEBACiB7CiAJaW50IHJldDsKIAotCW1zdF9wY21jaWFfZGV2aWNlID0ga3phbGxvYyhzaXplb2YoKm1zdF9wY21jaWFfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJbXN0X3BjbWNpYV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInB4YTJ4eC1wY21jaWEiLCAtMSk7CiAJaWYgKCFtc3RfcGNtY2lhX2RldmljZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbXN0X3BjbWNpYV9kZXZpY2UtPm5hbWUgPSAicHhhMnh4LXBjbWNpYSI7CisKIAltc3RfcGNtY2lhX2RldmljZS0+ZGV2LnBsYXRmb3JtX2RhdGEgPSAmbXN0X3BjbWNpYV9vcHM7CiAKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIobXN0X3BjbWNpYV9kZXZpY2UpOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQobXN0X3BjbWNpYV9kZXZpY2UpOworCiAJaWYgKHJldCkKLQkJa2ZyZWUobXN0X3BjbWNpYV9kZXZpY2UpOworCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KG1zdF9wY21jaWFfZGV2aWNlKTsKIAogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtc3RfcGNtY2lhX2V4aXQodm9pZCkKIHsKLQkvKgotCSAqIFRoaXMgY2FsbCBpcyBzdXBwb3NlZCB0byBmcmVlIG91ciBtc3RfcGNtY2lhX2RldmljZS4KLQkgKiBVbmZvcnR1bmF0ZWx5IHBsYXRmb3JtX2RldmljZSBkb24ndCBoYXZlIGEgZnJlZSBtZXRob2QsIGFuZAotCSAqIHdlIGNhbid0IGFzc3VtZSBpdCdzIGZyZWUgb2YgYW55IHJlZmVyZW5jZSBhdCB0aGlzIHBvaW50IHNvIHdlCi0JICogY2FuJ3QgZnJlZSBpdCBlaXRoZXIuCi0JICovCiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIobXN0X3BjbWNpYV9kZXZpY2UpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfc2hhcnBzbC5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3NoYXJwc2wuYwppbmRleCAxMmE3MjQ0Li5mZDM2NDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfc2hhcnBzbC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9zaGFycHNsLmMKQEAgLTI2MywzMCArMjYzLDI1IEBACiB7CiAJaW50IHJldDsKIAotCXNoYXJwc2xfcGNtY2lhX29wcy5ucj1wbGF0Zm9ybV9zY29vcF9jb25maWctPm51bV9kZXZzOwotCXNoYXJwc2xfcGNtY2lhX2RldmljZSA9IGt6YWxsb2Moc2l6ZW9mKCpzaGFycHNsX3BjbWNpYV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlzaGFycHNsX3BjbWNpYV9vcHMubnIgPSBwbGF0Zm9ybV9zY29vcF9jb25maWctPm51bV9kZXZzOworCXNoYXJwc2xfcGNtY2lhX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygicHhhMnh4LXBjbWNpYSIsIC0xKTsKKwogCWlmICghc2hhcnBzbF9wY21jaWFfZGV2aWNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNoYXJwc2xfcGNtY2lhX2RldmljZS0+bmFtZSA9ICJweGEyeHgtcGNtY2lhIjsKIAlzaGFycHNsX3BjbWNpYV9kZXZpY2UtPmRldi5wbGF0Zm9ybV9kYXRhID0gJnNoYXJwc2xfcGNtY2lhX29wczsKLQlzaGFycHNsX3BjbWNpYV9kZXZpY2UtPmRldi5wYXJlbnQ9cGxhdGZvcm1fc2Nvb3BfY29uZmlnLT5kZXZzWzBdLmRldjsKKwlzaGFycHNsX3BjbWNpYV9kZXZpY2UtPmRldi5wYXJlbnQgPSBwbGF0Zm9ybV9zY29vcF9jb25maWctPmRldnNbMF0uZGV2OwogCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHNoYXJwc2xfcGNtY2lhX2RldmljZSk7CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzaGFycHNsX3BjbWNpYV9kZXZpY2UpOworCiAJaWYgKHJldCkKLQkJa2ZyZWUoc2hhcnBzbF9wY21jaWFfZGV2aWNlKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChzaGFycHNsX3BjbWNpYV9kZXZpY2UpOwogCiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNoYXJwc2xfcGNtY2lhX2V4aXQodm9pZCkKIHsKLQkvKgotCSAqIFRoaXMgY2FsbCBpcyBzdXBwb3NlZCB0byBmcmVlIG91ciBzaGFycHNsX3BjbWNpYV9kZXZpY2UuCi0JICogVW5mb3J0dW5hdGVseSBwbGF0Zm9ybV9kZXZpY2UgZG9uJ3QgaGF2ZSBhIGZyZWUgbWV0aG9kLCBhbmQKLQkgKiB3ZSBjYW4ndCBhc3N1bWUgaXQncyBmcmVlIG9mIGFueSByZWZlcmVuY2UgYXQgdGhpcyBwb2ludCBzbyB3ZQotCSAqIGNhbid0IGZyZWUgaXQgZWl0aGVyLgotCSAqLwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNoYXJwc2xfcGNtY2lhX2RldmljZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jIGIvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMKaW5kZXggN2E3NzQ0Ni4uNWFiMWNkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMKQEAgLTk4LDYgKzk4LDMwIEBACiB9CiBzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoY2FyZF9pbnNlcnQsIDAyMDAsIE5VTEwsIHBjY2FyZF9zdG9yZV9pbnNlcnQpOwogCisKK3N0YXRpYyBzc2l6ZV90IHBjY2FyZF9zaG93X2NhcmRfcG1fc3RhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSB0b19zb2NrZXQoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgcy0+c3RhdGUgJiBTT0NLRVRfU1VTUEVORCA/ICJvZmYiIDogIm9uIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBjY2FyZF9zdG9yZV9jYXJkX3BtX3N0YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3NpemVfdCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gdG9fc29ja2V0KGRldik7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1NVU1BFTkQpICYmICFzdHJuY21wKGJ1ZiwgIm9mZiIsIDMpKQorCQlyZXQgPSBwY21jaWFfc3VzcGVuZF9jYXJkKHMpOworCWVsc2UgaWYgKChzLT5zdGF0ZSAmIFNPQ0tFVF9TVVNQRU5EKSAmJiAhc3RybmNtcChidWYsICJvbiIsIDIpKQorCQlyZXQgPSBwY21jaWFfcmVzdW1lX2NhcmQocyk7CisKKwlyZXR1cm4gcmV0ID8gLUVOT0RFViA6IGNvdW50OworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGNhcmRfcG1fc3RhdGUsIDA2NDQsIHBjY2FyZF9zaG93X2NhcmRfcG1fc3RhdGUsIHBjY2FyZF9zdG9yZV9jYXJkX3BtX3N0YXRlKTsKKwogc3RhdGljIHNzaXplX3QgcGNjYXJkX3N0b3JlX2VqZWN0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3NpemVfdCByZXQ7CkBAIC0zMjAsNiArMzQ0LDcgQEAKIAkmY2xhc3NfZGV2aWNlX2F0dHJfY2FyZF92cHAsCiAJJmNsYXNzX2RldmljZV9hdHRyX2NhcmRfdmNjLAogCSZjbGFzc19kZXZpY2VfYXR0cl9jYXJkX2luc2VydCwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfY2FyZF9wbV9zdGF0ZSwKIAkmY2xhc3NfZGV2aWNlX2F0dHJfY2FyZF9lamVjdCwKIAkmY2xhc3NfZGV2aWNlX2F0dHJfY2FyZF9pcnFfbWFzaywKIAkmY2xhc3NfZGV2aWNlX2F0dHJfYXZhaWxhYmxlX3Jlc291cmNlc19zZXR1cF9kb25lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvZHJpdmVyLmMgYi9kcml2ZXJzL3BucC9kcml2ZXIuYwppbmRleCAxNWZiNzU4Li43Y2FmYWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9kcml2ZXIuYworKysgYi9kcml2ZXJzL3BucC9kcml2ZXIuYwpAQCAtMTk1LDYgKzE5NSw4IEBACiBzdHJ1Y3QgYnVzX3R5cGUgcG5wX2J1c190eXBlID0gewogCS5uYW1lCT0gInBucCIsCiAJLm1hdGNoCT0gcG5wX2J1c19tYXRjaCwKKwkucHJvYmUJPSBwbnBfZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUJPSBwbnBfZGV2aWNlX3JlbW92ZSwKIAkuc3VzcGVuZCA9IHBucF9idXNfc3VzcGVuZCwKIAkucmVzdW1lID0gcG5wX2J1c19yZXN1bWUsCiB9OwpAQCAtMjE1LDggKzIxNyw2IEBACiAKIAlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZwbnBfYnVzX3R5cGU7Ci0JZHJ2LT5kcml2ZXIucHJvYmUgPSBwbnBfZGV2aWNlX3Byb2JlOwotCWRydi0+ZHJpdmVyLnJlbW92ZSA9IHBucF9kZXZpY2VfcmVtb3ZlOwogCiAJY291bnQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL3Jpby1kcml2ZXIuYyBiL2RyaXZlcnMvcmFwaWRpby9yaW8tZHJpdmVyLmMKaW5kZXggZGM3NDk2MC4uNTQ4MDExOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL3Jpby1kcml2ZXIuYworKysgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLWRyaXZlci5jCkBAIC0xNDcsOCArMTQ3LDYgQEAKIAkvKiBpbml0aWFsaXplIGNvbW1vbiBkcml2ZXIgZmllbGRzICovCiAJcmRydi0+ZHJpdmVyLm5hbWUgPSByZHJ2LT5uYW1lOwogCXJkcnYtPmRyaXZlci5idXMgPSAmcmlvX2J1c190eXBlOwotCXJkcnYtPmRyaXZlci5wcm9iZSA9IHJpb19kZXZpY2VfcHJvYmU7Ci0JcmRydi0+ZHJpdmVyLnJlbW92ZSA9IHJpb19kZXZpY2VfcmVtb3ZlOwogCiAJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmcmRydi0+ZHJpdmVyKTsKQEAgLTIwNCw3ICsyMDIsOSBAQAogc3RydWN0IGJ1c190eXBlIHJpb19idXNfdHlwZSA9IHsKIAkubmFtZSA9ICJyYXBpZGlvIiwKIAkubWF0Y2ggPSByaW9fbWF0Y2hfYnVzLAotCS5kZXZfYXR0cnMgPSByaW9fZGV2X2F0dHJzCisJLmRldl9hdHRycyA9IHJpb19kZXZfYXR0cnMsCisJLnByb2JlID0gcmlvX2RldmljZV9wcm9iZSwKKwkucmVtb3ZlID0gcmlvX2RldmljZV9yZW1vdmUsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwppbmRleCBlODQ5Mjg5Li41MDNhNTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCkBAIC01MiwxMSArNTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGJ1c190eXBlIGNjd2dyb3VwX2J1c190eXBlID0gewotCS5uYW1lICAgID0gImNjd2dyb3VwIiwKLQkubWF0Y2ggICA9IGNjd2dyb3VwX2J1c19tYXRjaCwKLQkudWV2ZW50ID0gY2N3Z3JvdXBfdWV2ZW50LAotfTsKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgY2N3Z3JvdXBfYnVzX3R5cGU7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogX19jY3dncm91cF9yZW1vdmVfc3ltbGlua3Moc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldikKQEAgLTM4OSw2ICszODUsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBidXNfdHlwZSBjY3dncm91cF9idXNfdHlwZSA9IHsKKwkubmFtZSAgID0gImNjd2dyb3VwIiwKKwkubWF0Y2ggID0gY2N3Z3JvdXBfYnVzX21hdGNoLAorCS51ZXZlbnQgPSBjY3dncm91cF91ZXZlbnQsCisJLnByb2JlICA9IGNjd2dyb3VwX3Byb2JlLAorCS5yZW1vdmUgPSBjY3dncm91cF9yZW1vdmUsCit9OworCiBpbnQKIGNjd2dyb3VwX2RyaXZlcl9yZWdpc3RlciAoc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqY2RyaXZlcikKIHsKQEAgLTM5Niw4ICs0MDAsNiBAQAogCWNkcml2ZXItPmRyaXZlciA9IChzdHJ1Y3QgZGV2aWNlX2RyaXZlcikgewogCQkuYnVzID0gJmNjd2dyb3VwX2J1c190eXBlLAogCQkubmFtZSA9IGNkcml2ZXItPm5hbWUsCi0JCS5wcm9iZSA9IGNjd2dyb3VwX3Byb2JlLAotCQkucmVtb3ZlID0gY2N3Z3JvdXBfcmVtb3ZlLAogCX07CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZjZHJpdmVyLT5kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKaW5kZXggZTU2NTE5My4uMmQzMTlmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCkBAIC01NDIsOSArNTQyLDQxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK2Nzc19wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CisKKwlzY2ggPSB0b19zdWJjaGFubmVsKGRldik7CisJc2NoLT5kcml2ZXIgPSBjb250YWluZXJfb2YgKGRldi0+ZHJpdmVyLCBzdHJ1Y3QgY3NzX2RyaXZlciwgZHJ2KTsKKwlyZXR1cm4gKHNjaC0+ZHJpdmVyLT5wcm9iZSA/IHNjaC0+ZHJpdmVyLT5wcm9iZShzY2gpIDogMCk7Cit9CisKK3N0YXRpYyBpbnQKK2Nzc19yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOworCisJc2NoID0gdG9fc3ViY2hhbm5lbChkZXYpOworCXJldHVybiAoc2NoLT5kcml2ZXItPnJlbW92ZSA/IHNjaC0+ZHJpdmVyLT5yZW1vdmUoc2NoKSA6IDApOworfQorCitzdGF0aWMgdm9pZAorY3NzX3NodXRkb3duIChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKKworCXNjaCA9IHRvX3N1YmNoYW5uZWwoZGV2KTsKKwlpZiAoc2NoLT5kcml2ZXItPnNodXRkb3duKQorCQlzY2gtPmRyaXZlci0+c2h1dGRvd24oc2NoKTsKK30KKwogc3RydWN0IGJ1c190eXBlIGNzc19idXNfdHlwZSA9IHsKLQkubmFtZSAgPSAiY3NzIiwKLQkubWF0Y2ggPSAmY3NzX2J1c19tYXRjaCwKKwkubmFtZSAgICAgPSAiY3NzIiwKKwkubWF0Y2ggICAgPSBjc3NfYnVzX21hdGNoLAorCS5wcm9iZSAgICA9IGNzc19wcm9iZSwKKwkucmVtb3ZlICAgPSBjc3NfcmVtb3ZlLAorCS5zaHV0ZG93biA9IGNzc19zaHV0ZG93biwKIH07CiAKIHN1YnN5c19pbml0Y2FsbChpbml0X2NoYW5uZWxfc3Vic3lzdGVtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oCmluZGV4IDI1MWViZDcuLmFhNWFiNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuaApAQCAtMTE1LDYgKzExNSw3IEBACiAgKiBDdXJyZW50bHksIHdlIG9ubHkgY2FyZSBhYm91dCBJL08gc3ViY2hhbm5lbHMgKHR5cGUgMCksIHRoZXNlCiAgKiBoYXZlIGEgY2N3X2RldmljZSBjb25uZWN0ZWQgdG8gdGhlbS4KICAqLworc3RydWN0IHN1YmNoYW5uZWw7CiBzdHJ1Y3QgY3NzX2RyaXZlciB7CiAJdW5zaWduZWQgaW50IHN1YmNoYW5uZWxfdHlwZTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcnY7CkBAIC0xMjIsNiArMTIzLDkgQEAKIAlpbnQgKCpub3RpZnkpKHN0cnVjdCBkZXZpY2UgKiwgaW50KTsKIAl2b2lkICgqdmVyaWZ5KShzdHJ1Y3QgZGV2aWNlICopOwogCXZvaWQgKCp0ZXJtaW5hdGlvbikoc3RydWN0IGRldmljZSAqKTsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHN1YmNoYW5uZWwgKik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdWJjaGFubmVsICopOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCmluZGV4IGZhM2U0YzAuLmViNzM2MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwpAQCAtMTA3LDMzICsxMDcsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGJ1c190eXBlIGNjd19idXNfdHlwZSA9IHsKLQkubmFtZSAgPSAiY2N3IiwKLQkubWF0Y2ggPSAmY2N3X2J1c19tYXRjaCwKLQkudWV2ZW50ID0gJmNjd191ZXZlbnQsCi19Oworc3RydWN0IGJ1c190eXBlIGNjd19idXNfdHlwZTsKIAotc3RhdGljIGludCBpb19zdWJjaGFubmVsX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICopOwotc3RhdGljIGludCBpb19zdWJjaGFubmVsX3JlbW92ZSAoc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyBpbnQgaW9fc3ViY2hhbm5lbF9wcm9iZSAoc3RydWN0IHN1YmNoYW5uZWwgKik7CitzdGF0aWMgaW50IGlvX3N1YmNoYW5uZWxfcmVtb3ZlIChzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKIHZvaWQgaW9fc3ViY2hhbm5lbF9pcnEgKHN0cnVjdCBkZXZpY2UgKik7CiBzdGF0aWMgaW50IGlvX3N1YmNoYW5uZWxfbm90aWZ5KHN0cnVjdCBkZXZpY2UgKiwgaW50KTsKIHN0YXRpYyB2b2lkIGlvX3N1YmNoYW5uZWxfdmVyaWZ5KHN0cnVjdCBkZXZpY2UgKik7CiBzdGF0aWMgdm9pZCBpb19zdWJjaGFubmVsX2lvdGVybShzdHJ1Y3QgZGV2aWNlICopOwotc3RhdGljIHZvaWQgaW9fc3ViY2hhbm5lbF9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIHZvaWQgaW9fc3ViY2hhbm5lbF9zaHV0ZG93bihzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKIAogc3RydWN0IGNzc19kcml2ZXIgaW9fc3ViY2hhbm5lbF9kcml2ZXIgPSB7CiAJLnN1YmNoYW5uZWxfdHlwZSA9IFNVQkNIQU5ORUxfVFlQRV9JTywKIAkuZHJ2ID0gewogCQkubmFtZSA9ICJpb19zdWJjaGFubmVsIiwKIAkJLmJ1cyAgPSAmY3NzX2J1c190eXBlLAotCQkucHJvYmUgPSAmaW9fc3ViY2hhbm5lbF9wcm9iZSwKLQkJLnJlbW92ZSA9ICZpb19zdWJjaGFubmVsX3JlbW92ZSwKLQkJLnNodXRkb3duID0gJmlvX3N1YmNoYW5uZWxfc2h1dGRvd24sCiAJfSwKIAkuaXJxID0gaW9fc3ViY2hhbm5lbF9pcnEsCiAJLm5vdGlmeSA9IGlvX3N1YmNoYW5uZWxfbm90aWZ5LAogCS52ZXJpZnkgPSBpb19zdWJjaGFubmVsX3ZlcmlmeSwKIAkudGVybWluYXRpb24gPSBpb19zdWJjaGFubmVsX2lvdGVybSwKKwkucHJvYmUgPSBpb19zdWJjaGFubmVsX3Byb2JlLAorCS5yZW1vdmUgPSBpb19zdWJjaGFubmVsX3JlbW92ZSwKKwkuc2h1dGRvd24gPSBpb19zdWJjaGFubmVsX3NodXRkb3duLAogfTsKIAogc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmNjd19kZXZpY2Vfd29yazsKQEAgLTgwMywxNCArNzk5LDEyIEBACiB9CiAKIHN0YXRpYyBpbnQKLWlvX3N1YmNoYW5uZWxfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKnBkZXYpCitpb19zdWJjaGFubmVsX3Byb2JlIChzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQogewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CiAJaW50IHJjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzY2ggPSB0b19zdWJjaGFubmVsKHBkZXYpOwogCWlmIChzY2gtPmRldi5kcml2ZXJfZGF0YSkgewogCQkvKgogCQkgKiBUaGlzIHN1YmNoYW5uZWwgYWxyZWFkeSBoYXMgYW4gYXNzb2NpYXRlZCBjY3dfZGV2aWNlLgpAQCAtODQ2LDcgKzg0MCw3IEBACiAJbWVtc2V0KGNkZXYtPnByaXZhdGUsIDAsIHNpemVvZihzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlKSk7CiAJYXRvbWljX3NldCgmY2Rldi0+cHJpdmF0ZS0+b25vZmYsIDApOwogCWNkZXYtPmRldiA9IChzdHJ1Y3QgZGV2aWNlKSB7Ci0JCS5wYXJlbnQgPSBwZGV2LAorCQkucGFyZW50ID0gJnNjaC0+ZGV2LAogCQkucmVsZWFzZSA9IGNjd19kZXZpY2VfcmVsZWFzZSwKIAl9OwogCUlOSVRfTElTVF9IRUFEKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmsuZW50cnkpOwpAQCAtODU5LDcgKzg1Myw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXJjID0gaW9fc3ViY2hhbm5lbF9yZWNvZyhjZGV2LCB0b19zdWJjaGFubmVsKHBkZXYpKTsKKwlyYyA9IGlvX3N1YmNoYW5uZWxfcmVjb2coY2Rldiwgc2NoKTsKIAlpZiAocmMpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjaC0+bG9jaywgZmxhZ3MpOwogCQlzY2gtPmRldi5kcml2ZXJfZGF0YSA9IE5VTEw7CkBAIC04ODMsMTcgKzg3NywxNyBAQAogfQogCiBzdGF0aWMgaW50Ci1pb19zdWJjaGFubmVsX3JlbW92ZSAoc3RydWN0IGRldmljZSAqZGV2KQoraW9fc3ViY2hhbm5lbF9yZW1vdmUgKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCiB7CiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghZGV2LT5kcml2ZXJfZGF0YSkKKwlpZiAoIXNjaC0+ZGV2LmRyaXZlcl9kYXRhKQogCQlyZXR1cm4gMDsKLQljZGV2ID0gZGV2LT5kcml2ZXJfZGF0YTsKKwljZGV2ID0gc2NoLT5kZXYuZHJpdmVyX2RhdGE7CiAJLyogU2V0IGNjdyBkZXZpY2UgdG8gbm90IG9wZXJhdGlvbmFsIGFuZCBkcm9wIHJlZmVyZW5jZS4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7Ci0JZGV2LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJc2NoLT5kZXYuZHJpdmVyX2RhdGEgPSBOVUxMOwogCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX05PVF9PUEVSOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwogCS8qCkBAIC05NDgsMTQgKzk0MiwxMiBAQAogfQogCiBzdGF0aWMgdm9pZAotaW9fc3ViY2hhbm5lbF9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCitpb19zdWJjaGFubmVsX3NodXRkb3duKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCiB7Ci0Jc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKIAlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKIAlpbnQgcmV0OwogCi0Jc2NoID0gdG9fc3ViY2hhbm5lbChkZXYpOwotCWNkZXYgPSBkZXYtPmRyaXZlcl9kYXRhOworCWNkZXYgPSBzY2gtPmRldi5kcml2ZXJfZGF0YTsKIAogCWlmIChjaW9faXNfY29uc29sZShzY2gtPnNjaGlkKSkKIAkJcmV0dXJuOwpAQCAtMTEyOSw2ICsxMTIxLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBidXNfdHlwZSBjY3dfYnVzX3R5cGUgPSB7CisJLm5hbWUgICA9ICJjY3ciLAorCS5tYXRjaCAgPSBjY3dfYnVzX21hdGNoLAorCS51ZXZlbnQgPSBjY3dfdWV2ZW50LAorCS5wcm9iZSAgPSBjY3dfZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUgPSBjY3dfZGV2aWNlX3JlbW92ZSwKK307CisKIGludAogY2N3X2RyaXZlcl9yZWdpc3RlciAoc3RydWN0IGNjd19kcml2ZXIgKmNkcml2ZXIpCiB7CkBAIC0xMTM2LDggKzExMzYsNiBAQAogCiAJZHJ2LT5idXMgPSAmY2N3X2J1c190eXBlOwogCWRydi0+bmFtZSA9IGNkcml2ZXItPm5hbWU7Ci0JZHJ2LT5wcm9iZSA9IGNjd19kZXZpY2VfcHJvYmU7Ci0JZHJ2LT5yZW1vdmUgPSBjY3dfZGV2aWNlX3JlbW92ZTsKIAogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoZHJ2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2F1cm9yYS5jIGIvZHJpdmVycy9zYnVzL2NoYXIvYXVyb3JhLmMKaW5kZXggOTJlNmM1NjM5Li4wMTVkYjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9hdXJvcmEuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9hdXJvcmEuYwpAQCAtOTIsNyArOTIsNiBAQAogCiAvKiBubyBsb25nZXIgdXNlZC4gc3RhdGljIHN0cnVjdCBBdXJvcmFfYm9hcmQgKiBJUlFfdG9fYm9hcmRbMTZdID0geyBOVUxMLCB9IDsqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKiB0bXBfYnVmID0gTlVMTDsKLXN0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogREVDTEFSRV9UQVNLX1FVRVVFKHRxX2F1cm9yYSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZSBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQppbmRleCBiOWQyYmI4Li4zMjBlNzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCkBAIC00NSw3ICs0NSw3IEBACiBvYmotJChDT05GSUdfQkxaMjA2MF9TQ1NJKQkrPSBOQ1I1M0M5eC5vCWJsejIwNjAubwogb2JqLSQoQ09ORklHX0JMWjEyMzBfU0NTSSkJKz0gTkNSNTNDOXgubwlibHoxMjMwLm8KIG9iai0kKENPTkZJR19GQVNUTEFORV9TQ1NJKQkrPSBOQ1I1M0M5eC5vCWZhc3RsYW5lLm8KLW9iai0kKENPTkZJR19PS1RBR09OX1NDU0kpCSs9IE5DUjUzQzl4Lm8Jb2t0YWdvbl9lc3Aubwlva3RhZ29uX2lvLm8KK29iai0kKENPTkZJR19PS1RBR09OX1NDU0kpCSs9IE5DUjUzQzl4Lm8Jb2t0YWdvbl9lc3BfbW9kLm8KIG9iai0kKENPTkZJR19BVEFSSV9TQ1NJKQkrPSBhdGFyaV9zY3NpLm8KIG9iai0kKENPTkZJR19NQUNfU0NTSSkJCSs9IG1hY19zY3NpLm8KIG9iai0kKENPTkZJR19TQ1NJX01BQ19FU1ApCSs9IG1hY19lc3AubwlOQ1I1M0M5eC5vCkBAIC0xNjQsNiArMTY0LDcgQEAKIHphbG9uN3h4LW9ianMJOj0gemFsb24ubyBuY3I1M2M4eHgubwogTkNSX1E3MjBfbW9kLW9ianMJOj0gTkNSX1E3MjAubyBuY3I1M2M4eHgubwogbGliYXRhLW9ianMJOj0gbGliYXRhLWNvcmUubyBsaWJhdGEtc2NzaS5vCitva3RhZ29uX2VzcF9tb2Qtb2Jqcwk6PSBva3RhZ29uX2VzcC5vIG9rdGFnb25faW8ubwogCiAjIEZpbGVzIGdlbmVyYXRlZCB0aGF0IHNoYWxsIGJlIHJlbW92ZWQgdXBvbiBtYWtlIGNsZWFuCiBjbGVhbi1maWxlcyA6PQk1M2M3eHhfZC5oIDUzYzcwMF9kLmgJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzQzl4LmMgYi9kcml2ZXJzL3Njc2kvTkNSNTNDOXguYwppbmRleCA2NDA1OTBiLi5jN2RkMDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTkNSNTNDOXguYworKysgYi9kcml2ZXJzL3Njc2kvTkNSNTNDOXguYwpAQCAtMTc5OSw2ICsxNzk5LDcgQEAKIAkJICovCiAJCWludCBvbGRwaGFzZSwgaSA9IDA7IC8qIG9yIHdoZXJlIHdlIGxlZnQgb2ZmIGxhc3QgdGltZSA/PyBlc3AtPmN1cnJlbnRfZGF0YSA/PyAqLwogCQlpbnQgZmlmb2NudCA9IDA7CisJCXVuc2lnbmVkIGNoYXIgKnAgPSBwaHlzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpU0NwdHItPlNDcC5wdHIpOwogCiAJCW9sZHBoYXNlID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfUE1BU0s7CiAKQEAgLTE4NjAsNyArMTg2MSw3IEBACiAKIAkJCQkvKiByZWFkIGZpZm8gKi8KIAkJCQlmb3Ioaj0wO2o8Zmlmb2NudDtqKyspCi0JCQkJCVNDcHRyLT5TQ3AucHRyW2krK10gPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ZkYXRhKTsKKwkJCQkJcFtpKytdID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZGF0YSk7CiAKIAkJCQlFU1BEQVRBKCgiKCVkKSAiLCBpKSk7CiAKQEAgLTE4ODIsNyArMTg4Myw3IEBACiAKIAkJCQkvKiBmaWxsIGZpZm8gKi8KIAkJCQlmb3Ioaj0wO2o8dGhpc19jb3VudDtqKyspCi0JCQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBTQ3B0ci0+U0NwLnB0cltpKytdKTsKKwkJCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIHBbaSsrXSk7CiAKIAkJCQkvKiBob3cgbWFueSBsZWZ0IGlmIHRoaXMgZ29lcyBvdXQgPz8gKi8KIAkJCQlobXVjaCAtPSB0aGlzX2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JsejEyMzAuYyBiL2RyaXZlcnMvc2NzaS9ibHoxMjMwLmMKaW5kZXggNzYzZTQwOS4uMzg2N2FjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JsejEyMzAuYworKysgYi9kcml2ZXJzL3Njc2kvYmx6MTIzMC5jCkBAIC0yMjQsNyArMjI0LDcgQEAKIHN0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCiB7CiAJRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKLQkJY3VzdG9tLmludHJlcXIsIGN1c3RvbS5pbnRlbmFyKSk7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXFyLCBhbWlnYV9jdXN0b20uaW50ZW5hcikpOwogfQogCiB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKQEAgLTI5OCw3ICsyOTgsNyBAQAogCiBzdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCiB7Ci0JcmV0dXJuICgoY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOworCXJldHVybiAoKGFtaWdhX2N1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JsejIwNjAuYyBiL2RyaXZlcnMvc2NzaS9ibHoyMDYwLmMKaW5kZXggZDcyZDA1Zi4uNGViZTY5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JsejIwNjAuYworKysgYi9kcml2ZXJzL3Njc2kvYmx6MjA2MC5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIHN0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCiB7CiAJRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKLQkJY3VzdG9tLmludHJlcXIsIGN1c3RvbS5pbnRlbmFyKSk7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXFyLCBhbWlnYV9jdXN0b20uaW50ZW5hcikpOwogfQogCiBzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCkBAIC0yNTEsNyArMjUxLDcgQEAKIAogc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQogewotCXJldHVybiAoKGN1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKKwlyZXR1cm4gKChhbWlnYV9jdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtLmMgYi9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybS5jCmluZGV4IGY5Yjk0MGUuLmE0YTRmYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtLmMKKysrIGIvZHJpdmVycy9zY3NpL2N5YmVyc3Rvcm0uYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJCWVzcC0+ZXNwX2lkLCAoKHN0cnVjdCBjeWJlcl9kbWFfcmVnaXN0ZXJzICopCiAJCQkgICAgICAoZXNwLT5kcmVncykpLT5jb25kX3JlZykpOwogCUVTUExPRygoImludHJlcTo8JTA0eD4sIGludGVuYTo8JTA0eD5cbiIsCi0JCWN1c3RvbS5pbnRyZXFyLCBjdXN0b20uaW50ZW5hcikpOworCQlhbWlnYV9jdXN0b20uaW50cmVxciwgYW1pZ2FfY3VzdG9tLmludGVuYXIpKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKQpAQCAtMzIyLDcgKzMyMiw3IEBACiAKIHN0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKIHsKLQlyZXR1cm4gKChjdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7CisJcmV0dXJuICgoYW1pZ2FfY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOwogfQogCiBzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybUlJLmMgYi9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybUlJLmMKaW5kZXggYTNjYWFiZi4uM2E4MDNkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2N5YmVyc3Rvcm1JSS5jCisrKyBiL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtSUkuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJCWVzcC0+ZXNwX2lkLCAoKHN0cnVjdCBjeWJlcklJX2RtYV9yZWdpc3RlcnMgKikKIAkJCSAgICAgIChlc3AtPmRyZWdzKSktPmNvbmRfcmVnKSk7CiAJRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKLQkJY3VzdG9tLmludHJlcXIsIGN1c3RvbS5pbnRlbmFyKSk7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXFyLCBhbWlnYV9jdXN0b20uaW50ZW5hcikpOwogfQogCiBzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCkBAIC0yNTksNyArMjU5LDcgQEAKIAogc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQogewotCXJldHVybiAoKGN1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKKwlyZXR1cm4gKChhbWlnYV9jdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mYXN0bGFuZS5jIGIvZHJpdmVycy9zY3NpL2Zhc3RsYW5lLmMKaW5kZXggY2NlZTY4Yi4uOGFlOWM0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2Zhc3RsYW5lLmMKKysrIGIvZHJpdmVycy9zY3NpL2Zhc3RsYW5lLmMKQEAgLTI2OCw3ICsyNjgsNyBAQAogCQllc3AtPmVzcF9pZCwgKChzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqKQogCQkJICAgICAgKGVzcC0+ZHJlZ3MpKS0+Y29uZF9yZWcpKTsKIAlFU1BMT0coKCJpbnRyZXE6PCUwNHg+LCBpbnRlbmE6PCUwNHg+XG4iLAotCQljdXN0b20uaW50cmVxciwgY3VzdG9tLmludGVuYXIpKTsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcXIsIGFtaWdhX2N1c3RvbS5pbnRlbmFyKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKQEAgLTM2OCw3ICszNjgsNyBAQAogCiBzdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCiB7Ci0JcmV0dXJuICgoY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOworCXJldHVybiAoKGFtaWdhX2N1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29rdGFnb25fZXNwLmMgYi9kcml2ZXJzL3Njc2kvb2t0YWdvbl9lc3AuYwppbmRleCA1ZDljOWFkLi5kZWU0MjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvb2t0YWdvbl9lc3AuYworKysgYi9kcml2ZXJzL3Njc2kvb2t0YWdvbl9lc3AuYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAKIHN0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKIHsKLQlyZXR1cm4gKChjdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7CisJcmV0dXJuICgoYW1pZ2FfY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOwogfQogCiBzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwppbmRleCAzZGVkOWRhLi4wZTUyOWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKQEAgLTIyMSw4ICsyMjEsNiBAQAogc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHNkZWJ1Z19kcml2ZXJmc19kcml2ZXIgPSB7CiAJLm5hbWUgCQk9IHNkZWJ1Z19wcm9jX25hbWUsCiAJLmJ1cwkJPSAmcHNldWRvX2xsZF9idXMsCi0JLnByb2JlICAgICAgICAgID0gc2RlYnVnX2RyaXZlcl9wcm9iZSwKLQkucmVtb3ZlICAgICAgICAgPSBzZGVidWdfZHJpdmVyX3JlbW92ZSwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnQgY2hlY2tfY29uZGl0aW9uX3Jlc3VsdCA9CkBAIC0xNzk2LDYgKzE3OTQsOCBAQAogc3RhdGljIHN0cnVjdCBidXNfdHlwZSBwc2V1ZG9fbGxkX2J1cyA9IHsKICAgICAgICAgLm5hbWUgPSAicHNldWRvIiwKICAgICAgICAgLm1hdGNoID0gcHNldWRvX2xsZF9idXNfbWF0Y2gsCisJLnByb2JlID0gc2RlYnVnX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlID0gc2RlYnVnX2RyaXZlcl9yZW1vdmUsCiB9OwogCiBzdGF0aWMgdm9pZCBzZGVidWdfcmVsZWFzZV9hZGFwdGVyKHN0cnVjdCBkZXZpY2UgKiBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvd2QzM2M5My5jIGIvZHJpdmVycy9zY3NpL3dkMzNjOTMuYwppbmRleCBmZDYzYWRkLi5mYjUzZWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvd2QzM2M5My5jCisrKyBiL2RyaXZlcnMvc2NzaS93ZDMzYzkzLmMKQEAgLTQ2NSw3ICs0NjUsNyBAQAogCSAqLwogCiAJY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmlucHV0X1E7Ci0JcHJldiA9IDA7CisJcHJldiA9IE5VTEw7CiAJd2hpbGUgKGNtZCkgewogCQlpZiAoIShob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICYgKDEgPDwgY21kLT5kZXZpY2UtPmx1bikpKQogCQkJYnJlYWs7CkBAIC0xNTY5LDcgKzE1NjksNyBAQAogICovCiAKIAl0bXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+aW5wdXRfUTsKLQlwcmV2ID0gMDsKKwlwcmV2ID0gTlVMTDsKIAl3aGlsZSAodG1wKSB7CiAJCWlmICh0bXAgPT0gY21kKSB7CiAJCQlpZiAocHJldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzY4MzI4c2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jCmluZGV4IDRkZDVjM2YuLjhjYmYwZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzY4MzI4c2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYwpAQCAtMTQzLDcgKzE0Myw2IEBACiAgKiBtZW1vcnkgaWYgbGFyZ2UgbnVtYmVycyBvZiBzZXJpYWwgcG9ydHMgYXJlIG9wZW4uCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRtcF9idWZbU0VSSUFMX1hNSVRfU0laRV07IC8qIFRoaXMgaXMgY2hlYXRpbmcgKi8KLURFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOwogCiBzdGF0aWMgaW5saW5lIGludCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soc3RydWN0IG02OGtfc2VyaWFsICppbmZvLAogCQkJCQljaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MC5jIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCmluZGV4IDU0ZTVjYzAuLmZiNjEwYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0yNDY3LDcgKzI0NjgsNyBAQAogICogMTZ4NTAgc2VyaWFsIHBvcnRzIHRvIGJlIGNvbmZpZ3VyZWQgYXQgcnVuLXRpbWUsIHRvIHN1cHBvcnQgUENNQ0lBCiAgKiBtb2RlbXMgYW5kIFBDSSBtdWx0aXBvcnQgY2FyZHMuCiAgKi8KLXN0YXRpYyBERUNMQVJFX01VVEVYKHNlcmlhbF9zZW0pOworc3RhdGljIERFRklORV9NVVRFWChzZXJpYWxfbXV0ZXgpOwogCiBzdGF0aWMgc3RydWN0IHVhcnRfODI1MF9wb3J0ICpzZXJpYWw4MjUwX2ZpbmRfbWF0Y2hfb3JfdW51c2VkKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CkBAIC0yNTIyLDcgKzI1MjMsNyBAQAogCWlmIChwb3J0LT51YXJ0Y2xrID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZG93bigmc2VyaWFsX3NlbSk7CisJbXV0ZXhfbG9jaygmc2VyaWFsX211dGV4KTsKIAogCXVhcnQgPSBzZXJpYWw4MjUwX2ZpbmRfbWF0Y2hfb3JfdW51c2VkKHBvcnQpOwogCWlmICh1YXJ0KSB7CkBAIC0yNTQ0LDcgKzI1NDUsNyBAQAogCQlpZiAocmV0ID09IDApCiAJCQlyZXQgPSB1YXJ0LT5wb3J0LmxpbmU7CiAJfQotCXVwKCZzZXJpYWxfc2VtKTsKKwltdXRleF91bmxvY2soJnNlcmlhbF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjU2MSw3ICsyNTYyLDcgQEAKIHsKIAlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVhcnQgPSAmc2VyaWFsODI1MF9wb3J0c1tsaW5lXTsKIAotCWRvd24oJnNlcmlhbF9zZW0pOworCW11dGV4X2xvY2soJnNlcmlhbF9tdXRleCk7CiAJdWFydF9yZW1vdmVfb25lX3BvcnQoJnNlcmlhbDgyNTBfcmVnLCAmdWFydC0+cG9ydCk7CiAJaWYgKHNlcmlhbDgyNTBfaXNhX2RldnMpIHsKIAkJdWFydC0+cG9ydC5mbGFncyAmPSB+VVBGX0JPT1RfQVVUT0NPTkY7CkBAIC0yNTcxLDcgKzI1NzIsNyBAQAogCX0gZWxzZSB7CiAJCXVhcnQtPnBvcnQuZGV2ID0gTlVMTDsKIAl9Ci0JdXAoJnNlcmlhbF9zZW0pOworCW11dGV4X3VubG9jaygmc2VyaWFsX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0woc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwppbmRleCA2OThjYjc2Li44NDM3MTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKQEAgLTI4MCw2ICsyODAsNDAgQEAKIAkgIHlvdXIgYm9vdCBsb2FkZXIgKGxpbG8gb3IgbG9hZGxpbikgYWJvdXQgaG93IHRvIHBhc3Mgb3B0aW9ucyB0byB0aGUKIAkgIGtlcm5lbCBhdCBib290IHRpbWUuKQogCitjb25maWcgU0VSSUFMX0FUOTEKKwlib29sICJBVDkxUk05MjAwIHNlcmlhbCBwb3J0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUk0gJiYgQVJDSF9BVDkxUk05MjAwCisJc2VsZWN0IFNFUklBTF9DT1JFCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSBkcml2ZXIgZm9yIHRoZSBvbi1jaGlwIFVBUlRzIG9mIHRoZSBBVDkxUk05MjAwCisJICBwcm9jZXNzb3IuCisKK2NvbmZpZyBTRVJJQUxfQVQ5MV9DT05TT0xFCisJYm9vbCAiU3VwcG9ydCBmb3IgY29uc29sZSBvbiBBVDkxUk05MjAwIHNlcmlhbCBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX0FUOTE9eQorCXNlbGVjdCBTRVJJQUxfQ09SRV9DT05TT0xFCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2lzaCB0byB1c2UgYSBVQVJUIG9uIHRoZSBBVDkxUk05MjAwIGFzIHRoZSBzeXN0ZW0KKwkgIGNvbnNvbGUgKHRoZSBzeXN0ZW0gY29uc29sZSBpcyB0aGUgZGV2aWNlIHdoaWNoIHJlY2VpdmVzIGFsbCBrZXJuZWwKKwkgIG1lc3NhZ2VzIGFuZCB3YXJuaW5ncyBhbmQgd2hpY2ggYWxsb3dzIGxvZ2lucyBpbiBzaW5nbGUgdXNlciBtb2RlKS4KKworY29uZmlnIFNFUklBTF9BVDkxX1RUWUFUCisJYm9vbCAiSW5zdGFsbCBhcyBkZXZpY2UgdHR5QVQwLTQgaW5zdGVhZCBvZiB0dHlTMC00IgorCWRlcGVuZHMgb24gU0VSSUFMX0FUOTE9eQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdpc2ggdG8gaGF2ZSB0aGUgZml2ZSBpbnRlcm5hbCBBVDkxUk05MjAwIFVBUlRzCisJICBhcHBlYXIgYXMgL2Rldi90dHlBVDAtNCAobWFqb3IgMjQwLCBtaW5vciAwLTQpIGluc3RlYWQgb2YgdGhlCisJICBub3JtYWwgL2Rldi90dHlTMC00IChtYWpvciA0LCBtaW5vciA2NC02OCkuIFRoaXMgaXMgbmVjZXNzYXJ5IGlmCisJICB5b3UgYWxzbyB3YW50IG90aGVyIFVBUlRzLCBzdWNoIGFzIGV4dGVybmFsIDgyNTAvMTZDNTUwIGNvbXBhdGlibGUKKwkgIFVBUlRzLgorCSAgVGhlIHR0eVNuIG5vZGVzIGFyZSBsZWdhbGx5IHJlc2VydmVkIGZvciB0aGUgODI1MCBzZXJpYWwgZHJpdmVyCisJICBidXQgYXJlIG9mdGVuIG1pc3VzZWQgYnkgb3RoZXIgc2VyaWFsIGRyaXZlcnMuCisKKwkgIFRvIHVzZSB0aGlzLCB5b3Ugc2hvdWxkIGNyZWF0ZSBzdWl0YWJsZSB0dHlBVG4gZGV2aWNlIG5vZGVzIGluCisJICAvZGV2LywgYW5kIHBhc3MgImNvbnNvbGU9dHR5QVRuIiB0byB0aGUga2VybmVsLgorCisJICBTYXkgWSBpZiB5b3UgaGF2ZSBhbiBleHRlcm5hbCA4MjUwLzE2QzU1MCBVQVJULiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIFNFUklBTF9DTFBTNzExWAogCXRyaXN0YXRlICJDTFBTNzExWCBzZXJpYWwgcG9ydCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJNICYmIEFSQ0hfQ0xQUzcxMVgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKaW5kZXggMTM3MTQ4Yi4uMjRhNTgzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKQEAgLTU2LDMgKzU2LDQgQEAKIG9iai0kKENPTkZJR19TRVJJQUxfVFhYOSkgKz0gc2VyaWFsX3R4eDkubwogb2JqLSQoQ09ORklHX1NFUklBTF9WUjQxWFgpICs9IHZyNDF4eF9zaXUubwogb2JqLSQoQ09ORklHX1NFUklBTF9TR0lfSU9DNCkgKz0gaW9jNF9zZXJpYWwubworb2JqLSQoQ09ORklHX1NFUklBTF9BVDkxKSArPSBhdDkxX3NlcmlhbC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hdDkxX3NlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvYXQ5MV9zZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTIwNjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvYXQ5MV9zZXJpYWwuYwpAQCAtMCwwICsxLDg5NCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2NoYXIvYXQ5MV9zZXJpYWwuYworICoKKyAqICBEcml2ZXIgZm9yIEF0bWVsIEFUOTFSTTkyMDAgU2VyaWFsIHBvcnRzCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMyBSaWNrIEJyb25zb24KKyAqCisgKiAgQmFzZWQgb24gZHJpdmVycy9jaGFyL3NlcmlhbF9zYTExMDAuYywgYnkgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCisgKiAgQmFzZWQgb24gZHJpdmVycy9jaGFyL3NlcmlhbC5jLCBieSBMaW51cyBUb3J2YWxkcywgVGhlb2RvcmUgVHMnby4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxcm05MjAwX3VzYXJ0Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gvc2VyaWFsX2F0OTFybTkyMDAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3Bpby5oPgorCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQVQ5MV9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19NQUdJQ19TWVNSUSkKKyNkZWZpbmUgU1VQUE9SVF9TWVNSUQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorCisjaWZkZWYgQ09ORklHX1NFUklBTF9BVDkxX1RUWUFUCisKKy8qIFVzZSBkZXZpY2UgbmFtZSB0dHlBVCwgbWFqb3IgMjA0IGFuZCBtaW5vciAxNTQtMTY5LiAgVGhpcyBpcyBuZWNlc3NhcnkgaWYgd2UKKyAqIHNob3VsZCBjb2V4aXN0IHdpdGggdGhlIDgyNTAgZHJpdmVyLCBzdWNoIGFzIGlmIHdlIGhhdmUgYW4gZXh0ZXJuYWwgMTZDNTUwCisgKiBVQVJULiAqLworI2RlZmluZSBTRVJJQUxfQVQ5MV9NQUpPUgkyMDQKKyNkZWZpbmUgTUlOT1JfU1RBUlQJCTE1NAorI2RlZmluZSBBVDkxX0RFVklDRU5BTUUJCSJ0dHlBVCIKKworI2Vsc2UKKworLyogVXNlIGRldmljZSBuYW1lIHR0eVMsIG1ham9yIDQsIG1pbm9yIDY0LTY4LiAgVGhpcyBpcyB0aGUgdXN1YWwgc2VyaWFsIHBvcnQKKyAqIG5hbWUsIGJ1dCBpdCBpcyBsZWdhbGx5IHJlc2VydmVkIGZvciB0aGUgODI1MCBkcml2ZXIuICovCisjZGVmaW5lIFNFUklBTF9BVDkxX01BSk9SCVRUWV9NQUpPUgorI2RlZmluZSBNSU5PUl9TVEFSVAkJNjQKKyNkZWZpbmUgQVQ5MV9ERVZJQ0VOQU1FCQkidHR5UyIKKworI2VuZGlmCisKKyNkZWZpbmUgQVQ5MV9WQV9CQVNFX0RCR1UJKCh1bnNpZ25lZCBsb25nKSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVKQorI2RlZmluZSBBVDkxX0lTUl9QQVNTX0xJTUlUCTI1NgorCisjZGVmaW5lIFVBUlRfUFVUX0NSKHBvcnQsdikJd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUOTFfVVNfQ1IpCisjZGVmaW5lIFVBUlRfR0VUX01SKHBvcnQpCXJlYWRsKChwb3J0KS0+bWVtYmFzZSArIEFUOTFfVVNfTVIpCisjZGVmaW5lIFVBUlRfUFVUX01SKHBvcnQsdikJd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUOTFfVVNfTVIpCisjZGVmaW5lIFVBUlRfUFVUX0lFUihwb3J0LHYpCXdyaXRlbCh2LCAocG9ydCktPm1lbWJhc2UgKyBBVDkxX1VTX0lFUikKKyNkZWZpbmUgVUFSVF9QVVRfSURSKHBvcnQsdikJd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUOTFfVVNfSURSKQorI2RlZmluZSBVQVJUX0dFVF9JTVIocG9ydCkJcmVhZGwoKHBvcnQpLT5tZW1iYXNlICsgQVQ5MV9VU19JTVIpCisjZGVmaW5lIFVBUlRfR0VUX0NTUihwb3J0KQlyZWFkbCgocG9ydCktPm1lbWJhc2UgKyBBVDkxX1VTX0NTUikKKyNkZWZpbmUgVUFSVF9HRVRfQ0hBUihwb3J0KQlyZWFkbCgocG9ydCktPm1lbWJhc2UgKyBBVDkxX1VTX1JIUikKKyNkZWZpbmUgVUFSVF9QVVRfQ0hBUihwb3J0LHYpCXdyaXRlbCh2LCAocG9ydCktPm1lbWJhc2UgKyBBVDkxX1VTX1RIUikKKyNkZWZpbmUgVUFSVF9HRVRfQlJHUihwb3J0KQlyZWFkbCgocG9ydCktPm1lbWJhc2UgKyBBVDkxX1VTX0JSR1IpCisjZGVmaW5lIFVBUlRfUFVUX0JSR1IocG9ydCx2KQl3cml0ZWwodiwgKHBvcnQpLT5tZW1iYXNlICsgQVQ5MV9VU19CUkdSKQorI2RlZmluZSBVQVJUX1BVVF9SVE9SKHBvcnQsdikJd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUOTFfVVNfUlRPUikKKworLy8gI2RlZmluZSBVQVJUX0dFVF9DUihwb3J0KQlyZWFkbCgocG9ydCktPm1lbWJhc2UgKyBBVDkxX1VTX0NSKQkJLy8gaXMgd3JpdGUtb25seQorCisgLyogUERDIHJlZ2lzdGVycyAqLworI2RlZmluZSBVQVJUX1BVVF9QVENSKHBvcnQsdikJd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUOTFfUERDX1BUQ1IpCisjZGVmaW5lIFVBUlRfUFVUX1JQUihwb3J0LHYpCXdyaXRlbCh2LCAocG9ydCktPm1lbWJhc2UgKyBBVDkxX1BEQ19SUFIpCisjZGVmaW5lIFVBUlRfUFVUX1JDUihwb3J0LHYpCXdyaXRlbCh2LCAocG9ydCktPm1lbWJhc2UgKyBBVDkxX1BEQ19SQ1IpCisjZGVmaW5lIFVBUlRfR0VUX1JDUihwb3J0KQlyZWFkbCgocG9ydCktPm1lbWJhc2UgKyBBVDkxX1BEQ19SQ1IpCisjZGVmaW5lIFVBUlRfUFVUX1JOUFIocG9ydCx2KQl3cml0ZWwodiwgKHBvcnQpLT5tZW1iYXNlICsgQVQ5MV9QRENfUk5QUikKKyNkZWZpbmUgVUFSVF9QVVRfUk5DUihwb3J0LHYpCXdyaXRlbCh2LCAocG9ydCktPm1lbWJhc2UgKyBBVDkxX1BEQ19STkNSKQorCisKK3N0YXRpYyBpbnQgKCphdDkxX29wZW4pKHN0cnVjdCB1YXJ0X3BvcnQgKik7CitzdGF0aWMgdm9pZCAoKmF0OTFfY2xvc2UpKHN0cnVjdCB1YXJ0X3BvcnQgKik7CisKKyNpZmRlZiBTVVBQT1JUX1NZU1JRCitzdGF0aWMgc3RydWN0IGNvbnNvbGUgYXQ5MV9jb25zb2xlOworI2VuZGlmCisKKy8qCisgKiBSZXR1cm4gVElPQ1NFUl9URU1UIHdoZW4gdHJhbnNtaXR0ZXIgRklGTyBhbmQgU2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHkuCisgKi8KK3N0YXRpYyB1X2ludCBhdDkxX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIChVQVJUX0dFVF9DU1IocG9ydCkgJiBBVDkxX1VTX1RYRU1QVFkpID8gVElPQ1NFUl9URU1UIDogMDsKK30KKworLyoKKyAqIFNldCBzdGF0ZSBvZiB0aGUgbW9kZW0gY29udHJvbCBvdXRwdXQgbGluZXMKKyAqLworc3RhdGljIHZvaWQgYXQ5MV9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdV9pbnQgbWN0cmwpCit7CisJdW5zaWduZWQgaW50IGNvbnRyb2wgPSAwOworCisJLyoKKwkgKiBFcnJhdGEgIzM5OiBSVFMwIGlzIG5vdCBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byBQQTIxLiAgV2UgbmVlZCB0byBkcml2ZQorCSAqICB0aGUgcGluIG1hbnVhbGx5LgorCSAqLworCWlmIChwb3J0LT5tYXBiYXNlID09IEFUOTFfVkFfQkFTRV9VUzApIHsKKwkJaWYgKG1jdHJsICYgVElPQ01fUlRTKQorCQkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9BICsgUElPX0NPRFIsIEFUOTFfUEEyMV9SVFMwKTsKKwkJZWxzZQorCQkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9BICsgUElPX1NPRFIsIEFUOTFfUEEyMV9SVFMwKTsKKwl9CisKKwlpZiAobWN0cmwgJiBUSU9DTV9SVFMpCisJCWNvbnRyb2wgfD0gQVQ5MV9VU19SVFNFTjsKKwllbHNlCisJCWNvbnRyb2wgfD0gQVQ5MV9VU19SVFNESVM7CisKKwlpZiAobWN0cmwgJiBUSU9DTV9EVFIpCisJCWNvbnRyb2wgfD0gQVQ5MV9VU19EVFJFTjsKKwllbHNlCisJCWNvbnRyb2wgfD0gQVQ5MV9VU19EVFJESVM7CisKKwlVQVJUX1BVVF9DUihwb3J0LGNvbnRyb2wpOworfQorCisvKgorICogR2V0IHN0YXRlIG9mIHRoZSBtb2RlbSBjb250cm9sIGlucHV0IGxpbmVzCisgKi8KK3N0YXRpYyB1X2ludCBhdDkxX2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXMsIHJldCA9IDA7CisKKwlzdGF0dXMgPSBVQVJUX0dFVF9DU1IocG9ydCk7CisKKwkvKgorCSAqIFRoZSBjb250cm9sIHNpZ25hbHMgYXJlIGFjdGl2ZSBsb3cuCisJICovCisJaWYgKCEoc3RhdHVzICYgQVQ5MV9VU19EQ0QpKQorCQlyZXQgfD0gVElPQ01fQ0Q7CisJaWYgKCEoc3RhdHVzICYgQVQ5MV9VU19DVFMpKQorCQlyZXQgfD0gVElPQ01fQ1RTOworCWlmICghKHN0YXR1cyAmIEFUOTFfVVNfRFNSKSkKKwkJcmV0IHw9IFRJT0NNX0RTUjsKKwlpZiAoIShzdGF0dXMgJiBBVDkxX1VTX1JJKSkKKwkJcmV0IHw9IFRJT0NNX1JJOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFN0b3AgdHJhbnNtaXR0aW5nLgorICovCitzdGF0aWMgdm9pZCBhdDkxX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlVQVJUX1BVVF9JRFIocG9ydCwgQVQ5MV9VU19UWFJEWSk7CisJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayAmPSB+QVQ5MV9VU19UWFJEWTsKK30KKworLyoKKyAqIFN0YXJ0IHRyYW5zbWl0dGluZy4KKyAqLworc3RhdGljIHZvaWQgYXQ5MV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgfD0gQVQ5MV9VU19UWFJEWTsKKwlVQVJUX1BVVF9JRVIocG9ydCwgQVQ5MV9VU19UWFJEWSk7Cit9CisKKy8qCisgKiBTdG9wIHJlY2VpdmluZyAtIHBvcnQgaXMgaW4gcHJvY2VzcyBvZiBiZWluZyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfc3RvcF9yeChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCVVBUlRfUFVUX0lEUihwb3J0LCBBVDkxX1VTX1JYUkRZKTsKK30KKworLyoKKyAqIEVuYWJsZSBtb2RlbSBzdGF0dXMgaW50ZXJydXB0cworICovCitzdGF0aWMgdm9pZCBhdDkxX2VuYWJsZV9tcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgfD0gKEFUOTFfVVNfUklJQyB8IEFUOTFfVVNfRFNSSUMgfCBBVDkxX1VTX0RDRElDIHwgQVQ5MV9VU19DVFNJQyk7CisJVUFSVF9QVVRfSUVSKHBvcnQsIEFUOTFfVVNfUklJQyB8IEFUOTFfVVNfRFNSSUMgfCBBVDkxX1VTX0RDRElDIHwgQVQ5MV9VU19DVFNJQyk7Cit9CisKKy8qCisgKiBDb250cm9sIHRoZSB0cmFuc21pc3Npb24gb2YgYSBicmVhayBzaWduYWwKKyAqLworc3RhdGljIHZvaWQgYXQ5MV9icmVha19jdGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQoreworCWlmIChicmVha19zdGF0ZSAhPSAwKQorCQlVQVJUX1BVVF9DUihwb3J0LCBBVDkxX1VTX1NUVEJSSyk7CS8qIHN0YXJ0IGJyZWFrICovCisJZWxzZQorCQlVQVJUX1BVVF9DUihwb3J0LCBBVDkxX1VTX1NUUEJSSyk7CS8qIHN0b3AgYnJlYWsgKi8KK30KKworLyoKKyAqIENoYXJhY3RlcnMgcmVjZWl2ZWQgKGNhbGxlZCBmcm9tIGludGVycnVwdCBoYW5kbGVyKQorICovCitzdGF0aWMgdm9pZCBhdDkxX3J4X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5pbmZvLT50dHk7CisJdW5zaWduZWQgaW50IHN0YXR1cywgY2gsIGZsZzsKKworCXN0YXR1cyA9IFVBUlRfR0VUX0NTUihwb3J0KSAmIHBvcnQtPnJlYWRfc3RhdHVzX21hc2s7CisJd2hpbGUgKHN0YXR1cyAmIChBVDkxX1VTX1JYUkRZKSkgeworCQljaCA9IFVBUlRfR0VUX0NIQVIocG9ydCk7CisKKwkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQorCQkJZ290byBpZ25vcmVfY2hhcjsKKwkJcG9ydC0+aWNvdW50LnJ4Kys7CisKKwkJZmxnID0gVFRZX05PUk1BTDsKKworCQkvKgorCQkgKiBub3RlIHRoYXQgdGhlIGVycm9yIGhhbmRsaW5nIGNvZGUgaXMKKwkJICogb3V0IG9mIHRoZSBtYWluIGV4ZWN1dGlvbiBwYXRoCisJCSAqLworCQlpZiAodW5saWtlbHkoc3RhdHVzICYgKEFUOTFfVVNfUEFSRSB8IEFUOTFfVVNfRlJBTUUgfCBBVDkxX1VTX09WUkUpKSkgeworCQkJVUFSVF9QVVRfQ1IocG9ydCwgQVQ5MV9VU19SU1RTVEEpOwkvKiBjbGVhciBlcnJvciAqLworCQkJaWYgKHN0YXR1cyAmIChBVDkxX1VTX1BBUkUpKQorCQkJCXBvcnQtPmljb3VudC5wYXJpdHkrKzsKKwkJCWlmIChzdGF0dXMgJiAoQVQ5MV9VU19GUkFNRSkpCisJCQkJcG9ydC0+aWNvdW50LmZyYW1lKys7CisJCQlpZiAoc3RhdHVzICYgKEFUOTFfVVNfT1ZSRSkpCisJCQkJcG9ydC0+aWNvdW50Lm92ZXJydW4rKzsKKworCQkJaWYgKHN0YXR1cyAmIEFUOTFfVVNfUEFSRSkKKwkJCQlmbGcgPSBUVFlfUEFSSVRZOworCQkJZWxzZSBpZiAoc3RhdHVzICYgQVQ5MV9VU19GUkFNRSkKKwkJCQlmbGcgPSBUVFlfRlJBTUU7CisJCQlpZiAoc3RhdHVzICYgQVQ5MV9VU19PVlJFKSB7CisJCQkJLyoKKwkJCQkgKiBvdmVycnVuIGRvZXMgKm5vdCogYWZmZWN0IHRoZSBjaGFyYWN0ZXIKKwkJCQkgKiB3ZSByZWFkIGZyb20gdGhlIEZJRk8KKwkJCQkgKi8KKwkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGcpOworCQkJCWNoID0gMDsKKwkJCQlmbGcgPSBUVFlfT1ZFUlJVTjsKKwkJCX0KKyNpZmRlZiBTVVBQT1JUX1NZU1JRCisJCQlwb3J0LT5zeXNycSA9IDA7CisjZW5kaWYKKwkJfQorCisJCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKHBvcnQsIGNoLCByZWdzKSkKKwkJCWdvdG8gaWdub3JlX2NoYXI7CisKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxnKTsKKworCWlnbm9yZV9jaGFyOgorCQlzdGF0dXMgPSBVQVJUX0dFVF9DU1IocG9ydCkgJiBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOworCX0KKworCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Cit9CisKKy8qCisgKiBUcmFuc21pdCBjaGFyYWN0ZXJzIChjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgaGFuZGxlcikKKyAqLworc3RhdGljIHZvaWQgYXQ5MV90eF9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5pbmZvLT54bWl0OworCisJaWYgKHBvcnQtPnhfY2hhcikgeworCQlVQVJUX1BVVF9DSEFSKHBvcnQsIHBvcnQtPnhfY2hhcik7CisJCXBvcnQtPmljb3VudC50eCsrOworCQlwb3J0LT54X2NoYXIgPSAwOworCQlyZXR1cm47CisJfQorCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKHBvcnQpKSB7CisJCWF0OTFfc3RvcF90eChwb3J0KTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChVQVJUX0dFVF9DU1IocG9ydCkgJiBBVDkxX1VTX1RYUkRZKSB7CisJCVVBUlRfUFVUX0NIQVIocG9ydCwgeG1pdC0+YnVmW3htaXQtPnRhaWxdKTsKKwkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKKwkJcG9ydC0+aWNvdW50LnR4Kys7CisJCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCisJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOworCisJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKKwkJYXQ5MV9zdG9wX3R4KHBvcnQpOworfQorCisvKgorICogSW50ZXJydXB0IGhhbmRsZXIKKyAqLworc3RhdGljIGlycXJldHVybl90IGF0OTFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzLCBwZW5kaW5nLCBwYXNzX2NvdW50ZXIgPSAwOworCisJc3RhdHVzID0gVUFSVF9HRVRfQ1NSKHBvcnQpOworCXBlbmRpbmcgPSBzdGF0dXMgJiBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOworCWlmIChwZW5kaW5nKSB7CisJCWRvIHsKKwkJCWlmIChwZW5kaW5nICYgQVQ5MV9VU19SWFJEWSkKKwkJCQlhdDkxX3J4X2NoYXJzKHBvcnQsIHJlZ3MpOworCisJCQkvKiBDbGVhciB0aGUgcmVsZXZlbnQgYnJlYWsgYml0cyAqLworCQkJaWYgKHBlbmRpbmcgJiBBVDkxX1VTX1JYQlJLKSB7CisJCQkJVUFSVF9QVVRfQ1IocG9ydCwgQVQ5MV9VU19SU1RTVEEpOworCQkJCXBvcnQtPmljb3VudC5icmsrKzsKKwkJCQl1YXJ0X2hhbmRsZV9icmVhayhwb3J0KTsKKwkJCX0KKworCQkJLy8gVE9ETzogQWxsIHJlYWRzIHRvIENTUiB3aWxsIGNsZWFyIHRoZXNlIGludGVycnVwdHMhCisJCQlpZiAocGVuZGluZyAmIEFUOTFfVVNfUklJQykgcG9ydC0+aWNvdW50LnJuZysrOworCQkJaWYgKHBlbmRpbmcgJiBBVDkxX1VTX0RTUklDKSBwb3J0LT5pY291bnQuZHNyKys7CisJCQlpZiAocGVuZGluZyAmIEFUOTFfVVNfRENESUMpCisJCQkJdWFydF9oYW5kbGVfZGNkX2NoYW5nZShwb3J0LCAhKHN0YXR1cyAmIEFUOTFfVVNfRENEKSk7CisJCQlpZiAocGVuZGluZyAmIEFUOTFfVVNfQ1RTSUMpCisJCQkJdWFydF9oYW5kbGVfY3RzX2NoYW5nZShwb3J0LCAhKHN0YXR1cyAmIEFUOTFfVVNfQ1RTKSk7CisJCQlpZiAocGVuZGluZyAmIChBVDkxX1VTX1JJSUMgfCBBVDkxX1VTX0RTUklDIHwgQVQ5MV9VU19EQ0RJQyB8IEFUOTFfVVNfQ1RTSUMpKQorCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+aW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCisJCQlpZiAocGVuZGluZyAmIEFUOTFfVVNfVFhSRFkpCisJCQkJYXQ5MV90eF9jaGFycyhwb3J0KTsKKwkJCWlmIChwYXNzX2NvdW50ZXIrKyA+IEFUOTFfSVNSX1BBU1NfTElNSVQpCisJCQkJYnJlYWs7CisKKwkJCXN0YXR1cyA9IFVBUlRfR0VUX0NTUihwb3J0KTsKKwkJCXBlbmRpbmcgPSBzdGF0dXMgJiBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOworCQl9IHdoaWxlIChwZW5kaW5nKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogUGVyZm9ybSBpbml0aWFsaXphdGlvbiBhbmQgZW5hYmxlIHBvcnQgZm9yIHJlY2VwdGlvbgorICovCitzdGF0aWMgaW50IGF0OTFfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCWludCByZXR2YWw7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IG5vIGludGVycnVwdHMgYXJlIGVuYWJsZWQgb3RoZXJ3aXNlIHdoZW4KKwkgKiByZXF1ZXN0X2lycSgpIGlzIGNhbGxlZCB3ZSBjb3VsZCBnZXQgc3R1Y2sgdHJ5aW5nIHRvCisJICogaGFuZGxlIGFuIHVuZXhwZWN0ZWQgaW50ZXJydXB0CisJICovCisJVUFSVF9QVVRfSURSKHBvcnQsIC0xKTsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIElSUQorCSAqLworCXJldHZhbCA9IHJlcXVlc3RfaXJxKHBvcnQtPmlycSwgYXQ5MV9pbnRlcnJ1cHQsIFNBX1NISVJRLCAiYXQ5MV9zZXJpYWwiLCBwb3J0KTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50aygiYXQ5MV9zZXJpYWw6IGF0OTFfc3RhcnR1cCAtIENhbid0IGdldCBpcnFcbiIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCS8qCisJICogSWYgdGhlcmUgaXMgYSBzcGVjaWZpYyAib3BlbiIgZnVuY3Rpb24gKHRvIHJlZ2lzdGVyCisJICogY29udHJvbCBsaW5lIGludGVycnVwdHMpCisJICovCisJaWYgKGF0OTFfb3BlbikgeworCQlyZXR2YWwgPSBhdDkxX29wZW4ocG9ydCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWZyZWVfaXJxKHBvcnQtPmlycSwgcG9ydCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQorCisJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayA9IEFUOTFfVVNfUlhSRFkgfCBBVDkxX1VTX1RYUkRZIHwgQVQ5MV9VU19PVlJFCisJCQl8IEFUOTFfVVNfRlJBTUUgfCBBVDkxX1VTX1BBUkUgfCBBVDkxX1VTX1JYQlJLOworCS8qCisJICogRmluYWxseSwgZW5hYmxlIHRoZSBzZXJpYWwgcG9ydAorCSAqLworCVVBUlRfUFVUX0NSKHBvcnQsIEFUOTFfVVNfUlNUU1RBIHwgQVQ5MV9VU19SU1RSWCk7CisJVUFSVF9QVVRfQ1IocG9ydCwgQVQ5MV9VU19UWEVOIHwgQVQ5MV9VU19SWEVOKTsJCS8qIGVuYWJsZSB4bWl0ICYgcmN2ciAqLworCVVBUlRfUFVUX0lFUihwb3J0LCBBVDkxX1VTX1JYUkRZKTsJCQkvKiBkbyByZWNlaXZlIG9ubHkgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERpc2FibGUgdGhlIHBvcnQKKyAqLworc3RhdGljIHZvaWQgYXQ5MV9zaHV0ZG93bihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCS8qCisJICogRGlzYWJsZSBhbGwgaW50ZXJydXB0cywgcG9ydCBhbmQgYnJlYWsgY29uZGl0aW9uLgorCSAqLworCVVBUlRfUFVUX0NSKHBvcnQsIEFUOTFfVVNfUlNUU1RBKTsKKwlVQVJUX1BVVF9JRFIocG9ydCwgLTEpOworCisJLyoKKwkgKiBGcmVlIHRoZSBpbnRlcnJ1cHQKKwkgKi8KKwlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHNwZWNpZmljICJjbG9zZSIgZnVuY3Rpb24gKHRvIHVucmVnaXN0ZXIKKwkgKiBjb250cm9sIGxpbmUgaW50ZXJydXB0cykKKwkgKi8KKwlpZiAoYXQ5MV9jbG9zZSkKKwkJYXQ5MV9jbG9zZShwb3J0KTsKK30KKworLyoKKyAqIFBvd2VyIC8gQ2xvY2sgbWFuYWdlbWVudC4KKyAqLworc3RhdGljIHZvaWQgYXQ5MV9zZXJpYWxfcG0oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHN0YXRlLCB1bnNpZ25lZCBpbnQgb2xkc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIDA6CisJCQkvKgorCQkJICogRW5hYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGZvciB0aGlzIHNlcmlhbCBwb3J0LgorCQkJICogVGhpcyBpcyBjYWxsZWQgb24gdWFydF9vcGVuKCkgb3IgYSByZXN1bWUgZXZlbnQuCisJCQkgKi8KKwkJCWF0OTFfc3lzX3dyaXRlKEFUOTFfUE1DX1BDRVIsIDEgPDwgcG9ydC0+aXJxKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQkvKgorCQkJICogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9jayBmb3IgdGhpcyBzZXJpYWwgcG9ydC4KKwkJCSAqIFRoaXMgaXMgY2FsbGVkIG9uIHVhcnRfY2xvc2UoKSBvciBhIHN1c3BlbmQgZXZlbnQuCisJCQkgKi8KKwkJCWlmIChwb3J0LT5pcnEgIT0gQVQ5MV9JRF9TWVMpCQkJLyogaXMgdGhpcyBhIHNoYXJlZCBjbG9jaz8gKi8KKwkJCQlhdDkxX3N5c193cml0ZShBVDkxX1BNQ19QQ0RSLCAxIDw8IHBvcnQtPmlycSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiYXQ5MV9zZXJpYWw6IHVua25vd24gcG0gJWRcbiIsIHN0YXRlKTsKKwl9Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIHBvcnQgcGFyYW1ldGVycworICovCitzdGF0aWMgdm9pZCBhdDkxX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICogdGVybWlvcywgc3RydWN0IHRlcm1pb3MgKiBvbGQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbW9kZSwgaW1yLCBxdW90LCBiYXVkOworCisJYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCB0ZXJtaW9zLCBvbGQsIDAsIHBvcnQtPnVhcnRjbGsvMTYpOworCXF1b3QgPSB1YXJ0X2dldF9kaXZpc29yKHBvcnQsIGJhdWQpOworCisJLyogR2V0IGN1cnJlbnQgbW9kZSByZWdpc3RlciAqLworCW1vZGUgPSBVQVJUX0dFVF9NUihwb3J0KSAmIH4oQVQ5MV9VU19DSFJMIHwgQVQ5MV9VU19OQlNUT1AgfCBBVDkxX1VTX1BBUik7CisKKwkvKiBieXRlIHNpemUgKi8KKwlzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OgorCQltb2RlIHw9IEFUOTFfVVNfQ0hSTF81OworCQlicmVhazsKKwljYXNlIENTNjoKKwkJbW9kZSB8PSBBVDkxX1VTX0NIUkxfNjsKKwkJYnJlYWs7CisJY2FzZSBDUzc6CisJCW1vZGUgfD0gQVQ5MV9VU19DSFJMXzc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1vZGUgfD0gQVQ5MV9VU19DSFJMXzg7CisJCWJyZWFrOworCX0KKworCS8qIHN0b3AgYml0cyAqLworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKQorCQltb2RlIHw9IEFUOTFfVVNfTkJTVE9QXzI7CisKKwkvKiBwYXJpdHkgKi8KKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQikgeworCQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENNU1BBUikgewkJCS8qIE1hcmsgb3IgU3BhY2UgcGFyaXR5ICovCisJCQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkKKwkJCQltb2RlIHw9IEFUOTFfVVNfUEFSX01BUks7CisJCQllbHNlCisJCQkJbW9kZSB8PSBBVDkxX1VTX1BBUl9TUEFDRTsKKwkJfQorCQllbHNlIGlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REKQorCQkJbW9kZSB8PSBBVDkxX1VTX1BBUl9PREQ7CisJCWVsc2UKKwkJCW1vZGUgfD0gQVQ5MV9VU19QQVJfRVZFTjsKKwl9CisJZWxzZQorCQltb2RlIHw9IEFUOTFfVVNfUEFSX05PTkU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBBVDkxX1VTX09WUkU7CisJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJTlBDSykKKwkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBBVDkxX1VTX0ZSQU1FIHwgQVQ5MV9VU19QQVJFOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgKEJSS0lOVCB8IFBBUk1SSykpCisJCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgfD0gQVQ5MV9VU19SWEJSSzsKKworCS8qCisJICogQ2hhcmFjdGVycyB0byBpZ25vcmUKKwkgKi8KKwlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQorCQlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gKEFUOTFfVVNfRlJBTUUgfCBBVDkxX1VTX1BBUkUpOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOQlJLKSB7CisJCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBBVDkxX1VTX1JYQlJLOworCQkvKgorCQkgKiBJZiB3ZSdyZSBpZ25vcmluZyBwYXJpdHkgYW5kIGJyZWFrIGluZGljYXRvcnMsCisJCSAqIGlnbm9yZSBvdmVycnVucyB0b28gKGZvciByZWFsIHJhdyBzdXBwb3J0KS4KKwkJICovCisJCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQorCQkJcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IEFUOTFfVVNfT1ZSRTsKKwl9CisKKwkvLyBUT0RPOiBJZ25vcmUgYWxsIGNoYXJhY3RlcnMgaWYgQ1JFQUQgaXMgc2V0LgorCisJLyogdXBkYXRlIHRoZSBwZXItcG9ydCB0aW1lb3V0ICovCisJdWFydF91cGRhdGVfdGltZW91dChwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnLCBiYXVkKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyBhbmQgZHJhaW4gdHJhbnNtaXR0ZXIgKi8KKwlpbXIgPSBVQVJUX0dFVF9JTVIocG9ydCk7CS8qIGdldCBpbnRlcnJ1cHQgbWFzayAqLworCVVBUlRfUFVUX0lEUihwb3J0LCAtMSk7CQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJd2hpbGUgKCEoVUFSVF9HRVRfQ1NSKHBvcnQpICYgQVQ5MV9VU19UWEVNUFRZKSkgeyBiYXJyaWVyKCk7IH0KKworCS8qIGRpc2FibGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyICovCisJVUFSVF9QVVRfQ1IocG9ydCwgQVQ5MV9VU19UWERJUyB8IEFUOTFfVVNfUlhESVMpOworCisJLyogc2V0IHRoZSBwYXJpdHksIHN0b3AgYml0cyBhbmQgZGF0YSBzaXplICovCisJVUFSVF9QVVRfTVIocG9ydCwgbW9kZSk7CisKKwkvKiBzZXQgdGhlIGJhdWQgcmF0ZSAqLworCVVBUlRfUFVUX0JSR1IocG9ydCwgcXVvdCk7CisJVUFSVF9QVVRfQ1IocG9ydCwgQVQ5MV9VU19SU1RTVEEgfCBBVDkxX1VTX1JTVFJYKTsKKwlVQVJUX1BVVF9DUihwb3J0LCBBVDkxX1VTX1RYRU4gfCBBVDkxX1VTX1JYRU4pOworCisJLyogcmVzdG9yZSBpbnRlcnJ1cHRzICovCisJVUFSVF9QVVRfSUVSKHBvcnQsIGltcik7CisKKwkvKiBDVFMgZmxvdy1jb250cm9sIGFuZCBtb2RlbS1zdGF0dXMgaW50ZXJydXB0cyAqLworCWlmIChVQVJUX0VOQUJMRV9NUyhwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnKSkKKwkJcG9ydC0+b3BzLT5lbmFibGVfbXMocG9ydCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBSZXR1cm4gc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHNwZWNpZmllZCBwb3J0CisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICphdDkxX3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gKHBvcnQtPnR5cGUgPT0gUE9SVF9BVDkxUk05MjAwKSA/ICJBVDkxX1NFUklBTCIgOiBOVUxMOworfQorCisvKgorICogUmVsZWFzZSB0aGUgbWVtb3J5IHJlZ2lvbihzKSBiZWluZyB1c2VkIGJ5ICdwb3J0Jy4KKyAqLworc3RhdGljIHZvaWQgYXQ5MV9yZWxlYXNlX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZWxlYXNlX21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwKKwkJKHBvcnQtPm1hcGJhc2UgPT0gQVQ5MV9WQV9CQVNFX0RCR1UpID8gNTEyIDogU1pfMTZLKTsKK30KKworLyoKKyAqIFJlcXVlc3QgdGhlIG1lbW9yeSByZWdpb24ocykgYmVpbmcgdXNlZCBieSAncG9ydCcuCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9yZXF1ZXN0X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gcmVxdWVzdF9tZW1fcmVnaW9uKHBvcnQtPm1hcGJhc2UsCisJCShwb3J0LT5tYXBiYXNlID09IEFUOTFfVkFfQkFTRV9EQkdVKSA/IDUxMiA6IFNaXzE2SywKKwkJImF0OTFfc2VyaWFsIikgIT0gTlVMTCA/IDAgOiAtRUJVU1k7CisKK30KKworLyoKKyAqIENvbmZpZ3VyZS9hdXRvY29uZmlndXJlIHRoZSBwb3J0LgorICovCitzdGF0aWMgdm9pZCBhdDkxX2NvbmZpZ19wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBVQVJUX0NPTkZJR19UWVBFKSB7CisJCXBvcnQtPnR5cGUgPSBQT1JUX0FUOTFSTTkyMDA7CisJCWF0OTFfcmVxdWVzdF9wb3J0KHBvcnQpOworCX0KK30KKworLyoKKyAqIFZlcmlmeSB0aGUgbmV3IHNlcmlhbF9zdHJ1Y3QgKGZvciBUSU9DU1NFUklBTCkuCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV92ZXJpZnlfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqc2VyKQoreworCWludCByZXQgPSAwOworCWlmIChzZXItPnR5cGUgIT0gUE9SVF9VTktOT1dOICYmIHNlci0+dHlwZSAhPSBQT1JUX0FUOTFSTTkyMDApCisJCXJldCA9IC1FSU5WQUw7CisJaWYgKHBvcnQtPmlycSAhPSBzZXItPmlycSkKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAoc2VyLT5pb190eXBlICE9IFNFUklBTF9JT19NRU0pCisJCXJldCA9IC1FSU5WQUw7CisJaWYgKHBvcnQtPnVhcnRjbGsgLyAxNiAhPSBzZXItPmJhdWRfYmFzZSkKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAoKHZvaWQgKilwb3J0LT5tYXBiYXNlICE9IHNlci0+aW9tZW1fYmFzZSkKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAocG9ydC0+aW9iYXNlICE9IHNlci0+cG9ydCkKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAoc2VyLT5odWI2ICE9IDApCisJCXJldCA9IC1FSU5WQUw7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBhdDkxX3BvcHMgPSB7CisJLnR4X2VtcHR5CT0gYXQ5MV90eF9lbXB0eSwKKwkuc2V0X21jdHJsCT0gYXQ5MV9zZXRfbWN0cmwsCisJLmdldF9tY3RybAk9IGF0OTFfZ2V0X21jdHJsLAorCS5zdG9wX3R4CT0gYXQ5MV9zdG9wX3R4LAorCS5zdGFydF90eAk9IGF0OTFfc3RhcnRfdHgsCisJLnN0b3BfcngJPSBhdDkxX3N0b3BfcngsCisJLmVuYWJsZV9tcwk9IGF0OTFfZW5hYmxlX21zLAorCS5icmVha19jdGwJPSBhdDkxX2JyZWFrX2N0bCwKKwkuc3RhcnR1cAk9IGF0OTFfc3RhcnR1cCwKKwkuc2h1dGRvd24JPSBhdDkxX3NodXRkb3duLAorCS5zZXRfdGVybWlvcwk9IGF0OTFfc2V0X3Rlcm1pb3MsCisJLnR5cGUJCT0gYXQ5MV90eXBlLAorCS5yZWxlYXNlX3BvcnQJPSBhdDkxX3JlbGVhc2VfcG9ydCwKKwkucmVxdWVzdF9wb3J0CT0gYXQ5MV9yZXF1ZXN0X3BvcnQsCisJLmNvbmZpZ19wb3J0IAk9IGF0OTFfY29uZmlnX3BvcnQsCisJLnZlcmlmeV9wb3J0IAk9IGF0OTFfdmVyaWZ5X3BvcnQsCisJLnBtCQk9IGF0OTFfc2VyaWFsX3BtLAorfTsKKworc3RhdGljIHN0cnVjdCB1YXJ0X3BvcnQgYXQ5MV9wb3J0c1tBVDkxX05SX1VBUlRdOworCit2b2lkIF9faW5pdCBhdDkxX2luaXRfcG9ydHModm9pZCkKK3sKKwlzdGF0aWMgaW50IGZpcnN0ID0gMTsKKwlpbnQgaTsKKworCWlmICghZmlyc3QpCisJCXJldHVybjsKKwlmaXJzdCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVQ5MV9OUl9VQVJUOyBpKyspIHsKKwkJYXQ5MV9wb3J0c1tpXS5pb3R5cGUJPSBVUElPX01FTTsKKwkJYXQ5MV9wb3J0c1tpXS5mbGFncyAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORjsKKwkJYXQ5MV9wb3J0c1tpXS51YXJ0Y2xrICAgPSBhdDkxX21hc3Rlcl9jbG9jazsKKwkJYXQ5MV9wb3J0c1tpXS5vcHMJPSAmYXQ5MV9wb3BzOworCQlhdDkxX3BvcnRzW2ldLmZpZm9zaXplICA9IDE7CisJCWF0OTFfcG9ydHNbaV0ubGluZQk9IGk7CisgCX0KK30KKwordm9pZCBfX2luaXQgYXQ5MV9yZWdpc3Rlcl91YXJ0X2ZucyhzdHJ1Y3QgYXQ5MXJtOTIwMF9wb3J0X2ZucyAqZm5zKQoreworCWlmIChmbnMtPmVuYWJsZV9tcykKKwkJYXQ5MV9wb3BzLmVuYWJsZV9tcyA9IGZucy0+ZW5hYmxlX21zOworCWlmIChmbnMtPmdldF9tY3RybCkKKwkJYXQ5MV9wb3BzLmdldF9tY3RybCA9IGZucy0+Z2V0X21jdHJsOworCWlmIChmbnMtPnNldF9tY3RybCkKKwkJYXQ5MV9wb3BzLnNldF9tY3RybCA9IGZucy0+c2V0X21jdHJsOworCWF0OTFfb3BlbiAgICAgICAgICA9IGZucy0+b3BlbjsKKwlhdDkxX2Nsb3NlICAgICAgICAgPSBmbnMtPmNsb3NlOworCWF0OTFfcG9wcy5wbSAgICAgICA9IGZucy0+cG07CisJYXQ5MV9wb3BzLnNldF93YWtlID0gZm5zLT5zZXRfd2FrZTsKK30KKworLyoKKyAqIFNldHVwIHBvcnRzLgorICovCit2b2lkIF9faW5pdCBhdDkxX3JlZ2lzdGVyX3VhcnQoaW50IGlkeCwgaW50IHBvcnQpCit7CisJaWYgKChpZHggPCAwKSB8fCAoaWR4ID49IEFUOTFfTlJfVUFSVCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYmFkIGluZGV4IG51bWJlciAlZFxuIiwgX19GVU5DVElPTl9fLCBpZHgpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChwb3J0KSB7CisJY2FzZSAwOgorCQlhdDkxX3BvcnRzW2lkeF0ubWVtYmFzZSA9ICh2b2lkIF9faW9tZW0gKikgQVQ5MV9WQV9CQVNFX1VTMDsKKwkJYXQ5MV9wb3J0c1tpZHhdLm1hcGJhc2UgPSBBVDkxX1ZBX0JBU0VfVVMwOworCQlhdDkxX3BvcnRzW2lkeF0uaXJxICAgICA9IEFUOTFfSURfVVMwOworCQlBVDkxX0NmZ1BJT19VU0FSVDAoKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlhdDkxX3BvcnRzW2lkeF0ubWVtYmFzZSA9ICh2b2lkIF9faW9tZW0gKikgQVQ5MV9WQV9CQVNFX1VTMTsKKwkJYXQ5MV9wb3J0c1tpZHhdLm1hcGJhc2UgPSBBVDkxX1ZBX0JBU0VfVVMxOworCQlhdDkxX3BvcnRzW2lkeF0uaXJxICAgICA9IEFUOTFfSURfVVMxOworCQlBVDkxX0NmZ1BJT19VU0FSVDEoKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlhdDkxX3BvcnRzW2lkeF0ubWVtYmFzZSA9ICh2b2lkIF9faW9tZW0gKikgQVQ5MV9WQV9CQVNFX1VTMjsKKwkJYXQ5MV9wb3J0c1tpZHhdLm1hcGJhc2UgPSBBVDkxX1ZBX0JBU0VfVVMyOworCQlhdDkxX3BvcnRzW2lkeF0uaXJxICAgICA9IEFUOTFfSURfVVMyOworCQlBVDkxX0NmZ1BJT19VU0FSVDIoKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlhdDkxX3BvcnRzW2lkeF0ubWVtYmFzZSA9ICh2b2lkIF9faW9tZW0gKikgQVQ5MV9WQV9CQVNFX1VTMzsKKwkJYXQ5MV9wb3J0c1tpZHhdLm1hcGJhc2UgPSBBVDkxX1ZBX0JBU0VfVVMzOworCQlhdDkxX3BvcnRzW2lkeF0uaXJxICAgICA9IEFUOTFfSURfVVMzOworCQlBVDkxX0NmZ1BJT19VU0FSVDMoKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlhdDkxX3BvcnRzW2lkeF0ubWVtYmFzZSA9ICh2b2lkIF9faW9tZW0gKikgQVQ5MV9WQV9CQVNFX0RCR1U7CisJCWF0OTFfcG9ydHNbaWR4XS5tYXBiYXNlID0gQVQ5MV9WQV9CQVNFX0RCR1U7CisJCWF0OTFfcG9ydHNbaWR4XS5pcnEgICAgID0gQVQ5MV9JRF9TWVM7CisJCUFUOTFfQ2ZnUElPX0RCR1UoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICAiJXMgOiBiYWQgcG9ydCBudW1iZXIgJWRcbiIsIF9fRlVOQ1RJT05fXywgcG9ydCk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1NFUklBTF9BVDkxX0NPTlNPTEUKKworLyoKKyAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudGVyaW5nCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsIHVfaW50IGNvdW50KQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBhdDkxX3BvcnRzICsgY28tPmluZGV4OworCXVuc2lnbmVkIGludCBzdGF0dXMsIGksIGltcjsKKworCS8qCisJICoJRmlyc3QsIHNhdmUgSU1SIGFuZCB0aGVuIGRpc2FibGUgaW50ZXJydXB0cworCSAqLworCWltciA9IFVBUlRfR0VUX0lNUihwb3J0KTsJLyogZ2V0IGludGVycnVwdCBtYXNrICovCisJVUFSVF9QVVRfSURSKHBvcnQsIEFUOTFfVVNfUlhSRFkgfCBBVDkxX1VTX1RYUkRZKTsKKworCS8qCisJICoJTm93LCBkbyBlYWNoIGNoYXJhY3RlcgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWRvIHsKKwkJCXN0YXR1cyA9IFVBUlRfR0VUX0NTUihwb3J0KTsKKwkJfSB3aGlsZSAoIShzdGF0dXMgJiBBVDkxX1VTX1RYUkRZKSk7CisJCVVBUlRfUFVUX0NIQVIocG9ydCwgc1tpXSk7CisJCWlmIChzW2ldID09ICdcbicpIHsKKwkJCWRvIHsKKwkJCQlzdGF0dXMgPSBVQVJUX0dFVF9DU1IocG9ydCk7CisJCQl9IHdoaWxlICghKHN0YXR1cyAmIEFUOTFfVVNfVFhSRFkpKTsKKwkJCVVBUlRfUFVUX0NIQVIocG9ydCwgJ1xyJyk7CisJCX0KKwl9CisKKwkvKgorCSAqCUZpbmFsbHksIHdhaXQgZm9yIHRyYW5zbWl0dGVyIHRvIGJlY29tZSBlbXB0eQorCSAqCWFuZCByZXN0b3JlIElNUgorCSAqLworCWRvIHsKKwkJc3RhdHVzID0gVUFSVF9HRVRfQ1NSKHBvcnQpOworCX0gd2hpbGUgKCEoc3RhdHVzICYgQVQ5MV9VU19UWFJEWSkpOworCVVBUlRfUFVUX0lFUihwb3J0LCBpbXIpOwkvKiBzZXQgaW50ZXJydXB0cyBiYWNrIHRoZSB3YXkgdGhleSB3ZXJlICovCit9CisKKy8qCisgKiBJZiB0aGUgcG9ydCB3YXMgYWxyZWFkeSBpbml0aWFsaXNlZCAoZWcsIGJ5IGEgYm9vdCBsb2FkZXIpLCB0cnkgdG8gZGV0ZXJtaW5lCisgKiB0aGUgY3VycmVudCBzZXR1cC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGF0OTFfY29uc29sZV9nZXRfb3B0aW9ucyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgKmJhdWQsIGludCAqcGFyaXR5LCBpbnQgKmJpdHMpCit7CisJdW5zaWduZWQgaW50IG1yLCBxdW90OworCisvLyBUT0RPOiBDUiBpcyBhIHdyaXRlLW9ubHkgcmVnaXN0ZXIKKy8vCXVuc2lnbmVkIGludCBjcjsKKy8vCisvLwljciA9IFVBUlRfR0VUX0NSKHBvcnQpICYgKEFUOTFfVVNfUlhFTiB8IEFUOTFfVVNfVFhFTik7CisvLwlpZiAoY3IgPT0gKEFUOTFfVVNfUlhFTiB8IEFUOTFfVVNfVFhFTikpIHsKKy8vCQkvKiBvaywgdGhlIHBvcnQgd2FzIGVuYWJsZWQgKi8KKy8vCX0KKworCW1yID0gVUFSVF9HRVRfTVIocG9ydCkgJiBBVDkxX1VTX0NIUkw7CisJaWYgKG1yID09IEFUOTFfVVNfQ0hSTF84KQorCQkqYml0cyA9IDg7CisJZWxzZQorCQkqYml0cyA9IDc7CisKKwltciA9IFVBUlRfR0VUX01SKHBvcnQpICYgQVQ5MV9VU19QQVI7CisJaWYgKG1yID09IEFUOTFfVVNfUEFSX0VWRU4pCisJCSpwYXJpdHkgPSAnZSc7CisJZWxzZSBpZiAobXIgPT0gQVQ5MV9VU19QQVJfT0REKQorCQkqcGFyaXR5ID0gJ28nOworCisJcXVvdCA9IFVBUlRfR0VUX0JSR1IocG9ydCk7CisJKmJhdWQgPSBwb3J0LT51YXJ0Y2xrIC8gKDE2ICogKHF1b3QpKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXQ5MV9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OworCWludCBiYXVkID0gMTE1MjAwOworCWludCBiaXRzID0gODsKKwlpbnQgcGFyaXR5ID0gJ24nOworCWludCBmbG93ID0gJ24nOworCisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIGFuIGludmFsaWQgdWFydCBudW1iZXIgaGFzIGJlZW4gc3BlY2lmaWVkLCBhbmQKKwkgKiBpZiBzbywgc2VhcmNoIGZvciB0aGUgZmlyc3QgYXZhaWxhYmxlIHBvcnQgdGhhdCBkb2VzIGhhdmUKKwkgKiBjb25zb2xlIHN1cHBvcnQuCisJICovCisJcG9ydCA9IHVhcnRfZ2V0X2NvbnNvbGUoYXQ5MV9wb3J0cywgQVQ5MV9OUl9VQVJULCBjbyk7CisKKwkvKgorCSAqIEVuYWJsZSB0aGUgc2VyaWFsIGNvbnNvbGUsIGluLWNhc2UgYm9vdGxvYWRlciBkaWQgbm90IGRvIGl0LgorCSAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUE1DX1BDRVIsIDEgPDwgcG9ydC0+aXJxKTsJLyogZW5hYmxlIGNsb2NrICovCisJVUFSVF9QVVRfSURSKHBvcnQsIC0xKTsJCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJVUFSVF9QVVRfQ1IocG9ydCwgQVQ5MV9VU19SU1RTVEEgfCBBVDkxX1VTX1JTVFJYKTsKKwlVQVJUX1BVVF9DUihwb3J0LCBBVDkxX1VTX1RYRU4gfCBBVDkxX1VTX1JYRU4pOworCisJaWYgKG9wdGlvbnMpCisJCXVhcnRfcGFyc2Vfb3B0aW9ucyhvcHRpb25zLCAmYmF1ZCwgJnBhcml0eSwgJmJpdHMsICZmbG93KTsKKwllbHNlCisJCWF0OTFfY29uc29sZV9nZXRfb3B0aW9ucyhwb3J0LCAmYmF1ZCwgJnBhcml0eSwgJmJpdHMpOworCisJcmV0dXJuIHVhcnRfc2V0X29wdGlvbnMocG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgYXQ5MV91YXJ0OworCitzdGF0aWMgc3RydWN0IGNvbnNvbGUgYXQ5MV9jb25zb2xlID0geworCS5uYW1lCQk9IEFUOTFfREVWSUNFTkFNRSwKKwkud3JpdGUJCT0gYXQ5MV9jb25zb2xlX3dyaXRlLAorCS5kZXZpY2UJCT0gdWFydF9jb25zb2xlX2RldmljZSwKKwkuc2V0dXAJCT0gYXQ5MV9jb25zb2xlX3NldHVwLAorCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4CQk9IC0xLAorCS5kYXRhCQk9ICZhdDkxX3VhcnQsCit9OworCisjZGVmaW5lIEFUOTFfQ09OU09MRV9ERVZJQ0UJJmF0OTFfY29uc29sZQorCitzdGF0aWMgaW50ICBfX2luaXQgYXQ5MV9jb25zb2xlX2luaXQodm9pZCkKK3sKKwlhdDkxX2luaXRfcG9ydHMoKTsKKworCWF0OTFfY29uc29sZS5pbmRleCA9IGF0OTFfY29uc29sZV9wb3J0OworCXJlZ2lzdGVyX2NvbnNvbGUoJmF0OTFfY29uc29sZSk7CisJcmV0dXJuIDA7Cit9Citjb25zb2xlX2luaXRjYWxsKGF0OTFfY29uc29sZV9pbml0KTsKKworI2Vsc2UKKyNkZWZpbmUgQVQ5MV9DT05TT0xFX0RFVklDRQlOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBhdDkxX3VhcnQgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJCT0gQVQ5MV9ERVZJQ0VOQU1FLAorCS5kZXZfbmFtZQkJPSBBVDkxX0RFVklDRU5BTUUsCisJLmRldmZzX25hbWUJCT0gQVQ5MV9ERVZJQ0VOQU1FLAorCS5tYWpvcgkJCT0gU0VSSUFMX0FUOTFfTUFKT1IsCisJLm1pbm9yCQkJPSBNSU5PUl9TVEFSVCwKKwkubnIJCQk9IEFUOTFfTlJfVUFSVCwKKwkuY29ucwkJCT0gQVQ5MV9DT05TT0xFX0RFVklDRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF0OTFfc2VyaWFsX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0LCBpOworCisJYXQ5MV9pbml0X3BvcnRzKCk7CisKKwlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmYXQ5MV91YXJ0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IEFUOTFfTlJfVUFSVDsgaSsrKSB7CisJCWlmIChhdDkxX3NlcmlhbF9tYXBbaV0gPj0gMCkKKwkJCXVhcnRfYWRkX29uZV9wb3J0KCZhdDkxX3VhcnQsICZhdDkxX3BvcnRzW2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF0OTFfc2VyaWFsX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBVDkxX05SX1VBUlQ7IGkrKykgeworIAkJaWYgKGF0OTFfc2VyaWFsX21hcFtpXSA+PSAwKQorCQkJdWFydF9yZW1vdmVfb25lX3BvcnQoJmF0OTFfdWFydCwgJmF0OTFfcG9ydHNbaV0pOworICAJfQorCisJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmYXQ5MV91YXJ0KTsKK30KKworbW9kdWxlX2luaXQoYXQ5MV9zZXJpYWxfaW5pdCk7Cittb2R1bGVfZXhpdChhdDkxX3NlcmlhbF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmljayBCcm9uc29uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFUOTEgZ2VuZXJpYyBzZXJpYWwgcG9ydCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYyBiL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYwppbmRleCAwOGM0MmMwLi5iZTEyNjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jCkBAIC00NDIsNiArNDQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMTMxNSwxMSArMTMxNiw3IEBACiAgKiBtZW1vcnkgaWYgbGFyZ2UgbnVtYmVycyBvZiBzZXJpYWwgcG9ydHMgYXJlIG9wZW4uCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmOwotI2lmZGVmIERFQ0xBUkVfTVVURVgKLXN0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKLSNlbHNlCi1zdGF0aWMgc3RydWN0IHNlbWFwaG9yZSB0bXBfYnVmX3NlbSA9IE1VVEVYOwotI2VuZGlmCitzdGF0aWMgREVGSU5FX01VVEVYKHRtcF9idWZfbXV0ZXgpOwogCiAvKiBDYWxjdWxhdGUgdGhlIGNoYXJ0aW1lIGRlcGVuZGluZyBvbiBiYXVkcmF0ZSwgbnVtYm9yIG9mIGJpdHMgZXRjLiAqLwogc3RhdGljIHZvaWQgdXBkYXRlX2NoYXJfdGltZShzdHJ1Y3QgZTEwMF9zZXJpYWwgKiBpbmZvKQpAQCAtMzY2MSw3ICszNjU4LDcgQEAKIAkgKiBkZXNpZ24uCiAJICovCiAJaWYgKGZyb21fdXNlcikgewotCQlkb3duKCZ0bXBfYnVmX3NlbSk7CisJCW11dGV4X2xvY2soJnRtcF9idWZfbXV0ZXgpOwogCQl3aGlsZSAoMSkgewogCQkJaW50IGMxOwogCQkJYyA9IENJUkNfU1BBQ0VfVE9fRU5EKGluZm8tPnhtaXQuaGVhZCwKQEAgLTM2OTIsNyArMzY4OSw3IEBACiAJCQljb3VudCAtPSBjOwogCQkJcmV0ICs9IGM7CiAJCX0KLQkJdXAoJnRtcF9idWZfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZ0bXBfYnVmX211dGV4KTsKIAl9IGVsc2UgewogCQljbGkoKTsKIAkJd2hpbGUgKGNvdW50KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmMKaW5kZXggZjMzMGQ2Yy4uNWY1Mjg4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvcG1hY196aWxvZy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYwpAQCAtNjAsNiArNjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC05Niw3ICs5Nyw3IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgdWFydF9wbWFjX3BvcnQJcG16X3BvcnRzW01BWF9aU19QT1JUU107CiBzdGF0aWMgaW50CQkJcG16X3BvcnRzX2NvdW50Owotc3RhdGljIERFQ0xBUkVfTVVURVgocG16X2lycV9zZW0pOworc3RhdGljIERFRklORV9NVVRFWChwbXpfaXJxX211dGV4KTsKIAogc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBwbXpfdWFydF9yZWcgPSB7CiAJLm93bmVyCQk9CVRISVNfTU9EVUxFLApAQCAtOTIyLDcgKzkyMyw3IEBACiAJaWYgKHVhcC0+bm9kZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWRvd24oJnBtel9pcnFfc2VtKTsKKwltdXRleF9sb2NrKCZwbXpfaXJxX211dGV4KTsKIAogCXVhcC0+ZmxhZ3MgfD0gUE1BQ1pJTE9HX0ZMQUdfSVNfT1BFTjsKIApAQCAtOTQwLDExICs5NDEsMTEgQEAKIAkJZGV2X2VycigmdWFwLT5kZXYtPm9mZGV2LmRldiwKIAkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgenMgaW50ZXJydXB0IGhhbmRsZXIuXG4iKTsKIAkJcG16X3NldF9zY2NfcG93ZXIodWFwLCAwKTsKLQkJdXAoJnBtel9pcnFfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZwbXpfaXJxX211dGV4KTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQl1cCgmcG16X2lycV9zZW0pOworCW11dGV4X3VubG9jaygmcG16X2lycV9tdXRleCk7CiAKIAkvKiBSaWdodCBub3csIHdlIGRlYWwgd2l0aCBkZWxheSBieSBibG9ja2luZyBoZXJlLCBJJ2xsIGJlCiAJICogc21hcnRlciBsYXRlciBvbgpAQCAtOTgxLDcgKzk4Miw3IEBACiAJaWYgKHVhcC0+bm9kZSA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlkb3duKCZwbXpfaXJxX3NlbSk7CisJbXV0ZXhfbG9jaygmcG16X2lycV9tdXRleCk7CiAKIAkvKiBSZWxlYXNlIGludGVycnVwdCBoYW5kbGVyICovCiAgICAgICAgCWZyZWVfaXJxKHVhcC0+cG9ydC5pcnEsIHVhcCk7CkBAIC0xMDAyLDcgKzEwMDMsNyBAQAogCiAJaWYgKFpTX0lTX0NPTlModWFwKSB8fCBaU19JU19BU0xFRVAodWFwKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCXVwKCZwbXpfaXJxX3NlbSk7CisJCW11dGV4X3VubG9jaygmcG16X2lycV9tdXRleCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEwMTksNyArMTAyMCw3IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAKLQl1cCgmcG16X2lycV9zZW0pOworCW11dGV4X3VubG9jaygmcG16X2lycV9tdXRleCk7CiAKIAlwbXpfZGVidWcoInBtejogc2h1dGRvd24oKSBkb25lLlxuIik7CiB9CkBAIC0xNTkxLDcgKzE1OTIsNyBAQAogCiAJc3RhdGUgPSBwbXpfdWFydF9yZWcuc3RhdGUgKyB1YXAtPnBvcnQubGluZTsKIAotCWRvd24oJnBtel9pcnFfc2VtKTsKKwltdXRleF9sb2NrKCZwbXpfaXJxX211dGV4KTsKIAlkb3duKCZzdGF0ZS0+c2VtKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1YXAtPnBvcnQubG9jaywgZmxhZ3MpOwpAQCAtMTYyNCw3ICsxNjI1LDcgQEAKIAlwbXpfc2V0X3NjY19wb3dlcih1YXAsIDApOwogCiAJdXAoJnN0YXRlLT5zZW0pOwotCXVwKCZwbXpfaXJxX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwbXpfaXJxX211dGV4KTsKIAogCXBtel9kZWJ1Zygic3VzcGVuZCwgc3dpdGNoaW5nIGNvbXBsZXRlXG4iKTsKIApAQCAtMTY1MSw3ICsxNjUyLDcgQEAKIAogCXN0YXRlID0gcG16X3VhcnRfcmVnLnN0YXRlICsgdWFwLT5wb3J0LmxpbmU7CiAKLQlkb3duKCZwbXpfaXJxX3NlbSk7CisJbXV0ZXhfbG9jaygmcG16X2lycV9tdXRleCk7CiAJZG93bigmc3RhdGUtPnNlbSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdWFwLT5wb3J0LmxvY2ssIGZsYWdzKTsKQEAgLTE2ODUsNyArMTY4Niw3IEBACiAKICBiYWlsOgogCXVwKCZzdGF0ZS0+c2VtKTsKLQl1cCgmcG16X2lycV9zZW0pOworCW11dGV4X3VubG9jaygmcG16X2lycV9tdXRleCk7CiAKIAkvKiBSaWdodCBub3csIHdlIGRlYWwgd2l0aCBkZWxheSBieSBibG9ja2luZyBoZXJlLCBJJ2xsIGJlCiAJICogc21hcnRlciBsYXRlciBvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKaW5kZXggOTU4OTUwOS4uMmNhNjIwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+IC8qIGZvciBzZXJpYWxfc3RhdGUgYW5kIHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQ3LDcgKzQ4LDcgQEAKIC8qCiAgKiBUaGlzIGlzIHVzZWQgdG8gbG9jayBjaGFuZ2VzIGluIHNlcmlhbCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLXN0YXRpYyBERUNMQVJFX01VVEVYKHBvcnRfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgocG9ydF9tdXRleCk7CiAKICNkZWZpbmUgSElHSF9CSVRTX09GRlNFVAkoKHNpemVvZihsb25nKS1zaXplb2YoaW50KSkqOCkKIApAQCAtMTQ3Miw3ICsxNDczLDcgQEAKIHsKIAlzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGU7CiAKLQlkb3duKCZwb3J0X3NlbSk7CisJbXV0ZXhfbG9jaygmcG9ydF9tdXRleCk7CiAJc3RhdGUgPSBkcnYtPnN0YXRlICsgbGluZTsKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+c2VtKSkgewogCQlzdGF0ZSA9IEVSUl9QVFIoLUVSRVNUQVJUU1lTKTsKQEAgLTE1MDksNyArMTUxMCw3IEBACiAJfQogCiAgb3V0OgotCXVwKCZwb3J0X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwb3J0X211dGV4KTsKIAlyZXR1cm4gc3RhdGU7CiB9CiAKQEAgLTIyMTksNyArMjIyMCw3IEBACiAKIAlzdGF0ZSA9IGRydi0+c3RhdGUgKyBwb3J0LT5saW5lOwogCi0JZG93bigmcG9ydF9zZW0pOworCW11dGV4X2xvY2soJnBvcnRfbXV0ZXgpOwogCWlmIChzdGF0ZS0+cG9ydCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTIyNTUsNyArMjI1Niw3IEBACiAJCXJlZ2lzdGVyX2NvbnNvbGUocG9ydC0+Y29ucyk7CiAKICBvdXQ6Ci0JdXAoJnBvcnRfc2VtKTsKKwltdXRleF91bmxvY2soJnBvcnRfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTIyNzksNyArMjI4MCw3IEBACiAJCXByaW50ayhLRVJOX0FMRVJUICJSZW1vdmluZyB3cm9uZyBwb3J0OiAlcCAhPSAlcFxuIiwKIAkJCXN0YXRlLT5wb3J0LCBwb3J0KTsKIAotCWRvd24oJnBvcnRfc2VtKTsKKwltdXRleF9sb2NrKCZwb3J0X211dGV4KTsKIAogCS8qCiAJICogUmVtb3ZlIHRoZSBkZXZpY2VzIGZyb20gZGV2ZnMKQEAgLTIyODgsNyArMjI4OSw3IEBACiAKIAl1YXJ0X3VuY29uZmlndXJlX3BvcnQoZHJ2LCBzdGF0ZSk7CiAJc3RhdGUtPnBvcnQgPSBOVUxMOwotCXVwKCZwb3J0X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwb3J0X211dGV4KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY3MuYwppbmRleCA5Njk2OWNiLi5jMzAzMzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY3MuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY3MuYwpAQCAtNzg1LDYgKzc4NSw4IEBACiAJUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgxLCAweDAxMDEsIDB4MDAzNSwgIjNDWEVNNTU2LmNpcyIpLAogCVBDTUNJQV9NRkNfREVWSUNFX0NJU19NQU5GX0NBUkQoMSwgMHgwMTAxLCAweDAwM2QsICIzQ1hFTTU1Ni5jaXMiKSwKIAlQQ01DSUFfREVWSUNFX0NJU19NQU5GX0NBUkQoMHgwMTkyLCAweDA3MTAsICJTV183eHhfU0VSLmNpcyIpLAkvKiBTaWVycmEgV2lyZWxlc3MgQUM3MTAvQUM3NTAgR1BSUyBOZXR3b3JrIEFkYXB0ZXIgUjEgKi8KKwlQQ01DSUFfREVWSUNFX0NJU19NQU5GX0NBUkQoMHgwMTkyLCAweGE1NTUsICJTV181NTVfU0VSLmNpcyIpLCAgLyogU2llcnJhIEFpcmNhcmQgNTU1IENETUEgMXhydHQgTW9kZW0gLS0gcHJlIHVwZGF0ZSAqLworCVBDTUNJQV9ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgweDAxM2YsIDB4YTU1NSwgIlNXXzU1NV9TRVIuY2lzIiksICAvKiBTaWVycmEgQWlyY2FyZCA1NTUgQ0RNQSAxeHJ0dCBNb2RlbSAtLSBwb3N0IHVwZGF0ZSAqLwogCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQxMigiTXVsdGlUZWNoIiwgIlBDTUNJQSA1NksgRGF0YUZheCIsIDB4ODQyMDQ3ZWUsIDB4YzJlZmNmMDMsICJNVDU2MzRaTFguY2lzIiksCiAJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyKCJBRFZBTlRFQ0giLCAiQ09NcGFkLTMyLzg1Qi00IiwgMHg5NjkxM2E4NSwgMHhjZWM4ZjEwMiwgIkNPTXBhZDQuY2lzIiksCiAJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyMygiQURWQU5URUNIIiwgIkNPTXBhZC0zMi84NSIsICIxLjAiLCAweDk2OTEzYTg1LCAweDhmYmU5MmFlLCAweDA4NzdiNjI3LCAiQ09NcGFkMi5jaXMiKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF90eHg5LmMgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jCmluZGV4IGZkZDFmMTkuLmVlOThhODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF90eHg5LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX3R4eDkuYwpAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMTAxOCw3ICsxMDE5LDcgQEAKIAl1YXJ0X3Jlc3VtZV9wb3J0KCZzZXJpYWxfdHh4OV9yZWcsICZzZXJpYWxfdHh4OV9wb3J0c1tsaW5lXS5wb3J0KTsKIH0KIAotc3RhdGljIERFQ0xBUkVfTVVURVgoc2VyaWFsX3R4eDlfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoc2VyaWFsX3R4eDlfbXV0ZXgpOwogCiAvKioKICAqCXNlcmlhbF90eHg5X3JlZ2lzdGVyX3BvcnQgLSByZWdpc3RlciBhIHNlcmlhbCBwb3J0CkBAIC0xMDM3LDcgKzEwMzgsNyBAQAogCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdWFydDsKIAlpbnQgcmV0ID0gLUVOT1NQQzsKIAotCWRvd24oJnNlcmlhbF90eHg5X3NlbSk7CisJbXV0ZXhfbG9jaygmc2VyaWFsX3R4eDlfbXV0ZXgpOwogCWZvciAoaSA9IDA7IGkgPCBVQVJUX05SOyBpKyspIHsKIAkJdWFydCA9ICZzZXJpYWxfdHh4OV9wb3J0c1tpXTsKIAkJaWYgKHVhcnQtPnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04pCkBAIC0xMDU4LDcgKzEwNTksNyBAQAogCQlpZiAocmV0ID09IDApCiAJCQlyZXQgPSB1YXJ0LT5wb3J0LmxpbmU7CiAJfQotCXVwKCZzZXJpYWxfdHh4OV9zZW0pOworCW11dGV4X3VubG9jaygmc2VyaWFsX3R4eDlfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwNzMsNyArMTA3NCw3IEBACiB7CiAJc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1YXJ0ID0gJnNlcmlhbF90eHg5X3BvcnRzW2xpbmVdOwogCi0JZG93bigmc2VyaWFsX3R4eDlfc2VtKTsKKwltdXRleF9sb2NrKCZzZXJpYWxfdHh4OV9tdXRleCk7CiAJdWFydF9yZW1vdmVfb25lX3BvcnQoJnNlcmlhbF90eHg5X3JlZywgJnVhcnQtPnBvcnQpOwogCXVhcnQtPnBvcnQuZmxhZ3MgPSAwOwogCXVhcnQtPnBvcnQudHlwZSA9IFBPUlRfVU5LTk9XTjsKQEAgLTEwODIsNyArMTA4Myw3IEBACiAJdWFydC0+cG9ydC5tZW1iYXNlID0gMDsKIAl1YXJ0LT5wb3J0LmRldiA9IE5VTEw7CiAJdWFydF9hZGRfb25lX3BvcnQoJnNlcmlhbF90eHg5X3JlZywgJnVhcnQtPnBvcnQpOwotCXVwKCZzZXJpYWxfdHh4OV9zZW0pOworCW11dGV4X3VubG9jaygmc2VyaWFsX3R4eDlfbXV0ZXgpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zaC9zdXBlcmh5d2F5L3N1cGVyaHl3YXkuYyBiL2RyaXZlcnMvc2gvc3VwZXJoeXdheS9zdXBlcmh5d2F5LmMKaW5kZXggN2JkYWIyYS4uOTRiMjI5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9zdXBlcmh5d2F5L3N1cGVyaHl3YXkuYworKysgYi9kcml2ZXJzL3NoL3N1cGVyaHl3YXkvc3VwZXJoeXdheS5jCkBAIC0xNzUsOCArMTc1LDYgQEAKIHsKIAlkcnYtPmRydi5uYW1lCT0gZHJ2LT5uYW1lOwogCWRydi0+ZHJ2LmJ1cwk9ICZzdXBlcmh5d2F5X2J1c190eXBlOwotCWRydi0+ZHJ2LnByb2JlCT0gc3VwZXJoeXdheV9kZXZpY2VfcHJvYmU7Ci0JZHJ2LT5kcnYucmVtb3ZlCT0gc3VwZXJoeXdheV9kZXZpY2VfcmVtb3ZlOwogCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcnYpOwogfQpAQCAtMjEzLDYgKzIxMSw4IEBACiAjaWZkZWYgQ09ORklHX1NZU0ZTCiAJLmRldl9hdHRycwk9IHN1cGVyaHl3YXlfZGV2X2F0dHJzLAogI2VuZGlmCisJLnByb2JlCQk9IHN1cGVyaHl3YXlfZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUJCT0gc3VwZXJoeXdheV9kZXZpY2VfcmVtb3ZlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc3VwZXJoeXdheV9idXNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvS2NvbmZpZyBiL2RyaXZlcnMvc3BpL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3ZGJkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL0tjb25maWcKQEAgLTAsMCArMSwxMDkgQEAKKyMKKyMgU1BJIGRyaXZlciBjb25maWd1cmF0aW9uCisjCisjIE5PVEU6ICB0aGUgcmVhc29uIHRoaXMgZG9lc24ndCBzaG93IFNQSSBzbGF2ZSBzdXBwb3J0IGlzIG1vc3RseSB0aGF0CisjIG5vYm9keSdzIG5lZWRlZCBhIHNsYXZlIHNpZGUgQVBJIHlldC4gIFRoZSBtYXN0ZXItcm9sZSBBUEkgaXMgbm90CisjIGZ1bGx5IGFwcHJvcHJpYXRlIHRoZXJlLCBzbyBpdCdkIG5lZWQgc29tZSB0aG91Z2h0IHRvIGRvIHdlbGwuCisjCittZW51ICJTUEkgc3VwcG9ydCIKKworY29uZmlnIFNQSQorCWJvb2wgIlNQSSBzdXBwb3J0IgorCWhlbHAKKwkgIFRoZSAiU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIiBpcyBhIGxvdyBsZXZlbCBzeW5jaHJvbm91cworCSAgcHJvdG9jb2wuICBDaGlwcyB0aGF0IHN1cHBvcnQgU1BJIGNhbiBoYXZlIGRhdGEgdHJhbnNmZXIgcmF0ZXMKKwkgIHVwIHRvIHNldmVyYWwgdGVucyBvZiBNYml0L3NlYy4gIENoaXBzIGFyZSBhZGRyZXNzZWQgd2l0aCBhCisJICBjb250cm9sbGVyIGFuZCBhIGNoaXBzZWxlY3QuICBNb3N0IFNQSSBzbGF2ZXMgZG9uJ3Qgc3VwcG9ydAorCSAgZHluYW1pYyBkZXZpY2UgZGlzY292ZXJ5OyBzb21lIGFyZSBldmVuIHdyaXRlLW9ubHkgb3IgcmVhZC1vbmx5LgorCisJICBTUEkgaXMgd2lkZWx5IHVzZWQgYnkgbWljcm9jb250b2xsZXJzIHRvIHRhbGsgd2l0aCBzZW5zb3JzLAorCSAgZWVwcm9tIGFuZCBmbGFzaCBtZW1vcnksIGNvZGVjcyBhbmQgdmFyaW91cyBvdGhlciBjb250cm9sbGVyCisJICBjaGlwcywgYW5hbG9nIHRvIGRpZ2l0YWwgKGFuZCBkLXRvLWEpIGNvbnZlcnRlcnMsIGFuZCBtb3JlLgorCSAgTU1DIGFuZCBTRCBjYXJkcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgU1BJIHByb3RvY29sOyBhbmQgZm9yCisJICBEYXRhRmxhc2ggY2FyZHMgdXNlZCBpbiBNTUMgc29ja2V0cywgU1BJIG11c3QgYWx3YXlzIGJlIHVzZWQuCisKKwkgIFNQSSBpcyBvbmUgb2YgYSBmYW1pbHkgb2Ygc2ltaWxhciBwcm90b2NvbHMgdXNpbmcgYSBmb3VyIHdpcmUKKwkgIGludGVyZmFjZSAoc2VsZWN0LCBjbG9jaywgZGF0YSBpbiwgZGF0YSBvdXQpIGluY2x1ZGluZyBNaWNyb3dpcmUKKwkgIChoYWxmIGR1cGxleCksIFNTUCwgU1NJLCBhbmQgUFNQLiAgVGhpcyBkcml2ZXIgZnJhbWV3b3JrIHNob3VsZAorCSAgd29yayB3aXRoIG1vc3Qgc3VjaCBkZXZpY2VzIGFuZCBjb250cm9sbGVycy4KKworY29uZmlnIFNQSV9ERUJVRworCWJvb2xlYW4gIkRlYnVnIHN1cHBvcnQgZm9yIFNQSSBkcml2ZXJzIgorCWRlcGVuZHMgb24gU1BJICYmIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIFNheSAieWVzIiB0byBlbmFibGUgZGVidWcgbWVzc2FnaW5nIChsaWtlIGRldl9kYmcgYW5kIHByX2RlYnVnKSwKKwkgIHN5c2ZzLCBhbmQgZGVidWdmcyBzdXBwb3J0IGluIFNQSSBjb250cm9sbGVyIGFuZCBwcm90b2NvbCBkcml2ZXJzLgorCisjCisjIE1BU1RFUiBzaWRlIC4uLiB0YWxraW5nIHRvIGRpc2NyZXRlIFNQSSBzbGF2ZSBjaGlwcyBpbmNsdWRpbmcgbWljcm9jb250cm9sbGVycworIworCitjb25maWcgU1BJX01BU1RFUgorIwlib29sZWFuICJTUEkgTWFzdGVyIFN1cHBvcnQiCisJYm9vbGVhbgorCWRlZmF1bHQgU1BJCisJaGVscAorCSAgSWYgeW91ciBzeXN0ZW0gaGFzIGFuIG1hc3Rlci1jYXBhYmxlIFNQSSBjb250cm9sbGVyICh3aGljaAorCSAgcHJvdmlkZXMgdGhlIGNsb2NrIGFuZCBjaGlwc2VsZWN0KSwgeW91IGNhbiBlbmFibGUgdGhhdAorCSAgY29udHJvbGxlciBhbmQgdGhlIHByb3RvY29sIGRyaXZlcnMgZm9yIHRoZSBTUEkgc2xhdmUgY2hpcHMKKwkgIHRoYXQgYXJlIGNvbm5lY3RlZC4KKworY29tbWVudCAiU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSCisKK2NvbmZpZyBTUElfQklUQkFORworCXRyaXN0YXRlICJCaXRiYW5naW5nIFNQSSBtYXN0ZXIiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFdpdGggYSBmZXcgR1BJTyBwaW5zLCB5b3VyIHN5c3RlbSBjYW4gYml0YmFuZyB0aGUgU1BJIHByb3RvY29sLgorCSAgU2VsZWN0IHRoaXMgdG8gZ2V0IFNQSSBzdXBwb3J0IHRocm91Z2ggSS9PIHBpbnMgKEdQSU8sIHBhcmFsbGVsCisJICBwb3J0LCBldGMpLiAgT3IsIHNvbWUgc3lzdGVtcycgU1BJIG1hc3RlciBjb250cm9sbGVyIGRyaXZlcnMgdXNlCisJICB0aGlzIGNvZGUgdG8gbWFuYWdlIHRoZSBwZXItd29yZCBvciBwZXItdHJhbnNmZXIgYWNjZXNzZXMgdG8gdGhlCisJICBoYXJkd2FyZSBzaGlmdCByZWdpc3RlcnMuCisKKwkgIFRoaXMgaXMgbGlicmFyeSBjb2RlLCBhbmQgaXMgYXV0b21hdGljYWxseSBzZWxlY3RlZCBieSBkcml2ZXJzIHRoYXQKKwkgIG5lZWQgaXQuICBZb3Ugb25seSBuZWVkIHRvIHNlbGVjdCB0aGlzIGV4cGxpY2l0bHkgdG8gc3VwcG9ydCBkcml2ZXIKKwkgIG1vZHVsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGlzIGtlcm5lbCB0cmVlLgorCitjb25maWcgU1BJX0JVVFRFUkZMWQorCXRyaXN0YXRlICJQYXJhbGxlbCBwb3J0IGFkYXB0ZXIgZm9yIEFWUiBCdXR0ZXJmbHkgKERFVkVMT1BNRU5UKSIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgUEFSUE9SVCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgU1BJX0JJVEJBTkcKKwloZWxwCisJICBUaGlzIHVzZXMgYSBjdXN0b20gcGFyYWxsZWwgcG9ydCBjYWJsZSB0byBjb25uZWN0IHRvIGFuIEFWUgorCSAgQnV0dGVyZmx5IDxodHRwOi8vd3d3LmF0bWVsLmNvbS9wcm9kdWN0cy9hdnIvYnV0dGVyZmx5PiwgYW4KKwkgIGluZXhwZW5zaXZlIGJhdHRlcnkgcG93ZXJlZCBtaWNyb2NvbnRyb2xsZXIgZXZhbHVhdGlvbiBib2FyZC4KKwkgIFRoaXMgc2FtZSBjYWJsZSBjYW4gYmUgdXNlZCB0byBmbGFzaCBuZXcgZmlybXdhcmUuCisKK2NvbmZpZyBTUElfQlVUVEVSRkxZCisJdHJpc3RhdGUgIlBhcmFsbGVsIHBvcnQgYWRhcHRlciBmb3IgQVZSIEJ1dHRlcmZseSAoREVWRUxPUE1FTlQpIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBQQVJQT1JUICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTUElfQklUQkFORworCWhlbHAKKwkgIFRoaXMgdXNlcyBhIGN1c3RvbSBwYXJhbGxlbCBwb3J0IGNhYmxlIHRvIGNvbm5lY3QgdG8gYW4gQVZSCisJICBCdXR0ZXJmbHkgPGh0dHA6Ly93d3cuYXRtZWwuY29tL3Byb2R1Y3RzL2F2ci9idXR0ZXJmbHk+LCBhbgorCSAgaW5leHBlbnNpdmUgYmF0dGVyeSBwb3dlcmVkIG1pY3JvY29udHJvbGxlciBldmFsdWF0aW9uIGJvYXJkLgorCSAgVGhpcyBzYW1lIGNhYmxlIGNhbiBiZSB1c2VkIHRvIGZsYXNoIG5ldyBmaXJtd2FyZS4KKworIworIyBBZGQgbmV3IFNQSSBtYXN0ZXIgY29udHJvbGxlcnMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGFib3ZlIHRoaXMgbGluZQorIworCisKKyMKKyMgVGhlcmUgYXJlIGxvdHMgb2YgU1BJIGRldmljZSB0eXBlcywgd2l0aCBzZW5zb3JzIGFuZCBtZW1vcnkKKyMgYmVpbmcgcHJvYmFibHkgdGhlIG1vc3Qgd2lkZWx5IHVzZWQgb25lcy4KKyMKK2NvbW1lbnQgIlNQSSBQcm90b2NvbCBNYXN0ZXJzIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgorCisKKyMKKyMgQWRkIG5ldyBTUEkgcHJvdG9jb2wgbWFzdGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIgYWJvdmUgdGhpcyBsaW5lCisjCisKKworIyAoc2xhdmUgc3VwcG9ydCB3b3VsZCBnbyBoZXJlKQorCitlbmRtZW51ICMgIlNQSSBzdXBwb3J0IgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9NYWtlZmlsZSBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYzg3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9NYWtlZmlsZQpAQCAtMCwwICsxLDI1IEBACisjCisjIE1ha2VmaWxlIGZvciBrZXJuZWwgU1BJIGRyaXZlcnMuCisjCisKK2lmZXEgKCQoQ09ORklHX1NQSV9ERUJVRykseSkKK0VYVFJBX0NGTEFHUyArPSAtRERFQlVHCitlbmRpZgorCisjIHNtYWxsIGNvcmUsIG1vc3RseSB0cmFuc2xhdGluZyBib2FyZC1zcGVjaWZpYworIyBjb25maWcgZGVjbGFyYXRpb25zIGludG8gZHJpdmVyIG1vZGVsIGNvZGUKK29iai0kKENPTkZJR19TUElfTUFTVEVSKQkJKz0gc3BpLm8KKworIyBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVycyAoYnVzKQorb2JqLSQoQ09ORklHX1NQSV9CSVRCQU5HKQkJKz0gc3BpX2JpdGJhbmcubworb2JqLSQoQ09ORklHX1NQSV9CVVRURVJGTFkpCQkrPSBzcGlfYnV0dGVyZmx5Lm8KKyMgCS4uLiBhZGQgYWJvdmUgdGhpcyBsaW5lIC4uLgorCisjIFNQSSBwcm90b2NvbCBkcml2ZXJzIChkZXZpY2UvbGluayBvbiBidXMpCisjIAkuLi4gYWRkIGFib3ZlIHRoaXMgbGluZSAuLi4KKworIyBTUEkgc2xhdmUgY29udHJvbGxlciBkcml2ZXJzICh1cHN0cmVhbSBsaW5rKQorIyAJLi4uIGFkZCBhYm92ZSB0aGlzIGxpbmUgLi4uCisKKyMgU1BJIHNsYXZlIGRyaXZlcnMgKHByb3RvY29sIGZvciB0aGF0IGxpbmspCisjIAkuLi4gYWRkIGFib3ZlIHRoaXMgbGluZSAuLi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxYzRkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS5jCkBAIC0wLDAgKzEsNjQyIEBACisvKgorICogc3BpLmMgLSBTUEkgaW5pdC9jb3JlIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYXV0b2NvbmYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKworLyogU1BJIGJ1c3R5cGUgYW5kIHNwaV9tYXN0ZXIgY2xhc3MgYXJlIHJlZ2lzdGVyZWQgYWZ0ZXIgYm9hcmQgaW5pdCBjb2RlCisgKiBwcm92aWRlcyB0aGUgU1BJIGRldmljZSB0YWJsZXMsIGVuc3VyaW5nIHRoYXQgYm90aCBhcmUgcHJlc2VudCBieSB0aGUKKyAqIHRpbWUgY29udHJvbGxlciBkcml2ZXIgcmVnaXN0cmF0aW9uIGNhdXNlcyBzcGlfZGV2aWNlcyB0byAiZW51bWVyYXRlIi4KKyAqLworc3RhdGljIHZvaWQgc3BpZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisKKwkvKiBzcGkgbWFzdGVycyBtYXkgY2xlYW51cCBmb3IgcmVsZWFzZWQgZGV2aWNlcyAqLworCWlmIChzcGktPm1hc3Rlci0+Y2xlYW51cCkKKwkJc3BpLT5tYXN0ZXItPmNsZWFudXAoc3BpKTsKKworCXNwaV9tYXN0ZXJfcHV0KHNwaS0+bWFzdGVyKTsKKwlrZnJlZShkZXYpOworfQorCitzdGF0aWMgc3NpemVfdAorbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphLCBjaGFyICpidWYpCit7CisJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIEJVU19JRF9TSVpFICsgMSwgIiVzXG4iLCBzcGktPm1vZGFsaWFzKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHNwaV9kZXZfYXR0cnNbXSA9IHsKKwlfX0FUVFJfUk8obW9kYWxpYXMpLAorCV9fQVRUUl9OVUxMLAorfTsKKworLyogbW9kYWxpYXMgc3VwcG9ydCBtYWtlcyAibW9kcHJvYmUgJE1PREFMSUFTIiBuZXctc3R5bGUgaG90cGx1ZyB3b3JrLAorICogYW5kIHRoZSBzeXNmcyB2ZXJzaW9uIG1ha2VzIGNvbGRwbHVnIHdvcmsgdG9vLgorICovCisKK3N0YXRpYyBpbnQgc3BpX21hdGNoX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKworCXJldHVybiBzdHJuY21wKHNwaS0+bW9kYWxpYXMsIGRydi0+bmFtZSwgQlVTX0lEX1NJWkUpID09IDA7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCisJCWNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQoreworCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlCQkqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCisJZW52cFswXSA9IGJ1ZmZlcjsKKwlzbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiTU9EQUxJQVM9JXMiLCBzcGktPm1vZGFsaWFzKTsKKwllbnZwWzFdID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmCUNPTkZJR19QTQorCisvKgorICogTk9URTogIHRoZSBzdXNwZW5kKCkgbWV0aG9kIGZvciBhbiBzcGlfbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyCisgKiBzaG91bGQgdmVyaWZ5IHRoYXQgYWxsIGl0cyBjaGlsZCBkZXZpY2VzIGFyZSBtYXJrZWQgYXMgc3VzcGVuZGVkOworICogc3VzcGVuZCByZXF1ZXN0cyBkZWxpdmVyZWQgdGhyb3VnaCBzeXNmcyBwb3dlci9zdGF0ZSBmaWxlcyBkb24ndAorICogZW5mb3JjZSBzdWNoIGNvbnN0cmFpbnRzLgorICovCitzdGF0aWMgaW50IHNwaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJaW50CQkJdmFsdWU7CisJc3RydWN0IHNwaV9kcml2ZXIJKmRydiA9IHRvX3NwaV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKCFkcnYtPnN1c3BlbmQpCisJCXJldHVybiAwOworCisJLyogc3VzcGVuZCB3aWxsIHN0b3AgaXJxcyBhbmQgZG1hOyBubyBtb3JlIGkvbyAqLworCXZhbHVlID0gZHJ2LT5zdXNwZW5kKHRvX3NwaV9kZXZpY2UoZGV2KSwgbWVzc2FnZSk7CisJaWYgKHZhbHVlID09IDApCisJCWRldi0+cG93ZXIucG93ZXJfc3RhdGUgPSBtZXNzYWdlOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBzcGlfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQJCQl2YWx1ZTsKKwlzdHJ1Y3Qgc3BpX2RyaXZlcgkqZHJ2ID0gdG9fc3BpX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlpZiAoIWRydi0+cmVzdW1lKQorCQlyZXR1cm4gMDsKKworCS8qIHJlc3VtZSBtYXkgcmVzdGFydCB0aGUgaS9vIHF1ZXVlICovCisJdmFsdWUgPSBkcnYtPnJlc3VtZSh0b19zcGlfZGV2aWNlKGRldikpOworCWlmICh2YWx1ZSA9PSAwKQorCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKyNlbHNlCisjZGVmaW5lIHNwaV9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgc3BpX3Jlc3VtZQlOVUxMCisjZW5kaWYKKworc3RydWN0IGJ1c190eXBlIHNwaV9idXNfdHlwZSA9IHsKKwkubmFtZQkJPSAic3BpIiwKKwkuZGV2X2F0dHJzCT0gc3BpX2Rldl9hdHRycywKKwkubWF0Y2gJCT0gc3BpX21hdGNoX2RldmljZSwKKwkudWV2ZW50CQk9IHNwaV91ZXZlbnQsCisJLnN1c3BlbmQJPSBzcGlfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNwaV9yZXN1bWUsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2J1c190eXBlKTsKKworCitzdGF0aWMgaW50IHNwaV9kcnZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBzcGlfZHJpdmVyCQkqc2RydiA9IHRvX3NwaV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJcmV0dXJuIHNkcnYtPnByb2JlKHRvX3NwaV9kZXZpY2UoZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgc3BpX2Rydl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBzcGlfZHJpdmVyCQkqc2RydiA9IHRvX3NwaV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJcmV0dXJuIHNkcnYtPnJlbW92ZSh0b19zcGlfZGV2aWNlKGRldikpOworfQorCitzdGF0aWMgdm9pZCBzcGlfZHJ2X3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3Qgc3BpX2RyaXZlcgkJKnNkcnYgPSB0b19zcGlfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKworCXNkcnYtPnNodXRkb3duKHRvX3NwaV9kZXZpY2UoZGV2KSk7Cit9CisKK2ludCBzcGlfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzcGlfZHJpdmVyICpzZHJ2KQoreworCXNkcnYtPmRyaXZlci5idXMgPSAmc3BpX2J1c190eXBlOworCWlmIChzZHJ2LT5wcm9iZSkKKwkJc2Rydi0+ZHJpdmVyLnByb2JlID0gc3BpX2Rydl9wcm9iZTsKKwlpZiAoc2Rydi0+cmVtb3ZlKQorCQlzZHJ2LT5kcml2ZXIucmVtb3ZlID0gc3BpX2Rydl9yZW1vdmU7CisJaWYgKHNkcnYtPnNodXRkb3duKQorCQlzZHJ2LT5kcml2ZXIuc2h1dGRvd24gPSBzcGlfZHJ2X3NodXRkb3duOworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnNkcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfcmVnaXN0ZXJfZHJpdmVyKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU1BJIGRldmljZXMgc2hvdWxkIG5vcm1hbGx5IG5vdCBiZSBjcmVhdGVkIGJ5IFNQSSBkZXZpY2UgZHJpdmVyczsgdGhhdAorICogd291bGQgbWFrZSB0aGVtIGJvYXJkLXNwZWNpZmljLiAgU2ltaWxhcmx5IHdpdGggU1BJIG1hc3RlciBkcml2ZXJzLgorICogRGV2aWNlIHJlZ2lzdHJhdGlvbiBub3JtYWxseSBnb2VzIGludG8gbGlrZSBhcmNoLy4uLi9tYWNoLi4uL2JvYXJkLVlZWS5jCisgKiB3aXRoIG90aGVyIHJlYWRvbmx5IChmbGFzaGFibGUpIGluZm9ybWF0aW9uIGFib3V0IG1haW5ib2FyZCBkZXZpY2VzLgorICovCisKK3N0cnVjdCBib2FyZGluZm8geworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwl1bnNpZ25lZAkJbl9ib2FyZF9pbmZvOworCXN0cnVjdCBzcGlfYm9hcmRfaW5mbwlib2FyZF9pbmZvWzBdOworfTsKKworc3RhdGljIExJU1RfSEVBRChib2FyZF9saXN0KTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKGJvYXJkX2xvY2spOworCisKKy8qIE9uIHR5cGljYWwgbWFpbmJvYXJkcywgdGhpcyBpcyBwdXJlbHkgaW50ZXJuYWw7IGFuZCBpdCdzIG5vdCBuZWVkZWQKKyAqIGFmdGVyIGJvYXJkIGluaXQgY3JlYXRlcyB0aGUgaGFyZC13aXJlZCBkZXZpY2VzLiAgU29tZSBkZXZlbG9wbWVudAorICogcGxhdGZvcm1zIG1heSBub3QgYmUgYWJsZSB0byB1c2Ugc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8gdGhvdWdoLCBhbmQKKyAqIHRoaXMgaXMgZXhwb3J0ZWQgc28gdGhhdCBmb3IgZXhhbXBsZSBhIFVTQiBvciBwYXJwb3J0IGJhc2VkIGFkYXB0ZXIKKyAqIGRyaXZlciBjb3VsZCBhZGQgZGV2aWNlcyAod2hpY2ggaXQgd291bGQgbGVhcm4gYWJvdXQgb3V0LW9mLWJhbmQpLgorICovCitzdHJ1Y3Qgc3BpX2RldmljZSAqX19pbml0X29yX21vZHVsZQorc3BpX25ld19kZXZpY2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV9ib2FyZF9pbmZvICpjaGlwKQoreworCXN0cnVjdCBzcGlfZGV2aWNlCSpwcm94eTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gbWFzdGVyLT5jZGV2LmRldjsKKwlpbnQJCQlzdGF0dXM7CisKKwkvKiBOT1RFOiAgY2FsbGVyIGRpZCBhbnkgY2hpcC0+YnVzX251bSBjaGVja3MgbmVjZXNzYXJ5ICovCisKKwlpZiAoIXNwaV9tYXN0ZXJfZ2V0KG1hc3RlcikpCisJCXJldHVybiBOVUxMOworCisJcHJveHkgPSBremFsbG9jKHNpemVvZiAqcHJveHksIEdGUF9LRVJORUwpOworCWlmICghcHJveHkpIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBhbGxvYyBkZXYgZm9yIGNzJWRcbiIsCisJCQljaGlwLT5jaGlwX3NlbGVjdCk7CisJCWdvdG8gZmFpbDsKKwl9CisJcHJveHktPm1hc3RlciA9IG1hc3RlcjsKKwlwcm94eS0+Y2hpcF9zZWxlY3QgPSBjaGlwLT5jaGlwX3NlbGVjdDsKKwlwcm94eS0+bWF4X3NwZWVkX2h6ID0gY2hpcC0+bWF4X3NwZWVkX2h6OworCXByb3h5LT5pcnEgPSBjaGlwLT5pcnE7CisJcHJveHktPm1vZGFsaWFzID0gY2hpcC0+bW9kYWxpYXM7CisKKwlzbnByaW50Zihwcm94eS0+ZGV2LmJ1c19pZCwgc2l6ZW9mIHByb3h5LT5kZXYuYnVzX2lkLAorCQkJIiVzLiV1IiwgbWFzdGVyLT5jZGV2LmNsYXNzX2lkLAorCQkJY2hpcC0+Y2hpcF9zZWxlY3QpOworCXByb3h5LT5kZXYucGFyZW50ID0gZGV2OworCXByb3h5LT5kZXYuYnVzID0gJnNwaV9idXNfdHlwZTsKKwlwcm94eS0+ZGV2LnBsYXRmb3JtX2RhdGEgPSAodm9pZCAqKSBjaGlwLT5wbGF0Zm9ybV9kYXRhOworCXByb3h5LT5jb250cm9sbGVyX2RhdGEgPSBjaGlwLT5jb250cm9sbGVyX2RhdGE7CisJcHJveHktPmNvbnRyb2xsZXJfc3RhdGUgPSBOVUxMOworCXByb3h5LT5kZXYucmVsZWFzZSA9IHNwaWRldl9yZWxlYXNlOworCisJLyogZHJpdmVycyBtYXkgbW9kaWZ5IHRoaXMgZGVmYXVsdCBpL28gc2V0dXAgKi8KKwlzdGF0dXMgPSBtYXN0ZXItPnNldHVwKHByb3h5KTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkZXZfZGJnKGRldiwgImNhbid0ICVzICVzLCBzdGF0dXMgJWRcbiIsCisJCQkJInNldHVwIiwgcHJveHktPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBkcml2ZXIgY29yZSBjYXRjaGVzIGNhbGxlcnMgdGhhdCBtaXNiZWhhdmUgYnkgZGVmaW5pbmcKKwkgKiBkZXZpY2VzIHRoYXQgYWxyZWFkeSBleGlzdC4KKwkgKi8KKwlzdGF0dXMgPSBkZXZpY2VfcmVnaXN0ZXIoJnByb3h5LT5kZXYpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRldl9kYmcoZGV2LCAiY2FuJ3QgJXMgJXMsIHN0YXR1cyAlZFxuIiwKKwkJCQkiYWRkIiwgcHJveHktPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCWdvdG8gZmFpbDsKKwl9CisJZGV2X2RiZyhkZXYsICJyZWdpc3RlcmVkIGNoaWxkICVzXG4iLCBwcm94eS0+ZGV2LmJ1c19pZCk7CisJcmV0dXJuIHByb3h5OworCitmYWlsOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJa2ZyZWUocHJveHkpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX25ld19kZXZpY2UpOworCisvKgorICogQm9hcmQtc3BlY2lmaWMgZWFybHkgaW5pdCBjb2RlIGNhbGxzIHRoaXMgKHByb2JhYmx5IGR1cmluZyBhcmNoX2luaXRjYWxsKQorICogd2l0aCBzZWdtZW50cyBvZiB0aGUgU1BJIGRldmljZSB0YWJsZS4gIEFueSBkZXZpY2Ugbm9kZXMgYXJlIGNyZWF0ZWQgbGF0ZXIsCisgKiBhZnRlciB0aGUgcmVsZXZhbnQgcGFyZW50IFNQSSBjb250cm9sbGVyIChidXNfbnVtKSBpcyBkZWZpbmVkLiAgV2Uga2VlcAorICogdGhpcyB0YWJsZSBvZiBkZXZpY2VzIGZvcmV2ZXIsIHNvIHRoYXQgcmVsb2FkaW5nIGEgY29udHJvbGxlciBkcml2ZXIgd2lsbAorICogbm90IG1ha2UgTGludXggZm9yZ2V0IGFib3V0IHRoZXNlIGhhcmQtd2lyZWQgZGV2aWNlcy4KKyAqCisgKiBPdGhlciBjb2RlIGNhbiBhbHNvIGNhbGwgdGhpcywgZS5nLiBhIHBhcnRpY3VsYXIgYWRkLW9uIGJvYXJkIG1pZ2h0IHByb3ZpZGUKKyAqIFNQSSBkZXZpY2VzIHRocm91Z2ggaXRzIGV4cGFuc2lvbiBjb25uZWN0b3IsIHNvIGNvZGUgaW5pdGlhbGl6aW5nIHRoYXQgYm9hcmQKKyAqIHdvdWxkIG5hdHVyYWxseSBkZWNsYXJlIGl0cyBTUEkgZGV2aWNlcy4KKyAqCisgKiBUaGUgYm9hcmQgaW5mbyBwYXNzZWQgY2FuIHNhZmVseSBiZSBfX2luaXRkYXRhIC4uLiBidXQgYmUgY2FyZWZ1bCBvZgorICogYW55IGVtYmVkZGVkIHBvaW50ZXJzIChwbGF0Zm9ybV9kYXRhLCBldGMpLCB0aGV5J3JlIGNvcGllZCBhcy1pcy4KKyAqLworaW50IF9faW5pdAorc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oc3RydWN0IHNwaV9ib2FyZF9pbmZvIGNvbnN0ICppbmZvLCB1bnNpZ25lZCBuKQoreworCXN0cnVjdCBib2FyZGluZm8JKmJpOworCisJYmkgPSBrbWFsbG9jKHNpemVvZigqYmkpICsgbiAqIHNpemVvZiAqaW5mbywgR0ZQX0tFUk5FTCk7CisJaWYgKCFiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJYmktPm5fYm9hcmRfaW5mbyA9IG47CisJbWVtY3B5KGJpLT5ib2FyZF9pbmZvLCBpbmZvLCBuICogc2l6ZW9mICppbmZvKTsKKworCWRvd24oJmJvYXJkX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmJpLT5saXN0LCAmYm9hcmRfbGlzdCk7CisJdXAoJmJvYXJkX2xvY2spOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8pOworCisvKiBGSVhNRSBzb21lb25lIHNob3VsZCBhZGQgc3VwcG9ydCBmb3IgYSBfX3NldHVwKCJzcGkiLCAuLi4pIHRoYXQKKyAqIGNyZWF0ZXMgYm9hcmQgaW5mbyBmcm9tIGtlcm5lbCBjb21tYW5kIGxpbmVzCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0X29yX21vZHVsZQorc2Nhbl9ib2FyZGluZm8oc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgYm9hcmRpbmZvCSpiaTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gbWFzdGVyLT5jZGV2LmRldjsKKworCWRvd24oJmJvYXJkX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmksICZib2FyZF9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBzcGlfYm9hcmRfaW5mbwkqY2hpcCA9IGJpLT5ib2FyZF9pbmZvOworCQl1bnNpZ25lZAkJbjsKKworCQlmb3IgKG4gPSBiaS0+bl9ib2FyZF9pbmZvOyBuID4gMDsgbi0tLCBjaGlwKyspIHsKKwkJCWlmIChjaGlwLT5idXNfbnVtICE9IG1hc3Rlci0+YnVzX251bSkKKwkJCQljb250aW51ZTsKKwkJCS8qIHNvbWUgY29udHJvbGxlcnMgb25seSBoYXZlIG9uZSBjaGlwLCBzbyB0aGV5CisJCQkgKiBtaWdodCBub3QgdXNlIGNoaXBzZWxlY3RzLiAgb3RoZXJ3aXNlLCB0aGUKKwkJCSAqIGNoaXBzZWxlY3RzIGFyZSBudW1iZXJlZCAwLi5tYXguCisJCQkgKi8KKwkJCWlmIChjaGlwLT5jaGlwX3NlbGVjdCA+PSBtYXN0ZXItPm51bV9jaGlwc2VsZWN0CisJCQkJCSYmIG1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpIHsKKwkJCQlkZXZfZGJnKGRldiwgImNzJWQgPiBtYXggJWRcbiIsCisJCQkJCWNoaXAtPmNoaXBfc2VsZWN0LAorCQkJCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCSh2b2lkKSBzcGlfbmV3X2RldmljZShtYXN0ZXIsIGNoaXApOworCQl9CisJfQorCXVwKCZib2FyZF9sb2NrKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgc3BpX21hc3Rlcl9yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKworCW1hc3RlciA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3Qgc3BpX21hc3RlciwgY2Rldik7CisJa2ZyZWUobWFzdGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzcyBzcGlfbWFzdGVyX2NsYXNzID0geworCS5uYW1lCQk9ICJzcGlfbWFzdGVyIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlbGVhc2UJPSBzcGlfbWFzdGVyX3JlbGVhc2UsCit9OworCisKKy8qKgorICogc3BpX2FsbG9jX21hc3RlciAtIGFsbG9jYXRlIFNQSSBtYXN0ZXIgY29udHJvbGxlcgorICogQGRldjogdGhlIGNvbnRyb2xsZXIsIHBvc3NpYmx5IHVzaW5nIHRoZSBwbGF0Zm9ybV9idXMKKyAqIEBzaXplOiBob3cgbXVjaCBkcml2ZXItcHJpdmF0ZSBkYXRhIHRvIHByZWFsbG9jYXRlOyB0aGUgcG9pbnRlciB0byB0aGlzCisgKiAJbWVtb3J5IGlzIGluIHRoZSBjbGFzc19kYXRhIGZpZWxkIG9mIHRoZSByZXR1cm5lZCBjbGFzc19kZXZpY2UsCisgKglhY2Nlc3NpYmxlIHdpdGggc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YSgpLgorICoKKyAqIFRoaXMgY2FsbCBpcyB1c2VkIG9ubHkgYnkgU1BJIG1hc3RlciBjb250cm9sbGVyIGRyaXZlcnMsIHdoaWNoIGFyZSB0aGUKKyAqIG9ubHkgb25lcyBkaXJlY3RseSB0b3VjaGluZyBjaGlwIHJlZ2lzdGVycy4gIEl0J3MgaG93IHRoZXkgYWxsb2NhdGUKKyAqIGFuIHNwaV9tYXN0ZXIgc3RydWN0dXJlLCBwcmlvciB0byBjYWxsaW5nIHNwaV9hZGRfbWFzdGVyKCkuCisgKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIGNvbnRleHQgdGhhdCBjYW4gc2xlZXAuICBJdCByZXR1cm5zIHRoZSBTUEkKKyAqIG1hc3RlciBzdHJ1Y3R1cmUgb24gc3VjY2VzcywgZWxzZSBOVUxMLgorICoKKyAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFzc2lnbmluZyB0aGUgYnVzIG51bWJlciBhbmQgaW5pdGlhbGl6aW5nCisgKiB0aGUgbWFzdGVyJ3MgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyBzcGlfYWRkX21hc3RlcigpOyBhbmQgKGFmdGVyIGVycm9ycworICogYWRkaW5nIHRoZSBkZXZpY2UpIGNhbGxpbmcgc3BpX21hc3Rlcl9wdXQoKSB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsuCisgKi8KK3N0cnVjdCBzcGlfbWFzdGVyICogX19pbml0X29yX21vZHVsZQorc3BpX2FsbG9jX21hc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNpemUpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCW1hc3RlciA9IGt6YWxsb2Moc2l6ZSArIHNpemVvZiAqbWFzdGVyLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiBOVUxMOworCisJY2xhc3NfZGV2aWNlX2luaXRpYWxpemUoJm1hc3Rlci0+Y2Rldik7CisJbWFzdGVyLT5jZGV2LmNsYXNzID0gJnNwaV9tYXN0ZXJfY2xhc3M7CisJbWFzdGVyLT5jZGV2LmRldiA9IGdldF9kZXZpY2UoZGV2KTsKKwlzcGlfbWFzdGVyX3NldF9kZXZkYXRhKG1hc3RlciwgJm1hc3RlclsxXSk7CisKKwlyZXR1cm4gbWFzdGVyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2FsbG9jX21hc3Rlcik7CisKKy8qKgorICogc3BpX3JlZ2lzdGVyX21hc3RlciAtIHJlZ2lzdGVyIFNQSSBtYXN0ZXIgY29udHJvbGxlcgorICogQG1hc3RlcjogaW5pdGlhbGl6ZWQgbWFzdGVyLCBvcmlnaW5hbGx5IGZyb20gc3BpX2FsbG9jX21hc3RlcigpCisgKgorICogU1BJIG1hc3RlciBjb250cm9sbGVycyBjb25uZWN0IHRvIHRoZWlyIGRyaXZlcnMgdXNpbmcgc29tZSBub24tU1BJIGJ1cywKKyAqIHN1Y2ggYXMgdGhlIHBsYXRmb3JtIGJ1cy4gIFRoZSBmaW5hbCBzdGFnZSBvZiBwcm9iZSgpIGluIHRoYXQgY29kZQorICogaW5jbHVkZXMgY2FsbGluZyBzcGlfcmVnaXN0ZXJfbWFzdGVyKCkgdG8gaG9vayB1cCB0byB0aGlzIFNQSSBidXMgZ2x1ZS4KKyAqCisgKiBTUEkgY29udHJvbGxlcnMgdXNlIGJvYXJkIHNwZWNpZmljIChvZnRlbiBTT0Mgc3BlY2lmaWMpIGJ1cyBudW1iZXJzLAorICogYW5kIGJvYXJkLXNwZWNpZmljIGFkZHJlc3NpbmcgZm9yIFNQSSBkZXZpY2VzIGNvbWJpbmVzIHRob3NlIG51bWJlcnMKKyAqIHdpdGggY2hpcCBzZWxlY3QgbnVtYmVycy4gIFNpbmNlIFNQSSBkb2VzIG5vdCBkaXJlY3RseSBzdXBwb3J0IGR5bmFtaWMKKyAqIGRldmljZSBpZGVudGlmaWNhdGlvbiwgYm9hcmRzIG5lZWQgY29uZmlndXJhdGlvbiB0YWJsZXMgdGVsbGluZyB3aGljaAorICogY2hpcCBpcyBhdCB3aGljaCBhZGRyZXNzLgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSBjb250ZXh0IHRoYXQgY2FuIHNsZWVwLiAgSXQgcmV0dXJucyB6ZXJvIG9uCisgKiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZSAoZHJvcHBpbmcgdGhlIG1hc3RlcidzIHJlZmNvdW50KS4KKyAqIEFmdGVyIGEgc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcKKyAqIHNwaV91bnJlZ2lzdGVyX21hc3RlcigpLgorICovCitpbnQgX19pbml0X29yX21vZHVsZQorc3BpX3JlZ2lzdGVyX21hc3RlcihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCXN0YXRpYyBhdG9taWNfdAkJZHluX2J1c19pZCA9IEFUT01JQ19JTklUKDApOworCXN0cnVjdCBkZXZpY2UJCSpkZXYgPSBtYXN0ZXItPmNkZXYuZGV2OworCWludAkJCXN0YXR1cyA9IC1FTk9ERVY7CisJaW50CQkJZHluYW1pYyA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBjb252ZW50aW9uOiAgZHluYW1pY2FsbHkgYXNzaWduZWQgYnVzIElEcyBjb3VudCBkb3duIGZyb20gdGhlIG1heCAqLworCWlmIChtYXN0ZXItPmJ1c19udW0gPT0gMCkgeworCQltYXN0ZXItPmJ1c19udW0gPSBhdG9taWNfZGVjX3JldHVybigmZHluX2J1c19pZCk7CisJCWR5bmFtaWMgPSAxOworCX0KKworCS8qIHJlZ2lzdGVyIHRoZSBkZXZpY2UsIHRoZW4gdXNlcnNwYWNlIHdpbGwgc2VlIGl0LgorCSAqIHJlZ2lzdHJhdGlvbiBmYWlscyBpZiB0aGUgYnVzIElEIGlzIGluIHVzZS4KKwkgKi8KKwlzbnByaW50ZihtYXN0ZXItPmNkZXYuY2xhc3NfaWQsIHNpemVvZiBtYXN0ZXItPmNkZXYuY2xhc3NfaWQsCisJCSJzcGkldSIsIG1hc3Rlci0+YnVzX251bSk7CisJc3RhdHVzID0gY2xhc3NfZGV2aWNlX2FkZCgmbWFzdGVyLT5jZGV2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBkb25lOworCWRldl9kYmcoZGV2LCAicmVnaXN0ZXJlZCBtYXN0ZXIgJXMlc1xuIiwgbWFzdGVyLT5jZGV2LmNsYXNzX2lkLAorCQkJZHluYW1pYyA/ICIgKGR5bmFtaWMpIiA6ICIiKTsKKworCS8qIHBvcHVsYXRlIGNoaWxkcmVuIGZyb20gYW55IHNwaSBkZXZpY2UgdGFibGVzICovCisJc2Nhbl9ib2FyZGluZm8obWFzdGVyKTsKKwlzdGF0dXMgPSAwOworZG9uZToKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX3JlZ2lzdGVyX21hc3Rlcik7CisKKworc3RhdGljIGludCBfX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp1bnVzZWQpCit7CisJLyogbm90ZTogYmVmb3JlIGFib3V0IDIuNi4xNC1yYzEgdGhpcyB3b3VsZCBjb3JydXB0IG1lbW9yeTogKi8KKwlzcGlfdW5yZWdpc3Rlcl9kZXZpY2UodG9fc3BpX2RldmljZShkZXYpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIgLSB1bnJlZ2lzdGVyIFNQSSBtYXN0ZXIgY29udHJvbGxlcgorICogQG1hc3RlcjogdGhlIG1hc3RlciBiZWluZyB1bnJlZ2lzdGVyZWQKKyAqCisgKiBUaGlzIGNhbGwgaXMgdXNlZCBvbmx5IGJ5IFNQSSBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXJzLCB3aGljaCBhcmUgdGhlCisgKiBvbmx5IG9uZXMgZGlyZWN0bHkgdG91Y2hpbmcgY2hpcCByZWdpc3RlcnMuCisgKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIGNvbnRleHQgdGhhdCBjYW4gc2xlZXAuCisgKi8KK3ZvaWQgc3BpX3VucmVnaXN0ZXJfbWFzdGVyKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJKHZvaWQpIGRldmljZV9mb3JfZWFjaF9jaGlsZChtYXN0ZXItPmNkZXYuZGV2LCBOVUxMLCBfX3VucmVnaXN0ZXIpOworCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZtYXN0ZXItPmNkZXYpOworCW1hc3Rlci0+Y2Rldi5kZXYgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX3VucmVnaXN0ZXJfbWFzdGVyKTsKKworLyoqCisgKiBzcGlfYnVzbnVtX3RvX21hc3RlciAtIGxvb2sgdXAgbWFzdGVyIGFzc29jaWF0ZWQgd2l0aCBidXNfbnVtCisgKiBAYnVzX251bTogdGhlIG1hc3RlcidzIGJ1cyBudW1iZXIKKyAqCisgKiBUaGlzIGNhbGwgbWF5IGJlIHVzZWQgd2l0aCBkZXZpY2VzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgYWZ0ZXIKKyAqIGFyY2ggaW5pdCB0aW1lLiAgSXQgcmV0dXJucyBhIHJlZmNvdW50ZWQgcG9pbnRlciB0byB0aGUgcmVsZXZhbnQKKyAqIHNwaV9tYXN0ZXIgKHdoaWNoIHRoZSBjYWxsZXIgbXVzdCByZWxlYXNlKSwgb3IgTlVMTCBpZiB0aGVyZSBpcworICogbm8gc3VjaCBtYXN0ZXIgcmVnaXN0ZXJlZC4KKyAqLworc3RydWN0IHNwaV9tYXN0ZXIgKnNwaV9idXNudW1fdG9fbWFzdGVyKHUxNiBidXNfbnVtKQoreworCWlmIChidXNfbnVtKSB7CisJCWNoYXIJCQluYW1lWzhdOworCQlzdHJ1Y3Qga29iamVjdAkJKmJ1czsKKworCQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgInNwaSV1IiwgYnVzX251bSk7CisJCWJ1cyA9IGtzZXRfZmluZF9vYmooJnNwaV9tYXN0ZXJfY2xhc3Muc3Vic3lzLmtzZXQsIG5hbWUpOworCQlpZiAoYnVzKQorCQkJcmV0dXJuIGNvbnRhaW5lcl9vZihidXMsIHN0cnVjdCBzcGlfbWFzdGVyLCBjZGV2LmtvYmopOworCX0KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9idXNudW1fdG9fbWFzdGVyKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBzcGlfY29tcGxldGUodm9pZCAqYXJnKQoreworCWNvbXBsZXRlKGFyZyk7Cit9CisKKy8qKgorICogc3BpX3N5bmMgLSBibG9ja2luZy9zeW5jaHJvbm91cyBTUEkgZGF0YSB0cmFuc2ZlcnMKKyAqIEBzcGk6IGRldmljZSB3aXRoIHdoaWNoIGRhdGEgd2lsbCBiZSBleGNoYW5nZWQKKyAqIEBtZXNzYWdlOiBkZXNjcmliZXMgdGhlIGRhdGEgdHJhbnNmZXJzCisgKgorICogVGhpcyBjYWxsIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIGNvbnRleHQgdGhhdCBtYXkgc2xlZXAuICBUaGUgc2xlZXAKKyAqIGlzIG5vbi1pbnRlcnJ1cHRpYmxlLCBhbmQgaGFzIG5vIHRpbWVvdXQuICBMb3ctb3ZlcmhlYWQgY29udHJvbGxlcgorICogZHJpdmVycyBtYXkgRE1BIGRpcmVjdGx5IGludG8gYW5kIG91dCBvZiB0aGUgbWVzc2FnZSBidWZmZXJzLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgU1BJIGRldmljZSdzIGNoaXAgc2VsZWN0IGlzIGFjdGl2ZSBkdXJpbmcgdGhlIG1lc3NhZ2UsCisgKiBhbmQgdGhlbiBpcyBub3JtYWxseSBkaXNhYmxlZCBiZXR3ZWVuIG1lc3NhZ2VzLiAgRHJpdmVycyBmb3Igc29tZQorICogZnJlcXVlbnRseS11c2VkIGRldmljZXMgbWF5IHdhbnQgdG8gbWluaW1pemUgY29zdHMgb2Ygc2VsZWN0aW5nIGEgY2hpcCwKKyAqIGJ5IGxlYXZpbmcgaXQgc2VsZWN0ZWQgaW4gYW50aWNpcGF0aW9uIHRoYXQgdGhlIG5leHQgbWVzc2FnZSB3aWxsIGdvCisgKiB0byB0aGUgc2FtZSBjaGlwLiAgKFRoYXQgbWF5IGluY3JlYXNlIHBvd2VyIHVzYWdlLikKKyAqCisgKiBBbHNvLCB0aGUgY2FsbGVyIGlzIGd1YXJhbnRlZWluZyB0aGF0IHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogbWVzc2FnZSB3aWxsIG5vdCBiZSBmcmVlZCBiZWZvcmUgdGhpcyBjYWxsIHJldHVybnMuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlIG1lc3NhZ2UgY291bGQgbm90IGJlCisgKiBzdWJtaXR0ZWQsIGVsc2UgemVyby4gIFdoZW4gdGhlIHZhbHVlIGlzIHplcm8sIHRoZW4gbWVzc2FnZS0+c3RhdHVzIGlzCisgKiBhbHNvIGRlZmluZWQ6ICBpdCdzIHRoZSBjb21wbGV0aW9uIGNvZGUgZm9yIHRoZSB0cmFuc2ZlciwgZWl0aGVyIHplcm8KKyAqIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBmcm9tIHRoZSBjb250cm9sbGVyIGRyaXZlci4KKyAqLworaW50IHNwaV9zeW5jKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzc2FnZSkKK3sKKwlERUNMQVJFX0NPTVBMRVRJT04oZG9uZSk7CisJaW50IHN0YXR1czsKKworCW1lc3NhZ2UtPmNvbXBsZXRlID0gc3BpX2NvbXBsZXRlOworCW1lc3NhZ2UtPmNvbnRleHQgPSAmZG9uZTsKKwlzdGF0dXMgPSBzcGlfYXN5bmMoc3BpLCBtZXNzYWdlKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRvbmUpOworCW1lc3NhZ2UtPmNvbnRleHQgPSBOVUxMOworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfc3luYyk7CisKKyNkZWZpbmUJU1BJX0JVRlNJWgkoU01QX0NBQ0hFX0JZVEVTKQorCitzdGF0aWMgdTgJKmJ1ZjsKKworLyoqCisgKiBzcGlfd3JpdGVfdGhlbl9yZWFkIC0gU1BJIHN5bmNocm9ub3VzIHdyaXRlIGZvbGxvd2VkIGJ5IHJlYWQKKyAqIEBzcGk6IGRldmljZSB3aXRoIHdoaWNoIGRhdGEgd2lsbCBiZSBleGNoYW5nZWQKKyAqIEB0eGJ1ZjogZGF0YSB0byBiZSB3cml0dGVuIChuZWVkIG5vdCBiZSBkbWEtc2FmZSkKKyAqIEBuX3R4OiBzaXplIG9mIHR4YnVmLCBpbiBieXRlcworICogQHJ4YnVmOiBidWZmZXIgaW50byB3aGljaCBkYXRhIHdpbGwgYmUgcmVhZAorICogQG5fcng6IHNpemUgb2YgcnhidWYsIGluIGJ5dGVzIChuZWVkIG5vdCBiZSBkbWEtc2FmZSkKKyAqCisgKiBUaGlzIHBlcmZvcm1zIGEgaGFsZiBkdXBsZXggTWljcm9XaXJlIHN0eWxlIHRyYW5zYWN0aW9uIHdpdGggdGhlCisgKiBkZXZpY2UsIHNlbmRpbmcgdHhidWYgYW5kIHRoZW4gcmVhZGluZyByeGJ1Zi4gIFRoZSByZXR1cm4gdmFsdWUKKyAqIGlzIHplcm8gZm9yIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJubyBzdGF0dXMgY29kZS4KKyAqIFRoaXMgY2FsbCBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBjb250ZXh0IHRoYXQgbWF5IHNsZWVwLgorICoKKyAqIFBhcmFtZXRlcnMgdG8gdGhpcyByb3V0aW5lIGFyZSBhbHdheXMgY29waWVkIHVzaW5nIGEgc21hbGwgYnVmZmVyOworICogcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIG9yIGJ1bGsgdHJhbnNmZXIgY29kZSBzaG91bGQgaW5zdGVhZCB1c2UKKyAqIHNwaV97YXN5bmMsc3luY30oKSBjYWxscyB3aXRoIGRtYS1zYWZlIGJ1ZmZlcnMuCisgKi8KK2ludCBzcGlfd3JpdGVfdGhlbl9yZWFkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCWNvbnN0IHU4ICp0eGJ1ZiwgdW5zaWduZWQgbl90eCwKKwkJdTggKnJ4YnVmLCB1bnNpZ25lZCBuX3J4KQoreworCXN0YXRpYyBERUNMQVJFX01VVEVYKGxvY2spOworCisJaW50CQkJc3RhdHVzOworCXN0cnVjdCBzcGlfbWVzc2FnZQltZXNzYWdlOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJeFsyXTsKKwl1OAkJCSpsb2NhbF9idWY7CisKKwkvKiBVc2UgcHJlYWxsb2NhdGVkIERNQS1zYWZlIGJ1ZmZlci4gIFdlIGNhbid0IGF2b2lkIGNvcHlpbmcgaGVyZSwKKwkgKiAoYXMgYSBwdXJlIGNvbnZlbmllbmNlIHRoaW5nKSwgYnV0IHdlIGNhbiBrZWVwIGhlYXAgY29zdHMKKwkgKiBvdXQgb2YgdGhlIGhvdCBwYXRoIC4uLgorCSAqLworCWlmICgobl90eCArIG5fcngpID4gU1BJX0JVRlNJWikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtZXNzYWdlKTsKKwltZW1zZXQoeCwgMCwgc2l6ZW9mIHgpOworCWlmIChuX3R4KSB7CisJCXhbMF0ubGVuID0gbl90eDsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhbMF0sICZtZXNzYWdlKTsKKwl9CisJaWYgKG5fcngpIHsKKwkJeFsxXS5sZW4gPSBuX3J4OworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeFsxXSwgJm1lc3NhZ2UpOworCX0KKworCS8qIC4uLiB1bmxlc3Mgc29tZW9uZSBlbHNlIGlzIHVzaW5nIHRoZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlciAqLworCWlmIChkb3duX3RyeWxvY2soJmxvY2spKSB7CisJCWxvY2FsX2J1ZiA9IGttYWxsb2MoU1BJX0JVRlNJWiwgR0ZQX0tFUk5FTCk7CisJCWlmICghbG9jYWxfYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfSBlbHNlCisJCWxvY2FsX2J1ZiA9IGJ1ZjsKKworCW1lbWNweShsb2NhbF9idWYsIHR4YnVmLCBuX3R4KTsKKwl4WzBdLnR4X2J1ZiA9IGxvY2FsX2J1ZjsKKwl4WzFdLnJ4X2J1ZiA9IGxvY2FsX2J1ZiArIG5fdHg7CisKKwkvKiBkbyB0aGUgaS9vICovCisJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbWVzc2FnZSk7CisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCW1lbWNweShyeGJ1ZiwgeFsxXS5yeF9idWYsIG5fcngpOworCQlzdGF0dXMgPSBtZXNzYWdlLnN0YXR1czsKKwl9CisKKwlpZiAoeFswXS50eF9idWYgPT0gYnVmKQorCQl1cCgmbG9jayk7CisJZWxzZQorCQlrZnJlZShsb2NhbF9idWYpOworCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV93cml0ZV90aGVuX3JlYWQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IF9faW5pdCBzcGlfaW5pdCh2b2lkKQoreworCWludAlzdGF0dXM7CisKKwlidWYgPSBrbWFsbG9jKFNQSV9CVUZTSVosIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGVycjA7CisJfQorCisJc3RhdHVzID0gYnVzX3JlZ2lzdGVyKCZzcGlfYnVzX3R5cGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycjE7CisKKwlzdGF0dXMgPSBjbGFzc19yZWdpc3Rlcigmc3BpX21hc3Rlcl9jbGFzcyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyMjsKKwlyZXR1cm4gMDsKKworZXJyMjoKKwlidXNfdW5yZWdpc3Rlcigmc3BpX2J1c190eXBlKTsKK2VycjE6CisJa2ZyZWUoYnVmKTsKKwlidWYgPSBOVUxMOworZXJyMDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBib2FyZF9pbmZvIGlzIG5vcm1hbGx5IHJlZ2lzdGVyZWQgaW4gYXJjaF9pbml0Y2FsbCgpLAorICogYnV0IGV2ZW4gZXNzZW50aWFsIGRyaXZlcnMgd2FpdCB0aWxsIGxhdGVyCisgKgorICogUkVWSVNJVCBvbmx5IGJvYXJkaW5mbyByZWFsbHkgbmVlZHMgc3RhdGljIGxpbmtpbmcuIHRoZSByZXN0IChkZXZpY2UgYW5kCisgKiBkcml2ZXIgcmVnaXN0cmF0aW9uKSBfY291bGRfIGJlIGR5bmFtaWNhbGx5IGxpbmtlZCAobW9kdWxhcikgLi4uIGNvc3RzCisgKiBpbmNsdWRlIG5lZWRpbmcgdG8gaGF2ZSBib2FyZGluZm8gZGF0YSBzdHJ1Y3R1cmVzIGJlIG11Y2ggbW9yZSBwdWJsaWMuCisgKi8KK3N1YnN5c19pbml0Y2FsbChzcGlfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMgYi9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMzdlNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCkBAIC0wLDAgKzEsNDcyIEBACisvKgorICogc3BpX2JpdGJhbmcuYyAtIHBvbGxpbmcvYml0YmFuZ2luZyBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyIHV0aWxpdGllcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBGSVJTVCBQQVJUIChPUFRJT05BTCk6ICB3b3JkLWF0LWEtdGltZSBzcGlfdHJhbnNmZXIgc3VwcG9ydC4KKyAqIFVzZSB0aGlzIGZvciBHUElPIG9yIHNoaWZ0LXJlZ2lzdGVyIGxldmVsIGhhcmR3YXJlIEFQSXMuCisgKgorICogc3BpX2JpdGJhbmdfY3MgaXMgaW4gc3BpX2RldmljZS0+Y29udHJvbGxlcl9zdGF0ZSwgd2hpY2ggaXMgdW5hdmFpbGFibGUKKyAqIHRvIGdsdWUgY29kZS4gIFRoZXNlIGJpdGJhbmcgc2V0dXAoKSBhbmQgY2xlYW51cCgpIHJvdXRpbmVzIGFyZSBhbHdheXMKKyAqIHVzZWQsIHRob3VnaCBtYXliZSB0aGV5J3JlIGNhbGxlZCBmcm9tIGNvbnRyb2xsZXItYXdhcmUgY29kZS4KKyAqCisgKiBjaGlwc2VsZWN0KCkgYW5kIGZyaWVuZHMgbWF5IHVzZSB1c2Ugc3BpX2RldmljZS0+Y29udHJvbGxlcl9kYXRhIGFuZAorICogY29udHJvbGxlciByZWdpc3RlcnMgYXMgYXBwcm9wcmlhdGUuCisgKgorICoKKyAqIE5PVEU6ICBTUEkgY29udHJvbGxlciBwaW5zIGNhbiBvZnRlbiBiZSB1c2VkIGFzIEdQSU8gcGlucyBpbnN0ZWFkLAorICogd2hpY2ggbWVhbnMgeW91IGNvdWxkIHVzZSBhIGJpdGJhbmcgZHJpdmVyIGVpdGhlciB0byBnZXQgaGFyZHdhcmUKKyAqIHdvcmtpbmcgcXVpY2tseSwgb3IgdGVzdGluZyBmb3IgZGlmZmVyZW5jZXMgdGhhdCBhcmVuJ3Qgc3BlZWQgcmVsYXRlZC4KKyAqLworCitzdHJ1Y3Qgc3BpX2JpdGJhbmdfY3MgeworCXVuc2lnbmVkCW5zZWNzOwkvKiAoY2xvY2sgY3ljbGUgdGltZSkvMiAqLworCXUzMgkJKCp0eHJ4X3dvcmQpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHVuc2lnbmVkIG5zZWNzLAorCQkJCQl1MzIgd29yZCwgdTggYml0cyk7CisJdW5zaWduZWQJKCp0eHJ4X2J1ZnMpKHN0cnVjdCBzcGlfZGV2aWNlICosCisJCQkJCXUzMiAoKnR4cnhfd29yZCkoCisJCQkJCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQkJdW5zaWduZWQgbnNlY3MsCisJCQkJCQl1MzIgd29yZCwgdTggYml0cyksCisJCQkJCXVuc2lnbmVkLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICopOworfTsKKworc3RhdGljIHVuc2lnbmVkIGJpdGJhbmdfdHhyeF84KAorCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGksCisJdTMyCQkJKCp0eHJ4X3dvcmQpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJCXVuc2lnbmVkIG5zZWNzLAorCQkJCQl1MzIgd29yZCwgdTggYml0cyksCisJdW5zaWduZWQJCW5zLAorCXN0cnVjdCBzcGlfdHJhbnNmZXIJKnQKKykgeworCXVuc2lnbmVkCQliaXRzID0gc3BpLT5iaXRzX3Blcl93b3JkOworCXVuc2lnbmVkCQljb3VudCA9IHQtPmxlbjsKKwljb25zdCB1OAkJKnR4ID0gdC0+dHhfYnVmOworCXU4CQkJKnJ4ID0gdC0+cnhfYnVmOworCisJd2hpbGUgKGxpa2VseShjb3VudCA+IDApKSB7CisJCXU4CQl3b3JkID0gMDsKKworCQlpZiAodHgpCisJCQl3b3JkID0gKnR4Kys7CisJCXdvcmQgPSB0eHJ4X3dvcmQoc3BpLCBucywgd29yZCwgYml0cyk7CisJCWlmIChyeCkKKwkJCSpyeCsrID0gd29yZDsKKwkJY291bnQgLT0gMTsKKwl9CisJcmV0dXJuIHQtPmxlbiAtIGNvdW50OworfQorCitzdGF0aWMgdW5zaWduZWQgYml0YmFuZ190eHJ4XzE2KAorCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGksCisJdTMyCQkJKCp0eHJ4X3dvcmQpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJCXVuc2lnbmVkIG5zZWNzLAorCQkJCQl1MzIgd29yZCwgdTggYml0cyksCisJdW5zaWduZWQJCW5zLAorCXN0cnVjdCBzcGlfdHJhbnNmZXIJKnQKKykgeworCXVuc2lnbmVkCQliaXRzID0gc3BpLT5iaXRzX3Blcl93b3JkOworCXVuc2lnbmVkCQljb3VudCA9IHQtPmxlbjsKKwljb25zdCB1MTYJCSp0eCA9IHQtPnR4X2J1ZjsKKwl1MTYJCQkqcnggPSB0LT5yeF9idWY7CisKKwl3aGlsZSAobGlrZWx5KGNvdW50ID4gMSkpIHsKKwkJdTE2CQl3b3JkID0gMDsKKworCQlpZiAodHgpCisJCQl3b3JkID0gKnR4Kys7CisJCXdvcmQgPSB0eHJ4X3dvcmQoc3BpLCBucywgd29yZCwgYml0cyk7CisJCWlmIChyeCkKKwkJCSpyeCsrID0gd29yZDsKKwkJY291bnQgLT0gMjsKKwl9CisJcmV0dXJuIHQtPmxlbiAtIGNvdW50OworfQorCitzdGF0aWMgdW5zaWduZWQgYml0YmFuZ190eHJ4XzMyKAorCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGksCisJdTMyCQkJKCp0eHJ4X3dvcmQpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJCXVuc2lnbmVkIG5zZWNzLAorCQkJCQl1MzIgd29yZCwgdTggYml0cyksCisJdW5zaWduZWQJCW5zLAorCXN0cnVjdCBzcGlfdHJhbnNmZXIJKnQKKykgeworCXVuc2lnbmVkCQliaXRzID0gc3BpLT5iaXRzX3Blcl93b3JkOworCXVuc2lnbmVkCQljb3VudCA9IHQtPmxlbjsKKwljb25zdCB1MzIJCSp0eCA9IHQtPnR4X2J1ZjsKKwl1MzIJCQkqcnggPSB0LT5yeF9idWY7CisKKwl3aGlsZSAobGlrZWx5KGNvdW50ID4gMykpIHsKKwkJdTMyCQl3b3JkID0gMDsKKworCQlpZiAodHgpCisJCQl3b3JkID0gKnR4Kys7CisJCXdvcmQgPSB0eHJ4X3dvcmQoc3BpLCBucywgd29yZCwgYml0cyk7CisJCWlmIChyeCkKKwkJCSpyeCsrID0gd29yZDsKKwkJY291bnQgLT0gNDsKKwl9CisJcmV0dXJuIHQtPmxlbiAtIGNvdW50OworfQorCisvKioKKyAqIHNwaV9iaXRiYW5nX3NldHVwIC0gZGVmYXVsdCBzZXR1cCBmb3IgcGVyLXdvcmQgSS9PIGxvb3BzCisgKi8KK2ludCBzcGlfYml0YmFuZ19zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBzcGlfYml0YmFuZ19jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJc3RydWN0IHNwaV9iaXRiYW5nCSpiaXRiYW5nOworCisJaWYgKCFzcGktPm1heF9zcGVlZF9oeikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWNzKSB7CisJCWNzID0ga3phbGxvYyhzaXplb2YgKmNzLCBTTEFCX0tFUk5FTCk7CisJCWlmICghY3MpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gY3M7CisJfQorCWJpdGJhbmcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCWlmICghc3BpLT5iaXRzX3Blcl93b3JkKQorCQlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCisJLyogc3BpX3RyYW5zZmVyIGxldmVsIGNhbGxzIHRoYXQgd29yayBwZXItd29yZCAqLworCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPD0gOCkKKwkJY3MtPnR4cnhfYnVmcyA9IGJpdGJhbmdfdHhyeF84OworCWVsc2UgaWYgKHNwaS0+Yml0c19wZXJfd29yZCA8PSAxNikKKwkJY3MtPnR4cnhfYnVmcyA9IGJpdGJhbmdfdHhyeF8xNjsKKwllbHNlIGlmIChzcGktPmJpdHNfcGVyX3dvcmQgPD0gMzIpCisJCWNzLT50eHJ4X2J1ZnMgPSBiaXRiYW5nX3R4cnhfMzI7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHBlci13b3JkIHNoaWZ0IHJlZ2lzdGVyIGFjY2VzcywgaW4gaGFyZHdhcmUgb3IgYml0YmFuZ2luZyAqLworCWNzLT50eHJ4X3dvcmQgPSBiaXRiYW5nLT50eHJ4X3dvcmRbc3BpLT5tb2RlICYgKFNQSV9DUE9MfFNQSV9DUEhBKV07CisJaWYgKCFjcy0+dHhyeF93b3JkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG5zZWNzID0gKGNsb2NrIHBlcmlvZCkvMiAqLworCWNzLT5uc2VjcyA9ICgxMDAwMDAwMDAwLzIpIC8gKHNwaS0+bWF4X3NwZWVkX2h6KTsKKwlpZiAoY3MtPm5zZWNzID4gTUFYX1VERUxBWV9NUyAqIDEwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2X2RiZygmc3BpLT5kZXYsICIlcywgbW9kZSAlZCwgJXUgYml0cy93LCAldSBuc2VjXG4iLAorCQkJX19GVU5DVElPTl9fLCBzcGktPm1vZGUgJiAoU1BJX0NQT0wgfCBTUElfQ1BIQSksCisJCQlzcGktPmJpdHNfcGVyX3dvcmQsIDIgKiBjcy0+bnNlY3MpOworCisJLyogTk9URSB3ZSBfbmVlZF8gdG8gY2FsbCBjaGlwc2VsZWN0KCkgZWFybHksIGlkZWFsbHkgd2l0aCBhZGFwdGVyCisJICogc2V0dXAsIHVubGVzcyB0aGUgaGFyZHdhcmUgZGVmYXVsdHMgY29vcGVyYXRlIHRvIGF2b2lkIGNvbmZ1c2lvbgorCSAqIGJldHdlZW4gbm9ybWFsIChhY3RpdmUgbG93KSBhbmQgaW52ZXJ0ZWQgY2hpcHNlbGVjdHMuCisJICovCisKKwkvKiBkZXNlbGVjdCBjaGlwIChsb3cgb3IgaGlnaCkgKi8KKwlzcGluX2xvY2soJmJpdGJhbmctPmxvY2spOworCWlmICghYml0YmFuZy0+YnVzeSkgeworCQliaXRiYW5nLT5jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19JTkFDVElWRSk7CisJCW5kZWxheShjcy0+bnNlY3MpOworCX0KKwlzcGluX3VubG9jaygmYml0YmFuZy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9iaXRiYW5nX3NldHVwKTsKKworLyoqCisgKiBzcGlfYml0YmFuZ19jbGVhbnVwIC0gZGVmYXVsdCBjbGVhbnVwIGZvciBwZXItd29yZCBJL08gbG9vcHMKKyAqLwordm9pZCBzcGlfYml0YmFuZ19jbGVhbnVwKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJa2ZyZWUoc3BpLT5jb250cm9sbGVyX3N0YXRlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9iaXRiYW5nX2NsZWFudXApOworCitzdGF0aWMgaW50IHNwaV9iaXRiYW5nX2J1ZnMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmdfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXVuc2lnbmVkCQluc2VjcyA9IGNzLT5uc2VjczsKKworCXJldHVybiBjcy0+dHhyeF9idWZzKHNwaSwgY3MtPnR4cnhfd29yZCwgbnNlY3MsIHQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU0VDT05EIFBBUlQgLi4uIHNpbXBsZSB0cmFuc2ZlciBxdWV1ZSBydW5uZXIuCisgKgorICogVGhpcyBjb3N0cyBhIHRhc2sgY29udGV4dCBwZXIgY29udHJvbGxlciwgcnVubmluZyB0aGUgcXVldWUgYnkKKyAqIHBlcmZvcm1pbmcgZWFjaCB0cmFuc2ZlciBpbiBzZXF1ZW5jZS4gIFNtYXJ0ZXIgaGFyZHdhcmUgY2FuIHF1ZXVlCisgKiBzZXZlcmFsIERNQSB0cmFuc2ZlcnMgYXQgb25jZSwgYW5kIHByb2Nlc3Mgc2V2ZXJhbCBjb250cm9sbGVyIHF1ZXVlcworICogaW4gcGFyYWxsZWw7IHRoaXMgZHJpdmVyIGRvZXNuJ3QgbWF0Y2ggc3VjaCBoYXJkd2FyZSB2ZXJ5IHdlbGwuCisgKgorICogRHJpdmVycyBjYW4gcHJvdmlkZSB3b3JkLWF0LWEtdGltZSBpL28gcHJpbWl0aXZlcywgb3IgcHJvdmlkZQorICogdHJhbnNmZXItYXQtYS10aW1lIG9uZXMgdG8gbGV2ZXJhZ2UgZG1hIG9yIGZpZm8gaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIGJpdGJhbmdfd29yayh2b2lkICpfYml0YmFuZykKK3sKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcJKmJpdGJhbmcgPSBfYml0YmFuZzsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7CisJYml0YmFuZy0+YnVzeSA9IDE7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZiaXRiYW5nLT5xdWV1ZSkpIHsKKwkJc3RydWN0IHNwaV9tZXNzYWdlCSptOworCQlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCQl1bnNpZ25lZAkJbnNlY3M7CisJCXN0cnVjdCBzcGlfdHJhbnNmZXIJKnQgPSBOVUxMOworCQl1bnNpZ25lZAkJdG1wOworCQl1bnNpZ25lZAkJY3NfY2hhbmdlOworCQlpbnQJCQlzdGF0dXM7CisKKwkJbSA9IGNvbnRhaW5lcl9vZihiaXRiYW5nLT5xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsCisJCQkJcXVldWUpOworCQlsaXN0X2RlbF9pbml0KCZtLT5xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdGJhbmctPmxvY2ssIGZsYWdzKTsKKworCQkvKiBGSVhNRSB0aGlzIGlzIG1hZGUtdXAgLi4uIHRoZSBjb3JyZWN0IHZhbHVlIGlzIGtub3duIHRvCisJCSAqIHdvcmQtYXQtYS10aW1lIGJpdGJhbmcgY29kZSwgYW5kIHByZXN1bWFibHkgY2hpcHNlbGVjdCgpCisJCSAqIHNob3VsZCBlbmZvcmNlIHRoZXNlIHJlcXVpcmVtZW50cyB0b28/CisJCSAqLworCQluc2VjcyA9IDEwMDsKKworCQlzcGkgPSBtLT5zcGk7CisJCXRtcCA9IDA7CisJCWNzX2NoYW5nZSA9IDE7CisJCXN0YXR1cyA9IDA7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSAodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQkJaWYgKGJpdGJhbmctPnNodXRkb3duKSB7CisJCQkJc3RhdHVzID0gLUVTSFVURE9XTjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogc2V0IHVwIGRlZmF1bHQgY2xvY2sgcG9sYXJpdHksIGFuZCBhY3RpdmF0ZSBjaGlwOworCQkJICogdGhpcyBpbXBsaWNpdGx5IHVwZGF0ZXMgY2xvY2sgYW5kIHNwaSBtb2RlcyBhcworCQkJICogcHJldmlvdXNseSByZWNvcmRlZCBmb3IgdGhpcyBkZXZpY2UgdmlhIHNldHVwKCkuCisJCQkgKiAoYW5kIGFsc28gZGVzZWxlY3RzIGFueSBvdGhlciBjaGlwIHRoYXQgbWlnaHQgYmUKKwkJCSAqIHNlbGVjdGVkIC4uLikKKwkJCSAqLworCQkJaWYgKGNzX2NoYW5nZSkgeworCQkJCWJpdGJhbmctPmNoaXBzZWxlY3Qoc3BpLCBCSVRCQU5HX0NTX0FDVElWRSk7CisJCQkJbmRlbGF5KG5zZWNzKTsKKwkJCX0KKwkJCWNzX2NoYW5nZSA9IHQtPmNzX2NoYW5nZTsKKwkJCWlmICghdC0+dHhfYnVmICYmICF0LT5yeF9idWYgJiYgdC0+bGVuKSB7CisJCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogdHJhbnNmZXIgZGF0YS4gIHRoZSBsb3dlciBsZXZlbCBjb2RlIGhhbmRsZXMgYW55CisJCQkgKiBuZXcgZG1hIG1hcHBpbmdzIGl0IG5lZWRzLiBvdXIgY2FsbGVyIGFsd2F5cyBnYXZlCisJCQkgKiB1cyBkbWEtc2FmZSBidWZmZXJzLgorCQkJICovCisJCQlpZiAodC0+bGVuKSB7CisJCQkJLyogUkVWSVNJVCBkbWEgQVBJIHN0aWxsIG5lZWRzIGEgZGVzaWduYXRlZAorCQkJCSAqIERNQV9BRERSX0lOVkFMSUQ7IH4wIG1pZ2h0IGJlIGJldHRlci4KKwkJCQkgKi8KKwkJCQlpZiAoIW0tPmlzX2RtYV9tYXBwZWQpCisJCQkJCXQtPnJ4X2RtYSA9IHQtPnR4X2RtYSA9IDA7CisJCQkJc3RhdHVzID0gYml0YmFuZy0+dHhyeF9idWZzKHNwaSwgdCk7CisJCQl9CisJCQlpZiAoc3RhdHVzICE9IHQtPmxlbikgeworCQkJCWlmIChzdGF0dXMgPiAwKQorCQkJCQlzdGF0dXMgPSAtRU1TR1NJWkU7CisJCQkJYnJlYWs7CisJCQl9CisJCQltLT5hY3R1YWxfbGVuZ3RoICs9IHN0YXR1czsKKwkJCXN0YXR1cyA9IDA7CisKKwkJCS8qIHByb3RvY29sIHR3ZWFrcyBiZWZvcmUgbmV4dCB0cmFuc2ZlciAqLworCQkJaWYgKHQtPmRlbGF5X3VzZWNzKQorCQkJCXVkZWxheSh0LT5kZWxheV91c2Vjcyk7CisKKwkJCWlmICghY3NfY2hhbmdlKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHQtPnRyYW5zZmVyX2xpc3QubmV4dCA9PSAmbS0+dHJhbnNmZXJzKQorCQkJCWJyZWFrOworCisJCQkvKiBzb21ldGltZXMgYSBzaG9ydCBtaWQtbWVzc2FnZSBkZXNlbGVjdCBvZiB0aGUgY2hpcAorCQkJICogbWF5IGJlIG5lZWRlZCB0byB0ZXJtaW5hdGUgYSBtb2RlIG9yIGNvbW1hbmQKKwkJCSAqLworCQkJbmRlbGF5KG5zZWNzKTsKKwkJCWJpdGJhbmctPmNoaXBzZWxlY3Qoc3BpLCBCSVRCQU5HX0NTX0lOQUNUSVZFKTsKKwkJCW5kZWxheShuc2Vjcyk7CisJCX0KKworCQltLT5zdGF0dXMgPSBzdGF0dXM7CisJCW0tPmNvbXBsZXRlKG0tPmNvbnRleHQpOworCisJCS8qIG5vcm1hbGx5IGRlYWN0aXZhdGUgY2hpcHNlbGVjdCAuLi4gdW5sZXNzIG5vIGVycm9yIGFuZAorCQkgKiBjc19jaGFuZ2UgaGFzIGhpbnRlZCB0aGF0IHRoZSBuZXh0IG1lc3NhZ2Ugd2lsbCBwcm9iYWJseQorCQkgKiBiZSBmb3IgdGhpcyBjaGlwIHRvby4KKwkJICovCisJCWlmICghKHN0YXR1cyA9PSAwICYmIGNzX2NoYW5nZSkpIHsKKwkJCW5kZWxheShuc2Vjcyk7CisJCQliaXRiYW5nLT5jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19JTkFDVElWRSk7CisJCQluZGVsYXkobnNlY3MpOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJpdGJhbmctPmxvY2ssIGZsYWdzKTsKKwl9CisJYml0YmFuZy0+YnVzeSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0YmFuZy0+bG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHNwaV9iaXRiYW5nX3RyYW5zZmVyIC0gZGVmYXVsdCBzdWJtaXQgdG8gdHJhbnNmZXIgcXVldWUKKyAqLworaW50IHNwaV9iaXRiYW5nX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKK3sKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcJKmJpdGJhbmc7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwltLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwltLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CisKKwliaXRiYW5nID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJaWYgKGJpdGJhbmctPnNodXRkb3duKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZiaXRiYW5nLT5xdWV1ZSk7CisJcXVldWVfd29yayhiaXRiYW5nLT53b3JrcXVldWUsICZiaXRiYW5nLT53b3JrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9iaXRiYW5nX3RyYW5zZmVyKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBzcGlfYml0YmFuZ19zdGFydCAtIHN0YXJ0IHVwIGEgcG9sbGVkL2JpdGJhbmdpbmcgU1BJIG1hc3RlciBkcml2ZXIKKyAqIEBiaXRiYW5nOiBkcml2ZXIgaGFuZGxlCisgKgorICogQ2FsbGVyIHNob3VsZCBoYXZlIHplcm8taW5pdGlhbGl6ZWQgYWxsIHBhcnRzIG9mIHRoZSBzdHJ1Y3R1cmUsIGFuZCB0aGVuCisgKiBwcm92aWRlZCBjYWxsYmFja3MgZm9yIGNoaXAgc2VsZWN0aW9uIGFuZCBJL08gbG9vcHMuICBJZiB0aGUgbWFzdGVyIGhhcworICogYSB0cmFuc2ZlciBtZXRob2QsIGl0cyBmaW5hbCBzdGVwIHNob3VsZCBjYWxsIHNwaV9iaXRiYW5nX3RyYW5zZmVyOyBvciwKKyAqIHRoYXQncyB0aGUgZGVmYXVsdCBpZiB0aGUgdHJhbnNmZXIgcm91dGluZSBpcyBub3QgaW5pdGlhbGl6ZWQuICBJdCBzaG91bGQKKyAqIGFsc28gc2V0IHVwIHRoZSBidXMgbnVtYmVyIGFuZCBudW1iZXIgb2YgY2hpcHNlbGVjdHMuCisgKgorICogRm9yIGkvbyBsb29wcywgcHJvdmlkZSBjYWxsYmFja3MgZWl0aGVyIHBlci13b3JkIChmb3IgYml0YmFuZ2luZywgb3IgZm9yCisgKiBoYXJkd2FyZSB0aGF0IGJhc2ljYWxseSBleHBvc2VzIGEgc2hpZnQgcmVnaXN0ZXIpIG9yIHBlci1zcGlfdHJhbnNmZXIKKyAqICh3aGljaCB0YWtlcyBiZXR0ZXIgYWR2YW50YWdlIG9mIGhhcmR3YXJlIGxpa2UgZmlmb3Mgb3IgRE1BIGVuZ2luZXMpLgorICoKKyAqIERyaXZlcnMgdXNpbmcgcGVyLXdvcmQgSS9PIGxvb3BzIHNob3VsZCB1c2UgKG9yIGNhbGwpIHNwaV9iaXRiYW5nX3NldHVwIGFuZAorICogc3BpX2JpdGJhbmdfY2xlYW51cCB0byBoYW5kbGUgdGhvc2Ugc3BpIG1hc3RlciBtZXRob2RzLiAgVGhvc2UgbWV0aG9kcyBhcmUKKyAqIHRoZSBkZWZhdWx0cyBpZiB0aGUgYml0YmFuZy0+dHhyeF9idWZzIHJvdXRpbmUgaXNuJ3QgaW5pdGlhbGl6ZWQuCisgKgorICogVGhpcyByb3V0aW5lIHJlZ2lzdGVycyB0aGUgc3BpX21hc3Rlciwgd2hpY2ggd2lsbCBwcm9jZXNzIHJlcXVlc3RzIGluIGEKKyAqIGRlZGljYXRlZCB0YXNrLCBrZWVwaW5nIElSUXMgdW5ibG9ja2VkIG1vc3Qgb2YgdGhlIHRpbWUuICBUbyBzdG9wCisgKiBwcm9jZXNzaW5nIHRob3NlIHJlcXVlc3RzLCBjYWxsIHNwaV9iaXRiYW5nX3N0b3AoKS4KKyAqLworaW50IHNwaV9iaXRiYW5nX3N0YXJ0KHN0cnVjdCBzcGlfYml0YmFuZyAqYml0YmFuZykKK3sKKwlpbnQJc3RhdHVzOworCisJaWYgKCFiaXRiYW5nLT5tYXN0ZXIgfHwgIWJpdGJhbmctPmNoaXBzZWxlY3QpCisJCXJldHVybiAtRUlOVkFMOworCisJSU5JVF9XT1JLKCZiaXRiYW5nLT53b3JrLCBiaXRiYW5nX3dvcmssIGJpdGJhbmcpOworCXNwaW5fbG9ja19pbml0KCZiaXRiYW5nLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmYml0YmFuZy0+cXVldWUpOworCisJaWYgKCFiaXRiYW5nLT5tYXN0ZXItPnRyYW5zZmVyKQorCQliaXRiYW5nLT5tYXN0ZXItPnRyYW5zZmVyID0gc3BpX2JpdGJhbmdfdHJhbnNmZXI7CisJaWYgKCFiaXRiYW5nLT50eHJ4X2J1ZnMpIHsKKwkJYml0YmFuZy0+dXNlX2RtYSA9IDA7CisJCWJpdGJhbmctPnR4cnhfYnVmcyA9IHNwaV9iaXRiYW5nX2J1ZnM7CisJCWlmICghYml0YmFuZy0+bWFzdGVyLT5zZXR1cCkgeworCQkJYml0YmFuZy0+bWFzdGVyLT5zZXR1cCA9IHNwaV9iaXRiYW5nX3NldHVwOworCQkJYml0YmFuZy0+bWFzdGVyLT5jbGVhbnVwID0gc3BpX2JpdGJhbmdfY2xlYW51cDsKKwkJfQorCX0gZWxzZSBpZiAoIWJpdGJhbmctPm1hc3Rlci0+c2V0dXApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogdGhpcyB0YXNrIGlzIHRoZSBvbmx5IHRoaW5nIHRvIHRvdWNoIHRoZSBTUEkgYml0cyAqLworCWJpdGJhbmctPmJ1c3kgPSAwOworCWJpdGJhbmctPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKAorCQkJYml0YmFuZy0+bWFzdGVyLT5jZGV2LmRldi0+YnVzX2lkKTsKKwlpZiAoYml0YmFuZy0+d29ya3F1ZXVlID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVCVVNZOworCQlnb3RvIGVycjE7CisJfQorCisJLyogZHJpdmVyIG1heSBnZXQgYnVzeSBiZWZvcmUgcmVnaXN0ZXIoKSByZXR1cm5zLCBlc3BlY2lhbGx5CisJICogaWYgc29tZW9uZSByZWdpc3RlcmVkIGJvYXJkaW5mbyBmb3IgZGV2aWNlcworCSAqLworCXN0YXR1cyA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIoYml0YmFuZy0+bWFzdGVyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnIyOworCisJcmV0dXJuIHN0YXR1czsKKworZXJyMjoKKwlkZXN0cm95X3dvcmtxdWV1ZShiaXRiYW5nLT53b3JrcXVldWUpOworZXJyMToKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2JpdGJhbmdfc3RhcnQpOworCisvKioKKyAqIHNwaV9iaXRiYW5nX3N0b3AgLSBzdG9wcyB0aGUgdGFzayBwcm92aWRpbmcgc3BpIGNvbW11bmljYXRpb24KKyAqLworaW50IHNwaV9iaXRiYW5nX3N0b3Aoc3RydWN0IHNwaV9iaXRiYW5nICpiaXRiYW5nKQoreworCXVuc2lnbmVkCWxpbWl0ID0gNTAwOworCisJc3Bpbl9sb2NrX2lycSgmYml0YmFuZy0+bG9jayk7CisJYml0YmFuZy0+c2h1dGRvd24gPSAwOworCXdoaWxlICghbGlzdF9lbXB0eSgmYml0YmFuZy0+cXVldWUpICYmIGxpbWl0LS0pIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZiaXRiYW5nLT5sb2NrKTsKKworCQlkZXZfZGJnKGJpdGJhbmctPm1hc3Rlci0+Y2Rldi5kZXYsICJ3YWl0IGZvciBxdWV1ZVxuIik7CisJCW1zbGVlcCgxMCk7CisKKwkJc3Bpbl9sb2NrX2lycSgmYml0YmFuZy0+bG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmYml0YmFuZy0+bG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZiaXRiYW5nLT5xdWV1ZSkpIHsKKwkJZGV2X2VycihiaXRiYW5nLT5tYXN0ZXItPmNkZXYuZGV2LCAicXVldWUgZGlkbid0IGVtcHR5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlkZXN0cm95X3dvcmtxdWV1ZShiaXRiYW5nLT53b3JrcXVldWUpOworCisJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKGJpdGJhbmctPm1hc3Rlcik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9iaXRiYW5nX3N0b3ApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYyBiL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWEzYzU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpX2J1dHRlcmZseS5jCkBAIC0wLDAgKzEsNDIzIEBACisvKgorICogc3BpX2J1dHRlcmZseS5jIC0gcGFycG9ydC10by1idXR0ZXJmbHkgYWRhcHRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgorCisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKworCisvKgorICogVGhpcyB1c2VzIFNQSSB0byB0YWxrIHdpdGggYW4gIkFWUiBCdXR0ZXJmbHkiLCB3aGljaCBpcyBhICRVUzIwIGNhcmQKKyAqIHdpdGggYSBiYXR0ZXJ5IHBvd2VyZWQgQVZSIG1pY3JvY29udHJvbGxlciBhbmQgbG90cyBvZiBnb29kaWVzLiAgWW91CisgKiBjYW4gdXNlIEdDQyB0byBkZXZlbG9wIGZpcm13YXJlIGZvciB0aGlzLgorICoKKyAqIFNlZSBEb2N1bWVudGF0aW9uL3NwaS9idXR0ZXJmbHkgZm9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBidWlsZAorICogYW5kIHVzZSB0aGlzIGN1c3RvbSBwYXJhbGxlbCBwb3J0IGNhYmxlLgorICovCisKKyN1bmRlZglIQVZFX1VTSQkvKiBueWV0ICovCisKKworLyogREFUQSBvdXRwdXQgYml0cyAocGlucyAyLi45ID09IEQwLi5ENykgKi8KKyNkZWZpbmUJYnV0dGVyZmx5X25yZXNldCAoMSA8PCAxKQkJLyogcGluIDMgKi8KKworI2RlZmluZQlzcGlfc2NrX2JpdAkoMSA8PCAwKQkJLyogcGluIDIgKi8KKyNkZWZpbmUJc3BpX21vc2lfYml0CSgxIDw8IDcpCQkvKiBwaW4gOSAqLworCisjZGVmaW5lCXVzaV9zY2tfYml0CSgxIDw8IDMpCQkvKiBwaW4gNSAqLworI2RlZmluZQl1c2lfbW9zaV9iaXQJKDEgPDwgNCkJCS8qIHBpbiA2ICovCisKKyNkZWZpbmUJdmNjX2JpdHMJKCgxIDw8IDYpIHwgKDEgPDwgNSkpCS8qIHBpbnMgNywgOCAqLworCisvKiBTVEFUVVMgaW5wdXQgYml0cyAqLworI2RlZmluZQlzcGlfbWlzb19iaXQJUEFSUE9SVF9TVEFUVVNfQlVTWQkvKiBwaW4gMTEgKi8KKworI2RlZmluZQl1c2lfbWlzb19iaXQJUEFSUE9SVF9TVEFUVVNfUEFQRVJPVVQJLyogcGluIDEyICovCisKKy8qIENPTlRST0wgb3V0cHV0IGJpdHMgKi8KKyNkZWZpbmUJc3BpX2NzX2JpdAlQQVJQT1JUX0NPTlRST0xfU0VMRUNUCS8qIHBpbiAxNyAqLworLyogVVNJIHVzZXMgbm8gY2hpcHNlbGVjdCAqLworCisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnV0dGVyZmx5ICpzcGlkZXZfdG9fcHAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gc3BpLT5jb250cm9sbGVyX2RhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3VzaWRldihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworI2lmZGVmCUhBVkVfVVNJCisJcmV0dXJuIHNwaS0+Y2hpcF9zZWxlY3QgIT0gMTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworCitzdHJ1Y3QgYnV0dGVyZmx5IHsKKwkvKiBSRVZJU0lUIC4uLiBmb3Igbm93LCB0aGlzIG11c3QgYmUgZmlyc3QgKi8KKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcJYml0YmFuZzsKKworCXN0cnVjdCBwYXJwb3J0CQkqcG9ydDsKKwlzdHJ1Y3QgcGFyZGV2aWNlCSpwZDsKKworCXU4CQkJbGFzdGJ5dGU7CisKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqZGF0YWZsYXNoOworCXN0cnVjdCBzcGlfZGV2aWNlCSpidXR0ZXJmbHk7CisJc3RydWN0IHNwaV9ib2FyZF9pbmZvCWluZm9bMl07CisKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiB0aGVzZSByb3V0aW5lcyBtYXkgYmUgc2xvd2VyIHRoYW4gbmVjZXNzYXJ5IGJlY2F1c2UgdGhleSdyZSBoaWRpbmcKKyAqIHRoZSBmYWN0IHRoYXQgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgU1BJIGJ1c3NlcyBvbiB0aGlzIGNhYmxlOiBvbmUKKyAqIHRvIHRoZSBEYXRhRmxhc2ggY2hpcCAob3IgQVZSIFNQSSBjb250cm9sbGVyKSwgdGhlIG90aGVyIHRvIHRoZQorICogQVZSIFVTSSBjb250cm9sbGVyLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0c2NrKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19vbikKK3sKKwlzdHJ1Y3QgYnV0dGVyZmx5CSpwcCA9IHNwaWRldl90b19wcChzcGkpOworCXU4CQkJYml0LCBieXRlID0gcHAtPmxhc3RieXRlOworCisJaWYgKGlzX3VzaWRldihzcGkpKQorCQliaXQgPSB1c2lfc2NrX2JpdDsKKwllbHNlCisJCWJpdCA9IHNwaV9zY2tfYml0OworCisJaWYgKGlzX29uKQorCQlieXRlIHw9IGJpdDsKKwllbHNlCisJCWJ5dGUgJj0gfmJpdDsKKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGJ5dGUpOworCXBwLT5sYXN0Ynl0ZSA9IGJ5dGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0bW9zaShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pCit7CisJc3RydWN0IGJ1dHRlcmZseQkqcHAgPSBzcGlkZXZfdG9fcHAoc3BpKTsKKwl1OAkJCWJpdCwgYnl0ZSA9IHBwLT5sYXN0Ynl0ZTsKKworCWlmIChpc191c2lkZXYoc3BpKSkKKwkJYml0ID0gdXNpX21vc2lfYml0OworCWVsc2UKKwkJYml0ID0gc3BpX21vc2lfYml0OworCisJaWYgKGlzX29uKQorCQlieXRlIHw9IGJpdDsKKwllbHNlCisJCWJ5dGUgJj0gfmJpdDsKKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGJ5dGUpOworCXBwLT5sYXN0Ynl0ZSA9IGJ5dGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldG1pc28oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYnV0dGVyZmx5CSpwcCA9IHNwaWRldl90b19wcChzcGkpOworCWludAkJCXZhbHVlOworCXU4CQkJYml0OworCisJaWYgKGlzX3VzaWRldihzcGkpKQorCQliaXQgPSB1c2lfbWlzb19iaXQ7CisJZWxzZQorCQliaXQgPSBzcGlfbWlzb19iaXQ7CisKKwkvKiBvbmx5IFNUQVRVU19CVVNZIGlzIE5PVCBuZWdhdGVkICovCisJdmFsdWUgPSAhKHBhcnBvcnRfcmVhZF9zdGF0dXMocHAtPnBvcnQpICYgYml0KTsKKwlyZXR1cm4gKGJpdCA9PSBQQVJQT1JUX1NUQVRVU19CVVNZKSA/IHZhbHVlIDogIXZhbHVlOworfQorCitzdGF0aWMgdm9pZCBidXR0ZXJmbHlfY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGJ1dHRlcmZseQkqcHAgPSBzcGlkZXZfdG9fcHAoc3BpKTsKKworCS8qIHNldCBkZWZhdWx0IGNsb2NrIHBvbGFyaXR5ICovCisJaWYgKHZhbHVlKQorCQlzZXRzY2soc3BpLCBzcGktPm1vZGUgJiBTUElfQ1BPTCk7CisKKwkvKiBubyBjaGlwc2VsZWN0IG9uIHRoaXMgVVNJIGxpbmsgY29uZmlnICovCisJaWYgKGlzX3VzaWRldihzcGkpKQorCQlyZXR1cm47CisKKwkvKiBoZXJlLCB2YWx1ZSA9PSAiYWN0aXZhdGUgb3Igbm90IiAqLworCisJLyogbW9zdCBQQVJQT1JUX0NPTlRST0xfKiBiaXRzIGFyZSBuZWdhdGVkICovCisJaWYgKHNwaV9jc19iaXQgPT0gUEFSUE9SVF9DT05UUk9MX0lOSVQpCisJCXZhbHVlID0gIXZhbHVlOworCisJLyogaGVyZSwgdmFsdWUgPT0gImJpdCB2YWx1ZSB0byB3cml0ZSBpbiBjb250cm9sIHJlZ2lzdGVyIiAgKi8KKworCXBhcnBvcnRfZnJvYl9jb250cm9sKHBwLT5wb3J0LCBzcGlfY3NfYml0LCB2YWx1ZSA/IHNwaV9jc19iaXQgOiAwKTsKK30KKworCisvKiB3ZSBvbmx5IG5lZWRlZCB0byBpbXBsZW1lbnQgb25lIG1vZGUgaGVyZSwgYW5kIGNob29zZSBTUElfTU9ERV8wICovCisKKyNkZWZpbmUJc3BpZGVsYXkoWCkJZG97fXdoaWxlKDApCisvLyNkZWZpbmUJc3BpZGVsYXkJbmRlbGF5CisKKyNkZWZpbmUJRVhQQU5EX0JJVEJBTkdfVFhSWAorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorCitzdGF0aWMgdTMyCitidXR0ZXJmbHlfdHhyeF93b3JkX21vZGUwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLAorCQl1MzIgd29yZCwgdTggYml0cykKK3sKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIHdvcmQsIGJpdHMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBvdmVycmlkZSBkZWZhdWx0IHBhcnRpdGlvbmluZyB3aXRoIGNtZGxpbmVwYXJ0ICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uc1tdID0geyB7CisJLyogSkZGUzIgd2FudHMgcGFydGl0aW9ucyBvZiA0Kk4gYmxvY2tzIGZvciB0aGlzIGRldmljZSAuLi4gKi8KKworCS8qIHNlY3RvciAwID0gOCBwYWdlcyAqIDI2NCBieXRlcy9wYWdlICgxIGJsb2NrKQorCSAqIHNlY3RvciAxID0gMjQ4IHBhZ2VzICogMjY0IGJ5dGVzL3BhZ2UKKwkgKi8KKwkubmFtZQkJPSAiYm9va2tlZXBpbmciLAkvLyA2NiBLQgorCS5vZmZzZXQJCT0gMCwKKwkuc2l6ZQkJPSAoOCArIDI0OCkgKiAyNjQsCisvLwkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCit9LCB7CisJLyogc2VjdG9yIDIgPSAyNTYgcGFnZXMgKiAyNjQgYnl0ZXMvcGFnZQorCSAqIHNlY3RvcnMgMy01ID0gNTEyIHBhZ2VzICogMjY0IGJ5dGVzL3BhZ2UKKwkgKi8KKwkubmFtZQkJPSAiZmlsZXN5c3RlbSIsCQkvLyA0NjIgS0IKKwkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLAorfSB9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgZmxhc2ggPSB7CisJLm5hbWUJCT0gImJ1dHRlcmZsYXNoIiwKKwkucGFydHMJCT0gcGFydGl0aW9ucywKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKHBhcnRpdGlvbnMpLAorfTsKKworCisvKiBSRVZJU0lUIHJlbW92ZSB0aGlzIHVnbHkgZ2xvYmFsIGFuZCBpdHMgIm9ubHkgb25lIiBsaW1pdGF0aW9uICovCitzdGF0aWMgc3RydWN0IGJ1dHRlcmZseSAqYnV0dGVyZmx5OworCitzdGF0aWMgdm9pZCBidXR0ZXJmbHlfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXN0cnVjdCBwYXJkZXZpY2UJKnBkOworCWludAkJCXN0YXR1czsKKwlzdHJ1Y3QgYnV0dGVyZmx5CSpwcDsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisKKwlpZiAoYnV0dGVyZmx5KQorCQlyZXR1cm47CisKKwkvKiBSRVZJU0lUOiAgdGhpcyBqdXN0IF9hc3N1bWVzXyBhIGJ1dHRlcmZseSBpcyB0aGVyZSAuLi4gbm8gcHJvYmUsCisJICogYW5kIG5vIHdheSB0byBiZSBzZWxlY3RpdmUgYWJvdXQgd2hhdCBpdCBiaW5kcyB0by4KKwkgKi8KKworCS8qIEZJWE1FIHdoZXJlIHNob3VsZCBtYXN0ZXItPmNkZXYuZGV2IGNvbWUgZnJvbT8KKwkgKiBlLmcuIC9zeXMvYnVzL3BucDAvMDA6MGIsIHNvbWUgUENJIHRoaW5nLCBldGMKKwkgKiBzZXR0aW5nIHVwIGEgcGxhdGZvcm0gZGV2aWNlIGxpa2UgdGhpcyBpcyBhbiB1Z2x5IGtsdWdlLi4uCisJICovCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImJ1dHRlcmZseSIsIC0xLCBOVUxMLCAwKTsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mICpwcCk7CisJaWYgKCFtYXN0ZXIpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKwlwcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCS8qCisJICogU1BJIGFuZCBiaXRiYW5nIGhvb2t1cAorCSAqCisJICogdXNlIGRlZmF1bHQgc2V0dXAoKSwgY2xlYW51cCgpLCBhbmQgdHJhbnNmZXIoKSBtZXRob2RzOyBhbmQKKwkgKiBvbmx5IGJvdGhlciBpbXBsZW1lbnRpbmcgbW9kZSAwLiAgU3RhcnQgaXQgbGF0ZXIuCisJICovCisJbWFzdGVyLT5idXNfbnVtID0gNDI7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDI7CisKKwlwcC0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOworCXBwLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBidXR0ZXJmbHlfY2hpcHNlbGVjdDsKKwlwcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBidXR0ZXJmbHlfdHhyeF93b3JkX21vZGUwOworCisJLyoKKwkgKiBwYXJwb3J0IGhvb2t1cAorCSAqLworCXBwLT5wb3J0ID0gcDsKKwlwZCA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHAsICJzcGlfYnV0dGVyZmx5IiwKKwkJCU5VTEwsIE5VTEwsIE5VTEwsCisJCQkwIC8qIEZMQUdTICovLCBwcCk7CisJaWYgKCFwZCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFuMDsKKwl9CisJcHAtPnBkID0gcGQ7CisKKwlzdGF0dXMgPSBwYXJwb3J0X2NsYWltKHBkKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBjbGVhbjE7CisKKwkvKgorCSAqIEJ1dHRlcmZseSByZXNldCwgcG93ZXJ1cCwgcnVuIGZpcm13YXJlCisJICovCisJcHJfZGVidWcoIiVzOiBwb3dlcnVwL3Jlc2V0IEJ1dHRlcmZseVxuIiwgcC0+bmFtZSk7CisKKwkvKiBuQ1MgZm9yIGRhdGFmbGFzaCAodGhpcyBiaXQgaXMgaW52ZXJ0ZWQgb24gb3V0cHV0KSAqLworCXBhcnBvcnRfZnJvYl9jb250cm9sKHBwLT5wb3J0LCBzcGlfY3NfYml0LCAwKTsKKworCS8qIHN0YWJpbGl6ZSBwb3dlciB3aXRoIGNoaXAgaW4gcmVzZXQgKG5SRVNFVCksIGFuZAorCSAqIGJvdGggc3BpX3Nja19iaXQgYW5kIHVzaV9zY2tfYml0IGNsZWFyIChDUE9MPTApCisJICovCisJcHAtPmxhc3RieXRlIHw9IHZjY19iaXRzOworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgcHAtPmxhc3RieXRlKTsKKwltc2xlZXAoNSk7CisKKwkvKiB0YWtlIGl0IG91dCBvZiByZXNldDsgYXNzdW1lIGxvbmcgcmVzZXQgZGVsYXkgKi8KKwlwcC0+bGFzdGJ5dGUgfD0gYnV0dGVyZmx5X25yZXNldDsKKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIHBwLT5sYXN0Ynl0ZSk7CisJbXNsZWVwKDEwMCk7CisKKworCS8qCisJICogU3RhcnQgU1BJIC4uLiBmb3Igbm93LCBoaWRlIHRoYXQgd2UncmUgdHdvIHBoeXNpY2FsIGJ1c3Nlcy4KKwkgKi8KKwlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdGFydCgmcHAtPmJpdGJhbmcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGNsZWFuMjsKKworCS8qIEJ1cyAxIGxldHMgdXMgdGFsayB0byBhdDQ1ZGIwNDFiIChmaXJtd2FyZSBkaXNhYmxlcyBBVlIpCisJICogb3IgQVZSIChmaXJtd2FyZSByZXNldHMgYXQ0NSwgYWN0cyBhcyBzcGkgc2xhdmUpCisJICovCisJcHAtPmluZm9bMF0ubWF4X3NwZWVkX2h6ID0gMTUgKiAxMDAwICogMTAwMDsKKwlzdHJjcHkocHAtPmluZm9bMF0ubW9kYWxpYXMsICJtdGRfZGF0YWZsYXNoIik7CisJcHAtPmluZm9bMF0ucGxhdGZvcm1fZGF0YSA9ICZmbGFzaDsKKwlwcC0+aW5mb1swXS5jaGlwX3NlbGVjdCA9IDE7CisJcHAtPmluZm9bMF0uY29udHJvbGxlcl9kYXRhID0gcHA7CisJcHAtPmRhdGFmbGFzaCA9IHNwaV9uZXdfZGV2aWNlKHBwLT5iaXRiYW5nLm1hc3RlciwgJnBwLT5pbmZvWzBdKTsKKwlpZiAocHAtPmRhdGFmbGFzaCkKKwkJcHJfZGVidWcoIiVzOiBkYXRhZmxhc2ggYXQgJXNcbiIsIHAtPm5hbWUsCisJCQkJcHAtPmRhdGFmbGFzaC0+ZGV2LmJ1c19pZCk7CisKKyNpZmRlZglIQVZFX1VTSQorCS8qIGV2ZW4gbW9yZSBjdXN0b20gQVZSIGZpcm13YXJlICovCisJcHAtPmluZm9bMV0ubWF4X3NwZWVkX2h6ID0gMTAgLyogPz8gKi8gKiAxMDAwICogMTAwMDsKKwlzdHJjcHkocHAtPmluZm9bMV0ubW9kYWxpYXMsICJidXR0ZXJmbHkiKTsKKwkvLyBwcC0+aW5mb1sxXS5wbGF0Zm9ybV9kYXRhID0gLi4uIFRCRCAuLi4gOworCXBwLT5pbmZvWzFdLmNoaXBfc2VsZWN0ID0gMiwKKwlwcC0+aW5mb1sxXS5jb250cm9sbGVyX2RhdGEgPSBwcDsKKwlwcC0+YnV0dGVyZmx5ID0gc3BpX25ld19kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLCAmcHAtPmluZm9bMV0pOworCWlmIChwcC0+YnV0dGVyZmx5KQorCQlwcl9kZWJ1ZygiJXM6IGJ1dHRlcmZseSBhdCAlc1xuIiwgcC0+bmFtZSwKKwkJCQlwcC0+YnV0dGVyZmx5LT5kZXYuYnVzX2lkKTsKKworCS8qIEZJWE1FIHNldHVwIEFDSyBmb3IgdGhlIElSUSBsaW5lIC4uLiAgKi8KKyNlbmRpZgorCisJLy8gZGV2X2luZm8oX3doYXQ/XywgLi4uKQorCXByX2luZm8oIiVzOiBBVlIgQnV0dGVyZmx5XG4iLCBwLT5uYW1lKTsKKwlidXR0ZXJmbHkgPSBwcDsKKwlyZXR1cm47CisKK2NsZWFuMjoKKwkvKiB0dXJuIG9mZiBWQ0MgKi8KKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIDApOworCisJcGFycG9ydF9yZWxlYXNlKHBwLT5wZCk7CitjbGVhbjE6CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwZCk7CitjbGVhbjA6CisJKHZvaWQpIHNwaV9tYXN0ZXJfcHV0KHBwLT5iaXRiYW5nLm1hc3Rlcik7Citkb25lOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOworCXByX2RlYnVnKCIlczogYnV0dGVyZmx5IHByb2JlLCBmYWlsICVkXG4iLCBwLT5uYW1lLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBidXR0ZXJmbHlfZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXN0cnVjdCBidXR0ZXJmbHkJKnBwOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJaW50CQkJc3RhdHVzOworCisJLyogRklYTUUgdGhpcyBnbG9iYWwgaXMgdWdseSAuLi4gYnV0LCBob3cgdG8gcXVpY2tseSBnZXQgZnJvbQorCSAqIHRoZSBwYXJwb3J0IHRvIHRoZSAic3RydWN0IGJ1dHRlcmZseSIgYXNzb2NpYXRlZCB3aXRoIGl0PworCSAqICJvbGQgc2Nob29sIiBkcml2ZXItaW50ZXJuYWwgZGV2aWNlIGxpc3RzPworCSAqLworCWlmICghYnV0dGVyZmx5IHx8IGJ1dHRlcmZseS0+cG9ydCAhPSBwKQorCQlyZXR1cm47CisJcHAgPSBidXR0ZXJmbHk7CisJYnV0dGVyZmx5ID0gTlVMTDsKKworI2lmZGVmCUhBVkVfVVNJCisJc3BpX3VucmVnaXN0ZXJfZGV2aWNlKHBwLT5idXR0ZXJmbHkpOworCXBwLT5idXR0ZXJmbHkgPSBOVUxMOworI2VuZGlmCisJc3BpX3VucmVnaXN0ZXJfZGV2aWNlKHBwLT5kYXRhZmxhc2gpOworCXBwLT5kYXRhZmxhc2ggPSBOVUxMOworCisJc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RvcCgmcHAtPmJpdGJhbmcpOworCisJLyogdHVybiBvZmYgVkNDICovCisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCAwKTsKKwltc2xlZXAoMTApOworCisJcGFycG9ydF9yZWxlYXNlKHBwLT5wZCk7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwcC0+cGQpOworCisJcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShwcC0+Yml0YmFuZy5tYXN0ZXItPmNkZXYuZGV2KTsKKworCSh2b2lkKSBzcGlfbWFzdGVyX3B1dChwcC0+Yml0YmFuZy5tYXN0ZXIpOworCisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFycG9ydF9kcml2ZXIgYnV0dGVyZmx5X2RyaXZlciA9IHsKKwkubmFtZSA9CQkic3BpX2J1dHRlcmZseSIsCisJLmF0dGFjaCA9CWJ1dHRlcmZseV9hdHRhY2gsCisJLmRldGFjaCA9CWJ1dHRlcmZseV9kZXRhY2gsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGJ1dHRlcmZseV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZidXR0ZXJmbHlfZHJpdmVyKTsKK30KK2RldmljZV9pbml0Y2FsbChidXR0ZXJmbHlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBidXR0ZXJmbHlfZXhpdCh2b2lkKQoreworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJmJ1dHRlcmZseV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYnV0dGVyZmx5X2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCmluZGV4IDhmNDAyZjguLmFmYzg0Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCkBAIC0yNTM0LDkgKzI1MzQsNiBAQAogCS5kcml2ZXIgCT0gewogCQkubmFtZQkJPSAoY2hhciAqKSBzaG9ydG5hbWUsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLy8gLnNodXRkb3duID0gLi4uCi0JCS8vIC5zdXNwZW5kID0gLi4uCi0JCS8vIC5yZXN1bWUgPSAuLi4KIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwppbmRleCBjNmMyNzlkLi45YTRlZGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwpAQCAtMTczOCw5ICsxNzM4LDYgQEAKIAogCS5kcml2ZXIgCT0gewogCQkubmFtZQkJPSAoY2hhciAqKSBzaG9ydG5hbWUsCi0JCS8vIC5zaHV0ZG93biA9IC4uLgotCQkvLyAuc3VzcGVuZCA9IC4uLgotCQkvLyAucmVzdW1lID0gLi4uCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYwppbmRleCAyZTY5MjZiLi5iYTlhY2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCkBAIC0zNzQsOSArMzc0LDYgQEAKIAkuZGlzY29ubmVjdCA9CQlnc19kaXNjb25uZWN0LAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0JCUdTX1NIT1JUX05BTUUsCi0JCS8qIC5zaHV0ZG93biA9IC4uLiAqLwotCQkvKiAuc3VzcGVuZCA9IC4uLiAgKi8KLQkJLyogLnJlc3VtZSA9IC4uLiAgICovCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCmluZGV4IDZjNTg2MzYuLjJmYzExMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYwpAQCAtMTMwMyw5ICsxMzAzLDYgQEAKIAkuZHJpdmVyIAk9IHsKIAkJLm5hbWUJCT0gKGNoYXIgKikgc2hvcnRuYW1lLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS8vIC5zaHV0ZG93biA9IC4uLgotCQkvLyAuc3VzcGVuZCA9IC4uLgotCQkvLyAucmVzdW1lID0gLi4uCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCmluZGV4IDUwOWRkMGEuLjUyNDZiMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZwpAQCAtMzcsNiArMzcsMTYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAorY29uZmlnIFVTQl9ISURJTlBVVF9QT1dFUkJPT0sKKwlib29sICJFbmFibGUgc3VwcG9ydCBmb3IgaUJvb2svUG93ZXJCb29rIHNwZWNpYWwga2V5cyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVTQl9ISURJTlBVVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIHNwZWNpYWwga2V5cyAoRm4sIE51bWxvY2spIG9uCisJICBBcHBsZSBpQm9va3MgYW5kIFBvd2VyQm9va3MuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBISURfRkYKIAlib29sICJGb3JjZSBmZWVkYmFjayBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gVVNCX0hJRElOUFVUICYmIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMKaW5kZXggNWY1Mjk3OS4uYTkxZTcyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCkBAIC0xNDUwLDYgKzE0NTAsOSBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0FQUExFCQkweDA1YWMKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9QT1dFUk1PVVNFCTB4MDMwNAogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0hFUlJZCQkweDA0NmEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DSEVSUllfQ1lNT1RJT04JMHgwMDIzCisKIC8qCiAgKiBBbHBoYWJldGljYWxseSBzb3J0ZWQgYmxhY2tsaXN0IGJ5IHF1aXJrIHR5cGUuCiAgKi8KQEAgLTE1ODAsNiArMTU4MywxNiBAQAogCXsgVVNCX1ZFTkRPUl9JRF9TQUlURUssIFVTQl9ERVZJQ0VfSURfU0FJVEVLX1JVTUJMRVBBRCwgSElEX1FVSVJLX0JBRFBBRCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9UT1BNQVgsIFVTQl9ERVZJQ0VfSURfVE9QTUFYX0NPQlJBUEFELCBISURfUVVJUktfQkFEUEFEIH0sCiAKKwl7IFVTQl9WRU5ET1JfSURfQ0hFUlJZLCBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTiwgSElEX1FVSVJLX0NZTU9USU9OIH0sCisKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIwRSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIwRiwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxNCwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxNSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxNiwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDMwQSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDMwQiwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwogCXsgMCwgMCB9CiB9OwogCkBAIC0xNjI2LDYgKzE2MzksMjAgQEAKIAkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgaGlkLT5idWZzaXplLCBoaWQtPmN0cmxidWYsIGhpZC0+Y3RybGJ1Zl9kbWEpOwogfQogCisvKgorICogQ2hlcnJ5IEN5bW90aW9uIGtleWJvYXJkIGhhdmUgYW4gaW52YWxpZCBISUQgcmVwb3J0IGRlc2NyaXB0b3IsCisgKiB0aGF0IG5lZWRzIGZpeGluZyBiZWZvcmUgd2UgY2FuIHBhcnNlIGl0LgorICovCisKK3N0YXRpYyB2b2lkIGhpZF9maXh1cF9jeW1vdGlvbl9kZXNjcmlwdG9yKGNoYXIgKnJkZXNjLCBpbnQgcnNpemUpCit7CisJaWYgKHJzaXplID49IDE3ICYmIHJkZXNjWzExXSA9PSAweDNjICYmIHJkZXNjWzEyXSA9PSAweDAyKSB7CisJCWluZm8oIkZpeGluZyB1cCBDaGVycnkgQ3ltb3Rpb24gcmVwb3J0IGRlc2NyaXB0b3IiKTsKKwkJcmRlc2NbMTFdID0gcmRlc2NbMTZdID0gMHhmZjsKKwkJcmRlc2NbMTJdID0gcmRlc2NbMTddID0gMHgwMzsKKwl9Cit9CisKIHN0YXRpYyBzdHJ1Y3QgaGlkX2RldmljZSAqdXNiX2hpZF9jb25maWd1cmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CkBAIC0xNjczLDYgKzE3MDAsOSBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwlpZiAoKHF1aXJrcyAmIEhJRF9RVUlSS19DWU1PVElPTikpCisJCWhpZF9maXh1cF9jeW1vdGlvbl9kZXNjcmlwdG9yKHJkZXNjLCByc2l6ZSk7CisKICNpZmRlZiBERUJVR19EQVRBCiAJcHJpbnRrKEtFUk5fREVCVUcgX19GSUxFX18gIjogcmVwb3J0IGRlc2NyaXB0b3IgKHNpemUgJXUsIHJlYWQgJWQpID0gIiwgcnNpemUsIG4pOwogCWZvciAobiA9IDA7IG4gPCByc2l6ZTsgbisrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWlucHV0LmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYwppbmRleCAxOTJhMDNiLi5jYjBkODBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYwpAQCAtNzMsNiArNzMsMTYwIEBACiAjZGVmaW5lIG1hcF9rZXlfY2xlYXIoYykJZG8geyBtYXBfa2V5KGMpOyBjbGVhcl9iaXQoYywgYml0KTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgbWFwX2ZmX2VmZmVjdChjKQlkbyB7IHNldF9iaXQoYywgaW5wdXQtPmZmYml0KTsgfSB3aGlsZSAoMCkKIAorI2lmZGVmIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LCisKK3N0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24geworCXUxNiBmcm9tOworCXUxNiB0bzsKKwl1OCBmbGFnczsKK307CisKKyNkZWZpbmUgUE9XRVJCT09LX0ZMQUdfRktFWSAweDAxCisKK3N0YXRpYyBzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uIHBvd2VyYm9va19mbl9rZXlzW10gPSB7CisJeyBLRVlfQkFDS1NQQUNFLCBLRVlfREVMRVRFIH0sCisJeyBLRVlfRjEsCUtFWV9CUklHSFRORVNTRE9XTiwJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YyLAlLRVlfQlJJR0hUTkVTU1VQLAlQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfRjMsCUtFWV9NVVRFLAkJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y0LAlLRVlfVk9MVU1FRE9XTiwJCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GNSwJS0VZX1ZPTFVNRVVQLAkJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y2LAlLRVlfTlVNTE9DSywJCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GNywJS0VZX1NXSVRDSFZJREVPTU9ERSwJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y4LAlLRVlfS0JESUxMVU1UT0dHTEUsCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GOSwJS0VZX0tCRElMTFVNRE9XTiwJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YxMCwJS0VZX0tCRElMTFVNVVAsCQlQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfVVAsCUtFWV9QQUdFVVAgfSwKKwl7IEtFWV9ET1dOLAlLRVlfUEFHRURPV04gfSwKKwl7IEtFWV9MRUZULAlLRVlfSE9NRSB9LAorCXsgS0VZX1JJR0hULAlLRVlfRU5EIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiBwb3dlcmJvb2tfbnVtbG9ja19rZXlzW10gPSB7CisJeyBLRVlfSiwJS0VZX0tQMSB9LAorCXsgS0VZX0ssCUtFWV9LUDIgfSwKKwl7IEtFWV9MLAlLRVlfS1AzIH0sCisJeyBLRVlfVSwJS0VZX0tQNCB9LAorCXsgS0VZX0ksCUtFWV9LUDUgfSwKKwl7IEtFWV9PLAlLRVlfS1A2IH0sCisJeyBLRVlfNywJS0VZX0tQNyB9LAorCXsgS0VZXzgsCUtFWV9LUDggfSwKKwl7IEtFWV85LAlLRVlfS1A5IH0sCisJeyBLRVlfTSwJS0VZX0tQMCB9LAorCXsgS0VZX0RPVCwJS0VZX0tQRE9UIH0sCisJeyBLRVlfU0xBU0gsCUtFWV9LUFBMVVMgfSwKKwl7IEtFWV9TRU1JQ09MT04sIEtFWV9LUE1JTlVTIH0sCisJeyBLRVlfUCwJS0VZX0tQQVNURVJJU0sgfSwKKwl7IEtFWV9NSU5VUywJS0VZX0tQRVFVQUwgfSwKKwl7IEtFWV8wLAlLRVlfS1BTTEFTSCB9LAorCXsgS0VZX0Y2LAlLRVlfTlVNTE9DSyB9LAorCXsgS0VZX0tQRU5URVIsCUtFWV9LUEVOVEVSIH0sCisJeyBLRVlfQkFDS1NQQUNFLCBLRVlfQkFDS1NQQUNFIH0sCisJeyB9Cit9OworCitzdGF0aWMgaW50IHVzYmhpZF9wYl9mbm1vZGUgPSAxOworbW9kdWxlX3BhcmFtX25hbWVkKHBiX2ZubW9kZSwgdXNiaGlkX3BiX2ZubW9kZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocGJfZm5tb2RlLAorCSJNb2RlIG9mIGZuIGtleSBvbiBQb3dlckJvb2tzICgwID0gZGlzYWJsZWQsIDEgPSBma2V5c2xhc3QsIDIgPSBma2V5c2ZpcnN0KSIpOworCitzdGF0aWMgc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiAqZmluZF90cmFuc2xhdGlvbihzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICp0YWJsZSwgdTE2IGZyb20pCit7CisJc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiAqdHJhbnM7CisKKwkvKiBMb29rIGZvciB0aGUgdHJhbnNsYXRpb24gKi8KKwlmb3IgKHRyYW5zID0gdGFibGU7IHRyYW5zLT5mcm9tOyB0cmFucysrKQorCQlpZiAodHJhbnMtPmZyb20gPT0gZnJvbSkKKwkJCXJldHVybiB0cmFuczsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGhpZGlucHV0X3BiX2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAorCQkJICAgICBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCit7CisJc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiAqdHJhbnM7CisKKwlpZiAodXNhZ2UtPmNvZGUgPT0gS0VZX0ZOKSB7CisJCWlmICh2YWx1ZSkgaGlkLT5xdWlya3MgfD0gIEhJRF9RVUlSS19QT1dFUkJPT0tfRk5fT047CisJCWVsc2UgICAgICAgaGlkLT5xdWlya3MgJj0gfkhJRF9RVUlSS19QT1dFUkJPT0tfRk5fT047CisKKwkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwgdmFsdWUpOworCisJCXJldHVybiAxOworCX0KKworCWlmICh1c2JoaWRfcGJfZm5tb2RlKSB7CisJCWludCBkb190cmFuc2xhdGU7CisKKwkJdHJhbnMgPSBmaW5kX3RyYW5zbGF0aW9uKHBvd2VyYm9va19mbl9rZXlzLCB1c2FnZS0+Y29kZSk7CisJCWlmICh0cmFucykgeworCQkJaWYgKHRlc3RfYml0KHVzYWdlLT5jb2RlLCBoaWQtPnBiX3ByZXNzZWRfZm4pKQorCQkJCWRvX3RyYW5zbGF0ZSA9IDE7CisJCQllbHNlIGlmICh0cmFucy0+ZmxhZ3MgJiBQT1dFUkJPT0tfRkxBR19GS0VZKQorCQkJCWRvX3RyYW5zbGF0ZSA9CisJCQkJCSh1c2JoaWRfcGJfZm5tb2RlID09IDIgJiYgIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19QT1dFUkJPT0tfRk5fT04pKSB8fAorCQkJCQkodXNiaGlkX3BiX2ZubW9kZSA9PSAxICYmICEoaGlkLT5xdWlya3MgJiBISURfUVVJUktfUE9XRVJCT09LX0ZOX09OKSk7CisJCQllbHNlCisJCQkJZG9fdHJhbnNsYXRlID0gKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX1BPV0VSQk9PS19GTl9PTik7CisKKwkJCWlmIChkb190cmFuc2xhdGUpIHsKKwkJCQlpZiAodmFsdWUpCisJCQkJCXNldF9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9mbik7CisJCQkJZWxzZQorCQkJCQljbGVhcl9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9mbik7CisKKwkJCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHRyYW5zLT50bywgdmFsdWUpOworCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKworCQlpZiAodGVzdF9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9udW1sb2NrKSB8fAorCQkgICAgdGVzdF9iaXQoTEVEX05VTUwsIGlucHV0LT5sZWQpKSB7CisJCQl0cmFucyA9IGZpbmRfdHJhbnNsYXRpb24ocG93ZXJib29rX251bWxvY2tfa2V5cywgdXNhZ2UtPmNvZGUpOworCisJCQlpZiAodHJhbnMpIHsKKwkJCQlpZiAodmFsdWUpCisJCQkJCXNldF9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9udW1sb2NrKTsKKwkJCQllbHNlCisJCQkJCWNsZWFyX2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX251bWxvY2spOworCisJCQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB0cmFucy0+dG8sIHZhbHVlKTsKKwkJCX0KKworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGlkaW5wdXRfcGJfc2V0dXAoc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCit7CisJc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiAqdHJhbnM7CisKKwlzZXRfYml0KEtFWV9OVU1MT0NLLCBpbnB1dC0+a2V5Yml0KTsKKworCS8qIEVuYWJsZSBhbGwgbmVlZGVkIGtleXMgKi8KKwlmb3IgKHRyYW5zID0gcG93ZXJib29rX2ZuX2tleXM7IHRyYW5zLT5mcm9tOyB0cmFucysrKQorCQlzZXRfYml0KHRyYW5zLT50bywgaW5wdXQtPmtleWJpdCk7CisKKwlmb3IgKHRyYW5zID0gcG93ZXJib29rX251bWxvY2tfa2V5czsgdHJhbnMtPmZyb207IHRyYW5zKyspCisJCXNldF9iaXQodHJhbnMtPnRvLCBpbnB1dC0+a2V5Yml0KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBoaWRpbnB1dF9wYl9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKKwkJCQkgICAgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGlkaW5wdXRfcGJfc2V0dXAoc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCit7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgaGlkaW5wdXRfY29uZmlndXJlX3VzYWdlKHN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKIAkJCQkgICAgIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlKQogewpAQCAtMTM1LDggKzI4OSwxMSBAQAogCQljYXNlIEhJRF9VUF9TSU1VTEFUSU9OOgogCiAJCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGZmZmYpIHsKLQkJCQljYXNlIDB4YmE6IG1hcF9hYnMoQUJTX1JVRERFUik7IGJyZWFrOworCQkJCWNhc2UgMHhiYTogbWFwX2FicyhBQlNfUlVEREVSKTsgICBicmVhazsKIAkJCQljYXNlIDB4YmI6IG1hcF9hYnMoQUJTX1RIUk9UVExFKTsgYnJlYWs7CisJCQkJY2FzZSAweGM0OiBtYXBfYWJzKEFCU19HQVMpOyAgICAgIGJyZWFrOworCQkJCWNhc2UgMHhjNTogbWFwX2FicyhBQlNfQlJBS0UpOyAgICBicmVhazsKKwkJCQljYXNlIDB4Yzg6IG1hcF9hYnMoQUJTX1dIRUVMKTsgICAgYnJlYWs7CiAJCQkJZGVmYXVsdDogICBnb3RvIGlnbm9yZTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjg5LDExICs0NDYsMTkgQEAKIAkJCQljYXNlIDB4MjI2OiBtYXBfa2V5X2NsZWFyKEtFWV9TVE9QKTsJCWJyZWFrOwogCQkJCWNhc2UgMHgyMjc6IG1hcF9rZXlfY2xlYXIoS0VZX1JFRlJFU0gpOwkJYnJlYWs7CiAJCQkJY2FzZSAweDIyYTogbWFwX2tleV9jbGVhcihLRVlfQk9PS01BUktTKTsJYnJlYWs7CisJCQkJY2FzZSAweDIzMzogbWFwX2tleV9jbGVhcihLRVlfU0NST0xMVVApOwlicmVhazsKKwkJCQljYXNlIDB4MjM0OiBtYXBfa2V5X2NsZWFyKEtFWV9TQ1JPTExET1dOKTsJYnJlYWs7CiAJCQkJY2FzZSAweDIzODogbWFwX3JlbChSRUxfSFdIRUVMKTsJCWJyZWFrOwogCQkJCWNhc2UgMHgyNzk6IG1hcF9rZXlfY2xlYXIoS0VZX1JFRE8pOwkJYnJlYWs7CiAJCQkJY2FzZSAweDI4OTogbWFwX2tleV9jbGVhcihLRVlfUkVQTFkpOwkJYnJlYWs7CiAJCQkJY2FzZSAweDI4YjogbWFwX2tleV9jbGVhcihLRVlfRk9SV0FSRE1BSUwpOwlicmVhazsKIAkJCQljYXNlIDB4MjhjOiBtYXBfa2V5X2NsZWFyKEtFWV9TRU5EKTsJCWJyZWFrOworCisJCQkJLyogUmVwb3J0ZWQgb24gYSBDaGVycnkgQ3ltb3Rpb24ga2V5Ym9hcmQgKi8KKwkJCQljYXNlIDB4MzAxOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMSk7CQlicmVhazsKKwkJCQljYXNlIDB4MzAyOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMik7CQlicmVhazsKKwkJCQljYXNlIDB4MzAzOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMyk7CQlicmVhazsKKwogCQkJCWRlZmF1bHQ6ICAgIGdvdG8gaWdub3JlOwogCQkJfQogCQkJYnJlYWs7CkBAIC0zMjUsNyArNDkwLDEyIEBACiAKIAkJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOwogCQkJc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJCQljYXNlIDB4MDAzOiBtYXBfa2V5X2NsZWFyKEtFWV9GTik7CQlicmVhazsKKwkJCQljYXNlIDB4MDAzOgorCQkJCQkvKiBUaGUgZm4ga2V5IG9uIEFwcGxlIFBvd2VyQm9va3MgKi8KKwkJCQkJbWFwX2tleV9jbGVhcihLRVlfRk4pOworCQkJCQloaWRpbnB1dF9wYl9zZXR1cChpbnB1dCk7CisJCQkJCWJyZWFrOworCiAJCQkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7CiAJCQl9CiAJCQlicmVhazsKQEAgLTQ4Miw2ICs2NTIsOSBAQAogCQlyZXR1cm47CiAJfQogCisJaWYgKChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOKSAmJiBoaWRpbnB1dF9wYl9ldmVudChoaWQsIGlucHV0LCB1c2FnZSwgdmFsdWUpKQorCQlyZXR1cm47CisKIAlpZiAodXNhZ2UtPmhhdF9taW4gPCB1c2FnZS0+aGF0X21heCB8fCB1c2FnZS0+aGF0X2RpcikgewogCQlpbnQgaGF0X2RpciA9IHVzYWdlLT5oYXRfZGlyOwogCQlpZiAoIWhhdF9kaXIpCkBAIC01MjQsNyArNjk3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmKCh1c2FnZS0+dHlwZSA9PSBFVl9LRVkpICYmICh1c2FnZS0+Y29kZSA9PSAwKSkgLyogS2V5IDAgaXMgInVuYXNzaWduZWQiLCBub3QgS0VZX1VOS05PV04gKi8KKwlpZiAoKHVzYWdlLT50eXBlID09IEVWX0tFWSkgJiYgKHVzYWdlLT5jb2RlID09IDApKSAvKiBLZXkgMCBpcyAidW5hc3NpZ25lZCIsIG5vdCBLRVlfVU5LTk9XTiAqLwogCQlyZXR1cm47CiAKIAlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHVzYWdlLT5jb2RlLCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQuaCBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oCmluZGV4IGVlNDhhMjIuLjhiMGQ0MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oCkBAIC0yMzUsMTcgKzIzNSwyMCBAQAogICogSElEIGRldmljZSBxdWlya3MuCiAgKi8KIAotI2RlZmluZSBISURfUVVJUktfSU5WRVJUCQkJMHgwMDEKLSNkZWZpbmUgSElEX1FVSVJLX05PVE9VQ0gJCQkweDAwMgotI2RlZmluZSBISURfUVVJUktfSUdOT1JFCQkJMHgwMDQKLSNkZWZpbmUgSElEX1FVSVJLX05PR0VUCQkJCTB4MDA4Ci0jZGVmaW5lIEhJRF9RVUlSS19ISURERVYJCQkweDAxMAotI2RlZmluZSBISURfUVVJUktfQkFEUEFECQkJMHgwMjAKLSNkZWZpbmUgSElEX1FVSVJLX01VTFRJX0lOUFVUCQkJMHgwNDAKLSNkZWZpbmUgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzcJCTB4MDgwCi0jZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181CQkweDEwMAotI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfT04JCTB4MjAwCi0jZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfUE9XRVJNT1VTRQkJMHg0MDAKKyNkZWZpbmUgSElEX1FVSVJLX0lOVkVSVAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSElEX1FVSVJLX05PVE9VQ0gJCQkweDAwMDAwMDAyCisjZGVmaW5lIEhJRF9RVUlSS19JR05PUkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIEhJRF9RVUlSS19OT0dFVAkJCQkweDAwMDAwMDA4CisjZGVmaW5lIEhJRF9RVUlSS19ISURERVYJCQkweDAwMDAwMDEwCisjZGVmaW5lIEhJRF9RVUlSS19CQURQQUQJCQkweDAwMDAwMDIwCisjZGVmaW5lIEhJRF9RVUlSS19NVUxUSV9JTlBVVAkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzcJCTB4MDAwMDAwODAKKyNkZWZpbmUgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzUJCTB4MDAwMDAxMDAKKyNkZWZpbmUgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLX09OCQkweDAwMDAwMjAwCisjZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfUE9XRVJNT1VTRQkJMHgwMDAwMDQwMAorI2RlZmluZSBISURfUVVJUktfQ1lNT1RJT04JCQkweDAwMDAwODAwCisjZGVmaW5lIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOCQkweDAwMDAxMDAwCisjZGVmaW5lIEhJRF9RVUlSS19QT1dFUkJPT0tfRk5fT04JCTB4MDAwMDIwMDAKIAogLyoKICAqIFRoaXMgaXMgdGhlIGdsb2JhbCBlbnZpcm9ubWVudCBvZiB0aGUgcGFyc2VyLiBUaGlzIGluZm9ybWF0aW9uIGlzCkBAIC00MzEsNiArNDM0LDExIEBACiAJdm9pZCAoKmZmX2V4aXQpKHN0cnVjdCBoaWRfZGV2aWNlKik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxlZCBieSBoaWRfZXhpdF9mZihoaWQpICovCiAJaW50ICgqZmZfZXZlbnQpKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAogCQkJdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpOworCisjaWZkZWYgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sKKwl1bnNpZ25lZCBsb25nIHBiX3ByZXNzZWRfZm5bTkJJVFMoS0VZX01BWCldOworCXVuc2lnbmVkIGxvbmcgcGJfcHJlc3NlZF9udW1sb2NrW05CSVRTKEtFWV9NQVgpXTsKKyNlbmRpZgogfTsKIAogI2RlZmluZSBISURfR0xPQkFMX1NUQUNLX1NJWkUgNApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvcGlkLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9waWQuYwppbmRleCAxOWUwMTVkLi5kOWQ5ZjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9waWQuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9waWQuYwpAQCAtMjU5LDcgKzI1OSw3IEBACiBpbnQgaGlkX3BpZF9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCiB7CiAJc3RydWN0IGhpZF9mZl9waWQgKnByaXZhdGU7Ci0Jc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQgPSBsaXN0X2VudHJ5KCZoaWQtPmlucHV0cywgc3RydWN0IGhpZF9pbnB1dCwgbGlzdCk7CisJc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQgPSBsaXN0X2VudHJ5KGhpZC0+aW5wdXRzLm5leHQsIHN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IGhpZGlucHV0LT5pbnB1dDsKIAogCXByaXZhdGUgPSBoaWQtPmZmX3ByaXZhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX2ZmX3BpZCksIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvd2Fjb20uYyBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmMKaW5kZXggNDhkZjRjZi4uZDNlMTVkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvd2Fjb20uYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5jCkBAIC05NSw3ICs5NSw3IEBACiBlbnVtIHsKIAlQRU5QQVJUTkVSID0gMCwKIAlHUkFQSElSRSwKLQlHNCwKKwlXQUNPTV9HNCwKIAlQTCwKIAlJTlRVT1MsCiAJSU5UVU9TMywKQEAgLTM3Myw3ICszNzMsNyBAQAogCiAJCQljYXNlIDI6IC8qIE1vdXNlIHdpdGggd2hlZWwgKi8KIAkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgZGF0YVsxXSAmIDB4MDQpOwotCQkJCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gRzQpIHsKKwkJCQlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IFdBQ09NX0c0KSB7CiAJCQkJCXJ3ID0gZGF0YVs3XSAmIDB4MDQgPyAtKGRhdGFbN10gJiAweDAzKSA6IChkYXRhWzddICYgMHgwMyk7CiAJCQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfV0hFRUwsIHJ3KTsKIAkJCQl9IGVsc2UKQEAgLTM4NSw3ICszODUsNyBAQAogCQkJCWlkID0gQ1VSU09SX0RFVklDRV9JRDsKIAkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIGRhdGFbMV0gJiAweDAxKTsKIAkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCBkYXRhWzFdICYgMHgwMik7Ci0JCQkJaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBHNCkKKwkJCQlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IFdBQ09NX0c0KQogCQkJCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0RJU1RBTkNFLCBkYXRhWzZdKTsKIAkJCQllbHNlCiAJCQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfRElTVEFOQ0UsIGRhdGFbN10pOwpAQCAtNDEwLDcgKzQxMCw3IEBACiAJaW5wdXRfc3luYyhkZXYpOwogCiAJLyogc2VuZCBwYWQgZGF0YSAqLwotCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gRzQpIHsKKwlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IFdBQ09NX0c0KSB7CiAJCS8qIGZpc3QgdGltZSBzZW5kaW5nIHBhZCBkYXRhICovCiAJCWlmICh3YWNvbS0+dG9vbFsxXSAhPSBCVE5fVE9PTF9GSU5HRVIpIHsKIAkJCXdhY29tLT5pZFsxXSA9IDA7CkBAIC03MTMsOCArNzEzLDggQEAKIAl7ICJXYWNvbSBHcmFwaGlyZTIgNXg3IiwgOCwgIDEzOTE4LCAxMDIwNiwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAogCXsgIldhY29tIEdyYXBoaXJlMyIsICAgICA4LCAgMTAyMDgsICA3NDI0LCAgNTExLCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCiAJeyAiV2Fjb20gR3JhcGhpcmUzIDZ4OCIsIDgsICAxNjcwNCwgMTIwNjQsICA1MTEsIDMyLCBHUkFQSElSRSwgICB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKLQl7ICJXYWNvbSBHcmFwaGlyZTQgNHg1IiwgOCwgIDEwMjA4LCAgNzQyNCwgIDUxMSwgMzIsIEc0LAkgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCi0JeyAiV2Fjb20gR3JhcGhpcmU0IDZ4OCIsIDgsICAxNjcwNCwgMTIwNjQsICA1MTEsIDMyLCBHNCwJIHdhY29tX2dyYXBoaXJlX2lycSB9LAorCXsgIldhY29tIEdyYXBoaXJlNCA0eDUiLCA4LCAgMTAyMDgsICA3NDI0LCAgNTExLCAzMiwgV0FDT01fRzQsCSB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKKwl7ICJXYWNvbSBHcmFwaGlyZTQgNng4IiwgOCwgIDE2NzA0LCAxMjA2NCwgIDUxMSwgMzIsIFdBQ09NX0c0LAkgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCiAJeyAiV2Fjb20gVm9saXRvIiwgICAgICAgIDgsICAgNTEwNCwgIDM3MTIsICA1MTEsIDMyLCBHUkFQSElSRSwgICB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKIAl7ICJXYWNvbSBQZW5TdGF0aW9uMiIsICAgOCwgICAzMjUwLCAgMjMyMCwgIDI1NSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAogCXsgIldhY29tIFZvbGl0bzIgNHg1IiwgICA4LCAgIDUxMDQsICAzNzEyLCAgNTExLCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCkBAIC04NTksNyArODU5LDcgQEAKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19QUkVTU1VSRSwgMCwgd2Fjb20tPmZlYXR1cmVzLT5wcmVzc3VyZV9tYXgsIDAsIDApOwogCiAJc3dpdGNoICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUpIHsKLQkJY2FzZSBHNDoKKwkJY2FzZSBXQUNPTV9HNDoKIAkJCWlucHV0X2Rldi0+ZXZiaXRbMF0gfD0gQklUKEVWX01TQyk7CiAJCQlpbnB1dF9kZXYtPm1zY2JpdFswXSB8PSBCSVQoTVNDX1NFUklBTCk7CiAJCQlpbnB1dF9kZXYtPmtleWJpdFtMT05HKEJUTl9ESUdJKV0gfD0gQklUKEJUTl9UT09MX0ZJTkdFUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvYnVzLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYnVzLmMKaW5kZXggNjY0MTM5YS4uZTlmOWY0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2J1cy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9idXMuYwpAQCAtMzcsMTEgKzM3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGJ1c190eXBlIHVzYl9zZXJpYWxfYnVzX3R5cGUgPSB7Ci0JLm5hbWUgPQkJInVzYi1zZXJpYWwiLAotCS5tYXRjaCA9CXVzYl9zZXJpYWxfZGV2aWNlX21hdGNoLAotfTsKLQogc3RhdGljIGludCB1c2Jfc2VyaWFsX2RldmljZV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciAqZHJpdmVyOwpAQCAtMTA5LDE0ICsxMDQsMTggQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdHJ1Y3QgYnVzX3R5cGUgdXNiX3NlcmlhbF9idXNfdHlwZSA9IHsKKwkubmFtZSA9CQkidXNiLXNlcmlhbCIsCisJLm1hdGNoID0JdXNiX3NlcmlhbF9kZXZpY2VfbWF0Y2gsCisJLnByb2JlID0JdXNiX3NlcmlhbF9kZXZpY2VfcHJvYmUsCisJLnJlbW92ZSA9CXVzYl9zZXJpYWxfZGV2aWNlX3JlbW92ZSwKK307CisKIGludCB1c2Jfc2VyaWFsX2J1c19yZWdpc3RlcihzdHJ1Y3QgdXNiX3NlcmlhbF9kcml2ZXIgKmRyaXZlcikKIHsKIAlpbnQgcmV0dmFsOwogCiAJZHJpdmVyLT5kcml2ZXIuYnVzID0gJnVzYl9zZXJpYWxfYnVzX3R5cGU7Ci0JZHJpdmVyLT5kcml2ZXIucHJvYmUgPSB1c2Jfc2VyaWFsX2RldmljZV9wcm9iZTsKLQlkcml2ZXItPmRyaXZlci5yZW1vdmUgPSB1c2Jfc2VyaWFsX2RldmljZV9yZW1vdmU7Ci0KIAlyZXR2YWwgPSBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJpdmVyKTsKIAogCXJldHVybiByZXR2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKaW5kZXggOWZmZmYxOS4uMGViODgzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYwpAQCAtNDMsOCArNDMsNiBAQAogI2RlZmluZSBQTDIzMDNfQlVGX1NJWkUJCTEwMjQKICNkZWZpbmUgUEwyMzAzX1RNUF9CVUZfU0laRQkxMDI0CiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKHBsMjMwM190bXBfYnVmX3NlbSk7Ci0KIHN0cnVjdCBwbDIzMDNfYnVmIHsKIAl1bnNpZ25lZCBpbnQJYnVmX3NpemU7CiAJY2hhcgkJKmJ1Zl9idWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2FtaWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2FtaWZiLmMKaW5kZXggZDU0OWUyMS4uMmM0MmE4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hbWlmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYW1pZmIuYwpAQCAtNTkwLDYgKzU5MCw4IEBACiAjZGVmaW5lIGhpZ2h3KHgpCSgodV9sb25nKSh4KT4+MTYgJiAweGZmZmYpCiAjZGVmaW5lIGxvd3coeCkJCSgodV9sb25nKSh4KSAmIDB4ZmZmZikKIAorI2RlZmluZSBjdXN0b20JCWFtaWdhX2N1c3RvbQorCiAjZGVmaW5lIFZCbGFua09uKCkJY3VzdG9tLmludGVuYSA9IElGX1NFVENMUnxJRl9DT1BFUgogI2RlZmluZSBWQmxhbmtPZmYoKQljdXN0b20uaW50ZW5hID0gSUZfQ09QRVIKIApAQCAtMTE2NCw4ICsxMTY2LDggQEAKIHN0YXRpYyB2b2lkIGFtaV9pbml0X2Rpc3BsYXkodm9pZCk7CiBzdGF0aWMgdm9pZCBhbWlfZG9fYmxhbmsodm9pZCk7CiBzdGF0aWMgaW50IGFtaV9nZXRfZml4X2N1cnNvcmluZm8oc3RydWN0IGZiX2ZpeF9jdXJzb3JpbmZvICpmaXgpOwotc3RhdGljIGludCBhbWlfZ2V0X3Zhcl9jdXJzb3JpbmZvKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyAqdmFyLCB1X2NoYXIgKmRhdGEpOwotc3RhdGljIGludCBhbWlfc2V0X3Zhcl9jdXJzb3JpbmZvKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyAqdmFyLCB1X2NoYXIgKmRhdGEpOworc3RhdGljIGludCBhbWlfZ2V0X3Zhcl9jdXJzb3JpbmZvKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyAqdmFyLCB1X2NoYXIgX191c2VyICpkYXRhKTsKK3N0YXRpYyBpbnQgYW1pX3NldF92YXJfY3Vyc29yaW5mbyhzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gKnZhciwgdV9jaGFyIF9fdXNlciAqZGF0YSk7CiBzdGF0aWMgaW50IGFtaV9nZXRfY3Vyc29yc3RhdGUoc3RydWN0IGZiX2N1cnNvcnN0YXRlICpzdGF0ZSk7CiBzdGF0aWMgaW50IGFtaV9zZXRfY3Vyc29yc3RhdGUoc3RydWN0IGZiX2N1cnNvcnN0YXRlICpzdGF0ZSk7CiBzdGF0aWMgdm9pZCBhbWlfc2V0X3Nwcml0ZSh2b2lkKTsKQEAgLTIxNzksNiArMjE4MSw3IEBACiAJCXN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyB2YXI7CiAJCXN0cnVjdCBmYl9jdXJzb3JzdGF0ZSBzdGF0ZTsKIAl9IGNyc3I7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IGk7CiAKIAlzd2l0Y2ggKGNtZCkgewpAQCAtMjE4NiwzMyArMjE4OSwzMiBAQAogCQkJaSA9IGFtaV9nZXRfZml4X2N1cnNvcmluZm8oJmNyc3IuZml4KTsKIAkJCWlmIChpKQogCQkJCXJldHVybiBpOwotCQkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNyc3IuZml4LAorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmY3Jzci5maXgsCiAJCQkJCSAgICBzaXplb2YoY3Jzci5maXgpKSA/IC1FRkFVTFQgOiAwOwogCiAJCWNhc2UgRkJJT0dFVF9WQ1VSU09SSU5GTzoKIAkJCWkgPSBhbWlfZ2V0X3Zhcl9jdXJzb3JpbmZvKCZjcnNyLnZhciwKLQkJCQkoKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyAqKWFyZyktPmRhdGEpOworCQkJCSgoc3RydWN0IGZiX3Zhcl9jdXJzb3JpbmZvIF9fdXNlciAqKWFyZyktPmRhdGEpOwogCQkJaWYgKGkpCiAJCQkJcmV0dXJuIGk7Ci0JCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY3Jzci52YXIsCisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZjcnNyLnZhciwKIAkJCQkJICAgIHNpemVvZihjcnNyLnZhcikpID8gLUVGQVVMVCA6IDA7CiAKIAkJY2FzZSBGQklPUFVUX1ZDVVJTT1JJTkZPOgotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjcnNyLnZhciwgKHZvaWQgKilhcmcsCi0JCQkJCSAgIHNpemVvZihjcnNyLnZhcikpKQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjcnNyLnZhciwgYXJncCwgc2l6ZW9mKGNyc3IudmFyKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlyZXR1cm4gYW1pX3NldF92YXJfY3Vyc29yaW5mbygmY3Jzci52YXIsCi0JCQkJKChzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gKilhcmcpLT5kYXRhKTsKKwkJCQkoKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyBfX3VzZXIgKilhcmcpLT5kYXRhKTsKIAogCQljYXNlIEZCSU9HRVRfQ1VSU09SU1RBVEU6CiAJCQlpID0gYW1pX2dldF9jdXJzb3JzdGF0ZSgmY3Jzci5zdGF0ZSk7CiAJCQlpZiAoaSkKIAkJCQlyZXR1cm4gaTsKLQkJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjcnNyLnN0YXRlLAorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmY3Jzci5zdGF0ZSwKIAkJCQkJICAgIHNpemVvZihjcnNyLnN0YXRlKSkgPyAtRUZBVUxUIDogMDsKIAogCQljYXNlIEZCSU9QVVRfQ1VSU09SU1RBVEU6Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmNyc3Iuc3RhdGUsICh2b2lkICopYXJnLAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjcnNyLnN0YXRlLCBhcmdwLAogCQkJCQkgICBzaXplb2YoY3Jzci5zdGF0ZSkpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJcmV0dXJuIGFtaV9zZXRfY3Vyc29yc3RhdGUoJmNyc3Iuc3RhdGUpOwpAQCAtMzMyNSw3ICszMzI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhbWlfZ2V0X3Zhcl9jdXJzb3JpbmZvKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyAqdmFyLCB1X2NoYXIgKmRhdGEpCitzdGF0aWMgaW50IGFtaV9nZXRfdmFyX2N1cnNvcmluZm8oc3RydWN0IGZiX3Zhcl9jdXJzb3JpbmZvICp2YXIsIHVfY2hhciBfX3VzZXIgKmRhdGEpCiB7CiAJc3RydWN0IGFtaWZiX3BhciAqcGFyID0gJmN1cnJlbnRwYXI7CiAJcmVnaXN0ZXIgdV9zaG9ydCAqbHNwciwgKnNzcHI7CkBAIC0zMzQ3LDE0ICszMzQ5LDE0IEBACiAJdmFyLT55c3BvdCA9IHBhci0+Y3Jzci5zcG90X3k7CiAJaWYgKHNpemUgPiB2YXItPmhlaWdodCp2YXItPndpZHRoKQogCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkICopZGF0YSwgc2l6ZSkpCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkYXRhLCBzaXplKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJZGVsdGEgPSAxPDxwYXItPmNyc3IuZm1vZGU7CiAJbHNwciA9IGxvZnNwcml0ZSArIChkZWx0YTw8MSk7CiAJaWYgKHBhci0+YnBsY29uMCAmIEJQQzBfTEFDRSkKIAkJc3NwciA9IHNoZnNwcml0ZSArIChkZWx0YTw8MSk7CiAJZWxzZQotCQlzc3ByID0gMDsKKwkJc3NwciA9IE5VTEw7CiAJZm9yIChoZWlnaHQgPSAoc2hvcnQpdmFyLT5oZWlnaHQtMTsgaGVpZ2h0ID49IDA7IGhlaWdodC0tKSB7CiAJCWJpdHMgPSAwOyB3b3JkcyA9IGRlbHRhOyBkYXRhd29yZHMgPSAwOwogCQlmb3IgKHdpZHRoID0gKHNob3J0KXZhci0+d2lkdGgtMTsgd2lkdGggPj0gMDsgd2lkdGgtLSkgewpAQCAtMzQwMCw3ICszNDAyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhbWlfc2V0X3Zhcl9jdXJzb3JpbmZvKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyAqdmFyLCB1X2NoYXIgKmRhdGEpCitzdGF0aWMgaW50IGFtaV9zZXRfdmFyX2N1cnNvcmluZm8oc3RydWN0IGZiX3Zhcl9jdXJzb3JpbmZvICp2YXIsIHVfY2hhciBfX3VzZXIgKmRhdGEpCiB7CiAJc3RydWN0IGFtaWZiX3BhciAqcGFyID0gJmN1cnJlbnRwYXI7CiAJcmVnaXN0ZXIgdV9zaG9ydCAqbHNwciwgKnNzcHI7CkBAIC0zNDI3LDcgKzM0MjksNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIXZhci0+aGVpZ2h0KQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgKHZvaWQgKilkYXRhLCB2YXItPndpZHRoKnZhci0+aGVpZ2h0KSkKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZGF0YSwgdmFyLT53aWR0aCp2YXItPmhlaWdodCkpCiAJCXJldHVybiAtRUZBVUxUOwogCWRlbHRhID0gMTw8Zm1vZGU7CiAJbG9mc3ByaXRlID0gc2hmc3ByaXRlID0gKHVfc2hvcnQgKilzcHJpdGVtZW1vcnk7CkBAIC0zNDQyLDEzICszNDQ0LDEzIEBACiAJCWlmICgoKHZhci0+aGVpZ2h0KzIpPDxmbW9kZTw8MikgPiBTUFJJVEVNRU1TSVpFKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCW1lbXNldChsc3ByLCAwLCAodmFyLT5oZWlnaHQrMik8PGZtb2RlPDwyKTsKLQkJc3NwciA9IDA7CisJCXNzcHIgPSBOVUxMOwogCX0KIAlmb3IgKGhlaWdodCA9IChzaG9ydCl2YXItPmhlaWdodC0xOyBoZWlnaHQgPj0gMDsgaGVpZ2h0LS0pIHsKIAkJYml0cyA9IDE2OyB3b3JkcyA9IGRlbHRhOyBkYXRhd29yZHMgPSAwOwogCQlmb3IgKHdpZHRoID0gKHNob3J0KXZhci0+d2lkdGgtMTsgd2lkdGggPj0gMDsgd2lkdGgtLSkgewogCQkJdW5zaWduZWQgbG9uZyB0ZGF0YSA9IDA7Ci0JCQlnZXRfdXNlcih0ZGF0YSwgKGNoYXIgKilkYXRhKTsKKwkJCWdldF91c2VyKHRkYXRhLCBkYXRhKTsKIAkJCWRhdGErKzsKICNpZmRlZiBfX21jNjgwMDBfXwogCQkJYXNtIHZvbGF0aWxlICgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYwppbmRleCBlMzcwMTI1Li5lZDgxMDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCkBAIC0zNTAxLDcgKzM1MDEsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhdHlmYl9hdGFyaV9wcm9iZSh2b2lkKQogewotCXN0cnVjdCBhdHlfcGFyICpwYXI7CisJc3RydWN0IGF0eWZiX3BhciAqcGFyOwogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCWludCBtNjRfbnVtOwogCXUzMiBjbG9ja19yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYWNmYi5jIGIvZHJpdmVycy92aWRlby9tYWNmYi5jCmluZGV4IGNmYzc0OGUuLmU2Y2JkOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWFjZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hY2ZiLmMKQEAgLTYwOSwxOCArNjA5LDE5IEBACiAJfQogfQogCi12b2lkIF9faW5pdCBtYWNmYl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBtYWNmYl9pbml0KHZvaWQpCiB7CiAJaW50IHZpZGVvX2NtYXBfbGVuLCB2aWRlb19pc19udWJ1cyA9IDA7CiAJc3RydWN0IG51YnVzX2RldiogbmRldiA9IE5VTEw7CiAJY2hhciAqb3B0aW9uID0gTlVMTDsKKwlpbnQgZXJyOwogCiAJaWYgKGZiX2dldF9vcHRpb25zKCJtYWNmYiIsICZvcHRpb24pKQogCQlyZXR1cm4gLUVOT0RFVjsKIAltYWNmYl9zZXR1cChvcHRpb24pOwogCiAJaWYgKCFNQUNIX0lTX01BQykgCi0JCXJldHVybjsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBUaGVyZSBjYW4gb25seSBiZSBvbmUgaW50ZXJuYWwgdmlkZW8gY29udHJvbGxlciBhbnl3YXkgc28KIAkgICB3ZSdyZSBub3QgdG9vIHdvcnJpZWQgYWJvdXQgdGhpcyAqLwpAQCAtOTU4LDExICs5NTksMTEgQEAKIAogCWZiX2FsbG9jX2NtYXAoJmZiX2luZm8uY21hcCwgdmlkZW9fY21hcF9sZW4sIDApOwogCQotCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmZmJfaW5mbykgPCAwKQotCQlyZXR1cm47Ci0KLQlwcmludGsoImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsCi0JICAgICAgIGZiX2luZm8ubm9kZSwgZmJfaW5mby5maXguaWQpOworCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYl9pbmZvKTsKKwlpZiAoIWVycikKKwkJcHJpbnRrKCJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlXG4iLAorCQkgICAgICAgZmJfaW5mby5ub2RlLCBmYl9pbmZvLmZpeC5pZCk7CisJcmV0dXJuIGVycjsKIH0KIAogbW9kdWxlX2luaXQobWFjZmJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3pvcnJvL3Byb2MuYyBiL2RyaXZlcnMvem9ycm8vcHJvYy5jCmluZGV4IDFhNDA5YzIuLjdhYTJkM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvem9ycm8vcHJvYy5jCisrKyBiL2RyaXZlcnMvem9ycm8vcHJvYy5jCkBAIC00NSw3ICs0NSw3IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90Ci1wcm9jX2J1c196b3Jyb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3Byb2NfYnVzX3pvcnJvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlubyA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvem9ycm8vem9ycm8tZHJpdmVyLmMgYi9kcml2ZXJzL3pvcnJvL3pvcnJvLWRyaXZlci5jCmluZGV4IGNjYmEyMjcuLmZjYmVlNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvem9ycm8vem9ycm8tZHJpdmVyLmMKKysrIGIvZHJpdmVycy96b3Jyby96b3Jyby1kcml2ZXIuYwpAQCAtNzcsNyArNzcsNiBAQAogCS8qIGluaXRpYWxpemUgY29tbW9uIGRyaXZlciBmaWVsZHMgKi8KIAlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZ6b3Jyb19idXNfdHlwZTsKLQlkcnYtPmRyaXZlci5wcm9iZSA9IHpvcnJvX2RldmljZV9wcm9iZTsKIAogCS8qIHJlZ2lzdGVyIHdpdGggY29yZSAqLwogCWNvdW50ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CkBAIC0xMzIsNyArMTMxLDggQEAKIAogc3RydWN0IGJ1c190eXBlIHpvcnJvX2J1c190eXBlID0gewogCS5uYW1lCT0gInpvcnJvIiwKLQkubWF0Y2gJPSB6b3Jyb19idXNfbWF0Y2gKKwkubWF0Y2gJPSB6b3Jyb19idXNfbWF0Y2gsCisJLnByb2JlCT0gem9ycm9fZGV2aWNlX3Byb2JlLAogfTsKIAogCmRpZmYgLS1naXQgYS9mcy9jb21wYXRfaW9jdGwuYyBiL2ZzL2NvbXBhdF9pb2N0bC5jCmluZGV4IGYwYjcyNTYuLjVkZDAyMDcgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdF9pb2N0bC5jCisrKyBiL2ZzL2NvbXBhdF9pb2N0bC5jCkBAIC0xMjIsNiArMTIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kdmIvZG14Lmg+CiAjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvZHZiL3ZpZGVvLmg+CisjaW5jbHVkZSA8bGludXgvbHAuaD4KIAogLyogQWllZS4gU29tZW9uZSBkb2VzIG5vdCBmaW5kIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGludCBhbmQgbG9uZyAqLwogI2RlZmluZSBFWFQyX0lPQzMyX0dFVEZMQUdTICAgICAgICAgICAgICAgX0lPUignZicsIDEsIGludCkKQEAgLTI3MzUsNiArMjczNiwyMCBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbnQKK2xwX3RpbWVvdXRfdHJhbnModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgKnRjID0gKHN0cnVjdCBjb21wYXRfdGltZXZhbCAqKWFyZzsKKwlzdHJ1Y3QgdGltZXZhbCAqdG4gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKKwlzdHJ1Y3QgdGltZXZhbCB0czsKKwlpZiAoZ2V0X3VzZXIodHMudHZfc2VjLCAmdGMtPnR2X3NlYykgfHwKKwkgICAgZ2V0X3VzZXIodHMudHZfdXNlYywgJnRjLT50dl91c2VjKSB8fAorCSAgICBwdXRfdXNlcih0cy50dl9zZWMsICZ0bi0+dHZfc2VjKSB8fAorCSAgICBwdXRfdXNlcih0cy50dl91c2VjLCAmdG4tPnR2X3VzZWMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKXRuKTsKK30KKwogI2RlZmluZSBIQU5ETEVfSU9DVEwoY21kLGhhbmRsZXIpIFwKIAl7IChjbWQpLCAoaW9jdGxfdHJhbnNfaGFuZGxlcl90KShoYW5kbGVyKSB9LAogCkBAIC0yOTYyLDYgKzI5NzcsMjAgQEAKIEhBTkRMRV9JT0NUTChWSURFT19HRVRfRVZFTlQsIGRvX3ZpZGVvX2dldF9ldmVudCkKIEhBTkRMRV9JT0NUTChWSURFT19TVElMTFBJQ1RVUkUsIGRvX3ZpZGVvX3N0aWxscGljdHVyZSkKIEhBTkRMRV9JT0NUTChWSURFT19TRVRfU1BVX1BBTEVUVEUsIGRvX3ZpZGVvX3NldF9zcHVfcGFsZXR0ZSkKKworLyogcGFycG9ydCAqLworQ09NUEFUSUJMRV9JT0NUTChMUFRJTUUpCitDT01QQVRJQkxFX0lPQ1RMKExQQ0hBUikKK0NPTVBBVElCTEVfSU9DVEwoTFBBQk9SVE9QRU4pCitDT01QQVRJQkxFX0lPQ1RMKExQQ0FSRUZVTCkKK0NPTVBBVElCTEVfSU9DVEwoTFBXQUlUKQorQ09NUEFUSUJMRV9JT0NUTChMUFNFVElSUSkKK0NPTVBBVElCTEVfSU9DVEwoTFBHRVRTVEFUVVMpCitDT01QQVRJQkxFX0lPQ1RMKExQR0VUU1RBVFVTKQorQ09NUEFUSUJMRV9JT0NUTChMUFJFU0VUKQorLypMUEdFVFNUQVRTIG5vdCBpbXBsZW1lbnRlZCwgYnV0IG5vIGtlcm5lbHMgc2VlbSB0byBjb21waWxlIGl0IGluIGFueXdheXMqLworQ09NUEFUSUJMRV9JT0NUTChMUEdFVEZMQUdTKQorSEFORExFX0lPQ1RMKExQU0VUVElNRU9VVCwgbHBfdGltZW91dF90cmFucykKIH07CiAKIGludCBpb2N0bF90YWJsZV9zaXplID0gQVJSQVlfU0laRShpb2N0bF9zdGFydCk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfZGV2dHJlZS5jIGIvZnMvcHJvYy9wcm9jX2RldnRyZWUuYwppbmRleCBmYjExN2I3Li45YmRkMDc3IDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfZGV2dHJlZS5jCisrKyBiL2ZzL3Byb2MvcHJvY19kZXZ0cmVlLmMKQEAgLTgxLDYgKzgxLDMwIEBACiAJX19wcm9jX2RldmljZV90cmVlX2FkZF9wcm9wKHBkZSwgcHJvcCk7CiB9CiAKK3ZvaWQgcHJvY19kZXZpY2VfdHJlZV9yZW1vdmVfcHJvcChzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSwKKwkJCQkgIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeShwcm9wLT5uYW1lLCBwZGUpOworfQorCit2b2lkIHByb2NfZGV2aWNlX3RyZWVfdXBkYXRlX3Byb3Aoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUsCisJCQkJICBzdHJ1Y3QgcHJvcGVydHkgKm5ld3Byb3AsCisJCQkJICBzdHJ1Y3QgcHJvcGVydHkgKm9sZHByb3ApCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisKKwlmb3IgKGVudCA9IHBkZS0+c3ViZGlyOyBlbnQgIT0gTlVMTDsgZW50ID0gZW50LT5uZXh0KQorCQlpZiAoZW50LT5kYXRhID09IG9sZHByb3ApCisJCQlicmVhazsKKwlpZiAoZW50ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZGV2aWNlLXRyZWU6IHByb3BlcnR5IFwiJXNcIiAiCisJCSAgICAgICAiIGRvZXMgbm90IGV4aXN0XG4iLCBvbGRwcm9wLT5uYW1lKTsKKwl9IGVsc2UgeworCQllbnQtPmRhdGEgPSBuZXdwcm9wOworCQllbnQtPnNpemUgPSBuZXdwcm9wLT5sZW5ndGg7CisJfQorfQorCiAvKgogICogUHJvY2VzcyBhIG5vZGUsIGFkZGluZyBlbnRyaWVzIGZvciBpdHMgY2hpbGRyZW4gYW5kIGl0cyBwcm9wZXJ0aWVzLgogICovCmRpZmYgLS1naXQgYS9mcy91ZnMvYmFsbG9jLmMgYi9mcy91ZnMvYmFsbG9jLmMKaW5kZXggYTlmNDQyMS4uM2FkYTlkYyAxMDA2NDQKLS0tIGEvZnMvdWZzL2JhbGxvYy5jCisrKyBiL2ZzL3Vmcy9iYWxsb2MuYwpAQCAtNDksNyArNDksNyBAQAogCQogCXNiID0gaW5vZGUtPmlfc2I7CiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKIAkKIAlVRlNEKCgiRU5URVIsIGZyYWdtZW50ICV1LCBjb3VudCAldVxuIiwgZnJhZ21lbnQsIGNvdW50KSkKIAkKQEAgLTgxLDggKzgxLDkgQEAKIAlmb3IgKGkgPSBiaXQ7IGkgPCBlbmRfYml0OyBpKyspIHsKIAkJaWYgKHViaF9pc2NsciAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgaSkpCiAJCQl1Ymhfc2V0Yml0IChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBpKTsKLQkJZWxzZSB1ZnNfZXJyb3IgKHNiLCAidWZzX2ZyZWVfZnJhZ21lbnRzIiwKLQkJCSJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBmcmFnbWVudCAldSIsIGkpOworCQllbHNlIAorCQkJdWZzX2Vycm9yIChzYiwgInVmc19mcmVlX2ZyYWdtZW50cyIsCisJCQkJICAgImJpdCBhbHJlYWR5IGNsZWFyZWQgZm9yIGZyYWdtZW50ICV1IiwgaSk7CiAJfQogCQogCURRVU9UX0ZSRUVfQkxPQ0sgKGlub2RlLCBjb3VudCk7CkBAIC0xNDMsNyArMTQ0LDcgQEAKIAkKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CiAKIAlVRlNEKCgiRU5URVIsIGZyYWdtZW50ICV1LCBjb3VudCAldVxuIiwgZnJhZ21lbnQsIGNvdW50KSkKIAkKQEAgLTI0Nyw3ICsyNDgsNyBAQAogCQogCXNiID0gaW5vZGUtPmlfc2I7CiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKIAkqZXJyID0gLUVOT1NQQzsKIAogCWxvY2tfc3VwZXIgKHNiKTsKQEAgLTQwNyw3ICs0MDgsNyBAQAogCQogCXNiID0gaW5vZGUtPmlfc2I7CiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QgKFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QgKHVzcGkpOwogCWNvdW50ID0gbmV3Y291bnQgLSBvbGRjb3VudDsKIAkKIAljZ25vID0gdWZzX2R0b2coZnJhZ21lbnQpOwpAQCAtNDkwLDcgKzQ5MSw3IEBACiAKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CiAJb2xkY2cgPSBjZ25vOwogCQogCS8qCkBAIC02MDYsNyArNjA3LDcgQEAKIAogCXNiID0gaW5vZGUtPmlfc2I7CiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKIAl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCk7CiAKIAlpZiAoZ29hbCA9PSAwKSB7CkBAIC02NjMsNyArNjY0LDcgQEAKIAlVRlNEKCgiRU5URVIsIGNnICV1LCBnb2FsICV1LCBjb3VudCAldVxuIiwgdWNwaS0+Y19jZ3gsIGdvYWwsIGNvdW50KSkKIAogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0IChVU1BJX1VCSCk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0ICh1c3BpKTsKIAl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCk7CiAKIAlpZiAoZ29hbCkKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9pYWxsb2MuYyBiL2ZzL3Vmcy9pYWxsb2MuYwppbmRleCAwOTM4OTQ1Li5jN2E0N2VkIDEwMDY0NAotLS0gYS9mcy91ZnMvaWFsbG9jLmMKKysrIGIvZnMvdWZzL2lhbGxvYy5jCkBAIC03Miw3ICs3Miw3IEBACiAKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CiAJCiAJaW5vID0gaW5vZGUtPmlfaW5vOwogCkBAIC0xNjcsNyArMTY3LDcgQEAKIAl1ZnNpID0gVUZTX0koaW5vZGUpOwogCXNiaSA9IFVGU19TQihzYik7CiAJdXNwaSA9IHNiaS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOwogCiAJbG9ja19zdXBlciAoc2IpOwogCmRpZmYgLS1naXQgYS9mcy91ZnMvaW5vZGUuYyBiL2ZzL3Vmcy9pbm9kZS5jCmluZGV4IDU1ZjRhYTEuLmUwYzA0ZTMgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy9pbm9kZS5jCisrKyBiL2ZzL3Vmcy9pbm9kZS5jCkBAIC02MSw3ICs2MSw3IEBACiAJaW50IG4gPSAwOwogCiAKLQlVRlNEKCgicHRycz11c3BpLT5zX2FwYiA9ICVkLGRvdWJsZV9ibG9ja3M9JWQgXG4iLHB0cnMsZG91YmxlX2Jsb2NrcykpOworCVVGU0QoKCJwdHJzPXVzcGktPnNfYXBiID0gJWQsZG91YmxlX2Jsb2Nrcz0lbGQgXG4iLHB0cnMsZG91YmxlX2Jsb2NrcykpOwogCWlmIChpX2Jsb2NrIDwgMCkgewogCQl1ZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgInVmc19ibG9ja190b19wYXRoIiwgImJsb2NrIDwgMCIpOwogCX0gZWxzZSBpZiAoaV9ibG9jayA8IGRpcmVjdF9ibG9ja3MpIHsKQEAgLTEwNCw3ICsxMDQsNyBAQAogCXVuc2lnbmVkIGZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKIAl1NjQgdGVtcCA9IDBMOwogCi0JVUZTRCgoIjogZnJhZyA9ICVsdSAgZGVwdGggPSAlZFxuIixmcmFnLGRlcHRoKSk7CisJVUZTRCgoIjogZnJhZyA9ICVsbHUgIGRlcHRoID0gJWRcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhZywgZGVwdGgpKTsKIAlVRlNEKCgiOiB1c3BpLT5zX2ZwYnNoaWZ0ID0gJWQgLHVzcGktPnNfYXBibWFzayA9ICV4LCBtYXNrPSVsbHhcbiIsdXNwaS0+c19mcGJzaGlmdCx1c3BpLT5zX2FwYm1hc2ssbWFzaykpOwogCiAJaWYgKGRlcHRoID09IDApCkBAIC0zNjUsOSArMzY1LDEwIEBACiAJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKIAlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJVUZTRCgoInJlc3VsdCAldVxuIiwgdG1wICsgYmxvY2tvZmYpKTsKIG91dDoKIAlicmVsc2UgKGJoKTsKLQlVRlNEKCgiRVhJVCwgcmVzdWx0ICV1XG4iLCB0bXAgKyBibG9ja29mZikpCisJVUZTRCgoIkVYSVRcbiIpKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0zODYsNyArMzg3LDcgQEAKIAkKIAlpZiAoIWNyZWF0ZSkgewogCQlwaHlzNjQgPSB1ZnNfZnJhZ19tYXAoaW5vZGUsIGZyYWdtZW50KTsKLQkJVUZTRCgoInBoeXM2NCA9ICVsdSBcbiIscGh5czY0KSk7CisJCVVGU0QoKCJwaHlzNjQgPSAlbGx1IFxuIixwaHlzNjQpKTsKIAkJaWYgKHBoeXM2NCkKIAkJCW1hcF9iaChiaF9yZXN1bHQsIHNiLCBwaHlzNjQpOwogCQlyZXR1cm4gMDsKQEAgLTQwMSw3ICs0MDIsNyBAQAogCiAJbG9ja19rZXJuZWwoKTsKIAotCVVGU0QoKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJXVcbiIsIGlub2RlLT5pX2lubywgZnJhZ21lbnQpKQorCVVGU0QoKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJWxsdVxuIiwgaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZyBsb25nKWZyYWdtZW50KSkKIAlpZiAoZnJhZ21lbnQgPCAwKQogCQlnb3RvIGFib3J0X25lZ2F0aXZlOwogCWlmIChmcmFnbWVudCA+CmRpZmYgLS1naXQgYS9mcy91ZnMvc3VwZXIuYyBiL2ZzL3Vmcy9zdXBlci5jCmluZGV4IGU5YTQyYzcuLmQ0YWFjZWUgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy9zdXBlci5jCisrKyBiL2ZzL3Vmcy9zdXBlci5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIAl2YV9saXN0IGFyZ3M7CiAKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOwogCQogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewogCQl1c2IxLT5mc19jbGVhbiA9IFVGU19GU0JBRDsKQEAgLTI1Myw3ICsyNTMsNyBAQAogCXZhX2xpc3QgYXJnczsKIAkKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOwogCQogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewogCQl1c2IxLT5mc19jbGVhbiA9IFVGU19GU0JBRDsKQEAgLTQyMCwyMSArNDIwLDE4IEBACiAJCWlmIChpICsgdXNwaS0+c19mcGIgPiBibGtzKQogCQkJc2l6ZSA9IChibGtzIC0gaSkgKiB1c3BpLT5zX2ZzaXplOwogCi0JCWlmICgoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKSB7CisJCWlmICgoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKSAKIAkJCXViaCA9IHViaF9icmVhZChzYiwKIAkJCQlmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfY3NhZGRyKSArIGksIHNpemUpOwotCQkJaWYgKCF1YmgpCi0JCQkJZ290byBmYWlsZWQ7Ci0JCQl1YmhfdWJoY3B5bWVtIChzcGFjZSwgdWJoLCBzaXplKTsKLQkJCXNiaS0+c19jc3BbdWZzX2ZyYWdzdG9ibGtzKGkpXT0oc3RydWN0IHVmc19jc3VtICopc3BhY2U7Ci0JCX0KLQkJZWxzZSB7CisJCWVsc2UgCiAJCQl1YmggPSB1YmhfYnJlYWQoc2IsIHVzcGktPnNfY3NhZGRyICsgaSwgc2l6ZSk7Ci0JCQlpZiAoIXViaCkKLQkJCQlnb3RvIGZhaWxlZDsKLQkJCXViaF91YmhjcHltZW0oc3BhY2UsIHViaCwgc2l6ZSk7Ci0JCQlzYmktPnNfY3NwW3Vmc19mcmFnc3RvYmxrcyhpKV09KHN0cnVjdCB1ZnNfY3N1bSAqKXNwYWNlOwotCQl9CisJCQorCQlpZiAoIXViaCkKKwkJCWdvdG8gZmFpbGVkOworCisJCXViaF91YmhjcHltZW0gKHNwYWNlLCB1YmgsIHNpemUpOworCQlzYmktPnNfY3NwW3Vmc19mcmFnc3RvYmxrcyhpKV09KHN0cnVjdCB1ZnNfY3N1bSAqKXNwYWNlOworCiAJCXNwYWNlICs9IHNpemU7CiAJCXViaF9icmVsc2UgKHViaCk7CiAJCXViaCA9IE5VTEw7CkBAIC01MzksNiArNTM2LDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXVuc2lnbmVkIGJsb2NrX3NpemUsIHN1cGVyX2Jsb2NrX3NpemU7CiAJdW5zaWduZWQgZmxhZ3M7CisJdW5zaWduZWQgc3VwZXJfYmxvY2tfb2Zmc2V0OwogCiAJdXNwaSA9IE5VTEw7CiAJdWJoID0gTlVMTDsKQEAgLTU4NiwxMCArNTg0LDExIEBACiAJaWYgKCF1c3BpKQogCQlnb3RvIGZhaWxlZDsKIAorCXN1cGVyX2Jsb2NrX29mZnNldD1VRlNfU0JMT0NLOworCiAJLyogS2VlcCAyR2lnIGZpbGUgbGltaXQuIFNvbWUgVUZTIHZhcmlhbnRzIG5lZWQgdG8gb3ZlcnJpZGUgCiAJICAgdGhpcyBidXQgYXMgSSBkb24ndCBrbm93IHdoaWNoIEknbGwgbGV0IHRob3NlIGluIHRoZSBrbm93IGxvb3NlbgogCSAgIHRoZSBydWxlcyAqLwotCSAgIAogCXN3aXRjaCAoc2JpLT5zX21vdW50X29wdCAmIFVGU19NT1VOVF9VRlNUWVBFKSB7CiAJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV80NEJTRDoKIAkJVUZTRCgoInVmc3R5cGU9NDRic2RcbiIpKQpAQCAtNjAxLDcgKzYwMCw4IEBACiAJCWZsYWdzIHw9IFVGU19ERV80NEJTRCB8IFVGU19VSURfNDRCU0QgfCBVRlNfU1RfNDRCU0QgfCBVRlNfQ0dfNDRCU0Q7CiAJCWJyZWFrOwogCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfVUZTMjoKLQkJVUZTRCgoInVmc3R5cGU9dWZzMlxuIikpCisJCVVGU0QoKCJ1ZnN0eXBlPXVmczJcbiIpKTsKKwkJc3VwZXJfYmxvY2tfb2Zmc2V0PVNCTE9DS19VRlMyOwogCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDUxMjsKIAkJdXNwaS0+c19mbWFzayA9IH4oNTEyIC0gMSk7CiAJCXVzcGktPnNfZnNoaWZ0ID0gOTsKQEAgLTcyNSwxOSArNzI1LDE2IEBACiAJLyoKIAkgKiByZWFkIHVmcyBzdXBlciBibG9jayBmcm9tIGRldmljZQogCSAqLwotCWlmICggKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgewotCQl1YmggPSB1YmhfYnJlYWRfdXNwaSh1c3BpLCBzYiwgdXNwaS0+c19zYmJhc2UgKyBTQkxPQ0tfVUZTMi9ibG9ja19zaXplLCBzdXBlcl9ibG9ja19zaXplKTsKLQl9Ci0JZWxzZSB7Ci0JCXViaCA9IHViaF9icmVhZF91c3BpKHVzcGksIHNiLCB1c3BpLT5zX3NiYmFzZSArIFVGU19TQkxPQ0svYmxvY2tfc2l6ZSwgc3VwZXJfYmxvY2tfc2l6ZSk7Ci0JfQorCisJdWJoID0gdWJoX2JyZWFkX3VzcGkodXNwaSwgc2IsIHVzcGktPnNfc2JiYXNlICsgc3VwZXJfYmxvY2tfb2Zmc2V0L2Jsb2NrX3NpemUsIHN1cGVyX2Jsb2NrX3NpemUpOworCQogCWlmICghdWJoKSAKICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwogCiAJCi0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKLQl1c2IyID0gdWJoX2dldF91c2Jfc2Vjb25kKFVTUElfVUJIKTsKLQl1c2IzID0gdWJoX2dldF91c2JfdGhpcmQoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKKwl1c2IyID0gdWJoX2dldF91c2Jfc2Vjb25kKHVzcGkpOworCXVzYjMgPSB1YmhfZ2V0X3VzYl90aGlyZCh1c3BpKTsKIAl1c2IgID0gKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKikKIAkJKChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICopdXNwaSktPmJoWzBdLT5iX2RhdGEgOwogCkBAIC0xMDA2LDggKzEwMDMsOCBAQAogCVVGU0QoKCJFTlRFUlxuIikpCiAJZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKLQl1c2IzID0gdWJoX2dldF91c2JfdGhpcmQoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKKwl1c2IzID0gdWJoX2dldF91c2JfdGhpcmQodXNwaSk7CiAKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJdXNiMS0+ZnNfdGltZSA9IGNwdV90b19mczMyKHNiLCBnZXRfc2Vjb25kcygpKTsKQEAgLTEwNDksOCArMTA0Niw4IEBACiAJCiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKIAlmbGFncyA9IFVGU19TQihzYiktPnNfZmxhZ3M7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKLQl1c2IzID0gdWJoX2dldF91c2JfdGhpcmQoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKKwl1c2IzID0gdWJoX2dldF91c2JfdGhpcmQodXNwaSk7CiAJCiAJLyoKIAkgKiBBbGxvdyB0aGUgImNoZWNrIiBvcHRpb24gdG8gYmUgcGFzc2VkIGFzIGEgcmVtb3VudCBvcHRpb24uCkBAIC0xMTI0LDcgKzExMjEsNyBAQAogCWxvY2tfa2VybmVsKCk7CiAKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCAoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCAodXNwaSk7CiAJdXNiICA9IChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICopCiAJCSgoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKXVzcGkpLT5iaFswXS0+Yl9kYXRhIDsKIAkKZGlmZiAtLWdpdCBhL2ZzL3Vmcy91dGlsLmggYi9mcy91ZnMvdXRpbC5oCmluZGV4IGIyNjQwMDcuLjQ4ZDZkOWIgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy91dGlsLmgKKysrIGIvZnMvdWZzL3V0aWwuaApAQCAtMjQ5LDE4ICsyNDksMjggQEAKIAogCiAvKgotICogbWFjcm9zIHRvIGdldCBpbXBvcnRhbnQgc3RydWN0dXJlcyBmcm9tIHVmc19idWZmZXJfaGVhZAorICogbWFjcm9zIGFuZCBpbmxpbmUgZnVuY3Rpb24gdG8gZ2V0IGltcG9ydGFudCBzdHJ1Y3R1cmVzIGZyb20gdWZzX3NiX3ByaXZhdGVfaW5mbwogICovCi0jZGVmaW5lIHViaF9nZXRfdXNiX2ZpcnN0KHViaCkgXAotCSgoc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqKSgodWJoKS0+YmhbMF0tPmJfZGF0YSkpCiAKLSNkZWZpbmUgdWJoX2dldF91c2Jfc2Vjb25kKHViaCkgXAotCSgoc3RydWN0IHVmc19zdXBlcl9ibG9ja19zZWNvbmQgKikodWJoKS0+IFwKLQliaFtVRlNfU0VDVE9SX1NJWkUgPj4gdXNwaS0+c19mc2hpZnRdLT5iX2RhdGEgKyAoVUZTX1NFQ1RPUl9TSVpFICYgfnVzcGktPnNfZm1hc2spKQorc3RhdGljIGlubGluZSB2b2lkICpnZXRfdXNiX29mZnNldChzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqdXNwaSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGludCBpbmRleDsKKwkKKwlpbmRleCA9IG9mZnNldCA+PiB1c3BpLT5zX2ZzaGlmdDsKKwlvZmZzZXQgJj0gfnVzcGktPnNfZm1hc2s7CisJcmV0dXJuIHVzcGktPnNfdWJoLmJoW2luZGV4XS0+Yl9kYXRhICsgb2Zmc2V0OworfQogCi0jZGVmaW5lIHViaF9nZXRfdXNiX3RoaXJkKHViaCkgXAotCSgoc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqKSgodWJoKS0+IFwKLQliaFtVRlNfU0VDVE9SX1NJWkUqMiA+PiB1c3BpLT5zX2ZzaGlmdF0tPmJfZGF0YSArIChVRlNfU0VDVE9SX1NJWkUqMiAmIH51c3BpLT5zX2ZtYXNrKSkpCisjZGVmaW5lIHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpIFwKKwkoKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKilnZXRfdXNiX29mZnNldCgodXNwaSksIDApKQorCisjZGVmaW5lIHViaF9nZXRfdXNiX3NlY29uZCh1c3BpKSBcCisJKChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3NlY29uZCAqKWdldF91c2Jfb2Zmc2V0KCh1c3BpKSwgVUZTX1NFQ1RPUl9TSVpFKSkKKworI2RlZmluZSB1YmhfZ2V0X3VzYl90aGlyZCh1c3BpKQlcCisJKChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICopZ2V0X3VzYl9vZmZzZXQoKHVzcGkpLCAyKlVGU19TRUNUT1JfU0laRSkpCisKIAogI2RlZmluZSB1YmhfZ2V0X3VjZyh1YmgpIFwKIAkoKHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKikoKHViaCktPmJoWzBdLT5iX2RhdGEpKQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCmluZGV4IDk0ZDNjZGYuLmQxZGI4YzEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKQEAgLTQwLDExICs0MCwxMCBAQAogI2luY2x1ZGUgInhmc19ydy5oIgogI2luY2x1ZGUgInhmc19pb21hcC5oIgogI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogCiBTVEFUSUMgdm9pZCB4ZnNfY291bnRfcGFnZV9zdGF0ZShzdHJ1Y3QgcGFnZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKLVNUQVRJQyB2b2lkIHhmc19jb252ZXJ0X3BhZ2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBwYWdlICosIHhmc19pb21hcF90ICosCi0JCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLCB2b2lkICosIGludCwgaW50KTsKIAogI2lmIGRlZmluZWQoWEZTX1JXX1RSQUNFKQogdm9pZApAQCAtNTUsMTcgKzU0LDE1IEBACiAJaW50CQltYXNrKQogewogCXhmc19pbm9kZV90CSppcDsKLQliaHZfZGVzY190CSpiZHA7CiAJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CiAJbG9mZl90CQlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQlsb2ZmX3QJCW9mZnNldCA9IChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwlsb2ZmX3QJCW9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOwogCWludAkJZGVsYWxsb2MgPSAtMSwgdW5tYXBwZWQgPSAtMSwgdW53cml0dGVuID0gLTE7CiAKIAlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKIAkJeGZzX2NvdW50X3BhZ2Vfc3RhdGUocGFnZSwgJmRlbGFsbG9jLCAmdW5tYXBwZWQsICZ1bndyaXR0ZW4pOwogCi0JYmRwID0gdm5fYmh2X2xvb2t1cChWTl9CSFZfSEVBRCh2cCksICZ4ZnNfdm5vZGVvcHMpOwotCWlwID0gWEZTX0JIVlRPSShiZHApOworCWlwID0geGZzX3Z0b2kodnApOwogCWlmICghaXAtPmlfcnd0cmFjZSkKIAkJcmV0dXJuOwogCkBAIC0xMDMsMTUgKzEwMCw1NiBAQAogCQlxdWV1ZV93b3JrKHhmc2RhdGFkX3dvcmtxdWV1ZSwgJmlvZW5kLT5pb193b3JrKTsKIH0KIAorLyoKKyAqIFdlJ3JlIG5vdyBmaW5pc2hlZCBmb3IgZ29vZCB3aXRoIHRoaXMgaW9lbmQgc3RydWN0dXJlLgorICogVXBkYXRlIHRoZSBwYWdlIHN0YXRlIHZpYSB0aGUgYXNzb2NpYXRlZCBidWZmZXJfaGVhZHMsCisgKiByZWxlYXNlIGhvbGRzIG9uIHRoZSBpbm9kZSBhbmQgYmlvLCBhbmQgZmluYWxseSBmcmVlCisgKiB1cCBtZW1vcnkuICBEbyBub3QgdXNlIHRoZSBpb2VuZCBhZnRlciB0aGlzLgorICovCiBTVEFUSUMgdm9pZAogeGZzX2Rlc3Ryb3lfaW9lbmQoCiAJeGZzX2lvZW5kX3QJCSppb2VuZCkKIHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqbmV4dDsKKworCWZvciAoYmggPSBpb2VuZC0+aW9fYnVmZmVyX2hlYWQ7IGJoOyBiaCA9IG5leHQpIHsKKwkJbmV4dCA9IGJoLT5iX3ByaXZhdGU7CisJCWJoLT5iX2VuZF9pbyhiaCwgaW9lbmQtPmlvX3VwdG9kYXRlKTsKKwl9CisKIAl2bl9pb3dha2UoaW9lbmQtPmlvX3Zub2RlKTsKIAltZW1wb29sX2ZyZWUoaW9lbmQsIHhmc19pb2VuZF9wb29sKTsKIH0KIAogLyoKKyAqIEJ1ZmZlcmVkIElPIHdyaXRlIGNvbXBsZXRpb24gZm9yIGRlbGF5ZWQgYWxsb2NhdGUgZXh0ZW50cy4KKyAqIFRPRE86IFVwZGF0ZSBvbmRpc2sgaXNpemUgbm93IHRoYXQgd2Uga25vdyB0aGUgZmlsZSBkYXRhCisgKiBoYXMgYmVlbiBmbHVzaGVkIChpLmUuIHRoZSBub3RvcmlvdXMgIk5VTEwgZmlsZSIgcHJvYmxlbSkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZW5kX2Jpb19kZWxhbGxvYygKKwl2b2lkCQkJKmRhdGEpCit7CisJeGZzX2lvZW5kX3QJCSppb2VuZCA9IGRhdGE7CisKKwl4ZnNfZGVzdHJveV9pb2VuZChpb2VuZCk7Cit9CisKKy8qCisgKiBCdWZmZXJlZCBJTyB3cml0ZSBjb21wbGV0aW9uIGZvciByZWd1bGFyLCB3cml0dGVuIGV4dGVudHMuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZW5kX2Jpb193cml0dGVuKAorCXZvaWQJCQkqZGF0YSkKK3sKKwl4ZnNfaW9lbmRfdAkJKmlvZW5kID0gZGF0YTsKKworCXhmc19kZXN0cm95X2lvZW5kKGlvZW5kKTsKK30KKworLyoKKyAqIElPIHdyaXRlIGNvbXBsZXRpb24gZm9yIHVud3JpdHRlbiBleHRlbnRzLgorICoKICAqIElzc3VlIHRyYW5zYWN0aW9ucyB0byBjb252ZXJ0IGEgYnVmZmVyIHJhbmdlIGZyb20gdW53cml0dGVuCiAgKiB0byB3cml0dGVuIGV4dGVudHMuCiAgKi8KQEAgLTEyMywyMSArMTYxLDEwIEBACiAJdm5vZGVfdAkJCSp2cCA9IGlvZW5kLT5pb192bm9kZTsKIAl4ZnNfb2ZmX3QJCW9mZnNldCA9IGlvZW5kLT5pb19vZmZzZXQ7CiAJc2l6ZV90CQkJc2l6ZSA9IGlvZW5kLT5pb19zaXplOwotCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpuZXh0OwogCWludAkJCWVycm9yOwogCiAJaWYgKGlvZW5kLT5pb191cHRvZGF0ZSkKIAkJVk9QX0JNQVAodnAsIG9mZnNldCwgc2l6ZSwgQk1BUElfVU5XUklUVEVOLCBOVUxMLCBOVUxMLCBlcnJvcik7Ci0KLQkvKiBpb2VuZC0+aW9fYnVmZmVyX2hlYWQgaXMgb25seSBub24tTlVMTCBmb3IgYnVmZmVyZWQgSS9PICovCi0JZm9yIChiaCA9IGlvZW5kLT5pb19idWZmZXJfaGVhZDsgYmg7IGJoID0gbmV4dCkgewotCQluZXh0ID0gYmgtPmJfcHJpdmF0ZTsKLQotCQliaC0+Yl9lbmRfaW8gPSBOVUxMOwotCQljbGVhcl9idWZmZXJfdW53cml0dGVuKGJoKTsKLQkJZW5kX2J1ZmZlcl9hc3luY193cml0ZShiaCwgaW9lbmQtPmlvX3VwdG9kYXRlKTsKLQl9Ci0KIAl4ZnNfZGVzdHJveV9pb2VuZChpb2VuZCk7CiB9CiAKQEAgLTE0OSw3ICsxNzYsOCBAQAogICovCiBTVEFUSUMgeGZzX2lvZW5kX3QgKgogeGZzX2FsbG9jX2lvZW5kKAotCXN0cnVjdCBpbm9kZQkJKmlub2RlKQorCXN0cnVjdCBpbm9kZQkJKmlub2RlLAorCXVuc2lnbmVkIGludAkJdHlwZSkKIHsKIAl4ZnNfaW9lbmRfdAkJKmlvZW5kOwogCkBAIC0xNjIsNDUgKzE5MCwyNSBAQAogCSAqLwogCWF0b21pY19zZXQoJmlvZW5kLT5pb19yZW1haW5pbmcsIDEpOwogCWlvZW5kLT5pb191cHRvZGF0ZSA9IDE7IC8qIGNsZWFyZWQgaWYgYW55IEkvTyBmYWlscyAqLworCWlvZW5kLT5pb19saXN0ID0gTlVMTDsKKwlpb2VuZC0+aW9fdHlwZSA9IHR5cGU7CiAJaW9lbmQtPmlvX3Zub2RlID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CiAJaW9lbmQtPmlvX2J1ZmZlcl9oZWFkID0gTlVMTDsKKwlpb2VuZC0+aW9fYnVmZmVyX3RhaWwgPSBOVUxMOwogCWF0b21pY19pbmMoJmlvZW5kLT5pb192bm9kZS0+dl9pb2NvdW50KTsKIAlpb2VuZC0+aW9fb2Zmc2V0ID0gMDsKIAlpb2VuZC0+aW9fc2l6ZSA9IDA7CiAKLQlJTklUX1dPUksoJmlvZW5kLT5pb193b3JrLCB4ZnNfZW5kX2Jpb191bndyaXR0ZW4sIGlvZW5kKTsKKwlpZiAodHlwZSA9PSBJT01BUF9VTldSSVRURU4pCisJCUlOSVRfV09SSygmaW9lbmQtPmlvX3dvcmssIHhmc19lbmRfYmlvX3Vud3JpdHRlbiwgaW9lbmQpOworCWVsc2UgaWYgKHR5cGUgPT0gSU9NQVBfREVMQVkpCisJCUlOSVRfV09SSygmaW9lbmQtPmlvX3dvcmssIHhmc19lbmRfYmlvX2RlbGFsbG9jLCBpb2VuZCk7CisJZWxzZQorCQlJTklUX1dPUksoJmlvZW5kLT5pb193b3JrLCB4ZnNfZW5kX2Jpb193cml0dGVuLCBpb2VuZCk7CiAKIAlyZXR1cm4gaW9lbmQ7CiB9CiAKLXZvaWQKLWxpbnZmc191bndyaXR0ZW5fZG9uZSgKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLAotCWludAkJCXVwdG9kYXRlKQotewotCXhmc19pb2VuZF90CQkqaW9lbmQgPSBiaC0+Yl9wcml2YXRlOwotCXN0YXRpYyBzcGlubG9ja190CXVud3JpdHRlbl9kb25lX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0KLQlBU1NFUlQoYnVmZmVyX3Vud3JpdHRlbihiaCkpOwotCWJoLT5iX2VuZF9pbyA9IE5VTEw7Ci0KLQlpZiAoIXVwdG9kYXRlKQotCQlpb2VuZC0+aW9fdXB0b2RhdGUgPSAwOwotCi0JLyoKLQkgKiBEZWVwIG1hZ2ljIGhlcmUuICBXZSByZXVzZSBiX3ByaXZhdGUgaW4gdGhlIGJ1ZmZlcl9oZWFkcyB0byBidWlsZAotCSAqIGEgY2hhaW4gZm9yIGNvbXBsZXRpbmcgdGhlIEkvTyBmcm9tIHVzZXIgY29udGV4dCBhZnRlciB3ZSd2ZSBpc3N1ZWQKLQkgKiBhIHRyYW5zYWN0aW9uIHRvIGNvbnZlcnQgdGhlIHVud3JpdHRlbiBleHRlbnQuCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVud3JpdHRlbl9kb25lX2xvY2ssIGZsYWdzKTsKLQliaC0+Yl9wcml2YXRlID0gaW9lbmQtPmlvX2J1ZmZlcl9oZWFkOwotCWlvZW5kLT5pb19idWZmZXJfaGVhZCA9IGJoOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVud3JpdHRlbl9kb25lX2xvY2ssIGZsYWdzKTsKLQotCXhmc19maW5pc2hfaW9lbmQoaW9lbmQpOwotfQotCiBTVEFUSUMgaW50CiB4ZnNfbWFwX2Jsb2NrcygKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKQEAgLTIxOCwxMzggKzIyNiwyNjAgQEAKIAlyZXR1cm4gLWVycm9yOwogfQogCi0vKgotICogRmluZHMgdGhlIGNvcnJlc3BvbmRpbmcgbWFwcGluZyBpbiBibG9jayBAbWFwIGFycmF5IG9mIHRoZQotICogZ2l2ZW4gQG9mZnNldCB3aXRoaW4gYSBAcGFnZS4KLSAqLwotU1RBVElDIHhmc19pb21hcF90ICoKLXhmc19vZmZzZXRfdG9fbWFwKAotCXN0cnVjdCBwYWdlCQkqcGFnZSwKK1NUQVRJQyBpbmxpbmUgaW50Cit4ZnNfaW9tYXBfdmFsaWQoCiAJeGZzX2lvbWFwX3QJCSppb21hcHAsCi0JdW5zaWduZWQgbG9uZwkJb2Zmc2V0KQorCWxvZmZfdAkJCW9mZnNldCkKIHsKLQlsb2ZmX3QJCQlmdWxsX29mZnNldDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZmlsZSAqLworCXJldHVybiBvZmZzZXQgPj0gaW9tYXBwLT5pb21hcF9vZmZzZXQgJiYKKwkJb2Zmc2V0IDwgaW9tYXBwLT5pb21hcF9vZmZzZXQgKyBpb21hcHAtPmlvbWFwX2JzaXplOworfQogCi0JQVNTRVJUKG9mZnNldCA8IFBBR0VfQ0FDSEVfU0laRSk7CisvKgorICogQklPIGNvbXBsZXRpb24gaGFuZGxlciBmb3IgYnVmZmVyZWQgSU8uCisgKi8KK1NUQVRJQyBpbnQKK3hmc19lbmRfYmlvKAorCXN0cnVjdCBiaW8JCSpiaW8sCisJdW5zaWduZWQgaW50CQlieXRlc19kb25lLAorCWludAkJCWVycm9yKQoreworCXhmc19pb2VuZF90CQkqaW9lbmQgPSBiaW8tPmJpX3ByaXZhdGU7CiAKLQlmdWxsX29mZnNldCA9IHBhZ2UtPmluZGV4OwkJLyogTkI6IHVzaW5nIDY0Yml0IG51bWJlciAqLwotCWZ1bGxfb2Zmc2V0IDw8PSBQQUdFX0NBQ0hFX1NISUZUOwkvKiBvZmZzZXQgZnJvbSBmaWxlIHN0YXJ0ICovCi0JZnVsbF9vZmZzZXQgKz0gb2Zmc2V0OwkJCS8qIG9mZnNldCBmcm9tIHBhZ2Ugc3RhcnQgKi8KKwlpZiAoYmlvLT5iaV9zaXplKQorCQlyZXR1cm4gMTsKIAotCWlmIChmdWxsX29mZnNldCA8IGlvbWFwcC0+aW9tYXBfb2Zmc2V0KQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoaW9tYXBwLT5pb21hcF9vZmZzZXQgKyAoaW9tYXBwLT5pb21hcF9ic2l6ZSAtMSkgPj0gZnVsbF9vZmZzZXQpCi0JCXJldHVybiBpb21hcHA7Ci0JcmV0dXJuIE5VTEw7CisJQVNTRVJUKGlvZW5kKTsKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmJpby0+YmlfY250KSA+PSAxKTsKKworCS8qIFRvc3MgYmlvIGFuZCBwYXNzIHdvcmsgb2ZmIHRvIGFuIHhmc2RhdGFkIHRocmVhZCAqLworCWlmICghdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncykpCisJCWlvZW5kLT5pb191cHRvZGF0ZSA9IDA7CisJYmlvLT5iaV9wcml2YXRlID0gTlVMTDsKKwliaW8tPmJpX2VuZF9pbyA9IE5VTEw7CisKKwliaW9fcHV0KGJpbyk7CisJeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCk7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfc3VibWl0X2lvZW5kX2JpbygKKwl4ZnNfaW9lbmRfdAkqaW9lbmQsCisJc3RydWN0IGJpbwkqYmlvKQoreworCWF0b21pY19pbmMoJmlvZW5kLT5pb19yZW1haW5pbmcpOworCisJYmlvLT5iaV9wcml2YXRlID0gaW9lbmQ7CisJYmlvLT5iaV9lbmRfaW8gPSB4ZnNfZW5kX2JpbzsKKworCXN1Ym1pdF9iaW8oV1JJVEUsIGJpbyk7CisJQVNTRVJUKCFiaW9fZmxhZ2dlZChiaW8sIEJJT19FT1BOT1RTVVBQKSk7CisJYmlvX3B1dChiaW8pOworfQorCitTVEFUSUMgc3RydWN0IGJpbyAqCit4ZnNfYWxsb2NfaW9lbmRfYmlvKAorCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgpCit7CisJc3RydWN0IGJpbwkJKmJpbzsKKwlpbnQJCQludmVjcyA9IGJpb19nZXRfbnJfdmVjcyhiaC0+Yl9iZGV2KTsKKworCWRvIHsKKwkJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCBudmVjcyk7CisJCW52ZWNzID4+PSAxOworCX0gd2hpbGUgKCFiaW8pOworCisJQVNTRVJUKGJpby0+YmlfcHJpdmF0ZSA9PSBOVUxMKTsKKwliaW8tPmJpX3NlY3RvciA9IGJoLT5iX2Jsb2NrbnIgKiAoYmgtPmJfc2l6ZSA+PiA5KTsKKwliaW8tPmJpX2JkZXYgPSBiaC0+Yl9iZGV2OworCWJpb19nZXQoYmlvKTsKKwlyZXR1cm4gYmlvOworfQorCitTVEFUSUMgdm9pZAoreGZzX3N0YXJ0X2J1ZmZlcl93cml0ZWJhY2soCisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCkKK3sKKwlBU1NFUlQoYnVmZmVyX21hcHBlZChiaCkpOworCUFTU0VSVChidWZmZXJfbG9ja2VkKGJoKSk7CisJQVNTRVJUKCFidWZmZXJfZGVsYXkoYmgpKTsKKwlBU1NFUlQoIWJ1ZmZlcl91bndyaXR0ZW4oYmgpKTsKKworCW1hcmtfYnVmZmVyX2FzeW5jX3dyaXRlKGJoKTsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwljbGVhcl9idWZmZXJfZGlydHkoYmgpOworfQorCitTVEFUSUMgdm9pZAoreGZzX3N0YXJ0X3BhZ2Vfd3JpdGViYWNrKAorCXN0cnVjdCBwYWdlCQkqcGFnZSwKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKKwlpbnQJCQljbGVhcl9kaXJ0eSwKKwlpbnQJCQlidWZmZXJzKQoreworCUFTU0VSVChQYWdlTG9ja2VkKHBhZ2UpKTsKKwlBU1NFUlQoIVBhZ2VXcml0ZWJhY2socGFnZSkpOworCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwlpZiAoY2xlYXJfZGlydHkpCisJCWNsZWFyX3BhZ2VfZGlydHkocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJaWYgKCFidWZmZXJzKSB7CisJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwkJd2JjLT5wYWdlc19za2lwcGVkKys7CS8qIFdlIGRpZG4ndCB3cml0ZSB0aGlzIHBhZ2UgKi8KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJpb19hZGRfYnVmZmVyKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlyZXR1cm4gYmlvX2FkZF9wYWdlKGJpbywgYmgtPmJfcGFnZSwgYmgtPmJfc2l6ZSwgYmhfb2Zmc2V0KGJoKSk7Cit9CisKKy8qCisgKiBTdWJtaXQgYWxsIG9mIHRoZSBiaW9zIGZvciBhbGwgb2YgdGhlIGlvZW5kcyB3ZSBoYXZlIHNhdmVkIHVwLAorICogY292ZXJpbmcgdGhlIGluaXRpYWwgd3JpdGVwYWdlIHBhZ2UgYW5kIGFsc28gYW55IHByb2JlZCBwYWdlcy4KKyAqLworU1RBVElDIHZvaWQKK3hmc19zdWJtaXRfaW9lbmQoCisJeGZzX2lvZW5kX3QJCSppb2VuZCkKK3sKKwl4ZnNfaW9lbmRfdAkJKm5leHQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaDsKKwlzdHJ1Y3QgYmlvCQkqYmlvOworCXNlY3Rvcl90CQlsYXN0YmxvY2sgPSAwOworCisJZG8geworCQluZXh0ID0gaW9lbmQtPmlvX2xpc3Q7CisJCWJpbyA9IE5VTEw7CisKKwkJZm9yIChiaCA9IGlvZW5kLT5pb19idWZmZXJfaGVhZDsgYmg7IGJoID0gYmgtPmJfcHJpdmF0ZSkgeworCQkJeGZzX3N0YXJ0X2J1ZmZlcl93cml0ZWJhY2soYmgpOworCisJCQlpZiAoIWJpbykgeworIHJldHJ5OgorCQkJCWJpbyA9IHhmc19hbGxvY19pb2VuZF9iaW8oYmgpOworCQkJfSBlbHNlIGlmIChiaC0+Yl9ibG9ja25yICE9IGxhc3RibG9jayArIDEpIHsKKwkJCQl4ZnNfc3VibWl0X2lvZW5kX2Jpbyhpb2VuZCwgYmlvKTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCisJCQlpZiAoYmlvX2FkZF9idWZmZXIoYmlvLCBiaCkgIT0gYmgtPmJfc2l6ZSkgeworCQkJCXhmc19zdWJtaXRfaW9lbmRfYmlvKGlvZW5kLCBiaW8pOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisKKwkJCWxhc3RibG9jayA9IGJoLT5iX2Jsb2NrbnI7CisJCX0KKwkJaWYgKGJpbykKKwkJCXhmc19zdWJtaXRfaW9lbmRfYmlvKGlvZW5kLCBiaW8pOworCQl4ZnNfZmluaXNoX2lvZW5kKGlvZW5kKTsKKwl9IHdoaWxlICgoaW9lbmQgPSBuZXh0KSAhPSBOVUxMKTsKK30KKworLyoKKyAqIENhbmNlbCBzdWJtaXNzaW9uIG9mIGFsbCBidWZmZXJfaGVhZHMgc28gZmFyIGluIHRoaXMgZW5kaW8uCisgKiBUb3NzIHRoZSBlbmRpbyB0b28uICBPbmx5IGV2ZXIgY2FsbGVkIGZvciB0aGUgaW5pdGlhbCBwYWdlCisgKiBpbiBhIHdyaXRlcGFnZSByZXF1ZXN0LCBzbyBvbmx5IGV2ZXIgb25lIHBhZ2UuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfY2FuY2VsX2lvZW5kKAorCXhmc19pb2VuZF90CQkqaW9lbmQpCit7CisJeGZzX2lvZW5kX3QJCSpuZXh0OworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpuZXh0X2JoOworCisJZG8geworCQluZXh0ID0gaW9lbmQtPmlvX2xpc3Q7CisJCWJoID0gaW9lbmQtPmlvX2J1ZmZlcl9oZWFkOworCQlkbyB7CisJCQluZXh0X2JoID0gYmgtPmJfcHJpdmF0ZTsKKwkJCWNsZWFyX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJfSB3aGlsZSAoKGJoID0gbmV4dF9iaCkgIT0gTlVMTCk7CisKKwkJdm5faW93YWtlKGlvZW5kLT5pb192bm9kZSk7CisJCW1lbXBvb2xfZnJlZShpb2VuZCwgeGZzX2lvZW5kX3Bvb2wpOworCX0gd2hpbGUgKChpb2VuZCA9IG5leHQpICE9IE5VTEwpOworfQorCisvKgorICogVGVzdCB0byBzZWUgaWYgd2UndmUgYmVlbiBidWlsZGluZyB1cCBhIGNvbXBsZXRpb24gc3RydWN0dXJlIGZvcgorICogZWFybGllciBidWZmZXJzIC0tIGlmIHNvLCB3ZSB0cnkgdG8gYXBwZW5kIHRvIHRoaXMgaW9lbmQgaWYgd2UKKyAqIGNhbiwgb3RoZXJ3aXNlIHdlIGZpbmlzaCBvZmYgYW55IGN1cnJlbnQgaW9lbmQgYW5kIHN0YXJ0IGFub3RoZXIuCisgKiBSZXR1cm4gdHJ1ZSBpZiB3ZSd2ZSBmaW5pc2hlZCB0aGUgZ2l2ZW4gaW9lbmQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWRkX3RvX2lvZW5kKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlLAorCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsCisJeGZzX29mZl90CQlvZmZzZXQsCisJdW5zaWduZWQgaW50CQl0eXBlLAorCXhmc19pb2VuZF90CQkqKnJlc3VsdCwKKwlpbnQJCQluZWVkX2lvZW5kKQoreworCXhmc19pb2VuZF90CQkqaW9lbmQgPSAqcmVzdWx0OworCisJaWYgKCFpb2VuZCB8fCBuZWVkX2lvZW5kIHx8IHR5cGUgIT0gaW9lbmQtPmlvX3R5cGUpIHsKKwkJeGZzX2lvZW5kX3QJKnByZXZpb3VzID0gKnJlc3VsdDsKKworCQlpb2VuZCA9IHhmc19hbGxvY19pb2VuZChpbm9kZSwgdHlwZSk7CisJCWlvZW5kLT5pb19vZmZzZXQgPSBvZmZzZXQ7CisJCWlvZW5kLT5pb19idWZmZXJfaGVhZCA9IGJoOworCQlpb2VuZC0+aW9fYnVmZmVyX3RhaWwgPSBiaDsKKwkJaWYgKHByZXZpb3VzKQorCQkJcHJldmlvdXMtPmlvX2xpc3QgPSBpb2VuZDsKKwkJKnJlc3VsdCA9IGlvZW5kOworCX0gZWxzZSB7CisJCWlvZW5kLT5pb19idWZmZXJfdGFpbC0+Yl9wcml2YXRlID0gYmg7CisJCWlvZW5kLT5pb19idWZmZXJfdGFpbCA9IGJoOworCX0KKworCWJoLT5iX3ByaXZhdGUgPSBOVUxMOworCWlvZW5kLT5pb19zaXplICs9IGJoLT5iX3NpemU7CiB9CiAKIFNUQVRJQyB2b2lkCiB4ZnNfbWFwX2F0X29mZnNldCgKLQlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCiAJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwKLQl1bnNpZ25lZCBsb25nCQlvZmZzZXQsCisJbG9mZl90CQkJb2Zmc2V0LAogCWludAkJCWJsb2NrX2JpdHMsCiAJeGZzX2lvbWFwX3QJCSppb21hcHApCiB7CiAJeGZzX2RhZGRyX3QJCWJuOwotCWxvZmZfdAkJCWRlbHRhOwogCWludAkJCXNlY3Rvcl9zaGlmdDsKIAogCUFTU0VSVCghKGlvbWFwcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9IT0xFKSk7CiAJQVNTRVJUKCEoaW9tYXBwLT5pb21hcF9mbGFncyAmIElPTUFQX0RFTEFZKSk7CiAJQVNTRVJUKGlvbWFwcC0+aW9tYXBfYm4gIT0gSU9NQVBfREFERFJfTlVMTCk7CiAKLQlkZWx0YSA9IHBhZ2UtPmluZGV4OwotCWRlbHRhIDw8PSBQQUdFX0NBQ0hFX1NISUZUOwotCWRlbHRhICs9IG9mZnNldDsKLQlkZWx0YSAtPSBpb21hcHAtPmlvbWFwX29mZnNldDsKLQlkZWx0YSA+Pj0gYmxvY2tfYml0czsKLQogCXNlY3Rvcl9zaGlmdCA9IGJsb2NrX2JpdHMgLSBCQlNISUZUOwotCWJuID0gaW9tYXBwLT5pb21hcF9ibiA+PiBzZWN0b3Jfc2hpZnQ7Ci0JYm4gKz0gZGVsdGE7Ci0JQlVHX09OKCFibiAmJiAhKGlvbWFwcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9SRUFMVElNRSkpOworCWJuID0gKGlvbWFwcC0+aW9tYXBfYm4gPj4gc2VjdG9yX3NoaWZ0KSArCisJICAgICAgKChvZmZzZXQgLSBpb21hcHAtPmlvbWFwX29mZnNldCkgPj4gYmxvY2tfYml0cyk7CisKKwlBU1NFUlQoYm4gfHwgKGlvbWFwcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9SRUFMVElNRSkpOwogCUFTU0VSVCgoYm4gPDwgc2VjdG9yX3NoaWZ0KSA+PSBpb21hcHAtPmlvbWFwX2JuKTsKIAogCWxvY2tfYnVmZmVyKGJoKTsKIAliaC0+Yl9ibG9ja25yID0gYm47Ci0JYmgtPmJfYmRldiA9IGlvbWFwcC0+aW9tYXBfdGFyZ2V0LT5wYnJfYmRldjsKKwliaC0+Yl9iZGV2ID0gaW9tYXBwLT5pb21hcF90YXJnZXQtPmJ0X2JkZXY7CiAJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOwogCWNsZWFyX2J1ZmZlcl9kZWxheShiaCk7CisJY2xlYXJfYnVmZmVyX3Vud3JpdHRlbihiaCk7CiB9CiAKIC8qCi0gKiBMb29rIGZvciBhIHBhZ2UgYXQgaW5kZXggd2hpY2ggaXMgdW5sb2NrZWQgYW5kIGNvbnRhaW5zIG91cgotICogdW53cml0dGVuIGV4dGVudCBmbGFnZ2VkIGJ1ZmZlcnMgYXQgaXRzIGhlYWQuICBSZXR1cm5zIHBhZ2UKLSAqIGxvY2tlZCBhbmQgd2l0aCBhbiBleHRyYSByZWZlcmVuY2UgY291bnQsIGFuZCBsZW5ndGggb2YgdGhlCi0gKiB1bndyaXR0ZW4gZXh0ZW50IGNvbXBvbmVudCBvbiB0aGlzIHBhZ2UgdGhhdCB3ZSBjYW4gd3JpdGUsCi0gKiBpbiB1bml0cyBvZiBmaWxlc3lzdGVtIGJsb2Nrcy4KLSAqLwotU1RBVElDIHN0cnVjdCBwYWdlICoKLXhmc19wcm9iZV91bndyaXR0ZW5fcGFnZSgKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqbWFwcGluZywKLQlwZ29mZl90CQkJaW5kZXgsCi0JeGZzX2lvbWFwX3QJCSppb21hcHAsCi0JeGZzX2lvZW5kX3QJCSppb2VuZCwKLQl1bnNpZ25lZCBsb25nCQltYXhfb2Zmc2V0LAotCXVuc2lnbmVkIGxvbmcJCSpmc2JzLAotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGJiaXRzKQotewotCXN0cnVjdCBwYWdlCQkqcGFnZTsKLQotCXBhZ2UgPSBmaW5kX3RyeWxvY2tfcGFnZShtYXBwaW5nLCBpbmRleCk7Ci0JaWYgKCFwYWdlKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAocGFnZS0+bWFwcGluZyAmJiBwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7Ci0JCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOwotCQl1bnNpZ25lZCBsb25nCQlwX29mZnNldCA9IDA7Ci0KLQkJKmZzYnMgPSAwOwotCQliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7Ci0JCWRvIHsKLQkJCWlmICghYnVmZmVyX3Vud3JpdHRlbihiaCkgfHwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoIXhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsIGlvbWFwcCwgcF9vZmZzZXQpKQotCQkJCWJyZWFrOwotCQkJaWYgKHBfb2Zmc2V0ID49IG1heF9vZmZzZXQpCi0JCQkJYnJlYWs7Ci0JCQl4ZnNfbWFwX2F0X29mZnNldChwYWdlLCBiaCwgcF9vZmZzZXQsIGJiaXRzLCBpb21hcHApOwotCQkJc2V0X2J1ZmZlcl91bndyaXR0ZW5faW8oYmgpOwotCQkJYmgtPmJfcHJpdmF0ZSA9IGlvZW5kOwotCQkJcF9vZmZzZXQgKz0gYmgtPmJfc2l6ZTsKLQkJCSgqZnNicykrKzsKLQkJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKLQotCQlpZiAocF9vZmZzZXQpCi0JCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLW91dDoKLQl1bmxvY2tfcGFnZShwYWdlKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIExvb2sgZm9yIGEgcGFnZSBhdCBpbmRleCB3aGljaCBpcyB1bmxvY2tlZCBhbmQgbm90IG1hcHBlZAotICogeWV0IC0gY2x1c3RlcmluZyBmb3IgbW1hcCB3cml0ZSBjYXNlLgorICogTG9vayBmb3IgYSBwYWdlIGF0IGluZGV4IHRoYXQgaXMgc3VpdGFibGUgZm9yIGNsdXN0ZXJpbmcuCiAgKi8KIFNUQVRJQyB1bnNpZ25lZCBpbnQKLXhmc19wcm9iZV91bm1hcHBlZF9wYWdlKAotCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nLAotCXBnb2ZmX3QJCQlpbmRleCwKLQl1bnNpZ25lZCBpbnQJCXBnX29mZnNldCkKK3hmc19wcm9iZV9wYWdlKAorCXN0cnVjdCBwYWdlCQkqcGFnZSwKKwl1bnNpZ25lZCBpbnQJCXBnX29mZnNldCwKKwlpbnQJCQltYXBwZWQpCiB7Ci0Jc3RydWN0IHBhZ2UJCSpwYWdlOwogCWludAkJCXJldCA9IDA7CiAKLQlwYWdlID0gZmluZF90cnlsb2NrX3BhZ2UobWFwcGluZywgaW5kZXgpOwotCWlmICghcGFnZSkKLQkJcmV0dXJuIDA7CiAJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gMDsKIAogCWlmIChwYWdlLT5tYXBwaW5nICYmIFBhZ2VEaXJ0eShwYWdlKSkgewogCQlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgewpAQCAtMzU3LDc5ICs0ODcsMTAxIEBACiAKIAkJCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKIAkJCWRvIHsKLQkJCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgfHwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCQlicmVhazsKKwkJCQlpZiAobWFwcGVkICE9IGJ1ZmZlcl9tYXBwZWQoYmgpKQogCQkJCQlicmVhazsKIAkJCQlyZXQgKz0gYmgtPmJfc2l6ZTsKIAkJCQlpZiAocmV0ID49IHBnX29mZnNldCkKIAkJCQkJYnJlYWs7CiAJCQl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOwogCQl9IGVsc2UKLQkJCXJldCA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJCXJldCA9IG1hcHBlZCA/IDAgOiBQQUdFX0NBQ0hFX1NJWkU7CiAJfQogCi1vdXQ6Ci0JdW5sb2NrX3BhZ2UocGFnZSk7CiAJcmV0dXJuIHJldDsKIH0KIAotU1RBVElDIHVuc2lnbmVkIGludAoteGZzX3Byb2JlX3VubWFwcGVkX2NsdXN0ZXIoCitTVEFUSUMgc2l6ZV90Cit4ZnNfcHJvYmVfY2x1c3RlcigKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKIAlzdHJ1Y3QgcGFnZQkJKnN0YXJ0cGFnZSwKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLAotCXN0cnVjdCBidWZmZXJfaGVhZAkqaGVhZCkKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmhlYWQsCisJaW50CQkJbWFwcGVkKQogeworCXN0cnVjdCBwYWdldmVjCQlwdmVjOwogCXBnb2ZmX3QJCQl0aW5kZXgsIHRsYXN0LCB0bG9mZjsKLQl1bnNpZ25lZCBpbnQJCXBnX29mZnNldCwgbGVuLCB0b3RhbCA9IDA7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXNpemVfdAkJCXRvdGFsID0gMDsKKwlpbnQJCQlkb25lID0gMCwgaTsKIAogCS8qIEZpcnN0IHN1bSBmb3J3YXJkcyBpbiB0aGlzIHBhZ2UgKi8KIAlkbyB7Ci0JCWlmIChidWZmZXJfbWFwcGVkKGJoKSkKLQkJCWJyZWFrOworCQlpZiAobWFwcGVkICE9IGJ1ZmZlcl9tYXBwZWQoYmgpKQorCQkJcmV0dXJuIHRvdGFsOwogCQl0b3RhbCArPSBiaC0+Yl9zaXplOwogCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CiAKLQkvKiBJZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHBhZ2UsIHN1bSBmb3J3YXJkcyBpbgotCSAqIGZvbGxvd2luZyBwYWdlcy4KLQkgKi8KLQlpZiAoYmggPT0gaGVhZCkgewotCQl0bGFzdCA9IGlfc2l6ZV9yZWFkKGlub2RlKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQkvKiBQcnVuZSB0aGlzIGJhY2sgdG8gYXZvaWQgcGF0aG9sb2dpY2FsIGJlaGF2aW9yICovCi0JCXRsb2ZmID0gbWluKHRsYXN0LCBzdGFydHBhZ2UtPmluZGV4ICsgNjQpOwotCQlmb3IgKHRpbmRleCA9IHN0YXJ0cGFnZS0+aW5kZXggKyAxOyB0aW5kZXggPCB0bG9mZjsgdGluZGV4KyspIHsKLQkJCWxlbiA9IHhmc19wcm9iZV91bm1hcHBlZF9wYWdlKG1hcHBpbmcsIHRpbmRleCwKLQkJCQkJCQlQQUdFX0NBQ0hFX1NJWkUpOwotCQkJaWYgKCFsZW4pCi0JCQkJcmV0dXJuIHRvdGFsOworCS8qIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgcGFnZSwgc3VtIGZvcndhcmRzIGluIGZvbGxvd2luZyBwYWdlcyAqLworCXRsYXN0ID0gaV9zaXplX3JlYWQoaW5vZGUpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdGluZGV4ID0gc3RhcnRwYWdlLT5pbmRleCArIDE7CisKKwkvKiBQcnVuZSB0aGlzIGJhY2sgdG8gYXZvaWQgcGF0aG9sb2dpY2FsIGJlaGF2aW9yICovCisJdGxvZmYgPSBtaW4odGxhc3QsIHN0YXJ0cGFnZS0+aW5kZXggKyA2NCk7CisKKwlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCXdoaWxlICghZG9uZSAmJiB0aW5kZXggPD0gdGxvZmYpIHsKKwkJdW5zaWduZWQgbGVuID0gbWluX3QocGdvZmZfdCwgUEFHRVZFQ19TSVpFLCB0bGFzdCAtIHRpbmRleCArIDEpOworCisJCWlmICghcGFnZXZlY19sb29rdXAoJnB2ZWMsIGlub2RlLT5pX21hcHBpbmcsIHRpbmRleCwgbGVuKSkKKwkJCWJyZWFrOworCisJCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KCZwdmVjKTsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CisJCQlzaXplX3QgcGdfb2Zmc2V0LCBsZW4gPSAwOworCisJCQlpZiAodGluZGV4ID09IHRsYXN0KSB7CisJCQkJcGdfb2Zmc2V0ID0KKwkJCQkgICAgaV9zaXplX3JlYWQoaW5vZGUpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQkJCWlmICghcGdfb2Zmc2V0KSB7CisJCQkJCWRvbmUgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlwZ19vZmZzZXQgPSBQQUdFX0NBQ0hFX1NJWkU7CisKKwkJCWlmIChwYWdlLT5pbmRleCA9PSB0aW5kZXggJiYgIVRlc3RTZXRQYWdlTG9ja2VkKHBhZ2UpKSB7CisJCQkJbGVuID0geGZzX3Byb2JlX3BhZ2UocGFnZSwgcGdfb2Zmc2V0LCBtYXBwZWQpOworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJfQorCisJCQlpZiAoIWxlbikgeworCQkJCWRvbmUgPSAxOworCQkJCWJyZWFrOworCQkJfQorCiAJCQl0b3RhbCArPSBsZW47CisJCQl0aW5kZXgrKzsKIAkJfQotCQlpZiAodGluZGV4ID09IHRsYXN0ICYmCi0JCSAgICAocGdfb2Zmc2V0ID0gaV9zaXplX3JlYWQoaW5vZGUpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSkgewotCQkJdG90YWwgKz0geGZzX3Byb2JlX3VubWFwcGVkX3BhZ2UobWFwcGluZywKLQkJCQkJCQl0aW5kZXgsIHBnX29mZnNldCk7Ci0JCX0KKworCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOworCQljb25kX3Jlc2NoZWQoKTsKIAl9CisKIAlyZXR1cm4gdG90YWw7CiB9CiAKIC8qCi0gKiBQcm9iZSBmb3IgYSBnaXZlbiBwYWdlIChpbmRleCkgaW4gdGhlIGlub2RlIGFuZCB0ZXN0IGlmIGl0IGlzIGRlbGF5ZWQKLSAqIGFuZCB3aXRob3V0IHVud3JpdHRlbiBidWZmZXJzLiAgUmV0dXJucyBwYWdlIGxvY2tlZCBhbmQgd2l0aCBhbiBleHRyYQotICogcmVmZXJlbmNlIGNvdW50LgorICogVGVzdCBpZiBhIGdpdmVuIHBhZ2UgaXMgc3VpdGFibGUgZm9yIHdyaXRpbmcgYXMgcGFydCBvZiBhbiB1bndyaXR0ZW4KKyAqIG9yIGRlbGF5ZWQgYWxsb2NhdGUgZXh0ZW50LgogICovCi1TVEFUSUMgc3RydWN0IHBhZ2UgKgoteGZzX3Byb2JlX2RlbGFsbG9jX3BhZ2UoCi0Jc3RydWN0IGlub2RlCQkqaW5vZGUsCi0JcGdvZmZfdAkJCWluZGV4KQorU1RBVElDIGludAoreGZzX2lzX2RlbGF5ZWRfcGFnZSgKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCisJdW5zaWduZWQgaW50CQl0eXBlKQogewotCXN0cnVjdCBwYWdlCQkqcGFnZTsKLQotCXBhZ2UgPSBmaW5kX3RyeWxvY2tfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCk7Ci0JaWYgKCFwYWdlKQotCQlyZXR1cm4gTlVMTDsKIAlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkKLQkJZ290byBvdXQ7CisJCXJldHVybiAwOwogCiAJaWYgKHBhZ2UtPm1hcHBpbmcgJiYgcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgewogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqaGVhZDsKQEAgLTQzNywyNDMgKzU4OSwxNTYgQEAKIAogCQliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CiAJCWRvIHsKLQkJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSkgewotCQkJCWFjY2VwdGFibGUgPSAwOworCQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKQorCQkJCWFjY2VwdGFibGUgPSAodHlwZSA9PSBJT01BUF9VTldSSVRURU4pOworCQkJZWxzZSBpZiAoYnVmZmVyX2RlbGF5KGJoKSkKKwkJCQlhY2NlcHRhYmxlID0gKHR5cGUgPT0gSU9NQVBfREVMQVkpOworCQkJZWxzZSBpZiAoYnVmZmVyX21hcHBlZChiaCkpCisJCQkJYWNjZXB0YWJsZSA9ICh0eXBlID09IDApOworCQkJZWxzZQogCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKSB7Ci0JCQkJYWNjZXB0YWJsZSA9IDE7Ci0JCQl9CiAJCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CiAKIAkJaWYgKGFjY2VwdGFibGUpCi0JCQlyZXR1cm4gcGFnZTsKKwkJCXJldHVybiAxOwogCX0KIAotb3V0OgotCXVubG9ja19wYWdlKHBhZ2UpOwotCXJldHVybiBOVUxMOwotfQotCi1TVEFUSUMgaW50Ci14ZnNfbWFwX3Vud3JpdHRlbigKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKLQlzdHJ1Y3QgcGFnZQkJKnN0YXJ0X3BhZ2UsCi0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSpoZWFkLAotCXN0cnVjdCBidWZmZXJfaGVhZAkqY3VyciwKLQl1bnNpZ25lZCBsb25nCQlwX29mZnNldCwKLQlpbnQJCQlibG9ja19iaXRzLAotCXhmc19pb21hcF90CQkqaW9tYXBwLAotCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAotCWludAkJCXN0YXJ0aW8sCi0JaW50CQkJYWxsX2JoKQotewotCXN0cnVjdCBidWZmZXJfaGVhZAkqYmggPSBjdXJyOwotCXhmc19pb21hcF90CQkqdG1wOwotCXhmc19pb2VuZF90CQkqaW9lbmQ7Ci0JbG9mZl90CQkJb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcJCW5ibG9ja3MgPSAwOwotCi0Jb2Zmc2V0ID0gc3RhcnRfcGFnZS0+aW5kZXg7Ci0Jb2Zmc2V0IDw8PSBQQUdFX0NBQ0hFX1NISUZUOwotCW9mZnNldCArPSBwX29mZnNldDsKLQotCWlvZW5kID0geGZzX2FsbG9jX2lvZW5kKGlub2RlKTsKLQotCS8qIEZpcnN0IG1hcCBmb3J3YXJkcyBpbiB0aGUgcGFnZSBjb25zZWN1dGl2ZSBidWZmZXJzCi0JICogY292ZXJpbmcgdGhpcyB1bndyaXR0ZW4gZXh0ZW50Ci0JICovCi0JZG8gewotCQlpZiAoIWJ1ZmZlcl91bndyaXR0ZW4oYmgpKQotCQkJYnJlYWs7Ci0JCXRtcCA9IHhmc19vZmZzZXRfdG9fbWFwKHN0YXJ0X3BhZ2UsIGlvbWFwcCwgcF9vZmZzZXQpOwotCQlpZiAoIXRtcCkKLQkJCWJyZWFrOwotCQl4ZnNfbWFwX2F0X29mZnNldChzdGFydF9wYWdlLCBiaCwgcF9vZmZzZXQsIGJsb2NrX2JpdHMsIGlvbWFwcCk7Ci0JCXNldF9idWZmZXJfdW53cml0dGVuX2lvKGJoKTsKLQkJYmgtPmJfcHJpdmF0ZSA9IGlvZW5kOwotCQlwX29mZnNldCArPSBiaC0+Yl9zaXplOwotCQluYmxvY2tzKys7Ci0JfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKLQotCWF0b21pY19hZGQobmJsb2NrcywgJmlvZW5kLT5pb19yZW1haW5pbmcpOwotCi0JLyogSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBwYWdlLCBtYXAgZm9yd2FyZHMgaW4gYW55Ci0JICogZm9sbG93aW5nIHBhZ2VzIHdoaWNoIGFyZSBhbHNvIGNvdmVyZWQgYnkgdGhpcyBleHRlbnQuCi0JICovCi0JaWYgKGJoID09IGhlYWQpIHsKLQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwotCQlwZ29mZl90CQkJdGluZGV4LCB0bG9mZiwgdGxhc3Q7Ci0JCXVuc2lnbmVkIGxvbmcJCWJzOwotCQl1bnNpZ25lZCBpbnQJCXBnX29mZnNldCwgYmJpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOwotCQlzdHJ1Y3QgcGFnZQkJKnBhZ2U7Ci0KLQkJdGxhc3QgPSBpX3NpemVfcmVhZChpbm9kZSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJdGxvZmYgPSAoaW9tYXBwLT5pb21hcF9vZmZzZXQgKyBpb21hcHAtPmlvbWFwX2JzaXplKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQl0bG9mZiA9IG1pbih0bGFzdCwgdGxvZmYpOwotCQlmb3IgKHRpbmRleCA9IHN0YXJ0X3BhZ2UtPmluZGV4ICsgMTsgdGluZGV4IDwgdGxvZmY7IHRpbmRleCsrKSB7Ci0JCQlwYWdlID0geGZzX3Byb2JlX3Vud3JpdHRlbl9wYWdlKG1hcHBpbmcsCi0JCQkJCQl0aW5kZXgsIGlvbWFwcCwgaW9lbmQsCi0JCQkJCQlQQUdFX0NBQ0hFX1NJWkUsICZicywgYmJpdHMpOwotCQkJaWYgKCFwYWdlKQotCQkJCWJyZWFrOwotCQkJbmJsb2NrcyArPSBiczsKLQkJCWF0b21pY19hZGQoYnMsICZpb2VuZC0+aW9fcmVtYWluaW5nKTsKLQkJCXhmc19jb252ZXJ0X3BhZ2UoaW5vZGUsIHBhZ2UsIGlvbWFwcCwgd2JjLCBpb2VuZCwKLQkJCQkJCQlzdGFydGlvLCBhbGxfYmgpOwotCQkJLyogc3RvcCBpZiBjb252ZXJ0aW5nIHRoZSBuZXh0IHBhZ2UgbWlnaHQgYWRkCi0JCQkgKiBlbm91Z2ggYmxvY2tzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZQotCQkJICogY291bnQgd29uJ3QgZml0IGluIG91ciB1bG9uZyBwYWdlIGJ1ZiBsZW5ndGggKi8KLQkJCWlmIChuYmxvY2tzID49ICgoVUxPTkdfTUFYIC0gUEFHRV9TSVpFKSA+PiBibG9ja19iaXRzKSkKLQkJCQlnb3RvIGVub3VnaDsKLQkJfQotCi0JCWlmICh0aW5kZXggPT0gdGxhc3QgJiYKLQkJICAgIChwZ19vZmZzZXQgPSAoaV9zaXplX3JlYWQoaW5vZGUpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSkpIHsKLQkJCXBhZ2UgPSB4ZnNfcHJvYmVfdW53cml0dGVuX3BhZ2UobWFwcGluZywKLQkJCQkJCQl0aW5kZXgsIGlvbWFwcCwgaW9lbmQsCi0JCQkJCQkJcGdfb2Zmc2V0LCAmYnMsIGJiaXRzKTsKLQkJCWlmIChwYWdlKSB7Ci0JCQkJbmJsb2NrcyArPSBiczsKLQkJCQlhdG9taWNfYWRkKGJzLCAmaW9lbmQtPmlvX3JlbWFpbmluZyk7Ci0JCQkJeGZzX2NvbnZlcnRfcGFnZShpbm9kZSwgcGFnZSwgaW9tYXBwLCB3YmMsIGlvZW5kLAotCQkJCQkJCXN0YXJ0aW8sIGFsbF9iaCk7Ci0JCQkJaWYgKG5ibG9ja3MgPj0gKChVTE9OR19NQVggLSBQQUdFX1NJWkUpID4+IGJsb2NrX2JpdHMpKQotCQkJCQlnb3RvIGVub3VnaDsKLQkJCX0KLQkJfQotCX0KLQotZW5vdWdoOgotCWlvZW5kLT5pb19zaXplID0gKHhmc19vZmZfdCluYmxvY2tzIDw8IGJsb2NrX2JpdHM7Ci0JaW9lbmQtPmlvX29mZnNldCA9IG9mZnNldDsKLQl4ZnNfZmluaXNoX2lvZW5kKGlvZW5kKTsKIAlyZXR1cm4gMDsKIH0KIAotU1RBVElDIHZvaWQKLXhmc19zdWJtaXRfcGFnZSgKLQlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCi0Jc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCi0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaF9hcnJbXSwKLQlpbnQJCQliaF9jb3VudCwKLQlpbnQJCQlwcm9iZWRfcGFnZSwKLQlpbnQJCQljbGVhcl9kaXJ0eSkKLXsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoOwotCWludAkJCWk7Ci0KLQlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7Ci0JaWYgKGJoX2NvdW50KQotCQlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7Ci0JaWYgKGNsZWFyX2RpcnR5KQotCQljbGVhcl9wYWdlX2RpcnR5KHBhZ2UpOwotCXVubG9ja19wYWdlKHBhZ2UpOwotCi0JaWYgKGJoX2NvdW50KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBiaF9jb3VudDsgaSsrKSB7Ci0JCQliaCA9IGJoX2FycltpXTsKLQkJCW1hcmtfYnVmZmVyX2FzeW5jX3dyaXRlKGJoKTsKLQkJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSkKLQkJCQlzZXRfYnVmZmVyX3Vud3JpdHRlbl9pbyhiaCk7Ci0JCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgYmhfY291bnQ7IGkrKykKLQkJCXN1Ym1pdF9iaChXUklURSwgYmhfYXJyW2ldKTsKLQotCQlpZiAocHJvYmVkX3BhZ2UgJiYgY2xlYXJfZGlydHkpCi0JCQl3YmMtPm5yX3RvX3dyaXRlLS07CS8qIFdyb3RlIGFuICJleHRyYSIgcGFnZSAqLwotCX0KLX0KLQogLyoKICAqIEFsbG9jYXRlICYgbWFwIGJ1ZmZlcnMgZm9yIHBhZ2UgZ2l2ZW4gdGhlIGV4dGVudCBtYXAuIFdyaXRlIGl0IG91dC4KICAqIGV4Y2VwdCBmb3IgdGhlIG9yaWdpbmFsIHBhZ2Ugb2YgYSB3cml0ZXBhZ2UsIHRoaXMgaXMgY2FsbGVkIG9uCiAgKiBkZWxhbGxvYy91bndyaXR0ZW4gcGFnZXMgb25seSwgZm9yIHRoZSBvcmlnaW5hbCBwYWdlIGl0IGlzIHBvc3NpYmxlCiAgKiB0aGF0IHRoZSBwYWdlIGhhcyBubyBtYXBwaW5nIGF0IGFsbC4KICAqLwotU1RBVElDIHZvaWQKK1NUQVRJQyBpbnQKIHhmc19jb252ZXJ0X3BhZ2UoCiAJc3RydWN0IGlub2RlCQkqaW5vZGUsCiAJc3RydWN0IHBhZ2UJCSpwYWdlLAotCXhmc19pb21hcF90CQkqaW9tYXBwLAorCWxvZmZfdAkJCXRpbmRleCwKKwl4ZnNfaW9tYXBfdAkJKm1wLAorCXhmc19pb2VuZF90CQkqKmlvZW5kcCwKIAlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKLQl2b2lkCQkJKnByaXZhdGUsCiAJaW50CQkJc3RhcnRpbywKIAlpbnQJCQlhbGxfYmgpCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaF9hcnJbTUFYX0JVRl9QRVJfUEFHRV0sICpiaCwgKmhlYWQ7Ci0JeGZzX2lvbWFwX3QJCSptcCA9IGlvbWFwcCwgKnRtcDsKLQl1bnNpZ25lZCBsb25nCQlvZmZzZXQsIGVuZF9vZmZzZXQ7Ci0JaW50CQkJaW5kZXggPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOworCXhmc19vZmZfdAkJZW5kX29mZnNldDsKKwl1bnNpZ25lZCBsb25nCQlwX29mZnNldDsKKwl1bnNpZ25lZCBpbnQJCXR5cGU7CiAJaW50CQkJYmJpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOwogCWludAkJCWxlbiwgcGFnZV9kaXJ0eTsKKwlpbnQJCQljb3VudCA9IDAsIGRvbmUgPSAwLCB1cHRvZGF0ZSA9IDE7CisgCXhmc19vZmZfdAkJb2Zmc2V0ID0gcGFnZV9vZmZzZXQocGFnZSk7CiAKLQllbmRfb2Zmc2V0ID0gKGlfc2l6ZV9yZWFkKGlub2RlKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisJaWYgKHBhZ2UtPmluZGV4ICE9IHRpbmRleCkKKwkJZ290byBmYWlsOworCWlmIChUZXN0U2V0UGFnZUxvY2tlZChwYWdlKSkKKwkJZ290byBmYWlsOworCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKQorCQlnb3RvIGZhaWxfdW5sb2NrX3BhZ2U7CisJaWYgKHBhZ2UtPm1hcHBpbmcgIT0gaW5vZGUtPmlfbWFwcGluZykKKwkJZ290byBmYWlsX3VubG9ja19wYWdlOworCWlmICgheGZzX2lzX2RlbGF5ZWRfcGFnZShwYWdlLCAoKmlvZW5kcCktPmlvX3R5cGUpKQorCQlnb3RvIGZhaWxfdW5sb2NrX3BhZ2U7CiAKIAkvKgogCSAqIHBhZ2VfZGlydHkgaXMgaW5pdGlhbGx5IGEgY291bnQgb2YgYnVmZmVycyBvbiB0aGUgcGFnZSBiZWZvcmUKIAkgKiBFT0YgYW5kIGlzIGRlY3JlbWVtdGVkIGFzIHdlIG1vdmUgZWFjaCBpbnRvIGEgY2xlYW5hYmxlIHN0YXRlLgorCSAqCisJICogRGVyaXZhdGlvbjoKKwkgKgorCSAqIEVuZCBvZmZzZXQgaXMgdGhlIGhpZ2hlc3Qgb2Zmc2V0IHRoYXQgdGhpcyBwYWdlIHNob3VsZCByZXByZXNlbnQuCisJICogSWYgd2UgYXJlIG9uIHRoZSBsYXN0IHBhZ2UsIChlbmRfb2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKQorCSAqIHdpbGwgZXZhbHVhdGUgbm9uLXplcm8gYW5kIGJlIGxlc3MgdGhhbiBQQUdFX0NBQ0hFX1NJWkUgYW5kCisJICogaGVuY2UgZ2l2ZSB1cyB0aGUgY29ycmVjdCBwYWdlX2RpcnR5IGNvdW50LiBPbiBhbnkgb3RoZXIgcGFnZSwKKwkgKiBpdCB3aWxsIGJlIHplcm8gYW5kIGluIHRoYXQgY2FzZSB3ZSBuZWVkIHBhZ2VfZGlydHkgdG8gYmUgdGhlCisJICogY291bnQgb2YgYnVmZmVycyBvbiB0aGUgcGFnZS4KIAkgKi8KLQlsZW4gPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7Ci0JZW5kX29mZnNldCA9IG1heChlbmRfb2Zmc2V0LCBQQUdFX0NBQ0hFX1NJWkUpOwotCWVuZF9vZmZzZXQgPSByb3VuZHVwKGVuZF9vZmZzZXQsIGxlbik7Ci0JcGFnZV9kaXJ0eSA9IGVuZF9vZmZzZXQgLyBsZW47CisJZW5kX29mZnNldCA9IG1pbl90KHVuc2lnbmVkIGxvbmcgbG9uZywKKwkJCSh4ZnNfb2ZmX3QpKHBhZ2UtPmluZGV4ICsgMSkgPDwgUEFHRV9DQUNIRV9TSElGVCwKKwkJCWlfc2l6ZV9yZWFkKGlub2RlKSk7CiAKLQlvZmZzZXQgPSAwOworCWxlbiA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKKwlwX29mZnNldCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGVuZF9vZmZzZXQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSksCisJCQkJCVBBR0VfQ0FDSEVfU0laRSk7CisJcF9vZmZzZXQgPSBwX29mZnNldCA/IHJvdW5kdXAocF9vZmZzZXQsIGxlbikgOiBQQUdFX0NBQ0hFX1NJWkU7CisJcGFnZV9kaXJ0eSA9IHBfb2Zmc2V0IC8gbGVuOworCiAJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCWRvIHsKIAkJaWYgKG9mZnNldCA+PSBlbmRfb2Zmc2V0KQogCQkJYnJlYWs7Ci0JCWlmICghKFBhZ2VVcHRvZGF0ZShwYWdlKSB8fCBidWZmZXJfdXB0b2RhdGUoYmgpKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYWxsX2JoICYmCi0JCSAgICAhKGJ1ZmZlcl91bndyaXR0ZW4oYmgpIHx8IGJ1ZmZlcl9kZWxheShiaCkpKSB7Ci0JCQlpZiAoc3RhcnRpbykgewotCQkJCWxvY2tfYnVmZmVyKGJoKTsKLQkJCQliaF9hcnJbaW5kZXgrK10gPSBiaDsKLQkJCQlwYWdlX2RpcnR5LS07Ci0JCQl9CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCXVwdG9kYXRlID0gMDsKKwkJaWYgKCEoUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IGJ1ZmZlcl91cHRvZGF0ZShiaCkpKSB7CisJCQlkb25lID0gMTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCXRtcCA9IHhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsIG1wLCBvZmZzZXQpOwotCQlpZiAoIXRtcCkKLQkJCWNvbnRpbnVlOwotCQlBU1NFUlQoISh0bXAtPmlvbWFwX2ZsYWdzICYgSU9NQVBfSE9MRSkpOwotCQlBU1NFUlQoISh0bXAtPmlvbWFwX2ZsYWdzICYgSU9NQVBfREVMQVkpKTsKIAotCQkvKiBJZiB0aGlzIGlzIGEgbmV3IHVud3JpdHRlbiBleHRlbnQgYnVmZmVyIChpLmUuIG9uZQotCQkgKiB0aGF0IHdlIGhhdmVuJ3QgcGFzc2VkIGluIHByaXZhdGUgZGF0YSBmb3IsIHdlIG11c3QKLQkJICogbm93IG1hcCB0aGlzIGJ1ZmZlciB0b28uCi0JCSAqLwotCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkgJiYgIWJoLT5iX2VuZF9pbykgewotCQkJQVNTRVJUKHRtcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9VTldSSVRURU4pOwotCQkJeGZzX21hcF91bndyaXR0ZW4oaW5vZGUsIHBhZ2UsIGhlYWQsIGJoLCBvZmZzZXQsCi0JCQkJCWJiaXRzLCB0bXAsIHdiYywgc3RhcnRpbywgYWxsX2JoKTsKLQkJfSBlbHNlIGlmICghIChidWZmZXJfdW53cml0dGVuKGJoKSAmJiBidWZmZXJfbG9ja2VkKGJoKSkpIHsKLQkJCXhmc19tYXBfYXRfb2Zmc2V0KHBhZ2UsIGJoLCBvZmZzZXQsIGJiaXRzLCB0bXApOwotCQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKSB7Ci0JCQkJc2V0X2J1ZmZlcl91bndyaXR0ZW5faW8oYmgpOwotCQkJCWJoLT5iX3ByaXZhdGUgPSBwcml2YXRlOwotCQkJCUFTU0VSVChwcml2YXRlKTsKKwkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpIHx8IGJ1ZmZlcl9kZWxheShiaCkpIHsKKwkJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSkKKwkJCQl0eXBlID0gSU9NQVBfVU5XUklUVEVOOworCQkJZWxzZQorCQkJCXR5cGUgPSBJT01BUF9ERUxBWTsKKworCQkJaWYgKCF4ZnNfaW9tYXBfdmFsaWQobXAsIG9mZnNldCkpIHsKKwkJCQlkb25lID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJQVNTRVJUKCEobXAtPmlvbWFwX2ZsYWdzICYgSU9NQVBfSE9MRSkpOworCQkJQVNTRVJUKCEobXAtPmlvbWFwX2ZsYWdzICYgSU9NQVBfREVMQVkpKTsKKworCQkJeGZzX21hcF9hdF9vZmZzZXQoYmgsIG9mZnNldCwgYmJpdHMsIG1wKTsKKwkJCWlmIChzdGFydGlvKSB7CisJCQkJeGZzX2FkZF90b19pb2VuZChpbm9kZSwgYmgsIG9mZnNldCwKKwkJCQkJCXR5cGUsIGlvZW5kcCwgZG9uZSk7CisJCQl9IGVsc2UgeworCQkJCXNldF9idWZmZXJfZGlydHkoYmgpOworCQkJCXVubG9ja19idWZmZXIoYmgpOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCX0KKwkJCXBhZ2VfZGlydHktLTsKKwkJCWNvdW50Kys7CisJCX0gZWxzZSB7CisJCQl0eXBlID0gMDsKKwkJCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBhbGxfYmggJiYgc3RhcnRpbykgeworCQkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJCQl4ZnNfYWRkX3RvX2lvZW5kKGlub2RlLCBiaCwgb2Zmc2V0LAorCQkJCQkJdHlwZSwgaW9lbmRwLCBkb25lKTsKKwkJCQljb3VudCsrOworCQkJCXBhZ2VfZGlydHktLTsKKwkJCX0gZWxzZSB7CisJCQkJZG9uZSA9IDE7CiAJCQl9CiAJCX0KLQkJaWYgKHN0YXJ0aW8pIHsKLQkJCWJoX2FycltpbmRleCsrXSA9IGJoOwotCQl9IGVsc2UgewotCQkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLQkJfQotCQlwYWdlX2RpcnR5LS07CiAJfSB3aGlsZSAob2Zmc2V0ICs9IGxlbiwgKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKIAotCWlmIChzdGFydGlvICYmIGluZGV4KSB7Ci0JCXhmc19zdWJtaXRfcGFnZShwYWdlLCB3YmMsIGJoX2FyciwgaW5kZXgsIDEsICFwYWdlX2RpcnR5KTsKLQl9IGVsc2UgewotCQl1bmxvY2tfcGFnZShwYWdlKTsKKwlpZiAodXB0b2RhdGUgJiYgYmggPT0gaGVhZCkKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCisJaWYgKHN0YXJ0aW8pIHsKKwkJaWYgKGNvdW50KSB7CisJCQlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpOworCisJCQliZGkgPSBpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOworCQkJaWYgKGJkaV93cml0ZV9jb25nZXN0ZWQoYmRpKSkgeworCQkJCXdiYy0+ZW5jb3VudGVyZWRfY29uZ2VzdGlvbiA9IDE7CisJCQkJZG9uZSA9IDE7CisJCQl9IGVsc2UgaWYgKC0td2JjLT5ucl90b193cml0ZSA8PSAwKSB7CisJCQkJZG9uZSA9IDE7CisJCQl9CisJCX0KKwkJeGZzX3N0YXJ0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UsIHdiYywgIXBhZ2VfZGlydHksIGNvdW50KTsKIAl9CisKKwlyZXR1cm4gZG9uZTsKKyBmYWlsX3VubG9ja19wYWdlOgorCXVubG9ja19wYWdlKHBhZ2UpOworIGZhaWw6CisJcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC02ODUsMTkgKzc1MCwzMSBAQAogCXN0cnVjdCBpbm9kZQkJKmlub2RlLAogCXBnb2ZmX3QJCQl0aW5kZXgsCiAJeGZzX2lvbWFwX3QJCSppb21hcHAsCisJeGZzX2lvZW5kX3QJCSoqaW9lbmRwLAogCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAogCWludAkJCXN0YXJ0aW8sCiAJaW50CQkJYWxsX2JoLAogCXBnb2ZmX3QJCQl0bGFzdCkKIHsKLQlzdHJ1Y3QgcGFnZQkJKnBhZ2U7CisJc3RydWN0IHBhZ2V2ZWMJCXB2ZWM7CisJaW50CQkJZG9uZSA9IDAsIGk7CiAKLQlmb3IgKDsgdGluZGV4IDw9IHRsYXN0OyB0aW5kZXgrKykgewotCQlwYWdlID0geGZzX3Byb2JlX2RlbGFsbG9jX3BhZ2UoaW5vZGUsIHRpbmRleCk7Ci0JCWlmICghcGFnZSkKKwlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCXdoaWxlICghZG9uZSAmJiB0aW5kZXggPD0gdGxhc3QpIHsKKwkJdW5zaWduZWQgbGVuID0gbWluX3QocGdvZmZfdCwgUEFHRVZFQ19TSVpFLCB0bGFzdCAtIHRpbmRleCArIDEpOworCisJCWlmICghcGFnZXZlY19sb29rdXAoJnB2ZWMsIGlub2RlLT5pX21hcHBpbmcsIHRpbmRleCwgbGVuKSkKIAkJCWJyZWFrOwotCQl4ZnNfY29udmVydF9wYWdlKGlub2RlLCBwYWdlLCBpb21hcHAsIHdiYywgTlVMTCwKLQkJCQlzdGFydGlvLCBhbGxfYmgpOworCisJCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KCZwdmVjKTsgaSsrKSB7CisJCQlkb25lID0geGZzX2NvbnZlcnRfcGFnZShpbm9kZSwgcHZlYy5wYWdlc1tpXSwgdGluZGV4KyssCisJCQkJCWlvbWFwcCwgaW9lbmRwLCB3YmMsIHN0YXJ0aW8sIGFsbF9iaCk7CisJCQlpZiAoZG9uZSkKKwkJCQlicmVhazsKKwkJfQorCisJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCWNvbmRfcmVzY2hlZCgpOwogCX0KIH0KIApAQCAtNzI4LDE4ICs4MDUsMjIgQEAKIAlpbnQJCXN0YXJ0aW8sCiAJaW50CQl1bm1hcHBlZCkgLyogYWxzbyBpbXBsaWVzIHBhZ2UgdXB0b2RhdGUgKi8KIHsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoX2FycltNQVhfQlVGX1BFUl9QQUdFXSwgKmJoLCAqaGVhZDsKLQl4ZnNfaW9tYXBfdAkJKmlvbXAsIGlvbWFwOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOworCXhmc19pb21hcF90CQlpb21hcDsKKwl4ZnNfaW9lbmRfdAkJKmlvZW5kID0gTlVMTCwgKmlvaGVhZCA9IE5VTEw7CiAJbG9mZl90CQkJb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIHBfb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBpbnQJCXR5cGU7CiAJX191aW50NjRfdCAgICAgICAgICAgICAgZW5kX29mZnNldDsKIAlwZ29mZl90ICAgICAgICAgICAgICAgICBlbmRfaW5kZXgsIGxhc3RfaW5kZXgsIHRsYXN0OwotCWludAkJCWxlbiwgZXJyLCBpLCBjbnQgPSAwLCB1cHRvZGF0ZSA9IDE7Ci0JaW50CQkJZmxhZ3M7Ci0JaW50CQkJcGFnZV9kaXJ0eTsKKwlzc2l6ZV90CQkJc2l6ZSwgbGVuOworCWludAkJCWZsYWdzLCBlcnIsIGlvbWFwX3ZhbGlkID0gMCwgdXB0b2RhdGUgPSAxOworCWludAkJCXBhZ2VfZGlydHksIGNvdW50ID0gMCwgdHJ5bG9ja19mbGFnID0gMDsKKwlpbnQJCQlhbGxfYmggPSB1bm1hcHBlZDsKIAogCS8qIHdhaXQgZm9yIG90aGVyIElPIHRocmVhZHM/ICovCi0JZmxhZ3MgPSAoc3RhcnRpbyAmJiB3YmMtPnN5bmNfbW9kZSAhPSBXQl9TWU5DX05PTkUpID8gMCA6IEJNQVBJX1RSWUxPQ0s7CisJaWYgKHN0YXJ0aW8gJiYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSAmJiB3YmMtPm5vbmJsb2NraW5nKSkKKwkJdHJ5bG9ja19mbGFnIHw9IEJNQVBJX1RSWUxPQ0s7CiAKIAkvKiBJcyB0aGlzIHBhZ2UgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGU/ICovCiAJb2Zmc2V0ID0gaV9zaXplX3JlYWQoaW5vZGUpOwpAQCAtNzU0LDE2MSArODM1LDE3MyBAQAogCQl9CiAJfQogCi0JZW5kX29mZnNldCA9IG1pbl90KHVuc2lnbmVkIGxvbmcgbG9uZywKLQkJCShsb2ZmX3QpKHBhZ2UtPmluZGV4ICsgMSkgPDwgUEFHRV9DQUNIRV9TSElGVCwgb2Zmc2V0KTsKLQlvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0KIAkvKgogCSAqIHBhZ2VfZGlydHkgaXMgaW5pdGlhbGx5IGEgY291bnQgb2YgYnVmZmVycyBvbiB0aGUgcGFnZSBiZWZvcmUKIAkgKiBFT0YgYW5kIGlzIGRlY3JlbWVtdGVkIGFzIHdlIG1vdmUgZWFjaCBpbnRvIGEgY2xlYW5hYmxlIHN0YXRlLgotCSAqLworCSAqCisJICogRGVyaXZhdGlvbjoKKwkgKgorCSAqIEVuZCBvZmZzZXQgaXMgdGhlIGhpZ2hlc3Qgb2Zmc2V0IHRoYXQgdGhpcyBwYWdlIHNob3VsZCByZXByZXNlbnQuCisJICogSWYgd2UgYXJlIG9uIHRoZSBsYXN0IHBhZ2UsIChlbmRfb2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKQorCSAqIHdpbGwgZXZhbHVhdGUgbm9uLXplcm8gYW5kIGJlIGxlc3MgdGhhbiBQQUdFX0NBQ0hFX1NJWkUgYW5kCisJICogaGVuY2UgZ2l2ZSB1cyB0aGUgY29ycmVjdCBwYWdlX2RpcnR5IGNvdW50LiBPbiBhbnkgb3RoZXIgcGFnZSwKKwkgKiBpdCB3aWxsIGJlIHplcm8gYW5kIGluIHRoYXQgY2FzZSB3ZSBuZWVkIHBhZ2VfZGlydHkgdG8gYmUgdGhlCisJICogY291bnQgb2YgYnVmZmVycyBvbiB0aGUgcGFnZS4KKyAJICovCisJZW5kX29mZnNldCA9IG1pbl90KHVuc2lnbmVkIGxvbmcgbG9uZywKKwkJCSh4ZnNfb2ZmX3QpKHBhZ2UtPmluZGV4ICsgMSkgPDwgUEFHRV9DQUNIRV9TSElGVCwgb2Zmc2V0KTsKIAlsZW4gPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7Ci0JcF9vZmZzZXQgPSBtYXgocF9vZmZzZXQsIFBBR0VfQ0FDSEVfU0laRSk7Ci0JcF9vZmZzZXQgPSByb3VuZHVwKHBfb2Zmc2V0LCBsZW4pOworCXBfb2Zmc2V0ID0gbWluX3QodW5zaWduZWQgbG9uZywgZW5kX29mZnNldCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSwKKwkJCQkJUEFHRV9DQUNIRV9TSVpFKTsKKwlwX29mZnNldCA9IHBfb2Zmc2V0ID8gcm91bmR1cChwX29mZnNldCwgbGVuKSA6IFBBR0VfQ0FDSEVfU0laRTsKIAlwYWdlX2RpcnR5ID0gcF9vZmZzZXQgLyBsZW47CiAKLQlpb21wID0gTlVMTDsKLQlwX29mZnNldCA9IDA7CiAJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCW9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOworCWZsYWdzID0gLTE7CisJdHlwZSA9IDA7CisKKwkvKiBUT0RPOiBjbGVhbnVwIGNvdW50IGFuZCBwYWdlX2RpcnR5ICovCiAKIAlkbyB7CiAJCWlmIChvZmZzZXQgPj0gZW5kX29mZnNldCkKIAkJCWJyZWFrOwogCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCiAJCQl1cHRvZGF0ZSA9IDA7Ci0JCWlmICghKFBhZ2VVcHRvZGF0ZShwYWdlKSB8fCBidWZmZXJfdXB0b2RhdGUoYmgpKSAmJiAhc3RhcnRpbykKKwkJaWYgKCEoUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IGJ1ZmZlcl91cHRvZGF0ZShiaCkpICYmICFzdGFydGlvKSB7CisJCQkvKgorCQkJICogdGhlIGlvbWFwIGlzIGFjdHVhbGx5IHN0aWxsIHZhbGlkLCBidXQgdGhlIGlvZW5kCisJCQkgKiBpc24ndC4gIHNob3VsZG4ndCBoYXBwZW4gdG9vIG9mdGVuLgorCQkJICovCisJCQlpb21hcF92YWxpZCA9IDA7CiAJCQljb250aW51ZTsKLQotCQlpZiAoaW9tcCkgewotCQkJaW9tcCA9IHhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsICZpb21hcCwgcF9vZmZzZXQpOwogCQl9CiAKKwkJaWYgKGlvbWFwX3ZhbGlkKQorCQkJaW9tYXBfdmFsaWQgPSB4ZnNfaW9tYXBfdmFsaWQoJmlvbWFwLCBvZmZzZXQpOworCiAJCS8qCiAJCSAqIEZpcnN0IGNhc2UsIG1hcCBhbiB1bndyaXR0ZW4gZXh0ZW50IGFuZCBwcmVwYXJlIGZvcgogCQkgKiBleHRlbnQgc3RhdGUgY29udmVyc2lvbiB0cmFuc2FjdGlvbiBvbiBjb21wbGV0aW9uLgotCQkgKi8KLQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKSB7Ci0JCQlpZiAoIXN0YXJ0aW8pCi0JCQkJY29udGludWU7Ci0JCQlpZiAoIWlvbXApIHsKLQkJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LCBsZW4sICZpb21hcCwKLQkJCQkJCUJNQVBJX1dSSVRFfEJNQVBJX0lHTlNUQVRFKTsKLQkJCQlpZiAoZXJyKSB7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJCWlvbXAgPSB4ZnNfb2Zmc2V0X3RvX21hcChwYWdlLCAmaW9tYXAsCi0JCQkJCQkJCXBfb2Zmc2V0KTsKLQkJCX0KLQkJCWlmIChpb21wKSB7Ci0JCQkJaWYgKCFiaC0+Yl9lbmRfaW8pIHsKLQkJCQkJZXJyID0geGZzX21hcF91bndyaXR0ZW4oaW5vZGUsIHBhZ2UsCi0JCQkJCQkJaGVhZCwgYmgsIHBfb2Zmc2V0LAotCQkJCQkJCWlub2RlLT5pX2Jsa2JpdHMsIGlvbXAsCi0JCQkJCQkJd2JjLCBzdGFydGlvLCB1bm1hcHBlZCk7Ci0JCQkJCWlmIChlcnIpIHsKLQkJCQkJCWdvdG8gZXJyb3I7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlzZXRfYml0KEJIX0xvY2ssICZiaC0+Yl9zdGF0ZSk7Ci0JCQkJfQotCQkJCUJVR19PTighYnVmZmVyX2xvY2tlZChiaCkpOwotCQkJCWJoX2FycltjbnQrK10gPSBiaDsKLQkJCQlwYWdlX2RpcnR5LS07Ci0JCQl9Ci0JCS8qCisJCSAqCiAJCSAqIFNlY29uZCBjYXNlLCBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBkZWxhbGxvYyBidWZmZXIuCiAJCSAqIFdlIGNhbiByZXR1cm4gRUFHQUlOIGhlcmUgaW4gdGhlIHJlbGVhc2UgcGFnZSBjYXNlLgotCQkgKi8KLQkJfSBlbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKSB7Ci0JCQlpZiAoIWlvbXApIHsKLQkJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LCBsZW4sICZpb21hcCwKLQkJCQkJCUJNQVBJX0FMTE9DQVRFIHwgZmxhZ3MpOwotCQkJCWlmIChlcnIpIHsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQkJaW9tcCA9IHhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsICZpb21hcCwKLQkJCQkJCQkJcF9vZmZzZXQpOworCQkgKgorCQkgKiBUaGlyZCBjYXNlLCBhbiB1bm1hcHBlZCBidWZmZXIgd2FzIGZvdW5kLCBhbmQgd2UgYXJlCisJCSAqIGluIGEgcGF0aCB3aGVyZSB3ZSBuZWVkIHRvIHdyaXRlIHRoZSB3aG9sZSBwYWdlIG91dC4KKyAJCSAqLworCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkgfHwgYnVmZmVyX2RlbGF5KGJoKSB8fAorCQkgICAgKChidWZmZXJfdXB0b2RhdGUoYmgpIHx8IFBhZ2VVcHRvZGF0ZShwYWdlKSkgJiYKKwkJICAgICAhYnVmZmVyX21hcHBlZChiaCkgJiYgKHVubWFwcGVkIHx8IHN0YXJ0aW8pKSkgeworCQkgICAgIAkvKgorCQkJICogTWFrZSBzdXJlIHdlIGRvbid0IHVzZSBhIHJlYWQtb25seSBpb21hcAorCQkJICovCisJCSAgICAgCWlmIChmbGFncyA9PSBCTUFQSV9SRUFEKQorCQkJCWlvbWFwX3ZhbGlkID0gMDsKKworCQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKSB7CisJCQkJdHlwZSA9IElPTUFQX1VOV1JJVFRFTjsKKwkJCQlmbGFncyA9IEJNQVBJX1dSSVRFfEJNQVBJX0lHTlNUQVRFOworCQkJfSBlbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKSB7CisJCQkJdHlwZSA9IElPTUFQX0RFTEFZOworCQkJCWZsYWdzID0gQk1BUElfQUxMT0NBVEU7CisJCQkJaWYgKCFzdGFydGlvKQorCQkJCQlmbGFncyB8PSB0cnlsb2NrX2ZsYWc7CisJCQl9IGVsc2UgeworCQkJCXR5cGUgPSBJT01BUF9ORVc7CisJCQkJZmxhZ3MgPSBCTUFQSV9XUklURXxCTUFQSV9NTUFQOwogCQkJfQotCQkJaWYgKGlvbXApIHsKLQkJCQl4ZnNfbWFwX2F0X29mZnNldChwYWdlLCBiaCwgcF9vZmZzZXQsCi0JCQkJCQlpbm9kZS0+aV9ibGtiaXRzLCBpb21wKTsKKworCQkJaWYgKCFpb21hcF92YWxpZCkgeworCQkJCWlmICh0eXBlID09IElPTUFQX05FVykgeworCQkJCQlzaXplID0geGZzX3Byb2JlX2NsdXN0ZXIoaW5vZGUsCisJCQkJCQkJcGFnZSwgYmgsIGhlYWQsIDApOworCQkJCX0gZWxzZSB7CisJCQkJCXNpemUgPSBsZW47CisJCQkJfQorCisJCQkJZXJyID0geGZzX21hcF9ibG9ja3MoaW5vZGUsIG9mZnNldCwgc2l6ZSwKKwkJCQkJCSZpb21hcCwgZmxhZ3MpOworCQkJCWlmIChlcnIpCisJCQkJCWdvdG8gZXJyb3I7CisJCQkJaW9tYXBfdmFsaWQgPSB4ZnNfaW9tYXBfdmFsaWQoJmlvbWFwLCBvZmZzZXQpOworCQkJfQorCQkJaWYgKGlvbWFwX3ZhbGlkKSB7CisJCQkJeGZzX21hcF9hdF9vZmZzZXQoYmgsIG9mZnNldCwKKwkJCQkJCWlub2RlLT5pX2Jsa2JpdHMsICZpb21hcCk7CiAJCQkJaWYgKHN0YXJ0aW8pIHsKLQkJCQkJYmhfYXJyW2NudCsrXSA9IGJoOworCQkJCQl4ZnNfYWRkX3RvX2lvZW5kKGlub2RlLCBiaCwgb2Zmc2V0LAorCQkJCQkJCXR5cGUsICZpb2VuZCwKKwkJCQkJCQkhaW9tYXBfdmFsaWQpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXNldF9idWZmZXJfZGlydHkoYmgpOwogCQkJCQl1bmxvY2tfYnVmZmVyKGJoKTsKIAkJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOwogCQkJCX0KIAkJCQlwYWdlX2RpcnR5LS07CisJCQkJY291bnQrKzsKKwkJCX0KKwkJfSBlbHNlIGlmIChidWZmZXJfdXB0b2RhdGUoYmgpICYmIHN0YXJ0aW8pIHsKKwkJCS8qCisJCQkgKiB3ZSBnb3QgaGVyZSBiZWNhdXNlIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBtYXBwZWQuCisJCQkgKiBUaGF0IG1lYW5zIGl0IG11c3QgYWxyZWFkeSBoYXZlIGV4dGVudHMgYWxsb2NhdGVkCisJCQkgKiB1bmRlcm5lYXRoIGl0LiBNYXAgdGhlIGV4dGVudCBieSByZWFkaW5nIGl0LgorCQkJICovCisJCQlpZiAoIWlvbWFwX3ZhbGlkIHx8IHR5cGUgIT0gMCkgeworCQkJCWZsYWdzID0gQk1BUElfUkVBRDsKKwkJCQlzaXplID0geGZzX3Byb2JlX2NsdXN0ZXIoaW5vZGUsIHBhZ2UsIGJoLAorCQkJCQkJCQloZWFkLCAxKTsKKwkJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LCBzaXplLAorCQkJCQkJJmlvbWFwLCBmbGFncyk7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBlcnJvcjsKKwkJCQlpb21hcF92YWxpZCA9IHhmc19pb21hcF92YWxpZCgmaW9tYXAsIG9mZnNldCk7CisJCQl9CisKKwkJCXR5cGUgPSAwOworCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJIX0xvY2ssICZiaC0+Yl9zdGF0ZSkpIHsKKwkJCQlBU1NFUlQoYnVmZmVyX21hcHBlZChiaCkpOworCQkJCWlmIChpb21hcF92YWxpZCkKKwkJCQkJYWxsX2JoID0gMTsKKwkJCQl4ZnNfYWRkX3RvX2lvZW5kKGlub2RlLCBiaCwgb2Zmc2V0LCB0eXBlLAorCQkJCQkJJmlvZW5kLCAhaW9tYXBfdmFsaWQpOworCQkJCXBhZ2VfZGlydHktLTsKKwkJCQljb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQlpb21hcF92YWxpZCA9IDA7CiAJCQl9CiAJCX0gZWxzZSBpZiAoKGJ1ZmZlcl91cHRvZGF0ZShiaCkgfHwgUGFnZVVwdG9kYXRlKHBhZ2UpKSAmJgogCQkJICAgKHVubWFwcGVkIHx8IHN0YXJ0aW8pKSB7Ci0KLQkJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKLQkJCQlpbnQJc2l6ZTsKLQotCQkJCS8qCi0JCQkJICogR2V0dGluZyBoZXJlIGltcGxpZXMgYW4gdW5tYXBwZWQgYnVmZmVyCi0JCQkJICogd2FzIGZvdW5kLCBhbmQgd2UgYXJlIGluIGEgcGF0aCB3aGVyZSB3ZQotCQkJCSAqIG5lZWQgdG8gd3JpdGUgdGhlIHdob2xlIHBhZ2Ugb3V0LgotCQkJCSAqLwotCQkJCWlmICghaW9tcCkgewotCQkJCQlzaXplID0geGZzX3Byb2JlX3VubWFwcGVkX2NsdXN0ZXIoCi0JCQkJCQkJaW5vZGUsIHBhZ2UsIGJoLCBoZWFkKTsKLQkJCQkJZXJyID0geGZzX21hcF9ibG9ja3MoaW5vZGUsIG9mZnNldCwKLQkJCQkJCQlzaXplLCAmaW9tYXAsCi0JCQkJCQkJQk1BUElfV1JJVEV8Qk1BUElfTU1BUCk7Ci0JCQkJCWlmIChlcnIpIHsKLQkJCQkJCWdvdG8gZXJyb3I7Ci0JCQkJCX0KLQkJCQkJaW9tcCA9IHhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsICZpb21hcCwKLQkJCQkJCQkJICAgICBwX29mZnNldCk7Ci0JCQkJfQotCQkJCWlmIChpb21wKSB7Ci0JCQkJCXhmc19tYXBfYXRfb2Zmc2V0KHBhZ2UsCi0JCQkJCQkJYmgsIHBfb2Zmc2V0LAotCQkJCQkJCWlub2RlLT5pX2Jsa2JpdHMsIGlvbXApOwotCQkJCQlpZiAoc3RhcnRpbykgewotCQkJCQkJYmhfYXJyW2NudCsrXSA9IGJoOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCQkJCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLQkJCQkJfQotCQkJCQlwYWdlX2RpcnR5LS07Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzdGFydGlvKSB7Ci0JCQkJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkgJiYKLQkJCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoQkhfTG9jaywgJmJoLT5iX3N0YXRlKSkgewotCQkJCQliaF9hcnJbY250KytdID0gYmg7Ci0JCQkJCXBhZ2VfZGlydHktLTsKLQkJCQl9Ci0JCQl9CisJCQlpb21hcF92YWxpZCA9IDA7CiAJCX0KLQl9IHdoaWxlIChvZmZzZXQgKz0gbGVuLCBwX29mZnNldCArPSBsZW4sCi0JCSgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpKTsKKworCQlpZiAoIWlvaGVhZCkKKwkJCWlvaGVhZCA9IGlvZW5kOworCisJfSB3aGlsZSAob2Zmc2V0ICs9IGxlbiwgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCkpOwogCiAJaWYgKHVwdG9kYXRlICYmIGJoID09IGhlYWQpCiAJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAotCWlmIChzdGFydGlvKSB7Ci0JCXhmc19zdWJtaXRfcGFnZShwYWdlLCB3YmMsIGJoX2FyciwgY250LCAwLCAhcGFnZV9kaXJ0eSk7Ci0JfQorCWlmIChzdGFydGlvKQorCQl4ZnNfc3RhcnRfcGFnZV93cml0ZWJhY2socGFnZSwgd2JjLCAxLCBjb3VudCk7CiAKLQlpZiAoaW9tcCkgewotCQlvZmZzZXQgPSAoaW9tcC0+aW9tYXBfb2Zmc2V0ICsgaW9tcC0+aW9tYXBfYnNpemUgLSAxKSA+PgorCWlmIChpb2VuZCAmJiBpb21hcF92YWxpZCkgeworCQlvZmZzZXQgPSAoaW9tYXAuaW9tYXBfb2Zmc2V0ICsgaW9tYXAuaW9tYXBfYnNpemUgLSAxKSA+PgogCQkJCQlQQUdFX0NBQ0hFX1NISUZUOwogCQl0bGFzdCA9IG1pbl90KHBnb2ZmX3QsIG9mZnNldCwgbGFzdF9pbmRleCk7Ci0JCXhmc19jbHVzdGVyX3dyaXRlKGlub2RlLCBwYWdlLT5pbmRleCArIDEsIGlvbXAsIHdiYywKLQkJCQkJc3RhcnRpbywgdW5tYXBwZWQsIHRsYXN0KTsKKwkJeGZzX2NsdXN0ZXJfd3JpdGUoaW5vZGUsIHBhZ2UtPmluZGV4ICsgMSwgJmlvbWFwLCAmaW9lbmQsCisJCQkJCXdiYywgc3RhcnRpbywgYWxsX2JoLCB0bGFzdCk7CiAJfQogCisJaWYgKGlvaGVhZCkKKwkJeGZzX3N1Ym1pdF9pb2VuZChpb2hlYWQpOworCiAJcmV0dXJuIHBhZ2VfZGlydHk7CiAKIGVycm9yOgotCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgewotCQl1bmxvY2tfYnVmZmVyKGJoX2FycltpXSk7Ci0JfQorCWlmIChpb2hlYWQpCisJCXhmc19jYW5jZWxfaW9lbmQoaW9oZWFkKTsKIAogCS8qCiAJICogSWYgaXQncyBkZWxhbGxvYyBhbmQgd2UgaGF2ZSBub3doZXJlIHRvIHB1dCBpdCwKQEAgLTkxNiw5ICsxMDA5LDggQEAKIAkgKiB1cyB0byB0cnkgYWdhaW4uCiAJICovCiAJaWYgKGVyciAhPSAtRUFHQUlOKSB7Ci0JCWlmICghdW5tYXBwZWQpIHsKKwkJaWYgKCF1bm1hcHBlZCkKIAkJCWJsb2NrX2ludmFsaWRhdGVwYWdlKHBhZ2UsIDApOwotCQl9CiAJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtOTgyLDcgKzEwNzQsNyBAQAogCX0KIAogCS8qIElmIHRoaXMgaXMgYSByZWFsdGltZSBmaWxlLCBkYXRhIG1pZ2h0IGJlIG9uIGEgbmV3IGRldmljZSAqLwotCWJoX3Jlc3VsdC0+Yl9iZGV2ID0gaW9tYXAuaW9tYXBfdGFyZ2V0LT5wYnJfYmRldjsKKwliaF9yZXN1bHQtPmJfYmRldiA9IGlvbWFwLmlvbWFwX3RhcmdldC0+YnRfYmRldjsKIAogCS8qIElmIHdlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGEgYmxvY2sgb3V0IGJleW9uZCBlb2YgYW5kCiAJICogd2UgYXJlIG5vdyBjb21pbmcgYmFjayB0byB1c2UgaXQgdGhlbiB3ZSB3aWxsIG5lZWQgdG8KQEAgLTEwOTQsMTAgKzExODYsMTAgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiAtZXJyb3I7CiAKLQlpb2NiLT5wcml2YXRlID0geGZzX2FsbG9jX2lvZW5kKGlub2RlKTsKKwlpb2NiLT5wcml2YXRlID0geGZzX2FsbG9jX2lvZW5kKGlub2RlLCBJT01BUF9VTldSSVRURU4pOwogCiAJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPX293bl9sb2NraW5nKHJ3LCBpb2NiLCBpbm9kZSwKLQkJaW9tYXAuaW9tYXBfdGFyZ2V0LT5wYnJfYmRldiwKKwkJaW9tYXAuaW9tYXBfdGFyZ2V0LT5idF9iZGV2LAogCQlpb3YsIG9mZnNldCwgbnJfc2VncywKIAkJbGludmZzX2dldF9ibG9ja3NfZGlyZWN0LAogCQlsaW52ZnNfZW5kX2lvX2RpcmVjdCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmgKaW5kZXggNDcyMDc1OC4uNTUzMzlkZCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaApAQCAtMjMsMTQgKzIzLDI0IEBACiAKIHR5cGVkZWYgdm9pZCAoKnhmc19pb2VuZF9mdW5jX3QpKHZvaWQgKik7CiAKKy8qCisgKiB4ZnNfaW9lbmQgc3RydWN0IG1hbmFnZXMgbGFyZ2UgZXh0ZW50IHdyaXRlcyBmb3IgWEZTLgorICogSXQgY2FuIG1hbmFnZSBzZXZlcmFsIG11bHRpLXBhZ2UgYmlvJ3MgYXQgb25jZS4KKyAqLwogdHlwZWRlZiBzdHJ1Y3QgeGZzX2lvZW5kIHsKKwlzdHJ1Y3QgeGZzX2lvZW5kCSppb19saXN0OwkvKiBuZXh0IGlvZW5kIGluIGNoYWluICovCisJdW5zaWduZWQgaW50CQlpb190eXBlOwkvKiBkZWxhbGxvYyAvIHVud3JpdHRlbiAqLwogCXVuc2lnbmVkIGludAkJaW9fdXB0b2RhdGU7CS8qIEkvTyBzdGF0dXMgcmVnaXN0ZXIgKi8KIAlhdG9taWNfdAkJaW9fcmVtYWluaW5nOwkvKiBob2xkIGNvdW50ICovCiAJc3RydWN0IHZub2RlCQkqaW9fdm5vZGU7CS8qIGZpbGUgYmVpbmcgd3JpdHRlbiB0byAqLwogCXN0cnVjdCBidWZmZXJfaGVhZAkqaW9fYnVmZmVyX2hlYWQ7LyogYnVmZmVyIGxpbmtlZCBsaXN0IGhlYWQgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmlvX2J1ZmZlcl90YWlsOy8qIGJ1ZmZlciBsaW5rZWQgbGlzdCB0YWlsICovCiAJc2l6ZV90CQkJaW9fc2l6ZTsJLyogc2l6ZSBvZiB0aGUgZXh0ZW50ICovCiAJeGZzX29mZl90CQlpb19vZmZzZXQ7CS8qIG9mZnNldCBpbiB0aGUgZmlsZSAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdAlpb193b3JrOwkvKiB4ZnNkYXRhZCB3b3JrIHF1ZXVlICovCiB9IHhmc19pb2VuZF90OwogCitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBsaW52ZnNfYW9wczsKK2V4dGVybiBpbnQgbGludmZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworCiAjZW5kaWYgLyogX19YRlNfSU9QU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKaW5kZXggNmZlMjFkMi4uZTQ0YjdjMSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKQEAgLTMxLDc2ICszMSw3NyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlICJ4ZnNfbGludXguaCIKIAotU1RBVElDIGttZW1fY2FjaGVfdCAqcGFnZWJ1Zl96b25lOwotU1RBVElDIGttZW1fc2hha2VyX3QgcGFnZWJ1Zl9zaGFrZTsKK1NUQVRJQyBrbWVtX3pvbmVfdCAqeGZzX2J1Zl96b25lOworU1RBVElDIGttZW1fc2hha2VyX3QgeGZzX2J1Zl9zaGFrZTsKK1NUQVRJQyBpbnQgeGZzYnVmZCh2b2lkICopOwogU1RBVElDIGludCB4ZnNidWZkX3dha2V1cChpbnQsIGdmcF90KTsKLVNUQVRJQyB2b2lkIHBhZ2VidWZfZGVsd3JpX3F1ZXVlKHhmc19idWZfdCAqLCBpbnQpOworU1RBVElDIHZvaWQgeGZzX2J1Zl9kZWx3cmlfcXVldWUoeGZzX2J1Zl90ICosIGludCk7CiAKIFNUQVRJQyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzbG9nZF93b3JrcXVldWU7CiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzZGF0YWRfd29ya3F1ZXVlOwogCi0jaWZkZWYgUEFHRUJVRl9UUkFDRQorI2lmZGVmIFhGU19CVUZfVFJBQ0UKIHZvaWQKLXBhZ2VidWZfdHJhY2UoCi0JeGZzX2J1Zl90CSpwYiwKK3hmc19idWZfdHJhY2UoCisJeGZzX2J1Zl90CSpicCwKIAljaGFyCQkqaWQsCiAJdm9pZAkJKmRhdGEsCiAJdm9pZAkJKnJhKQogewotCWt0cmFjZV9lbnRlcihwYWdlYnVmX3RyYWNlX2J1ZiwKLQkJcGIsIGlkLAotCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBiLT5wYl9mbGFncywKLQkJKHZvaWQgKikodW5zaWduZWQgbG9uZylwYi0+cGJfaG9sZC5jb3VudGVyLAotCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBiLT5wYl9zZW1hLmNvdW50LmNvdW50ZXIsCisJa3RyYWNlX2VudGVyKHhmc19idWZfdHJhY2VfYnVmLAorCQlicCwgaWQsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYnAtPmJfZmxhZ3MsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYnAtPmJfaG9sZC5jb3VudGVyLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKWJwLT5iX3NlbWEuY291bnQuY291bnRlciwKIAkJKHZvaWQgKiljdXJyZW50LAogCQlkYXRhLCByYSwKLQkJKHZvaWQgKikodW5zaWduZWQgbG9uZykoKHBiLT5wYl9maWxlX29mZnNldD4+MzIpICYgMHhmZmZmZmZmZiksCi0JCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpKHBiLT5wYl9maWxlX29mZnNldCAmIDB4ZmZmZmZmZmYpLAotCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBiLT5wYl9idWZmZXJfbGVuZ3RoLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKSgoYnAtPmJfZmlsZV9vZmZzZXQ+PjMyKSAmIDB4ZmZmZmZmZmYpLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKShicC0+Yl9maWxlX29mZnNldCAmIDB4ZmZmZmZmZmYpLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKWJwLT5iX2J1ZmZlcl9sZW5ndGgsCiAJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogfQota3RyYWNlX3QgKnBhZ2VidWZfdHJhY2VfYnVmOwotI2RlZmluZSBQQUdFQlVGX1RSQUNFX1NJWkUJNDA5NgotI2RlZmluZSBQQl9UUkFDRShwYiwgaWQsIGRhdGEpCVwKLQlwYWdlYnVmX3RyYWNlKHBiLCBpZCwgKHZvaWQgKilkYXRhLCAodm9pZCAqKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSkKK2t0cmFjZV90ICp4ZnNfYnVmX3RyYWNlX2J1ZjsKKyNkZWZpbmUgWEZTX0JVRl9UUkFDRV9TSVpFCTQwOTYKKyNkZWZpbmUgWEJfVFJBQ0UoYnAsIGlkLCBkYXRhKQlcCisJeGZzX2J1Zl90cmFjZShicCwgaWQsICh2b2lkICopZGF0YSwgKHZvaWQgKilfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCiAjZWxzZQotI2RlZmluZSBQQl9UUkFDRShwYiwgaWQsIGRhdGEpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgWEJfVFJBQ0UoYnAsIGlkLCBkYXRhKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2lmZGVmIFBBR0VCVUZfTE9DS19UUkFDS0lORwotIyBkZWZpbmUgUEJfU0VUX09XTkVSKHBiKQkoKHBiKS0+cGJfbGFzdF9ob2xkZXIgPSBjdXJyZW50LT5waWQpCi0jIGRlZmluZSBQQl9DTEVBUl9PV05FUihwYikJKChwYiktPnBiX2xhc3RfaG9sZGVyID0gLTEpCi0jIGRlZmluZSBQQl9HRVRfT1dORVIocGIpCSgocGIpLT5wYl9sYXN0X2hvbGRlcikKKyNpZmRlZiBYRlNfQlVGX0xPQ0tfVFJBQ0tJTkcKKyMgZGVmaW5lIFhCX1NFVF9PV05FUihicCkJKChicCktPmJfbGFzdF9ob2xkZXIgPSBjdXJyZW50LT5waWQpCisjIGRlZmluZSBYQl9DTEVBUl9PV05FUihicCkJKChicCktPmJfbGFzdF9ob2xkZXIgPSAtMSkKKyMgZGVmaW5lIFhCX0dFVF9PV05FUihicCkJKChicCktPmJfbGFzdF9ob2xkZXIpCiAjZWxzZQotIyBkZWZpbmUgUEJfU0VUX09XTkVSKHBiKQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBQQl9DTEVBUl9PV05FUihwYikJZG8geyB9IHdoaWxlICgwKQotIyBkZWZpbmUgUEJfR0VUX09XTkVSKHBiKQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBYQl9TRVRfT1dORVIoYnApCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIFhCX0NMRUFSX09XTkVSKGJwKQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBYQl9HRVRfT1dORVIoYnApCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi0jZGVmaW5lIHBiX3RvX2dmcChmbGFncykgXAotCSgoKChmbGFncykgJiBQQkZfUkVBRF9BSEVBRCkgPyBfX0dGUF9OT1JFVFJZIDogXAotCSAgKChmbGFncykgJiBQQkZfRE9OVF9CTE9DSykgPyBHRlBfTk9GUyA6IEdGUF9LRVJORUwpIHwgX19HRlBfTk9XQVJOKQorI2RlZmluZSB4Yl90b19nZnAoZmxhZ3MpIFwKKwkoKCgoZmxhZ3MpICYgWEJGX1JFQURfQUhFQUQpID8gX19HRlBfTk9SRVRSWSA6IFwKKwkgICgoZmxhZ3MpICYgWEJGX0RPTlRfQkxPQ0spID8gR0ZQX05PRlMgOiBHRlBfS0VSTkVMKSB8IF9fR0ZQX05PV0FSTikKIAotI2RlZmluZSBwYl90b19rbShmbGFncykgXAotCSAoKChmbGFncykgJiBQQkZfRE9OVF9CTE9DSykgPyBLTV9OT0ZTIDogS01fU0xFRVApCisjZGVmaW5lIHhiX3RvX2ttKGZsYWdzKSBcCisJICgoKGZsYWdzKSAmIFhCRl9ET05UX0JMT0NLKSA/IEtNX05PRlMgOiBLTV9TTEVFUCkKIAotI2RlZmluZSBwYWdlYnVmX2FsbG9jYXRlKGZsYWdzKSBcCi0Ja21lbV96b25lX2FsbG9jKHBhZ2VidWZfem9uZSwgcGJfdG9fa20oZmxhZ3MpKQotI2RlZmluZSBwYWdlYnVmX2RlYWxsb2NhdGUocGIpIFwKLQlrbWVtX3pvbmVfZnJlZShwYWdlYnVmX3pvbmUsIChwYikpOworI2RlZmluZSB4ZnNfYnVmX2FsbG9jYXRlKGZsYWdzKSBcCisJa21lbV96b25lX2FsbG9jKHhmc19idWZfem9uZSwgeGJfdG9fa20oZmxhZ3MpKQorI2RlZmluZSB4ZnNfYnVmX2RlYWxsb2NhdGUoYnApIFwKKwlrbWVtX3pvbmVfZnJlZSh4ZnNfYnVmX3pvbmUsIChicCkpOwogCiAvKgotICogUGFnZSBSZWdpb24gaW50ZXJmYWNlcy4KKyAqCVBhZ2UgUmVnaW9uIGludGVyZmFjZXMuCiAgKgotICogRm9yIHBhZ2VzIGluIGZpbGVzeXN0ZW1zIHdoZXJlIHRoZSBibG9ja3NpemUgaXMgc21hbGxlciB0aGFuIHRoZQotICogcGFnZXNpemUsIHdlIHVzZSB0aGUgcGFnZS0+cHJpdmF0ZSBmaWVsZCAobG9uZykgdG8gaG9sZCBhIGJpdG1hcAotICogb2YgdXB0b2RhdGUgcmVnaW9ucyB3aXRoaW4gdGhlIHBhZ2UuCisgKglGb3IgcGFnZXMgaW4gZmlsZXN5c3RlbXMgd2hlcmUgdGhlIGJsb2Nrc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlCisgKglwYWdlc2l6ZSwgd2UgdXNlIHRoZSBwYWdlLT5wcml2YXRlIGZpZWxkIChsb25nKSB0byBob2xkIGEgYml0bWFwCisgKiAJb2YgdXB0b2RhdGUgcmVnaW9ucyB3aXRoaW4gdGhlIHBhZ2UuCiAgKgotICogRWFjaCBzdWNoIHJlZ2lvbiBpcyAiYnl0ZXMgcGVyIHBhZ2UgLyBiaXRzIHBlciBsb25nIiBieXRlcyBsb25nLgorICoJRWFjaCBzdWNoIHJlZ2lvbiBpcyAiYnl0ZXMgcGVyIHBhZ2UgLyBiaXRzIHBlciBsb25nIiBieXRlcyBsb25nLgogICoKLSAqIE5CUFBSID09IG51bWJlci1vZi1ieXRlcy1wZXItcGFnZS1yZWdpb24KLSAqIEJUT1BSID09IGJ5dGVzLXRvLXBhZ2UtcmVnaW9uIChyb3VuZGVkIHVwKQotICogQlRPUFJUID09IGJ5dGVzLXRvLXBhZ2UtcmVnaW9uLXRydW5jYXRlZCAocm91bmRlZCBkb3duKQorICoJTkJQUFIgPT0gbnVtYmVyLW9mLWJ5dGVzLXBlci1wYWdlLXJlZ2lvbgorICoJQlRPUFIgPT0gYnl0ZXMtdG8tcGFnZS1yZWdpb24gKHJvdW5kZWQgdXApCisgKglCVE9QUlQgPT0gYnl0ZXMtdG8tcGFnZS1yZWdpb24tdHJ1bmNhdGVkIChyb3VuZGVkIGRvd24pCiAgKi8KICNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKICNkZWZpbmUgUFJTSElGVAkJKFBBR0VfQ0FDSEVfU0hJRlQgLSA1KQkvKiAoMzIgPT0gMTw8NSkgKi8KQEAgLTE1OSw3ICsxNjAsNyBAQAogfQogCiAvKgotICogTWFwcGluZyBvZiBtdWx0aS1wYWdlIGJ1ZmZlcnMgaW50byBjb250aWd1b3VzIHZpcnR1YWwgc3BhY2UKKyAqCU1hcHBpbmcgb2YgbXVsdGktcGFnZSBidWZmZXJzIGludG8gY29udGlndW91cyB2aXJ0dWFsIHNwYWNlCiAgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgYV9saXN0IHsKQEAgLTE3Miw3ICsxNzMsNyBAQAogU1RBVElDIERFRklORV9TUElOTE9DSyhhc19sb2NrKTsKIAogLyoKLSAqIFRyeSB0byBiYXRjaCB2dW5tYXBzIGJlY2F1c2UgdGhleSBhcmUgY29zdGx5LgorICoJVHJ5IHRvIGJhdGNoIHZ1bm1hcHMgYmVjYXVzZSB0aGV5IGFyZSBjb3N0bHkuCiAgKi8KIFNUQVRJQyB2b2lkCiBmcmVlX2FkZHJlc3MoCkBAIC0yMTUsODMgKzIxNiw4MyBAQAogfQogCiAvKgotICoJSW50ZXJuYWwgcGFnZWJ1ZiBvYmplY3QgbWFuaXB1bGF0aW9uCisgKglJbnRlcm5hbCB4ZnNfYnVmX3Qgb2JqZWN0IG1hbmlwdWxhdGlvbgogICovCiAKIFNUQVRJQyB2b2lkCi1fcGFnZWJ1Zl9pbml0aWFsaXplKAotCXhmc19idWZfdAkJKnBiLAorX3hmc19idWZfaW5pdGlhbGl6ZSgKKwl4ZnNfYnVmX3QJCSpicCwKIAl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0LAotCWxvZmZfdAkJCXJhbmdlX2Jhc2UsCisJeGZzX29mZl90CQlyYW5nZV9iYXNlLAogCXNpemVfdAkJCXJhbmdlX2xlbmd0aCwKLQlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQorCXhmc19idWZfZmxhZ3NfdAkJZmxhZ3MpCiB7CiAJLyoKLQkgKiBXZSBkb24ndCB3YW50IGNlcnRhaW4gZmxhZ3MgdG8gYXBwZWFyIGluIHBiLT5wYl9mbGFncy4KKwkgKiBXZSBkb24ndCB3YW50IGNlcnRhaW4gZmxhZ3MgdG8gYXBwZWFyIGluIGJfZmxhZ3MuCiAJICovCi0JZmxhZ3MgJj0gfihQQkZfTE9DS3xQQkZfTUFQUEVEfFBCRl9ET05UX0JMT0NLfFBCRl9SRUFEX0FIRUFEKTsKKwlmbGFncyAmPSB+KFhCRl9MT0NLfFhCRl9NQVBQRUR8WEJGX0RPTlRfQkxPQ0t8WEJGX1JFQURfQUhFQUQpOwogCi0JbWVtc2V0KHBiLCAwLCBzaXplb2YoeGZzX2J1Zl90KSk7Ci0JYXRvbWljX3NldCgmcGItPnBiX2hvbGQsIDEpOwotCWluaXRfTVVURVhfTE9DS0VEKCZwYi0+cGJfaW9kb25lc2VtYSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBiLT5wYl9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcGItPnBiX2hhc2hfbGlzdCk7Ci0JaW5pdF9NVVRFWF9MT0NLRUQoJnBiLT5wYl9zZW1hKTsgLyogaGVsZCwgbm8gd2FpdGVycyAqLwotCVBCX1NFVF9PV05FUihwYik7Ci0JcGItPnBiX3RhcmdldCA9IHRhcmdldDsKLQlwYi0+cGJfZmlsZV9vZmZzZXQgPSByYW5nZV9iYXNlOworCW1lbXNldChicCwgMCwgc2l6ZW9mKHhmc19idWZfdCkpOworCWF0b21pY19zZXQoJmJwLT5iX2hvbGQsIDEpOworCWluaXRfTVVURVhfTE9DS0VEKCZicC0+Yl9pb2RvbmVzZW1hKTsKKwlJTklUX0xJU1RfSEVBRCgmYnAtPmJfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJwLT5iX2hhc2hfbGlzdCk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmJwLT5iX3NlbWEpOyAvKiBoZWxkLCBubyB3YWl0ZXJzICovCisJWEJfU0VUX09XTkVSKGJwKTsKKwlicC0+Yl90YXJnZXQgPSB0YXJnZXQ7CisJYnAtPmJfZmlsZV9vZmZzZXQgPSByYW5nZV9iYXNlOwogCS8qCiAJICogU2V0IGJ1ZmZlcl9sZW5ndGggYW5kIGNvdW50X2Rlc2lyZWQgdG8gdGhlIHNhbWUgdmFsdWUgaW5pdGlhbGx5LgogCSAqIEkvTyByb3V0aW5lcyBzaG91bGQgdXNlIGNvdW50X2Rlc2lyZWQsIHdoaWNoIHdpbGwgYmUgdGhlIHNhbWUgaW4KIAkgKiBtb3N0IGNhc2VzIGJ1dCBtYXkgYmUgcmVzZXQgKGUuZy4gWEZTIHJlY292ZXJ5KS4KIAkgKi8KLQlwYi0+cGJfYnVmZmVyX2xlbmd0aCA9IHBiLT5wYl9jb3VudF9kZXNpcmVkID0gcmFuZ2VfbGVuZ3RoOwotCXBiLT5wYl9mbGFncyA9IGZsYWdzOwotCXBiLT5wYl9ibiA9IFhGU19CVUZfREFERFJfTlVMTDsKLQlhdG9taWNfc2V0KCZwYi0+cGJfcGluX2NvdW50LCAwKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwYi0+cGJfd2FpdGVycyk7CisJYnAtPmJfYnVmZmVyX2xlbmd0aCA9IGJwLT5iX2NvdW50X2Rlc2lyZWQgPSByYW5nZV9sZW5ndGg7CisJYnAtPmJfZmxhZ3MgPSBmbGFnczsKKwlicC0+Yl9ibiA9IFhGU19CVUZfREFERFJfTlVMTDsKKwlhdG9taWNfc2V0KCZicC0+Yl9waW5fY291bnQsIDApOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJwLT5iX3dhaXRlcnMpOwogCi0JWEZTX1NUQVRTX0lOQyhwYl9jcmVhdGUpOwotCVBCX1RSQUNFKHBiLCAiaW5pdGlhbGl6ZSIsIHRhcmdldCk7CisJWEZTX1NUQVRTX0lOQyh4Yl9jcmVhdGUpOworCVhCX1RSQUNFKGJwLCAiaW5pdGlhbGl6ZSIsIHRhcmdldCk7CiB9CiAKIC8qCi0gKiBBbGxvY2F0ZSBhIHBhZ2UgYXJyYXkgY2FwYWJsZSBvZiBob2xkaW5nIGEgc3BlY2lmaWVkIG51bWJlcgotICogb2YgcGFnZXMsIGFuZCBwb2ludCB0aGUgcGFnZSBidWYgYXQgaXQuCisgKglBbGxvY2F0ZSBhIHBhZ2UgYXJyYXkgY2FwYWJsZSBvZiBob2xkaW5nIGEgc3BlY2lmaWVkIG51bWJlcgorICoJb2YgcGFnZXMsIGFuZCBwb2ludCB0aGUgcGFnZSBidWYgYXQgaXQuCiAgKi8KIFNUQVRJQyBpbnQKLV9wYWdlYnVmX2dldF9wYWdlcygKLQl4ZnNfYnVmX3QJCSpwYiwKK194ZnNfYnVmX2dldF9wYWdlcygKKwl4ZnNfYnVmX3QJCSpicCwKIAlpbnQJCQlwYWdlX2NvdW50LAotCXBhZ2VfYnVmX2ZsYWdzX3QJZmxhZ3MpCisJeGZzX2J1Zl9mbGFnc190CQlmbGFncykKIHsKIAkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgcGFnZSBsaXN0ICovCi0JaWYgKHBiLT5wYl9wYWdlcyA9PSBOVUxMKSB7Ci0JCXBiLT5wYl9vZmZzZXQgPSBwYWdlX2J1Zl9wb2ZmKHBiLT5wYl9maWxlX29mZnNldCk7Ci0JCXBiLT5wYl9wYWdlX2NvdW50ID0gcGFnZV9jb3VudDsKLQkJaWYgKHBhZ2VfY291bnQgPD0gUEJfUEFHRVMpIHsKLQkJCXBiLT5wYl9wYWdlcyA9IHBiLT5wYl9wYWdlX2FycmF5OworCWlmIChicC0+Yl9wYWdlcyA9PSBOVUxMKSB7CisJCWJwLT5iX29mZnNldCA9IHhmc19idWZfcG9mZihicC0+Yl9maWxlX29mZnNldCk7CisJCWJwLT5iX3BhZ2VfY291bnQgPSBwYWdlX2NvdW50OworCQlpZiAocGFnZV9jb3VudCA8PSBYQl9QQUdFUykgeworCQkJYnAtPmJfcGFnZXMgPSBicC0+Yl9wYWdlX2FycmF5OwogCQl9IGVsc2UgewotCQkJcGItPnBiX3BhZ2VzID0ga21lbV9hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKgotCQkJCQlwYWdlX2NvdW50LCBwYl90b19rbShmbGFncykpOwotCQkJaWYgKHBiLT5wYl9wYWdlcyA9PSBOVUxMKQorCQkJYnAtPmJfcGFnZXMgPSBrbWVtX2FsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqCisJCQkJCXBhZ2VfY291bnQsIHhiX3RvX2ttKGZsYWdzKSk7CisJCQlpZiAoYnAtPmJfcGFnZXMgPT0gTlVMTCkKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQltZW1zZXQocGItPnBiX3BhZ2VzLCAwLCBzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBwYWdlX2NvdW50KTsKKwkJbWVtc2V0KGJwLT5iX3BhZ2VzLCAwLCBzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBwYWdlX2NvdW50KTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKglGcmVlcyBwYl9wYWdlcyBpZiBpdCB3YXMgbWFsbG9jZWQuCisgKglGcmVlcyBiX3BhZ2VzIGlmIGl0IHdhcyBhbGxvY2F0ZWQuCiAgKi8KIFNUQVRJQyB2b2lkCi1fcGFnZWJ1Zl9mcmVlX3BhZ2VzKAorX3hmc19idWZfZnJlZV9wYWdlcygKIAl4ZnNfYnVmX3QJKmJwKQogewotCWlmIChicC0+cGJfcGFnZXMgIT0gYnAtPnBiX3BhZ2VfYXJyYXkpIHsKLQkJa21lbV9mcmVlKGJwLT5wYl9wYWdlcywKLQkJCSAgYnAtPnBiX3BhZ2VfY291bnQgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKikpOworCWlmIChicC0+Yl9wYWdlcyAhPSBicC0+Yl9wYWdlX2FycmF5KSB7CisJCWttZW1fZnJlZShicC0+Yl9wYWdlcywKKwkJCSAgYnAtPmJfcGFnZV9jb3VudCAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSk7CiAJfQogfQogCkBAIC0yOTksNzkgKzMwMCw3OSBAQAogICoJUmVsZWFzZXMgdGhlIHNwZWNpZmllZCBidWZmZXIuCiAgKgogICogCVRoZSBtb2RpZmljYXRpb24gc3RhdGUgb2YgYW55IGFzc29jaWF0ZWQgcGFnZXMgaXMgbGVmdCB1bmNoYW5nZWQuCi0gKiAJVGhlIGJ1ZmZlciBtb3N0IG5vdCBiZSBvbiBhbnkgaGFzaCAtIHVzZSBwYWdlYnVmX3JlbGUgaW5zdGVhZCBmb3IKKyAqIAlUaGUgYnVmZmVyIG1vc3Qgbm90IGJlIG9uIGFueSBoYXNoIC0gdXNlIHhmc19idWZfcmVsZSBpbnN0ZWFkIGZvcgogICogCWhhc2hlZCBhbmQgcmVmY291bnRlZCBidWZmZXJzCiAgKi8KIHZvaWQKLXBhZ2VidWZfZnJlZSgKK3hmc19idWZfZnJlZSgKIAl4ZnNfYnVmX3QJCSpicCkKIHsKLQlQQl9UUkFDRShicCwgImZyZWUiLCAwKTsKKwlYQl9UUkFDRShicCwgImZyZWUiLCAwKTsKIAotCUFTU0VSVChsaXN0X2VtcHR5KCZicC0+cGJfaGFzaF9saXN0KSk7CisJQVNTRVJUKGxpc3RfZW1wdHkoJmJwLT5iX2hhc2hfbGlzdCkpOwogCi0JaWYgKGJwLT5wYl9mbGFncyAmIF9QQkZfUEFHRV9DQUNIRSkgeworCWlmIChicC0+Yl9mbGFncyAmIF9YQkZfUEFHRV9DQUNIRSkgewogCQl1aW50CQlpOwogCi0JCWlmICgoYnAtPnBiX2ZsYWdzICYgUEJGX01BUFBFRCkgJiYgKGJwLT5wYl9wYWdlX2NvdW50ID4gMSkpCi0JCQlmcmVlX2FkZHJlc3MoYnAtPnBiX2FkZHIgLSBicC0+cGJfb2Zmc2V0KTsKKwkJaWYgKChicC0+Yl9mbGFncyAmIFhCRl9NQVBQRUQpICYmIChicC0+Yl9wYWdlX2NvdW50ID4gMSkpCisJCQlmcmVlX2FkZHJlc3MoYnAtPmJfYWRkciAtIGJwLT5iX29mZnNldCk7CiAKLQkJZm9yIChpID0gMDsgaSA8IGJwLT5wYl9wYWdlX2NvdW50OyBpKyspCi0JCQlwYWdlX2NhY2hlX3JlbGVhc2UoYnAtPnBiX3BhZ2VzW2ldKTsKLQkJX3BhZ2VidWZfZnJlZV9wYWdlcyhicCk7Ci0JfSBlbHNlIGlmIChicC0+cGJfZmxhZ3MgJiBfUEJGX0tNRU1fQUxMT0MpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJwLT5iX3BhZ2VfY291bnQ7IGkrKykKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShicC0+Yl9wYWdlc1tpXSk7CisJCV94ZnNfYnVmX2ZyZWVfcGFnZXMoYnApOworCX0gZWxzZSBpZiAoYnAtPmJfZmxhZ3MgJiBfWEJGX0tNRU1fQUxMT0MpIHsKIAkJIC8qCi0JCSAgKiBYWFgoaGNoKTogYnAtPnBiX2NvdW50X2Rlc2lyZWQgbWlnaHQgYmUgaW5jb3JyZWN0IChzZWUKLQkJICAqIHBhZ2VidWZfYXNzb2NpYXRlX21lbW9yeSBmb3IgZGV0YWlscyksIGJ1dCBmb3J0dW5hdGVseQorCQkgICogWFhYKGhjaCk6IGJwLT5iX2NvdW50X2Rlc2lyZWQgbWlnaHQgYmUgaW5jb3JyZWN0IChzZWUKKwkJICAqIHhmc19idWZfYXNzb2NpYXRlX21lbW9yeSBmb3IgZGV0YWlscyksIGJ1dCBmb3J0dW5hdGVseQogCQkgICogdGhlIExpbnV4IHZlcnNpb24gb2Yga21lbV9mcmVlIGlnbm9yZXMgdGhlIGxlbiBhcmd1bWVudC4uCiAJCSAgKi8KLQkJa21lbV9mcmVlKGJwLT5wYl9hZGRyLCBicC0+cGJfY291bnRfZGVzaXJlZCk7Ci0JCV9wYWdlYnVmX2ZyZWVfcGFnZXMoYnApOworCQlrbWVtX2ZyZWUoYnAtPmJfYWRkciwgYnAtPmJfY291bnRfZGVzaXJlZCk7CisJCV94ZnNfYnVmX2ZyZWVfcGFnZXMoYnApOwogCX0KIAotCXBhZ2VidWZfZGVhbGxvY2F0ZShicCk7CisJeGZzX2J1Zl9kZWFsbG9jYXRlKGJwKTsKIH0KIAogLyoKICAqCUZpbmRzIGFsbCBwYWdlcyBmb3IgYnVmZmVyIGluIHF1ZXN0aW9uIGFuZCBidWlsZHMgaXQncyBwYWdlIGxpc3QuCiAgKi8KIFNUQVRJQyBpbnQKLV9wYWdlYnVmX2xvb2t1cF9wYWdlcygKK194ZnNfYnVmX2xvb2t1cF9wYWdlcygKIAl4ZnNfYnVmX3QJCSpicCwKIAl1aW50CQkJZmxhZ3MpCiB7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcgPSBicC0+cGJfdGFyZ2V0LT5wYnJfbWFwcGluZzsKLQlzaXplX3QJCQlibG9ja3NpemUgPSBicC0+cGJfdGFyZ2V0LT5wYnJfYnNpemU7Ci0Jc2l6ZV90CQkJc2l6ZSA9IGJwLT5wYl9jb3VudF9kZXNpcmVkOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nID0gYnAtPmJfdGFyZ2V0LT5idF9tYXBwaW5nOworCXNpemVfdAkJCWJsb2Nrc2l6ZSA9IGJwLT5iX3RhcmdldC0+YnRfYnNpemU7CisJc2l6ZV90CQkJc2l6ZSA9IGJwLT5iX2NvdW50X2Rlc2lyZWQ7CiAJc2l6ZV90CQkJbmJ5dGVzLCBvZmZzZXQ7Ci0JZ2ZwX3QJCQlnZnBfbWFzayA9IHBiX3RvX2dmcChmbGFncyk7CisJZ2ZwX3QJCQlnZnBfbWFzayA9IHhiX3RvX2dmcChmbGFncyk7CiAJdW5zaWduZWQgc2hvcnQJCXBhZ2VfY291bnQsIGk7CiAJcGdvZmZfdAkJCWZpcnN0OwotCWxvZmZfdAkJCWVuZDsKKwl4ZnNfb2ZmX3QJCWVuZDsKIAlpbnQJCQllcnJvcjsKIAotCWVuZCA9IGJwLT5wYl9maWxlX29mZnNldCArIGJwLT5wYl9idWZmZXJfbGVuZ3RoOwotCXBhZ2VfY291bnQgPSBwYWdlX2J1Zl9idG9jKGVuZCkgLSBwYWdlX2J1Zl9idG9jdChicC0+cGJfZmlsZV9vZmZzZXQpOworCWVuZCA9IGJwLT5iX2ZpbGVfb2Zmc2V0ICsgYnAtPmJfYnVmZmVyX2xlbmd0aDsKKwlwYWdlX2NvdW50ID0geGZzX2J1Zl9idG9jKGVuZCkgLSB4ZnNfYnVmX2J0b2N0KGJwLT5iX2ZpbGVfb2Zmc2V0KTsKIAotCWVycm9yID0gX3BhZ2VidWZfZ2V0X3BhZ2VzKGJwLCBwYWdlX2NvdW50LCBmbGFncyk7CisJZXJyb3IgPSBfeGZzX2J1Zl9nZXRfcGFnZXMoYnAsIHBhZ2VfY291bnQsIGZsYWdzKTsKIAlpZiAodW5saWtlbHkoZXJyb3IpKQogCQlyZXR1cm4gZXJyb3I7Ci0JYnAtPnBiX2ZsYWdzIHw9IF9QQkZfUEFHRV9DQUNIRTsKKwlicC0+Yl9mbGFncyB8PSBfWEJGX1BBR0VfQ0FDSEU7CiAKLQlvZmZzZXQgPSBicC0+cGJfb2Zmc2V0OwotCWZpcnN0ID0gYnAtPnBiX2ZpbGVfb2Zmc2V0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJb2Zmc2V0ID0gYnAtPmJfb2Zmc2V0OworCWZpcnN0ID0gYnAtPmJfZmlsZV9vZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAotCWZvciAoaSA9IDA7IGkgPCBicC0+cGJfcGFnZV9jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGJwLT5iX3BhZ2VfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgcGFnZQkqcGFnZTsKIAkJdWludAkJcmV0cmllcyA9IDA7CiAKIAkgICAgICByZXRyeToKIAkJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UobWFwcGluZywgZmlyc3QgKyBpLCBnZnBfbWFzayk7CiAJCWlmICh1bmxpa2VseShwYWdlID09IE5VTEwpKSB7Ci0JCQlpZiAoZmxhZ3MgJiBQQkZfUkVBRF9BSEVBRCkgewotCQkJCWJwLT5wYl9wYWdlX2NvdW50ID0gaTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgYnAtPnBiX3BhZ2VfY291bnQ7IGkrKykKLQkJCQkJdW5sb2NrX3BhZ2UoYnAtPnBiX3BhZ2VzW2ldKTsKKwkJCWlmIChmbGFncyAmIFhCRl9SRUFEX0FIRUFEKSB7CisJCQkJYnAtPmJfcGFnZV9jb3VudCA9IGk7CisJCQkJZm9yIChpID0gMDsgaSA8IGJwLT5iX3BhZ2VfY291bnQ7IGkrKykKKwkJCQkJdW5sb2NrX3BhZ2UoYnAtPmJfcGFnZXNbaV0pOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCkBAIC0zODcsMTMgKzM4OCwxMyBAQAogCQkJCQkiZGVhZGxvY2sgaW4gJXMgKG1vZGU6MHgleClcbiIsCiAJCQkJCV9fRlVOQ1RJT05fXywgZ2ZwX21hc2spOwogCi0JCQlYRlNfU1RBVFNfSU5DKHBiX3BhZ2VfcmV0cmllcyk7CisJCQlYRlNfU1RBVFNfSU5DKHhiX3BhZ2VfcmV0cmllcyk7CiAJCQl4ZnNidWZkX3dha2V1cCgwLCBnZnBfbWFzayk7CiAJCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi81MCk7CiAJCQlnb3RvIHJldHJ5OwogCQl9CiAKLQkJWEZTX1NUQVRTX0lOQyhwYl9wYWdlX2ZvdW5kKTsKKwkJWEZTX1NUQVRTX0lOQyh4Yl9wYWdlX2ZvdW5kKTsKIAogCQluYnl0ZXMgPSBtaW5fdChzaXplX3QsIHNpemUsIFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldCk7CiAJCXNpemUgLT0gbmJ5dGVzOwpAQCAtNDAxLDI3ICs0MDIsMjcgQEAKIAkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKIAkJCXBhZ2VfY291bnQtLTsKIAkJCWlmIChibG9ja3NpemUgPj0gUEFHRV9DQUNIRV9TSVpFKSB7Ci0JCQkJaWYgKGZsYWdzICYgUEJGX1JFQUQpCi0JCQkJCWJwLT5wYl9sb2NrZWQgPSAxOworCQkJCWlmIChmbGFncyAmIFhCRl9SRUFEKQorCQkJCQlicC0+Yl9sb2NrZWQgPSAxOwogCQkJfSBlbHNlIGlmICghUGFnZVByaXZhdGUocGFnZSkpIHsKIAkJCQlpZiAodGVzdF9wYWdlX3JlZ2lvbihwYWdlLCBvZmZzZXQsIG5ieXRlcykpCiAJCQkJCXBhZ2VfY291bnQrKzsKIAkJCX0KIAkJfQogCi0JCWJwLT5wYl9wYWdlc1tpXSA9IHBhZ2U7CisJCWJwLT5iX3BhZ2VzW2ldID0gcGFnZTsKIAkJb2Zmc2V0ID0gMDsKIAl9CiAKLQlpZiAoIWJwLT5wYl9sb2NrZWQpIHsKLQkJZm9yIChpID0gMDsgaSA8IGJwLT5wYl9wYWdlX2NvdW50OyBpKyspCi0JCQl1bmxvY2tfcGFnZShicC0+cGJfcGFnZXNbaV0pOworCWlmICghYnAtPmJfbG9ja2VkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBicC0+Yl9wYWdlX2NvdW50OyBpKyspCisJCQl1bmxvY2tfcGFnZShicC0+Yl9wYWdlc1tpXSk7CiAJfQogCi0JaWYgKHBhZ2VfY291bnQgPT0gYnAtPnBiX3BhZ2VfY291bnQpCi0JCWJwLT5wYl9mbGFncyB8PSBQQkZfRE9ORTsKKwlpZiAocGFnZV9jb3VudCA9PSBicC0+Yl9wYWdlX2NvdW50KQorCQlicC0+Yl9mbGFncyB8PSBYQkZfRE9ORTsKIAotCVBCX1RSQUNFKGJwLCAibG9va3VwX3BhZ2VzIiwgKGxvbmcpcGFnZV9jb3VudCk7CisJWEJfVFJBQ0UoYnAsICJsb29rdXBfcGFnZXMiLCAobG9uZylwYWdlX2NvdW50KTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTQyOSwyMyArNDMwLDIzIEBACiAgKglNYXAgYnVmZmVyIGludG8ga2VybmVsIGFkZHJlc3Mtc3BhY2UgaWYgbmVzc2VjYXJ5LgogICovCiBTVEFUSUMgaW50Ci1fcGFnZWJ1Zl9tYXBfcGFnZXMoCitfeGZzX2J1Zl9tYXBfcGFnZXMoCiAJeGZzX2J1Zl90CQkqYnAsCiAJdWludAkJCWZsYWdzKQogewogCS8qIEEgc2luZ2xlIHBhZ2UgYnVmZmVyIGlzIGFsd2F5cyBtYXBwYWJsZSAqLwotCWlmIChicC0+cGJfcGFnZV9jb3VudCA9PSAxKSB7Ci0JCWJwLT5wYl9hZGRyID0gcGFnZV9hZGRyZXNzKGJwLT5wYl9wYWdlc1swXSkgKyBicC0+cGJfb2Zmc2V0OwotCQlicC0+cGJfZmxhZ3MgfD0gUEJGX01BUFBFRDsKLQl9IGVsc2UgaWYgKGZsYWdzICYgUEJGX01BUFBFRCkgeworCWlmIChicC0+Yl9wYWdlX2NvdW50ID09IDEpIHsKKwkJYnAtPmJfYWRkciA9IHBhZ2VfYWRkcmVzcyhicC0+Yl9wYWdlc1swXSkgKyBicC0+Yl9vZmZzZXQ7CisJCWJwLT5iX2ZsYWdzIHw9IFhCRl9NQVBQRUQ7CisJfSBlbHNlIGlmIChmbGFncyAmIFhCRl9NQVBQRUQpIHsKIAkJaWYgKGFzX2xpc3RfbGVuID4gNjQpCiAJCQlwdXJnZV9hZGRyZXNzZXMoKTsKLQkJYnAtPnBiX2FkZHIgPSB2bWFwKGJwLT5wYl9wYWdlcywgYnAtPnBiX3BhZ2VfY291bnQsCi0JCQkJVk1fTUFQLCBQQUdFX0tFUk5FTCk7Ci0JCWlmICh1bmxpa2VseShicC0+cGJfYWRkciA9PSBOVUxMKSkKKwkJYnAtPmJfYWRkciA9IHZtYXAoYnAtPmJfcGFnZXMsIGJwLT5iX3BhZ2VfY291bnQsCisJCQkJCVZNX01BUCwgUEFHRV9LRVJORUwpOworCQlpZiAodW5saWtlbHkoYnAtPmJfYWRkciA9PSBOVUxMKSkKIAkJCXJldHVybiAtRU5PTUVNOwotCQlicC0+cGJfYWRkciArPSBicC0+cGJfb2Zmc2V0OwotCQlicC0+cGJfZmxhZ3MgfD0gUEJGX01BUFBFRDsKKwkJYnAtPmJfYWRkciArPSBicC0+Yl9vZmZzZXQ7CisJCWJwLT5iX2ZsYWdzIHw9IFhCRl9NQVBQRUQ7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00NTYsOSArNDU3LDcgQEAKICAqLwogCiAvKgotICoJX3BhZ2VidWZfZmluZAotICoKLSAqCUxvb2tzIHVwLCBhbmQgY3JlYXRlcyBpZiBhYnNlbnQsIGEgbG9ja2FibGUgYnVmZmVyIGZvcgorICoJTG9vayB1cCwgYW5kIGNyZWF0ZXMgaWYgYWJzZW50LCBhIGxvY2thYmxlIGJ1ZmZlciBmb3IKICAqCWEgZ2l2ZW4gcmFuZ2Ugb2YgYW4gaW5vZGUuICBUaGUgYnVmZmVyIGlzIHJldHVybmVkCiAgKglsb2NrZWQuCSBJZiBvdGhlciBvdmVybGFwcGluZyBidWZmZXJzIGV4aXN0LCB0aGV5IGFyZQogICoJcmVsZWFzZWQgYmVmb3JlIHRoZSBuZXcgYnVmZmVyIGlzIGNyZWF0ZWQgYW5kIGxvY2tlZCwKQEAgLTQ2Niw1NSArNDY1LDU1IEBACiAgKglhcmUgdW5sb2NrZWQuICBObyBJL08gaXMgaW1wbGllZCBieSB0aGlzIGNhbGwuCiAgKi8KIHhmc19idWZfdCAqCi1fcGFnZWJ1Zl9maW5kKAorX3hmc19idWZfZmluZCgKIAl4ZnNfYnVmdGFyZ190CQkqYnRwLAkvKiBibG9jayBkZXZpY2UgdGFyZ2V0CQkqLwotCWxvZmZfdAkJCWlvZmYsCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZQkqLworCXhmc19vZmZfdAkJaW9mZiwJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCiAJc2l6ZV90CQkJaXNpemUsCS8qIGxlbmd0aCBvZiByYW5nZQkJKi8KLQlwYWdlX2J1Zl9mbGFnc190CWZsYWdzLAkvKiBQQkZfVFJZTE9DSwkJCSovCi0JeGZzX2J1Zl90CQkqbmV3X3BiKS8qIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIJKi8KKwl4ZnNfYnVmX2ZsYWdzX3QJCWZsYWdzLAorCXhmc19idWZfdAkJKm5ld19icCkKIHsKLQlsb2ZmX3QJCQlyYW5nZV9iYXNlOworCXhmc19vZmZfdAkJcmFuZ2VfYmFzZTsKIAlzaXplX3QJCQlyYW5nZV9sZW5ndGg7CiAJeGZzX2J1Zmhhc2hfdAkJKmhhc2g7Ci0JeGZzX2J1Zl90CQkqcGIsICpuOworCXhmc19idWZfdAkJKmJwLCAqbjsKIAogCXJhbmdlX2Jhc2UgPSAoaW9mZiA8PCBCQlNISUZUKTsKIAlyYW5nZV9sZW5ndGggPSAoaXNpemUgPDwgQkJTSElGVCk7CiAKIAkvKiBDaGVjayBmb3IgSU9zIHNtYWxsZXIgdGhhbiB0aGUgc2VjdG9yIHNpemUgLyBub3Qgc2VjdG9yIGFsaWduZWQgKi8KLQlBU1NFUlQoIShyYW5nZV9sZW5ndGggPCAoMSA8PCBidHAtPnBicl9zc2hpZnQpKSk7Ci0JQVNTRVJUKCEocmFuZ2VfYmFzZSAmIChsb2ZmX3QpYnRwLT5wYnJfc21hc2spKTsKKwlBU1NFUlQoIShyYW5nZV9sZW5ndGggPCAoMSA8PCBidHAtPmJ0X3NzaGlmdCkpKTsKKwlBU1NFUlQoIShyYW5nZV9iYXNlICYgKHhmc19vZmZfdClidHAtPmJ0X3NtYXNrKSk7CiAKIAloYXNoID0gJmJ0cC0+YnRfaGFzaFtoYXNoX2xvbmcoKHVuc2lnbmVkIGxvbmcpaW9mZiwgYnRwLT5idF9oYXNoc2hpZnQpXTsKIAogCXNwaW5fbG9jaygmaGFzaC0+YmhfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZoYXNoLT5iaF9saXN0LCBwYl9oYXNoX2xpc3QpIHsKLQkJQVNTRVJUKGJ0cCA9PSBwYi0+cGJfdGFyZ2V0KTsKLQkJaWYgKHBiLT5wYl9maWxlX29mZnNldCA9PSByYW5nZV9iYXNlICYmCi0JCSAgICBwYi0+cGJfYnVmZmVyX2xlbmd0aCA9PSByYW5nZV9sZW5ndGgpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnAsIG4sICZoYXNoLT5iaF9saXN0LCBiX2hhc2hfbGlzdCkgeworCQlBU1NFUlQoYnRwID09IGJwLT5iX3RhcmdldCk7CisJCWlmIChicC0+Yl9maWxlX29mZnNldCA9PSByYW5nZV9iYXNlICYmCisJCSAgICBicC0+Yl9idWZmZXJfbGVuZ3RoID09IHJhbmdlX2xlbmd0aCkgewogCQkJLyoKLQkJCSAqIElmIHdlIGxvb2sgYXQgc29tZXRoaW5nIGJyaW5nIGl0IHRvIHRoZQorCQkJICogSWYgd2UgbG9vayBhdCBzb21ldGhpbmcsIGJyaW5nIGl0IHRvIHRoZQogCQkJICogZnJvbnQgb2YgdGhlIGxpc3QgZm9yIG5leHQgdGltZS4KIAkJCSAqLwotCQkJYXRvbWljX2luYygmcGItPnBiX2hvbGQpOwotCQkJbGlzdF9tb3ZlKCZwYi0+cGJfaGFzaF9saXN0LCAmaGFzaC0+YmhfbGlzdCk7CisJCQlhdG9taWNfaW5jKCZicC0+Yl9ob2xkKTsKKwkJCWxpc3RfbW92ZSgmYnAtPmJfaGFzaF9saXN0LCAmaGFzaC0+YmhfbGlzdCk7CiAJCQlnb3RvIGZvdW5kOwogCQl9CiAJfQogCiAJLyogTm8gbWF0Y2ggZm91bmQgKi8KLQlpZiAobmV3X3BiKSB7Ci0JCV9wYWdlYnVmX2luaXRpYWxpemUobmV3X3BiLCBidHAsIHJhbmdlX2Jhc2UsCisJaWYgKG5ld19icCkgeworCQlfeGZzX2J1Zl9pbml0aWFsaXplKG5ld19icCwgYnRwLCByYW5nZV9iYXNlLAogCQkJCXJhbmdlX2xlbmd0aCwgZmxhZ3MpOwotCQluZXdfcGItPnBiX2hhc2ggPSBoYXNoOwotCQlsaXN0X2FkZCgmbmV3X3BiLT5wYl9oYXNoX2xpc3QsICZoYXNoLT5iaF9saXN0KTsKKwkJbmV3X2JwLT5iX2hhc2ggPSBoYXNoOworCQlsaXN0X2FkZCgmbmV3X2JwLT5iX2hhc2hfbGlzdCwgJmhhc2gtPmJoX2xpc3QpOwogCX0gZWxzZSB7Ci0JCVhGU19TVEFUU19JTkMocGJfbWlzc19sb2NrZWQpOworCQlYRlNfU1RBVFNfSU5DKHhiX21pc3NfbG9ja2VkKTsKIAl9CiAKIAlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7Ci0JcmV0dXJuIG5ld19wYjsKKwlyZXR1cm4gbmV3X2JwOwogCiBmb3VuZDoKIAlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CkBAIC01MjMsNzQgKzUyMiw3MiBAQAogCSAqIGlmIHRoaXMgZG9lcyBub3Qgd29yayB0aGVuIHdlIG5lZWQgdG8gZHJvcCB0aGUKIAkgKiBzcGlubG9jayBhbmQgZG8gYSBoYXJkIGF0dGVtcHQgb24gdGhlIHNlbWFwaG9yZS4KIAkgKi8KLQlpZiAoZG93bl90cnlsb2NrKCZwYi0+cGJfc2VtYSkpIHsKLQkJaWYgKCEoZmxhZ3MgJiBQQkZfVFJZTE9DSykpIHsKKwlpZiAoZG93bl90cnlsb2NrKCZicC0+Yl9zZW1hKSkgeworCQlpZiAoIShmbGFncyAmIFhCRl9UUllMT0NLKSkgewogCQkJLyogd2FpdCBmb3IgYnVmZmVyIG93bmVyc2hpcCAqLwotCQkJUEJfVFJBQ0UocGIsICJnZXRfbG9jayIsIDApOwotCQkJcGFnZWJ1Zl9sb2NrKHBiKTsKLQkJCVhGU19TVEFUU19JTkMocGJfZ2V0X2xvY2tlZF93YWl0ZWQpOworCQkJWEJfVFJBQ0UoYnAsICJnZXRfbG9jayIsIDApOworCQkJeGZzX2J1Zl9sb2NrKGJwKTsKKwkJCVhGU19TVEFUU19JTkMoeGJfZ2V0X2xvY2tlZF93YWl0ZWQpOwogCQl9IGVsc2UgewogCQkJLyogV2UgYXNrZWQgZm9yIGEgdHJ5bG9jayBhbmQgZmFpbGVkLCBubyBuZWVkCiAJCQkgKiB0byBsb29rIGF0IGZpbGUgb2Zmc2V0IGFuZCBsZW5ndGggaGVyZSwgd2UKLQkJCSAqIGtub3cgdGhhdCB0aGlzIHBhZ2VidWYgYXQgbGVhc3Qgb3ZlcmxhcHMgb3VyCi0JCQkgKiBwYWdlYnVmIGFuZCBpcyBsb2NrZWQsIHRoZXJlZm9yZSBvdXIgYnVmZmVyCi0JCQkgKiBlaXRoZXIgZG9lcyBub3QgZXhpc3QsIG9yIGlzIHRoaXMgYnVmZmVyCisJCQkgKiBrbm93IHRoYXQgdGhpcyBidWZmZXIgYXQgbGVhc3Qgb3ZlcmxhcHMgb3VyCisJCQkgKiBidWZmZXIgYW5kIGlzIGxvY2tlZCwgdGhlcmVmb3JlIG91ciBidWZmZXIKKwkJCSAqIGVpdGhlciBkb2VzIG5vdCBleGlzdCwgb3IgaXMgdGhpcyBidWZmZXIuCiAJCQkgKi8KLQotCQkJcGFnZWJ1Zl9yZWxlKHBiKTsKLQkJCVhGU19TVEFUU19JTkMocGJfYnVzeV9sb2NrZWQpOwotCQkJcmV0dXJuIChOVUxMKTsKKwkJCXhmc19idWZfcmVsZShicCk7CisJCQlYRlNfU1RBVFNfSU5DKHhiX2J1c3lfbG9ja2VkKTsKKwkJCXJldHVybiBOVUxMOwogCQl9CiAJfSBlbHNlIHsKIAkJLyogdHJ5bG9jayB3b3JrZWQgKi8KLQkJUEJfU0VUX09XTkVSKHBiKTsKKwkJWEJfU0VUX09XTkVSKGJwKTsKIAl9CiAKLQlpZiAocGItPnBiX2ZsYWdzICYgUEJGX1NUQUxFKSB7Ci0JCUFTU0VSVCgocGItPnBiX2ZsYWdzICYgX1BCRl9ERUxXUklfUSkgPT0gMCk7Ci0JCXBiLT5wYl9mbGFncyAmPSBQQkZfTUFQUEVEOworCWlmIChicC0+Yl9mbGFncyAmIFhCRl9TVEFMRSkgeworCQlBU1NFUlQoKGJwLT5iX2ZsYWdzICYgX1hCRl9ERUxXUklfUSkgPT0gMCk7CisJCWJwLT5iX2ZsYWdzICY9IFhCRl9NQVBQRUQ7CiAJfQotCVBCX1RSQUNFKHBiLCAiZ290X2xvY2siLCAwKTsKLQlYRlNfU1RBVFNfSU5DKHBiX2dldF9sb2NrZWQpOwotCXJldHVybiAocGIpOworCVhCX1RSQUNFKGJwLCAiZ290X2xvY2siLCAwKTsKKwlYRlNfU1RBVFNfSU5DKHhiX2dldF9sb2NrZWQpOworCXJldHVybiBicDsKIH0KIAogLyoKLSAqCXhmc19idWZfZ2V0X2ZsYWdzIGFzc2VtYmxlcyBhIGJ1ZmZlciBjb3ZlcmluZyB0aGUgc3BlY2lmaWVkIHJhbmdlLgotICoKKyAqCUFzc2VtYmxlcyBhIGJ1ZmZlciBjb3ZlcmluZyB0aGUgc3BlY2lmaWVkIHJhbmdlLgogICoJU3RvcmFnZSBpbiBtZW1vcnkgZm9yIGFsbCBwb3J0aW9ucyBvZiB0aGUgYnVmZmVyIHdpbGwgYmUgYWxsb2NhdGVkLAogICoJYWx0aG91Z2ggYmFja2luZyBzdG9yYWdlIG1heSBub3QgYmUuCiAgKi8KIHhmc19idWZfdCAqCi14ZnNfYnVmX2dldF9mbGFncygJCQkvKiBhbGxvY2F0ZSBhIGJ1ZmZlcgkJKi8KK3hmc19idWZfZ2V0X2ZsYWdzKAogCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsLyogdGFyZ2V0IGZvciBidWZmZXIJCSovCi0JbG9mZl90CQkJaW9mZiwJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCisJeGZzX29mZl90CQlpb2ZmLAkvKiBzdGFydGluZyBvZmZzZXQgb2YgcmFuZ2UJKi8KIAlzaXplX3QJCQlpc2l6ZSwJLyogbGVuZ3RoIG9mIHJhbmdlCQkqLwotCXBhZ2VfYnVmX2ZsYWdzX3QJZmxhZ3MpCS8qIFBCRl9UUllMT0NLCQkJKi8KKwl4ZnNfYnVmX2ZsYWdzX3QJCWZsYWdzKQogewotCXhmc19idWZfdAkJKnBiLCAqbmV3X3BiOworCXhmc19idWZfdAkJKmJwLCAqbmV3X2JwOwogCWludAkJCWVycm9yID0gMCwgaTsKIAotCW5ld19wYiA9IHBhZ2VidWZfYWxsb2NhdGUoZmxhZ3MpOwotCWlmICh1bmxpa2VseSghbmV3X3BiKSkKKwluZXdfYnAgPSB4ZnNfYnVmX2FsbG9jYXRlKGZsYWdzKTsKKwlpZiAodW5saWtlbHkoIW5ld19icCkpCiAJCXJldHVybiBOVUxMOwogCi0JcGIgPSBfcGFnZWJ1Zl9maW5kKHRhcmdldCwgaW9mZiwgaXNpemUsIGZsYWdzLCBuZXdfcGIpOwotCWlmIChwYiA9PSBuZXdfcGIpIHsKLQkJZXJyb3IgPSBfcGFnZWJ1Zl9sb29rdXBfcGFnZXMocGIsIGZsYWdzKTsKKwlicCA9IF94ZnNfYnVmX2ZpbmQodGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MsIG5ld19icCk7CisJaWYgKGJwID09IG5ld19icCkgeworCQllcnJvciA9IF94ZnNfYnVmX2xvb2t1cF9wYWdlcyhicCwgZmxhZ3MpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG5vX2J1ZmZlcjsKIAl9IGVsc2UgewotCQlwYWdlYnVmX2RlYWxsb2NhdGUobmV3X3BiKTsKLQkJaWYgKHVubGlrZWx5KHBiID09IE5VTEwpKQorCQl4ZnNfYnVmX2RlYWxsb2NhdGUobmV3X2JwKTsKKwkJaWYgKHVubGlrZWx5KGJwID09IE5VTEwpKQogCQkJcmV0dXJuIE5VTEw7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IHBiLT5wYl9wYWdlX2NvdW50OyBpKyspCi0JCW1hcmtfcGFnZV9hY2Nlc3NlZChwYi0+cGJfcGFnZXNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBicC0+Yl9wYWdlX2NvdW50OyBpKyspCisJCW1hcmtfcGFnZV9hY2Nlc3NlZChicC0+Yl9wYWdlc1tpXSk7CiAKLQlpZiAoIShwYi0+cGJfZmxhZ3MgJiBQQkZfTUFQUEVEKSkgewotCQllcnJvciA9IF9wYWdlYnVmX21hcF9wYWdlcyhwYiwgZmxhZ3MpOworCWlmICghKGJwLT5iX2ZsYWdzICYgWEJGX01BUFBFRCkpIHsKKwkJZXJyb3IgPSBfeGZzX2J1Zl9tYXBfcGFnZXMoYnAsIGZsYWdzKTsKIAkJaWYgKHVubGlrZWx5KGVycm9yKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byBtYXAgcGFnZXNcbiIsCiAJCQkJCV9fRlVOQ1RJT05fXyk7CkBAIC01OTgsOTcgKzU5NSw5NyBAQAogCQl9CiAJfQogCi0JWEZTX1NUQVRTX0lOQyhwYl9nZXQpOworCVhGU19TVEFUU19JTkMoeGJfZ2V0KTsKIAogCS8qCiAJICogQWx3YXlzIGZpbGwgaW4gdGhlIGJsb2NrIG51bWJlciBub3csIHRoZSBtYXBwZWQgY2FzZXMgY2FuIGRvCiAJICogdGhlaXIgb3duIG92ZXJsYXkgb2YgdGhpcyBsYXRlci4KIAkgKi8KLQlwYi0+cGJfYm4gPSBpb2ZmOwotCXBiLT5wYl9jb3VudF9kZXNpcmVkID0gcGItPnBiX2J1ZmZlcl9sZW5ndGg7CisJYnAtPmJfYm4gPSBpb2ZmOworCWJwLT5iX2NvdW50X2Rlc2lyZWQgPSBicC0+Yl9idWZmZXJfbGVuZ3RoOwogCi0JUEJfVFJBQ0UocGIsICJnZXQiLCAodW5zaWduZWQgbG9uZylmbGFncyk7Ci0JcmV0dXJuIHBiOworCVhCX1RSQUNFKGJwLCAiZ2V0IiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCXJldHVybiBicDsKIAogIG5vX2J1ZmZlcjoKLQlpZiAoZmxhZ3MgJiAoUEJGX0xPQ0sgfCBQQkZfVFJZTE9DSykpCi0JCXBhZ2VidWZfdW5sb2NrKHBiKTsKLQlwYWdlYnVmX3JlbGUocGIpOworCWlmIChmbGFncyAmIChYQkZfTE9DSyB8IFhCRl9UUllMT0NLKSkKKwkJeGZzX2J1Zl91bmxvY2soYnApOworCXhmc19idWZfcmVsZShicCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKIHhmc19idWZfdCAqCiB4ZnNfYnVmX3JlYWRfZmxhZ3MoCiAJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCwKLQlsb2ZmX3QJCQlpb2ZmLAorCXhmc19vZmZfdAkJaW9mZiwKIAlzaXplX3QJCQlpc2l6ZSwKLQlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQorCXhmc19idWZfZmxhZ3NfdAkJZmxhZ3MpCiB7Ci0JeGZzX2J1Zl90CQkqcGI7CisJeGZzX2J1Zl90CQkqYnA7CiAKLQlmbGFncyB8PSBQQkZfUkVBRDsKKwlmbGFncyB8PSBYQkZfUkVBRDsKIAotCXBiID0geGZzX2J1Zl9nZXRfZmxhZ3ModGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MpOwotCWlmIChwYikgewotCQlpZiAoIVhGU19CVUZfSVNET05FKHBiKSkgewotCQkJUEJfVFJBQ0UocGIsICJyZWFkIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOwotCQkJWEZTX1NUQVRTX0lOQyhwYl9nZXRfcmVhZCk7Ci0JCQlwYWdlYnVmX2lvc3RhcnQocGIsIGZsYWdzKTsKLQkJfSBlbHNlIGlmIChmbGFncyAmIFBCRl9BU1lOQykgewotCQkJUEJfVFJBQ0UocGIsICJyZWFkX2FzeW5jIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCWJwID0geGZzX2J1Zl9nZXRfZmxhZ3ModGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MpOworCWlmIChicCkgeworCQlpZiAoIVhGU19CVUZfSVNET05FKGJwKSkgeworCQkJWEJfVFJBQ0UoYnAsICJyZWFkIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCQkJWEZTX1NUQVRTX0lOQyh4Yl9nZXRfcmVhZCk7CisJCQl4ZnNfYnVmX2lvc3RhcnQoYnAsIGZsYWdzKTsKKwkJfSBlbHNlIGlmIChmbGFncyAmIFhCRl9BU1lOQykgeworCQkJWEJfVFJBQ0UoYnAsICJyZWFkX2FzeW5jIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOwogCQkJLyoKIAkJCSAqIFJlYWQgYWhlYWQgY2FsbCB3aGljaCBpcyBhbHJlYWR5IHNhdGlzZmllZCwKIAkJCSAqIGRyb3AgdGhlIGJ1ZmZlcgogCQkJICovCiAJCQlnb3RvIG5vX2J1ZmZlcjsKIAkJfSBlbHNlIHsKLQkJCVBCX1RSQUNFKHBiLCAicmVhZF9kb25lIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCQkJWEJfVFJBQ0UoYnAsICJyZWFkX2RvbmUiLCAodW5zaWduZWQgbG9uZylmbGFncyk7CiAJCQkvKiBXZSBkbyBub3Qgd2FudCByZWFkIGluIHRoZSBmbGFncyAqLwotCQkJcGItPnBiX2ZsYWdzICY9IH5QQkZfUkVBRDsKKwkJCWJwLT5iX2ZsYWdzICY9IH5YQkZfUkVBRDsKIAkJfQogCX0KIAotCXJldHVybiBwYjsKKwlyZXR1cm4gYnA7CiAKICBub19idWZmZXI6Ci0JaWYgKGZsYWdzICYgKFBCRl9MT0NLIHwgUEJGX1RSWUxPQ0spKQotCQlwYWdlYnVmX3VubG9jayhwYik7Ci0JcGFnZWJ1Zl9yZWxlKHBiKTsKKwlpZiAoZmxhZ3MgJiAoWEJGX0xPQ0sgfCBYQkZfVFJZTE9DSykpCisJCXhmc19idWZfdW5sb2NrKGJwKTsKKwl4ZnNfYnVmX3JlbGUoYnApOwogCXJldHVybiBOVUxMOwogfQogCiAvKgotICogSWYgd2UgYXJlIG5vdCBsb3cgb24gbWVtb3J5IHRoZW4gZG8gdGhlIHJlYWRhaGVhZCBpbiBhIGRlYWRsb2NrCi0gKiBzYWZlIG1hbm5lci4KKyAqCUlmIHdlIGFyZSBub3QgbG93IG9uIG1lbW9yeSB0aGVuIGRvIHRoZSByZWFkYWhlYWQgaW4gYSBkZWFkbG9jaworICoJc2FmZSBtYW5uZXIuCiAgKi8KIHZvaWQKLXBhZ2VidWZfcmVhZGFoZWFkKAoreGZzX2J1Zl9yZWFkYWhlYWQoCiAJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCwKLQlsb2ZmX3QJCQlpb2ZmLAorCXhmc19vZmZfdAkJaW9mZiwKIAlzaXplX3QJCQlpc2l6ZSwKLQlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQorCXhmc19idWZfZmxhZ3NfdAkJZmxhZ3MpCiB7CiAJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsKIAotCWJkaSA9IHRhcmdldC0+cGJyX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CisJYmRpID0gdGFyZ2V0LT5idF9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOwogCWlmIChiZGlfcmVhZF9jb25nZXN0ZWQoYmRpKSkKIAkJcmV0dXJuOwogCi0JZmxhZ3MgfD0gKFBCRl9UUllMT0NLfFBCRl9BU1lOQ3xQQkZfUkVBRF9BSEVBRCk7CisJZmxhZ3MgfD0gKFhCRl9UUllMT0NLfFhCRl9BU1lOQ3xYQkZfUkVBRF9BSEVBRCk7CiAJeGZzX2J1Zl9yZWFkX2ZsYWdzKHRhcmdldCwgaW9mZiwgaXNpemUsIGZsYWdzKTsKIH0KIAogeGZzX2J1Zl90ICoKLXBhZ2VidWZfZ2V0X2VtcHR5KAoreGZzX2J1Zl9nZXRfZW1wdHkoCiAJc2l6ZV90CQkJbGVuLAogCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQpCiB7Ci0JeGZzX2J1Zl90CQkqcGI7CisJeGZzX2J1Zl90CQkqYnA7CiAKLQlwYiA9IHBhZ2VidWZfYWxsb2NhdGUoMCk7Ci0JaWYgKHBiKQotCQlfcGFnZWJ1Zl9pbml0aWFsaXplKHBiLCB0YXJnZXQsIDAsIGxlbiwgMCk7Ci0JcmV0dXJuIHBiOworCWJwID0geGZzX2J1Zl9hbGxvY2F0ZSgwKTsKKwlpZiAoYnApCisJCV94ZnNfYnVmX2luaXRpYWxpemUoYnAsIHRhcmdldCwgMCwgbGVuLCAwKTsKKwlyZXR1cm4gYnA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKgpAQCAtNzA0LDggKzcwMSw4IEBACiB9CiAKIGludAotcGFnZWJ1Zl9hc3NvY2lhdGVfbWVtb3J5KAotCXhmc19idWZfdAkJKnBiLAoreGZzX2J1Zl9hc3NvY2lhdGVfbWVtb3J5KAorCXhmc19idWZfdAkJKmJwLAogCXZvaWQJCQkqbWVtLAogCXNpemVfdAkJCWxlbikKIHsKQEAgLTcyMiw0MCArNzE5LDQwIEBACiAJCXBhZ2VfY291bnQrKzsKIAogCS8qIEZyZWUgYW55IHByZXZpb3VzIHNldCBvZiBwYWdlIHBvaW50ZXJzICovCi0JaWYgKHBiLT5wYl9wYWdlcykKLQkJX3BhZ2VidWZfZnJlZV9wYWdlcyhwYik7CisJaWYgKGJwLT5iX3BhZ2VzKQorCQlfeGZzX2J1Zl9mcmVlX3BhZ2VzKGJwKTsKIAotCXBiLT5wYl9wYWdlcyA9IE5VTEw7Ci0JcGItPnBiX2FkZHIgPSBtZW07CisJYnAtPmJfcGFnZXMgPSBOVUxMOworCWJwLT5iX2FkZHIgPSBtZW07CiAKLQlydmFsID0gX3BhZ2VidWZfZ2V0X3BhZ2VzKHBiLCBwYWdlX2NvdW50LCAwKTsKKwlydmFsID0gX3hmc19idWZfZ2V0X3BhZ2VzKGJwLCBwYWdlX2NvdW50LCAwKTsKIAlpZiAocnZhbCkKIAkJcmV0dXJuIHJ2YWw7CiAKLQlwYi0+cGJfb2Zmc2V0ID0gb2Zmc2V0OworCWJwLT5iX29mZnNldCA9IG9mZnNldDsKIAlwdHIgPSAoc2l6ZV90KSBtZW0gJiBQQUdFX0NBQ0hFX01BU0s7CiAJZW5kID0gUEFHRV9DQUNIRV9BTElHTigoc2l6ZV90KSBtZW0gKyBsZW4pOwogCWVuZF9jdXIgPSBlbmQ7CiAJLyogc2V0IHVwIGZpcnN0IHBhZ2UgKi8KLQlwYi0+cGJfcGFnZXNbMF0gPSBtZW1fdG9fcGFnZShtZW0pOworCWJwLT5iX3BhZ2VzWzBdID0gbWVtX3RvX3BhZ2UobWVtKTsKIAogCXB0ciArPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JcGItPnBiX3BhZ2VfY291bnQgPSArK2k7CisJYnAtPmJfcGFnZV9jb3VudCA9ICsraTsKIAl3aGlsZSAocHRyIDwgZW5kKSB7Ci0JCXBiLT5wYl9wYWdlc1tpXSA9IG1lbV90b19wYWdlKCh2b2lkICopcHRyKTsKLQkJcGItPnBiX3BhZ2VfY291bnQgPSArK2k7CisJCWJwLT5iX3BhZ2VzW2ldID0gbWVtX3RvX3BhZ2UoKHZvaWQgKilwdHIpOworCQlicC0+Yl9wYWdlX2NvdW50ID0gKytpOwogCQlwdHIgKz0gUEFHRV9DQUNIRV9TSVpFOwogCX0KLQlwYi0+cGJfbG9ja2VkID0gMDsKKwlicC0+Yl9sb2NrZWQgPSAwOwogCi0JcGItPnBiX2NvdW50X2Rlc2lyZWQgPSBwYi0+cGJfYnVmZmVyX2xlbmd0aCA9IGxlbjsKLQlwYi0+cGJfZmxhZ3MgfD0gUEJGX01BUFBFRDsKKwlicC0+Yl9jb3VudF9kZXNpcmVkID0gYnAtPmJfYnVmZmVyX2xlbmd0aCA9IGxlbjsKKwlicC0+Yl9mbGFncyB8PSBYQkZfTUFQUEVEOwogCiAJcmV0dXJuIDA7CiB9CiAKIHhmc19idWZfdCAqCi1wYWdlYnVmX2dldF9ub19kYWRkcigKK3hmc19idWZfZ2V0X25vYWRkcigKIAlzaXplX3QJCQlsZW4sCiAJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCkKIHsKQEAgLTc2NCwxMCArNzYxLDEwIEBACiAJdm9pZAkJCSpkYXRhOwogCWludAkJCWVycm9yOwogCi0JYnAgPSBwYWdlYnVmX2FsbG9jYXRlKDApOworCWJwID0geGZzX2J1Zl9hbGxvY2F0ZSgwKTsKIAlpZiAodW5saWtlbHkoYnAgPT0gTlVMTCkpCiAJCWdvdG8gZmFpbDsKLQlfcGFnZWJ1Zl9pbml0aWFsaXplKGJwLCB0YXJnZXQsIDAsIGxlbiwgMCk7CisJX3hmc19idWZfaW5pdGlhbGl6ZShicCwgdGFyZ2V0LCAwLCBsZW4sIDApOwogCiAgdHJ5X2FnYWluOgogCWRhdGEgPSBrbWVtX2FsbG9jKG1hbGxvY19sZW4sIEtNX1NMRUVQIHwgS01fTUFZRkFJTCk7CkBAIC03NzYsNzggKzc3Myw3MyBAQAogCiAJLyogY2hlY2sgd2hldGhlciBhbGlnbm1lbnQgbWF0Y2hlcy4uICovCiAJaWYgKChfX3BzdW5zaWduZWRfdClkYXRhICE9Ci0JICAgICgoX19wc3Vuc2lnbmVkX3QpZGF0YSAmIH50YXJnZXQtPnBicl9zbWFzaykpIHsKKwkgICAgKChfX3BzdW5zaWduZWRfdClkYXRhICYgfnRhcmdldC0+YnRfc21hc2spKSB7CiAJCS8qIC4uIGVsc2UgZG91YmxlIHRoZSBzaXplIGFuZCB0cnkgYWdhaW4gKi8KIAkJa21lbV9mcmVlKGRhdGEsIG1hbGxvY19sZW4pOwogCQltYWxsb2NfbGVuIDw8PSAxOwogCQlnb3RvIHRyeV9hZ2FpbjsKIAl9CiAKLQllcnJvciA9IHBhZ2VidWZfYXNzb2NpYXRlX21lbW9yeShicCwgZGF0YSwgbGVuKTsKKwllcnJvciA9IHhmc19idWZfYXNzb2NpYXRlX21lbW9yeShicCwgZGF0YSwgbGVuKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbF9mcmVlX21lbTsKLQlicC0+cGJfZmxhZ3MgfD0gX1BCRl9LTUVNX0FMTE9DOworCWJwLT5iX2ZsYWdzIHw9IF9YQkZfS01FTV9BTExPQzsKIAotCXBhZ2VidWZfdW5sb2NrKGJwKTsKKwl4ZnNfYnVmX3VubG9jayhicCk7CiAKLQlQQl9UUkFDRShicCwgIm5vX2RhZGRyIiwgZGF0YSk7CisJWEJfVFJBQ0UoYnAsICJub19kYWRkciIsIGRhdGEpOwogCXJldHVybiBicDsKICBmYWlsX2ZyZWVfbWVtOgogCWttZW1fZnJlZShkYXRhLCBtYWxsb2NfbGVuKTsKICBmYWlsX2ZyZWVfYnVmOgotCXBhZ2VidWZfZnJlZShicCk7CisJeGZzX2J1Zl9mcmVlKGJwKTsKICBmYWlsOgogCXJldHVybiBOVUxMOwogfQogCiAvKgotICoJcGFnZWJ1Zl9ob2xkCi0gKgogICoJSW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvbiBidWZmZXIsIHRvIGhvbGQgdGhlIGJ1ZmZlciBjb25jdXJyZW50bHkKICAqCXdpdGggYW5vdGhlciB0aHJlYWQgd2hpY2ggbWF5IHJlbGVhc2UgKGZyZWUpIHRoZSBidWZmZXIgYXN5bmNocm9ub3VzbHkuCi0gKgogICoJTXVzdCBob2xkIHRoZSBidWZmZXIgYWxyZWFkeSB0byBjYWxsIHRoaXMgZnVuY3Rpb24uCiAgKi8KIHZvaWQKLXBhZ2VidWZfaG9sZCgKLQl4ZnNfYnVmX3QJCSpwYikKK3hmc19idWZfaG9sZCgKKwl4ZnNfYnVmX3QJCSpicCkKIHsKLQlhdG9taWNfaW5jKCZwYi0+cGJfaG9sZCk7Ci0JUEJfVFJBQ0UocGIsICJob2xkIiwgMCk7CisJYXRvbWljX2luYygmYnAtPmJfaG9sZCk7CisJWEJfVFJBQ0UoYnAsICJob2xkIiwgMCk7CiB9CiAKIC8qCi0gKglwYWdlYnVmX3JlbGUKLSAqCi0gKglwYWdlYnVmX3JlbGUgcmVsZWFzZXMgYSBob2xkIG9uIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiAgSWYgdGhlCi0gKgl0aGUgaG9sZCBjb3VudCBpcyAxLCBwYWdlYnVmX3JlbGUgY2FsbHMgcGFnZWJ1Zl9mcmVlLgorICoJUmVsZWFzZXMgYSBob2xkIG9uIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiAgSWYgdGhlCisgKgl0aGUgaG9sZCBjb3VudCBpcyAxLCBjYWxscyB4ZnNfYnVmX2ZyZWUuCiAgKi8KIHZvaWQKLXBhZ2VidWZfcmVsZSgKLQl4ZnNfYnVmX3QJCSpwYikKK3hmc19idWZfcmVsZSgKKwl4ZnNfYnVmX3QJCSpicCkKIHsKLQl4ZnNfYnVmaGFzaF90CQkqaGFzaCA9IHBiLT5wYl9oYXNoOworCXhmc19idWZoYXNoX3QJCSpoYXNoID0gYnAtPmJfaGFzaDsKIAotCVBCX1RSQUNFKHBiLCAicmVsZSIsIHBiLT5wYl9yZWxzZSk7CisJWEJfVFJBQ0UoYnAsICJyZWxlIiwgYnAtPmJfcmVsc2UpOwogCi0JaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJnBiLT5wYl9ob2xkLCAmaGFzaC0+YmhfbG9jaykpIHsKLQkJaWYgKHBiLT5wYl9yZWxzZSkgewotCQkJYXRvbWljX2luYygmcGItPnBiX2hvbGQpOworCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZicC0+Yl9ob2xkLCAmaGFzaC0+YmhfbG9jaykpIHsKKwkJaWYgKGJwLT5iX3JlbHNlKSB7CisJCQlhdG9taWNfaW5jKCZicC0+Yl9ob2xkKTsKIAkJCXNwaW5fdW5sb2NrKCZoYXNoLT5iaF9sb2NrKTsKLQkJCSgqKHBiLT5wYl9yZWxzZSkpIChwYik7Ci0JCX0gZWxzZSBpZiAocGItPnBiX2ZsYWdzICYgUEJGX0ZTX01BTkFHRUQpIHsKKwkJCSgqKGJwLT5iX3JlbHNlKSkgKGJwKTsKKwkJfSBlbHNlIGlmIChicC0+Yl9mbGFncyAmIFhCRl9GU19NQU5BR0VEKSB7CiAJCQlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CiAJCX0gZWxzZSB7Ci0JCQlBU1NFUlQoIShwYi0+cGJfZmxhZ3MgJiAoUEJGX0RFTFdSSXxfUEJGX0RFTFdSSV9RKSkpOwotCQkJbGlzdF9kZWxfaW5pdCgmcGItPnBiX2hhc2hfbGlzdCk7CisJCQlBU1NFUlQoIShicC0+Yl9mbGFncyAmIChYQkZfREVMV1JJfF9YQkZfREVMV1JJX1EpKSk7CisJCQlsaXN0X2RlbF9pbml0KCZicC0+Yl9oYXNoX2xpc3QpOwogCQkJc3Bpbl91bmxvY2soJmhhc2gtPmJoX2xvY2spOwotCQkJcGFnZWJ1Zl9mcmVlKHBiKTsKKwkJCXhmc19idWZfZnJlZShicCk7CiAJCX0KIAl9IGVsc2UgewogCQkvKgogCQkgKiBDYXRjaCByZWZlcmVuY2UgY291bnQgbGVha3MKIAkJICovCi0JCUFTU0VSVChhdG9taWNfcmVhZCgmcGItPnBiX2hvbGQpID49IDApOworCQlBU1NFUlQoYXRvbWljX3JlYWQoJmJwLT5iX2hvbGQpID49IDApOwogCX0KIH0KIApAQCAtODYzLDE2OCArODU1LDEyMiBAQAogICovCiAKIC8qCi0gKglwYWdlYnVmX2NvbmRfbG9jawotICoKLSAqCXBhZ2VidWZfY29uZF9sb2NrIGxvY2tzIGEgYnVmZmVyIG9iamVjdCwgaWYgaXQgaXMgbm90IGFscmVhZHkgbG9ja2VkLgotICoJTm90ZSB0aGF0IHRoaXMgaW4gbm8gd2F5Ci0gKglsb2NrcyB0aGUgdW5kZXJseWluZyBwYWdlcywgc28gaXQgaXMgb25seSB1c2VmdWwgZm9yIHN5bmNocm9uaXppbmcKLSAqCWNvbmN1cnJlbnQgdXNlIG9mIHBhZ2UgYnVmZmVyIG9iamVjdHMsIG5vdCBmb3Igc3luY2hyb25pemluZyBpbmRlcGVuZGVudAotICoJYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHBhZ2VzLgorICoJTG9ja3MgYSBidWZmZXIgb2JqZWN0LCBpZiBpdCBpcyBub3QgYWxyZWFkeSBsb2NrZWQuCisgKglOb3RlIHRoYXQgdGhpcyBpbiBubyB3YXkgbG9ja3MgdGhlIHVuZGVybHlpbmcgcGFnZXMsIHNvIGl0IGlzIG9ubHkKKyAqCXVzZWZ1bCBmb3Igc3luY2hyb25pemluZyBjb25jdXJyZW50IHVzZSBvZiBidWZmZXIgb2JqZWN0cywgbm90IGZvcgorICoJc3luY2hyb25pemluZyBpbmRlcGVuZGVudCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgcGFnZXMuCiAgKi8KIGludAotcGFnZWJ1Zl9jb25kX2xvY2soCQkJLyogbG9jayBidWZmZXIsIGlmIG5vdCBsb2NrZWQJKi8KLQkJCQkJLyogcmV0dXJucyAtRUJVU1kgaWYgbG9ja2VkKQkqLwotCXhmc19idWZfdAkJKnBiKQoreGZzX2J1Zl9jb25kX2xvY2soCisJeGZzX2J1Zl90CQkqYnApCiB7CiAJaW50CQkJbG9ja2VkOwogCi0JbG9ja2VkID0gZG93bl90cnlsb2NrKCZwYi0+cGJfc2VtYSkgPT0gMDsKKwlsb2NrZWQgPSBkb3duX3RyeWxvY2soJmJwLT5iX3NlbWEpID09IDA7CiAJaWYgKGxvY2tlZCkgewotCQlQQl9TRVRfT1dORVIocGIpOworCQlYQl9TRVRfT1dORVIoYnApOwogCX0KLQlQQl9UUkFDRShwYiwgImNvbmRfbG9jayIsIChsb25nKWxvY2tlZCk7Ci0JcmV0dXJuKGxvY2tlZCA/IDAgOiAtRUJVU1kpOworCVhCX1RSQUNFKGJwLCAiY29uZF9sb2NrIiwgKGxvbmcpbG9ja2VkKTsKKwlyZXR1cm4gbG9ja2VkID8gMCA6IC1FQlVTWTsKIH0KIAogI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWEZTX0JMSV9UUkFDRSkKLS8qCi0gKglwYWdlYnVmX2xvY2tfdmFsdWUKLSAqCi0gKglSZXR1cm4gbG9jayB2YWx1ZSBmb3IgYSBwYWdlYnVmCi0gKi8KIGludAotcGFnZWJ1Zl9sb2NrX3ZhbHVlKAotCXhmc19idWZfdAkJKnBiKQoreGZzX2J1Zl9sb2NrX3ZhbHVlKAorCXhmc19idWZfdAkJKmJwKQogewotCXJldHVybihhdG9taWNfcmVhZCgmcGItPnBiX3NlbWEuY291bnQpKTsKKwlyZXR1cm4gYXRvbWljX3JlYWQoJmJwLT5iX3NlbWEuY291bnQpOwogfQogI2VuZGlmCiAKIC8qCi0gKglwYWdlYnVmX2xvY2sKLSAqCi0gKglwYWdlYnVmX2xvY2sgbG9ja3MgYSBidWZmZXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgaW4gbm8gd2F5Ci0gKglsb2NrcyB0aGUgdW5kZXJseWluZyBwYWdlcywgc28gaXQgaXMgb25seSB1c2VmdWwgZm9yIHN5bmNocm9uaXppbmcKLSAqCWNvbmN1cnJlbnQgdXNlIG9mIHBhZ2UgYnVmZmVyIG9iamVjdHMsIG5vdCBmb3Igc3luY2hyb25pemluZyBpbmRlcGVuZGVudAotICoJYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHBhZ2VzLgorICoJTG9ja3MgYSBidWZmZXIgb2JqZWN0LgorICoJTm90ZSB0aGF0IHRoaXMgaW4gbm8gd2F5IGxvY2tzIHRoZSB1bmRlcmx5aW5nIHBhZ2VzLCBzbyBpdCBpcyBvbmx5CisgKgl1c2VmdWwgZm9yIHN5bmNocm9uaXppbmcgY29uY3VycmVudCB1c2Ugb2YgYnVmZmVyIG9iamVjdHMsIG5vdCBmb3IKKyAqCXN5bmNocm9uaXppbmcgaW5kZXBlbmRlbnQgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHBhZ2VzLgogICovCi1pbnQKLXBhZ2VidWZfbG9jaygKLQl4ZnNfYnVmX3QJCSpwYikKK3ZvaWQKK3hmc19idWZfbG9jaygKKwl4ZnNfYnVmX3QJCSpicCkKIHsKLQlQQl9UUkFDRShwYiwgImxvY2siLCAwKTsKLQlpZiAoYXRvbWljX3JlYWQoJnBiLT5wYl9pb19yZW1haW5pbmcpKQotCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UocGItPnBiX3RhcmdldC0+cGJyX21hcHBpbmcpOwotCWRvd24oJnBiLT5wYl9zZW1hKTsKLQlQQl9TRVRfT1dORVIocGIpOwotCVBCX1RSQUNFKHBiLCAibG9ja2VkIiwgMCk7Ci0JcmV0dXJuIDA7CisJWEJfVFJBQ0UoYnAsICJsb2NrIiwgMCk7CisJaWYgKGF0b21pY19yZWFkKCZicC0+Yl9pb19yZW1haW5pbmcpKQorCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UoYnAtPmJfdGFyZ2V0LT5idF9tYXBwaW5nKTsKKwlkb3duKCZicC0+Yl9zZW1hKTsKKwlYQl9TRVRfT1dORVIoYnApOworCVhCX1RSQUNFKGJwLCAibG9ja2VkIiwgMCk7CiB9CiAKIC8qCi0gKglwYWdlYnVmX3VubG9jawotICoKLSAqCXBhZ2VidWZfdW5sb2NrIHJlbGVhc2VzIHRoZSBsb2NrIG9uIHRoZSBidWZmZXIgb2JqZWN0IGNyZWF0ZWQgYnkKLSAqCXBhZ2VidWZfbG9jayBvciBwYWdlYnVmX2NvbmRfbG9jayAobm90IGFueSBwaW5uaW5nIG9mIHVuZGVybHlpbmcgcGFnZXMKLSAqCWNyZWF0ZWQgYnkgcGFnZWJ1Zl9waW4pLgotICoKKyAqCVJlbGVhc2VzIHRoZSBsb2NrIG9uIHRoZSBidWZmZXIgb2JqZWN0LgogICoJSWYgdGhlIGJ1ZmZlciBpcyBtYXJrZWQgZGVsd3JpIGJ1dCBpcyBub3QgcXVldWVkLCBkbyBzbyBiZWZvcmUgd2UKLSAqCXVubG9jayB0aGUgYnVmZmVyIGFzIHdlIG5lZWQgdG8gc2V0IGZsYWdzIGNvcnJlY3RseS4gV2UgYWxzbyBuZWVkIHRvCisgKgl1bmxvY2sgdGhlIGJ1ZmZlciBhcyB3ZSBuZWVkIHRvIHNldCBmbGFncyBjb3JyZWN0bHkuICBXZSBhbHNvIG5lZWQgdG8KICAqCXRha2UgYSByZWZlcmVuY2UgZm9yIHRoZSBkZWx3cmkgcXVldWUgYmVjYXVzZSB0aGUgdW5sb2NrZXIgaXMgZ29pbmcgdG8KICAqCWRyb3AgdGhlaXIncyBhbmQgdGhleSBkb24ndCBrbm93IHdlIGp1c3QgcXVldWVkIGl0LgogICovCiB2b2lkCi1wYWdlYnVmX3VubG9jaygJCQkJLyogdW5sb2NrIGJ1ZmZlcgkJKi8KLQl4ZnNfYnVmX3QJCSpwYikJLyogYnVmZmVyIHRvIHVubG9jawkJKi8KK3hmc19idWZfdW5sb2NrKAorCXhmc19idWZfdAkJKmJwKQogewotCWlmICgocGItPnBiX2ZsYWdzICYgKFBCRl9ERUxXUkl8X1BCRl9ERUxXUklfUSkpID09IFBCRl9ERUxXUkkpIHsKLQkJYXRvbWljX2luYygmcGItPnBiX2hvbGQpOwotCQlwYi0+cGJfZmxhZ3MgfD0gUEJGX0FTWU5DOwotCQlwYWdlYnVmX2RlbHdyaV9xdWV1ZShwYiwgMCk7CisJaWYgKChicC0+Yl9mbGFncyAmIChYQkZfREVMV1JJfF9YQkZfREVMV1JJX1EpKSA9PSBYQkZfREVMV1JJKSB7CisJCWF0b21pY19pbmMoJmJwLT5iX2hvbGQpOworCQlicC0+Yl9mbGFncyB8PSBYQkZfQVNZTkM7CisJCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwLCAwKTsKIAl9CiAKLQlQQl9DTEVBUl9PV05FUihwYik7Ci0JdXAoJnBiLT5wYl9zZW1hKTsKLQlQQl9UUkFDRShwYiwgInVubG9jayIsIDApOworCVhCX0NMRUFSX09XTkVSKGJwKTsKKwl1cCgmYnAtPmJfc2VtYSk7CisJWEJfVFJBQ0UoYnAsICJ1bmxvY2siLCAwKTsKIH0KIAogCiAvKgogICoJUGlubmluZyBCdWZmZXIgU3RvcmFnZSBpbiBNZW1vcnkKLSAqLwotCi0vKgotICoJcGFnZWJ1Zl9waW4KLSAqCi0gKglwYWdlYnVmX3BpbiBsb2NrcyBhbGwgb2YgdGhlIG1lbW9yeSByZXByZXNlbnRlZCBieSBhIGJ1ZmZlciBpbgotICoJbWVtb3J5LiAgTXVsdGlwbGUgY2FsbHMgdG8gcGFnZWJ1Zl9waW4gYW5kIHBhZ2VidWZfdW5waW4sIGZvcgotICoJdGhlIHNhbWUgb3IgZGlmZmVyZW50IGJ1ZmZlcnMgYWZmZWN0aW5nIGEgZ2l2ZW4gcGFnZSwgd2lsbAotICoJcHJvcGVybHkgY291bnQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyAicGluIiByZXF1ZXN0cy4gIFRoZQotICoJYnVmZmVyIG1heSBiZSByZWxlYXNlZCBhZnRlciB0aGUgcGFnZWJ1Zl9waW4gYW5kIGEgZGlmZmVyZW50Ci0gKglidWZmZXIgdXNlZCB3aGVuIGNhbGxpbmcgcGFnZWJ1Zl91bnBpbiwgaWYgZGVzaXJlZC4KLSAqCXBhZ2VidWZfcGluIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBmaWxlIHN5c3RlbSB3aGVuIGl0IHdhbnRzIGJlCi0gKglhc3N1cmVkIHRoYXQgbm8gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gZm9yY2UgdGhlIGFmZmVjdGVkCi0gKgltZW1vcnkgdG8gZGlzay4JIEl0IGRvZXMgbm90IGFzc3VyZSB0aGF0IGEgZ2l2ZW4gbG9naWNhbCBwYWdlCi0gKgl3aWxsIG5vdCBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBwaHlzaWNhbCBwYWdlLgorICoJRW5zdXJlIHRoYXQgbm8gYXR0ZW1wdCB0byBmb3JjZSBhIGJ1ZmZlciB0byBkaXNrIHdpbGwgc3VjY2VlZC4KICAqLwogdm9pZAotcGFnZWJ1Zl9waW4oCi0JeGZzX2J1Zl90CQkqcGIpCit4ZnNfYnVmX3BpbigKKwl4ZnNfYnVmX3QJCSpicCkKIHsKLQlhdG9taWNfaW5jKCZwYi0+cGJfcGluX2NvdW50KTsKLQlQQl9UUkFDRShwYiwgInBpbiIsIChsb25nKXBiLT5wYl9waW5fY291bnQuY291bnRlcik7CisJYXRvbWljX2luYygmYnAtPmJfcGluX2NvdW50KTsKKwlYQl9UUkFDRShicCwgInBpbiIsIChsb25nKWJwLT5iX3Bpbl9jb3VudC5jb3VudGVyKTsKIH0KIAotLyoKLSAqCXBhZ2VidWZfdW5waW4KLSAqCi0gKglwYWdlYnVmX3VucGluIHJldmVyc2VzIHRoZSBsb2NraW5nIG9mIG1lbW9yeSBwZXJmb3JtZWQgYnkKLSAqCXBhZ2VidWZfcGluLiAgTm90ZSB0aGF0IGJvdGggZnVuY3Rpb25zIGFmZmVjdGVkIHRoZSBsb2dpY2FsCi0gKglwYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlciwgbm90IHRoZSBidWZmZXIgaXRzZWxmLgotICovCiB2b2lkCi1wYWdlYnVmX3VucGluKAotCXhmc19idWZfdAkJKnBiKQoreGZzX2J1Zl91bnBpbigKKwl4ZnNfYnVmX3QJCSpicCkKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGItPnBiX3Bpbl9jb3VudCkpIHsKLQkJd2FrZV91cF9hbGwoJnBiLT5wYl93YWl0ZXJzKTsKLQl9Ci0JUEJfVFJBQ0UocGIsICJ1bnBpbiIsIChsb25nKXBiLT5wYl9waW5fY291bnQuY291bnRlcik7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJwLT5iX3Bpbl9jb3VudCkpCisJCXdha2VfdXBfYWxsKCZicC0+Yl93YWl0ZXJzKTsKKwlYQl9UUkFDRShicCwgInVucGluIiwgKGxvbmcpYnAtPmJfcGluX2NvdW50LmNvdW50ZXIpOwogfQogCiBpbnQKLXBhZ2VidWZfaXNwaW4oCi0JeGZzX2J1Zl90CQkqcGIpCit4ZnNfYnVmX2lzcGluKAorCXhmc19idWZfdAkJKmJwKQogewotCXJldHVybiBhdG9taWNfcmVhZCgmcGItPnBiX3Bpbl9jb3VudCk7CisJcmV0dXJuIGF0b21pY19yZWFkKCZicC0+Yl9waW5fY291bnQpOwogfQogCi0vKgotICoJcGFnZWJ1Zl93YWl0X3VucGluCi0gKgotICoJcGFnZWJ1Zl93YWl0X3VucGluIHdhaXRzIHVudGlsIGFsbCBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQKLSAqCXdpdGggdGhlIGJ1ZmZlciBpcyBub3QgbG9uZ2VyIGxvY2tlZCBpbiBtZW1vcnkuICBJdCByZXR1cm5zCi0gKglpbW1lZGlhdGVseSBpZiBub25lIG9mIHRoZSBhZmZlY3RlZCBwYWdlcyBhcmUgbG9ja2VkLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9wYWdlYnVmX3dhaXRfdW5waW4oCi0JeGZzX2J1Zl90CQkqcGIpCitTVEFUSUMgdm9pZAoreGZzX2J1Zl93YWl0X3VucGluKAorCXhmc19idWZfdAkJKmJwKQogewogCURFQ0xBUkVfV0FJVFFVRVVFCSh3YWl0LCBjdXJyZW50KTsKIAotCWlmIChhdG9taWNfcmVhZCgmcGItPnBiX3Bpbl9jb3VudCkgPT0gMCkKKwlpZiAoYXRvbWljX3JlYWQoJmJwLT5iX3Bpbl9jb3VudCkgPT0gMCkKIAkJcmV0dXJuOwogCi0JYWRkX3dhaXRfcXVldWUoJnBiLT5wYl93YWl0ZXJzLCAmd2FpdCk7CisJYWRkX3dhaXRfcXVldWUoJmJwLT5iX3dhaXRlcnMsICZ3YWl0KTsKIAlmb3IgKDs7KSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKGF0b21pY19yZWFkKCZwYi0+cGJfcGluX2NvdW50KSA9PSAwKQorCQlpZiAoYXRvbWljX3JlYWQoJmJwLT5iX3Bpbl9jb3VudCkgPT0gMCkKIAkJCWJyZWFrOwotCQlpZiAoYXRvbWljX3JlYWQoJnBiLT5wYl9pb19yZW1haW5pbmcpKQotCQkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKHBiLT5wYl90YXJnZXQtPnBicl9tYXBwaW5nKTsKKwkJaWYgKGF0b21pY19yZWFkKCZicC0+Yl9pb19yZW1haW5pbmcpKQorCQkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGJwLT5iX3RhcmdldC0+YnRfbWFwcGluZyk7CiAJCXNjaGVkdWxlKCk7CiAJfQotCXJlbW92ZV93YWl0X3F1ZXVlKCZwYi0+cGJfd2FpdGVycywgJndhaXQpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZicC0+Yl93YWl0ZXJzLCAmd2FpdCk7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIH0KIApAQCAtMTAzMiwyNDEgKzk3OCwyMTYgQEAKICAqCUJ1ZmZlciBVdGlsaXR5IFJvdXRpbmVzCiAgKi8KIAotLyoKLSAqCXBhZ2VidWZfaW9kb25lCi0gKgotICoJcGFnZWJ1Zl9pb2RvbmUgbWFya3MgYSBidWZmZXIgZm9yIHdoaWNoIEkvTyBpcyBpbiBwcm9ncmVzcwotICoJZG9uZSB3aXRoIHJlc3BlY3QgdG8gdGhhdCBJL08uCVRoZSBwYl9pb2RvbmUgcm91dGluZSwgaWYKLSAqCXByZXNlbnQsIHdpbGwgYmUgY2FsbGVkIGFzIGEgc2lkZS1lZmZlY3QuCi0gKi8KIFNUQVRJQyB2b2lkCi1wYWdlYnVmX2lvZG9uZV93b3JrKAoreGZzX2J1Zl9pb2RvbmVfd29yaygKIAl2b2lkCQkJKnYpCiB7CiAJeGZzX2J1Zl90CQkqYnAgPSAoeGZzX2J1Zl90ICopdjsKIAotCWlmIChicC0+cGJfaW9kb25lKQotCQkoKihicC0+cGJfaW9kb25lKSkoYnApOwotCWVsc2UgaWYgKGJwLT5wYl9mbGFncyAmIFBCRl9BU1lOQykKKwlpZiAoYnAtPmJfaW9kb25lKQorCQkoKihicC0+Yl9pb2RvbmUpKShicCk7CisJZWxzZSBpZiAoYnAtPmJfZmxhZ3MgJiBYQkZfQVNZTkMpCiAJCXhmc19idWZfcmVsc2UoYnApOwogfQogCiB2b2lkCi1wYWdlYnVmX2lvZG9uZSgKLQl4ZnNfYnVmX3QJCSpwYiwKK3hmc19idWZfaW9lbmQoCisJeGZzX2J1Zl90CQkqYnAsCiAJaW50CQkJc2NoZWR1bGUpCiB7Ci0JcGItPnBiX2ZsYWdzICY9IH4oUEJGX1JFQUQgfCBQQkZfV1JJVEUpOwotCWlmIChwYi0+cGJfZXJyb3IgPT0gMCkKLQkJcGItPnBiX2ZsYWdzIHw9IFBCRl9ET05FOworCWJwLT5iX2ZsYWdzICY9IH4oWEJGX1JFQUQgfCBYQkZfV1JJVEUpOworCWlmIChicC0+Yl9lcnJvciA9PSAwKQorCQlicC0+Yl9mbGFncyB8PSBYQkZfRE9ORTsKIAotCVBCX1RSQUNFKHBiLCAiaW9kb25lIiwgcGItPnBiX2lvZG9uZSk7CisJWEJfVFJBQ0UoYnAsICJpb2RvbmUiLCBicC0+Yl9pb2RvbmUpOwogCi0JaWYgKChwYi0+cGJfaW9kb25lKSB8fCAocGItPnBiX2ZsYWdzICYgUEJGX0FTWU5DKSkgeworCWlmICgoYnAtPmJfaW9kb25lKSB8fCAoYnAtPmJfZmxhZ3MgJiBYQkZfQVNZTkMpKSB7CiAJCWlmIChzY2hlZHVsZSkgewotCQkJSU5JVF9XT1JLKCZwYi0+cGJfaW9kb25lX3dvcmssIHBhZ2VidWZfaW9kb25lX3dvcmssIHBiKTsKLQkJCXF1ZXVlX3dvcmsoeGZzbG9nZF93b3JrcXVldWUsICZwYi0+cGJfaW9kb25lX3dvcmspOworCQkJSU5JVF9XT1JLKCZicC0+Yl9pb2RvbmVfd29yaywgeGZzX2J1Zl9pb2RvbmVfd29yaywgYnApOworCQkJcXVldWVfd29yayh4ZnNsb2dkX3dvcmtxdWV1ZSwgJmJwLT5iX2lvZG9uZV93b3JrKTsKIAkJfSBlbHNlIHsKLQkJCXBhZ2VidWZfaW9kb25lX3dvcmsocGIpOworCQkJeGZzX2J1Zl9pb2RvbmVfd29yayhicCk7CiAJCX0KIAl9IGVsc2UgewotCQl1cCgmcGItPnBiX2lvZG9uZXNlbWEpOworCQl1cCgmYnAtPmJfaW9kb25lc2VtYSk7CiAJfQogfQogCi0vKgotICoJcGFnZWJ1Zl9pb2Vycm9yCi0gKgotICoJcGFnZWJ1Zl9pb2Vycm9yIHNldHMgdGhlIGVycm9yIGNvZGUgZm9yIGEgYnVmZmVyLgotICovCiB2b2lkCi1wYWdlYnVmX2lvZXJyb3IoCQkJLyogbWFyay9jbGVhciBidWZmZXIgZXJyb3IgZmxhZyAqLwotCXhmc19idWZfdAkJKnBiLAkvKiBidWZmZXIgdG8gbWFyawkJKi8KLQlpbnQJCQllcnJvcikJLyogZXJyb3IgdG8gc3RvcmUgKDAgaWYgbm9uZSkJKi8KK3hmc19idWZfaW9lcnJvcigKKwl4ZnNfYnVmX3QJCSpicCwKKwlpbnQJCQllcnJvcikKIHsKIAlBU1NFUlQoZXJyb3IgPj0gMCAmJiBlcnJvciA8PSAweGZmZmYpOwotCXBiLT5wYl9lcnJvciA9ICh1bnNpZ25lZCBzaG9ydCllcnJvcjsKLQlQQl9UUkFDRShwYiwgImlvZXJyb3IiLCAodW5zaWduZWQgbG9uZyllcnJvcik7CisJYnAtPmJfZXJyb3IgPSAodW5zaWduZWQgc2hvcnQpZXJyb3I7CisJWEJfVFJBQ0UoYnAsICJpb2Vycm9yIiwgKHVuc2lnbmVkIGxvbmcpZXJyb3IpOwogfQogCiAvKgotICoJcGFnZWJ1Zl9pb3N0YXJ0Ci0gKgotICoJcGFnZWJ1Zl9pb3N0YXJ0IGluaXRpYXRlcyBJL08gb24gYSBidWZmZXIsIGJhc2VkIG9uIHRoZSBmbGFncyBzdXBwbGllZC4KLSAqCUlmIG5lY2Vzc2FyeSwgaXQgd2lsbCBhcnJhbmdlIGZvciBhbnkgZGlzayBzcGFjZSBhbGxvY2F0aW9uIHJlcXVpcmVkLAotICoJYW5kIGl0IHdpbGwgYnJlYWsgdXAgdGhlIHJlcXVlc3QgaWYgdGhlIGJsb2NrIG1hcHBpbmdzIHJlcXVpcmUgaXQuCi0gKglUaGUgcGJfaW9kb25lIHJvdXRpbmUgaW4gdGhlIGJ1ZmZlciBzdXBwbGllZCB3aWxsIG9ubHkgYmUgY2FsbGVkCisgKglJbml0aWF0ZSBJL08gb24gYSBidWZmZXIsIGJhc2VkIG9uIHRoZSBmbGFncyBzdXBwbGllZC4KKyAqCVRoZSBiX2lvZG9uZSByb3V0aW5lIGluIHRoZSBidWZmZXIgc3VwcGxpZWQgd2lsbCBvbmx5IGJlIGNhbGxlZAogICoJd2hlbiBhbGwgb2YgdGhlIHN1YnNpZGlhcnkgSS9PIHJlcXVlc3RzLCBpZiBhbnksIGhhdmUgYmVlbiBjb21wbGV0ZWQuCi0gKglwYWdlYnVmX2lvc3RhcnQgY2FsbHMgdGhlIHBhZ2VidWZfaW9pbml0aWF0ZSByb3V0aW5lIG9yCi0gKglwYWdlYnVmX2lvcmVxdWVzdCwgaWYgdGhlIGZvcm1lciByb3V0aW5lIGlzIG5vdCBkZWZpbmVkLCB0byBzdGFydAotICoJdGhlIEkvTyBvbiBhIGdpdmVuIGxvdy1sZXZlbCByZXF1ZXN0LgogICovCiBpbnQKLXBhZ2VidWZfaW9zdGFydCgJCQkvKiBzdGFydCBJL08gb24gYSBidWZmZXIJICAqLwotCXhmc19idWZfdAkJKnBiLAkvKiBidWZmZXIgdG8gc3RhcnQJCSAgKi8KLQlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQkvKiBQQkZfTE9DSywgUEJGX0FTWU5DLCBQQkZfUkVBRCwgKi8KLQkJCQkJLyogUEJGX1dSSVRFLCBQQkZfREVMV1JJLAkgICovCi0JCQkJCS8qIFBCRl9ET05UX0JMT0NLCQkgICovCit4ZnNfYnVmX2lvc3RhcnQoCisJeGZzX2J1Zl90CQkqYnAsCisJeGZzX2J1Zl9mbGFnc190CQlmbGFncykKIHsKIAlpbnQJCQlzdGF0dXMgPSAwOwogCi0JUEJfVFJBQ0UocGIsICJpb3N0YXJ0IiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCVhCX1RSQUNFKGJwLCAiaW9zdGFydCIsICh1bnNpZ25lZCBsb25nKWZsYWdzKTsKIAotCWlmIChmbGFncyAmIFBCRl9ERUxXUkkpIHsKLQkJcGItPnBiX2ZsYWdzICY9IH4oUEJGX1JFQUQgfCBQQkZfV1JJVEUgfCBQQkZfQVNZTkMpOwotCQlwYi0+cGJfZmxhZ3MgfD0gZmxhZ3MgJiAoUEJGX0RFTFdSSSB8IFBCRl9BU1lOQyk7Ci0JCXBhZ2VidWZfZGVsd3JpX3F1ZXVlKHBiLCAxKTsKKwlpZiAoZmxhZ3MgJiBYQkZfREVMV1JJKSB7CisJCWJwLT5iX2ZsYWdzICY9IH4oWEJGX1JFQUQgfCBYQkZfV1JJVEUgfCBYQkZfQVNZTkMpOworCQlicC0+Yl9mbGFncyB8PSBmbGFncyAmIChYQkZfREVMV1JJIHwgWEJGX0FTWU5DKTsKKwkJeGZzX2J1Zl9kZWx3cmlfcXVldWUoYnAsIDEpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotCXBiLT5wYl9mbGFncyAmPSB+KFBCRl9SRUFEIHwgUEJGX1dSSVRFIHwgUEJGX0FTWU5DIHwgUEJGX0RFTFdSSSB8IFwKLQkJCVBCRl9SRUFEX0FIRUFEIHwgX1BCRl9SVU5fUVVFVUVTKTsKLQlwYi0+cGJfZmxhZ3MgfD0gZmxhZ3MgJiAoUEJGX1JFQUQgfCBQQkZfV1JJVEUgfCBQQkZfQVNZTkMgfCBcCi0JCQlQQkZfUkVBRF9BSEVBRCB8IF9QQkZfUlVOX1FVRVVFUyk7CisJYnAtPmJfZmxhZ3MgJj0gfihYQkZfUkVBRCB8IFhCRl9XUklURSB8IFhCRl9BU1lOQyB8IFhCRl9ERUxXUkkgfCBcCisJCQlYQkZfUkVBRF9BSEVBRCB8IF9YQkZfUlVOX1FVRVVFUyk7CisJYnAtPmJfZmxhZ3MgfD0gZmxhZ3MgJiAoWEJGX1JFQUQgfCBYQkZfV1JJVEUgfCBYQkZfQVNZTkMgfCBcCisJCQlYQkZfUkVBRF9BSEVBRCB8IF9YQkZfUlVOX1FVRVVFUyk7CiAKLQlCVUdfT04ocGItPnBiX2JuID09IFhGU19CVUZfREFERFJfTlVMTCk7CisJQlVHX09OKGJwLT5iX2JuID09IFhGU19CVUZfREFERFJfTlVMTCk7CiAKIAkvKiBGb3Igd3JpdGVzIGFsbG93IGFuIGFsdGVybmF0ZSBzdHJhdGVneSByb3V0aW5lIHRvIHByZWNlZGUKIAkgKiB0aGUgYWN0dWFsIEkvTyByZXF1ZXN0ICh3aGljaCBtYXkgbm90IGJlIGlzc3VlZCBhdCBhbGwgaW4KIAkgKiBhIHNodXRkb3duIHNpdHVhdGlvbiwgZm9yIGV4YW1wbGUpLgogCSAqLwotCXN0YXR1cyA9IChmbGFncyAmIFBCRl9XUklURSkgPwotCQlwYWdlYnVmX2lvc3RyYXRlZ3kocGIpIDogcGFnZWJ1Zl9pb3JlcXVlc3QocGIpOworCXN0YXR1cyA9IChmbGFncyAmIFhCRl9XUklURSkgPworCQl4ZnNfYnVmX2lvc3RyYXRlZ3koYnApIDogeGZzX2J1Zl9pb3JlcXVlc3QoYnApOwogCiAJLyogV2FpdCBmb3IgSS9PIGlmIHdlIGFyZSBub3QgYW4gYXN5bmMgcmVxdWVzdC4KIAkgKiBOb3RlOiBhc3luYyBJL08gcmVxdWVzdCBjb21wbGV0aW9uIHdpbGwgcmVsZWFzZSB0aGUgYnVmZmVyLAogCSAqIGFuZCB0aGF0IGNhbiBhbHJlYWR5IGJlIGRvbmUgYnkgdGhpcyBwb2ludC4gIFNvIHVzaW5nIHRoZQogCSAqIGJ1ZmZlciBwb2ludGVyIGZyb20gaGVyZSBvbiwgYWZ0ZXIgYXN5bmMgSS9PLCBpcyBpbnZhbGlkLgogCSAqLwotCWlmICghc3RhdHVzICYmICEoZmxhZ3MgJiBQQkZfQVNZTkMpKQotCQlzdGF0dXMgPSBwYWdlYnVmX2lvd2FpdChwYik7CisJaWYgKCFzdGF0dXMgJiYgIShmbGFncyAmIFhCRl9BU1lOQykpCisJCXN0YXR1cyA9IHhmc19idWZfaW93YWl0KGJwKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CiAKLS8qCi0gKiBIZWxwZXIgcm91dGluZSBmb3IgcGFnZWJ1Zl9pb3JlcXVlc3QKLSAqLwotCiBTVEFUSUMgX19pbmxpbmVfXyBpbnQKLV9wYWdlYnVmX2lvbG9ja2VkKAotCXhmc19idWZfdAkJKnBiKQorX3hmc19idWZfaW9sb2NrZWQoCisJeGZzX2J1Zl90CQkqYnApCiB7Ci0JQVNTRVJUKHBiLT5wYl9mbGFncyAmIChQQkZfUkVBRHxQQkZfV1JJVEUpKTsKLQlpZiAocGItPnBiX2ZsYWdzICYgUEJGX1JFQUQpCi0JCXJldHVybiBwYi0+cGJfbG9ja2VkOworCUFTU0VSVChicC0+Yl9mbGFncyAmIChYQkZfUkVBRCB8IFhCRl9XUklURSkpOworCWlmIChicC0+Yl9mbGFncyAmIFhCRl9SRUFEKQorCQlyZXR1cm4gYnAtPmJfbG9ja2VkOwogCXJldHVybiAwOwogfQogCiBTVEFUSUMgX19pbmxpbmVfXyB2b2lkCi1fcGFnZWJ1Zl9pb2RvbmUoCi0JeGZzX2J1Zl90CQkqcGIsCitfeGZzX2J1Zl9pb2VuZCgKKwl4ZnNfYnVmX3QJCSpicCwKIAlpbnQJCQlzY2hlZHVsZSkKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGItPnBiX2lvX3JlbWFpbmluZykgPT0gMSkgewotCQlwYi0+cGJfbG9ja2VkID0gMDsKLQkJcGFnZWJ1Zl9pb2RvbmUocGIsIHNjaGVkdWxlKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYnAtPmJfaW9fcmVtYWluaW5nKSA9PSAxKSB7CisJCWJwLT5iX2xvY2tlZCA9IDA7CisJCXhmc19idWZfaW9lbmQoYnAsIHNjaGVkdWxlKTsKIAl9CiB9CiAKIFNUQVRJQyBpbnQKLWJpb19lbmRfaW9fcGFnZWJ1ZigKK3hmc19idWZfYmlvX2VuZF9pbygKIAlzdHJ1Y3QgYmlvCQkqYmlvLAogCXVuc2lnbmVkIGludAkJYnl0ZXNfZG9uZSwKIAlpbnQJCQllcnJvcikKIHsKLQl4ZnNfYnVmX3QJCSpwYiA9ICh4ZnNfYnVmX3QgKiliaW8tPmJpX3ByaXZhdGU7Ci0JdW5zaWduZWQgaW50CQlibG9ja3NpemUgPSBwYi0+cGJfdGFyZ2V0LT5wYnJfYnNpemU7CisJeGZzX2J1Zl90CQkqYnAgPSAoeGZzX2J1Zl90ICopYmlvLT5iaV9wcml2YXRlOworCXVuc2lnbmVkIGludAkJYmxvY2tzaXplID0gYnAtPmJfdGFyZ2V0LT5idF9ic2l6ZTsKIAlzdHJ1Y3QgYmlvX3ZlYwkJKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CiAKIAlpZiAoYmlvLT5iaV9zaXplKQogCQlyZXR1cm4gMTsKIAogCWlmICghdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncykpCi0JCXBiLT5wYl9lcnJvciA9IEVJTzsKKwkJYnAtPmJfZXJyb3IgPSBFSU87CiAKIAlkbyB7CiAJCXN0cnVjdCBwYWdlCSpwYWdlID0gYnZlYy0+YnZfcGFnZTsKIAotCQlpZiAodW5saWtlbHkocGItPnBiX2Vycm9yKSkgewotCQkJaWYgKHBiLT5wYl9mbGFncyAmIFBCRl9SRUFEKQorCQlpZiAodW5saWtlbHkoYnAtPmJfZXJyb3IpKSB7CisJCQlpZiAoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkKIAkJCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKIAkJCVNldFBhZ2VFcnJvcihwYWdlKTsKLQkJfSBlbHNlIGlmIChibG9ja3NpemUgPT0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCX0gZWxzZSBpZiAoYmxvY2tzaXplID49IFBBR0VfQ0FDSEVfU0laRSkgewogCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCQl9IGVsc2UgaWYgKCFQYWdlUHJpdmF0ZShwYWdlKSAmJgotCQkJCShwYi0+cGJfZmxhZ3MgJiBfUEJGX1BBR0VfQ0FDSEUpKSB7CisJCQkJKGJwLT5iX2ZsYWdzICYgX1hCRl9QQUdFX0NBQ0hFKSkgewogCQkJc2V0X3BhZ2VfcmVnaW9uKHBhZ2UsIGJ2ZWMtPmJ2X29mZnNldCwgYnZlYy0+YnZfbGVuKTsKIAkJfQogCiAJCWlmICgtLWJ2ZWMgPj0gYmlvLT5iaV9pb192ZWMpCiAJCQlwcmVmZXRjaHcoJmJ2ZWMtPmJ2X3BhZ2UtPmZsYWdzKTsKIAotCQlpZiAoX3BhZ2VidWZfaW9sb2NrZWQocGIpKSB7CisJCWlmIChfeGZzX2J1Zl9pb2xvY2tlZChicCkpIHsKIAkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQl9CiAJfSB3aGlsZSAoYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYyk7CiAKLQlfcGFnZWJ1Zl9pb2RvbmUocGIsIDEpOworCV94ZnNfYnVmX2lvZW5kKGJwLCAxKTsKIAliaW9fcHV0KGJpbyk7CiAJcmV0dXJuIDA7CiB9CiAKIFNUQVRJQyB2b2lkCi1fcGFnZWJ1Zl9pb2FwcGx5KAotCXhmc19idWZfdAkJKnBiKQorX3hmc19idWZfaW9hcHBseSgKKwl4ZnNfYnVmX3QJCSpicCkKIHsKIAlpbnQJCQlpLCBydywgbWFwX2ksIHRvdGFsX25yX3BhZ2VzLCBucl9wYWdlczsKIAlzdHJ1Y3QgYmlvCQkqYmlvOwotCWludAkJCW9mZnNldCA9IHBiLT5wYl9vZmZzZXQ7Ci0JaW50CQkJc2l6ZSA9IHBiLT5wYl9jb3VudF9kZXNpcmVkOwotCXNlY3Rvcl90CQlzZWN0b3IgPSBwYi0+cGJfYm47Ci0JdW5zaWduZWQgaW50CQlibG9ja3NpemUgPSBwYi0+cGJfdGFyZ2V0LT5wYnJfYnNpemU7Ci0JaW50CQkJbG9ja2luZyA9IF9wYWdlYnVmX2lvbG9ja2VkKHBiKTsKKwlpbnQJCQlvZmZzZXQgPSBicC0+Yl9vZmZzZXQ7CisJaW50CQkJc2l6ZSA9IGJwLT5iX2NvdW50X2Rlc2lyZWQ7CisJc2VjdG9yX3QJCXNlY3RvciA9IGJwLT5iX2JuOworCXVuc2lnbmVkIGludAkJYmxvY2tzaXplID0gYnAtPmJfdGFyZ2V0LT5idF9ic2l6ZTsKKwlpbnQJCQlsb2NraW5nID0gX3hmc19idWZfaW9sb2NrZWQoYnApOwogCi0JdG90YWxfbnJfcGFnZXMgPSBwYi0+cGJfcGFnZV9jb3VudDsKKwl0b3RhbF9ucl9wYWdlcyA9IGJwLT5iX3BhZ2VfY291bnQ7CiAJbWFwX2kgPSAwOwogCi0JaWYgKHBiLT5wYl9mbGFncyAmIF9QQkZfUlVOX1FVRVVFUykgewotCQlwYi0+cGJfZmxhZ3MgJj0gfl9QQkZfUlVOX1FVRVVFUzsKLQkJcncgPSAocGItPnBiX2ZsYWdzICYgUEJGX1JFQUQpID8gUkVBRF9TWU5DIDogV1JJVEVfU1lOQzsKKwlpZiAoYnAtPmJfZmxhZ3MgJiBfWEJGX1JVTl9RVUVVRVMpIHsKKwkJYnAtPmJfZmxhZ3MgJj0gfl9YQkZfUlVOX1FVRVVFUzsKKwkJcncgPSAoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkgPyBSRUFEX1NZTkMgOiBXUklURV9TWU5DOwogCX0gZWxzZSB7Ci0JCXJ3ID0gKHBiLT5wYl9mbGFncyAmIFBCRl9SRUFEKSA/IFJFQUQgOiBXUklURTsKKwkJcncgPSAoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkgPyBSRUFEIDogV1JJVEU7CiAJfQogCi0JaWYgKHBiLT5wYl9mbGFncyAmIFBCRl9PUkRFUkVEKSB7Ci0JCUFTU0VSVCghKHBiLT5wYl9mbGFncyAmIFBCRl9SRUFEKSk7CisJaWYgKGJwLT5iX2ZsYWdzICYgWEJGX09SREVSRUQpIHsKKwkJQVNTRVJUKCEoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkpOwogCQlydyA9IFdSSVRFX0JBUlJJRVI7CiAJfQogCi0JLyogU3BlY2lhbCBjb2RlIHBhdGggZm9yIHJlYWRpbmcgYSBzdWIgcGFnZSBzaXplIHBhZ2VidWYgaW4gLS0KKwkvKiBTcGVjaWFsIGNvZGUgcGF0aCBmb3IgcmVhZGluZyBhIHN1YiBwYWdlIHNpemUgYnVmZmVyIGluIC0tCiAJICogd2UgcG9wdWxhdGUgdXAgdGhlIHdob2xlIHBhZ2UsIGFuZCBoZW5jZSB0aGUgb3RoZXIgbWV0YWRhdGEKIAkgKiBpbiB0aGUgc2FtZSBwYWdlLiAgVGhpcyBvcHRpbWl6YXRpb24gaXMgb25seSB2YWxpZCB3aGVuIHRoZQotCSAqIGZpbGVzeXN0ZW0gYmxvY2sgc2l6ZSBhbmQgdGhlIHBhZ2Ugc2l6ZSBhcmUgZXF1YWwuCisJICogZmlsZXN5c3RlbSBibG9jayBzaXplIGlzIG5vdCBzbWFsbGVyIHRoYW4gdGhlIHBhZ2Ugc2l6ZS4KIAkgKi8KLQlpZiAoKHBiLT5wYl9idWZmZXJfbGVuZ3RoIDwgUEFHRV9DQUNIRV9TSVpFKSAmJgotCSAgICAocGItPnBiX2ZsYWdzICYgUEJGX1JFQUQpICYmIGxvY2tpbmcgJiYKLQkgICAgKGJsb2Nrc2l6ZSA9PSBQQUdFX0NBQ0hFX1NJWkUpKSB7CisJaWYgKChicC0+Yl9idWZmZXJfbGVuZ3RoIDwgUEFHRV9DQUNIRV9TSVpFKSAmJgorCSAgICAoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkgJiYgbG9ja2luZyAmJgorCSAgICAoYmxvY2tzaXplID49IFBBR0VfQ0FDSEVfU0laRSkpIHsKIAkJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCAxKTsKIAotCQliaW8tPmJpX2JkZXYgPSBwYi0+cGJfdGFyZ2V0LT5wYnJfYmRldjsKKwkJYmlvLT5iaV9iZGV2ID0gYnAtPmJfdGFyZ2V0LT5idF9iZGV2OwogCQliaW8tPmJpX3NlY3RvciA9IHNlY3RvciAtIChvZmZzZXQgPj4gQkJTSElGVCk7Ci0JCWJpby0+YmlfZW5kX2lvID0gYmlvX2VuZF9pb19wYWdlYnVmOwotCQliaW8tPmJpX3ByaXZhdGUgPSBwYjsKKwkJYmlvLT5iaV9lbmRfaW8gPSB4ZnNfYnVmX2Jpb19lbmRfaW87CisJCWJpby0+YmlfcHJpdmF0ZSA9IGJwOwogCi0JCWJpb19hZGRfcGFnZShiaW8sIHBiLT5wYl9wYWdlc1swXSwgUEFHRV9DQUNIRV9TSVpFLCAwKTsKKwkJYmlvX2FkZF9wYWdlKGJpbywgYnAtPmJfcGFnZXNbMF0sIFBBR0VfQ0FDSEVfU0laRSwgMCk7CiAJCXNpemUgPSAwOwogCi0JCWF0b21pY19pbmMoJnBiLT5wYl9pb19yZW1haW5pbmcpOworCQlhdG9taWNfaW5jKCZicC0+Yl9pb19yZW1haW5pbmcpOwogCiAJCWdvdG8gc3VibWl0X2lvOwogCX0KIAogCS8qIExvY2sgZG93biB0aGUgcGFnZXMgd2hpY2ggd2UgbmVlZCB0byBmb3IgdGhlIHJlcXVlc3QgKi8KLQlpZiAobG9ja2luZyAmJiAocGItPnBiX2ZsYWdzICYgUEJGX1dSSVRFKSAmJiAocGItPnBiX2xvY2tlZCA9PSAwKSkgeworCWlmIChsb2NraW5nICYmIChicC0+Yl9mbGFncyAmIFhCRl9XUklURSkgJiYgKGJwLT5iX2xvY2tlZCA9PSAwKSkgewogCQlmb3IgKGkgPSAwOyBzaXplOyBpKyspIHsKIAkJCWludAkJbmJ5dGVzID0gUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0OwotCQkJc3RydWN0IHBhZ2UJKnBhZ2UgPSBwYi0+cGJfcGFnZXNbaV07CisJCQlzdHJ1Y3QgcGFnZQkqcGFnZSA9IGJwLT5iX3BhZ2VzW2ldOwogCiAJCQlpZiAobmJ5dGVzID4gc2l6ZSkKIAkJCQluYnl0ZXMgPSBzaXplOwpAQCAtMTI3NiwzMCArMTE5NywzMCBAQAogCQkJc2l6ZSAtPSBuYnl0ZXM7CiAJCQlvZmZzZXQgPSAwOwogCQl9Ci0JCW9mZnNldCA9IHBiLT5wYl9vZmZzZXQ7Ci0JCXNpemUgPSBwYi0+cGJfY291bnRfZGVzaXJlZDsKKwkJb2Zmc2V0ID0gYnAtPmJfb2Zmc2V0OworCQlzaXplID0gYnAtPmJfY291bnRfZGVzaXJlZDsKIAl9CiAKIG5leHRfY2h1bms6Ci0JYXRvbWljX2luYygmcGItPnBiX2lvX3JlbWFpbmluZyk7CisJYXRvbWljX2luYygmYnAtPmJfaW9fcmVtYWluaW5nKTsKIAlucl9wYWdlcyA9IEJJT19NQVhfU0VDVE9SUyA+PiAoUEFHRV9TSElGVCAtIEJCU0hJRlQpOwogCWlmIChucl9wYWdlcyA+IHRvdGFsX25yX3BhZ2VzKQogCQlucl9wYWdlcyA9IHRvdGFsX25yX3BhZ2VzOwogCiAJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCBucl9wYWdlcyk7Ci0JYmlvLT5iaV9iZGV2ID0gcGItPnBiX3RhcmdldC0+cGJyX2JkZXY7CisJYmlvLT5iaV9iZGV2ID0gYnAtPmJfdGFyZ2V0LT5idF9iZGV2OwogCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOwotCWJpby0+YmlfZW5kX2lvID0gYmlvX2VuZF9pb19wYWdlYnVmOwotCWJpby0+YmlfcHJpdmF0ZSA9IHBiOworCWJpby0+YmlfZW5kX2lvID0geGZzX2J1Zl9iaW9fZW5kX2lvOworCWJpby0+YmlfcHJpdmF0ZSA9IGJwOwogCiAJZm9yICg7IHNpemUgJiYgbnJfcGFnZXM7IG5yX3BhZ2VzLS0sIG1hcF9pKyspIHsKLQkJaW50CW5ieXRlcyA9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKKwkJaW50CXJieXRlcywgbmJ5dGVzID0gUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0OwogCiAJCWlmIChuYnl0ZXMgPiBzaXplKQogCQkJbmJ5dGVzID0gc2l6ZTsKIAotCQlpZiAoYmlvX2FkZF9wYWdlKGJpbywgcGItPnBiX3BhZ2VzW21hcF9pXSwKLQkJCQkJbmJ5dGVzLCBvZmZzZXQpIDwgbmJ5dGVzKQorCQlyYnl0ZXMgPSBiaW9fYWRkX3BhZ2UoYmlvLCBicC0+Yl9wYWdlc1ttYXBfaV0sIG5ieXRlcywgb2Zmc2V0KTsKKwkJaWYgKHJieXRlcyA8IG5ieXRlcykKIAkJCWJyZWFrOwogCiAJCW9mZnNldCA9IDA7CkBAIC0xMzE1LDEwNyArMTIzNiwxMDIgQEAKIAkJCWdvdG8gbmV4dF9jaHVuazsKIAl9IGVsc2UgewogCQliaW9fcHV0KGJpbyk7Ci0JCXBhZ2VidWZfaW9lcnJvcihwYiwgRUlPKTsKKwkJeGZzX2J1Zl9pb2Vycm9yKGJwLCBFSU8pOwogCX0KIH0KIAotLyoKLSAqCXBhZ2VidWZfaW9yZXF1ZXN0IC0tIHRoZSBjb3JlIEkvTyByZXF1ZXN0IHJvdXRpbmUuCi0gKi8KIGludAotcGFnZWJ1Zl9pb3JlcXVlc3QoCQkJLyogc3RhcnQgcmVhbCBJL08JCSovCi0JeGZzX2J1Zl90CQkqcGIpCS8qIGJ1ZmZlciB0byBjb252ZXkgdG8gZGV2aWNlCSovCit4ZnNfYnVmX2lvcmVxdWVzdCgKKwl4ZnNfYnVmX3QJCSpicCkKIHsKLQlQQl9UUkFDRShwYiwgImlvcmVxdWVzdCIsIDApOworCVhCX1RSQUNFKGJwLCAiaW9yZXF1ZXN0IiwgMCk7CiAKLQlpZiAocGItPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSkgewotCQlwYWdlYnVmX2RlbHdyaV9xdWV1ZShwYiwgMSk7CisJaWYgKGJwLT5iX2ZsYWdzICYgWEJGX0RFTFdSSSkgeworCQl4ZnNfYnVmX2RlbHdyaV9xdWV1ZShicCwgMSk7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfV1JJVEUpIHsKLQkJX3BhZ2VidWZfd2FpdF91bnBpbihwYik7CisJaWYgKGJwLT5iX2ZsYWdzICYgWEJGX1dSSVRFKSB7CisJCXhmc19idWZfd2FpdF91bnBpbihicCk7CiAJfQogCi0JcGFnZWJ1Zl9ob2xkKHBiKTsKKwl4ZnNfYnVmX2hvbGQoYnApOwogCiAJLyogU2V0IHRoZSBjb3VudCB0byAxIGluaXRpYWxseSwgdGhpcyB3aWxsIHN0b3AgYW4gSS9PCiAJICogY29tcGxldGlvbiBjYWxsb3V0IHdoaWNoIGhhcHBlbnMgYmVmb3JlIHdlIGhhdmUgc3RhcnRlZAotCSAqIGFsbCB0aGUgSS9PIGZyb20gY2FsbGluZyBwYWdlYnVmX2lvZG9uZSB0b28gZWFybHkuCisJICogYWxsIHRoZSBJL08gZnJvbSBjYWxsaW5nIHhmc19idWZfaW9lbmQgdG9vIGVhcmx5LgogCSAqLwotCWF0b21pY19zZXQoJnBiLT5wYl9pb19yZW1haW5pbmcsIDEpOwotCV9wYWdlYnVmX2lvYXBwbHkocGIpOwotCV9wYWdlYnVmX2lvZG9uZShwYiwgMCk7CisJYXRvbWljX3NldCgmYnAtPmJfaW9fcmVtYWluaW5nLCAxKTsKKwlfeGZzX2J1Zl9pb2FwcGx5KGJwKTsKKwlfeGZzX2J1Zl9pb2VuZChicCwgMCk7CiAKLQlwYWdlYnVmX3JlbGUocGIpOworCXhmc19idWZfcmVsZShicCk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKglwYWdlYnVmX2lvd2FpdAotICoKLSAqCXBhZ2VidWZfaW93YWl0IHdhaXRzIGZvciBJL08gdG8gY29tcGxldGUgb24gdGhlIGJ1ZmZlciBzdXBwbGllZC4KLSAqCUl0IHJldHVybnMgaW1tZWRpYXRlbHkgaWYgbm8gSS9PIGlzIHBlbmRpbmcuICBJbiBhbnkgY2FzZSwgaXQgcmV0dXJucwotICoJdGhlIGVycm9yIGNvZGUsIGlmIGFueSwgb3IgMCBpZiB0aGVyZSBpcyBubyBlcnJvci4KKyAqCVdhaXRzIGZvciBJL08gdG8gY29tcGxldGUgb24gdGhlIGJ1ZmZlciBzdXBwbGllZC4KKyAqCUl0IHJldHVybnMgaW1tZWRpYXRlbHkgaWYgbm8gSS9PIGlzIHBlbmRpbmcuCisgKglJdCByZXR1cm5zIHRoZSBJL08gZXJyb3IgY29kZSwgaWYgYW55LCBvciAwIGlmIHRoZXJlIHdhcyBubyBlcnJvci4KICAqLwogaW50Ci1wYWdlYnVmX2lvd2FpdCgKLQl4ZnNfYnVmX3QJCSpwYikKK3hmc19idWZfaW93YWl0KAorCXhmc19idWZfdAkJKmJwKQogewotCVBCX1RSQUNFKHBiLCAiaW93YWl0IiwgMCk7Ci0JaWYgKGF0b21pY19yZWFkKCZwYi0+cGJfaW9fcmVtYWluaW5nKSkKLQkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKHBiLT5wYl90YXJnZXQtPnBicl9tYXBwaW5nKTsKLQlkb3duKCZwYi0+cGJfaW9kb25lc2VtYSk7Ci0JUEJfVFJBQ0UocGIsICJpb3dhaXRlZCIsIChsb25nKXBiLT5wYl9lcnJvcik7Ci0JcmV0dXJuIHBiLT5wYl9lcnJvcjsKKwlYQl9UUkFDRShicCwgImlvd2FpdCIsIDApOworCWlmIChhdG9taWNfcmVhZCgmYnAtPmJfaW9fcmVtYWluaW5nKSkKKwkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGJwLT5iX3RhcmdldC0+YnRfbWFwcGluZyk7CisJZG93bigmYnAtPmJfaW9kb25lc2VtYSk7CisJWEJfVFJBQ0UoYnAsICJpb3dhaXRlZCIsIChsb25nKWJwLT5iX2Vycm9yKTsKKwlyZXR1cm4gYnAtPmJfZXJyb3I7CiB9CiAKLWNhZGRyX3QKLXBhZ2VidWZfb2Zmc2V0KAotCXhmc19idWZfdAkJKnBiLAoreGZzX2NhZGRyX3QKK3hmc19idWZfb2Zmc2V0KAorCXhmc19idWZfdAkJKmJwLAogCXNpemVfdAkJCW9mZnNldCkKIHsKIAlzdHJ1Y3QgcGFnZQkJKnBhZ2U7CiAKLQlvZmZzZXQgKz0gcGItPnBiX29mZnNldDsKKwlpZiAoYnAtPmJfZmxhZ3MgJiBYQkZfTUFQUEVEKQorCQlyZXR1cm4gWEZTX0JVRl9QVFIoYnApICsgb2Zmc2V0OwogCi0JcGFnZSA9IHBiLT5wYl9wYWdlc1tvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVF07Ci0JcmV0dXJuIChjYWRkcl90KSBwYWdlX2FkZHJlc3MocGFnZSkgKyAob2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKKwlvZmZzZXQgKz0gYnAtPmJfb2Zmc2V0OworCXBhZ2UgPSBicC0+Yl9wYWdlc1tvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVF07CisJcmV0dXJuICh4ZnNfY2FkZHJfdClwYWdlX2FkZHJlc3MocGFnZSkgKyAob2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRS0xKSk7CiB9CiAKIC8qCi0gKglwYWdlYnVmX2lvbW92ZQotICoKICAqCU1vdmUgZGF0YSBpbnRvIG9yIG91dCBvZiBhIGJ1ZmZlci4KICAqLwogdm9pZAotcGFnZWJ1Zl9pb21vdmUoCi0JeGZzX2J1Zl90CQkqcGIsCS8qIGJ1ZmZlciB0byBwcm9jZXNzCQkqLworeGZzX2J1Zl9pb21vdmUoCisJeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciB0byBwcm9jZXNzCQkqLwogCXNpemVfdAkJCWJvZmYsCS8qIHN0YXJ0aW5nIGJ1ZmZlciBvZmZzZXQJKi8KIAlzaXplX3QJCQlic2l6ZSwJLyogbGVuZ3RoIHRvIGNvcHkJCSovCiAJY2FkZHJfdAkJCWRhdGEsCS8qIGRhdGEgYWRkcmVzcwkJCSovCi0JcGFnZV9idWZfcndfdAkJbW9kZSkJLyogcmVhZC93cml0ZSBmbGFnCQkqLworCXhmc19idWZfcndfdAkJbW9kZSkJLyogcmVhZC93cml0ZS96ZXJvIGZsYWcJCSovCiB7CiAJc2l6ZV90CQkJYmVuZCwgY3BvZmYsIGNzaXplOwogCXN0cnVjdCBwYWdlCQkqcGFnZTsKIAogCWJlbmQgPSBib2ZmICsgYnNpemU7CiAJd2hpbGUgKGJvZmYgPCBiZW5kKSB7Ci0JCXBhZ2UgPSBwYi0+cGJfcGFnZXNbcGFnZV9idWZfYnRvY3QoYm9mZiArIHBiLT5wYl9vZmZzZXQpXTsKLQkJY3BvZmYgPSBwYWdlX2J1Zl9wb2ZmKGJvZmYgKyBwYi0+cGJfb2Zmc2V0KTsKKwkJcGFnZSA9IGJwLT5iX3BhZ2VzW3hmc19idWZfYnRvY3QoYm9mZiArIGJwLT5iX29mZnNldCldOworCQljcG9mZiA9IHhmc19idWZfcG9mZihib2ZmICsgYnAtPmJfb2Zmc2V0KTsKIAkJY3NpemUgPSBtaW5fdChzaXplX3QsCi0JCQkgICAgICBQQUdFX0NBQ0hFX1NJWkUtY3BvZmYsIHBiLT5wYl9jb3VudF9kZXNpcmVkLWJvZmYpOworCQkJICAgICAgUEFHRV9DQUNIRV9TSVpFLWNwb2ZmLCBicC0+Yl9jb3VudF9kZXNpcmVkLWJvZmYpOwogCiAJCUFTU0VSVCgoKGNzaXplICsgY3BvZmYpIDw9IFBBR0VfQ0FDSEVfU0laRSkpOwogCiAJCXN3aXRjaCAobW9kZSkgewotCQljYXNlIFBCUldfWkVSTzoKKwkJY2FzZSBYQlJXX1pFUk86CiAJCQltZW1zZXQocGFnZV9hZGRyZXNzKHBhZ2UpICsgY3BvZmYsIDAsIGNzaXplKTsKIAkJCWJyZWFrOwotCQljYXNlIFBCUldfUkVBRDoKKwkJY2FzZSBYQlJXX1JFQUQ6CiAJCQltZW1jcHkoZGF0YSwgcGFnZV9hZGRyZXNzKHBhZ2UpICsgY3BvZmYsIGNzaXplKTsKIAkJCWJyZWFrOwotCQljYXNlIFBCUldfV1JJVEU6CisJCWNhc2UgWEJSV19XUklURToKIAkJCW1lbWNweShwYWdlX2FkZHJlc3MocGFnZSkgKyBjcG9mZiwgZGF0YSwgY3NpemUpOwogCQl9CiAKQEAgLTE0MjUsMTIgKzEzNDEsMTIgQEAKIH0KIAogLyoKLSAqCUhhbmRsaW5nIG9mIGJ1ZnRhcmdzLgorICoJSGFuZGxpbmcgb2YgYnVmZmVyIHRhcmdldHMgKGJ1ZnRhcmdzKS4KICAqLwogCiAvKgotICogV2FpdCBmb3IgYW55IGJ1ZnMgd2l0aCBjYWxsYmFja3MgdGhhdCBoYXZlIGJlZW4gc3VibWl0dGVkIGJ1dAotICogaGF2ZSBub3QgeWV0IHJldHVybmVkLi4uIHdhbGsgdGhlIGhhc2ggbGlzdCBmb3IgdGhlIHRhcmdldC4KKyAqCVdhaXQgZm9yIGFueSBidWZzIHdpdGggY2FsbGJhY2tzIHRoYXQgaGF2ZSBiZWVuIHN1Ym1pdHRlZCBidXQKKyAqCWhhdmUgbm90IHlldCByZXR1cm5lZC4uLiB3YWxrIHRoZSBoYXNoIGxpc3QgZm9yIHRoZSB0YXJnZXQuCiAgKi8KIHZvaWQKIHhmc193YWl0X2J1ZnRhcmcoCkBAIC0xNDQ0LDE1ICsxMzYwLDE1IEBACiAJCWhhc2ggPSAmYnRwLT5idF9oYXNoW2ldOwogYWdhaW46CiAJCXNwaW5fbG9jaygmaGFzaC0+YmhfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShicCwgbiwgJmhhc2gtPmJoX2xpc3QsIHBiX2hhc2hfbGlzdCkgewotCQkJQVNTRVJUKGJ0cCA9PSBicC0+cGJfdGFyZ2V0KTsKLQkJCWlmICghKGJwLT5wYl9mbGFncyAmIFBCRl9GU19NQU5BR0VEKSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnAsIG4sICZoYXNoLT5iaF9saXN0LCBiX2hhc2hfbGlzdCkgeworCQkJQVNTRVJUKGJ0cCA9PSBicC0+Yl90YXJnZXQpOworCQkJaWYgKCEoYnAtPmJfZmxhZ3MgJiBYQkZfRlNfTUFOQUdFRCkpIHsKIAkJCQlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CiAJCQkJLyoKIAkJCQkgKiBDYXRjaCBzdXBlcmJsb2NrIHJlZmVyZW5jZSBjb3VudCBsZWFrcwogCQkJCSAqIGltbWVkaWF0ZWx5CiAJCQkJICovCi0JCQkJQlVHX09OKGJwLT5wYl9ibiA9PSAwKTsKKwkJCQlCVUdfT04oYnAtPmJfYm4gPT0gMCk7CiAJCQkJZGVsYXkoMTAwKTsKIAkJCQlnb3RvIGFnYWluOwogCQkJfQpAQCAtMTQ2Miw5ICsxMzc4LDkgQEAKIH0KIAogLyoKLSAqIEFsbG9jYXRlIGJ1ZmZlciBoYXNoIHRhYmxlIGZvciBhIGdpdmVuIHRhcmdldC4KLSAqIEZvciBkZXZpY2VzIGNvbnRhaW5pbmcgbWV0YWRhdGEgKGkuZS4gbm90IHRoZSBsb2cvcmVhbHRpbWUgZGV2aWNlcykKLSAqIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBtdWNoIGxhcmdlciBoYXNoIHRhYmxlLgorICoJQWxsb2NhdGUgYnVmZmVyIGhhc2ggdGFibGUgZm9yIGEgZ2l2ZW4gdGFyZ2V0LgorICoJRm9yIGRldmljZXMgY29udGFpbmluZyBtZXRhZGF0YSAoaS5lLiBub3QgdGhlIGxvZy9yZWFsdGltZSBkZXZpY2VzKQorICoJd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG11Y2ggbGFyZ2VyIGhhc2ggdGFibGUuCiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfYWxsb2NfYnVmaGFzaCgKQEAgLTE0ODcsMTEgKzE0MDMsMzQgQEAKIHhmc19mcmVlX2J1Zmhhc2goCiAJeGZzX2J1ZnRhcmdfdAkJKmJ0cCkKIHsKLQlrbWVtX2ZyZWUoYnRwLT5idF9oYXNoLAotCQkJKDEgPDwgYnRwLT5idF9oYXNoc2hpZnQpICogc2l6ZW9mKHhmc19idWZoYXNoX3QpKTsKKwlrbWVtX2ZyZWUoYnRwLT5idF9oYXNoLCAoMTw8YnRwLT5idF9oYXNoc2hpZnQpICogc2l6ZW9mKHhmc19idWZoYXNoX3QpKTsKIAlidHAtPmJ0X2hhc2ggPSBOVUxMOwogfQogCisvKgorICoJYnVmdGFyZyBsaXN0IGZvciBkZWx3cml0ZSBxdWV1ZSBwcm9jZXNzaW5nCisgKi8KK1NUQVRJQyBMSVNUX0hFQUQoeGZzX2J1ZnRhcmdfbGlzdCk7CitTVEFUSUMgREVGSU5FX1NQSU5MT0NLKHhmc19idWZ0YXJnX2xvY2spOworCitTVEFUSUMgdm9pZAoreGZzX3JlZ2lzdGVyX2J1ZnRhcmcoCisJeGZzX2J1ZnRhcmdfdCAgICAgICAgICAgKmJ0cCkKK3sKKwlzcGluX2xvY2soJnhmc19idWZ0YXJnX2xvY2spOworCWxpc3RfYWRkKCZidHAtPmJ0X2xpc3QsICZ4ZnNfYnVmdGFyZ19saXN0KTsKKwlzcGluX3VubG9jaygmeGZzX2J1ZnRhcmdfbG9jayk7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfdW5yZWdpc3Rlcl9idWZ0YXJnKAorCXhmc19idWZ0YXJnX3QgICAgICAgICAgICpidHApCit7CisJc3Bpbl9sb2NrKCZ4ZnNfYnVmdGFyZ19sb2NrKTsKKwlsaXN0X2RlbCgmYnRwLT5idF9saXN0KTsKKwlzcGluX3VubG9jaygmeGZzX2J1ZnRhcmdfbG9jayk7Cit9CisKIHZvaWQKIHhmc19mcmVlX2J1ZnRhcmcoCiAJeGZzX2J1ZnRhcmdfdAkJKmJ0cCwKQEAgLTE0OTksOSArMTQzOCwxNiBAQAogewogCXhmc19mbHVzaF9idWZ0YXJnKGJ0cCwgMSk7CiAJaWYgKGV4dGVybmFsKQotCQl4ZnNfYmxrZGV2X3B1dChidHAtPnBicl9iZGV2KTsKKwkJeGZzX2Jsa2Rldl9wdXQoYnRwLT5idF9iZGV2KTsKIAl4ZnNfZnJlZV9idWZoYXNoKGJ0cCk7Ci0JaXB1dChidHAtPnBicl9tYXBwaW5nLT5ob3N0KTsKKwlpcHV0KGJ0cC0+YnRfbWFwcGluZy0+aG9zdCk7CisKKwkvKiBVbnJlZ2lzdGVyIHRoZSBidWZ0YXJnIGZpcnN0IHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGEKKwkgKiB3YWtldXAgZmluZGluZyBhIG5vbi1leGlzdGVudCB0YXNrCisJICovCisJeGZzX3VucmVnaXN0ZXJfYnVmdGFyZyhidHApOworCWt0aHJlYWRfc3RvcChidHAtPmJ0X3Rhc2spOworCiAJa21lbV9mcmVlKGJ0cCwgc2l6ZW9mKCpidHApKTsKIH0KIApAQCAtMTUxMiwxMSArMTQ1OCwxMSBAQAogCXVuc2lnbmVkIGludAkJc2VjdG9yc2l6ZSwKIAlpbnQJCQl2ZXJib3NlKQogewotCWJ0cC0+cGJyX2JzaXplID0gYmxvY2tzaXplOwotCWJ0cC0+cGJyX3NzaGlmdCA9IGZmcyhzZWN0b3JzaXplKSAtIDE7Ci0JYnRwLT5wYnJfc21hc2sgPSBzZWN0b3JzaXplIC0gMTsKKwlidHAtPmJ0X2JzaXplID0gYmxvY2tzaXplOworCWJ0cC0+YnRfc3NoaWZ0ID0gZmZzKHNlY3RvcnNpemUpIC0gMTsKKwlidHAtPmJ0X3NtYXNrID0gc2VjdG9yc2l6ZSAtIDE7CiAKLQlpZiAoc2V0X2Jsb2Nrc2l6ZShidHAtPnBicl9iZGV2LCBzZWN0b3JzaXplKSkgeworCWlmIChzZXRfYmxvY2tzaXplKGJ0cC0+YnRfYmRldiwgc2VjdG9yc2l6ZSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJIlhGUzogQ2Fubm90IHNldF9ibG9ja3NpemUgdG8gJXUgb24gZGV2aWNlICVzXG4iLAogCQkJc2VjdG9yc2l6ZSwgWEZTX0JVRlRBUkdfTkFNRShidHApKTsKQEAgLTE1MzYsMTAgKzE0ODIsMTAgQEAKIH0KIAogLyoKLSogV2hlbiBhbGxvY2F0aW5nIHRoZSBpbml0aWFsIGJ1ZmZlciB0YXJnZXQgd2UgaGF2ZSBub3QgeWV0Ci0qIHJlYWQgaW4gdGhlIHN1cGVyYmxvY2ssIHNvIGRvbid0IGtub3cgd2hhdCBzaXplZCBzZWN0b3JzCi0qIGFyZSBiZWluZyB1c2VkIGlzIGF0IHRoaXMgZWFybHkgc3RhZ2UuICBQbGF5IHNhZmUuCi0qLworICoJV2hlbiBhbGxvY2F0aW5nIHRoZSBpbml0aWFsIGJ1ZmZlciB0YXJnZXQgd2UgaGF2ZSBub3QgeWV0CisgKglyZWFkIGluIHRoZSBzdXBlcmJsb2NrLCBzbyBkb24ndCBrbm93IHdoYXQgc2l6ZWQgc2VjdG9ycworICoJYXJlIGJlaW5nIHVzZWQgaXMgYXQgdGhpcyBlYXJseSBzdGFnZS4gIFBsYXkgc2FmZS4KKyAqLwogU1RBVElDIGludAogeGZzX3NldHNpemVfYnVmdGFyZ19lYXJseSgKIAl4ZnNfYnVmdGFyZ190CQkqYnRwLApAQCAtMTU4NywxMCArMTUzMywzMCBAQAogCW1hcHBpbmctPmFfb3BzID0gJm1hcHBpbmdfYW9wczsKIAltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gYmRpOwogCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIEdGUF9OT0ZTKTsKLQlidHAtPnBicl9tYXBwaW5nID0gbWFwcGluZzsKKwlidHAtPmJ0X21hcHBpbmcgPSBtYXBwaW5nOwogCXJldHVybiAwOwogfQogCitTVEFUSUMgaW50Cit4ZnNfYWxsb2NfZGVsd3JpdGVfcXVldWUoCisJeGZzX2J1ZnRhcmdfdAkJKmJ0cCkKK3sKKwlpbnQJZXJyb3IgPSAwOworCisJSU5JVF9MSVNUX0hFQUQoJmJ0cC0+YnRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJ0cC0+YnRfZGVsd3JpdGVfcXVldWUpOworCXNwaW5sb2NrX2luaXQoJmJ0cC0+YnRfZGVsd3JpdGVfbG9jaywgImRlbHdyaV9sb2NrIik7CisJYnRwLT5idF9mbGFncyA9IDA7CisJYnRwLT5idF90YXNrID0ga3RocmVhZF9ydW4oeGZzYnVmZCwgYnRwLCAieGZzYnVmZCIpOworCWlmIChJU19FUlIoYnRwLT5idF90YXNrKSkgeworCQllcnJvciA9IFBUUl9FUlIoYnRwLT5idF90YXNrKTsKKwkJZ290byBvdXRfZXJyb3I7CisJfQorCXhmc19yZWdpc3Rlcl9idWZ0YXJnKGJ0cCk7CitvdXRfZXJyb3I6CisJcmV0dXJuIGVycm9yOworfQorCiB4ZnNfYnVmdGFyZ190ICoKIHhmc19hbGxvY19idWZ0YXJnKAogCXN0cnVjdCBibG9ja19kZXZpY2UJKmJkZXYsCkBAIC0xNjAwLDEyICsxNTY2LDE0IEBACiAKIAlidHAgPSBrbWVtX3phbGxvYyhzaXplb2YoKmJ0cCksIEtNX1NMRUVQKTsKIAotCWJ0cC0+cGJyX2RldiA9ICBiZGV2LT5iZF9kZXY7Ci0JYnRwLT5wYnJfYmRldiA9IGJkZXY7CisJYnRwLT5idF9kZXYgPSAgYmRldi0+YmRfZGV2OworCWJ0cC0+YnRfYmRldiA9IGJkZXY7CiAJaWYgKHhmc19zZXRzaXplX2J1ZnRhcmdfZWFybHkoYnRwLCBiZGV2KSkKIAkJZ290byBlcnJvcjsKIAlpZiAoeGZzX21hcHBpbmdfYnVmdGFyZyhidHAsIGJkZXYpKQogCQlnb3RvIGVycm9yOworCWlmICh4ZnNfYWxsb2NfZGVsd3JpdGVfcXVldWUoYnRwKSkKKwkJZ290byBlcnJvcjsKIAl4ZnNfYWxsb2NfYnVmaGFzaChidHAsIGV4dGVybmFsKTsKIAlyZXR1cm4gYnRwOwogCkBAIC0xNjE2LDgzICsxNTg0LDgxIEBACiAKIAogLyoKLSAqIFBhZ2VidWYgZGVsYXllZCB3cml0ZSBidWZmZXIgaGFuZGxpbmcKKyAqCURlbGF5ZWQgd3JpdGUgYnVmZmVyIGhhbmRsaW5nCiAgKi8KLQotU1RBVElDIExJU1RfSEVBRChwYmRfZGVsd3JpdGVfcXVldWUpOwotU1RBVElDIERFRklORV9TUElOTE9DSyhwYmRfZGVsd3JpdGVfbG9jayk7Ci0KIFNUQVRJQyB2b2lkCi1wYWdlYnVmX2RlbHdyaV9xdWV1ZSgKLQl4ZnNfYnVmX3QJCSpwYiwKK3hmc19idWZfZGVsd3JpX3F1ZXVlKAorCXhmc19idWZfdAkJKmJwLAogCWludAkJCXVubG9jaykKIHsKLQlQQl9UUkFDRShwYiwgImRlbHdyaV9xIiwgKGxvbmcpdW5sb2NrKTsKLQlBU1NFUlQoKHBiLT5wYl9mbGFncyAmIChQQkZfREVMV1JJfFBCRl9BU1lOQykpID09Ci0JCQkJCShQQkZfREVMV1JJfFBCRl9BU1lOQykpOworCXN0cnVjdCBsaXN0X2hlYWQJKmR3cSA9ICZicC0+Yl90YXJnZXQtPmJ0X2RlbHdyaXRlX3F1ZXVlOworCXNwaW5sb2NrX3QJCSpkd2xrID0gJmJwLT5iX3RhcmdldC0+YnRfZGVsd3JpdGVfbG9jazsKIAotCXNwaW5fbG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOworCVhCX1RSQUNFKGJwLCAiZGVsd3JpX3EiLCAobG9uZyl1bmxvY2spOworCUFTU0VSVCgoYnAtPmJfZmxhZ3MmKFhCRl9ERUxXUkl8WEJGX0FTWU5DKSkgPT0gKFhCRl9ERUxXUkl8WEJGX0FTWU5DKSk7CisKKwlzcGluX2xvY2soZHdsayk7CiAJLyogSWYgYWxyZWFkeSBpbiB0aGUgcXVldWUsIGRlcXVldWUgYW5kIHBsYWNlIGF0IHRhaWwgKi8KLQlpZiAoIWxpc3RfZW1wdHkoJnBiLT5wYl9saXN0KSkgewotCQlBU1NFUlQocGItPnBiX2ZsYWdzICYgX1BCRl9ERUxXUklfUSk7Ci0JCWlmICh1bmxvY2spIHsKLQkJCWF0b21pY19kZWMoJnBiLT5wYl9ob2xkKTsKLQkJfQotCQlsaXN0X2RlbCgmcGItPnBiX2xpc3QpOworCWlmICghbGlzdF9lbXB0eSgmYnAtPmJfbGlzdCkpIHsKKwkJQVNTRVJUKGJwLT5iX2ZsYWdzICYgX1hCRl9ERUxXUklfUSk7CisJCWlmICh1bmxvY2spCisJCQlhdG9taWNfZGVjKCZicC0+Yl9ob2xkKTsKKwkJbGlzdF9kZWwoJmJwLT5iX2xpc3QpOwogCX0KIAotCXBiLT5wYl9mbGFncyB8PSBfUEJGX0RFTFdSSV9ROwotCWxpc3RfYWRkX3RhaWwoJnBiLT5wYl9saXN0LCAmcGJkX2RlbHdyaXRlX3F1ZXVlKTsKLQlwYi0+cGJfcXVldWV0aW1lID0gamlmZmllczsKLQlzcGluX3VubG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOworCWJwLT5iX2ZsYWdzIHw9IF9YQkZfREVMV1JJX1E7CisJbGlzdF9hZGRfdGFpbCgmYnAtPmJfbGlzdCwgZHdxKTsKKwlicC0+Yl9xdWV1ZXRpbWUgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrKGR3bGspOwogCiAJaWYgKHVubG9jaykKLQkJcGFnZWJ1Zl91bmxvY2socGIpOworCQl4ZnNfYnVmX3VubG9jayhicCk7CiB9CiAKIHZvaWQKLXBhZ2VidWZfZGVsd3JpX2RlcXVldWUoCi0JeGZzX2J1Zl90CQkqcGIpCit4ZnNfYnVmX2RlbHdyaV9kZXF1ZXVlKAorCXhmc19idWZfdAkJKmJwKQogeworCXNwaW5sb2NrX3QJCSpkd2xrID0gJmJwLT5iX3RhcmdldC0+YnRfZGVsd3JpdGVfbG9jazsKIAlpbnQJCQlkZXF1ZXVlZCA9IDA7CiAKLQlzcGluX2xvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKLQlpZiAoKHBiLT5wYl9mbGFncyAmIFBCRl9ERUxXUkkpICYmICFsaXN0X2VtcHR5KCZwYi0+cGJfbGlzdCkpIHsKLQkJQVNTRVJUKHBiLT5wYl9mbGFncyAmIF9QQkZfREVMV1JJX1EpOwotCQlsaXN0X2RlbF9pbml0KCZwYi0+cGJfbGlzdCk7CisJc3Bpbl9sb2NrKGR3bGspOworCWlmICgoYnAtPmJfZmxhZ3MgJiBYQkZfREVMV1JJKSAmJiAhbGlzdF9lbXB0eSgmYnAtPmJfbGlzdCkpIHsKKwkJQVNTRVJUKGJwLT5iX2ZsYWdzICYgX1hCRl9ERUxXUklfUSk7CisJCWxpc3RfZGVsX2luaXQoJmJwLT5iX2xpc3QpOwogCQlkZXF1ZXVlZCA9IDE7CiAJfQotCXBiLT5wYl9mbGFncyAmPSB+KFBCRl9ERUxXUkl8X1BCRl9ERUxXUklfUSk7Ci0Jc3Bpbl91bmxvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKKwlicC0+Yl9mbGFncyAmPSB+KFhCRl9ERUxXUkl8X1hCRl9ERUxXUklfUSk7CisJc3Bpbl91bmxvY2soZHdsayk7CiAKIAlpZiAoZGVxdWV1ZWQpCi0JCXBhZ2VidWZfcmVsZShwYik7CisJCXhmc19idWZfcmVsZShicCk7CiAKLQlQQl9UUkFDRShwYiwgImRlbHdyaV9kcSIsIChsb25nKWRlcXVldWVkKTsKKwlYQl9UUkFDRShicCwgImRlbHdyaV9kcSIsIChsb25nKWRlcXVldWVkKTsKIH0KIAogU1RBVElDIHZvaWQKLXBhZ2VidWZfcnVuYWxsX3F1ZXVlcygKK3hmc19idWZfcnVuYWxsX3F1ZXVlcygKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqcXVldWUpCiB7CiAJZmx1c2hfd29ya3F1ZXVlKHF1ZXVlKTsKIH0KIAotLyogRGVmaW5lcyBmb3IgcGFnZWJ1ZiBkYWVtb24gKi8KLVNUQVRJQyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnhmc2J1ZmRfdGFzazsKLVNUQVRJQyBpbnQgeGZzYnVmZF9mb3JjZV9mbHVzaDsKLVNUQVRJQyBpbnQgeGZzYnVmZF9mb3JjZV9zbGVlcDsKLQogU1RBVElDIGludAogeGZzYnVmZF93YWtldXAoCiAJaW50CQkJcHJpb3JpdHksCiAJZ2ZwX3QJCQltYXNrKQogewotCWlmICh4ZnNidWZkX2ZvcmNlX3NsZWVwKQotCQlyZXR1cm4gMDsKLQl4ZnNidWZkX2ZvcmNlX2ZsdXNoID0gMTsKLQliYXJyaWVyKCk7Ci0Jd2FrZV91cF9wcm9jZXNzKHhmc2J1ZmRfdGFzayk7CisJeGZzX2J1ZnRhcmdfdAkJKmJ0cDsKKworCXNwaW5fbG9jaygmeGZzX2J1ZnRhcmdfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShidHAsICZ4ZnNfYnVmdGFyZ19saXN0LCBidF9saXN0KSB7CisJCWlmICh0ZXN0X2JpdChYQlRfRk9SQ0VfU0xFRVAsICZidHAtPmJ0X2ZsYWdzKSkKKwkJCWNvbnRpbnVlOworCQlzZXRfYml0KFhCVF9GT1JDRV9GTFVTSCwgJmJ0cC0+YnRfZmxhZ3MpOworCQl3YWtlX3VwX3Byb2Nlc3MoYnRwLT5idF90YXNrKTsKKwl9CisJc3Bpbl91bmxvY2soJnhmc19idWZ0YXJnX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xNzAyLDY3ICsxNjY4LDcwIEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZAl0bXA7CiAJdW5zaWduZWQgbG9uZwkJYWdlOwotCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQ7Ci0JeGZzX2J1Zl90CQkqcGIsICpuOworCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQgPSAoeGZzX2J1ZnRhcmdfdCAqKWRhdGE7CisJeGZzX2J1Zl90CQkqYnAsICpuOworCXN0cnVjdCBsaXN0X2hlYWQJKmR3cSA9ICZ0YXJnZXQtPmJ0X2RlbHdyaXRlX3F1ZXVlOworCXNwaW5sb2NrX3QJCSpkd2xrID0gJnRhcmdldC0+YnRfZGVsd3JpdGVfbG9jazsKIAogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DOwogCiAJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CiAJZG8gewogCQlpZiAodW5saWtlbHkoZnJlZXppbmcoY3VycmVudCkpKSB7Ci0JCQl4ZnNidWZkX2ZvcmNlX3NsZWVwID0gMTsKKwkJCXNldF9iaXQoWEJUX0ZPUkNFX1NMRUVQLCAmdGFyZ2V0LT5idF9mbGFncyk7CiAJCQlyZWZyaWdlcmF0b3IoKTsKIAkJfSBlbHNlIHsKLQkJCXhmc2J1ZmRfZm9yY2Vfc2xlZXAgPSAwOworCQkJY2xlYXJfYml0KFhCVF9GT1JDRV9TTEVFUCwgJnRhcmdldC0+YnRfZmxhZ3MpOwogCQl9CiAKIAkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKAogCQkJeGZzX2J1Zl90aW1lcl9jZW50aXNlY3MgKiBtc2Vjc190b19qaWZmaWVzKDEwKSk7CiAKIAkJYWdlID0geGZzX2J1Zl9hZ2VfY2VudGlzZWNzICogbXNlY3NfdG9famlmZmllcygxMCk7Ci0JCXNwaW5fbG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZwYmRfZGVsd3JpdGVfcXVldWUsIHBiX2xpc3QpIHsKLQkJCVBCX1RSQUNFKHBiLCAid2Fsa3ExIiwgKGxvbmcpcGFnZWJ1Zl9pc3BpbihwYikpOwotCQkJQVNTRVJUKHBiLT5wYl9mbGFncyAmIFBCRl9ERUxXUkkpOworCQlzcGluX2xvY2soZHdsayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShicCwgbiwgZHdxLCBiX2xpc3QpIHsKKwkJCVhCX1RSQUNFKGJwLCAid2Fsa3ExIiwgKGxvbmcpeGZzX2J1Zl9pc3BpbihicCkpOworCQkJQVNTRVJUKGJwLT5iX2ZsYWdzICYgWEJGX0RFTFdSSSk7CiAKLQkJCWlmICghcGFnZWJ1Zl9pc3BpbihwYikgJiYgIXBhZ2VidWZfY29uZF9sb2NrKHBiKSkgewotCQkJCWlmICgheGZzYnVmZF9mb3JjZV9mbHVzaCAmJgorCQkJaWYgKCF4ZnNfYnVmX2lzcGluKGJwKSAmJiAheGZzX2J1Zl9jb25kX2xvY2soYnApKSB7CisJCQkJaWYgKCF0ZXN0X2JpdChYQlRfRk9SQ0VfRkxVU0gsCisJCQkJCQkmdGFyZ2V0LT5idF9mbGFncykgJiYKIAkJCQkgICAgdGltZV9iZWZvcmUoamlmZmllcywKLQkJCQkJCXBiLT5wYl9xdWV1ZXRpbWUgKyBhZ2UpKSB7Ci0JCQkJCXBhZ2VidWZfdW5sb2NrKHBiKTsKKwkJCQkJCWJwLT5iX3F1ZXVldGltZSArIGFnZSkpIHsKKwkJCQkJeGZzX2J1Zl91bmxvY2soYnApOwogCQkJCQlicmVhazsKIAkJCQl9CiAKLQkJCQlwYi0+cGJfZmxhZ3MgJj0gfihQQkZfREVMV1JJfF9QQkZfREVMV1JJX1EpOwotCQkJCXBiLT5wYl9mbGFncyB8PSBQQkZfV1JJVEU7Ci0JCQkJbGlzdF9tb3ZlKCZwYi0+cGJfbGlzdCwgJnRtcCk7CisJCQkJYnAtPmJfZmxhZ3MgJj0gfihYQkZfREVMV1JJfF9YQkZfREVMV1JJX1EpOworCQkJCWJwLT5iX2ZsYWdzIHw9IFhCRl9XUklURTsKKwkJCQlsaXN0X21vdmUoJmJwLT5iX2xpc3QsICZ0bXApOwogCQkJfQogCQl9Ci0JCXNwaW5fdW5sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CisJCXNwaW5fdW5sb2NrKGR3bGspOwogCiAJCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wKSkgewotCQkJcGIgPSBsaXN0X2VudHJ5KHRtcC5uZXh0LCB4ZnNfYnVmX3QsIHBiX2xpc3QpOwotCQkJdGFyZ2V0ID0gcGItPnBiX3RhcmdldDsKKwkJCWJwID0gbGlzdF9lbnRyeSh0bXAubmV4dCwgeGZzX2J1Zl90LCBiX2xpc3QpOworCQkJQVNTRVJUKHRhcmdldCA9PSBicC0+Yl90YXJnZXQpOwogCi0JCQlsaXN0X2RlbF9pbml0KCZwYi0+cGJfbGlzdCk7Ci0JCQlwYWdlYnVmX2lvc3RyYXRlZ3kocGIpOworCQkJbGlzdF9kZWxfaW5pdCgmYnAtPmJfbGlzdCk7CisJCQl4ZnNfYnVmX2lvc3RyYXRlZ3koYnApOwogCi0JCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UodGFyZ2V0LT5wYnJfbWFwcGluZyk7CisJCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UodGFyZ2V0LT5idF9tYXBwaW5nKTsKIAkJfQogCiAJCWlmIChhc19saXN0X2xlbiA+IDApCiAJCQlwdXJnZV9hZGRyZXNzZXMoKTsKIAotCQl4ZnNidWZkX2ZvcmNlX2ZsdXNoID0gMDsKKwkJY2xlYXJfYml0KFhCVF9GT1JDRV9GTFVTSCwgJnRhcmdldC0+YnRfZmxhZ3MpOwogCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBHbyB0aHJvdWdoIGFsbCBpbmNvcmUgYnVmZmVycywgYW5kIHJlbGVhc2UgYnVmZmVycyBpZiB0aGV5IGJlbG9uZyB0bwotICogdGhlIGdpdmVuIGRldmljZS4gVGhpcyBpcyB1c2VkIGluIGZpbGVzeXN0ZW0gZXJyb3IgaGFuZGxpbmcgdG8KLSAqIHByZXNlcnZlIHRoZSBjb25zaXN0ZW5jeSBvZiBpdHMgbWV0YWRhdGEuCisgKglHbyB0aHJvdWdoIGFsbCBpbmNvcmUgYnVmZmVycywgYW5kIHJlbGVhc2UgYnVmZmVycyBpZiB0aGV5IGJlbG9uZyB0bworICoJdGhlIGdpdmVuIGRldmljZS4gVGhpcyBpcyB1c2VkIGluIGZpbGVzeXN0ZW0gZXJyb3IgaGFuZGxpbmcgdG8KKyAqCXByZXNlcnZlIHRoZSBjb25zaXN0ZW5jeSBvZiBpdHMgbWV0YWRhdGEuCiAgKi8KIGludAogeGZzX2ZsdXNoX2J1ZnRhcmcoCkBAIC0xNzcwLDczICsxNzM5LDcyIEBACiAJaW50CQkJd2FpdCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXRtcDsKLQl4ZnNfYnVmX3QJCSpwYiwgKm47CisJeGZzX2J1Zl90CQkqYnAsICpuOwogCWludAkJCXBpbmNvdW50ID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpkd3EgPSAmdGFyZ2V0LT5idF9kZWx3cml0ZV9xdWV1ZTsKKwlzcGlubG9ja190CQkqZHdsayA9ICZ0YXJnZXQtPmJ0X2RlbHdyaXRlX2xvY2s7CiAKLQlwYWdlYnVmX3J1bmFsbF9xdWV1ZXMoeGZzZGF0YWRfd29ya3F1ZXVlKTsKLQlwYWdlYnVmX3J1bmFsbF9xdWV1ZXMoeGZzbG9nZF93b3JrcXVldWUpOworCXhmc19idWZfcnVuYWxsX3F1ZXVlcyh4ZnNkYXRhZF93b3JrcXVldWUpOworCXhmc19idWZfcnVuYWxsX3F1ZXVlcyh4ZnNsb2dkX3dvcmtxdWV1ZSk7CiAKIAlJTklUX0xJU1RfSEVBRCgmdG1wKTsKLQlzcGluX2xvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZwYmRfZGVsd3JpdGVfcXVldWUsIHBiX2xpc3QpIHsKLQotCQlpZiAocGItPnBiX3RhcmdldCAhPSB0YXJnZXQpCi0JCQljb250aW51ZTsKLQotCQlBU1NFUlQocGItPnBiX2ZsYWdzICYgKFBCRl9ERUxXUkl8X1BCRl9ERUxXUklfUSkpOwotCQlQQl9UUkFDRShwYiwgIndhbGtxMiIsIChsb25nKXBhZ2VidWZfaXNwaW4ocGIpKTsKLQkJaWYgKHBhZ2VidWZfaXNwaW4ocGIpKSB7CisJc3Bpbl9sb2NrKGR3bGspOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShicCwgbiwgZHdxLCBiX2xpc3QpIHsKKwkJQVNTRVJUKGJwLT5iX3RhcmdldCA9PSB0YXJnZXQpOworCQlBU1NFUlQoYnAtPmJfZmxhZ3MgJiAoWEJGX0RFTFdSSSB8IF9YQkZfREVMV1JJX1EpKTsKKwkJWEJfVFJBQ0UoYnAsICJ3YWxrcTIiLCAobG9uZyl4ZnNfYnVmX2lzcGluKGJwKSk7CisJCWlmICh4ZnNfYnVmX2lzcGluKGJwKSkgewogCQkJcGluY291bnQrKzsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJbGlzdF9tb3ZlKCZwYi0+cGJfbGlzdCwgJnRtcCk7CisJCWxpc3RfbW92ZSgmYnAtPmJfbGlzdCwgJnRtcCk7CiAJfQotCXNwaW5fdW5sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CisJc3Bpbl91bmxvY2soZHdsayk7CiAKIAkvKgogCSAqIERyb3BwZWQgdGhlIGRlbGF5ZWQgd3JpdGUgbGlzdCBsb2NrLCBub3cgd2FsayB0aGUgdGVtcG9yYXJ5IGxpc3QKIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZ0bXAsIHBiX2xpc3QpIHsKLQkJcGFnZWJ1Zl9sb2NrKHBiKTsKLQkJcGItPnBiX2ZsYWdzICY9IH4oUEJGX0RFTFdSSXxfUEJGX0RFTFdSSV9RKTsKLQkJcGItPnBiX2ZsYWdzIHw9IFBCRl9XUklURTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnAsIG4sICZ0bXAsIGJfbGlzdCkgeworCQl4ZnNfYnVmX2xvY2soYnApOworCQlicC0+Yl9mbGFncyAmPSB+KFhCRl9ERUxXUkl8X1hCRl9ERUxXUklfUSk7CisJCWJwLT5iX2ZsYWdzIHw9IFhCRl9XUklURTsKIAkJaWYgKHdhaXQpCi0JCQlwYi0+cGJfZmxhZ3MgJj0gflBCRl9BU1lOQzsKKwkJCWJwLT5iX2ZsYWdzICY9IH5YQkZfQVNZTkM7CiAJCWVsc2UKLQkJCWxpc3RfZGVsX2luaXQoJnBiLT5wYl9saXN0KTsKKwkJCWxpc3RfZGVsX2luaXQoJmJwLT5iX2xpc3QpOwogCi0JCXBhZ2VidWZfaW9zdHJhdGVneShwYik7CisJCXhmc19idWZfaW9zdHJhdGVneShicCk7CiAJfQogCiAJLyoKIAkgKiBSZW1haW5pbmcgbGlzdCBpdGVtcyBtdXN0IGJlIGZsdXNoZWQgYmVmb3JlIHJldHVybmluZwogCSAqLwogCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wKSkgewotCQlwYiA9IGxpc3RfZW50cnkodG1wLm5leHQsIHhmc19idWZfdCwgcGJfbGlzdCk7CisJCWJwID0gbGlzdF9lbnRyeSh0bXAubmV4dCwgeGZzX2J1Zl90LCBiX2xpc3QpOwogCi0JCWxpc3RfZGVsX2luaXQoJnBiLT5wYl9saXN0KTsKLQkJeGZzX2lvd2FpdChwYik7Ci0JCXhmc19idWZfcmVsc2UocGIpOworCQlsaXN0X2RlbF9pbml0KCZicC0+Yl9saXN0KTsKKwkJeGZzX2lvd2FpdChicCk7CisJCXhmc19idWZfcmVsc2UoYnApOwogCX0KIAogCWlmICh3YWl0KQotCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UodGFyZ2V0LT5wYnJfbWFwcGluZyk7CisJCWJsa19ydW5fYWRkcmVzc19zcGFjZSh0YXJnZXQtPmJ0X21hcHBpbmcpOwogCiAJcmV0dXJuIHBpbmNvdW50OwogfQogCiBpbnQgX19pbml0Ci1wYWdlYnVmX2luaXQodm9pZCkKK3hmc19idWZfaW5pdCh2b2lkKQogewogCWludAkJZXJyb3IgPSAtRU5PTUVNOwogCi0jaWZkZWYgUEFHRUJVRl9UUkFDRQotCXBhZ2VidWZfdHJhY2VfYnVmID0ga3RyYWNlX2FsbG9jKFBBR0VCVUZfVFJBQ0VfU0laRSwgS01fU0xFRVApOworI2lmZGVmIFhGU19CVUZfVFJBQ0UKKwl4ZnNfYnVmX3RyYWNlX2J1ZiA9IGt0cmFjZV9hbGxvYyhYRlNfQlVGX1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKICNlbmRpZgogCi0JcGFnZWJ1Zl96b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19idWZfdCksICJ4ZnNfYnVmIik7Ci0JaWYgKCFwYWdlYnVmX3pvbmUpCisJeGZzX2J1Zl96b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19idWZfdCksICJ4ZnNfYnVmIik7CisJaWYgKCF4ZnNfYnVmX3pvbmUpCiAJCWdvdG8gb3V0X2ZyZWVfdHJhY2VfYnVmOwogCiAJeGZzbG9nZF93b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJ4ZnNsb2dkIik7CkBAIC0xODQ3LDQyICsxODE1LDMzIEBACiAJaWYgKCF4ZnNkYXRhZF93b3JrcXVldWUpCiAJCWdvdG8gb3V0X2Rlc3Ryb3lfeGZzbG9nZF93b3JrcXVldWU7CiAKLQl4ZnNidWZkX3Rhc2sgPSBrdGhyZWFkX3J1bih4ZnNidWZkLCBOVUxMLCAieGZzYnVmZCIpOwotCWlmIChJU19FUlIoeGZzYnVmZF90YXNrKSkgewotCQllcnJvciA9IFBUUl9FUlIoeGZzYnVmZF90YXNrKTsKKwl4ZnNfYnVmX3NoYWtlID0ga21lbV9zaGFrZV9yZWdpc3Rlcih4ZnNidWZkX3dha2V1cCk7CisJaWYgKCF4ZnNfYnVmX3NoYWtlKQogCQlnb3RvIG91dF9kZXN0cm95X3hmc2RhdGFkX3dvcmtxdWV1ZTsKLQl9Ci0KLQlwYWdlYnVmX3NoYWtlID0ga21lbV9zaGFrZV9yZWdpc3Rlcih4ZnNidWZkX3dha2V1cCk7Ci0JaWYgKCFwYWdlYnVmX3NoYWtlKQotCQlnb3RvIG91dF9zdG9wX3hmc2J1ZmQ7CiAKIAlyZXR1cm4gMDsKIAotIG91dF9zdG9wX3hmc2J1ZmQ6Ci0Ja3RocmVhZF9zdG9wKHhmc2J1ZmRfdGFzayk7CiAgb3V0X2Rlc3Ryb3lfeGZzZGF0YWRfd29ya3F1ZXVlOgogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7CiAgb3V0X2Rlc3Ryb3lfeGZzbG9nZF93b3JrcXVldWU6CiAJZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOwogIG91dF9mcmVlX2J1Zl96b25lOgotCWttZW1fem9uZV9kZXN0cm95KHBhZ2VidWZfem9uZSk7CisJa21lbV96b25lX2Rlc3Ryb3koeGZzX2J1Zl96b25lKTsKICBvdXRfZnJlZV90cmFjZV9idWY6Ci0jaWZkZWYgUEFHRUJVRl9UUkFDRQotCWt0cmFjZV9mcmVlKHBhZ2VidWZfdHJhY2VfYnVmKTsKKyNpZmRlZiBYRlNfQlVGX1RSQUNFCisJa3RyYWNlX2ZyZWUoeGZzX2J1Zl90cmFjZV9idWYpOwogI2VuZGlmCiAJcmV0dXJuIGVycm9yOwogfQogCiB2b2lkCi1wYWdlYnVmX3Rlcm1pbmF0ZSh2b2lkKQoreGZzX2J1Zl90ZXJtaW5hdGUodm9pZCkKIHsKLQlrbWVtX3NoYWtlX2RlcmVnaXN0ZXIocGFnZWJ1Zl9zaGFrZSk7Ci0Ja3RocmVhZF9zdG9wKHhmc2J1ZmRfdGFzayk7CisJa21lbV9zaGFrZV9kZXJlZ2lzdGVyKHhmc19idWZfc2hha2UpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7CiAJZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOwotCWttZW1fem9uZV9kZXN0cm95KHBhZ2VidWZfem9uZSk7Ci0jaWZkZWYgUEFHRUJVRl9UUkFDRQotCWt0cmFjZV9mcmVlKHBhZ2VidWZfdHJhY2VfYnVmKTsKKwlrbWVtX3pvbmVfZGVzdHJveSh4ZnNfYnVmX3pvbmUpOworI2lmZGVmIFhGU19CVUZfVFJBQ0UKKwlrdHJhY2VfZnJlZSh4ZnNfYnVmX3RyYWNlX2J1Zik7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKaW5kZXggMjM3YTM1Yi4uNGRkNjU5MiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKQEAgLTMyLDQ0ICszMiw0NyBAQAogICoJQmFzZSB0eXBlcwogICovCiAKLSNkZWZpbmUgWEZTX0JVRl9EQUREUl9OVUxMICgoeGZzX2RhZGRyX3QpICgtMUxMKSkKKyNkZWZpbmUgWEZTX0JVRl9EQUREUl9OVUxMCSgoeGZzX2RhZGRyX3QpICgtMUxMKSkKIAotI2RlZmluZSBwYWdlX2J1Zl9jdG9iKHBwKQkoKHBwKSAqIFBBR0VfQ0FDSEVfU0laRSkKLSNkZWZpbmUgcGFnZV9idWZfYnRvYyhkZCkJKCgoZGQpICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVCkKLSNkZWZpbmUgcGFnZV9idWZfYnRvY3QoZGQpCSgoZGQpID4+IFBBR0VfQ0FDSEVfU0hJRlQpCi0jZGVmaW5lIHBhZ2VfYnVmX3BvZmYoYWEpCSgoYWEpICYgflBBR0VfQ0FDSEVfTUFTSykKKyNkZWZpbmUgeGZzX2J1Zl9jdG9iKHBwKQkoKHBwKSAqIFBBR0VfQ0FDSEVfU0laRSkKKyNkZWZpbmUgeGZzX2J1Zl9idG9jKGRkKQkoKChkZCkgKyBQQUdFX0NBQ0hFX1NJWkUtMSkgPj4gUEFHRV9DQUNIRV9TSElGVCkKKyNkZWZpbmUgeGZzX2J1Zl9idG9jdChkZCkJKChkZCkgPj4gUEFHRV9DQUNIRV9TSElGVCkKKyNkZWZpbmUgeGZzX2J1Zl9wb2ZmKGFhKQkoKGFhKSAmIH5QQUdFX0NBQ0hFX01BU0spCiAKLXR5cGVkZWYgZW51bSBwYWdlX2J1Zl9yd19lIHsKLQlQQlJXX1JFQUQgPSAxLAkJCS8qIHRyYW5zZmVyIGludG8gdGFyZ2V0IG1lbW9yeSAqLwotCVBCUldfV1JJVEUgPSAyLAkJCS8qIHRyYW5zZmVyIGZyb20gdGFyZ2V0IG1lbW9yeSAqLwotCVBCUldfWkVSTyA9IDMJCQkvKiBaZXJvIHRhcmdldCBtZW1vcnkgKi8KLX0gcGFnZV9idWZfcndfdDsKK3R5cGVkZWYgZW51bSB7CisJWEJSV19SRUFEID0gMSwJCQkvKiB0cmFuc2ZlciBpbnRvIHRhcmdldCBtZW1vcnkgKi8KKwlYQlJXX1dSSVRFID0gMiwJCQkvKiB0cmFuc2ZlciBmcm9tIHRhcmdldCBtZW1vcnkgKi8KKwlYQlJXX1pFUk8gPSAzLAkJCS8qIFplcm8gdGFyZ2V0IG1lbW9yeSAqLworfSB4ZnNfYnVmX3J3X3Q7CiAKLQotdHlwZWRlZiBlbnVtIHBhZ2VfYnVmX2ZsYWdzX2UgewkJLyogcGJfZmxhZ3MgdmFsdWVzICovCi0JUEJGX1JFQUQgPSAoMSA8PCAwKSwJLyogYnVmZmVyIGludGVuZGVkIGZvciByZWFkaW5nIGZyb20gZGV2aWNlICovCi0JUEJGX1dSSVRFID0gKDEgPDwgMSksCS8qIGJ1ZmZlciBpbnRlbmRlZCBmb3Igd3JpdGluZyB0byBkZXZpY2UgICAqLwotCVBCRl9NQVBQRUQgPSAoMSA8PCAyKSwgIC8qIGJ1ZmZlciBtYXBwZWQgKHBiX2FkZHIgdmFsaWQpICAgICAgICAgICAqLwotCVBCRl9BU1lOQyA9ICgxIDw8IDQpLCAgIC8qIGluaXRpYXRvciB3aWxsIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uICAqLwotCVBCRl9ET05FID0gKDEgPDwgNSksICAgIC8qIGFsbCBwYWdlcyBpbiB0aGUgYnVmZmVyIHVwdG9kYXRlCSAgICovCi0JUEJGX0RFTFdSSSA9ICgxIDw8IDYpLCAgLyogYnVmZmVyIGhhcyBkaXJ0eSBwYWdlcyAgICAgICAgICAgICAgICAgICovCi0JUEJGX1NUQUxFID0gKDEgPDwgNyksCS8qIGJ1ZmZlciBoYXMgYmVlbiBzdGFsZWQsIGRvIG5vdCBmaW5kIGl0ICAqLwotCVBCRl9GU19NQU5BR0VEID0gKDEgPDwgOCksICAvKiBmaWxlc3lzdGVtIGNvbnRyb2xzIGZyZWVpbmcgbWVtb3J5ICAqLwotIAlQQkZfT1JERVJFRCA9ICgxIDw8IDExKSwgICAgLyogdXNlIG9yZGVyZWQgd3JpdGVzCQkgICAqLwotCVBCRl9SRUFEX0FIRUFEID0gKDEgPDwgMTIpLCAvKiBhc3luY2hyb25vdXMgcmVhZC1haGVhZAkJICAgKi8KK3R5cGVkZWYgZW51bSB7CisJWEJGX1JFQUQgPSAoMSA8PCAwKSwJLyogYnVmZmVyIGludGVuZGVkIGZvciByZWFkaW5nIGZyb20gZGV2aWNlICovCisJWEJGX1dSSVRFID0gKDEgPDwgMSksCS8qIGJ1ZmZlciBpbnRlbmRlZCBmb3Igd3JpdGluZyB0byBkZXZpY2UgICAqLworCVhCRl9NQVBQRUQgPSAoMSA8PCAyKSwgIC8qIGJ1ZmZlciBtYXBwZWQgKGJfYWRkciB2YWxpZCkgICAgICAgICAgICAqLworCVhCRl9BU1lOQyA9ICgxIDw8IDQpLCAgIC8qIGluaXRpYXRvciB3aWxsIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uICAqLworCVhCRl9ET05FID0gKDEgPDwgNSksICAgIC8qIGFsbCBwYWdlcyBpbiB0aGUgYnVmZmVyIHVwdG9kYXRlCSAgICovCisJWEJGX0RFTFdSSSA9ICgxIDw8IDYpLCAgLyogYnVmZmVyIGhhcyBkaXJ0eSBwYWdlcyAgICAgICAgICAgICAgICAgICovCisJWEJGX1NUQUxFID0gKDEgPDwgNyksCS8qIGJ1ZmZlciBoYXMgYmVlbiBzdGFsZWQsIGRvIG5vdCBmaW5kIGl0ICAqLworCVhCRl9GU19NQU5BR0VEID0gKDEgPDwgOCksICAvKiBmaWxlc3lzdGVtIGNvbnRyb2xzIGZyZWVpbmcgbWVtb3J5ICAqLworIAlYQkZfT1JERVJFRCA9ICgxIDw8IDExKSwgICAgLyogdXNlIG9yZGVyZWQgd3JpdGVzCQkgICAqLworCVhCRl9SRUFEX0FIRUFEID0gKDEgPDwgMTIpLCAvKiBhc3luY2hyb25vdXMgcmVhZC1haGVhZAkJICAgKi8KIAogCS8qIGZsYWdzIHVzZWQgb25seSBhcyBhcmd1bWVudHMgdG8gYWNjZXNzIHJvdXRpbmVzICovCi0JUEJGX0xPQ0sgPSAoMSA8PCAxNCksICAgICAgIC8qIGxvY2sgcmVxdWVzdGVkCQkJICAgKi8KLQlQQkZfVFJZTE9DSyA9ICgxIDw8IDE1KSwgICAgLyogbG9jayByZXF1ZXN0ZWQsIGJ1dCBkbyBub3Qgd2FpdAkgICAqLwotCVBCRl9ET05UX0JMT0NLID0gKDEgPDwgMTYpLCAvKiBkbyBub3QgYmxvY2sgaW4gY3VycmVudCB0aHJlYWQJICAgKi8KKwlYQkZfTE9DSyA9ICgxIDw8IDE0KSwgICAgICAgLyogbG9jayByZXF1ZXN0ZWQJCQkgICAqLworCVhCRl9UUllMT0NLID0gKDEgPDwgMTUpLCAgICAvKiBsb2NrIHJlcXVlc3RlZCwgYnV0IGRvIG5vdCB3YWl0CSAgICovCisJWEJGX0RPTlRfQkxPQ0sgPSAoMSA8PCAxNiksIC8qIGRvIG5vdCBibG9jayBpbiBjdXJyZW50IHRocmVhZAkgICAqLwogCiAJLyogZmxhZ3MgdXNlZCBvbmx5IGludGVybmFsbHkgKi8KLQlfUEJGX1BBR0VfQ0FDSEUgPSAoMSA8PCAxNyksLyogYmFja2VkIGJ5IHBhZ2VjYWNoZQkJICAgKi8KLQlfUEJGX0tNRU1fQUxMT0MgPSAoMSA8PCAxOCksLyogYmFja2VkIGJ5IGttZW1fYWxsb2MoKQkJICAgKi8KLQlfUEJGX1JVTl9RVUVVRVMgPSAoMSA8PCAxOSksLyogcnVuIGJsb2NrIGRldmljZSB0YXNrIHF1ZXVlCSAgICovCi0JX1BCRl9ERUxXUklfUSA9ICgxIDw8IDIxKSwgICAvKiBidWZmZXIgb24gZGVsd3JpIHF1ZXVlCQkgICAqLwotfSBwYWdlX2J1Zl9mbGFnc190OworCV9YQkZfUEFHRV9DQUNIRSA9ICgxIDw8IDE3KSwvKiBiYWNrZWQgYnkgcGFnZWNhY2hlCQkgICAqLworCV9YQkZfS01FTV9BTExPQyA9ICgxIDw8IDE4KSwvKiBiYWNrZWQgYnkga21lbV9hbGxvYygpCQkgICAqLworCV9YQkZfUlVOX1FVRVVFUyA9ICgxIDw8IDE5KSwvKiBydW4gYmxvY2sgZGV2aWNlIHRhc2sgcXVldWUJICAgKi8KKwlfWEJGX0RFTFdSSV9RID0gKDEgPDwgMjEpLCAgIC8qIGJ1ZmZlciBvbiBkZWx3cmkgcXVldWUJCSAgICovCit9IHhmc19idWZfZmxhZ3NfdDsKIAordHlwZWRlZiBlbnVtIHsKKwlYQlRfRk9SQ0VfU0xFRVAgPSAoMCA8PCAxKSwKKwlYQlRfRk9SQ0VfRkxVU0ggPSAoMSA8PCAxKSwKK30geGZzX2J1ZnRhcmdfZmxhZ3NfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgeGZzX2J1Zmhhc2ggewogCXN0cnVjdCBsaXN0X2hlYWQJYmhfbGlzdDsKQEAgLTc3LDQ3NyArODAsMzUwIEBACiB9IHhmc19idWZoYXNoX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHhmc19idWZ0YXJnIHsKLQlkZXZfdAkJCXBicl9kZXY7Ci0Jc3RydWN0IGJsb2NrX2RldmljZQkqcGJyX2JkZXY7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UJKnBicl9tYXBwaW5nOwotCXVuc2lnbmVkIGludAkJcGJyX2JzaXplOwotCXVuc2lnbmVkIGludAkJcGJyX3NzaGlmdDsKLQlzaXplX3QJCQlwYnJfc21hc2s7CisJZGV2X3QJCQlidF9kZXY7CisJc3RydWN0IGJsb2NrX2RldmljZQkqYnRfYmRldjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqYnRfbWFwcGluZzsKKwl1bnNpZ25lZCBpbnQJCWJ0X2JzaXplOworCXVuc2lnbmVkIGludAkJYnRfc3NoaWZ0OworCXNpemVfdAkJCWJ0X3NtYXNrOwogCi0JLyogcGVyLWRldmljZSBidWZmZXIgaGFzaCB0YWJsZSAqLworCS8qIHBlciBkZXZpY2UgYnVmZmVyIGhhc2ggdGFibGUgKi8KIAl1aW50CQkJYnRfaGFzaG1hc2s7CiAJdWludAkJCWJ0X2hhc2hzaGlmdDsKIAl4ZnNfYnVmaGFzaF90CQkqYnRfaGFzaDsKKworCS8qIHBlciBkZXZpY2UgZGVsd3JpIHF1ZXVlICovCisJc3RydWN0IHRhc2tfc3RydWN0CSpidF90YXNrOworCXN0cnVjdCBsaXN0X2hlYWQJYnRfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWJ0X2RlbHdyaXRlX3F1ZXVlOworCXNwaW5sb2NrX3QJCWJ0X2RlbHdyaXRlX2xvY2s7CisJdW5zaWduZWQgbG9uZwkJYnRfZmxhZ3M7CiB9IHhmc19idWZ0YXJnX3Q7CiAKIC8qCi0gKgl4ZnNfYnVmX3Q6ICBCdWZmZXIgc3RydWN0dXJlIGZvciBwYWdlIGNhY2hlLWJhc2VkIGJ1ZmZlcnMKKyAqCXhmc19idWZfdDogIEJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHBhZ2VjYWNoZS1iYXNlZCBidWZmZXJzCiAgKgotICogVGhpcyBidWZmZXIgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIHBhZ2UgY2FjaGUgYnVmZmVyIG1hbmFnZW1lbnQgcm91dGluZXMKLSAqIHRvIHJlZmVyIHRvIGFuIGFzc2VtYmx5IG9mIHBhZ2VzIGZvcm1pbmcgYSBsb2dpY2FsIGJ1ZmZlci4gIFRoZSBhY3R1YWwgSS9PCi0gKiBpcyBwZXJmb3JtZWQgd2l0aCBidWZmZXJfaGVhZCBzdHJ1Y3R1cmVzLCBhcyByZXF1aXJlZCBieSBkcml2ZXJzLgotICogCi0gKiBUaGUgYnVmZmVyIHN0cnVjdHVyZSBpcyB1c2VkIG9uIHRlbXBvcmFyeSBiYXNpcyBvbmx5LCBhbmQgZGlzY2FyZGVkIHdoZW4KLSAqIHJlbGVhc2VkLiAgVGhlIHJlYWwgZGF0YSBzdG9yYWdlIGlzIHJlY29yZGVkIGluIHRoZSBwYWdlIGNhY2hlLiAgTWV0YWRhdGEgaXMKKyAqIFRoaXMgYnVmZmVyIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBwYWdlY2FjaGUgYnVmZmVyIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqIHRvIHJlZmVyIHRvIGFuIGFzc2VtYmx5IG9mIHBhZ2VzIGZvcm1pbmcgYSBsb2dpY2FsIGJ1ZmZlci4KKyAqCisgKiBUaGUgYnVmZmVyIHN0cnVjdHVyZSBpcyB1c2VkIG9uIGEgdGVtcG9yYXJ5IGJhc2lzIG9ubHksIGFuZCBkaXNjYXJkZWQgd2hlbgorICogcmVsZWFzZWQuICBUaGUgcmVhbCBkYXRhIHN0b3JhZ2UgaXMgcmVjb3JkZWQgaW4gdGhlIHBhZ2VjYWNoZS4gQnVmZmVycyBhcmUKICAqIGhhc2hlZCB0byB0aGUgYmxvY2sgZGV2aWNlIG9uIHdoaWNoIHRoZSBmaWxlIHN5c3RlbSByZXNpZGVzLgogICovCiAKIHN0cnVjdCB4ZnNfYnVmOwordHlwZWRlZiB2b2lkICgqeGZzX2J1Zl9pb2RvbmVfdCkoc3RydWN0IHhmc19idWYgKik7Cit0eXBlZGVmIHZvaWQgKCp4ZnNfYnVmX3JlbHNlX3QpKHN0cnVjdCB4ZnNfYnVmICopOwordHlwZWRlZiBpbnQgKCp4ZnNfYnVmX2Jkc3RyYXRfdCkoc3RydWN0IHhmc19idWYgKik7CiAKLS8qIGNhbGwtYmFjayBmdW5jdGlvbiBvbiBJL08gY29tcGxldGlvbiAqLwotdHlwZWRlZiB2b2lkICgqcGFnZV9idWZfaW9kb25lX3QpKHN0cnVjdCB4ZnNfYnVmICopOwotLyogY2FsbC1iYWNrIGZ1bmN0aW9uIG9uIEkvTyBjb21wbGV0aW9uICovCi10eXBlZGVmIHZvaWQgKCpwYWdlX2J1Zl9yZWxzZV90KShzdHJ1Y3QgeGZzX2J1ZiAqKTsKLS8qIHByZS13cml0ZSBmdW5jdGlvbiAqLwotdHlwZWRlZiBpbnQgKCpwYWdlX2J1Zl9iZHN0cmF0X3QpKHN0cnVjdCB4ZnNfYnVmICopOwotCi0jZGVmaW5lIFBCX1BBR0VTCTIKKyNkZWZpbmUgWEJfUEFHRVMJMgogCiB0eXBlZGVmIHN0cnVjdCB4ZnNfYnVmIHsKLQlzdHJ1Y3Qgc2VtYXBob3JlCXBiX3NlbWE7CS8qIHNlbWFwaG9yZSBmb3IgbG9ja2FibGVzICAqLwotCXVuc2lnbmVkIGxvbmcJCXBiX3F1ZXVldGltZTsJLyogdGltZSBidWZmZXIgd2FzIHF1ZXVlZCAgICovCi0JYXRvbWljX3QJCXBiX3Bpbl9jb3VudDsJLyogcGluIGNvdW50CQkgICAgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdAlwYl93YWl0ZXJzOwkvKiB1bnBpbiB3YWl0ZXJzCSAgICAqLwotCXN0cnVjdCBsaXN0X2hlYWQJcGJfbGlzdDsKLQlwYWdlX2J1Zl9mbGFnc190CXBiX2ZsYWdzOwkvKiBzdGF0dXMgZmxhZ3MgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXBiX2hhc2hfbGlzdDsJLyogaGFzaCB0YWJsZSBsaXN0ICovCi0JeGZzX2J1Zmhhc2hfdAkJKnBiX2hhc2g7CS8qIGhhc2ggdGFibGUgbGlzdCBzdGFydCAqLwotCXhmc19idWZ0YXJnX3QJCSpwYl90YXJnZXQ7CS8qIGJ1ZmZlciB0YXJnZXQgKGRldmljZSkgKi8KLQlhdG9taWNfdAkJcGJfaG9sZDsJLyogcmVmZXJlbmNlIGNvdW50ICovCi0JeGZzX2RhZGRyX3QJCXBiX2JuOwkJLyogYmxvY2sgbnVtYmVyIGZvciBJL08gKi8KLQlsb2ZmX3QJCQlwYl9maWxlX29mZnNldDsJLyogb2Zmc2V0IGluIGZpbGUgKi8KLQlzaXplX3QJCQlwYl9idWZmZXJfbGVuZ3RoOyAvKiBzaXplIG9mIGJ1ZmZlciBpbiBieXRlcyAqLwotCXNpemVfdAkJCXBiX2NvdW50X2Rlc2lyZWQ7IC8qIGRlc2lyZWQgdHJhbnNmZXIgc2l6ZSAqLwotCXZvaWQJCQkqcGJfYWRkcjsJLyogdmlydHVhbCBhZGRyZXNzIG9mIGJ1ZmZlciAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdAlwYl9pb2RvbmVfd29yazsKLQlhdG9taWNfdAkJcGJfaW9fcmVtYWluaW5nOy8qICNvdXRzdGFuZGluZyBJL08gcmVxdWVzdHMgKi8KLQlwYWdlX2J1Zl9pb2RvbmVfdAlwYl9pb2RvbmU7CS8qIEkvTyBjb21wbGV0aW9uIGZ1bmN0aW9uICovCi0JcGFnZV9idWZfcmVsc2VfdAlwYl9yZWxzZTsJLyogcmVsZWFzaW5nIGZ1bmN0aW9uICovCi0JcGFnZV9idWZfYmRzdHJhdF90CXBiX3N0cmF0OwkvKiBwcmUtd3JpdGUgZnVuY3Rpb24gKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlCXBiX2lvZG9uZXNlbWE7CS8qIFNlbWFwaG9yZSBmb3IgSS9PIHdhaXRlcnMgKi8KLQl2b2lkCQkJKnBiX2ZzcHJpdjsKLQl2b2lkCQkJKnBiX2ZzcHJpdjI7Ci0Jdm9pZAkJCSpwYl9mc3ByaXYzOwotCXVuc2lnbmVkIHNob3J0CQlwYl9lcnJvcjsJLyogZXJyb3IgY29kZSBvbiBJL08gKi8KLSAJdW5zaWduZWQgc2hvcnQJCXBiX2xvY2tlZDsJLyogcGFnZSBhcnJheSBpcyBsb2NrZWQgKi8KLSAJdW5zaWduZWQgaW50CQlwYl9wYWdlX2NvdW50OwkvKiBzaXplIG9mIHBhZ2UgYXJyYXkgKi8KLQl1bnNpZ25lZCBpbnQJCXBiX29mZnNldDsJLyogcGFnZSBvZmZzZXQgaW4gZmlyc3QgcGFnZSAqLwotCXN0cnVjdCBwYWdlCQkqKnBiX3BhZ2VzOwkvKiBhcnJheSBvZiBwYWdlIHBvaW50ZXJzICovCi0Jc3RydWN0IHBhZ2UJCSpwYl9wYWdlX2FycmF5W1BCX1BBR0VTXTsgLyogaW5saW5lIHBhZ2VzICovCi0jaWZkZWYgUEFHRUJVRl9MT0NLX1RSQUNLSU5HCi0JaW50CQkJcGJfbGFzdF9ob2xkZXI7CisJc3RydWN0IHNlbWFwaG9yZQliX3NlbWE7CQkvKiBzZW1hcGhvcmUgZm9yIGxvY2thYmxlcyAqLworCXVuc2lnbmVkIGxvbmcJCWJfcXVldWV0aW1lOwkvKiB0aW1lIGJ1ZmZlciB3YXMgcXVldWVkICovCisJYXRvbWljX3QJCWJfcGluX2NvdW50OwkvKiBwaW4gY291bnQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAliX3dhaXRlcnM7CS8qIHVucGluIHdhaXRlcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWJfbGlzdDsKKwl4ZnNfYnVmX2ZsYWdzX3QJCWJfZmxhZ3M7CS8qIHN0YXR1cyBmbGFncyAqLworCXN0cnVjdCBsaXN0X2hlYWQJYl9oYXNoX2xpc3Q7CS8qIGhhc2ggdGFibGUgbGlzdCAqLworCXhmc19idWZoYXNoX3QJCSpiX2hhc2g7CS8qIGhhc2ggdGFibGUgbGlzdCBzdGFydCAqLworCXhmc19idWZ0YXJnX3QJCSpiX3RhcmdldDsJLyogYnVmZmVyIHRhcmdldCAoZGV2aWNlKSAqLworCWF0b21pY190CQliX2hvbGQ7CQkvKiByZWZlcmVuY2UgY291bnQgKi8KKwl4ZnNfZGFkZHJfdAkJYl9ibjsJCS8qIGJsb2NrIG51bWJlciBmb3IgSS9PICovCisJeGZzX29mZl90CQliX2ZpbGVfb2Zmc2V0OwkvKiBvZmZzZXQgaW4gZmlsZSAqLworCXNpemVfdAkJCWJfYnVmZmVyX2xlbmd0aDsvKiBzaXplIG9mIGJ1ZmZlciBpbiBieXRlcyAqLworCXNpemVfdAkJCWJfY291bnRfZGVzaXJlZDsvKiBkZXNpcmVkIHRyYW5zZmVyIHNpemUgKi8KKwl2b2lkCQkJKmJfYWRkcjsJLyogdmlydHVhbCBhZGRyZXNzIG9mIGJ1ZmZlciAqLworCXN0cnVjdCB3b3JrX3N0cnVjdAliX2lvZG9uZV93b3JrOworCWF0b21pY190CQliX2lvX3JlbWFpbmluZzsJLyogI291dHN0YW5kaW5nIEkvTyByZXF1ZXN0cyAqLworCXhmc19idWZfaW9kb25lX3QJYl9pb2RvbmU7CS8qIEkvTyBjb21wbGV0aW9uIGZ1bmN0aW9uICovCisJeGZzX2J1Zl9yZWxzZV90CQliX3JlbHNlOwkvKiByZWxlYXNpbmcgZnVuY3Rpb24gKi8KKwl4ZnNfYnVmX2Jkc3RyYXRfdAliX3N0cmF0OwkvKiBwcmUtd3JpdGUgZnVuY3Rpb24gKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlCWJfaW9kb25lc2VtYTsJLyogU2VtYXBob3JlIGZvciBJL08gd2FpdGVycyAqLworCXZvaWQJCQkqYl9mc3ByaXY7CisJdm9pZAkJCSpiX2ZzcHJpdjI7CisJdm9pZAkJCSpiX2ZzcHJpdjM7CisJdW5zaWduZWQgc2hvcnQJCWJfZXJyb3I7CS8qIGVycm9yIGNvZGUgb24gSS9PICovCisJdW5zaWduZWQgc2hvcnQJCWJfbG9ja2VkOwkvKiBwYWdlIGFycmF5IGlzIGxvY2tlZCAqLworCXVuc2lnbmVkIGludAkJYl9wYWdlX2NvdW50OwkvKiBzaXplIG9mIHBhZ2UgYXJyYXkgKi8KKwl1bnNpZ25lZCBpbnQJCWJfb2Zmc2V0OwkvKiBwYWdlIG9mZnNldCBpbiBmaXJzdCBwYWdlICovCisJc3RydWN0IHBhZ2UJCSoqYl9wYWdlczsJLyogYXJyYXkgb2YgcGFnZSBwb2ludGVycyAqLworCXN0cnVjdCBwYWdlCQkqYl9wYWdlX2FycmF5W1hCX1BBR0VTXTsgLyogaW5saW5lIHBhZ2VzICovCisjaWZkZWYgWEZTX0JVRl9MT0NLX1RSQUNLSU5HCisJaW50CQkJYl9sYXN0X2hvbGRlcjsKICNlbmRpZgogfSB4ZnNfYnVmX3Q7CiAKIAogLyogRmluZGluZyBhbmQgUmVhZGluZyBCdWZmZXJzICovCi0KLWV4dGVybiB4ZnNfYnVmX3QgKl9wYWdlYnVmX2ZpbmQoCS8qIGZpbmQgYnVmZmVyIGZvciBibG9jayBpZgkqLwotCQkJCQkvKiB0aGUgYmxvY2sgaXMgaW4gbWVtb3J5CSovCi0JCXhmc19idWZ0YXJnX3QgKiwJLyogaW5vZGUgZm9yIGJsb2NrCQkqLwotCQlsb2ZmX3QsCQkJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCi0JCXNpemVfdCwJCQkvKiBsZW5ndGggb2YgcmFuZ2UJCSovCi0JCXBhZ2VfYnVmX2ZsYWdzX3QsCS8qIFBCRl9MT0NLCQkJKi8KLQkgICAgICAgIHhmc19idWZfdCAqKTsJCS8qIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIJKi8KLQorZXh0ZXJuIHhmc19idWZfdCAqX3hmc19idWZfZmluZCh4ZnNfYnVmdGFyZ190ICosIHhmc19vZmZfdCwgc2l6ZV90LAorCQkJCXhmc19idWZfZmxhZ3NfdCwgeGZzX2J1Zl90ICopOwogI2RlZmluZSB4ZnNfaW5jb3JlKGJ1ZnRhcmcsYmxrbm8sbGVuLGxvY2tpdCkgXAotCV9wYWdlYnVmX2ZpbmQoYnVmdGFyZywgYmxrbm8gLGxlbiwgbG9ja2l0LCBOVUxMKQorCV94ZnNfYnVmX2ZpbmQoYnVmdGFyZywgYmxrbm8gLGxlbiwgbG9ja2l0LCBOVUxMKQogCi1leHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX2dldF9mbGFncygJLyogYWxsb2NhdGUgYSBidWZmZXIJCSovCi0JCXhmc19idWZ0YXJnX3QgKiwJLyogaW5vZGUgZm9yIGJ1ZmZlcgkJKi8KLQkJbG9mZl90LAkJCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZSAgICAgKi8KLQkJc2l6ZV90LAkJCS8qIGxlbmd0aCBvZiByYW5nZSAgICAgICAgICAgICAgKi8KLQkJcGFnZV9idWZfZmxhZ3NfdCk7CS8qIFBCRl9MT0NLLCBQQkZfUkVBRCwJCSovCi0JCQkJCS8qIFBCRl9BU1lOQwkJCSovCi0KK2V4dGVybiB4ZnNfYnVmX3QgKnhmc19idWZfZ2V0X2ZsYWdzKHhmc19idWZ0YXJnX3QgKiwgeGZzX29mZl90LCBzaXplX3QsCisJCQkJeGZzX2J1Zl9mbGFnc190KTsKICNkZWZpbmUgeGZzX2J1Zl9nZXQodGFyZ2V0LCBibGtubywgbGVuLCBmbGFncykgXAotCXhmc19idWZfZ2V0X2ZsYWdzKCh0YXJnZXQpLCAoYmxrbm8pLCAobGVuKSwgUEJGX0xPQ0sgfCBQQkZfTUFQUEVEKQorCXhmc19idWZfZ2V0X2ZsYWdzKCh0YXJnZXQpLCAoYmxrbm8pLCAobGVuKSwgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKQogCi1leHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX3JlYWRfZmxhZ3MoCS8qIGFsbG9jYXRlIGFuZCByZWFkIGEgYnVmZmVyCSovCi0JCXhmc19idWZ0YXJnX3QgKiwJLyogaW5vZGUgZm9yIGJ1ZmZlcgkJKi8KLQkJbG9mZl90LAkJCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZQkqLwotCQlzaXplX3QsCQkJLyogbGVuZ3RoIG9mIHJhbmdlCQkqLwotCQlwYWdlX2J1Zl9mbGFnc190KTsJLyogUEJGX0xPQ0ssIFBCRl9BU1lOQwkJKi8KLQorZXh0ZXJuIHhmc19idWZfdCAqeGZzX2J1Zl9yZWFkX2ZsYWdzKHhmc19idWZ0YXJnX3QgKiwgeGZzX29mZl90LCBzaXplX3QsCisJCQkJeGZzX2J1Zl9mbGFnc190KTsKICNkZWZpbmUgeGZzX2J1Zl9yZWFkKHRhcmdldCwgYmxrbm8sIGxlbiwgZmxhZ3MpIFwKLQl4ZnNfYnVmX3JlYWRfZmxhZ3MoKHRhcmdldCksIChibGtubyksIChsZW4pLCBQQkZfTE9DSyB8IFBCRl9NQVBQRUQpCisJeGZzX2J1Zl9yZWFkX2ZsYWdzKCh0YXJnZXQpLCAoYmxrbm8pLCAobGVuKSwgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKQogCi1leHRlcm4geGZzX2J1Zl90ICpwYWdlYnVmX2dldF9lbXB0eSgJLyogYWxsb2NhdGUgcGFnZWJ1ZiBzdHJ1Y3Qgd2l0aAkqLwotCQkJCQkvKiAgbm8gbWVtb3J5IG9yIGRpc2sgYWRkcmVzcwkqLwotCQlzaXplX3QgbGVuLAotCQl4ZnNfYnVmdGFyZ190ICopOwkvKiBtb3VudCBwb2ludCAiZmFrZSIgaW5vZGUJKi8KLQotZXh0ZXJuIHhmc19idWZfdCAqcGFnZWJ1Zl9nZXRfbm9fZGFkZHIoLyogYWxsb2NhdGUgcGFnZWJ1ZiBzdHJ1Y3QJKi8KLQkJCQkJLyogd2l0aG91dCBkaXNrIGFkZHJlc3MJCSovCi0JCXNpemVfdCBsZW4sCi0JCXhmc19idWZ0YXJnX3QgKik7CS8qIG1vdW50IHBvaW50ICJmYWtlIiBpbm9kZQkqLwotCi1leHRlcm4gaW50IHBhZ2VidWZfYXNzb2NpYXRlX21lbW9yeSgKLQkJeGZzX2J1Zl90ICosCi0JCXZvaWQgKiwKLQkJc2l6ZV90KTsKLQotZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9ob2xkKAkJLyogaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudAkqLwotCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gaG9sZAkJKi8KLQotZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9yZWFkYWhlYWQoCQkvKiByZWFkIGFoZWFkIGludG8gY2FjaGUJKi8KLQkJeGZzX2J1ZnRhcmdfdCAgKiwJLyogdGFyZ2V0IGZvciBidWZmZXIgKG9yIE5VTEwpCSovCi0JCWxvZmZfdCwJCQkvKiBzdGFydGluZyBvZmZzZXQgb2YgcmFuZ2UgICAgICovCi0JCXNpemVfdCwJCQkvKiBsZW5ndGggb2YgcmFuZ2UgICAgICAgICAgICAgICovCi0JCXBhZ2VfYnVmX2ZsYWdzX3QpOwkvKiBhZGRpdGlvbmFsIHJlYWQgZmxhZ3MJKi8KK2V4dGVybiB4ZnNfYnVmX3QgKnhmc19idWZfZ2V0X2VtcHR5KHNpemVfdCwgeGZzX2J1ZnRhcmdfdCAqKTsKK2V4dGVybiB4ZnNfYnVmX3QgKnhmc19idWZfZ2V0X25vYWRkcihzaXplX3QsIHhmc19idWZ0YXJnX3QgKik7CitleHRlcm4gaW50IHhmc19idWZfYXNzb2NpYXRlX21lbW9yeSh4ZnNfYnVmX3QgKiwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIHZvaWQgeGZzX2J1Zl9ob2xkKHhmc19idWZfdCAqKTsKK2V4dGVybiB2b2lkIHhmc19idWZfcmVhZGFoZWFkKHhmc19idWZ0YXJnX3QgKiwgeGZzX29mZl90LCBzaXplX3QsCisJCQkJeGZzX2J1Zl9mbGFnc190KTsKIAogLyogUmVsZWFzaW5nIEJ1ZmZlcnMgKi8KLQotZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9mcmVlKAkJLyogZGVhbGxvY2F0ZSBhIGJ1ZmZlcgkJKi8KLQkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIGRlYWxsb2NhdGUJCSovCi0KLWV4dGVybiB2b2lkIHBhZ2VidWZfcmVsZSgJCS8qIHJlbGVhc2UgaG9sZCBvbiBhIGJ1ZmZlcgkqLwotCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gcmVsZWFzZQkJKi8KK2V4dGVybiB2b2lkIHhmc19idWZfZnJlZSh4ZnNfYnVmX3QgKik7CitleHRlcm4gdm9pZCB4ZnNfYnVmX3JlbGUoeGZzX2J1Zl90ICopOwogCiAvKiBMb2NraW5nIGFuZCBVbmxvY2tpbmcgQnVmZmVycyAqLwotCi1leHRlcm4gaW50IHBhZ2VidWZfY29uZF9sb2NrKAkJLyogbG9jayBidWZmZXIsIGlmIG5vdCBsb2NrZWQJKi8KLQkJCQkJLyogKHJldHVybnMgLUVCVVNZIGlmIGxvY2tlZCkJKi8KLQkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIGxvY2sJCSovCi0KLWV4dGVybiBpbnQgcGFnZWJ1Zl9sb2NrX3ZhbHVlKAkJLyogcmV0dXJuIGNvdW50IG9uIGxvY2sJCSovCi0JCXhmc19idWZfdCAqKTsgICAgICAgICAgLyogYnVmZmVyIHRvIGNoZWNrICAgICAgICAgICAgICAqLwotCi1leHRlcm4gaW50IHBhZ2VidWZfbG9jaygJCS8qIGxvY2sgYnVmZmVyICAgICAgICAgICAgICAgICAgKi8KLQkJeGZzX2J1Zl90ICopOyAgICAgICAgICAvKiBidWZmZXIgdG8gbG9jayAgICAgICAgICAgICAgICovCi0KLWV4dGVybiB2b2lkIHBhZ2VidWZfdW5sb2NrKAkJLyogdW5sb2NrIGJ1ZmZlcgkJKi8KLQkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIHVubG9jawkJKi8KK2V4dGVybiBpbnQgeGZzX2J1Zl9jb25kX2xvY2soeGZzX2J1Zl90ICopOworZXh0ZXJuIGludCB4ZnNfYnVmX2xvY2tfdmFsdWUoeGZzX2J1Zl90ICopOworZXh0ZXJuIHZvaWQgeGZzX2J1Zl9sb2NrKHhmc19idWZfdCAqKTsKK2V4dGVybiB2b2lkIHhmc19idWZfdW5sb2NrKHhmc19idWZfdCAqKTsKIAogLyogQnVmZmVyIFJlYWQgYW5kIFdyaXRlIFJvdXRpbmVzICovCitleHRlcm4gdm9pZCB4ZnNfYnVmX2lvZW5kKHhmc19idWZfdCAqLAlpbnQpOworZXh0ZXJuIHZvaWQgeGZzX2J1Zl9pb2Vycm9yKHhmc19idWZfdCAqLCBpbnQpOworZXh0ZXJuIGludCB4ZnNfYnVmX2lvc3RhcnQoeGZzX2J1Zl90ICosIHhmc19idWZfZmxhZ3NfdCk7CitleHRlcm4gaW50IHhmc19idWZfaW9yZXF1ZXN0KHhmc19idWZfdCAqKTsKK2V4dGVybiBpbnQgeGZzX2J1Zl9pb3dhaXQoeGZzX2J1Zl90ICopOworZXh0ZXJuIHZvaWQgeGZzX2J1Zl9pb21vdmUoeGZzX2J1Zl90ICosIHNpemVfdCwgc2l6ZV90LCB4ZnNfY2FkZHJfdCwKKwkJCQl4ZnNfYnVmX3J3X3QpOwogCi1leHRlcm4gdm9pZCBwYWdlYnVmX2lvZG9uZSgJCS8qIG1hcmsgYnVmZmVyIEkvTyBjb21wbGV0ZQkqLwotCQl4ZnNfYnVmX3QgKiwJCS8qIGJ1ZmZlciB0byBtYXJrCQkqLwotCQlpbnQpOwkJCS8qIHJ1biBjb21wbGV0aW9uIGxvY2FsbHksIG9yIGluCi0JCQkJCSAqIGEgaGVscGVyIHRocmVhZC4JCSovCi0KLWV4dGVybiB2b2lkIHBhZ2VidWZfaW9lcnJvcigJCS8qIG1hcmsgYnVmZmVyIGluIGVycm9yCShvciBub3QpICovCi0JCXhmc19idWZfdCAqLAkJLyogYnVmZmVyIHRvIG1hcmsJCSovCi0JCWludCk7CQkJLyogZXJyb3IgdG8gc3RvcmUgKDAgaWYgbm9uZSkJKi8KLQotZXh0ZXJuIGludCBwYWdlYnVmX2lvc3RhcnQoCQkvKiBzdGFydCBJL08gb24gYSBidWZmZXIJKi8KLQkJeGZzX2J1Zl90ICosCQkvKiBidWZmZXIgdG8gc3RhcnQJCSovCi0JCXBhZ2VfYnVmX2ZsYWdzX3QpOwkvKiBQQkZfTE9DSywgUEJGX0FTWU5DLAkJKi8KLQkJCQkJLyogUEJGX1JFQUQsIFBCRl9XUklURSwJCSovCi0JCQkJCS8qIFBCRl9ERUxXUkkJCQkqLwotCi1leHRlcm4gaW50IHBhZ2VidWZfaW9yZXF1ZXN0KAkJLyogc3RhcnQgcmVhbCBJL08JCSovCi0JCXhmc19idWZfdCAqKTsJCS8qIGJ1ZmZlciB0byBjb252ZXkgdG8gZGV2aWNlCSovCi0KLWV4dGVybiBpbnQgcGFnZWJ1Zl9pb3dhaXQoCQkvKiB3YWl0IGZvciBidWZmZXIgSS9PIGRvbmUJKi8KLQkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIHdhaXQgb24JCSovCi0KLWV4dGVybiB2b2lkIHBhZ2VidWZfaW9tb3ZlKAkJLyogbW92ZSBkYXRhIGluL291dCBvZiBwYWdlYnVmCSovCi0JCXhmc19idWZfdCAqLAkJLyogYnVmZmVyIHRvIG1hbmlwdWxhdGUJCSovCi0JCXNpemVfdCwJCQkvKiBzdGFydGluZyBidWZmZXIgb2Zmc2V0CSovCi0JCXNpemVfdCwJCQkvKiBsZW5ndGggaW4gYnVmZmVyCQkqLwotCQljYWRkcl90LAkJLyogZGF0YSBwb2ludGVyCQkJKi8KLQkJcGFnZV9idWZfcndfdCk7CQkvKiBkaXJlY3Rpb24JCQkqLwotCi1zdGF0aWMgaW5saW5lIGludCBwYWdlYnVmX2lvc3RyYXRlZ3koeGZzX2J1Zl90ICpwYikKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19idWZfaW9zdHJhdGVneSh4ZnNfYnVmX3QgKmJwKQogewotCXJldHVybiBwYi0+cGJfc3RyYXQgPyBwYi0+cGJfc3RyYXQocGIpIDogcGFnZWJ1Zl9pb3JlcXVlc3QocGIpOworCXJldHVybiBicC0+Yl9zdHJhdCA/IGJwLT5iX3N0cmF0KGJwKSA6IHhmc19idWZfaW9yZXF1ZXN0KGJwKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcGFnZWJ1Zl9nZXRlcnJvcih4ZnNfYnVmX3QgKnBiKQorc3RhdGljIGlubGluZSBpbnQgeGZzX2J1Zl9nZXRlcnJvcih4ZnNfYnVmX3QgKmJwKQogewotCXJldHVybiBwYiA/IHBiLT5wYl9lcnJvciA6IEVOT01FTTsKKwlyZXR1cm4gYnAgPyBicC0+Yl9lcnJvciA6IEVOT01FTTsKIH0KIAogLyogQnVmZmVyIFV0aWxpdHkgUm91dGluZXMgKi8KLQotZXh0ZXJuIGNhZGRyX3QgcGFnZWJ1Zl9vZmZzZXQoCQkvKiBwb2ludGVyIGF0IG9mZnNldCBpbiBidWZmZXIJKi8KLQkJeGZzX2J1Zl90ICosCQkvKiBidWZmZXIgdG8gb2Zmc2V0IGludG8JKi8KLQkJc2l6ZV90KTsJCS8qIG9mZnNldAkJCSovCitleHRlcm4geGZzX2NhZGRyX3QgeGZzX2J1Zl9vZmZzZXQoeGZzX2J1Zl90ICosIHNpemVfdCk7CiAKIC8qIFBpbm5pbmcgQnVmZmVyIFN0b3JhZ2UgaW4gTWVtb3J5ICovCi0KLWV4dGVybiB2b2lkIHBhZ2VidWZfcGluKAkJLyogcGluIGJ1ZmZlciBpbiBtZW1vcnkJCSovCi0JCXhmc19idWZfdCAqKTsJCS8qIGJ1ZmZlciB0byBwaW4JCSovCi0KLWV4dGVybiB2b2lkIHBhZ2VidWZfdW5waW4oCQkvKiB1bnBpbiBidWZmZXJlZCBkYXRhCQkqLwotCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gdW5waW4JCSovCi0KLWV4dGVybiBpbnQgcGFnZWJ1Zl9pc3BpbigJCS8qIGNoZWNrIGlmIGJ1ZmZlciBpcyBwaW5uZWQJKi8KLQkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIGNoZWNrCQkqLworZXh0ZXJuIHZvaWQgeGZzX2J1Zl9waW4oeGZzX2J1Zl90ICopOworZXh0ZXJuIHZvaWQgeGZzX2J1Zl91bnBpbih4ZnNfYnVmX3QgKik7CitleHRlcm4gaW50IHhmc19idWZfaXNwaW4oeGZzX2J1Zl90ICopOwogCiAvKiBEZWxheWVkIFdyaXRlIEJ1ZmZlciBSb3V0aW5lcyAqLwotCi1leHRlcm4gdm9pZCBwYWdlYnVmX2RlbHdyaV9kZXF1ZXVlKHhmc19idWZfdCAqKTsKK2V4dGVybiB2b2lkIHhmc19idWZfZGVsd3JpX2RlcXVldWUoeGZzX2J1Zl90ICopOwogCiAvKiBCdWZmZXIgRGFlbW9uIFNldHVwIFJvdXRpbmVzICovCitleHRlcm4gaW50IHhmc19idWZfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHhmc19idWZfdGVybWluYXRlKHZvaWQpOwogCi1leHRlcm4gaW50IHBhZ2VidWZfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHBhZ2VidWZfdGVybWluYXRlKHZvaWQpOwotCi0KLSNpZmRlZiBQQUdFQlVGX1RSQUNFCi1leHRlcm4ga3RyYWNlX3QgKnBhZ2VidWZfdHJhY2VfYnVmOwotZXh0ZXJuIHZvaWQgcGFnZWJ1Zl90cmFjZSgKLQkJeGZzX2J1Zl90ICosCQkvKiBidWZmZXIgYmVpbmcgdHJhY2VkCQkqLwotCQljaGFyICosCQkJLyogZGVzY3JpcHRpb24gb2Ygb3BlcmF0aW9uCSovCi0JCXZvaWQgKiwJCQkvKiBhcmJpdHJhcnkgZGlhZ25vc3RpYyB2YWx1ZQkqLwotCQl2b2lkICopOwkJLyogcmV0dXJuIGFkZHJlc3MJCSovCisjaWZkZWYgWEZTX0JVRl9UUkFDRQorZXh0ZXJuIGt0cmFjZV90ICp4ZnNfYnVmX3RyYWNlX2J1ZjsKK2V4dGVybiB2b2lkIHhmc19idWZfdHJhY2UoeGZzX2J1Zl90ICosIGNoYXIgKiwgdm9pZCAqLCB2b2lkICopOwogI2Vsc2UKLSMgZGVmaW5lIHBhZ2VidWZfdHJhY2UocGIsIGlkLCBwdHIsIHJhKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHhmc19idWZfdHJhY2UoYnAsaWQscHRyLHJhKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2RlZmluZSBwYWdlYnVmX3RhcmdldF9uYW1lKHRhcmdldCkJXAotCSh7IGNoYXIgX19iW0JERVZOQU1FX1NJWkVdOyBiZGV2bmFtZSgodGFyZ2V0KS0+cGJyX2JkZXYsIF9fYik7IF9fYjsgfSkKKyNkZWZpbmUgeGZzX2J1Zl90YXJnZXRfbmFtZSh0YXJnZXQpCVwKKwkoeyBjaGFyIF9fYltCREVWTkFNRV9TSVpFXTsgYmRldm5hbWUoKHRhcmdldCktPmJ0X2JkZXYsIF9fYik7IF9fYjsgfSkKIAogCisjZGVmaW5lIFhGU19CX0FTWU5DCQlYQkZfQVNZTkMKKyNkZWZpbmUgWEZTX0JfREVMV1JJCQlYQkZfREVMV1JJCisjZGVmaW5lIFhGU19CX1JFQUQJCVhCRl9SRUFECisjZGVmaW5lIFhGU19CX1dSSVRFCQlYQkZfV1JJVEUKKyNkZWZpbmUgWEZTX0JfU1RBTEUJCVhCRl9TVEFMRQogCi0vKiBUaGVzZSBhcmUganVzdCBmb3IgeGZzX3N5bmNzdWIuLi4gaXQgc2V0cyBhbiBpbnRlcm5hbCB2YXJpYWJsZQotICogdGhlbiBwYXNzZXMgaXQgdG8gVk9QX0ZMVVNIX1BBR0VTIG9yIGFkZHMgdGhlIGZsYWdzIHRvIGEgbmV3bHkgZ290dGVuIGJ1Zl90Ci0gKi8KLSNkZWZpbmUgWEZTX0JfQVNZTkMJCVBCRl9BU1lOQwotI2RlZmluZSBYRlNfQl9ERUxXUkkJCVBCRl9ERUxXUkkKLSNkZWZpbmUgWEZTX0JfUkVBRAkJUEJGX1JFQUQKLSNkZWZpbmUgWEZTX0JfV1JJVEUJCVBCRl9XUklURQotI2RlZmluZSBYRlNfQl9TVEFMRQkJUEJGX1NUQUxFCisjZGVmaW5lIFhGU19CVUZfVFJZTE9DSwkJWEJGX1RSWUxPQ0sKKyNkZWZpbmUgWEZTX0lOQ09SRV9UUllMT0NLCVhCRl9UUllMT0NLCisjZGVmaW5lIFhGU19CVUZfTE9DSwkJWEJGX0xPQ0sKKyNkZWZpbmUgWEZTX0JVRl9NQVBQRUQJCVhCRl9NQVBQRUQKIAotI2RlZmluZSBYRlNfQlVGX1RSWUxPQ0sJCVBCRl9UUllMT0NLCi0jZGVmaW5lIFhGU19JTkNPUkVfVFJZTE9DSwlQQkZfVFJZTE9DSwotI2RlZmluZSBYRlNfQlVGX0xPQ0sJCVBCRl9MT0NLCi0jZGVmaW5lIFhGU19CVUZfTUFQUEVECQlQQkZfTUFQUEVECisjZGVmaW5lIEJVRl9CVVNZCQlYQkZfRE9OVF9CTE9DSwogCi0jZGVmaW5lIEJVRl9CVVNZCQlQQkZfRE9OVF9CTE9DSworI2RlZmluZSBYRlNfQlVGX0JGTEFHUyhicCkJKChicCktPmJfZmxhZ3MpCisjZGVmaW5lIFhGU19CVUZfWkVST0ZMQUdTKGJwKQlcCisJKChicCktPmJfZmxhZ3MgJj0gfihYQkZfUkVBRHxYQkZfV1JJVEV8WEJGX0FTWU5DfFhCRl9ERUxXUkkpKQogCi0jZGVmaW5lIFhGU19CVUZfQkZMQUdTKHgpCSgoeCktPnBiX2ZsYWdzKQotI2RlZmluZSBYRlNfQlVGX1pFUk9GTEFHUyh4KQlcCi0JKCh4KS0+cGJfZmxhZ3MgJj0gfihQQkZfUkVBRHxQQkZfV1JJVEV8UEJGX0FTWU5DfFBCRl9ERUxXUkkpKQotCi0jZGVmaW5lIFhGU19CVUZfU1RBTEUoeCkJKCh4KS0+cGJfZmxhZ3MgfD0gWEZTX0JfU1RBTEUpCi0jZGVmaW5lIFhGU19CVUZfVU5TVEFMRSh4KQkoKHgpLT5wYl9mbGFncyAmPSB+WEZTX0JfU1RBTEUpCi0jZGVmaW5lIFhGU19CVUZfSVNTVEFMRSh4KQkoKHgpLT5wYl9mbGFncyAmIFhGU19CX1NUQUxFKQotI2RlZmluZSBYRlNfQlVGX1NVUEVSX1NUQUxFKHgpCWRvIHsJCQkJXAotCQkJCQlYRlNfQlVGX1NUQUxFKHgpOwlcCi0JCQkJCXBhZ2VidWZfZGVsd3JpX2RlcXVldWUoeCk7CVwKLQkJCQkJWEZTX0JVRl9ET05FKHgpOwlcCisjZGVmaW5lIFhGU19CVUZfU1RBTEUoYnApCSgoYnApLT5iX2ZsYWdzIHw9IFhGU19CX1NUQUxFKQorI2RlZmluZSBYRlNfQlVGX1VOU1RBTEUoYnApCSgoYnApLT5iX2ZsYWdzICY9IH5YRlNfQl9TVEFMRSkKKyNkZWZpbmUgWEZTX0JVRl9JU1NUQUxFKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhGU19CX1NUQUxFKQorI2RlZmluZSBYRlNfQlVGX1NVUEVSX1NUQUxFKGJwKQlkbyB7CQkJCVwKKwkJCQkJWEZTX0JVRl9TVEFMRShicCk7CVwKKwkJCQkJeGZzX2J1Zl9kZWx3cmlfZGVxdWV1ZShicCk7CVwKKwkJCQkJWEZTX0JVRl9ET05FKGJwKTsJXAogCQkJCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgWEZTX0JVRl9NQU5BR0UJCVBCRl9GU19NQU5BR0VECi0jZGVmaW5lIFhGU19CVUZfVU5NQU5BR0UoeCkJKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9GU19NQU5BR0VEKQorI2RlZmluZSBYRlNfQlVGX01BTkFHRQkJWEJGX0ZTX01BTkFHRUQKKyNkZWZpbmUgWEZTX0JVRl9VTk1BTkFHRShicCkJKChicCktPmJfZmxhZ3MgJj0gflhCRl9GU19NQU5BR0VEKQogCi0jZGVmaW5lIFhGU19CVUZfREVMQVlXUklURSh4KQkgKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX0RFTFdSSSkKLSNkZWZpbmUgWEZTX0JVRl9VTkRFTEFZV1JJVEUoeCkJIHBhZ2VidWZfZGVsd3JpX2RlcXVldWUoeCkKLSNkZWZpbmUgWEZTX0JVRl9JU0RFTEFZV1JJVEUoeCkJICgoeCktPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSkKKyNkZWZpbmUgWEZTX0JVRl9ERUxBWVdSSVRFKGJwKQkJKChicCktPmJfZmxhZ3MgfD0gWEJGX0RFTFdSSSkKKyNkZWZpbmUgWEZTX0JVRl9VTkRFTEFZV1JJVEUoYnApCXhmc19idWZfZGVsd3JpX2RlcXVldWUoYnApCisjZGVmaW5lIFhGU19CVUZfSVNERUxBWVdSSVRFKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9ERUxXUkkpCiAKLSNkZWZpbmUgWEZTX0JVRl9FUlJPUih4LG5vKQkgcGFnZWJ1Zl9pb2Vycm9yKHgsbm8pCi0jZGVmaW5lIFhGU19CVUZfR0VURVJST1IoeCkJIHBhZ2VidWZfZ2V0ZXJyb3IoeCkKLSNkZWZpbmUgWEZTX0JVRl9JU0VSUk9SKHgpCSAocGFnZWJ1Zl9nZXRlcnJvcih4KT8xOjApCisjZGVmaW5lIFhGU19CVUZfRVJST1IoYnAsbm8pCXhmc19idWZfaW9lcnJvcihicCxubykKKyNkZWZpbmUgWEZTX0JVRl9HRVRFUlJPUihicCkJeGZzX2J1Zl9nZXRlcnJvcihicCkKKyNkZWZpbmUgWEZTX0JVRl9JU0VSUk9SKGJwKQkoeGZzX2J1Zl9nZXRlcnJvcihicCkgPyAxIDogMCkKIAotI2RlZmluZSBYRlNfQlVGX0RPTkUoeCkJCSAoKHgpLT5wYl9mbGFncyB8PSBQQkZfRE9ORSkKLSNkZWZpbmUgWEZTX0JVRl9VTkRPTkUoeCkJICgoeCktPnBiX2ZsYWdzICY9IH5QQkZfRE9ORSkKLSNkZWZpbmUgWEZTX0JVRl9JU0RPTkUoeCkJICgoeCktPnBiX2ZsYWdzICYgUEJGX0RPTkUpCisjZGVmaW5lIFhGU19CVUZfRE9ORShicCkJKChicCktPmJfZmxhZ3MgfD0gWEJGX0RPTkUpCisjZGVmaW5lIFhGU19CVUZfVU5ET05FKGJwKQkoKGJwKS0+Yl9mbGFncyAmPSB+WEJGX0RPTkUpCisjZGVmaW5lIFhGU19CVUZfSVNET05FKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9ET05FKQogCi0jZGVmaW5lIFhGU19CVUZfQlVTWSh4KQkJIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgWEZTX0JVRl9VTkJVU1koeCkJIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgWEZTX0JVRl9JU0JVU1koeCkJICgxKQorI2RlZmluZSBYRlNfQlVGX0JVU1koYnApCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgWEZTX0JVRl9VTkJVU1koYnApCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgWEZTX0JVRl9JU0JVU1koYnApCSgxKQogCi0jZGVmaW5lIFhGU19CVUZfQVNZTkMoeCkJICgoeCktPnBiX2ZsYWdzIHw9IFBCRl9BU1lOQykKLSNkZWZpbmUgWEZTX0JVRl9VTkFTWU5DKHgpCSAoKHgpLT5wYl9mbGFncyAmPSB+UEJGX0FTWU5DKQotI2RlZmluZSBYRlNfQlVGX0lTQVNZTkMoeCkJICgoeCktPnBiX2ZsYWdzICYgUEJGX0FTWU5DKQorI2RlZmluZSBYRlNfQlVGX0FTWU5DKGJwKQkoKGJwKS0+Yl9mbGFncyB8PSBYQkZfQVNZTkMpCisjZGVmaW5lIFhGU19CVUZfVU5BU1lOQyhicCkJKChicCktPmJfZmxhZ3MgJj0gflhCRl9BU1lOQykKKyNkZWZpbmUgWEZTX0JVRl9JU0FTWU5DKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9BU1lOQykKIAotI2RlZmluZSBYRlNfQlVGX09SREVSRUQoeCkJICgoeCktPnBiX2ZsYWdzIHw9IFBCRl9PUkRFUkVEKQotI2RlZmluZSBYRlNfQlVGX1VOT1JERVJFRCh4KQkgKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9PUkRFUkVEKQotI2RlZmluZSBYRlNfQlVGX0lTT1JERVJFRCh4KQkgKCh4KS0+cGJfZmxhZ3MgJiBQQkZfT1JERVJFRCkKKyNkZWZpbmUgWEZTX0JVRl9PUkRFUkVEKGJwKQkoKGJwKS0+Yl9mbGFncyB8PSBYQkZfT1JERVJFRCkKKyNkZWZpbmUgWEZTX0JVRl9VTk9SREVSRUQoYnApCSgoYnApLT5iX2ZsYWdzICY9IH5YQkZfT1JERVJFRCkKKyNkZWZpbmUgWEZTX0JVRl9JU09SREVSRUQoYnApCSgoYnApLT5iX2ZsYWdzICYgWEJGX09SREVSRUQpCiAKLSNkZWZpbmUgWEZTX0JVRl9TSFVUKHgpCQkgcHJpbnRrKCJYRlNfQlVGX1NIVVQgbm90IGltcGxlbWVudGVkIHlldFxuIikKLSNkZWZpbmUgWEZTX0JVRl9VTlNIVVQoeCkJIHByaW50aygiWEZTX0JVRl9VTlNIVVQgbm90IGltcGxlbWVudGVkIHlldFxuIikKLSNkZWZpbmUgWEZTX0JVRl9JU1NIVVQoeCkJICgwKQorI2RlZmluZSBYRlNfQlVGX1NIVVQoYnApCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgWEZTX0JVRl9VTlNIVVQoYnApCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgWEZTX0JVRl9JU1NIVVQoYnApCSgwKQogCi0jZGVmaW5lIFhGU19CVUZfSE9MRCh4KQkJcGFnZWJ1Zl9ob2xkKHgpCi0jZGVmaW5lIFhGU19CVUZfUkVBRCh4KQkJKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX1JFQUQpCi0jZGVmaW5lIFhGU19CVUZfVU5SRUFEKHgpCSgoeCktPnBiX2ZsYWdzICY9IH5QQkZfUkVBRCkKLSNkZWZpbmUgWEZTX0JVRl9JU1JFQUQoeCkJKCh4KS0+cGJfZmxhZ3MgJiBQQkZfUkVBRCkKKyNkZWZpbmUgWEZTX0JVRl9IT0xEKGJwKQl4ZnNfYnVmX2hvbGQoYnApCisjZGVmaW5lIFhGU19CVUZfUkVBRChicCkJKChicCktPmJfZmxhZ3MgfD0gWEJGX1JFQUQpCisjZGVmaW5lIFhGU19CVUZfVU5SRUFEKGJwKQkoKGJwKS0+Yl9mbGFncyAmPSB+WEJGX1JFQUQpCisjZGVmaW5lIFhGU19CVUZfSVNSRUFEKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9SRUFEKQogCi0jZGVmaW5lIFhGU19CVUZfV1JJVEUoeCkJKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX1dSSVRFKQotI2RlZmluZSBYRlNfQlVGX1VOV1JJVEUoeCkJKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9XUklURSkKLSNkZWZpbmUgWEZTX0JVRl9JU1dSSVRFKHgpCSgoeCktPnBiX2ZsYWdzICYgUEJGX1dSSVRFKQorI2RlZmluZSBYRlNfQlVGX1dSSVRFKGJwKQkoKGJwKS0+Yl9mbGFncyB8PSBYQkZfV1JJVEUpCisjZGVmaW5lIFhGU19CVUZfVU5XUklURShicCkJKChicCktPmJfZmxhZ3MgJj0gflhCRl9XUklURSkKKyNkZWZpbmUgWEZTX0JVRl9JU1dSSVRFKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9XUklURSkKIAotI2RlZmluZSBYRlNfQlVGX0lTVU5JTklUSUFMKHgpCSAoMCkKLSNkZWZpbmUgWEZTX0JVRl9VTlVOSU5JVElBTCh4KQkgKDApCisjZGVmaW5lIFhGU19CVUZfSVNVTklOSVRJQUwoYnApCSgwKQorI2RlZmluZSBYRlNfQlVGX1VOVU5JTklUSUFMKGJwKQkoMCkKIAotI2RlZmluZSBYRlNfQlVGX0JQX0lTTUFQUEVEKGJwKQkgMQorI2RlZmluZSBYRlNfQlVGX0JQX0lTTUFQUEVEKGJwKQkoMSkKIAotI2RlZmluZSBYRlNfQlVGX0lPRE9ORV9GVU5DKGJ1ZikJKGJ1ZiktPnBiX2lvZG9uZQotI2RlZmluZSBYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhidWYsIGZ1bmMpCVwKLQkJCShidWYpLT5wYl9pb2RvbmUgPSAoZnVuYykKLSNkZWZpbmUgWEZTX0JVRl9DTFJfSU9ET05FX0ZVTkMoYnVmKQkJXAotCQkJKGJ1ZiktPnBiX2lvZG9uZSA9IE5VTEwKLSNkZWZpbmUgWEZTX0JVRl9TRVRfQkRTVFJBVF9GVU5DKGJ1ZiwgZnVuYykJXAotCQkJKGJ1ZiktPnBiX3N0cmF0ID0gKGZ1bmMpCi0jZGVmaW5lIFhGU19CVUZfQ0xSX0JEU1RSQVRfRlVOQyhidWYpCQlcCi0JCQkoYnVmKS0+cGJfc3RyYXQgPSBOVUxMCisjZGVmaW5lIFhGU19CVUZfSU9ET05FX0ZVTkMoYnApCQkJKChicCktPmJfaW9kb25lKQorI2RlZmluZSBYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhicCwgZnVuYykJKChicCktPmJfaW9kb25lID0gKGZ1bmMpKQorI2RlZmluZSBYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCkJCSgoYnApLT5iX2lvZG9uZSA9IE5VTEwpCisjZGVmaW5lIFhGU19CVUZfU0VUX0JEU1RSQVRfRlVOQyhicCwgZnVuYykJKChicCktPmJfc3RyYXQgPSAoZnVuYykpCisjZGVmaW5lIFhGU19CVUZfQ0xSX0JEU1RSQVRfRlVOQyhicCkJCSgoYnApLT5iX3N0cmF0ID0gTlVMTCkKIAotI2RlZmluZSBYRlNfQlVGX0ZTUFJJVkFURShidWYsIHR5cGUpCQlcCi0JCQkoKHR5cGUpKGJ1ZiktPnBiX2ZzcHJpdikKLSNkZWZpbmUgWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJ1ZiwgdmFsdWUpCVwKLQkJCShidWYpLT5wYl9mc3ByaXYgPSAodm9pZCAqKSh2YWx1ZSkKLSNkZWZpbmUgWEZTX0JVRl9GU1BSSVZBVEUyKGJ1ZiwgdHlwZSkJCVwKLQkJCSgodHlwZSkoYnVmKS0+cGJfZnNwcml2MikKLSNkZWZpbmUgWEZTX0JVRl9TRVRfRlNQUklWQVRFMihidWYsIHZhbHVlKQlcCi0JCQkoYnVmKS0+cGJfZnNwcml2MiA9ICh2b2lkICopKHZhbHVlKQotI2RlZmluZSBYRlNfQlVGX0ZTUFJJVkFURTMoYnVmLCB0eXBlKQkJXAotCQkJKCh0eXBlKShidWYpLT5wYl9mc3ByaXYzKQotI2RlZmluZSBYRlNfQlVGX1NFVF9GU1BSSVZBVEUzKGJ1ZiwgdmFsdWUpCVwKLQkJCShidWYpLT5wYl9mc3ByaXYzICA9ICh2b2lkICopKHZhbHVlKQotI2RlZmluZSBYRlNfQlVGX1NFVF9TVEFSVChidWYpCisjZGVmaW5lIFhGU19CVUZfRlNQUklWQVRFKGJwLCB0eXBlKQkJKCh0eXBlKShicCktPmJfZnNwcml2KQorI2RlZmluZSBYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIHZhbCkJCSgoYnApLT5iX2ZzcHJpdiA9ICh2b2lkKikodmFsKSkKKyNkZWZpbmUgWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB0eXBlKQkJKCh0eXBlKShicCktPmJfZnNwcml2MikKKyNkZWZpbmUgWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgdmFsKQkJKChicCktPmJfZnNwcml2MiA9ICh2b2lkKikodmFsKSkKKyNkZWZpbmUgWEZTX0JVRl9GU1BSSVZBVEUzKGJwLCB0eXBlKQkJKCh0eXBlKShicCktPmJfZnNwcml2MykKKyNkZWZpbmUgWEZTX0JVRl9TRVRfRlNQUklWQVRFMyhicCwgdmFsKQkJKChicCktPmJfZnNwcml2MyA9ICh2b2lkKikodmFsKSkKKyNkZWZpbmUgWEZTX0JVRl9TRVRfU1RBUlQoYnApCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBYRlNfQlVGX1NFVF9CUkVMU0VfRlVOQyhicCwgZnVuYykJKChicCktPmJfcmVsc2UgPSAoZnVuYykpCiAKLSNkZWZpbmUgWEZTX0JVRl9TRVRfQlJFTFNFX0ZVTkMoYnVmLCB2YWx1ZSkgXAotCQkJKGJ1ZiktPnBiX3JlbHNlID0gKHZhbHVlKQorI2RlZmluZSBYRlNfQlVGX1BUUihicCkJCQkoeGZzX2NhZGRyX3QpKChicCktPmJfYWRkcikKKyNkZWZpbmUgWEZTX0JVRl9TRVRfUFRSKGJwLCB2YWwsIGNudCkJeGZzX2J1Zl9hc3NvY2lhdGVfbWVtb3J5KGJwLCB2YWwsIGNudCkKKyNkZWZpbmUgWEZTX0JVRl9BRERSKGJwKQkJKChicCktPmJfYm4pCisjZGVmaW5lIFhGU19CVUZfU0VUX0FERFIoYnAsIGJubykJKChicCktPmJfYm4gPSAoeGZzX2RhZGRyX3QpKGJubykpCisjZGVmaW5lIFhGU19CVUZfT0ZGU0VUKGJwKQkJKChicCktPmJfZmlsZV9vZmZzZXQpCisjZGVmaW5lIFhGU19CVUZfU0VUX09GRlNFVChicCwgb2ZmKQkoKGJwKS0+Yl9maWxlX29mZnNldCA9IChvZmYpKQorI2RlZmluZSBYRlNfQlVGX0NPVU5UKGJwKQkJKChicCktPmJfY291bnRfZGVzaXJlZCkKKyNkZWZpbmUgWEZTX0JVRl9TRVRfQ09VTlQoYnAsIGNudCkJKChicCktPmJfY291bnRfZGVzaXJlZCA9IChjbnQpKQorI2RlZmluZSBYRlNfQlVGX1NJWkUoYnApCQkoKGJwKS0+Yl9idWZmZXJfbGVuZ3RoKQorI2RlZmluZSBYRlNfQlVGX1NFVF9TSVpFKGJwLCBjbnQpCSgoYnApLT5iX2J1ZmZlcl9sZW5ndGggPSAoY250KSkKIAotI2RlZmluZSBYRlNfQlVGX1BUUihicCkJCSh4ZnNfY2FkZHJfdCkoKGJwKS0+cGJfYWRkcikKKyNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCB0eXBlLCByZWYpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEUoYnAsIHR5cGUpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIFhGU19CVUZfU0VUX1JFRihicCwgcmVmKQkJZG8geyB9IHdoaWxlICgwKQogCi1zdGF0aWMgaW5saW5lIHhmc19jYWRkcl90IHhmc19idWZfb2Zmc2V0KHhmc19idWZfdCAqYnAsIHNpemVfdCBvZmZzZXQpCisjZGVmaW5lIFhGU19CVUZfSVNQSU5ORUQoYnApCXhmc19idWZfaXNwaW4oYnApCisKKyNkZWZpbmUgWEZTX0JVRl9WQUxVU0VNQShicCkJeGZzX2J1Zl9sb2NrX3ZhbHVlKGJwKQorI2RlZmluZSBYRlNfQlVGX0NQU0VNQShicCkJKHhmc19idWZfY29uZF9sb2NrKGJwKSA9PSAwKQorI2RlZmluZSBYRlNfQlVGX1ZTRU1BKGJwKQl4ZnNfYnVmX3VubG9jayhicCkKKyNkZWZpbmUgWEZTX0JVRl9QU0VNQShicCx4KQl4ZnNfYnVmX2xvY2soYnApCisjZGVmaW5lIFhGU19CVUZfVl9JT0RPTkVTRU1BKGJwKSB1cCgmYnAtPmJfaW9kb25lc2VtYSk7CisKKyNkZWZpbmUgWEZTX0JVRl9TRVRfVEFSR0VUKGJwLCB0YXJnZXQpCSgoYnApLT5iX3RhcmdldCA9ICh0YXJnZXQpKQorI2RlZmluZSBYRlNfQlVGX1RBUkdFVChicCkJCSgoYnApLT5iX3RhcmdldCkKKyNkZWZpbmUgWEZTX0JVRlRBUkdfTkFNRSh0YXJnZXQpCXhmc19idWZfdGFyZ2V0X25hbWUodGFyZ2V0KQorCitzdGF0aWMgaW5saW5lIGludCB4ZnNfYmF3cml0ZSh2b2lkICptcCwgeGZzX2J1Zl90ICpicCkKIHsKLQlpZiAoYnAtPnBiX2ZsYWdzICYgUEJGX01BUFBFRCkKLQkJcmV0dXJuIFhGU19CVUZfUFRSKGJwKSArIG9mZnNldDsKLQlyZXR1cm4gKHhmc19jYWRkcl90KSBwYWdlYnVmX29mZnNldChicCwgb2Zmc2V0KTsKKwlicC0+Yl9mc3ByaXYzID0gbXA7CisJYnAtPmJfc3RyYXQgPSB4ZnNfYmRzdHJhdF9jYjsKKwl4ZnNfYnVmX2RlbHdyaV9kZXF1ZXVlKGJwKTsKKwlyZXR1cm4geGZzX2J1Zl9pb3N0YXJ0KGJwLCBYQkZfV1JJVEUgfCBYQkZfQVNZTkMgfCBfWEJGX1JVTl9RVUVVRVMpOwogfQogCi0jZGVmaW5lIFhGU19CVUZfU0VUX1BUUihicCwgdmFsLCBjb3VudCkJCVwKLQkJCQlwYWdlYnVmX2Fzc29jaWF0ZV9tZW1vcnkoYnAsIHZhbCwgY291bnQpCi0jZGVmaW5lIFhGU19CVUZfQUREUihicCkJKChicCktPnBiX2JuKQotI2RlZmluZSBYRlNfQlVGX1NFVF9BRERSKGJwLCBibGspCQlcCi0JCQkoKGJwKS0+cGJfYm4gPSAoeGZzX2RhZGRyX3QpKGJsaykpCi0jZGVmaW5lIFhGU19CVUZfT0ZGU0VUKGJwKQkoKGJwKS0+cGJfZmlsZV9vZmZzZXQpCi0jZGVmaW5lIFhGU19CVUZfU0VUX09GRlNFVChicCwgb2ZmKQkJXAotCQkJKChicCktPnBiX2ZpbGVfb2Zmc2V0ID0gKG9mZikpCi0jZGVmaW5lIFhGU19CVUZfQ09VTlQoYnApCSgoYnApLT5wYl9jb3VudF9kZXNpcmVkKQotI2RlZmluZSBYRlNfQlVGX1NFVF9DT1VOVChicCwgY250KQkJXAotCQkJKChicCktPnBiX2NvdW50X2Rlc2lyZWQgPSAoY250KSkKLSNkZWZpbmUgWEZTX0JVRl9TSVpFKGJwKQkoKGJwKS0+cGJfYnVmZmVyX2xlbmd0aCkKLSNkZWZpbmUgWEZTX0JVRl9TRVRfU0laRShicCwgY250KQkJXAotCQkJKChicCktPnBiX2J1ZmZlcl9sZW5ndGggPSAoY250KSkKLSNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCB0eXBlLCByZWYpCi0jZGVmaW5lIFhGU19CVUZfU0VUX1ZUWVBFKGJwLCB0eXBlKQotI2RlZmluZSBYRlNfQlVGX1NFVF9SRUYoYnAsIHJlZikKLQotI2RlZmluZSBYRlNfQlVGX0lTUElOTkVEKGJwKQlwYWdlYnVmX2lzcGluKGJwKQotCi0jZGVmaW5lIFhGU19CVUZfVkFMVVNFTUEoYnApCXBhZ2VidWZfbG9ja192YWx1ZShicCkKLSNkZWZpbmUgWEZTX0JVRl9DUFNFTUEoYnApCShwYWdlYnVmX2NvbmRfbG9jayhicCkgPT0gMCkKLSNkZWZpbmUgWEZTX0JVRl9WU0VNQShicCkJcGFnZWJ1Zl91bmxvY2soYnApCi0jZGVmaW5lIFhGU19CVUZfUFNFTUEoYnAseCkJcGFnZWJ1Zl9sb2NrKGJwKQotI2RlZmluZSBYRlNfQlVGX1ZfSU9ET05FU0VNQShicCkgdXAoJmJwLT5wYl9pb2RvbmVzZW1hKTsKLQotLyogc2V0dXAgdGhlIGJ1ZmZlciB0YXJnZXQgZnJvbSBhIGJ1ZnRhcmcgc3RydWN0dXJlICovCi0jZGVmaW5lIFhGU19CVUZfU0VUX1RBUkdFVChicCwgdGFyZ2V0KQlcCi0JCShicCktPnBiX3RhcmdldCA9ICh0YXJnZXQpCi0jZGVmaW5lIFhGU19CVUZfVEFSR0VUKGJwKQkoKGJwKS0+cGJfdGFyZ2V0KQotI2RlZmluZSBYRlNfQlVGVEFSR19OQU1FKHRhcmdldCkJXAotCQlwYWdlYnVmX3RhcmdldF9uYW1lKHRhcmdldCkKLQotI2RlZmluZSBYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIHR5cGUsIHJlZikKLSNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEUoYnAsIHR5cGUpCi0jZGVmaW5lIFhGU19CVUZfU0VUX1JFRihicCwgcmVmKQotCi1zdGF0aWMgaW5saW5lIGludAl4ZnNfYmF3cml0ZSh2b2lkICptcCwgeGZzX2J1Zl90ICpicCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfYnVmX3JlbHNlKHhmc19idWZfdCAqYnApCiB7Ci0JYnAtPnBiX2ZzcHJpdjMgPSBtcDsKLQlicC0+cGJfc3RyYXQgPSB4ZnNfYmRzdHJhdF9jYjsKLQlwYWdlYnVmX2RlbHdyaV9kZXF1ZXVlKGJwKTsKLQlyZXR1cm4gcGFnZWJ1Zl9pb3N0YXJ0KGJwLCBQQkZfV1JJVEUgfCBQQkZfQVNZTkMgfCBfUEJGX1JVTl9RVUVVRVMpOworCWlmICghYnAtPmJfcmVsc2UpCisJCXhmc19idWZfdW5sb2NrKGJwKTsKKwl4ZnNfYnVmX3JlbGUoYnApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQJeGZzX2J1Zl9yZWxzZSh4ZnNfYnVmX3QgKmJwKQotewotCWlmICghYnAtPnBiX3JlbHNlKQotCQlwYWdlYnVmX3VubG9jayhicCk7Ci0JcGFnZWJ1Zl9yZWxlKGJwKTsKLX0KLQotI2RlZmluZSB4ZnNfYnBpbihicCkJCXBhZ2VidWZfcGluKGJwKQotI2RlZmluZSB4ZnNfYnVucGluKGJwKQkJcGFnZWJ1Zl91bnBpbihicCkKKyNkZWZpbmUgeGZzX2JwaW4oYnApCQl4ZnNfYnVmX3BpbihicCkKKyNkZWZpbmUgeGZzX2J1bnBpbihicCkJCXhmc19idWZfdW5waW4oYnApCiAKICNkZWZpbmUgeGZzX2J1ZnRyYWNlKGlkLCBicCkJXAotCSAgICBwYWdlYnVmX3RyYWNlKGJwLCBpZCwgTlVMTCwgKHZvaWQgKilfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCisJICAgIHhmc19idWZfdHJhY2UoYnAsIGlkLCBOVUxMLCAodm9pZCAqKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSkKIAotI2RlZmluZSB4ZnNfYmlvZG9uZShwYikJCSAgICBcCi0JICAgIHBhZ2VidWZfaW9kb25lKHBiLCAwKQorI2RlZmluZSB4ZnNfYmlvZG9uZShicCkJCXhmc19idWZfaW9lbmQoYnAsIDApCiAKLSNkZWZpbmUgeGZzX2Jpb21vdmUocGIsIG9mZiwgbGVuLCBkYXRhLCBydykgXAotCSAgICBwYWdlYnVmX2lvbW92ZSgocGIpLCAob2ZmKSwgKGxlbiksIChkYXRhKSwgXAotCQkoKHJ3KSA9PSBYRlNfQl9XUklURSkgPyBQQlJXX1dSSVRFIDogUEJSV19SRUFEKQorI2RlZmluZSB4ZnNfYmlvbW92ZShicCwgb2ZmLCBsZW4sIGRhdGEsIHJ3KSBcCisJICAgIHhmc19idWZfaW9tb3ZlKChicCksIChvZmYpLCAobGVuKSwgKGRhdGEpLCBcCisJCSgocncpID09IFhGU19CX1dSSVRFKSA/IFhCUldfV1JJVEUgOiBYQlJXX1JFQUQpCiAKLSNkZWZpbmUgeGZzX2Jpb3plcm8ocGIsIG9mZiwgbGVuKSBcCi0JICAgIHBhZ2VidWZfaW9tb3ZlKChwYiksIChvZmYpLCAobGVuKSwgTlVMTCwgUEJSV19aRVJPKQorI2RlZmluZSB4ZnNfYmlvemVybyhicCwgb2ZmLCBsZW4pIFwKKwkgICAgeGZzX2J1Zl9pb21vdmUoKGJwKSwgKG9mZiksIChsZW4pLCBOVUxMLCBYQlJXX1pFUk8pCiAKIAotc3RhdGljIGlubGluZSBpbnQJWEZTX2J3cml0ZSh4ZnNfYnVmX3QgKnBiKQorc3RhdGljIGlubGluZSBpbnQgWEZTX2J3cml0ZSh4ZnNfYnVmX3QgKmJwKQogewotCWludAlpb3dhaXQgPSAocGItPnBiX2ZsYWdzICYgUEJGX0FTWU5DKSA9PSAwOworCWludAlpb3dhaXQgPSAoYnAtPmJfZmxhZ3MgJiBYQkZfQVNZTkMpID09IDA7CiAJaW50CWVycm9yID0gMDsKIAogCWlmICghaW93YWl0KQotCQlwYi0+cGJfZmxhZ3MgfD0gX1BCRl9SVU5fUVVFVUVTOworCQlicC0+Yl9mbGFncyB8PSBfWEJGX1JVTl9RVUVVRVM7CiAKLQlwYWdlYnVmX2RlbHdyaV9kZXF1ZXVlKHBiKTsKLQlwYWdlYnVmX2lvc3RyYXRlZ3kocGIpOworCXhmc19idWZfZGVsd3JpX2RlcXVldWUoYnApOworCXhmc19idWZfaW9zdHJhdGVneShicCk7CiAJaWYgKGlvd2FpdCkgewotCQllcnJvciA9IHBhZ2VidWZfaW93YWl0KHBiKTsKLQkJeGZzX2J1Zl9yZWxzZShwYik7CisJCWVycm9yID0geGZzX2J1Zl9pb3dhaXQoYnApOworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAl9CiAJcmV0dXJuIGVycm9yOwogfQogCi0jZGVmaW5lIFhGU19iZHdyaXRlKHBiKQkJICAgICBcCi0JICAgIHBhZ2VidWZfaW9zdGFydChwYiwgUEJGX0RFTFdSSSB8IFBCRl9BU1lOQykKKyNkZWZpbmUgWEZTX2Jkd3JpdGUoYnApCQl4ZnNfYnVmX2lvc3RhcnQoYnAsIFhCRl9ERUxXUkkgfCBYQkZfQVNZTkMpCiAKIHN0YXRpYyBpbmxpbmUgaW50IHhmc19iZHdyaXRlKHZvaWQgKm1wLCB4ZnNfYnVmX3QgKmJwKQogewotCWJwLT5wYl9zdHJhdCA9IHhmc19iZHN0cmF0X2NiOwotCWJwLT5wYl9mc3ByaXYzID0gbXA7Ci0KLQlyZXR1cm4gcGFnZWJ1Zl9pb3N0YXJ0KGJwLCBQQkZfREVMV1JJIHwgUEJGX0FTWU5DKTsKKwlicC0+Yl9zdHJhdCA9IHhmc19iZHN0cmF0X2NiOworCWJwLT5iX2ZzcHJpdjMgPSBtcDsKKwlyZXR1cm4geGZzX2J1Zl9pb3N0YXJ0KGJwLCBYQkZfREVMV1JJIHwgWEJGX0FTWU5DKTsKIH0KIAotI2RlZmluZSBYRlNfYmRzdHJhdChicCkgcGFnZWJ1Zl9pb3JlcXVlc3QoYnApCisjZGVmaW5lIFhGU19iZHN0cmF0KGJwKSB4ZnNfYnVmX2lvcmVxdWVzdChicCkKIAotI2RlZmluZSB4ZnNfaW93YWl0KHBiKQlwYWdlYnVmX2lvd2FpdChwYikKKyNkZWZpbmUgeGZzX2lvd2FpdChicCkJeGZzX2J1Zl9pb3dhaXQoYnApCiAKICNkZWZpbmUgeGZzX2JhcmVhZCh0YXJnZXQsIHJhYmxrbm8sIHJhbGVuKSAgXAotCXBhZ2VidWZfcmVhZGFoZWFkKCh0YXJnZXQpLCAocmFibGtubyksIChyYWxlbiksIFBCRl9ET05UX0JMT0NLKQotCi0jZGVmaW5lIHhmc19idWZfZ2V0X2VtcHR5KGxlbiwgdGFyZ2V0KQlwYWdlYnVmX2dldF9lbXB0eSgobGVuKSwgKHRhcmdldCkpCi0jZGVmaW5lIHhmc19idWZfZ2V0X25vYWRkcihsZW4sIHRhcmdldCkJcGFnZWJ1Zl9nZXRfbm9fZGFkZHIoKGxlbiksICh0YXJnZXQpKQotI2RlZmluZSB4ZnNfYnVmX2ZyZWUoYnApCQlwYWdlYnVmX2ZyZWUoYnApCisJeGZzX2J1Zl9yZWFkYWhlYWQoKHRhcmdldCksIChyYWJsa25vKSwgKHJhbGVuKSwgWEJGX0RPTlRfQkxPQ0spCiAKIAogLyoKICAqCUhhbmRsaW5nIG9mIGJ1ZnRhcmdzLgogICovCi0KIGV4dGVybiB4ZnNfYnVmdGFyZ190ICp4ZnNfYWxsb2NfYnVmdGFyZyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIGludCk7CiBleHRlcm4gdm9pZCB4ZnNfZnJlZV9idWZ0YXJnKHhmc19idWZ0YXJnX3QgKiwgaW50KTsKIGV4dGVybiB2b2lkIHhmc193YWl0X2J1ZnRhcmcoeGZzX2J1ZnRhcmdfdCAqKTsKIGV4dGVybiBpbnQgeGZzX3NldHNpemVfYnVmdGFyZyh4ZnNfYnVmdGFyZ190ICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBpbnQgeGZzX2ZsdXNoX2J1ZnRhcmcoeGZzX2J1ZnRhcmdfdCAqLCBpbnQpOwogCi0jZGVmaW5lIHhmc19nZXRzaXplX2J1ZnRhcmcoYnVmdGFyZykgXAotCWJsb2NrX3NpemUoKGJ1ZnRhcmcpLT5wYnJfYmRldikKLSNkZWZpbmUgeGZzX3JlYWRvbmx5X2J1ZnRhcmcoYnVmdGFyZykgXAotCWJkZXZfcmVhZF9vbmx5KChidWZ0YXJnKS0+cGJyX2JkZXYpCi0jZGVmaW5lIHhmc19iaW52YWwoYnVmdGFyZykgXAotCXhmc19mbHVzaF9idWZ0YXJnKGJ1ZnRhcmcsIDEpCi0jZGVmaW5lIFhGU19iZmx1c2goYnVmdGFyZykgXAotCXhmc19mbHVzaF9idWZ0YXJnKGJ1ZnRhcmcsIDEpCisjZGVmaW5lIHhmc19nZXRzaXplX2J1ZnRhcmcoYnVmdGFyZykJYmxvY2tfc2l6ZSgoYnVmdGFyZyktPmJ0X2JkZXYpCisjZGVmaW5lIHhmc19yZWFkb25seV9idWZ0YXJnKGJ1ZnRhcmcpCWJkZXZfcmVhZF9vbmx5KChidWZ0YXJnKS0+YnRfYmRldikKKworI2RlZmluZSB4ZnNfYmludmFsKGJ1ZnRhcmcpCQl4ZnNfZmx1c2hfYnVmdGFyZyhidWZ0YXJnLCAxKQorI2RlZmluZSBYRlNfYmZsdXNoKGJ1ZnRhcmcpCQl4ZnNfZmx1c2hfYnVmdGFyZyhidWZ0YXJnLCAxKQogCiAjZW5kaWYJLyogX19YRlNfQlVGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCmluZGV4IDA2MTExZDAuLmNlZDQ0MDQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKQEAgLTUwOSwxNiArNTA5LDE0IEBACiAJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CiAJeGZzX21vdW50X3QJKm1wID0gWEZTX1ZGU1RPTSh2cC0+dl92ZnNwKTsKIAlpbnQJCWVycm9yID0gMDsKLQliaHZfZGVzY190CSpiZHA7CiAJeGZzX2lub2RlX3QJKmlwOwogCiAJaWYgKHZwLT52X3Zmc3AtPnZmc19mbGFnICYgVkZTX0RNSSkgewotCQliZHAgPSB2bl9iaHZfbG9va3VwKFZOX0JIVl9IRUFEKHZwKSwgJnhmc192bm9kZW9wcyk7Ci0JCWlmICghYmRwKSB7CisJCWlwID0geGZzX3Z0b2kodnApOworCQlpZiAoIWlwKSB7CiAJCQllcnJvciA9IC1FSU5WQUw7CiAJCQlnb3RvIG9wZW5fZXhlY19vdXQ7CiAJCX0KLQkJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CiAJCWlmIChETV9FVkVOVF9FTkFCTEVEKHZwLT52X3Zmc3AsIGlwLCBETV9FVkVOVF9SRUFEKSkgewogCQkJZXJyb3IgPSAtWEZTX1NFTkRfREFUQShtcCwgRE1fRVZFTlRfUkVBRCwgdnAsCiAJCQkJCSAgICAgICAwLCAwLCAwLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCmluZGV4IDIxNjY3YmEuLjRkYjQ3NzkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYwpAQCAtMTQ2LDEzICsxNDYsMTAgQEAKIAogCWlmIChjbWQgIT0gWEZTX0lPQ19QQVRIX1RPX0ZTSEFORExFKSB7CiAJCXhmc19pbm9kZV90CSppcDsKLQkJYmh2X2Rlc2NfdAkqYmh2OwogCQlpbnQJCWxvY2tfbW9kZTsKIAogCQkvKiBuZWVkIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHhmc19pbm9kZSB0byByZWFkIHRoZSBnZW5lcmF0aW9uICovCi0JCWJodiA9IHZuX2Jodl9sb29rdXBfdW5sb2NrZWQoVk5fQkhWX0hFQUQodnApLCAmeGZzX3Zub2Rlb3BzKTsKLQkJQVNTRVJUKGJodik7Ci0JCWlwID0gWEZTX0JIVlRPSShiaHYpOworCQlpcCA9IHhmc192dG9pKHZwKTsKIAkJQVNTRVJUKGlwKTsKIAkJbG9ja19tb2RlID0geGZzX2lsb2NrX21hcF9zaGFyZWQoaXApOwogCkBAIC03NTEsOSArNzQ4LDggQEAKIAkJCShpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgPwogCQkJbXAtPm1fcnRkZXZfdGFyZ3AgOiBtcC0+bV9kZGV2X3RhcmdwOwogCi0JCWRhLmRfbWVtID0gZGEuZF9taW5pb3N6ID0gMSA8PCB0YXJnZXQtPnBicl9zc2hpZnQ7Ci0JCS8qIFRoZSBzaXplIGRpbyB3aWxsIGRvIGluIG9uZSBnbyAqLwotCQlkYS5kX21heGlvc3ogPSA2NCAqIFBBR0VfQ0FDSEVfU0laRTsKKwkJZGEuZF9tZW0gPSBkYS5kX21pbmlvc3ogPSAxIDw8IHRhcmdldC0+YnRfc3NoaWZ0OworCQlkYS5kX21heGlvc3ogPSBJTlRfTUFYICYgfihkYS5kX21pbmlvc3ogLSAxKTsKIAogCQlpZiAoY29weV90b191c2VyKGFyZywgJmRhLCBzaXplb2YoZGEpKSkKIAkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKaW5kZXggOWI4ZWUzNC4uNGJkM2QwMyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYwpAQCAtNTQsMTEgKzU0LDQ2IEBACiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogCiAjZGVmaW5lIElTX05PQVRJTUUoaW5vZGUpICgoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19OT0FUSU1FKSB8fAlcCiAJKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19OT0RJUkFUSU1FKSkKIAogLyoKKyAqIEdldCBhIFhGUyBpbm9kZSBmcm9tIGEgZ2l2ZW4gdm5vZGUuCisgKi8KK3hmc19pbm9kZV90ICoKK3hmc192dG9pKAorCXN0cnVjdCB2bm9kZQkqdnApCit7CisJYmh2X2Rlc2NfdCAgICAgICpiZHA7CisKKwliZHAgPSBiaHZfbG9va3VwX3JhbmdlKFZOX0JIVl9IRUFEKHZwKSwKKwkJCVZOT0RFX1BPU0lUSU9OX1hGUywgVk5PREVfUE9TSVRJT05fWEZTKTsKKwlpZiAodW5saWtlbHkoYmRwID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gWEZTX0JIVlRPSShiZHApOworfQorCisvKgorICogQnJpbmcgdGhlIGF0aW1lIGluIHRoZSBYRlMgaW5vZGUgdXB0b2RhdGUuCisgKiBVc2VkIGJlZm9yZSBsb2dnaW5nIHRoZSBpbm9kZSB0byBkaXNrIG9yIHdoZW4gdGhlIExpbnV4IGlub2RlIGdvZXMgYXdheS4KKyAqLwordm9pZAoreGZzX3N5bmNocm9uaXplX2F0aW1lKAorCXhmc19pbm9kZV90CSppcCkKK3sKKwl2bm9kZV90CQkqdnA7CisKKwl2cCA9IFhGU19JVE9WX05VTEwoaXApOworCWlmICh2cCkgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJnZwLT52X2lub2RlOworCQlpcC0+aV9kLmRpX2F0aW1lLnRfc2VjID0gKF9faW50MzJfdClpbm9kZS0+aV9hdGltZS50dl9zZWM7CisJCWlwLT5pX2QuZGlfYXRpbWUudF9uc2VjID0gKF9faW50MzJfdClpbm9kZS0+aV9hdGltZS50dl9uc2VjOworCX0KK30KKworLyoKICAqIENoYW5nZSB0aGUgcmVxdWVzdGVkIHRpbWVzdGFtcCBpbiB0aGUgZ2l2ZW4gaW5vZGUuCiAgKiBXZSBkb24ndCBsb2NrIGFjcm9zcyB0aW1lc3RhbXAgdXBkYXRlcywgYW5kIHdlIGRvbid0IGxvZyB0aGVtIGJ1dAogICogd2UgZG8gcmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhlcmUgaXMgZGlydHkgaW5mb3JtYXRpb24gaW4gY29yZS4KQEAgLTc3LDIzICsxMTIsNiBAQAogCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBMSU5WRlNfR0VUX0lQKFhGU19JVE9WKGlwKSk7CiAJdGltZXNwZWNfdAl0djsKIAotCS8qCi0JICogV2UncmUgbm90IHN1cHBvc2VkIHRvIGNoYW5nZSB0aW1lc3RhbXBzIGluIHJlYWRvbmx5LW1vdW50ZWQKLQkgKiBmaWxlc3lzdGVtcy4gIFRocm93IGl0IGF3YXkgaWYgYW55b25lIGFza3MgdXMuCi0JICovCi0JaWYgKHVubGlrZWx5KElTX1JET05MWShpbm9kZSkpKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIERvbid0IHVwZGF0ZSBhY2Nlc3MgdGltZXN0YW1wcyBvbiByZWFkcyBpZiBtb3VudGVkICJub2F0aW1lIi4KLQkgKiBUaHJvdyBpdCBhd2F5IGlmIGFueW9uZSBhc2tzIHVzLgotCSAqLwotCWlmICh1bmxpa2VseSgKLQkgICAgKGlwLT5pX21vdW50LT5tX2ZsYWdzICYgWEZTX01PVU5UX05PQVRJTUUgfHwgSVNfTk9BVElNRShpbm9kZSkpICYmCi0JICAgIChmbGFncyAmIChYRlNfSUNIR1RJTUVfQUNDfFhGU19JQ0hHVElNRV9NT0R8WEZTX0lDSEdUSU1FX0NIRykpID09Ci0JCQlYRlNfSUNIR1RJTUVfQUNDKSkKLQkJcmV0dXJuOwotCiAJbmFub3RpbWUoJnR2KTsKIAlpZiAoZmxhZ3MgJiBYRlNfSUNIR1RJTUVfTU9EKSB7CiAJCWlub2RlLT5pX210aW1lID0gdHY7CkBAIC0xMzAsOCArMTQ4LDYgQEAKICAqIFZhcmlhbnQgb24gdGhlIGFib3ZlIHdoaWNoIGF2b2lkcyBxdWVyeWluZyB0aGUgc3lzdGVtIGNsb2NrCiAgKiBpbiBzaXR1YXRpb25zIHdoZXJlIHdlIGtub3cgdGhlIExpbnV4IGlub2RlIHRpbWVzdGFtcHMgaGF2ZQogICoganVzdCBiZWVuIHVwZGF0ZWQgKGFuZCBzbyB3ZSBjYW4gdXBkYXRlIG91ciBpbm9kZSBjaGVhcGx5KS4KLSAqIFdlIGFsc28gc2tpcCB0aGUgcmVhZG9ubHkgYW5kIG5vYXRpbWUgY2hlY2tzIGhlcmUsIHRoZXkgYXJlCi0gKiBhbHNvIGNhdGVyZWQgZm9yIGFscmVhZHkuCiAgKi8KIHZvaWQKIHhmc19pY2hndGltZV9mYXN0KApAQCAtMTQyLDMyICsxNTgsMjMgQEAKIAl0aW1lc3BlY190CSp0dnA7CiAKIAkvKgorCSAqIEF0aW1lIHVwZGF0ZXMgZm9yIHJlYWQoKSAmIGZyaWVuZHMgYXJlIGhhbmRsZWQgbGF6aWx5IG5vdywgYW5kCisJICogZXhwbGljaXQgdXBkYXRlcyBtdXN0IGdvIHRocm91Z2ggeGZzX2ljaGd0aW1lKCkKKwkgKi8KKwlBU1NFUlQoKGZsYWdzICYgWEZTX0lDSEdUSU1FX0FDQykgPT0gMCk7CisKKwkvKgogCSAqIFdlJ3JlIG5vdCBzdXBwb3NlZCB0byBjaGFuZ2UgdGltZXN0YW1wcyBpbiByZWFkb25seS1tb3VudGVkCiAJICogZmlsZXN5c3RlbXMuICBUaHJvdyBpdCBhd2F5IGlmIGFueW9uZSBhc2tzIHVzLgogCSAqLwogCWlmICh1bmxpa2VseShJU19SRE9OTFkoaW5vZGUpKSkKIAkJcmV0dXJuOwogCi0JLyoKLQkgKiBEb24ndCB1cGRhdGUgYWNjZXNzIHRpbWVzdGFtcHMgb24gcmVhZHMgaWYgbW91bnRlZCAibm9hdGltZSIuCi0JICogVGhyb3cgaXQgYXdheSBpZiBhbnlvbmUgYXNrcyB1cy4KLQkgKi8KLQlpZiAodW5saWtlbHkoCi0JICAgIChpcC0+aV9tb3VudC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT0FUSU1FIHx8IElTX05PQVRJTUUoaW5vZGUpKSAmJgotCSAgICAoKGZsYWdzICYgKFhGU19JQ0hHVElNRV9BQ0N8WEZTX0lDSEdUSU1FX01PRHxYRlNfSUNIR1RJTUVfQ0hHKSkgPT0KLQkJCVhGU19JQ0hHVElNRV9BQ0MpKSkKLQkJcmV0dXJuOwotCiAJaWYgKGZsYWdzICYgWEZTX0lDSEdUSU1FX01PRCkgewogCQl0dnAgPSAmaW5vZGUtPmlfbXRpbWU7CiAJCWlwLT5pX2QuZGlfbXRpbWUudF9zZWMgPSAoX19pbnQzMl90KXR2cC0+dHZfc2VjOwogCQlpcC0+aV9kLmRpX210aW1lLnRfbnNlYyA9IChfX2ludDMyX3QpdHZwLT50dl9uc2VjOwogCX0KLQlpZiAoZmxhZ3MgJiBYRlNfSUNIR1RJTUVfQUNDKSB7Ci0JCXR2cCA9ICZpbm9kZS0+aV9hdGltZTsKLQkJaXAtPmlfZC5kaV9hdGltZS50X3NlYyA9IChfX2ludDMyX3QpdHZwLT50dl9zZWM7Ci0JCWlwLT5pX2QuZGlfYXRpbWUudF9uc2VjID0gKF9faW50MzJfdCl0dnAtPnR2X25zZWM7Ci0JfQogCWlmIChmbGFncyAmIFhGU19JQ0hHVElNRV9DSEcpIHsKIAkJdHZwID0gJmlub2RlLT5pX2N0aW1lOwogCQlpcC0+aV9kLmRpX2N0aW1lLnRfc2VjID0gKF9faW50MzJfdCl0dnAtPnR2X3NlYzsKQEAgLTIxNCw2ICsyMjEsMzkgQEAKIH0KIAogLyoKKyAqIEhvb2sgaW4gU0VMaW51eC4gIFRoaXMgaXMgbm90IHF1aXRlIGNvcnJlY3QgeWV0LCB3aGF0IHdlIHJlYWxseSBuZWVkCisgKiBoZXJlIChhcyB3ZSBkbyBmb3IgZGVmYXVsdCBBQ0xzKSBpcyBhIG1lY2hhbmlzbSBieSB3aGljaCBjcmVhdGlvbiBvZgorICogdGhlc2UgYXR0cnMgY2FuIGJlIGpvdXJuYWxsZWQgYXQgaW5vZGUgY3JlYXRpb24gdGltZSAoYWxvbmcgd2l0aCB0aGUKKyAqIGlub2RlLCBvZiBjb3Vyc2UsIHN1Y2ggdGhhdCBsb2cgcmVwbGF5IGNhbid0IGNhdXNlIHRoZXNlIHRvIGJlIGxvc3QpLgorICovCitTVEFUSUMgaW50CitsaW52ZnNfaW5pdF9zZWN1cml0eSgKKwlzdHJ1Y3Qgdm5vZGUJKnZwLAorCXN0cnVjdCBpbm9kZQkqZGlyKQoreworCXN0cnVjdCBpbm9kZQkqaXAgPSBMSU5WRlNfR0VUX0lQKHZwKTsKKwlzaXplX3QJCWxlbmd0aDsKKwl2b2lkCQkqdmFsdWU7CisJY2hhcgkJKm5hbWU7CisJaW50CQllcnJvcjsKKworCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfaW5pdF9zZWN1cml0eShpcCwgZGlyLCAmbmFtZSwgJnZhbHVlLCAmbGVuZ3RoKTsKKwlpZiAoZXJyb3IpIHsKKwkJaWYgKGVycm9yID09IC1FT1BOT1RTVVBQKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiAtZXJyb3I7CisJfQorCisJVk9QX0FUVFJfU0VUKHZwLCBuYW1lLCB2YWx1ZSwgbGVuZ3RoLCBBVFRSX1NFQ1VSRSwgTlVMTCwgZXJyb3IpOworCWlmICghZXJyb3IpCisJCVZNT0RJRlkodnApOworCisJa2ZyZWUobmFtZSk7CisJa2ZyZWUodmFsdWUpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKICAqIERldGVybWluZSB3aGV0aGVyIGEgcHJvY2VzcyBoYXMgYSB2YWxpZCBmc19zdHJ1Y3QgKGtlcm5lbCBkYWVtb25zCiAgKiBsaWtlIGtuZnNkIGRvbid0IGhhdmUgYW4gZnNfc3RydWN0KS4KICAqCkBAIC0yNzgsNiArMzE4LDkgQEAKIAkJYnJlYWs7CiAJfQogCisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBsaW52ZnNfaW5pdF9zZWN1cml0eSh2cCwgZGlyKTsKKwogCWlmIChkZWZhdWx0X2FjbCkgewogCQlpZiAoIWVycm9yKSB7CiAJCQllcnJvciA9IF9BQ0xfSU5IRVJJVCh2cCwgJnZhLCBkZWZhdWx0X2FjbCk7CkBAIC0yOTQsOCArMzM3LDYgQEAKIAkJCQl0ZWFyZG93bi5kX2lub2RlID0gaXAgPSBMSU5WRlNfR0VUX0lQKHZwKTsKIAkJCQl0ZWFyZG93bi5kX25hbWUgPSBkZW50cnktPmRfbmFtZTsKIAotCQkJCXZuX21hcmtfYmFkKHZwKTsKLQkJCQkKIAkJCQlpZiAoU19JU0RJUihtb2RlKSkKIAkJCQkJVk9QX1JNRElSKGR2cCwgJnRlYXJkb3duLCBOVUxMLCBlcnIyKTsKIAkJCQllbHNlCkBAIC01MDYsNyArNTQ3LDcgQEAKIAlBU1NFUlQoZGVudHJ5KTsKIAlBU1NFUlQobmQpOwogCi0JbGluayA9IChjaGFyICopa21hbGxvYyhNQVhOQU1FTEVOKzEsIEdGUF9LRVJORUwpOworCWxpbmsgPSAoY2hhciAqKWttYWxsb2MoTUFYUEFUSExFTisxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxpbmspIHsKIAkJbmRfc2V0X2xpbmsobmQsIEVSUl9QVFIoLUVOT01FTSkpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTUyMiwxMiArNTYzLDEyIEBACiAJdnAgPSBMSU5WRlNfR0VUX1ZQKGRlbnRyeS0+ZF9pbm9kZSk7CiAKIAlpb3YuaW92X2Jhc2UgPSBsaW5rOwotCWlvdi5pb3ZfbGVuID0gTUFYTkFNRUxFTjsKKwlpb3YuaW92X2xlbiA9IE1BWFBBVEhMRU47CiAKIAl1aW8tPnVpb19pb3YgPSAmaW92OwogCXVpby0+dWlvX29mZnNldCA9IDA7CiAJdWlvLT51aW9fc2VnZmxnID0gVUlPX1NZU1NQQUNFOwotCXVpby0+dWlvX3Jlc2lkID0gTUFYTkFNRUxFTjsKKwl1aW8tPnVpb19yZXNpZCA9IE1BWFBBVEhMRU47CiAJdWlvLT51aW9faW92Y250ID0gMTsKIAogCVZPUF9SRUFETElOSyh2cCwgdWlvLCAwLCBOVUxMLCBlcnJvcik7CkBAIC01MzUsNyArNTc2LDcgQEAKIAkJa2ZyZWUobGluayk7CiAJCWxpbmsgPSBFUlJfUFRSKC1lcnJvcik7CiAJfSBlbHNlIHsKLQkJbGlua1tNQVhOQU1FTEVOIC0gdWlvLT51aW9fcmVzaWRdID0gJ1wwJzsKKwkJbGlua1tNQVhQQVRITEVOIC0gdWlvLT51aW9fcmVzaWRdID0gJ1wwJzsKIAl9CiAJa2ZyZWUodWlvKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5oCmluZGV4IGVlNzg0YjYuLjY4OTlhNmIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmgKQEAgLTI2LDExICsyNiw2IEBACiBleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsaW52ZnNfaW52aXNfZmlsZV9vcGVyYXRpb25zOwogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGludmZzX2Rpcl9vcGVyYXRpb25zOwogCi1leHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBsaW52ZnNfYW9wczsKLQotZXh0ZXJuIGludCBsaW52ZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqLCBzZWN0b3JfdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7Ci1leHRlcm4gdm9pZCBsaW52ZnNfdW53cml0dGVuX2RvbmUoc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7Ci0KIGV4dGVybiBpbnQgeGZzX2lvY3RsKHN0cnVjdCBiaHZfZGVzYyAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgdW5zaWduZWQgaW50LCB2b2lkIF9fdXNlciAqKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKaW5kZXggZDhlMjFiYS4uNjczODliNyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oCkBAIC0xMTAsMTAgKzExMCw2IEBACiAgKiBkZWxhbGxvYyBhbmQgdGhlc2Ugb25kaXNrLXVuaW5pdGlhbGlzZWQgYnVmZmVycy4KICAqLwogQlVGRkVSX0ZOUyhQcml2YXRlU3RhcnQsIHVud3JpdHRlbik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2J1ZmZlcl91bndyaXR0ZW5faW8oc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQliaC0+Yl9lbmRfaW8gPSBsaW52ZnNfdW53cml0dGVuX2RvbmU7Ci19CiAKICNkZWZpbmUgcmVzdHJpY3RlZF9jaG93bgl4ZnNfcGFyYW1zLnJlc3RyaWN0X2Nob3duLnZhbAogI2RlZmluZSBpcml4X3NnaWRfaW5oZXJpdAl4ZnNfcGFyYW1zLnNnaWRfaW5oZXJpdC52YWwKQEAgLTIzMiw3ICsyMjgsNyBAQAogI2RlZmluZSB4ZnNfaXRydW5jYXRlX2RhdGEoaXAsIG9mZikJXAogCSgtdm10cnVuY2F0ZShMSU5WRlNfR0VUX0lQKFhGU19JVE9WKGlwKSksIChvZmYpKSkKICNkZWZpbmUgeGZzX3N0YXR2ZnNfZnNpZChzdGF0cCwgbXApCVwKLQkoeyB1NjQgaWQgPSBodWdlX2VuY29kZV9kZXYoKG1wKS0+bV9kZXYpOwlcCisJKHsgdTY0IGlkID0gaHVnZV9lbmNvZGVfZGV2KChtcCktPm1fZGRldl90YXJncC0+YnRfZGV2KTsgXAogCSAgIF9fa2VybmVsX2ZzaWRfdCAqZnNpZCA9ICYoc3RhdHApLT5mX2ZzaWQ7CVwKIAkoZnNpZC0+dmFsWzBdID0gKHUzMilpZCwgZnNpZC0+dmFsWzFdID0gKHUzMikoaWQgPj4gMzIpKTsgfSkKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19scncuYwppbmRleCA4ODVkZmFmLi5lMGFiNDVmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19scncuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19scncuYwpAQCAtMjMzLDggKzIzMyw4IEBACiAJCXhmc19idWZ0YXJnX3QJKnRhcmdldCA9CiAJCQkoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpID8KIAkJCQltcC0+bV9ydGRldl90YXJncCA6IG1wLT5tX2RkZXZfdGFyZ3A7Ci0JCWlmICgoKm9mZnNldCAmIHRhcmdldC0+cGJyX3NtYXNrKSB8fAotCQkgICAgKHNpemUgJiB0YXJnZXQtPnBicl9zbWFzaykpIHsKKwkJaWYgKCgqb2Zmc2V0ICYgdGFyZ2V0LT5idF9zbWFzaykgfHwKKwkJICAgIChzaXplICYgdGFyZ2V0LT5idF9zbWFzaykpIHsKIAkJCWlmICgqb2Zmc2V0ID09IGlwLT5pX2QuZGlfc2l6ZSkgewogCQkJCXJldHVybiAoMCk7CiAJCQl9CkBAIC0yODEsOSArMjgxLDYgQEAKIAogCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CiAKLQlpZiAobGlrZWx5KCEoaW9mbGFncyAmIElPX0lOVklTKSkpCi0JCXhmc19pY2hndGltZV9mYXN0KGlwLCBpbm9kZSwgWEZTX0lDSEdUSU1FX0FDQyk7Ci0KIHVubG9ja19pc2VtOgogCWlmICh1bmxpa2VseShpb2ZsYWdzICYgSU9fSVNESVJFQ1QpKQogCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKQEAgLTM0Niw5ICszNDMsNiBAQAogCWlmIChyZXQgPiAwKQogCQlYRlNfU1RBVFNfQUREKHhzX3JlYWRfYnl0ZXMsIHJldCk7CiAKLQlpZiAobGlrZWx5KCEoaW9mbGFncyAmIElPX0lOVklTKSkpCi0JCXhmc19pY2hndGltZV9mYXN0KGlwLCBMSU5WRlNfR0VUX0lQKHZwKSwgWEZTX0lDSEdUSU1FX0FDQyk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNjIsNyArMzU2LDYgQEAKIHhmc196ZXJvX2xhc3RfYmxvY2soCiAJc3RydWN0IGlub2RlCSppcCwKIAl4ZnNfaW9jb3JlX3QJKmlvLAotCXhmc19vZmZfdAlvZmZzZXQsCiAJeGZzX2ZzaXplX3QJaXNpemUsCiAJeGZzX2ZzaXplX3QJZW5kX3NpemUpCiB7CkBAIC0zNzEsMTkgKzM2NCwxNiBAQAogCWludAkJbmltYXBzOwogCWludAkJemVyb19vZmZzZXQ7CiAJaW50CQl6ZXJvX2xlbjsKLQlpbnQJCWlzaXplX2ZzYl9vZmZzZXQ7CiAJaW50CQllcnJvciA9IDA7CiAJeGZzX2JtYnRfaXJlY190CWltYXA7CiAJbG9mZl90CQlsb2ZmOwotCXNpemVfdAkJbHNpemU7CiAKIAlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9fbG9jaywgTVJfVVBEQVRFKSAhPSAwKTsKLQlBU1NFUlQob2Zmc2V0ID4gaXNpemUpOwogCiAJbXAgPSBpby0+aW9fbW91bnQ7CiAKLQlpc2l6ZV9mc2Jfb2Zmc2V0ID0gWEZTX0JfRlNCX09GRlNFVChtcCwgaXNpemUpOwotCWlmIChpc2l6ZV9mc2Jfb2Zmc2V0ID09IDApIHsKKwl6ZXJvX29mZnNldCA9IFhGU19CX0ZTQl9PRkZTRVQobXAsIGlzaXplKTsKKwlpZiAoemVyb19vZmZzZXQgPT0gMCkgewogCQkvKgogCQkgKiBUaGVyZSBhcmUgbm8gZXh0cmEgYnl0ZXMgaW4gdGhlIGxhc3QgYmxvY2sgb24gZGlzayB0bwogCQkgKiB6ZXJvLCBzbyByZXR1cm4uCkBAIC00MTMsMTAgKzQwMyw4IEBACiAJICovCiAJWEZTX0lVTkxPQ0sobXAsIGlvLCBYRlNfSUxPQ0tfRVhDTHwgWEZTX0VYVFNJWkVfUkQpOwogCWxvZmYgPSBYRlNfRlNCX1RPX0IobXAsIGxhc3RfZnNiKTsKLQlsc2l6ZSA9IFhGU19GU0JfVE9fQihtcCwgMSk7CiAKLQl6ZXJvX29mZnNldCA9IGlzaXplX2ZzYl9vZmZzZXQ7Ci0JemVyb19sZW4gPSBtcC0+bV9zYi5zYl9ibG9ja3NpemUgLSBpc2l6ZV9mc2Jfb2Zmc2V0OworCXplcm9fbGVuID0gbXAtPm1fc2Iuc2JfYmxvY2tzaXplIC0gemVyb19vZmZzZXQ7CiAKIAllcnJvciA9IHhmc19pb3plcm8oaXAsIGxvZmYgKyB6ZXJvX29mZnNldCwgemVyb19sZW4sIGVuZF9zaXplKTsKIApAQCAtNDQ3LDIwICs0MzUsMTcgQEAKIAlzdHJ1Y3QgaW5vZGUJKmlwID0gTElOVkZTX0dFVF9JUCh2cCk7CiAJeGZzX2ZpbGVvZmZfdAlzdGFydF96ZXJvX2ZzYjsKIAl4ZnNfZmlsZW9mZl90CWVuZF96ZXJvX2ZzYjsKLQl4ZnNfZmlsZW9mZl90CXByZXZfemVyb19mc2I7CiAJeGZzX2ZpbGVvZmZfdAl6ZXJvX2NvdW50X2ZzYjsKIAl4ZnNfZmlsZW9mZl90CWxhc3RfZnNiOwogCXhmc19leHRsZW5fdAlidWZfbGVuX2ZzYjsKLQl4ZnNfZXh0bGVuX3QJcHJldl96ZXJvX2NvdW50OwogCXhmc19tb3VudF90CSptcDsKIAlpbnQJCW5pbWFwczsKIAlpbnQJCWVycm9yID0gMDsKIAl4ZnNfYm1idF9pcmVjX3QJaW1hcDsKLQlsb2ZmX3QJCWxvZmY7Ci0Jc2l6ZV90CQlsc2l6ZTsKIAogCUFTU0VSVChpc21ybG9ja2VkKGlvLT5pb19sb2NrLCBNUl9VUERBVEUpKTsKIAlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9faW9sb2NrLCBNUl9VUERBVEUpKTsKKwlBU1NFUlQob2Zmc2V0ID4gaXNpemUpOwogCiAJbXAgPSBpby0+aW9fbW91bnQ7CiAKQEAgLTQ2OCw3ICs0NTMsNyBAQAogCSAqIEZpcnN0IGhhbmRsZSB6ZXJvaW5nIHRoZSBibG9jayBvbiB3aGljaCBpc2l6ZSByZXNpZGVzLgogCSAqIFdlIG9ubHkgemVybyBhIHBhcnQgb2YgdGhhdCBibG9jayBzbyBpdCBpcyBoYW5kbGVkIHNwZWNpYWxseS4KIAkgKi8KLQllcnJvciA9IHhmc196ZXJvX2xhc3RfYmxvY2soaXAsIGlvLCBvZmZzZXQsIGlzaXplLCBlbmRfc2l6ZSk7CisJZXJyb3IgPSB4ZnNfemVyb19sYXN0X2Jsb2NrKGlwLCBpbywgaXNpemUsIGVuZF9zaXplKTsKIAlpZiAoZXJyb3IpIHsKIAkJQVNTRVJUKGlzbXJsb2NrZWQoaW8tPmlvX2xvY2ssIE1SX1VQREFURSkpOwogCQlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9faW9sb2NrLCBNUl9VUERBVEUpKTsKQEAgLTQ5Niw4ICs0ODEsNiBAQAogCX0KIAogCUFTU0VSVChzdGFydF96ZXJvX2ZzYiA8PSBlbmRfemVyb19mc2IpOwotCXByZXZfemVyb19mc2IgPSBOVUxMRklMRU9GRjsKLQlwcmV2X3plcm9fY291bnQgPSAwOwogCXdoaWxlIChzdGFydF96ZXJvX2ZzYiA8PSBlbmRfemVyb19mc2IpIHsKIAkJbmltYXBzID0gMTsKIAkJemVyb19jb3VudF9mc2IgPSBlbmRfemVyb19mc2IgLSBzdGFydF96ZXJvX2ZzYiArIDE7CkBAIC01MTksMTAgKzUwMiw3IEBACiAJCQkgKiB0aGF0IHNpdHMgb24gYSBob2xlIGFuZCBzZXRzIHRoZSBwYWdlIGFzIFBfSE9MRQogCQkJICogYW5kIGNhbGxzIHJlbWFwZiBpZiBpdCBpcyBhIG1hcHBlZCBmaWxlLgogCQkJICovCi0JCQlwcmV2X3plcm9fZnNiID0gTlVMTEZJTEVPRkY7Ci0JCQlwcmV2X3plcm9fY291bnQgPSAwOwotCQkJc3RhcnRfemVyb19mc2IgPSBpbWFwLmJyX3N0YXJ0b2ZmICsKLQkJCQkJIGltYXAuYnJfYmxvY2tjb3VudDsKKwkJCXN0YXJ0X3plcm9fZnNiID0gaW1hcC5icl9zdGFydG9mZiArIGltYXAuYnJfYmxvY2tjb3VudDsKIAkJCUFTU0VSVChzdGFydF96ZXJvX2ZzYiA8PSAoZW5kX3plcm9fZnNiICsgMSkpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTU0MywxNyArNTIzLDE1IEBACiAJCSAqLwogCQlYRlNfSVVOTE9DSyhtcCwgaW8sIFhGU19JTE9DS19FWENMfFhGU19FWFRTSVpFX1JEKTsKIAotCQlsb2ZmID0gWEZTX0ZTQl9UT19CKG1wLCBzdGFydF96ZXJvX2ZzYik7Ci0JCWxzaXplID0gWEZTX0ZTQl9UT19CKG1wLCBidWZfbGVuX2ZzYik7Ci0KLQkJZXJyb3IgPSB4ZnNfaW96ZXJvKGlwLCBsb2ZmLCBsc2l6ZSwgZW5kX3NpemUpOworCQllcnJvciA9IHhmc19pb3plcm8oaXAsCisJCQkJICAgWEZTX0ZTQl9UT19CKG1wLCBzdGFydF96ZXJvX2ZzYiksCisJCQkJICAgWEZTX0ZTQl9UT19CKG1wLCBidWZfbGVuX2ZzYiksCisJCQkJICAgZW5kX3NpemUpOwogCiAJCWlmIChlcnJvcikgewogCQkJZ290byBvdXRfbG9jazsKIAkJfQogCi0JCXByZXZfemVyb19mc2IgPSBzdGFydF96ZXJvX2ZzYjsKLQkJcHJldl96ZXJvX2NvdW50ID0gYnVmX2xlbl9mc2I7CiAJCXN0YXJ0X3plcm9fZnNiID0gaW1hcC5icl9zdGFydG9mZiArIGJ1Zl9sZW5fZnNiOwogCQlBU1NFUlQoc3RhcnRfemVyb19mc2IgPD0gKGVuZF96ZXJvX2ZzYiArIDEpKTsKIApAQCAtNjQwLDcgKzYxOCw3IEBACiAJCQkoeGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSA/CiAJCQkJbXAtPm1fcnRkZXZfdGFyZ3AgOiBtcC0+bV9kZGV2X3RhcmdwOwogCi0JCWlmICgocG9zICYgdGFyZ2V0LT5wYnJfc21hc2spIHx8IChjb3VudCAmIHRhcmdldC0+cGJyX3NtYXNrKSkKKwkJaWYgKChwb3MgJiB0YXJnZXQtPmJ0X3NtYXNrKSB8fCAoY291bnQgJiB0YXJnZXQtPmJ0X3NtYXNrKSkKIAkJCXJldHVybiBYRlNfRVJST1IoLUVJTlZBTCk7CiAKIAkJaWYgKCFWTl9DQUNIRUQodnApICYmIHBvcyA8IGlfc2l6ZV9yZWFkKGlub2RlKSkKQEAgLTgzMSw2ICs4MDksMTAgQEAKIAkJZ290byByZXRyeTsKIAl9CiAKKwlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwlpZiAodW5saWtlbHkocmV0IDwgMCAmJiByZXQgIT0gLUVGQVVMVCAmJiAqb2Zmc2V0ID4gaXNpemUpKQorCQkqb2Zmc2V0ID0gaXNpemU7CisKIAlpZiAoKm9mZnNldCA+IHhpcC0+aV9kLmRpX3NpemUpIHsKIAkJeGZzX2lsb2NrKHhpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCQlpZiAoKm9mZnNldCA+IHhpcC0+aV9kLmRpX3NpemUpIHsKQEAgLTk1Niw3ICs5MzgsNyBAQAogCiAJbXAgPSBYRlNfQlVGX0ZTUFJJVkFURTMoYnAsIHhmc19tb3VudF90ICopOwogCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKLQkJcGFnZWJ1Zl9pb3JlcXVlc3QoYnApOworCQl4ZnNfYnVmX2lvcmVxdWVzdChicCk7CiAJCXJldHVybiAwOwogCX0gZWxzZSB7CiAJCXhmc19idWZ0cmFjZSgiWEZTX19CRFNUUkFUIElPRVJST1IiLCBicCk7CkBAIC0xMDA5LDcgKzk5MSw3IEBACiAJCSAqIGlmIChYRlNfQlVGX0lTX0dSSU8oYnApKSB7CiAJCSAqLwogCi0JCXBhZ2VidWZfaW9yZXF1ZXN0KGJwKTsKKwkJeGZzX2J1Zl9pb3JlcXVlc3QoYnApOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5jCmluZGV4IDZjNDBhNzQuLjg5NTU3MjAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuYwpAQCAtMzQsNyArMzQsNyBAQAogCV9fdWludDY0X3QJeHNfd3JpdGVfYnl0ZXMgPSAwOwogCV9fdWludDY0X3QJeHNfcmVhZF9ieXRlcyA9IDA7CiAKLQlzdGF0aWMgc3RydWN0IHhzdGF0c19lbnRyeSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB4c3RhdHNfZW50cnkgewogCQljaGFyCSpkZXNjOwogCQlpbnQJZW5kcG9pbnQ7CiAJfSB4c3RhdHNbXSA9IHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5oCmluZGV4IDUwMDI3YzQuLjhiYTdhMmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuaApAQCAtMTA5LDE1ICsxMDksMTUgQEAKIAlfX3VpbnQzMl90CQl2bl9yZW1vdmU7CS8qICMgdGltZXMgdm5fcmVtb3ZlIGNhbGxlZCAqLwogCV9fdWludDMyX3QJCXZuX2ZyZWU7CS8qICMgdGltZXMgdm5fZnJlZSBjYWxsZWQgKi8KICNkZWZpbmUgWEZTU1RBVF9FTkRfQlVGCQkJKFhGU1NUQVRfRU5EX1ZOT0RFX09QUys5KQotCV9fdWludDMyX3QJCXBiX2dldDsKLQlfX3VpbnQzMl90CQlwYl9jcmVhdGU7Ci0JX191aW50MzJfdAkJcGJfZ2V0X2xvY2tlZDsKLQlfX3VpbnQzMl90CQlwYl9nZXRfbG9ja2VkX3dhaXRlZDsKLQlfX3VpbnQzMl90CQlwYl9idXN5X2xvY2tlZDsKLQlfX3VpbnQzMl90CQlwYl9taXNzX2xvY2tlZDsKLQlfX3VpbnQzMl90CQlwYl9wYWdlX3JldHJpZXM7Ci0JX191aW50MzJfdAkJcGJfcGFnZV9mb3VuZDsKLQlfX3VpbnQzMl90CQlwYl9nZXRfcmVhZDsKKwlfX3VpbnQzMl90CQl4Yl9nZXQ7CisJX191aW50MzJfdAkJeGJfY3JlYXRlOworCV9fdWludDMyX3QJCXhiX2dldF9sb2NrZWQ7CisJX191aW50MzJfdAkJeGJfZ2V0X2xvY2tlZF93YWl0ZWQ7CisJX191aW50MzJfdAkJeGJfYnVzeV9sb2NrZWQ7CisJX191aW50MzJfdAkJeGJfbWlzc19sb2NrZWQ7CisJX191aW50MzJfdAkJeGJfcGFnZV9yZXRyaWVzOworCV9fdWludDMyX3QJCXhiX3BhZ2VfZm91bmQ7CisJX191aW50MzJfdAkJeGJfZ2V0X3JlYWQ7CiAvKiBFeHRyYSBwcmVjaXNpb24gY291bnRlcnMgKi8KIAlfX3VpbnQ2NF90CQl4c194c3RyYXRfYnl0ZXM7CiAJX191aW50NjRfdAkJeHNfd3JpdGVfYnl0ZXM7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCA2MTE2YjViLi5mMjJlNDI2IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTMwNiwxMyArMzA2LDE1IEBACiAJCXhmc19mc19jbW5fZXJyKENFX05PVEUsIG1wLAogCQkgICJEaXNhYmxpbmcgYmFycmllcnMsIG5vdCBzdXBwb3J0ZWQgd2l0aCBleHRlcm5hbCBsb2cgZGV2aWNlIik7CiAJCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfQkFSUklFUjsKKwkJcmV0dXJuOwogCX0KIAotCWlmIChtcC0+bV9kZGV2X3RhcmdwLT5wYnJfYmRldi0+YmRfZGlzay0+cXVldWUtPm9yZGVyZWQgPT0KKwlpZiAobXAtPm1fZGRldl90YXJncC0+YnRfYmRldi0+YmRfZGlzay0+cXVldWUtPm9yZGVyZWQgPT0KIAkJCQkJUVVFVUVfT1JERVJFRF9OT05FKSB7CiAJCXhmc19mc19jbW5fZXJyKENFX05PVEUsIG1wLAogCQkgICJEaXNhYmxpbmcgYmFycmllcnMsIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcgZGV2aWNlIik7CiAJCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfQkFSUklFUjsKKwkJcmV0dXJuOwogCX0KIAogCWVycm9yID0geGZzX2JhcnJpZXJfdGVzdChtcCk7CkBAIC0zMjAsNiArMzIyLDcgQEAKIAkJeGZzX2ZzX2Ntbl9lcnIoQ0VfTk9URSwgbXAsCiAJCSAgIkRpc2FibGluZyBiYXJyaWVycywgdHJpYWwgYmFycmllciB3cml0ZSBmYWlsZWQiKTsKIAkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9CQVJSSUVSOworCQlyZXR1cm47CiAJfQogfQogCkBAIC0zMjcsNyArMzMwLDcgQEAKIHhmc19ibGtkZXZfaXNzdWVfZmx1c2goCiAJeGZzX2J1ZnRhcmdfdAkJKmJ1ZnRhcmcpCiB7Ci0JYmxrZGV2X2lzc3VlX2ZsdXNoKGJ1ZnRhcmctPnBicl9iZGV2LCBOVUxMKTsKKwlibGtkZXZfaXNzdWVfZmx1c2goYnVmdGFyZy0+YnRfYmRldiwgTlVMTCk7CiB9CiAKIFNUQVRJQyBzdHJ1Y3QgaW5vZGUgKgpAQCAtNTc2LDcgKzU3OSw3IEBACiAJCXRpbWVsZWZ0ID0gc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHRpbWVsZWZ0KTsKIAkJLyogc3dzdXNwICovCiAJCXRyeV90b19mcmVlemUoKTsKLQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBsaXN0X2VtcHR5KCZ2ZnNwLT52ZnNfc3luY19saXN0KSkKIAkJCWJyZWFrOwogCiAJCXNwaW5fbG9jaygmdmZzcC0+dmZzX3N5bmNfbG9jayk7CkBAIC05NjYsOSArOTY5LDkgQEAKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIHVuZG9fem9uZXM7CiAKLQllcnJvciA9IHBhZ2VidWZfaW5pdCgpOworCWVycm9yID0geGZzX2J1Zl9pbml0KCk7CiAJaWYgKGVycm9yIDwgMCkKLQkJZ290byB1bmRvX3BhZ2VidWY7CisJCWdvdG8gdW5kb19idWZmZXJzOwogCiAJdm5faW5pdCgpOwogCXhmc19pbml0KCk7CkBAIC05ODIsOSArOTg1LDkgQEAKIAlyZXR1cm4gMDsKIAogdW5kb19yZWdpc3RlcjoKLQlwYWdlYnVmX3Rlcm1pbmF0ZSgpOworCXhmc19idWZfdGVybWluYXRlKCk7CiAKLXVuZG9fcGFnZWJ1ZjoKK3VuZG9fYnVmZmVyczoKIAlsaW52ZnNfZGVzdHJveV96b25lcygpOwogCiB1bmRvX3pvbmVzOgpAQCAtOTk4LDcgKzEwMDEsNyBAQAogCVhGU19ETV9FWElUKCZ4ZnNfZnNfdHlwZSk7CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZ4ZnNfZnNfdHlwZSk7CiAJeGZzX2NsZWFudXAoKTsKLQlwYWdlYnVmX3Rlcm1pbmF0ZSgpOworCXhmc19idWZfdGVybWluYXRlKCk7CiAJbGludmZzX2Rlc3Ryb3lfem9uZXMoKTsKIAlrdHJhY2VfdW5pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYwppbmRleCBlOWJiY2I0Li4yNjBkZDg0IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmMKQEAgLTEwNiw3ICsxMDYsNiBAQAogCWlub2RlLT5pX2Jsb2NrcwkgICAgPSB2YXAtPnZhX25ibG9ja3M7CiAJaW5vZGUtPmlfbXRpbWUJICAgID0gdmFwLT52YV9tdGltZTsKIAlpbm9kZS0+aV9jdGltZQkgICAgPSB2YXAtPnZhX2N0aW1lOwotCWlub2RlLT5pX2F0aW1lCSAgICA9IHZhcC0+dmFfYXRpbWU7CiAJaW5vZGUtPmlfYmxrc2l6ZSAgICA9IHZhcC0+dmFfYmxvY2tzaXplOwogCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19JTU1VVEFCTEUpCiAJCWlub2RlLT5pX2ZsYWdzIHw9IFNfSU1NVVRBQkxFOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmgKaW5kZXggZjJiYmIzMi4uMGZlMjQxOSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oCkBAIC01NjYsNiArNTY2LDI1IEBACiB9CiAKIC8qCisgKiBFeHRyYWN0aW5nIGF0aW1lIHZhbHVlcyBpbiB2YXJpb3VzIGZvcm1hdHMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHZuX2F0aW1lX3RvX2JzdGltZShzdHJ1Y3Qgdm5vZGUgKnZwLCB4ZnNfYnN0aW1lX3QgKmJzX2F0aW1lKQoreworCWJzX2F0aW1lLT50dl9zZWMgPSB2cC0+dl9pbm9kZS5pX2F0aW1lLnR2X3NlYzsKKwlic19hdGltZS0+dHZfbnNlYyA9IHZwLT52X2lub2RlLmlfYXRpbWUudHZfbnNlYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZuX2F0aW1lX3RvX3RpbWVzcGVjKHN0cnVjdCB2bm9kZSAqdnAsIHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJKnRzID0gdnAtPnZfaW5vZGUuaV9hdGltZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZuX2F0aW1lX3RvX3RpbWVfdChzdHJ1Y3Qgdm5vZGUgKnZwLCB0aW1lX3QgKnR0KQoreworCSp0dCA9IHZwLT52X2lub2RlLmlfYXRpbWUudHZfc2VjOworfQorCisvKgogICogU29tZSB1c2VmdWwgcHJlZGljYXRlcy4KICAqLwogI2RlZmluZSBWTl9NQVBQRUQodnApCW1hcHBpbmdfbWFwcGVkKExJTlZGU19HRVRfSVAodnApLT5pX21hcHBpbmcpCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5jCmluZGV4IDJmNjk4MjIuLjJlYzZiNDQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAkgKiB0cnlpbmcgdG8gZHVwbGljYXRlIG91ciBlZmZvcnQuCiAJICovCiAJQVNTRVJUKHFpcC0+cWxpX3B1c2hidWZfZmxhZyAhPSAwKTsKLQlBU1NFUlQocWlwLT5xbGlfcHVzaF9vd25lciA9PSBnZXRfdGhyZWFkX2lkKCkpOworCUFTU0VSVChxaXAtPnFsaV9wdXNoX293bmVyID09IGN1cnJlbnRfcGlkKCkpOwogCiAJLyoKIAkgKiBJZiBmbHVzaGxvY2sgaXNuJ3QgbG9ja2VkIGFueW1vcmUsIGNoYW5jZXMgYXJlIHRoYXQgdGhlCkBAIC0zMzMsNyArMzMzLDcgQEAKIAkJCXFpcC0+cWxpX3B1c2hidWZfZmxhZyA9IDE7CiAJCQlBU1NFUlQocWlwLT5xbGlfZm9ybWF0LnFsZl9ibGtubyA9PSBkcXAtPnFfYmxrbm8pOwogI2lmZGVmIERFQlVHCi0JCQlxaXAtPnFsaV9wdXNoX293bmVyID0gZ2V0X3RocmVhZF9pZCgpOworCQkJcWlwLT5xbGlfcHVzaF9vd25lciA9IGN1cnJlbnRfcGlkKCk7CiAjZW5kaWYKIAkJCS8qCiAJCQkgKiBUaGUgZHF1b3QgaXMgbGVmdCBsb2NrZWQuCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtLmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtLmMKaW5kZXggYmI2OTkxYS4uN2RjZGQwNiAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbS5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uYwpAQCAtMTM5MiwxMSArMTM5MiwxMiBAQAogewogCXhmc190cmFuc190CSp0cDsKIAlpbnQJCWVycm9yOwotCXVuc2lnbmVkIGxvbmcgczsKKwl1bnNpZ25lZCBsb25nCXM7CiAJY3JlZF90CQl6ZXJvY3I7CisJeGZzX2lub2RlX3QJemVyb2lubzsKIAlpbnQJCWNvbW1pdHRlZDsKIAotCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLFhGU19UUkFOU19RTV9RSU5PQ1JFQVRFKTsKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1FNX1FJTk9DUkVBVEUpOwogCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwKIAkJCQkgICAgICBYRlNfUU1fUUlOT0NSRUFURV9TUEFDRV9SRVMobXApLAogCQkJCSAgICAgIFhGU19DUkVBVEVfTE9HX1JFUyhtcCksIDAsCkBAIC0xNDA2LDggKzE0MDcsOSBAQAogCQlyZXR1cm4gKGVycm9yKTsKIAl9CiAJbWVtc2V0KCZ6ZXJvY3IsIDAsIHNpemVvZih6ZXJvY3IpKTsKKwltZW1zZXQoJnplcm9pbm8sIDAsIHNpemVvZih6ZXJvaW5vKSk7CiAKLQlpZiAoKGVycm9yID0geGZzX2Rpcl9pYWxsb2MoJnRwLCBtcC0+bV9yb290aXAsIFNfSUZSRUcsIDEsIDAsCisJaWYgKChlcnJvciA9IHhmc19kaXJfaWFsbG9jKCZ0cCwgJnplcm9pbm8sIFNfSUZSRUcsIDEsIDAsCiAJCQkJICAgJnplcm9jciwgMCwgMSwgaXAsICZjb21taXR0ZWQpKSkgewogCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwKIAkJCQkgWEZTX1RSQU5TX0FCT1JUKTsKQEAgLTE5MTgsOSArMTkyMCw3IEBACiAJICogYXQgdGhpcyBwb2ludCAoYmVjYXVzZSB3ZSBpbnRlbnRpb25hbGx5IGRpZG4ndCBpbiBkcWdldF9ub2F0dGFjaCkuCiAJICovCiAJaWYgKGVycm9yKSB7Ci0JCXhmc19xbV9kcXB1cmdlX2FsbChtcCwKLQkJCQkgICBYRlNfUU1PUFRfVVFVT1RBfFhGU19RTU9QVF9HUVVPVEF8Ci0JCQkJICAgWEZTX1FNT1BUX1BRVU9UQXxYRlNfUU1PUFRfUVVPVEFPRkYpOworCQl4ZnNfcW1fZHFwdXJnZV9hbGwobXAsIFhGU19RTU9QVF9RVU9UQUxMIHwgWEZTX1FNT1BUX1FVT1RBT0ZGKTsKIAkJZ290byBlcnJvcl9yZXR1cm47CiAJfQogCS8qCkBAIC0yNzQzLDYgKzI3NDMsNyBAQAogCQl4ZnNfZHF1bmxvY2sodWRxcCk7CiAJCUFTU0VSVChpcC0+aV91ZHF1b3QgPT0gTlVMTCk7CiAJCWlwLT5pX3VkcXVvdCA9IHVkcXA7CisJCUFTU0VSVChYRlNfSVNfVVFVT1RBX09OKHRwLT50X21vdW50cCkpOwogCQlBU1NFUlQoaXAtPmlfZC5kaV91aWQgPT0gYmUzMl90b19jcHUodWRxcC0+cV9jb3JlLmRfaWQpKTsKIAkJeGZzX3RyYW5zX21vZF9kcXVvdCh0cCwgdWRxcCwgWEZTX1RSQU5TX0RRX0lDT1VOVCwgMSk7CiAJfQpAQCAtMjc1Miw3ICsyNzUzLDEwIEBACiAJCXhmc19kcXVubG9jayhnZHFwKTsKIAkJQVNTRVJUKGlwLT5pX2dkcXVvdCA9PSBOVUxMKTsKIAkJaXAtPmlfZ2RxdW90ID0gZ2RxcDsKLQkJQVNTRVJUKGlwLT5pX2QuZGlfZ2lkID09IGJlMzJfdG9fY3B1KGdkcXAtPnFfY29yZS5kX2lkKSk7CisJCUFTU0VSVChYRlNfSVNfT1FVT1RBX09OKHRwLT50X21vdW50cCkpOworCQlBU1NFUlQoKFhGU19JU19HUVVPVEFfT04odHAtPnRfbW91bnRwKSA/CisJCQlpcC0+aV9kLmRpX2dpZCA6IGlwLT5pX2QuZGlfcHJvamlkKSA9PQorCQkJCWJlMzJfdG9fY3B1KGdkcXAtPnFfY29yZS5kX2lkKSk7CiAJCXhmc190cmFuc19tb2RfZHF1b3QodHAsIGdkcXAsIFhGU19UUkFOU19EUV9JQ09VTlQsIDEpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMgYi9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jCmluZGV4IGJiNmRjOTEuLmIwOGIzZDkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMKKysrIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuYwpAQCAtMjcsNDUgKzI3LDEyIEBACiAvKiBUcmFuc2xhdGUgZnJvbSBDRV9GT08gdG8gS0VSTl9GT08sIGVycl9sZXZlbChDRV9GT08pID09IEtFUk5fRk9PICovCiAjZGVmaW5lIFhGU19NQVhfRVJSX0xFVkVMCTcKICNkZWZpbmUgWEZTX0VSUl9NQVNLCQkoKDEgPDwgMykgLSAxKQotc3RhdGljIGNoYXIJCSplcnJfbGV2ZWxbWEZTX01BWF9FUlJfTEVWRUwrMV0gPQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdAllcnJfbGV2ZWxbWEZTX01BWF9FUlJfTEVWRUwrMV0gPQogCQkJCQl7S0VSTl9FTUVSRywgS0VSTl9BTEVSVCwgS0VSTl9DUklULAogCQkJCQkgS0VSTl9FUlIsIEtFUk5fV0FSTklORywgS0VSTl9OT1RJQ0UsCiAJCQkJCSBLRVJOX0lORk8sIEtFUk5fREVCVUd9OwogCiB2b2lkCi1hc3NmYWlsKGNoYXIgKmEsIGNoYXIgKmYsIGludCBsKQotewotICAgIHByaW50aygiWEZTIGFzc2VydGlvbiBmYWlsZWQ6ICVzLCBmaWxlOiAlcywgbGluZTogJWRcbiIsIGEsIGYsIGwpOwotICAgIEJVRygpOwotfQotCi0jaWYgKChkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKElORFVDRV9JT19FUlJST1IpKSAmJiAhZGVmaW5lZChOT19XQU5UX1JBTkRPTSkpCi0KLXVuc2lnbmVkIGxvbmcKLXJhbmRvbSh2b2lkKQotewotCXN0YXRpYyB1bnNpZ25lZCBsb25nCVJhbmRvbVZhbHVlID0gMTsKLQkvKiBjeWNsZXMgcHNldWRvLXJhbmRvbWx5IHRocm91Z2ggYWxsIHZhbHVlcyBiZXR3ZWVuIDEgYW5kIDJeMzEgLSAyICovCi0JcmVnaXN0ZXIgbG9uZwlydiA9IFJhbmRvbVZhbHVlOwotCXJlZ2lzdGVyIGxvbmcJbG87Ci0JcmVnaXN0ZXIgbG9uZwloaTsKLQotCWhpID0gcnYgLyAxMjc3NzM7Ci0JbG8gPSBydiAlIDEyNzc3MzsKLQlydiA9IDE2ODA3ICogbG8gLSAyODM2ICogaGk7Ci0JaWYoIHJ2IDw9IDAgKSBydiArPSAyMTQ3NDgzNjQ3OwotCXJldHVybiggUmFuZG9tVmFsdWUgPSBydiApOwotfQotCi1pbnQKLWdldF90aHJlYWRfaWQodm9pZCkKLXsKLQlyZXR1cm4gY3VycmVudC0+cGlkOwotfQotCi0jZW5kaWYgLyogREVCVUcgfHwgSU5EVUNFX0lPX0VSUlJPUiB8fCAhTk9fV0FOVF9SQU5ET00gKi8KLQotdm9pZAogY21uX2VycihyZWdpc3RlciBpbnQgbGV2ZWwsIGNoYXIgKmZtdCwgLi4uKQogewogCWNoYXIJKmZwID0gZm10OwpAQCAtOTAsNyArNTcsNiBAQAogCQlCVUcoKTsKIH0KIAotCiB2b2lkCiBpY21uX2VycihyZWdpc3RlciBpbnQgbGV2ZWwsIGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKIHsKQEAgLTEwOSwzICs3NSwyNyBAQAogCWlmIChsZXZlbCA9PSBDRV9QQU5JQykKIAkJQlVHKCk7CiB9CisKK3ZvaWQKK2Fzc2ZhaWwoY2hhciAqZXhwciwgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisJcHJpbnRrKCJBc3NlcnRpb24gZmFpbGVkOiAlcywgZmlsZTogJXMsIGxpbmU6ICVkXG4iLCBleHByLCBmaWxlLCBsaW5lKTsKKwlCVUcoKTsKK30KKworI2lmICgoZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChJTkRVQ0VfSU9fRVJSUk9SKSkgJiYgIWRlZmluZWQoTk9fV0FOVF9SQU5ET00pKQordW5zaWduZWQgbG9uZyByYW5kb20odm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZwlSYW5kb21WYWx1ZSA9IDE7CisJLyogY3ljbGVzIHBzZXVkby1yYW5kb21seSB0aHJvdWdoIGFsbCB2YWx1ZXMgYmV0d2VlbiAxIGFuZCAyXjMxIC0gMiAqLworCXJlZ2lzdGVyIGxvbmcJcnYgPSBSYW5kb21WYWx1ZTsKKwlyZWdpc3RlciBsb25nCWxvOworCXJlZ2lzdGVyIGxvbmcJaGk7CisKKwloaSA9IHJ2IC8gMTI3NzczOworCWxvID0gcnYgJSAxMjc3NzM7CisJcnYgPSAxNjgwNyAqIGxvIC0gMjgzNiAqIGhpOworCWlmIChydiA8PSAwKSBydiArPSAyMTQ3NDgzNjQ3OworCXJldHVybiBSYW5kb21WYWx1ZSA9IHJ2OworfQorI2VuZGlmIC8qIERFQlVHIHx8IElORFVDRV9JT19FUlJST1IgfHwgIU5PX1dBTlRfUkFORE9NICovCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5oIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuaAppbmRleCBhZmY1NTg2Li5lM2JmNTgxIDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5oCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmgKQEAgLTMxLDI0ICszMSwyMyBAQAogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMCkpKTsKIGV4dGVybiB2b2lkIGNtbl9lcnIoaW50LCBjaGFyICosIC4uLikKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gdm9pZCBhc3NmYWlsKGNoYXIgKmV4cHIsIGNoYXIgKmYsIGludCBsKTsKKworI2RlZmluZSBwcmRldihmbXQsdGFyZyxhcmdzLi4uKSBcCisJcHJpbnRrKCJEZXZpY2UgJXMgLSAiIGZtdCAiXG4iLCBYRlNfQlVGVEFSR19OQU1FKHRhcmcpLCAjIyBhcmdzKQorCisjZGVmaW5lIEFTU0VSVF9BTFdBWVMoZXhwcikJXAorCSh1bmxpa2VseSgoZXhwcikgIT0gMCkgPyAodm9pZCkwIDogYXNzZmFpbCgjZXhwciwgX19GSUxFX18sIF9fTElORV9fKSkKKworI2lmbmRlZiBERUJVRworIyBkZWZpbmUgQVNTRVJUKGV4cHIpCSgodm9pZCkwKQorI2Vsc2UKKyMgZGVmaW5lIEFTU0VSVChleHByKQlBU1NFUlRfQUxXQVlTKGV4cHIpCitleHRlcm4gdW5zaWduZWQgbG9uZyByYW5kb20odm9pZCk7CisjZW5kaWYKIAogI2lmbmRlZiBTVEFUSUMKICMgZGVmaW5lIFNUQVRJQyBzdGF0aWMKICNlbmRpZgogCi0jaWZkZWYgREVCVUcKLSMgZGVmaW5lIEFTU0VSVChFWCkJKChFWCkgPyAoKHZvaWQpMCkgOiBhc3NmYWlsKCNFWCwgX19GSUxFX18sIF9fTElORV9fKSkKLSNlbHNlCi0jIGRlZmluZSBBU1NFUlQoeCkJKCh2b2lkKTApCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgYXNzZmFpbChjaGFyICosIGNoYXIgKiwgaW50KTsKLSNpZmRlZiBERUJVRwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmFuZG9tKHZvaWQpOwotZXh0ZXJuIGludCBnZXRfdGhyZWFkX2lkKHZvaWQpOwotI2VuZGlmCi0KLSNkZWZpbmUgQVNTRVJUX0FMV0FZUyhFWCkgICgoRVgpPygodm9pZCkwKTphc3NmYWlsKCNFWCwgX19GSUxFX18sIF9fTElORV9fKSkKLSNkZWZpbmUJZGVidWdfc3RvcF9hbGxfY3B1cyhwYXJhbSkJLyogcGFyYW0gaXMgImNwdW1hc2tfdCAqIiAqLwotCiAjZW5kaWYgIC8qIF9fWEZTX1NVUFBPUlRfREVCVUdfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC91dWlkLmMgYi9mcy94ZnMvc3VwcG9ydC91dWlkLmMKaW5kZXggNjllYzRmNS4uYTNkNTY1YSAxMDA2NDQKLS0tIGEvZnMveGZzL3N1cHBvcnQvdXVpZC5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L3V1aWQuYwpAQCAtMjcsNiArMjcsMTYgQEAKIAltdXRleF9pbml0KCZ1dWlkX21vbml0b3IpOwogfQogCisKKy8qIElSSVggaW50ZXJwcmV0YXRpb24gb2YgYW4gdXVpZF90ICovCit0eXBlZGVmIHN0cnVjdCB7CisJX19iZTMyCXV1X3RpbWVsb3c7CisJX19iZTE2CXV1X3RpbWVtaWQ7CisJX19iZTE2CXV1X3RpbWVoaTsKKwlfX2JlMTYJdXVfY2xvY2tzZXE7CisJX19iZTE2CXV1X25vZGVbM107Cit9IHhmc191dV90OworCiAvKgogICogdXVpZF9nZXRub2RldW5pcSAtIG9idGFpbiB0aGUgbm9kZSB1bmlxdWUgZmllbGRzIG9mIGEgVVVJRC4KICAqCkBAIC0zNiwxNiArNDYsMTEgQEAKIHZvaWQKIHV1aWRfZ2V0bm9kZXVuaXEodXVpZF90ICp1dWlkLCBpbnQgZnNpZCBbMl0pCiB7Ci0JY2hhcgkqdXUgPSAoY2hhciAqKXV1aWQ7CisJeGZzX3V1X3QgKnV1cCA9ICh4ZnNfdXVfdCAqKXV1aWQ7CiAKLQkvKiBvbiBJUklYLCB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgYmlnLWVuZGlhbiBmaWVsZHMgd2l0aGluCi0JICogdGhlIHV1aWQsIHNvIHdlIHVzZSBJTlRfR0VUIHRvIGdldCB0aGUgc2FtZSByZXN1bHQgb24KLQkgKiBsaXR0bGUtZW5kaWFuIHN5c3RlbXMKLQkgKi8KLQotCWZzaWRbMF0gPSAoSU5UX0dFVCgqKHVfaW50MTZfdCopKHV1KzgpLCBBUkNIX0NPTlZFUlQpIDw8IDE2KSArCi0JCSAgIElOVF9HRVQoKih1X2ludDE2X3QqKSh1dSs0KSwgQVJDSF9DT05WRVJUKTsKLQlmc2lkWzFdID0gIElOVF9HRVQoKih1X2ludDMyX3QqKSh1dSAgKSwgQVJDSF9DT05WRVJUKTsKKwlmc2lkWzBdID0gKGJlMTZfdG9fY3B1KHV1cC0+dXVfY2xvY2tzZXEpIDw8IDE2KSB8CisJCSAgIGJlMTZfdG9fY3B1KHV1cC0+dXVfdGltZW1pZCk7CisJZnNpZFsxXSA9IGJlMTZfdG9fY3B1KHV1cC0+dXVfdGltZWxvdyk7CiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXJjaC5oIGIvZnMveGZzL3hmc19hcmNoLmgKaW5kZXggNjhlNTA1MS4uYzQ4MzY4OSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hcmNoLmgKKysrIGIvZnMveGZzL3hmc19hcmNoLmgKQEAgLTQwLDYgKzQwLDIyIEBACiAjdW5kZWYgWEZTX05BVElWRV9IT1NUCiAjZW5kaWYKIAorI2lmZGVmIFhGU19OQVRJVkVfSE9TVAorI2RlZmluZSBjcHVfdG9fYmUxNih2YWwpCSgoX19iZTE2KSh2YWwpKQorI2RlZmluZSBjcHVfdG9fYmUzMih2YWwpCSgoX19iZTMyKSh2YWwpKQorI2RlZmluZSBjcHVfdG9fYmU2NCh2YWwpCSgoX19iZTY0KSh2YWwpKQorI2RlZmluZSBiZTE2X3RvX2NwdSh2YWwpCSgoX191aW50MTZfdCkodmFsKSkKKyNkZWZpbmUgYmUzMl90b19jcHUodmFsKQkoKF9fdWludDMyX3QpKHZhbCkpCisjZGVmaW5lIGJlNjRfdG9fY3B1KHZhbCkJKChfX3VpbnQ2NF90KSh2YWwpKQorI2Vsc2UKKyNkZWZpbmUgY3B1X3RvX2JlMTYodmFsKQkoX19zd2FiMTYoKF9fdWludDE2X3QpKHZhbCkpKQorI2RlZmluZSBjcHVfdG9fYmUzMih2YWwpCShfX3N3YWIzMigoX191aW50MzJfdCkodmFsKSkpCisjZGVmaW5lIGNwdV90b19iZTY0KHZhbCkJKF9fc3dhYjY0KChfX3VpbnQ2NF90KSh2YWwpKSkKKyNkZWZpbmUgYmUxNl90b19jcHUodmFsKQkoX19zd2FiMTYoKF9fYmUxNikodmFsKSkpCisjZGVmaW5lIGJlMzJfdG9fY3B1KHZhbCkJKF9fc3dhYjMyKChfX2JlMzIpKHZhbCkpKQorI2RlZmluZSBiZTY0X3RvX2NwdSh2YWwpCShfX3N3YWI2NCgoX19iZTY0KSh2YWwpKSkKKyNlbmRpZgorCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAvKiBkbyB3ZSBuZWVkIGNvbnZlcnNpb24/ICovCkBAIC0xODYsNyArMjAyLDcgQEAKICAqLyAKIAogI2RlZmluZSBYRlNfR0VUX0RJUl9JTk80KGRpKSBcCi0JKCgodTMyKShkaSkuaVswXSA8PCAyNCkgfCAoKGRpKS5pWzFdIDw8IDE2KSB8ICgoZGkpLmlbMl0gPDwgOCkgfCAoKGRpKS5pWzNdKSkKKwkoKChfX3UzMikoZGkpLmlbMF0gPDwgMjQpIHwgKChkaSkuaVsxXSA8PCAxNikgfCAoKGRpKS5pWzJdIDw8IDgpIHwgKChkaSkuaVszXSkpCiAKICNkZWZpbmUgWEZTX1BVVF9ESVJfSU5PNChmcm9tLCBkaSkgXAogZG8geyBcCkBAIC0xOTcsOSArMjEzLDkgQEAKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgWEZTX0RJX0hJKGRpKSBcCi0JKCgodTMyKShkaSkuaVsxXSA8PCAxNikgfCAoKGRpKS5pWzJdIDw8IDgpIHwgKChkaSkuaVszXSkpCisJKCgoX191MzIpKGRpKS5pWzFdIDw8IDE2KSB8ICgoZGkpLmlbMl0gPDwgOCkgfCAoKGRpKS5pWzNdKSkKICNkZWZpbmUgWEZTX0RJX0xPKGRpKSBcCi0JKCgodTMyKShkaSkuaVs0XSA8PCAyNCkgfCAoKGRpKS5pWzVdIDw8IDE2KSB8ICgoZGkpLmlbNl0gPDwgOCkgfCAoKGRpKS5pWzddKSkKKwkoKChfX3UzMikoZGkpLmlbNF0gPDwgMjQpIHwgKChkaSkuaVs1XSA8PCAxNikgfCAoKGRpKS5pWzZdIDw8IDgpIHwgKChkaSkuaVs3XSkpCiAKICNkZWZpbmUgWEZTX0dFVF9ESVJfSU5POChkaSkgICAgICAgIFwKIAkoKCh4ZnNfaW5vX3QpWEZTX0RJX0xPKGRpKSAmIDB4ZmZmZmZmZmZVTEwpIHwgXApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKaW5kZXggMWM3NDIxOC4uZmU5MWVhYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYworKysgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJcmV0dXJuIChvZmZzZXQgPj0gbWluZm9ya29mZikgPyBtaW5mb3Jrb2ZmIDogMDsKIAl9CiAKLQlpZiAodW5saWtlbHkobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQ09NUEFUX0FUVFIpKSB7CisJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpKSB7CiAJCWlmIChieXRlcyA8PSBYRlNfSUZPUktfQVNJWkUoZHApKQogCQkJcmV0dXJuIG1wLT5tX2F0dHJvZmZzZXQgPj4gMzsKIAkJcmV0dXJuIDA7CkBAIC0xNTcsNyArMTU3LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHM7CiAKLQlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikgJiYKKwlpZiAoKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0FUVFIyKSAmJgogCSAgICAhKFhGU19TQl9WRVJTSU9OX0hBU0FUVFIyKCZtcC0+bV9zYikpKSB7CiAJCXMgPSBYRlNfU0JfTE9DSyhtcCk7CiAJCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTQVRUUjIoJm1wLT5tX3NiKSkgewpAQCAtMzExLDcgKzMxMSw3IEBACiAJICovCiAJdG90c2l6ZSAtPSBzaXplOwogCWlmICh0b3RzaXplID09IHNpemVvZih4ZnNfYXR0cl9zZl9oZHJfdCkgJiYgIWFyZ3MtPmFkZG5hbWUgJiYKLQkgICAgIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikpIHsKKwkgICAgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0FUVFIyKSkgewogCQkvKgogCQkgKiBMYXN0IGF0dHJpYnV0ZSBub3cgcmVtb3ZlZCwgcmV2ZXJ0IHRvIG9yaWdpbmFsCiAJCSAqIGlub2RlIGZvcm1hdCBtYWtpbmcgYWxsIGxpdGVyYWwgYXJlYSBhdmFpbGFibGUKQEAgLTMzMCw3ICszMzAsNyBAQAogCQlkcC0+aV9kLmRpX2ZvcmtvZmYgPSB4ZnNfYXR0cl9zaG9ydGZvcm1fYnl0ZXNmaXQoZHAsIHRvdHNpemUpOwogCQlBU1NFUlQoZHAtPmlfZC5kaV9mb3Jrb2ZmKTsKIAkJQVNTRVJUKHRvdHNpemUgPiBzaXplb2YoeGZzX2F0dHJfc2ZfaGRyX3QpIHx8IGFyZ3MtPmFkZG5hbWUgfHwKLQkJCShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikpOworCQkJIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9BVFRSMikpOwogCQlkcC0+aV9hZnAtPmlmX2V4dF9tYXggPQogCQkJWEZTX0lGT1JLX0FTSVpFKGRwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CiAJCWRwLT5pX2RmLmlmX2V4dF9tYXggPQpAQCAtNzM5LDcgKzczOSw3IEBACiAJCQkJKyBuYW1lX2xvYy0+bmFtZWxlbgogCQkJCSsgSU5UX0dFVChuYW1lX2xvYy0+dmFsdWVsZW4sIEFSQ0hfQ09OVkVSVCk7CiAJfQotCWlmICghKGRwLT5pX21vdW50LT5tX2ZsYWdzICYgWEZTX01PVU5UX0NPTVBBVF9BVFRSKSAmJgorCWlmICgoZHAtPmlfbW91bnQtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpICYmCiAJICAgIChieXRlcyA9PSBzaXplb2Yoc3RydWN0IHhmc19hdHRyX3NmX2hkcikpKQogCQlyZXR1cm4oLTEpOwogCXJldHVybih4ZnNfYXR0cl9zaG9ydGZvcm1fYnl0ZXNmaXQoZHAsIGJ5dGVzKSk7CkBAIC03NzgsNyArNzc4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoZm9ya29mZiA9PSAtMSkgewotCQlBU1NFUlQoIShkcC0+aV9tb3VudC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikpOworCQlBU1NFUlQoZHAtPmlfbW91bnQtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpOwogCiAJCS8qCiAJCSAqIExhc3QgYXR0cmlidXRlIHdhcyByZW1vdmVkLCByZXZlcnQgdG8gb3JpZ2luYWwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmggYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5oCmluZGV4IGY2MTQzZmYuLjU0MWUzNDEwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2F0dHJfbGVhZi5oCisrKyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmgKQEAgLTYzLDcgKzYzLDcgQEAKICAqIHRoZSBsZWFmX2VudHJ5LiAgVGhlIG5hbWVzcGFjZXMgYXJlIGluZGVwZW5kZW50IG9ubHkgYmVjYXVzZSB3ZSBhbHNvIGxvb2sKICAqIGF0IHRoZSBuYW1lc3BhY2UgYml0IHdoZW4gd2UgYXJlIGxvb2tpbmcgZm9yIGEgbWF0Y2hpbmcgYXR0cmlidXRlIG5hbWUuCiAgKgotICogV2UgYWxzbyBzdG9yZSBhICJpbmNvbXBsZXRlIiBiaXQgaW4gdGhlIGxlYWZfZW50cnkuICBJdCBzaG93cyB0aGF0IGFuCisgKiBXZSBhbHNvIHN0b3JlIGFuICJpbmNvbXBsZXRlIiBiaXQgaW4gdGhlIGxlYWZfZW50cnkuICBJdCBzaG93cyB0aGF0IGFuCiAgKiBhdHRyaWJ1dGUgaXMgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyBjcmVhdGVkIGFuZCBzaG91bGQgbm90IGJlIHNob3duIHRvCiAgKiB0aGUgdXNlciBpZiB3ZSBjcmFzaCBkdXJpbmcgdGhlIHRpbWUgdGhhdCB0aGUgYml0IGlzIHNldC4gIFdlIGNsZWFyIHRoZQogICogYml0IHdoZW4gd2UgaGF2ZSBmaW5pc2hlZCBzZXR0aW5nIHVwIHRoZSBhdHRyaWJ1dGUuICBXZSBkbyB0aGlzIGJlY2F1c2UKQEAgLTcyLDQyICs3Miw0OCBAQAogICovCiAjZGVmaW5lIFhGU19BVFRSX0xFQUZfTUFQU0laRQkzCS8qIGhvdyBtYW55IGZyZWVzcGFjZSBzbG90cyAqLwogCit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9sZWFmX21hcCB7CS8qIFJMRSBtYXAgb2YgZnJlZSBieXRlcyAqLworCV9fdWludDE2X3QJYmFzZTsJIAkvKiBiYXNlIG9mIGZyZWUgcmVnaW9uICovCisJX191aW50MTZfdAlzaXplOwkgIAkvKiBsZW5ndGggb2YgZnJlZSByZWdpb24gKi8KK30geGZzX2F0dHJfbGVhZl9tYXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9oZHIgewkvKiBjb25zdGFudC1zdHJ1Y3R1cmUgaGVhZGVyIGJsb2NrICovCisJeGZzX2RhX2Jsa2luZm9fdCBpbmZvOwkJLyogYmxvY2sgdHlwZSwgbGlua3MsIGV0Yy4gKi8KKwlfX3VpbnQxNl90CWNvdW50OwkJLyogY291bnQgb2YgYWN0aXZlIGxlYWZfZW50cnkncyAqLworCV9fdWludDE2X3QJdXNlZGJ5dGVzOwkvKiBudW0gYnl0ZXMgb2YgbmFtZXMvdmFsdWVzIHN0b3JlZCAqLworCV9fdWludDE2X3QJZmlyc3R1c2VkOwkvKiBmaXJzdCB1c2VkIGJ5dGUgaW4gbmFtZSBhcmVhICovCisJX191aW50OF90CWhvbGVzOwkJLyogIT0gMCBpZiBibGsgbmVlZHMgY29tcGFjdGlvbiAqLworCV9fdWludDhfdAlwYWQxOworCXhmc19hdHRyX2xlYWZfbWFwX3QgZnJlZW1hcFtYRlNfQVRUUl9MRUFGX01BUFNJWkVdOworCQkJCQkvKiBOIGxhcmdlc3QgZnJlZSByZWdpb25zICovCit9IHhmc19hdHRyX2xlYWZfaGRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfZW50cnkgewkvKiBzb3J0ZWQgb24ga2V5LCBub3QgbmFtZSAqLworCXhmc19kYWhhc2hfdAloYXNodmFsOwkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgKi8KKwlfX3VpbnQxNl90CW5hbWVpZHg7CS8qIGluZGV4IGludG8gYnVmZmVyIG9mIG5hbWUvdmFsdWUgKi8KKwlfX3VpbnQ4X3QJZmxhZ3M7CQkvKiBMT0NBTC9ST09UL1NFQ1VSRS9JTkNPTVBMRVRFIGZsYWcgKi8KKwlfX3VpbnQ4X3QJcGFkMjsJCS8qIHVudXNlZCBwYWQgYnl0ZSAqLworfSB4ZnNfYXR0cl9sZWFmX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbCB7CisJX191aW50MTZfdAl2YWx1ZWxlbjsJLyogbnVtYmVyIG9mIGJ5dGVzIGluIHZhbHVlICovCisJX191aW50OF90CW5hbWVsZW47CS8qIGxlbmd0aCBvZiBuYW1lIGJ5dGVzICovCisJX191aW50OF90CW5hbWV2YWxbMV07CS8qIG5hbWUvdmFsdWUgYnl0ZXMgKi8KK30geGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUgeworCXhmc19kYWJsa190CXZhbHVlYmxrOwkvKiBibG9jayBudW1iZXIgb2YgdmFsdWUgYnl0ZXMgKi8KKwlfX3VpbnQzMl90CXZhbHVlbGVuOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdmFsdWUgKi8KKwlfX3VpbnQ4X3QJbmFtZWxlbjsJLyogbGVuZ3RoIG9mIG5hbWUgYnl0ZXMgKi8KKwlfX3VpbnQ4X3QJbmFtZVsxXTsJLyogbmFtZSBieXRlcyAqLworfSB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3Q7CisKIHR5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZibG9jayB7Ci0Jc3RydWN0IHhmc19hdHRyX2xlYWZfaGRyIHsJLyogY29uc3RhbnQtc3RydWN0dXJlIGhlYWRlciBibG9jayAqLwotCQl4ZnNfZGFfYmxraW5mb190IGluZm87CS8qIGJsb2NrIHR5cGUsIGxpbmtzLCBldGMuICovCi0JCV9fdWludDE2X3QgY291bnQ7CS8qIGNvdW50IG9mIGFjdGl2ZSBsZWFmX2VudHJ5J3MgKi8KLQkJX191aW50MTZfdCB1c2VkYnl0ZXM7CS8qIG51bSBieXRlcyBvZiBuYW1lcy92YWx1ZXMgc3RvcmVkICovCi0JCV9fdWludDE2X3QgZmlyc3R1c2VkOwkvKiBmaXJzdCB1c2VkIGJ5dGUgaW4gbmFtZSBhcmVhICovCi0JCV9fdWludDhfdCAgaG9sZXM7CS8qICE9IDAgaWYgYmxrIG5lZWRzIGNvbXBhY3Rpb24gKi8KLQkJX191aW50OF90ICBwYWQxOwotCQlzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9tYXAgewkgIC8qIFJMRSBtYXAgb2YgZnJlZSBieXRlcyAqLwotCQkJX191aW50MTZfdCBiYXNlOwkgIC8qIGJhc2Ugb2YgZnJlZSByZWdpb24gKi8KLQkJCV9fdWludDE2X3Qgc2l6ZTsJICAvKiBsZW5ndGggb2YgZnJlZSByZWdpb24gKi8KLQkJfSBmcmVlbWFwW1hGU19BVFRSX0xFQUZfTUFQU0laRV07IC8qIE4gbGFyZ2VzdCBmcmVlIHJlZ2lvbnMgKi8KLQl9IGhkcjsKLQlzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9lbnRyeSB7CS8qIHNvcnRlZCBvbiBrZXksIG5vdCBuYW1lICovCi0JCXhmc19kYWhhc2hfdCBoYXNodmFsOwkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgKi8KLQkJX191aW50MTZfdCBuYW1laWR4OwkvKiBpbmRleCBpbnRvIGJ1ZmZlciBvZiBuYW1lL3ZhbHVlICovCi0JCV9fdWludDhfdCBmbGFnczsJLyogTE9DQUwvUk9PVC9TRUNVUkUvSU5DT01QTEVURSBmbGFnICovCi0JCV9fdWludDhfdCBwYWQyOwkJLyogdW51c2VkIHBhZCBieXRlICovCi0JfSBlbnRyaWVzWzFdOwkJCS8qIHZhcmlhYmxlIHNpemVkIGFycmF5ICovCi0Jc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbCB7Ci0JCV9fdWludDE2X3QgdmFsdWVsZW47CS8qIG51bWJlciBvZiBieXRlcyBpbiB2YWx1ZSAqLwotCQlfX3VpbnQ4X3QgbmFtZWxlbjsJLyogbGVuZ3RoIG9mIG5hbWUgYnl0ZXMgKi8KLQkJX191aW50OF90IG5hbWV2YWxbMV07CS8qIG5hbWUvdmFsdWUgYnl0ZXMgKi8KLQl9IG5hbWVsaXN0OwkJCS8qIGdyb3dzIGZyb20gYm90dG9tIG9mIGJ1ZiAqLwotCXN0cnVjdCB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlIHsKLQkJeGZzX2RhYmxrX3QgdmFsdWVibGs7CS8qIGJsb2NrIG51bWJlciBvZiB2YWx1ZSBieXRlcyAqLwotCQlfX3VpbnQzMl90IHZhbHVlbGVuOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdmFsdWUgKi8KLQkJX191aW50OF90IG5hbWVsZW47CS8qIGxlbmd0aCBvZiBuYW1lIGJ5dGVzICovCi0JCV9fdWludDhfdCBuYW1lWzFdOwkvKiBuYW1lIGJ5dGVzICovCi0JfSB2YWx1ZWxpc3Q7CQkJLyogZ3Jvd3MgZnJvbSBib3R0b20gb2YgYnVmICovCisJeGZzX2F0dHJfbGVhZl9oZHJfdAloZHI7CS8qIGNvbnN0YW50LXN0cnVjdHVyZSBoZWFkZXIgYmxvY2sgKi8KKwl4ZnNfYXR0cl9sZWFmX2VudHJ5X3QJZW50cmllc1sxXTsJLyogc29ydGVkIG9uIGtleSwgbm90IG5hbWUgKi8KKwl4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCBuYW1lbGlzdDsJLyogZ3Jvd3MgZnJvbSBib3R0b20gb2YgYnVmICovCisJeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90IHZhbHVlbGlzdDsJLyogZ3Jvd3MgZnJvbSBib3R0b20gb2YgYnVmICovCiB9IHhmc19hdHRyX2xlYWZibG9ja190OwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9oZHIgeGZzX2F0dHJfbGVhZl9oZHJfdDsKLXR5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbWFwIHhmc19hdHRyX2xlYWZfbWFwX3Q7Ci10eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9sZWFmX2VudHJ5IHhmc19hdHRyX2xlYWZfZW50cnlfdDsKLXR5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbCB4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdDsKLXR5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUgeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90OwogCiAvKgogICogRmxhZ3MgdXNlZCBpbiB0aGUgbGVhZl9lbnRyeVtpXS5mbGFncyBmaWVsZC4KQEAgLTE1MCw3ICsxNTYsOCBAQAogCQkobGVhZnApKVtJTlRfR0VUKChsZWFmcCktPmVudHJpZXNbaWR4XS5uYW1laWR4LCBBUkNIX0NPTlZFUlQpXTsKIH0KIAotI2RlZmluZSBYRlNfQVRUUl9MRUFGX05BTUUobGVhZnAsaWR4KQkJeGZzX2F0dHJfbGVhZl9uYW1lKGxlYWZwLGlkeCkKKyNkZWZpbmUgWEZTX0FUVFJfTEVBRl9OQU1FKGxlYWZwLGlkeCkJCVwKKwl4ZnNfYXR0cl9sZWFmX25hbWUobGVhZnAsaWR4KQogc3RhdGljIGlubGluZSBjaGFyICp4ZnNfYXR0cl9sZWFmX25hbWUoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWZwLCBpbnQgaWR4KQogewogCXJldHVybiAoJigoY2hhciAqKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwLmMgYi9mcy94ZnMveGZzX2JtYXAuYwppbmRleCBlNDE1YTQ2Li43MDYyNWU1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXAuYworKysgYi9mcy94ZnMveGZzX2JtYXAuYwpAQCAtMjE0NiwxMyArMjE0NiwxNzYgQEAKIAlyZXR1cm4gMDsgLyoga2VlcCBnY2MgcXVpdGUgKi8KIH0KIAorLyoKKyAqIEFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgbmV3IGV4dGVudCBiYXNlZCBvbiBkaV9leHRzaXplIGFuZCBydCBleHRzaXplLgorICovCitTVEFUSUMgaW50Cit4ZnNfYm1hcF9leHRzaXplX2FsaWduKAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfYm1idF9pcmVjX3QJKmdvdHAsCQkvKiBuZXh0IGV4dGVudCBwb2ludGVyICovCisJeGZzX2JtYnRfaXJlY190CSpwcmV2cCwJCS8qIHByZXZpb3VzIGV4dGVudCBwb2ludGVyICovCisJeGZzX2V4dGxlbl90CWV4dHN6LAkJLyogYWxpZ24gdG8gdGhpcyBleHRlbnQgc2l6ZSAqLworCWludAkJcnQsCQkvKiBpcyB0aGlzIGEgcmVhbHRpbWUgaW5vZGU/ICovCisJaW50CQllb2YsCQkvKiBpcyBleHRlbnQgYXQgZW5kLW9mLWZpbGU/ICovCisJaW50CQlkZWxheSwJCS8qIGNyZWF0aW5nIGRlbGFsbG9jIGV4dGVudD8gKi8KKwlpbnQJCWNvbnZlcnQsCS8qIG92ZXJ3cml0aW5nIHVud3JpdHRlbiBleHRlbnQ/ICovCisJeGZzX2ZpbGVvZmZfdAkqb2ZmcCwJCS8qIGluL291dDogYWxpZ25lZCBvZmZzZXQgKi8KKwl4ZnNfZXh0bGVuX3QJKmxlbnApCQkvKiBpbi9vdXQ6IGFsaWduZWQgbGVuZ3RoICovCit7CisJeGZzX2ZpbGVvZmZfdAlvcmlnX29mZjsJLyogb3JpZ2luYWwgb2Zmc2V0ICovCisJeGZzX2V4dGxlbl90CW9yaWdfYWxlbjsJLyogb3JpZ2luYWwgbGVuZ3RoICovCisJeGZzX2ZpbGVvZmZfdAlvcmlnX2VuZDsJLyogb3JpZ2luYWwgb2ZmK2xlbiAqLworCXhmc19maWxlb2ZmX3QJbmV4dG87CQkvKiBuZXh0IGZpbGUgb2Zmc2V0ICovCisJeGZzX2ZpbGVvZmZfdAlwcmV2bzsJCS8qIHByZXZpb3VzIGZpbGUgb2Zmc2V0ICovCisJeGZzX2ZpbGVvZmZfdAlhbGlnbl9vZmY7CS8qIHRlbXAgZm9yIG9mZnNldCAqLworCXhmc19leHRsZW5fdAlhbGlnbl9hbGVuOwkvKiB0ZW1wIGZvciBsZW5ndGggKi8KKwl4ZnNfZXh0bGVuX3QJdGVtcDsJCS8qIHRlbXAgZm9yIGNhbGN1bGF0aW9ucyAqLworCisJaWYgKGNvbnZlcnQpCisJCXJldHVybiAwOworCisJb3JpZ19vZmYgPSBhbGlnbl9vZmYgPSAqb2ZmcDsKKwlvcmlnX2FsZW4gPSBhbGlnbl9hbGVuID0gKmxlbnA7CisJb3JpZ19lbmQgPSBvcmlnX29mZiArIG9yaWdfYWxlbjsKKworCS8qCisJICogSWYgdGhpcyByZXF1ZXN0IG92ZXJsYXBzIGFuIGV4aXN0aW5nIGV4dGVudCwgdGhlbiBkb24ndAorCSAqIGF0dGVtcHQgdG8gcGVyZm9ybSBhbnkgYWRkaXRpb25hbCBhbGlnbm1lbnQuCisJICovCisJaWYgKCFkZWxheSAmJiAhZW9mICYmCisJICAgIChvcmlnX29mZiA+PSBnb3RwLT5icl9zdGFydG9mZikgJiYKKwkgICAgKG9yaWdfZW5kIDw9IGdvdHAtPmJyX3N0YXJ0b2ZmICsgZ290cC0+YnJfYmxvY2tjb3VudCkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgZmlsZSBvZmZzZXQgaXMgdW5hbGlnbmVkIHZzLiB0aGUgZXh0ZW50IHNpemUKKwkgKiB3ZSBuZWVkIHRvIGFsaWduIGl0LiAgVGhpcyB3aWxsIGJlIHBvc3NpYmxlIHVubGVzcworCSAqIHRoZSBmaWxlIHdhcyBwcmV2aW91c2x5IHdyaXR0ZW4gd2l0aCBhIGtlcm5lbCB0aGF0IGRpZG4ndAorCSAqIHBlcmZvcm0gdGhpcyBhbGlnbm1lbnQsIG9yIGlmIGEgdHJ1bmNhdGUgc2hvdCB1cyBpbiB0aGUKKwkgKiBmb290LgorCSAqLworCXRlbXAgPSBkb19tb2Qob3JpZ19vZmYsIGV4dHN6KTsKKwlpZiAodGVtcCkgeworCQlhbGlnbl9hbGVuICs9IHRlbXA7CisJCWFsaWduX29mZiAtPSB0ZW1wOworCX0KKwkvKgorCSAqIFNhbWUgYWRqdXN0bWVudCBmb3IgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdGVkIGFyZWEuCisJICovCisJaWYgKCh0ZW1wID0gKGFsaWduX2FsZW4gJSBleHRzeikpKSB7CisJCWFsaWduX2FsZW4gKz0gZXh0c3ogLSB0ZW1wOworCX0KKwkvKgorCSAqIElmIHRoZSBwcmV2aW91cyBibG9jayBvdmVybGFwcyB3aXRoIHRoaXMgcHJvcG9zZWQgYWxsb2NhdGlvbgorCSAqIHRoZW4gbW92ZSB0aGUgc3RhcnQgZm9yd2FyZCB3aXRob3V0IGFkanVzdGluZyB0aGUgbGVuZ3RoLgorCSAqLworCWlmIChwcmV2cC0+YnJfc3RhcnRvZmYgIT0gTlVMTEZJTEVPRkYpIHsKKwkJaWYgKHByZXZwLT5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKQorCQkJcHJldm8gPSBwcmV2cC0+YnJfc3RhcnRvZmY7CisJCWVsc2UKKwkJCXByZXZvID0gcHJldnAtPmJyX3N0YXJ0b2ZmICsgcHJldnAtPmJyX2Jsb2NrY291bnQ7CisJfSBlbHNlCisJCXByZXZvID0gMDsKKwlpZiAoYWxpZ25fb2ZmICE9IG9yaWdfb2ZmICYmIGFsaWduX29mZiA8IHByZXZvKQorCQlhbGlnbl9vZmYgPSBwcmV2bzsKKwkvKgorCSAqIElmIHRoZSBuZXh0IGJsb2NrIG92ZXJsYXBzIHdpdGggdGhpcyBwcm9wb3NlZCBhbGxvY2F0aW9uCisJICogdGhlbiBtb3ZlIHRoZSBzdGFydCBiYWNrIHdpdGhvdXQgYWRqdXN0aW5nIHRoZSBsZW5ndGgsCisJICogYnV0IG5vdCBiZWZvcmUgb2Zmc2V0IDAuCisJICogVGhpcyBtYXkgb2YgY291cnNlIG1ha2UgdGhlIHN0YXJ0IG92ZXJsYXAgcHJldmlvdXMgYmxvY2ssCisJICogYW5kIGlmIHdlIGhpdCB0aGUgb2Zmc2V0IDAgbGltaXQgdGhlbiB0aGUgbmV4dCBibG9jaworCSAqIGNhbiBzdGlsbCBvdmVybGFwIHRvby4KKwkgKi8KKwlpZiAoIWVvZiAmJiBnb3RwLT5icl9zdGFydG9mZiAhPSBOVUxMRklMRU9GRikgeworCQlpZiAoKGRlbGF5ICYmIGdvdHAtPmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spIHx8CisJCSAgICAoIWRlbGF5ICYmIGdvdHAtPmJyX3N0YXJ0YmxvY2sgPT0gREVMQVlTVEFSVEJMT0NLKSkKKwkJCW5leHRvID0gZ290cC0+YnJfc3RhcnRvZmYgKyBnb3RwLT5icl9ibG9ja2NvdW50OworCQllbHNlCisJCQluZXh0byA9IGdvdHAtPmJyX3N0YXJ0b2ZmOworCX0gZWxzZQorCQluZXh0byA9IE5VTExGSUxFT0ZGOworCWlmICghZW9mICYmCisJICAgIGFsaWduX29mZiArIGFsaWduX2FsZW4gIT0gb3JpZ19lbmQgJiYKKwkgICAgYWxpZ25fb2ZmICsgYWxpZ25fYWxlbiA+IG5leHRvKQorCQlhbGlnbl9vZmYgPSBuZXh0byA+IGFsaWduX2FsZW4gPyBuZXh0byAtIGFsaWduX2FsZW4gOiAwOworCS8qCisJICogSWYgd2UncmUgbm93IG92ZXJsYXBwaW5nIHRoZSBuZXh0IG9yIHByZXZpb3VzIGV4dGVudCB0aGF0CisJICogbWVhbnMgd2UgY2FuJ3QgZml0IGFuIGV4dHN6IHBpZWNlIGluIHRoaXMgaG9sZS4gIEp1c3QgbW92ZQorCSAqIHRoZSBzdGFydCBmb3J3YXJkIHRvIHRoZSBmaXJzdCB2YWxpZCBzcG90IGFuZCBzZXQKKwkgKiB0aGUgbGVuZ3RoIHNvIHdlIGhpdCB0aGUgZW5kLgorCSAqLworCWlmIChhbGlnbl9vZmYgIT0gb3JpZ19vZmYgJiYgYWxpZ25fb2ZmIDwgcHJldm8pCisJCWFsaWduX29mZiA9IHByZXZvOworCWlmIChhbGlnbl9vZmYgKyBhbGlnbl9hbGVuICE9IG9yaWdfZW5kICYmCisJICAgIGFsaWduX29mZiArIGFsaWduX2FsZW4gPiBuZXh0byAmJgorCSAgICBuZXh0byAhPSBOVUxMRklMRU9GRikgeworCQlBU1NFUlQobmV4dG8gPiBwcmV2byk7CisJCWFsaWduX2FsZW4gPSBuZXh0byAtIGFsaWduX29mZjsKKwl9CisKKwkvKgorCSAqIElmIHJlYWx0aW1lLCBhbmQgdGhlIHJlc3VsdCBpc24ndCBhIG11bHRpcGxlIG9mIHRoZSByZWFsdGltZQorCSAqIGV4dGVudCBzaXplIHdlIG5lZWQgdG8gcmVtb3ZlIGJsb2NrcyB1bnRpbCBpdCBpcy4KKwkgKi8KKwlpZiAocnQgJiYgKHRlbXAgPSAoYWxpZ25fYWxlbiAlIG1wLT5tX3NiLnNiX3JleHRzaXplKSkpIHsKKwkJLyoKKwkJICogV2UncmUgbm90IGNvdmVyaW5nIHRoZSBvcmlnaW5hbCByZXF1ZXN0LCBvcgorCQkgKiB3ZSB3b24ndCBiZSBhYmxlIHRvIG9uY2Ugd2UgZml4IHRoZSBsZW5ndGguCisJCSAqLworCQlpZiAob3JpZ19vZmYgPCBhbGlnbl9vZmYgfHwKKwkJICAgIG9yaWdfZW5kID4gYWxpZ25fb2ZmICsgYWxpZ25fYWxlbiB8fAorCQkgICAgYWxpZ25fYWxlbiAtIHRlbXAgPCBvcmlnX2FsZW4pCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJCS8qCisJCSAqIFRyeSB0byBmaXggaXQgYnkgbW92aW5nIHRoZSBzdGFydCB1cC4KKwkJICovCisJCWlmIChhbGlnbl9vZmYgKyB0ZW1wIDw9IG9yaWdfb2ZmKSB7CisJCQlhbGlnbl9hbGVuIC09IHRlbXA7CisJCQlhbGlnbl9vZmYgKz0gdGVtcDsKKwkJfQorCQkvKgorCQkgKiBUcnkgdG8gZml4IGl0IGJ5IG1vdmluZyB0aGUgZW5kIGluLgorCQkgKi8KKwkJZWxzZSBpZiAoYWxpZ25fb2ZmICsgYWxpZ25fYWxlbiAtIHRlbXAgPj0gb3JpZ19lbmQpCisJCQlhbGlnbl9hbGVuIC09IHRlbXA7CisJCS8qCisJCSAqIFNldCB0aGUgc3RhcnQgdG8gdGhlIG1pbmltdW0gdGhlbiB0cmltIHRoZSBsZW5ndGguCisJCSAqLworCQllbHNlIHsKKwkJCWFsaWduX2FsZW4gLT0gb3JpZ19vZmYgLSBhbGlnbl9vZmY7CisJCQlhbGlnbl9vZmYgPSBvcmlnX29mZjsKKwkJCWFsaWduX2FsZW4gLT0gYWxpZ25fYWxlbiAlIG1wLT5tX3NiLnNiX3JleHRzaXplOworCQl9CisJCS8qCisJCSAqIFJlc3VsdCBkb2Vzbid0IGNvdmVyIHRoZSByZXF1ZXN0LCBmYWlsIGl0LgorCQkgKi8KKwkJaWYgKG9yaWdfb2ZmIDwgYWxpZ25fb2ZmIHx8IG9yaWdfZW5kID4gYWxpZ25fb2ZmICsgYWxpZ25fYWxlbikKKwkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9IGVsc2UgeworCQlBU1NFUlQob3JpZ19vZmYgPj0gYWxpZ25fb2ZmKTsKKwkJQVNTRVJUKG9yaWdfZW5kIDw9IGFsaWduX29mZiArIGFsaWduX2FsZW4pOworCX0KKworI2lmZGVmIERFQlVHCisJaWYgKCFlb2YgJiYgZ290cC0+YnJfc3RhcnRvZmYgIT0gTlVMTEZJTEVPRkYpCisJCUFTU0VSVChhbGlnbl9vZmYgKyBhbGlnbl9hbGVuIDw9IGdvdHAtPmJyX3N0YXJ0b2ZmKTsKKwlpZiAocHJldnAtPmJyX3N0YXJ0b2ZmICE9IE5VTExGSUxFT0ZGKQorCQlBU1NFUlQoYWxpZ25fb2ZmID49IHByZXZwLT5icl9zdGFydG9mZiArIHByZXZwLT5icl9ibG9ja2NvdW50KTsKKyNlbmRpZgorCisJKmxlbnAgPSBhbGlnbl9hbGVuOworCSpvZmZwID0gYWxpZ25fb2ZmOworCXJldHVybiAwOworfQorCiAjZGVmaW5lIFhGU19BTExPQ19HQVBfVU5JVFMJNAogCiAvKgogICogeGZzX2JtYXBfYWxsb2MgaXMgY2FsbGVkIGJ5IHhmc19ibWFwaSB0byBhbGxvY2F0ZSBhbiBleHRlbnQgZm9yIGEgZmlsZS4KICAqIEl0IGZpZ3VyZXMgb3V0IHdoZXJlIHRvIGFzayB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3IgdG8gcHV0IHRoZSBuZXcgZXh0ZW50LgogICovCi1TVEFUSUMgaW50CQkJCS8qIGVycm9yICovCitTVEFUSUMgaW50CiB4ZnNfYm1hcF9hbGxvYygKIAl4ZnNfYm1hbGxvY2FfdAkqYXApCQkvKiBibWFwIGFsbG9jIGFyZ3VtZW50IHN0cnVjdCAqLwogewpAQCAtMjE2MywxMCArMjMyNiwxMCBAQAogCXhmc19tb3VudF90CSptcDsJCS8qIG1vdW50IHBvaW50IHN0cnVjdHVyZSAqLwogCWludAkJbnVsbGZiOwkJLyogdHJ1ZSBpZiBhcC0+Zmlyc3RibG9jayBpc24ndCBzZXQgKi8KIAlpbnQJCXJ0OwkJLyogdHJ1ZSBpZiBpbm9kZSBpcyByZWFsdGltZSAqLwotI2lmZGVmIF9fS0VSTkVMX18KLQl4ZnNfZXh0bGVuX3QJcHJvZD0wOwkJLyogcHJvZHVjdCBmYWN0b3IgZm9yIGFsbG9jYXRvcnMgKi8KLQl4ZnNfZXh0bGVuX3QJcmFsZW49MDsJLyogcmVhbHRpbWUgYWxsb2NhdGlvbiBsZW5ndGggKi8KLSNlbmRpZgorCXhmc19leHRsZW5fdAlwcm9kID0gMDsJLyogcHJvZHVjdCBmYWN0b3IgZm9yIGFsbG9jYXRvcnMgKi8KKwl4ZnNfZXh0bGVuX3QJcmFsZW4gPSAwOwkvKiByZWFsdGltZSBhbGxvY2F0aW9uIGxlbmd0aCAqLworCXhmc19leHRsZW5fdAlhbGlnbjsJCS8qIG1pbmltdW0gYWxsb2NhdGlvbiBhbGlnbm1lbnQgKi8KKwl4ZnNfcnRibG9ja190CXJ0eDsKIAogI2RlZmluZQlJU1ZBTElEKHgseSkJXAogCShydCA/IFwKQEAgLTIxODIsMTI1ICsyMzQ1LDI1IEBACiAJbnVsbGZiID0gYXAtPmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0s7CiAJcnQgPSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoYXAtPmlwKSAmJiBhcC0+dXNlcmRhdGE7CiAJZmJfYWdubyA9IG51bGxmYiA/IE5VTExBR05VTUJFUiA6IFhGU19GU0JfVE9fQUdOTyhtcCwgYXAtPmZpcnN0YmxvY2spOwotI2lmZGVmIF9fS0VSTkVMX18KIAlpZiAocnQpIHsKLQkJeGZzX2V4dGxlbl90CWV4dHN6OwkJLyogZmlsZSBleHRlbnQgc2l6ZSBmb3IgcnQgKi8KLQkJeGZzX2ZpbGVvZmZfdAluZXh0bzsJCS8qIG5leHQgZmlsZSBvZmZzZXQgKi8KLQkJeGZzX2V4dGxlbl90CW9yaWdfYWxlbjsJLyogb3JpZ2luYWwgYXAtPmFsZW4gKi8KLQkJeGZzX2ZpbGVvZmZfdAlvcmlnX2VuZDsJLyogb3JpZ2luYWwgb2ZmK2xlbiAqLwotCQl4ZnNfZmlsZW9mZl90CW9yaWdfb2ZmOwkvKiBvcmlnaW5hbCBhcC0+b2ZmICovCi0JCXhmc19leHRsZW5fdAltb2Rfb2ZmOwkvKiBtb2R1bHVzIGNhbGN1bGF0aW9ucyAqLwotCQl4ZnNfZmlsZW9mZl90CXByZXZvOwkJLyogcHJldmlvdXMgZmlsZSBvZmZzZXQgKi8KLQkJeGZzX3J0YmxvY2tfdAlydHg7CQkvKiByZWFsdGltZSBleHRlbnQgbnVtYmVyICovCi0JCXhmc19leHRsZW5fdAl0ZW1wOwkJLyogdGVtcCBmb3IgcnQgY2FsY3VsYXRpb25zICovCisJCWFsaWduID0gYXAtPmlwLT5pX2QuZGlfZXh0c2l6ZSA/CisJCQlhcC0+aXAtPmlfZC5kaV9leHRzaXplIDogbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJCS8qIFNldCBwcm9kIHRvIG1hdGNoIHRoZSBleHRlbnQgc2l6ZSAqLworCQlwcm9kID0gYWxpZ24gLyBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKIAotCQkvKgotCQkgKiBTZXQgcHJvZCB0byBtYXRjaCB0aGUgcmVhbHRpbWUgZXh0ZW50IHNpemUuCi0JCSAqLwotCQlpZiAoIShleHRzeiA9IGFwLT5pcC0+aV9kLmRpX2V4dHNpemUpKQotCQkJZXh0c3ogPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQkJcHJvZCA9IGV4dHN6IC8gbXAtPm1fc2Iuc2JfcmV4dHNpemU7Ci0JCW9yaWdfb2ZmID0gYXAtPm9mZjsKLQkJb3JpZ19hbGVuID0gYXAtPmFsZW47Ci0JCW9yaWdfZW5kID0gb3JpZ19vZmYgKyBvcmlnX2FsZW47Ci0JCS8qCi0JCSAqIElmIHRoZSBmaWxlIG9mZnNldCBpcyB1bmFsaWduZWQgdnMuIHRoZSBleHRlbnQgc2l6ZQotCQkgKiB3ZSBuZWVkIHRvIGFsaWduIGl0LiAgVGhpcyB3aWxsIGJlIHBvc3NpYmxlIHVubGVzcwotCQkgKiB0aGUgZmlsZSB3YXMgcHJldmlvdXNseSB3cml0dGVuIHdpdGggYSBrZXJuZWwgdGhhdCBkaWRuJ3QKLQkJICogcGVyZm9ybSB0aGlzIGFsaWdubWVudC4KLQkJICovCi0JCW1vZF9vZmYgPSBkb19tb2Qob3JpZ19vZmYsIGV4dHN6KTsKLQkJaWYgKG1vZF9vZmYpIHsKLQkJCWFwLT5hbGVuICs9IG1vZF9vZmY7Ci0JCQlhcC0+b2ZmIC09IG1vZF9vZmY7Ci0JCX0KLQkJLyoKLQkJICogU2FtZSBhZGp1c3RtZW50IGZvciB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0ZWQgYXJlYS4KLQkJICovCi0JCWlmICgodGVtcCA9IChhcC0+YWxlbiAlIGV4dHN6KSkpCi0JCQlhcC0+YWxlbiArPSBleHRzeiAtIHRlbXA7Ci0JCS8qCi0JCSAqIElmIHRoZSBwcmV2aW91cyBibG9jayBvdmVybGFwcyB3aXRoIHRoaXMgcHJvcG9zZWQgYWxsb2NhdGlvbgotCQkgKiB0aGVuIG1vdmUgdGhlIHN0YXJ0IGZvcndhcmQgd2l0aG91dCBhZGp1c3RpbmcgdGhlIGxlbmd0aC4KLQkJICovCi0JCXByZXZvID0KLQkJCWFwLT5wcmV2cC0+YnJfc3RhcnRvZmYgPT0gTlVMTEZJTEVPRkYgPwotCQkJCTAgOgotCQkJCShhcC0+cHJldnAtPmJyX3N0YXJ0b2ZmICsKLQkJCQkgYXAtPnByZXZwLT5icl9ibG9ja2NvdW50KTsKLQkJaWYgKGFwLT5vZmYgIT0gb3JpZ19vZmYgJiYgYXAtPm9mZiA8IHByZXZvKQotCQkJYXAtPm9mZiA9IHByZXZvOwotCQkvKgotCQkgKiBJZiB0aGUgbmV4dCBibG9jayBvdmVybGFwcyB3aXRoIHRoaXMgcHJvcG9zZWQgYWxsb2NhdGlvbgotCQkgKiB0aGVuIG1vdmUgdGhlIHN0YXJ0IGJhY2sgd2l0aG91dCBhZGp1c3RpbmcgdGhlIGxlbmd0aCwKLQkJICogYnV0IG5vdCBiZWZvcmUgb2Zmc2V0IDAuCi0JCSAqIFRoaXMgbWF5IG9mIGNvdXJzZSBtYWtlIHRoZSBzdGFydCBvdmVybGFwIHByZXZpb3VzIGJsb2NrLAotCQkgKiBhbmQgaWYgd2UgaGl0IHRoZSBvZmZzZXQgMCBsaW1pdCB0aGVuIHRoZSBuZXh0IGJsb2NrCi0JCSAqIGNhbiBzdGlsbCBvdmVybGFwIHRvby4KLQkJICovCi0JCW5leHRvID0gKGFwLT5lb2YgfHwgYXAtPmdvdHAtPmJyX3N0YXJ0b2ZmID09IE5VTExGSUxFT0ZGKSA/Ci0JCQlOVUxMRklMRU9GRiA6IGFwLT5nb3RwLT5icl9zdGFydG9mZjsKLQkJaWYgKCFhcC0+ZW9mICYmCi0JCSAgICBhcC0+b2ZmICsgYXAtPmFsZW4gIT0gb3JpZ19lbmQgJiYKLQkJICAgIGFwLT5vZmYgKyBhcC0+YWxlbiA+IG5leHRvKQotCQkJYXAtPm9mZiA9IG5leHRvID4gYXAtPmFsZW4gPyBuZXh0byAtIGFwLT5hbGVuIDogMDsKLQkJLyoKLQkJICogSWYgd2UncmUgbm93IG92ZXJsYXBwaW5nIHRoZSBuZXh0IG9yIHByZXZpb3VzIGV4dGVudCB0aGF0Ci0JCSAqIG1lYW5zIHdlIGNhbid0IGZpdCBhbiBleHRzeiBwaWVjZSBpbiB0aGlzIGhvbGUuICBKdXN0IG1vdmUKLQkJICogdGhlIHN0YXJ0IGZvcndhcmQgdG8gdGhlIGZpcnN0IHZhbGlkIHNwb3QgYW5kIHNldAotCQkgKiB0aGUgbGVuZ3RoIHNvIHdlIGhpdCB0aGUgZW5kLgotCQkgKi8KLQkJaWYgKChhcC0+b2ZmICE9IG9yaWdfb2ZmICYmIGFwLT5vZmYgPCBwcmV2bykgfHwKLQkJICAgIChhcC0+b2ZmICsgYXAtPmFsZW4gIT0gb3JpZ19lbmQgJiYKLQkJICAgICBhcC0+b2ZmICsgYXAtPmFsZW4gPiBuZXh0bykpIHsKLQkJCWFwLT5vZmYgPSBwcmV2bzsKLQkJCWFwLT5hbGVuID0gbmV4dG8gLSBwcmV2bzsKLQkJfQotCQkvKgotCQkgKiBJZiB0aGUgcmVzdWx0IGlzbid0IGEgbXVsdGlwbGUgb2YgcnRleHRlbnRzIHdlIG5lZWQgdG8KLQkJICogcmVtb3ZlIGJsb2NrcyB1bnRpbCBpdCBpcy4KLQkJICovCi0JCWlmICgodGVtcCA9IChhcC0+YWxlbiAlIG1wLT5tX3NiLnNiX3JleHRzaXplKSkpIHsKLQkJCS8qCi0JCQkgKiBXZSdyZSBub3QgY292ZXJpbmcgdGhlIG9yaWdpbmFsIHJlcXVlc3QsIG9yCi0JCQkgKiB3ZSB3b24ndCBiZSBhYmxlIHRvIG9uY2Ugd2UgZml4IHRoZSBsZW5ndGguCi0JCQkgKi8KLQkJCWlmIChvcmlnX29mZiA8IGFwLT5vZmYgfHwKLQkJCSAgICBvcmlnX2VuZCA+IGFwLT5vZmYgKyBhcC0+YWxlbiB8fAotCQkJICAgIGFwLT5hbGVuIC0gdGVtcCA8IG9yaWdfYWxlbikKLQkJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7Ci0JCQkvKgotCQkJICogVHJ5IHRvIGZpeCBpdCBieSBtb3ZpbmcgdGhlIHN0YXJ0IHVwLgotCQkJICovCi0JCQlpZiAoYXAtPm9mZiArIHRlbXAgPD0gb3JpZ19vZmYpIHsKLQkJCQlhcC0+YWxlbiAtPSB0ZW1wOwotCQkJCWFwLT5vZmYgKz0gdGVtcDsKLQkJCX0KLQkJCS8qCi0JCQkgKiBUcnkgdG8gZml4IGl0IGJ5IG1vdmluZyB0aGUgZW5kIGluLgotCQkJICovCi0JCQllbHNlIGlmIChhcC0+b2ZmICsgYXAtPmFsZW4gLSB0ZW1wID49IG9yaWdfZW5kKQotCQkJCWFwLT5hbGVuIC09IHRlbXA7Ci0JCQkvKgotCQkJICogU2V0IHRoZSBzdGFydCB0byB0aGUgbWluaW11bSB0aGVuIHRyaW0gdGhlIGxlbmd0aC4KLQkJCSAqLwotCQkJZWxzZSB7Ci0JCQkJYXAtPmFsZW4gLT0gb3JpZ19vZmYgLSBhcC0+b2ZmOwotCQkJCWFwLT5vZmYgPSBvcmlnX29mZjsKLQkJCQlhcC0+YWxlbiAtPSBhcC0+YWxlbiAlIG1wLT5tX3NiLnNiX3JleHRzaXplOwotCQkJfQotCQkJLyoKLQkJCSAqIFJlc3VsdCBkb2Vzbid0IGNvdmVyIHRoZSByZXF1ZXN0LCBmYWlsIGl0LgotCQkJICovCi0JCQlpZiAob3JpZ19vZmYgPCBhcC0+b2ZmIHx8IG9yaWdfZW5kID4gYXAtPm9mZiArIGFwLT5hbGVuKQotCQkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKLQkJfQorCQllcnJvciA9IHhmc19ibWFwX2V4dHNpemVfYWxpZ24obXAsIGFwLT5nb3RwLCBhcC0+cHJldnAsCisJCQkJCQlhbGlnbiwgcnQsIGFwLT5lb2YsIDAsCisJCQkJCQlhcC0+Y29udiwgJmFwLT5vZmYsICZhcC0+YWxlbik7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJQVNTRVJUKGFwLT5hbGVuKTsKIAkJQVNTRVJUKGFwLT5hbGVuICUgbXAtPm1fc2Iuc2JfcmV4dHNpemUgPT0gMCk7CisKIAkJLyoKIAkJICogSWYgdGhlIG9mZnNldCAmIGxlbmd0aCBhcmUgbm90IHBlcmZlY3RseSBhbGlnbmVkCiAJCSAqIHRoZW4ga2lsbCBwcm9kLCBpdCB3aWxsIGp1c3QgZ2V0IHVzIGluIHRyb3VibGUuCiAJCSAqLwotCQlpZiAoZG9fbW9kKGFwLT5vZmYsIGV4dHN6KSB8fCBhcC0+YWxlbiAlIGV4dHN6KQorCQlpZiAoZG9fbW9kKGFwLT5vZmYsIGFsaWduKSB8fCBhcC0+YWxlbiAlIGFsaWduKQogCQkJcHJvZCA9IDE7CiAJCS8qCiAJCSAqIFNldCByYWxlbiB0byBiZSB0aGUgYWN0dWFsIHJlcXVlc3RlZCBsZW5ndGggaW4gcnRleHRlbnRzLgpAQCAtMjMyNiwxNSArMjM4OSwyNCBAQAogCQkJYXAtPnJ2YWwgPSBydHggKiBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKIAkJfSBlbHNlCiAJCQlhcC0+cnZhbCA9IDA7CisJfSBlbHNlIHsKKwkJYWxpZ24gPSAoYXAtPnVzZXJkYXRhICYmIGFwLT5pcC0+aV9kLmRpX2V4dHNpemUgJiYKKwkJCShhcC0+aXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfRVhUU0laRSkpID8KKwkJCWFwLT5pcC0+aV9kLmRpX2V4dHNpemUgOiAwOworCQlpZiAodW5saWtlbHkoYWxpZ24pKSB7CisJCQllcnJvciA9IHhmc19ibWFwX2V4dHNpemVfYWxpZ24obXAsIGFwLT5nb3RwLCBhcC0+cHJldnAsCisJCQkJCQkJYWxpZ24sIHJ0LAorCQkJCQkJCWFwLT5lb2YsIDAsIGFwLT5jb252LAorCQkJCQkJCSZhcC0+b2ZmLCAmYXAtPmFsZW4pOworCQkJQVNTRVJUKCFlcnJvcik7CisJCQlBU1NFUlQoYXAtPmFsZW4pOworCQl9CisJCWlmIChudWxsZmIpCisJCQlhcC0+cnZhbCA9IFhGU19JTk9fVE9fRlNCKG1wLCBhcC0+aXAtPmlfaW5vKTsKKwkJZWxzZQorCQkJYXAtPnJ2YWwgPSBhcC0+Zmlyc3RibG9jazsKIAl9Ci0jZWxzZQotCWlmIChydCkKLQkJYXAtPnJ2YWwgPSAwOwotI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KLQllbHNlIGlmIChudWxsZmIpCi0JCWFwLT5ydmFsID0gWEZTX0lOT19UT19GU0IobXAsIGFwLT5pcC0+aV9pbm8pOwotCWVsc2UKLQkJYXAtPnJ2YWwgPSBhcC0+Zmlyc3RibG9jazsKKwogCS8qCiAJICogSWYgYWxsb2NhdGluZyBhdCBlb2YsIGFuZCB0aGVyZSdzIGEgcHJldmlvdXMgcmVhbCBibG9jaywKIAkgKiB0cnkgdG8gdXNlIGl0J3MgbGFzdCBibG9jayBhcyBvdXIgc3RhcnRpbmcgcG9pbnQuCkBAIC0yNTk4LDExICsyNjcwLDEyIEBACiAJCQlhcmdzLnRvdGFsID0gYXAtPnRvdGFsOwogCQkJYXJncy5taW5sZW4gPSBhcC0+bWlubGVuOwogCQl9Ci0JCWlmIChhcC0+aXAtPmlfZC5kaV9leHRzaXplKSB7CisJCWlmICh1bmxpa2VseShhcC0+dXNlcmRhdGEgJiYgYXAtPmlwLT5pX2QuZGlfZXh0c2l6ZSAmJgorCQkJICAgIChhcC0+aXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfRVhUU0laRSkpKSB7CiAJCQlhcmdzLnByb2QgPSBhcC0+aXAtPmlfZC5kaV9leHRzaXplOwogCQkJaWYgKChhcmdzLm1vZCA9ICh4ZnNfZXh0bGVuX3QpZG9fbW9kKGFwLT5vZmYsIGFyZ3MucHJvZCkpKQogCQkJCWFyZ3MubW9kID0gKHhmc19leHRsZW5fdCkoYXJncy5wcm9kIC0gYXJncy5tb2QpOwotCQl9IGVsc2UgaWYgKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSA+PSBOQlBQKSB7CisJCX0gZWxzZSBpZiAodW5saWtlbHkobXAtPm1fc2Iuc2JfYmxvY2tzaXplID49IE5CUFApKSB7CiAJCQlhcmdzLnByb2QgPSAxOwogCQkJYXJncy5tb2QgPSAwOwogCQl9IGVsc2UgewpAQCAtMzU4MCwxNCArMzY1MywxNiBAQAogCiAJZXAgPSB4ZnNfYm1hcF9kb19zZWFyY2hfZXh0ZW50cyhiYXNlLCBsYXN0eCwgbmV4dGVudHMsIGJubywgZW9mcCwKIAkJCQkJICBsYXN0eHAsIGdvdHAsIHByZXZwKTsKLQlydCA9IGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FOwotCWlmKCFydCAmJiAhZ290cC0+YnJfc3RhcnRibG9jayAmJiAoKmxhc3R4cCAhPSBOVUxMRVhUTlVNKSkgeworCXJ0ID0gKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSAmJiBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOworCWlmICh1bmxpa2VseSghcnQgJiYgIWdvdHAtPmJyX3N0YXJ0YmxvY2sgJiYgKCpsYXN0eHAgIT0gTlVMTEVYVE5VTSkpKSB7CiAgICAgICAgICAgICAgICAgY21uX2VycihDRV9QQU5JQywiQWNjZXNzIHRvIGJsb2NrIHplcm86IGZzOiA8JXM+IGlub2RlOiAlbGxkICIKIAkJCSJzdGFydF9ibG9jayA6ICVsbHggc3RhcnRfb2ZmIDogJWxseCBibGtjbnQgOiAlbGx4ICIKIAkJCSJleHRlbnQtc3RhdGUgOiAleCBcbiIsCi0JCQkoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwobG9uZyBsb25nKWlwLT5pX2lubywKLQkJCWdvdHAtPmJyX3N0YXJ0YmxvY2ssIGdvdHAtPmJyX3N0YXJ0b2ZmLAotCQkJZ290cC0+YnJfYmxvY2tjb3VudCxnb3RwLT5icl9zdGF0ZSk7CisJCQkoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwgKGxvbmcgbG9uZylpcC0+aV9pbm8sCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWdvdHAtPmJyX3N0YXJ0YmxvY2ssCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWdvdHAtPmJyX3N0YXJ0b2ZmLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylnb3RwLT5icl9ibG9ja2NvdW50LAorCQkJZ290cC0+YnJfc3RhdGUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBlcDsKIH0KQEAgLTM4NzUsNyArMzk1MCw3IEBACiAJCWlwLT5pX2QuZGlfZm9ya29mZiA9IHhmc19hdHRyX3Nob3J0Zm9ybV9ieXRlc2ZpdChpcCwgc2l6ZSk7CiAJCWlmICghaXAtPmlfZC5kaV9mb3Jrb2ZmKQogCQkJaXAtPmlfZC5kaV9mb3Jrb2ZmID0gbXAtPm1fYXR0cm9mZnNldCA+PiAzOwotCQllbHNlIGlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0NPTVBBVF9BVFRSKSkKKwkJZWxzZSBpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpCiAJCQl2ZXJzaW9uID0gMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTQwMjMsMTMgKzQwOTgsMTMgQEAKIAkgKi8KIAlpZiAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspIHsKIAkJbWF4bGVhZmVudHMgPSBNQVhFWFROVU07Ci0JCXN6ID0gKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0NPTVBBVF9BVFRSKSA/Ci0JCQltcC0+bV9hdHRyb2Zmc2V0IDogWEZTX0JNRFJfU1BBQ0VfQ0FMQyhNSU5EQlRQVFJTKTsKKwkJc3ogPSAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpID8KKwkJCVhGU19CTURSX1NQQUNFX0NBTEMoTUlOREJUUFRSUykgOiBtcC0+bV9hdHRyb2Zmc2V0OwogCX0gZWxzZSB7CiAJCW1heGxlYWZlbnRzID0gTUFYQUVYVE5VTTsKLQkJc3ogPSAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQ09NUEFUX0FUVFIpID8KLQkJCW1wLT5tX3NiLnNiX2lub2Rlc2l6ZSAtIG1wLT5tX2F0dHJvZmZzZXQgOgotCQkJWEZTX0JNRFJfU1BBQ0VfQ0FMQyhNSU5BQlRQVFJTKTsKKwkJc3ogPSAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpID8KKwkJCVhGU19CTURSX1NQQUNFX0NBTEMoTUlOQUJUUFRSUykgOgorCQkJbXAtPm1fc2Iuc2JfaW5vZGVzaXplIC0gbXAtPm1fYXR0cm9mZnNldDsKIAl9CiAJbWF4cm9vdHJlY3MgPSAoaW50KVhGU19CVFJFRV9CTE9DS19NQVhSRUNTKHN6LCB4ZnNfYm1kciwgMCk7CiAJbWlubGVhZnJlY3MgPSBtcC0+bV9ibWFwX2RtbnJbMF07CkBAIC00NDE4LDggKzQ0OTMsOCBAQAogCQludW1fcmVjcyA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsKIAkJaWYgKHVubGlrZWx5KGkgKyBudW1fcmVjcyA+IHJvb20pKSB7CiAJCQlBU1NFUlQoaSArIG51bV9yZWNzIDw9IHJvb20pOwotCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCi0JCQkJImNvcnJ1cHQgZGlub2RlICVMdSwgKGJ0cmVlIGV4dGVudHMpLiAgVW5tb3VudCBhbmQgcnVuIHhmc19yZXBhaXIuIiwKKwkJCXhmc19mc19yZXBhaXJfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCQkiY29ycnVwdCBkaW5vZGUgJUx1LCAoYnRyZWUgZXh0ZW50cykuIiwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpcC0+aV9pbm8pOwogCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBfcmVhZF9leHRlbnRzKDEpIiwKIAkJCQkJIFhGU19FUlJMRVZFTF9MT1csCkBAIC00NTkwLDYgKzQ2NjUsNyBAQAogCWNoYXIJCWNvbnRpZzsJCS8qIGFsbG9jYXRpb24gbXVzdCBiZSBvbmUgZXh0ZW50ICovCiAJY2hhcgkJZGVsYXk7CQkvKiB0aGlzIHJlcXVlc3QgaXMgZm9yIGRlbGF5ZWQgYWxsb2MgKi8KIAljaGFyCQlleGFjdDsJCS8qIGRvbid0IGRvIGFsbCBvZiB3YXNkZWxheWVkIGV4dGVudCAqLworCWNoYXIJCWNvbnZlcnQ7CS8qIHVud3JpdHRlbiBleHRlbnQgSS9PIGNvbXBsZXRpb24gKi8KIAl4ZnNfYm1idF9yZWNfdAkqZXA7CQkvKiBleHRlbnQgbGlzdCBlbnRyeSBwb2ludGVyICovCiAJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiAqLwogCXhmc19ibWJ0X2lyZWNfdAlnb3Q7CQkvKiBjdXJyZW50IGV4dGVudCBsaXN0IHJlY29yZCAqLwpAQCAtNDY0Myw3ICs0NzE5LDcgQEAKIAl9CiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7Ci0JcnQgPSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOworCXJ0ID0gKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSAmJiBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOwogCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CiAJQVNTRVJUKGlmcC0+aWZfZXh0X21heCA9PQogCSAgICAgICBYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOwpAQCAtNDY1NCw2ICs0NzMwLDcgQEAKIAlkZWxheSA9IChmbGFncyAmIFhGU19CTUFQSV9ERUxBWSkgIT0gMDsKIAl0cmltID0gKGZsYWdzICYgWEZTX0JNQVBJX0VOVElSRSkgPT0gMDsKIAl1c2VyZGF0YSA9IChmbGFncyAmIFhGU19CTUFQSV9NRVRBREFUQSkgPT0gMDsKKwljb252ZXJ0ID0gKGZsYWdzICYgWEZTX0JNQVBJX0NPTlZFUlQpICE9IDA7CiAJZXhhY3QgPSAoZmxhZ3MgJiBYRlNfQk1BUElfRVhBQ1QpICE9IDA7CiAJcnN2ZCA9IChmbGFncyAmIFhGU19CTUFQSV9SU1ZCTE9DS1MpICE9IDA7CiAJY29udGlnID0gKGZsYWdzICYgWEZTX0JNQVBJX0NPTlRJRykgIT0gMDsKQEAgLTQ3NDgsMTUgKzQ4MjUsMjUgQEAKIAkJCX0KIAkJCW1pbmxlbiA9IGNvbnRpZyA/IGFsZW4gOiAxOwogCQkJaWYgKGRlbGF5KSB7Ci0JCQkJeGZzX2V4dGxlbl90CWV4dHN6ID0gMDsKKwkJCQl4ZnNfZXh0bGVuX3QJZXh0c3o7CiAKIAkJCQkvKiBGaWd1cmUgb3V0IHRoZSBleHRlbnQgc2l6ZSwgYWRqdXN0IGFsZW4gKi8KIAkJCQlpZiAocnQpIHsKIAkJCQkJaWYgKCEoZXh0c3ogPSBpcC0+aV9kLmRpX2V4dHNpemUpKQogCQkJCQkJZXh0c3ogPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQkJCQkJYWxlbiA9IHJvdW5kdXAoYWxlbiwgZXh0c3opOwotCQkJCQlleHRzeiA9IGFsZW4gLyBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlleHRzeiA9IGlwLT5pX2QuZGlfZXh0c2l6ZTsKIAkJCQl9CisJCQkJaWYgKGV4dHN6KSB7CisJCQkJCWVycm9yID0geGZzX2JtYXBfZXh0c2l6ZV9hbGlnbihtcCwKKwkJCQkJCQkmZ290LCAmcHJldiwgZXh0c3osCisJCQkJCQkJcnQsIGVvZiwgZGVsYXksIGNvbnZlcnQsCisJCQkJCQkJJmFvZmYsICZhbGVuKTsKKwkJCQkJQVNTRVJUKCFlcnJvcik7CisJCQkJfQorCisJCQkJaWYgKHJ0KQorCQkJCQlleHRzeiA9IGFsZW4gLyBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKIAogCQkJCS8qCiAJCQkJICogTWFrZSBhIHRyYW5zYWN0aW9uLWxlc3MgcXVvdGEgcmVzZXJ2YXRpb24gZm9yCkBAIC00Nzg1LDMyICs0ODcyLDMzIEBACiAJCQkJCXhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgYWxlbik7CiAJCQkJQVNTRVJUKGluZGxlbiA+IDApOwogCi0JCQkJaWYgKHJ0KQorCQkJCWlmIChydCkgewogCQkJCQllcnJvciA9IHhmc19tb2RfaW5jb3JlX3NiKG1wLAogCQkJCQkJCVhGU19TQlNfRlJFWFRFTlRTLAogCQkJCQkJCS0oZXh0c3opLCByc3ZkKTsKLQkJCQllbHNlCisJCQkJfSBlbHNlIHsKIAkJCQkJZXJyb3IgPSB4ZnNfbW9kX2luY29yZV9zYihtcCwKIAkJCQkJCQlYRlNfU0JTX0ZEQkxPQ0tTLAogCQkJCQkJCS0oYWxlbiksIHJzdmQpOworCQkJCX0KIAkJCQlpZiAoIWVycm9yKSB7CiAJCQkJCWVycm9yID0geGZzX21vZF9pbmNvcmVfc2IobXAsCiAJCQkJCQkJWEZTX1NCU19GREJMT0NLUywKIAkJCQkJCQktKGluZGxlbiksIHJzdmQpOwotCQkJCQlpZiAoZXJyb3IgJiYgcnQpIHsKLQkJCQkJCXhmc19tb2RfaW5jb3JlX3NiKGlwLT5pX21vdW50LAorCQkJCQlpZiAoZXJyb3IgJiYgcnQpCisJCQkJCQl4ZnNfbW9kX2luY29yZV9zYihtcCwKIAkJCQkJCQlYRlNfU0JTX0ZSRVhURU5UUywKIAkJCQkJCQlleHRzeiwgcnN2ZCk7Ci0JCQkJCX0gZWxzZSBpZiAoZXJyb3IpIHsKLQkJCQkJCXhmc19tb2RfaW5jb3JlX3NiKGlwLT5pX21vdW50LAorCQkJCQllbHNlIGlmIChlcnJvcikKKwkJCQkJCXhmc19tb2RfaW5jb3JlX3NiKG1wLAogCQkJCQkJCVhGU19TQlNfRkRCTE9DS1MsCiAJCQkJCQkJYWxlbiwgcnN2ZCk7Ci0JCQkJCX0KIAkJCQl9CiAKIAkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJaWYgKFhGU19JU19RVU9UQV9PTihpcC0+aV9tb3VudCkpCisJCQkJCWlmIChYRlNfSVNfUVVPVEFfT04obXApKQogCQkJCQkJLyogdW5yZXNlcnZlIHRoZSBibG9ja3Mgbm93ICovCisJCQkJCQkodm9pZCkKIAkJCQkJCVhGU19UUkFOU19VTlJFU0VSVkVfUVVPVEFfTkJMS1MoCiAJCQkJCQkJbXAsIE5VTEwsIGlwLAogCQkJCQkJCShsb25nKWFsZW4sIDAsIHJ0ID8KQEAgLTQ4NDksNiArNDkzNyw3IEBACiAJCQkJYm1hLmZpcnN0YmxvY2sgPSAqZmlyc3RibG9jazsKIAkJCQlibWEuYWxlbiA9IGFsZW47CiAJCQkJYm1hLm9mZiA9IGFvZmY7CisJCQkJYm1hLmNvbnYgPSBjb252ZXJ0OwogCQkJCWJtYS53YXNkZWwgPSB3YXNkZWxheTsKIAkJCQlibWEubWlubGVuID0gbWlubGVuOwogCQkJCWJtYS5sb3cgPSBmbGlzdC0+eGJmX2xvdzsKQEAgLTUyNzAsOCArNTM1OSw3IEBACiAJCXJldHVybiAwOwogCX0KIAlYRlNfU1RBVFNfSU5DKHhzX2Jsa191bm1hcCk7Ci0JaXNydCA9ICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgJiYKLQkgICAgICAgKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKTsKKwlpc3J0ID0gKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSAmJiBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOwogCXN0YXJ0ID0gYm5vOwogCWJubyA9IHN0YXJ0ICsgbGVuIC0gMTsKIAllcCA9IHhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBibm8sIHdoaWNoZm9yaywgJmVvZiwgJmxhc3R4LCAmZ290LApAQCAtNTQ0Myw3ICs1NTMxLDcgQEAKIAkJfQogCQlpZiAod2FzZGVsKSB7CiAJCQlBU1NFUlQoU1RBUlRCTE9DS1ZBTChkZWwuYnJfc3RhcnRibG9jaykgPiAwKTsKLQkJCS8qIFVwZGF0ZSByZWFsdGltL2RhdGEgZnJlZXNwYWNlLCB1bnJlc2VydmUgcXVvdGEgKi8KKwkJCS8qIFVwZGF0ZSByZWFsdGltZS9kYXRhIGZyZWVzcGFjZSwgdW5yZXNlcnZlIHF1b3RhICovCiAJCQlpZiAoaXNydCkgewogCQkJCXhmc19maWxibGtzX3QgcnRleHRzOwogCkBAIC01NDUxLDE0ICs1NTM5LDE0IEBACiAJCQkJZG9fZGl2KHJ0ZXh0cywgbXAtPm1fc2Iuc2JfcmV4dHNpemUpOwogCQkJCXhmc19tb2RfaW5jb3JlX3NiKG1wLCBYRlNfU0JTX0ZSRVhURU5UUywKIAkJCQkJCShpbnQpcnRleHRzLCByc3ZkKTsKLQkJCQlYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9OQkxLUyhtcCwgTlVMTCwgaXAsCi0JCQkJCS0oKGxvbmcpZGVsLmJyX2Jsb2NrY291bnQpLCAwLAorCQkJCSh2b2lkKVhGU19UUkFOU19SRVNFUlZFX1FVT1RBX05CTEtTKG1wLAorCQkJCQlOVUxMLCBpcCwgLSgobG9uZylkZWwuYnJfYmxvY2tjb3VudCksIDAsCiAJCQkJCVhGU19RTU9QVF9SRVNfUlRCTEtTKTsKIAkJCX0gZWxzZSB7CiAJCQkJeGZzX21vZF9pbmNvcmVfc2IobXAsIFhGU19TQlNfRkRCTE9DS1MsCiAJCQkJCQkoaW50KWRlbC5icl9ibG9ja2NvdW50LCByc3ZkKTsKLQkJCQlYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9OQkxLUyhtcCwgTlVMTCwgaXAsCi0JCQkJCS0oKGxvbmcpZGVsLmJyX2Jsb2NrY291bnQpLCAwLAorCQkJCSh2b2lkKVhGU19UUkFOU19SRVNFUlZFX1FVT1RBX05CTEtTKG1wLAorCQkJCQlOVUxMLCBpcCwgLSgobG9uZylkZWwuYnJfYmxvY2tjb3VudCksIDAsCiAJCQkJCVhGU19RTU9QVF9SRVNfUkVHQkxLUyk7CiAJCQl9CiAJCQlpcC0+aV9kZWxheWVkX2Jsa3MgLT0gZGVsLmJyX2Jsb2NrY291bnQ7CkBAIC01NjUyLDcgKzU3NDAsOSBAQAogCQkgICBpcC0+aV9kLmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkKIAkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCWlmICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgewotCQlpZiAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUFJFQUxMT0MpIHsKKwkJaWYgKChpcC0+aV9kLmRpX2V4dHNpemUgJiYgKGlwLT5pX2QuZGlfZmxhZ3MgJgorCQkJCShYRlNfRElGTEFHX1JFQUxUSU1FfFhGU19ESUZMQUdfRVhUU0laRSkpKSB8fAorCQkgICAgaXAtPmlfZC5kaV9mbGFncyAmIChYRlNfRElGTEFHX1BSRUFMTE9DfFhGU19ESUZMQUdfQVBQRU5EKSl7CiAJCQlwcmVhbGxvY2VkID0gMTsKIAkJCWZpeGxlbiA9IFhGU19NQVhJT0ZGU0VUKG1wKTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcC5oIGIvZnMveGZzL3hmc19ibWFwLmgKaW5kZXggMmUwNzE3YS4uMTJjYzYzZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwLmgKKysrIGIvZnMveGZzL3hmc19ibWFwLmgKQEAgLTYyLDYgKzYyLDEwIEBACiAjZGVmaW5lCVhGU19CTUFQSV9JR1NUQVRFCTB4MjAwCS8qIElnbm9yZSBzdGF0ZSAtICovCiAJCQkJCS8qIGNvbWJpbmUgY29udGlnLiBzcGFjZSAqLwogI2RlZmluZQlYRlNfQk1BUElfQ09OVElHCTB4NDAwCS8qIG11c3QgYWxsb2NhdGUgb25seSBvbmUgZXh0ZW50ICovCisvKglYRlNfQk1BUElfRElSRUNUX0lPCTB4ODAwCSovCisjZGVmaW5lIFhGU19CTUFQSV9DT05WRVJUCTB4MTAwMAkvKiB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24gLSAqLworCQkJCQkvKiBuZWVkIHdyaXRlIGNhY2hlIGZsdXNoaW5nIGFuZCBubyAqLworCQkJCQkvKiBhZGRpdGlvbmFsIGFsbG9jYXRpb24gYWxpZ25tZW50cyAqLwogCiAjZGVmaW5lCVhGU19CTUFQSV9BRkxBRyh3KQl4ZnNfYm1hcGlfYWZsYWcodykKIHN0YXRpYyBpbmxpbmUgaW50IHhmc19ibWFwaV9hZmxhZyhpbnQgdykKQEAgLTEwMSw3ICsxMDUsOCBAQAogCWNoYXIJCQl3YXNkZWw7CS8qIHJlcGxhY2luZyBhIGRlbGF5ZWQgYWxsb2NhdGlvbiAqLwogCWNoYXIJCQl1c2VyZGF0YTsvKiBzZXQgaWYgaXMgdXNlciBkYXRhICovCiAJY2hhcgkJCWxvdzsJLyogbG93IG9uIHNwYWNlLCB1c2luZyBzZXEnbCBhZ3MgKi8KLQljaGFyCQkJYWVvZjsgICAvKiBhbGxvY2F0ZWQgc3BhY2UgYXQgZW9mICovCisJY2hhcgkJCWFlb2Y7CS8qIGFsbG9jYXRlZCBzcGFjZSBhdCBlb2YgKi8KKwljaGFyCQkJY29udjsJLyogb3ZlcndyaXRpbmcgdW53cml0dGVuIGV4dGVudHMgKi8KIH0geGZzX2JtYWxsb2NhX3Q7CiAKICNpZmRlZiBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2NsbnQuaCBiL2ZzL3hmcy94ZnNfY2xudC5oCmluZGV4IDMyOGE1MjguLmY1N2NjOWEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfY2xudC5oCisrKyBiL2ZzL3hmcy94ZnNfY2xudC5oCkBAIC01Nyw3ICs1Nyw3IEBACiAvKgogICogWEZTIG1vdW50IG9wdGlvbiBmbGFncyAtLSBhcmdzLT5mbGFnczEKICAqLwotI2RlZmluZQlYRlNNTlRfQ09NUEFUX0FUVFIJMHgwMDAwMDAwMQkvKiBkbyBub3QgdXNlIEFUVFIyIGZvcm1hdCAqLworI2RlZmluZQlYRlNNTlRfQVRUUjIJCTB4MDAwMDAwMDEJLyogYWxsb3cgQVRUUjIgRUEgZm9ybWF0ICovCiAjZGVmaW5lCVhGU01OVF9XU1lOQwkJMHgwMDAwMDAwMgkvKiBzYWZlIG1vZGUgbmZzIG1vdW50CiAJCQkJCQkgKiBjb21wYXRpYmxlICovCiAjZGVmaW5lCVhGU01OVF9JTk82NAkJMHgwMDAwMDAwNAkvKiBtb3ZlIGlub2RlIG51bWJlcnMgdXAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGZyYWcuYyBiL2ZzL3hmcy94ZnNfZGZyYWcuYwppbmRleCAwNzAyNTlhLi5jNjE5MWQwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RmcmFnLmMKKysrIGIvZnMveGZzL3hmc19kZnJhZy5jCkBAIC02MCw4ICs2MCw2IEBACiAJeGZzX2JzdGF0X3QJKnNicDsKIAlzdHJ1Y3QgZmlsZQkqZnAgPSBOVUxMLCAqdGZwID0gTlVMTDsKIAl2bm9kZV90CQkqdnAsICp0dnA7Ci0JYmh2X2Rlc2NfdCAgICAgICpiZHAsICp0YmRwOwotCXZuX2Jodl9oZWFkX3QgICAqYmhwLCAqdGJocDsKIAlzdGF0aWMgdWludAlsb2NrX2ZsYWdzID0gWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0w7CiAJaW50CQlpbGZfZmllbGRzLCB0aWxmX2ZpZWxkczsKIAlpbnQJCWVycm9yID0gMDsKQEAgLTkwLDEzICs4OCwxMCBAQAogCQlnb3RvIGVycm9yMDsKIAl9CiAKLQliaHAgPSBWTl9CSFZfSEVBRCh2cCk7Ci0JYmRwID0gdm5fYmh2X2xvb2t1cChiaHAsICZ4ZnNfdm5vZGVvcHMpOwotCWlmIChiZHAgPT0gTlVMTCkgeworCWlwID0geGZzX3Z0b2kodnApOworCWlmIChpcCA9PSBOVUxMKSB7CiAJCWVycm9yID0gWEZTX0VSUk9SKEVCQURGKTsKIAkJZ290byBlcnJvcjA7Ci0JfSBlbHNlIHsKLQkJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CiAJfQogCiAJaWYgKCgodGZwID0gZmdldCgoaW50KXN4cC0+c3hfZmR0bXApKSA9PSBOVUxMKSB8fApAQCAtMTA1LDEzICsxMDAsMTAgQEAKIAkJZ290byBlcnJvcjA7CiAJfQogCi0JdGJocCA9IFZOX0JIVl9IRUFEKHR2cCk7Ci0JdGJkcCA9IHZuX2Jodl9sb29rdXAodGJocCwgJnhmc192bm9kZW9wcyk7Ci0JaWYgKHRiZHAgPT0gTlVMTCkgeworCXRpcCA9IHhmc192dG9pKHR2cCk7CisJaWYgKHRpcCA9PSBOVUxMKSB7CiAJCWVycm9yID0gWEZTX0VSUk9SKEVCQURGKTsKIAkJZ290byBlcnJvcjA7Ci0JfSBlbHNlIHsKLQkJdGlwID0gWEZTX0JIVlRPSSh0YmRwKTsKIAl9CiAKIAlpZiAoaXAtPmlfbW91bnQgIT0gdGlwLT5pX21vdW50KSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpbm9kZS5oIGIvZnMveGZzL3hmc19kaW5vZGUuaAppbmRleCBjNWEwZTUzLi43OWQwZDllIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Rpbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfZGlub2RlLmgKQEAgLTE5OSwxMCArMTk5LDE2IEBACiAKICNkZWZpbmUgWEZTX0RGT1JLX0RTSVpFKGRpcCxtcCkgXAogCVhGU19DRk9SS19EU0laRV9ESVNLKCYoZGlwKS0+ZGlfY29yZSwgbXApCisjZGVmaW5lIFhGU19ERk9SS19EU0laRV9IT1NUKGRpcCxtcCkgXAorCVhGU19DRk9SS19EU0laRSgmKGRpcCktPmRpX2NvcmUsIG1wKQogI2RlZmluZSBYRlNfREZPUktfQVNJWkUoZGlwLG1wKSBcCiAJWEZTX0NGT1JLX0FTSVpFX0RJU0soJihkaXApLT5kaV9jb3JlLCBtcCkKKyNkZWZpbmUgWEZTX0RGT1JLX0FTSVpFX0hPU1QoZGlwLG1wKSBcCisJWEZTX0NGT1JLX0FTSVpFKCYoZGlwKS0+ZGlfY29yZSwgbXApCiAjZGVmaW5lCVhGU19ERk9SS19TSVpFKGRpcCxtcCx3KSBcCiAJWEZTX0NGT1JLX1NJWkVfRElTSygmKGRpcCktPmRpX2NvcmUsIG1wLCB3KQorI2RlZmluZQlYRlNfREZPUktfU0laRV9IT1NUKGRpcCxtcCx3KSBcCisJWEZTX0NGT1JLX1NJWkUoJihkaXApLT5kaV9jb3JlLCBtcCwgdykKIAogI2RlZmluZQlYRlNfREZPUktfUShkaXApICAgICAgICAgICAgICAgICAgICBYRlNfQ0ZPUktfUV9ESVNLKCYoZGlwKS0+ZGlfY29yZSkKICNkZWZpbmUJWEZTX0RGT1JLX0JPRkYoZGlwKQkJICAgIFhGU19DRk9SS19CT0ZGX0RJU0soJihkaXApLT5kaV9jb3JlKQpAQCAtMjE2LDYgKzIyMiw3IEBACiAjZGVmaW5lCVhGU19DRk9SS19GTVRfU0VUKGRjcCx3LG4pIFwKIAkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCiAJCSgoZGNwKS0+ZGlfZm9ybWF0ID0gKG4pKSA6ICgoZGNwKS0+ZGlfYWZvcm1hdCA9IChuKSkpCisjZGVmaW5lCVhGU19ERk9SS19GT1JNQVQoZGlwLHcpIFhGU19DRk9SS19GT1JNQVQoJihkaXApLT5kaV9jb3JlLCB3KQogCiAjZGVmaW5lCVhGU19DRk9SS19ORVhURU5UU19ESVNLKGRjcCx3KSBcCiAJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXApAQCAtMjIzLDEzICsyMzAsMTMgQEAKIAkgCUlOVF9HRVQoKGRjcCktPmRpX2FuZXh0ZW50cywgQVJDSF9DT05WRVJUKSkKICNkZWZpbmUgWEZTX0NGT1JLX05FWFRFTlRTKGRjcCx3KSBcCiAJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gKGRjcCktPmRpX25leHRlbnRzIDogKGRjcCktPmRpX2FuZXh0ZW50cykKKyNkZWZpbmUJWEZTX0RGT1JLX05FWFRFTlRTKGRpcCx3KSBYRlNfQ0ZPUktfTkVYVEVOVFNfRElTSygmKGRpcCktPmRpX2NvcmUsIHcpCisjZGVmaW5lCVhGU19ERk9SS19ORVhURU5UU19IT1NUKGRpcCx3KSBYRlNfQ0ZPUktfTkVYVEVOVFMoJihkaXApLT5kaV9jb3JlLCB3KQogCiAjZGVmaW5lCVhGU19DRk9SS19ORVhUX1NFVChkY3AsdyxuKSBcCiAJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAogCQkoKGRjcCktPmRpX25leHRlbnRzID0gKG4pKSA6ICgoZGNwKS0+ZGlfYW5leHRlbnRzID0gKG4pKSkKIAotI2RlZmluZQlYRlNfREZPUktfTkVYVEVOVFMoZGlwLHcpIFhGU19DRk9SS19ORVhURU5UU19ESVNLKCYoZGlwKS0+ZGlfY29yZSwgdykKLQogI2RlZmluZQlYRlNfQlVGX1RPX0RJTk9ERShicCkJKCh4ZnNfZGlub2RlX3QgKilYRlNfQlVGX1BUUihicCkpCiAKIC8qCkBAIC0yNDYsOCArMjUzLDEwIEBACiAjZGVmaW5lIFhGU19ESUZMQUdfTk9BVElNRV9CSVQgICA2CS8qIGRvIG5vdCB1cGRhdGUgYXRpbWUgKi8KICNkZWZpbmUgWEZTX0RJRkxBR19OT0RVTVBfQklUICAgIDcJLyogZG8gbm90IGR1bXAgKi8KICNkZWZpbmUgWEZTX0RJRkxBR19SVElOSEVSSVRfQklUIDgJLyogY3JlYXRlIHdpdGggcmVhbHRpbWUgYml0IHNldCAqLwotI2RlZmluZSBYRlNfRElGTEFHX1BST0pJTkhFUklUX0JJVCAgOQkvKiBjcmVhdGUgd2l0aCBwYXJlbnRzIHByb2ppZCAqLwotI2RlZmluZSBYRlNfRElGTEFHX05PU1lNTElOS1NfQklUICAxMAkvKiBkaXNhbGxvdyBzeW1saW5rIGNyZWF0aW9uICovCisjZGVmaW5lIFhGU19ESUZMQUdfUFJPSklOSEVSSVRfQklUICAgOQkvKiBjcmVhdGUgd2l0aCBwYXJlbnRzIHByb2ppZCAqLworI2RlZmluZSBYRlNfRElGTEFHX05PU1lNTElOS1NfQklUICAgMTAJLyogZGlzYWxsb3cgc3ltbGluayBjcmVhdGlvbiAqLworI2RlZmluZSBYRlNfRElGTEFHX0VYVFNJWkVfQklUICAgICAgMTEJLyogaW5vZGUgZXh0ZW50IHNpemUgYWxsb2NhdG9yIGhpbnQgKi8KKyNkZWZpbmUgWEZTX0RJRkxBR19FWFRTWklOSEVSSVRfQklUIDEyCS8qIGluaGVyaXQgaW5vZGUgZXh0ZW50IHNpemUgKi8KICNkZWZpbmUgWEZTX0RJRkxBR19SRUFMVElNRSAgICAgICgxIDw8IFhGU19ESUZMQUdfUkVBTFRJTUVfQklUKQogI2RlZmluZSBYRlNfRElGTEFHX1BSRUFMTE9DICAgICAgKDEgPDwgWEZTX0RJRkxBR19QUkVBTExPQ19CSVQpCiAjZGVmaW5lIFhGU19ESUZMQUdfTkVXUlRCTSAgICAgICAoMSA8PCBYRlNfRElGTEFHX05FV1JUQk1fQklUKQpAQCAtMjU5LDExICsyNjgsMTQgQEAKICNkZWZpbmUgWEZTX0RJRkxBR19SVElOSEVSSVQgICAgICgxIDw8IFhGU19ESUZMQUdfUlRJTkhFUklUX0JJVCkKICNkZWZpbmUgWEZTX0RJRkxBR19QUk9KSU5IRVJJVCAgICgxIDw8IFhGU19ESUZMQUdfUFJPSklOSEVSSVRfQklUKQogI2RlZmluZSBYRlNfRElGTEFHX05PU1lNTElOS1MgICAgKDEgPDwgWEZTX0RJRkxBR19OT1NZTUxJTktTX0JJVCkKKyNkZWZpbmUgWEZTX0RJRkxBR19FWFRTSVpFICAgICAgICgxIDw8IFhGU19ESUZMQUdfRVhUU0laRV9CSVQpCisjZGVmaW5lIFhGU19ESUZMQUdfRVhUU1pJTkhFUklUICAoMSA8PCBYRlNfRElGTEFHX0VYVFNaSU5IRVJJVF9CSVQpCiAKICNkZWZpbmUgWEZTX0RJRkxBR19BTlkgXAogCShYRlNfRElGTEFHX1JFQUxUSU1FIHwgWEZTX0RJRkxBR19QUkVBTExPQyB8IFhGU19ESUZMQUdfTkVXUlRCTSB8IFwKIAkgWEZTX0RJRkxBR19JTU1VVEFCTEUgfCBYRlNfRElGTEFHX0FQUEVORCB8IFhGU19ESUZMQUdfU1lOQyB8IFwKIAkgWEZTX0RJRkxBR19OT0FUSU1FIHwgWEZTX0RJRkxBR19OT0RVTVAgfCBYRlNfRElGTEFHX1JUSU5IRVJJVCB8IFwKLQkgWEZTX0RJRkxBR19QUk9KSU5IRVJJVCB8IFhGU19ESUZMQUdfTk9TWU1MSU5LUykKKwkgWEZTX0RJRkxBR19QUk9KSU5IRVJJVCB8IFhGU19ESUZMQUdfTk9TWU1MSU5LUyB8IFhGU19ESUZMQUdfRVhUU0laRSB8IFwKKwkgWEZTX0RJRkxBR19FWFRTWklOSEVSSVQpCiAKICNlbmRpZgkvKiBfX1hGU19ESU5PREVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpci5jIGIvZnMveGZzL3hmc19kaXIuYwppbmRleCAzZGQzMDM5Li5iYjg3ZDJhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Rpci5jCisrKyBiL2ZzL3hmcy94ZnNfZGlyLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCXVpbnQgc2hvcnRjb3VudCwgbGVhZmNvdW50LCBjb3VudDsKIAogCW1wLT5tX2RpcnZlcnNpb24gPSAxOwotCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikgeworCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0FUVFIyKSkgewogCQlzaG9ydGNvdW50ID0gKG1wLT5tX2F0dHJvZmZzZXQgLQogCQkJCSh1aW50KXNpemVvZih4ZnNfZGlyX3NmX2hkcl90KSkgLwogCQkJCSAodWludClzaXplb2YoeGZzX2Rpcl9zZl9lbnRyeV90KTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyLmggYi9mcy94ZnMveGZzX2Rpci5oCmluZGV4IDQ4OGRlZmUuLjhjYzhhZmIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyLmgKKysrIGIvZnMveGZzL3hmc19kaXIuaApAQCAtMTM1LDYgKzEzNSw4IEBACiAJKChtcCktPm1fZGlyb3BzLnhkX3Nob3J0Zm9ybV90b19zaW5nbGUoYXJncykpCiAKICNkZWZpbmUJWEZTX0RJUl9JU19WMShtcCkJKChtcCktPm1fZGlydmVyc2lvbiA9PSAxKQorI2RlZmluZQlYRlNfRElSX0lTX1YyKG1wKQkoKG1wKS0+bV9kaXJ2ZXJzaW9uID09IDIpCiBleHRlcm4geGZzX2Rpcm9wc190IHhmc3YxX2Rpcm9wczsKK2V4dGVybiB4ZnNfZGlyb3BzX3QgeGZzdjJfZGlyb3BzOwogCiAjZW5kaWYJLyogX19YRlNfRElSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyLmggYi9mcy94ZnMveGZzX2RpcjIuaAppbmRleCA3ZTI0ZmZlLi4zMTU4ZjVkIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjIuaAorKysgYi9mcy94ZnMveGZzX2RpcjIuaApAQCAtNzIsOSArNzIsNiBAQAogCXN0cnVjdCB1aW8JKnVpbzsJCS8qIHVpbyBjb250cm9sIHN0cnVjdHVyZSAqLwogfSB4ZnNfZGlyMl9wdXRfYXJnc190OwogCi0jZGVmaW5lCVhGU19ESVJfSVNfVjIobXApCSgobXApLT5tX2RpcnZlcnNpb24gPT0gMikKLWV4dGVybiB4ZnNfZGlyb3BzX3QJeGZzdjJfZGlyb3BzOwotCiAvKgogICogT3RoZXIgaW50ZXJmYWNlcyB1c2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBkaXIgdjIgY29kZS4KICAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXJfbGVhZi5oIGIvZnMveGZzL3hmc19kaXJfbGVhZi5oCmluZGV4IGFiNmIwOWUuLmViOGNkOWEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyX2xlYWYuaAorKysgYi9mcy94ZnMveGZzX2Rpcl9sZWFmLmgKQEAgLTY3LDM0ICs2NywzOCBAQAogICovCiAjZGVmaW5lIFhGU19ESVJfTEVBRl9NQVBTSVpFCTMJLyogaG93IG1hbnkgZnJlZXNwYWNlIHNsb3RzICovCiAKK3R5cGVkZWYgc3RydWN0IHhmc19kaXJfbGVhZl9tYXAgewkvKiBSTEUgbWFwIG9mIGZyZWUgYnl0ZXMgKi8KKwlfX3VpbnQxNl90CWJhc2U7CSAJLyogYmFzZSBvZiBmcmVlIHJlZ2lvbiAqLworCV9fdWludDE2X3QJc2l6ZTsgCQkvKiBydW4gbGVuZ3RoIG9mIGZyZWUgcmVnaW9uICovCit9IHhmc19kaXJfbGVhZl9tYXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9sZWFmX2hkciB7CS8qIGNvbnN0YW50LXN0cnVjdHVyZSBoZWFkZXIgYmxvY2sgKi8KKwl4ZnNfZGFfYmxraW5mb190IGluZm87CQkvKiBibG9jayB0eXBlLCBsaW5rcywgZXRjLiAqLworCV9fdWludDE2X3QJY291bnQ7CQkvKiBjb3VudCBvZiBhY3RpdmUgbGVhZl9lbnRyeSdzICovCisJX191aW50MTZfdAluYW1lYnl0ZXM7CS8qIG51bSBieXRlcyBvZiBuYW1lIHN0cmluZ3Mgc3RvcmVkICovCisJX191aW50MTZfdAlmaXJzdHVzZWQ7CS8qIGZpcnN0IHVzZWQgYnl0ZSBpbiBuYW1lIGFyZWEgKi8KKwlfX3VpbnQ4X3QJaG9sZXM7CQkvKiAhPSAwIGlmIGJsayBuZWVkcyBjb21wYWN0aW9uICovCisJX191aW50OF90CXBhZDE7CisJeGZzX2Rpcl9sZWFmX21hcF90IGZyZWVtYXBbWEZTX0RJUl9MRUFGX01BUFNJWkVdOworfSB4ZnNfZGlyX2xlYWZfaGRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXJfbGVhZl9lbnRyeSB7CS8qIHNvcnRlZCBvbiBrZXksIG5vdCBuYW1lICovCisJeGZzX2RhaGFzaF90CWhhc2h2YWw7CS8qIGhhc2ggdmFsdWUgb2YgbmFtZSAqLworCV9fdWludDE2X3QJbmFtZWlkeDsJLyogaW5kZXggaW50byBidWZmZXIgb2YgbmFtZSAqLworCV9fdWludDhfdAluYW1lbGVuOwkvKiBsZW5ndGggb2YgbmFtZSBzdHJpbmcgKi8KKwlfX3VpbnQ4X3QJcGFkMjsKK30geGZzX2Rpcl9sZWFmX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXJfbGVhZl9uYW1lIHsKKwl4ZnNfZGlyX2lub190CWludW1iZXI7CS8qIGlub2RlIG51bWJlciBmb3IgdGhpcyBrZXkgKi8KKwlfX3VpbnQ4X3QJbmFtZVsxXTsJLyogbmFtZSBzdHJpbmcgaXRzZWxmICovCit9IHhmc19kaXJfbGVhZl9uYW1lX3Q7CisKIHR5cGVkZWYgc3RydWN0IHhmc19kaXJfbGVhZmJsb2NrIHsKLQlzdHJ1Y3QgeGZzX2Rpcl9sZWFmX2hkciB7CS8qIGNvbnN0YW50LXN0cnVjdHVyZSBoZWFkZXIgYmxvY2sgKi8KLQkJeGZzX2RhX2Jsa2luZm9fdCBpbmZvOwkvKiBibG9jayB0eXBlLCBsaW5rcywgZXRjLiAqLwotCQlfX3VpbnQxNl90IGNvdW50OwkvKiBjb3VudCBvZiBhY3RpdmUgbGVhZl9lbnRyeSdzICovCi0JCV9fdWludDE2X3QgbmFtZWJ5dGVzOwkvKiBudW0gYnl0ZXMgb2YgbmFtZSBzdHJpbmdzIHN0b3JlZCAqLwotCQlfX3VpbnQxNl90IGZpcnN0dXNlZDsJLyogZmlyc3QgdXNlZCBieXRlIGluIG5hbWUgYXJlYSAqLwotCQlfX3VpbnQ4X3QgIGhvbGVzOwkvKiAhPSAwIGlmIGJsayBuZWVkcyBjb21wYWN0aW9uICovCi0JCV9fdWludDhfdCAgcGFkMTsKLQkJc3RydWN0IHhmc19kaXJfbGVhZl9tYXAgey8qIFJMRSBtYXAgb2YgZnJlZSBieXRlcyAqLwotCQkJX191aW50MTZfdCBiYXNlOyAvKiBiYXNlIG9mIGZyZWUgcmVnaW9uICovCi0JCQlfX3VpbnQxNl90IHNpemU7IC8qIHJ1biBsZW5ndGggb2YgZnJlZSByZWdpb24gKi8KLQkJfSBmcmVlbWFwW1hGU19ESVJfTEVBRl9NQVBTSVpFXTsgLyogTiBsYXJnZXN0IGZyZWUgcmVnaW9ucyAqLwotCX0gaGRyOwotCXN0cnVjdCB4ZnNfZGlyX2xlYWZfZW50cnkgewkvKiBzb3J0ZWQgb24ga2V5LCBub3QgbmFtZSAqLwotCQl4ZnNfZGFoYXNoX3QgaGFzaHZhbDsJLyogaGFzaCB2YWx1ZSBvZiBuYW1lICovCi0JCV9fdWludDE2X3QgbmFtZWlkeDsJLyogaW5kZXggaW50byBidWZmZXIgb2YgbmFtZSAqLwotCQlfX3VpbnQ4X3QgbmFtZWxlbjsJLyogbGVuZ3RoIG9mIG5hbWUgc3RyaW5nICovCi0JCV9fdWludDhfdCBwYWQyOwotCX0gZW50cmllc1sxXTsJCQkvKiB2YXIgc2l6ZWQgYXJyYXkgKi8KLQlzdHJ1Y3QgeGZzX2Rpcl9sZWFmX25hbWUgewotCQl4ZnNfZGlyX2lub190IGludW1iZXI7CS8qIGlub2RlIG51bWJlciBmb3IgdGhpcyBrZXkgKi8KLQkJX191aW50OF90IG5hbWVbMV07CS8qIG5hbWUgc3RyaW5nIGl0c2VsZiAqLwotCX0gbmFtZWxpc3RbMV07CQkJLyogZ3Jvd3MgZnJvbSBib3R0b20gb2YgYnVmICovCisJeGZzX2Rpcl9sZWFmX2hkcl90CWhkcjsJLyogY29uc3RhbnQtc3RydWN0dXJlIGhlYWRlciBibG9jayAqLworCXhmc19kaXJfbGVhZl9lbnRyeV90CWVudHJpZXNbMV07CS8qIHZhciBzaXplZCBhcnJheSAqLworCXhmc19kaXJfbGVhZl9uYW1lX3QJbmFtZWxpc3RbMV07CS8qIGdyb3dzIGZyb20gYm90dG9tIG9mIGJ1ZiAqLwogfSB4ZnNfZGlyX2xlYWZibG9ja190OwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9sZWFmX2hkciB4ZnNfZGlyX2xlYWZfaGRyX3Q7Ci10eXBlZGVmIHN0cnVjdCB4ZnNfZGlyX2xlYWZfbWFwIHhmc19kaXJfbGVhZl9tYXBfdDsKLXR5cGVkZWYgc3RydWN0IHhmc19kaXJfbGVhZl9lbnRyeSB4ZnNfZGlyX2xlYWZfZW50cnlfdDsKLXR5cGVkZWYgc3RydWN0IHhmc19kaXJfbGVhZl9uYW1lIHhmc19kaXJfbGVhZl9uYW1lX3Q7CiAKIC8qCiAgKiBMZW5ndGggb2YgbmFtZSBmb3Igd2hpY2ggYSA1MTItYnl0ZSBibG9jayBmaWxlc3lzdGVtCkBAIC0xMjYsMTEgKzEzMCwxMCBAQAogI2RlZmluZQlYRlNfUFVUX0NPT0tJRShjLG1wLGJubyxlbnRyeSxoYXNoKQlcCiAJKChjKS5zLmJlID0gWEZTX0RBX01BS0VfQk5PRU5UUlkobXAsIGJubywgZW50cnkpLCAoYykucy5oID0gKGhhc2gpKQogCi10eXBlZGVmIHN0cnVjdCB4ZnNfZGlyX3B1dF9hcmdzCi17Cit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyX3B1dF9hcmdzIHsKIAl4ZnNfZGlyY29va190CWNvb2s7CQkvKiBjb29raWUgb2YgKG5leHQpIGVudHJ5ICovCiAJeGZzX2ludGlub190CWlubzsJCS8qIGlub2RlIG51bWJlciAqLwotCXN0cnVjdCB4ZnNfZGlyZW50CSpkYnA7CQkvKiBidWZmZXIgcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfZGlyZW50ICpkYnA7CQkvKiBidWZmZXIgcG9pbnRlciAqLwogCWNoYXIJCSpuYW1lOwkJLyogZGlyZWN0b3J5IGVudHJ5IG5hbWUgKi8KIAlpbnQJCW5hbWVsZW47CS8qIGxlbmd0aCBvZiBuYW1lICovCiAJaW50CQlkb25lOwkJLyogb3V0cHV0OiBzZXQgaWYgdmFsdWUgd2FzIHN0b3JlZCAqLwpAQCAtMTM4LDcgKzE0MSw4IEBACiAJc3RydWN0IHVpbwkqdWlvOwkJLyogdWlvIGNvbnRyb2wgc3RydWN0dXJlICovCiB9IHhmc19kaXJfcHV0X2FyZ3NfdDsKIAotI2RlZmluZSBYRlNfRElSX0xFQUZfRU5UU0laRV9CWU5BTUUobGVuKQl4ZnNfZGlyX2xlYWZfZW50c2l6ZV9ieW5hbWUobGVuKQorI2RlZmluZSBYRlNfRElSX0xFQUZfRU5UU0laRV9CWU5BTUUobGVuKQlcCisJeGZzX2Rpcl9sZWFmX2VudHNpemVfYnluYW1lKGxlbikKIHN0YXRpYyBpbmxpbmUgaW50IHhmc19kaXJfbGVhZl9lbnRzaXplX2J5bmFtZShpbnQgbGVuKQogewogCXJldHVybiAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX25hbWVfdCktMSArIGxlbjsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXJyb3IuYyBiL2ZzL3hmcy94ZnNfZXJyb3IuYwppbmRleCBkN2I2YjVkLi4yYTIxYzUwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Vycm9yLmMKKysrIGIvZnMveGZzL3hmc19lcnJvci5jCkBAIC01NCw3ICs1NCw2IEBACiAJCWlmIChlICE9IHhmc19ldHJhcFtpXSkKIAkJCWNvbnRpbnVlOwogCQljbW5fZXJyKENFX05PVEUsICJ4ZnNfZXJyb3JfdHJhcDogZXJyb3IgJWQiLCBlKTsKLQkJZGVidWdfc3RvcF9hbGxfY3B1cygodm9pZCAqKS0xTEwpOwogCQlCVUcoKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19lcnJvci5oIGIvZnMveGZzL3hmc19lcnJvci5oCmluZGV4IDA2ZDhhODQuLjI2YjhlNzAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZXJyb3IuaAorKysgYi9mcy94ZnMveGZzX2Vycm9yLmgKQEAgLTE4LDkgKzE4LDYgQEAKICNpZm5kZWYJX19YRlNfRVJST1JfSF9fCiAjZGVmaW5lCV9fWEZTX0VSUk9SX0hfXwogCi0jZGVmaW5lIHByZGV2KGZtdCx0YXJnLGFyZ3MuLi4pIFwKLQlwcmludGsoIlhGUzogZGV2aWNlICVzIC0gIiBmbXQgIlxuIiwgWEZTX0JVRlRBUkdfTkFNRSh0YXJnKSwgIyMgYXJncykKLQogI2RlZmluZSBYRlNfRVJFQ09WRVIJMQkvKiBGYWlsdXJlIHRvIHJlY292ZXIgbG9nICovCiAjZGVmaW5lIFhGU19FTE9HU1RBVAkyCS8qIEZhaWx1cmUgdG8gc3RhdCBsb2cgaW4gdXNlciBzcGFjZSAqLwogI2RlZmluZSBYRlNfRU5PTE9HU1BBQ0UJMwkvKiBSZXNlcnZhdGlvbiB0b28gbGFyZ2UgKi8KQEAgLTE4Miw4ICsxNzksMTEgQEAKIHN0cnVjdCB4ZnNfbW91bnQ7CiAvKiBQUklOVEZMSUtFNCAqLwogZXh0ZXJuIHZvaWQgeGZzX2Ntbl9lcnIoaW50IHBhbmljX3RhZywgaW50IGxldmVsLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwKLQkJCSAgICBjaGFyICpmbXQsIC4uLik7CisJCQljaGFyICpmbXQsIC4uLik7CiAvKiBQUklOVEZMSUtFMyAqLwogZXh0ZXJuIHZvaWQgeGZzX2ZzX2Ntbl9lcnIoaW50IGxldmVsLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgY2hhciAqZm10LCAuLi4pOwogCisjZGVmaW5lIHhmc19mc19yZXBhaXJfY21uX2VycihsZXZlbCwgbXAsIGZtdCwgYXJncy4uLikgXAorCXhmc19mc19jbW5fZXJyKGxldmVsLCBtcCwgZm10ICIgIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsICMjIGFyZ3MpCisKICNlbmRpZgkvKiBfX1hGU19FUlJPUl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZnMuaCBiL2ZzL3hmcy94ZnNfZnMuaAppbmRleCBiYTA5NmY4Li4xNDAxMGYxIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2ZzLmgKKysrIGIvZnMveGZzL3hmc19mcy5oCkBAIC0zLDE1ICszLDE1IEBACiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAogICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KQEAgLTY1LDYgKzY1LDggQEAKICNkZWZpbmUgWEZTX1hGTEFHX1JUSU5IRVJJVAkweDAwMDAwMTAwCS8qIGNyZWF0ZSB3aXRoIHJ0IGJpdCBzZXQgKi8KICNkZWZpbmUgWEZTX1hGTEFHX1BST0pJTkhFUklUCTB4MDAwMDAyMDAJLyogY3JlYXRlIHdpdGggcGFyZW50cyBwcm9qaWQgKi8KICNkZWZpbmUgWEZTX1hGTEFHX05PU1lNTElOS1MJMHgwMDAwMDQwMAkvKiBkaXNhbGxvdyBzeW1saW5rIGNyZWF0aW9uICovCisjZGVmaW5lIFhGU19YRkxBR19FWFRTSVpFCTB4MDAwMDA4MDAJLyogZXh0ZW50IHNpemUgYWxsb2NhdG9yIGhpbnQgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX0VYVFNaSU5IRVJJVAkweDAwMDAxMDAwCS8qIGluaGVyaXQgaW5vZGUgZXh0ZW50IHNpemUgKi8KICNkZWZpbmUgWEZTX1hGTEFHX0hBU0FUVFIJMHg4MDAwMDAwMAkvKiBubyBESUZMQUcgZm9yIHRoaXMJKi8KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZnNvcHMuYyBiL2ZzL3hmcy94ZnNfZnNvcHMuYwppbmRleCBkMTIzNmQ2Li4xNjMwMzFjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Zzb3BzLmMKKysrIGIvZnMveGZzL3hmc19mc29wcy5jCkBAIC01NDAsNiArNTQwLDMyIEBACiAJcmV0dXJuKDApOwogfQogCit2b2lkCit4ZnNfZnNfbG9nX2R1bW15KHhmc19tb3VudF90ICptcCkKK3sKKwl4ZnNfdHJhbnNfdCAqdHA7CisJeGZzX2lub2RlX3QgKmlwOworCisKKwl0cCA9IF94ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19EVU1NWTEpOworCWF0b21pY19pbmMoJm1wLT5tX2FjdGl2ZV90cmFucyk7CisJaWYgKHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfSUNIQU5HRV9MT0dfUkVTKG1wKSwgMCwgMCwgMCkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybjsKKwl9CisKKwlpcCA9IG1wLT5tX3Jvb3RpcDsKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKwl4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKKworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Cit9CisKIGludAogeGZzX2ZzX2dvaW5nZG93bigKIAl4ZnNfbW91bnRfdAkqbXAsCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Zzb3BzLmggYi9mcy94ZnMveGZzX2Zzb3BzLmgKaW5kZXggZjMyNzEzZi4uMzAwZDBjOSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19mc29wcy5oCisrKyBiL2ZzL3hmcy94ZnNfZnNvcHMuaApAQCAtMjUsNSArMjUsNiBAQAogZXh0ZXJuIGludCB4ZnNfcmVzZXJ2ZV9ibG9ja3MoeGZzX21vdW50X3QgKm1wLCBfX3VpbnQ2NF90ICppbnZhbCwKIAkJCQl4ZnNfZnNvcF9yZXNibGtzX3QgKm91dHZhbCk7CiBleHRlcm4gaW50IHhmc19mc19nb2luZ2Rvd24oeGZzX21vdW50X3QgKm1wLCBfX3VpbnQzMl90IGluZmxhZ3MpOworZXh0ZXJuIHZvaWQgeGZzX2ZzX2xvZ19kdW1teSh4ZnNfbW91bnRfdCAqbXApOwogCiAjZW5kaWYJLyogX19YRlNfRlNPUFNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lnZXQuYyBiL2ZzL3hmcy94ZnNfaWdldC5jCmluZGV4IGZjMTllZWQuLjhlMzgwYTEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaWdldC5jCisrKyBiL2ZzL3hmcy94ZnNfaWdldC5jCkBAIC00OTMsNyArNDkzLDYgQEAKIAogcmV0cnk6CiAJaWYgKChpbm9kZSA9IGlnZXRfbG9ja2VkKFhGU19NVE9WRlMobXApLT52ZnNfc3VwZXIsIGlubykpKSB7Ci0JCWJodl9kZXNjX3QJKmJkcDsKIAkJeGZzX2lub2RlX3QJKmlwOwogCiAJCXZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CkBAIC01MTcsMTQgKzUxNiwxMiBAQAogCQkJICogdG8gd2FpdCBmb3IgdGhlIGlub2RlIHRvIGdvIGF3YXkuCiAJCQkgKi8KIAkJCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpIHx8Ci0JCQkgICAgKChiZHAgPSB2bl9iaHZfbG9va3VwKFZOX0JIVl9IRUFEKHZwKSwKLQkJCQkJCSAgJnhmc192bm9kZW9wcykpID09IE5VTEwpKSB7CisJCQkgICAgKChpcCA9IHhmc192dG9pKHZwKSkgPT0gTlVMTCkpIHsKIAkJCQlpcHV0KGlub2RlKTsKIAkJCQlkZWxheSgxKTsKIAkJCQlnb3RvIHJldHJ5OwogCQkJfQogCi0JCQlpcCA9IFhGU19CSFZUT0koYmRwKTsKIAkJCWlmIChsb2NrX2ZsYWdzICE9IDApCiAJCQkJeGZzX2lsb2NrKGlwLCBsb2NrX2ZsYWdzKTsKIAkJCVhGU19TVEFUU19JTkMoeHNfaWdfZm91bmQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZS5jIGIvZnMveGZzL3hmc19pbm9kZS5jCmluZGV4IGRmMGQ0NTcuLjFkN2Y1YTcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGUuYworKysgYi9mcy94ZnMveGZzX2lub2RlLmMKQEAgLTQwNCw5ICs0MDQsOCBAQAogCSAgICBJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9uZXh0ZW50cywgQVJDSF9DT05WRVJUKSArCiAJCUlOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX2FuZXh0ZW50cywgQVJDSF9DT05WRVJUKSA+CiAJICAgIElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX25ibG9ja3MsIEFSQ0hfQ09OVkVSVCkpKSB7Ci0JCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAotCQkJImNvcnJ1cHQgZGlub2RlICVMdSwgZXh0ZW50IHRvdGFsID0gJWQsIG5ibG9ja3MgPSAlTHUuIgotCQkJIiAgVW5tb3VudCBhbmQgcnVuIHhmc19yZXBhaXIuIiwKKwkJeGZzX2ZzX3JlcGFpcl9jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAorCQkJImNvcnJ1cHQgZGlub2RlICVMdSwgZXh0ZW50IHRvdGFsID0gJWQsIG5ibG9ja3MgPSAlTHUuIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaXAtPmlfaW5vLAogCQkJKGludCkoSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbmV4dGVudHMsIEFSQ0hfQ09OVkVSVCkKIAkJCSAgICArIElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX2FuZXh0ZW50cywgQVJDSF9DT05WRVJUKSksCkBAIC00MTgsOSArNDE3LDggQEAKIAl9CiAKIAlpZiAodW5saWtlbHkoSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfZm9ya29mZiwgQVJDSF9DT05WRVJUKSA+IGlwLT5pX21vdW50LT5tX3NiLnNiX2lub2Rlc2l6ZSkpIHsKLQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCi0JCQkiY29ycnVwdCBkaW5vZGUgJUx1LCBmb3Jrb2ZmID0gMHgleC4iCi0JCQkiICBVbm1vdW50IGFuZCBydW4geGZzX3JlcGFpci4iLAorCQl4ZnNfZnNfcmVwYWlyX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCisJCQkiY29ycnVwdCBkaW5vZGUgJUx1LCBmb3Jrb2ZmID0gMHgleC4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpcC0+aV9pbm8sCiAJCQkoaW50KShJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9mb3Jrb2ZmLCBBUkNIX0NPTlZFUlQpKSk7CiAJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdCgyKSIsIFhGU19FUlJMRVZFTF9MT1csCkBAIC00NTEsOCArNDQ5LDkgQEAKIAkJCSAqIG5vIGxvY2FsIHJlZ3VsYXIgZmlsZXMgeWV0CiAJCQkgKi8KIAkJCWlmICh1bmxpa2VseSgoSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbW9kZSwgQVJDSF9DT05WRVJUKSAmIFNfSUZNVCkgPT0gU19JRlJFRykpIHsKLQkJCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKLQkJCQkJImNvcnJ1cHQgaW5vZGUgKGxvY2FsIGZvcm1hdCBmb3IgcmVndWxhciBmaWxlKSAlTHUuICBVbm1vdW50IGFuZCBydW4geGZzX3JlcGFpci4iLAorCQkJCXhmc19mc19yZXBhaXJfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCQkJImNvcnJ1cHQgaW5vZGUgJUx1ICIKKwkJCQkJIihsb2NhbCBmb3JtYXQgZm9yIHJlZ3VsYXIgZmlsZSkuIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaXAtPmlfaW5vKTsKIAkJCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2lmb3JtYXQoNCkiLAogCQkJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLApAQCAtNDYyLDggKzQ2MSw5IEBACiAKIAkJCWRpX3NpemUgPSBJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9zaXplLCBBUkNIX0NPTlZFUlQpOwogCQkJaWYgKHVubGlrZWx5KGRpX3NpemUgPiBYRlNfREZPUktfRFNJWkUoZGlwLCBpcC0+aV9tb3VudCkpKSB7Ci0JCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCi0JCQkJCSJjb3JydXB0IGlub2RlICVMdSAoYmFkIHNpemUgJUxkIGZvciBsb2NhbCBpbm9kZSkuICBVbm1vdW50IGFuZCBydW4geGZzX3JlcGFpci4iLAorCQkJCXhmc19mc19yZXBhaXJfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCQkJImNvcnJ1cHQgaW5vZGUgJUx1ICIKKwkJCQkJIihiYWQgc2l6ZSAlTGQgZm9yIGxvY2FsIGlub2RlKS4iLAogCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpcC0+aV9pbm8sCiAJCQkJCShsb25nIGxvbmcpIGRpX3NpemUpOwogCQkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdCg1KSIsCkBAIC01NTEsOCArNTUxLDkgQEAKIAkgKiBrbWVtX2FsbG9jKCkgb3IgbWVtY3B5KCkgYmVsb3cuCiAJICovCiAJaWYgKHVubGlrZWx5KHNpemUgPiBYRlNfREZPUktfU0laRShkaXAsIGlwLT5pX21vdW50LCB3aGljaGZvcmspKSkgewotCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKLQkJCSJjb3JydXB0IGlub2RlICVMdSAoYmFkIHNpemUgJWQgZm9yIGxvY2FsIGZvcmssIHNpemUgPSAlZCkuICBVbm1vdW50IGFuZCBydW4geGZzX3JlcGFpci4iLAorCQl4ZnNfZnNfcmVwYWlyX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCisJCQkiY29ycnVwdCBpbm9kZSAlTHUgIgorCQkJIihiYWQgc2l6ZSAlZCBmb3IgbG9jYWwgZm9yaywgc2l6ZSA9ICVkKS4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaXAtPmlfaW5vLCBzaXplLAogCQkJWEZTX0RGT1JLX1NJWkUoZGlwLCBpcC0+aV9tb3VudCwgd2hpY2hmb3JrKSk7CiAJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdF9sb2NhbCIsIFhGU19FUlJMRVZFTF9MT1csCkBAIC02MTAsOCArNjExLDggQEAKIAkgKiBrbWVtX2FsbG9jKCkgb3IgbWVtY3B5KCkgYmVsb3cuCiAJICovCiAJaWYgKHVubGlrZWx5KHNpemUgPCAwIHx8IHNpemUgPiBYRlNfREZPUktfU0laRShkaXAsIGlwLT5pX21vdW50LCB3aGljaGZvcmspKSkgewotCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKLQkJCSJjb3JydXB0IGlub2RlICVMdSAoKGEpZXh0ZW50cyA9ICVkKS4gIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCXhmc19mc19yZXBhaXJfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCSJjb3JydXB0IGlub2RlICVMdSAoKGEpZXh0ZW50cyA9ICVkKS4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaXAtPmlfaW5vLCBuZXgpOwogCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2lmb3JtYXRfZXh0ZW50cygxKSIsIFhGU19FUlJMRVZFTF9MT1csCiAJCQkJICAgICBpcC0+aV9tb3VudCwgZGlwKTsKQEAgLTY5Miw4ICs2OTMsOCBAQAogCSAgICB8fCBYRlNfQk1EUl9TUEFDRV9DQUxDKG5yZWNzKSA+CiAJCQlYRlNfREZPUktfU0laRShkaXAsIGlwLT5pX21vdW50LCB3aGljaGZvcmspCiAJICAgIHx8IFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSA+IGlwLT5pX2QuZGlfbmJsb2NrcykpIHsKLQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCi0JCQkiY29ycnVwdCBpbm9kZSAlTHUgKGJ0cmVlKS4gIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCXhmc19mc19yZXBhaXJfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCSJjb3JydXB0IGlub2RlICVMdSAoYnRyZWUpLiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpcC0+aV9pbm8pOwogCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfaWZvcm1hdF9idHJlZSIsIFhGU19FUlJMRVZFTF9MT1csCiAJCQkJIGlwLT5pX21vdW50KTsKQEAgLTgwOSw2ICs4MTAsMTAgQEAKIAkJCWZsYWdzIHw9IFhGU19YRkxBR19QUk9KSU5IRVJJVDsKIAkJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19OT1NZTUxJTktTKQogCQkJZmxhZ3MgfD0gWEZTX1hGTEFHX05PU1lNTElOS1M7CisJCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfRVhUU0laRSkKKwkJCWZsYWdzIHw9IFhGU19YRkxBR19FWFRTSVpFOworCQlpZiAoZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0VYVFNaSU5IRVJJVCkKKwkJCWZsYWdzIHw9IFhGU19YRkxBR19FWFRTWklOSEVSSVQ7CiAJfQogCiAJcmV0dXJuIGZsYWdzOwpAQCAtMTE5MiwxMSArMTE5NywxOSBAQAogCQkJaWYgKChtb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKSB7CiAJCQkJaWYgKHBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SVElOSEVSSVQpCiAJCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfUlRJTkhFUklUOwotCQkJfSBlbHNlIHsKKwkJCQlpZiAocGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0VYVFNaSU5IRVJJVCkgeworCQkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX0VYVFNaSU5IRVJJVDsKKwkJCQkJaXAtPmlfZC5kaV9leHRzaXplID0gcGlwLT5pX2QuZGlfZXh0c2l6ZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKChtb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKSB7CiAJCQkJaWYgKHBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SVElOSEVSSVQpIHsKIAkJCQkJZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19SRUFMVElNRTsKIAkJCQkJaXAtPmlfaW9jb3JlLmlvX2ZsYWdzIHw9IFhGU19JT0NPUkVfUlQ7CiAJCQkJfQorCQkJCWlmIChwaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfRVhUU1pJTkhFUklUKSB7CisJCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfRVhUU0laRTsKKwkJCQkJaXAtPmlfZC5kaV9leHRzaXplID0gcGlwLT5pX2QuZGlfZXh0c2l6ZTsKKwkJCQl9CiAJCQl9CiAJCQlpZiAoKHBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19OT0FUSU1FKSAmJgogCQkJICAgIHhmc19pbmhlcml0X25vYXRpbWUpCkBAIC0xMjYyLDcgKzEyNzUsNyBAQAogCWlmICgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSAhPSBTX0lGUkVHKQogCQlyZXR1cm47CiAKLQlpZiAoIGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FICkKKwlpZiAoaXAtPmlfZC5kaV9mbGFncyAmIChYRlNfRElGTEFHX1JFQUxUSU1FIHwgWEZTX0RJRkxBR19FWFRTSVpFKSkKIAkJcmV0dXJuOwogCiAJbmltYXBzID0gMjsKQEAgLTE3NjUsMjIgKzE3NzgsMTkgQEAKIAl4ZnNfZnNpemVfdAluZXdfc2l6ZSwKIAljcmVkX3QJCSpjcmVkcCkKIHsKLQl4ZnNfZnNpemVfdAlpc2l6ZTsKIAlpbnQJCWVycm9yOwogCiAJQVNTRVJUKGlzbXJsb2NrZWQoJihpcC0+aV9sb2NrKSwgTVJfVVBEQVRFKSAhPSAwKTsKIAlBU1NFUlQoaXNtcmxvY2tlZCgmKGlwLT5pX2lvbG9jayksIE1SX1VQREFURSkgIT0gMCk7CiAJQVNTRVJUKG5ld19zaXplID4gaXAtPmlfZC5kaV9zaXplKTsKIAotCWVycm9yID0gMDsKLQlpc2l6ZSA9IGlwLT5pX2QuZGlfc2l6ZTsKIAkvKgogCSAqIFplcm8gYW55IHBhZ2VzIHRoYXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGJ5CiAJICogeGZzX3dyaXRlX2ZpbGUoKSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZQogCSAqIGFuZCBhbnkgYmxvY2tzIGJldHdlZW4gdGhlIG9sZCBhbmQgbmV3IGZpbGUgc2l6ZXMuCiAJICovCi0JZXJyb3IgPSB4ZnNfemVyb19lb2YoWEZTX0lUT1YoaXApLCAmaXAtPmlfaW9jb3JlLCBuZXdfc2l6ZSwgaXNpemUsCi0JCQkJbmV3X3NpemUpOworCWVycm9yID0geGZzX3plcm9fZW9mKFhGU19JVE9WKGlwKSwgJmlwLT5pX2lvY29yZSwgbmV3X3NpemUsCisJCQkgICAgIGlwLT5pX2QuZGlfc2l6ZSwgbmV3X3NpemUpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMzM1NSw2ICszMzY1LDExIEBACiAJaXAtPmlfdXBkYXRlX2NvcmUgPSAwOwogCVNZTkNIUk9OSVpFKCk7CiAKKwkvKgorCSAqIE1ha2Ugc3VyZSB0byBnZXQgdGhlIGxhdGVzdCBhdGltZSBmcm9tIHRoZSBMaW51eCBpbm9kZS4KKwkgKi8KKwl4ZnNfc3luY2hyb25pemVfYXRpbWUoaXApOworCiAJaWYgKFhGU19URVNUX0VSUk9SKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX21hZ2ljLEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJTk9ERV9NQUdJQywKIAkJCSAgICAgICBtcCwgWEZTX0VSUlRBR19JRkxVU0hfMSwgWEZTX1JBTkRPTV9JRkxVU0hfMSkpIHsKIAkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfSUZMVVNILCBDRV9BTEVSVCwgbXAsCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmggYi9mcy94ZnMveGZzX2lub2RlLmgKaW5kZXggMTI0ZDMwZS4uMWNmYmNmMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuaApAQCAtNDM2LDYgKzQzNiwxMCBAQAogeGZzX2ZzaXplX3QJeGZzX2ZpbGVfbGFzdF9ieXRlKHhmc19pbm9kZV90ICopOwogdm9pZAkJeGZzX2xvY2tfaW5vZGVzKHhmc19pbm9kZV90ICoqLCBpbnQsIGludCwgdWludCk7CiAKK3hmc19pbm9kZV90CSp4ZnNfdnRvaShzdHJ1Y3Qgdm5vZGUgKnZwKTsKKwordm9pZAkJeGZzX3N5bmNocm9uaXplX2F0aW1lKHhmc19pbm9kZV90ICopOworCiAjZGVmaW5lIHhmc19pcGluY291bnQoaXApCSgodW5zaWduZWQgaW50KSBhdG9taWNfcmVhZCgmaXAtPmlfcGluY291bnQpKQogCiAjaWZkZWYgREVCVUcKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKaW5kZXggN2YzMzYzYy4uMzZhYTFmYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKQEAgLTI3MSw2ICsyNzEsMTEgQEAKIAlpZiAoaXAtPmlfdXBkYXRlX3NpemUpCiAJCWlwLT5pX3VwZGF0ZV9zaXplID0gMDsKIAorCS8qCisJICogTWFrZSBzdXJlIHRvIGdldCB0aGUgbGF0ZXN0IGF0aW1lIGZyb20gdGhlIExpbnV4IGlub2RlLgorCSAqLworCXhmc19zeW5jaHJvbml6ZV9hdGltZShpcCk7CisKIAl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJmlwLT5pX2Q7CiAJdmVjcC0+aV9sZW4gID0gc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90KTsKIAlYTE9HX1ZFQ19TRVRfVFlQRSh2ZWNwLCBYTE9HX1JFR19UWVBFX0lDT1JFKTsKQEAgLTYwMyw3ICs2MDgsNyBAQAogCQlpZiAoaWlwLT5pbGlfcHVzaGJ1Zl9mbGFnID09IDApIHsKIAkJCWlpcC0+aWxpX3B1c2hidWZfZmxhZyA9IDE7CiAjaWZkZWYgREVCVUcKLQkJCWlpcC0+aWxpX3B1c2hfb3duZXIgPSBnZXRfdGhyZWFkX2lkKCk7CisJCQlpaXAtPmlsaV9wdXNoX293bmVyID0gY3VycmVudF9waWQoKTsKICNlbmRpZgogCQkJLyoKIAkJCSAqIElub2RlIGlzIGxlZnQgbG9ja2VkIGluIHNoYXJlZCBtb2RlLgpAQCAtNzgyLDcgKzc4Nyw3IEBACiAJICogdHJ5aW5nIHRvIGR1cGxpY2F0ZSBvdXIgZWZmb3J0LgogCSAqLwogCUFTU0VSVChpaXAtPmlsaV9wdXNoYnVmX2ZsYWcgIT0gMCk7Ci0JQVNTRVJUKGlpcC0+aWxpX3B1c2hfb3duZXIgPT0gZ2V0X3RocmVhZF9pZCgpKTsKKwlBU1NFUlQoaWlwLT5pbGlfcHVzaF9vd25lciA9PSBjdXJyZW50X3BpZCgpKTsKIAogCS8qCiAJICogSWYgZmx1c2hsb2NrIGlzbid0IGxvY2tlZCBhbnltb3JlLCBjaGFuY2VzIGFyZSB0aGF0IHRoZQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5jIGIvZnMveGZzL3hmc19pb21hcC5jCmluZGV4IGNhN2FmYzguLjc4ODkxN2YzIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lvbWFwLmMKKysrIGIvZnMveGZzL3hmc19pb21hcC5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAljYXNlIEJNQVBJX1dSSVRFOgogCQkvKiBJZiB3ZSBmb3VuZCBhbiBleHRlbnQsIHJldHVybiBpdCAqLwogCQlpZiAobmltYXBzICYmCi0JCSAgICAoaW1hcC5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSAmJiAKKwkJICAgIChpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spICYmCiAJCSAgICAoaW1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykpIHsKIAkJCXhmc19pb21hcF9tYXBfdHJhY2UoWEZTX0lPTUFQX1dSSVRFX01BUCwgaW8sCiAJCQkJCW9mZnNldCwgY291bnQsIGlvbWFwcCwgJmltYXAsIGZsYWdzKTsKQEAgLTMxNyw2ICszMTcsNTggQEAKIH0KIAogU1RBVElDIGludAoreGZzX2lvbWFwX2VvZl9hbGlnbl9sYXN0X2ZzYigKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2lvY29yZV90CSppbywKKwl4ZnNfZnNpemVfdAlpc2l6ZSwKKwl4ZnNfZXh0bGVuX3QJZXh0c2l6ZSwKKwl4ZnNfZmlsZW9mZl90CSpsYXN0X2ZzYikKK3sKKwl4ZnNfZmlsZW9mZl90CW5ld19sYXN0X2ZzYiA9IDA7CisJeGZzX2V4dGxlbl90CWFsaWduOworCWludAkJZW9mLCBlcnJvcjsKKworCWlmIChpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKQorCQk7CisJLyoKKwkgKiBJZiBtb3VudGVkIHdpdGggdGhlICItbyBzd2FsbG9jIiBvcHRpb24sIHJvdW5kdXAgdGhlIGFsbG9jYXRpb24KKwkgKiByZXF1ZXN0IHRvIGEgc3RyaXBlIHdpZHRoIGJvdW5kYXJ5IGlmIHRoZSBmaWxlIHNpemUgaXMgPj0KKwkgKiBzdHJpcGUgd2lkdGggYW5kIHdlIGFyZSBhbGxvY2F0aW5nIHBhc3QgdGhlIGFsbG9jYXRpb24gZW9mLgorCSAqLworCWVsc2UgaWYgKG1wLT5tX3N3aWR0aCAmJiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfU1dBTExPQykgJiYKKwkgICAgICAgIChpc2l6ZSA+PSBYRlNfRlNCX1RPX0IobXAsIG1wLT5tX3N3aWR0aCkpKQorCQluZXdfbGFzdF9mc2IgPSByb3VuZHVwXzY0KCpsYXN0X2ZzYiwgbXAtPm1fc3dpZHRoKTsKKwkvKgorCSAqIFJvdW5kdXAgdGhlIGFsbG9jYXRpb24gcmVxdWVzdCB0byBhIHN0cmlwZSB1bml0IChtX2RhbGlnbikgYm91bmRhcnkKKwkgKiBpZiB0aGUgZmlsZSBzaXplIGlzID49IHN0cmlwZSB1bml0IHNpemUsIGFuZCB3ZSBhcmUgYWxsb2NhdGluZyBwYXN0CisJICogdGhlIGFsbG9jYXRpb24gZW9mLgorCSAqLworCWVsc2UgaWYgKG1wLT5tX2RhbGlnbiAmJiAoaXNpemUgPj0gWEZTX0ZTQl9UT19CKG1wLCBtcC0+bV9kYWxpZ24pKSkKKwkJbmV3X2xhc3RfZnNiID0gcm91bmR1cF82NCgqbGFzdF9mc2IsIG1wLT5tX2RhbGlnbik7CisKKwkvKgorCSAqIEFsd2F5cyByb3VuZCB1cCB0aGUgYWxsb2NhdGlvbiByZXF1ZXN0IHRvIGFuIGV4dGVudCBib3VuZGFyeQorCSAqICh3aGVuIGZpbGUgb24gYSByZWFsLXRpbWUgc3Vidm9sdW1lIG9yIGhhcyBkaV9leHRzaXplIGhpbnQpLgorCSAqLworCWlmIChleHRzaXplKSB7CisJCWlmIChuZXdfbGFzdF9mc2IpCisJCQlhbGlnbiA9IHJvdW5kdXBfNjQobmV3X2xhc3RfZnNiLCBleHRzaXplKTsKKwkJZWxzZQorCQkJYWxpZ24gPSBleHRzaXplOworCQluZXdfbGFzdF9mc2IgPSByb3VuZHVwXzY0KCpsYXN0X2ZzYiwgYWxpZ24pOworCX0KKworCWlmIChuZXdfbGFzdF9mc2IpIHsKKwkJZXJyb3IgPSBYRlNfQk1BUF9FT0YobXAsIGlvLCBuZXdfbGFzdF9mc2IsIFhGU19EQVRBX0ZPUkssICZlb2YpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCWlmIChlb2YpCisJCQkqbGFzdF9mc2IgPSBuZXdfbGFzdF9mc2I7CisJfQorCXJldHVybiAwOworfQorCitTVEFUSUMgaW50CiB4ZnNfZmx1c2hfc3BhY2UoCiAJeGZzX2lub2RlX3QJKmlwLAogCWludAkJKmZzeW5jZWQsCkBAIC0zNjIsMTkgKzQxNCwyMCBAQAogCXhmc19pb2NvcmVfdAkqaW8gPSAmaXAtPmlfaW9jb3JlOwogCXhmc19maWxlb2ZmX3QJb2Zmc2V0X2ZzYjsKIAl4ZnNfZmlsZW9mZl90CWxhc3RfZnNiOwotCXhmc19maWxibGtzX3QJY291bnRfZnNiOworCXhmc19maWxibGtzX3QJY291bnRfZnNiLCByZXNhbGlnbmVkOwogCXhmc19mc2Jsb2NrX3QJZmlyc3Rmc2I7CisJeGZzX2V4dGxlbl90CWV4dHN6LCB0ZW1wOworCXhmc19mc2l6ZV90CWlzaXplOwogCWludAkJbmltYXBzOwotCWludAkJZXJyb3I7CiAJaW50CQlibWFwaV9mbGFnOwogCWludAkJcXVvdGFfZmxhZzsKIAlpbnQJCXJ0OwogCXhmc190cmFuc190CSp0cDsKIAl4ZnNfYm1idF9pcmVjX3QgaW1hcDsKIAl4ZnNfYm1hcF9mcmVlX3QgZnJlZV9saXN0OwotCXhmc19maWxibGtzX3QJcWJsb2NrcywgcmVzYmxrczsKKwl1aW50CQlxYmxvY2tzLCByZXNibGtzLCByZXNydGV4dGVudHM7CiAJaW50CQljb21taXR0ZWQ7Ci0JaW50CQlyZXNydGV4dGVudHM7CisJaW50CQllcnJvcjsKIAogCS8qCiAJICogTWFrZSBzdXJlIHRoYXQgdGhlIGRxdW90cyBhcmUgdGhlcmUuIFRoaXMgZG9lc24ndCBob2xkCkBAIC0zODQsMzggKzQzNyw1MyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CiAKLQlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKLQlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOwotCWNvdW50X2ZzYiA9IGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYjsKLQlpZiAoZm91bmQgJiYgKHJldF9pbWFwLT5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKSkgewotCQl4ZnNfZmlsZW9mZl90CW1hcF9sYXN0X2ZzYjsKLQotCQltYXBfbGFzdF9mc2IgPSByZXRfaW1hcC0+YnJfYmxvY2tjb3VudCArIHJldF9pbWFwLT5icl9zdGFydG9mZjsKLQkJaWYgKG1hcF9sYXN0X2ZzYiA8IGxhc3RfZnNiKSB7Ci0JCQlsYXN0X2ZzYiA9IG1hcF9sYXN0X2ZzYjsKLQkJCWNvdW50X2ZzYiA9IGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYjsKLQkJfQotCQlBU1NFUlQoY291bnRfZnNiID4gMCk7Ci0JfQotCi0JLyoKLQkgKiBEZXRlcm1pbmUgaWYgcmVzZXJ2aW5nIHNwYWNlIG9uIHRoZSBkYXRhIG9yIHJlYWx0aW1lIHBhcnRpdGlvbi4KLQkgKi8KLQlpZiAoKHJ0ID0gWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkpIHsKLQkJeGZzX2V4dGxlbl90CWV4dHN6OwotCisJcnQgPSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOworCWlmICh1bmxpa2VseShydCkpIHsKIAkJaWYgKCEoZXh0c3ogPSBpcC0+aV9kLmRpX2V4dHNpemUpKQogCQkJZXh0c3ogPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQkJcmVzcnRleHRlbnRzID0gcWJsb2NrcyA9IChjb3VudF9mc2IgKyBleHRzeiAtIDEpOwotCQlkb19kaXYocmVzcnRleHRlbnRzLCBtcC0+bV9zYi5zYl9yZXh0c2l6ZSk7Ci0JCXJlc2Jsa3MgPSBYRlNfRElPU1RSQVRfU1BBQ0VfUkVTKG1wLCAwKTsKLQkJcXVvdGFfZmxhZyA9IFhGU19RTU9QVF9SRVNfUlRCTEtTOwogCX0gZWxzZSB7Ci0JCXJlc3J0ZXh0ZW50cyA9IDA7Ci0JCXJlc2Jsa3MgPSBxYmxvY2tzID0gWEZTX0RJT1NUUkFUX1NQQUNFX1JFUyhtcCwgY291bnRfZnNiKTsKLQkJcXVvdGFfZmxhZyA9IFhGU19RTU9QVF9SRVNfUkVHQkxLUzsKKwkJZXh0c3ogPSBpcC0+aV9kLmRpX2V4dHNpemU7CiAJfQogCisJaXNpemUgPSBpcC0+aV9kLmRpX3NpemU7CisJaWYgKGlvLT5pb19uZXdfc2l6ZSA+IGlzaXplKQorCQlpc2l6ZSA9IGlvLT5pb19uZXdfc2l6ZTsKKworICAJb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CisgIAlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOworCWlmICgob2Zmc2V0ICsgY291bnQpID4gaXNpemUpIHsKKwkJZXJyb3IgPSB4ZnNfaW9tYXBfZW9mX2FsaWduX2xhc3RfZnNiKG1wLCBpbywgaXNpemUsIGV4dHN6LAorCQkJCQkJCSZsYXN0X2ZzYik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3Jfb3V0OworCX0gZWxzZSB7CisJCWlmIChmb3VuZCAmJiAocmV0X2ltYXAtPmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spKQorCQkJbGFzdF9mc2IgPSBNSU4obGFzdF9mc2IsICh4ZnNfZmlsZW9mZl90KQorCQkJCQlyZXRfaW1hcC0+YnJfYmxvY2tjb3VudCArCisJCQkJCXJldF9pbWFwLT5icl9zdGFydG9mZik7CisJfQorCWNvdW50X2ZzYiA9IGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYjsKKwlBU1NFUlQoY291bnRfZnNiID4gMCk7CisKKwlyZXNhbGlnbmVkID0gY291bnRfZnNiOworCWlmICh1bmxpa2VseShleHRzeikpIHsKKwkJaWYgKCh0ZW1wID0gZG9fbW9kKG9mZnNldF9mc2IsIGV4dHN6KSkpCisJCQlyZXNhbGlnbmVkICs9IHRlbXA7CisJCWlmICgodGVtcCA9IGRvX21vZChyZXNhbGlnbmVkLCBleHRzeikpKQorCQkJcmVzYWxpZ25lZCArPSBleHRzeiAtIHRlbXA7CisJfQorCisJaWYgKHVubGlrZWx5KHJ0KSkgeworCQlyZXNydGV4dGVudHMgPSBxYmxvY2tzID0gcmVzYWxpZ25lZDsKKwkJcmVzcnRleHRlbnRzIC89IG1wLT5tX3NiLnNiX3JleHRzaXplOworICAJCXJlc2Jsa3MgPSBYRlNfRElPU1RSQVRfU1BBQ0VfUkVTKG1wLCAwKTsKKyAgCQlxdW90YV9mbGFnID0gWEZTX1FNT1BUX1JFU19SVEJMS1M7CisgIAl9IGVsc2UgeworICAJCXJlc3J0ZXh0ZW50cyA9IDA7CisJCXJlc2Jsa3MgPSBxYmxvY2tzID0gWEZTX0RJT1NUUkFUX1NQQUNFX1JFUyhtcCwgcmVzYWxpZ25lZCk7CisgIAkJcXVvdGFfZmxhZyA9IFhGU19RTU9QVF9SRVNfUkVHQkxLUzsKKyAgCX0KKwogCS8qCiAJICogQWxsb2NhdGUgYW5kIHNldHVwIHRoZSB0cmFuc2FjdGlvbgogCSAqLwpAQCAtNDI1LDcgKzQ5Myw2IEBACiAJCQlYRlNfV1JJVEVfTE9HX1JFUyhtcCksIHJlc3J0ZXh0ZW50cywKIAkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsCiAJCQlYRlNfV1JJVEVfTE9HX0NPVU5UKTsKLQogCS8qCiAJICogQ2hlY2sgZm9yIHJ1bm5pbmcgb3V0IG9mIHNwYWNlLCBub3RlOiBuZWVkIGxvY2sgdG8gcmV0dXJuCiAJICovCkBAIC00MzUsMjAgKzUwMiwyMCBAQAogCWlmIChlcnJvcikKIAkJZ290byBlcnJvcl9vdXQ7CiAKLQlpZiAoWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEFfTkJMS1MobXAsIHRwLCBpcCwgcWJsb2NrcywgMCwgcXVvdGFfZmxhZykpIHsKLQkJZXJyb3IgPSAoRURRVU9UKTsKKwllcnJvciA9IFhGU19UUkFOU19SRVNFUlZFX1FVT1RBX05CTEtTKG1wLCB0cCwgaXAsCisJCQkJCSAgICAgIHFibG9ja3MsIDAsIHF1b3RhX2ZsYWcpOworCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjE7Ci0JfQogCi0JYm1hcGlfZmxhZyA9IFhGU19CTUFQSV9XUklURTsKIAl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CiAKLQlpZiAoIShmbGFncyAmIEJNQVBJX01NQVApICYmIChvZmZzZXQgPCBpcC0+aV9kLmRpX3NpemUgfHwgcnQpKQorCWJtYXBpX2ZsYWcgPSBYRlNfQk1BUElfV1JJVEU7CisJaWYgKChmbGFncyAmIEJNQVBJX0RJUkVDVCkgJiYgKG9mZnNldCA8IGlwLT5pX2QuZGlfc2l6ZSB8fCBleHRzeikpCiAJCWJtYXBpX2ZsYWcgfD0gWEZTX0JNQVBJX1BSRUFMTE9DOwogCiAJLyoKLQkgKiBJc3N1ZSB0aGUgYm1hcGkoKSBjYWxsIHRvIGFsbG9jYXRlIHRoZSBibG9ja3MKKwkgKiBJc3N1ZSB0aGUgeGZzX2JtYXBpKCkgY2FsbCB0byBhbGxvY2F0ZSB0aGUgYmxvY2tzCiAJICovCiAJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3Rmc2IpOwogCW5pbWFwcyA9IDE7CkBAIC00ODMsOCArNTUwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW50LXN0YXRlIDogJXggXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKGlwLT5pX21vdW50KS0+bV9mc25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWlwLT5pX2lubywKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldF9pbWFwLT5icl9zdGFydGJsb2NrLCByZXRfaW1hcC0+YnJfc3RhcnRvZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXRfaW1hcC0+YnJfYmxvY2tjb3VudCxyZXRfaW1hcC0+YnJfc3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXRfaW1hcC0+YnJfc3RhcnRibG9jaywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmV0X2ltYXAtPmJyX3N0YXJ0b2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXRfaW1hcC0+YnJfYmxvY2tjb3VudCwKKwkJCXJldF9pbWFwLT5icl9zdGF0ZSk7CiAgICAgICAgIH0KIAlyZXR1cm4gMDsKIApAQCAtNTAwLDYgKzU2OSw2MyBAQAogCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOwogfQogCisvKgorICogSWYgdGhlIGNhbGxlciBpcyBkb2luZyBhIHdyaXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsCisgKiB0aGVuIGV4dGVuZCB0aGUgYWxsb2NhdGlvbiBvdXQgdG8gdGhlIGZpbGUgc3lzdGVtJ3Mgd3JpdGUKKyAqIGlvc2l6ZS4gIFdlIGNsZWFuIHVwIGFueSBleHRyYSBzcGFjZSBsZWZ0IG92ZXIgd2hlbiB0aGUKKyAqIGZpbGUgaXMgY2xvc2VkIGluIHhmc19pbmFjdGl2ZSgpLgorICoKKyAqIEZvciBzeW5jIHdyaXRlcywgd2UgYXJlIGZsdXNoaW5nIGRlbGF5ZWQgYWxsb2NhdGUgc3BhY2UgdG8KKyAqIHRyeSB0byBtYWtlIGFkZGl0aW9uYWwgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uIG5lYXIKKyAqIHRoZSBmaWxlc3lzdGVtIGZ1bGwgYm91bmRhcnkgLSBwcmVhbGxvY2F0aW9uIGh1cnRzIGluIHRoYXQKKyAqIHNpdHVhdGlvbiwgb2YgY291cnNlLgorICovCitTVEFUSUMgaW50Cit4ZnNfaW9tYXBfZW9mX3dhbnRfcHJlYWxsb2NhdGUoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19pb2NvcmVfdAkqaW8sCisJeGZzX2ZzaXplX3QJaXNpemUsCisJeGZzX29mZl90CW9mZnNldCwKKwlzaXplX3QJCWNvdW50LAorCWludAkJaW9mbGFnLAorCXhmc19ibWJ0X2lyZWNfdCAqaW1hcCwKKwlpbnQJCW5pbWFwcywKKwlpbnQJCSpwcmVhbGxvYykKK3sKKwl4ZnNfZmlsZW9mZl90ICAgc3RhcnRfZnNiOworCXhmc19maWxibGtzX3QgICBjb3VudF9mc2I7CisJeGZzX2ZzYmxvY2tfdAlmaXJzdGJsb2NrOworCWludAkJbiwgZXJyb3IsIGltYXBzOworCisJKnByZWFsbG9jID0gMDsKKwlpZiAoKGlvZmxhZyAmIEJNQVBJX1NZTkMpIHx8IChvZmZzZXQgKyBjb3VudCkgPD0gaXNpemUpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYW55IHJlYWwgYmxvY2tzIHBhc3QgZW9mLCB0aGVuIGRvbid0CisJICogZG8gYW55IHNwZWN1bGF0aXZlIGFsbG9jYXRpb24uCisJICovCisJc3RhcnRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50IC0gMSkpKTsKKwljb3VudF9mc2IgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3QpWEZTX01BWElPRkZTRVQobXApKTsKKwl3aGlsZSAoY291bnRfZnNiID4gMCkgeworCQlpbWFwcyA9IG5pbWFwczsKKwkJZmlyc3RibG9jayA9IE5VTExGU0JMT0NLOworCQllcnJvciA9IFhGU19CTUFQSShtcCwgTlVMTCwgaW8sIHN0YXJ0X2ZzYiwgY291bnRfZnNiLAorCQkJCSAgMCwgJmZpcnN0YmxvY2ssIDAsIGltYXAsICZpbWFwcywgTlVMTCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJZm9yIChuID0gMDsgbiA8IGltYXBzOyBuKyspIHsKKwkJCWlmICgoaW1hcFtuXS5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSAmJgorCQkJICAgIChpbWFwW25dLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXN0YXJ0X2ZzYiArPSBpbWFwW25dLmJyX2Jsb2NrY291bnQ7CisJCQljb3VudF9mc2IgLT0gaW1hcFtuXS5icl9ibG9ja2NvdW50OworCQl9CisJfQorCSpwcmVhbGxvYyA9IDE7CisJcmV0dXJuIDA7Cit9CisKIGludAogeGZzX2lvbWFwX3dyaXRlX2RlbGF5KAogCXhmc19pbm9kZV90CSppcCwKQEAgLTUxMywxMyArNjM5LDE1IEBACiAJeGZzX2lvY29yZV90CSppbyA9ICZpcC0+aV9pb2NvcmU7CiAJeGZzX2ZpbGVvZmZfdAlvZmZzZXRfZnNiOwogCXhmc19maWxlb2ZmX3QJbGFzdF9mc2I7Ci0JeGZzX2ZzaXplX3QJaXNpemU7CisJeGZzX29mZl90CWFsaWduZWRfb2Zmc2V0OworCXhmc19maWxlb2ZmX3QJaW9hbGlnbjsKIAl4ZnNfZnNibG9ja190CWZpcnN0YmxvY2s7CisJeGZzX2V4dGxlbl90CWV4dHN6OworCXhmc19mc2l6ZV90CWlzaXplOwogCWludAkJbmltYXBzOwotCWludAkJZXJyb3I7CiAJeGZzX2JtYnRfaXJlY190IGltYXBbWEZTX1dSSVRFX0lNQVBTXTsKLQlpbnQJCWFlb2Y7Ci0JaW50CQlmc3luY2VkID0gMDsKKwlpbnQJCXByZWFsbG9jLCBmc3luY2VkID0gMDsKKwlpbnQJCWVycm9yOwogCiAJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkgIT0gMCk7CiAKQEAgLTUyNywxNTIgKzY1NSw1NyBAQAogCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBkcXVvdHMgYXJlIHRoZXJlLiBUaGlzIGRvZXNuJ3QgaG9sZAogCSAqIHRoZSBpbG9jayBhY3Jvc3MgYSBkaXNrIHJlYWQuCiAJICovCi0KIAllcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgaXAsIFhGU19RTU9QVF9JTE9DS0VEKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOwogCisJaWYgKFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpIHsKKwkJaWYgKCEoZXh0c3ogPSBpcC0+aV9kLmRpX2V4dHNpemUpKQorCQkJZXh0c3ogPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwl9IGVsc2UgeworCQlleHRzeiA9IGlwLT5pX2QuZGlfZXh0c2l6ZTsKKwl9CisKKwlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKKwogcmV0cnk6CiAJaXNpemUgPSBpcC0+aV9kLmRpX3NpemU7Ci0JaWYgKGlvLT5pb19uZXdfc2l6ZSA+IGlzaXplKSB7CisJaWYgKGlvLT5pb19uZXdfc2l6ZSA+IGlzaXplKQogCQlpc2l6ZSA9IGlvLT5pb19uZXdfc2l6ZTsKLQl9CiAKLQlhZW9mID0gMDsKLQlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKLQlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOwotCS8qCi0JICogSWYgdGhlIGNhbGxlciBpcyBkb2luZyBhIHdyaXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsCi0JICogdGhlbiBleHRlbmQgdGhlIGFsbG9jYXRpb24gKGFuZCB0aGUgYnVmZmVyIHVzZWQgZm9yIHRoZSB3cml0ZSkKLQkgKiBvdXQgdG8gdGhlIGZpbGUgc3lzdGVtJ3Mgd3JpdGUgaW9zaXplLiAgV2UgY2xlYW4gdXAgYW55IGV4dHJhCi0JICogc3BhY2UgbGVmdCBvdmVyIHdoZW4gdGhlIGZpbGUgaXMgY2xvc2VkIGluIHhmc19pbmFjdGl2ZSgpLgotCSAqCi0JICogRm9yIHN5bmMgd3JpdGVzLCB3ZSBhcmUgZmx1c2hpbmcgZGVsYXllZCBhbGxvY2F0ZSBzcGFjZSB0bwotCSAqIHRyeSB0byBtYWtlIGFkZGl0aW9uYWwgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uIG5lYXIKLQkgKiB0aGUgZmlsZXN5c3RlbSBmdWxsIGJvdW5kYXJ5IC0gcHJlYWxsb2NhdGlvbiBodXJ0cyBpbiB0aGF0Ci0JICogc2l0dWF0aW9uLCBvZiBjb3Vyc2UuCi0JICovCi0JaWYgKCEoaW9mbGFnICYgQk1BUElfU1lOQykgJiYgKChvZmZzZXQgKyBjb3VudCkgPiBpcC0+aV9kLmRpX3NpemUpKSB7Ci0JCXhmc19vZmZfdAlhbGlnbmVkX29mZnNldDsKLQkJeGZzX2ZpbGJsa3NfdCAgIGNvdW50X2ZzYjsKLQkJdW5zaWduZWQgaW50CWlvc2l6ZTsKLQkJeGZzX2ZpbGVvZmZfdAlpb2FsaWduOwotCQlpbnQJCW47Ci0JCXhmc19maWxlb2ZmX3QgICBzdGFydF9mc2I7CisJZXJyb3IgPSB4ZnNfaW9tYXBfZW9mX3dhbnRfcHJlYWxsb2NhdGUobXAsIGlvLCBpc2l6ZSwgb2Zmc2V0LCBjb3VudCwKKwkJCQlpb2ZsYWcsIGltYXAsIFhGU19XUklURV9JTUFQUywgJnByZWFsbG9jKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAotCQkvKgotCQkgKiBJZiB0aGVyZSBhcmUgYW55IHJlYWwgYmxvY2tzIHBhc3QgZW9mLCB0aGVuIGRvbid0Ci0JCSAqIGRvIGFueSBzcGVjdWxhdGl2ZSBhbGxvY2F0aW9uLgotCQkgKi8KLQkJc3RhcnRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwKLQkJCQkJKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50IC0gMSkpKTsKLQkJY291bnRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KVhGU19NQVhJT0ZGU0VUKG1wKSk7Ci0JCXdoaWxlIChjb3VudF9mc2IgPiAwKSB7Ci0JCQluaW1hcHMgPSBYRlNfV1JJVEVfSU1BUFM7Ci0JCQllcnJvciA9IFhGU19CTUFQSShtcCwgTlVMTCwgaW8sIHN0YXJ0X2ZzYiwgY291bnRfZnNiLAotCQkJCQkwLCAmZmlyc3RibG9jaywgMCwgaW1hcCwgJm5pbWFwcywgTlVMTCk7Ci0JCQlpZiAoZXJyb3IpIHsKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQl9Ci0JCQlmb3IgKG4gPSAwOyBuIDwgbmltYXBzOyBuKyspIHsKLQkJCQlpZiAoICEoaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgICYmIAotCQkJCQkhaW1hcFtuXS5icl9zdGFydGJsb2NrKSB7Ci0JCQkJCWNtbl9lcnIoQ0VfUEFOSUMsIkFjY2VzcyB0byBibG9jayAiCi0JCQkJCQkiemVybzogIGZzIDwlcz4gaW5vZGU6ICVsbGQgIgotCQkJCQkJInN0YXJ0X2Jsb2NrIDogJWxseCBzdGFydF9vZmYgIgotCQkJCQkJIjogJWxseCBibGtjbnQgOiAlbGx4ICIKLQkJCQkJCSJleHRlbnQtc3RhdGUgOiAleCBcbiIsCi0JCQkJCQkoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwKLQkJCQkJCShsb25nIGxvbmcpaXAtPmlfaW5vLAotCQkJCQkJaW1hcFtuXS5icl9zdGFydGJsb2NrLAotCQkJCQkJaW1hcFtuXS5icl9zdGFydG9mZiwKLQkJCQkJCWltYXBbbl0uYnJfYmxvY2tjb3VudCwKLQkJCQkJCWltYXBbbl0uYnJfc3RhdGUpOwotICAgICAgICAJCQl9Ci0JCQkJaWYgKChpbWFwW25dLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spICYmCi0JCQkJICAgIChpbWFwW25dLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSkgewotCQkJCQlnb3RvIHdyaXRlX21hcDsKLQkJCQl9Ci0JCQkJc3RhcnRfZnNiICs9IGltYXBbbl0uYnJfYmxvY2tjb3VudDsKLQkJCQljb3VudF9mc2IgLT0gaW1hcFtuXS5icl9ibG9ja2NvdW50OwotCQkJfQotCQl9Ci0JCWlvc2l6ZSA9IG1wLT5tX3dyaXRlaW9fYmxvY2tzOworCWlmIChwcmVhbGxvYykgewogCQlhbGlnbmVkX29mZnNldCA9IFhGU19XUklURUlPX0FMSUdOKG1wLCAob2Zmc2V0ICsgY291bnQgLSAxKSk7CiAJCWlvYWxpZ24gPSBYRlNfQl9UT19GU0JUKG1wLCBhbGlnbmVkX29mZnNldCk7Ci0JCWxhc3RfZnNiID0gaW9hbGlnbiArIGlvc2l6ZTsKLQkJYWVvZiA9IDE7CisJCWxhc3RfZnNiID0gaW9hbGlnbiArIG1wLT5tX3dyaXRlaW9fYmxvY2tzOworCX0gZWxzZSB7CisJCWxhc3RfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoKHhmc191ZnNpemVfdCkob2Zmc2V0ICsgY291bnQpKSk7CiAJfQotd3JpdGVfbWFwOgorCisJaWYgKHByZWFsbG9jIHx8IGV4dHN6KSB7CisJCWVycm9yID0geGZzX2lvbWFwX2VvZl9hbGlnbl9sYXN0X2ZzYihtcCwgaW8sIGlzaXplLCBleHRzeiwKKwkJCQkJCQkmbGFzdF9mc2IpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCiAJbmltYXBzID0gWEZTX1dSSVRFX0lNQVBTOwogCWZpcnN0YmxvY2sgPSBOVUxMRlNCTE9DSzsKLQotCS8qCi0JICogSWYgbW91bnRlZCB3aXRoIHRoZSAiLW8gc3dhbGxvYyIgb3B0aW9uLCByb3VuZHVwIHRoZSBhbGxvY2F0aW9uCi0JICogcmVxdWVzdCB0byBhIHN0cmlwZSB3aWR0aCBib3VuZGFyeSBpZiB0aGUgZmlsZSBzaXplIGlzID49Ci0JICogc3RyaXBlIHdpZHRoIGFuZCB3ZSBhcmUgYWxsb2NhdGluZyBwYXN0IHRoZSBhbGxvY2F0aW9uIGVvZi4KLQkgKi8KLQlpZiAoIShpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSAmJiBtcC0+bV9zd2lkdGggCi0JICAgICYmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9TV0FMTE9DKQotCSAgICAmJiAoaXNpemUgPj0gWEZTX0ZTQl9UT19CKG1wLCBtcC0+bV9zd2lkdGgpKSAmJiBhZW9mKSB7Ci0JCWludCBlb2Y7Ci0JCXhmc19maWxlb2ZmX3QgbmV3X2xhc3RfZnNiOwotCi0JCW5ld19sYXN0X2ZzYiA9IHJvdW5kdXBfNjQobGFzdF9mc2IsIG1wLT5tX3N3aWR0aCk7Ci0JCWVycm9yID0geGZzX2JtYXBfZW9mKGlwLCBuZXdfbGFzdF9mc2IsIFhGU19EQVRBX0ZPUkssICZlb2YpOwotCQlpZiAoZXJyb3IpIHsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCQlpZiAoZW9mKSB7Ci0JCQlsYXN0X2ZzYiA9IG5ld19sYXN0X2ZzYjsKLQkJfQotCS8qCi0JICogUm91bmR1cCB0aGUgYWxsb2NhdGlvbiByZXF1ZXN0IHRvIGEgc3RyaXBlIHVuaXQgKG1fZGFsaWduKSBib3VuZGFyeQotCSAqIGlmIHRoZSBmaWxlIHNpemUgaXMgPj0gc3RyaXBlIHVuaXQgc2l6ZSwgYW5kIHdlIGFyZSBhbGxvY2F0aW5nIHBhc3QKLQkgKiB0aGUgYWxsb2NhdGlvbiBlb2YuCi0JICovCi0JfSBlbHNlIGlmICghKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICYmIG1wLT5tX2RhbGlnbiAmJgotCQkgICAoaXNpemUgPj0gWEZTX0ZTQl9UT19CKG1wLCBtcC0+bV9kYWxpZ24pKSAmJiBhZW9mKSB7Ci0JCWludCBlb2Y7Ci0JCXhmc19maWxlb2ZmX3QgbmV3X2xhc3RfZnNiOwotCQluZXdfbGFzdF9mc2IgPSByb3VuZHVwXzY0KGxhc3RfZnNiLCBtcC0+bV9kYWxpZ24pOwotCQllcnJvciA9IHhmc19ibWFwX2VvZihpcCwgbmV3X2xhc3RfZnNiLCBYRlNfREFUQV9GT1JLLCAmZW9mKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQkJaWYgKGVvZikgewotCQkJbGFzdF9mc2IgPSBuZXdfbGFzdF9mc2I7Ci0JCX0KLQkvKgotCSAqIFJvdW5kIHVwIHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QgdG8gYSByZWFsLXRpbWUgZXh0ZW50IGJvdW5kYXJ5Ci0JICogaWYgdGhlIGZpbGUgaXMgb24gdGhlIHJlYWwtdGltZSBzdWJ2b2x1bWUuCi0JICovCi0JfSBlbHNlIGlmIChpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUICYmIGFlb2YpIHsKLQkJaW50IGVvZjsKLQkJeGZzX2ZpbGVvZmZfdCBuZXdfbGFzdF9mc2I7Ci0KLQkJbmV3X2xhc3RfZnNiID0gcm91bmR1cF82NChsYXN0X2ZzYiwgbXAtPm1fc2Iuc2JfcmV4dHNpemUpOwotCQllcnJvciA9IFhGU19CTUFQX0VPRihtcCwgaW8sIG5ld19sYXN0X2ZzYiwgWEZTX0RBVEFfRk9SSywgJmVvZik7Ci0JCWlmIChlcnJvcikgewotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JCWlmIChlb2YpCi0JCQlsYXN0X2ZzYiA9IG5ld19sYXN0X2ZzYjsKLQl9CiAJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIG9mZnNldF9mc2IsCiAJCQkgICh4ZnNfZmlsYmxrc190KShsYXN0X2ZzYiAtIG9mZnNldF9mc2IpLAogCQkJICBYRlNfQk1BUElfREVMQVkgfCBYRlNfQk1BUElfV1JJVEUgfAogCQkJICBYRlNfQk1BUElfRU5USVJFLCAmZmlyc3RibG9jaywgMSwgaW1hcCwKIAkJCSAgJm5pbWFwcywgTlVMTCk7Ci0JLyoKLQkgKiBUaGlzIGNhbiBiZSBFRFFVT1QsIGlmIG5pbWFwcyA9PSAwCi0JICovCi0JaWYgKGVycm9yICYmIChlcnJvciAhPSBFTk9TUEMpKSB7CisJaWYgKGVycm9yICYmIChlcnJvciAhPSBFTk9TUEMpKQogCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKLQl9CisKIAkvKgogCSAqIElmIGJtYXBpIHJldHVybmVkIHVzIG5vdGhpbmcsIGFuZCBpZiB3ZSBkaWRuJ3QgZ2V0IGJhY2sgRURRVU9ULAotCSAqIHRoZW4gd2UgbXVzdCBoYXZlIHJ1biBvdXQgb2Ygc3BhY2UuCisJICogdGhlbiB3ZSBtdXN0IGhhdmUgcnVuIG91dCBvZiBzcGFjZSAtIGZsdXNoIGRlbGFsbG9jLCBhbmQgcmV0cnkuLgogCSAqLwogCWlmIChuaW1hcHMgPT0gMCkgewogCQl4ZnNfaW9tYXBfZW50ZXJfdHJhY2UoWEZTX0lPTUFQX1dSSVRFX05PU1BBQ0UsCkBAIC02ODQsMTcgKzcxNywyMSBAQAogCQlnb3RvIHJldHJ5OwogCX0KIAotCSpyZXRfaW1hcCA9IGltYXBbMF07Ci0JKm5tYXBzID0gMTsKLQlpZiAoICEoaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgICYmICFyZXRfaW1hcC0+YnJfc3RhcnRibG9jaykgeworCWlmICghKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICAmJiAhcmV0X2ltYXAtPmJyX3N0YXJ0YmxvY2spIHsKIAkJY21uX2VycihDRV9QQU5JQywiQWNjZXNzIHRvIGJsb2NrIHplcm86ICBmcyA8JXM+IGlub2RlOiAlbGxkICIKICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFydF9ibG9jayA6ICVsbHggc3RhcnRfb2ZmIDogJWxseCBibGtjbnQgOiAlbGx4ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnQtc3RhdGUgOiAleCBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaXAtPmlfaW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0X2ltYXAtPmJyX3N0YXJ0YmxvY2ssIHJldF9pbWFwLT5icl9zdGFydG9mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldF9pbWFwLT5icl9ibG9ja2NvdW50LHJldF9pbWFwLT5icl9zdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJldF9pbWFwLT5icl9zdGFydGJsb2NrLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXRfaW1hcC0+YnJfc3RhcnRvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJldF9pbWFwLT5icl9ibG9ja2NvdW50LAorCQkJcmV0X2ltYXAtPmJyX3N0YXRlKTsKIAl9CisKKwkqcmV0X2ltYXAgPSBpbWFwWzBdOworCSpubWFwcyA9IDE7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODIwLDE3ICs4NTcsMjEgQEAKIAkJICovCiAKIAkJZm9yIChpID0gMDsgaSA8IG5pbWFwczsgaSsrKSB7Ci0JCQlpZiAoICEoaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgICYmIAotCQkJCSFpbWFwW2ldLmJyX3N0YXJ0YmxvY2spIHsKKwkJCWlmICghKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICAmJgorCQkJICAgICFpbWFwW2ldLmJyX3N0YXJ0YmxvY2spIHsKIAkJCQljbW5fZXJyKENFX1BBTklDLCJBY2Nlc3MgdG8gYmxvY2sgemVybzogICIKIAkJCQkJImZzIDwlcz4gaW5vZGU6ICVsbGQgIgotCQkJCQkic3RhcnRfYmxvY2sgOiAlbGx4IHN0YXJ0X29mZiA6ICVsbHggIiAKKwkJCQkJInN0YXJ0X2Jsb2NrIDogJWxseCBzdGFydF9vZmYgOiAlbGx4ICIKIAkJCQkJImJsa2NudCA6ICVsbHggZXh0ZW50LXN0YXRlIDogJXggXG4iLAogCQkJCQkoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwKIAkJCQkJKGxvbmcgbG9uZylpcC0+aV9pbm8sCi0JCQkJCWltYXBbaV0uYnJfc3RhcnRibG9jaywKLQkJCQkJaW1hcFtpXS5icl9zdGFydG9mZiwKLQkJCQkgICAgICAgIGltYXBbaV0uYnJfYmxvY2tjb3VudCxpbWFwW2ldLmJyX3N0YXRlKTsKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCWltYXBbaV0uYnJfc3RhcnRibG9jaywKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCWltYXBbaV0uYnJfc3RhcnRvZmYsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJICAgICAgICAJaW1hcFtpXS5icl9ibG9ja2NvdW50LAorCQkJCQlpbWFwW2ldLmJyX3N0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAkJCWlmICgob2Zmc2V0X2ZzYiA+PSBpbWFwW2ldLmJyX3N0YXJ0b2ZmKSAmJgogCQkJICAgIChvZmZzZXRfZnNiIDwgKGltYXBbaV0uYnJfc3RhcnRvZmYgKwpAQCAtODY3LDE3ICs5MDgsMTcgQEAKIHsKIAl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKIAl4ZnNfaW9jb3JlX3QgICAgKmlvID0gJmlwLT5pX2lvY29yZTsKLQl4ZnNfdHJhbnNfdAkqdHA7CiAJeGZzX2ZpbGVvZmZfdAlvZmZzZXRfZnNiOwogCXhmc19maWxibGtzX3QJY291bnRfZnNiOwogCXhmc19maWxibGtzX3QJbnVtYmxrc19mc2I7Ci0JeGZzX2JtYnRfaXJlY190CWltYXA7CisJeGZzX2ZzYmxvY2tfdAlmaXJzdGZzYjsKKwlpbnQJCW5pbWFwczsKKwl4ZnNfdHJhbnNfdAkqdHA7CisJeGZzX2JtYnRfaXJlY190IGltYXA7CisJeGZzX2JtYXBfZnJlZV90IGZyZWVfbGlzdDsKKwl1aW50CQlyZXNibGtzOwogCWludAkJY29tbWl0dGVkOwogCWludAkJZXJyb3I7Ci0JaW50CQlucmVzOwotCWludAkJbmltYXBzOwotCXhmc19mc2Jsb2NrX3QJZmlyc3Rmc2I7Ci0JeGZzX2JtYXBfZnJlZV90CWZyZWVfbGlzdDsKIAogCXhmc19pb21hcF9lbnRlcl90cmFjZShYRlNfSU9NQVBfVU5XUklUVEVOLAogCQkJCSZpcC0+aV9pb2NvcmUsIG9mZnNldCwgY291bnQpOwpAQCAtODg2LDkgKzkyNyw5IEBACiAJY291bnRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW9mZnNldCArIGNvdW50KTsKIAljb3VudF9mc2IgPSAoeGZzX2ZpbGJsa3NfdCkoY291bnRfZnNiIC0gb2Zmc2V0X2ZzYik7CiAKLQlkbyB7Ci0JCW5yZXMgPSBYRlNfRElPU1RSQVRfU1BBQ0VfUkVTKG1wLCAwKTsKKwlyZXNibGtzID0gWEZTX0RJT1NUUkFUX1NQQUNFX1JFUyhtcCwgMCkgPDwgMTsKIAorCWRvIHsKIAkJLyoKIAkJICogc2V0IHVwIGEgdHJhbnNhY3Rpb24gdG8gY29udmVydCB0aGUgcmFuZ2Ugb2YgZXh0ZW50cwogCQkgKiBmcm9tIHVud3JpdHRlbiB0byByZWFsLiBEbyBhbGxvY2F0aW9ucyBpbiBhIGxvb3AgdW50aWwKQEAgLTg5Niw3ICs5MzcsNyBAQAogCQkgKi8KIAogCQl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1NUUkFUX1dSSVRFKTsKLQkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgbnJlcywKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgcmVzYmxrcywKIAkJCQlYRlNfV1JJVEVfTE9HX1JFUyhtcCksIDAsCiAJCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKIAkJCQlYRlNfV1JJVEVfTE9HX0NPVU5UKTsKQEAgLTkxNSw3ICs5NTYsNyBAQAogCQlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdGZzYik7CiAJCW5pbWFwcyA9IDE7CiAJCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgb2Zmc2V0X2ZzYiwgY291bnRfZnNiLAotCQkJCSAgWEZTX0JNQVBJX1dSSVRFLCAmZmlyc3Rmc2IsCisJCQkJICBYRlNfQk1BUElfV1JJVEV8WEZTX0JNQVBJX0NPTlZFUlQsICZmaXJzdGZzYiwKIAkJCQkgIDEsICZpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBlcnJvcl9vbl9ibWFwaV90cmFuc2FjdGlvbjsKQEAgLTkyOSwxNSArOTcwLDE3IEBACiAJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwotCQkKKwogCQlpZiAoICEoaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgICYmICFpbWFwLmJyX3N0YXJ0YmxvY2spIHsKIAkJCWNtbl9lcnIoQ0VfUEFOSUMsIkFjY2VzcyB0byBibG9jayB6ZXJvOiAgZnMgPCVzPiAiCiAJCQkJImlub2RlOiAlbGxkIHN0YXJ0X2Jsb2NrIDogJWxseCBzdGFydF9vZmYgOiAiCiAJCQkJIiVsbHggYmxrY250IDogJWxseCBleHRlbnQtc3RhdGUgOiAleCBcbiIsCiAJCQkJKGlwLT5pX21vdW50KS0+bV9mc25hbWUsCiAJCQkJKGxvbmcgbG9uZylpcC0+aV9pbm8sCi0JCQkJaW1hcC5icl9zdGFydGJsb2NrLGltYXAuYnJfc3RhcnRvZmYsCi0JCQkJaW1hcC5icl9ibG9ja2NvdW50LGltYXAuYnJfc3RhdGUpOworCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW1hcC5icl9zdGFydGJsb2NrLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW1hcC5icl9zdGFydG9mZiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWltYXAuYnJfYmxvY2tjb3VudCwKKwkJCQlpbWFwLmJyX3N0YXRlKTsKICAgICAgICAgCX0KIAogCQlpZiAoKG51bWJsa3NfZnNiID0gaW1hcC5icl9ibG9ja2NvdW50KSA9PSAwKSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2l0YWJsZS5jIGIvZnMveGZzL3hmc19pdGFibGUuYwppbmRleCBmNjM2NDZlLi5jNTk0NTBlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2l0YWJsZS5jCisrKyBiL2ZzL3hmcy94ZnNfaXRhYmxlLmMKQEAgLTU2LDYgKzU2LDcgQEAKIHsKIAl4ZnNfZGlub2RlX2NvcmVfdCAqZGljOwkJLyogZGlub2RlIGNvcmUgaW5mbyBwb2ludGVyICovCiAJeGZzX2lub2RlX3QJKmlwOwkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl2bm9kZV90CQkqdnA7CiAJaW50CQllcnJvcjsKIAogCWVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIGlubywgMCwgWEZTX0lMT0NLX1NIQVJFRCwgJmlwLCBibm8pOwpAQCAtNzIsNiArNzMsNyBAQAogCQlnb3RvIG91dF9pcHV0OwogCX0KIAorCXZwID0gWEZTX0lUT1YoaXApOwogCWRpYyA9ICZpcC0+aV9kOwogCiAJLyogeGZzX2lnZXQgcmV0dXJucyB0aGUgZm9sbG93aW5nIHdpdGhvdXQgbmVlZGluZwpAQCAtODQsOCArODYsNyBAQAogCWJ1Zi0+YnNfdWlkID0gZGljLT5kaV91aWQ7CiAJYnVmLT5ic19naWQgPSBkaWMtPmRpX2dpZDsKIAlidWYtPmJzX3NpemUgPSBkaWMtPmRpX3NpemU7Ci0JYnVmLT5ic19hdGltZS50dl9zZWMgPSBkaWMtPmRpX2F0aW1lLnRfc2VjOwotCWJ1Zi0+YnNfYXRpbWUudHZfbnNlYyA9IGRpYy0+ZGlfYXRpbWUudF9uc2VjOworCXZuX2F0aW1lX3RvX2JzdGltZSh2cCwgJmJ1Zi0+YnNfYXRpbWUpOwogCWJ1Zi0+YnNfbXRpbWUudHZfc2VjID0gZGljLT5kaV9tdGltZS50X3NlYzsKIAlidWYtPmJzX210aW1lLnR2X25zZWMgPSBkaWMtPmRpX210aW1lLnRfbnNlYzsKIAlidWYtPmJzX2N0aW1lLnR2X3NlYyA9IGRpYy0+ZGlfY3RpbWUudF9zZWM7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5jIGIvZnMveGZzL3hmc19sb2cuYwppbmRleCAyOWFmNTEyLi4zZDlhMzZlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmMKQEAgLTE3OCw2ICsxNzgsODMgQEAKICNkZWZpbmUJeGxvZ190cmFjZV9pY2xvZyhpY2xvZyxzdGF0ZSkKICNlbmRpZiAvKiBYRlNfTE9HX1RSQUNFICovCiAKKworc3RhdGljIHZvaWQKK3hsb2dfaW5zX3RpY2tldHEoc3RydWN0IHhsb2dfdGlja2V0ICoqcXAsIHN0cnVjdCB4bG9nX3RpY2tldCAqdGljKQoreworCWlmICgqcXApIHsKKwkJdGljLT50X25leHQJICAgID0gKCpxcCk7CisJCXRpYy0+dF9wcmV2CSAgICA9ICgqcXApLT50X3ByZXY7CisJCSgqcXApLT50X3ByZXYtPnRfbmV4dCA9IHRpYzsKKwkJKCpxcCktPnRfcHJldgkgICAgPSB0aWM7CisJfSBlbHNlIHsKKwkJdGljLT50X3ByZXYgPSB0aWMtPnRfbmV4dCA9IHRpYzsKKwkJKnFwID0gdGljOworCX0KKworCXRpYy0+dF9mbGFncyB8PSBYTE9HX1RJQ19JTl9ROworfQorCitzdGF0aWMgdm9pZAoreGxvZ19kZWxfdGlja2V0cShzdHJ1Y3QgeGxvZ190aWNrZXQgKipxcCwgc3RydWN0IHhsb2dfdGlja2V0ICp0aWMpCit7CisJaWYgKHRpYyA9PSB0aWMtPnRfbmV4dCkgeworCQkqcXAgPSBOVUxMOworCX0gZWxzZSB7CisJCSpxcCA9IHRpYy0+dF9uZXh0OworCQl0aWMtPnRfbmV4dC0+dF9wcmV2ID0gdGljLT50X3ByZXY7CisJCXRpYy0+dF9wcmV2LT50X25leHQgPSB0aWMtPnRfbmV4dDsKKwl9CisKKwl0aWMtPnRfbmV4dCA9IHRpYy0+dF9wcmV2ID0gTlVMTDsKKwl0aWMtPnRfZmxhZ3MgJj0gflhMT0dfVElDX0lOX1E7Cit9CisKK3N0YXRpYyB2b2lkCit4bG9nX2dyYW50X3N1Yl9zcGFjZShzdHJ1Y3QgbG9nICpsb2csIGludCBieXRlcykKK3sKKwlsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgLT0gYnl0ZXM7CisJaWYgKGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyA8IDApIHsKKwkJbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzICs9IGxvZy0+bF9sb2dzaXplOworCQlsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUtLTsKKwl9CisKKwlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyAtPSBieXRlczsKKwlpZiAoKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyA8IDApIHsKKwkJbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgKz0gbG9nLT5sX2xvZ3NpemU7CisJCWxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlLS07CisJfQorCit9CisKK3N0YXRpYyB2b2lkCit4bG9nX2dyYW50X2FkZF9zcGFjZV93cml0ZShzdHJ1Y3QgbG9nICpsb2csIGludCBieXRlcykKK3sKKwlsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgKz0gYnl0ZXM7CisJaWYgKGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyA+IGxvZy0+bF9sb2dzaXplKSB7CisJCWxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyAtPSBsb2ctPmxfbG9nc2l6ZTsKKwkJbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlKys7CisJfQorfQorCitzdGF0aWMgdm9pZAoreGxvZ19ncmFudF9hZGRfc3BhY2VfcmVzZXJ2ZShzdHJ1Y3QgbG9nICpsb2csIGludCBieXRlcykKK3sKKwlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyArPSBieXRlczsKKwlpZiAobG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgPiBsb2ctPmxfbG9nc2l6ZSkgeworCQlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyAtPSBsb2ctPmxfbG9nc2l6ZTsKKwkJbG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUrKzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreGxvZ19ncmFudF9hZGRfc3BhY2Uoc3RydWN0IGxvZyAqbG9nLCBpbnQgYnl0ZXMpCit7CisJeGxvZ19ncmFudF9hZGRfc3BhY2Vfd3JpdGUobG9nLCBieXRlcyk7CisJeGxvZ19ncmFudF9hZGRfc3BhY2VfcmVzZXJ2ZShsb2csIGJ5dGVzKTsKK30KKworCiAvKgogICogTk9URVM6CiAgKgpAQCAtNDI4LDcgKzUwNSw3IEBACiAJCWlmIChyZWFkb25seSkKIAkJCXZmc3AtPnZmc19mbGFnICY9IH5WRlNfUkRPTkxZOwogCi0JCWVycm9yID0geGxvZ19yZWNvdmVyKG1wLT5tX2xvZywgcmVhZG9ubHkpOworCQllcnJvciA9IHhsb2dfcmVjb3ZlcihtcC0+bV9sb2cpOwogCiAJCWlmIChyZWFkb25seSkKIAkJCXZmc3AtPnZmc19mbGFnIHw9IFZGU19SRE9OTFk7CkBAIC0xMzIwLDggKzEzOTcsNyBAQAogCiAJLyogbW92ZSBncmFudCBoZWFkcyBieSByb3VuZG9mZiBpbiBzeW5jICovCiAJcyA9IEdSQU5UX0xPQ0sobG9nKTsKLQlYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csIHJvdW5kb2ZmLCAndycpOwotCVhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZywgcm91bmRvZmYsICdyJyk7CisJeGxvZ19ncmFudF9hZGRfc3BhY2UobG9nLCByb3VuZG9mZik7CiAJR1JBTlRfVU5MT0NLKGxvZywgcyk7CiAKIAkvKiBwdXQgY3ljbGUgbnVtYmVyIGluIGV2ZXJ5IGJsb2NrICovCkBAIC0xNTE1LDcgKzE1OTEsNiBAQAogICogcHJpbnQgb3V0IGluZm8gcmVsYXRpbmcgdG8gcmVnaW9ucyB3cml0dGVuIHdoaWNoIGNvbnN1bWUKICAqIHRoZSByZXNlcnZhdGlvbgogICovCi0jaWYgZGVmaW5lZChYRlNfTE9HX1JFU19ERUJVRykKIFNUQVRJQyB2b2lkCiB4bG9nX3ByaW50X3RpY19yZXMoeGZzX21vdW50X3QgKm1wLCB4bG9nX3RpY2tldF90ICp0aWNrZXQpCiB7CkBAIC0xNjA1LDExICsxNjgwLDExIEBACiAJCQl0aWNrZXQtPnRfcmVzX2Fycl9zdW0sIHRpY2tldC0+dF9yZXNfb19mbG93LAogCQkJdGlja2V0LT50X3Jlc19udW1fb3BoZHJzLCBvcGhkcl9zcGMsCiAJCQl0aWNrZXQtPnRfcmVzX2Fycl9zdW0gKyAKLQkJCSAgdGlja2V0LT50X3Jlc19vX2Zsb3cgKyBvcGhkcl9zcGMsCisJCQl0aWNrZXQtPnRfcmVzX29fZmxvdyArIG9waGRyX3NwYywKIAkJCXRpY2tldC0+dF9yZXNfbnVtKTsKIAogCWZvciAoaSA9IDA7IGkgPCB0aWNrZXQtPnRfcmVzX251bTsgaSsrKSB7Ci0JICAgCXVpbnQgcl90eXBlID0gdGlja2V0LT50X3Jlc19hcnJbaV0ucl90eXBlOyAKKwkJdWludCByX3R5cGUgPSB0aWNrZXQtPnRfcmVzX2FycltpXS5yX3R5cGU7IAogCQljbW5fZXJyKENFX1dBUk4sCiAJCQkgICAgInJlZ2lvblsldV06ICVzIC0gJXUgYnl0ZXNcbiIsCiAJCQkgICAgaSwgCkBAIC0xNjE4LDkgKzE2OTMsNiBAQAogCQkJICAgIHRpY2tldC0+dF9yZXNfYXJyW2ldLnJfbGVuKTsKIAl9CiB9Ci0jZWxzZQotI2RlZmluZSB4bG9nX3ByaW50X3RpY19yZXMobXAsIHRpY2tldCkKLSNlbmRpZgogCiAvKgogICogV3JpdGUgc29tZSByZWdpb24gb3V0IHRvIGluLWNvcmUgbG9nCkBAIC0yMzg5LDcgKzI0NjEsNyBAQAogCiAJLyogc29tZXRoaW5nIGlzIGFscmVhZHkgc2xlZXBpbmc7IGluc2VydCBuZXcgdHJhbnNhY3Rpb24gYXQgZW5kICovCiAJaWYgKGxvZy0+bF9yZXNlcnZlX2hlYWRxKSB7Ci0JCVhMT0dfSU5TX1RJQ0tFVFEobG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CisJCXhsb2dfaW5zX3RpY2tldHEoJmxvZy0+bF9yZXNlcnZlX2hlYWRxLCB0aWMpOwogCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLAogCQkJCSAgICAieGxvZ19ncmFudF9sb2dfc3BhY2U6IHNsZWVwIDEiKTsKIAkJLyoKQEAgLTI0MjIsNyArMjQ5NCw3IEBACiAJCQkJICAgICBsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyk7CiAJaWYgKGZyZWVfYnl0ZXMgPCBuZWVkX2J5dGVzKSB7CiAJCWlmICgodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkgPT0gMCkKLQkJCVhMT0dfSU5TX1RJQ0tFVFEobG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CisJCQl4bG9nX2luc190aWNrZXRxKCZsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKIAkJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpYywKIAkJCQkgICAgInhsb2dfZ3JhbnRfbG9nX3NwYWNlOiBzbGVlcCAyIik7CiAJCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOwpAQCAtMjQzOSwxMSArMjUxMSwxMCBAQAogCQlzID0gR1JBTlRfTE9DSyhsb2cpOwogCQlnb3RvIHJlZG87CiAJfSBlbHNlIGlmICh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTl9RKQotCQlYTE9HX0RFTF9USUNLRVRRKGxvZy0+bF9yZXNlcnZlX2hlYWRxLCB0aWMpOworCQl4bG9nX2RlbF90aWNrZXRxKCZsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKIAogCS8qIHdlJ3ZlIGdvdCBlbm91Z2ggc3BhY2UgKi8KLQlYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csIG5lZWRfYnl0ZXMsICd3Jyk7Ci0JWExPR19HUkFOVF9BRERfU1BBQ0UobG9nLCBuZWVkX2J5dGVzLCAncicpOworCXhsb2dfZ3JhbnRfYWRkX3NwYWNlKGxvZywgbmVlZF9ieXRlcyk7CiAjaWZkZWYgREVCVUcKIAl0YWlsX2xzbiA9IGxvZy0+bF90YWlsX2xzbjsKIAkvKgpAQCAtMjQ2NCw3ICsyNTM1LDcgQEAKIAogIGVycm9yX3JldHVybjoKIAlpZiAodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkKLQkJWExPR19ERUxfVElDS0VUUShsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKKwkJeGxvZ19kZWxfdGlja2V0cSgmbG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CiAJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpYywgInhsb2dfZ3JhbnRfbG9nX3NwYWNlOiBlcnJfcmV0Iik7CiAJLyoKIAkgKiBJZiB3ZSBhcmUgZmFpbGluZywgbWFrZSBzdXJlIHRoZSB0aWNrZXQgZG9lc24ndCBoYXZlIGFueQpAQCAtMjUzMyw3ICsyNjA0LDcgQEAKIAogCQlpZiAobnRpYyAhPSBsb2ctPmxfd3JpdGVfaGVhZHEpIHsKIAkJCWlmICgodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkgPT0gMCkKLQkJCQlYTE9HX0lOU19USUNLRVRRKGxvZy0+bF93cml0ZV9oZWFkcSwgdGljKTsKKwkJCQl4bG9nX2luc190aWNrZXRxKCZsb2ctPmxfd3JpdGVfaGVhZHEsIHRpYyk7CiAKIAkJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsCiAJCQkJICAgICJ4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlOiBzbGVlcCAxIik7CkBAIC0yNTY1LDcgKzI2MzYsNyBAQAogCQkJCSAgICAgbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzKTsKIAlpZiAoZnJlZV9ieXRlcyA8IG5lZWRfYnl0ZXMpIHsKIAkJaWYgKCh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTl9RKSA9PSAwKQotCQkJWExPR19JTlNfVElDS0VUUShsb2ctPmxfd3JpdGVfaGVhZHEsIHRpYyk7CisJCQl4bG9nX2luc190aWNrZXRxKCZsb2ctPmxfd3JpdGVfaGVhZHEsIHRpYyk7CiAJCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOwogCQlzdl93YWl0KCZ0aWMtPnRfc2VtYSwgUElOT0R8UExUV0FJVCwgJmxvZy0+bF9ncmFudF9sb2NrLCBzKTsKIApAQCAtMjU4MSw5ICsyNjUyLDEwIEBACiAJCXMgPSBHUkFOVF9MT0NLKGxvZyk7CiAJCWdvdG8gcmVkbzsKIAl9IGVsc2UgaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpCi0JCVhMT0dfREVMX1RJQ0tFVFEobG9nLT5sX3dyaXRlX2hlYWRxLCB0aWMpOworCQl4bG9nX2RlbF90aWNrZXRxKCZsb2ctPmxfd3JpdGVfaGVhZHEsIHRpYyk7CiAKLQlYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csIG5lZWRfYnl0ZXMsICd3Jyk7IC8qIHdlJ3ZlIGdvdCBlbm91Z2ggc3BhY2UgKi8KKwkvKiB3ZSd2ZSBnb3QgZW5vdWdoIHNwYWNlICovCisJeGxvZ19ncmFudF9hZGRfc3BhY2Vfd3JpdGUobG9nLCBuZWVkX2J5dGVzKTsKICNpZmRlZiBERUJVRwogCXRhaWxfbHNuID0gbG9nLT5sX3RhaWxfbHNuOwogCWlmIChDWUNMRV9MU04odGFpbF9sc24pICE9IGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSkgewpAQCAtMjYwMCw3ICsyNjcyLDcgQEAKIAogIGVycm9yX3JldHVybjoKIAlpZiAodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkKLQkJWExPR19ERUxfVElDS0VUUShsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKKwkJeGxvZ19kZWxfdGlja2V0cSgmbG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CiAJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpYywgInhsb2dfcmVncmFudF93cml0ZV9sb2dfc3BhY2U6IGVycl9yZXQiKTsKIAkvKgogCSAqIElmIHdlIGFyZSBmYWlsaW5nLCBtYWtlIHN1cmUgdGhlIHRpY2tldCBkb2Vzbid0IGhhdmUgYW55CkBAIC0yNjMzLDggKzI3MDUsNyBAQAogCQl0aWNrZXQtPnRfY250LS07CiAKIAlzID0gR1JBTlRfTE9DSyhsb2cpOwotCVhMT0dfR1JBTlRfU1VCX1NQQUNFKGxvZywgdGlja2V0LT50X2N1cnJfcmVzLCAndycpOwotCVhMT0dfR1JBTlRfU1VCX1NQQUNFKGxvZywgdGlja2V0LT50X2N1cnJfcmVzLCAncicpOworCXhsb2dfZ3JhbnRfc3ViX3NwYWNlKGxvZywgdGlja2V0LT50X2N1cnJfcmVzKTsKIAl0aWNrZXQtPnRfY3Vycl9yZXMgPSB0aWNrZXQtPnRfdW5pdF9yZXM7CiAJWExPR19USUNfUkVTRVRfUkVTKHRpY2tldCk7CiAJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpY2tldCwKQEAgLTI2NDcsNyArMjcxOCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csIHRpY2tldC0+dF91bml0X3JlcywgJ3InKTsKKwl4bG9nX2dyYW50X2FkZF9zcGFjZV9yZXNlcnZlKGxvZywgdGlja2V0LT50X3VuaXRfcmVzKTsKIAl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGlja2V0LAogCQkJICAgICJ4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2U6IGV4aXQiKTsKIAl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGxvZywgMCk7CkBAIC0yNjgzLDggKzI3NTQsNyBAQAogCXMgPSBHUkFOVF9MT0NLKGxvZyk7CiAJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpY2tldCwgInhsb2dfdW5ncmFudF9sb2dfc3BhY2U6IGVudGVyIik7CiAKLQlYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csIHRpY2tldC0+dF9jdXJyX3JlcywgJ3cnKTsKLQlYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csIHRpY2tldC0+dF9jdXJyX3JlcywgJ3InKTsKKwl4bG9nX2dyYW50X3N1Yl9zcGFjZShsb2csIHRpY2tldC0+dF9jdXJyX3Jlcyk7CiAKIAl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGlja2V0LCAieGxvZ191bmdyYW50X2xvZ19zcGFjZTogc3ViIGN1cnJlbnQiKTsKIApAQCAtMjY5Myw4ICsyNzYzLDcgQEAKIAkgKi8KIAlpZiAodGlja2V0LT50X2NudCA+IDApIHsKIAkJQVNTRVJUKHRpY2tldC0+dF9mbGFncyAmIFhMT0dfVElDX1BFUk1fUkVTRVJWKTsKLQkJWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLCB0aWNrZXQtPnRfdW5pdF9yZXMqdGlja2V0LT50X2NudCwndycpOwotCQlYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csIHRpY2tldC0+dF91bml0X3Jlcyp0aWNrZXQtPnRfY250LCdyJyk7CisJCXhsb2dfZ3JhbnRfc3ViX3NwYWNlKGxvZywgdGlja2V0LT50X3VuaXRfcmVzKnRpY2tldC0+dF9jbnQpOwogCX0KIAogCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsICJ4bG9nX3VuZ3JhbnRfbG9nX3NwYWNlOiBleGl0Iik7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5oIGIvZnMveGZzL3hmc19sb2cuaAppbmRleCBmNDBkNDM5Li40YjJhYzg4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5oCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmgKQEAgLTk2LDcgKzk2LDYgQEAKIAogCiAvKiBSZWdpb24gdHlwZXMgZm9yIGlvdmVjJ3MgaV90eXBlICovCi0jaWYgZGVmaW5lZChYRlNfTE9HX1JFU19ERUJVRykKICNkZWZpbmUgWExPR19SRUdfVFlQRV9CRk9STUFUCQkxCiAjZGVmaW5lIFhMT0dfUkVHX1RZUEVfQkNIVU5LCQkyCiAjZGVmaW5lIFhMT0dfUkVHX1RZUEVfRUZJX0ZPUk1BVAkzCkBAIC0xMTcsMjEgKzExNiwxMyBAQAogI2RlZmluZSBYTE9HX1JFR19UWVBFX0NPTU1JVAkJMTgKICNkZWZpbmUgWExPR19SRUdfVFlQRV9UUkFOU0hEUgkJMTkKICNkZWZpbmUgWExPR19SRUdfVFlQRV9NQVgJCTE5Ci0jZW5kaWYKIAotI2lmIGRlZmluZWQoWEZTX0xPR19SRVNfREVCVUcpCiAjZGVmaW5lIFhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIHQpICgodmVjcCktPmlfdHlwZSA9ICh0KSkKLSNlbHNlCi0jZGVmaW5lIFhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIHQpCi0jZW5kaWYKLQogCiB0eXBlZGVmIHN0cnVjdCB4ZnNfbG9nX2lvdmVjIHsKIAl4ZnNfY2FkZHJfdAkJaV9hZGRyOwkJLyogYmVnaW5uaW5nIGFkZHJlc3Mgb2YgcmVnaW9uICovCiAJaW50CQlpX2xlbjsJCS8qIGxlbmd0aCBpbiBieXRlcyBvZiByZWdpb24gKi8KLSNpZiBkZWZpbmVkKFhGU19MT0dfUkVTX0RFQlVHKQotIAl1aW50CQlpX3R5cGU7CQkvKiB0eXBlIG9mIHJlZ2lvbiAqLwotI2VuZGlmCisJdWludAkJaV90eXBlOwkJLyogdHlwZSBvZiByZWdpb24gKi8KIH0geGZzX2xvZ19pb3ZlY190OwogCiB0eXBlZGVmIHZvaWQqIHhmc19sb2dfdGlja2V0X3Q7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19wcml2LmggYi9mcy94ZnMveGZzX2xvZ19wcml2LmgKaW5kZXggNDUxOGIxOC4uMzRiY2JmNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2dfcHJpdi5oCisrKyBiL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaApAQCAtMjUzLDcgKzI1Myw2IEBACiAKIAogLyogVGlja2V0IHJlc2VydmF0aW9uIHJlZ2lvbiBhY2NvdW50aW5nICovIAotI2lmIGRlZmluZWQoWEZTX0xPR19SRVNfREVCVUcpCiAjZGVmaW5lIFhMT0dfVElDX0xFTl9NQVgJMTUKICNkZWZpbmUgWExPR19USUNfUkVTRVRfUkVTKHQpICgodCktPnRfcmVzX251bSA9IFwKIAkJCQkodCktPnRfcmVzX2Fycl9zdW0gPSAodCktPnRfcmVzX251bV9vcGhkcnMgPSAwKQpAQCAtMjc4LDE1ICsyNzcsOSBAQAogICogd2UgZG9uJ3QgY2FyZSBhYm91dC4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgeGxvZ19yZXMgewotCXVpbnQJcl9sZW47Ci0JdWludAlyX3R5cGU7CisJdWludAlyX2xlbjsJLyogcmVnaW9uIGxlbmd0aAkJOjQgKi8KKwl1aW50CXJfdHlwZTsJLyogcmVnaW9uJ3MgdHJhbnNhY3Rpb24gdHlwZQk6NCAqLwogfSB4bG9nX3Jlc190OwotI2Vsc2UKLSNkZWZpbmUgWExPR19USUNfUkVTRVRfUkVTKHQpCi0jZGVmaW5lIFhMT0dfVElDX0FERF9PUEhEUih0KQotI2RlZmluZSBYTE9HX1RJQ19BRERfUkVHSU9OKHQsIGxlbiwgdHlwZSkKLSNlbmRpZgotCiAKIHR5cGVkZWYgc3RydWN0IHhsb2dfdGlja2V0IHsKIAlzdl90CQkgICB0X3NlbWE7CSAvKiBzbGVlcCBvbiB0aGlzIHNlbWFwaG9yZSAgICAgIDogMjAgKi8KQEAgLTMwMSwxNCArMjk0LDEyIEBACiAJY2hhcgkJICAgdF9mbGFnczsJIC8qIHByb3BlcnRpZXMgb2YgcmVzZXJ2YXRpb24JIDogMSAgKi8KIAl1aW50CQkgICB0X3RyYW5zX3R5cGU7IC8qIHRyYW5zYWN0aW9uIHR5cGUgICAgICAgICAgICAgOiA0ICAqLwogCi0jaWYgZGVmaW5lZCAoWEZTX0xPR19SRVNfREVCVUcpCiAgICAgICAgIC8qIHJlc2VydmF0aW9uIGFycmF5IGZpZWxkcyAqLwogCXVpbnQJCSAgIHRfcmVzX251bTsgICAgICAgICAgICAgICAgICAgIC8qIG51bSBpbiBhcnJheSA6IDQgKi8KLQl4bG9nX3Jlc190CSAgIHRfcmVzX2FycltYTE9HX1RJQ19MRU5fTUFYXTsgIC8qIGFycmF5IG9mIHJlcyA6IFggKi8gCiAJdWludAkJICAgdF9yZXNfbnVtX29waGRyczsJCSAvKiBudW0gb3AgaGRycyAgOiA0ICovCiAJdWludAkJICAgdF9yZXNfYXJyX3N1bTsJCSAvKiBhcnJheSBzdW0gICAgOiA0ICovCiAJdWludAkJICAgdF9yZXNfb19mbG93OwkJIC8qIHN1bSBvdmVyZmxvdyA6IDQgKi8KLSNlbmRpZgorCXhsb2dfcmVzX3QJICAgdF9yZXNfYXJyW1hMT0dfVElDX0xFTl9NQVhdOyAgLyogYXJyYXkgb2YgcmVzIDogOCAqIDE1ICovIAogfSB4bG9nX3RpY2tldF90OwogCiAjZW5kaWYKQEAgLTQ5NCw3MSArNDg1LDEzIEBACiAKICNkZWZpbmUgWExPR19GT1JDRURfU0hVVERPV04obG9nKQkoKGxvZyktPmxfZmxhZ3MgJiBYTE9HX0lPX0VSUk9SKQogCi0jZGVmaW5lIFhMT0dfR1JBTlRfU1VCX1NQQUNFKGxvZyxieXRlcyx0eXBlKQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLQlpZiAodHlwZSA9PSAndycpIHsJCQkJCQlcCi0JCShsb2cpLT5sX2dyYW50X3dyaXRlX2J5dGVzIC09IChieXRlcyk7CQkJXAotCQlpZiAoKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgPCAwKSB7CQkJXAotCQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgKz0gKGxvZyktPmxfbG9nc2l6ZTsJXAotCQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfY3ljbGUtLTsJCQlcCi0JCX0JCQkJCQkJXAotCX0gZWxzZSB7CQkJCQkJCVwKLQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyAtPSAoYnl0ZXMpOwkJXAotCQlpZiAoKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyA8IDApIHsJCQlcCi0JCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzICs9IChsb2cpLT5sX2xvZ3NpemU7XAotCQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZS0tOwkJCVwKLQkJfQkJCQkJCQlcCi0JIH0JCQkJCQkJCVwKLSAgICB9Ci0jZGVmaW5lIFhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZyxieXRlcyx0eXBlKQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLQlpZiAodHlwZSA9PSAndycpIHsJCQkJCQlcCi0JCShsb2cpLT5sX2dyYW50X3dyaXRlX2J5dGVzICs9IChieXRlcyk7CQkJXAotCQlpZiAoKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgPiAobG9nKS0+bF9sb2dzaXplKSB7CVwKLQkJCShsb2cpLT5sX2dyYW50X3dyaXRlX2J5dGVzIC09IChsb2cpLT5sX2xvZ3NpemU7CVwKLQkJCShsb2cpLT5sX2dyYW50X3dyaXRlX2N5Y2xlKys7CQkJXAotCQl9CQkJCQkJCVwKLQl9IGVsc2UgewkJCQkJCQlcCi0JCShsb2cpLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgKz0gKGJ5dGVzKTsJCVwKLQkJaWYgKChsb2cpLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgPiAobG9nKS0+bF9sb2dzaXplKSB7CVwKLQkJCShsb2cpLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgLT0gKGxvZyktPmxfbG9nc2l6ZTtcCi0JCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlKys7CQkJXAotCQl9CQkJCQkJCVwKLQkgfQkJCQkJCQkJXAotICAgIH0KLSNkZWZpbmUgWExPR19JTlNfVElDS0VUUShxLCB0aWMpCQkJXAotICAgIHsJCQkJCQkJXAotCWlmIChxKSB7CQkJCQlcCi0JCSh0aWMpLT50X25leHQJICAgID0gKHEpOwkJXAotCQkodGljKS0+dF9wcmV2CSAgICA9IChxKS0+dF9wcmV2OwlcCi0JCShxKS0+dF9wcmV2LT50X25leHQgPSAodGljKTsJCVwKLQkJKHEpLT50X3ByZXYJICAgID0gKHRpYyk7CQlcCi0JfSBlbHNlIHsJCQkJCVwKLQkJKHRpYyktPnRfcHJldiA9ICh0aWMpLT50X25leHQgPSAodGljKTsJXAotCQkocSkgPSAodGljKTsJCQkJXAotCX0JCQkJCQlcCi0JKHRpYyktPnRfZmxhZ3MgfD0gWExPR19USUNfSU5fUTsJCVwKLSAgICB9Ci0jZGVmaW5lIFhMT0dfREVMX1RJQ0tFVFEocSwgdGljKQkJCVwKLSAgICB7CQkJCQkJCVwKLQlpZiAoKHRpYykgPT0gKHRpYyktPnRfbmV4dCkgewkJCVwKLQkJKHEpID0gTlVMTDsJCQkJXAotCX0gZWxzZSB7CQkJCQlcCi0JCShxKSA9ICh0aWMpLT50X25leHQ7CQkJXAotCQkodGljKS0+dF9uZXh0LT50X3ByZXYgPSAodGljKS0+dF9wcmV2OwlcCi0JCSh0aWMpLT50X3ByZXYtPnRfbmV4dCA9ICh0aWMpLT50X25leHQ7CVwKLQl9CQkJCQkJXAotCSh0aWMpLT50X25leHQgPSAodGljKS0+dF9wcmV2ID0gTlVMTDsJCVwKLQkodGljKS0+dF9mbGFncyAmPSB+WExPR19USUNfSU5fUTsJCVwKLSAgICB9CiAKIC8qIGNvbW1vbiByb3V0aW5lcyAqLwogZXh0ZXJuIHhmc19sc25fdCB4bG9nX2Fzc2lnbl90YWlsX2xzbihzdHJ1Y3QgeGZzX21vdW50ICptcCk7CiBleHRlcm4gaW50CSB4bG9nX2ZpbmRfdGFpbCh4bG9nX3QJKmxvZywKIAkJCQl4ZnNfZGFkZHJfdCAqaGVhZF9ibGssCi0JCQkJeGZzX2RhZGRyX3QgKnRhaWxfYmxrLAotCQkJCWludCByZWFkb25seSk7Ci1leHRlcm4gaW50CSB4bG9nX3JlY292ZXIoeGxvZ190ICpsb2csIGludCByZWFkb25seSk7CisJCQkJeGZzX2RhZGRyX3QgKnRhaWxfYmxrKTsKK2V4dGVybiBpbnQJIHhsb2dfcmVjb3Zlcih4bG9nX3QgKmxvZyk7CiBleHRlcm4gaW50CSB4bG9nX3JlY292ZXJfZmluaXNoKHhsb2dfdCAqbG9nLCBpbnQgbWZzaV9mbGFncyk7CiBleHRlcm4gdm9pZAkgeGxvZ19wYWNrX2RhdGEoeGxvZ190ICpsb2csIHhsb2dfaW5fY29yZV90ICppY2xvZywgaW50KTsKIGV4dGVybiB2b2lkCSB4bG9nX3JlY292ZXJfcHJvY2Vzc19pdW5saW5rcyh4bG9nX3QgKmxvZyk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKaW5kZXggOGFiN2RmNy4uN2Q0NmNiZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYwpAQCAtNzgzLDggKzc4Myw3IEBACiB4bG9nX2ZpbmRfdGFpbCgKIAl4bG9nX3QJCQkqbG9nLAogCXhmc19kYWRkcl90CQkqaGVhZF9ibGssCi0JeGZzX2RhZGRyX3QJCSp0YWlsX2JsaywKLQlpbnQJCQlyZWFkb25seSkKKwl4ZnNfZGFkZHJfdAkJKnRhaWxfYmxrKQogewogCXhsb2dfcmVjX2hlYWRlcl90CSpyaGVhZDsKIAl4bG9nX29wX2hlYWRlcl90CSpvcF9oZWFkOwpAQCAtMjU2MywxMCArMjU2MiwxMiBAQAogCiAJLyoKIAkgKiBUaGUgbG9naXRlbSBmb3JtYXQncyBmbGFnIHRlbGxzIHVzIGlmIHRoaXMgd2FzIHVzZXIgcXVvdGFvZmYsCi0JICogZ3JvdXAgcXVvdGFvZmYgb3IgYm90aC4KKwkgKiBncm91cC9wcm9qZWN0IHF1b3Rhb2ZmIG9yIGJvdGguCiAJICovCiAJaWYgKHFvZmZfZi0+cWZfZmxhZ3MgJiBYRlNfVVFVT1RBX0FDQ1QpCiAJCWxvZy0+bF9xdW90YW9mZnNfZmxhZyB8PSBYRlNfRFFfVVNFUjsKKwlpZiAocW9mZl9mLT5xZl9mbGFncyAmIFhGU19QUVVPVEFfQUNDVCkKKwkJbG9nLT5sX3F1b3Rhb2Zmc19mbGFnIHw9IFhGU19EUV9QUk9KOwogCWlmIChxb2ZmX2YtPnFmX2ZsYWdzICYgWEZTX0dRVU9UQV9BQ0NUKQogCQlsb2ctPmxfcXVvdGFvZmZzX2ZsYWcgfD0gWEZTX0RRX0dST1VQOwogCkBAIC0zODkwLDE0ICszODkxLDEzIEBACiAgKi8KIGludAogeGxvZ19yZWNvdmVyKAotCXhsb2dfdAkJKmxvZywKLQlpbnQJCXJlYWRvbmx5KQorCXhsb2dfdAkJKmxvZykKIHsKIAl4ZnNfZGFkZHJfdAloZWFkX2JsaywgdGFpbF9ibGs7CiAJaW50CQllcnJvcjsKIAogCS8qIGZpbmQgdGhlIHRhaWwgb2YgdGhlIGxvZyAqLwotCWlmICgoZXJyb3IgPSB4bG9nX2ZpbmRfdGFpbChsb2csICZoZWFkX2JsaywgJnRhaWxfYmxrLCByZWFkb25seSkpKQorCWlmICgoZXJyb3IgPSB4bG9nX2ZpbmRfdGFpbChsb2csICZoZWFkX2JsaywgJnRhaWxfYmxrKSkpCiAJCXJldHVybiBlcnJvcjsKIAogCWlmICh0YWlsX2JsayAhPSBoZWFkX2JsaykgewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tb3VudC5jIGIvZnMveGZzL3hmc19tb3VudC5jCmluZGV4IDMwM2FmODYuLjYwODhlMTQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbW91bnQuYworKysgYi9mcy94ZnMveGZzX21vdW50LmMKQEAgLTUxLDcgKzUxLDcgQEAKIFNUQVRJQyB2b2lkCXhmc191dWlkX3VubW91bnQoeGZzX21vdW50X3QgKm1wKTsKIFNUQVRJQyB2b2lkCXhmc191bm1vdW50ZnNfd2FpdCh4ZnNfbW91bnRfdCAqKTsKIAotc3RhdGljIHN0cnVjdCB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgICBzaG9ydCBvZmZzZXQ7CiAgICAgc2hvcnQgdHlwZTsgICAgIC8qIDAgPSBpbnRlZ2VyCiAJCSogMSA9IGJpbmFyeSAvIHN0cmluZyAobm8gdHJhbnNsYXRpb24pCkBAIC0xMDc3LDggKzEwNzcsNyBAQAogCiAJeGZzX2lmbHVzaF9hbGwobXApOwogCi0JWEZTX1FNX0RRUFVSR0VBTEwobXAsCi0JCVhGU19RTU9QVF9VUVVPVEEgfCBYRlNfUU1PUFRfR1FVT1RBIHwgWEZTX1FNT1BUX1VNT1VOVElORyk7CisJWEZTX1FNX0RRUFVSR0VBTEwobXAsIFhGU19RTU9QVF9RVU9UQUxMIHwgWEZTX1FNT1BUX1VNT1VOVElORyk7CiAKIAkvKgogCSAqIEZsdXNoIG91dCB0aGUgbG9nIHN5bmNocm9ub3VzbHkgc28gdGhhdCB3ZSBrbm93IGZvciBzdXJlCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmggYi9mcy94ZnMveGZzX21vdW50LmgKaW5kZXggMzQzMmZkNS4uY2QzY2Y5NiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tb3VudC5oCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuaApAQCAtMzA4LDcgKzMwOCw2IEBACiAJeGZzX2J1ZnRhcmdfdAkJKm1fZGRldl90YXJncDsJLyogc2F2ZXMgdGFraW5nIHRoZSBhZGRyZXNzICovCiAJeGZzX2J1ZnRhcmdfdAkJKm1fbG9nZGV2X3RhcmdwOy8qIHB0ciB0byBsb2cgZGV2aWNlICovCiAJeGZzX2J1ZnRhcmdfdAkJKm1fcnRkZXZfdGFyZ3A7CS8qIHB0ciB0byBydCBkZXZpY2UgKi8KLSNkZWZpbmUgbV9kZXYJCW1fZGRldl90YXJncC0+cGJyX2RldgogCV9fdWludDhfdAkJbV9kaXJjb29rX2Vsb2c7CS8qIGxvZyBkLWNvb2tpZSBlbnRyeSBiaXRzICovCiAJX191aW50OF90CQltX2Jsa2JpdF9sb2c7CS8qIGJsb2NrbG9nICsgTkJCWSAqLwogCV9fdWludDhfdAkJbV9ibGtiYl9sb2c7CS8qIGJsb2NrbG9nIC0gQkJTSElGVCAqLwpAQCAtMzkzLDcgKzM5Miw3IEBACiAJCQkJCQkgICB1c2VyICovCiAjZGVmaW5lIFhGU19NT1VOVF9OT0FMSUdOCSgxVUxMIDw8IDcpCS8qIHR1cm4gb2ZmIHN0cmlwZSBhbGlnbm1lbnQKIAkJCQkJCSAgIGFsbG9jYXRpb25zICovCi0jZGVmaW5lIFhGU19NT1VOVF9DT01QQVRfQVRUUgkoMVVMTCA8PCA4KQkvKiBkbyBub3QgdXNlIGF0dHIyIGZvcm1hdCAqLworI2RlZmluZSBYRlNfTU9VTlRfQVRUUjIJCSgxVUxMIDw8IDgpCS8qIGFsbG93IHVzZSBvZiBhdHRyMiBmb3JtYXQgKi8KIAkJCSAgICAgLyoJKDFVTEwgPDwgOSkJLS0gY3VycmVudGx5IHVudXNlZCAqLwogI2RlZmluZSBYRlNfTU9VTlRfTk9SRUNPVkVSWQkoMVVMTCA8PCAxMCkJLyogbm8gcmVjb3ZlcnkgLSBkaXJ0eSBmcyAqLwogI2RlZmluZSBYRlNfTU9VTlRfU0hBUkVECSgxVUxMIDw8IDExKQkvKiBzaGFyZWQgbW91bnQgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcmVuYW1lLmMgYi9mcy94ZnMveGZzX3JlbmFtZS5jCmluZGV4IDRkNGU4ZjQuLjgxYTA1Y2YgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcmVuYW1lLmMKKysrIGIvZnMveGZzL3hmc19yZW5hbWUuYwpAQCAtMjQzLDcgKzI0Myw2IEBACiAJeGZzX2lub2RlX3QJKmlub2Rlc1s0XTsKIAlpbnQJCXRhcmdldF9pcF9kcm9wcGVkID0gMDsJLyogZHJvcHBlZCB0YXJnZXRfaXAgbGluaz8gKi8KIAl2bm9kZV90CQkqc3JjX2Rpcl92cDsKLQliaHZfZGVzY190CSp0YXJnZXRfZGlyX2JkcDsKIAlpbnQJCXNwYWNlcmVzOwogCWludAkJdGFyZ2V0X2xpbmtfemVybyA9IDA7CiAJaW50CQludW1faW5vZGVzOwpAQCAtMjYwLDE0ICsyNTksMTIgQEAKIAkgKiBGaW5kIHRoZSBYRlMgYmVoYXZpb3IgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCBkaXJlY3RvcnkKIAkgKiB2bm9kZSBzaW5jZSBpdCB3YXMgbm90IGhhbmRlZCB0byB1cy4KIAkgKi8KLQl0YXJnZXRfZGlyX2JkcCA9IHZuX2Jodl9sb29rdXBfdW5sb2NrZWQoVk5fQkhWX0hFQUQodGFyZ2V0X2Rpcl92cCksCi0JCQkJCQkmeGZzX3Zub2Rlb3BzKTsKLQlpZiAodGFyZ2V0X2Rpcl9iZHAgPT0gTlVMTCkgeworCXRhcmdldF9kcCA9IHhmc192dG9pKHRhcmdldF9kaXJfdnApOworCWlmICh0YXJnZXRfZHAgPT0gTlVMTCkgewogCQlyZXR1cm4gWEZTX0VSUk9SKEVYREVWKTsKIAl9CiAKIAlzcmNfZHAgPSBYRlNfQkhWVE9JKHNyY19kaXJfYmRwKTsKLQl0YXJnZXRfZHAgPSBYRlNfQkhWVE9JKHRhcmdldF9kaXJfYmRwKTsKIAltcCA9IHNyY19kcC0+aV9tb3VudDsKIAogCWlmIChETV9FVkVOVF9FTkFCTEVEKHNyY19kaXJfdnAtPnZfdmZzcCwgc3JjX2RwLCBETV9FVkVOVF9SRU5BTUUpIHx8CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J3LmMgYi9mcy94ZnMveGZzX3J3LmMKaW5kZXggYzRiMjA4Ny4uYTU5YzEwMiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ydy5jCisrKyBiL2ZzL3hmcy94ZnNfcncuYwpAQCAtMjM4LDYgKzIzOCw3IEBACiAJfQogCXJldHVybiAoRUlPKTsKIH0KKwogLyoKICAqIFByaW50cyBvdXQgYW4gQUxFUlQgbWVzc2FnZSBhYm91dCBJL08gZXJyb3IuCiAgKi8KQEAgLTI1MiwxMSArMjUzLDkgQEAKICAiSS9PIGVycm9yIGluIGZpbGVzeXN0ZW0gKFwiJXNcIikgbWV0YS1kYXRhIGRldiAlcyBibG9jayAweCVsbHgiCiAgIiAgICAgICAoXCIlc1wiKSBlcnJvciAlZCBidWYgY291bnQgJXpkIiwKIAkJKCFtcCB8fCAhbXAtPm1fZnNuYW1lKSA/ICIoZnMgbmFtZSBub3Qgc2V0KSIgOiBtcC0+bV9mc25hbWUsCi0JCVhGU19CVUZUQVJHX05BTUUoYnAtPnBiX3RhcmdldCksCi0JCShfX3VpbnQ2NF90KWJsa25vLAotCQlmdW5jLAotCQlYRlNfQlVGX0dFVEVSUk9SKGJwKSwKLQkJWEZTX0JVRl9DT1VOVChicCkpOworCQlYRlNfQlVGVEFSR19OQU1FKFhGU19CVUZfVEFSR0VUKGJwKSksCisJCShfX3VpbnQ2NF90KWJsa25vLCBmdW5jLAorCQlYRlNfQlVGX0dFVEVSUk9SKGJwKSwgWEZTX0JVRl9DT1VOVChicCkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19zYi5oIGIvZnMveGZzL3hmc19zYi5oCmluZGV4IDRhMTdkMzMuLmJmMTY4YTkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfc2IuaAorKysgYi9mcy94ZnMveGZzX3NiLmgKQEAgLTY4LDE4ICs2OCw2IEBACiAJKFhGU19TQl9WRVJTSU9OX05VTUJJVFMgfCBcCiAJIFhGU19TQl9WRVJTSU9OX09LUkVBTEZCSVRTIHwgXAogCSBYRlNfU0JfVkVSU0lPTl9PS1NBU0hGQklUUykKLSNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fTUtGUyhpYSxkaWEsZXh0ZmxhZyxkaXJ2MixuYSxzZmxhZyxtb3JlYml0cykJXAotCSgoKGlhKSB8fCAoZGlhKSB8fCAoZXh0ZmxhZykgfHwgKGRpcnYyKSB8fCAobmEpIHx8IChzZmxhZykgfHwgXAotCSAgKG1vcmViaXRzKSkgPyBcCi0JCShYRlNfU0JfVkVSU0lPTl80IHwgXAotCQkgKChpYSkgPyBYRlNfU0JfVkVSU0lPTl9BTElHTkJJVCA6IDApIHwgXAotCQkgKChkaWEpID8gWEZTX1NCX1ZFUlNJT05fREFMSUdOQklUIDogMCkgfCBcCi0JCSAoKGV4dGZsYWcpID8gWEZTX1NCX1ZFUlNJT05fRVhURkxHQklUIDogMCkgfCBcCi0JCSAoKGRpcnYyKSA/IFhGU19TQl9WRVJTSU9OX0RJUlYyQklUIDogMCkgfCBcCi0JCSAoKG5hKSA/IFhGU19TQl9WRVJTSU9OX0xPR1YyQklUIDogMCkgfCBcCi0JCSAoKHNmbGFnKSA/IFhGU19TQl9WRVJTSU9OX1NFQ1RPUkJJVCA6IDApIHwgXAotCQkgKChtb3JlYml0cykgPyBYRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVCA6IDApKSA6IFwKLQkJWEZTX1NCX1ZFUlNJT05fMSkKIAogLyoKICAqIFRoZXJlIGFyZSB0d28gd29yZHMgdG8gaG9sZCBYRlMgImZlYXR1cmUiIGJpdHM6IHRoZSBvcmlnaW5hbApAQCAtMTA1LDExICs5Myw2IEBACiAJKFhGU19TQl9WRVJTSU9OMl9PS1JFQUxGQklUUyB8CVwKIAkgWEZTX1NCX1ZFUlNJT04yX09LU0FTSEZCSVRTICkKIAotLyoKLSAqIG1rZnMgbWFjcm8gdG8gc2V0IHVwIHNiX2ZlYXR1cmVzMiB3b3JkCi0gKi8KLSNkZWZpbmUJWEZTX1NCX1ZFUlNJT04yX01LRlMocmVzdmQxLCBzYmNudHIpCTAKLQogdHlwZWRlZiBzdHJ1Y3QgeGZzX3NiCiB7CiAJX191aW50MzJfdAlzYl9tYWdpY251bTsJLyogbWFnaWMgbnVtYmVyID09IFhGU19TQl9NQUdJQyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFucy5jIGIvZnMveGZzL3hmc190cmFucy5jCmluZGV4IDI3OWUwNDMuLmQzZDcxNGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnMuYworKysgYi9mcy94ZnMveGZzX3RyYW5zLmMKQEAgLTEwMTQsNiArMTAxNCw3IEBACiAJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CiAJaW50CQkJaTsKICNlbmRpZgorCXhmc19tb3VudF90CQkqbXAgPSB0cC0+dF9tb3VudHA7CiAKIAkvKgogCSAqIFNlZSBpZiB0aGUgY2FsbGVyIGlzIGJlaW5nIHRvbyBsYXp5IHRvIGZpZ3VyZSBvdXQgaWYKQEAgLTEwMjYsOSArMTAyNywxMCBAQAogCSAqIGZpbGVzeXN0ZW0uICBUaGlzIGhhcHBlbnMgaW4gcGF0aHMgd2hlcmUgd2UgZGV0ZWN0CiAJICogY29ycnVwdGlvbiBhbmQgZGVjaWRlIHRvIGdpdmUgdXAuCiAJICovCi0JaWYgKCh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19ESVJUWSkgJiYKLQkgICAgIVhGU19GT1JDRURfU0hVVERPV04odHAtPnRfbW91bnRwKSkKLQkJeGZzX2ZvcmNlX3NodXRkb3duKHRwLT50X21vdW50cCwgWEZTX0NPUlJVUFRfSU5DT1JFKTsKKwlpZiAoKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RJUlRZKSAmJiAhWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX3RyYW5zX2NhbmNlbCIsIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfQ09SUlVQVF9JTkNPUkUpOworCX0KICNpZmRlZiBERUJVRwogCWlmICghKGZsYWdzICYgWEZTX1RSQU5TX0FCT1JUKSkgewogCQlsaWNwID0gJih0cC0+dF9pdGVtcyk7CkBAIC0xMDQwLDcgKzEwNDIsNyBAQAogCQkJCX0KIAogCQkJCWxpcCA9IGxpZHAtPmxpZF9pdGVtOwotCQkJCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTih0cC0+dF9tb3VudHApKQorCQkJCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCQkJCUFTU0VSVCghKGxpcC0+bGlfdHlwZSA9PSBYRlNfTElfRUZEKSk7CiAJCQl9CiAJCQlsaWNwID0gbGljcC0+bGljX25leHQ7CkBAIC0xMDQ4LDcgKzEwNTAsNyBAQAogCX0KICNlbmRpZgogCXhmc190cmFuc191bnJlc2VydmVfYW5kX21vZF9zYih0cCk7Ci0JWEZTX1RSQU5TX1VOUkVTRVJWRV9BTkRfTU9EX0RRVU9UUyh0cC0+dF9tb3VudHAsIHRwKTsKKwlYRlNfVFJBTlNfVU5SRVNFUlZFX0FORF9NT0RfRFFVT1RTKG1wLCB0cCk7CiAKIAlpZiAodHAtPnRfdGlja2V0KSB7CiAJCWlmIChmbGFncyAmIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMpIHsKQEAgLTEwNTcsNyArMTA1OSw3IEBACiAJCX0gZWxzZSB7CiAJCQlsb2dfZmxhZ3MgPSAwOwogCQl9Ci0JCXhmc19sb2dfZG9uZSh0cC0+dF9tb3VudHAsIHRwLT50X3RpY2tldCwgTlVMTCwgbG9nX2ZsYWdzKTsKKwkJeGZzX2xvZ19kb25lKG1wLCB0cC0+dF90aWNrZXQsIE5VTEwsIGxvZ19mbGFncyk7CiAJfQogCiAJLyogbWFyayB0aGlzIHRocmVhZCBhcyBubyBsb25nZXIgYmVpbmcgaW4gYSB0cmFuc2FjdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFucy5oIGIvZnMveGZzL3hmc190cmFucy5oCmluZGV4IGE4ODk5NjMuLmQ3NzkwMWMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnMuaAorKysgYi9mcy94ZnMveGZzX3RyYW5zLmgKQEAgLTk3Myw3ICs5NzMsNiBAQAogdm9pZAkJeGZzX3RyYW5zX2Job2xkX3JlbGVhc2UoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CiB2b2lkCQl4ZnNfdHJhbnNfYmludmFsKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICopOwogdm9pZAkJeGZzX3RyYW5zX2lub2RlX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKLXZvaWQJCXhmc190cmFuc19pbm9kZV9idWYoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CiB2b2lkCQl4ZnNfdHJhbnNfc3RhbGVfaW5vZGVfYnVmKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICopOwogdm9pZAkJeGZzX3RyYW5zX2RxdW90X2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqLCB1aW50KTsKIHZvaWQJCXhmc190cmFuc19pbm9kZV9hbGxvY19idWYoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3V0aWxzLmMgYi9mcy94ZnMveGZzX3V0aWxzLmMKaW5kZXggZmVmZTFkNi4uMzQ2NTRlYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc191dGlscy5jCisrKyBiL2ZzL3hmcy94ZnNfdXRpbHMuYwpAQCAtNTUsMTYgKzU1LDEzIEBACiAJeGZzX2lub2RlX3QJKippcHApCiB7CiAJdm5vZGVfdAkJKnZwOwotCWJodl9kZXNjX3QJKmJkcDsKIAogCXZwID0gVk5BTUVfVE9fVk5PREUoZGVudHJ5KTsKLQliZHAgPSB2bl9iaHZfbG9va3VwX3VubG9ja2VkKFZOX0JIVl9IRUFEKHZwKSwgJnhmc192bm9kZW9wcyk7Ci0JaWYgKCFiZHApIHsKLQkJKmlwcCA9IE5VTEw7CisKKwkqaXBwID0geGZzX3Z0b2kodnApOworCWlmICghKmlwcCkKIAkJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOwotCX0KIAlWTl9IT0xEKHZwKTsKLQkqaXBwID0gWEZTX0JIVlRPSShiZHApOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zmc29wcy5jIGIvZnMveGZzL3hmc192ZnNvcHMuYwppbmRleCA3YmRiZDk5Li5iNmFkMzcwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Zmc29wcy5jCisrKyBiL2ZzL3hmcy94ZnNfdmZzb3BzLmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlICJ4ZnNfYWNsLmgiCiAjaW5jbHVkZSAieGZzX2F0dHIuaCIKICNpbmNsdWRlICJ4ZnNfY2xudC5oIgorI2luY2x1ZGUgInhmc19mc29wcy5oIgogCiBTVEFUSUMgaW50IHhmc19zeW5jKGJodl9kZXNjX3QgKiwgaW50LCBjcmVkX3QgKik7CiAKQEAgLTI5MCw4ICsyOTEsOCBAQAogCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfSURFTEVURTsKIAlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0RJUlNZTkMpCiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9ESVJTWU5DOwotCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfQ09NUEFUX0FUVFIpCi0JCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9DT01QQVRfQVRUUjsKKwlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0FUVFIyKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfQVRUUjI7CiAKIAlpZiAoYXAtPmZsYWdzMiAmIFhGU01OVDJfQ09NUEFUX0lPU0laRSkKIAkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0NPTVBBVF9JT1NJWkU7CkBAIC0zMTIsNiArMzEzLDggQEAKIAkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX05PVVVJRDsKIAlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0JBUlJJRVIpCiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9CQVJSSUVSOworCWVsc2UKKwkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9CQVJSSUVSOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMzAsMTAgKzMzMywxMSBAQAogCiAJLyogRmFpbCBhIG1vdW50IHdoZXJlIHRoZSBsb2didWYgaXMgc21hbGxlciB0aGVuIHRoZSBsb2cgc3RyaXBlICovCiAJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZtcC0+bV9zYikpIHsKLQkJaWYgKChhcC0+bG9nYnVmc2l6ZSA9PSAtMSkgJiYKKwkJaWYgKChhcC0+bG9nYnVmc2l6ZSA8PSAwKSAmJgogCQkgICAgKG1wLT5tX3NiLnNiX2xvZ3N1bml0ID4gWExPR19CSUdfUkVDT1JEX0JTSVpFKSkgewogCQkJbXAtPm1fbG9nYnNpemUgPSBtcC0+bV9zYi5zYl9sb2dzdW5pdDsKLQkJfSBlbHNlIGlmIChhcC0+bG9nYnVmc2l6ZSA8IG1wLT5tX3NiLnNiX2xvZ3N1bml0KSB7CisJCX0gZWxzZSBpZiAoYXAtPmxvZ2J1ZnNpemUgPiAwICYmCisJCQkgICBhcC0+bG9nYnVmc2l6ZSA8IG1wLT5tX3NiLnNiX2xvZ3N1bml0KSB7CiAJCQljbW5fZXJyKENFX1dBUk4sCiAJIlhGUzogbG9nYnVmIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbG9nIHN0cmlwZSBzaXplIik7CiAJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CkBAIC0zNDcsNiArMzUxLDEwIEBACiAJCX0KIAl9CiAKKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTQVRUUjIoJm1wLT5tX3NiKSkgeworCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfQVRUUjI7CisJfQorCiAJLyoKIAkgKiBwcm9oaWJpdCByL3cgbW91bnRzIG9mIHJlYWQtb25seSBmaWxlc3lzdGVtcwogCSAqLwpAQCAtMzgyLDEwICszOTAsNiBAQAogCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCX0KIAotCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNBVFRSMigmbXAtPm1fc2IpKSB7Ci0JCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfQ09NUEFUX0FUVFI7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUwNCwxMyArNTA4LDEzIEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGVycm9yMjsKIAorCWlmICgobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikgJiYgISh2ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpKQorCQl4ZnNfbW91bnRmc19jaGVja19iYXJyaWVycyhtcCk7CisKIAllcnJvciA9IFhGU19JT0lOSVQodmZzcCwgYXJncywgZmxhZ3MpOwogCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjI7CiAKLQlpZiAoKGFyZ3MtPmZsYWdzICYgWEZTTU5UX0JBUlJJRVIpICYmCi0JICAgICEoWEZTX01UT1ZGUyhtcCktPnZmc19mbGFnICYgVkZTX1JET05MWSkpCi0JCXhmc19tb3VudGZzX2NoZWNrX2JhcnJpZXJzKG1wKTsKIAlyZXR1cm4gMDsKIAogZXJyb3IyOgpAQCAtNjU1LDYgKzY1OSwxMSBAQAogCWVsc2UKIAkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9OT0FUSU1FOwogCisJaWYgKGFyZ3MtPmZsYWdzICYgWEZTTU5UX0JBUlJJRVIpCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9CQVJSSUVSOworCWVsc2UKKwkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9CQVJSSUVSOworCiAJaWYgKCh2ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpICYmCiAJICAgICEoKmZsYWdzICYgTVNfUkRPTkxZKSkgewogCQl2ZnNwLT52ZnNfZmxhZyAmPSB+VkZTX1JET05MWTsKQEAgLTE2MzQsNiArMTY0Myw3IEBACiAjZGVmaW5lIE1OVE9QVF9OT1JFQ09WRVJZICAgIm5vcmVjb3ZlcnkiICAgLyogZG9uJ3QgcnVuIFhGUyByZWNvdmVyeSAqLwogI2RlZmluZSBNTlRPUFRfQkFSUklFUgkiYmFycmllciIJLyogdXNlIHdyaXRlciBiYXJyaWVycyBmb3IgbG9nIHdyaXRlIGFuZAogCQkJCQkgKiB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgTU5UT1BUX05PQkFSUklFUiAibm9iYXJyaWVyIgkvKiAuLiBkaXNhYmxlICovCiAjZGVmaW5lIE1OVE9QVF9PU1lOQ0lTT1NZTkMgIm9zeW5jaXNvc3luYyIgLyogb19zeW5jIGlzIFJFQUxMWSBvX3N5bmMgKi8KICNkZWZpbmUgTU5UT1BUXzY0QklUSU5PREUgICAiaW5vZGU2NCIJLyogaW5vZGVzIGNhbiBiZSBhbGxvY2F0ZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgTU5UT1BUX0lLRUVQCSJpa2VlcCIJCS8qIGRvIG5vdCBmcmVlIGVtcHR5IGlub2RlIGNsdXN0ZXJzICovCkBAIC0xNjgwLDcgKzE2OTAsNiBAQAogCWludAkJCWlvc2l6ZTsKIAogCWFyZ3MtPmZsYWdzMiB8PSBYRlNNTlQyX0NPTVBBVF9JT1NJWkU7Ci0JYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0NPTVBBVF9BVFRSOwogCiAjaWYgMAkvKiBYWFg6IG9mZiBieSBkZWZhdWx0LCB1bnRpbCBzb21lIHJlbWFpbmluZyBpc3N1ZXMgaXJvbmVkIG91dCAqLwogCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9JREVMRVRFOyAvKiBkZWZhdWx0IHRvIG9uICovCkBAIC0xODA2LDYgKzE4MTUsOCBAQAogCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX05PVVVJRDsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0JBUlJJRVIpKSB7CiAJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfQkFSUklFUjsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PQkFSUklFUikpIHsKKwkJCWFyZ3MtPmZsYWdzICY9IH5YRlNNTlRfQkFSUklFUjsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0lLRUVQKSkgewogCQkJYXJncy0+ZmxhZ3MgJj0gflhGU01OVF9JREVMRVRFOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9JS0VFUCkpIHsKQEAgLTE4MTUsOSArMTgyNiw5IEBACiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT0xBUkdFSU8pKSB7CiAJCQlhcmdzLT5mbGFnczIgfD0gWEZTTU5UMl9DT01QQVRfSU9TSVpFOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfQVRUUjIpKSB7Ci0JCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX0NPTVBBVF9BVFRSOworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0FUVFIyOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9BVFRSMikpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9DT01QQVRfQVRUUjsKKwkJCWFyZ3MtPmZsYWdzICY9IH5YRlNNTlRfQVRUUjI7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJvc3luY2lzZHN5bmMiKSkgewogCQkJLyogbm8tb3AsIHRoaXMgaXMgbm93IHRoZSBkZWZhdWx0ICovCiBwcmludGsoIlhGUzogb3N5bmNpc2RzeW5jIGlzIG5vdyB0aGUgZGVmYXVsdCwgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuXG4iKTsKQEAgLTE4OTIsNyArMTkwMyw2IEBACiAJCXsgWEZTX01PVU5UX05PVVVJRCwJCSIsIiBNTlRPUFRfTk9VVUlEIH0sCiAJCXsgWEZTX01PVU5UX05PUkVDT1ZFUlksCQkiLCIgTU5UT1BUX05PUkVDT1ZFUlkgfSwKIAkJeyBYRlNfTU9VTlRfT1NZTkNJU09TWU5DLAkiLCIgTU5UT1BUX09TWU5DSVNPU1lOQyB9LAotCQl7IFhGU19NT1VOVF9CQVJSSUVSLAkJIiwiIE1OVE9QVF9CQVJSSUVSIH0sCiAJCXsgWEZTX01PVU5UX0lERUxFVEUsCQkiLCIgTU5UT1BUX05PSUtFRVAgfSwKIAkJeyAwLCBOVUxMIH0KIAl9OwpAQCAtMTkxNCwzMyArMTkyNCwyOCBAQAogCiAJaWYgKG1wLT5tX2xvZ2J1ZnMgPiAwKQogCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfTE9HQlVGUyAiPSVkIiwgbXAtPm1fbG9nYnVmcyk7Ci0KIAlpZiAobXAtPm1fbG9nYnNpemUgPiAwKQogCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfTE9HQlNJWkUgIj0lZGsiLCBtcC0+bV9sb2dic2l6ZSA+PiAxMCk7CiAKIAlpZiAobXAtPm1fbG9nbmFtZSkKIAkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0xPR0RFViAiPSVzIiwgbXAtPm1fbG9nbmFtZSk7Ci0KIAlpZiAobXAtPm1fcnRuYW1lKQogCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfUlRERVYgIj0lcyIsIG1wLT5tX3J0bmFtZSk7CiAKIAlpZiAobXAtPm1fZGFsaWduID4gMCkKIAkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX1NVTklUICI9JWQiLAogCQkJCShpbnQpWEZTX0ZTQl9UT19CQihtcCwgbXAtPm1fZGFsaWduKSk7Ci0KIAlpZiAobXAtPm1fc3dpZHRoID4gMCkKIAkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX1NXSURUSCAiPSVkIiwKIAkJCQkoaW50KVhGU19GU0JfVE9fQkIobXAsIG1wLT5tX3N3aWR0aCkpOwogCi0JaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQ09NUEFUX0FUVFIpKQotCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfQVRUUjIpOwotCiAJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQ09NUEFUX0lPU0laRSkpCiAJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9MQVJHRUlPKTsKKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0JBUlJJRVIpOwogCiAJaWYgKCEodmZzcC0+dmZzX2ZsYWcgJiBWRlNfMzJCSVRJTk9ERVMpKQogCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfNjRCSVRJTk9ERSk7Ci0KIAlpZiAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfR1JQSUQpCiAJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9HUlBJRCk7CiAKQEAgLTE5NTksNiArMTk2NCw3IEBACiAJLyogUHVzaCB0aGUgc3VwZXJibG9jayBhbmQgd3JpdGUgYW4gdW5tb3VudCByZWNvcmQgKi8KIAl4ZnNfbG9nX3VubW91bnRfd3JpdGUobXApOwogCXhmc191bm1vdW50ZnNfd3JpdGVzYihtcCk7CisJeGZzX2ZzX2xvZ19kdW1teShtcCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc192bm9kZW9wcy5jIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCmluZGV4IGU5MmNhY2QuLjgwNzZjYzkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYworKysgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKQEAgLTE4NSw4ICsxODUsNyBAQAogCQlicmVhazsKIAl9CiAKLQl2YXAtPnZhX2F0aW1lLnR2X3NlYyA9IGlwLT5pX2QuZGlfYXRpbWUudF9zZWM7Ci0JdmFwLT52YV9hdGltZS50dl9uc2VjID0gaXAtPmlfZC5kaV9hdGltZS50X25zZWM7CisJdm5fYXRpbWVfdG9fdGltZXNwZWModnAsICZ2YXAtPnZhX2F0aW1lKTsKIAl2YXAtPnZhX210aW1lLnR2X3NlYyA9IGlwLT5pX2QuZGlfbXRpbWUudF9zZWM7CiAJdmFwLT52YV9tdGltZS50dl9uc2VjID0gaXAtPmlfZC5kaV9tdGltZS50X25zZWM7CiAJdmFwLT52YV9jdGltZS50dl9zZWMgPSBpcC0+aV9kLmRpX2N0aW1lLnRfc2VjOwpAQCAtNTQ0LDI0ICs1NDMsNiBAQAogCQl9CiAKIAkJLyoKLQkJICogQ2FuJ3Qgc2V0IGV4dGVudCBzaXplIHVubGVzcyB0aGUgZmlsZSBpcyBtYXJrZWQsIG9yCi0JCSAqIGFib3V0IHRvIGJlIG1hcmtlZCBhcyBhIHJlYWx0aW1lIGZpbGUuCi0JCSAqCi0JCSAqIFRoaXMgY2hlY2sgd2lsbCBiZSByZW1vdmVkIHdoZW4gZml4ZWQgc2l6ZSBleHRlbnRzCi0JCSAqIHdpdGggYnVmZmVyZWQgZGF0YSB3cml0ZXMgaXMgaW1wbGVtZW50ZWQuCi0JCSAqCi0JCSAqLwotCQlpZiAoKG1hc2sgJiBYRlNfQVRfRVhUU0laRSkJCQkmJgotCQkgICAgKChpcC0+aV9kLmRpX2V4dHNpemUgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpICE9Ci0JCSAgICAgdmFwLT52YV9leHRzaXplKSAmJgotCQkgICAgKCEoKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSB8fAotCQkgICAgICAgKChtYXNrICYgWEZTX0FUX1hGTEFHUykgJiYKLQkJCSh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19SRUFMVElNRSkpKSkpIHsKLQkJCWNvZGUgPSBYRlNfRVJST1IoRUlOVkFMKTsKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkJLyoKIAkJICogQ2FuJ3QgY2hhbmdlIHJlYWx0aW1lIGZsYWcgaWYgYW55IGV4dGVudHMgYXJlIGFsbG9jYXRlZC4KIAkJICovCiAJCWlmICgoaXAtPmlfZC5kaV9uZXh0ZW50cyB8fCBpcC0+aV9kZWxheWVkX2Jsa3MpICYmCkBAIC04MjMsMTMgKzgwNCwxNyBAQAogCQkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX1JUSU5IRVJJVDsKIAkJCQlpZiAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfTk9TWU1MSU5LUykKIAkJCQkJZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19OT1NZTUxJTktTOwotCQkJfSBlbHNlIHsKKwkJCQlpZiAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfRVhUU1pJTkhFUklUKQorCQkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX0VYVFNaSU5IRVJJVDsKKwkJCX0gZWxzZSBpZiAoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykgewogCQkJCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19SRUFMVElNRSkgewogCQkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX1JFQUxUSU1FOwogCQkJCQlpcC0+aV9pb2NvcmUuaW9fZmxhZ3MgfD0gWEZTX0lPQ09SRV9SVDsKIAkJCQl9IGVsc2UgewogCQkJCQlpcC0+aV9pb2NvcmUuaW9fZmxhZ3MgJj0gflhGU19JT0NPUkVfUlQ7CiAJCQkJfQorCQkJCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19FWFRTSVpFKQorCQkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX0VYVFNJWkU7CiAJCQl9CiAJCQlpcC0+aV9kLmRpX2ZsYWdzID0gZGlfZmxhZ3M7CiAJCX0KQEAgLTk5OSwxMCArOTg0LDYgQEAKIAkJZ290byBlcnJvcl9yZXR1cm47CiAJfQogCi0JaWYgKCEoaW9mbGFncyAmIElPX0lOVklTKSkgewotCQl4ZnNfaWNoZ3RpbWUoaXAsIFhGU19JQ0hHVElNRV9BQ0MpOwotCX0KLQogCS8qCiAJICogU2VlIGlmIHRoZSBzeW1saW5rIGlzIHN0b3JlZCBpbmxpbmUuCiAJICovCkBAIC0xMjM0LDcgKzEyMTUsOCBAQAogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAogCWlmICghZXJyb3IgJiYgKG5pbWFwcyAhPSAwKSAmJgotCSAgICAoaW1hcC5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSkgeworCSAgICAoaW1hcC5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLIHx8CisJICAgICBpcC0+aV9kZWxheWVkX2Jsa3MpKSB7CiAJCS8qCiAJCSAqIEF0dGFjaCB0aGUgZHF1b3RzIHRvIHRoZSBpbm9kZSB1cCBmcm9udC4KIAkJICovCkBAIC0xNTY5LDkgKzE1NTEsMTEgQEAKIAogCWlmIChpcC0+aV9kLmRpX25saW5rICE9IDApIHsKIAkJaWYgKCgoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykgJiYKLQkJICAgICAoKGlwLT5pX2QuZGlfc2l6ZSA+IDApIHx8IChWTl9DQUNIRUQodnApID4gMCkpICYmCisJCSAgICAgKChpcC0+aV9kLmRpX3NpemUgPiAwKSB8fCAoVk5fQ0FDSEVEKHZwKSA+IDAgfHwKKwkJICAgICAgIGlwLT5pX2RlbGF5ZWRfYmxrcyA+IDApKSAmJgogCQkgICAgIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSAgJiYKLQkJICAgICghKGlwLT5pX2QuZGlfZmxhZ3MgJiAoWEZTX0RJRkxBR19QUkVBTExPQ3xYRlNfRElGTEFHX0FQUEVORCkpKSkgeworCQkgICAgKCEoaXAtPmlfZC5kaV9mbGFncyAmCisJCQkJKFhGU19ESUZMQUdfUFJFQUxMT0MgfCBYRlNfRElGTEFHX0FQUEVORCkpKSkgewogCQkJaWYgKChlcnJvciA9IHhmc19pbmFjdGl2ZV9mcmVlX2VvZmJsb2NrcyhtcCwgaXApKSkKIAkJCQlyZXR1cm4gKGVycm9yKTsKIAkJCS8qIFVwZGF0ZSBsaW51eCBpbm9kZSBibG9jayBjb3VudCBhZnRlciBmcmVlIGFib3ZlICovCkBAIC0xNjI4LDcgKzE2MTIsOCBAQAogCSAqIG9ubHkgb25lIHdpdGggYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlLgogCSAqLwogCXRydW5jYXRlID0gKChpcC0+aV9kLmRpX25saW5rID09IDApICYmCi0JICAgICgoaXAtPmlfZC5kaV9zaXplICE9IDApIHx8IChpcC0+aV9kLmRpX25leHRlbnRzID4gMCkpICYmCisgICAgICAgICAgICAoKGlwLT5pX2QuZGlfc2l6ZSAhPSAwKSB8fCAoaXAtPmlfZC5kaV9uZXh0ZW50cyA+IDApIHx8CisgICAgICAgICAgICAgKGlwLT5pX2RlbGF5ZWRfYmxrcyA+IDApKSAmJgogCSAgICAoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykpOwogCiAJbXAgPSBpcC0+aV9tb3VudDsKQEAgLTE2NDYsMTAgKzE2MzEsMTIgQEAKIAogCWlmIChpcC0+aV9kLmRpX25saW5rICE9IDApIHsKIAkJaWYgKCgoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykgJiYKLQkJICAgICAoKGlwLT5pX2QuZGlfc2l6ZSA+IDApIHx8IChWTl9DQUNIRUQodnApID4gMCkpICYmCi0JCSAgICAgKGlwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpICAmJgotCQkgICAgKCEoaXAtPmlfZC5kaV9mbGFncyAmIChYRlNfRElGTEFHX1BSRUFMTE9DfFhGU19ESUZMQUdfQVBQRU5EKSkgfHwKLQkJICAgICAoaXAtPmlfZGVsYXllZF9ibGtzICE9IDApKSkgeworICAgICAgICAgICAgICAgICAgICAgKChpcC0+aV9kLmRpX3NpemUgPiAwKSB8fCAoVk5fQ0FDSEVEKHZwKSA+IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgaXAtPmlfZGVsYXllZF9ibGtzID4gMCkpICYmCisJCSAgICAgIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpICYmCisJCSAgICAgKCEoaXAtPmlfZC5kaV9mbGFncyAmCisJCQkJKFhGU19ESUZMQUdfUFJFQUxMT0MgfCBYRlNfRElGTEFHX0FQUEVORCkpIHx8CisJCSAgICAgIChpcC0+aV9kZWxheWVkX2Jsa3MgIT0gMCkpKSkgewogCQkJaWYgKChlcnJvciA9IHhmc19pbmFjdGl2ZV9mcmVlX2VvZmJsb2NrcyhtcCwgaXApKSkKIAkJCQlyZXR1cm4gKFZOX0lOQUNUSVZFX0NBQ0hFKTsKIAkJCS8qIFVwZGF0ZSBsaW51eCBpbm9kZSBibG9jayBjb3VudCBhZnRlciBmcmVlIGFib3ZlICovCkBAIC0yNTkzLDcgKzI1ODAsNiBAQAogCWludAkJCWNhbmNlbF9mbGFnczsKIAlpbnQJCQljb21taXR0ZWQ7CiAJdm5vZGVfdAkJCSp0YXJnZXRfZGlyX3ZwOwotCWJodl9kZXNjX3QJCSpzcmNfYmRwOwogCWludAkJCXJlc2Jsa3M7CiAJY2hhcgkJCSp0YXJnZXRfbmFtZSA9IFZOQU1FKGRlbnRyeSk7CiAJaW50CQkJdGFyZ2V0X25hbWVsZW47CkBAIC0yNjA2LDggKzI1OTIsNyBAQAogCWlmIChWTl9JU0RJUihzcmNfdnApKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVQRVJNKTsKIAotCXNyY19iZHAgPSB2bl9iaHZfbG9va3VwX3VubG9ja2VkKFZOX0JIVl9IRUFEKHNyY192cCksICZ4ZnNfdm5vZGVvcHMpOwotCXNpcCA9IFhGU19CSFZUT0koc3JjX2JkcCk7CisJc2lwID0geGZzX3Z0b2koc3JjX3ZwKTsKIAl0ZHAgPSBYRlNfQkhWVE9JKHRhcmdldF9kaXJfYmRwKTsKIAltcCA9IHRkcC0+aV9tb3VudDsKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCkBAIC0zMjQwLDcgKzMyMjUsNiBAQAogCXhmc190cmFuc190CSp0cCA9IE5VTEw7CiAJaW50CQllcnJvciA9IDA7CiAJdWludAkJbG9ja19tb2RlOwotCXhmc19vZmZfdAlzdGFydF9vZmZzZXQ7CiAKIAl2bl90cmFjZV9lbnRyeShCSFZfVE9fVk5PREUoZGlyX2JkcCksIF9fRlVOQ1RJT05fXywKIAkJCQkJICAgICAgIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKQEAgLTMyNTEsMTEgKzMyMzUsNyBAQAogCX0KIAogCWxvY2tfbW9kZSA9IHhmc19pbG9ja19tYXBfc2hhcmVkKGRwKTsKLQlzdGFydF9vZmZzZXQgPSB1aW9wLT51aW9fb2Zmc2V0OwogCWVycm9yID0gWEZTX0RJUl9HRVRERU5UUyhkcC0+aV9tb3VudCwgdHAsIGRwLCB1aW9wLCBlb2ZwKTsKLQlpZiAoc3RhcnRfb2Zmc2V0ICE9IHVpb3AtPnVpb19vZmZzZXQpIHsKLQkJeGZzX2ljaGd0aW1lKGRwLCBYRlNfSUNIR1RJTUVfQUNDKTsKLQl9CiAJeGZzX2l1bmxvY2tfbWFwX3NoYXJlZChkcCwgbG9ja19tb2RlKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0zODMyLDcgKzM4MTIsMTIgQEAKIAl2bl9pb3dhaXQodnApOwogCiAJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpIHx8IGlwLT5pX2RlbGF5ZWRfYmxrcyA9PSAwKTsKLQlBU1NFUlQoVk5fQ0FDSEVEKHZwKSA9PSAwKTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBhdGltZSBpbiB0aGUgWEZTIGlub2RlIGlzIGNvcnJlY3QgYmVmb3JlIGZyZWVpbmcgdGhlCisJICogTGludXggaW5vZGUuCisJICovCisJeGZzX3N5bmNocm9uaXplX2F0aW1lKGlwKTsKIAogCS8qIElmIHdlIGhhdmUgbm90aGluZyB0byBmbHVzaCB3aXRoIHRoaXMgaW5vZGUgdGhlbiBjb21wbGV0ZSB0aGUKIAkgKiB0ZWFyZG93biBub3csIG90aGVyd2lzZSBicmVhayB0aGUgbGluayBiZXR3ZWVuIHRoZSB4ZnMgaW5vZGUKQEAgLTQwMDIsNDIgKzM5ODcsMzYgQEAKIAlpbnQJCQlhbGxvY190eXBlLAogCWludAkJCWF0dHJfZmxhZ3MpCiB7CisJeGZzX21vdW50X3QJCSptcCA9IGlwLT5pX21vdW50OworCXhmc19vZmZfdAkJY291bnQ7CiAJeGZzX2ZpbGJsa3NfdAkJYWxsb2NhdGVkX2ZzYjsKIAl4ZnNfZmlsYmxrc190CQlhbGxvY2F0ZXNpemVfZnNiOwotCWludAkJCWNvbW1pdHRlZDsKLQl4ZnNfb2ZmX3QJCWNvdW50OwotCXhmc19maWxibGtzX3QJCWRhdGFibG9ja3M7Ci0JaW50CQkJZXJyb3I7Ci0JeGZzX2ZzYmxvY2tfdAkJZmlyc3Rmc2I7Ci0JeGZzX2JtYXBfZnJlZV90CQlmcmVlX2xpc3Q7Ci0JeGZzX2JtYnRfaXJlY190CQkqaW1hcHA7Ci0JeGZzX2JtYnRfaXJlY190CQlpbWFwc1sxXTsKLQl4ZnNfbW91bnRfdAkJKm1wOwotCWludAkJCW51bXJ0ZXh0ZW50czsKLQlpbnQJCQlyZWNjb3VudDsKLQl1aW50CQkJcmVzYmxrczsKLQlpbnQJCQlydDsKLQlpbnQJCQlydGV4dHNpemU7CisJeGZzX2V4dGxlbl90CQlleHRzeiwgdGVtcDsKIAl4ZnNfZmlsZW9mZl90CQlzdGFydG9mZnNldF9mc2I7CisJeGZzX2ZzYmxvY2tfdAkJZmlyc3Rmc2I7CisJaW50CQkJbmltYXBzOworCWludAkJCWJtYXBpX2ZsYWc7CisJaW50CQkJcXVvdGFfZmxhZzsKKwlpbnQJCQlydDsKIAl4ZnNfdHJhbnNfdAkJKnRwOwotCWludAkJCXhmc19ibWFwaV9mbGFnczsKKwl4ZnNfYm1idF9pcmVjX3QJCWltYXBzWzFdLCAqaW1hcHA7CisJeGZzX2JtYXBfZnJlZV90CQlmcmVlX2xpc3Q7CisJdWludAkJCXFibG9ja3MsIHJlc2Jsa3MsIHJlc3J0ZXh0ZW50czsKKwlpbnQJCQljb21taXR0ZWQ7CisJaW50CQkJZXJyb3I7CiAKIAl2bl90cmFjZV9lbnRyeShYRlNfSVRPVihpcCksIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOwotCW1wID0gaXAtPmlfbW91bnQ7CiAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAotCS8qCi0JICogZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSByZWFsdGltZSBmaWxlCi0JICovCi0JaWYgKChydCA9IFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpICE9IDApIHsKLQkJaWYgKGlwLT5pX2QuZGlfZXh0c2l6ZSkKLQkJCXJ0ZXh0c2l6ZSA9IGlwLT5pX2QuZGlfZXh0c2l6ZTsKLQkJZWxzZQotCQkJcnRleHRzaXplID0gbXAtPm1fc2Iuc2JfcmV4dHNpemU7Ci0JfSBlbHNlCi0JCXJ0ZXh0c2l6ZSA9IDA7CisJcnQgPSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOworCWlmICh1bmxpa2VseShydCkpIHsKKwkJaWYgKCEoZXh0c3ogPSBpcC0+aV9kLmRpX2V4dHNpemUpKQorCQkJZXh0c3ogPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwl9IGVsc2UgeworCQlleHRzeiA9IGlwLT5pX2QuZGlfZXh0c2l6ZTsKKwl9CiAKIAlpZiAoKGVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBpcCwgMCkpKQogCQlyZXR1cm4gZXJyb3I7CkBAIC00MDQ4LDggKzQwMjcsOCBAQAogCWNvdW50ID0gbGVuOwogCWVycm9yID0gMDsKIAlpbWFwcCA9ICZpbWFwc1swXTsKLQlyZWNjb3VudCA9IDE7Ci0JeGZzX2JtYXBpX2ZsYWdzID0gWEZTX0JNQVBJX1dSSVRFIHwgKGFsbG9jX3R5cGUgPyBYRlNfQk1BUElfUFJFQUxMT0MgOiAwKTsKKwluaW1hcHMgPSAxOworCWJtYXBpX2ZsYWcgPSBYRlNfQk1BUElfV1JJVEUgfCAoYWxsb2NfdHlwZSA/IFhGU19CTUFQSV9QUkVBTExPQyA6IDApOwogCXN0YXJ0b2Zmc2V0X2ZzYgk9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CiAJYWxsb2NhdGVzaXplX2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgY291bnQpOwogCkBAIC00MDcwLDQzICs0MDQ5LDUxIEBACiAJfQogCiAJLyoKLQkgKiBhbGxvY2F0ZSBmaWxlIHNwYWNlIHVudGlsIGRvbmUgb3IgdW50aWwgdGhlcmUgaXMgYW4gZXJyb3IKKwkgKiBBbGxvY2F0ZSBmaWxlIHNwYWNlIHVudGlsIGRvbmUgb3IgdW50aWwgdGhlcmUgaXMgYW4gZXJyb3IKIAkgKi8KIHJldHJ5OgogCXdoaWxlIChhbGxvY2F0ZXNpemVfZnNiICYmICFlcnJvcikgewotCQkvKgotCQkgKiBkZXRlcm1pbmUgaWYgcmVzZXJ2aW5nIHNwYWNlIG9uCi0JCSAqIHRoZSBkYXRhIG9yIHJlYWx0aW1lIHBhcnRpdGlvbi4KLQkJICovCi0JCWlmIChydCkgewotCQkJeGZzX2ZpbGVvZmZfdCBzLCBlOworCQl4ZnNfZmlsZW9mZl90CXMsIGU7CiAKKwkJLyoKKwkJICogRGV0ZXJtaW5lIHNwYWNlIHJlc2VydmF0aW9ucyBmb3IgZGF0YS9yZWFsdGltZS4KKwkJICovCisJCWlmICh1bmxpa2VseShleHRzeikpIHsKIAkJCXMgPSBzdGFydG9mZnNldF9mc2I7Ci0JCQlkb19kaXYocywgcnRleHRzaXplKTsKLQkJCXMgKj0gcnRleHRzaXplOwotCQkJZSA9IHJvdW5kdXBfNjQoc3RhcnRvZmZzZXRfZnNiICsgYWxsb2NhdGVzaXplX2ZzYiwKLQkJCQlydGV4dHNpemUpOwotCQkJbnVtcnRleHRlbnRzID0gKGludCkoZSAtIHMpIC8gbXAtPm1fc2Iuc2JfcmV4dHNpemU7Ci0JCQlkYXRhYmxvY2tzID0gMDsKKwkJCWRvX2RpdihzLCBleHRzeik7CisJCQlzICo9IGV4dHN6OworCQkJZSA9IHN0YXJ0b2Zmc2V0X2ZzYiArIGFsbG9jYXRlc2l6ZV9mc2I7CisJCQlpZiAoKHRlbXAgPSBkb19tb2Qoc3RhcnRvZmZzZXRfZnNiLCBleHRzeikpKQorCQkJCWUgKz0gdGVtcDsKKwkJCWlmICgodGVtcCA9IGRvX21vZChlLCBleHRzeikpKQorCQkJCWUgKz0gZXh0c3ogLSB0ZW1wOwogCQl9IGVsc2UgewotCQkJZGF0YWJsb2NrcyA9IGFsbG9jYXRlc2l6ZV9mc2I7Ci0JCQludW1ydGV4dGVudHMgPSAwOworCQkJcyA9IDA7CisJCQllID0gYWxsb2NhdGVzaXplX2ZzYjsKKwkJfQorCisJCWlmICh1bmxpa2VseShydCkpIHsKKwkJCXJlc3J0ZXh0ZW50cyA9IHFibG9ja3MgPSAodWludCkoZSAtIHMpOworCQkJcmVzcnRleHRlbnRzIC89IG1wLT5tX3NiLnNiX3JleHRzaXplOworCQkJcmVzYmxrcyA9IFhGU19ESU9TVFJBVF9TUEFDRV9SRVMobXAsIDApOworCQkJcXVvdGFfZmxhZyA9IFhGU19RTU9QVF9SRVNfUlRCTEtTOworCQl9IGVsc2UgeworCQkJcmVzcnRleHRlbnRzID0gMDsKKwkJCXJlc2Jsa3MgPSBxYmxvY2tzID0gXAorCQkJCVhGU19ESU9TVFJBVF9TUEFDRV9SRVMobXAsICh1aW50KShlIC0gcykpOworCQkJcXVvdGFfZmxhZyA9IFhGU19RTU9QVF9SRVNfUkVHQkxLUzsKIAkJfQogCiAJCS8qCi0JCSAqIGFsbG9jYXRlIGFuZCBzZXR1cCB0aGUgdHJhbnNhY3Rpb24KKwkJICogQWxsb2NhdGUgYW5kIHNldHVwIHRoZSB0cmFuc2FjdGlvbi4KIAkJICovCiAJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfRElPU1RSQVQpOwotCQlyZXNibGtzID0gWEZTX0RJT1NUUkFUX1NQQUNFX1JFUyhtcCwgZGF0YWJsb2Nrcyk7Ci0JCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsCi0JCQkJCSAgcmVzYmxrcywKLQkJCQkJICBYRlNfV1JJVEVfTE9HX1JFUyhtcCksCi0JCQkJCSAgbnVtcnRleHRlbnRzLAorCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCByZXNibGtzLAorCQkJCQkgIFhGU19XUklURV9MT0dfUkVTKG1wKSwgcmVzcnRleHRlbnRzLAogCQkJCQkgIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCiAJCQkJCSAgWEZTX1dSSVRFX0xPR19DT1VOVCk7Ci0KIAkJLyoKLQkJICogY2hlY2sgZm9yIHJ1bm5pbmcgb3V0IG9mIHNwYWNlCisJCSAqIENoZWNrIGZvciBydW5uaW5nIG91dCBvZiBzcGFjZQogCQkgKi8KIAkJaWYgKGVycm9yKSB7CiAJCQkvKgpAQCAtNDExNyw4ICs0MTA0LDggQEAKIAkJCWJyZWFrOwogCQl9CiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQllcnJvciA9IFhGU19UUkFOU19SRVNFUlZFX1FVT1RBKG1wLCB0cCwKLQkJCQlpcC0+aV91ZHF1b3QsIGlwLT5pX2dkcXVvdCwgcmVzYmxrcywgMCwgMCk7CisJCWVycm9yID0gWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEFfTkJMS1MobXAsIHRwLCBpcCwKKwkJCQkJCSAgICAgIHFibG9ja3MsIDAsIHF1b3RhX2ZsYWcpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yMTsKIApAQCAtNDEyNiwxOSArNDExMywxOSBAQAogCQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKIAogCQkvKgotCQkgKiBpc3N1ZSB0aGUgYm1hcGkoKSBjYWxsIHRvIGFsbG9jYXRlIHRoZSBibG9ja3MKKwkJICogSXNzdWUgdGhlIHhmc19ibWFwaSgpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGJsb2NrcwogCQkgKi8KIAkJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3Rmc2IpOwogCQllcnJvciA9IHhmc19ibWFwaSh0cCwgaXAsIHN0YXJ0b2Zmc2V0X2ZzYiwKLQkJCQkgIGFsbG9jYXRlc2l6ZV9mc2IsIHhmc19ibWFwaV9mbGFncywKLQkJCQkgICZmaXJzdGZzYiwgMCwgaW1hcHAsICZyZWNjb3VudCwKKwkJCQkgIGFsbG9jYXRlc2l6ZV9mc2IsIGJtYXBpX2ZsYWcsCisJCQkJICAmZmlyc3Rmc2IsIDAsIGltYXBwLCAmbmltYXBzLAogCQkJCSAgJmZyZWVfbGlzdCk7CiAJCWlmIChlcnJvcikgewogCQkJZ290byBlcnJvcjA7CiAJCX0KIAogCQkvKgotCQkgKiBjb21wbGV0ZSB0aGUgdHJhbnNhY3Rpb24KKwkJICogQ29tcGxldGUgdGhlIHRyYW5zYWN0aW9uCiAJCSAqLwogCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmdHAsICZmcmVlX2xpc3QsIGZpcnN0ZnNiLCAmY29tbWl0dGVkKTsKIAkJaWYgKGVycm9yKSB7CkBAIC00MTUzLDcgKzQxNDAsNyBAQAogCiAJCWFsbG9jYXRlZF9mc2IgPSBpbWFwcC0+YnJfYmxvY2tjb3VudDsKIAotCQlpZiAocmVjY291bnQgPT0gMCkgeworCQlpZiAobmltYXBzID09IDApIHsKIAkJCWVycm9yID0gWEZTX0VSUk9SKEVOT1NQQyk7CiAJCQlicmVhazsKIAkJfQpAQCAtNDE3Niw5ICs0MTYzLDExIEBACiAKIAlyZXR1cm4gZXJyb3I7CiAKLSBlcnJvcjA6CitlcnJvcjA6CS8qIENhbmNlbCBibWFwLCB1bmxvY2sgaW5vZGUsIHVucmVzZXJ2ZSBxdW90YSBibG9ja3MsIGNhbmNlbCB0cmFucyAqLwogCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKLSBlcnJvcjE6CisJWEZTX1RSQU5TX1VOUkVTRVJWRV9RVU9UQV9OQkxLUyhtcCwgdHAsIGlwLCBxYmxvY2tzLCAwLCBxdW90YV9mbGFnKTsKKworZXJyb3IxOgkvKiBKdXN0IGNhbmNlbCB0cmFuc2FjdGlvbiAqLwogCXhmc190cmFuc19jYW5jZWwodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMgfCBYRlNfVFJBTlNfQUJPUlQpOwogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJZ290byBkbWFwaV9lbm9zcGNfY2hlY2s7CkBAIC00NDIzLDggKzQ0MTIsOCBAQAogCQl9CiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCQllcnJvciA9IFhGU19UUkFOU19SRVNFUlZFX1FVT1RBKG1wLCB0cCwKLQkJCQlpcC0+aV91ZHF1b3QsIGlwLT5pX2dkcXVvdCwgcmVzYmxrcywgMCwgcnQgPwotCQkJCVhGU19RTU9QVF9SRVNfUlRCTEtTIDogWEZTX1FNT1BUX1JFU19SRUdCTEtTKTsKKwkJCQlpcC0+aV91ZHF1b3QsIGlwLT5pX2dkcXVvdCwgcmVzYmxrcywgMCwKKwkJCQlYRlNfUU1PUFRfUkVTX1JFR0JMS1MpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yMTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvbW11X2NvbnRleHQuaCBiL2luY2x1ZGUvYXNtLWFscGhhL21tdV9jb250ZXh0LmgKaW5kZXggYTcxNGQwYy4uNmY5MjQ4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9tbXVfY29udGV4dC5oCkBAIC0xNTYsNyArMTU2LDcgQEAKIAkvKiBBbHdheXMgdXBkYXRlIHRoZSBQQ0IgQVNOLiAgQW5vdGhlciB0aHJlYWQgbWF5IGhhdmUgYWxsb2NhdGVkCiAJICAgYSBuZXcgbW0tPmNvbnRleHQgKHZpYSBmbHVzaF90bGJfbW0pIHdpdGhvdXQgdGhlIEFTTiBzZXJpYWwKIAkgICBudW1iZXIgd3JhcHBpbmcuICBXZSBoYXZlIG5vIHdheSB0byBkZXRlY3Qgd2hlbiB0aGlzIGlzIG5lZWRlZC4gICovCi0JbmV4dC0+dGhyZWFkX2luZm8tPnBjYi5hc24gPSBtbWMgJiBIQVJEV0FSRV9BU05fTUFTSzsKKwl0YXNrX3RocmVhZF9pbmZvKG5leHQpLT5wY2IuYXNuID0gbW1jICYgSEFSRFdBUkVfQVNOX01BU0s7CiB9CiAKIF9fRVhURVJOX0lOTElORSB2b2lkCkBAIC0yMzUsNyArMjM1LDcgQEAKIAkJaWYgKGNwdV9vbmxpbmUoaSkpCiAJCQltbS0+Y29udGV4dFtpXSA9IDA7CiAJaWYgKHRzayAhPSBjdXJyZW50KQotCQl0c2stPnRocmVhZF9pbmZvLT5wY2IucHRicgorCQl0YXNrX3RocmVhZF9pbmZvKHRzayktPnBjYi5wdGJyCiAJCSAgPSAoKHVuc2lnbmVkIGxvbmcpbW0tPnBnZCAtIElERU5UX0FERFIpID4+IFBBR0VfU0hJRlQ7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDksNyArMjQ5LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogZW50ZXJfbGF6eV90bGIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCXRzay0+dGhyZWFkX2luZm8tPnBjYi5wdGJyCisJdGFza190aHJlYWRfaW5mbyh0c2spLT5wY2IucHRicgogCSAgPSAoKHVuc2lnbmVkIGxvbmcpbW0tPnBnZCAtIElERU5UX0FERFIpID4+IFBBR0VfU0hJRlQ7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tYWxwaGEvcHJvY2Vzc29yLmgKaW5kZXggYmIxYTdhMy4uNDI1YjdiNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvcHJvY2Vzc29yLmgKQEAgLTUyLDE5ICs1MiwxMCBAQAogCiB1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogCi0vKiBTZWUgYXJjaC9hbHBoYS9rZXJuZWwvcHRyYWNlLmMgZm9yIGRldGFpbHMuICAqLwotI2RlZmluZSBQVF9SRUcocmVnKSBcCi0gIChQQUdFX1NJWkUqMiAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykgKyBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnKSkKLQotI2RlZmluZSBTV19SRUcocmVnKSBcCi0gKFBBR0VfU0laRSoyIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSAtIHNpemVvZihzdHJ1Y3Qgc3dpdGNoX3N0YWNrKSBcCi0gICsgb2Zmc2V0b2Yoc3RydWN0IHN3aXRjaF9zdGFjaywgcmVnKSkKLQotI2RlZmluZSBLU1RLX0VJUCh0c2spIFwKLSAgKCoodW5zaWduZWQgbG9uZyAqKShQVF9SRUcocGMpICsgKHVuc2lnbmVkIGxvbmcpICgodHNrKS0+dGhyZWFkX2luZm8pKSkKKyNkZWZpbmUgS1NUS19FSVAodHNrKSAodGFza19wdF9yZWdzKHRzayktPnBjKQogCiAjZGVmaW5lIEtTVEtfRVNQKHRzaykgXAotICAoKHRzaykgPT0gY3VycmVudCA/IHJkdXNwKCkgOiAodHNrKS0+dGhyZWFkX2luZm8tPnBjYi51c3ApCisgICgodHNrKSA9PSBjdXJyZW50ID8gcmR1c3AoKSA6IHRhc2tfdGhyZWFkX2luZm8odHNrKS0+cGNiLnVzcCkKIAogI2RlZmluZSBjcHVfcmVsYXgoKQliYXJyaWVyKCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9wdHJhY2UuaAppbmRleCAwNzIzNzVjLi45OTMzYjhiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wdHJhY2UuaApAQCAtNzUsMTAgKzc1LDEwIEBACiAjZGVmaW5lIHByb2ZpbGVfcGMocmVncykgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQogZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOwogCi0jZGVmaW5lIGFscGhhX3Rhc2tfcmVncyh0YXNrKSBcCi0gICgoc3RydWN0IHB0X3JlZ3MgKikgKChsb25nKSAodGFzayktPnRocmVhZF9pbmZvICsgMipQQUdFX1NJWkUpIC0gMSkKKyNkZWZpbmUgdGFza19wdF9yZWdzKHRhc2spIFwKKyAgKChzdHJ1Y3QgcHRfcmVncyAqKSAodGFza19zdGFja19wYWdlKHRhc2spICsgMipQQUdFX1NJWkUpIC0gMSkKIAotI2RlZmluZSBmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCkgKGFscGhhX3Rhc2tfcmVncyhjdXJyZW50KS0+cjAgPSAwKQorI2RlZmluZSBmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCkgKHRhc2tfcHRfcmVncyhjdXJyZW50KS0+cjAgPSAwKQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9zeXN0ZW0uaAppbmRleCAwNTBlODZkLi5jYzljN2U4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9zeXN0ZW0uaApAQCAtMTMxLDE1ICsxMzEsMjUgQEAKIGV4dGVybiB2b2lkIGhhbHQodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKICNkZWZpbmUgX19oYWx0KCkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjYWxsX3BhbCAlMCAjaGFsdCIgOiA6ICJpIiAoUEFMX2hhbHQpKQogCi0jZGVmaW5lIHN3aXRjaF90byhQLE4sTCkJCQkJCQlcCi0gIGRvIHsJCQkJCQkJCQlcCi0gICAgKEwpID0gYWxwaGFfc3dpdGNoX3RvKHZpcnRfdG9fcGh5cygmKE4pLT50aHJlYWRfaW5mby0+cGNiKSwgKFApKTsJXAotICAgIGNoZWNrX21tdV9jb250ZXh0KCk7CQkJCQkJXAorI2RlZmluZSBzd2l0Y2hfdG8oUCxOLEwpCQkJCQkJIFwKKyAgZG8gewkJCQkJCQkJCSBcCisgICAgKEwpID0gYWxwaGFfc3dpdGNoX3RvKHZpcnRfdG9fcGh5cygmdGFza190aHJlYWRfaW5mbyhOKS0+cGNiKSwgKFApKTsgXAorICAgIGNoZWNrX21tdV9jb250ZXh0KCk7CQkJCQkJIFwKICAgfSB3aGlsZSAoMCkKIAogc3RydWN0IHRhc2tfc3RydWN0OwogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqYWxwaGFfc3dpdGNoX3RvKHVuc2lnbmVkIGxvbmcsIHN0cnVjdCB0YXNrX3N0cnVjdCopOwogCisvKgorICogT24gU01QIHN5c3RlbXMsIHdoZW4gdGhlIHNjaGVkdWxlciBkb2VzIG1pZ3JhdGlvbi1jb3N0IGF1dG9kZXRlY3Rpb24sCisgKiBpdCBuZWVkcyBhIHdheSB0byBmbHVzaCBhcyBtdWNoIG9mIHRoZSBDUFUncyBjYWNoZXMgYXMgcG9zc2libGUuCisgKgorICogVE9ETzogZmlsbCB0aGlzIGluIQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfY2FjaGVmbHVzaCh2b2lkKQoreworfQorCiAjZGVmaW5lIGltYigpIFwKIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2FsbF9wYWwgJTAgI2ltYiIgOiA6ICJpIiAoUEFMX2ltYikgOiAibWVtb3J5IikKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLWFscGhhL3RocmVhZF9pbmZvLmgKaW5kZXggZDUxNDkxZS4uNjlmZmQ5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS90aHJlYWRfaW5mby5oCkBAIC01NCw4ICs1NCw2IEBACiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykgXAogICAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsMSkpCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpICh0aSksIDEpCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3BkYy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3BkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTE1MGQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9wZGMuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3BkYy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEl2YW4gS29rc2hheXNreQorICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCisgKgorICogUGVyaXBoZXJhbCBEYXRhIENvbnRyb2xsZXIgKFBEQykgcmVnaXN0ZXJzLgorICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MVJNOTIwMF9QRENfSAorI2RlZmluZSBBVDkxUk05MjAwX1BEQ19ICisKKyNkZWZpbmUgQVQ5MV9QRENfUlBSCQkweDEwMAkvKiBSZWNlaXZlIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9QRENfUkNSCQkweDEwNAkvKiBSZWNlaXZlIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9QRENfVFBSCQkweDEwOAkvKiBUcmFuc21pdCBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfUERDX1RDUgkJMHgxMGMJLyogVHJhbnNtaXQgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1BEQ19STlBSCQkweDExMAkvKiBSZWNlaXZlIE5leHQgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1BEQ19STkNSCQkweDExNAkvKiBSZWNlaXZlIE5leHQgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1BEQ19UTlBSCQkweDExOAkvKiBUcmFuc21pdCBOZXh0IFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9QRENfVE5DUgkJMHgxMWMJLyogVHJhbnNtaXQgTmV4dCBDb3VudGVyIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgQVQ5MV9QRENfUFRDUgkJMHgxMjAJLyogVHJhbnNmZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9QRENfUlhURU4JCSgxIDw8IDApCS8qIFJlY2VpdmVyIFRyYW5zZmVyIEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9QRENfUlhURElTCQkoMSA8PCAxKQkvKiBSZWNlaXZlciBUcmFuc2ZlciBEaXNhYmxlICovCisjZGVmaW5lCQlBVDkxX1BEQ19UWFRFTgkJKDEgPDwgOCkJLyogVHJhbnNtaXR0ZXIgVHJhbnNmZXIgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX1BEQ19UWFRESVMJCSgxIDw8IDkpCS8qIFRyYW5zbWl0dGVyIFRyYW5zZmVyIERpc2FibGUgKi8KKworI2RlZmluZSBBVDkxX1BEQ19QVFNSCQkweDEyNAkvKiBUcmFuc2ZlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfdXNhcnQuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF91c2FydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Zjg1MWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfdXNhcnQuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF91c2FydC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEl2YW4gS29rc2hheXNreQorICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCisgKgorICogVVNBUlQgcmVnaXN0ZXJzLgorICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MVJNOTIwMF9VU0FSVF9ICisjZGVmaW5lIEFUOTFSTTkyMDBfVVNBUlRfSAorCisjZGVmaW5lIEFUOTFfVVNfQ1IJCTB4MDAJCQkvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1VTX1JTVFJYCQkoMSA8PCAgMikJCS8qIFJlc2V0IFJlY2VpdmVyICovCisjZGVmaW5lCQlBVDkxX1VTX1JTVFRYCQkoMSA8PCAgMykJCS8qIFJlc2V0IFRyYW5zbWl0dGVyICovCisjZGVmaW5lCQlBVDkxX1VTX1JYRU4JCSgxIDw8ICA0KQkJLyogUmVjZWl2ZXIgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX1VTX1JYRElTCQkoMSA8PCAgNSkJCS8qIFJlY2VpdmVyIERpc2FibGUgKi8KKyNkZWZpbmUJCUFUOTFfVVNfVFhFTgkJKDEgPDwgIDYpCQkvKiBUcmFuc21pdHRlciBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfVVNfVFhESVMJCSgxIDw8ICA3KQkJLyogVHJhbnNtaXR0ZXIgRGlzYWJsZSAqLworI2RlZmluZQkJQVQ5MV9VU19SU1RTVEEJCSgxIDw8ICA4KQkJLyogUmVzZXQgU3RhdHVzIEJpdHMgKi8KKyNkZWZpbmUJCUFUOTFfVVNfU1RUQlJLCQkoMSA8PCAgOSkJCS8qIFN0YXJ0IEJyZWFrICovCisjZGVmaW5lCQlBVDkxX1VTX1NUUEJSSwkJKDEgPDwgMTApCQkvKiBTdG9wIEJyZWFrICovCisjZGVmaW5lCQlBVDkxX1VTX1NUVFRPCQkoMSA8PCAxMSkJCS8qIFN0YXJ0IFRpbWUtb3V0ICovCisjZGVmaW5lCQlBVDkxX1VTX1NFTkRBCQkoMSA8PCAxMikJCS8qIFNlbmQgQWRkcmVzcyAqLworI2RlZmluZQkJQVQ5MV9VU19SU1RJVAkJKDEgPDwgMTMpCQkvKiBSZXNldCBJdGVyYXRpb25zICovCisjZGVmaW5lCQlBVDkxX1VTX1JTVE5BQ0sJCSgxIDw8IDE0KQkJLyogUmVzZXQgTm9uIEFja25vd2xlZGdlICovCisjZGVmaW5lCQlBVDkxX1VTX1JFVFRPCQkoMSA8PCAxNSkJCS8qIFJlYXJtIFRpbWUtb3V0ICovCisjZGVmaW5lCQlBVDkxX1VTX0RUUkVOCQkoMSA8PCAxNikJCS8qIERhdGEgVGVybWluYWwgUmVhZHkgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX1VTX0RUUkRJUwkJKDEgPDwgMTcpCQkvKiBEYXRhIFRlcm1pbmFsIFJlYWR5IERpc2FibGUgKi8KKyNkZWZpbmUJCUFUOTFfVVNfUlRTRU4JCSgxIDw8IDE4KQkJLyogUmVxdWVzdCBUbyBTZW5kIEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9VU19SVFNESVMJCSgxIDw8IDE5KQkJLyogUmVxdWVzdCBUbyBTZW5kIERpc2FibGUgKi8KKworI2RlZmluZSBBVDkxX1VTX01SCQkweDA0CQkJLyogTW9kZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9VU19VU01PREUJCSgweGYgPDwgIDApCQkvKiBNb2RlIG9mIHRoZSBVU0FSVCAqLworI2RlZmluZQkJCUFUOTFfVVNfVVNNT0RFX05PUk1BTAkJMAorI2RlZmluZQkJCUFUOTFfVVNfVVNNT0RFX1JTNDg1CQkxCisjZGVmaW5lCQkJQVQ5MV9VU19VU01PREVfSFdIUwkJMgorI2RlZmluZQkJCUFUOTFfVVNfVVNNT0RFX01PREVNCQkzCisjZGVmaW5lCQkJQVQ5MV9VU19VU01PREVfSVNPNzgxNl9UMAk0CisjZGVmaW5lCQkJQVQ5MV9VU19VU01PREVfSVNPNzgxNl9UMQk2CisjZGVmaW5lCQkJQVQ5MV9VU19VU01PREVfSVJEQQkJOAorI2RlZmluZQkJQVQ5MV9VU19VU0NMS1MJCSgzICAgPDwgIDQpCQkvKiBDbG9jayBTZWxlY3Rpb24gKi8KKyNkZWZpbmUJCUFUOTFfVVNfQ0hSTAkJKDMgICA8PCAgNikJCS8qIENoYXJhY3RlciBMZW5ndGggKi8KKyNkZWZpbmUJCQlBVDkxX1VTX0NIUkxfNQkJCSgwIDw8ICA2KQorI2RlZmluZQkJCUFUOTFfVVNfQ0hSTF82CQkJKDEgPDwgIDYpCisjZGVmaW5lCQkJQVQ5MV9VU19DSFJMXzcJCQkoMiA8PCAgNikKKyNkZWZpbmUJCQlBVDkxX1VTX0NIUkxfOAkJCSgzIDw8ICA2KQorI2RlZmluZQkJQVQ5MV9VU19TWU5DCQkoMSA8PCAgOCkJCS8qIFN5bmNocm9ub3VzIE1vZGUgU2VsZWN0ICovCisjZGVmaW5lCQlBVDkxX1VTX1BBUgkJKDcgPDwgIDkpCQkvKiBQYXJpdHkgVHlwZSAqLworI2RlZmluZQkJCUFUOTFfVVNfUEFSX0VWRU4JCSgwIDw8ICA5KQorI2RlZmluZQkJCUFUOTFfVVNfUEFSX09ERAkJCSgxIDw8ICA5KQorI2RlZmluZQkJCUFUOTFfVVNfUEFSX1NQQUNFCQkoMiA8PCAgOSkKKyNkZWZpbmUJCQlBVDkxX1VTX1BBUl9NQVJLCQkoMyA8PCAgOSkKKyNkZWZpbmUJCQlBVDkxX1VTX1BBUl9OT05FCQkoNCA8PCAgOSkKKyNkZWZpbmUJCQlBVDkxX1VTX1BBUl9NVUxUSV9EUk9QCQkoNiA8PCAgOSkKKyNkZWZpbmUJCUFUOTFfVVNfTkJTVE9QCQkoMyA8PCAxMikJCS8qIE51bWJlciBvZiBTdG9wIEJpdHMgKi8KKyNkZWZpbmUJCQlBVDkxX1VTX05CU1RPUF8xCQkoMCA8PCAxMikKKyNkZWZpbmUJCQlBVDkxX1VTX05CU1RPUF8xXzUJCSgxIDw8IDEyKQorI2RlZmluZQkJCUFUOTFfVVNfTkJTVE9QXzIJCSgyIDw8IDEyKQorI2RlZmluZQkJQVQ5MV9VU19DSE1PREUJCSgzIDw8IDE0KQkJLyogQ2hhbm5lbCBNb2RlICovCisjZGVmaW5lCQkJQVQ5MV9VU19DSE1PREVfTk9STUFMCQkoMCA8PCAxNCkKKyNkZWZpbmUJCQlBVDkxX1VTX0NITU9ERV9FQ0hPCQkoMSA8PCAxNCkKKyNkZWZpbmUJCQlBVDkxX1VTX0NITU9ERV9MT0NfTE9PUAkJKDIgPDwgMTQpCisjZGVmaW5lCQkJQVQ5MV9VU19DSE1PREVfUkVNX0xPT1AJCSgzIDw8IDE0KQorI2RlZmluZQkJQVQ5MV9VU19NU0JGCQkoMSA8PCAxNikJCS8qIEJpdCBPcmRlciAqLworI2RlZmluZQkJQVQ5MV9VU19NT0RFOQkJKDEgPDwgMTcpCQkvKiA5LWJpdCBDaGFyYWN0ZXIgTGVuZ3RoICovCisjZGVmaW5lCQlBVDkxX1VTX0NMS08JCSgxIDw8IDE4KQkJLyogQ2xvY2sgT3V0cHV0IFNlbGVjdCAqLworI2RlZmluZQkJQVQ5MV9VU19PVkVSCQkoMSA8PCAxOSkJCS8qIE92ZXJzYW1wbGluZyBNb2RlICovCisjZGVmaW5lCQlBVDkxX1VTX0lOQUNLCQkoMSA8PCAyMCkJCS8qIEluaGliaXQgTm9uIEFja25vd2xlZGdlICovCisjZGVmaW5lCQlBVDkxX1VTX0RTTkFDSwkJKDEgPDwgMjEpCQkvKiBEaXNhYmxlIFN1Y2Nlc3NpdmUgTkFDSyAqLworI2RlZmluZQkJQVQ5MV9VU19NQVhfSVRFUgkoNyA8PCAyNCkJCS8qIE1heCBJdGVyYXRpb25zICovCisjZGVmaW5lCQlBVDkxX1VTX0ZJTFRFUgkJKDEgPDwgMjgpCQkvKiBJbmZyYXJlZCBSZWNlaXZlIExpbmUgRmlsdGVyICovCisKKyNkZWZpbmUgQVQ5MV9VU19JRVIJCTB4MDgJCQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1VTX1JYUkRZCQkoMSA8PCAgMCkJCS8qIFJlY2VpdmVyIFJlYWR5ICovCisjZGVmaW5lCQlBVDkxX1VTX1RYUkRZCQkoMSA8PCAgMSkJCS8qIFRyYW5zbWl0dGVyIFJlYWR5ICovCisjZGVmaW5lCQlBVDkxX1VTX1JYQlJLCQkoMSA8PCAgMikJCS8qIEJyZWFrIFJlY2VpdmVkIC8gRW5kIG9mIEJyZWFrICovCisjZGVmaW5lCQlBVDkxX1VTX0VORFJYCQkoMSA8PCAgMykJCS8qIEVuZCBvZiBSZWNlaXZlciBUcmFuc2ZlciAqLworI2RlZmluZQkJQVQ5MV9VU19FTkRUWAkJKDEgPDwgIDQpCQkvKiBFbmQgb2YgVHJhbnNtaXR0ZXIgVHJhbnNmZXIgKi8KKyNkZWZpbmUJCUFUOTFfVVNfT1ZSRQkJKDEgPDwgIDUpCQkvKiBPdmVycnVuIEVycm9yICovCisjZGVmaW5lCQlBVDkxX1VTX0ZSQU1FCQkoMSA8PCAgNikJCS8qIEZyYW1pbmcgRXJyb3IgKi8KKyNkZWZpbmUJCUFUOTFfVVNfUEFSRQkJKDEgPDwgIDcpCQkvKiBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUJCUFUOTFfVVNfVElNRU9VVAkJKDEgPDwgIDgpCQkvKiBSZWNlaXZlciBUaW1lLW91dCAqLworI2RlZmluZQkJQVQ5MV9VU19UWEVNUFRZCQkoMSA8PCAgOSkJCS8qIFRyYW5zbWl0dGVyIEVtcHR5ICovCisjZGVmaW5lCQlBVDkxX1VTX0lURVJBVElPTgkoMSA8PCAxMCkJCS8qIE1heCBudW1iZXIgb2YgUmVwZXRpdGlvbnMgUmVhY2hlZCAqLworI2RlZmluZQkJQVQ5MV9VU19UWEJVRkUJCSgxIDw8IDExKQkJLyogVHJhbnNtaXNzaW9uIEJ1ZmZlciBFbXB0eSAqLworI2RlZmluZQkJQVQ5MV9VU19SWEJVRkYJCSgxIDw8IDEyKQkJLyogUmVjZXB0aW9uIEJ1ZmZlciBGdWxsICovCisjZGVmaW5lCQlBVDkxX1VTX05BQ0sJCSgxIDw8IDEzKQkJLyogTm9uIEFja25vd2xlZGdlICovCisjZGVmaW5lCQlBVDkxX1VTX1JJSUMJCSgxIDw8IDE2KQkJLyogUmluZyBJbmRpY2F0b3IgSW5wdXQgQ2hhbmdlICovCisjZGVmaW5lCQlBVDkxX1VTX0RTUklDCQkoMSA8PCAxNykJCS8qIERhdGEgU2V0IFJlYWR5IElucHV0IENoYW5nZSAqLworI2RlZmluZQkJQVQ5MV9VU19EQ0RJQwkJKDEgPDwgMTgpCQkvKiBEYXRhIENhcnJpZXIgRGV0ZWN0IElucHV0IENoYW5nZSAqLworI2RlZmluZQkJQVQ5MV9VU19DVFNJQwkJKDEgPDwgMTkpCQkvKiBDbGVhciB0byBTZW5kIElucHV0IENoYW5nZSAqLworI2RlZmluZQkJQVQ5MV9VU19SSQkJKDEgPDwgMjApCQkvKiBSSSAqLworI2RlZmluZQkJQVQ5MV9VU19EU1IJCSgxIDw8IDIxKQkJLyogRFNSICovCisjZGVmaW5lCQlBVDkxX1VTX0RDRAkJKDEgPDwgMjIpCQkvKiBEQ0QgKi8KKyNkZWZpbmUJCUFUOTFfVVNfQ1RTCQkoMSA8PCAyMykJCS8qIENUUyAqLworCisjZGVmaW5lIEFUOTFfVVNfSURSCQkweDBjCQkJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9VU19JTVIJCTB4MTAJCQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1VTX0NTUgkJMHgxNAkJCS8qIENoYW5uZWwgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfVVNfUkhSCQkweDE4CQkJLyogUmVjZWl2ZXIgSG9sZGluZyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1VTX1RIUgkJMHgxYwkJCS8qIFRyYW5zbWl0dGVyIEhvbGRpbmcgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBBVDkxX1VTX0JSR1IJCTB4MjAJCQkvKiBCYXVkIFJhdGUgR2VuZXJhdG9yIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1VTX0NECQkoMHhmZmZmIDw8IDApCQkvKiBDbG9jayBEaXZpZGVyICovCisKKyNkZWZpbmUgQVQ5MV9VU19SVE9SCQkweDI0CQkJLyogUmVjZWl2ZXIgVGltZS1vdXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfVVNfVE8JCSgweGZmZmYgPDwgMCkJCS8qIFRpbWUtb3V0IFZhbHVlICovCisKKyNkZWZpbmUgQVQ5MV9VU19UVEdSCQkweDI4CQkJLyogVHJhbnNtaXR0ZXIgVGltZWd1YXJkIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1VTX1RHCQkoMHhmZiA8PCAwKQkJLyogVGltZWd1YXJkIFZhbHVlICovCisKKyNkZWZpbmUgQVQ5MV9VU19GSURJCQkweDQwCQkJLyogRkkgREkgUmF0aW8gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9VU19ORVIJCTB4NDQJCQkvKiBOdW1iZXIgb2YgRXJyb3JzIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfVVNfSUYJCTB4NGMJCQkvKiBJckRBIEZpbHRlciBSZWdpc3RlciAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvYXNtLWFybS9ieXRlb3JkZXIuaAppbmRleCA3NDFmNWJjLi4xN2VhZjhiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYnl0ZW9yZGVyLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2J5dGVvcmRlci5oCkBAIC0yMiw3ICsyMiwxNiBAQAogewogCV9fdTMyIHQ7CiAKLQl0ID0geCBeICgoeCA8PCAxNikgfCAoeCA+PiAxNikpOwkvKiBlb3IgcjEscjAscjAscm9yICMxNiAgKi8KKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoeCkpIHsKKwkJdCA9IHggXiAoKHggPDwgMTYpIHwgKHggPj4gMTYpKTsgLyogZW9yIHIxLHIwLHIwLHJvciAjMTYgKi8KKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgY29tcGlsZXIgbmVlZHMgYSBiaXQgb2YgYSBoaW50IGhlcmUgdG8gYWx3YXlzIGRvIHRoZQorCQkgKiByaWdodCB0aGluZyBhbmQgbm90IHNjcmV3IGl0IHVwIHRvIGRpZmZlcmVudCBkZWdyZWVzCisJCSAqIGRlcGVuZGluZyBvbiB0aGUgZ2NjIHZlcnNpb24uCisJCSAqLworCQlhc20gKCJlb3JcdCUwLCAlMSwgJTEsIHJvciAjMTYiIDogIj1yIiAodCkgOiAiciIgKHgpKTsKKwl9CiAJeCA9ICh4IDw8IDI0KSB8ICh4ID4+IDgpOwkJLyogbW92IHIwLHIwLHJvciAjOCAgICAgICovCiAJdCAmPSB+MHgwMEZGMDAwMDsJCQkvKiBiaWMgcjEscjEsIzB4MDBGRjAwMDAgKi8KIAl4IF49ICh0ID4+IDgpOwkJCQkvKiBlb3IgcjAscjAscjEsbHNyICM4ICAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9tYWNoL3NlcmlhbF9hdDkxcm05MjAwLmggYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC9zZXJpYWxfYXQ5MXJtOTIwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZjRiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC9zZXJpYWxfYXQ5MXJtOTIwMC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL21hY2gvc2VyaWFsX2F0OTFybTkyMDAuaAorICoKKyAqICBCYXNlZCBvbiBzZXJpYWxfc2ExMTAwLmggIGJ5IE5pY29sYXMgUGl0cmUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEFUTUVMIFJvdXNzZXQKKyAqCisgKiAgTG93IGxldmVsIG1hY2hpbmUgZGVwZW5kZW50IFVBUlQgZnVuY3Rpb25zLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKK3N0cnVjdCB1YXJ0X3BvcnQ7CisKKy8qCisgKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0cnVjdHVyZSBmb3IgcmVnaXN0ZXJpbmcgdGhlc2UKKyAqIGZ1bmN0aW9uczsgaXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzY2FyZGVkIGFmdGVyIGJvb3QuCisgKi8KK3N0cnVjdCBhdDkxcm05MjAwX3BvcnRfZm5zIHsKKwl2b2lkCSgqc2V0X21jdHJsKShzdHJ1Y3QgdWFydF9wb3J0ICosIHVfaW50KTsKKwl1X2ludAkoKmdldF9tY3RybCkoc3RydWN0IHVhcnRfcG9ydCAqKTsKKwl2b2lkCSgqZW5hYmxlX21zKShzdHJ1Y3QgdWFydF9wb3J0ICopOworCXZvaWQJKCpwbSkoc3RydWN0IHVhcnRfcG9ydCAqLCB1X2ludCwgdV9pbnQpOworCWludAkoKnNldF93YWtlKShzdHJ1Y3QgdWFydF9wb3J0ICosIHVfaW50KTsKKwlpbnQJKCpvcGVuKShzdHJ1Y3QgdWFydF9wb3J0ICopOworCXZvaWQJKCpjbG9zZSkoc3RydWN0IHVhcnRfcG9ydCAqKTsKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQVQ5MSkKK3ZvaWQgYXQ5MV9yZWdpc3Rlcl91YXJ0X2ZucyhzdHJ1Y3QgYXQ5MXJtOTIwMF9wb3J0X2ZucyAqZm5zKTsKK3ZvaWQgYXQ5MV9yZWdpc3Rlcl91YXJ0KGludCBpZHgsIGludCBwb3J0KTsKKyNlbHNlCisjZGVmaW5lIGF0OTFfcmVnaXN0ZXJfdWFydF9mbnMoZm5zKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGF0OTFfcmVnaXN0ZXJfdWFydChpZHgscG9ydCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL21lbW9yeS5oIGIvaW5jbHVkZS9hc20tYXJtL21lbW9yeS5oCmluZGV4IDNkN2YwOGIuLmI0ZTExNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9tZW1vcnkuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vbWVtb3J5LmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL21lbW9yeS5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogCiAjaWZuZGVmIFRBU0tfU0laRQogLyoKQEAgLTQ4LDYgKzQ5LDE0IEBACiAjZW5kaWYKIAogLyoKKyAqIFNpemUgb2YgRE1BLWNvbnNpc3RlbnQgbWVtb3J5IHJlZ2lvbi4gIE11c3QgYmUgbXVsdGlwbGUgb2YgMk0sCisgKiBiZXR3ZWVuIDJNQiBhbmQgMTRNQiBpbmNsdXNpdmUuCisgKi8KKyNpZm5kZWYgQ09OU0lTVEVOVF9ETUFfU0laRQorI2RlZmluZSBDT05TSVNURU5UX0RNQV9TSVpFIFNaXzJNCisjZW5kaWYKKworLyoKICAqIFBoeXNpY2FsIHZzIHZpcnR1YWwgUkFNIGFkZHJlc3Mgc3BhY2UgY29udmVyc2lvbi4gIFRoZXNlIGFyZQogICogcHJpdmF0ZSBkZWZpbml0aW9ucyB3aGljaCBzaG91bGQgTk9UIGJlIHVzZWQgb3V0c2lkZSBtZW1vcnkuaAogICogZmlsZXMuICBVc2UgdmlydF90b19waHlzL3BoeXNfdG9fdmlydC9fX3BhL19fdmEgaW5zdGVhZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLWFybS9wcm9jZXNzb3IuaAppbmRleCA3ZDQxMThlLi4zMTI5MDY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3Byb2Nlc3Nvci5oCkBAIC04NSw5ICs4NSwxMSBAQAogICovCiBleHRlcm4gaW50IGtlcm5lbF90aHJlYWQoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZywgdW5zaWduZWQgbG9uZyBmbGFncyk7CiAKLSNkZWZpbmUgS1NUS19SRUdTKHRzaykJKCgoc3RydWN0IHB0X3JlZ3MgKikoVEhSRUFEX1NUQVJUX1NQICsgKHVuc2lnbmVkIGxvbmcpKHRzayktPnRocmVhZF9pbmZvKSkgLSAxKQotI2RlZmluZSBLU1RLX0VJUCh0c2spCUtTVEtfUkVHUyh0c2spLT5BUk1fcGMKLSNkZWZpbmUgS1NUS19FU1AodHNrKQlLU1RLX1JFR1ModHNrKS0+QVJNX3NwCisjZGVmaW5lIHRhc2tfcHRfcmVncyhwKSBcCisJKChzdHJ1Y3QgcHRfcmVncyAqKShUSFJFQURfU1RBUlRfU1AgKyB0YXNrX3N0YWNrX3BhZ2UocCkpIC0gMSkKKworI2RlZmluZSBLU1RLX0VJUCh0c2spCXRhc2tfcHRfcmVncyh0c2spLT5BUk1fcGMKKyNkZWZpbmUgS1NUS19FU1AodHNrKQl0YXNrX3B0X3JlZ3ModHNrKS0+QVJNX3NwCiAKIC8qCiAgKiBQcmVmZXRjaGluZyBzdXBwb3J0IC0gb25seSBBUk12NS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWFybS9zeXN0ZW0uaAppbmRleCA1NjIxZDYxLi5lYjJkZThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3N5c3RlbS5oCkBAIC0xNjgsMTAgKzE2OCwyMCBAQAogCiAjZGVmaW5lIHN3aXRjaF90byhwcmV2LG5leHQsbGFzdCkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JbGFzdCA9IF9fc3dpdGNoX3RvKHByZXYscHJldi0+dGhyZWFkX2luZm8sbmV4dC0+dGhyZWFkX2luZm8pOwlcCisJbGFzdCA9IF9fc3dpdGNoX3RvKHByZXYsdGFza190aHJlYWRfaW5mbyhwcmV2KSwgdGFza190aHJlYWRfaW5mbyhuZXh0KSk7CVwKIH0gd2hpbGUgKDApCiAKIC8qCisgKiBPbiBTTVAgc3lzdGVtcywgd2hlbiB0aGUgc2NoZWR1bGVyIGRvZXMgbWlncmF0aW9uLWNvc3QgYXV0b2RldGVjdGlvbiwKKyAqIGl0IG5lZWRzIGEgd2F5IHRvIGZsdXNoIGFzIG11Y2ggb2YgdGhlIENQVSdzIGNhY2hlcyBhcyBwb3NzaWJsZS4KKyAqCisgKiBUT0RPOiBmaWxsIHRoaXMgaW4hCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9jYWNoZWZsdXNoKHZvaWQpCit7Cit9CisKKy8qCiAgKiBDUFUgaW50ZXJydXB0IG1hc2sgaGFuZGxpbmcuCiAgKi8KICNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1hcm0vdGhyZWFkX2luZm8uaAppbmRleCA3Yzk4NTU3Li4zM2EzM2NiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vdGhyZWFkX2luZm8uaApAQCAtOTYsMTMgKzk2LDEwIEBACiBleHRlcm4gc3RydWN0IHRocmVhZF9pbmZvICphbGxvY190aHJlYWRfaW5mbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogZXh0ZXJuIHZvaWQgZnJlZV90aHJlYWRfaW5mbyhzdHJ1Y3QgdGhyZWFkX2luZm8gKik7CiAKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKQlnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKQlwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLQogI2RlZmluZSB0aHJlYWRfc2F2ZWRfcGModHNrKQlcCi0JKCh1bnNpZ25lZCBsb25nKShwY19wb2ludGVyKCh0c2spLT50aHJlYWRfaW5mby0+Y3B1X2NvbnRleHQucGMpKSkKKwkoKHVuc2lnbmVkIGxvbmcpKHBjX3BvaW50ZXIodGFza190aHJlYWRfaW5mbyh0c2spLT5jcHVfY29udGV4dC5wYykpKQogI2RlZmluZSB0aHJlYWRfc2F2ZWRfZnAodHNrKQlcCi0JKCh1bnNpZ25lZCBsb25nKSgodHNrKS0+dGhyZWFkX2luZm8tPmNwdV9jb250ZXh0LmZwKSkKKwkoKHVuc2lnbmVkIGxvbmcpKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+Y3B1X2NvbnRleHQuZnApKQogCiBleHRlcm4gdm9pZCBpd21teHRfdGFza19kaXNhYmxlKHN0cnVjdCB0aHJlYWRfaW5mbyAqKTsKIGV4dGVybiB2b2lkIGl3bW14dF90YXNrX2NvcHkoc3RydWN0IHRocmVhZF9pbmZvICosIHZvaWQgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWFybTI2L3N5c3RlbS5oCmluZGV4IGYyM2ZhYzEuLmNhNGNjZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L3N5c3RlbS5oCkBAIC0xMTEsMTAgKzExMSwyMCBAQAogCiAjZGVmaW5lIHN3aXRjaF90byhwcmV2LG5leHQsbGFzdCkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JbGFzdCA9IF9fc3dpdGNoX3RvKHByZXYscHJldi0+dGhyZWFkX2luZm8sbmV4dC0+dGhyZWFkX2luZm8pOwlcCisJbGFzdCA9IF9fc3dpdGNoX3RvKHByZXYsdGFza190aHJlYWRfaW5mbyhwcmV2KSx0YXNrX3RocmVhZF9pbmZvKG5leHQpKTsJXAogfSB3aGlsZSAoMCkKIAogLyoKKyAqIE9uIFNNUCBzeXN0ZW1zLCB3aGVuIHRoZSBzY2hlZHVsZXIgZG9lcyBtaWdyYXRpb24tY29zdCBhdXRvZGV0ZWN0aW9uLAorICogaXQgbmVlZHMgYSB3YXkgdG8gZmx1c2ggYXMgbXVjaCBvZiB0aGUgQ1BVJ3MgY2FjaGVzIGFzIHBvc3NpYmxlLgorICoKKyAqIFRPRE86IGZpbGwgdGhpcyBpbiEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2NhY2hlZmx1c2godm9pZCkKK3sKK30KKworLyoKICAqIFNhdmUgdGhlIGN1cnJlbnQgaW50ZXJydXB0IGVuYWJsZSBzdGF0ZSAmIGRpc2FibGUgSVJRcwogICovCiAjZGVmaW5lIGxvY2FsX2lycV9zYXZlKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1hcm0yNi90aHJlYWRfaW5mby5oCmluZGV4IGFmZjNlNTYuLmE2NWU1OGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvdGhyZWFkX2luZm8uaApAQCAtODIsMTggKzgyLDE1IEBACiAKIC8qIEZJWE1FIC0gUEFHRV9TSVpFIDwgMzJLICovCiAjZGVmaW5lIFRIUkVBRF9TSVpFCQkoOCozMjc2OCkgLy8gRklYTUUgLSB0aGlzIG5lZWRzIGF0dGVudGlvbiAoc2VlIGtlcm5lbC9mb3JrLmMgd2hpY2ggZ2V0cyBhIG5pY2UgZGl2IGJ5IHplcm8gaWYgdGhpcyBpcyBsb3dlciB0aGFuIDgqMzI3NjgKLSNkZWZpbmUgX19nZXRfdXNlcl9yZWdzKHgpICgoKHN0cnVjdCBwdF9yZWdzICopKCh1bnNpZ25lZCBsb25nKSh4KSArIFRIUkVBRF9TSVpFIC0gOCkpIC0gMSkKKyNkZWZpbmUgdGFza19wdF9yZWdzKHRhc2spICgoc3RydWN0IHB0X3JlZ3MgKikodGFza19zdGFja19wYWdlKHRhc2spICsgVEhSRUFEX1NJWkUgLSA4KSAtIDEpCiAKIGV4dGVybiBzdHJ1Y3QgdGhyZWFkX2luZm8gKmFsbG9jX3RocmVhZF9pbmZvKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiBleHRlcm4gdm9pZCBmcmVlX3RocmVhZF9pbmZvKHN0cnVjdCB0aHJlYWRfaW5mbyAqKTsKIAotI2RlZmluZSBnZXRfdGhyZWFkX2luZm8odGkpCWdldF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQotI2RlZmluZSBwdXRfdGhyZWFkX2luZm8odGkpCXB1dF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQotCiAjZGVmaW5lIHRocmVhZF9zYXZlZF9wYyh0c2spCVwKLQkoKHVuc2lnbmVkIGxvbmcpKHBjX3BvaW50ZXIoKHRzayktPnRocmVhZF9pbmZvLT5jcHVfY29udGV4dC5wYykpKQorCSgodW5zaWduZWQgbG9uZykocGNfcG9pbnRlcih0YXNrX3RocmVhZF9pbmZvKHRzayktPmNwdV9jb250ZXh0LnBjKSkpCiAjZGVmaW5lIHRocmVhZF9zYXZlZF9mcCh0c2spCVwKLQkoKHVuc2lnbmVkIGxvbmcpKCh0c2spLT50aHJlYWRfaW5mby0+Y3B1X2NvbnRleHQuZnApKQorCSgodW5zaWduZWQgbG9uZykodGFza190aHJlYWRfaW5mbyh0c2spLT5jcHVfY29udGV4dC5mcCkpCiAKICNlbHNlIC8qICFfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MTAvcHJvY2Vzc29yLmgKaW5kZXggZTIzZGY4ZC4uY2M2OTJjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL3Byb2Nlc3Nvci5oCkBAIC00MCw3ICs0MCw3IEBACiAjZGVmaW5lIEtTVEtfRUlQKHRzaykJXAogKHsJCQlcCiAJdW5zaWduZWQgbG9uZyBlaXAgPSAwOyAgIFwKLQl1bnNpZ25lZCBsb25nIHJlZ3MgPSAodW5zaWduZWQgbG9uZyl1c2VyX3JlZ3ModHNrKTsgXAorCXVuc2lnbmVkIGxvbmcgcmVncyA9ICh1bnNpZ25lZCBsb25nKXRhc2tfcHRfcmVncyh0c2spOyBcCiAJaWYgKHJlZ3MgPiBQQUdFX1NJWkUgJiYgXAogCQl2aXJ0X2FkZHJfdmFsaWQocmVncykpIFwKIAllaXAgPSAoKHN0cnVjdCBwdF9yZWdzICopcmVncyktPmlycDsgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvcHJvY2Vzc29yLmgKaW5kZXggOGM5MzliZi4uMzJiZjJlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL3Byb2Nlc3Nvci5oCkBAIC0zNiw3ICszNiw3IEBACiAjZGVmaW5lIEtTVEtfRUlQKHRzaykJCVwKICh7CQkJCVwKIAl1bnNpZ25lZCBsb25nIGVpcCA9IDA7CVwKLQl1bnNpZ25lZCBsb25nIHJlZ3MgPSAodW5zaWduZWQgbG9uZyl1c2VyX3JlZ3ModHNrKTsgXAorCXVuc2lnbmVkIGxvbmcgcmVncyA9ICh1bnNpZ25lZCBsb25nKXRhc2tfcHRfcmVncyh0c2spOyBcCiAJaWYgKHJlZ3MgPiBQQUdFX1NJWkUgJiYgdmlydF9hZGRyX3ZhbGlkKHJlZ3MpKQkgICAgXAogCQllaXAgPSAoKHN0cnVjdCBwdF9yZWdzICopcmVncyktPmVycDsJICAgIFwKIAllaXA7IFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1jcmlzL3Byb2Nlc3Nvci5oCmluZGV4IGRjZTQxMDAuLjk2MWUyYmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9wcm9jZXNzb3IuaApAQCAtNDUsNyArNDUsOCBAQAogICogRGl0byBidXQgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrCiAgKi8KIAotI2RlZmluZSBjdXJyZW50X3JlZ3MoKSB1c2VyX3JlZ3MoY3VycmVudC0+dGhyZWFkX2luZm8pCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0YXNrKSB1c2VyX3JlZ3ModGFza190aHJlYWRfaW5mbyh0YXNrKSkKKyNkZWZpbmUgY3VycmVudF9yZWdzKCkgdGFza19wdF9yZWdzKGN1cnJlbnQpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX3RvX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1jcmlzL3RocmVhZF9pbmZvLmgKaW5kZXggY2VmMDE0MC4uN2FkODUzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvdGhyZWFkX2luZm8uaApAQCAtNjksOCArNjksNiBAQAogLyogdGhyZWFkIGluZm9ybWF0aW9uIGFsbG9jYXRpb24gKi8KICNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrKSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsMSkpCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpICh0aSksIDEpCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tZnJ2L3RocmVhZF9pbmZvLmgKaW5kZXggNjBmNmIyYS4uYTU1NzZlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3RocmVhZF9pbmZvLmgKQEAgLTExMCw4ICsxMTAsNiBAQAogI2VuZGlmCiAKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyhpbmZvKQlrZnJlZShpbmZvKQotI2RlZmluZSBnZXRfdGhyZWFkX2luZm8odGkpCWdldF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQotI2RlZmluZSBwdXRfdGhyZWFkX2luZm8odGkpCXB1dF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQogCiAjZWxzZSAvKiAhX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1oODMwMC90aHJlYWRfaW5mby5oCmluZGV4IGJmY2M3NTUuLjQ1ZjA5ZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdGhyZWFkX2luZm8uaApAQCAtNjksOCArNjksNiBAQAogI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spICgoc3RydWN0IHRocmVhZF9pbmZvICopIFwKIAkJCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIDEpKQogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSAodGkpLCAxKQotI2RlZmluZSBnZXRfdGhyZWFkX2luZm8odGkpCWdldF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQotI2RlZmluZSBwdXRfdGhyZWFkX2luZm8odGkpCXB1dF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pMzg3LmggYi9pbmNsdWRlL2FzbS1pMzg2L2kzODcuaAppbmRleCA2NzQ3MDA2Li4xNTJkMGJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2kzODcuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2kzODcuaApAQCAtNDksMTkgKzQ5LDE5IEBACiAJCVg4Nl9GRUFUVVJFX0ZYU1IsCiAJCSJtIiAodHNrLT50aHJlYWQuaTM4Ny5meHNhdmUpCiAJCToibWVtb3J5Iik7Ci0JdHNrLT50aHJlYWRfaW5mby0+c3RhdHVzICY9IH5UU19VU0VERlBVOworCXRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICY9IH5UU19VU0VERlBVOwogfQogCiAjZGVmaW5lIF9fdW5sYXp5X2ZwdSggdHNrICkgZG8geyBcCi0JaWYgKCh0c2spLT50aHJlYWRfaW5mby0+c3RhdHVzICYgVFNfVVNFREZQVSkgXAorCWlmICh0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmIFRTX1VTRURGUFUpIFwKIAkJc2F2ZV9pbml0X2ZwdSggdHNrICk7IFwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgX19jbGVhcl9mcHUoIHRzayApCQkJCQlcCiBkbyB7CQkJCQkJCQlcCi0JaWYgKCh0c2spLT50aHJlYWRfaW5mby0+c3RhdHVzICYgVFNfVVNFREZQVSkgewkJXAorCWlmICh0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmIFRTX1VTRURGUFUpIHsJCVwKIAkJYXNtIHZvbGF0aWxlKCJmbmNsZXggOyBmd2FpdCIpOwkJCQlcCi0JCSh0c2spLT50aHJlYWRfaW5mby0+c3RhdHVzICY9IH5UU19VU0VERlBVOwlcCisJCXRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICY9IH5UU19VU0VERlBVOwlcCiAJCXN0dHMoKTsJCQkJCQlcCiAJfQkJCQkJCQlcCiB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKaW5kZXggMTNlY2Y2Ni4uZmVjYTVkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCkBAIC01NjEsMTAgKzU2MSwyMCBAQAogICAgICAgICh1bnNpZ25lZCBsb25nKSgmX19wdHJbVEhSRUFEX1NJWkVfTE9OR1NdKTsgICAgICAgICAgICAgICAgICAgICBcCiB9KQogCisvKgorICogVGhlIGJlbG93IC04IGlzIHRvIHJlc2VydmUgOCBieXRlcyBvbiB0b3Agb2YgdGhlIHJpbmcwIHN0YWNrLgorICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGVudGlyZSAic3RydWN0IHB0X3JlZ3MiCisgKiBpcyBhY2Nlc3NhYmxlIGV2ZW4gaWYgdGhlIENQVSBoYXZlbid0IHN0b3JlZCB0aGUgU1MvRVNQIHJlZ2lzdGVycworICogb24gdGhlIHN0YWNrIChpbnRlcnJ1cHQgZ2F0ZSBkb2VzIG5vdCBzYXZlIHRoZXNlIHJlZ2lzdGVycworICogd2hlbiBzd2l0Y2hpbmcgdG8gdGhlIHNhbWUgcHJpdiByaW5nKS4KKyAqIFRoZXJlZm9yZSBiZXdhcmU6IGFjY2Vzc2luZyB0aGUgeHNzL2VzcCBmaWVsZHMgb2YgdGhlCisgKiAic3RydWN0IHB0X3JlZ3MiIGlzIHBvc3NpYmxlLCBidXQgdGhleSBtYXkgY29udGFpbiB0aGUKKyAqIGNvbXBsZXRlbHkgd3JvbmcgdmFsdWVzLgorICovCiAjZGVmaW5lIHRhc2tfcHRfcmVncyh0YXNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHN0cnVjdCBwdF9yZWdzICpfX3JlZ3NfXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgX19yZWdzX18gPSAoc3RydWN0IHB0X3JlZ3MgKilLU1RLX1RPUCgodGFzayktPnRocmVhZF9pbmZvKTsgICAgIFwKKyAgICAgICBfX3JlZ3NfXyA9IChzdHJ1Y3QgcHRfcmVncyAqKShLU1RLX1RPUCh0YXNrX3N0YWNrX3BhZ2UodGFzaykpLTgpOyBcCiAgICAgICAgX19yZWdzX18gLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0pCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1pMzg2L3N5c3RlbS5oCmluZGV4IDljMDU5M2IuLjM2YTkyZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zeXN0ZW0uaApAQCAtNTQ4LDYgKzU0OCwxNSBAQAogZXh0ZXJuIGludCBlczcwMDBfcGxhdDsKIHZvaWQgY3B1X2lkbGVfd2FpdCh2b2lkKTsKIAorLyoKKyAqIE9uIFNNUCBzeXN0ZW1zLCB3aGVuIHRoZSBzY2hlZHVsZXIgZG9lcyBtaWdyYXRpb24tY29zdCBhdXRvZGV0ZWN0aW9uLAorICogaXQgbmVlZHMgYSB3YXkgdG8gZmx1c2ggYXMgbXVjaCBvZiB0aGUgQ1BVJ3MgY2FjaGVzIGFzIHBvc3NpYmxlOgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfY2FjaGVmbHVzaCh2b2lkKQoreworCXdiaW52ZCgpOworfQorCiBleHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX2FsaWduX3N0YWNrKHVuc2lnbmVkIGxvbmcgc3ApOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaAppbmRleCA4ZmJmNzkxLi4yNDkzZTc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oCkBAIC0xMTEsOCArMTExLDYgQEAKICNlbmRpZgogCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8oaW5mbykJa2ZyZWUoaW5mbykKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKSBnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKSBwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKIAogI2Vsc2UgLyogIV9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS1pMzg2L3RvcG9sb2d5LmgKaW5kZXggMGVjMjdjOS4uZDdlMTllYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdG9wb2xvZ3kuaApAQCAtNzIsNyArNzIsNiBAQAogCS5tYXhfaW50ZXJ2YWwJCT0gMzIsCQkJXAogCS5idXN5X2ZhY3RvcgkJPSAzMiwJCQlcCiAJLmltYmFsYW5jZV9wY3QJCT0gMTI1LAkJCVwKLQkuY2FjaGVfaG90X3RpbWUJCT0gKDEwKjEwMDAwMDApLAkJXAogCS5jYWNoZV9uaWNlX3RyaWVzCT0gMSwJCQlcCiAJLmJ1c3lfaWR4CQk9IDMsCQkJXAogCS5pZGxlX2lkeAkJPSAxLAkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1pYTY0L2NvbXBhdC5oCmluZGV4IGFhZjExZjQuLmMwYjE5MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaApAQCAtMTkyLDcgKzE5Miw3IEBACiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fdXNlciAqCiBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZSAobG9uZyBsZW4pCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBpYTY0X3Rhc2tfcmVncyhjdXJyZW50KTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKIAlyZXR1cm4gKHZvaWQgX191c2VyICopICgoKHJlZ3MtPnIxMiAmIDB4ZmZmZmZmZmYpICYgLTE2KSAtIGxlbik7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKaW5kZXggYTc0YjY4MS4uOGMwZmMyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKQEAgLTY4LDEwICs2OCwxNCBAQAogCXVuc2lnbmVkIGxvbmcgc3RhdHVzOwogfTsKIAorI2RlZmluZQlNQVhfUEFSQU1fUlNFX1NJWkUJKDB4NjArMHg2MC8weDNmKQogLyogcGVyLWNwdSBrcHJvYmUgY29udHJvbCBibG9jayAqLwogc3RydWN0IGtwcm9iZV9jdGxibGsgewogCXVuc2lnbmVkIGxvbmcga3Byb2JlX3N0YXR1czsKIAlzdHJ1Y3QgcHRfcmVncyBqcHJvYmVfc2F2ZWRfcmVnczsKKwl1bnNpZ25lZCBsb25nIGpwcm9iZXNfc2F2ZWRfc3RhY2tlZF9yZWdzW01BWF9QQVJBTV9SU0VfU0laRV07CisJdW5zaWduZWQgbG9uZyAqYnNwOworCXVuc2lnbmVkIGxvbmcgY2ZtOwogCXN0cnVjdCBwcmV2X2twcm9iZSBwcmV2X2twcm9iZTsKIH07CiAKQEAgLTExOCw1ICsxMjIsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGpwcm9iZV9yZXR1cm4odm9pZCkKIHsKIH0KK2V4dGVybiB2b2lkIGludmFsaWRhdGVfc3RhY2tlZF9yZWdzKHZvaWQpOworZXh0ZXJuIHZvaWQgZmx1c2hfcmVnaXN0ZXJfc3RhY2sodm9pZCk7CiAKICNlbmRpZgkJCQkvKiBfQVNNX0tQUk9CRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcHJvY2Vzc29yLmgKaW5kZXggOTRlMDdlNy4uOGM2NDhiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3Byb2Nlc3Nvci5oCkBAIC0zNTIsNyArMzUyLDcgQEAKIC8qIFJldHVybiBpbnN0cnVjdGlvbiBwb2ludGVyIG9mIGJsb2NrZWQgdGFzayBUU0suICAqLwogI2RlZmluZSBLU1RLX0VJUCh0c2spCQkJCQlcCiAgICh7CQkJCQkJCVwKLQlzdHJ1Y3QgcHRfcmVncyAqX3JlZ3MgPSBpYTY0X3Rhc2tfcmVncyh0c2spOwlcCisJc3RydWN0IHB0X3JlZ3MgKl9yZWdzID0gdGFza19wdF9yZWdzKHRzayk7CVwKIAlfcmVncy0+Y3JfaWlwICsgaWE2NF9wc3IoX3JlZ3MpLT5yaTsJCVwKICAgfSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcHRyYWNlLmgKaW5kZXggMmM3MDNkNi4uOTQ3MWNkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3B0cmFjZS5oCkBAIC0yNDgsNyArMjQ4LDcgQEAKIH0pCiAKICAgLyogZ2l2ZW4gYSBwb2ludGVyIHRvIGEgdGFza19zdHJ1Y3QsIHJldHVybiB0aGUgdXNlcidzIHB0X3JlZ3MgKi8KLSMgZGVmaW5lIGlhNjRfdGFza19yZWdzKHQpCQkoKChzdHJ1Y3QgcHRfcmVncyAqKSAoKGNoYXIgKikgKHQpICsgSUE2NF9TVEtfT0ZGU0VUKSkgLSAxKQorIyBkZWZpbmUgdGFza19wdF9yZWdzKHQpCQkoKChzdHJ1Y3QgcHRfcmVncyAqKSAoKGNoYXIgKikgKHQpICsgSUE2NF9TVEtfT0ZGU0VUKSkgLSAxKQogIyBkZWZpbmUgaWE2NF9wc3IocmVncykJCQkoKHN0cnVjdCBpYTY0X3BzciAqKSAmKHJlZ3MpLT5jcl9pcHNyKQogIyBkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpCQkoKChzdHJ1Y3QgaWE2NF9wc3IgKikgJihyZWdzKS0+Y3JfaXBzciktPmNwbCAhPSAwKQogIyBkZWZpbmUgdXNlcl9zdGFjayh0YXNrLHJlZ3MpCSgobG9uZykgcmVncyAtIChsb25nKSB0YXNrID09IElBNjRfU1RLX09GRlNFVCAtIHNpemVvZigqcmVncykpCkBAIC0yNzEsNyArMjcxLDcgQEAKICAgICoKICAgICogT24gaWE2NCwgd2UgY2FuIGNsZWFyIHRoZSB1c2VyJ3MgcHRfcmVncy0+cjggdG8gZm9yY2UgYSBzdWNjZXNzZnVsIHN5c2NhbGwuCiAgICAqLwotIyBkZWZpbmUgZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpCShpYTY0X3Rhc2tfcmVncyhjdXJyZW50KS0+cjggPSAwKQorIyBkZWZpbmUgZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpCSh0YXNrX3B0X3JlZ3MoY3VycmVudCktPnI4ID0gMCkKIAogICBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CQkJLyogZm9yd2FyZCBkZWNsICovCiAgIHN0cnVjdCB1bndfZnJhbWVfaW5mbzsJCS8qIGZvcndhcmQgZGVjbCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmgKaW5kZXggMmE4YjBkOS4uOGI5ZTEwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX3NhbC5oCkBAIC03NSw3ICs3NSw4IEBACiAjZGVmaW5lICBTTl9TQUxfSU9JRl9HRVRfSFVCREVWX0lORk8JCSAgIDB4MDIwMDAwNTUKICNkZWZpbmUgIFNOX1NBTF9JT0lGX0dFVF9QQ0lCVVNfSU5GTwkJICAgMHgwMjAwMDA1NgogI2RlZmluZSAgU05fU0FMX0lPSUZfR0VUX1BDSURFVl9JTkZPCQkgICAweDAyMDAwMDU3Ci0jZGVmaW5lICBTTl9TQUxfSU9JRl9HRVRfV0lER0VUX0RNQUZMVVNIX0xJU1QJICAgMHgwMjAwMDA1OAorI2RlZmluZSAgU05fU0FMX0lPSUZfR0VUX1dJREdFVF9ETUFGTFVTSF9MSVNUCSAgIDB4MDIwMDAwNTgJLy8gZGVwcmVjYXRlZAorI2RlZmluZSAgU05fU0FMX0lPSUZfR0VUX0RFVklDRV9ETUFGTFVTSF9MSVNUCSAgIDB4MDIwMDAwNWEKIAogI2RlZmluZSBTTl9TQUxfSFVCX0VSUk9SX0lOVEVSUlVQVAkJICAgMHgwMjAwMDA2MAogI2RlZmluZSBTTl9TQUxfQlRFX1JFQ09WRVIJCQkgICAweDAyMDAwMDYxCkBAIC0xMTAwLDcgKzExMDEsNyBAQAogCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcnY7CiAKIAlydi5zdGF0dXMgPSAwOwotCVNBTF9DQUxMX05PTE9DSyhydiwgU05fU0FMX0JURV9SRUNPVkVSLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKwlTQUxfQ0FMTF9OT0xPQ0socnYsIFNOX1NBTF9CVEVfUkVDT1ZFUiwgKHU2NCluYXNpZCwgMCwgMCwgMCwgMCwgMCwgMCk7CiAJaWYgKHJ2LnN0YXR1cyA9PSBTQUxSRVRfTk9UX0lNUExFTUVOVEVEKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gKGludCkgcnYuc3RhdHVzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi94cC5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi94cC5oCmluZGV4IDQ5ZmFmOGYuLjIwMzk0NWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24veHAuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3hwLmgKQEAgLTIyNyw3ICsyMjcsOSBAQAogCiAJeHBjT3BlbkNsb3NlRXJyb3IsCS8qIDUwOiBjaGFubmVsIG9wZW4vY2xvc2UgcHJvdG9jb2wgZXJyb3IgKi8KIAotCXhwY1Vua25vd25SZWFzb24JLyogNTE6IHVua25vd24gcmVhc29uIC0tIG11c3QgYmUgbGFzdCBpbiBsaXN0ICovCisJeHBjRGlzY29ubmVjdGVkLAkvKiA1MTogY2hhbm5lbCBkaXNjb25uZWN0ZWQgKGNsb3NlZCkgKi8KKworCXhwY1Vua25vd25SZWFzb24JLyogNTI6IHVua25vd24gcmVhc29uIC0tIG11c3QgYmUgbGFzdCBpbiBsaXN0ICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3hwYy5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGFyY2gvaWE2NC9zbi9rZXJuZWwveHBjLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLWlhNjQvc24veHBjLmgKaW5kZXggNTQ4M2E5Zi4uODdlOWNkNTggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi94cGMuaApAQCAtMyw3ICszLDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKi8KIAogCkBAIC0xMSw4ICsxMSw4IEBACiAgKiBDcm9zcyBQYXJ0aXRpb24gQ29tbXVuaWNhdGlvbiAoWFBDKSBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MuCiAgKi8KIAotI2lmbmRlZiBfSUE2NF9TTl9LRVJORUxfWFBDX0gKLSNkZWZpbmUgX0lBNjRfU05fS0VSTkVMX1hQQ19ICisjaWZuZGVmIF9BU01fSUE2NF9TTl9YUENfSAorI2RlZmluZSBfQVNNX0lBNjRfU05fWFBDX0gKIAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC02NjMsNiArNjYzLDcgQEAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlICp4cGNfcGFydDsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlICp4cGNfY2hhbjsKIGV4dGVybiBpbnQgeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVsaW1pdDsKK2V4dGVybiBpbnQgeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVkb3V0OwogZXh0ZXJuIGlycXJldHVybl90IHhwY19ub3RpZnlfSVJRX2hhbmRsZXIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwogZXh0ZXJuIHZvaWQgeHBjX2Ryb3BwZWRfSVBJX2NoZWNrKHN0cnVjdCB4cGNfcGFydGl0aW9uICopOwogZXh0ZXJuIHZvaWQgeHBjX2FjdGl2YXRlX3BhcnRpdGlvbihzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqKTsKQEAgLTcwNyw3ICs3MDgsNyBAQAogZXh0ZXJuIHZvaWQgeHBjX2RlbGl2ZXJfbXNnKHN0cnVjdCB4cGNfY2hhbm5lbCAqKTsKIGV4dGVybiB2b2lkIHhwY19kaXNjb25uZWN0X2NoYW5uZWwoY29uc3QgaW50LCBzdHJ1Y3QgeHBjX2NoYW5uZWwgKiwKIAkJCQkJZW51bSB4cGNfcmV0dmFsLCB1bnNpZ25lZCBsb25nICopOwotZXh0ZXJuIHZvaWQgeHBjX2Rpc2Nvbm5lY3RpbmdfY2FsbG91dChzdHJ1Y3QgeHBjX2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCB4cGNfZGlzY29ubmVjdF9jYWxsb3V0KHN0cnVjdCB4cGNfY2hhbm5lbCAqLCBlbnVtIHhwY19yZXR2YWwpOwogZXh0ZXJuIHZvaWQgeHBjX3BhcnRpdGlvbl9nb2luZ19kb3duKHN0cnVjdCB4cGNfcGFydGl0aW9uICosIGVudW0geHBjX3JldHZhbCk7CiBleHRlcm4gdm9pZCB4cGNfdGVhcmRvd25faW5mcmFzdHJ1Y3R1cmUoc3RydWN0IHhwY19wYXJ0aXRpb24gKik7CiAKQEAgLTEyNjksNSArMTI3MCw1IEBACiB9CiAKIAotI2VuZGlmIC8qIF9JQTY0X1NOX0tFUk5FTF9YUENfSCAqLworI2VuZGlmIC8qIF9BU01fSUE2NF9TTl9YUENfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3N5c3RlbS5oIGIvaW5jbHVkZS9hc20taWE2NC9zeXN0ZW0uaAppbmRleCA2MzUyMzVmLi44MGM1YTIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc3lzdGVtLmgKQEAgLTIxOSwxNCArMjE5LDE0IEBACiAKICNkZWZpbmUgSUE2NF9IQVNfRVhUUkFfU1RBVEUodCkJCQkJCQkJXAogCSgodCktPnRocmVhZC5mbGFncyAmIChJQTY0X1RIUkVBRF9EQkdfVkFMSUR8SUE2NF9USFJFQURfUE1fVkFMSUQpCVwKLQkgfHwgSVNfSUEzMl9QUk9DRVNTKGlhNjRfdGFza19yZWdzKHQpKSB8fCBQRVJGTU9OX0lTX1NZU1dJREUoKSkKKwkgfHwgSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyh0KSkgfHwgUEVSRk1PTl9JU19TWVNXSURFKCkpCiAKICNkZWZpbmUgX19zd2l0Y2hfdG8ocHJldixuZXh0LGxhc3QpIGRvIHsJCQkJCQkJIFwKIAlpZiAoSUE2NF9IQVNfRVhUUkFfU1RBVEUocHJldikpCQkJCQkJCQkgXAogCQlpYTY0X3NhdmVfZXh0cmEocHJldik7CQkJCQkJCQkgXAogCWlmIChJQTY0X0hBU19FWFRSQV9TVEFURShuZXh0KSkJCQkJCQkJCSBcCiAJCWlhNjRfbG9hZF9leHRyYShuZXh0KTsJCQkJCQkJCSBcCi0JaWE2NF9wc3IoaWE2NF90YXNrX3JlZ3MobmV4dCkpLT5kZmggPSAhaWE2NF9pc19sb2NhbF9mcHVfb3duZXIobmV4dCk7CQkJIFwKKwlpYTY0X3Bzcih0YXNrX3B0X3JlZ3MobmV4dCkpLT5kZmggPSAhaWE2NF9pc19sb2NhbF9mcHVfb3duZXIobmV4dCk7CQkJIFwKIAkobGFzdCkgPSBpYTY0X3N3aXRjaF90bygobmV4dCkpOwkJCQkJCQkgXAogfSB3aGlsZSAoMCkKIApAQCAtMjM4LDggKzIzOCw4IEBACiAgKiB0aGUgbGF0ZXN0IGZwaCBzdGF0ZSBmcm9tIGFub3RoZXIgQ1BVLiAgSW4gb3RoZXIgd29yZHM6IGVhZ2VyIHNhdmUsIGxhenkgcmVzdG9yZS4KICAqLwogIyBkZWZpbmUgc3dpdGNoX3RvKHByZXYsbmV4dCxsYXN0KSBkbyB7CQkJCQkJXAotCWlmIChpYTY0X3BzcihpYTY0X3Rhc2tfcmVncyhwcmV2KSktPm1maCAmJiBpYTY0X2lzX2xvY2FsX2ZwdV9vd25lcihwcmV2KSkgewkJCQlcCi0JCWlhNjRfcHNyKGlhNjRfdGFza19yZWdzKHByZXYpKS0+bWZoID0gMDsJCQlcCisJaWYgKGlhNjRfcHNyKHRhc2tfcHRfcmVncyhwcmV2KSktPm1maCAmJiBpYTY0X2lzX2xvY2FsX2ZwdV9vd25lcihwcmV2KSkgewkJCQlcCisJCWlhNjRfcHNyKHRhc2tfcHRfcmVncyhwcmV2KSktPm1maCA9IDA7CQkJXAogCQkocHJldiktPnRocmVhZC5mbGFncyB8PSBJQTY0X1RIUkVBRF9GUEhfVkFMSUQ7CQkJXAogCQlfX2lhNjRfc2F2ZV9mcHUoKHByZXYpLT50aHJlYWQuZnBoKTsJCQkJXAogCX0JCQkJCQkJCQlcCkBAIC0yNzksNiArMjc5LDcgQEAKICNkZWZpbmUgaWE2NF9wbGF0Zm9ybV9pcyh4KSAoc3RyY21wKHgsIHBsYXRmb3JtX25hbWUpID09IDApCiAKIHZvaWQgY3B1X2lkbGVfd2FpdCh2b2lkKTsKK3ZvaWQgc2NoZWRfY2FjaGVmbHVzaCh2b2lkKTsKIAogI2RlZmluZSBhcmNoX2FsaWduX3N0YWNrKHgpICh4KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1pYTY0L3RocmVhZF9pbmZvLmgKaW5kZXggMTcxYjIyMC4uMWQ2NTE4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdGhyZWFkX2luZm8uaApAQCAtNTcsMTEgKzU3LDIwIEBACiAvKiBob3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQyAqLwogI2RlZmluZSBjdXJyZW50X3RocmVhZF9pbmZvKCkJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgKChjaGFyICopIGN1cnJlbnQgKyBJQTY0X1RBU0tfU0laRSkpCiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgKChjaGFyICopICh0c2spICsgSUE2NF9UQVNLX1NJWkUpKQorI2RlZmluZSB0YXNrX3RocmVhZF9pbmZvKHRzaykJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgKChjaGFyICopICh0c2spICsgSUE2NF9UQVNLX1NJWkUpKQogI2Vsc2UKICNkZWZpbmUgY3VycmVudF90aHJlYWRfaW5mbygpCSgoc3RydWN0IHRocmVhZF9pbmZvICopIDApCiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgMCkKKyNkZWZpbmUgdGFza190aHJlYWRfaW5mbyh0c2spCSgoc3RydWN0IHRocmVhZF9pbmZvICopIDApCiAjZW5kaWYKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkJLyogbm90aGluZyAqLworI2RlZmluZSB0YXNrX3N0YWNrX3BhZ2UodHNrKQkoKHZvaWQgKikodHNrKSkKKworI2RlZmluZSBfX0hBVkVfVEhSRUFEX0ZVTkNUSU9OUworI2RlZmluZSBzZXR1cF90aHJlYWRfc3RhY2socCwgb3JnKSBcCisJKnRhc2tfdGhyZWFkX2luZm8ocCkgPSAqdGFza190aHJlYWRfaW5mbyhvcmcpOyBcCisJdGFza190aHJlYWRfaW5mbyhwKS0+dGFzayA9IChwKTsKKyNkZWZpbmUgZW5kX29mX3N0YWNrKHApICh1bnNpZ25lZCBsb25nICopKCh2b2lkICopKHApICsgSUE2NF9SQlNfT0ZGU0VUKQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1RBU0tfU1RSVUNUX0FMTE9DQVRPUgogI2RlZmluZSBhbGxvY190YXNrX3N0cnVjdCgpCSgodGFza190ICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBLRVJORUxfU1RBQ0tfU0laRV9PUkRFUikpCkBAIC04NCw2ICs5Myw3IEBACiAjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNgkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcgVElGX05FRURfUkVTQ0hFRCAqLwogI2RlZmluZSBUSUZfTUVNRElFCQkxNwogI2RlZmluZSBUSUZfTUNBX0lOSVQJCTE4CS8qIHRoaXMgdGFzayBpcyBwcm9jZXNzaW5nIE1DQSBvciBJTklUICovCisjZGVmaW5lIFRJRl9EQl9ESVNBQkxFRAkJMTkJLyogZGVidWcgdHJhcCBkaXNhYmxlZCBmb3IgZnN5c2NhbGwgKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDEgPDwgVElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMSA8PCBUSUZfU1lTQ0FMTF9BVURJVCkKQEAgLTkxLDkgKzEwMSwxMCBAQAogI2RlZmluZSBfVElGX05PVElGWV9SRVNVTUUJKDEgPDwgVElGX05PVElGWV9SRVNVTUUpCiAjZGVmaW5lIF9USUZfU0lHUEVORElORwkJKDEgPDwgVElGX1NJR1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxIDw8IFRJRl9ORUVEX1JFU0NIRUQpCi0jZGVmaW5lIF9USUZfU0lHREVMQVlFRAkoMSA8PCBUSUZfU0lHREVMQVlFRCkKKyNkZWZpbmUgX1RJRl9TSUdERUxBWUVECQkoMSA8PCBUSUZfU0lHREVMQVlFRCkKICNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMSA8PCBUSUZfUE9MTElOR19OUkZMQUcpCiAjZGVmaW5lIF9USUZfTUNBX0lOSVQJCSgxIDw8IFRJRl9NQ0FfSU5JVCkKKyNkZWZpbmUgX1RJRl9EQl9ESVNBQkxFRAkoMSA8PCBUSUZfREJfRElTQUJMRUQpCiAKIC8qICJ3b3JrIHRvIGRvIG9uIHVzZXItcmV0dXJuIiBiaXRzICovCiAjZGVmaW5lIFRJRl9BTExXT1JLX01BU0sJKF9USUZfTk9USUZZX1JFU1VNRXxfVElGX1NJR1BFTkRJTkd8X1RJRl9ORUVEX1JFU0NIRUR8X1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU1lTQ0FMTF9BVURJVHxfVElGX1NJR0RFTEFZRUQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS1pYTY0L3RvcG9sb2d5LmgKaW5kZXggZjdjMzMwNC4uZDhhYWU0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdG9wb2xvZ3kuaApAQCAtNTUsNyArNTUsNiBAQAogCS5tYXhfaW50ZXJ2YWwJCT0gNCwJCQlcCiAJLmJ1c3lfZmFjdG9yCQk9IDY0LAkJCVwKIAkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAotCS5jYWNoZV9ob3RfdGltZQkJPSAoMTAqMTAwMDAwMCksCQlcCiAJLnBlcl9jcHVfZ2FpbgkJPSAxMDAsCQkJXAogCS5jYWNoZV9uaWNlX3RyaWVzCT0gMiwJCQlcCiAJLmJ1c3lfaWR4CQk9IDIsCQkJXApAQCAtODEsNyArODAsNiBAQAogCS5tYXhfaW50ZXJ2YWwJCT0gOCoobWluKG51bV9vbmxpbmVfY3B1cygpLCAzMikpLCBcCiAJLmJ1c3lfZmFjdG9yCQk9IDY0LAkJCVwKIAkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAotCS5jYWNoZV9ob3RfdGltZQkJPSAoMTAqMTAwMDAwMCksCQlcCiAJLmNhY2hlX25pY2VfdHJpZXMJPSAyLAkJCVwKIAkuYnVzeV9pZHgJCT0gMywJCQlcCiAJLmlkbGVfaWR4CQk9IDIsCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLW0zMnIvcHRyYWNlLmgKaW5kZXggNTVjZDdlYy4uMGQwNThiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3B0cmFjZS5oCkBAIC0xNjMsNiArMTYzLDkgQEAKIAogZXh0ZXJuIHZvaWQgd2l0aGRyYXdfZGVidWdfdHJhcChzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKKyNkZWZpbmUgdGFza19wdF9yZWdzKHRhc2spIFwKKyAgICAgICAgKChzdHJ1Y3QgcHRfcmVncyAqKSh0YXNrX3N0YWNrX3BhZ2UodGFzaykgKyBUSFJFQURfU0laRSkgLSAxKQorCiAjZW5kaWYgLyogX19LRVJORUwgKi8KIAogI2VuZGlmIC8qIF9BU01fTTMyUl9QVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLW0zMnIvc3lzdGVtLmgKaW5kZXggZGNmNjE5YS4uMDZjMTJhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3N5c3RlbS5oCkBAIC02OCw2ICs2OCwxNiBAQAogCWxhc3QgPSBfX2xhc3Q7IFwKIH0gd2hpbGUoMCkKIAorLyoKKyAqIE9uIFNNUCBzeXN0ZW1zLCB3aGVuIHRoZSBzY2hlZHVsZXIgZG9lcyBtaWdyYXRpb24tY29zdCBhdXRvZGV0ZWN0aW9uLAorICogaXQgbmVlZHMgYSB3YXkgdG8gZmx1c2ggYXMgbXVjaCBvZiB0aGUgQ1BVJ3MgY2FjaGVzIGFzIHBvc3NpYmxlLgorICoKKyAqIFRPRE86IGZpbGwgdGhpcyBpbiEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2NhY2hlZmx1c2godm9pZCkKK3sKK30KKwogLyogSW50ZXJydXB0IENvbnRyb2wgKi8KICNpZiAhZGVmaW5lZChDT05GSUdfQ0hJUF9NMzIxMDIpICYmICFkZWZpbmVkKENPTkZJR19DSElQX00zMjEwNCkKICNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZSgpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLW0zMnIvdGhyZWFkX2luZm8uaAppbmRleCAwZjU4OTM2Li4yMmFmZjMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci90aHJlYWRfaW5mby5oCkBAIC0xMTAsOCArMTEwLDYgQEAKICNlbmRpZgogCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8oaW5mbykga2ZyZWUoaW5mbykKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKSBnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKSBwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKIAogI2RlZmluZSBUSV9GTEFHX0ZBVUxUX0NPREVfU0hJRlQJMjgKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hbWlnYWh3LmggYi9pbmNsdWRlL2FzbS1tNjhrL2FtaWdhaHcuaAppbmRleCAzYWU1ZDhkLi5hMTZmZTRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2FtaWdhaHcuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2FtaWdhaHcuaApAQCAtMjc0LDcgKzI3NCw3IEBACiAjZGVmaW5lIFpUV09fVkFERFIoeCkgKCgodW5zaWduZWQgbG9uZykoeCkpK3pUd29CYXNlKQogCiAjZGVmaW5lIENVU1RPTV9QSFlTQUREUiAgICAgKDB4ZGZmMDAwKQotI2RlZmluZSBjdXN0b20gKCgqKHZvbGF0aWxlIHN0cnVjdCBDVVNUT00gKikoelR3b0Jhc2UrQ1VTVE9NX1BIWVNBRERSKSkpCisjZGVmaW5lIGFtaWdhX2N1c3RvbSAoKCoodm9sYXRpbGUgc3RydWN0IENVU1RPTSAqKSh6VHdvQmFzZStDVVNUT01fUEhZU0FERFIpKSkKIAogI2RlZmluZSBDSUFBX1BIWVNBRERSCSAgKDB4YmZlMDAxKQogI2RlZmluZSBDSUFCX1BIWVNBRERSCSAgKDB4YmZkMDAwKQpAQCAtMjk0LDEyICsyOTQsMTIgQEAKIHsKIAlpZiAoYW1pZ2FfY2hpcHNldCA9PSBDU19FQ1MgfHwgYW1pZ2FfY2hpcHNldCA9PSBDU19BR0EpIHsKIAkJLyogcHJvZ3JhbSBEZW5pc2UvTGlzYSBmb3IgYSBoaWdoZXIgbWF4aW11bSBwbGF5IHJhdGUgKi8KLQkJY3VzdG9tLmh0b3RhbCA9IDExMzsgICAgICAgIC8qIDMxIGtIeiAqLwotCQljdXN0b20udnRvdGFsID0gMjIzOyAgICAgICAgLyogNzAgSHogKi8KLQkJY3VzdG9tLmJlYW1jb24wID0gMHg0MzkwOyAgIC8qIEhBUkRESVMsIFZBUntCRUFNLFZTWSxIU1ksQ1NZfUVOICovCisJCWFtaWdhX2N1c3RvbS5odG90YWwgPSAxMTM7ICAgICAgICAvKiAzMSBrSHogKi8KKwkJYW1pZ2FfY3VzdG9tLnZ0b3RhbCA9IDIyMzsgICAgICAgIC8qIDcwIEh6ICovCisJCWFtaWdhX2N1c3RvbS5iZWFtY29uMCA9IDB4NDM5MDsgICAvKiBIQVJERElTLCBWQVJ7QkVBTSxWU1ksSFNZLENTWX1FTiAqLwogCQkvKiBzdXNwZW5kIHRoZSBtb25pdG9yICovCi0JCWN1c3RvbS5oc3N0cnQgPSBjdXN0b20uaHNzdG9wID0gMTE2OwotCQljdXN0b20udnNzdHJ0ID0gY3VzdG9tLnZzc3RvcCA9IDIyNjsKKwkJYW1pZ2FfY3VzdG9tLmhzc3RydCA9IGFtaWdhX2N1c3RvbS5oc3N0b3AgPSAxMTY7CisJCWFtaWdhX2N1c3RvbS52c3N0cnQgPSBhbWlnYV9jdXN0b20udnNzdG9wID0gMjI2OwogCQlhbWlnYV9hdWRpb19taW5fcGVyaW9kID0gNTc7CiAJfQogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hbWlnYWludHMuaCBiL2luY2x1ZGUvYXNtLW02OGsvYW1pZ2FpbnRzLmgKaW5kZXggMmFmZjRjZi4uYWE5NjhkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hbWlnYWludHMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2FtaWdhaW50cy5oCkBAIC0xMDksOCArMTA5LDYgQEAKIGV4dGVybiB2b2lkIGFtaWdhX2RvX2lycShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwogZXh0ZXJuIHZvaWQgYW1pZ2FfZG9faXJxX2xpc3QoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKIAotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGFtaWdhX2ludGVuYV92YWxzW107Ci0KIC8qIENJQSBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciBiaXRzICovCiAKICNkZWZpbmUgQ0lBX0lDUl9UQQkweDAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1tNjhrL2NoZWNrc3VtLmgKaW5kZXggNzg4NjBjMi4uMTcyODBlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvY2hlY2tzdW0uaApAQCAtMjUsNyArMjUsNyBAQAogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwogCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCitleHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLAogCQkJCQkJdW5zaWduZWQgY2hhciAqZHN0LAogCQkJCQkJaW50IGxlbiwgaW50IHN1bSwKIAkJCQkJCWludCAqY3N1bV9lcnIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9kc3A1NmsuaCBiL2luY2x1ZGUvYXNtLW02OGsvZHNwNTZrLmgKaW5kZXggYWIzZGQzMy4uMmQ4YzBjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9kc3A1NmsuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2RzcDU2ay5oCkBAIC0xMyw3ICsxMyw3IEBACiAvKiBVc2VkIGZvciB1cGxvYWRpbmcgRFNQIGJpbmFyeSBjb2RlICovCiBzdHJ1Y3QgZHNwNTZrX3VwbG9hZCB7CiAJaW50IGxlbjsKLQljaGFyICpiaW47CisJY2hhciBfX3VzZXIgKmJpbjsKIH07CiAKIC8qIEZvciB0aGUgRFNQIGhvc3QgZmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1tNjhrL2Zsb3BweS5oCmluZGV4IGM2ZTcwOGQuLjYzYTA1ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9mbG9wcHkuaApAQCAtNDYsNyArNDYsNyBAQAogCiBzdGF0aWMgaW50IHZpcnR1YWxfZG1hX2NvdW50PTA7CiBzdGF0aWMgaW50IHZpcnR1YWxfZG1hX3Jlc2lkdWU9MDsKLXN0YXRpYyBjaGFyICp2aXJ0dWFsX2RtYV9hZGRyPTA7CitzdGF0aWMgY2hhciAqdmlydHVhbF9kbWFfYWRkcj1OVUxMOwogc3RhdGljIGludCB2aXJ0dWFsX2RtYV9tb2RlPTA7CiBzdGF0aWMgaW50IGRvaW5nX3BkbWE9MDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9oYXJkaXJxLmggYi9pbmNsdWRlL2FzbS1tNjhrL2hhcmRpcnEuaAppbmRleCA3MjgzMThiLi41ZTFjNTgyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9oYXJkaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9oYXJkaXJxLmgKQEAgLTE0LDEzICsxNCw0IEBACiAKICNkZWZpbmUgSEFSRElSUV9CSVRTCTgKIAotLyoKLSAqIFRoZSBoYXJkaXJxIG1hc2sgaGFzIHRvIGJlIGxhcmdlIGVub3VnaCB0byBoYXZlCi0gKiBzcGFjZSBmb3IgcG90ZW50aWFsbHkgYWxsIElSUSBzb3VyY2VzIGluIHRoZSBzeXN0ZW0KLSAqIG5lc3Rpbmcgb24gYSBzaW5nbGUgQ1BVOgotICovCi0jaWYgKDEgPDwgSEFSRElSUV9CSVRTKSA8IE5SX0lSUVMKLSMgZXJyb3IgSEFSRElSUV9CSVRTIGlzIHRvbyBsb3chCi0jZW5kaWYKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2lvLmggYi9pbmNsdWRlL2FzbS1tNjhrL2lvLmgKaW5kZXggNmJiOGIwZC4uZGNmYWEzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9pby5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvaW8uaApAQCAtMjQsNiArMjQsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL3Jhd19pby5oPgogI2luY2x1ZGUgPGFzbS92aXJ0Y29udmVydC5oPgogCkBAIC0xMjAsNjggKzEyMSw2OCBAQAogICogYmUgY29tcGlsZWQgaW4gc28gdGhlIGNhc2Ugc3RhdGVtZW50IHdpbGwgYmUgb3B0aW1pc2VkIGF3YXkKICAqLwogCi1zdGF0aWMgaW5saW5lIHU4ICppc2FfaXRiKHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyBpbmxpbmUgdTggX19pb21lbSAqaXNhX2l0Yih1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAgIHN3aXRjaChJU0FfVFlQRSkKICAgICB7CiAjaWZkZWYgQ09ORklHX1E0MAotICAgIGNhc2UgUTQwX0lTQTogcmV0dXJuICh1OCAqKVE0MF9JU0FfSU9fQihhZGRyKTsKKyAgICBjYXNlIFE0MF9JU0E6IHJldHVybiAodTggX19pb21lbSAqKVE0MF9JU0FfSU9fQihhZGRyKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19HRzIKLSAgICBjYXNlIEdHMl9JU0E6IHJldHVybiAodTggKilHRzJfSVNBX0lPX0IoYWRkcik7CisgICAgY2FzZSBHRzJfSVNBOiByZXR1cm4gKHU4IF9faW9tZW0gKilHRzJfSVNBX0lPX0IoYWRkcik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQU1JR0FfUENNQ0lBCi0gICAgY2FzZSBBR19JU0E6IHJldHVybiAodTggKilBR19JU0FfSU9fQihhZGRyKTsKKyAgICBjYXNlIEFHX0lTQTogcmV0dXJuICh1OCBfX2lvbWVtICopQUdfSVNBX0lPX0IoYWRkcik7CiAjZW5kaWYKLSAgICBkZWZhdWx0OiByZXR1cm4gMDsgLyogYXZvaWQgd2FybmluZ3MsIGp1c3QgaW4gY2FzZSAqLworICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBhdm9pZCB3YXJuaW5ncywganVzdCBpbiBjYXNlICovCiAgICAgfQogfQotc3RhdGljIGlubGluZSB1MTYgKmlzYV9pdHcodW5zaWduZWQgbG9uZyBhZGRyKQorc3RhdGljIGlubGluZSB1MTYgX19pb21lbSAqaXNhX2l0dyh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAgIHN3aXRjaChJU0FfVFlQRSkKICAgICB7CiAjaWZkZWYgQ09ORklHX1E0MAotICAgIGNhc2UgUTQwX0lTQTogcmV0dXJuICh1MTYgKilRNDBfSVNBX0lPX1coYWRkcik7CisgICAgY2FzZSBRNDBfSVNBOiByZXR1cm4gKHUxNiBfX2lvbWVtICopUTQwX0lTQV9JT19XKGFkZHIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0dHMgotICAgIGNhc2UgR0cyX0lTQTogcmV0dXJuICh1MTYgKilHRzJfSVNBX0lPX1coYWRkcik7CisgICAgY2FzZSBHRzJfSVNBOiByZXR1cm4gKHUxNiBfX2lvbWVtICopR0cyX0lTQV9JT19XKGFkZHIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FNSUdBX1BDTUNJQQotICAgIGNhc2UgQUdfSVNBOiByZXR1cm4gKHUxNiAqKUFHX0lTQV9JT19XKGFkZHIpOworICAgIGNhc2UgQUdfSVNBOiByZXR1cm4gKHUxNiBfX2lvbWVtICopQUdfSVNBX0lPX1coYWRkcik7CiAjZW5kaWYKLSAgICBkZWZhdWx0OiByZXR1cm4gMDsgLyogYXZvaWQgd2FybmluZ3MsIGp1c3QgaW4gY2FzZSAqLworICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBhdm9pZCB3YXJuaW5ncywganVzdCBpbiBjYXNlICovCiAgICAgfQogfQotc3RhdGljIGlubGluZSB1OCAqaXNhX210Yih1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgaW5saW5lIHU4IF9faW9tZW0gKmlzYV9tdGIodW5zaWduZWQgbG9uZyBhZGRyKQogewogICBzd2l0Y2goSVNBX1RZUEUpCiAgICAgewogI2lmZGVmIENPTkZJR19RNDAKLSAgICBjYXNlIFE0MF9JU0E6IHJldHVybiAodTggKilRNDBfSVNBX01FTV9CKGFkZHIpOworICAgIGNhc2UgUTQwX0lTQTogcmV0dXJuICh1OCBfX2lvbWVtICopUTQwX0lTQV9NRU1fQihhZGRyKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19HRzIKLSAgICBjYXNlIEdHMl9JU0E6IHJldHVybiAodTggKilHRzJfSVNBX01FTV9CKGFkZHIpOworICAgIGNhc2UgR0cyX0lTQTogcmV0dXJuICh1OCBfX2lvbWVtICopR0cyX0lTQV9NRU1fQihhZGRyKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19BTUlHQV9QQ01DSUEKLSAgICBjYXNlIEFHX0lTQTogcmV0dXJuICh1OCAqKWFkZHI7CisgICAgY2FzZSBBR19JU0E6IHJldHVybiAodTggX19pb21lbSAqKWFkZHI7CiAjZW5kaWYKLSAgICBkZWZhdWx0OiByZXR1cm4gMDsgLyogYXZvaWQgd2FybmluZ3MsIGp1c3QgaW4gY2FzZSAqLworICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBhdm9pZCB3YXJuaW5ncywganVzdCBpbiBjYXNlICovCiAgICAgfQogfQotc3RhdGljIGlubGluZSB1MTYgKmlzYV9tdHcodW5zaWduZWQgbG9uZyBhZGRyKQorc3RhdGljIGlubGluZSB1MTYgX19pb21lbSAqaXNhX210dyh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAgIHN3aXRjaChJU0FfVFlQRSkKICAgICB7CiAjaWZkZWYgQ09ORklHX1E0MAotICAgIGNhc2UgUTQwX0lTQTogcmV0dXJuICh1MTYgKilRNDBfSVNBX01FTV9XKGFkZHIpOworICAgIGNhc2UgUTQwX0lTQTogcmV0dXJuICh1MTYgX19pb21lbSAqKVE0MF9JU0FfTUVNX1coYWRkcik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfR0cyCi0gICAgY2FzZSBHRzJfSVNBOiByZXR1cm4gKHUxNiAqKUdHMl9JU0FfTUVNX1coYWRkcik7CisgICAgY2FzZSBHRzJfSVNBOiByZXR1cm4gKHUxNiBfX2lvbWVtICopR0cyX0lTQV9NRU1fVyhhZGRyKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19BTUlHQV9QQ01DSUEKLSAgICBjYXNlIEFHX0lTQTogcmV0dXJuICh1MTYgKilhZGRyOworICAgIGNhc2UgQUdfSVNBOiByZXR1cm4gKHUxNiBfX2lvbWVtICopYWRkcjsKICNlbmRpZgotICAgIGRlZmF1bHQ6IHJldHVybiAwOyAvKiBhdm9pZCB3YXJuaW5ncywganVzdCBpbiBjYXNlICovCisgICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7IC8qIGF2b2lkIHdhcm5pbmdzLCBqdXN0IGluIGNhc2UgKi8KICAgICB9CiB9CiAKQEAgLTMyNiwyMCArMzI3LDIwIEBACiAKICNkZWZpbmUgbW1pb3diKCkKIAotc3RhdGljIGlubGluZSB2b2lkICppb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICppb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZXR1cm4gX19pb3JlbWFwKHBoeXNhZGRyLCBzaXplLCBJT01BUF9OT0NBQ0hFX1NFUik7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgKmlvcmVtYXBfbm9jYWNoZSh1bnNpZ25lZCBsb25nIHBoeXNhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaW9yZW1hcF9ub2NhY2hlKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZXR1cm4gX19pb3JlbWFwKHBoeXNhZGRyLCBzaXplLCBJT01BUF9OT0NBQ0hFX1NFUik7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgKmlvcmVtYXBfd3JpdGV0aHJvdWdoKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaW9yZW1hcF93cml0ZXRocm91Z2godW5zaWduZWQgbG9uZyBwaHlzYWRkciwKIAkJCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZXR1cm4gX19pb3JlbWFwKHBoeXNhZGRyLCBzaXplLCBJT01BUF9XUklURVRIUk9VR0gpOwogfQotc3RhdGljIGlubGluZSB2b2lkICppb3JlbWFwX2Z1bGxjYWNoZSh1bnNpZ25lZCBsb25nIHBoeXNhZGRyLAorc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmlvcmVtYXBfZnVsbGNhY2hlKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJldHVybiBfX2lvcmVtYXAocGh5c2FkZHIsIHNpemUsIElPTUFQX0ZVTExfQ0FDSElORyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2lycS5oIGIvaW5jbHVkZS9hc20tbTY4ay9pcnEuaAppbmRleCAxMjdhZDE5Li4zMjVjODZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvaXJxLmgKQEAgLTIzLDYgKzIzLDE1IEBACiAjZW5kaWYKIAogLyoKKyAqIFRoZSBoYXJkaXJxIG1hc2sgaGFzIHRvIGJlIGxhcmdlIGVub3VnaCB0byBoYXZlCisgKiBzcGFjZSBmb3IgcG90ZW50aWFsbHkgYWxsIElSUSBzb3VyY2VzIGluIHRoZSBzeXN0ZW0KKyAqIG5lc3Rpbmcgb24gYSBzaW5nbGUgQ1BVOgorICovCisjaWYgKDEgPDwgSEFSRElSUV9CSVRTKSA8IE5SX0lSUVMKKyMgZXJyb3IgSEFSRElSUV9CSVRTIGlzIHRvbyBsb3chCisjZW5kaWYKKworLyoKICAqIEludGVycnVwdCBzb3VyY2UgZGVmaW5pdGlvbnMKICAqIEdlbmVyYWwgaW50ZXJydXB0IHNvdXJjZXMgYXJlIHRoZSBsZXZlbCAxLTcuCiAgKiBBZGRpbmcgYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3Igb25lIG9mIHRoZXNlIHNvdXJjZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvbWFjaGRlcC5oIGIvaW5jbHVkZS9hc20tbTY4ay9tYWNoZGVwLmgKaW5kZXggYTBkZDVjNC4uN2QzZmVlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9tYWNoZGVwLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9tYWNoZGVwLmgKQEAgLTM0LDcgKzM0LDYgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nICgqbWFjaF9oZF9pbml0KSAodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCAoKm1hY2hfaGRfc2V0dXApKGNoYXIgKiwgaW50ICopOwogZXh0ZXJuIGxvbmcgbWFjaF9tYXhfZG1hX2FkZHJlc3M7Ci1leHRlcm4gdm9pZCAoKm1hY2hfZmxvcHB5X3NldHVwKShjaGFyICosIGludCAqKTsKIGV4dGVybiB2b2lkICgqbWFjaF9oZWFydGJlYXQpIChpbnQpOwogZXh0ZXJuIHZvaWQgKCptYWNoX2wyX2ZsdXNoKSAoaW50KTsKIGV4dGVybiB2b2lkICgqbWFjaF9iZWVwKSAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9yYXdfaW8uaCBiL2luY2x1ZGUvYXNtLW02OGsvcmF3X2lvLmgKaW5kZXggMDQxZjBhOC4uNTQzOWJjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9yYXdfaW8uaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3Jhd19pby5oCkBAIC0xOSw5ICsxOSw5IEBACiAjZGVmaW5lIElPTUFQX05PQ0FDSEVfTk9OU0VSCQkyCiAjZGVmaW5lIElPTUFQX1dSSVRFVEhST1VHSAkJMwogCi1leHRlcm4gdm9pZCBpb3VubWFwKHZvaWQgKmFkZHIpOworZXh0ZXJuIHZvaWQgaW91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpOwogCi1leHRlcm4gdm9pZCAqX19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKK2V4dGVybiB2b2lkIF9faW9tZW0gKl9faW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCSAgICAgICBpbnQgY2FjaGVmbGFnKTsKIGV4dGVybiB2b2lkIF9faW91bm1hcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogCkBAIC0zMCwyMSArMzAsMjEgQEAKICAqIHR3byBhY2Nlc3NlcyB0byBtZW1vcnksIHdoaWNoIG1heSBiZSB1bmRlc2lyYWJsZSBmb3Igc29tZSBkZXZpY2VzLgogICovCiAjZGVmaW5lIGluXzgoYWRkcikgXAotICAgICh7IHU4IF9fdiA9ICgqKHZvbGF0aWxlIHU4ICopIChhZGRyKSk7IF9fdjsgfSkKKyAgICAoeyB1OCBfX3YgPSAoKihfX2ZvcmNlIHZvbGF0aWxlIHU4ICopIChhZGRyKSk7IF9fdjsgfSkKICNkZWZpbmUgaW5fYmUxNihhZGRyKSBcCi0gICAgKHsgdTE2IF9fdiA9ICgqKHZvbGF0aWxlIHUxNiAqKSAoYWRkcikpOyBfX3Y7IH0pCisgICAgKHsgdTE2IF9fdiA9ICgqKF9fZm9yY2Ugdm9sYXRpbGUgdTE2ICopIChhZGRyKSk7IF9fdjsgfSkKICNkZWZpbmUgaW5fYmUzMihhZGRyKSBcCi0gICAgKHsgdTMyIF9fdiA9ICgqKHZvbGF0aWxlIHUzMiAqKSAoYWRkcikpOyBfX3Y7IH0pCisgICAgKHsgdTMyIF9fdiA9ICgqKF9fZm9yY2Ugdm9sYXRpbGUgdTMyICopIChhZGRyKSk7IF9fdjsgfSkKICNkZWZpbmUgaW5fbGUxNihhZGRyKSBcCi0gICAgKHsgdTE2IF9fdiA9IGxlMTZfdG9fY3B1KCoodm9sYXRpbGUgdTE2ICopIChhZGRyKSk7IF9fdjsgfSkKKyAgICAoeyB1MTYgX192ID0gbGUxNl90b19jcHUoKihfX2ZvcmNlIHZvbGF0aWxlIHUxNiAqKSAoYWRkcikpOyBfX3Y7IH0pCiAjZGVmaW5lIGluX2xlMzIoYWRkcikgXAotICAgICh7IHUzMiBfX3YgPSBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHUzMiAqKSAoYWRkcikpOyBfX3Y7IH0pCisgICAgKHsgdTMyIF9fdiA9IGxlMzJfdG9fY3B1KCooX19mb3JjZSB2b2xhdGlsZSB1MzIgKikgKGFkZHIpKTsgX192OyB9KQogCi0jZGVmaW5lIG91dF84KGFkZHIsYikgKHZvaWQpKCgqKHZvbGF0aWxlIHU4ICopIChhZGRyKSkgPSAoYikpCi0jZGVmaW5lIG91dF9iZTE2KGFkZHIsdykgKHZvaWQpKCgqKHZvbGF0aWxlIHUxNiAqKSAoYWRkcikpID0gKHcpKQotI2RlZmluZSBvdXRfYmUzMihhZGRyLGwpICh2b2lkKSgoKih2b2xhdGlsZSB1MzIgKikgKGFkZHIpKSA9IChsKSkKLSNkZWZpbmUgb3V0X2xlMTYoYWRkcix3KSAodm9pZCkoKCoodm9sYXRpbGUgdTE2ICopIChhZGRyKSkgPSBjcHVfdG9fbGUxNih3KSkKLSNkZWZpbmUgb3V0X2xlMzIoYWRkcixsKSAodm9pZCkoKCoodm9sYXRpbGUgdTMyICopIChhZGRyKSkgPSBjcHVfdG9fbGUzMihsKSkKKyNkZWZpbmUgb3V0XzgoYWRkcixiKSAodm9pZCkoKCooX19mb3JjZSB2b2xhdGlsZSB1OCAqKSAoYWRkcikpID0gKGIpKQorI2RlZmluZSBvdXRfYmUxNihhZGRyLHcpICh2b2lkKSgoKihfX2ZvcmNlIHZvbGF0aWxlIHUxNiAqKSAoYWRkcikpID0gKHcpKQorI2RlZmluZSBvdXRfYmUzMihhZGRyLGwpICh2b2lkKSgoKihfX2ZvcmNlIHZvbGF0aWxlIHUzMiAqKSAoYWRkcikpID0gKGwpKQorI2RlZmluZSBvdXRfbGUxNihhZGRyLHcpICh2b2lkKSgoKihfX2ZvcmNlIHZvbGF0aWxlIHUxNiAqKSAoYWRkcikpID0gY3B1X3RvX2xlMTYodykpCisjZGVmaW5lIG91dF9sZTMyKGFkZHIsbCkgKHZvaWQpKCgqKF9fZm9yY2Ugdm9sYXRpbGUgdTMyICopIChhZGRyKSkgPSBjcHVfdG9fbGUzMihsKSkKIAogI2RlZmluZSByYXdfaW5iIGluXzgKICNkZWZpbmUgcmF3X2ludyBpbl9iZTE2CkBAIC01NCw3ICs1NCw3IEBACiAjZGVmaW5lIHJhd19vdXR3KHZhbCxwb3J0KSBvdXRfYmUxNigocG9ydCksKHZhbCkpCiAjZGVmaW5lIHJhd19vdXRsKHZhbCxwb3J0KSBvdXRfYmUzMigocG9ydCksKHZhbCkpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByYXdfaW5zYih2b2xhdGlsZSB1OCAqcG9ydCwgdTggKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgdm9pZCByYXdfaW5zYih2b2xhdGlsZSB1OCBfX2lvbWVtICpwb3J0LCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC02Miw3ICs2Miw3IEBACiAJCSpidWYrKyA9IGluXzgocG9ydCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByYXdfb3V0c2Iodm9sYXRpbGUgdTggKnBvcnQsIGNvbnN0IHU4ICpidWYsCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X291dHNiKHZvbGF0aWxlIHU4IF9faW9tZW0gKnBvcnQsIGNvbnN0IHU4ICpidWYsCiAJCQkgICAgIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJdW5zaWduZWQgaW50IGk7CkBAIC03MSw3ICs3MSw3IEBACiAJCW91dF84KHBvcnQsICpidWYrKyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByYXdfaW5zdyh2b2xhdGlsZSB1MTYgKnBvcnQsIHUxNiAqYnVmLCB1bnNpZ25lZCBpbnQgbnIpCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X2luc3codm9sYXRpbGUgdTE2IF9faW9tZW0gKnBvcnQsIHUxNiAqYnVmLCB1bnNpZ25lZCBpbnQgbnIpCiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIApAQCAtMTEwLDcgKzExMCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmF3X291dHN3KHZvbGF0aWxlIHUxNiAqcG9ydCwgY29uc3QgdTE2ICpidWYsCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X291dHN3KHZvbGF0aWxlIHUxNiBfX2lvbWVtICpwb3J0LCBjb25zdCB1MTYgKmJ1ZiwKIAkJCSAgICAgdW5zaWduZWQgaW50IG5yKQogewogCXVuc2lnbmVkIGludCB0bXA7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByYXdfaW5zbCh2b2xhdGlsZSB1MzIgKnBvcnQsIHUzMiAqYnVmLCB1bnNpZ25lZCBpbnQgbnIpCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X2luc2wodm9sYXRpbGUgdTMyIF9faW9tZW0gKnBvcnQsIHUzMiAqYnVmLCB1bnNpZ25lZCBpbnQgbnIpCiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIApAQCAtMTg5LDcgKzE4OSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmF3X291dHNsKHZvbGF0aWxlIHUzMiAqcG9ydCwgY29uc3QgdTMyICpidWYsCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X291dHNsKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCBjb25zdCB1MzIgKmJ1ZiwKIAkJCSAgICAgdW5zaWduZWQgaW50IG5yKQogewogCXVuc2lnbmVkIGludCB0bXA7CkBAIC0yMzAsNyArMjMwLDcgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmF3X2luc3dfc3dhcHcodm9sYXRpbGUgdTE2ICpwb3J0LCB1MTYgKmJ1ZiwKK3N0YXRpYyBpbmxpbmUgdm9pZCByYXdfaW5zd19zd2Fwdyh2b2xhdGlsZSB1MTYgX19pb21lbSAqcG9ydCwgdTE2ICpidWYsCiAJCQkJICB1bnNpZ25lZCBpbnQgbnIpCiB7CiAgICAgaWYgKChucikgJSA4KQpAQCAtMjgzLDcgKzI4Myw3IEBACiAJCTogImQwIiwgImEwIiwgImExIiwgImQ2Iik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByYXdfb3V0c3dfc3dhcHcodm9sYXRpbGUgdTE2ICpwb3J0LCBjb25zdCB1MTYgKmJ1ZiwKK3N0YXRpYyBpbmxpbmUgdm9pZCByYXdfb3V0c3dfc3dhcHcodm9sYXRpbGUgdTE2IF9faW9tZW0gKnBvcnQsIGNvbnN0IHUxNiAqYnVmLAogCQkJCSAgIHVuc2lnbmVkIGludCBucikKIHsKICAgICBpZiAoKG5yKSAlIDgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3NpZ25hbC5oIGIvaW5jbHVkZS9hc20tbTY4ay9zaWduYWwuaAppbmRleCBhMGNkZjkwLi5iN2I3ZWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3NpZ25hbC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvc2lnbmFsLmgKQEAgLTE0NCw3ICsxNDQsNyBAQAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogdHlwZWRlZiBzdHJ1Y3Qgc2lnYWx0c3RhY2sgewotCXZvaWQgKnNzX3NwOworCXZvaWQgX191c2VyICpzc19zcDsKIAlpbnQgc3NfZmxhZ3M7CiAJc2l6ZV90IHNzX3NpemU7CiB9IHN0YWNrX3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3N1bjNfcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zX3BndGFibGUuaAppbmRleCBlOTc0YmIwLi41MTU2YTI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3N1bjNfcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvc3VuM19wZ3RhYmxlLmgKQEAgLTIxMSw3ICsyMTEsNyBAQAogCXJldHVybiBwdGUucHRlICYgU1VOM19QQUdFX1BHTlVNX01BU0s7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcGdvZmZfdG9fcHRlKGlubGluZSB1bnNpZ25lZCBvZmYpCitzdGF0aWMgaW5saW5lIHB0ZV90IHBnb2ZmX3RvX3B0ZSh1bnNpZ25lZCBvZmYpCiB7CiAJcHRlX3QgcHRlID0geyBvZmYgKyBTVU4zX1BBR0VfQUNDRVNTRUQgfTsKIAlyZXR1cm4gcHRlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zdW4zaW50cy5oIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zaW50cy5oCmluZGV4IGZkODM4ZWIuLmJkMDM4ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc3VuM2ludHMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3N1bjNpbnRzLmgKQEAgLTMxLDcgKzMxLDYgQEAKIAkJICAgICk7CiBleHRlcm4gdm9pZCBzdW4zX2luaXRfSVJRICh2b2lkKTsKIGV4dGVybiBpcnFyZXR1cm5fdCAoKnN1bjNfZGVmYXVsdF9oYW5kbGVyW10pIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci1leHRlcm4gaXJxcmV0dXJuX3QgKCpzdW4zX2ludGhhbmRsZXJbXSkgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKIGV4dGVybiB2b2lkIHN1bjNfZnJlZV9pcnEgKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBleHRlcm4gdm9pZCBzdW4zX2VuYWJsZV9pbnRlcnJ1cHRzICh2b2lkKTsKIGV4dGVybiB2b2lkIHN1bjNfZGlzYWJsZV9pbnRlcnJ1cHRzICh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc3VuM3hmbG9wLmggYi9pbmNsdWRlL2FzbS1tNjhrL3N1bjN4ZmxvcC5oCmluZGV4IGZkYTFlY2MuLjk4YTlmNzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc3VuM3hmbG9wLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zeGZsb3AuaApAQCAtMjA4LDcgKzIwOCw3IEBACiAKIAlpZighb25jZSkgewogCQlvbmNlID0gMTsKLQkJZXJyb3IgPSByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBzdW4zeGZsb3BfaGFyZGludCwgU0FfSU5URVJSVVBULCAiZmxvcHB5IiwgMCk7CisJCWVycm9yID0gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgc3VuM3hmbG9wX2hhcmRpbnQsIFNBX0lOVEVSUlVQVCwgImZsb3BweSIsIE5VTEwpOwogCQlyZXR1cm4gKChlcnJvciA9PSAwKSA/IDAgOiAtMSk7CiAJfSBlbHNlIHJldHVybiAwOwogfQpAQCAtMjM4LDcgKzIzOCw3IEBACiAJKnN1bjN4X2ZkYy5mY3JfciA9IDA7CiAKIAkvKiBTdWNjZXNzLi4uICovCi0JZmxvcHB5X3NldF9mbGFncygwLCAxLCBGRF9CUk9LRU5fRENMKTsgLy8gSSBkb24ndCBrbm93IGhvdyB0byBkZXRlY3QgdGhpcy4KKwlmbG9wcHlfc2V0X2ZsYWdzKE5VTEwsIDEsIEZEX0JST0tFTl9EQ0wpOyAvLyBJIGRvbid0IGtub3cgaG93IHRvIGRldGVjdCB0aGlzLgogCWFsbG93ZWRfZHJpdmVfbWFzayA9IDB4MDE7CiAJcmV0dXJuIChpbnQpIFNVTjNYX0ZEQzsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLW02OGsvdGhyZWFkX2luZm8uaAppbmRleCA5NTMyY2EzLi5jNGQ2MjJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay90aHJlYWRfaW5mby5oCkBAIC0zNyw2ICszNyw3IEBACiAjZGVmaW5lIGluaXRfc3RhY2sJCShpbml0X3RocmVhZF91bmlvbi5zdGFjaykKIAogI2RlZmluZSB0YXNrX3RocmVhZF9pbmZvKHRzaykJKCYodHNrKS0+dGhyZWFkLmluZm8pCisjZGVmaW5lIHRhc2tfc3RhY2tfcGFnZSh0c2spCSgodm9pZCAqKSh0c2spLT50aHJlYWRfaW5mbykKICNkZWZpbmUgY3VycmVudF90aHJlYWRfaW5mbygpCXRhc2tfdGhyZWFkX2luZm8oY3VycmVudCkKIAogI2RlZmluZSBfX0hBVkVfVEhSRUFEX0ZVTkNUSU9OUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1tNjhrL3VhY2Nlc3MuaAppbmRleCBmNWNlZGYxLi4yZmZkODdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3VhY2Nlc3MuaApAQCAtNDIsNiArNDIsNyBAQAogKHsJCQkJCQkJXAogICAgIGludCBfX3B1X2VycjsJCQkJCVwKICAgICB0eXBlb2YoKihwdHIpKSBfX3B1X3ZhbCA9ICh4KTsJCQlcCisgICAgX19jaGtfdXNlcl9wdHIocHRyKTsJCQkJXAogICAgIHN3aXRjaCAoc2l6ZW9mICgqKHB0cikpKSB7CQkJCVwKICAgICBjYXNlIDE6CQkJCQkJXAogCV9fcHV0X3VzZXJfYXNtKF9fcHVfZXJyLCBfX3B1X3ZhbCwgcHRyLCBiKTsJXApAQCAtOTEsNiArOTIsNyBAQAogKHsJCQkJCQkJCVwKICAgICBpbnQgX19ndV9lcnI7CQkJCQkJXAogICAgIHR5cGVvZigqKHB0cikpIF9fZ3VfdmFsOwkJCQkJXAorICAgIF9fY2hrX3VzZXJfcHRyKHB0cik7CQkJCQlcCiAgICAgc3dpdGNoIChzaXplb2YoKihwdHIpKSkgewkJCQkJXAogICAgIGNhc2UgMToJCQkJCQkJXAogCV9fZ2V0X3VzZXJfYXNtKF9fZ3VfZXJyLCBfX2d1X3ZhbCwgcHRyLCBiLCAiPWQiKTsJXApAQCAtMTA1LDcgKzEwNyw3IEBACiAgICAgICAgIF9fZ3VfZXJyID0gX19jb25zdGFudF9jb3B5X2Zyb21fdXNlcigmX19ndV92YWwsIHB0ciwgOCk7ICBcCiAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRlZmF1bHQ6CQkJCQkJCVwKLQlfX2d1X3ZhbCA9IDA7CQkJCQkJXAorCV9fZ3VfdmFsID0gKHR5cGVvZigqKHB0cikpKTA7CQkJCVwKIAlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfYmFkKCk7CQkJCVwKIAlicmVhazsJCQkJCQkJXAogICAgIH0JCQkJCQkJCVwKQEAgLTEzNCw3ICsxMzYsNyBAQAogICAgICA6ICJtIigqKHB0cikpLCAiaSIgKC1FRkFVTFQpLCAiMCIoMCkpCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotX19nZW5lcmljX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCitfX2dlbmVyaWNfY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAgICAgdW5zaWduZWQgbG9uZyB0bXA7CiAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18KQEAgLTE4OSw3ICsxOTEsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fZ2VuZXJpY19jb3B5X3RvX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK19fZ2VuZXJpY19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAgICAgdW5zaWduZWQgbG9uZyB0bXA7CiAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18KQEAgLTI2NCw3ICsyNjYsNyBAQAogCSA6ICJkMCIsICJtZW1vcnkiKQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fY29uc3RhbnRfY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK19fY29uc3RhbnRfY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAgICAgc3dpdGNoIChuKSB7CiAgICAgY2FzZSAwOgpAQCAtNTIwLDcgKzUyMiw3IEBACiAjZGVmaW5lIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMgX19jb3B5X2Zyb21fdXNlcgogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fY29uc3RhbnRfY29weV90b191c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCitfX2NvbnN0YW50X2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKICAgICBzd2l0Y2ggKG4pIHsKICAgICBjYXNlIDA6CkBAIC03NjYsNyArNzY4LDcgQEAKICAqLwogCiBzdGF0aWMgaW5saW5lIGxvbmcKLXN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBsb25nIGNvdW50KQorc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KQogewogICAgIGxvbmcgcmVzOwogICAgIGlmIChjb3VudCA9PSAwKSByZXR1cm4gY291bnQ7CkBAIC03OTksMTEgKzgwMSwxMSBAQAogICoKICAqIFJldHVybiAwIG9uIGV4Y2VwdGlvbiwgYSB2YWx1ZSBncmVhdGVyIHRoYW4gTiBpZiB0b28gbG9uZwogICovCi1zdGF0aWMgaW5saW5lIGxvbmcgc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgKnNyYywgbG9uZyBuKQorc3RhdGljIGlubGluZSBsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIG4pCiB7CiAJbG9uZyByZXM7CiAKLQlyZXMgPSAtKGxvbmcpc3JjOworCXJlcyA9IC0odW5zaWduZWQgbG9uZylzcmM7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18KIAkJKCIxOlxuIgogCQkgIiAgIHRzdGwgJTJcbiIKQEAgLTg0Miw3ICs4NDQsNyBAQAogICovCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotY2xlYXJfdXNlcih2b2lkICp0bywgdW5zaWduZWQgbG9uZyBuKQorY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbikKIHsKICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXwogCSgiICAgdHN0bCAlMVxuIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay96b3Jyby5oIGIvaW5jbHVkZS9hc20tbTY4ay96b3Jyby5oCmluZGV4IGNmODE2NTguLjVjZTk3YzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvem9ycm8uaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3pvcnJvLmgKQEAgLTE1LDI0ICsxNSwyNCBAQAogI2RlZmluZSB6X21lbWNweV9mcm9taW8oYSxiLGMpCW1lbWNweSgoYSksKHZvaWQgKikoYiksKGMpKQogI2RlZmluZSB6X21lbWNweV90b2lvKGEsYixjKQltZW1jcHkoKHZvaWQgKikoYSksKGIpLChjKSkKIAotc3RhdGljIGlubGluZSB2b2lkICp6X3JlbWFwX25vY2FjaGVfc2VyKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqel9yZW1hcF9ub2NhY2hlX3Nlcih1bnNpZ25lZCBsb25nIHBoeXNhZGRyLAogCQkJCQl1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJcmV0dXJuIF9faW9yZW1hcChwaHlzYWRkciwgc2l6ZSwgSU9NQVBfTk9DQUNIRV9TRVIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKnpfcmVtYXBfbm9jYWNoZV9ub25zZXIodW5zaWduZWQgbG9uZyBwaHlzYWRkciwKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICp6X3JlbWFwX25vY2FjaGVfbm9uc2VyKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCiAJCQkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZXR1cm4gX19pb3JlbWFwKHBoeXNhZGRyLCBzaXplLCBJT01BUF9OT0NBQ0hFX05PTlNFUik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqel9yZW1hcF93cml0ZXRocm91Z2godW5zaWduZWQgbG9uZyBwaHlzYWRkciwKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICp6X3JlbWFwX3dyaXRldGhyb3VnaCh1bnNpZ25lZCBsb25nIHBoeXNhZGRyLAogCQkJCQkgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJldHVybiBfX2lvcmVtYXAocGh5c2FkZHIsIHNpemUsIElPTUFQX1dSSVRFVEhST1VHSCk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgKnpfcmVtYXBfZnVsbGNhY2hlKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqel9yZW1hcF9mdWxsY2FjaGUodW5zaWduZWQgbG9uZyBwaHlzYWRkciwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJcmV0dXJuIF9faW9yZW1hcChwaHlzYWRkciwgc2l6ZSwgSU9NQVBfRlVMTF9DQUNISU5HKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tYWNoZGVwLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWFjaGRlcC5oCmluZGV4IDVhOWY5YzI5Li4yN2M5MGFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWFjaGRlcC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tYWNoZGVwLmgKQEAgLTM4LDcgKzM4LDYgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nICgqbWFjaF9oZF9pbml0KSAodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCAoKm1hY2hfaGRfc2V0dXApKGNoYXIgKiwgaW50ICopOwogZXh0ZXJuIGxvbmcgbWFjaF9tYXhfZG1hX2FkZHJlc3M7Ci1leHRlcm4gdm9pZCAoKm1hY2hfZmxvcHB5X3NldHVwKShjaGFyICosIGludCAqKTsKIGV4dGVybiB2b2lkICgqbWFjaF9mbG9wcHlfZWplY3QpKHZvaWQpOwogZXh0ZXJuIHZvaWQgKCptYWNoX2hlYXJ0YmVhdCkgKGludCk7CiBleHRlcm4gdm9pZCAoKm1hY2hfbDJfZmx1c2gpIChpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvdGhyZWFkX2luZm8uaAppbmRleCA3YjlhM2ZhLi5iOGYwMDllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvdGhyZWFkX2luZm8uaApAQCAtNzUsOCArNzUsNiBAQAogI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spICgoc3RydWN0IHRocmVhZF9pbmZvICopIFwKIAkJCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIFRIUkVBRF9TSVpFX09SREVSKSkKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgKHRpKSwgVEhSRUFEX1NJWkVfT1JERVIpCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkJZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkJcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNkZWZpbmUJUFJFRU1QVF9BQ1RJVkUJMHg0MDAwMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy90b3BvbG9neS5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcvdG9wb2xvZ3kuaAppbmRleCA4MjE0MWM3Li41OWQyNmI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI3L3RvcG9sb2d5LmgKQEAgLTI3LDcgKzI3LDYgQEAKIAkubWF4X2ludGVydmFsCQk9IDMyLAkJCVwKIAkuYnVzeV9mYWN0b3IJCT0gMzIsCQkJXAogCS5pbWJhbGFuY2VfcGN0CQk9IDEyNSwJCQlcCi0JLmNhY2hlX2hvdF90aW1lCQk9ICgxMCoxMDAwKSwJCVwKIAkuY2FjaGVfbmljZV90cmllcwk9IDEsCQkJXAogCS5wZXJfY3B1X2dhaW4JCT0gMTAwLAkJCVwKIAkuZmxhZ3MJCQk9IFNEX0xPQURfQkFMQU5DRQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tbWlwcy9wcm9jZXNzb3IuaAppbmRleCBkZTUzMDU1Li4zOWQyYmQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcHJvY2Vzc29yLmgKQEAgLTIwMCwxMSArMjAwLDExIEBACiAKIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKLSNkZWZpbmUgX19QVF9SRUcocmVnKSAoKGxvbmcpJigoc3RydWN0IHB0X3JlZ3MgKikwKS0+cmVnIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkKLSNkZWZpbmUgX19LU1RLX1RPUyh0c2spICgodW5zaWduZWQgbG9uZykodHNrLT50aHJlYWRfaW5mbykgKyBUSFJFQURfU0laRSAtIDMyKQotI2RlZmluZSBLU1RLX0VJUCh0c2spICgqKHVuc2lnbmVkIGxvbmcgKikoX19LU1RLX1RPUyh0c2spICsgX19QVF9SRUcoY3AwX2VwYykpKQotI2RlZmluZSBLU1RLX0VTUCh0c2spICgqKHVuc2lnbmVkIGxvbmcgKikoX19LU1RLX1RPUyh0c2spICsgX19QVF9SRUcocmVnc1syOV0pKSkKLSNkZWZpbmUgS1NUS19TVEFUVVModHNrKSAoKih1bnNpZ25lZCBsb25nICopKF9fS1NUS19UT1ModHNrKSArIF9fUFRfUkVHKGNwMF9zdGF0dXMpKSkKKyNkZWZpbmUgX19LU1RLX1RPUyh0c2spICgodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodHNrKSArIFRIUkVBRF9TSVpFIC0gMzIpCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0c2spICgoc3RydWN0IHB0X3JlZ3MgKilfX0tTVEtfVE9TKHRzaykgLSAxKQorI2RlZmluZSBLU1RLX0VJUCh0c2spICh0YXNrX3B0X3JlZ3ModHNrKS0+Y3AwX2VwYykKKyNkZWZpbmUgS1NUS19FU1AodHNrKSAodGFza19wdF9yZWdzKHRzayktPnJlZ3NbMjldKQorI2RlZmluZSBLU1RLX1NUQVRVUyh0c2spICh0YXNrX3B0X3JlZ3ModHNrKS0+Y3AwX3N0YXR1cykKIAogI2RlZmluZSBjcHVfcmVsYXgoKQliYXJyaWVyKCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLW1pcHMvc3lzdGVtLmgKaW5kZXggMzMwYzRlNC4uZThlNWQ0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3N5c3RlbS5oCkBAIC0xNTksMTEgKzE1OSwyMSBAQAogZG8gewkJCQkJCQkJCVwKIAlpZiAoY3B1X2hhc19kc3ApCQkJCQkJXAogCQlfX3NhdmVfZHNwKHByZXYpOwkJCQkJXAotCShsYXN0KSA9IHJlc3VtZShwcmV2LCBuZXh0LCBuZXh0LT50aHJlYWRfaW5mbyk7CQkJXAorCShsYXN0KSA9IHJlc3VtZShwcmV2LCBuZXh0LCB0YXNrX3RocmVhZF9pbmZvKG5leHQpKTsJCVwKIAlpZiAoY3B1X2hhc19kc3ApCQkJCQkJXAogCQlfX3Jlc3RvcmVfZHNwKGN1cnJlbnQpOwkJCQkJXAogfSB3aGlsZSgwKQogCisvKgorICogT24gU01QIHN5c3RlbXMsIHdoZW4gdGhlIHNjaGVkdWxlciBkb2VzIG1pZ3JhdGlvbi1jb3N0IGF1dG9kZXRlY3Rpb24sCisgKiBpdCBuZWVkcyBhIHdheSB0byBmbHVzaCBhcyBtdWNoIG9mIHRoZSBDUFUncyBjYWNoZXMgYXMgcG9zc2libGUuCisgKgorICogVE9ETzogZmlsbCB0aGlzIGluIQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfY2FjaGVmbHVzaCh2b2lkKQoreworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX194Y2hnX3UzMih2b2xhdGlsZSBpbnQgKiBtLCB1bnNpZ25lZCBpbnQgdmFsKQogewogCV9fdTMyIHJldHZhbDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLW1pcHMvdGhyZWFkX2luZm8uaAppbmRleCBlNmMyNDQ3Li4xNjEyYjNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy90aHJlYWRfaW5mby5oCkBAIC05Nyw4ICs5Nyw2IEBACiAjZW5kaWYKIAogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKGluZm8pIGtmcmVlKGluZm8pCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zeXN0ZW0uaAppbmRleCBmMzkyOGQzLi5hNWE5NzNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2Mvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3N5c3RlbS5oCkBAIC00OSw2ICs0OSwxNSBAQAogCShsYXN0KSA9IF9zd2l0Y2hfdG8ocHJldiwgbmV4dCk7CQkJXAogfSB3aGlsZSgwKQogCisvKgorICogT24gU01QIHN5c3RlbXMsIHdoZW4gdGhlIHNjaGVkdWxlciBkb2VzIG1pZ3JhdGlvbi1jb3N0IGF1dG9kZXRlY3Rpb24sCisgKiBpdCBuZWVkcyBhIHdheSB0byBmbHVzaCBhcyBtdWNoIG9mIHRoZSBDUFUncyBjYWNoZXMgYXMgcG9zc2libGUuCisgKgorICogVE9ETzogZmlsbCB0aGlzIGluIQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfY2FjaGVmbHVzaCh2b2lkKQoreworfQogCiAKIC8qIGludGVycnVwdCBjb250cm9sICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy90aHJlYWRfaW5mby5oCmluZGV4IDU3YmJiNzYuLmFjMzJmMTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy90aHJlYWRfaW5mby5oCkBAIC00Myw5ICs0Myw2IEBACiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykgKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgXAogCQkJX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBUSFJFQURfT1JERVIpKQogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKSAgICBmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSAodGkpLCBUSFJFQURfT1JERVIpCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgICAgIGdldF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQotI2RlZmluZSBwdXRfdGhyZWFkX2luZm8odGkpICAgICBwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLQogCiAvKiBob3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQyAqLwogI2RlZmluZSBjdXJyZW50X3RocmVhZF9pbmZvKCkJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKiltZmN0bCgzMCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9hdG9taWMuaAppbmRleCAyNDhmOWFlLi4xNDdhMzhkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYXRvbWljLmgKQEAgLTM2LDcgKzM2LDcgQEAKIAlpbnQgdDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsd2FyeAklMCwwLCUyCQkjIGF0b21pY19hZGRfcmV0dXJuXG5cCiAJYWRkCSUwLCUxLCUwXG4iCiAJUFBDNDA1X0VSUjc3KDAsJTIpCkBAIC03Miw3ICs3Miw3IEBACiAJaW50IHQ7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbHdhcngJJTAsMCwlMgkJIyBhdG9taWNfc3ViX3JldHVyblxuXAogCXN1YmYJJTAsJTEsJTBcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMikKQEAgLTEwNiw3ICsxMDYsNyBAQAogCWludCB0OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6CWx3YXJ4CSUwLDAsJTEJCSMgYXRvbWljX2luY19yZXR1cm5cblwKIAlhZGRpYwklMCwlMCwxXG4iCiAJUFBDNDA1X0VSUjc3KDAsJTEpCkBAIC0xNTAsNyArMTUwLDcgQEAKIAlpbnQgdDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsd2FyeAklMCwwLCUxCQkjIGF0b21pY19kZWNfcmV0dXJuXG5cCiAJYWRkaWMJJTAsJTAsLTFcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMSkKQEAgLTE3NiwxOSArMTc2LDE5IEBACiAgKiBBdG9taWNhbGx5IGFkZHMgQGEgdG8gQHYsIHNvIGxvbmcgYXMgaXQgd2FzIG5vdCBAdS4KICAqIFJldHVybnMgbm9uLXplcm8gaWYgQHYgd2FzIG5vdCBAdSwgYW5kIHplcm8gb3RoZXJ3aXNlLgogICovCi0jZGVmaW5lIGF0b21pY19hZGRfdW5sZXNzKHYsIGEsIHUpCQkJCQkJCSBcCi0oewkJCQkJCQkJCQkJCQkJCSBcCi0JICAgaW50IGMsIG9sZDsJCQkJCQkJCQkJCSBcCi0JICAgYyA9IGF0b21pY19yZWFkKHYpOwkJCQkJCQkJCSBcCi0JICAgZm9yICg7OykgewkJCQkJCQkJCQkJICBcCi0JCQkgICBpZiAodW5saWtlbHkoYyA9PSAodSkpKQkJCQkJCSBcCi0JCQkJCSAgIGJyZWFrOwkJCQkJCQkJICBcCi0JCQkgICBvbGQgPSBhdG9taWNfY21weGNoZygodiksIGMsIGMgKyAoYSkpOwkJICBcCi0JCQkgICBpZiAobGlrZWx5KG9sZCA9PSBjKSkJCQkJCQkgICBcCi0JCQkJCSAgIGJyZWFrOwkJCQkJCQkJICBcCi0JCQkgICBjID0gb2xkOwkJCQkJCQkJCQlcCi0JICAgfQkJCQkJCQkJCQkJCQkgICBcCi0JICAgYyAhPSAodSk7CQkJCQkJCQkJCQkgICBcCisjZGVmaW5lIGF0b21pY19hZGRfdW5sZXNzKHYsIGEsIHUpCQkJXAorKHsJCQkJCQkJXAorCWludCBjLCBvbGQ7CQkJCQlcCisJYyA9IGF0b21pY19yZWFkKHYpOwkJCQlcCisJZm9yICg7OykgewkJCQkJXAorCQlpZiAodW5saWtlbHkoYyA9PSAodSkpKQkJCVwKKwkJCWJyZWFrOwkJCQlcCisJCW9sZCA9IGF0b21pY19jbXB4Y2hnKCh2KSwgYywgYyArIChhKSk7CVwKKwkJaWYgKGxpa2VseShvbGQgPT0gYykpCQkJXAorCQkJYnJlYWs7CQkJCVwKKwkJYyA9IG9sZDsJCQkJXAorCX0JCQkJCQlcCisJYyAhPSAodSk7CQkJCQlcCiB9KQogI2RlZmluZSBhdG9taWNfaW5jX25vdF96ZXJvKHYpIGF0b21pY19hZGRfdW5sZXNzKCh2KSwgMSwgMCkKIApAQCAtMjA0LDcgKzIwNCw3IEBACiAJaW50IHQ7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbHdhcngJJTAsMCwlMQkJIyBhdG9taWNfZGVjX2lmX3Bvc2l0aXZlXG5cCiAJYWRkaWMuCSUwLCUwLC0xXG5cCiAJYmx0LQkyZlxuIgpAQCAtMjUzLDcgKzI1Myw3IEBACiAJbG9uZyB0OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6CWxkYXJ4CSUwLDAsJTIJCSMgYXRvbWljNjRfYWRkX3JldHVyblxuXAogCWFkZAklMCwlMSwlMFxuXAogCXN0ZGN4LgklMCwwLCUyIFxuXApAQCAtMjg3LDcgKzI4Nyw3IEBACiAJbG9uZyB0OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6CWxkYXJ4CSUwLDAsJTIJCSMgYXRvbWljNjRfc3ViX3JldHVyblxuXAogCXN1YmYJJTAsJTEsJTBcblwKIAlzdGRjeC4JJTAsMCwlMiBcblwKQEAgLTMxOSw3ICszMTksNyBAQAogCWxvbmcgdDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsZGFyeAklMCwwLCUxCQkjIGF0b21pYzY0X2luY19yZXR1cm5cblwKIAlhZGRpYwklMCwlMCwxXG5cCiAJc3RkY3guCSUwLDAsJTEgXG5cCkBAIC0zNjEsNyArMzYxLDcgQEAKIAlsb25nIHQ7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbGRhcngJJTAsMCwlMQkJIyBhdG9taWM2NF9kZWNfcmV0dXJuXG5cCiAJYWRkaWMJJTAsJTAsLTFcblwKIAlzdGRjeC4JJTAsMCwlMVxuXApAQCAtMzg2LDcgKzM4Niw3IEBACiAJbG9uZyB0OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6CWxkYXJ4CSUwLDAsJTEJCSMgYXRvbWljNjRfZGVjX2lmX3Bvc2l0aXZlXG5cCiAJYWRkaWMuCSUwLCUwLC0xXG5cCiAJYmx0LQkyZlxuXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9iaXRvcHMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYml0b3BzLmgKaW5kZXggMTk5NmVhYS4uYmY2OTQxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9iaXRvcHMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2JpdG9wcy5oCkBAIC0xMTIsNyArMTEyLDcgQEAKIAl1bnNpZ25lZCBsb25nICpwID0gKCh1bnNpZ25lZCBsb25nICopYWRkcikgKyBCSVRPUF9XT1JEKG5yKTsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOiIJUFBDX0xMQVJYICIlMCwwLCUzCQkjIHRlc3RfYW5kX3NldF9iaXRcbiIKIAkib3IJJTEsJTAsJTIgXG4iCiAJUFBDNDA1X0VSUjc3KDAsJTMpCkBAIC0xMzQsNyArMTM0LDcgQEAKIAl1bnNpZ25lZCBsb25nICpwID0gKCh1bnNpZ25lZCBsb25nICopYWRkcikgKyBCSVRPUF9XT1JEKG5yKTsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOiIJUFBDX0xMQVJYICIlMCwwLCUzCQkjIHRlc3RfYW5kX2NsZWFyX2JpdFxuIgogCSJhbmRjCSUxLCUwLCUyIFxuIgogCVBQQzQwNV9FUlI3NygwLCUzKQpAQCAtMTU2LDcgKzE1Niw3IEBACiAJdW5zaWduZWQgbG9uZyAqcCA9ICgodW5zaWduZWQgbG9uZyAqKWFkZHIpICsgQklUT1BfV09SRChucik7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToiCVBQQ19MTEFSWCAiJTAsMCwlMwkJIyB0ZXN0X2FuZF9jaGFuZ2VfYml0XG4iCiAJInhvcgklMSwlMCwlMiBcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaAppbmRleCBlZjZlYWQzLi42NDIxMDU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAjZGVmaW5lIFBQQ19GRUFUVVJFX1BPV0VSNQkJMHgwMDA0MDAwMAogI2RlZmluZSBQUENfRkVBVFVSRV9QT1dFUjVfUExVUwkJMHgwMDAyMDAwMAogI2RlZmluZSBQUENfRkVBVFVSRV9DRUxMCQkweDAwMDEwMDAwCisjZGVmaW5lIFBQQ19GRUFUVVJFX0JPT0tFCQkweDAwMDA4MDAwCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwpAQCAtMzEsMTEgKzMyLDExIEBACiB0eXBlZGVmCXZvaWQgKCpjcHVfc2V0dXBfdCkodW5zaWduZWQgbG9uZyBvZmZzZXQsIHN0cnVjdCBjcHVfc3BlYyogc3BlYyk7CiAKIGVudW0gcG93ZXJwY19vcHJvZmlsZV90eXBlIHsKLQlJTlZBTElEID0gMCwKLQlSUzY0ID0gMSwKLQlQT1dFUjQgPSAyLAotCUc0ID0gMywKLQlCT09LRSA9IDQsCisJUFBDX09QUk9GSUxFX0lOVkFMSUQgPSAwLAorCVBQQ19PUFJPRklMRV9SUzY0ID0gMSwKKwlQUENfT1BST0ZJTEVfUE9XRVI0ID0gMiwKKwlQUENfT1BST0ZJTEVfRzQgPSAzLAorCVBQQ19PUFJPRklMRV9CT09LRSA9IDQsCiB9OwogCiBzdHJ1Y3QgY3B1X3NwZWMgewpAQCAtNjQsNiArNjUsOSBAQAogCiAJLyogUHJvY2Vzc29yIHNwZWNpZmljIG9wcm9maWxlIG9wZXJhdGlvbnMgKi8KIAllbnVtIHBvd2VycGNfb3Byb2ZpbGVfdHlwZSBvcHJvZmlsZV90eXBlOworCisJLyogTmFtZSBvZiBwcm9jZXNzb3IgY2xhc3MsIGZvciB0aGUgRUxGIEFUX1BMQVRGT1JNIGVudHJ5ICovCisJY2hhcgkJKnBsYXRmb3JtOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBjcHVfc3BlYwkJKmN1cl9jcHVfc3BlYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWxmLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2VsZi5oCmluZGV4IDQ1ZjJhZjYuLjk0ZDIyOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lbGYuaApAQCAtMjIxLDIxICsyMjEsMTkgQEAKICAgIGluc3RydWN0aW9uIHNldCB0aGlzIGNwdSBzdXBwb3J0cy4gIFRoaXMgY291bGQgYmUgZG9uZSBpbiB1c2Vyc3BhY2UsCiAgICBidXQgaXQncyBub3QgZWFzeSwgYW5kIHdlJ3ZlIGFscmVhZHkgZG9uZSBpdCBoZXJlLiAgKi8KICMgZGVmaW5lIEVMRl9IV0NBUAkoY3VyX2NwdV9zcGVjLT5jcHVfdXNlcl9mZWF0dXJlcykKKworLyogVGhpcyB5aWVsZHMgYSBzdHJpbmcgdGhhdCBsZC5zbyB3aWxsIHVzZSB0byBsb2FkIGltcGxlbWVudGF0aW9uCisgICBzcGVjaWZpYyBsaWJyYXJpZXMgZm9yIG9wdGltaXphdGlvbi4gIFRoaXMgaXMgbW9yZSBzcGVjaWZpYyBpbgorICAgaW50ZW50IHRoYW4gcG9raW5nIGF0IHVuYW1lIG9yIC9wcm9jL2NwdWluZm8uICAqLworCisjZGVmaW5lIEVMRl9QTEFURk9STQkoY3VyX2NwdV9zcGVjLT5wbGF0Zm9ybSkKKwogI2lmZGVmIF9fcG93ZXJwYzY0X18KICMgZGVmaW5lIEVMRl9QTEFUX0lOSVQoX3IsIGxvYWRfYWRkcikJZG8gewlcCiAJX3ItPmdwclsyXSA9IGxvYWRfYWRkcjsgCQlcCiB9IHdoaWxlICgwKQogI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KIAotLyogVGhpcyB5aWVsZHMgYSBzdHJpbmcgdGhhdCBsZC5zbyB3aWxsIHVzZSB0byBsb2FkIGltcGxlbWVudGF0aW9uCi0gICBzcGVjaWZpYyBsaWJyYXJpZXMgZm9yIG9wdGltaXphdGlvbi4gIFRoaXMgaXMgbW9yZSBzcGVjaWZpYyBpbgotICAgaW50ZW50IHRoYW4gcG9raW5nIGF0IHVuYW1lIG9yIC9wcm9jL2NwdWluZm8uCi0KLSAgIEZvciB0aGUgbW9tZW50LCB3ZSBoYXZlIG9ubHkgb3B0aW1pemF0aW9ucyBmb3IgdGhlIEludGVsIGdlbmVyYXRpb25zLAotICAgYnV0IHRoYXQgY291bGQgY2hhbmdlLi4uICovCi0KLSNkZWZpbmUgRUxGX1BMQVRGT1JNCShOVUxMKQotCiAjaWZkZWYgX19LRVJORUxfXwogCiAjaWZkZWYgX19wb3dlcnBjNjRfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9mdXRleC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9mdXRleC5oCmluZGV4IGYwMzE5ZDUuLjM5ZTg1ZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Z1dGV4LmgKQEAgLTExLDcgKzExLDcgQEAKIAogI2RlZmluZSBfX2Z1dGV4X2F0b21pY19vcChpbnNuLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKSBcCiAgIF9fYXNtX18gX192b2xhdGlsZSAoIFwKLQlTWU5DX09OX1NNUCBcCisJTFdTWU5DX09OX1NNUCBcCiAiMToJbHdhcngJJTAsMCwlMlxuIiBcCiAJaW5zbiBcCiAJUFBDNDA1X0VSUjc3KDAsICUyKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNhbGwuaAppbmRleCBkYTdhZjVhLi4zOGNhOWFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjYWxsLmgKQEAgLTYsNyArNiwxMCBAQAogCiAjZGVmaW5lIEhfU3VjY2VzcwkwCiAjZGVmaW5lIEhfQnVzeQkJMQkvKiBIYXJkd2FyZSBidXN5IC0tIHJldHJ5IGxhdGVyICovCisjZGVmaW5lIEhfQ2xvc2VkCTIJLyogUmVzb3VyY2UgY2xvc2VkICovCiAjZGVmaW5lIEhfQ29uc3RyYWluZWQJNAkvKiBSZXNvdXJjZSByZXF1ZXN0IGNvbnN0cmFpbmVkIHRvIG1heCBhbGxvd2VkICovCisjZGVmaW5lIEhfSW5Qcm9ncmVzcyAgIDE0CS8qIEtpbmQgb2YgbGlrZSBidXN5ICovCisjZGVmaW5lIEhfQ29udGludWUgICAgIDE4CS8qIFJldHVybmVkIGZyb20gSF9Kb2luIG9uIHN1Y2Nlc3MgKi8KICNkZWZpbmUgSF9Mb25nQnVzeVN0YXJ0UmFuZ2UgICA5OTAwICAvKiBTdGFydCBvZiBsb25nIGJ1c3kgcmFuZ2UgKi8KICNkZWZpbmUgSF9Mb25nQnVzeU9yZGVyMW1zZWMgICA5OTAwICAvKiBMb25nIGJ1c3ksIGhpbnQgdGhhdCAxbXNlYyBpcyBhIGdvb2QgdGltZSB0byByZXRyeSAqLwogI2RlZmluZSBIX0xvbmdCdXN5T3JkZXIxMG1zZWMgIDk5MDEgIC8qIExvbmcgYnVzeSwgaGludCB0aGF0IDEwbXNlYyBpcyBhIGdvb2QgdGltZSB0byByZXRyeSAqLwpAQCAtMTE0LDYgKzExNyw4IEBACiAjZGVmaW5lIEhfUkVHSVNURVJfVlRFUk0JMHgxNTQKICNkZWZpbmUgSF9GUkVFX1ZURVJNCQkweDE1OAogI2RlZmluZSBIX1BPTExfUEVORElORwkgICAgICAgIDB4MUQ4CisjZGVmaW5lIEhfSk9JTgkJCTB4Mjk4CisjZGVmaW5lIEhfRU5BQkxFX0NSUQkJMHgyQjAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pb21tdS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pb21tdS5oCmluZGV4IDhhODM5M2UuLmQ1Njc3Y2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvbW11LmgKQEAgLTY0LDI1ICs2NCw2IEBACiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KIAotI2lmZGVmIENPTkZJR19QUENfUFNFUklFUwotCi0vKiBDcmVhdGVzIHRhYmxlIGZvciBhbiBpbmRpdmlkdWFsIGRldmljZSBub2RlICovCi1leHRlcm4gdm9pZCBpb21tdV9kZXZub2RlX2luaXRfcFNlcmllcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKLQotI2VuZGlmIC8qIENPTkZJR19QUENfUFNFUklFUyAqLwotCi0jaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0KLS8qIENyZWF0ZXMgdGFibGUgZm9yIGFuIGluZGl2aWR1YWwgZGV2aWNlIG5vZGUgKi8KLWV4dGVybiB2b2lkIGlvbW11X2Rldm5vZGVfaW5pdF9pU2VyaWVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pOwotLyogR2V0IHRhYmxlIHBhcmFtZXRlcnMgZnJvbSBIViAqLwotZXh0ZXJuIHZvaWQgaW9tbXVfdGFibGVfZ2V0cGFybXNfaVNlcmllcyh1bnNpZ25lZCBsb25nIGJ1c25vLAotCQkJCQkgdW5zaWduZWQgY2hhciBzbG90bm8sCi0JCQkJCSB1bnNpZ25lZCBjaGFyIHZpcnRidXMsCi0JCQkJCSBzdHJ1Y3QgaW9tbXVfdGFibGUqIHRibCk7Ci0KLSNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KLQogLyogSW5pdGlhbGl6ZXMgYW4gaW9tbXVfdGFibGUgYmFzZWQgaW4gdmFsdWVzIHNldCBpbiB0aGUgcGFzc2VkLWluCiAgKiBzdHJ1Y3R1cmUKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2h2X2NhbGwuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9jYWxsLmgKaW5kZXggZTlmODMxYy4uMTYyZDY1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2h2X2NhbGwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaHZfY2FsbC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIEh2Q2FsbC5oCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1pa2UgQ29ycmlnYW4gSUJNIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTE1LDggKzE0LDcgQEAKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKi8KLS8qCisgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSAiaHlwZXJ2aXNvciBjYWxsIiBpbnRlcmZhY2Ugd2hpY2ggaXMgdXNlZCB0bwogICogZHJpdmUgdGhlIGh5cGVydmlzb3IgZnJvbSB0aGUgT1MuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9jYWxsX2V2ZW50LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaHZfY2FsbF9ldmVudC5oCmluZGV4IDQ2NzYzYTMuLjRjZWM0NzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9jYWxsX2V2ZW50LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2h2X2NhbGxfZXZlbnQuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiBIdkNhbGxFdmVudC5oCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1pa2UgQ29ycmlnYW4gSUJNIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTE1LDggKzE0LDcgQEAKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKi8KLS8qCisgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSAiaHlwZXJ2aXNvciBjYWxsIiBpbnRlcmZhY2Ugd2hpY2ggaXMgdXNlZCB0bwogICogZHJpdmUgdGhlIGh5cGVydmlzb3IgZnJvbSB0aGUgT1MuCiAgKi8KQEAgLTMzLDMyICszMSw5IEBACiB0eXBlZGVmIHU4IEh2THBFdmVudF9BY2tJbmQ7CiB0eXBlZGVmIHU4IEh2THBFdmVudF9BY2tUeXBlOwogCi1zdHJ1Y3QJSHZDYWxsRXZlbnRfUGFja2VkUGFybXMgewotCXU4CQl4QWNrVHlwZToxOwotCXU4CQl4QWNrSW5kOjE7Ci0JdTgJCXhSc3ZkOjE7Ci0JdTgJCXhUYXJnZXRMcDo1OwotCXU4CQl4VHlwZTsKLQl1MTYJCXhTdWJ0eXBlOwotCUh2THBJbnN0YW5jZUlkCXhTb3VyY2VJbnN0SWQ7Ci0JSHZMcEluc3RhbmNlSWQJeFRhcmdldEluc3RJZDsKLX07Ci0KIHR5cGVkZWYgdTggSHZMcERtYV9EaXJlY3Rpb247CiB0eXBlZGVmIHU4IEh2THBEbWFfQWRkcmVzc1R5cGU7CiAKLXN0cnVjdAlIdkNhbGxFdmVudF9QYWNrZWREbWFQYXJtcyB7Ci0JdTgJCXhEaXJlY3Rpb246MTsKLQl1OAkJeExvY2FsQWRkclR5cGU6MTsKLQl1OAkJeFJlbW90ZUFkZHJUeXBlOjE7Ci0JdTgJCXhSc3ZkMTo1OwotCUh2THBJbmRleAl4UmVtb3RlTHA7Ci0JdTgJCXhUeXBlOwotCXU4CQl4UnN2ZDI7Ci0JSHZMcEluc3RhbmNlSWQJeExvY2FsSW5zdElkOwotCUh2THBJbnN0YW5jZUlkCXhSZW1vdGVJbnN0SWQ7Ci19OwotCiB0eXBlZGVmIHU2NCBIdkxwRXZlbnRfUmM7CiB0eXBlZGVmIHU2NCBIdkxwRG1hX1JjOwogCkBAIC05MiwxMSArNjcsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEV2ZW50X3NldExwRXZlbnRTdGFjayh1OCBxdWV1ZUluZGV4LAogCQljaGFyICpldmVudFN0YWNrQWRkciwgdTMyIGV2ZW50U3RhY2tTaXplKQogewotCXU2NCBhYnNfYWRkcjsKLQotCWFic19hZGRyID0gdmlydF90b19hYnMoZXZlbnRTdGFja0FkZHIpOwotCUh2Q2FsbDMoSHZDYWxsRXZlbnRTZXRMcEV2ZW50U3RhY2ssIHF1ZXVlSW5kZXgsIGFic19hZGRyLAotCQkJZXZlbnRTdGFja1NpemUpOworCUh2Q2FsbDMoSHZDYWxsRXZlbnRTZXRMcEV2ZW50U3RhY2ssIHF1ZXVlSW5kZXgsCisJCQl2aXJ0X3RvX2FicyhldmVudFN0YWNrQWRkciksIGV2ZW50U3RhY2tTaXplKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEV2ZW50X3NldExwRXZlbnRRdWV1ZUludGVycnVwdFByb2ModTggcXVldWVJbmRleCwKQEAgLTEwOCwxNCArODAsNyBAQAogCiBzdGF0aWMgaW5saW5lIEh2THBFdmVudF9SYyBIdkNhbGxFdmVudF9zaWduYWxMcEV2ZW50KHN0cnVjdCBIdkxwRXZlbnQgKmV2ZW50KQogewotCXU2NCBhYnNfYWRkcjsKLQotI2lmZGVmIERFQlVHX1NFTkRFVkVOVAotCXByaW50aygiSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudDogKmV2ZW50ID0gJTAxNmx4XG4gIiwKLQkJCSh1bnNpZ25lZCBsb25nKWV2ZW50KTsKLSNlbmRpZgotCWFic19hZGRyID0gdmlydF90b19hYnMoZXZlbnQpOwotCXJldHVybiBIdkNhbGwxKEh2Q2FsbEV2ZW50U2lnbmFsTHBFdmVudCwgYWJzX2FkZHIpOworCXJldHVybiBIdkNhbGwxKEh2Q2FsbEV2ZW50U2lnbmFsTHBFdmVudCwgdmlydF90b19hYnMoZXZlbnQpKTsKIH0KIAogc3RhdGljIGlubGluZSBIdkxwRXZlbnRfUmMgSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudEZhc3QoSHZMcEluZGV4IHRhcmdldExwLApAQCAtMTI3LDE3ICs5MiwyMSBAQAogewogCS8qIFBhY2sgdGhlIG1pc2MgYml0cyBpbnRvIGEgc2luZ2xlIER3b3JkIHRvIHBhc3MgdG8gUExJQyAqLwogCXVuaW9uIHsKLQkJc3RydWN0IEh2Q2FsbEV2ZW50X1BhY2tlZFBhcm1zCXBhcm1zOworCQlzdHJ1Y3QgeworCQkJdTgJCWFja19hbmRfdGFyZ2V0OworCQkJdTgJCXR5cGU7CisJCQl1MTYJCXN1YnR5cGU7CisJCQlIdkxwSW5zdGFuY2VJZAlzcmNfaW5zdDsKKwkJCUh2THBJbnN0YW5jZUlkCXRhcmdldF9pbnN0OworCQl9IHBhcm1zOwogCQl1NjQJCWR3b3JkOwogCX0gcGFja2VkOwotCXBhY2tlZC5wYXJtcy54QWNrVHlwZQk9IGFja1R5cGU7Ci0JcGFja2VkLnBhcm1zLnhBY2tJbmQJPSBhY2tJbmQ7Ci0JcGFja2VkLnBhcm1zLnhSc3ZkCT0gMDsKLQlwYWNrZWQucGFybXMueFRhcmdldExwCT0gdGFyZ2V0THA7Ci0JcGFja2VkLnBhcm1zLnhUeXBlCT0gdHlwZTsKLQlwYWNrZWQucGFybXMueFN1YnR5cGUJPSBzdWJ0eXBlOwotCXBhY2tlZC5wYXJtcy54U291cmNlSW5zdElkCT0gc291cmNlSW5zdGFuY2VJZDsKLQlwYWNrZWQucGFybXMueFRhcmdldEluc3RJZAk9IHRhcmdldEluc3RhbmNlSWQ7CisKKwlwYWNrZWQucGFybXMuYWNrX2FuZF90YXJnZXQgPSAoYWNrVHlwZSA8PCA3KSB8IChhY2tJbmQgPDwgNikgfCB0YXJnZXRMcDsKKwlwYWNrZWQucGFybXMudHlwZSA9IHR5cGU7CisJcGFja2VkLnBhcm1zLnN1YnR5cGUgPSBzdWJ0eXBlOworCXBhY2tlZC5wYXJtcy5zcmNfaW5zdCA9IHNvdXJjZUluc3RhbmNlSWQ7CisJcGFja2VkLnBhcm1zLnRhcmdldF9pbnN0ID0gdGFyZ2V0SW5zdGFuY2VJZDsKIAogCXJldHVybiBIdkNhbGw3KEh2Q2FsbEV2ZW50U2lnbmFsTHBFdmVudFBhcm1zLCBwYWNrZWQuZHdvcmQsCiAJCQljb3JyZWxhdGlvblRva2VuLCBldmVudERhdGExLCBldmVudERhdGEyLApAQCAtMTQ2LDE4ICsxMTUsMTIgQEAKIAogc3RhdGljIGlubGluZSBIdkxwRXZlbnRfUmMgSHZDYWxsRXZlbnRfYWNrTHBFdmVudChzdHJ1Y3QgSHZMcEV2ZW50ICpldmVudCkKIHsKLQl1NjQgYWJzX2FkZHI7Ci0KLQlhYnNfYWRkciA9IHZpcnRfdG9fYWJzKGV2ZW50KTsKLQlyZXR1cm4gSHZDYWxsMShIdkNhbGxFdmVudEFja0xwRXZlbnQsIGFic19hZGRyKTsKKwlyZXR1cm4gSHZDYWxsMShIdkNhbGxFdmVudEFja0xwRXZlbnQsIHZpcnRfdG9fYWJzKGV2ZW50KSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgSHZMcEV2ZW50X1JjIEh2Q2FsbEV2ZW50X2NhbmNlbExwRXZlbnQoc3RydWN0IEh2THBFdmVudCAqZXZlbnQpCiB7Ci0JdTY0IGFic19hZGRyOwotCi0JYWJzX2FkZHIgPSB2aXJ0X3RvX2FicyhldmVudCk7Ci0JcmV0dXJuIEh2Q2FsbDEoSHZDYWxsRXZlbnRDYW5jZWxMcEV2ZW50LCBhYnNfYWRkcik7CisJcmV0dXJuIEh2Q2FsbDEoSHZDYWxsRXZlbnRDYW5jZWxMcEV2ZW50LCB2aXJ0X3RvX2FicyhldmVudCkpOwogfQogCiBzdGF0aWMgaW5saW5lIEh2THBJbnN0YW5jZUlkIEh2Q2FsbEV2ZW50X2dldFNvdXJjZUxwSW5zdGFuY2VJZCgKQEAgLTE5NSw1OSArMTU4LDM0IEBACiB7CiAJLyogUGFjayB0aGUgbWlzYyBiaXRzIGludG8gYSBzaW5nbGUgRHdvcmQgdG8gcGFzcyB0byBQTElDICovCiAJdW5pb24gewotCQlzdHJ1Y3QgSHZDYWxsRXZlbnRfUGFja2VkRG1hUGFybXMJcGFybXM7CisJCXN0cnVjdCB7CisJCQl1OAkJZmxhZ3M7CisJCQlIdkxwSW5kZXgJcmVtb3RlOworCQkJdTgJCXR5cGU7CisJCQl1OAkJcmVzZXJ2ZWQ7CisJCQlIdkxwSW5zdGFuY2VJZAlsb2NhbF9pbnN0OworCQkJSHZMcEluc3RhbmNlSWQJcmVtb3RlX2luc3Q7CisJCX0gcGFybXM7CiAJCXU2NAkJZHdvcmQ7CiAJfSBwYWNrZWQ7CiAKLQlwYWNrZWQucGFybXMueERpcmVjdGlvbgkJPSBkaXJlY3Rpb247Ci0JcGFja2VkLnBhcm1zLnhMb2NhbEFkZHJUeXBlCT0gbG9jYWxBZGRyZXNzVHlwZTsKLQlwYWNrZWQucGFybXMueFJlbW90ZUFkZHJUeXBlCT0gcmVtb3RlQWRkcmVzc1R5cGU7Ci0JcGFja2VkLnBhcm1zLnhSc3ZkMQkJPSAwOwotCXBhY2tlZC5wYXJtcy54UmVtb3RlTHAJCT0gcmVtb3RlTHA7Ci0JcGFja2VkLnBhcm1zLnhUeXBlCQk9IHR5cGU7Ci0JcGFja2VkLnBhcm1zLnhSc3ZkMgkJPSAwOwotCXBhY2tlZC5wYXJtcy54TG9jYWxJbnN0SWQJPSBsb2NhbEluc3RhbmNlSWQ7Ci0JcGFja2VkLnBhcm1zLnhSZW1vdGVJbnN0SWQJPSByZW1vdGVJbnN0YW5jZUlkOworCXBhY2tlZC5wYXJtcy5mbGFncyA9IChkaXJlY3Rpb24gPDwgNykgfAorCQkobG9jYWxBZGRyZXNzVHlwZSA8PCA2KSB8IChyZW1vdGVBZGRyZXNzVHlwZSA8PCA1KTsKKwlwYWNrZWQucGFybXMucmVtb3RlID0gcmVtb3RlTHA7CisJcGFja2VkLnBhcm1zLnR5cGUgPSB0eXBlOworCXBhY2tlZC5wYXJtcy5yZXNlcnZlZCA9IDA7CisJcGFja2VkLnBhcm1zLmxvY2FsX2luc3QgPSBsb2NhbEluc3RhbmNlSWQ7CisJcGFja2VkLnBhcm1zLnJlbW90ZV9pbnN0ID0gcmVtb3RlSW5zdGFuY2VJZDsKIAogCXJldHVybiBIdkNhbGw0KEh2Q2FsbEV2ZW50RG1hQnVmTGlzdCwgcGFja2VkLmR3b3JkLCBsb2NhbEJ1Zkxpc3QsCiAJCQlyZW1vdGVCdWZMaXN0LCB0cmFuc2Zlckxlbmd0aCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgSHZMcERtYV9SYyBIdkNhbGxFdmVudF9kbWFTaW5nbGUoSHZMcEV2ZW50X1R5cGUgdHlwZSwKLQkJSHZMcEluZGV4IHJlbW90ZUxwLCBIdkxwRG1hX0RpcmVjdGlvbiBkaXJlY3Rpb24sCi0JCUh2THBJbnN0YW5jZUlkIGxvY2FsSW5zdGFuY2VJZCwKLQkJSHZMcEluc3RhbmNlSWQgcmVtb3RlSW5zdGFuY2VJZCwKLQkJSHZMcERtYV9BZGRyZXNzVHlwZSBsb2NhbEFkZHJlc3NUeXBlLAotCQlIdkxwRG1hX0FkZHJlc3NUeXBlIHJlbW90ZUFkZHJlc3NUeXBlLAotCQl1NjQgbG9jYWxBZGRyT3JUY2UsIHU2NCByZW1vdGVBZGRyT3JUY2UsIHUzMiB0cmFuc2Zlckxlbmd0aCkKLXsKLQkvKiBQYWNrIHRoZSBtaXNjIGJpdHMgaW50byBhIHNpbmdsZSBEd29yZCB0byBwYXNzIHRvIFBMSUMgKi8KLQl1bmlvbiB7Ci0JCXN0cnVjdCBIdkNhbGxFdmVudF9QYWNrZWREbWFQYXJtcwlwYXJtczsKLQkJdTY0CQlkd29yZDsKLQl9IHBhY2tlZDsKLQotCXBhY2tlZC5wYXJtcy54RGlyZWN0aW9uCQk9IGRpcmVjdGlvbjsKLQlwYWNrZWQucGFybXMueExvY2FsQWRkclR5cGUJPSBsb2NhbEFkZHJlc3NUeXBlOwotCXBhY2tlZC5wYXJtcy54UmVtb3RlQWRkclR5cGUJPSByZW1vdGVBZGRyZXNzVHlwZTsKLQlwYWNrZWQucGFybXMueFJzdmQxCQk9IDA7Ci0JcGFja2VkLnBhcm1zLnhSZW1vdGVMcAkJPSByZW1vdGVMcDsKLQlwYWNrZWQucGFybXMueFR5cGUJCT0gdHlwZTsKLQlwYWNrZWQucGFybXMueFJzdmQyCQk9IDA7Ci0JcGFja2VkLnBhcm1zLnhMb2NhbEluc3RJZAk9IGxvY2FsSW5zdGFuY2VJZDsKLQlwYWNrZWQucGFybXMueFJlbW90ZUluc3RJZAk9IHJlbW90ZUluc3RhbmNlSWQ7Ci0KLQlyZXR1cm4gKEh2THBEbWFfUmMpSHZDYWxsNChIdkNhbGxFdmVudERtYVNpbmdsZSwgcGFja2VkLmR3b3JkLAotCQkJbG9jYWxBZGRyT3JUY2UsIHJlbW90ZUFkZHJPclRjZSwgdHJhbnNmZXJMZW5ndGgpOwotfQotCiBzdGF0aWMgaW5saW5lIEh2THBEbWFfUmMgSHZDYWxsRXZlbnRfZG1hVG9TcCh2b2lkICpsb2NhbCwgdTMyIHJlbW90ZSwKIAkJdTMyIGxlbmd0aCwgSHZMcERtYV9EaXJlY3Rpb24gZGlyKQogewotCXU2NCBhYnNfYWRkcjsKLQotCWFic19hZGRyID0gdmlydF90b19hYnMobG9jYWwpOwotCXJldHVybiBIdkNhbGw0KEh2Q2FsbEV2ZW50RG1hVG9TcCwgYWJzX2FkZHIsIHJlbW90ZSwgbGVuZ3RoLCBkaXIpOworCXJldHVybiBIdkNhbGw0KEh2Q2FsbEV2ZW50RG1hVG9TcCwgdmlydF90b19hYnMobG9jYWwpLCByZW1vdGUsCisJCQlsZW5ndGgsIGRpcik7CiB9CiAKICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfSVNFUklFU19IVl9DQUxMX0VWRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9jYWxsX3NjLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaHZfY2FsbF9zYy5oCmluZGV4IGRlYzdlOWQuLmY1ZDIxMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9jYWxsX3NjLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2h2X2NhbGxfc2MuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiBIdkNhbGxTYy5oCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1pa2UgQ29ycmlnYW4gSUJNIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9scF9jb25maWcuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9scF9jb25maWcuaAppbmRleCBiYzAwZjAzLi5kZjhiMjA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaHZfbHBfY29uZmlnLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2h2X2xwX2NvbmZpZy5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIEh2THBDb25maWcuaAogICogQ29weXJpZ2h0IChDKSAyMDAxICBNaWtlIENvcnJpZ2FuIElCTSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaHZfbHBfZXZlbnQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9scF9ldmVudC5oCmluZGV4IDQ5OWFiMWEuLjQwNjVhNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9scF9ldmVudC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9scF9ldmVudC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIEh2THBFdmVudC5oCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1pa2UgQ29ycmlnYW4gSUJNIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTMyLDE3ICszMSw4IEBACiAgKiBwYXJ0aXRpb25zIHRocm91Z2ggUExJQy4KICAqLwogCi1zdHJ1Y3QgSHZFdmVudEZsYWdzIHsKLQl1OAl4VmFsaWQ6MTsJLyogSW5kaWNhdGVzIGEgdmFsaWQgcmVxdWVzdAl4MDAteDAwICovCi0JdTgJeFJzdmQxOjQ7CS8qIFJlc2VydmVkCQkJLi4uICovCi0JdTgJeEFja1R5cGU6MTsJLyogSW1tZWRpYXRlIG9yIGRlZmVycmVkCS4uLiAqLwotCXU4CXhBY2tJbmQ6MTsJLyogSW5kaWNhdGVzIGlmIEFDSyByZXF1aXJlZAkuLi4gKi8KLQl1OAl4RnVuY3Rpb246MTsJLyogSW50ZXJydXB0IG9yIEFja25vd2xlZGdlCS4uLiAqLwotfTsKLQotCiBzdHJ1Y3QgSHZMcEV2ZW50IHsKLQlzdHJ1Y3QgSHZFdmVudEZsYWdzIHhGbGFnczsJLyogRXZlbnQgZmxhZ3MJCSAgICAgIHgwMC14MDAgKi8KKwl1OAlmbGFnczsJCQkvKiBFdmVudCBmbGFncwkJICAgICAgeDAwLXgwMCAqLwogCXU4CXhUeXBlOwkJCS8qIFR5cGUgb2YgbWVzc2FnZQkgICAgICB4MDEteDAxICovCiAJdTE2CXhTdWJ0eXBlOwkJLyogU3VidHlwZSBmb3IgZXZlbnQJICAgICAgeDAyLXgwMyAqLwogCXU4CXhTb3VyY2VMcDsJCS8qIFNvdXJjZSBMUAkJICAgICAgeDA0LXgwNCAqLwpAQCAtMTI2LDYgKzExNiwxMSBAQAogI2RlZmluZSBIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2sgMAogI2RlZmluZSBIdkxwRXZlbnRfQWNrVHlwZV9EZWZlcnJlZEFjayAxCiAKKyNkZWZpbmUgSFZfTFBfRVZFTlRfSU5UCQkJMHgwMQorI2RlZmluZSBIVl9MUF9FVkVOVF9ET19BQ0sJCTB4MDIKKyNkZWZpbmUgSFZfTFBfRVZFTlRfREVGRVJSRURfQUNLCTB4MDQKKyNkZWZpbmUgSFZfTFBfRVZFTlRfVkFMSUQJCTB4ODAKKwogI2RlZmluZSBIdkxwRG1hX0RpcmVjdGlvbl9Mb2NhbFRvUmVtb3RlIDAKICNkZWZpbmUgSHZMcERtYV9EaXJlY3Rpb25fUmVtb3RlVG9Mb2NhbCAxCiAKQEAgLTEzOSw0ICsxMzQsMjkgQEAKICNkZWZpbmUgSHZMcERtYV9SY19JbnZhbGlkQWRkcmVzcyA0CiAjZGVmaW5lIEh2THBEbWFfUmNfSW52YWxpZExlbmd0aCA1CiAKK3N0YXRpYyBpbmxpbmUgaW50IGh2bHBldmVudF9pc192YWxpZChzdHJ1Y3QgSHZMcEV2ZW50ICpoKQoreworCXJldHVybiBoLT5mbGFncyAmIEhWX0xQX0VWRU5UX1ZBTElEOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHZscGV2ZW50X2ludmFsaWRhdGUoc3RydWN0IEh2THBFdmVudCAqaCkKK3sKKwloLT5mbGFncyAmPSB+IEhWX0xQX0VWRU5UX1ZBTElEOworfQorCitzdGF0aWMgaW5saW5lIGludCBodmxwZXZlbnRfaXNfaW50KHN0cnVjdCBIdkxwRXZlbnQgKmgpCit7CisJcmV0dXJuIGgtPmZsYWdzICYgSFZfTFBfRVZFTlRfSU5UOworfQorCitzdGF0aWMgaW5saW5lIGludCBodmxwZXZlbnRfaXNfYWNrKHN0cnVjdCBIdkxwRXZlbnQgKmgpCit7CisJcmV0dXJuICFodmxwZXZlbnRfaXNfaW50KGgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBodmxwZXZlbnRfbmVlZF9hY2soc3RydWN0IEh2THBFdmVudCAqaCkKK3sKKwlyZXR1cm4gaC0+ZmxhZ3MgJiBIVl9MUF9FVkVOVF9ET19BQ0s7Cit9CisKICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfSVNFUklFU19IVl9MUF9FVkVOVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaHZfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl90eXBlcy5oCmluZGV4IGMzOGY3ZTMuLmMzZTZkMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl90eXBlcy5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIEh2VHlwZXMuaAogICogQ29weXJpZ2h0IChDKSAyMDAxICBNaWtlIENvcnJpZ2FuIElCTSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaXNlcmllc19pby5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2lzZXJpZXNfaW8uaAppbmRleCA1NmIyMTEzLi40OTZhYTg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaXNlcmllc19pby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pc2VyaWVzX2lvLmgKQEAgLTYsNyArNiw3IEBACiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIC8qCi0gKiBGaWxlIGlTZXJpZXNfaW8uaCBjcmVhdGVkIGJ5IEFsbGFuIFRyYXV0bWFuIG9uIFRodSBEZWMgMjggMjAwMC4KKyAqIENyZWF0ZWQgYnkgQWxsYW4gVHJhdXRtYW4gb24gVGh1IERlYyAyOCAyMDAwLgogICoKICAqIFJlbWFwcyB0aGUgaW8uaCBmb3IgdGhlIGlTZXJpZXMgSW8KICAqIENvcHlyaWdodCAoQykgMjAwMCAgQWxsYW4gSCBUcmF1dG1hbiwgSUJNIENvcnBvcmF0aW9uCkBAIC0zMiw2ICszMiw3IEBACiAgKiBFbmQgQ2hhbmdlIEFjdGl2aXR5CiAgKi8KIAorI2lmZGVmIENPTkZJR19QQ0kKIGV4dGVybiB1OCAgIGlTZXJpZXNfUmVhZF9CeXRlKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqIElvQWRkcmVzcyk7CiBleHRlcm4gdTE2ICBpU2VyaWVzX1JlYWRfV29yZChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKiBJb0FkZHJlc3MpOwogZXh0ZXJuIHUzMiAgaVNlcmllc19SZWFkX0xvbmcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICogSW9BZGRyZXNzKTsKQEAgLTQ0LDYgKzQ1LDE3IEBACiAJCXNpemVfdCBuKTsKIGV4dGVybiB2b2lkIGlTZXJpZXNfbWVtY3B5X2Zyb21pbyh2b2lkICpkZXN0LAogCQljb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNvdXJjZSwgc2l6ZV90IG4pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdTggaVNlcmllc19SZWFkX0J5dGUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpJb0FkZHJlc3MpCit7CisJcmV0dXJuIDB4ZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpU2VyaWVzX1dyaXRlX0J5dGUodTggSW9EYXRhLAorCQl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKklvQWRkcmVzcykKK3sKK30KKyNlbmRpZgkvKiBDT05GSUdfUENJICovCiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfSVNFUklFU19JU0VSSUVTX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9leHBfdnBkX3BhbmVsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaXRfZXhwX3ZwZF9wYW5lbC5oCmluZGV4IDY2YTE3YTIuLjMwNGE2MDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9leHBfdnBkX3BhbmVsLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2l0X2V4cF92cGRfcGFuZWwuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiBJdEV4dFZwZFBhbmVsLmgKICAqIENvcHlyaWdodCAoQykgMjAwMiAgRGF2ZSBCb3V0Y2hlciBJQk0gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2l0X2xwX25hY2EuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9scF9uYWNhLmgKaW5kZXggYzNlZjFkZS4uNGZkY2YwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2l0X2xwX25hY2EuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaXRfbHBfbmFjYS5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIEl0THBOYWNhLmgKICAqIENvcHlyaWdodCAoQykgMjAwMSAgTWlrZSBDb3JyaWdhbiBJQk0gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMzcsMTcgKzM2LDEzIEBACiAJdTgJeExwSW5kZXg7CQkvLyBMUCBJbmRleAkJCXgwQi14MEIKIAl1MTYJeE1heExwUXVldWVzOwkJLy8gTnVtYmVyIG9mIGFsbG9jYXRlZCBxdWV1ZXMJeDBDLXgwRAogCXUxNgl4THBRdWV1ZU9mZnNldDsJCS8vIE9mZnNldCB0byBzdGFydCBvZiBMUCBxdWV1ZXMJeDBFLXgwRgotCXU4CXhQaXJFbnZpcm9uTW9kZTo4OwkvLyBQaXJhbmhhIG9yIGhhcmR3YXJlCQl4MTAteDEwCi0JdTgJeFBpckNvbnNvbGVNb2RlOjg7CS8vIFBpcmFuaGEgY29uc29sZSBpbmRpY2F0b3IJeDExLXgxMQotCXU4CXhQaXJEYXNkTW9kZTo4OwkJLy8gUGlyYW5oYSBkYXNkIGluZGljYXRvcgl4MTIteDEyCisJdTgJeFBpckVudmlyb25Nb2RlOwkvLyBQaXJhbmhhIG9yIGhhcmR3YXJlCQl4MTAteDEwCisJdTgJeFBpckNvbnNvbGVNb2RlOwkvLyBQaXJhbmhhIGNvbnNvbGUgaW5kaWNhdG9yCXgxMS14MTEKKwl1OAl4UGlyRGFzZE1vZGU7CQkvLyBQaXJhbmhhIGRhc2QgaW5kaWNhdG9yCXgxMi14MTIKIAl1OAl4UnN2ZDFfMFs1XTsJCS8vIFJlc2VydmVkIGZvciBQaXJhbmhhIHJlbGF0ZWQJeDEzLXgxNwotCXU4CXhMcGFySW5zdGFsbGVkOjE7CS8vIElzIExQQVIgaW5zdGFsbGVkIG9uIHN5c3RlbQl4MTgteDFGCi0JdTgJeFN5c1BhcnRpdGlvbmVkOjE7CS8vIElzIHRoZSBzeXN0ZW0gcGFydGl0aW9uZWQJLi4uCi0JdTgJeEh3U3luY2VkVEJzOjE7CQkvLyBIYXJkd2FyZSBzeW5jZWQgVEJzCQkuLi4KLQl1OAl4SW50UHJvY1V0aWxIbXQ6MTsJLy8gVXRpbGl6ZSBITVQgZm9yIGludGVycnVwdHMJLi4uCi0JdTgJeFJzdmQxXzE6NDsJCS8vIFJlc2VydmVkCQkJLi4uCi0JdTgJeFNwVnBkRm9ybWF0Ojg7CQkvLyBWUEQgYXJlYXMgYXJlIGluIENTUCBmb3JtYXQJLi4uCi0JdTgJeEludFByb2NSYXRpbzo4OwkvLyBSYXRpbyBvZiBpbnQgcHJvY3MgdG8gcHJvY3MJLi4uCisJdTgJZmxhZ3M7CQkJLy8gZmxhZ3MsIHNlZSBiZWxvdwkJeDE4LXgxRgorCXU4CXhTcFZwZEZvcm1hdDsJCS8vIFZQRCBhcmVhcyBhcmUgaW4gQ1NQIGZvcm1hdAkuLi4KKwl1OAl4SW50UHJvY1JhdGlvOwkJLy8gUmF0aW8gb2YgaW50IHByb2NzIHRvIHByb2NzCS4uLgogCXU4CXhSc3ZkMV8yWzVdOwkJLy8gUmVzZXJ2ZWQJCQkuLi4KIAl1MTYJeFJzdmQxXzM7CQkvLyBSZXNlcnZlZAkJCXgyMC14MjEKIAl1MTYJeFBsaWNWcm1JbmRleDsJCS8vIFZSTSBpbmRleCBvZiBQTElDCQl4MjIteDIzCkBAIC03Nyw0ICs3Miw5IEBACiAKIGV4dGVybiBzdHJ1Y3QgSXRMcE5hY2EJCWl0THBOYWNhOwogCisjZGVmaW5lIElUTFBOQUNBX0xQQVIJCTB4ODAJLyogSXMgTFBBUiBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSAqLworI2RlZmluZSBJVExQTkFDQV9QQVJUSVRJT05FRAkweDQwCS8qIElzIHRoZSBzeXN0ZW0gcGFydGl0aW9uZWQgKi8KKyNkZWZpbmUgSVRMUE5BQ0FfSFdTWU5DRURUQlMJMHgyMAkvKiBIYXJkd2FyZSBzeW5jZWQgVEJzICovCisjZGVmaW5lIElUTFBOQUNBX0hNVElOVAkJMHgxMAkvKiBVdGlsaXplIE1IVCBmb3IgaW50ZXJydXB0cyAqLworCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0lTRVJJRVNfSVRfTFBfTkFDQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaXRfbHBfcXVldWUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9scF9xdWV1ZS5oCmluZGV4IGE2MGQwM2EuLmI3YzZmYzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9scF9xdWV1ZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9scF9xdWV1ZS5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIEl0THBRdWV1ZS5oCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1pa2UgQ29ycmlnYW4gSUJNIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9scF9yZWdfc2F2ZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2l0X2xwX3JlZ19zYXZlLmgKaW5kZXggODE4MjRlMS4uNTQwM2I3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2l0X2xwX3JlZ19zYXZlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2l0X2xwX3JlZ19zYXZlLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICogSXRMcFJlZ1NhdmUuaAogICogQ29weXJpZ2h0IChDKSAyMDAxICBNaWtlIENvcnJpZ2FuIElCTSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC04Myw0ICs4Miw0IEBACiAKIGV4dGVybiBzdHJ1Y3QgSXRMcFJlZ1NhdmUgaXNlcmllc19yZWdfc2F2ZVtdOwogCi0jZW5kaWYgLyogX0lUTFBSRUdTQVZFX0ggKi8KKyNlbmRpZiAvKiBfQVNNX1BPV0VSUENfSVNFUklFU19JVF9MUF9SRUdfU0FWRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvbHBhcl9tYXAuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9scGFyX21hcC5oCmluZGV4IDg0ZmMzMjEuLjJlYzM4NGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9scGFyX21hcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9scGFyX21hcC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIExwYXJNYXAuaAogICogQ29weXJpZ2h0IChDKSAyMDAxICBNaWtlIENvcnJpZ2FuIElCTSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvbWYuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9tZi5oCmluZGV4IGU3YmQ1N2EuLjg1N2U1MjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9tZi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9tZi5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIG1mLmgKICAqIENvcHlyaWdodCAoQykgMjAwMSAgVHJveSBELiBBcm1zdHJvbmcgSUJNIENvcnBvcmF0aW9uCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgIFN0ZXBoZW4gUm90aHdlbGwgSUJNIENvcnBvcmF0aW9uCiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL3Zpby5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL3Zpby5oCmluZGV4IDdlM2E0NjkuLjcyYTk3ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy92aW8uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvdmlvLmgKQEAgLTEsNSArMSw0IEBACiAvKiAtKi0gbGludXgtYyAtKi0KLSAqICBkcml2ZXJzL2NoYXIvdmlvLmgKICAqCiAgKiAgaVNlcmllcyBWaXJ0dWFsIEkvTyBNZXNzYWdlIFBhdGggaGVhZGVyCiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9scHBhY2EuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbHBwYWNhLmgKaW5kZXggZmY4MmVhNy4uY2Q5ZjExZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9scHBhY2EuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2xwcGFjYS5oCkBAIC0yOSw3ICsyOSw5IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAotc3RydWN0IGxwcGFjYSB7CisvKiBUaGUgSHlwZXJ2aXNvciBiYXJmcyBpZiB0aGUgbHBwYWNhIGNyb3NzZXMgYSBwYWdlIGJvdW5kYXJ5LiAgQSAxaworICogYWxpZ25tZW50IGlzIHN1ZmZpY2llbnQgdG8gcHJldmVudCB0aGlzICovCitzdHJ1Y3QgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oMHg0MDApKSkgbHBwYWNhIHsKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIENBQ0hFX0xJTkVfMSAweDAwMDAgLSAweDAwN0YgQ29udGFpbnMgcmVhZC1vbmx5IGRhdGEKIC8vIE5PVEU6IFRoZSB4RHluWHl6IGZpZWxkcyBhcmUgZmllbGRzIHRoYXQgd2lsbCBiZSBkeW5hbWljYWxseSBjaGFuZ2VkIGJ5CkBAIC0xMjksNSArMTMxLDcgQEAKIAl1OAlwbWNfc2F2ZV9hcmVhWzI1Nl07CS8vIFBNQyBpbnRlcnJ1cHQgQXJlYSAgICAgICAgICAgeDAwLXhGRgogfTsKIAorZXh0ZXJuIHN0cnVjdCBscHBhY2EgbHBwYWNhW107CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0xQUEFDQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhY2EuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFjYS5oCmluZGV4IGE2NGI0ZDQuLmM5YWRkOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFjYS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFjYS5oCkBAIC0yMyw2ICsyMyw3IEBACiAKIHJlZ2lzdGVyIHN0cnVjdCBwYWNhX3N0cnVjdCAqbG9jYWxfcGFjYSBhc20oInIxMyIpOwogI2RlZmluZSBnZXRfcGFjYSgpCWxvY2FsX3BhY2EKKyNkZWZpbmUgZ2V0X2xwcGFjYSgpCShnZXRfcGFjYSgpLT5scHBhY2FfcHRyKQogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiAKQEAgLTk1LDE5ICs5Niw2IEBACiAJdTY0IHNhdmVkX3IxOwkJCS8qIHIxIHNhdmUgZm9yIFJUQVMgY2FsbHMgKi8KIAl1NjQgc2F2ZWRfbXNyOwkJCS8qIE1TUiBzYXZlZCBoZXJlIGJ5IGVudGVyX3J0YXMgKi8KIAl1OCBwcm9jX2VuYWJsZWQ7CQkvKiBpcnEgc29mdC1lbmFibGUgZmxhZyAqLwotCi0JLyoKLQkgKiBpU2VyaWVzIHN0cnVjdHVyZSB3aGljaCB0aGUgaHlwZXJ2aXNvciBrbm93cyBhYm91dCAtCi0JICogdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIG5vdCBjcm9zcyBhIHBhZ2UgYm91bmRhcnkuCi0JICogVGhlIHZwYV9pbml0L3JlZ2lzdGVyX3ZwYSBjYWxsIGlzIG5vdyBrbm93biB0byBmYWlsIGlmIHRoZQotCSAqIGxwcGFjYSBzdHJ1Y3R1cmUgY3Jvc3NlcyBhIHBhZ2UgYm91bmRhcnkuCi0JICogVGhlIGxwcGFjYSBpcyBhbHNvIHVzZWQgb24gUE9XRVI1IHBTZXJpZXMgYm94ZXMuCi0JICogVGhlIGxwcGFjYSBpcyA2NDAgYnl0ZXMgbG9uZywgYW5kIGNhbm5vdCByZWFkaWx5IGNoYW5nZQotCSAqIHNpbmNlIHRoZSBoeXBlcnZpc29yIGtub3dzIGl0cyBsYXlvdXQsIHNvIGEgMWtCCi0JICogYWxpZ25tZW50IHdpbGwgc3VmZmljZSB0byBlbnN1cmUgdGhhdCBpdCBkb2Vzbid0Ci0JICogY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LgotCSAqLwotCXN0cnVjdCBscHBhY2EgbHBwYWNhIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDB4NDAwKSkpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBwYWNhX3N0cnVjdCBwYWNhW107CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS1icmlkZ2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCmluZGV4IGIwZDgxNmYuLjM4ZGU5MmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCkBAIC0xNDIsOCArMTQyLDYgQEAKIAogZXh0ZXJuIGludCBwY2liaW9zX3JlbW92ZV9yb290X2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYik7CiAKLWV4dGVybiB2b2lkIHBoYnNfcmVtYXBfaW8odm9pZCk7Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBjaV9jb250cm9sbGVyICpwY2lfYnVzX3RvX2hvc3Qoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmJ1c2RuID0gYnVzLT5zeXNkYXRhOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGNfYXNtLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwY19hc20uaAppbmRleCAwZGM3OThkLi5hYjg2ODhkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwY19hc20uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwY19hc20uaApAQCAtMTU2LDUyICsxNTYsNTYgQEAKICNlbmRpZgogCiAvKiAKLSAqIExPQURBRERSKCBybiwgbmFtZSApCi0gKiAgIGxvYWRzIHRoZSBhZGRyZXNzIG9mICduYW1lJyBpbnRvICdybicKKyAqIExPQURfUkVHX0lNTUVESUFURShybiwgZXhwcikKKyAqICAgTG9hZHMgdGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudCBleHByZXNzaW9uICdleHByJyBpbnRvIHJlZ2lzdGVyICdybicKKyAqICAgdXNpbmcgaW1tZWRpYXRlIGluc3RydWN0aW9ucyBvbmx5LiAgVXNlIHRoaXMgd2hlbiBpdCdzIGltcG9ydGFudCBub3QKKyAqICAgdG8gcmVmZXJlbmNlIG90aGVyIGRhdGEgKGkuZS4gb24gcHBjNjQgd2hlbiB0aGUgVE9DIHBvaW50ZXIgaXMgbm90CisgKiAgIHZhbGlkKS4KICAqCi0gKiBMT0FEQkFTRSggcm4sIG5hbWUgKQotICogICBsb2FkcyB0aGUgYWRkcmVzcyAocG9zc2libHkgd2l0aG91dCB0aGUgbG93IDE2IGJpdHMpIG9mICduYW1lJyBpbnRvICdybicKLSAqICAgc3VpdGFibGUgZm9yIGJhc2UrZGlzcCBhZGRyZXNzaW5nCisgKiBMT0FEX1JFR19BRERSKHJuLCBuYW1lKQorICogICBMb2FkcyB0aGUgYWRkcmVzcyBvZiBsYWJlbCAnbmFtZScgaW50byByZWdpc3RlciAncm4nLiAgVXNlIHRoaXMgd2hlbgorICogICB5b3UgZG9uJ3QgcGFydGljdWxhcmx5IG5lZWQgaW1tZWRpYXRlIGluc3RydWN0aW9ucyBvbmx5LCBidXQgeW91IG5lZWQKKyAqICAgdGhlIHdob2xlIGFkZHJlc3MgaW4gb25lIHJlZ2lzdGVyIChlLmcuIGl0J3MgYSBzdHJ1Y3R1cmUgYWRkcmVzcyBhbmQKKyAqICAgeW91IHdhbnQgdG8gYWNjZXNzIHZhcmlvdXMgb2Zmc2V0cyB3aXRoaW4gaXQpLiAgT24gcHBjMzIgdGhpcyBpcworICogICBpZGVudGljYWwgdG8gTE9BRF9SRUdfSU1NRURJQVRFLgorICoKKyAqIExPQURfUkVHX0FERFJCQVNFKHJuLCBuYW1lKQorICogQUREUk9GRihuYW1lKQorICogICBMT0FEX1JFR19BRERSQkFTRSBsb2FkcyBwYXJ0IG9mIHRoZSBhZGRyZXNzIG9mIGxhYmVsICduYW1lJyBpbnRvCisgKiAgIHJlZ2lzdGVyICdybicuICBBRERST0ZGKG5hbWUpIHJldHVybnMgdGhlIHJlbWFpbmRlciBvZiB0aGUgYWRkcmVzcyBhcworICogICBhIGNvbnN0YW50IGV4cHJlc3Npb24uICBBRERST0ZGKG5hbWUpIGlzIGEgc2lnbmVkIGV4cHJlc3Npb24gPCAxNiBiaXRzCisgKiAgIGluIHNpemUsIHNvIGlzIHN1aXRhYmxlIGZvciB1c2UgZGlyZWN0bHkgYXMgYW4gb2Zmc2V0IGluIGxvYWQgYW5kIHN0b3JlCisgKiAgIGluc3RydWN0aW9ucy4gIFVzZSB0aGlzIHdoZW4gbG9hZGluZy9zdG9yaW5nIGEgc2luZ2xlIHdvcmQgb3IgbGVzcyBhczoKKyAqICAgICAgTE9BRF9SRUdfQUREUkJBU0UoclgsIG5hbWUpCisgKiAgICAgIGxkCXJZLEFERFJPRkYobmFtZSkoclgpCiAgKi8KICNpZmRlZiBfX3Bvd2VycGM2NF9fCi0jZGVmaW5lIExPQURBRERSKHJuLG5hbWUpIFwKLQlsaXMJcm4sbmFtZSMjQGhpZ2hlc3Q7CVwKLQlvcmkJcm4scm4sbmFtZSMjQGhpZ2hlcjsJXAotCXJsZGljcglybixybiwzMiwzMTsJCVwKLQlvcmlzCXJuLHJuLG5hbWUjI0BoOwkJXAotCW9yaQlybixybixuYW1lIyNAbAorI2RlZmluZSBMT0FEX1JFR19JTU1FRElBVEUocmVnLGV4cHIpCQlcCisJbGlzICAgICAocmVnKSwoZXhwcilAaGlnaGVzdDsJCVwKKwlvcmkgICAgIChyZWcpLChyZWcpLChleHByKUBoaWdoZXI7CVwKKwlybGRpY3IgIChyZWcpLChyZWcpLDMyLDMxOwkJXAorCW9yaXMgICAgKHJlZyksKHJlZyksKGV4cHIpQGg7CQlcCisJb3JpICAgICAocmVnKSwocmVnKSwoZXhwcilAbDsKIAotI2RlZmluZSBMT0FEQkFTRShybixuYW1lKQkJXAotCWxkCXJuLG5hbWVAZ290KHIyKQorI2RlZmluZSBMT0FEX1JFR19BRERSKHJlZyxuYW1lKQkJCVwKKwlsZAkocmVnKSxuYW1lQGdvdChyMikKIAotI2RlZmluZSBPRkYobmFtZSkJMAotCi0jZGVmaW5lIFNFVF9SRUdfVE9fQ09OU1QocmVnLCB2YWx1ZSkJICAgICAgICAgCVwKLQlsaXMgICAgIHJlZywoKCh2YWx1ZSk+PjQ4KSYweEZGRkYpOyAgICAgICAgICAgICBcCi0Jb3JpICAgICByZWcscmVnLCgoKHZhbHVlKT4+MzIpJjB4RkZGRik7ICAgICAgICAgXAotCXJsZGljciAgcmVnLHJlZywzMiwzMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlvcmlzICAgIHJlZyxyZWcsKCgodmFsdWUpPj4xNikmMHhGRkZGKTsgICAgICAgICBcCi0Jb3JpICAgICByZWcscmVnLCgodmFsdWUpJjB4RkZGRik7Ci0KLSNkZWZpbmUgU0VUX1JFR19UT19MQUJFTChyZWcsIGxhYmVsKQkgICAgICAgICAJXAotCWxpcyAgICAgcmVnLChsYWJlbClAaGlnaGVzdDsgICAgICAgICAgICAgICAgICAgIFwKLQlvcmkgICAgIHJlZyxyZWcsKGxhYmVsKUBoaWdoZXI7ICAgICAgICAgICAgICAgICBcCi0JcmxkaWNyICByZWcscmVnLDMyLDMxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCW9yaXMgICAgcmVnLHJlZywobGFiZWwpQGg7ICAgICAgICAgICAgICAgICAgICAgIFwKLQlvcmkgICAgIHJlZyxyZWcsKGxhYmVsKUBsOworI2RlZmluZSBMT0FEX1JFR19BRERSQkFTRShyZWcsbmFtZSkJTE9BRF9SRUdfQUREUihyZWcsbmFtZSkKKyNkZWZpbmUgQUREUk9GRihuYW1lKQkJCTAKIAogLyogb2Zmc2V0cyBmb3Igc3RhY2sgZnJhbWUgbGF5b3V0ICovCiAjZGVmaW5lIExSU0FWRQkxNgogCiAjZWxzZSAvKiAzMi1iaXQgKi8KLSNkZWZpbmUgTE9BREFERFIocm4sbmFtZSkgXAotCWxpcwlybixuYW1lQGhhOwlcCi0JYWRkaQlybixybixuYW1lQGwKIAotI2RlZmluZSBMT0FEQkFTRShybixuYW1lKQlcCi0JbGlzCXJuLG5hbWVAaGEKKyNkZWZpbmUgTE9BRF9SRUdfSU1NRURJQVRFKHJlZyxleHByKQkJXAorCWxpcwkocmVnKSwoZXhwcilAaGE7CQlcCisJYWRkaQkocmVnKSwocmVnKSwoZXhwcilAbDsKIAotI2RlZmluZSBPRkYobmFtZSkJbmFtZUBsCisjZGVmaW5lIExPQURfUkVHX0FERFIocmVnLG5hbWUpCQlMT0FEX1JFR19JTU1FRElBVEUocmVnLCBuYW1lKQorCisjZGVmaW5lIExPQURfUkVHX0FERFJCQVNFKHJlZywgbmFtZSkJbGlzCShyZWcpLG5hbWVAaGEKKyNkZWZpbmUgQUREUk9GRihuYW1lKQkJCW5hbWVAbAogCiAvKiBvZmZzZXRzIGZvciBzdGFjayBmcmFtZSBsYXlvdXQgKi8KICNkZWZpbmUgTFJTQVZFCTQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKaW5kZXggMzI5ZTliZi4uNWIyYmQ0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKQEAgLTg3LDYgKzg3LDcgQEAKIAljaGFyCSpmdWxsX25hbWU7CiAKIAlzdHJ1Y3QJcHJvcGVydHkgKnByb3BlcnRpZXM7CisJc3RydWN0ICBwcm9wZXJ0eSAqZGVhZHByb3BzOyAvKiByZW1vdmVkIHByb3BlcnRpZXMgKi8KIAlzdHJ1Y3QJZGV2aWNlX25vZGUgKnBhcmVudDsKIAlzdHJ1Y3QJZGV2aWNlX25vZGUgKmNoaWxkOwogCXN0cnVjdAlkZXZpY2Vfbm9kZSAqc2libGluZzsKQEAgLTEzNSw2ICsxMzYsOSBAQAogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ2V0X3BhcmVudChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ2V0X25leHRfY2hpbGQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAogCQkJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldik7CitleHRlcm4gc3RydWN0IHByb3BlcnR5ICpvZl9maW5kX3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgaW50ICpsZW5wKTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGVfZ2V0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CiBleHRlcm4gdm9pZCBvZl9ub2RlX3B1dChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOwogCkBAIC0xNjQsNiArMTY4LDEwIEBACiBleHRlcm4gaW50IHByb21fbl9pbnRyX2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSogbnApOwogZXh0ZXJuIHZvaWQgcHJvbV9nZXRfaXJxX3NlbnNlcyh1bnNpZ25lZCBjaGFyICpzZW5zZXMsIGludCBvZmYsIGludCBtYXgpOwogZXh0ZXJuIGludCBwcm9tX2FkZF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5wLCBzdHJ1Y3QgcHJvcGVydHkqIHByb3ApOworZXh0ZXJuIGludCBwcm9tX3JlbW92ZV9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApOworZXh0ZXJuIGludCBwcm9tX3VwZGF0ZV9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCXN0cnVjdCBwcm9wZXJ0eSAqbmV3cHJvcCwKKwkJCQlzdHJ1Y3QgcHJvcGVydHkgKm9sZHByb3ApOwogCiAjaWZkZWYgQ09ORklHX1BQQzMyCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcGlubG9jay5oCmluZGV4IDc1NDkwMDkuLjg5NWNiNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwaW5sb2NrLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogCXRva2VuID0gTE9DS19UT0tFTjsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLSIxOglsd2FyeAkJJTAsMCwlMgkJIyBfX3NwaW5fdHJ5bG9ja1xuXAorIjE6CWx3YXJ4CQklMCwwLCUyXG5cCiAJY21wd2kJCTAsJTAsMFxuXAogCWJuZS0JCTJmXG5cCiAJc3R3Y3guCQklMSwwLCUyXG5cCkBAIC04MCw3ICs4MCw3IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfU1BMUEFSKSB8fCBkZWZpbmVkKENPTkZJR19QUENfSVNFUklFUykKIC8qIFdlIG9ubHkgeWllbGQgdG8gdGhlIGh5cGVydmlzb3IgaWYgd2UgYXJlIGluIHNoYXJlZCBwcm9jZXNzb3IgbW9kZSAqLwotI2RlZmluZSBTSEFSRURfUFJPQ0VTU09SIChnZXRfcGFjYSgpLT5scHBhY2Euc2hhcmVkX3Byb2MpCisjZGVmaW5lIFNIQVJFRF9QUk9DRVNTT1IgKGdldF9scHBhY2EoKS0+c2hhcmVkX3Byb2MpCiBleHRlcm4gdm9pZCBfX3NwaW5feWllbGQocmF3X3NwaW5sb2NrX3QgKmxvY2spOwogZXh0ZXJuIHZvaWQgX19yd195aWVsZChyYXdfcndsb2NrX3QgKmxvY2spOwogI2Vsc2UgLyogU1BMUEFSIHx8IElTRVJJRVMgKi8KQEAgLTEyNCw4ICsxMjQsOCBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewotCV9fYXNtX18gX192b2xhdGlsZV9fKFNZTkNfT05fU01QIgkjIF9fcmF3X3NwaW5fdW5sb2NrIgotCQkJICAgICA6IDogOiJtZW1vcnkiKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiIyBfX3Jhd19zcGluX3VubG9ja1xuXHQiCisJCQkJTFdTWU5DX09OX1NNUDogOiA6Im1lbW9yeSIpOwogCWxvY2stPnNsb2NrID0gMDsKIH0KIApAQCAtMTY3LDcgKzE2Nyw3IEBACiAJbG9uZyB0bXA7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLSIxOglsd2FyeAkJJTAsMCwlMQkJIyByZWFkX3RyeWxvY2tcbiIKKyIxOglsd2FyeAkJJTAsMCwlMVxuIgogCV9fRE9fU0lHTl9FWFRFTkQKICIJYWRkaWMuCQklMCwlMCwxXG5cCiAJYmxlLQkJMmZcbiIKQEAgLTE5Miw3ICsxOTIsNyBAQAogCiAJdG9rZW4gPSBXUkxPQ0tfVE9LRU47CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iMToJbHdhcngJCSUwLDAsJTIJIyB3cml0ZV90cnlsb2NrXG5cCisiMToJbHdhcngJCSUwLDAsJTJcblwKIAljbXB3aQkJMCwlMCwwXG5cCiAJYm5lLQkJMmZcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMSkKQEAgLTI0OSw4ICsyNDksOSBAQAogCWxvbmcgdG1wOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JImVpZWlvCQkJCSMgcmVhZF91bmxvY2tcblwKLTE6CWx3YXJ4CQklMCwwLCUxXG5cCisJIiMgcmVhZF91bmxvY2tcblx0IgorCUxXU1lOQ19PTl9TTVAKKyIxOglsd2FyeAkJJTAsMCwlMVxuXAogCWFkZGljCQklMCwlMCwtMVxuIgogCVBQQzQwNV9FUlI3NygwLCUxKQogIglzdHdjeC4JCSUwLDAsJTFcblwKQEAgLTI2Miw4ICsyNjMsOCBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fcmF3X3dyaXRlX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewotCV9fYXNtX18gX192b2xhdGlsZV9fKFNZTkNfT05fU01QIgkjIHdyaXRlX3VubG9jayIKLQkJCSAgICAgOiA6IDoibWVtb3J5Iik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIiMgd3JpdGVfdW5sb2NrXG5cdCIKKwkJCQlMV1NZTkNfT05fU01QOiA6IDoibWVtb3J5Iik7CiAJcnctPmxvY2sgPSAwOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5bmNoLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5bmNoLmgKaW5kZXggNzk0ODcwYS4uYzkwZDlkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeW5jaC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3luY2guaApAQCAtMiw2ICsyLDggQEAKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1NZTkNIX0ggCiAjaWZkZWYgX19LRVJORUxfXwogCisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisKICNpZmRlZiBfX3Bvd2VycGM2NF9fCiAjZGVmaW5lIF9fU1VCQVJDSF9IQVNfTFdTWU5DCiAjZW5kaWYKQEAgLTEyLDIwICsxNCwxMiBAQAogIyAgICBkZWZpbmUgTFdTWU5DCXN5bmMKICNlbmRpZgogCi0KLS8qCi0gKiBBcmd1YWJseSB0aGUgYml0b3BzIGFuZCAqeGNoZyBvcGVyYXRpb25zIGRvbid0IGltcGx5IGFueSBtZW1vcnkgYmFycmllcgotICogb3IgU01QIG9yZGVyaW5nLCBidXQgaW4gZmFjdCBhIGxvdCBvZiBkcml2ZXJzIGV4cGVjdCB0aGVtIHRvIGltcGx5Ci0gKiBib3RoLCBzaW5jZSB0aGV5IGRvIG9uIHg4NiBjcHVzLgotICovCiAjaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBFSUVJT19PTl9TTVAJImVpZWlvXG4iCiAjZGVmaW5lIElTWU5DX09OX1NNUAkiXG5cdGlzeW5jIgotI2RlZmluZSBTWU5DX09OX1NNUAlfX3N0cmluZ2lmeShMV1NZTkMpICJcbiIKKyNkZWZpbmUgTFdTWU5DX09OX1NNUAlfX3N0cmluZ2lmeShMV1NZTkMpICJcbiIKICNlbHNlCi0jZGVmaW5lIEVJRUlPX09OX1NNUAogI2RlZmluZSBJU1lOQ19PTl9TTVAKLSNkZWZpbmUgU1lOQ19PTl9TTVAKKyNkZWZpbmUgTFdTWU5DX09OX1NNUAogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlaWVpbyh2b2lkKQpAQCAtMzgsMTQgKzMyLDUgQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlzeW5jIiA6IDogOiAibWVtb3J5Iik7CiB9CiAKLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIGVpZWlvX29uX3NtcCgpCWVpZWlvKCkKLSNkZWZpbmUgaXN5bmNfb25fc21wKCkJaXN5bmMoKQotI2Vsc2UKLSNkZWZpbmUgZWllaW9fb25fc21wKCkJX19hc21fXyBfX3ZvbGF0aWxlX18oIiI6IDogOiJtZW1vcnkiKQotI2RlZmluZSBpc3luY19vbl9zbXAoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjogOiA6Im1lbW9yeSIpCi0jZW5kaWYKLQogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgkvKiBfQVNNX1BPV0VSUENfU1lOQ0hfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaAppbmRleCAwYzU4ZTMyLi5kOWJmNTM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmgKQEAgLTEzMyw2ICsxMzMsMTQgQEAKIGV4dGVybiB2b2lkIGN2dF9mZChmbG9hdCAqZnJvbSwgZG91YmxlICp0bywgc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCk7CiBleHRlcm4gdm9pZCBjdnRfZGYoZG91YmxlICpmcm9tLCBmbG9hdCAqdG8sIHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQpOwogCisjaWZuZGVmIENPTkZJR19TTVAKK2V4dGVybiB2b2lkIGRpc2NhcmRfbGF6eV9jcHVfc3RhdGUodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRpc2NhcmRfbGF6eV9jcHVfc3RhdGUodm9pZCkKK3sKK30KKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKIGV4dGVybiB2b2lkIGZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKICNlbHNlCkBAIC0xNzUsNiArMTgzLDE2IEBACiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpfc3dpdGNoKHN0cnVjdCB0aHJlYWRfc3RydWN0ICpwcmV2LAogCQkJCSAgIHN0cnVjdCB0aHJlYWRfc3RydWN0ICpuZXh0KTsKIAorLyoKKyAqIE9uIFNNUCBzeXN0ZW1zLCB3aGVuIHRoZSBzY2hlZHVsZXIgZG9lcyBtaWdyYXRpb24tY29zdCBhdXRvZGV0ZWN0aW9uLAorICogaXQgbmVlZHMgYSB3YXkgdG8gZmx1c2ggYXMgbXVjaCBvZiB0aGUgQ1BVJ3MgY2FjaGVzIGFzIHBvc3NpYmxlLgorICoKKyAqIFRPRE86IGZpbGwgdGhpcyBpbiEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2NhY2hlZmx1c2godm9pZCkKK3sKK30KKwogZXh0ZXJuIHVuc2lnbmVkIGludCBydGFzX2RhdGE7CiBleHRlcm4gaW50IG1lbV9pbml0X2RvbmU7CS8qIHNldCBvbiBib290IG9uY2Uga21hbGxvYyBjYW4gYmUgY2FsbGVkICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1vcnlfbGltaXQ7CkBAIC0xOTQsNyArMjEyLDcgQEAKIAl1bnNpZ25lZCBsb25nIHByZXY7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbHdhcngJJTAsMCwlMiBcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMikKICIJc3R3Y3guCSUzLDAsJTIgXG5cCkBAIC0yMTQsNyArMjMyLDcgQEAKIAl1bnNpZ25lZCBsb25nIHByZXY7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbGRhcngJJTAsMCwlMiBcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMikKICIJc3RkY3guCSUzLDAsJTIgXG5cCkBAIC0yNjksNyArMjg3LDcgQEAKIAl1bnNpZ25lZCBpbnQgcHJldjsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbHdhcngJJTAsMCwlMgkJIyBfX2NtcHhjaGdfdTMyXG5cCiAJY21wdwkwLCUwLCUzXG5cCiAJYm5lLQkyZlxuIgpAQCAtMjkzLDcgKzMxMSw3IEBACiAJdW5zaWduZWQgbG9uZyBwcmV2OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsZGFyeAklMCwwLCUyCQkjIF9fY21weGNoZ191NjRcblwKIAljbXBkCTAsJTAsJTNcblwKIAlibmUtCTJmXG5cCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RocmVhZF9pbmZvLmgKaW5kZXggYWMxZTgwZS4uN2UwOWQ3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGhyZWFkX2luZm8uaApAQCAtODksOSArODksNiBAQAogCiAjZW5kaWYgLyogVEhSRUFEX1NISUZUIDwgUEFHRV9TSElGVCAqLwogCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkJZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkJcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0KIC8qIGhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBDICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWRfaW5mbyh2b2lkKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1lLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWUuaAppbmRleCBkOWI4NmExLi5iYWRkYzlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWUuaApAQCAtMTc1LDExICsxNzUsMTAgQEAKIAlzZXRfZGVjX2NwdTYodmFsKTsKICNlbHNlCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0Jc3RydWN0IHBhY2Ffc3RydWN0ICpscGFjYSA9IGdldF9wYWNhKCk7CiAJaW50IGN1cl9kZWM7CiAKLQlpZiAobHBhY2EtPmxwcGFjYS5zaGFyZWRfcHJvYykgewotCQlscGFjYS0+bHBwYWNhLnZpcnR1YWxfZGVjciA9IHZhbDsKKwlpZiAoZ2V0X2xwcGFjYSgpLT5zaGFyZWRfcHJvYykgeworCQlnZXRfbHBwYWNhKCktPnZpcnR1YWxfZGVjciA9IHZhbDsKIAkJY3VyX2RlYyA9IGdldF9kZWMoKTsKIAkJaWYgKGN1cl9kZWMgPiB2YWwpCiAJCQlIdkNhbGxfc2V0VmlydHVhbERlY3IoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdG9wb2xvZ3kuaAppbmRleCA5ZjNkNGRhLi4xZTE5Y2QwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90b3BvbG9neS5oCkBAIC0zOSw3ICszOSw2IEBACiAJLm1heF9pbnRlcnZhbAkJPSAzMiwJCQlcCiAJLmJ1c3lfZmFjdG9yCQk9IDMyLAkJCVwKIAkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAotCS5jYWNoZV9ob3RfdGltZQkJPSAoMTAqMTAwMDAwMCksCQlcCiAJLmNhY2hlX25pY2VfdHJpZXMJPSAxLAkJCVwKIAkucGVyX2NwdV9nYWluCQk9IDEwMCwJCQlcCiAJLmJ1c3lfaWR4CQk9IDMsCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tcHBjL3N5c3RlbS5oCmluZGV4IGJkOTljYjUuLmZiNDljMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvc3lzdGVtLmgKQEAgLTQsNyArNCw2IEBACiAjaWZuZGVmIF9fUFBDX1NZU1RFTV9ICiAjZGVmaW5lIF9fUFBDX1NZU1RFTV9ICiAKLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KQEAgLTM5LDcgKzM4LDcgQEAKICNpZmRlZiBDT05GSUdfU01QCiAjZGVmaW5lIHNtcF9tYigpCW1iKCkKICNkZWZpbmUgc21wX3JtYigpCXJtYigpCi0jZGVmaW5lIHNtcF93bWIoKQl3bWIoKQorI2RlZmluZSBzbXBfd21iKCkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpCiAjZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCXJlYWRfYmFycmllcl9kZXBlbmRzKCkKICNlbHNlCiAjZGVmaW5lIHNtcF9tYigpCWJhcnJpZXIoKQpAQCAtNzQsNiArNzMsNyBAQAogZXh0ZXJuIHZvaWQgcmVhZF9ydGNfdGltZSh2b2lkKTsKIGV4dGVybiB2b2lkIHBtYWNfZmluZF9kaXNwbGF5KHZvaWQpOwogZXh0ZXJuIHZvaWQgZ2l2ZXVwX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBkaXNhYmxlX2tlcm5lbF9mcCh2b2lkKTsKIGV4dGVybiB2b2lkIGVuYWJsZV9rZXJuZWxfZnAodm9pZCk7CiBleHRlcm4gdm9pZCBmbHVzaF9mcF90b190aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgZW5hYmxlX2tlcm5lbF9hbHRpdmVjKHZvaWQpOwpAQCAtODYsNiArODYsMTQgQEAKIGV4dGVybiB2b2lkIGN2dF9mZChmbG9hdCAqZnJvbSwgZG91YmxlICp0bywgc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCk7CiBleHRlcm4gdm9pZCBjdnRfZGYoZG91YmxlICpmcm9tLCBmbG9hdCAqdG8sIHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQpOwogCisjaWZuZGVmIENPTkZJR19TTVAKK2V4dGVybiB2b2lkIGRpc2NhcmRfbGF6eV9jcHVfc3RhdGUodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRpc2NhcmRfbGF6eV9jcHVfc3RhdGUodm9pZCkKK3sKK30KKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKIGV4dGVybiB2b2lkIGZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKICNlbHNlCkBAIC0xMjMsNiArMTMxLDE2IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICopOwogI2RlZmluZSBzd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkJKChsYXN0KSA9IF9fc3dpdGNoX3RvKChwcmV2KSwgKG5leHQpKSkKIAorLyoKKyAqIE9uIFNNUCBzeXN0ZW1zLCB3aGVuIHRoZSBzY2hlZHVsZXIgZG9lcyBtaWdyYXRpb24tY29zdCBhdXRvZGV0ZWN0aW9uLAorICogaXQgbmVlZHMgYSB3YXkgdG8gZmx1c2ggYXMgbXVjaCBvZiB0aGUgQ1BVJ3MgY2FjaGVzIGFzIHBvc3NpYmxlLgorICoKKyAqIFRPRE86IGZpbGwgdGhpcyBpbiEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2NhY2hlZmx1c2godm9pZCkKK3sKK30KKwogc3RydWN0IHRocmVhZF9zdHJ1Y3Q7CiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpfc3dpdGNoKHN0cnVjdCB0aHJlYWRfc3RydWN0ICpwcmV2LAogCQkJCSAgIHN0cnVjdCB0aHJlYWRfc3RydWN0ICpuZXh0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvZWxmLmggYi9pbmNsdWRlL2FzbS1zMzkwL2VsZi5oCmluZGV4IDM3MmQ1MWMuLjcxMDY0NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9lbGYuaApAQCAtMTYzLDcgKzE2Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGR1bXBfdGFza19yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBlbGZfZ3JlZ3NldF90ICpyZWdzKQogewotCXN0cnVjdCBwdF9yZWdzICpwdHJlZ3MgPSBfX0tTVEtfUFRSRUdTKHRzayk7CisJc3RydWN0IHB0X3JlZ3MgKnB0cmVncyA9IHRhc2tfcHRfcmVncyh0c2spOwogCW1lbWNweSgmcmVncy0+cHN3LCAmcHRyZWdzLT5wc3csIHNpemVvZihyZWdzLT5wc3cpK3NpemVvZihyZWdzLT5ncHJzKSk7CiAJbWVtY3B5KHJlZ3MtPmFjcnMsIHRzay0+dGhyZWFkLmFjcnMsIHNpemVvZihyZWdzLT5hY3JzKSk7CiAJcmVncy0+b3JpZ19ncHIyID0gcHRyZWdzLT5vcmlnX2dwcjI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tczM5MC9wcm9jZXNzb3IuaAppbmRleCA0ZWM2NTJlLi5jNWNiYzRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvcHJvY2Vzc29yLmgKQEAgLTE5MSwxMCArMTkxLDEwIEBACiBleHRlcm4gdm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3ApOwogCiB1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwotI2RlZmluZSBfX0tTVEtfUFRSRUdTKHRzaykgKChzdHJ1Y3QgcHRfcmVncyAqKSBcCi0gICAgICAgICgodW5zaWduZWQgbG9uZykgdHNrLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkpCi0jZGVmaW5lIEtTVEtfRUlQKHRzaykJKF9fS1NUS19QVFJFR1ModHNrKS0+cHN3LmFkZHIpCi0jZGVmaW5lIEtTVEtfRVNQKHRzaykJKF9fS1NUS19QVFJFR1ModHNrKS0+Z3Byc1sxNV0pCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0c2spICgoc3RydWN0IHB0X3JlZ3MgKikgXAorICAgICAgICAodGFza19zdGFja19wYWdlKHRzaykgKyBUSFJFQURfU0laRSkgLSAxKQorI2RlZmluZSBLU1RLX0VJUCh0c2spCSh0YXNrX3B0X3JlZ3ModHNrKS0+cHN3LmFkZHIpCisjZGVmaW5lIEtTVEtfRVNQKHRzaykJKHRhc2tfcHRfcmVncyh0c2spLT5ncHJzWzE1XSkKIAogLyoKICAqIEdpdmUgdXAgdGhlIHRpbWUgc2xpY2Ugb2YgdGhlIHZpcnR1YWwgUFUuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tczM5MC9zeXN0ZW0uaAppbmRleCA4NjRjYWU3Li5jN2MzYTlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvc3lzdGVtLmgKQEAgLTEwNCw2ICsxMDQsMTYgQEAKIAlwcmV2ID0gX19zd2l0Y2hfdG8ocHJldixuZXh0KTsJCQkJCSAgICAgXAogfSB3aGlsZSAoMCkKIAorLyoKKyAqIE9uIFNNUCBzeXN0ZW1zLCB3aGVuIHRoZSBzY2hlZHVsZXIgZG9lcyBtaWdyYXRpb24tY29zdCBhdXRvZGV0ZWN0aW9uLAorICogaXQgbmVlZHMgYSB3YXkgdG8gZmx1c2ggYXMgbXVjaCBvZiB0aGUgQ1BVJ3MgY2FjaGVzIGFzIHBvc3NpYmxlLgorICoKKyAqIFRPRE86IGZpbGwgdGhpcyBpbiEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2NhY2hlZmx1c2godm9pZCkKK3sKK30KKwogI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCiBleHRlcm4gdm9pZCBhY2NvdW50X3VzZXJfdnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgYWNjb3VudF9zeXN0ZW1fdnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tczM5MC90aHJlYWRfaW5mby5oCmluZGV4IDZjMThhM2YuLmYzNzk3YTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3RocmVhZF9pbmZvLmgKQEAgLTgxLDggKzgxLDYgQEAKICNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrKSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBcCiAJX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLFRIUkVBRF9PUkRFUikpCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpICh0aSksVEhSRUFEX09SREVSKQotI2RlZmluZSBnZXRfdGhyZWFkX2luZm8odGkpIGdldF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQotI2RlZmluZSBwdXRfdGhyZWFkX2luZm8odGkpIHB1dF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1zaC9wdHJhY2UuaAppbmRleCAwZjc1ZTE2Li43OTJmYzM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wdHJhY2UuaApAQCAtOTEsNiArOTEsMTYgQEAKICNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5wYykKIGV4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKIAorI2lmZGVmIENPTkZJR19TSF9EU1AKKyNkZWZpbmUgdGFza19wdF9yZWdzKHRhc2spIFwKKwkoKHN0cnVjdCBwdF9yZWdzICopICh0YXNrX3N0YWNrX3BhZ2UodGFzaykgKyBUSFJFQURfU0laRSBcCisJCSAtIHNpemVvZihzdHJ1Y3QgcHRfZHNwcmVncykgLSBzaXplb2YodW5zaWduZWQgbG9uZykpIC0gMSkKKyNlbHNlCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0YXNrKSBcCisJKChzdHJ1Y3QgcHRfcmVncyAqKSAodGFza19zdGFja19wYWdlKHRhc2spICsgVEhSRUFEX1NJWkUgXAorCQkgLSBzaXplb2YodW5zaWduZWQgbG9uZykpIC0gMSkKKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIHBjID0gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKaW5kZXggMjhhM2MyZC4uYmIwMzMwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKQEAgLTU3LDYgKzU3LDE2IEBACiAJbGFzdCA9IF9fbGFzdDsJCQkJCQkJXAogfSB3aGlsZSAoMCkKIAorLyoKKyAqIE9uIFNNUCBzeXN0ZW1zLCB3aGVuIHRoZSBzY2hlZHVsZXIgZG9lcyBtaWdyYXRpb24tY29zdCBhdXRvZGV0ZWN0aW9uLAorICogaXQgbmVlZHMgYSB3YXkgdG8gZmx1c2ggYXMgbXVjaCBvZiB0aGUgQ1BVJ3MgY2FjaGVzIGFzIHBvc3NpYmxlLgorICoKKyAqIFRPRE86IGZpbGwgdGhpcyBpbiEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2NhY2hlZmx1c2godm9pZCkKK3sKK30KKwogI2RlZmluZSBub3AoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm5vcCIpCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXNoL3RocmVhZF9pbmZvLmgKaW5kZXggNDYwODBjZS4uODVmMGMxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1zaC90aHJlYWRfaW5mby5oCkBAIC02MCw4ICs2MCw2IEBACiAjZGVmaW5lIFRIUkVBRF9TSVpFICgyKlBBR0VfU0laRSkKICNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odGkpICgoc3RydWN0IHRocmVhZF9pbmZvICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwxKSkKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkgZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgKHRpKSwgMSkKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKSBnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKSBwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKIAogI2Vsc2UgLyogIV9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1zaDY0L3RocmVhZF9pbmZvLmgKaW5kZXggMTBmMDI0Yy4uMWY4MjVjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvdGhyZWFkX2luZm8uaApAQCAtNjYsOCArNjYsNiBAQAogCiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRpKSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsMSkpCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpICh0aSksIDEpCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9zeXN0ZW0uaAppbmRleCAxZjZiNzFmLi41OGRkMTYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9zeXN0ZW0uaApAQCAtMTU1LDcgKzE1NSw3IEBACiAJImhlcmU6XG4iCQkJCQkJCQkJXAogICAgICAgICA6ICI9JnIiIChsYXN0KQkJCQkJCQkJCVwKICAgICAgICAgOiAiciIgKCYoY3VycmVudF9zZXRbaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCldKSksCVwKLQkgICJyIiAoKG5leHQpLT50aHJlYWRfaW5mbyksCQkJCVwKKwkgICJyIiAodGFza190aHJlYWRfaW5mbyhuZXh0KSksCQkJCVwKIAkgICJpIiAoVElfS1BTUiksCQkJCQlcCiAJICAiaSIgKFRJX0tTUCksCQkJCQkJXAogCSAgImkiIChUSV9UQVNLKQkJCQkJCVwKQEAgLTE2Niw2ICsxNjYsMTYgQEAKIAl9IHdoaWxlKDApCiAKIC8qCisgKiBPbiBTTVAgc3lzdGVtcywgd2hlbiB0aGUgc2NoZWR1bGVyIGRvZXMgbWlncmF0aW9uLWNvc3QgYXV0b2RldGVjdGlvbiwKKyAqIGl0IG5lZWRzIGEgd2F5IHRvIGZsdXNoIGFzIG11Y2ggb2YgdGhlIENQVSdzIGNhY2hlcyBhcyBwb3NzaWJsZS4KKyAqCisgKiBUT0RPOiBmaWxsIHRoaXMgaW4hCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9jYWNoZWZsdXNoKHZvaWQpCit7Cit9CisKKy8qCiAgKiBDaGFuZ2luZyB0aGUgSVJRIGxldmVsIG9uIHRoZSBTcGFyYy4KICAqLwogZXh0ZXJuIHZvaWQgbG9jYWxfaXJxX3Jlc3RvcmUodW5zaWduZWQgbG9uZyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tc3BhcmMvdGhyZWFkX2luZm8uaAppbmRleCBmZjZjY2IzLi42NWYwNjBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3RocmVhZF9pbmZvLmgKQEAgLTkyLDkgKzkyLDYgQEAKIEJURklYVVBERUZfQ0FMTCh2b2lkLCBmcmVlX3RocmVhZF9pbmZvLCBzdHJ1Y3QgdGhyZWFkX2luZm8gKikKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkgQlRGSVhVUF9DQUxMKGZyZWVfdGhyZWFkX2luZm8pKHRpKQogCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkJZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkJcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZWxmLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2VsZi5oCmluZGV4IDkxNDU4MTEuLjY5NTM5YTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9lbGYuaApAQCAtMTE5LDcgKzExOSw3IEBACiAjZW5kaWYKIAogI2RlZmluZSBFTEZfQ09SRV9DT1BZX1RBU0tfUkVHUyhfX3RzaywgX19lbGZfcmVncykJXAotCSh7IEVMRl9DT1JFX0NPUFlfUkVHUygoKihfX2VsZl9yZWdzKSksIChfX3RzayktPnRocmVhZF9pbmZvLT5rcmVncyk7IDE7IH0pCisJKHsgRUxGX0NPUkVfQ09QWV9SRUdTKCgqKF9fZWxmX3JlZ3MpKSwgdGFza19wdF9yZWdzKF9fdHNrKSk7IDE7IH0pCiAKIC8qCiAgKiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGRvbid0IGxvYWQgc29tZXRoaW5nIGZvciB0aGUgd3JvbmcgYXJjaGl0ZWN0dXJlLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9tbXVfY29udGV4dC5oCmluZGV4IDA4YmE3MmQuLjU3ZWU3YjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L21tdV9jb250ZXh0LmgKQEAgLTYwLDcgKzYwLDcgQEAKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHBnZF9jYWNoZSBhc20oIm80Iik7IFwKIAlwYWRkciA9IF9fcGEoKF9fbW0pLT5wZ2QpOyBcCiAJcGdkX2NhY2hlID0gMFVMOyBcCi0JaWYgKChfX3RzayktPnRocmVhZF9pbmZvLT5mbGFncyAmIF9USUZfMzJCSVQpIFwKKwlpZiAodGFza190aHJlYWRfaW5mbyhfX3RzayktPmZsYWdzICYgX1RJRl8zMkJJVCkgXAogCQlwZ2RfY2FjaGUgPSBnZXRfcGdkX2NhY2hlKChfX21tKS0+cGdkKTsgXAogCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cnByCSUlZzAsIDB4NDk0LCAlJXBzdGF0ZVxuXHQiIFwKIAkJCSAgICAgIm1vdgklMywgJSVnNFxuXHQiIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Byb2Nlc3Nvci5oCmluZGV4IDMxNjlmM2UuLmNkOGQ5YjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wcm9jZXNzb3IuaApAQCAtMTg2LDggKzE4Niw5IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogCi0jZGVmaW5lIEtTVEtfRUlQKHRzaykgICgodHNrKS0+dGhyZWFkX2luZm8tPmtyZWdzLT50cGMpCi0jZGVmaW5lIEtTVEtfRVNQKHRzaykgICgodHNrKS0+dGhyZWFkX2luZm8tPmtyZWdzLT51X3JlZ3NbVVJFR19GUF0pCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0c2spICh0YXNrX3RocmVhZF9pbmZvKHRzayktPmtyZWdzKQorI2RlZmluZSBLU1RLX0VJUCh0c2spICAodGFza19wdF9yZWdzKHRzayktPnRwYykKKyNkZWZpbmUgS1NUS19FU1AodHNrKSAgKHRhc2tfcHRfcmVncyh0c2spLT51X3JlZ3NbVVJFR19GUF0pCiAKICNkZWZpbmUgY3B1X3JlbGF4KCkJYmFycmllcigpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3N5c3RlbS5oCmluZGV4IDMwOWYxNDYuLmFmMjU0ZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zeXN0ZW0uaApAQCAtMjA4LDcgKzIwOCw3IEBACiAJLyogSWYgeW91IGFyZSB0ZW1wdGVkIHRvIGNvbmRpdGlvbmFsaXplIHRoZSBmb2xsb3dpbmcgKi8JXAogCS8qIHNvIHRoYXQgQVNJIGlzIG9ubHkgd3JpdHRlbiBpZiBpdCBjaGFuZ2VzLCB0aGluayBhZ2Fpbi4gKi8JXAogCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3ciAlJWcwLCAlMCwgJSVhc2kiCQkJXAotCTogOiAiciIgKF9fdGhyZWFkX2ZsYWdfYnl0ZV9wdHIobmV4dC0+dGhyZWFkX2luZm8pW1RJX0ZMQUdfQllURV9DVVJSRU5UX0RTXSkpO1wKKwk6IDogInIiIChfX3RocmVhZF9mbGFnX2J5dGVfcHRyKHRhc2tfdGhyZWFkX2luZm8obmV4dCkpW1RJX0ZMQUdfQllURV9DVVJSRU5UX0RTXSkpO1wKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCiAJIm1vdgklJWc0LCAlJWc3XG5cdCIJCQkJCQlcCiAJIndycHIJJSVnMCwgMHg5NSwgJSVwc3RhdGVcblx0IgkJCQlcCkBAIC0yMzgsNyArMjM4LDcgQEAKIAkiYixhIHJldF9mcm9tX3N5c2NhbGxcblx0IgkJCQkJXAogCSIxOlxuXHQiCQkJCQkJCVwKIAk6ICI9JnIiIChsYXN0KQkJCQkJCQlcCi0JOiAiMCIgKG5leHQtPnRocmVhZF9pbmZvKSwJCQkJCVwKKwk6ICIwIiAodGFza190aHJlYWRfaW5mbyhuZXh0KSksCQkJCQlcCiAJICAiaSIgKFRJX1dTVEFURSksICJpIiAoVElfS1NQKSwgImkiIChUSV9ORVdfQ0hJTEQpLCAgICAgICAgICAgIFwKIAkgICJpIiAoVElfQ1dQKSwgImkiIChUSV9UQVNLKQkJCQkJXAogCTogImNjIiwJCQkJCQkJCVwKQEAgLTI1Myw2ICsyNTMsMTYgQEAKIAl9CQkJCQkJCQlcCiB9IHdoaWxlKDApCiAKKy8qCisgKiBPbiBTTVAgc3lzdGVtcywgd2hlbiB0aGUgc2NoZWR1bGVyIGRvZXMgbWlncmF0aW9uLWNvc3QgYXV0b2RldGVjdGlvbiwKKyAqIGl0IG5lZWRzIGEgd2F5IHRvIGZsdXNoIGFzIG11Y2ggb2YgdGhlIENQVSdzIGNhY2hlcyBhcyBwb3NzaWJsZS4KKyAqCisgKiBUT0RPOiBmaWxsIHRoaXMgaW4hCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9jYWNoZWZsdXNoKHZvaWQpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB4Y2hnMzIoX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbSwgdW5zaWduZWQgaW50IHZhbCkKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDEsIHRtcDI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tdW0vdGhyZWFkX2luZm8uaAppbmRleCA5NzI2N2YwLi43MDVjNzE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3RocmVhZF9pbmZvLmgKQEAgLTU2LDkgKzU2LDYgQEAKIAkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBrbWFsbG9jKFRIUkVBRF9TSVpFLCBHRlBfS0VSTkVMKSkKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkga2ZyZWUodGkpCiAKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKSBnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKSBwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLQogI2VuZGlmCiAKICNkZWZpbmUgUFJFRU1QVF9BQ1RJVkUJCTB4MTAwMDAwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS12ODUwL3Byb2Nlc3Nvci5oCmluZGV4IDk4ZjkyOTQuLjJkMzEzMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9wcm9jZXNzb3IuaApAQCAtOTgsMTAgKzk4LDEwIEBACiAKIAogLyogUmV0dXJuIHNvbWUgaW5mbyBhYm91dCB0aGUgdXNlciBwcm9jZXNzIFRBU0suICAqLwotI2RlZmluZSB0YXNrX3Rvcyh0YXNrKQkoKHVuc2lnbmVkIGxvbmcpKHRhc2spLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFKQotI2RlZmluZSB0YXNrX3JlZ3ModGFzaykgKChzdHJ1Y3QgcHRfcmVncyAqKXRhc2tfdG9zICh0YXNrKSAtIDEpCi0jZGVmaW5lIHRhc2tfc3AodGFzaykJKHRhc2tfcmVncyAodGFzayktPmdwcltHUFJfU1BdKQotI2RlZmluZSB0YXNrX3BjKHRhc2spCSh0YXNrX3JlZ3MgKHRhc2spLT5wYykKKyNkZWZpbmUgdGFza190b3ModGFzaykJKCh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZSh0YXNrKSArIFRIUkVBRF9TSVpFKQorI2RlZmluZSB0YXNrX3B0X3JlZ3ModGFzaykgKChzdHJ1Y3QgcHRfcmVncyAqKXRhc2tfdG9zICh0YXNrKSAtIDEpCisjZGVmaW5lIHRhc2tfc3AodGFzaykJKHRhc2tfcHRfcmVncyAodGFzayktPmdwcltHUFJfU1BdKQorI2RlZmluZSB0YXNrX3BjKHRhc2spCSh0YXNrX3B0X3JlZ3MgKHRhc2spLT5wYykKIC8qIEdyb3R0eSBvbGQgbmFtZXMgZm9yIHNvbWUuICAqLwogI2RlZmluZSBLU1RLX0VJUCh0YXNrKQl0YXNrX3BjICh0YXNrKQogI2RlZmluZSBLU1RLX0VTUCh0YXNrKQl0YXNrX3NwICh0YXNrKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tdjg1MC90aHJlYWRfaW5mby5oCmluZGV4IGU0Y2ZhZDkuLjgyYjhmMjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL3RocmVhZF9pbmZvLmgKQEAgLTU4LDggKzU4LDYgQEAKICNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrKSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBcCiAJCQkJX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCAxKSkKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgKHRpKSwgMSkKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKQlnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKQlwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvY29tcGF0LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvY29tcGF0LmgKaW5kZXggMzg2M2E3ZC4uYjM3YWI4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jb21wYXQuaApAQCAtMTk4LDcgKzE5OCw3IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgX191c2VyICpjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShsb25nIGxlbikKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9ICh2b2lkICopY3VycmVudC0+dGhyZWFkLnJzcDAgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpOyAKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKIAlyZXR1cm4gKHZvaWQgX191c2VyICopcmVncy0+cnNwIC0gbGVuOyAKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2kzODcuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pMzg3LmgKaW5kZXggNTdmN2UxNC4uODc2ZWI5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2kzODcuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaTM4Ny5oCkBAIC0zMCw3ICszMCw3IEBACiAgKi8KIAogI2RlZmluZSB1bmxhenlfZnB1KHRzaykgZG8geyBcCi0JaWYgKCh0c2spLT50aHJlYWRfaW5mby0+c3RhdHVzICYgVFNfVVNFREZQVSkgXAorCWlmICh0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmIFRTX1VTRURGUFUpIFwKIAkJc2F2ZV9pbml0X2ZwdSh0c2spOyBcCiB9IHdoaWxlICgwKQogCkBAIC00Niw5ICs0Niw5IEBACiB9CiAKICNkZWZpbmUgY2xlYXJfZnB1KHRzaykgZG8geyBcCi0JaWYgKCh0c2spLT50aHJlYWRfaW5mby0+c3RhdHVzICYgVFNfVVNFREZQVSkgewkJXAorCWlmICh0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmIFRTX1VTRURGUFUpIHsJXAogCQl0b2xlcmFudF9md2FpdCgpOwkJCQlcCi0JCSh0c2spLT50aHJlYWRfaW5mby0+c3RhdHVzICY9IH5UU19VU0VERlBVOwlcCisJCXRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICY9IH5UU19VU0VERlBVOwlcCiAJCXN0dHMoKTsJCQkJCQlcCiAJfQkJCQkJCQlcCiB9IHdoaWxlICgwKQpAQCAtMTcwLDEwICsxNzAsMTAgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9pbml0X2ZwdSggc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgKQorc3RhdGljIGlubGluZSB2b2lkIHNhdmVfaW5pdF9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAgCV9fZnhzYXZlX2NsZWFyKHRzayk7Ci0JdHNrLT50aHJlYWRfaW5mby0+c3RhdHVzICY9IH5UU19VU0VERlBVOworCXRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICY9IH5UU19VU0VERlBVOwogCXN0dHMoKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oCmluZGV4IDM5NGRkNzIuLjg3YTI4MmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvY2Vzc29yLmgKQEAgLTMyMSw4ICszMjEsOCBAQAogI2RlZmluZSB0aHJlYWRfc2F2ZWRfcGModCkgKCoodW5zaWduZWQgbG9uZyAqKSgodCktPnRocmVhZC5yc3AgLSA4KSkKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7Ci0jZGVmaW5lIEtTVEtfRUlQKHRzaykgXAotCSgoKHN0cnVjdCBwdF9yZWdzICopKHRzay0+dGhyZWFkLnJzcDAgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKSktPnJpcCkKKyNkZWZpbmUgdGFza19wdF9yZWdzKHRzaykgKChzdHJ1Y3QgcHRfcmVncyAqKSh0c2spLT50aHJlYWQucnNwMCAtIDEpCisjZGVmaW5lIEtTVEtfRUlQKHRzaykgKHRhc2tfcHRfcmVncyh0c2spLT5yaXApCiAjZGVmaW5lIEtTVEtfRVNQKHRzaykgLTEgLyogc29ycnkuIGRvZXNuJ3Qgd29yayBmb3Igc3lzY2FsbC4gKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc3lzdGVtLmgKaW5kZXggMzhjMWU4YS4uMGVhY2JlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zeXN0ZW0uaApAQCAtMTkzLDYgKzE5MywxNSBAQAogI2RlZmluZSB3YmludmQoKSBcCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ3YmludmQiOiA6IDoibWVtb3J5Iik7CiAKKy8qCisgKiBPbiBTTVAgc3lzdGVtcywgd2hlbiB0aGUgc2NoZWR1bGVyIGRvZXMgbWlncmF0aW9uLWNvc3QgYXV0b2RldGVjdGlvbiwKKyAqIGl0IG5lZWRzIGEgd2F5IHRvIGZsdXNoIGFzIG11Y2ggb2YgdGhlIENQVSdzIGNhY2hlcyBhcyBwb3NzaWJsZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2NhY2hlZmx1c2godm9pZCkKK3sKKwl3YmludmQoKTsKK30KKwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIAogI2RlZmluZSBub3AoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm5vcCIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC90aHJlYWRfaW5mby5oCmluZGV4IGViN2M1ZmQuLjRhYzBlMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC90aHJlYWRfaW5mby5oCkBAIC03Niw4ICs3Niw2IEBACiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykgXAogCSgoc3RydWN0IHRocmVhZF9pbmZvICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCxUSFJFQURfT1JERVIpKQogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKSBmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSAodGkpLCBUSFJFQURfT1JERVIpCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNlbHNlIC8qICFfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdG9wb2xvZ3kuaAppbmRleCA3ZDgyYmM1Li4yZmE3ZjI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdG9wb2xvZ3kuaApAQCAtMzksNyArMzksNiBAQAogCS5tYXhfaW50ZXJ2YWwJCT0gMzIsCQkJXAogCS5idXN5X2ZhY3RvcgkJPSAzMiwJCQlcCiAJLmltYmFsYW5jZV9wY3QJCT0gMTI1LAkJCVwKLQkuY2FjaGVfaG90X3RpbWUJCT0gKDEwKjEwMDAwMDApLAkJXAogCS5jYWNoZV9uaWNlX3RyaWVzCT0gMiwJCQlcCiAJLmJ1c3lfaWR4CQk9IDMsCQkJXAogCS5pZGxlX2lkeAkJPSAyLAkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaAppbmRleCA5Y2FiNWU0Li5kMWQ3MmFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oCkBAIC0xODQsMTIgKzE4NCwxMiBAQAogI2RlZmluZSByZWxlYXNlX3NlZ21lbnRzKG1tKQlkbyB7IH0gd2hpbGUoMCkKICNkZWZpbmUgZm9yZ2V0X3NlZ21lbnRzKCkJZG8geyB9IHdoaWxlICgwKQogCi0jZGVmaW5lIHRocmVhZF9zYXZlZF9wYyh0c2spCSh4dGVuc2FfcHRfcmVncyh0c2spLT5wYykKKyNkZWZpbmUgdGhyZWFkX3NhdmVkX3BjKHRzaykJKHRhc2tfcHRfcmVncyh0c2spLT5wYykKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKLSNkZWZpbmUgS1NUS19FSVAodHNrKQkJKHh0ZW5zYV9wdF9yZWdzKHRzayktPnBjKQotI2RlZmluZSBLU1RLX0VTUCh0c2spCQkoeHRlbnNhX3B0X3JlZ3ModHNrKS0+YXJlZ1sxXSkKKyNkZWZpbmUgS1NUS19FSVAodHNrKQkJKHRhc2tfcHRfcmVncyh0c2spLT5wYykKKyNkZWZpbmUgS1NUS19FU1AodHNrKQkJKHRhc2tfcHRfcmVncyh0c2spLT5hcmVnWzFdKQogCiAjZGVmaW5lIGNwdV9yZWxheCgpICBkbyB7IH0gd2hpbGUgKDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaAppbmRleCBhYTRmZDdmLi5hNWFjNzFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3B0cmFjZS5oCkBAIC0xMTMsOCArMTEzLDggQEAKIH07CiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jIGRlZmluZSB4dGVuc2FfcHRfcmVncyh0c2spICgoc3RydWN0IHB0X3JlZ3MqKSBcCi0gICgoKGxvbmcpKHRzayktPnRocmVhZF9pbmZvICsgS0VSTkVMX1NUQUNLX1NJWkUgLSAoWENIQUxfTlVNX0FSRUdTLTE2KSo0KSkgLSAxKQorIyBkZWZpbmUgdGFza19wdF9yZWdzKHRzaykgKChzdHJ1Y3QgcHRfcmVncyopIFwKKyAgKHRhc2tfc3RhY2tfcGFnZSh0c2spICsgS0VSTkVMX1NUQUNLX1NJWkUgLSAoWENIQUxfTlVNX0FSRUdTLTE2KSo0KSAtIDEpCiAjIGRlZmluZSB1c2VyX21vZGUocmVncykgKCgocmVncyktPnBzICYgMHgwMDAwMDAyMCkhPTApCiAjIGRlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICgocmVncyktPnBjKQogZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdGhyZWFkX2luZm8uaAppbmRleCBhZjIwOGQ0Li41YWUzNGFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvdGhyZWFkX2luZm8uaApAQCAtOTMsOCArOTMsNiBAQAogLyogdGhyZWFkIGluZm9ybWF0aW9uIGFsbG9jYXRpb24gKi8KICNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrKSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsMSkpCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpICh0aSksIDEpCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNlbHNlIC8qICFfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdXh2ZWMuaCBiL2luY2x1ZGUvbGludXgvYXV4dmVjLmgKaW5kZXggOWE3YjM3NC4uZDJiYzBkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdXh2ZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oCkBAIC0yNiw2ICsyNiw2IEBACiAKICNkZWZpbmUgQVRfU0VDVVJFIDIzICAgLyogc2VjdXJlIG1vZGUgYm9vbGVhbiAqLwogCi0jZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFICA0MiAvKiBTaXplIG9mIGF1eGlsaWFyeSB0YWJsZS4gICovCisjZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFICA0NCAvKiBTaXplIG9mIGF1eGlsaWFyeSB0YWJsZS4gICovCiAKICNlbmRpZiAvKiBfTElOVVhfQVVYVkVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IDBjZGVlNzhlLi41OGRmMThkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTQ5LDYgKzQ5LDkgQEAKIAlpbnQJCSgqbWF0Y2gpKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2KTsKIAlpbnQJCSgqdWV2ZW50KShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLAogCQkJCSAgaW50IG51bV9lbnZwLCBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSk7CisJaW50CQkoKnByb2JlKShzdHJ1Y3QgZGV2aWNlICogZGV2KTsKKwlpbnQJCSgqcmVtb3ZlKShzdHJ1Y3QgZGV2aWNlICogZGV2KTsKKwl2b2lkCQkoKnNodXRkb3duKShzdHJ1Y3QgZGV2aWNlICogZGV2KTsKIAlpbnQJCSgqc3VzcGVuZCkoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIAlpbnQJCSgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICogZGV2KTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmggYi9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmgKaW5kZXggOTM0YWE5Yi4uYTlmMWNmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaApAQCAtNTAsMTQgKzUwLDEyIEBACiAKIAkvKiBib2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogCXUzMiBib2FyZF9mbGFnczsKLQljb25zdCBjaGFyICpidXNfaWQ7CisJdTMyIGJ1c19pZDsKKwl1MzIgcGh5X2lkOwogCXU4IG1hY19hZGRyWzZdOwogfTsKIAogc3RydWN0IGdpYW5mYXJfbWRpb19kYXRhIHsKLQkvKiBkZXZpY2Ugc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KLQl1MzIgcGFkZHI7Ci0KIAkvKiBib2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogCWludCBpcnFbMzJdOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKaW5kZXggY2Y1Y2ZkZi4uMDg5YmZiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKQEAgLTQ5LDggKzQ5LDYgQEAKICAqIHN0cnVjdCBocnRpbWVyIC0gdGhlIGJhc2ljIGhydGltZXIgc3RydWN0dXJlCiAgKgogICogQG5vZGU6CXJlZCBibGFjayB0cmVlIG5vZGUgZm9yIHRpbWUgb3JkZXJlZCBpbnNlcnRpb24KLSAqIEBsaXN0OglsaXN0IGhlYWQgZm9yIGVhc2llciBhY2Nlc3MgdG8gdGhlIHRpbWUgb3JkZXJlZCBsaXN0LAotICoJCXdpdGhvdXQgd2Fsa2luZyB0aGUgcmVkIGJsYWNrIHRyZWUuCiAgKiBAZXhwaXJlczoJdGhlIGFic29sdXRlIGV4cGlyeSB0aW1lIGluIHRoZSBocnRpbWVycyBpbnRlcm5hbAogICoJCXJlcHJlc2VudGF0aW9uLiBUaGUgdGltZSBpcyByZWxhdGVkIHRvIHRoZSBjbG9jayBvbgogICoJCXdoaWNoIHRoZSB0aW1lciBpcyBiYXNlZC4KQEAgLTYzLDcgKzYxLDYgQEAKICAqLwogc3RydWN0IGhydGltZXIgewogCXN0cnVjdCByYl9ub2RlCQlub2RlOwotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlrdGltZV90CQkJZXhwaXJlczsKIAllbnVtIGhydGltZXJfc3RhdGUJc3RhdGU7CiAJaW50CQkJKCpmdW5jdGlvbikodm9pZCAqKTsKQEAgLTc4LDcgKzc1LDcgQEAKICAqCQl0byBhIGJhc2Ugb24gYW5vdGhlciBjcHUuCiAgKiBAbG9jazoJbG9jayBwcm90ZWN0aW5nIHRoZSBiYXNlIGFuZCBhc3NvY2lhdGVkIHRpbWVycwogICogQGFjdGl2ZToJcmVkIGJsYWNrIHRyZWUgcm9vdCBub2RlIGZvciB0aGUgYWN0aXZlIHRpbWVycwotICogQHBlbmRpbmc6CWxpc3Qgb2YgcGVuZGluZyB0aW1lcnMgZm9yIHNpbXBsZSB0aW1lIG9yZGVyZWQgYWNjZXNzCisgKiBAZmlyc3Q6CXBvaW50ZXIgdG8gdGhlIHRpbWVyIG5vZGUgd2hpY2ggZXhwaXJlcyBmaXJzdAogICogQHJlc29sdXRpb246CXRoZSByZXNvbHV0aW9uIG9mIHRoZSBjbG9jaywgaW4gbmFub3NlY29uZHMKICAqIEBnZXRfdGltZToJZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgY2xvY2sKICAqIEBjdXJyX3RpbWVyOgl0aGUgdGltZXIgd2hpY2ggaXMgZXhlY3V0aW5nIGEgY2FsbGJhY2sgcmlnaHQgbm93CkBAIC04Nyw4ICs4NCw4IEBACiAJY2xvY2tpZF90CQlpbmRleDsKIAlzcGlubG9ja190CQlsb2NrOwogCXN0cnVjdCByYl9yb290CQlhY3RpdmU7Ci0Jc3RydWN0IGxpc3RfaGVhZAlwZW5kaW5nOwotCXVuc2lnbmVkIGxvbmcJCXJlc29sdXRpb247CisJc3RydWN0IHJiX25vZGUJCSpmaXJzdDsKKwlrdGltZV90CQkJcmVzb2x1dGlvbjsKIAlrdGltZV90CQkJKCpnZXRfdGltZSkodm9pZCk7CiAJc3RydWN0IGhydGltZXIJCSpjdXJyX3RpbWVyOwogfTsKQEAgLTEyNSw4ICsxMjIsNyBAQAogfQogCiAvKiBGb3J3YXJkIGEgaHJ0aW1lciBzbyBpdCBleHBpcmVzIGFmdGVyIG5vdzogKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGhydGltZXJfZm9yd2FyZChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCi0JCQkJICAgICBjb25zdCBrdGltZV90IGludGVydmFsKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGhydGltZXJfZm9yd2FyZChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIGt0aW1lX3QgaW50ZXJ2YWwpOwogCiAvKiBQcmVjaXNlIHNsZWVwOiAqLwogZXh0ZXJuIGxvbmcgaHJ0aW1lcl9uYW5vc2xlZXAoc3RydWN0IHRpbWVzcGVjICpycXRwLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZGUuaCBiL2luY2x1ZGUvbGludXgvaWRlLmgKaW5kZXggOWE4YzA1ZC4uMTEwYjNjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lkZS5oCkBAIC05ODMsOCArOTgzLDEzIEBACiAJaWRlX3N0YXJ0c3RvcF90CSgqYWJvcnQpKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICpycSk7CiAJaWRlX3Byb2NfZW50cnlfdAkqcHJvYzsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglnZW5fZHJpdmVyOworCWludAkJKCpwcm9iZSkoaWRlX2RyaXZlX3QgKik7CisJdm9pZAkJKCpyZW1vdmUpKGlkZV9kcml2ZV90ICopOworCXZvaWQJCSgqc2h1dGRvd24pKGlkZV9kcml2ZV90ICopOwogfSBpZGVfZHJpdmVyX3Q7CiAKKyNkZWZpbmUgdG9faWRlX2RyaXZlcihkcnYpIGNvbnRhaW5lcl9vZihkcnYsIGlkZV9kcml2ZXJfdCwgZ2VuX2RyaXZlcikKKwogaW50IGdlbmVyaWNfaWRlX2lvY3RsKGlkZV9kcml2ZV90ICosIHN0cnVjdCBmaWxlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwgdW5zaWduZWQsIHVuc2lnbmVkIGxvbmcpOwogCiAvKgpAQCAtMTAwMiw3ICsxMDA3LDYgQEAKIAogZXh0ZXJuIGludCBpZGVfZW5kX3JlcXVlc3QgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHVwdG9kYXRlLCBpbnQgbnJzZWNzKTsKIGV4dGVybiBpbnQgX19pZGVfZW5kX3JlcXVlc3QgKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgdXB0b2RhdGUsIGludCBucnNlY3MpOwotZXh0ZXJuIHZvaWQgaWRlX3NvZnRpcnFfZG9uZShzdHJ1Y3QgcmVxdWVzdCAqcnEpOwogCiAvKgogICogVGhpcyBpcyB1c2VkIG9uIGV4aXQgZnJvbSB0aGUgZHJpdmVyIHRvIGRlc2lnbmF0ZSB0aGUgbmV4dCBpcnEgaGFuZGxlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggZTZlZTJkOS4uMzIzOTI0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0yMTYsNiArMjE2LDcgQEAKIAkoKHVuc2lnbmVkIGNoYXIgKikmYWRkcilbMV0sIFwKIAkoKHVuc2lnbmVkIGNoYXIgKikmYWRkcilbMl0sIFwKIAkoKHVuc2lnbmVkIGNoYXIgKikmYWRkcilbM10KKyNkZWZpbmUgTklQUVVBRF9GTVQgIiV1LiV1LiV1LiV1IgogCiAjZGVmaW5lIE5JUDYoYWRkcikgXAogCW50b2hzKChhZGRyKS5zNl9hZGRyMTZbMF0pLCBcCkBAIC0yMjYsNiArMjI3LDcgQEAKIAludG9ocygoYWRkcikuczZfYWRkcjE2WzVdKSwgXAogCW50b2hzKChhZGRyKS5zNl9hZGRyMTZbNl0pLCBcCiAJbnRvaHMoKGFkZHIpLnM2X2FkZHIxNls3XSkKKyNkZWZpbmUgTklQNl9GTVQgIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCIKIAogI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQogI2RlZmluZSBISVBRVUFEKGFkZHIpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3RpbWUuaCBiL2luY2x1ZGUvbGludXgva3RpbWUuaAppbmRleCAyMjJhMDQ3Li4xYmQ2NTUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC9rdGltZS5oCkBAIC0yNzIsOCArMjcyLDggQEAKICAqIGlkZWEgb2YgdGhlIChpbilhY2N1cmFjeSBvZiB0aW1lcnMuIFRpbWVyIHZhbHVlcyBhcmUgcm91bmRlZCB1cCB0bwogICogdGhpcyByZXNvbHV0aW9uIHZhbHVlcy4KICAqLwotI2RlZmluZSBLVElNRV9SRUFMVElNRV9SRVMJKE5TRUNfUEVSX1NFQy9IWikKLSNkZWZpbmUgS1RJTUVfTU9OT1RPTklDX1JFUwkoTlNFQ19QRVJfU0VDL0haKQorI2RlZmluZSBLVElNRV9SRUFMVElNRV9SRVMJKGt0aW1lX3QpeyAudHY2NCA9IFRJQ0tfTlNFQyB9CisjZGVmaW5lIEtUSU1FX01PTk9UT05JQ19SRVMJKGt0aW1lX3QpeyAudHY2NCA9IFRJQ0tfTlNFQyB9CiAKIC8qIEdldCB0aGUgbW9ub3RvbmljIHRpbWUgaW4gdGltZXNwZWMgZm9ybWF0OiAqLwogZXh0ZXJuIHZvaWQga3RpbWVfZ2V0X3RzKHN0cnVjdCB0aW1lc3BlYyAqdHMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCmluZGV4IDZkMzliNTEuLjNmZjg4YzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKQEAgLTE1NCw2ICsxNTQsOSBAQAogCXVuc2lnbmVkIGludCBleHBlY3RfZGVsZXRlOwogfTsKIAorLyogY2FsbCB0byBjcmVhdGUgYW4gZXhwbGljaXQgZGVwZW5kZW5jeSBvbiBuZl9jb25udHJhY2suICovCitleHRlcm4gdm9pZCBuZWVkX2Nvbm50cmFjayh2b2lkKTsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9ORl9DT05OVFJBQ0tfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MmYwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCkBAIC0wLDAgKzEsMjI0IEBACisjaWZuZGVmIF9YX1RBQkxFU19ICisjZGVmaW5lIF9YX1RBQkxFU19ICisKKyNkZWZpbmUgWFRfRlVOQ1RJT05fTUFYTkFNRUxFTiAzMAorI2RlZmluZSBYVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fR0VUX1JFVklTSU9OXyouICBSZXR1cm5zIGhpZ2hlc3QgcmV2aXNpb24KKyAqIGtlcm5lbCBzdXBwb3J0cywgaWYgPj0gcmV2aXNpb24uICovCitzdHJ1Y3QgeHRfZ2V0X3JldmlzaW9uCit7CisJY2hhciBuYW1lW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07CisKKwl1X2ludDhfdCByZXZpc2lvbjsKK307CisKKy8qIENPTlRJTlVFIHZlcmRpY3QgZm9yIHRhcmdldHMgKi8KKyNkZWZpbmUgWFRfQ09OVElOVUUgMHhGRkZGRkZGRgorCisvKiBGb3Igc3RhbmRhcmQgdGFyZ2V0ICovCisjZGVmaW5lIFhUX1JFVFVSTiAoLU5GX1JFUEVBVCAtIDEpCisKKyNkZWZpbmUgWFRfQUxJR04ocykgKCgocykgKyAoX19hbGlnbm9mX18odm9pZCAqKS0xKSkgJiB+KF9fYWxpZ25vZl9fKHZvaWQgKiktMSkpCisKKy8qIFN0YW5kYXJkIHJldHVybiB2ZXJkaWN0LCBvciBkbyBqdW1wLiAqLworI2RlZmluZSBYVF9TVEFOREFSRF9UQVJHRVQgIiIKKy8qIEVycm9yIHZlcmRpY3QuICovCisjZGVmaW5lIFhUX0VSUk9SX1RBUkdFVCAiRVJST1IiCisKKy8qCisgKiBOZXcgSVAgZmlyZXdhbGwgb3B0aW9ucyBmb3IgW2dzXWV0c29ja29wdCBhdCB0aGUgUkFXIElQIGxldmVsLgorICogVW5saWtlIEJTRCBMaW51eCBpbmhlcml0cyBJUCBvcHRpb25zIHNvIHlvdSBkb24ndCBoYXZlIHRvIHVzZSBhIHJhdworICogc29ja2V0IGZvciB0aGlzLiBJbnN0ZWFkIHdlIGNoZWNrIHJpZ2h0cyBpbiB0aGUgY2FsbHMuICovCisjZGVmaW5lIFhUX0JBU0VfQ1RMCQk2NAkvKiBiYXNlIGZvciBmaXJld2FsbCBzb2NrZXQgb3B0aW9ucyAqLworCisjZGVmaW5lIFhUX1NPX1NFVF9SRVBMQUNFCShYVF9CQVNFX0NUTCkKKyNkZWZpbmUgWFRfU09fU0VUX0FERF9DT1VOVEVSUwkoWFRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBYVF9TT19TRVRfTUFYCQlYVF9TT19TRVRfQUREX0NPVU5URVJTCisKKyNkZWZpbmUgWFRfU09fR0VUX0lORk8JCQkoWFRfQkFTRV9DVEwpCisjZGVmaW5lIFhUX1NPX0dFVF9FTlRSSUVTCQkoWFRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBYVF9TT19HRVRfUkVWSVNJT05fTUFUQ0gJKFhUX0JBU0VfQ1RMICsgMikKKyNkZWZpbmUgWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAkoWFRfQkFTRV9DVEwgKyAzKQorI2RlZmluZSBYVF9TT19HRVRfTUFYCQkJWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAorCisjZGVmaW5lIFNFVF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ID0gKGIpOyAoYykucGNudCA9IChwKTsgfSB3aGlsZSgwKQorI2RlZmluZSBBRERfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCArPSAoYik7IChjKS5wY250ICs9IChwKTsgfSB3aGlsZSgwKQorCitzdHJ1Y3QgeHRfY291bnRlcnMKK3sKKwl1X2ludDY0X3QgcGNudCwgYmNudDsJCQkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMgKi8KK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fQUREX0NPVU5URVJTLiAqLworc3RydWN0IHh0X2NvdW50ZXJzX2luZm8KK3sKKwkvKiBXaGljaCB0YWJsZS4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOworCisJLyogVGhlIGNvdW50ZXJzIChhY3R1YWxseSBgbnVtYmVyJyBvZiB0aGVzZSkuICovCisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzWzBdOworfTsKKworI2RlZmluZSBYVF9JTlZfUFJPVE8JCTB4NDAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBQUk9UTy4gKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjZGVmaW5lIEFTU0VSVF9SRUFEX0xPQ0soeCkKKyNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9saXN0aGVscC5oPgorCitzdHJ1Y3QgeHRfbWF0Y2gKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwljb25zdCBjaGFyIG5hbWVbWFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKKworCXVfaW50OF90IHJldmlzaW9uOworCisJLyogUmV0dXJuIHRydWUgb3IgZmFsc2U6IHJldHVybiBGQUxTRSBhbmQgc2V0ICpob3Rkcm9wID0gMSB0bworICAgICAgICAgICBmb3JjZSBpbW1lZGlhdGUgcGFja2V0IGRyb3AuICovCisJLyogQXJndW1lbnRzIGNoYW5nZWQgc2luY2UgMi42LjksIGFzIHRoaXMgbXVzdCBub3cgaGFuZGxlCisJICAgbm9uLWxpbmVhciBza2IsIHVzaW5nIHNrYl9oZWFkZXJfcG9pbnRlciBhbmQKKwkgICBza2JfaXBfbWFrZV93cml0YWJsZS4gKi8KKwlpbnQgKCptYXRjaCkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisJCSAgICAgaW50IG9mZnNldCwKKwkJICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJICAgICBpbnQgKmhvdGRyb3ApOworCisJLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworCS8qIFNob3VsZCByZXR1cm4gdHJ1ZSBvciBmYWxzZS4gKi8KKwlpbnQgKCpjaGVja2VudHJ5KShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCQkgIGNvbnN0IHZvaWQgKmlwLAorCQkJICB2b2lkICptYXRjaGluZm8sCisJCQkgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAorCQkJICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKTsKKworCS8qIENhbGxlZCB3aGVuIGVudHJ5IG9mIHRoaXMgdHlwZSBkZWxldGVkLiAqLworCXZvaWQgKCpkZXN0cm95KSh2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplKTsKKworCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFIGlmIHlvdSBhcmUgYSBtb2R1bGUsIG90aGVyd2lzZSBOVUxMICovCisJc3RydWN0IG1vZHVsZSAqbWU7Cit9OworCisvKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCitzdHJ1Y3QgeHRfdGFyZ2V0Cit7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJY29uc3QgY2hhciBuYW1lW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07CisKKwl1X2ludDhfdCByZXZpc2lvbjsKKworCS8qIFJldHVybnMgdmVyZGljdC4gQXJndW1lbnQgb3JkZXIgY2hhbmdlZCBzaW5jZSAyLjYuOSwgYXMgdGhpcworCSAgIG11c3Qgbm93IGhhbmRsZSBub24tbGluZWFyIHNrYnMsIHVzaW5nIHNrYl9jb3B5X2JpdHMgYW5kCisJICAgc2tiX2lwX21ha2Vfd3JpdGFibGUuICovCisJdW5zaWduZWQgaW50ICgqdGFyZ2V0KShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCQkgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisJCQkgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisJLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlOgorICAgICAgICAgICBob29rX21hc2sgaXMgYSBiaXRtYXNrIG9mIGhvb2tzIGZyb20gd2hpY2ggaXQgY2FuIGJlCisgICAgICAgICAgIGNhbGxlZC4gKi8KKwkvKiBTaG91bGQgcmV0dXJuIHRydWUgb3IgZmFsc2UuICovCisJaW50ICgqY2hlY2tlbnRyeSkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCQkJICBjb25zdCB2b2lkICplbnRyeSwKKwkJCSAgdm9pZCAqdGFyZ2luZm8sCisJCQkgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisJCQkgIHVuc2lnbmVkIGludCBob29rX21hc2spOworCisJLyogQ2FsbGVkIHdoZW4gZW50cnkgb2YgdGhpcyB0eXBlIGRlbGV0ZWQuICovCisJdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKnRhcmdpbmZvLCB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplKTsKKworCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFIGlmIHlvdSBhcmUgYSBtb2R1bGUsIG90aGVyd2lzZSBOVUxMICovCisJc3RydWN0IG1vZHVsZSAqbWU7Cit9OworCisvKiBGdXJuaXR1cmUgc2hvcHBpbmcuLi4gKi8KK3N0cnVjdCB4dF90YWJsZQoreworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCS8qIEEgdW5pcXVlIG5hbWUuLi4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBXaGF0IGhvb2tzIHlvdSB3aWxsIGVudGVyIG9uICovCisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCisJLyogTG9jayBmb3IgdGhlIGN1cnRhaW4gKi8KKwlyd2xvY2tfdCBsb2NrOworCisJLyogTWFuIGJlaGluZCB0aGUgY3VydGFpbi4uLiAqLworCS8vc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKKwl2b2lkICpwcml2YXRlOworCisJLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUgaWYgeW91IGFyZSBhIG1vZHVsZSwgb3RoZXJ3aXNlIE5VTEwgKi8KKwlzdHJ1Y3QgbW9kdWxlICptZTsKKworCWludCBhZjsJCS8qIGFkZHJlc3MvcHJvdG9jb2wgZmFtaWx5ICovCit9OworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKworLyogVGhlIHRhYmxlIGl0c2VsZiAqLworc3RydWN0IHh0X3RhYmxlX2luZm8KK3sKKwkvKiBTaXplIHBlciB0YWJsZSAqLworCXVuc2lnbmVkIGludCBzaXplOworCS8qIE51bWJlciBvZiBlbnRyaWVzOiBGSVhNRS4gLS1SUiAqLworCXVuc2lnbmVkIGludCBudW1iZXI7CisJLyogSW5pdGlhbCBudW1iZXIgb2YgZW50cmllcy4gTmVlZGVkIGZvciBtb2R1bGUgdXNhZ2UgY291bnQgKi8KKwl1bnNpZ25lZCBpbnQgaW5pdGlhbF9lbnRyaWVzOworCisJLyogRW50cnkgcG9pbnRzIGFuZCB1bmRlcmZsb3dzICovCisJdW5zaWduZWQgaW50IGhvb2tfZW50cnlbTkZfSVBfTlVNSE9PS1NdOworCXVuc2lnbmVkIGludCB1bmRlcmZsb3dbTkZfSVBfTlVNSE9PS1NdOworCisJLyogaXB0X2VudHJ5IHRhYmxlczogb25lIHBlciBDUFUgKi8KKwljaGFyICplbnRyaWVzW05SX0NQVVNdOworfTsKKworZXh0ZXJuIGludCB4dF9yZWdpc3Rlcl90YXJnZXQoaW50IGFmLCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQpOworZXh0ZXJuIHZvaWQgeHRfdW5yZWdpc3Rlcl90YXJnZXQoaW50IGFmLCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQpOworZXh0ZXJuIGludCB4dF9yZWdpc3Rlcl9tYXRjaChpbnQgYWYsIHN0cnVjdCB4dF9tYXRjaCAqdGFyZ2V0KTsKK2V4dGVybiB2b2lkIHh0X3VucmVnaXN0ZXJfbWF0Y2goaW50IGFmLCBzdHJ1Y3QgeHRfbWF0Y2ggKnRhcmdldCk7CisKK2V4dGVybiBpbnQgeHRfcmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSwKKwkJCSAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKmJvb3RzdHJhcCwKKwkJCSAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8pOworZXh0ZXJuIHZvaWQgKnh0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSk7CisKK2V4dGVybiBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqeHRfcmVwbGFjZV90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzLAorCQkJCQkgICAgICBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJCQkJICAgICAgaW50ICplcnJvcik7CisKK2V4dGVybiBzdHJ1Y3QgeHRfbWF0Y2ggKnh0X2ZpbmRfbWF0Y2goaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbik7CitleHRlcm4gc3RydWN0IHh0X3RhcmdldCAqeHRfZmluZF90YXJnZXQoaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbik7CitleHRlcm4gc3RydWN0IHh0X3RhcmdldCAqeHRfcmVxdWVzdF9maW5kX3RhcmdldChpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIAorCQkJCQkJdTggcmV2aXNpb24pOworZXh0ZXJuIGludCB4dF9maW5kX3JldmlzaW9uKGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCB0YXJnZXQsCisJCQkgICAgaW50ICplcnIpOworCitleHRlcm4gc3RydWN0IHh0X3RhYmxlICp4dF9maW5kX3RhYmxlX2xvY2soaW50IGFmLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIHh0X3RhYmxlX3VubG9jayhzdHJ1Y3QgeHRfdGFibGUgKnQpOworCitleHRlcm4gaW50IHh0X3Byb3RvX2luaXQoaW50IGFmKTsKK2V4dGVybiB2b2lkIHh0X3Byb3RvX2ZpbmkoaW50IGFmKTsKKworZXh0ZXJuIHN0cnVjdCB4dF90YWJsZV9pbmZvICp4dF9hbGxvY190YWJsZV9pbmZvKHVuc2lnbmVkIGludCBzaXplKTsKK2V4dGVybiB2b2lkIHh0X2ZyZWVfdGFibGVfaW5mbyhzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqaW5mbyk7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfWF9UQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxMTEzNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9YVF9DTEFTU0lGWV9ICisjZGVmaW5lIF9YVF9DTEFTU0lGWV9ICisKK3N0cnVjdCB4dF9jbGFzc2lmeV90YXJnZXRfaW5mbyB7CisJdV9pbnQzMl90IHByaW9yaXR5OworfTsKKworI2VuZGlmIC8qX1hUX0NMQVNTSUZZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzQ0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX1hUX0NPTk5NQVJLX0hfdGFyZ2V0CisjZGVmaW5lIF9YVF9DT05OTUFSS19IX3RhcmdldAorCisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNCBNQVJBIFN5c3RlbXMgQUIgPGh0dHA6Ly93d3cubWFyYXN5c3RlbXMuY29tPgorICogYnkgSGVucmlrIE5vcmRzdHJvbSA8aG5vQG1hcmFzeXN0ZW1zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKK2VudW0geworCVhUX0NPTk5NQVJLX1NFVCA9IDAsCisJWFRfQ09OTk1BUktfU0FWRSwKKwlYVF9DT05OTUFSS19SRVNUT1JFCit9OworCitzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyazsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdV9pbnQ4X3QgbW9kZTsKK307CisKKyNlbmRpZiAvKl9YVF9DT05OTUFSS19IX3RhcmdldCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9NQVJLLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9NQVJLLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyMWU5MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X01BUksuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9YVF9NQVJLX0hfdGFyZ2V0CisjZGVmaW5lIF9YVF9NQVJLX0hfdGFyZ2V0CisKKy8qIFZlcnNpb24gMCAqLworc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyazsKK307CisKKy8qIFZlcnNpb24gMSAqLworZW51bSB7CisJWFRfTUFSS19TRVQ9MCwKKwlYVF9NQVJLX0FORCwKKwlYVF9NQVJLX09SLAorfTsKKworc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm9fdjEgeworCXVuc2lnbmVkIGxvbmcgbWFyazsKKwl1X2ludDhfdCBtb2RlOworfTsKKworI2VuZGlmIC8qX1hUX01BUktfSF90YXJnZXQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTlhZjc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaApAQCAtMCwwICsxLDE2IEBACisvKiBpcHRhYmxlcyBtb2R1bGUgZm9yIHVzaW5nIE5GUVVFVUUgbWVjaGFuaXNtCisgKgorICogKEMpIDIwMDUgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciBHTlUgR1BMIHYyLCAxOTkxCisgKiAKKyovCisjaWZuZGVmIF9YVF9ORlFfVEFSR0VUX0gKKyNkZWZpbmUgX1hUX05GUV9UQVJHRVRfSAorCisvKiB0YXJnZXQgaW5mbyAqLworc3RydWN0IHh0X05GUV9pbmZvIHsKKwl1X2ludDE2X3QgcXVldWVudW07Cit9OworCisjZW5kaWYgLyogX1hUX05GUV9UQVJHRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2ZlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb21tZW50LmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfWFRfQ09NTUVOVF9ICisjZGVmaW5lIF9YVF9DT01NRU5UX0gKKworI2RlZmluZSBYVF9NQVhfQ09NTUVOVF9MRU4gMjU2CisKK3N0cnVjdCB4dF9jb21tZW50X2luZm8geworCXVuc2lnbmVkIGNoYXIgY29tbWVudFtYVF9NQVhfQ09NTUVOVF9MRU5dOworfTsKKworI2VuZGlmIC8qIFhUX0NPTU1FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25uYnl0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDIyYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfWFRfQ09OTkJZVEVTX0gKKyNkZWZpbmUgX1hUX0NPTk5CWVRFU19ICisKK2VudW0geHRfY29ubmJ5dGVzX3doYXQgeworCVhUX0NPTk5CWVRFU19QS1RTLAorCVhUX0NPTk5CWVRFU19CWVRFUywKKwlYVF9DT05OQllURVNfQVZHUEtULAorfTsKKworZW51bSB4dF9jb25uYnl0ZXNfZGlyZWN0aW9uIHsKKwlYVF9DT05OQllURVNfRElSX09SSUdJTkFMLAorCVhUX0NPTk5CWVRFU19ESVJfUkVQTFksCisJWFRfQ09OTkJZVEVTX0RJUl9CT1RILAorfTsKKworc3RydWN0IHh0X2Nvbm5ieXRlc19pbmZvCit7CisJc3RydWN0IHsKKwkJYWxpZ25lZF91NjQgZnJvbTsJLyogY291bnQgdG8gYmUgbWF0Y2hlZCAqLworCQlhbGlnbmVkX3U2NCB0bzsJCS8qIGNvdW50IHRvIGJlIG1hdGNoZWQgKi8KKwl9IGNvdW50OworCXVfaW50OF90IHdoYXQ7CQkvKiBpcHRfY29ubmJ5dGVzX3doYXQgKi8KKwl1X2ludDhfdCBkaXJlY3Rpb247CS8qIGlwdF9jb25uYnl0ZXNfZGlyZWN0aW9uICovCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25ubWFyay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTkyZjZhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9YVF9DT05OTUFSS19ICisjZGVmaW5lIF9YVF9DT05OTUFSS19ICisKKy8qIENvcHlyaWdodCAoQykgMjAwMiwyMDA0IE1BUkEgU3lzdGVtcyBBQiA8aHR0cDovL3d3dy5tYXJhc3lzdGVtcy5jb20+CisgKiBieSBIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5c3RlbXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworc3RydWN0IHh0X2Nvbm5tYXJrX2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyaywgbWFzazsKKwl1X2ludDhfdCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLypfWFRfQ09OTk1BUktfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjYzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaApAQCAtMCwwICsxLDYzIEBACisvKiBIZWFkZXIgZmlsZSBmb3Iga2VybmVsIG1vZHVsZSB0byBtYXRjaCBjb25uZWN0aW9uIHRyYWNraW5nIGluZm9ybWF0aW9uLgorICogR1BMIChDKSAyMDAxICBNYXJjIEJvdWNoZXIgKG1hcmNAbWJzaS5jYSkuCisgKi8KKworI2lmbmRlZiBfWFRfQ09OTlRSQUNLX0gKKyNkZWZpbmUgX1hUX0NPTk5UUkFDS19ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pICgxIDw8ICgoY3RpbmZvKSVJUF9DVF9JU19SRVBMWSsxKSkKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQgKDEgPDwgMCkKKworI2RlZmluZSBYVF9DT05OVFJBQ0tfU1RBVEVfU05BVCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMSkpCisjZGVmaW5lIFhUX0NPTk5UUkFDS19TVEFURV9ETkFUICgxIDw8IChJUF9DVF9OVU1CRVIgKyAyKSkKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMykpCisKKy8qIGZsYWdzLCBpbnZmbGFnczogKi8KKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFCTB4MDEKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1BST1RPCTB4MDIKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX09SSUdTUkMJMHgwNAorI2RlZmluZSBYVF9DT05OVFJBQ0tfT1JJR0RTVAkweDA4CisjZGVmaW5lIFhUX0NPTk5UUkFDS19SRVBMU1JDCTB4MTAKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1JFUExEU1QJMHgyMAorI2RlZmluZSBYVF9DT05OVFJBQ0tfU1RBVFVTCTB4NDAKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX0VYUElSRVMJMHg4MAorCisvKiBUaGlzIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlLCBzbyByZW1haW5zIGZyb3plbiBpbiB0aW1lLiAqLworc3RydWN0IGlwX2Nvbm50cmFja19vbGRfdHVwbGUKK3sKKwlzdHJ1Y3QgeworCQlfX3UzMiBpcDsKKwkJdW5pb24geworCQkJX191MTYgYWxsOworCQl9IHU7CisJfSBzcmM7CisKKwlzdHJ1Y3QgeworCQlfX3UzMiBpcDsKKwkJdW5pb24geworCQkJX191MTYgYWxsOworCQl9IHU7CisKKwkJLyogVGhlIHByb3RvY29sLiAqLworCQl1MTYgcHJvdG9udW07CisJfSBkc3Q7Cit9OworCitzdHJ1Y3QgeHRfY29ubnRyYWNrX2luZm8KK3sKKwl1bnNpZ25lZCBpbnQgc3RhdGVtYXNrLCBzdGF0dXNtYXNrOworCisJc3RydWN0IGlwX2Nvbm50cmFja19vbGRfdHVwbGUgdHVwbGVbSVBfQ1RfRElSX01BWF07CisJc3RydWN0IGluX2FkZHIgc2lwbXNrW0lQX0NUX0RJUl9NQVhdLCBkaXBtc2tbSVBfQ1RfRElSX01BWF07CisKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXNfbWluLCBleHBpcmVzX21heDsKKworCS8qIEZsYWdzIHdvcmQgKi8KKwl1X2ludDhfdCBmbGFnczsKKwkvKiBJbnZlcnNlIGZsYWdzICovCisJdV9pbnQ4X3QgaW52ZmxhZ3M7Cit9OworI2VuZGlmIC8qX1hUX0NPTk5UUkFDS19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2RjY3AuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2RjY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIyMWI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZGNjcC5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX1hUX0RDQ1BfSF8KKyNkZWZpbmUgX1hUX0RDQ1BfSF8KKworI2RlZmluZSBYVF9EQ0NQX1NSQ19QT1JUUwkgICAgICAgIDB4MDEKKyNkZWZpbmUgWFRfRENDUF9ERVNUX1BPUlRTCSAgICAgICAgMHgwMgorI2RlZmluZSBYVF9EQ0NQX1RZUEUJCQkweDA0CisjZGVmaW5lIFhUX0RDQ1BfT1BUSU9OCQkJMHgwOAorCisjZGVmaW5lIFhUX0RDQ1BfVkFMSURfRkxBR1MJCTB4MGYKKworc3RydWN0IHh0X2RjY3BfaW5mbyB7CisJdV9pbnQxNl90IGRwdHNbMl07ICAvKiBNaW4sIE1heCAqLworCXVfaW50MTZfdCBzcHRzWzJdOyAgLyogTWluLCBNYXggKi8KKworCXVfaW50MTZfdCBmbGFnczsKKwl1X2ludDE2X3QgaW52ZmxhZ3M7CisKKwl1X2ludDE2X3QgdHlwZW1hc2s7CisJdV9pbnQ4X3Qgb3B0aW9uOworfTsKKworI2VuZGlmIC8qIF9YVF9EQ0NQX0hfICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0Mjc2MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfWFRfSEVMUEVSX0gKKyNkZWZpbmUgX1hUX0hFTFBFUl9ICisKK3N0cnVjdCB4dF9oZWxwZXJfaW5mbyB7CisJaW50IGludmVydDsKKwljaGFyIG5hbWVbMzBdOworfTsKKyNlbmRpZiAvKiBfWFRfSEVMUEVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2xlbmd0aC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyYjQzOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2xlbmd0aC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfWFRfTEVOR1RIX0gKKyNkZWZpbmUgX1hUX0xFTkdUSF9ICisKK3N0cnVjdCB4dF9sZW5ndGhfaW5mbyB7CisgICAgdV9pbnQxNl90CW1pbiwgbWF4OworICAgIHVfaW50OF90CWludmVydDsKK307CisKKyNlbmRpZiAvKl9YVF9MRU5HVEhfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9saW1pdC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2NlNjUzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9YVF9SQVRFX0gKKyNkZWZpbmUgX1hUX1JBVEVfSAorCisvKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCisjZGVmaW5lIFhUX0xJTUlUX1NDQUxFIDEwMDAwCisKKy8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAorICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLworc3RydWN0IHh0X3JhdGVpbmZvIHsKKwl1X2ludDMyX3QgYXZnOyAgICAvKiBBdmVyYWdlIHNlY3MgYmV0d2VlbiBwYWNrZXRzICogc2NhbGUgKi8KKwl1X2ludDMyX3QgYnVyc3Q7ICAvKiBQZXJpb2QgbXVsdGlwbGllciBmb3IgdXBwZXIgbGltaXQuICovCisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXVuc2lnbmVkIGxvbmcgcHJldjsKKwl1X2ludDMyX3QgY3JlZGl0OworCXVfaW50MzJfdCBjcmVkaXRfY2FwLCBjb3N0OworCisJLyogVWdseSwgdWdseSBmdWNrZXIuICovCisJc3RydWN0IHh0X3JhdGVpbmZvICptYXN0ZXI7Cit9OworI2VuZGlmIC8qX1hUX1JBVEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYWMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X21hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTJjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYWMuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX1hUX01BQ19ICisjZGVmaW5lIF9YVF9NQUNfSAorCitzdHJ1Y3QgeHRfbWFjX2luZm8geworICAgIHVuc2lnbmVkIGNoYXIgc3JjYWRkcltFVEhfQUxFTl07CisgICAgaW50IGludmVydDsKK307CisjZW5kaWYgLypfWFRfTUFDX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbWFyay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbWFyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmRkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYXJrLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9YVF9NQVJLX0gKKyNkZWZpbmUgX1hUX01BUktfSAorCitzdHJ1Y3QgeHRfbWFya19pbmZvIHsKKyAgICB1bnNpZ25lZCBsb25nIG1hcmssIG1hc2s7CisgICAgdV9pbnQ4X3QgaW52ZXJ0OworfTsKKworI2VuZGlmIC8qX1hUX01BUktfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9waHlzZGV2LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9waHlzZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhN2ExOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9YVF9QSFlTREVWX0gKKyNkZWZpbmUgX1hUX1BIWVNERVZfSAorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjZW5kaWYKKworI2RlZmluZSBYVF9QSFlTREVWX09QX0lOCQkweDAxCisjZGVmaW5lIFhUX1BIWVNERVZfT1BfT1VUCQkweDAyCisjZGVmaW5lIFhUX1BIWVNERVZfT1BfQlJJREdFRAkJMHgwNAorI2RlZmluZSBYVF9QSFlTREVWX09QX0lTSU4JCTB4MDgKKyNkZWZpbmUgWFRfUEhZU0RFVl9PUF9JU09VVAkJMHgxMAorI2RlZmluZSBYVF9QSFlTREVWX09QX01BU0sJCSgweDIwIC0gMSkKKworc3RydWN0IHh0X3BoeXNkZXZfaW5mbyB7CisJY2hhciBwaHlzaW5kZXZbSUZOQU1TSVpdOworCWNoYXIgaW5fbWFza1tJRk5BTVNJWl07CisJY2hhciBwaHlzb3V0ZGV2W0lGTkFNU0laXTsKKwljaGFyIG91dF9tYXNrW0lGTkFNU0laXTsKKwl1X2ludDhfdCBpbnZlcnQ7CisJdV9pbnQ4X3QgYml0bWFzazsKK307CisKKyNlbmRpZiAvKl9YVF9QSFlTREVWX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjVjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wa3R0eXBlLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9YVF9QS1RUWVBFX0gKKyNkZWZpbmUgX1hUX1BLVFRZUEVfSAorCitzdHJ1Y3QgeHRfcGt0dHlwZV9pbmZvIHsKKwlpbnQJcGt0dHlwZTsKKwlpbnQJaW52ZXJ0OworfTsKKyNlbmRpZiAvKl9YVF9QS1RUWVBFX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcmVhbG0uaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwZTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfWFRfUkVBTE1fSAorI2RlZmluZSBfWFRfUkVBTE1fSAorCitzdHJ1Y3QgeHRfcmVhbG1faW5mbyB7CisJdV9pbnQzMl90IGlkOworCXVfaW50MzJfdCBtYXNrOworCXVfaW50OF90IGludmVydDsKK307CisKKyNlbmRpZiAvKiBfWFRfUkVBTE1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc2N0cC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc2N0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNTc4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zY3RwLmgKQEAgLTAsMCArMSwxMDcgQEAKKyNpZm5kZWYgX1hUX1NDVFBfSF8KKyNkZWZpbmUgX1hUX1NDVFBfSF8KKworI2RlZmluZSBYVF9TQ1RQX1NSQ19QT1JUUwkgICAgICAgIDB4MDEKKyNkZWZpbmUgWFRfU0NUUF9ERVNUX1BPUlRTCSAgICAgICAgMHgwMgorI2RlZmluZSBYVF9TQ1RQX0NIVU5LX1RZUEVTCQkweDA0CisKKyNkZWZpbmUgWFRfU0NUUF9WQUxJRF9GTEFHUwkJMHgwNworCisjZGVmaW5lIEVMRU1DT1VOVCh4KSAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKworCitzdHJ1Y3QgeHRfc2N0cF9mbGFnX2luZm8geworCXVfaW50OF90IGNodW5rdHlwZTsKKwl1X2ludDhfdCBmbGFnOworCXVfaW50OF90IGZsYWdfbWFzazsKK307CisKKyNkZWZpbmUgWFRfTlVNX1NDVFBfRkxBR1MJNAorCitzdHJ1Y3QgeHRfc2N0cF9pbmZvIHsKKwl1X2ludDE2X3QgZHB0c1syXTsgIC8qIE1pbiwgTWF4ICovCisJdV9pbnQxNl90IHNwdHNbMl07ICAvKiBNaW4sIE1heCAqLworCisJdV9pbnQzMl90IGNodW5rbWFwWzI1NiAvIHNpemVvZiAodV9pbnQzMl90KV07ICAvKiBCaXQgbWFzayBvZiBjaHVua3MgdG8gYmUgbWF0Y2hlZCBhY2NvcmRpbmcgdG8gUkZDIDI5NjAgKi8KKworI2RlZmluZSBTQ1RQX0NIVU5LX01BVENIX0FOWSAgIDB4MDEgIC8qIE1hdGNoIGlmIGFueSBvZiB0aGUgY2h1bmsgdHlwZXMgYXJlIHByZXNlbnQgKi8KKyNkZWZpbmUgU0NUUF9DSFVOS19NQVRDSF9BTEwgICAweDAyICAvKiBNYXRjaCBpZiBhbGwgb2YgdGhlIGNodW5rIHR5cGVzIGFyZSBwcmVzZW50ICovCisjZGVmaW5lIFNDVFBfQ0hVTktfTUFUQ0hfT05MWSAgMHgwNCAgLyogTWF0Y2ggaWYgdGhlc2UgYXJlIHRoZSBvbmx5IGNodW5rIHR5cGVzIHByZXNlbnQgKi8KKworCXVfaW50MzJfdCBjaHVua19tYXRjaF90eXBlOworCXN0cnVjdCB4dF9zY3RwX2ZsYWdfaW5mbyBmbGFnX2luZm9bWFRfTlVNX1NDVFBfRkxBR1NdOworCWludCBmbGFnX2NvdW50OworCisJdV9pbnQzMl90IGZsYWdzOworCXVfaW50MzJfdCBpbnZmbGFnczsKK307CisKKyNkZWZpbmUgYnl0ZXModHlwZSkgKHNpemVvZih0eXBlKSAqIDgpCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9TRVQoY2h1bmttYXAsIHR5cGUpIAkJXAorCWRvIHsgCQkJCQkJXAorCQljaHVua21hcFt0eXBlIC8gYnl0ZXModV9pbnQzMl90KV0gfD0gCVwKKwkJCTEgPDwgKHR5cGUgJSBieXRlcyh1X2ludDMyX3QpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9DTEVBUihjaHVua21hcCwgdHlwZSkJCSAJXAorCWRvIHsJCQkJCQkJXAorCQljaHVua21hcFt0eXBlIC8gYnl0ZXModV9pbnQzMl90KV0gJj0gCQlcCisJCQl+KDEgPDwgKHR5cGUgJSBieXRlcyh1X2ludDMyX3QpKSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfSVNfU0VUKGNodW5rbWFwLCB0eXBlKSAJCQlcCisoewkJCQkJCQkJXAorCShjaHVua21hcFt0eXBlIC8gYnl0ZXMgKHVfaW50MzJfdCldICYgCQkJXAorCQkoMSA8PCAodHlwZSAlIGJ5dGVzICh1X2ludDMyX3QpKSkpID8gMTogMDsJXAorfSkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX1JFU0VUKGNodW5rbWFwKSAJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpbnQgaTsgCQkJCQkJXAorCQlmb3IgKGkgPSAwOyBpIDwgRUxFTUNPVU5UKGNodW5rbWFwKTsgaSsrKQlcCisJCQljaHVua21hcFtpXSA9IDA7CQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9TRVRfQUxMKGNodW5rbWFwKSAJCQlcCisJZG8gewkJCQkJCQlcCisJCWludCBpOyAJCQkJCQlcCisJCWZvciAoaSA9IDA7IGkgPCBFTEVNQ09VTlQoY2h1bmttYXApOyBpKyspIAlcCisJCQljaHVua21hcFtpXSA9IH4wOwkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfQ09QWShkZXN0bWFwLCBzcmNtYXApIAkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaW50IGk7IAkJCQkJCVwKKwkJZm9yIChpID0gMDsgaSA8IEVMRU1DT1VOVChjaHVua21hcCk7IGkrKykgCVwKKwkJCWRlc3RtYXBbaV0gPSBzcmNtYXBbaV07CQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9JU19DTEVBUihjaHVua21hcCkgCQlcCisoewkJCQkJCQlcCisJaW50IGk7IAkJCQkJCVwKKwlpbnQgZmxhZyA9IDE7CQkJCQlcCisJZm9yIChpID0gMDsgaSA8IEVMRU1DT1VOVChjaHVua21hcCk7IGkrKykgewlcCisJCWlmIChjaHVua21hcFtpXSkgewkJCVwKKwkJCWZsYWcgPSAwOwkJCVwKKwkJCWJyZWFrOwkJCQlcCisJCX0JCQkJCVwKKwl9CQkJCQkJXAorICAgICAgICBmbGFnOwkJCQkJCVwKK30pCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9JU19BTExfU0VUKGNodW5rbWFwKSAJCVwKKyh7CQkJCQkJCVwKKwlpbnQgaTsgCQkJCQkJXAorCWludCBmbGFnID0gMTsJCQkJCVwKKwlmb3IgKGkgPSAwOyBpIDwgRUxFTUNPVU5UKGNodW5rbWFwKTsgaSsrKSB7CVwKKwkJaWYgKGNodW5rbWFwW2ldICE9IH4wKSB7CQlcCisJCQlmbGFnID0gMDsJCQlcCisJCQkJYnJlYWs7CQkJXAorCQl9CQkJCQlcCisJfQkJCQkJCVwKKyAgICAgICAgZmxhZzsJCQkJCQlcCit9KQorCisjZW5kaWYgLyogX1hUX1NDVFBfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc3RhdGUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2ZjMyZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfWFRfU1RBVEVfSAorI2RlZmluZSBfWFRfU1RBVEVfSAorCisjZGVmaW5lIFhUX1NUQVRFX0JJVChjdGluZm8pICgxIDw8ICgoY3RpbmZvKSVJUF9DVF9JU19SRVBMWSsxKSkKKyNkZWZpbmUgWFRfU1RBVEVfSU5WQUxJRCAoMSA8PCAwKQorCisjZGVmaW5lIFhUX1NUQVRFX1VOVFJBQ0tFRCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMSkpCisKK3N0cnVjdCB4dF9zdGF0ZV9pbmZvCit7CisJdW5zaWduZWQgaW50IHN0YXRlbWFzazsKK307CisjZW5kaWYgLypfWFRfU1RBVEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdHJpbmcuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzQxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdHJpbmcuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9YVF9TVFJJTkdfSAorI2RlZmluZSBfWFRfU1RSSU5HX0gKKworI2RlZmluZSBYVF9TVFJJTkdfTUFYX1BBVFRFUk5fU0laRSAxMjgKKyNkZWZpbmUgWFRfU1RSSU5HX01BWF9BTEdPX05BTUVfU0laRSAxNgorCitzdHJ1Y3QgeHRfc3RyaW5nX2luZm8KK3sKKwl1X2ludDE2X3QgZnJvbV9vZmZzZXQ7CisJdV9pbnQxNl90IHRvX29mZnNldDsKKwljaGFyCSAgYWxnb1tYVF9TVFJJTkdfTUFYX0FMR09fTkFNRV9TSVpFXTsKKwljaGFyIAkgIHBhdHRlcm5bWFRfU1RSSU5HX01BWF9QQVRURVJOX1NJWkVdOworCXVfaW50OF90ICBwYXRsZW47CisJdV9pbnQ4X3QgIGludmVydDsKKwlzdHJ1Y3QgdHNfY29uZmlnIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKSAqY29uZmlnOworfTsKKworI2VuZGlmIC8qX1hUX1NUUklOR19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcG1zcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwbXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzMjc0YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcG1zcy5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfWFRfVENQTVNTX01BVENIX0gKKyNkZWZpbmUgX1hUX1RDUE1TU19NQVRDSF9ICisKK3N0cnVjdCB4dF90Y3Btc3NfbWF0Y2hfaW5mbyB7CisgICAgdV9pbnQxNl90IG1zc19taW4sIG1zc19tYXg7CisgICAgdV9pbnQ4X3QgaW52ZXJ0OworfTsKKworI2VuZGlmIC8qX1hUX1RDUE1TU19NQVRDSF9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiYzY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX1hUX1RDUFVEUF9ICisjZGVmaW5lIF9YVF9UQ1BVRFBfSAorCisvKiBUQ1AgbWF0Y2hpbmcgc3R1ZmYgKi8KK3N0cnVjdCB4dF90Y3AKK3sKKwl1X2ludDE2X3Qgc3B0c1syXTsJCQkvKiBTb3VyY2UgcG9ydCByYW5nZS4gKi8KKwl1X2ludDE2X3QgZHB0c1syXTsJCQkvKiBEZXN0aW5hdGlvbiBwb3J0IHJhbmdlLiAqLworCXVfaW50OF90IG9wdGlvbjsJCQkvKiBUQ1AgT3B0aW9uIGlmZiBub24temVybyovCisJdV9pbnQ4X3QgZmxnX21hc2s7CQkJLyogVENQIGZsYWdzIG1hc2sgYnl0ZSAqLworCXVfaW50OF90IGZsZ19jbXA7CQkJLyogVENQIGZsYWdzIGNvbXBhcmUgYnl0ZSAqLworCXVfaW50OF90IGludmZsYWdzOwkJCS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKy8qIFZhbHVlcyBmb3IgImludiIgZmllbGQgaW4gc3RydWN0IGlwdF90Y3AuICovCisjZGVmaW5lIFhUX1RDUF9JTlZfU1JDUFQJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNvdXJjZSBwb3J0cy4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9EU1RQVAkweDAyCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgZGVzdCBwb3J0cy4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9GTEFHUwkweDA0CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgVENQIGZsYWdzLiAqLworI2RlZmluZSBYVF9UQ1BfSU5WX09QVElPTgkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygb3B0aW9uIHRlc3QuICovCisjZGVmaW5lIFhUX1RDUF9JTlZfTUFTSwkJMHgwRgkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisKKy8qIFVEUCBtYXRjaGluZyBzdHVmZiAqLworc3RydWN0IHh0X3VkcAoreworCXVfaW50MTZfdCBzcHRzWzJdOwkJCS8qIFNvdXJjZSBwb3J0IHJhbmdlLiAqLworCXVfaW50MTZfdCBkcHRzWzJdOwkJCS8qIERlc3RpbmF0aW9uIHBvcnQgcmFuZ2UuICovCisJdV9pbnQ4X3QgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCBpcHRfdWRwLiAqLworI2RlZmluZSBYVF9VRFBfSU5WX1NSQ1BUCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBzb3VyY2UgcG9ydHMuICovCisjZGVmaW5lIFhUX1VEUF9JTlZfRFNUUFQJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGRlc3QgcG9ydHMuICovCisjZGVmaW5lIFhUX1VEUF9JTlZfTUFTSwkweDAzCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oCmluZGV4IGU5OGE4NzAuLmZkMjE3OTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaApAQCAtMTksOCArMTksMTIgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAuaD4KIAotI2RlZmluZSBBUlBUX0ZVTkNUSU9OX01BWE5BTUVMRU4gMzAKLSNkZWZpbmUgQVJQVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKKyNkZWZpbmUgQVJQVF9GVU5DVElPTl9NQVhOQU1FTEVOIFhUX0ZVTkNUSU9OX01BWE5BTUVMRU4KKyNkZWZpbmUgQVJQVF9UQUJMRV9NQVhOQU1FTEVOIFhUX1RBQkxFX01BWE5BTUVMRU4KKyNkZWZpbmUgYXJwdF90YXJnZXQgeHRfdGFyZ2V0CisjZGVmaW5lIGFycHRfdGFibGUgeHRfdGFibGUKIAogI2RlZmluZSBBUlBUX0RFVl9BRERSX0xFTl9NQVggMTYKIApAQCAtOTEsMTEgKzk1LDYgQEAKIAlpbnQgdmVyZGljdDsKIH07CiAKLXN0cnVjdCBhcnB0X2NvdW50ZXJzCi17Ci0JdV9pbnQ2NF90IHBjbnQsIGJjbnQ7CQkJLyogUGFja2V0IGFuZCBieXRlIGNvdW50ZXJzICovCi19OwotCiAvKiBWYWx1ZXMgZm9yICJmbGFnIiBmaWVsZCBpbiBzdHJ1Y3QgYXJwdF9pcCAoZ2VuZXJhbCBhcnAgc3RydWN0dXJlKS4KICAqIE5vIGZsYWdzIGRlZmluZWQgeWV0LgogICovCkBAIC0xMzAsNyArMTI5LDcgQEAKIAl1bnNpZ25lZCBpbnQgY29tZWZyb207CiAKIAkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMuICovCi0Jc3RydWN0IGFycHRfY291bnRlcnMgY291bnRlcnM7CisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzOwogCiAJLyogVGhlIG1hdGNoZXMgKGlmIGFueSksIHRoZW4gdGhlIHRhcmdldC4gKi8KIAl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdOwpAQCAtMTQxLDIzICsxNDAsMjQgQEAKICAqIFVubGlrZSBCU0QgTGludXggaW5oZXJpdHMgSVAgb3B0aW9ucyBzbyB5b3UgZG9uJ3QgaGF2ZSB0byB1c2UgYSByYXcKICAqIHNvY2tldCBmb3IgdGhpcy4gSW5zdGVhZCB3ZSBjaGVjayByaWdodHMgaW4gdGhlIGNhbGxzLgogICovCi0jZGVmaW5lIEFSUFRfQkFTRV9DVEwJCTk2CS8qIGJhc2UgZm9yIGZpcmV3YWxsIHNvY2tldCBvcHRpb25zICovCisjZGVmaW5lIEFSUFRfQ1RMX09GRlNFVAkJMzIKKyNkZWZpbmUgQVJQVF9CQVNFX0NUTAkJKFhUX0JBU0VfQ1RMK0FSUFRfQ1RMX09GRlNFVCkKIAotI2RlZmluZSBBUlBUX1NPX1NFVF9SRVBMQUNFCQkoQVJQVF9CQVNFX0NUTCkKLSNkZWZpbmUgQVJQVF9TT19TRVRfQUREX0NPVU5URVJTCShBUlBUX0JBU0VfQ1RMICsgMSkKLSNkZWZpbmUgQVJQVF9TT19TRVRfTUFYCQkJQVJQVF9TT19TRVRfQUREX0NPVU5URVJTCisjZGVmaW5lIEFSUFRfU09fU0VUX1JFUExBQ0UJCShYVF9TT19TRVRfUkVQTEFDRStBUlBUX0NUTF9PRkZTRVQpCisjZGVmaW5lIEFSUFRfU09fU0VUX0FERF9DT1VOVEVSUwkoWFRfU09fU0VUX0FERF9DT1VOVEVSUytBUlBUX0NUTF9PRkZTRVQpCisjZGVmaW5lIEFSUFRfU09fU0VUX01BWAkJCShYVF9TT19TRVRfTUFYK0FSUFRfQ1RMX09GRlNFVCkKIAotI2RlZmluZSBBUlBUX1NPX0dFVF9JTkZPCQkoQVJQVF9CQVNFX0NUTCkKLSNkZWZpbmUgQVJQVF9TT19HRVRfRU5UUklFUwkJKEFSUFRfQkFTRV9DVEwgKyAxKQotLyogI2RlZmluZSBBUlBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoQVJQVF9CQVNFX0NUTCArIDIpKi8KLSNkZWZpbmUgQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShBUlBUX0JBU0VfQ1RMICsgMykKLSNkZWZpbmUgQVJQVF9TT19HRVRfTUFYCQkJQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCisjZGVmaW5lIEFSUFRfU09fR0VUX0lORk8JCShYVF9TT19HRVRfSU5GTytBUlBUX0NUTF9PRkZTRVQpCisjZGVmaW5lIEFSUFRfU09fR0VUX0VOVFJJRVMJCShYVF9TT19HRVRfRU5UUklFUytBUlBUX0NUTF9PRkZTRVQpCisvKiAjZGVmaW5lIEFSUFRfU09fR0VUX1JFVklTSU9OX01BVENICVhUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSCAgKi8KKyNkZWZpbmUgQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUK0FSUFRfQ1RMX09GRlNFVCkKKyNkZWZpbmUgQVJQVF9TT19HRVRfTUFYCQkJKFhUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQrQVJQVF9DVExfT0ZGU0VUKQogCiAvKiBDT05USU5VRSB2ZXJkaWN0IGZvciB0YXJnZXRzICovCi0jZGVmaW5lIEFSUFRfQ09OVElOVUUgMHhGRkZGRkZGRgorI2RlZmluZSBBUlBUX0NPTlRJTlVFIFhUX0NPTlRJTlVFCiAKIC8qIEZvciBzdGFuZGFyZCB0YXJnZXQgKi8KLSNkZWZpbmUgQVJQVF9SRVRVUk4gKC1ORl9SRVBFQVQgLSAxKQorI2RlZmluZSBBUlBUX1JFVFVSTiBYVF9SRVRVUk4KIAogLyogVGhlIGFyZ3VtZW50IHRvIEFSUFRfU09fR0VUX0lORk8gKi8KIHN0cnVjdCBhcnB0X2dldGluZm8KQEAgLTIwOCwyMyArMjA4LDE0IEBACiAJLyogTnVtYmVyIG9mIGNvdW50ZXJzIChtdXN0IGJlIGVxdWFsIHRvIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMpLiAqLwogCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CiAJLyogVGhlIG9sZCBlbnRyaWVzJyBjb3VudGVycy4gKi8KLQlzdHJ1Y3QgYXJwdF9jb3VudGVycyBfX3VzZXIgKmNvdW50ZXJzOworCXN0cnVjdCB4dF9jb3VudGVycyBfX3VzZXIgKmNvdW50ZXJzOwogCiAJLyogVGhlIGVudHJpZXMgKGhhbmcgb2ZmIGVuZDogbm90IHJlYWxseSBhbiBhcnJheSkuICovCiAJc3RydWN0IGFycHRfZW50cnkgZW50cmllc1swXTsKIH07CiAKIC8qIFRoZSBhcmd1bWVudCB0byBBUlBUX1NPX0FERF9DT1VOVEVSUy4gKi8KLXN0cnVjdCBhcnB0X2NvdW50ZXJzX2luZm8KLXsKLQkvKiBXaGljaCB0YWJsZS4gKi8KLQljaGFyIG5hbWVbQVJQVF9UQUJMRV9NQVhOQU1FTEVOXTsKLQotCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7Ci0KLQkvKiBUaGUgY291bnRlcnMgKGFjdHVhbGx5IGBudW1iZXInIG9mIHRoZXNlKS4gKi8KLQlzdHJ1Y3QgYXJwdF9jb3VudGVycyBjb3VudGVyc1swXTsKLX07CisjZGVmaW5lIGFycHRfY291bnRlcnNfaW5mbyB4dF9jb3VudGVyc19pbmZvCiAKIC8qIFRoZSBhcmd1bWVudCB0byBBUlBUX1NPX0dFVF9FTlRSSUVTLiAqLwogc3RydWN0IGFycHRfZ2V0X2VudHJpZXMKQEAgLTIzOSwxOSArMjMwLDEwIEBACiAJc3RydWN0IGFycHRfZW50cnkgZW50cnl0YWJsZVswXTsKIH07CiAKLS8qIFRoZSBhcmd1bWVudCB0byBBUlBUX1NPX0dFVF9SRVZJU0lPTl8qLiAgUmV0dXJucyBoaWdoZXN0IHJldmlzaW9uCi0gKiBrZXJuZWwgc3VwcG9ydHMsIGlmID49IHJldmlzaW9uLiAqLwotc3RydWN0IGFycHRfZ2V0X3JldmlzaW9uCi17Ci0JY2hhciBuYW1lW0FSUFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKLQotCXVfaW50OF90IHJldmlzaW9uOwotfTsKLQogLyogU3RhbmRhcmQgcmV0dXJuIHZlcmRpY3QsIG9yIGRvIGp1bXAuICovCi0jZGVmaW5lIEFSUFRfU1RBTkRBUkRfVEFSR0VUICIiCisjZGVmaW5lIEFSUFRfU1RBTkRBUkRfVEFSR0VUIFhUX1NUQU5EQVJEX1RBUkdFVAogLyogRXJyb3IgdmVyZGljdC4gKi8KLSNkZWZpbmUgQVJQVF9FUlJPUl9UQVJHRVQgIkVSUk9SIgorI2RlZmluZSBBUlBUX0VSUk9SX1RBUkdFVCBYVF9FUlJPUl9UQVJHRVQKIAogLyogSGVscGVyIGZ1bmN0aW9ucyAqLwogc3RhdGljIF9faW5saW5lX18gc3RydWN0IGFycHRfZW50cnlfdGFyZ2V0ICphcnB0X2dldF90YXJnZXQoc3RydWN0IGFycHRfZW50cnkgKmUpCkBAIC0yODEsNjMgKzI2Myw4IEBACiAgKi8KICNpZmRlZiBfX0tFUk5FTF9fCiAKLS8qIFJlZ2lzdHJhdGlvbiBob29rcyBmb3IgdGFyZ2V0cy4gKi8KLXN0cnVjdCBhcnB0X3RhcmdldAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCWNvbnN0IGNoYXIgbmFtZVtBUlBUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07Ci0KLQl1X2ludDhfdCByZXZpc2lvbjsKLQotCS8qIFJldHVybnMgdmVyZGljdC4gKi8KLQl1bnNpZ25lZCBpbnQgKCp0YXJnZXQpKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCSAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKLQkJCSAgICAgICB2b2lkICp1c2VyZGF0YSk7Ci0KLQkvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGU6Ci0gICAgICAgICAgIGhvb2tfbWFzayBpcyBhIGJpdG1hc2sgb2YgaG9va3MgZnJvbSB3aGljaCBpdCBjYW4gYmUKLSAgICAgICAgICAgY2FsbGVkLiAqLwotCS8qIFNob3VsZCByZXR1cm4gdHJ1ZSBvciBmYWxzZS4gKi8KLQlpbnQgKCpjaGVja2VudHJ5KShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgIGNvbnN0IHN0cnVjdCBhcnB0X2VudHJ5ICplLAotCQkJICB2b2lkICp0YXJnaW5mbywKLQkJCSAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKLQkJCSAgdW5zaWduZWQgaW50IGhvb2tfbWFzayk7Ci0KLQkvKiBDYWxsZWQgd2hlbiBlbnRyeSBvZiB0aGlzIHR5cGUgZGVsZXRlZC4gKi8KLQl2b2lkICgqZGVzdHJveSkodm9pZCAqdGFyZ2luZm8sIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUpOwotCi0JLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUgaWYgeW91IGFyZSBhIG1vZHVsZSwgb3RoZXJ3aXNlIE5VTEwgKi8KLQlzdHJ1Y3QgbW9kdWxlICptZTsKLX07Ci0KLWV4dGVybiBpbnQgYXJwdF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGFycHRfdGFyZ2V0ICp0YXJnZXQpOwotZXh0ZXJuIHZvaWQgYXJwdF91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgYXJwdF90YXJnZXQgKnRhcmdldCk7Ci0KLS8qIEZ1cm5pdHVyZSBzaG9wcGluZy4uLiAqLwotc3RydWN0IGFycHRfdGFibGUKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQkvKiBBIHVuaXF1ZSBuYW1lLi4uICovCi0JY2hhciBuYW1lW0FSUFRfVEFCTEVfTUFYTkFNRUxFTl07Ci0KLQkvKiBXaGF0IGhvb2tzIHlvdSB3aWxsIGVudGVyIG9uICovCi0JdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOwotCi0JLyogTG9jayBmb3IgdGhlIGN1cnRhaW4gKi8KLQlyd2xvY2tfdCBsb2NrOwotCi0JLyogTWFuIGJlaGluZCB0aGUgY3VydGFpbi4uLiAqLwotCXN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKnByaXZhdGU7Ci0KLQkvKiBTZXQgdGhpcyB0byBUSElTX01PRFVMRSBpZiB5b3UgYXJlIGEgbW9kdWxlLCBvdGhlcndpc2UgTlVMTCAqLwotCXN0cnVjdCBtb2R1bGUgKm1lOwotfTsKKyNkZWZpbmUgYXJwdF9yZWdpc3Rlcl90YXJnZXQodGd0KSB4dF9yZWdpc3Rlcl90YXJnZXQoTkZfQVJQLCB0Z3QpCisjZGVmaW5lIGFycHRfdW5yZWdpc3Rlcl90YXJnZXQodGd0KSB4dF91bnJlZ2lzdGVyX3RhcmdldChORl9BUlAsIHRndCkKIAogZXh0ZXJuIGludCBhcnB0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBhcnB0X3RhYmxlICp0YWJsZSwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYXJwdF9yZXBsYWNlICpyZXBsKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oCmluZGV4IGIzNDMyYWIuLjIxNTc2NWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaApAQCAtMTk5LDkgKzE5OSw2IEBACiAJbmZfY29ubnRyYWNrX3B1dCgmY3QtPmN0X2dlbmVyYWwpOwogfQogCi0vKiBjYWxsIHRvIGNyZWF0ZSBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIGlwX2Nvbm50cmFjay4gKi8KLWV4dGVybiB2b2lkIG5lZWRfaXBfY29ubnRyYWNrKHZvaWQpOwotCiBleHRlcm4gaW50IGludmVydF90dXBsZXByKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKmludmVyc2UsCiAJCQkgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm9yaWcpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaAppbmRleCBkMTlkNjVjLi43NmJhMjRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmgKQEAgLTI1LDggKzI1LDE0IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogCi0jZGVmaW5lIElQVF9GVU5DVElPTl9NQVhOQU1FTEVOIDMwCi0jZGVmaW5lIElQVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKKyNkZWZpbmUgSVBUX0ZVTkNUSU9OX01BWE5BTUVMRU4gWFRfRlVOQ1RJT05fTUFYTkFNRUxFTgorI2RlZmluZSBJUFRfVEFCTEVfTUFYTkFNRUxFTiBYVF9GVU5DVElPTl9NQVhOQU1FTEVOCisjZGVmaW5lIGlwdF9tYXRjaCB4dF9tYXRjaAorI2RlZmluZSBpcHRfdGFyZ2V0IHh0X3RhcmdldAorI2RlZmluZSBpcHRfdGFibGUgeHRfdGFibGUKKyNkZWZpbmUgaXB0X2dldF9yZXZpc2lvbiB4dF9nZXRfcmV2aXNpb24KIAogLyogWWVzLCBWaXJnaW5pYSwgeW91IGhhdmUgdG8gemVybyB0aGUgcGFkZGluZy4gKi8KIHN0cnVjdCBpcHRfaXAgewpAQCAtMTAyLDEwICsxMDgsNyBAQAogCWludCB2ZXJkaWN0OwogfTsKIAotc3RydWN0IGlwdF9jb3VudGVycwotewotCXVfaW50NjRfdCBwY250LCBiY250OwkJCS8qIFBhY2tldCBhbmQgYnl0ZSBjb3VudGVycyAqLwotfTsKKyNkZWZpbmUgaXB0X2NvdW50ZXJzIHh0X2NvdW50ZXJzCiAKIC8qIFZhbHVlcyBmb3IgImZsYWciIGZpZWxkIGluIHN0cnVjdCBpcHRfaXAgKGdlbmVyYWwgaXAgc3RydWN0dXJlKS4gKi8KICNkZWZpbmUgSVBUX0ZfRlJBRwkJMHgwMQkvKiBTZXQgaWYgcnVsZSBpcyBhIGZyYWdtZW50IHJ1bGUgKi8KQEAgLTExOSw3ICsxMjIsNyBAQAogI2RlZmluZSBJUFRfSU5WX1NSQ0lQCQkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgU1JDIElQLiAqLwogI2RlZmluZSBJUFRfSU5WX0RTVElQCQkweDEwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgRFNUIE9QLiAqLwogI2RlZmluZSBJUFRfSU5WX0ZSQUcJCTB4MjAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBGUkFHLiAqLwotI2RlZmluZSBJUFRfSU5WX1BST1RPCQkweDQwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgUFJPVE8uICovCisjZGVmaW5lIElQVF9JTlZfUFJPVE8JCVhUX0lOVl9QUk9UTwogI2RlZmluZSBJUFRfSU5WX01BU0sJCTB4N0YJLyogQWxsIHBvc3NpYmxlIGZsYWcgYml0cyBtYXNrLiAqLwogCiAvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGVhY2ggb2YgdGhlIGZpcmV3YWxsIHJ1bGVzLiAgQ29uc2lzdHMgb2YgMwpAQCAtMTQxLDcgKzE0NCw3IEBACiAJdW5zaWduZWQgaW50IGNvbWVmcm9tOwogCiAJLyogUGFja2V0IGFuZCBieXRlIGNvdW50ZXJzLiAqLwotCXN0cnVjdCBpcHRfY291bnRlcnMgY291bnRlcnM7CisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzOwogCiAJLyogVGhlIG1hdGNoZXMgKGlmIGFueSksIHRoZW4gdGhlIHRhcmdldC4gKi8KIAl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdOwpAQCAtMTUxLDU0ICsxNTQsMzQgQEAKICAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCiAgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlIGEgcmF3CiAgKiBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4gKi8KLSNkZWZpbmUgSVBUX0JBU0VfQ1RMCQk2NAkvKiBiYXNlIGZvciBmaXJld2FsbCBzb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBJUFRfQkFTRV9DVEwJCVhUX0JBU0VfQ1RMCiAKLSNkZWZpbmUgSVBUX1NPX1NFVF9SRVBMQUNFCShJUFRfQkFTRV9DVEwpCi0jZGVmaW5lIElQVF9TT19TRVRfQUREX0NPVU5URVJTCShJUFRfQkFTRV9DVEwgKyAxKQotI2RlZmluZSBJUFRfU09fU0VUX01BWAkJSVBUX1NPX1NFVF9BRERfQ09VTlRFUlMKKyNkZWZpbmUgSVBUX1NPX1NFVF9SRVBMQUNFCVhUX1NPX1NFVF9SRVBMQUNFCisjZGVmaW5lIElQVF9TT19TRVRfQUREX0NPVU5URVJTCVhUX1NPX1NFVF9BRERfQ09VTlRFUlMKKyNkZWZpbmUgSVBUX1NPX1NFVF9NQVgJCVhUX1NPX1NFVF9NQVgKIAotI2RlZmluZSBJUFRfU09fR0VUX0lORk8JCQkoSVBUX0JBU0VfQ1RMKQotI2RlZmluZSBJUFRfU09fR0VUX0VOVFJJRVMJCShJUFRfQkFTRV9DVEwgKyAxKQotI2RlZmluZSBJUFRfU09fR0VUX1JFVklTSU9OX01BVENICShJUFRfQkFTRV9DVEwgKyAyKQotI2RlZmluZSBJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAkoSVBUX0JBU0VfQ1RMICsgMykKLSNkZWZpbmUgSVBUX1NPX0dFVF9NQVgJCQlJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAorI2RlZmluZSBJUFRfU09fR0VUX0lORk8JCQlYVF9TT19HRVRfSU5GTworI2RlZmluZSBJUFRfU09fR0VUX0VOVFJJRVMJCVhUX1NPX0dFVF9FTlRSSUVTCisjZGVmaW5lIElQVF9TT19HRVRfUkVWSVNJT05fTUFUQ0gJWFRfU09fR0VUX1JFVklTSU9OX01BVENICisjZGVmaW5lIElQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCVhUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKKyNkZWZpbmUgSVBUX1NPX0dFVF9NQVgJCQlYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCiAKLS8qIENPTlRJTlVFIHZlcmRpY3QgZm9yIHRhcmdldHMgKi8KLSNkZWZpbmUgSVBUX0NPTlRJTlVFIDB4RkZGRkZGRkYKKyNkZWZpbmUgSVBUX0NPTlRJTlVFIFhUX0NPTlRJTlVFCisjZGVmaW5lIElQVF9SRVRVUk4gWFRfUkVUVVJOCiAKLS8qIEZvciBzdGFuZGFyZCB0YXJnZXQgKi8KLSNkZWZpbmUgSVBUX1JFVFVSTiAoLU5GX1JFUEVBVCAtIDEpCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oPgorI2RlZmluZSBpcHRfdWRwIHh0X3VkcAorI2RlZmluZSBpcHRfdGNwIHh0X3RjcAogCi0vKiBUQ1AgbWF0Y2hpbmcgc3R1ZmYgKi8KLXN0cnVjdCBpcHRfdGNwCi17Ci0JdV9pbnQxNl90IHNwdHNbMl07CQkJLyogU291cmNlIHBvcnQgcmFuZ2UuICovCi0JdV9pbnQxNl90IGRwdHNbMl07CQkJLyogRGVzdGluYXRpb24gcG9ydCByYW5nZS4gKi8KLQl1X2ludDhfdCBvcHRpb247CQkJLyogVENQIE9wdGlvbiBpZmYgbm9uLXplcm8qLwotCXVfaW50OF90IGZsZ19tYXNrOwkJCS8qIFRDUCBmbGFncyBtYXNrIGJ5dGUgKi8KLQl1X2ludDhfdCBmbGdfY21wOwkJCS8qIFRDUCBmbGFncyBjb21wYXJlIGJ5dGUgKi8KLQl1X2ludDhfdCBpbnZmbGFnczsJCQkvKiBJbnZlcnNlIGZsYWdzICovCi19OworI2RlZmluZSBJUFRfVENQX0lOVl9TUkNQVAlYVF9UQ1BfSU5WX1NSQ1BUCisjZGVmaW5lIElQVF9UQ1BfSU5WX0RTVFBUCVhUX1RDUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVBUX1RDUF9JTlZfRkxBR1MJWFRfVENQX0lOVl9GTEFHUworI2RlZmluZSBJUFRfVENQX0lOVl9PUFRJT04JWFRfVENQX0lOVl9PUFRJT04KKyNkZWZpbmUgSVBUX1RDUF9JTlZfTUFTSwlYVF9UQ1BfSU5WX01BU0sKIAotLyogVmFsdWVzIGZvciAiaW52IiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X3RjcC4gKi8KLSNkZWZpbmUgSVBUX1RDUF9JTlZfU1JDUFQJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNvdXJjZSBwb3J0cy4gKi8KLSNkZWZpbmUgSVBUX1RDUF9JTlZfRFNUUFQJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGRlc3QgcG9ydHMuICovCi0jZGVmaW5lIElQVF9UQ1BfSU5WX0ZMQUdTCTB4MDQJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBUQ1AgZmxhZ3MuICovCi0jZGVmaW5lIElQVF9UQ1BfSU5WX09QVElPTgkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygb3B0aW9uIHRlc3QuICovCi0jZGVmaW5lIElQVF9UQ1BfSU5WX01BU0sJMHgwRgkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCi0KLS8qIFVEUCBtYXRjaGluZyBzdHVmZiAqLwotc3RydWN0IGlwdF91ZHAKLXsKLQl1X2ludDE2X3Qgc3B0c1syXTsJCQkvKiBTb3VyY2UgcG9ydCByYW5nZS4gKi8KLQl1X2ludDE2X3QgZHB0c1syXTsJCQkvKiBEZXN0aW5hdGlvbiBwb3J0IHJhbmdlLiAqLwotCXVfaW50OF90IGludmZsYWdzOwkJCS8qIEludmVyc2UgZmxhZ3MgKi8KLX07Ci0KLS8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X3VkcC4gKi8KLSNkZWZpbmUgSVBUX1VEUF9JTlZfU1JDUFQJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNvdXJjZSBwb3J0cy4gKi8KLSNkZWZpbmUgSVBUX1VEUF9JTlZfRFNUUFQJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGRlc3QgcG9ydHMuICovCi0jZGVmaW5lIElQVF9VRFBfSU5WX01BU0sJMHgwMwkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisjZGVmaW5lIElQVF9VRFBfSU5WX1NSQ1BUCVhUX1VEUF9JTlZfU1JDUFQKKyNkZWZpbmUgSVBUX1VEUF9JTlZfRFNUUFQJWFRfVURQX0lOVl9EU1RQVAorI2RlZmluZSBJUFRfVURQX0lOVl9NQVNLCVhUX1VEUF9JTlZfTUFTSwogCiAvKiBJQ01QIG1hdGNoaW5nIHN0dWZmICovCiBzdHJ1Y3QgaXB0X2ljbXAKQEAgLTI2MCwyMyArMjQzLDE0IEBACiAJLyogTnVtYmVyIG9mIGNvdW50ZXJzIChtdXN0IGJlIGVxdWFsIHRvIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMpLiAqLwogCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CiAJLyogVGhlIG9sZCBlbnRyaWVzJyBjb3VudGVycy4gKi8KLQlzdHJ1Y3QgaXB0X2NvdW50ZXJzIF9fdXNlciAqY291bnRlcnM7CisJc3RydWN0IHh0X2NvdW50ZXJzIF9fdXNlciAqY291bnRlcnM7CiAKIAkvKiBUaGUgZW50cmllcyAoaGFuZyBvZmYgZW5kOiBub3QgcmVhbGx5IGFuIGFycmF5KS4gKi8KIAlzdHJ1Y3QgaXB0X2VudHJ5IGVudHJpZXNbMF07CiB9OwogCiAvKiBUaGUgYXJndW1lbnQgdG8gSVBUX1NPX0FERF9DT1VOVEVSUy4gKi8KLXN0cnVjdCBpcHRfY291bnRlcnNfaW5mbwotewotCS8qIFdoaWNoIHRhYmxlLiAqLwotCWNoYXIgbmFtZVtJUFRfVEFCTEVfTUFYTkFNRUxFTl07Ci0KLQl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOwotCi0JLyogVGhlIGNvdW50ZXJzIChhY3R1YWxseSBgbnVtYmVyJyBvZiB0aGVzZSkuICovCi0Jc3RydWN0IGlwdF9jb3VudGVycyBjb3VudGVyc1swXTsKLX07CisjZGVmaW5lIGlwdF9jb3VudGVyc19pbmZvIHh0X2NvdW50ZXJzX2luZm8KIAogLyogVGhlIGFyZ3VtZW50IHRvIElQVF9TT19HRVRfRU5UUklFUy4gKi8KIHN0cnVjdCBpcHRfZ2V0X2VudHJpZXMKQEAgLTI5MSwxOSArMjY1LDEwIEBACiAJc3RydWN0IGlwdF9lbnRyeSBlbnRyeXRhYmxlWzBdOwogfTsKIAotLyogVGhlIGFyZ3VtZW50IHRvIElQVF9TT19HRVRfUkVWSVNJT05fKi4gIFJldHVybnMgaGlnaGVzdCByZXZpc2lvbgotICoga2VybmVsIHN1cHBvcnRzLCBpZiA+PSByZXZpc2lvbi4gKi8KLXN0cnVjdCBpcHRfZ2V0X3JldmlzaW9uCi17Ci0JY2hhciBuYW1lW0lQVF9GVU5DVElPTl9NQVhOQU1FTEVOLTFdOwotCi0JdV9pbnQ4X3QgcmV2aXNpb247Ci19OwotCiAvKiBTdGFuZGFyZCByZXR1cm4gdmVyZGljdCwgb3IgZG8ganVtcC4gKi8KLSNkZWZpbmUgSVBUX1NUQU5EQVJEX1RBUkdFVCAiIgorI2RlZmluZSBJUFRfU1RBTkRBUkRfVEFSR0VUIFhUX1NUQU5EQVJEX1RBUkdFVAogLyogRXJyb3IgdmVyZGljdC4gKi8KLSNkZWZpbmUgSVBUX0VSUk9SX1RBUkdFVCAiRVJST1IiCisjZGVmaW5lIElQVF9FUlJPUl9UQVJHRVQgWFRfRVJST1JfVEFSR0VUCiAKIC8qIEhlbHBlciBmdW5jdGlvbnMgKi8KIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICoKQEAgLTM1NiwxMDMgKzMyMSwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIGV4dGVybiB2b2lkIGlwdF9pbml0KHZvaWQpIF9faW5pdDsKIAotc3RydWN0IGlwdF9tYXRjaAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKyNkZWZpbmUgaXB0X3JlZ2lzdGVyX3RhcmdldCh0Z3QpIHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCB0Z3QpCisjZGVmaW5lIGlwdF91bnJlZ2lzdGVyX3RhcmdldCh0Z3QpIHh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsIHRndCkKIAotCWNvbnN0IGNoYXIgbmFtZVtJUFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKKyNkZWZpbmUgaXB0X3JlZ2lzdGVyX21hdGNoKG10Y2gpIHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsIG10Y2gpCisjZGVmaW5lIGlwdF91bnJlZ2lzdGVyX21hdGNoKG10Y2gpIHh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgbXRjaCkKIAotCXVfaW50OF90IHJldmlzaW9uOworLy8jZGVmaW5lIGlwdF9yZWdpc3Rlcl90YWJsZSh0YmwsIHJlcGwpIHh0X3JlZ2lzdGVyX3RhYmxlKEFGX0lORVQsIHRibCwgcmVwbCkKKy8vI2RlZmluZSBpcHRfdW5yZWdpc3Rlcl90YWJsZSh0YmwpIHh0X3VucmVnaXN0ZXJfdGFibGUoQUZfSU5FVCwgdGJsKQogCi0JLyogUmV0dXJuIHRydWUgb3IgZmFsc2U6IHJldHVybiBGQUxTRSBhbmQgc2V0ICpob3Rkcm9wID0gMSB0bwotICAgICAgICAgICBmb3JjZSBpbW1lZGlhdGUgcGFja2V0IGRyb3AuICovCi0JLyogQXJndW1lbnRzIGNoYW5nZWQgc2luY2UgMi40LCBhcyB0aGlzIG11c3Qgbm93IGhhbmRsZQotICAgICAgICAgICBub24tbGluZWFyIHNrYnMsIHVzaW5nIHNrYl9jb3B5X2JpdHMgYW5kCi0gICAgICAgICAgIHNrYl9pcF9tYWtlX3dyaXRhYmxlLiAqLwotCWludCAoKm1hdGNoKShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLQkJICAgICBpbnQgb2Zmc2V0LAotCQkgICAgIGludCAqaG90ZHJvcCk7Ci0KLQkvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCi0JLyogU2hvdWxkIHJldHVybiB0cnVlIG9yIGZhbHNlLiAqLwotCWludCAoKmNoZWNrZW50cnkpKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JCQkgIHZvaWQgKm1hdGNoaW5mbywKLQkJCSAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCi0JCQkgIHVuc2lnbmVkIGludCBob29rX21hc2spOwotCi0JLyogQ2FsbGVkIHdoZW4gZW50cnkgb2YgdGhpcyB0eXBlIGRlbGV0ZWQuICovCi0Jdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUpOwotCi0JLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUuICovCi0Jc3RydWN0IG1vZHVsZSAqbWU7Ci19OwotCi0vKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCi1zdHJ1Y3QgaXB0X3RhcmdldAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCWNvbnN0IGNoYXIgbmFtZVtJUFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKLQotCXVfaW50OF90IHJldmlzaW9uOwotCi0JLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlOgotICAgICAgICAgICBob29rX21hc2sgaXMgYSBiaXRtYXNrIG9mIGhvb2tzIGZyb20gd2hpY2ggaXQgY2FuIGJlCi0gICAgICAgICAgIGNhbGxlZC4gKi8KLQkvKiBTaG91bGQgcmV0dXJuIHRydWUgb3IgZmFsc2UuICovCi0JaW50ICgqY2hlY2tlbnRyeSkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkJICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAotCQkJICB2b2lkICp0YXJnaW5mbywKLQkJCSAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKLQkJCSAgdW5zaWduZWQgaW50IGhvb2tfbWFzayk7Ci0KLQkvKiBDYWxsZWQgd2hlbiBlbnRyeSBvZiB0aGlzIHR5cGUgZGVsZXRlZC4gKi8KLQl2b2lkICgqZGVzdHJveSkodm9pZCAqdGFyZ2luZm8sIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUpOwotCi0JLyogUmV0dXJucyB2ZXJkaWN0LiAgQXJndW1lbnQgb3JkZXIgY2hhbmdlZCBzaW5jZSAyLjQsIGFzIHRoaXMKLSAgICAgICAgICAgbXVzdCBub3cgaGFuZGxlIG5vbi1saW5lYXIgc2ticywgdXNpbmcgc2tiX2NvcHlfYml0cyBhbmQKLSAgICAgICAgICAgc2tiX2lwX21ha2Vfd3JpdGFibGUuICovCi0JdW5zaWduZWQgaW50ICgqdGFyZ2V0KShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCi0JCQkgICAgICAgdm9pZCAqdXNlcmRhdGEpOwotCi0JLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUuICovCi0Jc3RydWN0IG1vZHVsZSAqbWU7Ci19OwotCi1leHRlcm4gaW50IGlwdF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldCk7Ci1leHRlcm4gdm9pZCBpcHRfdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldCk7Ci0KLWV4dGVybiBpbnQgaXB0X3JlZ2lzdGVyX21hdGNoKHN0cnVjdCBpcHRfbWF0Y2ggKm1hdGNoKTsKLWV4dGVybiB2b2lkIGlwdF91bnJlZ2lzdGVyX21hdGNoKHN0cnVjdCBpcHRfbWF0Y2ggKm1hdGNoKTsKLQotLyogRnVybml0dXJlIHNob3BwaW5nLi4uICovCi1zdHJ1Y3QgaXB0X3RhYmxlCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCi0JLyogQSB1bmlxdWUgbmFtZS4uLiAqLwotCWNoYXIgbmFtZVtJUFRfVEFCTEVfTUFYTkFNRUxFTl07Ci0KLQkvKiBXaGF0IGhvb2tzIHlvdSB3aWxsIGVudGVyIG9uICovCi0JdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOwotCi0JLyogTG9jayBmb3IgdGhlIGN1cnRhaW4gKi8KLQlyd2xvY2tfdCBsb2NrOwotCi0JLyogTWFuIGJlaGluZCB0aGUgY3VydGFpbi4uLiAqLwotCXN0cnVjdCBpcHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKLQotCS8qIFNldCB0byBUSElTX01PRFVMRS4gKi8KLQlzdHJ1Y3QgbW9kdWxlICptZTsKLX07CitleHRlcm4gaW50IGlwdF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfcmVwbGFjZSAqcmVwbCk7CitleHRlcm4gdm9pZCBpcHRfdW5yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSk7CiAKIC8qIG5ldC9zY2hlZC9pcHQuYzogR2ltbWUgYWNjZXNzIHRvIHlvdXIgdGFyZ2V0cyEgIEdldHMgdGFyZ2V0LT5tZS4gKi8KIGV4dGVybiBzdHJ1Y3QgaXB0X3RhcmdldCAqaXB0X2ZpbmRfdGFyZ2V0KGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKTsKQEAgLTQ3Niw5ICszNTYsNiBAQAogCXN0cnVjdCBpcHRfZXJyb3JfdGFyZ2V0IHRhcmdldDsKIH07CiAKLWV4dGVybiBpbnQgaXB0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGlwdF9yZXBsYWNlICpyZXBsKTsKLWV4dGVybiB2b2lkIGlwdF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgaXB0X2RvX3RhYmxlKHN0cnVjdCBza19idWZmICoqcHNrYiwKIAkJCQkgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKQEAgLTQ4Niw2ICszNjMsNiBAQAogCQkJCSBzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSwKIAkJCQkgdm9pZCAqdXNlcmRhdGEpOwogCi0jZGVmaW5lIElQVF9BTElHTihzKSAoKChzKSArIChfX2FsaWdub2ZfXyhzdHJ1Y3QgaXB0X2VudHJ5KS0xKSkgJiB+KF9fYWxpZ25vZl9fKHN0cnVjdCBpcHRfZW50cnkpLTEpKQorI2RlZmluZSBJUFRfQUxJR04ocykgWFRfQUxJR04ocykKICNlbmRpZiAvKl9fS0VSTkVMX18qLwogI2VuZGlmIC8qIF9JUFRBQkxFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTEFTU0lGWS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xBU1NJRlkuaAppbmRleCA3NTk2ZTNkLi5hNDZkNTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTEFTU0lGWS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NMQVNTSUZZLmgKQEAgLTEsOCArMSw3IEBACiAjaWZuZGVmIF9JUFRfQ0xBU1NJRllfSAogI2RlZmluZSBfSVBUX0NMQVNTSUZZX0gKIAotc3RydWN0IGlwdF9jbGFzc2lmeV90YXJnZXRfaW5mbyB7Ci0JdV9pbnQzMl90IHByaW9yaXR5OwotfTsKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuaD4KKyNkZWZpbmUgaXB0X2NsYXNzaWZ5X3RhcmdldF9pbmZvIHh0X2NsYXNzaWZ5X3RhcmdldF9pbmZvCiAKICNlbmRpZiAvKl9JUFRfQ0xBU1NJRllfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ09OTk1BUksuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NPTk5NQVJLLmgKaW5kZXggZDNjMDI1My4uOWVjZmVlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ09OTk1BUksuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DT05OTUFSSy5oCkBAIC05LDE3ICs5LDExIEBACiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oPgorI2RlZmluZSBJUFRfQ09OTk1BUktfU0VUCVhUX0NPTk5NQVJLX1NFVAorI2RlZmluZSBJUFRfQ09OTk1BUktfU0FWRQlYVF9DT05OTUFSS19TQVZFCisjZGVmaW5lCUlQVF9DT05OTUFSS19SRVNUT1JFCVhUX0NPTk5NQVJLX1JFU1RPUkUKIAotZW51bSB7Ci0JSVBUX0NPTk5NQVJLX1NFVCA9IDAsCi0JSVBUX0NPTk5NQVJLX1NBVkUsCi0JSVBUX0NPTk5NQVJLX1JFU1RPUkUKLX07Ci0KLXN0cnVjdCBpcHRfY29ubm1hcmtfdGFyZ2V0X2luZm8gewotCXVuc2lnbmVkIGxvbmcgbWFyazsKLQl1bnNpZ25lZCBsb25nIG1hc2s7Ci0JdV9pbnQ4X3QgbW9kZTsKLX07CisjZGVmaW5lIGlwdF9jb25ubWFya190YXJnZXRfaW5mbyB4dF9jb25ubWFya190YXJnZXRfaW5mbwogCiAjZW5kaWYgLypfSVBUX0NPTk5NQVJLX0hfdGFyZ2V0Ki8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X01BUksuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X01BUksuaAppbmRleCBmNDc0ODU3Li42OTdhNDg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9NQVJLLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTUFSSy5oCkBAIC0xLDIwICsxLDE4IEBACiAjaWZuZGVmIF9JUFRfTUFSS19IX3RhcmdldAogI2RlZmluZSBfSVBUX01BUktfSF90YXJnZXQKIAorLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG9sZCB1c2Vyc3BhY2UgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9NQVJLLmg+CisKIC8qIFZlcnNpb24gMCAqLwotc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvIHsKLQl1bnNpZ25lZCBsb25nIG1hcms7Ci19OworI2RlZmluZSBpcHRfbWFya190YXJnZXRfaW5mbyB4dF9tYXJrX3RhcmdldF9pbmZvCiAKIC8qIFZlcnNpb24gMSAqLwotZW51bSB7Ci0JSVBUX01BUktfU0VUPTAsCi0JSVBUX01BUktfQU5ELAotCUlQVF9NQVJLX09SCi19OworI2RlZmluZSBJUFRfTUFSS19TRVQJWFRfTUFSS19TRVQKKyNkZWZpbmUgSVBUX01BUktfQU5ECVhUX01BUktfQU5ECisjZGVmaW5lCUlQVF9NQVJLX09SCVhUX01BUktfT1IKIAotc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvX3YxIHsKLQl1bnNpZ25lZCBsb25nIG1hcms7Ci0JdV9pbnQ4X3QgbW9kZTsKLX07CisjZGVmaW5lIGlwdF9tYXJrX3RhcmdldF9pbmZvX3YxIHh0X21hcmtfdGFyZ2V0X2luZm9fdjEKKwogI2VuZGlmIC8qX0lQVF9NQVJLX0hfdGFyZ2V0Ki8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X05GUVVFVUUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X05GUVVFVUUuaAppbmRleCBiNWIyOTQzLi45N2EyYTc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9ORlFVRVVFLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTkZRVUVVRS5oCkBAIC04LDkgKzgsOSBAQAogI2lmbmRlZiBfSVBUX05GUV9UQVJHRVRfSAogI2RlZmluZSBfSVBUX05GUV9UQVJHRVRfSAogCi0vKiB0YXJnZXQgaW5mbyAqLwotc3RydWN0IGlwdF9ORlFfaW5mbyB7Ci0JdV9pbnQxNl90IHF1ZXVlbnVtOwotfTsKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBvbGQgdXNlcnNwYWNlICovCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaD4KKworI2RlZmluZSBpcHRfTkZRX2luZm8geHRfTkZRX2luZm8KIAogI2VuZGlmIC8qIF9JUFRfRFNDUF9UQVJHRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29tbWVudC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29tbWVudC5oCmluZGV4IDg1YzExMjMuLmFlMmFmYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2NvbW1lbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb21tZW50LmgKQEAgLTEsMTAgKzEsMTAgQEAKICNpZm5kZWYgX0lQVF9DT01NRU5UX0gKICNkZWZpbmUgX0lQVF9DT01NRU5UX0gKIAotI2RlZmluZSBJUFRfTUFYX0NPTU1FTlRfTEVOIDI1NgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb21tZW50Lmg+CiAKLXN0cnVjdCBpcHRfY29tbWVudF9pbmZvIHsKLQl1bnNpZ25lZCBjaGFyIGNvbW1lbnRbSVBUX01BWF9DT01NRU5UX0xFTl07Ci19OworI2RlZmluZSBJUFRfTUFYX0NPTU1FTlRfTEVOIFhUX01BWF9DT01NRU5UX0xFTgorCisjZGVmaW5lIGlwdF9jb21tZW50X2luZm8geHRfY29tbWVudF9pbmZvCiAKICNlbmRpZiAvKiBfSVBUX0NPTU1FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubmJ5dGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25uYnl0ZXMuaAppbmRleCA5ZTU1MzJmLi5iMDRkZmEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25uYnl0ZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25uYnl0ZXMuaApAQCAtMSwyNSArMSwxOCBAQAogI2lmbmRlZiBfSVBUX0NPTk5CWVRFU19ICiAjZGVmaW5lIF9JUFRfQ09OTkJZVEVTX0gKIAotZW51bSBpcHRfY29ubmJ5dGVzX3doYXQgewotCUlQVF9DT05OQllURVNfUEtUUywKLQlJUFRfQ09OTkJZVEVTX0JZVEVTLAotCUlQVF9DT05OQllURVNfQVZHUEtULAotfTsKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5oPgorI2RlZmluZSBpcHRfY29ubmJ5dGVzX3doYXQgeHRfY29ubmJ5dGVzX3doYXQKIAotZW51bSBpcHRfY29ubmJ5dGVzX2RpcmVjdGlvbiB7Ci0JSVBUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUwsCi0JSVBUX0NPTk5CWVRFU19ESVJfUkVQTFksCi0JSVBUX0NPTk5CWVRFU19ESVJfQk9USCwKLX07CisjZGVmaW5lIElQVF9DT05OQllURVNfUEtUUwlYVF9DT05OQllURVNfUEFDS0VUUworI2RlZmluZSBJUFRfQ09OTkJZVEVTX0JZVEVTCVhUX0NPTk5CWVRFU19CWVRFUworI2RlZmluZSBJUFRfQ09OTkJZVEVTX0FWR1BLVAlYVF9DT05OQllURVNfQVZHUEtUCiAKLXN0cnVjdCBpcHRfY29ubmJ5dGVzX2luZm8KLXsKLQlzdHJ1Y3QgewotCQlhbGlnbmVkX3U2NCBmcm9tOwkvKiBjb3VudCB0byBiZSBtYXRjaGVkICovCi0JCWFsaWduZWRfdTY0IHRvOwkJLyogY291bnQgdG8gYmUgbWF0Y2hlZCAqLwotCX0gY291bnQ7Ci0JdV9pbnQ4X3Qgd2hhdDsJCS8qIGlwdF9jb25uYnl0ZXNfd2hhdCAqLwotCXVfaW50OF90IGRpcmVjdGlvbjsJLyogaXB0X2Nvbm5ieXRlc19kaXJlY3Rpb24gKi8KLX07CisjZGVmaW5lIGlwdF9jb25uYnl0ZXNfZGlyZWN0aW9uIAl4dF9jb25uYnl0ZXNfZGlyZWN0aW9uCisjZGVmaW5lIElQVF9DT05OQllURVNfRElSX09SSUdJTkFMIAlYVF9DT05OQllURVNfRElSX09SSUdJTkFMCisjZGVmaW5lIElQVF9DT05OQllURVNfRElSX1JFUExZIAlYVF9DT05OQllURVNfRElSX1JFUExZCisjZGVmaW5lIElQVF9DT05OQllURVNfRElSX0JPVEgJCVhUX0NPTk5CWVRFU19ESVJfQk9USAorCisjZGVmaW5lIGlwdF9jb25uYnl0ZXNfaW5mbyB4dF9jb25uYnl0ZXNfaW5mbworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm5tYXJrLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25ubWFyay5oCmluZGV4IDQ2NTczMjcuLmM3YmE2NTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm5tYXJrLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubm1hcmsuaApAQCAtMSwxOCArMSw3IEBACiAjaWZuZGVmIF9JUFRfQ09OTk1BUktfSAogI2RlZmluZSBfSVBUX0NPTk5NQVJLX0gKIAotLyogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDQgTUFSQSBTeXN0ZW1zIEFCIDxodHRwOi8vd3d3Lm1hcmFzeXN0ZW1zLmNvbT4KLSAqIGJ5IEhlbnJpayBOb3Jkc3Ryb20gPGhub0BtYXJhc3lzdGVtcy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi1zdHJ1Y3QgaXB0X2Nvbm5tYXJrX2luZm8gewotCXVuc2lnbmVkIGxvbmcgbWFyaywgbWFzazsKLQl1X2ludDhfdCBpbnZlcnQ7Ci19OworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb25ubWFyay5oPgorI2RlZmluZSBpcHRfY29ubm1hcmtfaW5mbyB4dF9jb25ubWFya19pbmZvCiAKICNlbmRpZiAvKl9JUFRfQ09OTk1BUktfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25udHJhY2suaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm50cmFjay5oCmluZGV4IDQxM2M1NjUuLmNkZTY3NjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm50cmFjay5oCkBAIC01LDU2ICs1LDI0IEBACiAjaWZuZGVmIF9JUFRfQ09OTlRSQUNLX0gKICNkZWZpbmUgX0lQVF9DT05OVFJBQ0tfSAogCi0jZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbykgKDEgPDwgKChjdGluZm8pJUlQX0NUX0lTX1JFUExZKzEpKQotI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQgKDEgPDwgMCkKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmg+CiAKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9TTkFUICgxIDw8IChJUF9DVF9OVU1CRVIgKyAxKSkKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9ETkFUICgxIDw8IChJUF9DVF9OVU1CRVIgKyAyKSkKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQgKDEgPDwgKElQX0NUX05VTUJFUiArIDMpKQorI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pIFhUX0NPTk5UUkFDS19TVEFURV9CSVQoY3RpbmZvKQorI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQgCVhUX0NPTk5UUkFDS19TVEFURV9JTlZBTElECisKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9TTkFUIAlYVF9DT05OVFJBQ0tfU1RBVEVfU05BVAorI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFX0ROQVQJWFRfQ09OTlRSQUNLX1NUQVRFX0ROQVQKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQJWFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRAogCiAvKiBmbGFncywgaW52ZmxhZ3M6ICovCi0jZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVEUJMHgwMQotI2RlZmluZSBJUFRfQ09OTlRSQUNLX1BST1RPCTB4MDIKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19PUklHU1JDCTB4MDQKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19PUklHRFNUCTB4MDgKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19SRVBMU1JDCTB4MTAKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19SRVBMRFNUCTB4MjAKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFUVVMJMHg0MAotI2RlZmluZSBJUFRfQ09OTlRSQUNLX0VYUElSRVMJMHg4MAorI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFCQlYVF9DT05OVFJBQ0tfU1RBVEUKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19QUk9UTwkJWFRfQ09OTlRSQUNLX1BST1RPCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfT1JJR1NSQwkJWFRfQ09OTlRSQUNLX09SSUdTUkMKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19PUklHRFNUCQlYVF9DT05OVFJBQ0tfT1JJR0RTVAorI2RlZmluZSBJUFRfQ09OTlRSQUNLX1JFUExTUkMJCVhUX0NPTk5UUkFDS19SRVBMU1JDCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfUkVQTERTVAkJWFRfQ09OTlRSQUNLX1JFUExEU1QKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFUVVMJCVhUX0NPTk5UUkFDS19TVEFUVVMKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19FWFBJUkVTCQlYVF9DT05OVFJBQ0tfRVhQSVJFUwogCi0vKiBUaGlzIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlLCBzbyByZW1haW5zIGZyb3plbiBpbiB0aW1lLiAqLwotc3RydWN0IGlwX2Nvbm50cmFja19vbGRfdHVwbGUKLXsKLQlzdHJ1Y3QgewotCQlfX3UzMiBpcDsKLQkJdW5pb24gewotCQkJX191MTYgYWxsOwotCQl9IHU7Ci0JfSBzcmM7Ci0KLQlzdHJ1Y3QgewotCQlfX3UzMiBpcDsKLQkJdW5pb24gewotCQkJX191MTYgYWxsOwotCQl9IHU7Ci0KLQkJLyogVGhlIHByb3RvY29sLiAqLwotCQl1MTYgcHJvdG9udW07Ci0JfSBkc3Q7Ci19OwotCi1zdHJ1Y3QgaXB0X2Nvbm50cmFja19pbmZvCi17Ci0JdW5zaWduZWQgaW50IHN0YXRlbWFzaywgc3RhdHVzbWFzazsKLQotCXN0cnVjdCBpcF9jb25udHJhY2tfb2xkX3R1cGxlIHR1cGxlW0lQX0NUX0RJUl9NQVhdOwotCXN0cnVjdCBpbl9hZGRyIHNpcG1za1tJUF9DVF9ESVJfTUFYXSwgZGlwbXNrW0lQX0NUX0RJUl9NQVhdOwotCi0JdW5zaWduZWQgbG9uZyBleHBpcmVzX21pbiwgZXhwaXJlc19tYXg7Ci0KLQkvKiBGbGFncyB3b3JkICovCi0JdV9pbnQ4X3QgZmxhZ3M7Ci0JLyogSW52ZXJzZSBmbGFncyAqLwotCXVfaW50OF90IGludmZsYWdzOwotfTsKKyNkZWZpbmUgaXB0X2Nvbm50cmFja19pbmZvCQl4dF9jb25udHJhY2tfaW5mbwogI2VuZGlmIC8qX0lQVF9DT05OVFJBQ0tfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9kY2NwLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9kY2NwLmgKaW5kZXggM2NiM2E1Mi4uZTcwZDExZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZGNjcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2RjY3AuaApAQCAtMSwyMyArMSwxNSBAQAogI2lmbmRlZiBfSVBUX0RDQ1BfSF8KICNkZWZpbmUgX0lQVF9EQ0NQX0hfCiAKLSNkZWZpbmUgSVBUX0RDQ1BfU1JDX1BPUlRTCSAgICAgICAgMHgwMQotI2RlZmluZSBJUFRfRENDUF9ERVNUX1BPUlRTCSAgICAgICAgMHgwMgotI2RlZmluZSBJUFRfRENDUF9UWVBFCQkJMHgwNAotI2RlZmluZSBJUFRfRENDUF9PUFRJT04JCQkweDA4CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2RjY3AuaD4KKyNkZWZpbmUgSVBUX0RDQ1BfU1JDX1BPUlRTCVhUX0RDQ1BfU1JDX1BPUlRTCisjZGVmaW5lIElQVF9EQ0NQX0RFU1RfUE9SVFMJWFRfRENDUF9ERVNUX1BPUlRTCisjZGVmaW5lIElQVF9EQ0NQX1RZUEUJCVhUX0RDQ1BfVFlQRQorI2RlZmluZSBJUFRfRENDUF9PUFRJT04JCVhUX0RDQ1BfT1BUSU9OCiAKLSNkZWZpbmUgSVBUX0RDQ1BfVkFMSURfRkxBR1MJCTB4MGYKKyNkZWZpbmUgSVBUX0RDQ1BfVkFMSURfRkxBR1MgCVhUX0RDQ1BfVkFMSURfRkxBR1MKIAotc3RydWN0IGlwdF9kY2NwX2luZm8gewotCXVfaW50MTZfdCBkcHRzWzJdOyAgLyogTWluLCBNYXggKi8KLQl1X2ludDE2X3Qgc3B0c1syXTsgIC8qIE1pbiwgTWF4ICovCi0KLQl1X2ludDE2X3QgZmxhZ3M7Ci0JdV9pbnQxNl90IGludmZsYWdzOwotCi0JdV9pbnQxNl90IHR5cGVtYXNrOwotCXVfaW50OF90IG9wdGlvbjsKLX07CisjZGVmaW5lIGlwdF9kY2NwX2luZm8geHRfZGNjcF9pbmZvCiAKICNlbmRpZiAvKiBfSVBUX0RDQ1BfSF8gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaGVscGVyLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oZWxwZXIuaAppbmRleCA2ZjEyZWNiLi44MDQ1MmMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oZWxwZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oZWxwZXIuaApAQCAtMSw4ICsxLDcgQEAKICNpZm5kZWYgX0lQVF9IRUxQRVJfSAogI2RlZmluZSBfSVBUX0hFTFBFUl9ICiAKLXN0cnVjdCBpcHRfaGVscGVyX2luZm8gewotCWludCBpbnZlcnQ7Ci0JY2hhciBuYW1lWzMwXTsKLX07CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oPgorI2RlZmluZSBpcHRfaGVscGVyX2luZm8geHRfaGVscGVyX2luZm8KKwogI2VuZGlmIC8qIF9JUFRfSEVMUEVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xlbmd0aC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGVuZ3RoLmgKaW5kZXggNmUwODg1Mi4uOWI0NTIwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGVuZ3RoLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGVuZ3RoLmgKQEAgLTEsOSArMSw3IEBACiAjaWZuZGVmIF9JUFRfTEVOR1RIX0gKICNkZWZpbmUgX0lQVF9MRU5HVEhfSAogCi1zdHJ1Y3QgaXB0X2xlbmd0aF9pbmZvIHsKLSAgICB1X2ludDE2X3QJbWluLCBtYXg7Ci0gICAgdV9pbnQ4X3QJaW52ZXJ0OwotfTsKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmg+CisjZGVmaW5lIGlwdF9sZW5ndGhfaW5mbyB4dF9sZW5ndGhfaW5mbwogCiAjZW5kaWYgLypfSVBUX0xFTkdUSF9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xpbWl0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9saW1pdC5oCmluZGV4IDI1NjQ1MzQuLjkyZjVjZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xpbWl0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGltaXQuaApAQCAtMSwyMSArMSw4IEBACiAjaWZuZGVmIF9JUFRfUkFURV9ICiAjZGVmaW5lIF9JUFRfUkFURV9ICiAKLS8qIHRpbWluZ3MgYXJlIGluIG1pbGxpc2Vjb25kcy4gKi8KLSNkZWZpbmUgSVBUX0xJTUlUX1NDQUxFIDEwMDAwCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2xpbWl0Lmg+CisjZGVmaW5lIElQVF9MSU1JVF9TQ0FMRSBYVF9MSU1JVF9TQ0FMRQorI2RlZmluZSBpcHRfcmF0ZWluZm8geHRfcmF0ZWluZm8KIAotLyogMS8xMCwwMDAgc2VjIHBlcmlvZCA9PiBtYXggb2YgMTAsMDAwL3NlYy4gIE1pbiByYXRlIGlzIHRoZW4gNDI5NDkwCi0gICBzZWNvbmRzLCBvciBvbmUgZXZlcnkgNTkgaG91cnMuICovCi1zdHJ1Y3QgaXB0X3JhdGVpbmZvIHsKLQl1X2ludDMyX3QgYXZnOyAgICAvKiBBdmVyYWdlIHNlY3MgYmV0d2VlbiBwYWNrZXRzICogc2NhbGUgKi8KLQl1X2ludDMyX3QgYnVyc3Q7ICAvKiBQZXJpb2QgbXVsdGlwbGllciBmb3IgdXBwZXIgbGltaXQuICovCi0KLQkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLwotCXVuc2lnbmVkIGxvbmcgcHJldjsKLQl1X2ludDMyX3QgY3JlZGl0OwotCXVfaW50MzJfdCBjcmVkaXRfY2FwLCBjb3N0OwotCi0JLyogVWdseSwgdWdseSBmdWNrZXIuICovCi0Jc3RydWN0IGlwdF9yYXRlaW5mbyAqbWFzdGVyOwotfTsKICNlbmRpZiAvKl9JUFRfUkFURV9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hYy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFjLmgKaW5kZXggZjhkNWI4ZS4uYjE4NjAwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFjLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFjLmgKQEAgLTEsOCArMSw3IEBACiAjaWZuZGVmIF9JUFRfTUFDX0gKICNkZWZpbmUgX0lQVF9NQUNfSAogCi1zdHJ1Y3QgaXB0X21hY19pbmZvIHsKLSAgICB1bnNpZ25lZCBjaGFyIHNyY2FkZHJbRVRIX0FMRU5dOwotICAgIGludCBpbnZlcnQ7Ci19OworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9tYWMuaD4KKyNkZWZpbmUgaXB0X21hY19pbmZvIHh0X21hY19pbmZvCisKICNlbmRpZiAvKl9JUFRfTUFDX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFyay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFyay5oCmluZGV4IGYzOTUyYjUuLmJmZGU2N2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hcmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9tYXJrLmgKQEAgLTEsOSArMSw5IEBACiAjaWZuZGVmIF9JUFRfTUFSS19ICiAjZGVmaW5lIF9JUFRfTUFSS19ICiAKLXN0cnVjdCBpcHRfbWFya19pbmZvIHsKLSAgICB1bnNpZ25lZCBsb25nIG1hcmssIG1hc2s7Ci0gICAgdV9pbnQ4X3QgaW52ZXJ0OwotfTsKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBvbGQgdXNlcnNwYWNlICovCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X21hcmsuaD4KKworI2RlZmluZSBpcHRfbWFya19pbmZvIHh0X21hcmtfaW5mbwogCiAjZW5kaWYgLypfSVBUX01BUktfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9waHlzZGV2LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9waHlzZGV2LmgKaW5kZXggNzUzOGM4Ni4uMjQwMGU3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGh5c2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BoeXNkZXYuaApAQCAtMSwyNCArMSwxNyBAQAogI2lmbmRlZiBfSVBUX1BIWVNERVZfSAogI2RlZmluZSBfSVBUX1BIWVNERVZfSAogCi0jaWZkZWYgX19LRVJORUxfXwotI2luY2x1ZGUgPGxpbnV4L2lmLmg+Ci0jZW5kaWYKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBvbGQgdXNlcnNwYWNlICovCiAKLSNkZWZpbmUgSVBUX1BIWVNERVZfT1BfSU4JCTB4MDEKLSNkZWZpbmUgSVBUX1BIWVNERVZfT1BfT1VUCQkweDAyCi0jZGVmaW5lIElQVF9QSFlTREVWX09QX0JSSURHRUQJCTB4MDQKLSNkZWZpbmUgSVBUX1BIWVNERVZfT1BfSVNJTgkJMHgwOAotI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9JU09VVAkJMHgxMAotI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9NQVNLCQkoMHgyMCAtIDEpCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuaD4KIAotc3RydWN0IGlwdF9waHlzZGV2X2luZm8gewotCWNoYXIgcGh5c2luZGV2W0lGTkFNU0laXTsKLQljaGFyIGluX21hc2tbSUZOQU1TSVpdOwotCWNoYXIgcGh5c291dGRldltJRk5BTVNJWl07Ci0JY2hhciBvdXRfbWFza1tJRk5BTVNJWl07Ci0JdV9pbnQ4X3QgaW52ZXJ0OwotCXVfaW50OF90IGJpdG1hc2s7Ci19OworI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9JTgkJWFRfUEhZU0RFVl9PUF9JTgorI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9PVVQJCVhUX1BIWVNERVZfT1BfT1VUCisjZGVmaW5lIElQVF9QSFlTREVWX09QX0JSSURHRUQJCVhUX1BIWVNERVZfT1BfQlJJREdFRAorI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9JU0lOCQlYVF9QSFlTREVWX09QX0lTSU4KKyNkZWZpbmUgSVBUX1BIWVNERVZfT1BfSVNPVVQJCVhUX1BIWVNERVZfT1BfSVNPVVQKKyNkZWZpbmUgSVBUX1BIWVNERVZfT1BfTUFTSwkJWFRfUEhZU0RFVl9PUF9NQVNLCisKKyNkZWZpbmUgaXB0X3BoeXNkZXZfaW5mbyB4dF9waHlzZGV2X2luZm8KIAogI2VuZGlmIC8qX0lQVF9QSFlTREVWX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGt0dHlwZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGt0dHlwZS5oCmluZGV4IGQ1M2E2NTguLmZmMWZiYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BrdHR5cGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9wa3R0eXBlLmgKQEAgLTEsOCArMSw3IEBACiAjaWZuZGVmIF9JUFRfUEtUVFlQRV9ICiAjZGVmaW5lIF9JUFRfUEtUVFlQRV9ICiAKLXN0cnVjdCBpcHRfcGt0dHlwZV9pbmZvIHsKLQlpbnQJcGt0dHlwZTsKLQlpbnQJaW52ZXJ0OwotfTsKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5oPgorI2RlZmluZSBpcHRfcGt0dHlwZV9pbmZvIHh0X3BrdHR5cGVfaW5mbworCiAjZW5kaWYgLypfSVBUX1BLVFRZUEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWFsbS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVhbG0uaAppbmRleCBhNGQ2Njk4Li5iMzk5NmVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWFsbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3JlYWxtLmgKQEAgLTEsMTAgKzEsNyBAQAogI2lmbmRlZiBfSVBUX1JFQUxNX0gKICNkZWZpbmUgX0lQVF9SRUFMTV9ICiAKLXN0cnVjdCBpcHRfcmVhbG1faW5mbyB7Ci0JdV9pbnQzMl90IGlkOwotCXVfaW50MzJfdCBtYXNrOwotCXVfaW50OF90IGludmVydDsKLX07CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmg+CisjZGVmaW5lIGlwdF9yZWFsbV9pbmZvIHh0X3JlYWxtX2luZm8KIAogI2VuZGlmIC8qIF9JUFRfUkVBTE1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfc3RhdGUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3N0YXRlLmgKaW5kZXggNWRmMzc4Ni4uYTQ0YTk5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfc3RhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdGF0ZS5oCkBAIC0xLDEzICsxLDE1IEBACiAjaWZuZGVmIF9JUFRfU1RBVEVfSAogI2RlZmluZSBfSVBUX1NUQVRFX0gKIAotI2RlZmluZSBJUFRfU1RBVEVfQklUKGN0aW5mbykgKDEgPDwgKChjdGluZm8pJUlQX0NUX0lTX1JFUExZKzEpKQotI2RlZmluZSBJUFRfU1RBVEVfSU5WQUxJRCAoMSA8PCAwKQorLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG9sZCB1c2Vyc3BhY2UgKi8KIAotI2RlZmluZSBJUFRfU1RBVEVfVU5UUkFDS0VEICgxIDw8IChJUF9DVF9OVU1CRVIgKyAxKSkKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfc3RhdGUuaD4KIAotc3RydWN0IGlwdF9zdGF0ZV9pbmZvCi17Ci0JdW5zaWduZWQgaW50IHN0YXRlbWFzazsKLX07CisjZGVmaW5lIElQVF9TVEFURV9CSVQJCVhUX1NUQVRFX0JJVAorI2RlZmluZSBJUFRfU1RBVEVfSU5WQUxJRAlYVF9TVEFURV9JTlZBTElECisKKyNkZWZpbmUgSVBUX1NUQVRFX1VOVFJBQ0tFRAlYVF9TVEFURV9VTlRSQUNLRUQKKworI2RlZmluZSBpcHRfc3RhdGVfaW5mbwkJeHRfc3RhdGVfaW5mbworCiAjZW5kaWYgLypfSVBUX1NUQVRFX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfc3RyaW5nLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdHJpbmcuaAppbmRleCBhMjY1ZjZlLi5jMjZkZTMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdHJpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdHJpbmcuaApAQCAtMSwxOCArMSwxMCBAQAogI2lmbmRlZiBfSVBUX1NUUklOR19ICiAjZGVmaW5lIF9JUFRfU1RSSU5HX0gKIAotI2RlZmluZSBJUFRfU1RSSU5HX01BWF9QQVRURVJOX1NJWkUgMTI4Ci0jZGVmaW5lIElQVF9TVFJJTkdfTUFYX0FMR09fTkFNRV9TSVpFIDE2CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3N0cmluZy5oPgogCi1zdHJ1Y3QgaXB0X3N0cmluZ19pbmZvCi17Ci0JdV9pbnQxNl90IGZyb21fb2Zmc2V0OwotCXVfaW50MTZfdCB0b19vZmZzZXQ7Ci0JY2hhcgkgIGFsZ29bSVBUX1NUUklOR19NQVhfQUxHT19OQU1FX1NJWkVdOwotCWNoYXIgCSAgcGF0dGVybltJUFRfU1RSSU5HX01BWF9QQVRURVJOX1NJWkVdOwotCXVfaW50OF90ICBwYXRsZW47Ci0JdV9pbnQ4X3QgIGludmVydDsKLQlzdHJ1Y3QgdHNfY29uZmlnIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKSAqY29uZmlnOwotfTsKKyNkZWZpbmUgSVBUX1NUUklOR19NQVhfUEFUVEVSTl9TSVpFIFhUX1NUUklOR19NQVhfUEFUVEVSTl9TSVpFCisjZGVmaW5lIElQVF9TVFJJTkdfTUFYX0FMR09fTkFNRV9TSVpFIFhUX1NUUklOR19NQVhfQUxHT19OQU1FX1NJWkUKKyNkZWZpbmUgaXB0X3N0cmluZ19pbmZvIHh0X3N0cmluZ19pbmZvCiAKICNlbmRpZiAvKl9JUFRfU1RSSU5HX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfdGNwbXNzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90Y3Btc3MuaAppbmRleCBlMmIxNDM5Li4xOGJiYzhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90Y3Btc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90Y3Btc3MuaApAQCAtMSw5ICsxLDcgQEAKICNpZm5kZWYgX0lQVF9UQ1BNU1NfTUFUQ0hfSAogI2RlZmluZSBfSVBUX1RDUE1TU19NQVRDSF9ICiAKLXN0cnVjdCBpcHRfdGNwbXNzX21hdGNoX2luZm8gewotICAgIHVfaW50MTZfdCBtc3NfbWluLCBtc3NfbWF4OwotICAgIHVfaW50OF90IGludmVydDsKLX07CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcG1zcy5oPgorI2RlZmluZSBpcHRfdGNwbXNzX21hdGNoX2luZm8geHRfdGNwbXNzX21hdGNoX2luZm8KIAogI2VuZGlmIC8qX0lQVF9UQ1BNU1NfTUFUQ0hfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oCmluZGV4IGMxNjNiYTMuLmYyNDliNTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oCkBAIC0yNSw4ICsyNSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KIAotI2RlZmluZSBJUDZUX0ZVTkNUSU9OX01BWE5BTUVMRU4gMzAKLSNkZWZpbmUgSVA2VF9UQUJMRV9NQVhOQU1FTEVOIDMyCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKKyNkZWZpbmUgSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOIFhUX0ZVTkNUSU9OX01BWE5BTUVMRU4KKyNkZWZpbmUgSVA2VF9UQUJMRV9NQVhOQU1FTEVOIFhUX1RBQkxFX01BWE5BTUVMRU4KKworI2RlZmluZSBpcDZ0X21hdGNoIHh0X21hdGNoCisjZGVmaW5lIGlwNnRfdGFyZ2V0IHh0X3RhcmdldAorI2RlZmluZSBpcDZ0X3RhYmxlIHh0X3RhYmxlCisjZGVmaW5lIGlwNnRfZ2V0X3JldmlzaW9uIHh0X2dldF9yZXZpc2lvbgogCiAvKiBZZXMsIFZpcmdpbmlhLCB5b3UgaGF2ZSB0byB6ZXJvIHRoZSBwYWRkaW5nLiAqLwogc3RydWN0IGlwNnRfaXA2IHsKQEAgLTEwNCwxMCArMTExLDcgQEAKIAlpbnQgdmVyZGljdDsKIH07CiAKLXN0cnVjdCBpcDZ0X2NvdW50ZXJzCi17Ci0JdV9pbnQ2NF90IHBjbnQsIGJjbnQ7CQkJLyogUGFja2V0IGFuZCBieXRlIGNvdW50ZXJzICovCi19OworI2RlZmluZSBpcDZ0X2NvdW50ZXJzCXh0X2NvdW50ZXJzCiAKIC8qIFZhbHVlcyBmb3IgImZsYWciIGZpZWxkIGluIHN0cnVjdCBpcDZ0X2lwNiAoZ2VuZXJhbCBpcDYgc3RydWN0dXJlKS4gKi8KICNkZWZpbmUgSVA2VF9GX1BST1RPCQkweDAxCS8qIFNldCBpZiBydWxlIGNhcmVzIGFib3V0IHVwcGVyIApAQCAtMTIzLDcgKzEyNyw3IEBACiAjZGVmaW5lIElQNlRfSU5WX1NSQ0lQCQkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgU1JDIElQLiAqLwogI2RlZmluZSBJUDZUX0lOVl9EU1RJUAkJMHgxMAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIERTVCBPUC4gKi8KICNkZWZpbmUgSVA2VF9JTlZfRlJBRwkJMHgyMAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIEZSQUcuICovCi0jZGVmaW5lIElQNlRfSU5WX1BST1RPCQkweDQwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgUFJPVE8uICovCisjZGVmaW5lIElQNlRfSU5WX1BST1RPCQlYVF9JTlZfUFJPVE8KICNkZWZpbmUgSVA2VF9JTlZfTUFTSwkJMHg3RgkvKiBBbGwgcG9zc2libGUgZmxhZyBiaXRzIG1hc2suICovCiAKIC8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgZWFjaCBvZiB0aGUgZmlyZXdhbGwgcnVsZXMuICBDb25zaXN0cyBvZiAzCkBAIC0xNDUsNyArMTQ5LDcgQEAKIAl1bnNpZ25lZCBpbnQgY29tZWZyb207CiAKIAkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMuICovCi0Jc3RydWN0IGlwNnRfY291bnRlcnMgY291bnRlcnM7CisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzOwogCiAJLyogVGhlIG1hdGNoZXMgKGlmIGFueSksIHRoZW4gdGhlIHRhcmdldC4gKi8KIAl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdOwpAQCAtMTU1LDU0ICsxNTksNDEgQEAKICAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCiAgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlCiAgKiBhIHJhdyBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4gKi8KLSNkZWZpbmUgSVA2VF9CQVNFX0NUTAkJCTY0CS8qIGJhc2UgZm9yIGZpcmV3YWxsIHNvY2tldCBvcHRpb25zICovCisjZGVmaW5lIElQNlRfQkFTRV9DVEwJCQlYVF9CQVNFX0NUTAogCi0jZGVmaW5lIElQNlRfU09fU0VUX1JFUExBQ0UJCShJUDZUX0JBU0VfQ1RMKQotI2RlZmluZSBJUDZUX1NPX1NFVF9BRERfQ09VTlRFUlMJKElQNlRfQkFTRV9DVEwgKyAxKQotI2RlZmluZSBJUDZUX1NPX1NFVF9NQVgJCQlJUDZUX1NPX1NFVF9BRERfQ09VTlRFUlMKKyNkZWZpbmUgSVA2VF9TT19TRVRfUkVQTEFDRQkJWFRfU09fU0VUX1JFUExBQ0UKKyNkZWZpbmUgSVA2VF9TT19TRVRfQUREX0NPVU5URVJTCVhUX1NPX1NFVF9BRERfQ09VTlRFUlMKKyNkZWZpbmUgSVA2VF9TT19TRVRfTUFYCQkJWFRfU09fU0VUX01BWAogCi0jZGVmaW5lIElQNlRfU09fR0VUX0lORk8JCShJUDZUX0JBU0VfQ1RMKQotI2RlZmluZSBJUDZUX1NPX0dFVF9FTlRSSUVTCQkoSVA2VF9CQVNFX0NUTCArIDEpCi0jZGVmaW5lCUlQNlRfU09fR0VUX1JFVklTSU9OX01BVENICShJUDZUX0JBU0VfQ1RMICsgMikKLSNkZWZpbmUJSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShJUDZUX0JBU0VfQ1RMICsgMykKLSNkZWZpbmUgSVA2VF9TT19HRVRfTUFYCQkJSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCisjZGVmaW5lIElQNlRfU09fR0VUX0lORk8JCVhUX1NPX0dFVF9JTkZPCisjZGVmaW5lIElQNlRfU09fR0VUX0VOVFJJRVMJCVhUX1NPX0dFVF9FTlRSSUVTCisjZGVmaW5lCUlQNlRfU09fR0VUX1JFVklTSU9OX01BVENICVhUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAorI2RlZmluZQlJUDZUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAorI2RlZmluZSBJUDZUX1NPX0dFVF9NQVgJCQlYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCiAKIC8qIENPTlRJTlVFIHZlcmRpY3QgZm9yIHRhcmdldHMgKi8KLSNkZWZpbmUgSVA2VF9DT05USU5VRSAweEZGRkZGRkZGCisjZGVmaW5lIElQNlRfQ09OVElOVUUgWFRfQ09OVElOVUUKIAogLyogRm9yIHN0YW5kYXJkIHRhcmdldCAqLwotI2RlZmluZSBJUDZUX1JFVFVSTiAoLU5GX1JFUEVBVCAtIDEpCisjZGVmaW5lIElQNlRfUkVUVVJOIFhUX1JFVFVSTgogCi0vKiBUQ1AgbWF0Y2hpbmcgc3R1ZmYgKi8KLXN0cnVjdCBpcDZ0X3RjcAotewotCXVfaW50MTZfdCBzcHRzWzJdOwkJCS8qIFNvdXJjZSBwb3J0IHJhbmdlLiAqLwotCXVfaW50MTZfdCBkcHRzWzJdOwkJCS8qIERlc3RpbmF0aW9uIHBvcnQgcmFuZ2UuICovCi0JdV9pbnQ4X3Qgb3B0aW9uOwkJCS8qIFRDUCBPcHRpb24gaWZmIG5vbi16ZXJvKi8KLQl1X2ludDhfdCBmbGdfbWFzazsJCQkvKiBUQ1AgZmxhZ3MgbWFzayBieXRlICovCi0JdV9pbnQ4X3QgZmxnX2NtcDsJCQkvKiBUQ1AgZmxhZ3MgY29tcGFyZSBieXRlICovCi0JdV9pbnQ4X3QgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLwotfTsKKy8qIFRDUC9VRFAgbWF0Y2hpbmcgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmg+CisKKyNkZWZpbmUgaXA2dF90Y3AgeHRfdGNwCisjZGVmaW5lIGlwNnRfdWRwIHh0X3VkcAogCiAvKiBWYWx1ZXMgZm9yICJpbnYiIGZpZWxkIGluIHN0cnVjdCBpcHRfdGNwLiAqLwotI2RlZmluZSBJUDZUX1RDUF9JTlZfU1JDUFQJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNvdXJjZSBwb3J0cy4gKi8KLSNkZWZpbmUgSVA2VF9UQ1BfSU5WX0RTVFBUCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBkZXN0IHBvcnRzLiAqLwotI2RlZmluZSBJUDZUX1RDUF9JTlZfRkxBR1MJMHgwNAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFRDUCBmbGFncy4gKi8KLSNkZWZpbmUgSVA2VF9UQ1BfSU5WX09QVElPTgkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygb3B0aW9uIHRlc3QuICovCi0jZGVmaW5lIElQNlRfVENQX0lOVl9NQVNLCTB4MEYJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLwotCi0vKiBVRFAgbWF0Y2hpbmcgc3R1ZmYgKi8KLXN0cnVjdCBpcDZ0X3VkcAotewotCXVfaW50MTZfdCBzcHRzWzJdOwkJCS8qIFNvdXJjZSBwb3J0IHJhbmdlLiAqLwotCXVfaW50MTZfdCBkcHRzWzJdOwkJCS8qIERlc3RpbmF0aW9uIHBvcnQgcmFuZ2UuICovCi0JdV9pbnQ4X3QgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLwotfTsKKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX1NSQ1BUCVhUX1RDUF9JTlZfU1JDUFQKKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX0RTVFBUCVhUX1RDUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX0ZMQUdTCVhUX1RDUF9JTlZfRkxBR1MKKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX09QVElPTglYVF9UQ1BfSU5WX09QVElPTgorI2RlZmluZSBJUDZUX1RDUF9JTlZfTUFTSwlYVF9UQ1BfSU5WX01BU0sKIAogLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCBpcHRfdWRwLiAqLwotI2RlZmluZSBJUDZUX1VEUF9JTlZfU1JDUFQJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNvdXJjZSBwb3J0cy4gKi8KLSNkZWZpbmUgSVA2VF9VRFBfSU5WX0RTVFBUCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBkZXN0IHBvcnRzLiAqLwotI2RlZmluZSBJUDZUX1VEUF9JTlZfTUFTSwkweDAzCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKyNkZWZpbmUgSVA2VF9VRFBfSU5WX1NSQ1BUCVhUX1VEUF9JTlZfU1JDUFQKKyNkZWZpbmUgSVA2VF9VRFBfSU5WX0RTVFBUCVhUX1VEUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVA2VF9VRFBfSU5WX01BU0sJWFRfVURQX0lOVl9NQVNLCiAKIC8qIElDTVAgbWF0Y2hpbmcgc3R1ZmYgKi8KIHN0cnVjdCBpcDZ0X2ljbXAKQEAgLTI2NCwyMyArMjU1LDE0IEBACiAJLyogTnVtYmVyIG9mIGNvdW50ZXJzIChtdXN0IGJlIGVxdWFsIHRvIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMpLiAqLwogCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CiAJLyogVGhlIG9sZCBlbnRyaWVzJyBjb3VudGVycy4gKi8KLQlzdHJ1Y3QgaXA2dF9jb3VudGVycyBfX3VzZXIgKmNvdW50ZXJzOworCXN0cnVjdCB4dF9jb3VudGVycyBfX3VzZXIgKmNvdW50ZXJzOwogCiAJLyogVGhlIGVudHJpZXMgKGhhbmcgb2ZmIGVuZDogbm90IHJlYWxseSBhbiBhcnJheSkuICovCiAJc3RydWN0IGlwNnRfZW50cnkgZW50cmllc1swXTsKIH07CiAKIC8qIFRoZSBhcmd1bWVudCB0byBJUDZUX1NPX0FERF9DT1VOVEVSUy4gKi8KLXN0cnVjdCBpcDZ0X2NvdW50ZXJzX2luZm8KLXsKLQkvKiBXaGljaCB0YWJsZS4gKi8KLQljaGFyIG5hbWVbSVA2VF9UQUJMRV9NQVhOQU1FTEVOXTsKLQotCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7Ci0KLQkvKiBUaGUgY291bnRlcnMgKGFjdHVhbGx5IGBudW1iZXInIG9mIHRoZXNlKS4gKi8KLQlzdHJ1Y3QgaXA2dF9jb3VudGVycyBjb3VudGVyc1swXTsKLX07CisjZGVmaW5lIGlwNnRfY291bnRlcnNfaW5mbyB4dF9jb3VudGVyc19pbmZvCiAKIC8qIFRoZSBhcmd1bWVudCB0byBJUDZUX1NPX0dFVF9FTlRSSUVTLiAqLwogc3RydWN0IGlwNnRfZ2V0X2VudHJpZXMKQEAgLTI5NSwxOSArMjc3LDEwIEBACiAJc3RydWN0IGlwNnRfZW50cnkgZW50cnl0YWJsZVswXTsKIH07CiAKLS8qIFRoZSBhcmd1bWVudCB0byBJUDZUX1NPX0dFVF9SRVZJU0lPTl8qLiAgUmV0dXJucyBoaWdoZXN0IHJldmlzaW9uCi0gKiBrZXJuZWwgc3VwcG9ydHMsIGlmID49IHJldmlzaW9uLiAqLwotc3RydWN0IGlwNnRfZ2V0X3JldmlzaW9uCi17Ci0JY2hhciBuYW1lW0lQNlRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKLQotCXVfaW50OF90IHJldmlzaW9uOwotfTsKLQogLyogU3RhbmRhcmQgcmV0dXJuIHZlcmRpY3QsIG9yIGRvIGp1bXAuICovCi0jZGVmaW5lIElQNlRfU1RBTkRBUkRfVEFSR0VUICIiCisjZGVmaW5lIElQNlRfU1RBTkRBUkRfVEFSR0VUIFhUX1NUQU5EQVJEX1RBUkdFVAogLyogRXJyb3IgdmVyZGljdC4gKi8KLSNkZWZpbmUgSVA2VF9FUlJPUl9UQVJHRVQgIkVSUk9SIgorI2RlZmluZSBJUDZUX0VSUk9SX1RBUkdFVCBYVF9FUlJPUl9UQVJHRVQKIAogLyogSGVscGVyIGZ1bmN0aW9ucyAqLwogc3RhdGljIF9faW5saW5lX18gc3RydWN0IGlwNnRfZW50cnlfdGFyZ2V0ICoKQEAgLTM2MSwxMDQgKzMzNCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIGV4dGVybiB2b2lkIGlwNnRfaW5pdCh2b2lkKSBfX2luaXQ7CiAKLXN0cnVjdCBpcDZ0X21hdGNoCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OworI2RlZmluZSBpcDZ0X3JlZ2lzdGVyX3RhcmdldCh0Z3QpIHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgdGd0KQorI2RlZmluZSBpcDZ0X3VucmVnaXN0ZXJfdGFyZ2V0KHRndCkgeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsIHRndCkKIAotCWNvbnN0IGNoYXIgbmFtZVtJUDZUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07Ci0KLQl1X2ludDhfdCByZXZpc2lvbjsKLQotCS8qIFJldHVybiB0cnVlIG9yIGZhbHNlOiByZXR1cm4gRkFMU0UgYW5kIHNldCAqaG90ZHJvcCA9IDEgdG8KLSAgICAgICAgICAgZm9yY2UgaW1tZWRpYXRlIHBhY2tldCBkcm9wLiAqLwotCS8qIEFyZ3VtZW50cyBjaGFuZ2VkIHNpbmNlIDIuNi45LCBhcyB0aGlzIG11c3Qgbm93IGhhbmRsZQotCSAgIG5vbi1saW5lYXIgc2tiLCB1c2luZyBza2JfaGVhZGVyX3BvaW50ZXIgYW5kCi0JICAgc2tiX2lwX21ha2Vfd3JpdGFibGUuICovCi0JaW50ICgqbWF0Y2gpKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCSAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICAgIGludCBvZmZzZXQsCi0JCSAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0JCSAgICAgaW50ICpob3Rkcm9wKTsKLQotCS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KLQkvKiBTaG91bGQgcmV0dXJuIHRydWUgb3IgZmFsc2UuICovCi0JaW50ICgqY2hlY2tlbnRyeSkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkJICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAotCQkJICB2b2lkICptYXRjaGluZm8sCi0JCQkgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAotCQkJICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKTsKLQotCS8qIENhbGxlZCB3aGVuIGVudHJ5IG9mIHRoaXMgdHlwZSBkZWxldGVkLiAqLwotCXZvaWQgKCpkZXN0cm95KSh2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplKTsKLQotCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFIGlmIHlvdSBhcmUgYSBtb2R1bGUsIG90aGVyd2lzZSBOVUxMICovCi0Jc3RydWN0IG1vZHVsZSAqbWU7Ci19OwotCi0vKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCi1zdHJ1Y3QgaXA2dF90YXJnZXQKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQljb25zdCBjaGFyIG5hbWVbSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOLTFdOwotCi0JdV9pbnQ4X3QgcmV2aXNpb247Ci0KLQkvKiBSZXR1cm5zIHZlcmRpY3QuIEFyZ3VtZW50IG9yZGVyIGNoYW5nZWQgc2luY2UgMi42LjksIGFzIHRoaXMKLQkgICBtdXN0IG5vdyBoYW5kbGUgbm9uLWxpbmVhciBza2JzLCB1c2luZyBza2JfY29weV9iaXRzIGFuZAotCSAgIHNrYl9pcF9tYWtlX3dyaXRhYmxlLiAqLwotCXVuc2lnbmVkIGludCAoKnRhcmdldCkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAotCQkJICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKLQotCS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZToKLSAgICAgICAgICAgaG9va19tYXNrIGlzIGEgYml0bWFzayBvZiBob29rcyBmcm9tIHdoaWNoIGl0IGNhbiBiZQotICAgICAgICAgICBjYWxsZWQuICovCi0JLyogU2hvdWxkIHJldHVybiB0cnVlIG9yIGZhbHNlLiAqLwotCWludCAoKmNoZWNrZW50cnkpKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSAgY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUsCi0JCQkgIHZvaWQgKnRhcmdpbmZvLAotCQkJICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAotCQkJICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKTsKLQotCS8qIENhbGxlZCB3aGVuIGVudHJ5IG9mIHRoaXMgdHlwZSBkZWxldGVkLiAqLwotCXZvaWQgKCpkZXN0cm95KSh2b2lkICp0YXJnaW5mbywgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSk7Ci0KLQkvKiBTZXQgdGhpcyB0byBUSElTX01PRFVMRSBpZiB5b3UgYXJlIGEgbW9kdWxlLCBvdGhlcndpc2UgTlVMTCAqLwotCXN0cnVjdCBtb2R1bGUgKm1lOwotfTsKLQotZXh0ZXJuIGludCBpcDZ0X3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgaXA2dF90YXJnZXQgKnRhcmdldCk7Ci1leHRlcm4gdm9pZCBpcDZ0X3VucmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCBpcDZ0X3RhcmdldCAqdGFyZ2V0KTsKLQotZXh0ZXJuIGludCBpcDZ0X3JlZ2lzdGVyX21hdGNoKHN0cnVjdCBpcDZ0X21hdGNoICptYXRjaCk7Ci1leHRlcm4gdm9pZCBpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goc3RydWN0IGlwNnRfbWF0Y2ggKm1hdGNoKTsKLQotLyogRnVybml0dXJlIHNob3BwaW5nLi4uICovCi1zdHJ1Y3QgaXA2dF90YWJsZQotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCS8qIEEgdW5pcXVlIG5hbWUuLi4gKi8KLQljaGFyIG5hbWVbSVA2VF9UQUJMRV9NQVhOQU1FTEVOXTsKLQotCS8qIFdoYXQgaG9va3MgeW91IHdpbGwgZW50ZXIgb24gKi8KLQl1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3M7Ci0KLQkvKiBMb2NrIGZvciB0aGUgY3VydGFpbiAqLwotCXJ3bG9ja190IGxvY2s7Ci0KLQkvKiBNYW4gYmVoaW5kIHRoZSBjdXJ0YWluLi4uICovCi0Jc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKLQotCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFIGlmIHlvdSBhcmUgYSBtb2R1bGUsIG90aGVyd2lzZSBOVUxMICovCi0Jc3RydWN0IG1vZHVsZSAqbWU7Ci19OworI2RlZmluZSBpcDZ0X3JlZ2lzdGVyX21hdGNoKG1hdGNoKSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgbWF0Y2gpCisjZGVmaW5lIGlwNnRfdW5yZWdpc3Rlcl9tYXRjaChtYXRjaCkgeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgbWF0Y2gpCiAKIGV4dGVybiBpbnQgaXA2dF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXA2dF90YWJsZSAqdGFibGUsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfcmVwbGFjZSAqcmVwbCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTUFSSy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X01BUksuaAppbmRleCA3YWRlOGQ4Li43Y2Y2MjlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTUFSSy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9NQVJLLmgKQEAgLTEsOCArMSw5IEBACiAjaWZuZGVmIF9JUDZUX01BUktfSF90YXJnZXQKICNkZWZpbmUgX0lQNlRfTUFSS19IX3RhcmdldAogCi1zdHJ1Y3QgaXA2dF9tYXJrX3RhcmdldF9pbmZvIHsKLQl1bnNpZ25lZCBsb25nIG1hcms7Ci19OworLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG9sZCB1c2Vyc3BhY2UgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfTUFSSy5oPgogCi0jZW5kaWYgLypfSVBUX01BUktfSF90YXJnZXQqLworI2RlZmluZSBpcDZ0X21hcmtfdGFyZ2V0X2luZm8geHRfbWFya190YXJnZXRfaW5mbworCisjZW5kaWYgLypfSVA2VF9NQVJLX0hfdGFyZ2V0Ki8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9sZW5ndGguaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9sZW5ndGguaAppbmRleCA3ZmMwOWY5Li45ZTk2ODlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbGVuZ3RoLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2xlbmd0aC5oCkBAIC0xLDEwICsxLDggQEAKICNpZm5kZWYgX0lQNlRfTEVOR1RIX0gKICNkZWZpbmUgX0lQNlRfTEVOR1RIX0gKIAotc3RydWN0IGlwNnRfbGVuZ3RoX2luZm8gewotCXVfaW50MTZfdCAgbWluLCBtYXg7Ci0JdV9pbnQ4X3QgICBpbnZlcnQ7Ci19OworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9sZW5ndGguaD4KKyNkZWZpbmUgaXA2dF9sZW5ndGhfaW5mbyB4dF9sZW5ndGhfaW5mbwogCiAjZW5kaWYgLypfSVA2VF9MRU5HVEhfSCovCiAJCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbGltaXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9saW1pdC5oCmluZGV4IGYyODY2ZTUuLjQ4N2U1ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9saW1pdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9saW1pdC5oCkBAIC0xLDIxICsxLDggQEAKICNpZm5kZWYgX0lQNlRfUkFURV9ICiAjZGVmaW5lIF9JUDZUX1JBVEVfSAogCi0vKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCi0jZGVmaW5lIElQNlRfTElNSVRfU0NBTEUgMTAwMDAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaD4KKyNkZWZpbmUgSVA2VF9MSU1JVF9TQ0FMRSBYVF9MSU1JVF9TQ0FMRQorI2RlZmluZSBpcDZ0X3JhdGVpbmZvIHh0X3JhdGVpbmZvCiAKLS8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAotICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLwotc3RydWN0IGlwNnRfcmF0ZWluZm8gewotCXVfaW50MzJfdCBhdmc7ICAgIC8qIEF2ZXJhZ2Ugc2VjcyBiZXR3ZWVuIHBhY2tldHMgKiBzY2FsZSAqLwotCXVfaW50MzJfdCBidXJzdDsgIC8qIFBlcmlvZCBtdWx0aXBsaWVyIGZvciB1cHBlciBsaW1pdC4gKi8KLQotCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCi0JdW5zaWduZWQgbG9uZyBwcmV2OwotCXVfaW50MzJfdCBjcmVkaXQ7Ci0JdV9pbnQzMl90IGNyZWRpdF9jYXAsIGNvc3Q7Ci0KLQkvKiBVZ2x5LCB1Z2x5IGZ1Y2tlci4gKi8KLQlzdHJ1Y3QgaXA2dF9yYXRlaW5mbyAqbWFzdGVyOwotfTsKLSNlbmRpZiAvKl9JUFRfUkFURV9IKi8KKyNlbmRpZiAvKl9JUDZUX1JBVEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWFjLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWFjLmgKaW5kZXggODdjMDg4Yy4uYWM1OGU4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tYWMuaApAQCAtMSw4ICsxLDcgQEAKICNpZm5kZWYgX0lQNlRfTUFDX0gKICNkZWZpbmUgX0lQNlRfTUFDX0gKIAotc3RydWN0IGlwNnRfbWFjX2luZm8gewotICAgIHVuc2lnbmVkIGNoYXIgc3JjYWRkcltFVEhfQUxFTl07Ci0gICAgaW50IGludmVydDsKLX07Ci0jZW5kaWYgLypfSVBUX01BQ19IKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbWFjLmg+CisjZGVmaW5lIGlwNnRfbWFjX2luZm8geHRfbWFjX2luZm8KKworI2VuZGlmIC8qX0lQNlRfTUFDX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hcmsuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tYXJrLmgKaW5kZXggYTczNDQ0MS4uZmYyMDQ5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hcmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWFyay5oCkBAIC0xLDkgKzEsOSBAQAogI2lmbmRlZiBfSVA2VF9NQVJLX0gKICNkZWZpbmUgX0lQNlRfTUFSS19ICiAKLXN0cnVjdCBpcDZ0X21hcmtfaW5mbyB7Ci0gICAgdW5zaWduZWQgbG9uZyBtYXJrLCBtYXNrOwotICAgIHVfaW50OF90IGludmVydDsKLX07CisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igb2xkIHVzZXJzcGFjZSAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9tYXJrLmg+CisKKyNkZWZpbmUgaXA2dF9tYXJrX2luZm8geHRfbWFya19pbmZvCiAKICNlbmRpZiAvKl9JUFRfTUFSS19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9waHlzZGV2LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcGh5c2Rldi5oCmluZGV4IGMyMzQ3MzEuLmMxNjFjMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9waHlzZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3BoeXNkZXYuaApAQCAtMSwyNCArMSwxNyBAQAogI2lmbmRlZiBfSVA2VF9QSFlTREVWX0gKICNkZWZpbmUgX0lQNlRfUEhZU0RFVl9ICiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvaWYuaD4KLSNlbmRpZgorLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG9sZCB1c2Vyc3BhY2UgKi8KIAotI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSU4JCTB4MDEKLSNkZWZpbmUgSVA2VF9QSFlTREVWX09QX09VVAkJMHgwMgotI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfQlJJREdFRAkJMHgwNAotI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSVNJTgkJMHgwOAotI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSVNPVVQJCTB4MTAKLSNkZWZpbmUgSVA2VF9QSFlTREVWX09QX01BU0sJCSgweDIwIC0gMSkKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5oPgogCi1zdHJ1Y3QgaXA2dF9waHlzZGV2X2luZm8gewotCWNoYXIgcGh5c2luZGV2W0lGTkFNU0laXTsKLQljaGFyIGluX21hc2tbSUZOQU1TSVpdOwotCWNoYXIgcGh5c291dGRldltJRk5BTVNJWl07Ci0JY2hhciBvdXRfbWFza1tJRk5BTVNJWl07Ci0JdV9pbnQ4X3QgaW52ZXJ0OwotCXVfaW50OF90IGJpdG1hc2s7Ci19OworI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSU4JCVhUX1BIWVNERVZfT1BfSU4KKyNkZWZpbmUgSVA2VF9QSFlTREVWX09QX09VVAkJWFRfUEhZU0RFVl9PUF9PVVQKKyNkZWZpbmUgSVA2VF9QSFlTREVWX09QX0JSSURHRUQJCVhUX1BIWVNERVZfT1BfQlJJREdFRAorI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSVNJTgkJWFRfUEhZU0RFVl9PUF9JU0lOCisjZGVmaW5lIElQNlRfUEhZU0RFVl9PUF9JU09VVAkJWFRfUEhZU0RFVl9PUF9JU09VVAorI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfTUFTSwkJWFRfUEhZU0RFVl9PUF9NQVNLCisKKyNkZWZpbmUgaXA2dF9waHlzZGV2X2luZm8geHRfcGh5c2Rldl9pbmZvCiAKICNlbmRpZiAvKl9JUDZUX1BIWVNERVZfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BoeS5oIGIvaW5jbHVkZS9saW51eC9waHkuaAppbmRleCA5MmE5Njk2Li4zMzE1MjFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BoeS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGh5LmgKQEAgLTUzLDYgKzUzLDkgQEAKIAogI2RlZmluZSBQSFlfTUFYX0FERFIgMzIKIAorLyogVXNlZCB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIGEgc3BlY2lmaWMgcGh5IChtaWkgYnVzIGlkOnBoeSBkZXZpY2UgaWQpICovCisjZGVmaW5lIFBIWV9JRF9GTVQgIiV4OiUwMngiCisKIC8qIFRoZSBCdXMgY2xhc3MgZm9yIFBIWXMuICBEZXZpY2VzIHdoaWNoIHByb3ZpZGUgYWNjZXNzIHRvCiAgKiBQSFlzIHNob3VsZCByZWdpc3RlciB1c2luZyB0aGlzIHN0cnVjdHVyZSAqLwogc3RydWN0IG1paV9idXMgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaAppbmRleCA3NDQ4OGU0Li5hYTYzMjJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaApAQCAtMTQ2LDYgKzE0NiwxMSBAQAogZXh0ZXJuIHZvaWQgcHJvY19kZXZpY2VfdHJlZV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgcHJvY19kZXZpY2VfdHJlZV9hZGRfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKiwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICopOwogZXh0ZXJuIHZvaWQgcHJvY19kZXZpY2VfdHJlZV9hZGRfcHJvcChzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSwgc3RydWN0IHByb3BlcnR5ICpwcm9wKTsKK2V4dGVybiB2b2lkIHByb2NfZGV2aWNlX3RyZWVfcmVtb3ZlX3Byb3Aoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUsCisJCQkJCSBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApOworZXh0ZXJuIHZvaWQgcHJvY19kZXZpY2VfdHJlZV91cGRhdGVfcHJvcChzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSwKKwkJCQkJIHN0cnVjdCBwcm9wZXJ0eSAqbmV3cHJvcCwKKwkJCQkJIHN0cnVjdCBwcm9wZXJ0eSAqb2xkcHJvcCk7CiAjZW5kaWYgLyogQ09ORklHX1BST0NfREVWSUNFVFJFRSAqLwogCiBleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3N5bWxpbmsoY29uc3QgY2hhciAqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDNiNzRjNGIuLmE3MmUxNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTYzMSw3ICs2MzEsMTQgQEAKIAogZXh0ZXJuIHZvaWQgcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoY3B1bWFza190ICpwYXJ0aXRpb24xLAogCQkJCSAgICBjcHVtYXNrX3QgKnBhcnRpdGlvbjIpOwotI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKworLyoKKyAqIE1heGltdW0gY2FjaGUgc2l6ZSB0aGUgbWlncmF0aW9uLWNvc3RzIGF1dG8tdHVuaW5nIGNvZGUgd2lsbAorICogc2VhcmNoIGZyb206CisgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgbWF4X2NhY2hlX3NpemU7CisKKyNlbmRpZgkvKiBDT05GSUdfU01QICovCiAKIAogc3RydWN0IGlvX2NvbnRleHQ7CQkJLyogU2VlIGJsa2Rldi5oICovCkBAIC02ODksOSArNjk2LDEyIEBACiAKIAlpbnQgbG9ja19kZXB0aDsJCS8qIEJLTCBsb2NrIGRlcHRoICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cpCisjaWYgZGVmaW5lZChDT05GSUdfU01QKQorCWludCBsYXN0X3dha2VyX2NwdTsJLyogQ1BVIHRoYXQgbGFzdCB3b2tlIHRoaXMgdGFzayB1cCAqLworI2lmIGRlZmluZWQoX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cpCiAJaW50IG9uY3B1OwogI2VuZGlmCisjZW5kaWYKIAlpbnQgcHJpbywgc3RhdGljX3ByaW87CiAJc3RydWN0IGxpc3RfaGVhZCBydW5fbGlzdDsKIAlwcmlvX2FycmF5X3QgKmFycmF5OwpAQCAtMTIzMCw2ICsxMjQwLDcgQEAKICNpZm5kZWYgX19IQVZFX1RIUkVBRF9GVU5DVElPTlMKIAogI2RlZmluZSB0YXNrX3RocmVhZF9pbmZvKHRhc2spICh0YXNrKS0+dGhyZWFkX2luZm8KKyNkZWZpbmUgdGFza19zdGFja19wYWdlKHRhc2spICgodm9pZCopKCh0YXNrKS0+dGhyZWFkX2luZm8pKQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfdGhyZWFkX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHRhc2tfc3RydWN0ICpvcmcpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKaW5kZXggZTM3MTBkNy4uYTgxODdjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaApAQCAtNjcsNiArNjcsOSBAQAogLyogUGFyaXNjIHR5cGUgbnVtYmVycy4gKi8KICNkZWZpbmUgUE9SVF9NVVgJNDgKIAorLyogQXRtZWwgQVQ5MVJNOTIwMCBTb0MgKi8KKyNkZWZpbmUgUE9SVF9BVDkxUk05MjAwIDQ5CisKIC8qIE1hY2ludG9zaCBaaWxvZyB0eXBlIG51bWJlcnMgKi8KICNkZWZpbmUgUE9SVF9NQUNfWklMT0cJNTAJLyogbTY4ayA6IG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KICNkZWZpbmUgUE9SVF9QTUFDX1pJTE9HCTUxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaAppbmRleCA5ZjQwMTkxLi5iMDJkZGE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKQEAgLTE4Niw2ICsxODYsNyBAQAogI2RlZmluZSBBRl9QUFBPWAkyNAkvKiBQUFBvWCBzb2NrZXRzCQkqLwogI2RlZmluZSBBRl9XQU5QSVBFCTI1CS8qIFdhbnBpcGUgQVBJIFNvY2tldHMgKi8KICNkZWZpbmUgQUZfTExDCQkyNgkvKiBMaW51eCBMTEMJCQkqLworI2RlZmluZSBBRl9USVBDCQkzMAkvKiBUSVBDIHNvY2tldHMJCQkqLwogI2RlZmluZSBBRl9CTFVFVE9PVEgJMzEJLyogQmx1ZXRvb3RoIHNvY2tldHMgCQkqLwogI2RlZmluZSBBRl9NQVgJCTMyCS8qIEZvciBub3cuLiAqLwogCkBAIC0yMTgsNiArMjE5LDcgQEAKICNkZWZpbmUgUEZfUFBQT1gJQUZfUFBQT1gKICNkZWZpbmUgUEZfV0FOUElQRQlBRl9XQU5QSVBFCiAjZGVmaW5lIFBGX0xMQwkJQUZfTExDCisjZGVmaW5lIFBGX1RJUEMJCUFGX1RJUEMKICNkZWZpbmUgUEZfQkxVRVRPT1RICUFGX0JMVUVUT09USAogI2RlZmluZSBQRl9NQVgJCUFGX01BWAogCkBAIC0yNzksNiArMjgxLDcgQEAKICNkZWZpbmUgU09MX0xMQwkJMjY4CiAjZGVmaW5lIFNPTF9EQ0NQCTI2OQogI2RlZmluZSBTT0xfTkVUTElOSwkyNzAKKyNkZWZpbmUgU09MX1RJUEMJMjcxCiAKIC8qIElQWCBvcHRpb25zICovCiAjZGVmaW5lIElQWF9UWVBFCTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL2Fkczc4NDYuaCBiL2luY2x1ZGUvbGludXgvc3BpL2Fkczc4NDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjI2MWUwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvYWRzNzg0Ni5oCkBAIC0wLDAgKzEsMTggQEAKKy8qIGxpbnV4L3NwaS9hZHM3ODQ2LmggKi8KKworLyogVG91Y2hzY3JlZW4gY2hhcmFjdGVyaXN0aWNzIHZhcnkgYmV0d2VlbiBib2FyZHMgYW5kIG1vZGVscy4gIFRoZQorICogcGxhdGZvcm1fZGF0YSBmb3IgdGhlIGRldmljZSdzICJzdHJ1Y3QgZGV2aWNlIiBob2xkcyB0aGlzIGluZm9ybWF0aW9uLgorICoKKyAqIEl0J3MgT0sgaWYgdGhlIG1pbi9tYXggdmFsdWVzIGFyZSB6ZXJvLgorICovCitzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhIHsKKwl1MTYJbW9kZWw7CQkJLyogNzg0MywgNzg0NSwgNzg0Ni4gKi8KKwl1MTYJdnJlZl9kZWxheV91c2VjczsJLyogMCBmb3IgZXh0ZXJuYWwgdnJlZjsgZXRjICovCisJdTE2CXhfcGxhdGVfb2htczsKKwl1MTYJeV9wbGF0ZV9vaG1zOworCisJdTE2CXhfbWluLCB4X21heDsKKwl1MTYJeV9taW4sIHlfbWF4OworCXUxNglwcmVzc3VyZV9taW4sIHByZXNzdXJlX21heDsKK307CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL2ZsYXNoLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9mbGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMjI5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9mbGFzaC5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgTElOVVhfU1BJX0ZMQVNIX0gKKyNkZWZpbmUgTElOVVhfU1BJX0ZMQVNIX0gKKworc3RydWN0IG10ZF9wYXJ0aXRpb247CisKKy8qKgorICogc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGE6IGJvYXJkLXNwZWNpZmljIGZsYXNoIGRhdGEKKyAqIEBuYW1lOiBvcHRpb25hbCBmbGFzaCBkZXZpY2UgbmFtZSAoZWcsIGFzIHVzZWQgd2l0aCBtdGRwYXJ0cz0pCisgKiBAcGFydHM6IG9wdGlvbmFsIGFycmF5IG9mIG10ZF9wYXJ0aXRpb25zIGZvciBzdGF0aWMgcGFydGl0aW9uaW5nCisgKiBAbnJfcGFydHM6IG51bWJlciBvZiBtdGRfcGFydGl0aW9ucyBmb3Igc3RhdGljIHBhcnRpdG9uaW5nCisgKiBAdHlwZTogb3B0aW9uYWwgZmxhc2ggZGV2aWNlIHR5cGUgKGUuZy4gbTI1cDgwIHZzIG0yNXA2NCksIGZvciB1c2UKKyAqCXdpdGggY2hpcHMgdGhhdCBjYW4ndCBiZSBxdWVyaWVkIGZvciBKRURFQyBvciBvdGhlciBJRHMKKyAqCisgKiBCb2FyZCBpbml0IGNvZGUgKGluIGFyY2gvLi4uL21hY2gteHh4L2JvYXJkLXl5eS5jIGZpbGVzKSBjYW4KKyAqIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgU1BJIGZsYXNoIHBhcnRzIChzdWNoIGFzIERhdGFGbGFzaCkgdG8KKyAqIGhlbHAgc2V0IHVwIHRoZSBkZXZpY2UgYW5kIGl0cyBhcHByb3ByaWF0ZSBkZWZhdWx0IHBhcnRpdGlvbmluZy4KKyAqCisgKiBOb3RlIHRoYXQgZm9yIERhdGFGbGFzaCwgc2l6ZXMgZm9yIHBhZ2VzLCBibG9ja3MsIGFuZCBzZWN0b3JzIGFyZQorICogcmFyZWx5IHBvd2VycyBvZiB0d287IGFuZCBwYXJ0aXRpb25zIHNob3VsZCBiZSBzZWN0b3ItYWxpZ25lZC4KKyAqLworc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgeworCWNoYXIJCSpuYW1lOworCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKKwl1bnNpZ25lZCBpbnQJbnJfcGFydHM7CisKKwljaGFyCQkqdHlwZTsKKworCS8qIHdlJ2xsIGxpa2VseSBhZGQgbW9yZSAuLi4gdXNlIEpFREVDIElEcywgZXRjICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1ZjE0NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCkBAIC0wLDAgKzEsNjY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1NQSV9ICisjZGVmaW5lIF9fTElOVVhfU1BJX0gKKworLyoKKyAqIElOVEVSRkFDRVMgYmV0d2VlbiBTUEkgbWFzdGVyLXNpZGUgZHJpdmVycyBhbmQgU1BJIGluZnJhc3RydWN0dXJlLgorICogKFRoZXJlJ3Mgbm8gU1BJIHNsYXZlIHN1cHBvcnQgZm9yIExpbnV4IHlldC4uLikKKyAqLworZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBzcGlfYnVzX3R5cGU7CisKKy8qKgorICogc3RydWN0IHNwaV9kZXZpY2UgLSBNYXN0ZXIgc2lkZSBwcm94eSBmb3IgYW4gU1BJIHNsYXZlIGRldmljZQorICogQGRldjogRHJpdmVyIG1vZGVsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXZpY2UuCisgKiBAbWFzdGVyOiBTUEkgY29udHJvbGxlciB1c2VkIHdpdGggdGhlIGRldmljZS4KKyAqIEBtYXhfc3BlZWRfaHo6IE1heGltdW0gY2xvY2sgcmF0ZSB0byBiZSB1c2VkIHdpdGggdGhpcyBjaGlwCisgKgkob24gdGhpcyBib2FyZCk7IG1heSBiZSBjaGFuZ2VkIGJ5IHRoZSBkZXZpY2UncyBkcml2ZXIuCisgKiBAY2hpcC1zZWxlY3Q6IENoaXBzZWxlY3QsIGRpc3Rpbmd1aXNoaW5nIGNoaXBzIGhhbmRsZWQgYnkgIm1hc3RlciIuCisgKiBAbW9kZTogVGhlIHNwaSBtb2RlIGRlZmluZXMgaG93IGRhdGEgaXMgY2xvY2tlZCBvdXQgYW5kIGluLgorICoJVGhpcyBtYXkgYmUgY2hhbmdlZCBieSB0aGUgZGV2aWNlJ3MgZHJpdmVyLgorICogQGJpdHNfcGVyX3dvcmQ6IERhdGEgdHJhbnNmZXJzIGludm9sdmUgb25lIG9yIG1vcmUgd29yZHM7IHdvcmQgc2l6ZXMKKyAqIAlsaWtlIGVpZ2h0IG9yIDEyIGJpdHMgYXJlIGNvbW1vbi4gIEluLW1lbW9yeSB3b3Jkc2l6ZXMgYXJlCisgKglwb3dlcnMgb2YgdHdvIGJ5dGVzIChlLmcuIDIwIGJpdCBzYW1wbGVzIHVzZSAzMiBiaXRzKS4KKyAqCVRoaXMgbWF5IGJlIGNoYW5nZWQgYnkgdGhlIGRldmljZSdzIGRyaXZlci4KKyAqIEBpcnE6IE5lZ2F0aXZlLCBvciB0aGUgbnVtYmVyIHBhc3NlZCB0byByZXF1ZXN0X2lycSgpIHRvIHJlY2VpdmUKKyAqIAlpbnRlcnJ1cHRzIGZyb20gdGhpcyBkZXZpY2UuCisgKiBAY29udHJvbGxlcl9zdGF0ZTogQ29udHJvbGxlcidzIHJ1bnRpbWUgc3RhdGUKKyAqIEBjb250cm9sbGVyX2RhdGE6IEJvYXJkLXNwZWNpZmljIGRlZmluaXRpb25zIGZvciBjb250cm9sbGVyLCBzdWNoIGFzCisgKiAJRklGTyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzOyBmcm9tIGJvYXJkX2luZm8uY29udHJvbGxlcl9kYXRhCisgKgorICogQW4gc3BpX2RldmljZSBpcyB1c2VkIHRvIGludGVyY2hhbmdlIGRhdGEgYmV0d2VlbiBhbiBTUEkgc2xhdmUKKyAqICh1c3VhbGx5IGEgZGlzY3JldGUgY2hpcCkgYW5kIENQVSBtZW1vcnkuCisgKgorICogSW4gImRldiIsIHRoZSBwbGF0Zm9ybV9kYXRhIGlzIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzCisgKiBkZXZpY2UgdGhhdCdzIG1lYW5pbmdmdWwgdG8gdGhlIGRldmljZSdzIHByb3RvY29sIGRyaXZlciwgYnV0IG5vdAorICogdG8gaXRzIGNvbnRyb2xsZXIuICBPbmUgZXhhbXBsZSBtaWdodCBiZSBhbiBpZGVudGlmaWVyIGZvciBhIGNoaXAKKyAqIHZhcmlhbnQgd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgZnVuY3Rpb25hbGl0eS4KKyAqLworc3RydWN0IHNwaV9kZXZpY2UgeworCXN0cnVjdCBkZXZpY2UJCWRldjsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXUzMgkJCW1heF9zcGVlZF9oejsKKwl1OAkJCWNoaXBfc2VsZWN0OworCXU4CQkJbW9kZTsKKyNkZWZpbmUJU1BJX0NQSEEJMHgwMQkJCS8qIGNsb2NrIHBoYXNlICovCisjZGVmaW5lCVNQSV9DUE9MCTB4MDIJCQkvKiBjbG9jayBwb2xhcml0eSAqLworI2RlZmluZQlTUElfTU9ERV8wCSgwfDApCQkJLyogKG9yaWdpbmFsIE1pY3JvV2lyZSkgKi8KKyNkZWZpbmUJU1BJX01PREVfMQkoMHxTUElfQ1BIQSkKKyNkZWZpbmUJU1BJX01PREVfMgkoU1BJX0NQT0x8MCkKKyNkZWZpbmUJU1BJX01PREVfMwkoU1BJX0NQT0x8U1BJX0NQSEEpCisjZGVmaW5lCVNQSV9DU19ISUdICTB4MDQJCQkvKiBjaGlwc2VsZWN0IGFjdGl2ZSBoaWdoPyAqLworCXU4CQkJYml0c19wZXJfd29yZDsKKwlpbnQJCQlpcnE7CisJdm9pZAkJCSpjb250cm9sbGVyX3N0YXRlOworCXZvaWQJCQkqY29udHJvbGxlcl9kYXRhOworCWNvbnN0IGNoYXIJCSptb2RhbGlhczsKKworCS8vIGxpa2VseSBuZWVkIG1vcmUgaG9va3MgZm9yIG1vcmUgcHJvdG9jb2wgb3B0aW9ucyBhZmZlY3RpbmcgaG93CisJLy8gdGhlIGNvbnRyb2xsZXIgdGFsa3MgdG8gZWFjaCBjaGlwLCBsaWtlOgorCS8vICAtIGJpdCBvcmRlciAoZGVmYXVsdCBpcyB3b3Jkd2lzZSBtc2ItZmlyc3QpCisJLy8gIC0gbWVtb3J5IHBhY2tpbmcgKDEyIGJpdCBzYW1wbGVzIGludG8gbG93IGJpdHMsIG90aGVycyB6ZXJvZWQpCisJLy8gIC0gcHJpb3JpdHkKKwkvLyAgLSBkcm9wIGNoaXBzZWxlY3QgYWZ0ZXIgZWFjaCB3b3JkCisJLy8gIC0gY2hpcHNlbGVjdCBkZWxheXMKKwkvLyAgLSAuLi4KK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwaV9kZXZpY2UgKnRvX3NwaV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYgPyBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc3BpX2RldmljZSwgZGV2KSA6IE5VTEw7Cit9CisKKy8qIG1vc3QgZHJpdmVycyB3b24ndCBuZWVkIHRvIGNhcmUgYWJvdXQgZGV2aWNlIHJlZmNvdW50aW5nICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2X2dldChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiAoc3BpICYmIGdldF9kZXZpY2UoJnNwaS0+ZGV2KSkgPyBzcGkgOiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX2Rldl9wdXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpZiAoc3BpKQorCQlwdXRfZGV2aWNlKCZzcGktPmRldik7Cit9CisKKy8qIGN0bGRhdGEgaXMgZm9yIHRoZSBidXNfbWFzdGVyIGRyaXZlcidzIHJ1bnRpbWUgc3RhdGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqc3BpX2dldF9jdGxkYXRhKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNwaV9zZXRfY3RsZGF0YShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB2b2lkICpzdGF0ZSkKK3sKKwlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBzdGF0ZTsKK30KKworCitzdHJ1Y3Qgc3BpX21lc3NhZ2U7CisKKworCitzdHJ1Y3Qgc3BpX2RyaXZlciB7CisJaW50CQkJKCpwcm9iZSkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7CisJaW50CQkJKCpyZW1vdmUpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpOworCXZvaWQJCQkoKnNodXRkb3duKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKKwlpbnQJCQkoKnN1c3BlbmQpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHBtX21lc3NhZ2VfdCBtZXNnKTsKKwlpbnQJCQkoKnJlc3VtZSkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7CisJc3RydWN0IGRldmljZV9kcml2ZXIJZHJpdmVyOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3BpX2RyaXZlciAqdG9fc3BpX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXJldHVybiBkcnYgPyBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3Qgc3BpX2RyaXZlciwgZHJpdmVyKSA6IE5VTEw7Cit9CisKK2V4dGVybiBpbnQgc3BpX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgc3BpX2RyaXZlciAqc2Rydik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNwaV9kcml2ZXIgKnNkcnYpCit7CisJaWYgKCFzZHJ2KQorCQlyZXR1cm47CisJZHJpdmVyX3VucmVnaXN0ZXIoJnNkcnYtPmRyaXZlcik7Cit9CisKKworCisvKioKKyAqIHN0cnVjdCBzcGlfbWFzdGVyIC0gaW50ZXJmYWNlIHRvIFNQSSBtYXN0ZXIgY29udHJvbGxlcgorICogQGNkZXY6IGNsYXNzIGludGVyZmFjZSB0byB0aGlzIGRyaXZlcgorICogQGJ1c19udW06IGJvYXJkLXNwZWNpZmljIChhbmQgb2Z0ZW4gU09DLXNwZWNpZmljKSBpZGVudGlmaWVyIGZvciBhCisgKiAJZ2l2ZW4gU1BJIGNvbnRyb2xsZXIuCisgKiBAbnVtX2NoaXBzZWxlY3Q6IGNoaXBzZWxlY3RzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGluZGl2aWR1YWwKKyAqIAlTUEkgc2xhdmVzLCBhbmQgYXJlIG51bWJlcmVkIGZyb20gemVybyB0byBudW1fY2hpcHNlbGVjdHMuCisgKiAJZWFjaCBzbGF2ZSBoYXMgYSBjaGlwc2VsZWN0IHNpZ25hbCwgYnV0IGl0J3MgY29tbW9uIHRoYXQgbm90CisgKiAJZXZlcnkgY2hpcHNlbGVjdCBpcyBjb25uZWN0ZWQgdG8gYSBzbGF2ZS4KKyAqIEBzZXR1cDogdXBkYXRlcyB0aGUgZGV2aWNlIG1vZGUgYW5kIGNsb2NraW5nIHJlY29yZHMgdXNlZCBieSBhCisgKiAJZGV2aWNlJ3MgU1BJIGNvbnRyb2xsZXI7IHByb3RvY29sIGNvZGUgbWF5IGNhbGwgdGhpcy4KKyAqIEB0cmFuc2ZlcjogYWRkcyBhIG1lc3NhZ2UgdG8gdGhlIGNvbnRyb2xsZXIncyB0cmFuc2ZlciBxdWV1ZS4KKyAqIEBjbGVhbnVwOiBmcmVlcyBjb250cm9sbGVyLXNwZWNpZmljIHN0YXRlCisgKgorICogRWFjaCBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgY2FuIGNvbW11bmljYXRlIHdpdGggb25lIG9yIG1vcmUgc3BpX2RldmljZQorICogY2hpbGRyZW4uICBUaGVzZSBtYWtlIGEgc21hbGwgYnVzLCBzaGFyaW5nIE1PU0ksIE1JU08gYW5kIFNDSyBzaWduYWxzCisgKiBidXQgbm90IGNoaXAgc2VsZWN0IHNpZ25hbHMuICBFYWNoIGRldmljZSBtYXkgYmUgY29uZmlndXJlZCB0byB1c2UgYQorICogZGlmZmVyZW50IGNsb2NrIHJhdGUsIHNpbmNlIHRob3NlIHNoYXJlZCBzaWduYWxzIGFyZSBpZ25vcmVkIHVubGVzcworICogdGhlIGNoaXAgaXMgc2VsZWN0ZWQuCisgKgorICogVGhlIGRyaXZlciBmb3IgYW4gU1BJIGNvbnRyb2xsZXIgbWFuYWdlcyBhY2Nlc3MgdG8gdGhvc2UgZGV2aWNlcyB0aHJvdWdoCisgKiBhIHF1ZXVlIG9mIHNwaV9tZXNzYWdlIHRyYW5zYWN0aW9ucywgY29weWluIGRhdGEgYmV0d2VlbiBDUFUgbWVtb3J5IGFuZAorICogYW4gU1BJIHNsYXZlIGRldmljZSkuICBGb3IgZWFjaCBzdWNoIG1lc3NhZ2UgaXQgcXVldWVzLCBpdCBjYWxscyB0aGUKKyAqIG1lc3NhZ2UncyBjb21wbGV0aW9uIGZ1bmN0aW9uIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGNvbXBsZXRlcy4KKyAqLworc3RydWN0IHNwaV9tYXN0ZXIgeworCXN0cnVjdCBjbGFzc19kZXZpY2UJY2RldjsKKworCS8qIG90aGVyIHRoYW4gemVybyAoPT0gYXNzaWduIG9uZSBkeW5hbWljYWxseSksIGJ1c19udW0gaXMgZnVsbHkKKwkgKiBib2FyZC1zcGVjaWZpYy4gIHVzdWFsbHkgdGhhdCBzaW1wbGlmaWVzIHRvIGJlaW5nIFNPQy1zcGVjaWZpYy4KKwkgKiBleGFtcGxlOiAgb25lIFNPQyBoYXMgdGhyZWUgU1BJIGNvbnRyb2xsZXJzLCBudW1iZXJlZCAxLi4zLAorCSAqIGFuZCBvbmUgYm9hcmQncyBzY2hlbWF0aWNzIG1pZ2h0IHNob3cgaXQgdXNpbmcgU1BJLTIuICBzb2Z0d2FyZQorCSAqIHdvdWxkIG5vcm1hbGx5IHVzZSBidXNfbnVtPTIgZm9yIHRoYXQgY29udHJvbGxlci4KKwkgKi8KKwl1MTYJCQlidXNfbnVtOworCisJLyogY2hpcHNlbGVjdHMgd2lsbCBiZSBpbnRlZ3JhbCB0byBtYW55IGNvbnRyb2xsZXJzOyBzb21lIG90aGVycworCSAqIG1pZ2h0IHVzZSBib2FyZC1zcGVjaWZpYyBHUElPcy4KKwkgKi8KKwl1MTYJCQludW1fY2hpcHNlbGVjdDsKKworCS8qIHNldHVwIG1vZGUgYW5kIGNsb2NrLCBldGMgKHNwaSBkcml2ZXIgbWF5IGNhbGwgbWFueSB0aW1lcykgKi8KKwlpbnQJCQkoKnNldHVwKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKKworCS8qIGJpZGlyZWN0aW9uYWwgYnVsayB0cmFuc2ZlcnMKKwkgKgorCSAqICsgVGhlIHRyYW5zZmVyKCkgbWV0aG9kIG1heSBub3Qgc2xlZXA7IGl0cyBtYWluIHJvbGUgaXMKKwkgKiAgIGp1c3QgdG8gYWRkIHRoZSBtZXNzYWdlIHRvIHRoZSBxdWV1ZS4KKwkgKiArIEZvciBub3cgdGhlcmUncyBubyByZW1vdmUtZnJvbS1xdWV1ZSBvcGVyYXRpb24sIG9yCisJICogICBhbnkgb3RoZXIgcmVxdWVzdCBtYW5hZ2VtZW50CisJICogKyBUbyBhIGdpdmVuIHNwaV9kZXZpY2UsIG1lc3NhZ2UgcXVldWVpbmcgaXMgcHVyZSBmaWZvCisJICoKKwkgKiArIFRoZSBtYXN0ZXIncyBtYWluIGpvYiBpcyB0byBwcm9jZXNzIGl0cyBtZXNzYWdlIHF1ZXVlLAorCSAqICAgc2VsZWN0aW5nIGEgY2hpcCB0aGVuIHRyYW5zZmVycmluZyBkYXRhCisJICogKyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3BpX2RldmljZSBjaGlsZHJlbiwgdGhlIGkvbyBxdWV1ZQorCSAqICAgYXJiaXRyYXRpb24gYWxnb3JpdGhtIGlzIHVuc3BlY2lmaWVkIChyb3VuZCByb2JpbiwgZmlmbywKKwkgKiAgIHByaW9yaXR5LCByZXNlcnZhdGlvbnMsIHByZWVtcHRpb24sIGV0YykKKwkgKgorCSAqICsgQ2hpcHNlbGVjdCBzdGF5cyBhY3RpdmUgZHVyaW5nIHRoZSBlbnRpcmUgbWVzc2FnZQorCSAqICAgKHVubGVzcyBtb2RpZmllZCBieSBzcGlfdHJhbnNmZXIuY3NfY2hhbmdlICE9IDApLgorCSAqICsgVGhlIG1lc3NhZ2UgdHJhbnNmZXJzIHVzZSBjbG9jayBhbmQgU1BJIG1vZGUgcGFyYW1ldGVycworCSAqICAgcHJldmlvdXNseSBlc3RhYmxpc2hlZCBieSBzZXR1cCgpIGZvciB0aGlzIGRldmljZQorCSAqLworCWludAkJCSgqdHJhbnNmZXIpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc2cpOworCisJLyogY2FsbGVkIG9uIHJlbGVhc2UoKSB0byBmcmVlIG1lbW9yeSBwcm92aWRlZCBieSBzcGlfbWFzdGVyICovCisJdm9pZAkJCSgqY2xlYW51cCkoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgKnNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlyZXR1cm4gY2xhc3NfZ2V0X2RldmRhdGEoJm1hc3Rlci0+Y2Rldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGlfbWFzdGVyX3NldF9kZXZkYXRhKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHZvaWQgKmRhdGEpCit7CisJY2xhc3Nfc2V0X2RldmRhdGEoJm1hc3Rlci0+Y2RldiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwaV9tYXN0ZXIgKnNwaV9tYXN0ZXJfZ2V0KHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJaWYgKCFtYXN0ZXIgfHwgIWNsYXNzX2RldmljZV9nZXQoJm1hc3Rlci0+Y2RldikpCisJCXJldHVybiBOVUxMOworCXJldHVybiBtYXN0ZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGlfbWFzdGVyX3B1dChzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCWlmIChtYXN0ZXIpCisJCWNsYXNzX2RldmljZV9wdXQoJm1hc3Rlci0+Y2Rldik7Cit9CisKKworLyogdGhlIHNwaSBkcml2ZXIgY29yZSBtYW5hZ2VzIG1lbW9yeSBmb3IgdGhlIHNwaV9tYXN0ZXIgY2xhc3NkZXYgKi8KK2V4dGVybiBzdHJ1Y3Qgc3BpX21hc3RlciAqCitzcGlfYWxsb2NfbWFzdGVyKHN0cnVjdCBkZXZpY2UgKmhvc3QsIHVuc2lnbmVkIHNpemUpOworCitleHRlcm4gaW50IHNwaV9yZWdpc3Rlcl9tYXN0ZXIoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlcik7CitleHRlcm4gdm9pZCBzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlcik7CisKK2V4dGVybiBzdHJ1Y3Qgc3BpX21hc3RlciAqc3BpX2J1c251bV90b19tYXN0ZXIodTE2IGJ1c251bSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEkvTyBJTlRFUkZBQ0UgYmV0d2VlbiBTUEkgY29udHJvbGxlciBhbmQgcHJvdG9jb2wgZHJpdmVycworICoKKyAqIFByb3RvY29sIGRyaXZlcnMgdXNlIGEgcXVldWUgb2Ygc3BpX21lc3NhZ2VzLCBlYWNoIHRyYW5zZmVycmluZyBkYXRhCisgKiBiZXR3ZWVuIHRoZSBjb250cm9sbGVyIGFuZCBtZW1vcnkgYnVmZmVycy4KKyAqCisgKiBUaGUgc3BpX21lc3NhZ2VzIHRoZW1zZWx2ZXMgY29uc2lzdCBvZiBhIHNlcmllcyBvZiByZWFkK3dyaXRlIHRyYW5zZmVyCisgKiBzZWdtZW50cy4gIFRob3NlIHNlZ21lbnRzIGFsd2F5cyByZWFkIHRoZSBzYW1lIG51bWJlciBvZiBiaXRzIGFzIHRoZXkKKyAqIHdyaXRlOyBidXQgb25lIG9yIHRoZSBvdGhlciBpcyBlYXNpbHkgaWdub3JlZCBieSBwYXNzaW5nIGEgbnVsbCBidWZmZXIKKyAqIHBvaW50ZXIuICAoVGhpcyBpcyB1bmxpa2UgbW9zdCB0eXBlcyBvZiBJL08gQVBJLCBiZWNhdXNlIFNQSSBoYXJkd2FyZQorICogaXMgZnVsbCBkdXBsZXguKQorICoKKyAqIE5PVEU6ICBBbGxvY2F0aW9uIG9mIHNwaV90cmFuc2ZlciBhbmQgc3BpX21lc3NhZ2UgbWVtb3J5IGlzIGVudGlyZWx5CisgKiB1cCB0byB0aGUgcHJvdG9jb2wgZHJpdmVyLCB3aGljaCBndWFyYW50ZWVzIHRoZSBpbnRlZ3JpdHkgb2YgYm90aCAoYXMKKyAqIHdlbGwgYXMgdGhlIGRhdGEgYnVmZmVycykgZm9yIGFzIGxvbmcgYXMgdGhlIG1lc3NhZ2UgaXMgcXVldWVkLgorICovCisKKy8qKgorICogc3RydWN0IHNwaV90cmFuc2ZlciAtIGEgcmVhZC93cml0ZSBidWZmZXIgcGFpcgorICogQHR4X2J1ZjogZGF0YSB0byBiZSB3cml0dGVuIChkbWEtc2FmZSBtZW1vcnkpLCBvciBOVUxMCisgKiBAcnhfYnVmOiBkYXRhIHRvIGJlIHJlYWQgKGRtYS1zYWZlIG1lbW9yeSksIG9yIE5VTEwKKyAqIEB0eF9kbWE6IERNQSBhZGRyZXNzIG9mIHR4X2J1ZiwgaWYgc3BpX21lc3NhZ2UuaXNfZG1hX21hcHBlZAorICogQHJ4X2RtYTogRE1BIGFkZHJlc3Mgb2YgcnhfYnVmLCBpZiBzcGlfbWVzc2FnZS5pc19kbWFfbWFwcGVkCisgKiBAbGVuOiBzaXplIG9mIHJ4IGFuZCB0eCBidWZmZXJzIChpbiBieXRlcykKKyAqIEBjc19jaGFuZ2U6IGFmZmVjdHMgY2hpcHNlbGVjdCBhZnRlciB0aGlzIHRyYW5zZmVyIGNvbXBsZXRlcworICogQGRlbGF5X3VzZWNzOiBtaWNyb3NlY29uZHMgdG8gZGVsYXkgYWZ0ZXIgdGhpcyB0cmFuc2ZlciBiZWZvcmUKKyAqIAkob3B0aW9uYWxseSkgY2hhbmdpbmcgdGhlIGNoaXBzZWxlY3Qgc3RhdHVzLCB0aGVuIHN0YXJ0aW5nCisgKiAJdGhlIG5leHQgdHJhbnNmZXIgb3IgY29tcGxldGluZyB0aGlzIHNwaV9tZXNzYWdlLgorICogQHRyYW5zZmVyX2xpc3Q6IHRyYW5zZmVycyBhcmUgc2VxdWVuY2VkIHRocm91Z2ggc3BpX21lc3NhZ2UudHJhbnNmZXJzCisgKgorICogU1BJIHRyYW5zZmVycyBhbHdheXMgd3JpdGUgdGhlIHNhbWUgbnVtYmVyIG9mIGJ5dGVzIGFzIHRoZXkgcmVhZC4KKyAqIFByb3RvY29sIGRyaXZlcnMgc2hvdWxkIGFsd2F5cyBwcm92aWRlIHJ4X2J1ZiBhbmQvb3IgdHhfYnVmLgorICogSW4gc29tZSBjYXNlcywgdGhleSBtYXkgYWxzbyB3YW50IHRvIHByb3ZpZGUgRE1BIGFkZHJlc3NlcyBmb3IKKyAqIHRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkOyB0aGF0IG1heSByZWR1Y2Ugb3ZlcmhlYWQsIHdoZW4gdGhlCisgKiB1bmRlcmx5aW5nIGRyaXZlciB1c2VzIGRtYS4KKyAqCisgKiBJZiB0aGUgdHJhbnNtaXQgYnVmZmVyIGlzIG51bGwsIHVuZGVmaW5lZCBkYXRhIHdpbGwgYmUgc2hpZnRlZCBvdXQKKyAqIHdoaWxlIGZpbGxpbmcgcnhfYnVmLiAgSWYgdGhlIHJlY2VpdmUgYnVmZmVyIGlzIG51bGwsIHRoZSBkYXRhCisgKiBzaGlmdGVkIGluIHdpbGwgYmUgZGlzY2FyZGVkLiAgT25seSAibGVuIiBieXRlcyBzaGlmdCBvdXQgKG9yIGluKS4KKyAqIEl0J3MgYW4gZXJyb3IgdG8gdHJ5IHRvIHNoaWZ0IG91dCBhIHBhcnRpYWwgd29yZC4gIChGb3IgZXhhbXBsZSwgYnkKKyAqIHNoaWZ0aW5nIG91dCB0aHJlZSBieXRlcyB3aXRoIHdvcmQgc2l6ZSBvZiBzaXh0ZWVuIG9yIHR3ZW50eSBiaXRzOworICogdGhlIGZvcm1lciB1c2VzIHR3byBieXRlcyBwZXIgd29yZCwgdGhlIGxhdHRlciB1c2VzIGZvdXIgYnl0ZXMuKQorICoKKyAqIEFsbCBTUEkgdHJhbnNmZXJzIHN0YXJ0IHdpdGggdGhlIHJlbGV2YW50IGNoaXBzZWxlY3QgYWN0aXZlLiAgTm9ybWFsbHkKKyAqIGl0IHN0YXlzIHNlbGVjdGVkIHVudGlsIGFmdGVyIHRoZSBsYXN0IHRyYW5zZmVyIGluIGEgbWVzc2FnZS4gIERyaXZlcnMKKyAqIGNhbiBhZmZlY3QgdGhlIGNoaXBzZWxlY3Qgc2lnbmFsIHVzaW5nIGNzX2NoYW5nZToKKyAqCisgKiAoaSkgSWYgdGhlIHRyYW5zZmVyIGlzbid0IHRoZSBsYXN0IG9uZSBpbiB0aGUgbWVzc2FnZSwgdGhpcyBmbGFnIGlzCisgKiB1c2VkIHRvIG1ha2UgdGhlIGNoaXBzZWxlY3QgYnJpZWZseSBnbyBpbmFjdGl2ZSBpbiB0aGUgbWlkZGxlIG9mIHRoZQorICogbWVzc2FnZS4gIFRvZ2dsaW5nIGNoaXBzZWxlY3QgaW4gdGhpcyB3YXkgbWF5IGJlIG5lZWRlZCB0byB0ZXJtaW5hdGUKKyAqIGEgY2hpcCBjb21tYW5kLCBsZXR0aW5nIGEgc2luZ2xlIHNwaV9tZXNzYWdlIHBlcmZvcm0gYWxsIG9mIGdyb3VwIG9mCisgKiBjaGlwIHRyYW5zYWN0aW9ucyB0b2dldGhlci4KKyAqCisgKiAoaWkpIFdoZW4gdGhlIHRyYW5zZmVyIGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgbWVzc2FnZSwgdGhlIGNoaXAgbWF5CisgKiBzdGF5IHNlbGVjdGVkIHVudGlsIHRoZSBuZXh0IHRyYW5zZmVyLiAgVGhpcyBpcyBwdXJlbHkgYSBwZXJmb3JtYW5jZQorICogaGludDsgdGhlIGNvbnRyb2xsZXIgZHJpdmVyIG1heSBuZWVkIHRvIHNlbGVjdCBhIGRpZmZlcmVudCBkZXZpY2UKKyAqIGZvciB0aGUgbmV4dCBtZXNzYWdlLgorICoKKyAqIFRoZSBjb2RlIHRoYXQgc3VibWl0cyBhbiBzcGlfbWVzc2FnZSAoYW5kIGl0cyBzcGlfdHJhbnNmZXJzKQorICogdG8gdGhlIGxvd2VyIGxheWVycyBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgaXRzIG1lbW9yeS4KKyAqIFplcm8taW5pdGlhbGl6ZSBldmVyeSBmaWVsZCB5b3UgZG9uJ3Qgc2V0IHVwIGV4cGxpY2l0bHksIHRvCisgKiBpbnN1bGF0ZSBhZ2FpbnN0IGZ1dHVyZSBBUEkgdXBkYXRlcy4gIEFmdGVyIHlvdSBzdWJtaXQgYSBtZXNzYWdlCisgKiBhbmQgaXRzIHRyYW5zZmVycywgaWdub3JlIHRoZW0gdW50aWwgaXRzIGNvbXBsZXRpb24gY2FsbGJhY2suCisgKi8KK3N0cnVjdCBzcGlfdHJhbnNmZXIgeworCS8qIGl0J3Mgb2sgaWYgdHhfYnVmID09IHJ4X2J1ZiAocmlnaHQ/KQorCSAqIGZvciBNaWNyb1dpcmUsIG9uZSBidWZmZXIgbXVzdCBiZSBudWxsCisJICogYnVmZmVycyBtdXN0IHdvcmsgd2l0aCBkbWFfKm1hcF9zaW5nbGUoKSBjYWxscywgdW5sZXNzCisJICogICBzcGlfbWVzc2FnZS5pc19kbWFfbWFwcGVkIHJlcG9ydHMgYSBwcmUtZXhpc3RpbmcgbWFwcGluZworCSAqLworCWNvbnN0IHZvaWQJKnR4X2J1ZjsKKwl2b2lkCQkqcnhfYnVmOworCXVuc2lnbmVkCWxlbjsKKworCWRtYV9hZGRyX3QJdHhfZG1hOworCWRtYV9hZGRyX3QJcnhfZG1hOworCisJdW5zaWduZWQJY3NfY2hhbmdlOjE7CisJdTE2CQlkZWxheV91c2VjczsKKworCXN0cnVjdCBsaXN0X2hlYWQgdHJhbnNmZXJfbGlzdDsKK307CisKKy8qKgorICogc3RydWN0IHNwaV9tZXNzYWdlIC0gb25lIG11bHRpLXNlZ21lbnQgU1BJIHRyYW5zYWN0aW9uCisgKiBAdHJhbnNmZXJzOiBsaXN0IG9mIHRyYW5zZmVyIHNlZ21lbnRzIGluIHRoaXMgdHJhbnNhY3Rpb24KKyAqIEBzcGk6IFNQSSBkZXZpY2UgdG8gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIGlzIHF1ZXVlZAorICogQGlzX2RtYV9tYXBwZWQ6IGlmIHRydWUsIHRoZSBjYWxsZXIgcHJvdmlkZWQgYm90aCBkbWEgYW5kIGNwdSB2aXJ0dWFsCisgKglhZGRyZXNzZXMgZm9yIGVhY2ggdHJhbnNmZXIgYnVmZmVyCisgKiBAY29tcGxldGU6IGNhbGxlZCB0byByZXBvcnQgdHJhbnNhY3Rpb24gY29tcGxldGlvbnMKKyAqIEBjb250ZXh0OiB0aGUgYXJndW1lbnQgdG8gY29tcGxldGUoKSB3aGVuIGl0J3MgY2FsbGVkCisgKiBAYWN0dWFsX2xlbmd0aDogdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgdHJhbnNmZXJyZWQgaW4gYWxsCisgKglzdWNjZXNzZnVsIHNlZ21lbnRzCisgKiBAc3RhdHVzOiB6ZXJvIGZvciBzdWNjZXNzLCBlbHNlIG5lZ2F0aXZlIGVycm5vCisgKiBAcXVldWU6IGZvciB1c2UgYnkgd2hpY2hldmVyIGRyaXZlciBjdXJyZW50bHkgb3ducyB0aGUgbWVzc2FnZQorICogQHN0YXRlOiBmb3IgdXNlIGJ5IHdoaWNoZXZlciBkcml2ZXIgY3VycmVudGx5IG93bnMgdGhlIG1lc3NhZ2UKKyAqCisgKiBBbiBzcGlfbWVzc2FnZSBpcyB1c2VkIHRvIGV4ZWN1dGUgYW4gYXRvbWljIHNlcXVlbmNlIG9mIGRhdGEgdHJhbnNmZXJzLAorICogZWFjaCByZXByZXNlbnRlZCBieSBhIHN0cnVjdCBzcGlfdHJhbnNmZXIuICBUaGUgc2VxdWVuY2UgaXMgImF0b21pYyIKKyAqIGluIHRoZSBzZW5zZSB0aGF0IG5vIG90aGVyIHNwaV9tZXNzYWdlIG1heSB1c2UgdGhhdCBTUEkgYnVzIHVudGlsIHRoYXQKKyAqIHNlcXVlbmNlIGNvbXBsZXRlcy4gIE9uIHNvbWUgc3lzdGVtcywgbWFueSBzdWNoIHNlcXVlbmNlcyBjYW4gZXhlY3V0ZSBhcworICogYXMgc2luZ2xlIHByb2dyYW1tZWQgRE1BIHRyYW5zZmVyLiAgT24gYWxsIHN5c3RlbXMsIHRoZXNlIG1lc3NhZ2VzIGFyZQorICogcXVldWVkLCBhbmQgbWlnaHQgY29tcGxldGUgYWZ0ZXIgdHJhbnNhY3Rpb25zIHRvIG90aGVyIGRldmljZXMuICBNZXNzYWdlcworICogc2VudCB0byBhIGdpdmVuIHNwaV9kZXZpY2UgYXJlIGFsd2F5IGV4ZWN1dGVkIGluIEZJRk8gb3JkZXIuCisgKgorICogVGhlIGNvZGUgdGhhdCBzdWJtaXRzIGFuIHNwaV9tZXNzYWdlIChhbmQgaXRzIHNwaV90cmFuc2ZlcnMpCisgKiB0byB0aGUgbG93ZXIgbGF5ZXJzIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBpdHMgbWVtb3J5LgorICogWmVyby1pbml0aWFsaXplIGV2ZXJ5IGZpZWxkIHlvdSBkb24ndCBzZXQgdXAgZXhwbGljaXRseSwgdG8KKyAqIGluc3VsYXRlIGFnYWluc3QgZnV0dXJlIEFQSSB1cGRhdGVzLiAgQWZ0ZXIgeW91IHN1Ym1pdCBhIG1lc3NhZ2UKKyAqIGFuZCBpdHMgdHJhbnNmZXJzLCBpZ25vcmUgdGhlbSB1bnRpbCBpdHMgY29tcGxldGlvbiBjYWxsYmFjay4KKyAqLworc3RydWN0IHNwaV9tZXNzYWdlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIAl0cmFuc2ZlcnM7CisKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCisJdW5zaWduZWQJCWlzX2RtYV9tYXBwZWQ6MTsKKworCS8qIFJFVklTSVQ6ICB3ZSBtaWdodCB3YW50IGEgZmxhZyBhZmZlY3RpbmcgdGhlIGJlaGF2aW9yIG9mIHRoZQorCSAqIGxhc3QgdHJhbnNmZXIgLi4uIGFsbG93aW5nIHRoaW5ncyBsaWtlICJyZWFkIDE2IGJpdCBsZW5ndGggTCIKKwkgKiBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSAicmVhZCBMIGJ5dGVzIi4gIEJhc2ljYWxseSBpbXBvc2luZworCSAqIGEgc3BlY2lmaWMgbWVzc2FnZSBzY2hlZHVsaW5nIGFsZ29yaXRobS4KKwkgKgorCSAqIFNvbWUgY29udHJvbGxlciBkcml2ZXJzIChtZXNzYWdlLWF0LWEtdGltZSBxdWV1ZSBwcm9jZXNzaW5nKQorCSAqIGNvdWxkIHByb3ZpZGUgdGhhdCBhcyB0aGVpciBkZWZhdWx0IHNjaGVkdWxpbmcgYWxnb3JpdGhtLiAgQnV0CisJICogb3RoZXJzICh3aXRoIG11bHRpLW1lc3NhZ2UgcGlwZWxpbmVzKSBjb3VsZCBuZWVkIGEgZmxhZyB0bworCSAqIHRlbGwgdGhlbSBhYm91dCBzdWNoIHNwZWNpYWwgY2FzZXMuCisJICovCisKKwkvKiBjb21wbGV0aW9uIGlzIHJlcG9ydGVkIHRocm91Z2ggYSBjYWxsYmFjayAqLworCXZvaWQgCQkJKCpjb21wbGV0ZSkodm9pZCAqY29udGV4dCk7CisJdm9pZAkJCSpjb250ZXh0OworCXVuc2lnbmVkCQlhY3R1YWxfbGVuZ3RoOworCWludAkJCXN0YXR1czsKKworCS8qIGZvciBvcHRpb25hbCB1c2UgYnkgd2hhdGV2ZXIgZHJpdmVyIGN1cnJlbnRseSBvd25zIHRoZQorCSAqIHNwaV9tZXNzYWdlIC4uLiAgYmV0d2VlbiBjYWxscyB0byBzcGlfYXN5bmMgYW5kIHRoZW4gbGF0ZXIKKwkgKiBjb21wbGV0ZSgpLCB0aGF0J3MgdGhlIHNwaV9tYXN0ZXIgY29udHJvbGxlciBkcml2ZXIuCisJICovCisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKKwl2b2lkCQkJKnN0YXRlOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNwaV9tZXNzYWdlX2luaXQoc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCW1lbXNldChtLCAwLCBzaXplb2YgKm0pOworCUlOSVRfTElTVF9IRUFEKCZtLT50cmFuc2ZlcnMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NwaV9tZXNzYWdlX2FkZF90YWlsKHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQsIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKK3sKKwlsaXN0X2FkZF90YWlsKCZ0LT50cmFuc2Zlcl9saXN0LCAmbS0+dHJhbnNmZXJzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzcGlfdHJhbnNmZXJfZGVsKHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJbGlzdF9kZWwoJnQtPnRyYW5zZmVyX2xpc3QpOworfQorCisvKiBJdCdzIGZpbmUgdG8gZW1iZWQgbWVzc2FnZSBhbmQgdHJhbnNhY3Rpb24gc3RydWN0dXJlcyBpbiBvdGhlciBkYXRhCisgKiBzdHJ1Y3R1cmVzIHNvIGxvbmcgYXMgeW91IGRvbid0IGZyZWUgdGhlbSB3aGlsZSB0aGV5J3JlIGluIHVzZS4KKyAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzcGlfbWVzc2FnZSAqc3BpX21lc3NhZ2VfYWxsb2ModW5zaWduZWQgbnRyYW5zLCBnZnBfdCBmbGFncykKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm07CisKKwltID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNwaV9tZXNzYWdlKQorCQkJKyBudHJhbnMgKiBzaXplb2Yoc3RydWN0IHNwaV90cmFuc2ZlciksCisJCQlmbGFncyk7CisJaWYgKG0pIHsKKwkJaW50IGk7CisJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQgPSAoc3RydWN0IHNwaV90cmFuc2ZlciAqKShtICsgMSk7CisKKwkJSU5JVF9MSVNUX0hFQUQoJm0tPnRyYW5zZmVycyk7CisJCWZvciAoaSA9IDA7IGkgPCBudHJhbnM7IGkrKywgdCsrKQorCQkJc3BpX21lc3NhZ2VfYWRkX3RhaWwodCwgbSk7CisJfQorCXJldHVybiBtOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX21lc3NhZ2VfZnJlZShzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCit7CisJa2ZyZWUobSk7Cit9CisKKy8qKgorICogc3BpX3NldHVwIC0tIHNldHVwIFNQSSBtb2RlIGFuZCBjbG9jayByYXRlCisgKiBAc3BpOiB0aGUgZGV2aWNlIHdob3NlIHNldHRpbmdzIGFyZSBiZWluZyBtb2RpZmllZAorICoKKyAqIFNQSSBwcm90b2NvbCBkcml2ZXJzIG1heSBuZWVkIHRvIHVwZGF0ZSB0aGUgdHJhbnNmZXIgbW9kZSBpZiB0aGUKKyAqIGRldmljZSBkb2Vzbid0IHdvcmsgd2l0aCB0aGUgbW9kZSAwIGRlZmF1bHQuICBUaGV5IG1heSBsaWtld2lzZSBuZWVkCisgKiB0byB1cGRhdGUgY2xvY2sgcmF0ZXMgb3Igd29yZCBzaXplcyBmcm9tIGluaXRpYWwgdmFsdWVzLiAgVGhpcyBmdW5jdGlvbgorICogY2hhbmdlcyB0aG9zZSBzZXR0aW5ncywgYW5kIG11c3QgYmUgY2FsbGVkIGZyb20gYSBjb250ZXh0IHRoYXQgY2FuIHNsZWVwLgorICogVGhlIGNoYW5nZXMgdGFrZSBlZmZlY3QgdGhlIG5leHQgdGltZSB0aGUgZGV2aWNlIGlzIHNlbGVjdGVkIGFuZCBkYXRhCisgKiBpcyB0cmFuc2ZlcnJlZCB0byBvciBmcm9tIGl0LgorICovCitzdGF0aWMgaW5saW5lIGludAorc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIHNwaS0+bWFzdGVyLT5zZXR1cChzcGkpOworfQorCisKKy8qKgorICogc3BpX2FzeW5jIC0tIGFzeW5jaHJvbm91cyBTUEkgdHJhbnNmZXIKKyAqIEBzcGk6IGRldmljZSB3aXRoIHdoaWNoIGRhdGEgd2lsbCBiZSBleGNoYW5nZWQKKyAqIEBtZXNzYWdlOiBkZXNjcmliZXMgdGhlIGRhdGEgdHJhbnNmZXJzLCBpbmNsdWRpbmcgY29tcGxldGlvbiBjYWxsYmFjaworICoKKyAqIFRoaXMgY2FsbCBtYXkgYmUgdXNlZCBpbl9pcnEgYW5kIG90aGVyIGNvbnRleHRzIHdoaWNoIGNhbid0IHNsZWVwLAorICogYXMgd2VsbCBhcyBmcm9tIHRhc2sgY29udGV4dHMgd2hpY2ggY2FuIHNsZWVwLgorICoKKyAqIFRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGludm9rZWQgaW4gYSBjb250ZXh0IHdoaWNoIGNhbid0IHNsZWVwLgorICogQmVmb3JlIHRoYXQgaW52b2NhdGlvbiwgdGhlIHZhbHVlIG9mIG1lc3NhZ2UtPnN0YXR1cyBpcyB1bmRlZmluZWQuCisgKiBXaGVuIHRoZSBjYWxsYmFjayBpcyBpc3N1ZWQsIG1lc3NhZ2UtPnN0YXR1cyBob2xkcyBlaXRoZXIgemVybyAodG8KKyAqIGluZGljYXRlIGNvbXBsZXRlIHN1Y2Nlc3MpIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gIEFmdGVyIHRoYXQKKyAqIGNhbGxiYWNrIHJldHVybnMsIHRoZSBkcml2ZXIgd2hpY2ggaXNzdWVkIHRoZSB0cmFuc2ZlciByZXF1ZXN0IG1heQorICogZGVhbGxvY2F0ZSB0aGUgYXNzb2NpYXRlZCBtZW1vcnk7IGl0J3Mgbm8gbG9uZ2VyIGluIHVzZSBieSBhbnkgU1BJCisgKiBjb3JlIG9yIGNvbnRyb2xsZXIgZHJpdmVyIGNvZGUuCisgKgorICogTm90ZSB0aGF0IGFsdGhvdWdoIGFsbCBtZXNzYWdlcyB0byBhIHNwaV9kZXZpY2UgYXJlIGhhbmRsZWQgaW4KKyAqIEZJRk8gb3JkZXIsIG1lc3NhZ2VzIG1heSBnbyB0byBkaWZmZXJlbnQgZGV2aWNlcyBpbiBvdGhlciBvcmRlcnMuCisgKiBTb21lIGRldmljZSBtaWdodCBiZSBoaWdoZXIgcHJpb3JpdHksIG9yIGhhdmUgdmFyaW91cyAiaGFyZCIgYWNjZXNzCisgKiB0aW1lIHJlcXVpcmVtZW50cywgZm9yIGV4YW1wbGUuCisgKgorICogT24gZGV0ZWN0aW9uIG9mIGFueSBmYXVsdCBkdXJpbmcgdGhlIHRyYW5zZmVyLCBwcm9jZXNzaW5nIG9mCisgKiB0aGUgZW50aXJlIG1lc3NhZ2UgaXMgYWJvcnRlZCwgYW5kIHRoZSBkZXZpY2UgaXMgZGVzZWxlY3RlZC4KKyAqIFVudGlsIHJldHVybmluZyBmcm9tIHRoZSBhc3NvY2lhdGVkIG1lc3NhZ2UgY29tcGxldGlvbiBjYWxsYmFjaywKKyAqIG5vIG90aGVyIHNwaV9tZXNzYWdlIHF1ZXVlZCB0byB0aGF0IGRldmljZSB3aWxsIGJlIHByb2Nlc3NlZC4KKyAqIChUaGlzIHJ1bGUgYXBwbGllcyBlcXVhbGx5IHRvIGFsbCB0aGUgc3luY2hyb25vdXMgdHJhbnNmZXIgY2FsbHMsCisgKiB3aGljaCBhcmUgd3JhcHBlcnMgYXJvdW5kIHRoaXMgY29yZSBhc3luY2hyb25vdXMgcHJpbWl0aXZlLikKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3NwaV9hc3luYyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UpCit7CisJbWVzc2FnZS0+c3BpID0gc3BpOworCXJldHVybiBzcGktPm1hc3Rlci0+dHJhbnNmZXIoc3BpLCBtZXNzYWdlKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBbGwgdGhlc2Ugc3luY2hyb25vdXMgU1BJIHRyYW5zZmVyIHJvdXRpbmVzIGFyZSB1dGlsaXRpZXMgbGF5ZXJlZAorICogb3ZlciB0aGUgY29yZSBhc3luYyB0cmFuc2ZlciBwcmltaXRpdmUuICBIZXJlLCAic3luY2hyb25vdXMiIG1lYW5zCisgKiB0aGV5IHdpbGwgc2xlZXAgdW5pbnRlcnJ1cHRpYmx5IHVudGlsIHRoZSBhc3luYyB0cmFuc2ZlciBjb21wbGV0ZXMuCisgKi8KKworZXh0ZXJuIGludCBzcGlfc3luYyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UpOworCisvKioKKyAqIHNwaV93cml0ZSAtIFNQSSBzeW5jaHJvbm91cyB3cml0ZQorICogQHNwaTogZGV2aWNlIHRvIHdoaWNoIGRhdGEgd2lsbCBiZSB3cml0dGVuCisgKiBAYnVmOiBkYXRhIGJ1ZmZlcgorICogQGxlbjogZGF0YSBidWZmZXIgc2l6ZQorICoKKyAqIFRoaXMgd3JpdGVzIHRoZSBidWZmZXIgYW5kIHJldHVybnMgemVybyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKiBDYWxsYWJsZSBvbmx5IGZyb20gY29udGV4dHMgdGhhdCBjYW4gc2xlZXAuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzcGlfd3JpdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXQgPSB7CisJCQkudHhfYnVmCQk9IGJ1ZiwKKwkJCS5sZW4JCT0gbGVuLAorCQl9OworCXN0cnVjdCBzcGlfbWVzc2FnZQltOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKKwlyZXR1cm4gc3BpX3N5bmMoc3BpLCAmbSk7Cit9CisKKy8qKgorICogc3BpX3JlYWQgLSBTUEkgc3luY2hyb25vdXMgcmVhZAorICogQHNwaTogZGV2aWNlIGZyb20gd2hpY2ggZGF0YSB3aWxsIGJlIHJlYWQKKyAqIEBidWY6IGRhdGEgYnVmZmVyCisgKiBAbGVuOiBkYXRhIGJ1ZmZlciBzaXplCisgKgorICogVGhpcyB3cml0ZXMgdGhlIGJ1ZmZlciBhbmQgcmV0dXJucyB6ZXJvIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqIENhbGxhYmxlIG9ubHkgZnJvbSBjb250ZXh0cyB0aGF0IGNhbiBzbGVlcC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK3NwaV9yZWFkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4ICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwaV90cmFuc2Zlcgl0ID0geworCQkJLnJ4X2J1ZgkJPSBidWYsCisJCQkubGVuCQk9IGxlbiwKKwkJfTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm0pOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0LCAmbSk7CisJcmV0dXJuIHNwaV9zeW5jKHNwaSwgJm0pOworfQorCisvKiB0aGlzIGNvcGllcyB0eGJ1ZiBhbmQgcnhidWYgZGF0YTsgZm9yIHNtYWxsIHRyYW5zZmVycyBvbmx5ISAqLworZXh0ZXJuIGludCBzcGlfd3JpdGVfdGhlbl9yZWFkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCWNvbnN0IHU4ICp0eGJ1ZiwgdW5zaWduZWQgbl90eCwKKwkJdTggKnJ4YnVmLCB1bnNpZ25lZCBuX3J4KTsKKworLyoqCisgKiBzcGlfdzhyOCAtIFNQSSBzeW5jaHJvbm91cyA4IGJpdCB3cml0ZSBmb2xsb3dlZCBieSA4IGJpdCByZWFkCisgKiBAc3BpOiBkZXZpY2Ugd2l0aCB3aGljaCBkYXRhIHdpbGwgYmUgZXhjaGFuZ2VkCisgKiBAY21kOiBjb21tYW5kIHRvIGJlIHdyaXR0ZW4gYmVmb3JlIGRhdGEgaXMgcmVhZCBiYWNrCisgKgorICogVGhpcyByZXR1cm5zIHRoZSAodW5zaWduZWQpIGVpZ2h0IGJpdCBudW1iZXIgcmV0dXJuZWQgYnkgdGhlCisgKiBkZXZpY2UsIG9yIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgQ2FsbGFibGUgb25seSBmcm9tCisgKiBjb250ZXh0cyB0aGF0IGNhbiBzbGVlcC4KKyAqLworc3RhdGljIGlubGluZSBzc2l6ZV90IHNwaV93OHI4KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IGNtZCkKK3sKKwlzc2l6ZV90CQkJc3RhdHVzOworCXU4CQkJcmVzdWx0OworCisJc3RhdHVzID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksICZjbWQsIDEsICZyZXN1bHQsIDEpOworCisJLyogcmV0dXJuIG5lZ2F0aXZlIGVycm5vIG9yIHVuc2lnbmVkIHZhbHVlICovCisJcmV0dXJuIChzdGF0dXMgPCAwKSA/IHN0YXR1cyA6IHJlc3VsdDsKK30KKworLyoqCisgKiBzcGlfdzhyMTYgLSBTUEkgc3luY2hyb25vdXMgOCBiaXQgd3JpdGUgZm9sbG93ZWQgYnkgMTYgYml0IHJlYWQKKyAqIEBzcGk6IGRldmljZSB3aXRoIHdoaWNoIGRhdGEgd2lsbCBiZSBleGNoYW5nZWQKKyAqIEBjbWQ6IGNvbW1hbmQgdG8gYmUgd3JpdHRlbiBiZWZvcmUgZGF0YSBpcyByZWFkIGJhY2sKKyAqCisgKiBUaGlzIHJldHVybnMgdGhlICh1bnNpZ25lZCkgc2l4dGVlbiBiaXQgbnVtYmVyIHJldHVybmVkIGJ5IHRoZQorICogZGV2aWNlLCBvciBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gIENhbGxhYmxlIG9ubHkgZnJvbQorICogY29udGV4dHMgdGhhdCBjYW4gc2xlZXAuCisgKgorICogVGhlIG51bWJlciBpcyByZXR1cm5lZCBpbiB3aXJlLW9yZGVyLCB3aGljaCBpcyBhdCBsZWFzdCBzb21ldGltZXMKKyAqIGJpZy1lbmRpYW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBzcGlfdzhyMTYoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggY21kKQoreworCXNzaXplX3QJCQlzdGF0dXM7CisJdTE2CQkJcmVzdWx0OworCisJc3RhdHVzID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksICZjbWQsIDEsICh1OCAqKSAmcmVzdWx0LCAyKTsKKworCS8qIHJldHVybiBuZWdhdGl2ZSBlcnJubyBvciB1bnNpZ25lZCB2YWx1ZSAqLworCXJldHVybiAoc3RhdHVzIDwgMCkgPyBzdGF0dXMgOiByZXN1bHQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIElOVEVSRkFDRSBiZXR3ZWVuIGJvYXJkIGluaXQgY29kZSBhbmQgU1BJIGluZnJhc3RydWN0dXJlLgorICoKKyAqIE5vIFNQSSBkcml2ZXIgZXZlciBzZWVzIHRoZXNlIFNQSSBkZXZpY2UgdGFibGUgc2VnbWVudHMsIGJ1dAorICogaXQncyBob3cgdGhlIFNQSSBjb3JlIChvciBhZGFwdGVycyB0aGF0IGdldCBob3RwbHVnZ2VkKSBncm93cworICogdGhlIGRyaXZlciBtb2RlbCB0cmVlLgorICoKKyAqIEFzIGEgcnVsZSwgU1BJIGRldmljZXMgY2FuJ3QgYmUgcHJvYmVkLiAgSW5zdGVhZCwgYm9hcmQgaW5pdCBjb2RlCisgKiBwcm92aWRlcyBhIHRhYmxlIGxpc3RpbmcgdGhlIGRldmljZXMgd2hpY2ggYXJlIHByZXNlbnQsIHdpdGggZW5vdWdoCisgKiBpbmZvcm1hdGlvbiB0byBiaW5kIGFuZCBzZXQgdXAgdGhlIGRldmljZSdzIGRyaXZlci4gIFRoZXJlJ3MgYmFzaWMKKyAqIHN1cHBvcnQgZm9yIG5vbnN0YXRpYyBjb25maWd1cmF0aW9ucyB0b287IGVub3VnaCB0byBoYW5kbGUgYWRkaW5nCisgKiBwYXJwb3J0IGFkYXB0ZXJzLCBvciBtaWNyb2NvbnRyb2xsZXJzIGFjdGluZyBhcyBVU0ItdG8tU1BJIGJyaWRnZXMuCisgKi8KKworLyogYm9hcmQtc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBTUEkgZGV2aWNlICovCitzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8geworCS8qIHRoZSBkZXZpY2UgbmFtZSBhbmQgbW9kdWxlIG5hbWUgYXJlIGNvdXBsZWQsIGxpa2UgcGxhdGZvcm1fYnVzOworCSAqICJtb2RhbGlhcyIgaXMgbm9ybWFsbHkgdGhlIGRyaXZlciBuYW1lLgorCSAqCisJICogcGxhdGZvcm1fZGF0YSBnb2VzIHRvIHNwaV9kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEsCisJICogY29udHJvbGxlcl9kYXRhIGdvZXMgdG8gc3BpX2RldmljZS5jb250cm9sbGVyX2RhdGEsCisJICogaXJxIGlzIGNvcGllZCB0b28KKwkgKi8KKwljaGFyCQltb2RhbGlhc1tLT0JKX05BTUVfTEVOXTsKKwljb25zdCB2b2lkCSpwbGF0Zm9ybV9kYXRhOworCXZvaWQJCSpjb250cm9sbGVyX2RhdGE7CisJaW50CQlpcnE7CisKKwkvKiBzbG93ZXIgc2lnbmFsaW5nIG9uIG5vaXN5IG9yIGxvdyB2b2x0YWdlIGJvYXJkcyAqLworCXUzMgkJbWF4X3NwZWVkX2h6OworCisKKwkvKiBidXNfbnVtIGlzIGJvYXJkIHNwZWNpZmljIGFuZCBtYXRjaGVzIHRoZSBidXNfbnVtIG9mIHNvbWUKKwkgKiBzcGlfbWFzdGVyIHRoYXQgd2lsbCBwcm9iYWJseSBiZSByZWdpc3RlcmVkIGxhdGVyLgorCSAqCisJICogY2hpcF9zZWxlY3QgcmVmbGVjdHMgaG93IHRoaXMgY2hpcCBpcyB3aXJlZCB0byB0aGF0IG1hc3RlcjsKKwkgKiBpdCdzIGxlc3MgdGhhbiBudW1fY2hpcHNlbGVjdC4KKwkgKi8KKwl1MTYJCWJ1c19udW07CisJdTE2CQljaGlwX3NlbGVjdDsKKworCS8qIC4uLiBtYXkgbmVlZCBhZGRpdGlvbmFsIHNwaV9kZXZpY2UgY2hpcCBjb25maWcgZGF0YSBoZXJlLgorCSAqIGF2b2lkIHN0dWZmIHByb3RvY29sIGRyaXZlcnMgY2FuIHNldDsgYnV0IGluY2x1ZGUgc3R1ZmYKKwkgKiBuZWVkZWQgdG8gYmVoYXZlIHdpdGhvdXQgYmVpbmcgYm91bmQgdG8gYSBkcml2ZXI6CisJICogIC0gY2hpcHNlbGVjdCBwb2xhcml0eQorCSAqICAtIHF1aXJrcyBsaWtlIGNsb2NrIHJhdGUgbWF0dGVyaW5nIHdoZW4gbm90IHNlbGVjdGVkCisJICovCit9OworCisjaWZkZWYJQ09ORklHX1NQSQorZXh0ZXJuIGludAorc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oc3RydWN0IHNwaV9ib2FyZF9pbmZvIGNvbnN0ICppbmZvLCB1bnNpZ25lZCBuKTsKKyNlbHNlCisvKiBib2FyZCBpbml0IGNvZGUgbWF5IGlnbm9yZSB3aGV0aGVyIFNQSSBpcyBjb25maWd1cmVkIG9yIG5vdCAqLworc3RhdGljIGlubGluZSBpbnQKK3NwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBjb25zdCAqaW5mbywgdW5zaWduZWQgbikKKwl7IHJldHVybiAwOyB9CisjZW5kaWYKKworCisvKiBJZiB5b3UncmUgaG90cGx1Z2dpbmcgYW4gYWRhcHRlciB3aXRoIGRldmljZXMgKHBhcnBvcnQsIHVzYiwgZXRjKQorICogdXNlIHNwaV9uZXdfZGV2aWNlKCkgdG8gZGVzY3JpYmUgZWFjaCBkZXZpY2UuICBZb3UgY2FuIGFsc28gY2FsbAorICogc3BpX3VucmVnaXN0ZXJfZGV2aWNlKCkgdG8gc3RhcnQgbWFraW5nIHRoYXQgZGV2aWNlIHZhbmlzaCwgYnV0CisgKiBub3JtYWxseSB0aGF0IHdvdWxkIGJlIGhhbmRsZWQgYnkgc3BpX3VucmVnaXN0ZXJfbWFzdGVyKCkuCisgKi8KK2V4dGVybiBzdHJ1Y3Qgc3BpX2RldmljZSAqCitzcGlfbmV3X2RldmljZShzdHJ1Y3Qgc3BpX21hc3RlciAqLCBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3BpX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaWYgKHNwaSkKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJnNwaS0+ZGV2KTsKK30KKworI2VuZGlmIC8qIF9fTElOVVhfU1BJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NwaV9iaXRiYW5nLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjFmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmCV9fU1BJX0JJVEJBTkdfSAorI2RlZmluZQlfX1NQSV9CSVRCQU5HX0gKKworLyoKKyAqIE1peCB0aGlzIHV0aWxpdHkgY29kZSB3aXRoIHNvbWUgZ2x1ZSBjb2RlIHRvIGdldCBvbmUgb2Ygc2V2ZXJhbCB0eXBlcyBvZgorICogc2ltcGxlIFNQSSBtYXN0ZXIgZHJpdmVyLiAgVHdvIGRvIHBvbGxlZCB3b3JkLWF0LWEtdGltZSBJL086CisgKgorICogICAtCUdQSU8vcGFycG9ydCBiaXRiYW5nZXJzLiAgUHJvdmlkZSBjaGlwc2VsZWN0KCkgYW5kIHR4cnhfd29yZFtdKCksCisgKglleHBhbmRpbmcgdGhlIHBlci13b3JkIHJvdXRpbmVzIGZyb20gdGhlIGlubGluZSB0ZW1wbGF0ZXMgYmVsb3cuCisgKgorICogICAtCURyaXZlcnMgZm9yIGNvbnRyb2xsZXJzIHJlc2VtYmxpbmcgYmFyZSBzaGlmdCByZWdpc3RlcnMuICBQcm92aWRlCisgKgljaGlwc2VsZWN0KCkgYW5kIHR4cnhfd29yZFtdKCksIHdpdGggY3VzdG9tIHNldHVwKCkvY2xlYW51cCgpIG1ldGhvZHMKKyAqCXRoYXQgdXNlIHlvdXIgY29udHJvbGxlcidzIGNsb2NrIGFuZCBjaGlwc2VsZWN0IHJlZ2lzdGVycy4KKyAqCisgKiBTb21lIGhhcmR3YXJlIHdvcmtzIHdlbGwgd2l0aCByZXF1ZXN0cyBhdCBzcGlfdHJhbnNmZXIgc2NvcGU6CisgKgorICogICAtCURyaXZlcnMgbGV2ZXJhZ2luZyBzbWFydGVyIGhhcmR3YXJlLCB3aXRoIGZpZm9zIG9yIERNQTsgb3IgZm9yIGhhbGYKKyAqCWR1cGxleCAoTWljcm9XaXJlKSBjb250cm9sbGVycy4gIFByb3ZpZGUgY2hpcHNsZWN0KCkgYW5kIHR4cnhfYnVmcygpLAorICoJYW5kIGN1c3RvbSBzZXR1cCgpL2NsZWFudXAoKSBtZXRob2RzLgorICovCitzdHJ1Y3Qgc3BpX2JpdGJhbmcgeworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CSp3b3JrcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CisJdTgJCQlidXN5OworCXU4CQkJc2h1dGRvd247CisJdTgJCQl1c2VfZG1hOworCisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKworCXZvaWQJKCpjaGlwc2VsZWN0KShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pOworI2RlZmluZQlCSVRCQU5HX0NTX0FDVElWRQkxCS8qIG5vcm1hbGx5IG5DUywgYWN0aXZlIGxvdyAqLworI2RlZmluZQlCSVRCQU5HX0NTX0lOQUNUSVZFCTAKKworCS8qIHR4cnhfYnVmcygpIG1heSBoYW5kbGUgZG1hIG1hcHBpbmcgZm9yIHRyYW5zZmVycyB0aGF0IGRvbid0CisJICogYWxyZWFkeSBoYXZlIG9uZSAodHJhbnNmZXIue3R4LHJ4fV9kbWEgaXMgemVybyksIG9yIHVzZSBQSU8KKwkgKi8KKwlpbnQJKCp0eHJ4X2J1ZnMpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpOworCisJLyogdHhyeF93b3JkW1NQSV9NT0RFXypdKCkganVzdCBsb29rcyBsaWtlIGEgc2hpZnQgcmVnaXN0ZXIgKi8KKwl1MzIJKCp0eHJ4X3dvcmRbNF0pKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQl1bnNpZ25lZCBuc2VjcywKKwkJCXUzMiB3b3JkLCB1OCBiaXRzKTsKK307CisKKy8qIHlvdSBjYW4gY2FsbCB0aGVzZSBkZWZhdWx0IGJpdGJhbmctPm1hc3RlciBtZXRob2RzIGZyb20geW91ciBjdXN0b20KKyAqIG1ldGhvZHMsIGlmIHlvdSBsaWtlLgorICovCitleHRlcm4gaW50IHNwaV9iaXRiYW5nX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpOworZXh0ZXJuIHZvaWQgc3BpX2JpdGJhbmdfY2xlYW51cChjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKK2V4dGVybiBpbnQgc3BpX2JpdGJhbmdfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptKTsKKworLyogc3RhcnQgb3Igc3RvcCBxdWV1ZSBwcm9jZXNzaW5nICovCitleHRlcm4gaW50IHNwaV9iaXRiYW5nX3N0YXJ0KHN0cnVjdCBzcGlfYml0YmFuZyAqc3BpKTsKK2V4dGVybiBpbnQgc3BpX2JpdGJhbmdfc3RvcChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKnNwaSk7CisKKyNlbmRpZgkvKiBfX1NQSV9CSVRCQU5HX0ggKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmCUVYUEFORF9CSVRCQU5HX1RYUlgKKworLyoKKyAqIFRoZSBjb2RlIHRoYXQga25vd3Mgd2hhdCBHUElPIHBpbnMgZG8gd2hhdCBzaG91bGQgaGF2ZSBkZWNsYXJlZCBmb3VyCisgKiBmdW5jdGlvbnMsIGlkZWFsbHkgYXMgaW5saW5lcywgYmVmb3JlICNkZWZpbmluZyBFWFBBTkRfQklUQkFOR19UWFJYCisgKiBhbmQgaW5jbHVkaW5nIHRoaXMgaGVhZGVyOgorICoKKyAqICB2b2lkIHNldHNjayhzdHJ1Y3Qgc3BpX2RldmljZSAqLCBpbnQgaXNfb24pOworICogIHZvaWQgc2V0bW9zaShzdHJ1Y3Qgc3BpX2RldmljZSAqLCBpbnQgaXNfb24pOworICogIGludCBnZXRtaXNvKHN0cnVjdCBzcGlfZGV2aWNlICopOworICogIHZvaWQgc3BpZGVsYXkodW5zaWduZWQpOworICoKKyAqIEEgbm9uLWlubGluZWQgcm91dGluZSB3b3VsZCBjYWxsIGJpdGJhbmdfdHhyeF8qKCkgcm91dGluZXMuICBUaGUKKyAqIG1haW4gbG9vcCBjb3VsZCBlYXNpbHkgY29tcGlsZSBkb3duIHRvIGEgaGFuZGZ1bCBvZiBpbnN0cnVjdGlvbnMsCisgKiBlc3BlY2lhbGx5IGlmIHRoZSBkZWxheSBpcyBhIE5PUCAodG8gcnVuIGF0IHBlYWsgc3BlZWQpLgorICoKKyAqIFNpbmNlIHRoaXMgaXMgc29mdHdhcmUsIHRoZSB0aW1pbmdzIG1heSBub3QgYmUgZXhhY3RseSB3aGF0IHlvdXIgYm9hcmQncworICogY2hpcHMgbmVlZCAuLi4gdGhlcmUgbWF5IGJlIHNldmVyYWwgcmVhc29ucyB5b3UnZCBuZWVkIHRvIHR3ZWFrIHRpbWluZ3MKKyAqIGluIHRoZXNlIHJvdXRpbmVzLCBub3QganVzdCBtYWtlIHRvIG1ha2UgaXQgZmFzdGVyIG9yIHNsb3dlciB0byBtYXRjaCBhCisgKiBwYXJ0aWN1bGFyIENQVSBjbG9jayByYXRlLgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyCitiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJdW5zaWduZWQgbnNlY3MsIHVuc2lnbmVkIGNwb2wsCisJCXUzMiB3b3JkLCB1OCBiaXRzKQoreworCS8qIGlmIChjcG9sID09IDApIHRoaXMgaXMgU1BJX01PREVfMDsgZWxzZSB0aGlzIGlzIFNQSV9NT0RFXzIgKi8KKworCS8qIGNsb2NrIHN0YXJ0cyBhdCBpbmFjdGl2ZSBwb2xhcml0eSAqLworCWZvciAod29yZCA8PD0gKDMyIC0gYml0cyk7IGxpa2VseShiaXRzKTsgYml0cy0tKSB7CisKKwkJLyogc2V0dXAgTVNCICh0byBzbGF2ZSkgb24gdHJhaWxpbmcgZWRnZSAqLworCQlzZXRtb3NpKHNwaSwgd29yZCAmICgxIDw8IDMxKSk7CisJCXNwaWRlbGF5KG5zZWNzKTsJLyogVChzZXR1cCkgKi8KKworCQlzZXRzY2soc3BpLCAhY3BvbCk7CisJCXNwaWRlbGF5KG5zZWNzKTsKKworCQkvKiBzYW1wbGUgTVNCIChmcm9tIHNsYXZlKSBvbiBsZWFkaW5nIGVkZ2UgKi8KKwkJd29yZCA8PD0gMTsKKwkJd29yZCB8PSBnZXRtaXNvKHNwaSk7CisJCXNldHNjayhzcGksIGNwb2wpOworCX0KKwlyZXR1cm4gd29yZDsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2JpdGJhbmdfdHhyeF9iZV9jcGhhMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQl1bnNpZ25lZCBuc2VjcywgdW5zaWduZWQgY3BvbCwKKwkJdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJLyogaWYgKGNwb2wgPT0gMCkgdGhpcyBpcyBTUElfTU9ERV8xOyBlbHNlIHRoaXMgaXMgU1BJX01PREVfMyAqLworCisJLyogY2xvY2sgc3RhcnRzIGF0IGluYWN0aXZlIHBvbGFyaXR5ICovCisJZm9yICh3b3JkIDw8PSAoMzIgLSBiaXRzKTsgbGlrZWx5KGJpdHMpOyBiaXRzLS0pIHsKKworCQkvKiBzZXR1cCBNU0IgKHRvIHNsYXZlKSBvbiBsZWFkaW5nIGVkZ2UgKi8KKwkJc2V0c2NrKHNwaSwgIWNwb2wpOworCQlzZXRtb3NpKHNwaSwgd29yZCAmICgxIDw8IDMxKSk7CisJCXNwaWRlbGF5KG5zZWNzKTsgLyogVChzZXR1cCkgKi8KKworCQlzZXRzY2soc3BpLCBjcG9sKTsKKwkJc3BpZGVsYXkobnNlY3MpOworCisJCS8qIHNhbXBsZSBNU0IgKGZyb20gc2xhdmUpIG9uIHRyYWlsaW5nIGVkZ2UgKi8KKwkJd29yZCA8PD0gMTsKKwkJd29yZCB8PSBnZXRtaXNvKHNwaSk7CisJfQorCXJldHVybiB3b3JkOworfQorCisjZW5kaWYJLyogRVhQQU5EX0JJVEJBTkdfVFhSWCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aXBjLmggYi9pbmNsdWRlL2xpbnV4L3RpcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDNhMTVmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC90aXBjLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3RpcGMuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIHNvY2tldCBpbnRlcmZhY2UKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTElOVVhfVElQQ19IXworI2RlZmluZSBfTElOVVhfVElQQ19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFRJUEMgYWRkcmVzc2luZyBwcmltaXRpdmVzCisgKi8KKyAKK3N0cnVjdCB0aXBjX3BvcnRpZCB7CisJX191MzIgcmVmOworCV9fdTMyIG5vZGU7Cit9OworCitzdHJ1Y3QgdGlwY19uYW1lIHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGluc3RhbmNlOworfTsKKworc3RydWN0IHRpcGNfbmFtZV9zZXEgeworCV9fdTMyIHR5cGU7CisJX191MzIgbG93ZXI7CisJX191MzIgdXBwZXI7Cit9OworCitzdGF0aWMgaW5saW5lIF9fdTMyIHRpcGNfYWRkcih1bnNpZ25lZCBpbnQgem9uZSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBjbHVzdGVyLAorCQkJICAgICAgdW5zaWduZWQgaW50IG5vZGUpCit7CisJcmV0dXJuICh6b25lIDw8IDI0KSB8IChjbHVzdGVyIDw8IDEyKSB8IG5vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRpcGNfem9uZShfX3UzMiBhZGRyKQoreworCXJldHVybiBhZGRyID4+IDI0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0aXBjX2NsdXN0ZXIoX191MzIgYWRkcikKK3sKKwlyZXR1cm4gKGFkZHIgPj4gMTIpICYgMHhmZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRpcGNfbm9kZShfX3UzMiBhZGRyKQoreworCXJldHVybiBhZGRyICYgMHhmZmY7Cit9CisKKy8qCisgKiBBcHBsaWNhdGlvbi1hY2Nlc3NpYmxlIHBvcnQgbmFtZSB0eXBlcworICovCisKKyNkZWZpbmUgVElQQ19DRkdfU1JWCQkwCS8qIGNvbmZpZ3VyYXRpb24gc2VydmljZSBuYW1lIHR5cGUgKi8KKyNkZWZpbmUgVElQQ19UT1BfU1JWCQkxCS8qIHRvcG9sb2d5IHNlcnZpY2UgbmFtZSB0eXBlICovCisjZGVmaW5lIFRJUENfUkVTRVJWRURfVFlQRVMJNjQJLyogbG93ZXN0IHVzZXItcHVibGlzaGFibGUgbmFtZSB0eXBlICovCisKKy8qIAorICogUHVibGljYXRpb24gc2NvcGVzIHdoZW4gYmluZGluZyBwb3J0IG5hbWVzIGFuZCBwb3J0IG5hbWUgc2VxdWVuY2VzCisgKi8KKworI2RlZmluZSBUSVBDX1pPTkVfU0NPUEUJCTEKKyNkZWZpbmUgVElQQ19DTFVTVEVSX1NDT1BFCTIKKyNkZWZpbmUgVElQQ19OT0RFX1NDT1BFCQkzCisKKy8qCisgKiBMaW1pdGluZyB2YWx1ZXMgZm9yIG1lc3NhZ2VzCisgKi8KKworI2RlZmluZSBUSVBDX01BWF9VU0VSX01TR19TSVpFCTY2MDAwCisKKy8qCisgKiBNZXNzYWdlIGltcG9ydGFuY2UgbGV2ZWxzCisgKi8KKworI2RlZmluZSBUSVBDX0xPV19JTVBPUlRBTkNFCQkwICAvKiBkZWZhdWx0ICovCisjZGVmaW5lIFRJUENfTUVESVVNX0lNUE9SVEFOQ0UJCTEKKyNkZWZpbmUgVElQQ19ISUdIX0lNUE9SVEFOQ0UJCTIKKyNkZWZpbmUgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFCTMKKworLyogCisgKiBNc2cgcmVqZWN0aW9uL2Nvbm5lY3Rpb24gc2h1dGRvd24gcmVhc29ucworICovCisKKyNkZWZpbmUgVElQQ19PSwkJCTAKKyNkZWZpbmUgVElQQ19FUlJfTk9fTkFNRQkxCisjZGVmaW5lIFRJUENfRVJSX05PX1BPUlQJMgorI2RlZmluZSBUSVBDX0VSUl9OT19OT0RFCTMKKyNkZWZpbmUgVElQQ19FUlJfT1ZFUkxPQUQJNAorI2RlZmluZSBUSVBDX0NPTk5fU0hVVERPV04JNQorCisvKgorICogVElQQyB0b3BvbG9neSBzdWJzY3JpcHRpb24gc2VydmljZSBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgVElQQ19TVUJfUE9SVFMgICAgIAkweDAxICAJLyogZmlsdGVyIGZvciBwb3J0IGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBUSVBDX1NVQl9TRVJWSUNFICAgICAJMHgwMiAgCS8qIGZpbHRlciBmb3Igc2VydmljZSBhdmFpbGFiaWxpdHkgKi8KKyNpZiAwCisvKiBUaGUgZm9sbG93aW5nIGZpbHRlciBvcHRpb25zIGFyZSBub3QgY3VycmVudGx5IGltcGxlbWVudGVkICovCisjZGVmaW5lIFRJUENfU1VCX05PX0JJTkRfRVZUUwkweDA0CS8qIGZpbHRlciBvdXQgInB1Ymxpc2giIGV2ZW50cyAqLworI2RlZmluZSBUSVBDX1NVQl9OT19VTkJJTkRfRVZUUwkweDA4CS8qIGZpbHRlciBvdXQgIndpdGhkcmF3IiBldmVudHMgKi8KKyNkZWZpbmUgVElQQ19TVUJfU0lOR0xFX0VWVAkweDEwCS8qIGV4cGlyZSBhZnRlciBmaXJzdCBldmVudCAqLworI2VuZGlmCisKKyNkZWZpbmUgVElQQ19XQUlUX0ZPUkVWRVIJfjAJLyogdGltZW91dCBmb3IgcGVybWFuZW50IHN1YnNjcmlwdGlvbiAqLworCitzdHJ1Y3QgdGlwY19zdWJzY3IgeworCXN0cnVjdCB0aXBjX25hbWVfc2VxIHNlcTsJLyogbmFtZSBzZXF1ZW5jZSBvZiBpbnRlcmVzdCAqLworCV9fdTMyIHRpbWVvdXQ7CQkJLyogc3Vic2NyaXB0aW9uIGR1cmF0aW9uIChpbiBtcykgKi8KKyAgICAgICAgX191MzIgZmlsdGVyOyAgIAkJLyogYml0bWFzayBvZiBmaWx0ZXIgb3B0aW9ucyAqLworCWNoYXIgdXNyX2hhbmRsZVs4XTsJCS8qIGF2YWlsYWJsZSBmb3Igc3Vic2NyaWJlciB1c2UgKi8KK307CisKKyNkZWZpbmUgVElQQ19QVUJMSVNIRUQJCTEJLyogcHVibGljYXRpb24gZXZlbnQgKi8KKyNkZWZpbmUgVElQQ19XSVRIRFJBV04JCTIJLyogd2l0aGRyYXcgZXZlbnQgKi8KKyNkZWZpbmUgVElQQ19TVUJTQ1JfVElNRU9VVAkzCS8qIHN1YnNjcmlwdGlvbiB0aW1lb3V0IGV2ZW50ICovCisKK3N0cnVjdCB0aXBjX2V2ZW50IHsKKwlfX3UzMiBldmVudDsJCQkvKiBldmVudCB0eXBlICovCisJX191MzIgZm91bmRfbG93ZXI7CQkvKiBtYXRjaGluZyBuYW1lIHNlcSBpbnN0YW5jZXMgKi8KKwlfX3UzMiBmb3VuZF91cHBlcjsJCS8qICAgICIgICAgICAiICAgICIgICAgICIgICAgICAqLworCXN0cnVjdCB0aXBjX3BvcnRpZCBwb3J0OwkvKiBhc3NvY2lhdGVkIHBvcnQgKi8KKwlzdHJ1Y3QgdGlwY19zdWJzY3IgczsJCS8qIGFzc29jaWF0ZWQgc3Vic2NyaXB0aW9uICovCit9OworCisvKgorICogU29ja2V0IEFQSQorICovCisKKyNpZm5kZWYgQUZfVElQQworI2RlZmluZSBBRl9USVBDCQkzMAorI2VuZGlmCisKKyNpZm5kZWYgUEZfVElQQworI2RlZmluZSBQRl9USVBDCQlBRl9USVBDCisjZW5kaWYKKworI2lmbmRlZiBTT0xfVElQQworI2RlZmluZSBTT0xfVElQQwkyNzEKKyNlbmRpZgorCisjZGVmaW5lIFRJUENfQUREUl9OQU1FU0VRCTEKKyNkZWZpbmUgVElQQ19BRERSX01DQVNUCQkxCisjZGVmaW5lIFRJUENfQUREUl9OQU1FCQkyCisjZGVmaW5lIFRJUENfQUREUl9JRAkJMworCitzdHJ1Y3Qgc29ja2FkZHJfdGlwYyB7CisJdW5zaWduZWQgc2hvcnQgZmFtaWx5OworCXVuc2lnbmVkIGNoYXIgIGFkZHJ0eXBlOworCXNpZ25lZCAgIGNoYXIgIHNjb3BlOworCXVuaW9uIHsKKwkJc3RydWN0IHRpcGNfcG9ydGlkIGlkOworCQlzdHJ1Y3QgdGlwY19uYW1lX3NlcSBuYW1lc2VxOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHRpcGNfbmFtZSBuYW1lOworCQkJX191MzIgZG9tYWluOyAvKiAwOiBvd24gem9uZSAqLworCQl9IG5hbWU7CisJfSBhZGRyOworfTsKKworLyoKKyAqIEFuY2lsbGFyeSBkYXRhIG9iamVjdHMgc3VwcG9ydGVkIGJ5IHJlY3Ztc2coKQorICovCisKKyNkZWZpbmUgVElQQ19FUlJJTkZPCTEJLyogZXJyb3IgaW5mbyAqLworI2RlZmluZSBUSVBDX1JFVERBVEEJMgkvKiByZXR1cm5lZCBkYXRhICovCisjZGVmaW5lIFRJUENfREVTVE5BTUUJMwkvKiBkZXN0aW5hdGlvbiBuYW1lICovCisKKy8qCisgKiBUSVBDLXNwZWNpZmljIHNvY2tldCBvcHRpb24gdmFsdWVzCisgKi8KKworI2RlZmluZSBUSVBDX0lNUE9SVEFOQ0UJCTEyNwkvKiBEZWZhdWx0OiBUSVBDX0xPV19JTVBPUlRBTkNFICovCisjZGVmaW5lIFRJUENfU1JDX0RST1BQQUJMRQkxMjgJLyogRGVmYXVsdDogMCAocmVzZW5kIGNvbmdlc3RlZCBtc2cpICovCisjZGVmaW5lIFRJUENfREVTVF9EUk9QUEFCTEUJMTI5CS8qIERlZmF1bHQ6IGJhc2VkIG9uIHNvY2tldCB0eXBlICovCisjZGVmaW5lIFRJUENfQ09OTl9USU1FT1VUCTEzMAkvKiBEZWZhdWx0OiA4MDAwIChtcykgICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aXBjX2NvbmZpZy5oIGIvaW5jbHVkZS9saW51eC90aXBjX2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MmM4YzYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmgKQEAgLTAsMCArMSw0MDcgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBjb25maWd1cmF0aW9uIGludGVyZmFjZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9USVBDX0NPTkZJR19IXworI2RlZmluZSBfTElOVVhfVElQQ19DT05GSUdfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKgorICogQ29uZmlndXJhdGlvbgorICoKKyAqIEFsbCBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgbWVzc2FnaW5nIGludm9sdmVzIHNlbmRpbmcgYSByZXF1ZXN0IG1lc3NhZ2UKKyAqIHRvIHRoZSBUSVBDIGNvbmZpZ3VyYXRpb24gc2VydmljZSBvbiBhIG5vZGUsIHdoaWNoIHNlbmRzIGEgcmVwbHkgbWVzc2FnZQorICogYmFjay4gIChJbiB0aGUgZnV0dXJlIG11bHRpLW1lc3NhZ2UgcmVwbGllcyBtYXkgYmUgc3VwcG9ydGVkLikKKyAqCisgKiBCb3RoIHJlcXVlc3QgYW5kIHJlcGx5IG1lc3NhZ2VzIGNvbnNpc3Qgb2YgYSB0cmFuc3BvcnQgaGVhZGVyIGFuZCBwYXlsb2FkLgorICogVGhlIHRyYW5zcG9ydCBoZWFkZXIgY29udGFpbnMgaW5mbyBhYm91dCB0aGUgZGVzaXJlZCBvcGVyYXRpb247CisgKiB0aGUgcGF5bG9hZCBjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgdHlwZS9sZW5ndGgvdmFsdWUgKFRMVikgaXRlbXMKKyAqIHdoaWNoIHNwZWNpZnkgcGFyYW1ldGVycyBvciByZXN1bHRzIGZvciB0aGUgb3BlcmF0aW9uLgorICoKKyAqIEZvciBtYW55IG9wZXJhdGlvbnMsIHRoZSByZXF1ZXN0IGFuZCByZXBseSBtZXNzYWdlcyBoYXZlIGEgZml4ZWQgbnVtYmVyCisgKiBvZiBUTFZzICh1c3VhbGx5IHplcm8gb3Igb25lKTsgaG93ZXZlciwgc29tZSByZXBseSBtZXNzYWdlcyBtYXkgcmV0dXJuIAorICogYSB2YXJpYWJsZSBudW1iZXIgb2YgVExWcy4gIEEgZmFpbGVkIHJlcXVlc3QgaXMgZGVub3RlZCBieSB0aGUgcHJlc2VuY2UKKyAqIG9mIGFuICJlcnJvciBzdHJpbmciIFRMViBpbiB0aGUgcmVwbHkgbWVzc2FnZSBpbnN0ZWFkIG9mIHRoZSBUTFYocykgdGhlCisgKiByZXBseSBzaG91bGQgY29udGFpbiBpZiB0aGUgcmVxdWVzdCBzdWNjZWVkcy4KKyAqLworIAorLyogCisgKiBQdWJsaWMgY29tbWFuZHM6CisgKiBNYXkgYmUgaXNzdWVkIGJ5IGFueSBwcm9jZXNzLgorICogQWNjZXB0ZWQgYnkgb3duIG5vZGUsIG9yIGJ5IHJlbW90ZSBub2RlIG9ubHkgaWYgcmVtb3RlIG1hbmFnZW1lbnQgZW5hYmxlZC4gICAgICAgICAgICAgICAgICAgICAgIAorICovCisgCisjZGVmaW5lICBUSVBDX0NNRF9OT09QICAgCSAgICAweDAwMDAgICAgLyogdHggbm9uZSwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX05PREVTICAgICAgICAgMHgwMDAxICAgIC8qIHR4IG5ldF9hZGRyLCByeCBub2RlX2luZm8ocykgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9NRURJQV9OQU1FUyAgIDB4MDAwMiAgICAvKiB0eCBub25lLCByeCBtZWRpYV9uYW1lKHMpICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfQkVBUkVSX05BTUVTICAweDAwMDMgICAgLyogdHggbm9uZSwgcnggYmVhcmVyX25hbWUocykgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9MSU5LUyAgICAgICAgIDB4MDAwNCAgICAvKiB0eCBuZXRfYWRkciwgcnggbGlua19pbmZvKHMpICovCisjZGVmaW5lICBUSVBDX0NNRF9TSE9XX05BTUVfVEFCTEUgICAweDAwMDUgICAgLyogdHggbmFtZV90YmxfcXVlcnksIHJ4IHVsdHJhX3N0cmluZyAqLworI2RlZmluZSAgVElQQ19DTURfU0hPV19QT1JUUyAgICAgICAgMHgwMDA2ICAgIC8qIHR4IG5vbmUsIHJ4IHVsdHJhX3N0cmluZyAqLworI2RlZmluZSAgVElQQ19DTURfU0hPV19MSU5LX1NUQVRTICAgMHgwMDBCICAgIC8qIHR4IGxpbmtfbmFtZSwgcnggdWx0cmFfc3RyaW5nICovCisKKyNpZiAwCisjZGVmaW5lICBUSVBDX0NNRF9TSE9XX1BPUlRfU1RBVFMgICAweDAwMDggICAgLyogdHggcG9ydF9yZWYsIHJ4IHVsdHJhX3N0cmluZyAqLworI2RlZmluZSAgVElQQ19DTURfUkVTRVRfUE9SVF9TVEFUUyAgMHgwMDA5ICAgIC8qIHR4IHBvcnRfcmVmLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfUk9VVEVTICAgICAgICAweDAwMEEgICAgLyogdHggPywgcnggPyAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX0xJTktfUEVFUiAgICAgMHgwMDBEICAgIC8qIHR4IGxpbmtfbmFtZSwgcnggPyAqLworI2VuZGlmCisKKy8qIAorICogUHJvdGVjdGVkIGNvbW1hbmRzOgorICogTWF5IG9ubHkgYmUgaXNzdWVkIGJ5ICJuZXR3b3JrIGFkbWluaXN0cmF0aW9uIGNhcGFibGUiIHByb2Nlc3MuCisgKiBBY2NlcHRlZCBieSBvd24gbm9kZSwgb3IgYnkgcmVtb3RlIG5vZGUgb25seSBpZiByZW1vdGUgbWFuYWdlbWVudCBlbmFibGVkCisgKiBhbmQgdGhpcyBub2RlIGlzIHpvbmUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgIAorICovCisKKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9SRU1PVEVfTU5HICAgIDB4NDAwMyAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9QT1JUUyAgICAgMHg0MDA0ICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX1BVQkwgICAgICAweDQwMDUgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9NQVhfU1VCU0NSICAgIDB4NDAwNiAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9aT05FUyAgICAgMHg0MDA3ICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX0NMVVNURVJTICAweDQwMDggICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9NQVhfTk9ERVMgICAgIDB4NDAwOSAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9TTEFWRVMgICAgMHg0MDBBICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTkVUSUQgICAgICAgICAweDQwMEIgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKworI2RlZmluZSAgVElQQ19DTURfRU5BQkxFX0JFQVJFUiAgICAgMHg0MTAxICAgIC8qIHR4IGJlYXJlcl9jb25maWcsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0RJU0FCTEVfQkVBUkVSICAgIDB4NDEwMiAgICAvKiB0eCBiZWFyZXJfbmFtZSwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX0xJTktfVE9MICAgICAgMHg0MTA3ICAgIC8qIHR4IGxpbmtfY29uZmlnLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTElOS19QUkkgICAgICAweDQxMDggICAgLyogdHggbGlua19jb25maWcsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9MSU5LX1dJTkRPVyAgIDB4NDEwOSAgICAvKiB0eCBsaW5rX2NvbmZpZywgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX0xPR19TSVpFICAgICAgMHg0MTBBICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9EVU1QX0xPRyAgICAgICAgICAweDQxMEIgICAgLyogdHggbm9uZSwgcnggdWx0cmFfc3RyaW5nICovCisjZGVmaW5lICBUSVBDX0NNRF9SRVNFVF9MSU5LX1NUQVRTICAweDQxMEMgICAgLyogdHggbGlua19uYW1lLCByeCBub25lICovCisKKyNpZiAwCisjZGVmaW5lICBUSVBDX0NNRF9DUkVBVEVfTElOSyAgICAgICAweDQxMDMgICAgLyogdHggbGlua19jcmVhdGUsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1JFTU9WRV9MSU5LICAgICAgIDB4NDEwNCAgICAvKiB0eCBsaW5rX25hbWUsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0JMT0NLX0xJTksgICAgICAgIDB4NDEwNSAgICAvKiB0eCBsaW5rX25hbWUsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1VOQkxPQ0tfTElOSyAgICAgIDB4NDEwNiAgICAvKiB0eCBsaW5rX25hbWUsIHJ4IG5vbmUgKi8KKyNlbmRpZgorCisvKiAKKyAqIFByaXZhdGUgY29tbWFuZHM6CisgKiBNYXkgb25seSBiZSBpc3N1ZWQgYnkgIm5ldHdvcmsgYWRtaW5pc3RyYXRpb24gY2FwYWJsZSIgcHJvY2Vzcy4KKyAqIEFjY2VwdGVkIGJ5IG93biBub2RlIG9ubHk7IGNhbm5vdCBiZSB1c2VkIG9uIGEgcmVtb3RlIG5vZGUuICAgICAgICAgICAgICAgICAgICAgICAKKyAqLworCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTk9ERV9BRERSICAgICAweDgwMDEgICAgLyogdHggbmV0X2FkZHIsIHJ4IG5vbmUgKi8KKyNpZiAwCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfWk9ORV9NQVNURVIgICAweDgwMDIgICAgLyogdHggbm9uZSwgcnggbm9uZSAqLworI2VuZGlmCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfUkVNT1RFX01ORyAgICAweDgwMDMgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9NQVhfUE9SVFMgICAgIDB4ODAwNCAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9QVUJMICAgICAgMHg4MDA1ICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX1NVQlNDUiAgICAweDgwMDYgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9NQVhfWk9ORVMgICAgIDB4ODAwNyAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9DTFVTVEVSUyAgMHg4MDA4ICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX05PREVTICAgICAweDgwMDkgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9NQVhfU0xBVkVTICAgIDB4ODAwQSAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX05FVElEICAgICAgICAgMHg4MDBCICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisKKy8qCisgKiBUTFYgdHlwZXMgZGVmaW5lZCBmb3IgVElQQworICovCisKKyNkZWZpbmUgVElQQ19UTFZfTk9ORQkJMAkvKiBubyBUTFYgcHJlc2VudCAqLworI2RlZmluZSBUSVBDX1RMVl9WT0lECQkxCS8qIGVtcHR5IFRMViAoMCBkYXRhIGJ5dGVzKSovCisjZGVmaW5lIFRJUENfVExWX1VOU0lHTkVECTIJLyogMzItYml0IGludGVnZXIgKi8KKyNkZWZpbmUgVElQQ19UTFZfU1RSSU5HCQkzCS8qIGNoYXJbMTI4XSAobWF4KSAqLworI2RlZmluZSBUSVBDX1RMVl9MQVJHRV9TVFJJTkcJNAkvKiBjaGFyWzIwNDhdIChtYXgpICovCisjZGVmaW5lIFRJUENfVExWX1VMVFJBX1NUUklORwk1CS8qIGNoYXJbMzI3NjhdIChtYXgpICovCisKKyNkZWZpbmUgVElQQ19UTFZfRVJST1JfU1RSSU5HCTE2CS8qIGNoYXJbMTI4XSBjb250YWluaW5nICJlcnJvciBjb2RlIiAqLworI2RlZmluZSBUSVBDX1RMVl9ORVRfQUREUiAgIAkxNwkvKiAzMi1iaXQgaW50ZWdlciBkZW5vdGluZyA8Wi5DLk4+ICovCisjZGVmaW5lIFRJUENfVExWX01FRElBX05BTUUJMTgJLyogY2hhcltUSVBDX01BWF9NRURJQV9OQU1FXSAqLworI2RlZmluZSBUSVBDX1RMVl9CRUFSRVJfTkFNRQkxOQkvKiBjaGFyW1RJUENfTUFYX0JFQVJFUl9OQU1FXSAqLworI2RlZmluZSBUSVBDX1RMVl9MSU5LX05BTUUJMjAJLyogY2hhcltUSVBDX01BWF9MSU5LX05BTUVdICovCisjZGVmaW5lIFRJUENfVExWX05PREVfSU5GTwkyMQkvKiBzdHJ1Y3QgdGlwY19ub2RlX2luZm8gKi8KKyNkZWZpbmUgVElQQ19UTFZfTElOS19JTkZPCTIyCS8qIHN0cnVjdCB0aXBjX2xpbmtfaW5mbyAqLworI2RlZmluZSBUSVBDX1RMVl9CRUFSRVJfQ09ORklHICAyMwkvKiBzdHJ1Y3QgdGlwY19iZWFyZXJfY29uZmlnICovCisjZGVmaW5lIFRJUENfVExWX0xJTktfQ09ORklHICAgIDI0CS8qIHN0cnVjdCB0aXBjX2xpbmtfY29uZmlnICovCisjZGVmaW5lIFRJUENfVExWX05BTUVfVEJMX1FVRVJZCTI1CS8qIHN0cnVjdCB0aXBjX25hbWVfdGFibGVfcXVlcnkgKi8KKyNkZWZpbmUgVElQQ19UTFZfUE9SVF9SRUYgICAJMjYJLyogMzItYml0IHBvcnQgcmVmZXJlbmNlICovCisKKy8qCisgKiBNYXhpbXVtIHNpemVzIG9mIFRJUEMgYmVhcmVyLXJlbGF0ZWQgbmFtZXMgKGluY2x1ZGluZyB0ZXJtaW5hdGluZyBOVUwpCisgKi8gCisKKyNkZWZpbmUgVElQQ19NQVhfTUVESUFfTkFNRQkxNgkvKiBmb3JtYXQgPSBtZWRpYSAqLworI2RlZmluZSBUSVBDX01BWF9JRl9OQU1FCTE2CS8qIGZvcm1hdCA9IGludGVyZmFjZSAqLworI2RlZmluZSBUSVBDX01BWF9CRUFSRVJfTkFNRQkzMgkvKiBmb3JtYXQgPSBtZWRpYTppbnRlcmZhY2UgKi8KKyNkZWZpbmUgVElQQ19NQVhfTElOS19OQU1FCTYwCS8qIGZvcm1hdCA9IFouQy5OOmludGVyZmFjZS1aLkMuTjppbnRlcmZhY2UgKi8KKworLyoKKyAqIExpbmsgcHJpb3JpdHkgbGltaXRzIChyYW5nZSBmcm9tIDAgdG8gIyBwcmlvcml0aWVzIC0gMSkKKyAqLworCisjZGVmaW5lIFRJUENfTlVNX0xJTktfUFJJIDMyCisKKy8qCisgKiBMaW5rIHRvbGVyYW5jZSBsaW1pdHMgKG1pbiwgZGVmYXVsdCwgbWF4KSwgaW4gbXMKKyAqLworCisjZGVmaW5lIFRJUENfTUlOX0xJTktfVE9MIDUwCisjZGVmaW5lIFRJUENfREVGX0xJTktfVE9MIDE1MDAKKyNkZWZpbmUgVElQQ19NQVhfTElOS19UT0wgMzAwMDAKKworLyoKKyAqIExpbmsgd2luZG93IGxpbWl0cyAobWluLCBkZWZhdWx0LCBtYXgpLCBpbiBwYWNrZXRzCisgKi8KKworI2RlZmluZSBUSVBDX01JTl9MSU5LX1dJTiAxNgorI2RlZmluZSBUSVBDX0RFRl9MSU5LX1dJTiA1MAorI2RlZmluZSBUSVBDX01BWF9MSU5LX1dJTiAxNTAKKworCitzdHJ1Y3QgdGlwY19ub2RlX2luZm8geworCV9fdTMyIGFkZHI7CQkJLyogbmV0d29yayBhZGRyZXNzIG9mIG5vZGUgKi8KKwlfX3UzMiB1cDsJCQkvKiAwPWRvd24sIDE9IHVwICovCit9OworCitzdHJ1Y3QgdGlwY19saW5rX2luZm8geworCV9fdTMyIGRlc3Q7CQkJLyogbmV0d29yayBhZGRyZXNzIG9mIHBlZXIgbm9kZSAqLworCV9fdTMyIHVwOwkJCS8qIDA9ZG93biwgMT11cCAqLworCWNoYXIgc3RyW1RJUENfTUFYX0xJTktfTkFNRV07CS8qIGxpbmsgbmFtZSAqLworfTsKKworc3RydWN0IHRpcGNfYmVhcmVyX2NvbmZpZyB7CisJX191MzIgcHJpb3JpdHk7CQkJLyogUmFuZ2UgWzEsMzFdLiBPdmVycmlkZSBwZXIgbGluayAgKi8KKwlfX3UzMiBkZXRlY3Rfc2NvcGU7ICAgICAKKwljaGFyIG5hbWVbVElQQ19NQVhfQkVBUkVSX05BTUVdOworfTsKKworc3RydWN0IHRpcGNfbGlua19jb25maWcgeworCV9fdTMyIHZhbHVlOworCWNoYXIgbmFtZVtUSVBDX01BWF9MSU5LX05BTUVdOworfTsKKworI2RlZmluZSBUSVBDX05UUV9BTExUWVBFUyAweDgwMDAwMDAwCisKK3N0cnVjdCB0aXBjX25hbWVfdGFibGVfcXVlcnkgeworCV9fdTMyIGRlcHRoOwkvKiAxOnR5cGUsIDI6K25hbWUgaW5mbywgMzorcG9ydCBpbmZvLCA0KzorZGVidWcgaW5mbyAqLworCV9fdTMyIHR5cGU7CS8qIHt0LGwsdX0gaW5mbyBpZ25vcmVkIGlmIGhpZ2ggYml0IG9mICJkZXB0aCIgaXMgc2V0ICovCisJX191MzIgbG93Ym91bmQ7IC8qIChpLmUuIGRpc3BsYXlzIGFsbCBlbnRyaWVzIG9mIG5hbWUgdGFibGUpICovCisJX191MzIgdXBib3VuZDsKK307CisKKy8qCisgKiBUaGUgZXJyb3Igc3RyaW5nIFRMViBpcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY2F1c2UgCisgKiBvZiB0aGUgcmVxdWVzdCBmYWlsdXJlLiAgVG8gc2ltcGxpZnkgZXJyb3IgcHJvY2Vzc2luZyAoYW5kIHRvIHNhdmUgc3BhY2UpCisgKiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgY2FuIGJlIGEgc3BlY2lhbCBlcnJvciBjb2RlIGNoYXJhY3RlcgorICogKGx5aW5nIGJ5IHRoZSByYW5nZSAweDgwIHRvIDB4RkYpIHdoaWNoIHJlcHJlc2VudHMgYSBwcmUtZGVmaW5lZCByZWFzb24uCisgKi8KKworI2RlZmluZSBUSVBDX0NGR19UTFZfRVJST1IgICAgICAiXHg4MCIgIC8qIHJlcXVlc3QgY29udGFpbnMgaW5jb3JyZWN0IFRMVihzKSAqLworI2RlZmluZSBUSVBDX0NGR19OT1RfTkVUX0FETUlOICAiXHg4MSIJLyogbXVzdCBiZSBuZXR3b3JrIGFkbWluaXN0cmF0b3IgKi8KKyNkZWZpbmUgVElQQ19DRkdfTk9UX1pPTkVfTVNUUgkiXHg4MiIJLyogbXVzdCBiZSB6b25lIG1hc3RlciAqLworI2RlZmluZSBUSVBDX0NGR19OT19SRU1PVEUJIlx4ODMiCS8qIHJlbW90ZSBtYW5hZ2VtZW50IG5vdCBlbmFibGVkICovCisjZGVmaW5lIFRJUENfQ0ZHX05PVF9TVVBQT1JURUQgICJceDg0IgkvKiByZXF1ZXN0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgVElQQyAqLworI2RlZmluZSBUSVBDX0NGR19JTlZBTElEX1ZBTFVFICAiXHg4NSIgIC8qIHJlcXVlc3QgaGFzIGludmFsaWQgYXJndW1lbnQgdmFsdWUgKi8KKworI2lmIDAKKy8qIHByb3RvdHlwZXMgVExWIHN0cnVjdHVyZXMgZm9yIHByb3Bvc2VkIGNvbW1hbmRzICovCitzdHJ1Y3QgdGlwY19saW5rX2NyZWF0ZSB7CisJX191MzIgICBkb21haW47CisJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBwZWVyX2FkZHI7CisJY2hhciBiZWFyZXJfbmFtZVtUSVBDX01BWF9CRUFSRVJfTkFNRV07Cit9OworCitzdHJ1Y3QgdGlwY19yb3V0ZV9pbmZvIHsKKwlfX3UzMiBkZXN0OworCV9fdTMyIHJvdXRlcjsKK307CisjZW5kaWYKKworLyoKKyAqIEEgVExWIGNvbnNpc3RzIG9mIGEgZGVzY3JpcHRvciwgZm9sbG93ZWQgYnkgdGhlIFRMViB2YWx1ZS4KKyAqIFRMViBkZXNjcmlwdG9yIGZpZWxkcyBhcmUgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlcjsgCisgKiBUTFYgdmFsdWVzIG11c3QgYWxzbyBiZSBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyICh3aGVyZSBhcHBsaWNhYmxlKS4KKyAqIFRMViBkZXNjcmlwdG9ycyBtdXN0IGJlIGFsaWduZWQgdG8gYWRkcmVzc2VzIHdoaWNoIGFyZSBtdWx0aXBsZSBvZiA0LAorICogc28gdXAgdG8gMyBieXRlcyBvZiBwYWRkaW5nIG1heSBleGlzdCBhdCB0aGUgZW5kIG9mIHRoZSBUTFYgdmFsdWUgYXJlYS4KKyAqIFRoZXJlIG11c3Qgbm90IGJlIGFueSBwYWRkaW5nIGJldHdlZW4gdGhlIFRMViBkZXNjcmlwdG9yIGFuZCBpdHMgdmFsdWUuCisgKi8KKworc3RydWN0IHRsdl9kZXNjIHsKKwlfX3UxNiB0bHZfbGVuOwkJLyogVExWIGxlbmd0aCAoZGVzY3JpcHRvciArIHZhbHVlKSAqLworCV9fdTE2IHRsdl90eXBlOwkJLyogVExWIGlkZW50aWZpZXIgKi8KK307CisKKyNkZWZpbmUgVExWX0FMSUdOVE8gNAorCisjZGVmaW5lIFRMVl9BTElHTihkYXRhbGVuKSAoKChkYXRhbGVuKSsoVExWX0FMSUdOVE8tMSkpICYgfihUTFZfQUxJR05UTy0xKSkKKyNkZWZpbmUgVExWX0xFTkdUSChkYXRhbGVuKSAoc2l6ZW9mKHN0cnVjdCB0bHZfZGVzYykgKyAoZGF0YWxlbikpCisjZGVmaW5lIFRMVl9TUEFDRShkYXRhbGVuKSAoVExWX0FMSUdOKFRMVl9MRU5HVEgoZGF0YWxlbikpKQorI2RlZmluZSBUTFZfREFUQSh0bHYpICgodm9pZCAqKSgoY2hhciAqKSh0bHYpICsgVExWX0xFTkdUSCgwKSkpCisKK3N0YXRpYyBpbmxpbmUgaW50IFRMVl9PSyhjb25zdCB2b2lkICp0bHYsIF9fdTE2IHNwYWNlKQoreworCS8qCisJICogV291bGQgYWxzbyBsaWtlIHRvIGNoZWNrIHRoYXQgInRsdiIgaXMgYSBtdWx0aXBsZSBvZiA0LAorCSAqIGJ1dCBkb24ndCBrbm93IGhvdyB0byBkbyB0aGlzIGluIGEgcG9ydGFibGUgd2F5LgorCSAqIC0gVHJpZWQgZG9pbmcgKCEodGx2ICYgKFRMVl9BTElHTlRPLTEpKSksIGJ1dCBHQ0MgY29tcGlsZXIKKwkgKiAgIHdvbid0IGFsbG93IGJpbmFyeSAiJiIgd2l0aCBhIHBvaW50ZXIuCisJICogLSBUcmllZCBjYXN0aW5nICJ0bHYiIHRvIGludGVnZXIgdHlwZSwgYnV0IGNhdXNlcyB3YXJuaW5nIGFib3V0IHNpemUKKwkgKiAgIG1pc21hdGNoIHdoZW4gcG9pbnRlciBpcyBiaWdnZXIgdGhhbiBjaG9zZW4gdHlwZSAoaW50LCBsb25nLCAuLi4pLgorCSAqLworCisJcmV0dXJuIChzcGFjZSA+PSBUTFZfU1BBQ0UoMCkpICYmCisJCShudG9ocygoKHN0cnVjdCB0bHZfZGVzYyAqKXRsdiktPnRsdl9sZW4pIDw9IHNwYWNlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgVExWX0NIRUNLKGNvbnN0IHZvaWQgKnRsdiwgX191MTYgc3BhY2UsIF9fdTE2IGV4cF90eXBlKQoreworCXJldHVybiBUTFZfT0sodGx2LCBzcGFjZSkgJiYgCisJCShudG9ocygoKHN0cnVjdCB0bHZfZGVzYyAqKXRsdiktPnRsdl90eXBlKSA9PSBleHBfdHlwZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFRMVl9TRVQodm9pZCAqdGx2LCBfX3UxNiB0eXBlLCB2b2lkICpkYXRhLCBfX3UxNiBsZW4pCit7CisJc3RydWN0IHRsdl9kZXNjICp0bHZfcHRyOworCWludCB0bHZfbGVuOworCisJdGx2X2xlbiA9IFRMVl9MRU5HVEgobGVuKTsKKwl0bHZfcHRyID0gKHN0cnVjdCB0bHZfZGVzYyAqKXRsdjsKKwl0bHZfcHRyLT50bHZfdHlwZSA9IGh0b25zKHR5cGUpOworCXRsdl9wdHItPnRsdl9sZW4gID0gaHRvbnModGx2X2xlbik7CisJaWYgKGxlbiAmJiBkYXRhKQorCQltZW1jcHkoVExWX0RBVEEodGx2X3B0ciksIGRhdGEsIHRsdl9sZW4pOworCXJldHVybiBUTFZfU1BBQ0UobGVuKTsKK30KKworLyoKKyAqIEEgVExWIGxpc3QgZGVzY3JpcHRvciBzaW1wbGlmaWVzIHByb2Nlc3Npbmcgb2YgbWVzc2FnZXMgCisgKiBjb250YWluaW5nIG11bHRpcGxlIFRMVnMuCisgKi8KKworc3RydWN0IHRsdl9saXN0X2Rlc2MgeworCXN0cnVjdCB0bHZfZGVzYyAqdGx2X3B0cjsJLyogcHRyIHRvIGN1cnJlbnQgVExWICovCisJX191MzIgdGx2X3NwYWNlOwkJLyogIyBieXRlcyBmcm9tIGN1cnIgVExWIHRvIGxpc3QgZW5kICovCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgVExWX0xJU1RfSU5JVChzdHJ1Y3QgdGx2X2xpc3RfZGVzYyAqbGlzdCwgCisJCQkJIHZvaWQgKmRhdGEsIF9fdTMyIHNwYWNlKQoreworCWxpc3QtPnRsdl9wdHIgPSAoc3RydWN0IHRsdl9kZXNjICopZGF0YTsKKwlsaXN0LT50bHZfc3BhY2UgPSBzcGFjZTsKK30KKwkgICAgIAorc3RhdGljIGlubGluZSBpbnQgVExWX0xJU1RfRU1QVFkoc3RydWN0IHRsdl9saXN0X2Rlc2MgKmxpc3QpCit7IAorCXJldHVybiAobGlzdC0+dGx2X3NwYWNlID09IDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBUTFZfTElTVF9DSEVDSyhzdHJ1Y3QgdGx2X2xpc3RfZGVzYyAqbGlzdCwgX191MTYgZXhwX3R5cGUpCit7CisJcmV0dXJuIFRMVl9DSEVDSyhsaXN0LT50bHZfcHRyLCBsaXN0LT50bHZfc3BhY2UsIGV4cF90eXBlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpUTFZfTElTVF9EQVRBKHN0cnVjdCB0bHZfbGlzdF9kZXNjICpsaXN0KQoreworCXJldHVybiBUTFZfREFUQShsaXN0LT50bHZfcHRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFRMVl9MSVNUX1NURVAoc3RydWN0IHRsdl9saXN0X2Rlc2MgKmxpc3QpCit7CisJX191MTYgdGx2X3NwYWNlID0gVExWX0FMSUdOKG50b2hzKGxpc3QtPnRsdl9wdHItPnRsdl9sZW4pKTsKKworICAgICAgICBsaXN0LT50bHZfcHRyID0gKHN0cnVjdCB0bHZfZGVzYyAqKSgoY2hhciAqKWxpc3QtPnRsdl9wdHIgKyB0bHZfc3BhY2UpOworCWxpc3QtPnRsdl9zcGFjZSAtPSB0bHZfc3BhY2U7Cit9CisKKy8qCisgKiBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGV4Y2hhbmdlZCB2aWEgTkVUTElOS19HRU5FUklDIHVzZSB0aGUgZm9sbG93aW5nCisgKiBmYW1pbHkgaWQsIG5hbWUsIHZlcnNpb24gYW5kIGNvbW1hbmQuCisgKi8KKyNkZWZpbmUgVElQQ19HRU5MX05BTUUJCSJUSVBDIgorI2RlZmluZSBUSVBDX0dFTkxfVkVSU0lPTgkweDEKKyNkZWZpbmUgVElQQ19HRU5MX0NNRAkJMHgxCisKKy8qCisgKiBUSVBDIHNwZWNpZmljIGhlYWRlciB1c2VkIGluIE5FVExJTktfR0VORVJJQyByZXF1ZXN0cy4KKyAqLworc3RydWN0IHRpcGNfZ2VubG1zZ2hkciB7CisJX191MzIgZGVzdDsJCS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlfX3UxNiBjbWQ7CQkvKiBDb21tYW5kICovCisJX191MTYgcmVzZXJ2ZWQ7CQkvKiBVbnVzZWQgKi8KK307CisKKyNkZWZpbmUgVElQQ19HRU5MX0hEUkxFTglOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHRpcGNfZ2VubG1zZ2hkcikpCisKKy8qCisgKiBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGV4Y2hhbmdlZCB2aWEgVElQQyBzb2NrZXRzIHVzZSB0aGUgVElQQyBjb25maWd1cmF0aW9uIAorICogbWVzc2FnZSBoZWFkZXIsIHdoaWNoIGlzIGRlZmluZWQgYmVsb3cuICBUaGlzIHN0cnVjdHVyZSBpcyBhbmFsb2dvdXMgCisgKiB0byB0aGUgTmV0bGluayBtZXNzYWdlIGhlYWRlciwgYnV0IGZpZWxkcyBhcmUgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAKKyAqIGFuZCBubyBwYWRkaW5nIGlzIHBlcm1pdHRlZCBiZXR3ZWVuIHRoZSBoZWFkZXIgYW5kIHRoZSBtZXNzYWdlIGRhdGEgCisgKiB0aGF0IGZvbGxvd3MuCisgKi8KKworc3RydWN0IHRpcGNfY2ZnX21zZ19oZHIKK3sKKwlfX3UzMiB0Y21fbGVuOwkJLyogTWVzc2FnZSBsZW5ndGggKGluY2x1ZGluZyBoZWFkZXIpICovCisJX191MTYgdGNtX3R5cGU7CQkvKiBDb21tYW5kIHR5cGUgKi8KKwlfX3UxNiB0Y21fZmxhZ3M7CS8qIEFkZGl0aW9uYWwgZmxhZ3MgKi8KKwljaGFyICB0Y21fcmVzZXJ2ZWRbOF07CS8qIFVudXNlZCAqLworfTsKKworI2RlZmluZSBUQ01fRl9SRVFVRVNUCTB4MQkvKiBGbGFnOiBSZXF1ZXN0IG1lc3NhZ2UgKi8KKyNkZWZpbmUgVENNX0ZfTU9SRQkweDIJLyogRmxhZzogTWVzc2FnZSB0byBiZSBjb250aW51ZWQgKi8KKworI2RlZmluZSBUQ01fQUxJR04oZGF0YWxlbikgICgoKGRhdGFsZW4pKzMpICYgfjMpCisjZGVmaW5lIFRDTV9MRU5HVEgoZGF0YWxlbikgKHNpemVvZihzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkcikgKyBkYXRhbGVuKQorI2RlZmluZSBUQ01fU1BBQ0UoZGF0YWxlbikgIChUQ01fQUxJR04oVENNX0xFTkdUSChkYXRhbGVuKSkpCisjZGVmaW5lIFRDTV9EQVRBKHRjbV9oZHIpICAgKCh2b2lkICopKChjaGFyICopKHRjbV9oZHIpICsgVENNX0xFTkdUSCgwKSkpCisKK3N0YXRpYyBpbmxpbmUgaW50IFRDTV9TRVQodm9pZCAqbXNnLCBfX3UxNiBjbWQsIF9fdTE2IGZsYWdzLAorCQkJICB2b2lkICpkYXRhLCBfX3UxNiBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciAqdGNtX2hkcjsKKwlpbnQgbXNnX2xlbjsKKworCW1zZ19sZW4gPSBUQ01fTEVOR1RIKGRhdGFfbGVuKTsKKwl0Y21faGRyID0gKHN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyICopbXNnOworCXRjbV9oZHItPnRjbV9sZW4gICA9IGh0b25sKG1zZ19sZW4pOworCXRjbV9oZHItPnRjbV90eXBlICA9IGh0b25zKGNtZCk7CisJdGNtX2hkci0+dGNtX2ZsYWdzID0gaHRvbnMoZmxhZ3MpOworCWlmIChkYXRhX2xlbiAmJiBkYXRhKQorCQltZW1jcHkoVENNX0RBVEEobXNnKSwgZGF0YSwgZGF0YV9sZW4pOworCXJldHVybiBUQ01fU1BBQ0UoZGF0YV9sZW4pOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaAppbmRleCAzZGYxZDQ3Li4zMTVhNTE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCkBAIC04Niw3ICs4Niw2IEBACiAJLm1heF9pbnRlcnZhbAkJPSAyLAkJCVwKIAkuYnVzeV9mYWN0b3IJCT0gOCwJCQlcCiAJLmltYmFsYW5jZV9wY3QJCT0gMTEwLAkJCVwKLQkuY2FjaGVfaG90X3RpbWUJCT0gMCwJCQlcCiAJLmNhY2hlX25pY2VfdHJpZXMJPSAwLAkJCVwKIAkucGVyX2NwdV9nYWluCQk9IDI1LAkJCVwKIAkuYnVzeV9pZHgJCT0gMCwJCQlcCkBAIC0xMTcsNyArMTE2LDYgQEAKIAkubWF4X2ludGVydmFsCQk9IDQsCQkJXAogCS5idXN5X2ZhY3RvcgkJPSA2NCwJCQlcCiAJLmltYmFsYW5jZV9wY3QJCT0gMTI1LAkJCVwKLQkuY2FjaGVfaG90X3RpbWUJCT0gKDUqMTAwMDAwMC8yKSwJXAogCS5jYWNoZV9uaWNlX3RyaWVzCT0gMSwJCQlcCiAJLnBlcl9jcHVfZ2FpbgkJPSAxMDAsCQkJXAogCS5idXN5X2lkeAkJPSAyLAkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2dlbmV0bGluay5oIGIvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKaW5kZXggYzViOTZiMi4uODA1ZGU1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKQEAgLTIyLDcgKzIyLDYgQEAKIAljaGFyCQkJbmFtZVtHRU5MX05BTVNJWl07CiAJdW5zaWduZWQgaW50CQl2ZXJzaW9uOwogCXVuc2lnbmVkIGludAkJbWF4YXR0cjsKLQlzdHJ1Y3QgbW9kdWxlICoJCW93bmVyOwogCXN0cnVjdCBubGF0dHIgKioJYXR0cmJ1ZjsJLyogcHJpdmF0ZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJb3BzX2xpc3Q7CS8qIHByaXZhdGUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWZhbWlseV9saXN0OwkvKiBwcml2YXRlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZWVlODAyMTEuaCBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCmluZGV4IGNkZTJmNGYuLmRmMDVmNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCkBAIC0zNjMsOCArMzYzLDkgQEAKICNkZWZpbmUgSUVFRTgwMjExX09GRE1fU0hJRlRfTUFTS19BICAgICAgICAgNAogCiAvKiBOT1RFOiBUaGlzIGRhdGEgaXMgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzOyBub3QgYWxsIGhhcmR3YXJlIHByb3ZpZGVzIHRoaXMKLSAqICAgICAgIGluZm9ybWF0aW9uIGZvciBmcmFtZXMgcmVjZWl2ZWQuICBOb3Qgc2V0dGluZyB0aGVzZSB3aWxsIG5vdCBjYXVzZQotICogICAgICAgYW55IGFkdmVyc2UgYWZmZWN0cy4gKi8KKyAqICAgICAgIGluZm9ybWF0aW9uIGZvciBmcmFtZXMgcmVjZWl2ZWQuCisgKiAgICAgICBGb3IgaWVlZTgwMjExX3J4X21ndCwgeW91IG5lZWQgdG8gc2V0IGF0IGxlYXN0IHRoZSAnbGVuJyBwYXJhbWV0ZXIuCisgKi8KIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgewogCXUzMiBtYWNfdGltZTsKIAlzOCByc3NpOwpAQCAtMTA4OCw2ICsxMDg5LDcgQEAKIC8qIGllZWU4MDIxMV9yeC5jICovCiBleHRlcm4gaW50IGllZWU4MDIxMV9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKTsKKy8qIG1ha2Ugc3VyZSB0byBzZXQgc3RhdHMtPmxlbiAqLwogZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3J4X21ndChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhlYWRlciwKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2lwdjQvbmZfY29ubnRyYWNrX2lwdjQuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9pcHY0L25mX2Nvbm50cmFja19pcHY0LmgKaW5kZXggMjViMDgxYS4uOTE2ODQ0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2lwdjQvbmZfY29ubnRyYWNrX2lwdjQuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaXB2NC5oCkBAIC0zNyw3ICszNyw0IEBACiBzdHJ1Y3Qgc2tfYnVmZiAqCiBuZl9jdF9pcHY0X2N0X2dhdGhlcl9mcmFncyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAotLyogY2FsbCB0byBjcmVhdGUgYW4gZXhwbGljaXQgZGVwZW5kZW5jeSBvbiBuZl9jb25udHJhY2tfbDNwcm90b19pcHY0LiAqLwotZXh0ZXJuIHZvaWQgbmVlZF9pcF9jb25udHJhY2sodm9pZCk7Ci0KICNlbmRpZiAvKl9ORl9DT05OVFJBQ0tfSVBWNF9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAppbmRleCA2NGI4MmI3Li42ZDA3NWNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCkBAIC0yMjEsOSArMjIxLDYgQEAKIGV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqCiBfX25mX2Nvbm50cmFja19oZWxwZXJfZmluZF9ieW5hbWUoY29uc3QgY2hhciAqbmFtZSk7CiAKLS8qIGNhbGwgdG8gY3JlYXRlIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgb24gbmZfY29ubnRyYWNrLiAqLwotZXh0ZXJuIHZvaWQgbmVlZF9uZl9jb25udHJhY2sodm9pZCk7Ci0KIGV4dGVybiBpbnQgbmZfY3RfaW52ZXJ0X3R1cGxlcHIoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqaW52ZXJzZSwKIAkJCQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpvcmlnKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oCmluZGV4IDE0Y2U3OTAuLjUzMGVmMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmgKQEAgLTExMSw3ICsxMTEsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2RlZmluZSBORl9DVF9EVU1QX1RVUExFKHRwKQkJCQkJCSAgICBcCi1ERUJVR1AoInR1cGxlICVwOiAldSAldSAlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHggJWh1IC0+ICUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAlaHVcbiIsCQkJCQkgICAgXAorREVCVUdQKCJ0dXBsZSAlcDogJXUgJXUgIiBOSVA2X0ZNVCAiICVodSAtPiAiIE5JUDZfRk1UICIgJWh1XG4iLAkgICAgXAogCSh0cCksICh0cCktPnNyYy5sM251bSwgKHRwKS0+ZHN0LnByb3RvbnVtLAkJCSAgICBcCiAJTklQNigqKHN0cnVjdCBpbjZfYWRkciAqKSh0cCktPnNyYy51My5hbGwpLCBudG9ocygodHApLT5zcmMudS5hbGwpLCBcCiAJTklQNigqKHN0cnVjdCBpbjZfYWRkciAqKSh0cCktPmRzdC51My5hbGwpLCBudG9ocygodHApLT5kc3QudS5hbGwpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmggYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAppbmRleCA4ZjI0MTIxLi5hNTUzZjM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaApAQCAtMjI1LDEzICsyMjUsMTMgQEAKIAlpZiAoc2N0cF9kZWJ1Z19mbGFnKSB7IFwKIAkJaWYgKHNhZGRyLT5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsgXAogCQkJcHJpbnRrKEtFUk5fREVCVUcgXAotCQkJICAgICAgIGxlYWQgIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCIgdHJhaWwsIFwKKwkJCSAgICAgICBsZWFkIE5JUDZfRk1UIHRyYWlsLCBcCiAJCQkgICAgICAgbGVhZHBhcm0sIFwKIAkJCSAgICAgICBOSVA2KHNhZGRyLT52Ni5zaW42X2FkZHIpLCBcCiAJCQkgICAgICAgb3RoZXJwYXJtcyk7IFwKIAkJfSBlbHNlIHsgXAogCQkJcHJpbnRrKEtFUk5fREVCVUcgXAotCQkJICAgICAgIGxlYWQgIiV1LiV1LiV1LiV1IiB0cmFpbCwgXAorCQkJICAgICAgIGxlYWQgTklQUVVBRF9GTVQgdHJhaWwsIFwKIAkJCSAgICAgICBsZWFkcGFybSwgXAogCQkJICAgICAgIE5JUFFVQUQoc2FkZHItPnY0LnNpbl9hZGRyLnNfYWRkciksIFwKIAkJCSAgICAgICBvdGhlcnBhcm1zKTsgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGlwYy90aXBjLmggYi9pbmNsdWRlL25ldC90aXBjL3RpcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTY2NjA4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvdGlwYy90aXBjLmgKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBpbmNsdWRlL25ldC90aXBjL3RpcGMuaDogTWFpbiBpbmNsdWRlIGZpbGUgZm9yIFRJUEMgdXNlcnMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTkVUX1RJUENfSF8KKyNkZWZpbmUgX05FVF9USVBDX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC90aXBjLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKy8qIAorICogTmF0aXZlIEFQSQorICovCisKKy8qCisgKiBUSVBDIG9wZXJhdGluZyBtb2RlIHJvdXRpbmVzCisgKi8KKwordTMyIHRpcGNfZ2V0X2FkZHIodm9pZCk7CisKKyNkZWZpbmUgVElQQ19OT1RfUlVOTklORyAgMAorI2RlZmluZSBUSVBDX05PREVfTU9ERSAgICAxCisjZGVmaW5lIFRJUENfTkVUX01PREUgICAgIDIKKwordHlwZWRlZiB2b2lkICgqdGlwY19tb2RlX2V2ZW50KSh2b2lkICp1c3JfaGFuZGxlLCBpbnQgbW9kZSwgdTMyIGFkZHIpOworCitpbnQgdGlwY19hdHRhY2godW5zaWduZWQgaW50ICp1c2VycmVmLCB0aXBjX21vZGVfZXZlbnQsIHZvaWQgKnVzcl9oYW5kbGUpOworCit2b2lkIHRpcGNfZGV0YWNoKHVuc2lnbmVkIGludCB1c2VycmVmKTsKKworaW50IHRpcGNfZ2V0X21vZGUodm9pZCk7CisKKy8qCisgKiBUSVBDIHBvcnQgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCisgKi8KKwordHlwZWRlZiB2b2lkICgqdGlwY19tc2dfZXJyX2V2ZW50KSAodm9pZCAqdXNyX2hhbmRsZSwKKwkJCQkgICAgdTMyIHBvcnRyZWYsCisJCQkJICAgIHN0cnVjdCBza19idWZmICoqYnVmLAorCQkJCSAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkYXRhLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkgICAgaW50IHJlYXNvbiwgCisJCQkJICAgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqYXR0bXB0X2Rlc3RpZCk7CisKK3R5cGVkZWYgdm9pZCAoKnRpcGNfbmFtZWRfbXNnX2Vycl9ldmVudCkgKHZvaWQgKnVzcl9oYW5kbGUsCisJCQkJCSAgdTMyIHBvcnRyZWYsCisJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKipidWYsCisJCQkJCSAgdW5zaWduZWQgY2hhciBjb25zdCAqZGF0YSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkJICBpbnQgcmVhc29uLCAKKwkJCQkJICBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqYXR0bXB0X2Rlc3QpOworCit0eXBlZGVmIHZvaWQgKCp0aXBjX2Nvbm5fc2h1dGRvd25fZXZlbnQpICh2b2lkICp1c3JfaGFuZGxlLAorCQkJCQkgIHUzMiBwb3J0cmVmLAorCQkJCQkgIHN0cnVjdCBza19idWZmICoqYnVmLAorCQkJCQkgIHVuc2lnbmVkIGNoYXIgY29uc3QgKmRhdGEsCisJCQkJCSAgdW5zaWduZWQgaW50IHNpemUsCisJCQkJCSAgaW50IHJlYXNvbik7CisKK3R5cGVkZWYgdm9pZCAoKnRpcGNfbXNnX2V2ZW50KSAodm9pZCAqdXNyX2hhbmRsZSwKKwkJCQl1MzIgcG9ydHJlZiwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqKmJ1ZiwKKwkJCQl1bnNpZ25lZCBjaGFyIGNvbnN0ICpkYXRhLAorCQkJCXVuc2lnbmVkIGludCBzaXplLAorCQkJCXVuc2lnbmVkIGludCBpbXBvcnRhbmNlLCAKKwkJCQlzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWdpbik7CisKK3R5cGVkZWYgdm9pZCAoKnRpcGNfbmFtZWRfbXNnX2V2ZW50KSAodm9pZCAqdXNyX2hhbmRsZSwKKwkJCQkgICAgICB1MzIgcG9ydHJlZiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKmJ1ZiwKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkYXRhLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlLCAKKwkJCQkgICAgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWcsCisJCQkJICAgICAgc3RydWN0IHRpcGNfbmFtZV9zZXEgY29uc3QgKmRlc3QpOworCit0eXBlZGVmIHZvaWQgKCp0aXBjX2Nvbm5fbXNnX2V2ZW50KSAodm9pZCAqdXNyX2hhbmRsZSwKKwkJCQkgICAgIHUzMiBwb3J0cmVmLAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKipidWYsCisJCQkJICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkYXRhLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHNpemUpOworCit0eXBlZGVmIHZvaWQgKCp0aXBjX2NvbnRpbnVlX2V2ZW50KSAodm9pZCAqdXNyX2hhbmRsZSwgCisJCQkJICAgICB1MzIgcG9ydHJlZik7CisKK2ludCB0aXBjX2NyZWF0ZXBvcnQodW5zaWduZWQgaW50IHRpcGNfdXNlciwgCisJCSAgICB2b2lkICp1c3JfaGFuZGxlLCAKKwkJICAgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlLCAKKwkJICAgIHRpcGNfbXNnX2Vycl9ldmVudCBlcnJvcl9jYiwgCisJCSAgICB0aXBjX25hbWVkX21zZ19lcnJfZXZlbnQgbmFtZWRfZXJyb3JfY2IsIAorCQkgICAgdGlwY19jb25uX3NodXRkb3duX2V2ZW50IGNvbm5fZXJyb3JfY2IsIAorCQkgICAgdGlwY19tc2dfZXZlbnQgbWVzc2FnZV9jYiwgCisJCSAgICB0aXBjX25hbWVkX21zZ19ldmVudCBuYW1lZF9tZXNzYWdlX2NiLCAKKwkJICAgIHRpcGNfY29ubl9tc2dfZXZlbnQgY29ubl9tZXNzYWdlX2NiLCAKKwkJICAgIHRpcGNfY29udGludWVfZXZlbnQgY29udGludWVfZXZlbnRfY2IsLyogTWF5IGJlIHplcm8gKi8KKwkJICAgIHUzMiAqcG9ydHJlZik7CisKK2ludCB0aXBjX2RlbGV0ZXBvcnQodTMyIHBvcnRyZWYpOworCitpbnQgdGlwY19vd25pZGVudGl0eSh1MzIgcG9ydHJlZiwgc3RydWN0IHRpcGNfcG9ydGlkICpwb3J0KTsKKworaW50IHRpcGNfcG9ydGltcG9ydGFuY2UodTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCAqaW1wb3J0YW5jZSk7CitpbnQgdGlwY19zZXRfcG9ydGltcG9ydGFuY2UodTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlKTsKKworaW50IHRpcGNfcG9ydHVucmVsaWFibGUodTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCAqaXN1bnJlbGlhYmxlKTsKK2ludCB0aXBjX3NldF9wb3J0dW5yZWxpYWJsZSh1MzIgcG9ydHJlZiwgdW5zaWduZWQgaW50IGlzdW5yZWxpYWJsZSk7CisKK2ludCB0aXBjX3BvcnR1bnJldHVybmFibGUodTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCAqaXN1bnJldHVybmFibGUpOworaW50IHRpcGNfc2V0X3BvcnR1bnJldHVybmFibGUodTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCBpc3VucmV0dXJuYWJsZSk7CisKK2ludCB0aXBjX3B1Ymxpc2godTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCBzY29wZSwgCisJCSBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqbmFtZV9zZXEpOworaW50IHRpcGNfd2l0aGRyYXcodTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCBzY29wZSwKKwkJICBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqbmFtZV9zZXEpOyAvKiAwOiBhbGwgKi8KKworaW50IHRpcGNfY29ubmVjdDJwb3J0KHUzMiBwb3J0cmVmLCBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKnBvcnQpOworCitpbnQgdGlwY19kaXNjb25uZWN0KHUzMiBwb3J0cmVmKTsKKworaW50IHRpcGNfc2h1dGRvd24odTMyIHJlZik7IC8qIFNlbmRzIFNIVVRET1dOIG1zZyAqLworCitpbnQgdGlwY19pc2Nvbm5lY3RlZCh1MzIgcG9ydHJlZiwgaW50ICppc2Nvbm5lY3RlZCk7CisKK2ludCB0aXBjX3BlZXIodTMyIHBvcnRyZWYsIHN0cnVjdCB0aXBjX3BvcnRpZCAqcGVlcik7CisKK2ludCB0aXBjX3JlZl92YWxpZCh1MzIgcG9ydHJlZik7IAorCisvKgorICogVElQQyBtZXNzYWdpbmcgcm91dGluZXMKKyAqLworCisjZGVmaW5lIFRJUENfUE9SVF9JTVBPUlRBTkNFIDEwMAkvKiBzZW5kIHVzaW5nIGN1cnJlbnQgcG9ydCBzZXR0aW5nICovCisKKworaW50IHRpcGNfc2VuZCh1MzIgcG9ydHJlZiwKKwkgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NlY3QsCisJICAgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCk7CisKK2ludCB0aXBjX3NlbmRfYnVmKHUzMiBwb3J0cmVmLAorCQkgIHN0cnVjdCBza19idWZmICpidWYsCisJCSAgdW5zaWduZWQgaW50IGRzeik7CisKK2ludCB0aXBjX3NlbmQybmFtZSh1MzIgcG9ydHJlZiwgCisJCSAgIHN0cnVjdCB0aXBjX25hbWUgY29uc3QgKm5hbWUsIAorCQkgICB1MzIgZG9tYWluLAkvKiAwOm93biB6b25lICovCisJCSAgIHVuc2lnbmVkIGludCBudW1fc2VjdCwKKwkJICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCk7CisKK2ludCB0aXBjX3NlbmRfYnVmMm5hbWUodTMyIHBvcnRyZWYsCisJCSAgICAgICBzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpuYW1lLAorCQkgICAgICAgdTMyIGRvbWFpbiwKKwkJICAgICAgIHN0cnVjdCBza19idWZmICpidWYsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgZHN6KTsKKworaW50IHRpcGNfZm9yd2FyZDJuYW1lKHUzMiBwb3J0cmVmLCAKKwkJICAgICAgc3RydWN0IHRpcGNfbmFtZSBjb25zdCAqbmFtZSwgCisJCSAgICAgIHUzMiBkb21haW4sICAgLyowOiBvd24gem9uZSAqLworCQkgICAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudCwKKwkJICAgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCwKKwkJICAgICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnaW4sCisJCSAgICAgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlKTsKKworaW50IHRpcGNfZm9yd2FyZF9idWYybmFtZSh1MzIgcG9ydHJlZiwKKwkJCSAgc3RydWN0IHRpcGNfbmFtZSBjb25zdCAqbmFtZSwKKwkJCSAgdTMyIGRvbWFpbiwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKKwkJCSAgdW5zaWduZWQgaW50IGRzeiwKKwkJCSAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnLAorCQkJICB1bnNpZ25lZCBpbnQgaW1wb3J0YW5jZSk7CisKK2ludCB0aXBjX3NlbmQycG9ydCh1MzIgcG9ydHJlZiwKKwkJICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpkZXN0LAorCQkgICB1bnNpZ25lZCBpbnQgbnVtX3NlY3QsCisJCSAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QpOworCitpbnQgdGlwY19zZW5kX2J1ZjJwb3J0KHUzMiBwb3J0cmVmLAorCQkgICAgICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpkZXN0LAorCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKKwkJICAgICAgIHVuc2lnbmVkIGludCBkc3opOworCitpbnQgdGlwY19mb3J3YXJkMnBvcnQodTMyIHBvcnRyZWYsCisJCSAgICAgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqZGVzdCwKKwkJICAgICAgdW5zaWduZWQgaW50IG51bV9zZWN0LAorCQkgICAgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LAorCQkgICAgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWdpbiwKKwkJICAgICAgdW5zaWduZWQgaW50IGltcG9ydGFuY2UpOworCitpbnQgdGlwY19mb3J3YXJkX2J1ZjJwb3J0KHUzMiBwb3J0cmVmLAorCQkJICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKmRlc3QsCisJCQkgIHN0cnVjdCBza19idWZmICpidWYsCisJCQkgIHVuc2lnbmVkIGludCBkc3osCisJCQkgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZywKKwkJCSAgdW5zaWduZWQgaW50IGltcG9ydGFuY2UpOworCitpbnQgdGlwY19tdWx0aWNhc3QodTMyIHBvcnRyZWYsIAorCQkgICBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqc2VxLCAKKwkJICAgdTMyIGRvbWFpbiwJLyogMDpvd24gem9uZSAqLworCQkgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudCwKKwkJICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2cpOworCisjaWYgMAoraW50IHRpcGNfbXVsdGljYXN0X2J1Zih1MzIgcG9ydHJlZiwgCisJCSAgICAgICBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqc2VxLCAKKwkJICAgICAgIHUzMiBkb21haW4sCS8qIDA6b3duIHpvbmUgKi8KKwkJICAgICAgIHZvaWQgKmJ1ZiwKKwkJICAgICAgIHVuc2lnbmVkIGludCBzaXplKTsKKyNlbmRpZgorCisvKgorICogVElQQyBzdWJzY3JpcHRpb24gcm91dGluZXMKKyAqLworCitpbnQgdGlwY19pc3B1Ymxpc2hlZChzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpuYW1lKTsKKworLyoKKyAqIEdldCBudW1iZXIgb2YgYXZhaWxhYmxlIG5vZGVzIHdpdGhpbiBzcGVjaWZpZWQgZG9tYWluIChleGNsdWRpbmcgb3duIG5vZGUpCisgKi8KKwordW5zaWduZWQgaW50IHRpcGNfYXZhaWxhYmxlX25vZGVzKGNvbnN0IHUzMiBkb21haW4pOworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90aXBjL3RpcGNfYmVhcmVyLmggYi9pbmNsdWRlL25ldC90aXBjL3RpcGNfYmVhcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4NjA3YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19iZWFyZXIuaApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIGluY2x1ZGUvbmV0L3RpcGMvdGlwY19iZWFyZXIuaDogSW5jbHVkZSBmaWxlIGZvciBwcml2aWxlZ2VkIGFjY2VzcyB0byBUSVBDIGJlYXJlcnMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTkVUX1RJUENfQkVBUkVSX0hfCisjZGVmaW5lIF9ORVRfVElQQ19CRUFSRVJfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3RpcGNfY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworLyoKKyAqIElkZW50aWZpZXJzIG9mIHN1cHBvcnRlZCBUSVBDIG1lZGlhIHR5cGVzCisgKi8KKworI2RlZmluZSBUSVBDX01FRElBX1RZUEVfRVRICTEKKworc3RydWN0IHRpcGNfbWVkaWFfYWRkciB7CisJX191MzIgIHR5cGU7CisJdW5pb24geworCQlfX3U4ICAgZXRoX2FkZHJbNl07CS8qIEV0aGVybmV0IGJlYXJlciAqLyAKKyNpZiAwCisJCS8qIFByb3RvdHlwZXMgZm9yIG90aGVyIHBvc3NpYmxlIGJlYXJlciB0eXBlcyAqLworCisJCXN0cnVjdCB7CisJCQlfX3UxNiBzaW5fZmFtaWx5OworCQkJX191MTYgc2luX3BvcnQ7CisJCQlzdHJ1Y3QgeworCQkJCV9fdTMyIHNfYWRkcjsKKwkJCX0gc2luX2FkZHI7CisJCQljaGFyIHBhZFs0XTsKKwkJfSBhZGRyX2luOwkJLyogSVAtYmFzZWQgYmVhcmVyICovCisJCV9fdTE2ICBzb2NrX2Rlc2NyOwkvKiBnZW5lcmljIHNvY2tldCBiZWFyZXIgKi8KKyNlbmRpZgorCX0gZGV2X2FkZHI7Cit9OworCisvKioKKyAqIHN0cnVjdCB0aXBjX2JlYXJlciAtIFRJUEMgYmVhcmVyIGluZm8gYXZhaWxhYmxlIHRvIHByaXZpbGVnZWQgdXNlcnMKKyAqIEB1c3JfaGFuZGxlOiBwb2ludGVyIHRvIGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkIGluZm9ybWF0aW9uIGFib3V0IGJlYXJlcgorICogQG10dTogbWF4IHBhY2tldCBzaXplIGJlYXJlciBjYW4gc3VwcG9ydAorICogQGJsb2NrZWQ6IG5vbi16ZXJvIGlmIGJlYXJlciBpcyBibG9ja2VkCisgKiBAbG9jazogc3BpbmxvY2sgZm9yIGNvbnRyb2xsaW5nIGFjY2VzcyB0byBiZWFyZXIKKyAqIEBhZGRyOiBtZWRpYS1zcGVjaWZpYyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBiZWFyZXIKKyAqIEBuYW1lOiBiZWFyZXIgbmFtZSAoZm9ybWF0ID0gbWVkaWE6aW50ZXJmYWNlKQorICogCisgKiBOb3RlOiBUSVBDIGluaXRpYWxpemVzICJuYW1lIiBhbmQgImxvY2siIGZpZWxkczsgdXNlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqIGluaXRpYWxpemF0aW9uIGFsbCBvdGhlciBmaWVsZHMgd2hlbiBhIGJlYXJlciBpcyBlbmFibGVkLgorICovCisKK3N0cnVjdCB0aXBjX2JlYXJlciB7CisJdm9pZCAqdXNyX2hhbmRsZTsKKwl1MzIgbXR1OworCWludCBibG9ja2VkOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIGFkZHI7CisJY2hhciBuYW1lW1RJUENfTUFYX0JFQVJFUl9OQU1FXTsKK307CisKKworaW50ICB0aXBjX3JlZ2lzdGVyX21lZGlhKHUzMiBtZWRpYV90eXBlLAorCQkJIGNoYXIgKm1lZGlhX25hbWUsIAorCQkJIGludCAoKmVuYWJsZSkoc3RydWN0IHRpcGNfYmVhcmVyICopLCAKKwkJCSB2b2lkICgqZGlzYWJsZSkoc3RydWN0IHRpcGNfYmVhcmVyICopLCAKKwkJCSBpbnQgKCpzZW5kX21zZykoc3RydWN0IHNrX2J1ZmYgKiwgCisJCQkJCSBzdHJ1Y3QgdGlwY19iZWFyZXIgKiwKKwkJCQkJIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKiksIAorCQkJIGNoYXIgKigqYWRkcjJzdHIpKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsCisJCQkJCSAgIGNoYXIgKnN0cl9idWYsCisJCQkJCSAgIGludCBzdHJfc2l6ZSksCisJCQkgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYmNhc3RfYWRkciwKKwkJCSBjb25zdCB1MzIgYmVhcmVyX3ByaW9yaXR5LAorCQkJIGNvbnN0IHUzMiBsaW5rX3RvbGVyYW5jZSwgIC8qIFttc10gKi8KKwkJCSBjb25zdCB1MzIgc2VuZF93aW5kb3dfbGltaXQpOyAKKwordm9pZCB0aXBjX3JlY3ZfbXNnKHN0cnVjdCBza19idWZmICpidWYsIHN0cnVjdCB0aXBjX2JlYXJlciAqdGJfcHRyKTsKKworaW50ICB0aXBjX2Jsb2NrX2JlYXJlcihjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgdGlwY19jb250aW51ZShzdHJ1Y3QgdGlwY19iZWFyZXIgKnRiX3B0cik7IAorCitpbnQgdGlwY19lbmFibGVfYmVhcmVyKGNvbnN0IGNoYXIgKmJlYXJlcl9uYW1lLCB1MzIgYmNhc3Rfc2NvcGUsIHUzMiBwcmlvcml0eSk7CitpbnQgdGlwY19kaXNhYmxlX2JlYXJlcihjb25zdCBjaGFyICpuYW1lKTsKKworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90aXBjL3RpcGNfbXNnLmggYi9pbmNsdWRlL25ldC90aXBjL3RpcGNfbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwOTZlZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19tc2cuaApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIGluY2x1ZGUvbmV0L3RpcGMvdGlwY19tc2cuaDogSW5jbHVkZSBmaWxlIGZvciBwcml2aWxlZ2VkIGFjY2VzcyB0byBUSVBDIG1lc3NhZ2UgaGVhZGVycworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9ORVRfVElQQ19NU0dfSF8KKyNkZWZpbmUgX05FVF9USVBDX01TR19IXworCisjaWZkZWYgX19LRVJORUxfXworCitzdHJ1Y3QgdGlwY19tc2cgeworCXUzMiBoZHJbMTVdOworfTsKKworCisvKgorCQlUSVBDIHVzZXIgZGF0YSBtZXNzYWdlIGhlYWRlciBmb3JtYXQsIHZlcnNpb24gMjoKKworCisgICAgICAgMSAwIDkgOCA3IDYgNSA0fDMgMiAxIDAgOSA4IDcgNnw1IDQgMyAyIDEgMCA5IDh8NyA2IDUgNCAzIDIgMSAwIAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHcwOnx2ZXJzIHwgdXNlciAgfGhkciBzeiB8bnxkfHN8LXwgICAgICAgICAgbWVzc2FnZSBzaXplICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzE6fG1zdHlwfCBlcnJvciB8cmVyIGNudHxsc2N8b3B0IHB8ICAgICAgYnJvYWRjYXN0IGFjayBubyAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3Mjp8ICAgICAgICBsaW5rIGxldmVsIGFjayBubyAgICAgIHwgICBicm9hZGNhc3QvbGluayBsZXZlbCBzZXEgbm8gfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHczOnwgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzQ6fCAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hdGluZyBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3NTp8ICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgICAgCisgICB3Njp8ICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmF0aW5nIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHc3OnwgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzg6fCAgICAgICAgICAgIG5hbWUgdHlwZSAvIHRyYW5zcG9ydCBzZXF1ZW5jZSBudW1iZXIgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3OTp8ICAgICAgICAgICAgICBuYW1lIGluc3RhbmNlL211bHRpY2FzdCBsb3dlciBib3VuZCAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgICAgCisgICB3QTp8ICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3QgdXBwZXIgYm91bmQgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgICAgCisgICAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLworICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCisqLworCisjZGVmaW5lIFRJUENfQ09OTl9NU0cJMAorI2RlZmluZSBUSVBDX01DQVNUX01TRwkxCisjZGVmaW5lIFRJUENfTkFNRURfTVNHCTIKKyNkZWZpbmUgVElQQ19ESVJFQ1RfTVNHCTMKKworCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfd29yZChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBwb3MpCit7CisJcmV0dXJuIG50b2hsKG0tPmhkcltwb3NdKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2JpdHMoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgdywgdTMyIHBvcywgdTMyIG1hc2spCit7CisJcmV0dXJuIChtc2dfd29yZChtLCB3KSA+PiBwb3MpICYgbWFzazsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2ltcG9ydGFuY2Uoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAwLCAyNSwgMHhmKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2hkcl9zeihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDAsIDIxLCAweGYpIDw8IDI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1zZ19zaG9ydChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIChtc2dfaGRyX3N6KG0pID09IDI0KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3NpemUoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAwLCAwLCAweDFmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2RhdGFfc3ooc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiAobXNnX3NpemUobSkgLSBtc2dfaGRyX3N6KG0pKTsKK30KKworc3RhdGljIGlubGluZSB1bmNoYXIgKm1zZ19kYXRhKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gKCh1bmNoYXIgKiltKSArIG1zZ19oZHJfc3oobSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ190eXBlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMSwgMjksIDB4Nyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19kaXJlY3Qoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiAobXNnX3R5cGUobSkgPT0gVElQQ19ESVJFQ1RfTVNHKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX25hbWVkKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gKG1zZ190eXBlKG0pID09IFRJUENfTkFNRURfTVNHKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX21jYXN0KHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gKG1zZ190eXBlKG0pID09IFRJUENfTUNBU1RfTVNHKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2Nvbm5lY3RlZChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIChtc2dfdHlwZShtKSA9PSBUSVBDX0NPTk5fTVNHKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2VycmNvZGUoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAxLCAyNSwgMHhmKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3ByZXZub2RlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgMyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19vcmlncG9ydChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfZGVzdHBvcnQoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfd29yZChtLCA1KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX21jX25ldGlkKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgNSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19vcmlnbm9kZShzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJaWYgKGxpa2VseShtc2dfc2hvcnQobSkpKQorCQlyZXR1cm4gbXNnX3ByZXZub2RlKG0pOworCXJldHVybiBtc2dfd29yZChtLCA2KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2Rlc3Rub2RlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgNyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19uYW1ldHlwZShzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbmFtZWluc3Qoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfd29yZChtLCA5KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX25hbWVsb3dlcihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19uYW1laW5zdChtKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX25hbWV1cHBlcihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDEwKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICptc2dfb3B0aW9ucyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiAqbGVuKQoreworCXUzMiBwb3MgPSBtc2dfYml0cyhtLCAxLCAxNiwgMHg3KTsKKworCWlmICghcG9zKQorCQlyZXR1cm4gMDsKKwlwb3MgPSAocG9zICogNCkgKyAyODsKKwkqbGVuID0gbXNnX2hkcl9zeihtKSAtIHBvczsKKwlyZXR1cm4gKGNoYXIgKikmbS0+aGRyW3Bvcy80XTsKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGlwYy90aXBjX3BvcnQuaCBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzYmJhNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19wb3J0LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBpbmNsdWRlL25ldC90aXBjL3RpcGNfcG9ydC5oOiBJbmNsdWRlIGZpbGUgZm9yIHByaXZpbGVnZWQgYWNjZXNzIHRvIFRJUEMgcG9ydHMKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTkVUX1RJUENfUE9SVF9IXworI2RlZmluZSBfTkVUX1RJUENfUE9SVF9IXworCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvdGlwYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC90aXBjL3RpcGNfbXNnLmg+CisKKyNkZWZpbmUgVElQQ19GTE9XX0NPTlRST0xfV0lOIDUxMgorCisvKioKKyAqIHN0cnVjdCB0aXBjX3BvcnQgLSBuYXRpdmUgVElQQyBwb3J0IGluZm8gYXZhaWxhYmxlIHRvIHByaXZpbGVnZWQgdXNlcnMKKyAqIEB1c3JfaGFuZGxlOiBwb2ludGVyIHRvIGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkIGluZm9ybWF0aW9uIGFib3V0IHBvcnQKKyAqIEBsb2NrOiBwb2ludGVyIHRvIHNwaW5sb2NrIGZvciBjb250cm9sbGluZyBhY2Nlc3MgdG8gcG9ydAorICogQGNvbm5lY3RlZDogbm9uLXplcm8gaWYgcG9ydCBpcyBjdXJyZW50bHkgY29ubmVjdGVkIHRvIGEgcGVlciBwb3J0CisgKiBAY29ubl90eXBlOiBUSVBDIHR5cGUgdXNlZCB3aGVuIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkCisgKiBAY29ubl9pbnN0YW5jZTogVElQQyBpbnN0YW5jZSB1c2VkIHdoZW4gY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQKKyAqIEBjb25uX3VuYWNrZWQ6IG51bWJlciBvZiB1bmFja25vd2xlZGdlZCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHBlZXIgcG9ydAorICogQHB1Ymxpc2hlZDogbm9uLXplcm8gaWYgcG9ydCBoYXMgb25lIG9yIG1vcmUgYXNzb2NpYXRlZCBuYW1lcworICogQGNvbmdlc3RlZDogbm9uLXplcm8gaWYgY2Fubm90IHNlbmQgYmVjYXVzZSBvZiBsaW5rIG9yIHBvcnQgY29uZ2VzdGlvbgorICogQHJlZjogdW5pcXVlIHJlZmVyZW5jZSB0byBwb3J0IGluIFRJUEMgb2JqZWN0IHJlZ2lzdHJ5CisgKiBAcGhkcjogcHJlZm9ybWF0dGVkIG1lc3NhZ2UgaGVhZGVyIHVzZWQgd2hlbiBzZW5kaW5nIG1lc3NhZ2VzCisgKi8KKworc3RydWN0IHRpcGNfcG9ydCB7CisgICAgICAgIHZvaWQgKnVzcl9oYW5kbGU7CisgICAgICAgIHNwaW5sb2NrX3QgKmxvY2s7CisJaW50IGNvbm5lY3RlZDsKKyAgICAgICAgdTMyIGNvbm5fdHlwZTsKKyAgICAgICAgdTMyIGNvbm5faW5zdGFuY2U7CisJdTMyIGNvbm5fdW5hY2tlZDsKKwlpbnQgcHVibGlzaGVkOworCXUzMiBjb25nZXN0ZWQ7CisJdTMyIHJlZjsKKwlzdHJ1Y3QgdGlwY19tc2cgcGhkcjsKK307CisKKworLyoqCisgKiB0aXBjX2NyZWF0ZXBvcnRfcmF3IC0gY3JlYXRlIGEgbmF0aXZlIFRJUEMgcG9ydCBhbmQgcmV0dXJuIGl0J3MgcmVmZXJlbmNlCisgKgorICogTm90ZTogJ2Rpc3BhdGNoZXInIGFuZCAnd2FrZXVwJyBkZWxpdmVyIGEgbG9ja2VkIHBvcnQuCisgKi8KKwordTMyIHRpcGNfY3JlYXRlcG9ydF9yYXcodm9pZCAqdXNyX2hhbmRsZSwKKwkJCXUzMiAoKmRpc3BhdGNoZXIpKHN0cnVjdCB0aXBjX3BvcnQgKiwgc3RydWN0IHNrX2J1ZmYgKiksCisJCQl2b2lkICgqd2FrZXVwKShzdHJ1Y3QgdGlwY19wb3J0ICopLAorCQkJY29uc3QgdTMyIGltcG9ydGFuY2UpOworCisvKgorICogdGlwY19zZXRfbXNnX29wdGlvbigpOiBwb3J0IG11c3QgYmUgbG9ja2VkLgorICovCitpbnQgdGlwY19zZXRfbXNnX29wdGlvbihzdHJ1Y3QgdGlwY19wb3J0ICp0cF9wdHIsCisJCQljb25zdCBjaGFyICpvcHQsCisJCQljb25zdCB1MzIgbGVuKTsKKworaW50IHRpcGNfcmVqZWN0X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgZXJyKTsKKworaW50IHRpcGNfc2VuZF9idWZfZmFzdChzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgZGVzdG5vZGUpOworCit2b2lkIHRpcGNfYWNrbm93bGVkZ2UodTMyIHBvcnRfcmVmLHUzMiBhY2spOworCitzdHJ1Y3QgdGlwY19wb3J0ICp0aXBjX2dldF9wb3J0KGNvbnN0IHUzMiByZWYpOworCit2b2lkICp0aXBjX2dldF9oYW5kbGUoY29uc3QgdTMyIHJlZik7CisKKworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaCBiL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCmluZGV4IGE3ZjRjMzUuLjIyZmM4ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCisrKyBiL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCkBAIC04OCw3ICs4OCw2IEBACiAKIHN0cnVjdCBpYl9kZXZpY2VfYXR0ciB7CiAJdTY0CQkJZndfdmVyOwotCV9fYmU2NAkJCW5vZGVfZ3VpZDsKIAlfX2JlNjQJCQlzeXNfaW1hZ2VfZ3VpZDsKIAl1NjQJCQltYXhfbXJfc2l6ZTsKIAl1NjQJCQlwYWdlX3NpemVfY2FwOwpAQCAtOTUxLDYgKzk1MCw3IEBACiAJdTY0CQkJICAgICB1dmVyYnNfY21kX21hc2s7CiAJaW50CQkJICAgICB1dmVyYnNfYWJpX3ZlcjsKIAorCV9fYmU2NAkJCSAgICAgbm9kZV9ndWlkOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZV90eXBlOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19wb3J0X2NudDsKIH07CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCBmMDczYTI0Li4wNGNjYWIwIDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTI3NSw3ICsyNzUsNyBAQAogICogVGhlIG51bWJlciBvZiBvdmVycnVucyBpcyBhZGRlZCB0byB0aGUgb3ZlcnJ1biBmaWVsZC4KICAqLwogdW5zaWduZWQgbG9uZwotaHJ0aW1lcl9mb3J3YXJkKHN0cnVjdCBocnRpbWVyICp0aW1lciwgY29uc3Qga3RpbWVfdCBpbnRlcnZhbCkKK2hydGltZXJfZm9yd2FyZChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIGt0aW1lX3QgaW50ZXJ2YWwpCiB7CiAJdW5zaWduZWQgbG9uZyBvcnVuID0gMTsKIAlrdGltZV90IGRlbHRhLCBub3c7CkBAIC0yODcsNiArMjg3LDkgQEAKIAlpZiAoZGVsdGEudHY2NCA8IDApCiAJCXJldHVybiAwOwogCisJaWYgKGludGVydmFsLnR2NjQgPCB0aW1lci0+YmFzZS0+cmVzb2x1dGlvbi50djY0KQorCQlpbnRlcnZhbC50djY0ID0gdGltZXItPmJhc2UtPnJlc29sdXRpb24udHY2NDsKKwogCWlmICh1bmxpa2VseShkZWx0YS50djY0ID49IGludGVydmFsLnR2NjQpKSB7CiAJCW5zZWNfdCBpbmNyID0ga3RpbWVfdG9fbnMoaW50ZXJ2YWwpOwogCkBAIC0zMTQsNyArMzE3LDYgQEAKIHN0YXRpYyB2b2lkIGVucXVldWVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIHN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UpCiB7CiAJc3RydWN0IHJiX25vZGUgKipsaW5rID0gJmJhc2UtPmFjdGl2ZS5yYl9ub2RlOwotCXN0cnVjdCBsaXN0X2hlYWQgKnByZXYgPSAmYmFzZS0+cGVuZGluZzsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKIAlzdHJ1Y3QgaHJ0aW1lciAqZW50cnk7CiAKQEAgLTMzMCwyMiArMzMyLDIzIEBACiAJCSAqLwogCQlpZiAodGltZXItPmV4cGlyZXMudHY2NCA8IGVudHJ5LT5leHBpcmVzLnR2NjQpCiAJCQlsaW5rID0gJigqbGluayktPnJiX2xlZnQ7Ci0JCWVsc2UgeworCQllbHNlCiAJCQlsaW5rID0gJigqbGluayktPnJiX3JpZ2h0OwotCQkJcHJldiA9ICZlbnRyeS0+bGlzdDsKLQkJfQogCX0KIAogCS8qCi0JICogSW5zZXJ0IHRoZSB0aW1lciB0byB0aGUgcmJ0cmVlIGFuZCB0byB0aGUgc29ydGVkIGxpc3Q6CisJICogSW5zZXJ0IHRoZSB0aW1lciB0byB0aGUgcmJ0cmVlIGFuZCBjaGVjayB3aGV0aGVyIGl0CisJICogcmVwbGFjZXMgdGhlIGZpcnN0IHBlbmRpbmcgdGltZXIKIAkgKi8KIAlyYl9saW5rX25vZGUoJnRpbWVyLT5ub2RlLCBwYXJlbnQsIGxpbmspOwogCXJiX2luc2VydF9jb2xvcigmdGltZXItPm5vZGUsICZiYXNlLT5hY3RpdmUpOwotCWxpc3RfYWRkKCZ0aW1lci0+bGlzdCwgcHJldik7CiAKIAl0aW1lci0+c3RhdGUgPSBIUlRJTUVSX1BFTkRJTkc7Ci19CiAKKwlpZiAoIWJhc2UtPmZpcnN0IHx8IHRpbWVyLT5leHBpcmVzLnR2NjQgPAorCSAgICByYl9lbnRyeShiYXNlLT5maXJzdCwgc3RydWN0IGhydGltZXIsIG5vZGUpLT5leHBpcmVzLnR2NjQpCisJCWJhc2UtPmZpcnN0ID0gJnRpbWVyLT5ub2RlOworfQogCiAvKgogICogX19yZW1vdmVfaHJ0aW1lciAtIGludGVybmFsIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHRpbWVyCkBAIC0zNTUsOSArMzU4LDExIEBACiBzdGF0aWMgdm9pZCBfX3JlbW92ZV9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lciwgc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZSkKIHsKIAkvKgotCSAqIFJlbW92ZSB0aGUgdGltZXIgZnJvbSB0aGUgc29ydGVkIGxpc3QgYW5kIGZyb20gdGhlIHJidHJlZToKKwkgKiBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIHJidHJlZSBhbmQgcmVwbGFjZSB0aGUKKwkgKiBmaXJzdCBlbnRyeSBwb2ludGVyIGlmIG5lY2Vzc2FyeS4KIAkgKi8KLQlsaXN0X2RlbCgmdGltZXItPmxpc3QpOworCWlmIChiYXNlLT5maXJzdCA9PSAmdGltZXItPm5vZGUpCisJCWJhc2UtPmZpcnN0ID0gcmJfbmV4dCgmdGltZXItPm5vZGUpOwogCXJiX2VyYXNlKCZ0aW1lci0+bm9kZSwgJmJhc2UtPmFjdGl2ZSk7CiB9CiAKQEAgLTUxNiw5ICs1MjEsOCBAQAogewogCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2VzOwogCi0JdHAtPnR2X3NlYyA9IDA7CiAJYmFzZXMgPSBwZXJfY3B1KGhydGltZXJfYmFzZXMsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOwotCXRwLT50dl9uc2VjID0gYmFzZXNbd2hpY2hfY2xvY2tdLnJlc29sdXRpb247CisJKnRwID0ga3RpbWVfdG9fdGltZXNwZWMoYmFzZXNbd2hpY2hfY2xvY2tdLnJlc29sdXRpb24pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MjksMTYgKzUzMywxNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHJ1bl9ocnRpbWVyX3F1ZXVlKHN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UpCiB7CiAJa3RpbWVfdCBub3cgPSBiYXNlLT5nZXRfdGltZSgpOworCXN0cnVjdCByYl9ub2RlICpub2RlOwogCiAJc3Bpbl9sb2NrX2lycSgmYmFzZS0+bG9jayk7CiAKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmJhc2UtPnBlbmRpbmcpKSB7CisJd2hpbGUgKChub2RlID0gYmFzZS0+Zmlyc3QpKSB7CiAJCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKIAkJaW50ICgqZm4pKHZvaWQgKik7CiAJCWludCByZXN0YXJ0OwogCQl2b2lkICpkYXRhOwogCi0JCXRpbWVyID0gbGlzdF9lbnRyeShiYXNlLT5wZW5kaW5nLm5leHQsIHN0cnVjdCBocnRpbWVyLCBsaXN0KTsKKwkJdGltZXIgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CiAJCWlmIChub3cudHY2NCA8PSB0aW1lci0+ZXhwaXJlcy50djY0KQogCQkJYnJlYWs7CiAKQEAgLTczMiw3ICs3MzcsNiBAQAogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9IUlRJTUVSX0JBU0VTOyBpKyspIHsKIAkJc3Bpbl9sb2NrX2luaXQoJmJhc2UtPmxvY2spOwotCQlJTklUX0xJU1RfSEVBRCgmYmFzZS0+cGVuZGluZyk7CiAJCWJhc2UrKzsKIAl9CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQuYyBiL2tlcm5lbC9zY2hlZC5jCmluZGV4IGMwYzYwYzkuLmM5ZGVjMmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC5jCisrKyBiL2tlcm5lbC9zY2hlZC5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpAQCAtMTI4OSw2ICsxMjkwLDkgQEAKIAkJfQogCX0KIAorCWlmIChwLT5sYXN0X3dha2VyX2NwdSAhPSB0aGlzX2NwdSkKKwkJZ290byBvdXRfc2V0X2NwdTsKKwogCWlmICh1bmxpa2VseSghY3B1X2lzc2V0KHRoaXNfY3B1LCBwLT5jcHVzX2FsbG93ZWQpKSkKIAkJZ290byBvdXRfc2V0X2NwdTsKIApAQCAtMTM1OSw2ICsxMzYzLDggQEAKIAkJY3B1ID0gdGFza19jcHUocCk7CiAJfQogCisJcC0+bGFzdF93YWtlcl9jcHUgPSB0aGlzX2NwdTsKKwogb3V0X2FjdGl2YXRlOgogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAlpZiAob2xkX3N0YXRlID09IFRBU0tfVU5JTlRFUlJVUFRJQkxFKSB7CkBAIC0xNDQwLDkgKzE0NDYsMTIgQEAKICNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwogCW1lbXNldCgmcC0+c2NoZWRfaW5mbywgMCwgc2l6ZW9mKHAtPnNjaGVkX2luZm8pKTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9DVFhTVykKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApCisJcC0+bGFzdF93YWtlcl9jcHUgPSBjcHU7CisjaWYgZGVmaW5lZChfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9DVFhTVykKIAlwLT5vbmNwdSA9IDA7CiAjZW5kaWYKKyNlbmRpZgogI2lmZGVmIENPTkZJR19QUkVFTVBUCiAJLyogV2FudCB0byBzdGFydCB3aXRoIGtlcm5lbCBwcmVlbXB0aW9uIGRpc2FibGVkLiAqLwogCXRhc2tfdGhyZWFkX2luZm8ocCktPnByZWVtcHRfY291bnQgPSAxOwpAQCAtNTA4Miw3ICs1MDkxLDQ3MCBAQAogCiAjZGVmaW5lIFNEX05PREVTX1BFUl9ET01BSU4gMTYKIAorLyoKKyAqIFNlbGYtdHVuaW5nIHRhc2sgbWlncmF0aW9uIGNvc3QgbWVhc3VyZW1lbnQgYmV0d2VlbiBzb3VyY2UgYW5kIHRhcmdldCBDUFVzLgorICoKKyAqIFRoaXMgaXMgZG9uZSBieSBtZWFzdXJpbmcgdGhlIGNvc3Qgb2YgbWFuaXB1bGF0aW5nIGJ1ZmZlcnMgb2YgdmFyeWluZworICogc2l6ZXMuIEZvciBhIGdpdmVuIGJ1ZmZlci1zaXplIGhlcmUgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSB0YWtlbjoKKyAqCisgKiAxKSB0aGUgc291cmNlIENQVSByZWFkcytkaXJ0aWVzIGEgc2hhcmVkIGJ1ZmZlcgorICogMikgdGhlIHRhcmdldCBDUFUgcmVhZHMrZGlydGllcyB0aGUgc2FtZSBzaGFyZWQgYnVmZmVyCisgKgorICogV2UgbWVhc3VyZSBob3cgbG9uZyB0aGV5IHRha2UsIGluIHRoZSBmb2xsb3dpbmcgNCBzY2VuYXJpb3M6CisgKgorICogIC0gc291cmNlOiBDUFUxLCB0YXJnZXQ6IENQVTIgfCBjb3N0MQorICogIC0gc291cmNlOiBDUFUyLCB0YXJnZXQ6IENQVTEgfCBjb3N0MgorICogIC0gc291cmNlOiBDUFUxLCB0YXJnZXQ6IENQVTEgfCBjb3N0MworICogIC0gc291cmNlOiBDUFUyLCB0YXJnZXQ6IENQVTIgfCBjb3N0NAorICoKKyAqIFdlIHRoZW4gY2FsY3VsYXRlIHRoZSBjb3N0Mytjb3N0NC1jb3N0MS1jb3N0MiBkaWZmZXJlbmNlIC0gdGhpcyBpcworICogdGhlIGNvc3Qgb2YgbWlncmF0aW9uLgorICoKKyAqIFdlIHRoZW4gc3RhcnQgb2ZmIGZyb20gYSBzbWFsbCBidWZmZXItc2l6ZSBhbmQgaXRlcmF0ZSB1cCB0byBsYXJnZXIKKyAqIGJ1ZmZlciBzaXplcywgaW4gNSUgc3RlcHMgLSBtZWFzdXJpbmcgZWFjaCBidWZmZXItc2l6ZSBzZXBhcmF0ZWx5LCBhbmQKKyAqIGRvaW5nIGEgbWF4aW11bSBzZWFyY2ggZm9yIHRoZSBjb3N0LiAoVGhlIG1heGltdW0gY29zdCBmb3IgYSBtaWdyYXRpb24KKyAqIG5vcm1hbGx5IG9jY3VycyB3aGVuIHRoZSB3b3JraW5nIHNldCBzaXplIGlzIGFyb3VuZCB0aGUgZWZmZWN0aXZlIGNhY2hlCisgKiBzaXplLikKKyAqLworI2RlZmluZSBTRUFSQ0hfU0NPUEUJCTIKKyNkZWZpbmUgTUlOX0NBQ0hFX1NJWkUJCSg2NCoxMDI0VSkKKyNkZWZpbmUgREVGQVVMVF9DQUNIRV9TSVpFCSg1KjEwMjQqMTAyNFUpCisjZGVmaW5lIElURVJBVElPTlMJCTIKKyNkZWZpbmUgU0laRV9USFJFU0gJCTEzMAorI2RlZmluZSBDT1NUX1RIUkVTSAkJMTMwCisKKy8qCisgKiBUaGUgbWlncmF0aW9uIGNvc3QgaXMgYSBmdW5jdGlvbiBvZiAnZG9tYWluIGRpc3RhbmNlJy4gRG9tYWluCisgKiBkaXN0YW5jZSBpcyB0aGUgbnVtYmVyIG9mIHN0ZXBzIGEgQ1BVIGhhcyB0byBpdGVyYXRlIGRvd24gaXRzCisgKiBkb21haW4gdHJlZSB0byBzaGFyZSBhIGRvbWFpbiB3aXRoIHRoZSBvdGhlciBDUFUuIFRoZSBmYXJ0aGVyCisgKiB0d28gQ1BVcyBhcmUgZnJvbSBlYWNoIG90aGVyLCB0aGUgbGFyZ2VyIHRoZSBkaXN0YW5jZSBnZXRzLgorICoKKyAqIE5vdGUgdGhhdCB3ZSB1c2UgdGhlIGRpc3RhbmNlIG9ubHkgdG8gY2FjaGUgbWVhc3VyZW1lbnQgcmVzdWx0cywKKyAqIHRoZSBkaXN0YW5jZSB2YWx1ZSBpcyBub3QgdXNlZCBudW1lcmljYWxseSBvdGhlcndpc2UuIFdoZW4gdHdvCisgKiBDUFVzIGhhdmUgdGhlIHNhbWUgZGlzdGFuY2UgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBtaWdyYXRpb24KKyAqIGNvc3QgaXMgdGhlIHNhbWUuICh0aGlzIGlzIGEgc2ltcGxpZmljYXRpb24gYnV0IHF1aXRlIHByYWN0aWNhbCkKKyAqLworI2RlZmluZSBNQVhfRE9NQUlOX0RJU1RBTkNFIDMyCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbWlncmF0aW9uX2Nvc3RbTUFYX0RPTUFJTl9ESVNUQU5DRV0gPQorCQl7IFsgMCAuLi4gTUFYX0RPTUFJTl9ESVNUQU5DRS0xIF0gPSAtMUxMIH07CisKKy8qCisgKiBBbGxvdyBvdmVycmlkZSBvZiBtaWdyYXRpb24gY29zdCAtIGluIHVuaXRzIG9mIG1pY3Jvc2Vjb25kcy4KKyAqIEUuZy4gbWlncmF0aW9uX2Nvc3Q9MTAwMCwyMDAwLDMwMDAgd2lsbCBzZXQgdXAgYSBsZXZlbC0xIGNvc3QKKyAqIG9mIDEgbXNlYywgbGV2ZWwtMiBjb3N0IG9mIDIgbXNlY3MgYW5kIGxldmVsMyBjb3N0IG9mIDMgbXNlY3M6CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG1pZ3JhdGlvbl9jb3N0X3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaW50c1tNQVhfRE9NQUlOX0RJU1RBTkNFKzFdLCBpOworCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCXByaW50aygiI2ludHM6ICVkXG4iLCBpbnRzWzBdKTsKKwlmb3IgKGkgPSAxOyBpIDw9IGludHNbMF07IGkrKykgeworCQltaWdyYXRpb25fY29zdFtpLTFdID0gKHVuc2lnbmVkIGxvbmcgbG9uZylpbnRzW2ldKjEwMDA7CisJCXByaW50aygibWlncmF0aW9uX2Nvc3RbJWRdOiAlTGRcbiIsIGktMSwgbWlncmF0aW9uX2Nvc3RbaS0xXSk7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwICgibWlncmF0aW9uX2Nvc3Q9IiwgbWlncmF0aW9uX2Nvc3Rfc2V0dXApOworCisvKgorICogR2xvYmFsIG11bHRpcGxpZXIgKGRpdmlzb3IpIGZvciBtaWdyYXRpb24tY3V0b2ZmIHZhbHVlcywKKyAqIGluIHBlcmNlbnRpbGVzLiBFLmcuIHVzZSBhIHZhbHVlIG9mIDE1MCB0byBnZXQgMS41IHRpbWVzCisgKiBsb25nZXIgY2FjaGUtaG90IGN1dG9mZiB0aW1lcy4KKyAqCisgKiAoV2Ugc2NhbGUgaXQgZnJvbSAxMDAgdG8gMTI4IHRvIGxvbmcgbG9uZyBoYW5kbGluZyBlYXNpZXIuKQorICovCisKKyNkZWZpbmUgTUlHUkFUSU9OX0ZBQ1RPUl9TQ0FMRSAxMjgKKworc3RhdGljIHVuc2lnbmVkIGludCBtaWdyYXRpb25fZmFjdG9yID0gTUlHUkFUSU9OX0ZBQ1RPUl9TQ0FMRTsKKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfbWlncmF0aW9uX2ZhY3RvcihjaGFyICpzdHIpCit7CisJZ2V0X29wdGlvbigmc3RyLCAmbWlncmF0aW9uX2ZhY3Rvcik7CisJbWlncmF0aW9uX2ZhY3RvciA9IG1pZ3JhdGlvbl9mYWN0b3IgKiBNSUdSQVRJT05fRkFDVE9SX1NDQUxFIC8gMTAwOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJtaWdyYXRpb25fZmFjdG9yPSIsIHNldHVwX21pZ3JhdGlvbl9mYWN0b3IpOworCisvKgorICogRXN0aW1hdGVkIGRpc3RhbmNlIG9mIHR3byBDUFVzLCBtZWFzdXJlZCB2aWEgdGhlIG51bWJlciBvZiBkb21haW5zCisgKiB3ZSBoYXZlIHRvIHBhc3MgZm9yIHRoZSB0d28gQ1BVcyB0byBiZSBpbiB0aGUgc2FtZSBzcGFuOgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkb21haW5fZGlzdGFuY2UoaW50IGNwdTEsIGludCBjcHUyKQoreworCXVuc2lnbmVkIGxvbmcgZGlzdGFuY2UgPSAwOworCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCisJZm9yX2VhY2hfZG9tYWluKGNwdTEsIHNkKSB7CisJCVdBUk5fT04oIWNwdV9pc3NldChjcHUxLCBzZC0+c3BhbikpOworCQlpZiAoY3B1X2lzc2V0KGNwdTIsIHNkLT5zcGFuKSkKKwkJCXJldHVybiBkaXN0YW5jZTsKKwkJZGlzdGFuY2UrKzsKKwl9CisJaWYgKGRpc3RhbmNlID49IE1BWF9ET01BSU5fRElTVEFOQ0UpIHsKKwkJV0FSTl9PTigxKTsKKwkJZGlzdGFuY2UgPSBNQVhfRE9NQUlOX0RJU1RBTkNFLTE7CisJfQorCisJcmV0dXJuIGRpc3RhbmNlOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1pZ3JhdGlvbl9kZWJ1ZzsKKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfbWlncmF0aW9uX2RlYnVnKGNoYXIgKnN0cikKK3sKKwlnZXRfb3B0aW9uKCZzdHIsICZtaWdyYXRpb25fZGVidWcpOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJtaWdyYXRpb25fZGVidWc9Iiwgc2V0dXBfbWlncmF0aW9uX2RlYnVnKTsKKworLyoKKyAqIE1heGltdW0gY2FjaGUtc2l6ZSB0aGF0IHRoZSBzY2hlZHVsZXIgc2hvdWxkIHRyeSB0byBtZWFzdXJlLgorICogQXJjaGl0ZWN0dXJlcyB3aXRoIGxhcmdlciBjYWNoZXMgc2hvdWxkIHR1bmUgdGhpcyB1cCBkdXJpbmcKKyAqIGJvb3R1cC4gR2V0cyB1c2VkIGluIHRoZSBkb21haW4tc2V0dXAgY29kZSAoaS5lLiBkdXJpbmcgU01QCisgKiBib290dXApLgorICovCit1bnNpZ25lZCBpbnQgbWF4X2NhY2hlX3NpemU7CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX21heF9jYWNoZV9zaXplKGNoYXIgKnN0cikKK3sKKwlnZXRfb3B0aW9uKCZzdHIsICZtYXhfY2FjaGVfc2l6ZSk7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm1heF9jYWNoZV9zaXplPSIsIHNldHVwX21heF9jYWNoZV9zaXplKTsKKworLyoKKyAqIERpcnR5IGEgYmlnIGJ1ZmZlciBpbiBhIGhhcmQtdG8tcHJlZGljdCAoZm9yIHRoZSBMMiBjYWNoZSkgd2F5LiBUaGlzCisgKiBpcyB0aGUgb3BlcmF0aW9uIHRoYXQgaXMgdGltZWQsIHNvIHdlIHRyeSB0byBnZW5lcmF0ZSB1bnByZWRpY3RhYmxlCisgKiBjYWNoZW1pc3NlcyB0aGF0IHN0aWxsIGVuZCB1cCBmaWxsaW5nIHRoZSBMMiBjYWNoZToKKyAqLworc3RhdGljIHZvaWQgdG91Y2hfY2FjaGUodm9pZCAqX19jYWNoZSwgdW5zaWduZWQgbG9uZyBfX3NpemUpCit7CisJdW5zaWduZWQgbG9uZyBzaXplID0gX19zaXplL3NpemVvZihsb25nKSwgY2h1bmsxID0gc2l6ZS8zLAorCQkJY2h1bmsyID0gMipzaXplLzM7CisJdW5zaWduZWQgbG9uZyAqY2FjaGUgPSBfX2NhY2hlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemUvNjsgaSArPSA4KSB7CisJCXN3aXRjaCAoaSAlIDYpIHsKKwkJCWNhc2UgMDogY2FjaGVbaV0rKzsKKwkJCWNhc2UgMTogY2FjaGVbc2l6ZS0xLWldKys7CisJCQljYXNlIDI6IGNhY2hlW2NodW5rMS1pXSsrOworCQkJY2FzZSAzOiBjYWNoZVtjaHVuazEraV0rKzsKKwkJCWNhc2UgNDogY2FjaGVbY2h1bmsyLWldKys7CisJCQljYXNlIDU6IGNhY2hlW2NodW5rMitpXSsrOworCQl9CisJfQorfQorCisvKgorICogTWVhc3VyZSB0aGUgY2FjaGUtY29zdCBvZiBvbmUgdGFzayBtaWdyYXRpb24uIFJldHVybnMgaW4gdW5pdHMgb2YgbnNlYy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtZWFzdXJlX29uZSh2b2lkICpjYWNoZSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSAgICAgIGludCBzb3VyY2UsIGludCB0YXJnZXQpCit7CisJY3B1bWFza190IG1hc2ssIHNhdmVkX21hc2s7CisJdW5zaWduZWQgbG9uZyBsb25nIHQwLCB0MSwgdDIsIHQzLCBjb3N0OworCisJc2F2ZWRfbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKworCS8qCisJICogRmx1c2ggc291cmNlIGNhY2hlcyB0byBSQU0gYW5kIGludmFsaWRhdGUgdGhlbToKKwkgKi8KKwlzY2hlZF9jYWNoZWZsdXNoKCk7CisKKwkvKgorCSAqIE1pZ3JhdGUgdG8gdGhlIHNvdXJjZSBDUFU6CisJICovCisJbWFzayA9IGNwdW1hc2tfb2ZfY3B1KHNvdXJjZSk7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBtYXNrKTsKKwlXQVJOX09OKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBzb3VyY2UpOworCisJLyoKKwkgKiBEaXJ0eSB0aGUgd29ya2luZyBzZXQ6CisJICovCisJdDAgPSBzY2hlZF9jbG9jaygpOworCXRvdWNoX2NhY2hlKGNhY2hlLCBzaXplKTsKKwl0MSA9IHNjaGVkX2Nsb2NrKCk7CisKKwkvKgorCSAqIE1pZ3JhdGUgdG8gdGhlIHRhcmdldCBDUFUsIGRpcnR5IHRoZSBMMiBjYWNoZSBhbmQgYWNjZXNzCisJICogdGhlIHNoYXJlZCBidWZmZXIuICh3aGljaCByZXByZXNlbnRzIHRoZSB3b3JraW5nIHNldAorCSAqIG9mIGEgbWlncmF0ZWQgdGFzay4pCisJICovCisJbWFzayA9IGNwdW1hc2tfb2ZfY3B1KHRhcmdldCk7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBtYXNrKTsKKwlXQVJOX09OKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSB0YXJnZXQpOworCisJdDIgPSBzY2hlZF9jbG9jaygpOworCXRvdWNoX2NhY2hlKGNhY2hlLCBzaXplKTsKKwl0MyA9IHNjaGVkX2Nsb2NrKCk7CisKKwljb3N0ID0gdDEtdDAgKyB0My10MjsKKworCWlmIChtaWdyYXRpb25fZGVidWcgPj0gMikKKwkJcHJpbnRrKCJbJWQtPiVkXTogJThMZCAlOExkICU4TGQgPT4gJTEwTGQuXG4iLAorCQkJc291cmNlLCB0YXJnZXQsIHQxLXQwLCB0MS10MCwgdDMtdDIsIGNvc3QpOworCS8qCisJICogRmx1c2ggdGFyZ2V0IGNhY2hlcyB0byBSQU0gYW5kIGludmFsaWRhdGUgdGhlbToKKwkgKi8KKwlzY2hlZF9jYWNoZWZsdXNoKCk7CisKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVkX21hc2spOworCisJcmV0dXJuIGNvc3Q7Cit9CisKKy8qCisgKiBNZWFzdXJlIGEgc2VyaWVzIG9mIHRhc2sgbWlncmF0aW9ucyBhbmQgcmV0dXJuIHRoZSBhdmVyYWdlCisgKiByZXN1bHQuIFNpbmNlIHRoaXMgY29kZSBydW5zIGVhcmx5IGR1cmluZyBib290dXAgdGhlIHN5c3RlbQorICogaXMgJ3VuZGlzdHVyYmVkJyBhbmQgdGhlIGF2ZXJhZ2UgbGF0ZW5jeSBtYWtlcyBzZW5zZS4KKyAqCisgKiBUaGUgYWxnb3JpdGhtIGluIGVzc2VuY2UgYXV0by1kZXRlY3RzIHRoZSByZWxldmFudCBjYWNoZS1zaXplLAorICogc28gaXQgd2lsbCBwcm9wZXJseSBkZXRlY3QgZGlmZmVyZW50IGNhY2hlc2l6ZXMgZm9yIGRpZmZlcmVudAorICogY2FjaGUtaGllcmFyY2hpZXMsIGRlcGVuZGluZyBvbiBob3cgdGhlIENQVXMgYXJlIGNvbm5lY3RlZC4KKyAqCisgKiBBcmNoaXRlY3R1cmVzIGNhbiBwcmltZSB0aGUgdXBwZXIgbGltaXQgb2YgdGhlIHNlYXJjaCByYW5nZSB2aWEKKyAqIG1heF9jYWNoZV9zaXplLCBvdGhlcndpc2UgdGhlIHNlYXJjaCByYW5nZSBkZWZhdWx0cyB0byAyME1CLi4uNjRLLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nCittZWFzdXJlX2Nvc3QoaW50IGNwdTEsIGludCBjcHUyLCB2b2lkICpjYWNoZSwgdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGNvc3QxLCBjb3N0MjsKKwlpbnQgaTsKKworCS8qCisJICogTWVhc3VyZSB0aGUgbWlncmF0aW9uIGNvc3Qgb2YgJ3NpemUnIGJ5dGVzLCBvdmVyIGFuCisJICogYXZlcmFnZSBvZiAxMCBydW5zOgorCSAqCisJICogKFdlIHBlcnR1cmIgdGhlIGNhY2hlIHNpemUgYnkgYSBzbWFsbCAoMC4uNGspCisJICogIHZhbHVlIHRvIGNvbXBlbnNhdGUgc2l6ZS9hbGlnbm1lbnQgcmVsYXRlZCBhcnRpZmFjdHMuCisJICogIFdlIGFsc28gc3VidHJhY3QgdGhlIGNvc3Qgb2YgdGhlIG9wZXJhdGlvbiBkb25lIG9uCisJICogIHRoZSBzYW1lIENQVS4pCisJICovCisJY29zdDEgPSAwOworCisJLyoKKwkgKiBkcnkgcnVuLCB0byBtYWtlIHN1cmUgd2Ugc3RhcnQgb2ZmIGNhY2hlLWNvbGQgb24gY3B1MSwKKwkgKiBhbmQgdG8gZ2V0IGFueSB2bWFsbG9jIHBhZ2VmYXVsdHMgaW4gYWR2YW5jZToKKwkgKi8KKwltZWFzdXJlX29uZShjYWNoZSwgc2l6ZSwgY3B1MSwgY3B1Mik7CisJZm9yIChpID0gMDsgaSA8IElURVJBVElPTlM7IGkrKykKKwkJY29zdDEgKz0gbWVhc3VyZV9vbmUoY2FjaGUsIHNpemUgLSBpKjEwMjQsIGNwdTEsIGNwdTIpOworCisJbWVhc3VyZV9vbmUoY2FjaGUsIHNpemUsIGNwdTIsIGNwdTEpOworCWZvciAoaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspCisJCWNvc3QxICs9IG1lYXN1cmVfb25lKGNhY2hlLCBzaXplIC0gaSoxMDI0LCBjcHUyLCBjcHUxKTsKKworCS8qCisJICogKFdlIG1lYXN1cmUgdGhlIG5vbi1taWdyYXRpbmcgW2NhY2hlZF0gY29zdCBvbiBib3RoCisJICogIGNwdTEgYW5kIGNwdTIsIHRvIGhhbmRsZSBDUFVzIHdpdGggZGlmZmVyZW50IHNwZWVkcykKKwkgKi8KKwljb3N0MiA9IDA7CisKKwltZWFzdXJlX29uZShjYWNoZSwgc2l6ZSwgY3B1MSwgY3B1MSk7CisJZm9yIChpID0gMDsgaSA8IElURVJBVElPTlM7IGkrKykKKwkJY29zdDIgKz0gbWVhc3VyZV9vbmUoY2FjaGUsIHNpemUgLSBpKjEwMjQsIGNwdTEsIGNwdTEpOworCisJbWVhc3VyZV9vbmUoY2FjaGUsIHNpemUsIGNwdTIsIGNwdTIpOworCWZvciAoaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspCisJCWNvc3QyICs9IG1lYXN1cmVfb25lKGNhY2hlLCBzaXplIC0gaSoxMDI0LCBjcHUyLCBjcHUyKTsKKworCS8qCisJICogR2V0IHRoZSBwZXItaXRlcmF0aW9uIG1pZ3JhdGlvbiBjb3N0OgorCSAqLworCWRvX2Rpdihjb3N0MSwgMipJVEVSQVRJT05TKTsKKwlkb19kaXYoY29zdDIsIDIqSVRFUkFUSU9OUyk7CisKKwlyZXR1cm4gY29zdDEgLSBjb3N0MjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtZWFzdXJlX21pZ3JhdGlvbl9jb3N0KGludCBjcHUxLCBpbnQgY3B1MikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWF4X2Nvc3QgPSAwLCBmbHVjdCA9IDAsIGF2Z19mbHVjdCA9IDA7CisJdW5zaWduZWQgaW50IG1heF9zaXplLCBzaXplLCBzaXplX2ZvdW5kID0gMDsKKwlsb25nIGxvbmcgY29zdCA9IDAsIHByZXZfY29zdDsKKwl2b2lkICpjYWNoZTsKKworCS8qCisJICogU2VhcmNoIGZyb20gbWF4X2NhY2hlX3NpemUqNSBkb3duIHRvIDY0SyAtIHRoZSByZWFsIHJlbGV2YW50CisJICogY2FjaGVzaXplIGhhcyB0byBsaWUgc29tZXdoZXJlIGluYmV0d2Vlbi4KKwkgKi8KKwlpZiAobWF4X2NhY2hlX3NpemUpIHsKKwkJbWF4X3NpemUgPSBtYXgobWF4X2NhY2hlX3NpemUgKiBTRUFSQ0hfU0NPUEUsIE1JTl9DQUNIRV9TSVpFKTsKKwkJc2l6ZSA9IG1heChtYXhfY2FjaGVfc2l6ZSAvIFNFQVJDSF9TQ09QRSwgTUlOX0NBQ0hFX1NJWkUpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFNpbmNlIHdlIGhhdmUgbm8gZXN0aW1hdGlvbiBhYm91dCB0aGUgcmVsZXZhbnQKKwkJICogc2VhcmNoIHJhbmdlCisJCSAqLworCQltYXhfc2l6ZSA9IERFRkFVTFRfQ0FDSEVfU0laRSAqIFNFQVJDSF9TQ09QRTsKKwkJc2l6ZSA9IE1JTl9DQUNIRV9TSVpFOworCX0KKworCWlmICghY3B1X29ubGluZShjcHUxKSB8fCAhY3B1X29ubGluZShjcHUyKSkgeworCQlwcmludGsoImNwdSAlZCBhbmQgJWQgbm90IGJvdGggb25saW5lIVxuIiwgY3B1MSwgY3B1Mik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQWxsb2NhdGUgdGhlIHdvcmtpbmcgc2V0OgorCSAqLworCWNhY2hlID0gdm1hbGxvYyhtYXhfc2l6ZSk7CisJaWYgKCFjYWNoZSkgeworCQlwcmludGsoImNvdWxkIG5vdCB2bWFsbG9jICVkIGJ5dGVzIGZvciBjYWNoZSFcbiIsIDIqbWF4X3NpemUpOworCQlyZXR1cm4gMTAwMDAwMDsgLy8gcmV0dXJuIDEgbXNlYyBvbiB2ZXJ5IHNtYWxsIGJveGVuCisJfQorCisJd2hpbGUgKHNpemUgPD0gbWF4X3NpemUpIHsKKwkJcHJldl9jb3N0ID0gY29zdDsKKwkJY29zdCA9IG1lYXN1cmVfY29zdChjcHUxLCBjcHUyLCBjYWNoZSwgc2l6ZSk7CisKKwkJLyoKKwkJICogVXBkYXRlIHRoZSBtYXg6CisJCSAqLworCQlpZiAoY29zdCA+IDApIHsKKwkJCWlmIChtYXhfY29zdCA8IGNvc3QpIHsKKwkJCQltYXhfY29zdCA9IGNvc3Q7CisJCQkJc2l6ZV9mb3VuZCA9IHNpemU7CisJCQl9CisJCX0KKwkJLyoKKwkJICogQ2FsY3VsYXRlIGF2ZXJhZ2UgZmx1Y3R1YXRpb24sIHdlIHVzZSB0aGlzIHRvIHByZXZlbnQKKwkJICogbm9pc2UgZnJvbSB0cmlnZ2VyaW5nIGFuIGVhcmx5IGJyZWFrIG91dCBvZiB0aGUgbG9vcDoKKwkJICovCisJCWZsdWN0ID0gYWJzKGNvc3QgLSBwcmV2X2Nvc3QpOworCQlhdmdfZmx1Y3QgPSAoYXZnX2ZsdWN0ICsgZmx1Y3QpLzI7CisKKwkJaWYgKG1pZ3JhdGlvbl9kZWJ1ZykKKwkJCXByaW50aygiLT4gWyVkXVslZF1bJTdkXSAlM2xkLiVsZCBbJTNsZC4lbGRdICglbGQpOiAoJThMZCAlOExkKVxuIiwKKwkJCQljcHUxLCBjcHUyLCBzaXplLAorCQkJCShsb25nKWNvc3QgLyAxMDAwMDAwLAorCQkJCSgobG9uZyljb3N0IC8gMTAwMDAwKSAlIDEwLAorCQkJCShsb25nKW1heF9jb3N0IC8gMTAwMDAwMCwKKwkJCQkoKGxvbmcpbWF4X2Nvc3QgLyAxMDAwMDApICUgMTAsCisJCQkJZG9tYWluX2Rpc3RhbmNlKGNwdTEsIGNwdTIpLAorCQkJCWNvc3QsIGF2Z19mbHVjdCk7CisKKwkJLyoKKwkJICogSWYgd2UgaXRlcmF0ZWQgYXQgbGVhc3QgMjAlIHBhc3QgdGhlIHByZXZpb3VzIG1heGltdW0sCisJCSAqIGFuZCB0aGUgY29zdCBoYXMgZHJvcHBlZCBieSBtb3JlIHRoYW4gMjAlIGFscmVhZHksCisJCSAqICh0YWtpbmcgZmx1Y3R1YXRpb25zIGludG8gYWNjb3VudCkgdGhlbiB3ZSBhc3N1bWUgdG8KKwkJICogaGF2ZSBmb3VuZCB0aGUgbWF4aW11bSBhbmQgYnJlYWsgb3V0IG9mIHRoZSBsb29wIGVhcmx5OgorCQkgKi8KKwkJaWYgKHNpemVfZm91bmQgJiYgKHNpemUqMTAwID4gc2l6ZV9mb3VuZCpTSVpFX1RIUkVTSCkpCisJCQlpZiAoY29zdCthdmdfZmx1Y3QgPD0gMCB8fAorCQkJCW1heF9jb3N0KjEwMCA+IChjb3N0K2F2Z19mbHVjdCkqQ09TVF9USFJFU0gpIHsKKworCQkJCWlmIChtaWdyYXRpb25fZGVidWcpCisJCQkJCXByaW50aygiLT4gZm91bmQgbWF4LlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCS8qCisJCSAqIEluY3JlYXNlIHRoZSBjYWNoZXNpemUgaW4gNSUgc3RlcHM6CisJCSAqLworCQlzaXplID0gc2l6ZSAqIDIwIC8gMTk7CisJfQorCisJaWYgKG1pZ3JhdGlvbl9kZWJ1ZykKKwkJcHJpbnRrKCJbJWRdWyVkXSB3b3JraW5nIHNldCBzaXplIGZvdW5kOiAlZCwgY29zdDogJUxkXG4iLAorCQkJY3B1MSwgY3B1Miwgc2l6ZV9mb3VuZCwgbWF4X2Nvc3QpOworCisJdmZyZWUoY2FjaGUpOworCisJLyoKKwkgKiBBIHRhc2sgaXMgY29uc2lkZXJlZCAnY2FjaGUgY29sZCcgaWYgYXQgbGVhc3QgMiB0aW1lcworCSAqIHRoZSB3b3JzdC1jYXNlIGNvc3Qgb2YgbWlncmF0aW9uIGhhcyBwYXNzZWQuCisJICoKKwkgKiAodGhpcyBsaW1pdCBpcyBvbmx5IGxpc3RlbmVkIHRvIGlmIHRoZSBsb2FkLWJhbGFuY2luZworCSAqIHNpdHVhdGlvbiBpcyAnbmljZScgLSBpZiB0aGVyZSBpcyBhIGxhcmdlIGltYmFsYW5jZSB3ZQorCSAqIGlnbm9yZSBpdCBmb3IgdGhlIHNha2Ugb2YgQ1BVIHV0aWxpemF0aW9uIGFuZAorCSAqIHByb2Nlc3NpbmcgZmFpcm5lc3MuKQorCSAqLworCXJldHVybiAyICogbWF4X2Nvc3QgKiBtaWdyYXRpb25fZmFjdG9yIC8gTUlHUkFUSU9OX0ZBQ1RPUl9TQ0FMRTsKK30KKworc3RhdGljIHZvaWQgY2FsaWJyYXRlX21pZ3JhdGlvbl9jb3N0cyhjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXApCit7CisJaW50IGNwdTEgPSAtMSwgY3B1MiA9IC0xLCBjcHUsIG9yaWdfY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwl1bnNpZ25lZCBsb25nIGowLCBqMSwgZGlzdGFuY2UsIG1heF9kaXN0YW5jZSA9IDA7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CisKKwlqMCA9IGppZmZpZXM7CisKKwkvKgorCSAqIEZpcnN0IHBhc3MgLSBjYWxjdWxhdGUgdGhlIGNhY2hlZmx1c2ggdGltZXM6CisJICovCisJZm9yX2VhY2hfY3B1X21hc2soY3B1MSwgKmNwdV9tYXApIHsKKwkJZm9yX2VhY2hfY3B1X21hc2soY3B1MiwgKmNwdV9tYXApIHsKKwkJCWlmIChjcHUxID09IGNwdTIpCisJCQkJY29udGludWU7CisJCQlkaXN0YW5jZSA9IGRvbWFpbl9kaXN0YW5jZShjcHUxLCBjcHUyKTsKKwkJCW1heF9kaXN0YW5jZSA9IG1heChtYXhfZGlzdGFuY2UsIGRpc3RhbmNlKTsKKwkJCS8qCisJCQkgKiBObyByZXN1bHQgY2FjaGVkIHlldD8KKwkJCSAqLworCQkJaWYgKG1pZ3JhdGlvbl9jb3N0W2Rpc3RhbmNlXSA9PSAtMUxMKQorCQkJCW1pZ3JhdGlvbl9jb3N0W2Rpc3RhbmNlXSA9CisJCQkJCW1lYXN1cmVfbWlncmF0aW9uX2Nvc3QoY3B1MSwgY3B1Mik7CisJCX0KKwl9CisJLyoKKwkgKiBTZWNvbmQgcGFzcyAtIHVwZGF0ZSB0aGUgc2NoZWQgZG9tYWluIGhpZXJhcmNoeSB3aXRoCisJICogdGhlIG5ldyBjYWNoZS1ob3QtdGltZSBlc3RpbWF0aW9uczoKKwkgKi8KKwlmb3JfZWFjaF9jcHVfbWFzayhjcHUsICpjcHVfbWFwKSB7CisJCWRpc3RhbmNlID0gMDsKKwkJZm9yX2VhY2hfZG9tYWluKGNwdSwgc2QpIHsKKwkJCXNkLT5jYWNoZV9ob3RfdGltZSA9IG1pZ3JhdGlvbl9jb3N0W2Rpc3RhbmNlXTsKKwkJCWRpc3RhbmNlKys7CisJCX0KKwl9CisJLyoKKwkgKiBQcmludCB0aGUgbWF0cml4OgorCSAqLworCWlmIChtaWdyYXRpb25fZGVidWcpCisJCXByaW50aygibWlncmF0aW9uOiBtYXhfY2FjaGVfc2l6ZTogJWQsIGNwdTogJWQgTUh6OlxuIiwKKwkJCW1heF9jYWNoZV9zaXplLAorI2lmZGVmIENPTkZJR19YODYKKwkJCWNwdV9raHovMTAwMAorI2Vsc2UKKwkJCS0xCisjZW5kaWYKKwkJKTsKKwlwcmludGsoIm1pZ3JhdGlvbl9jb3N0PSIpOworCWZvciAoZGlzdGFuY2UgPSAwOyBkaXN0YW5jZSA8PSBtYXhfZGlzdGFuY2U7IGRpc3RhbmNlKyspIHsKKwkJaWYgKGRpc3RhbmNlKQorCQkJcHJpbnRrKCIsIik7CisJCXByaW50aygiJWxkIiwgKGxvbmcpbWlncmF0aW9uX2Nvc3RbZGlzdGFuY2VdIC8gMTAwMCk7CisJfQorCXByaW50aygiXG4iKTsKKwlqMSA9IGppZmZpZXM7CisJaWYgKG1pZ3JhdGlvbl9kZWJ1ZykKKwkJcHJpbnRrKCJtaWdyYXRpb246ICVsZCBzZWNvbmRzXG4iLCAoajEtajApL0haKTsKKworCS8qCisJICogTW92ZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBDUFUuIE5VTUEtUSBnZXRzIGNvbmZ1c2VkCisJICogaWYgd2UgbWlncmF0ZSB0byBhbm90aGVyIHF1YWQgZHVyaW5nIGJvb3R1cC4KKwkgKi8KKwlpZiAocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSAhPSBvcmlnX2NwdSkgeworCQljcHVtYXNrX3QgbWFzayA9IGNwdW1hc2tfb2ZfY3B1KG9yaWdfY3B1KSwKKwkJCXNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisKKwkJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBtYXNrKTsKKwkJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKKwl9Cit9CisKICNpZmRlZiBDT05GSUdfTlVNQQorCiAvKioKICAqIGZpbmRfbmV4dF9iZXN0X25vZGUgLSBmaW5kIHRoZSBuZXh0IG5vZGUgdG8gaW5jbHVkZSBpbiBhIHNjaGVkX2RvbWFpbgogICogQG5vZGU6IG5vZGUgd2hvc2Ugc2NoZWRfZG9tYWluIHdlJ3JlIGJ1aWxkaW5nCkBAIC01NDQ4LDYgKzU5MjAsMTAgQEAKICNlbmRpZgogCQljcHVfYXR0YWNoX2RvbWFpbihzZCwgaSk7CiAJfQorCS8qCisJICogVHVuZSBjYWNoZS1ob3QgdmFsdWVzOgorCSAqLworCWNhbGlicmF0ZV9taWdyYXRpb25fY29zdHMoY3B1X21hcCk7CiB9CiAvKgogICogU2V0IHVwIHNjaGVkdWxlciBkb21haW5zIGFuZCBncm91cHMuICBDYWxsZXJzIG11c3QgaG9sZCB0aGUgaG90cGx1ZyBsb2NrLgpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuYwppbmRleCAxODUwZDBhLi5iNjJjYWI1IDEwMDY0NAotLS0gYS9tbS9tZW1wb2xpY3kuYworKysgYi9tbS9tZW1wb2xpY3kuYwpAQCAtMjA4LDYgKzIwOCw4IEBACiAJCXBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsICpwdGUpOwogCQlpZiAoIXBhZ2UpCiAJCQljb250aW51ZTsKKwkJaWYgKFBhZ2VSZXNlcnZlZChwYWdlKSkKKwkJCWNvbnRpbnVlOwogCQluaWQgPSBwYWdlX3RvX25pZChwYWdlKTsKIAkJaWYgKG5vZGVfaXNzZXQobmlkLCAqbm9kZXMpID09ICEhKGZsYWdzICYgTVBPTF9NRl9JTlZFUlQpKQogCQkJY29udGludWU7CkBAIC0yOTAsNyArMjkyLDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHZtYV9taWdyYXRhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCWlmICh2bWEtPnZtX2ZsYWdzICYgKAotCQlWTV9MT0NLRUR8Vk1fSU98Vk1fSFVHRVRMQnxWTV9QRk5NQVApKQorCQlWTV9MT0NLRUR8Vk1fSU98Vk1fSFVHRVRMQnxWTV9QRk5NQVB8Vk1fUkVTRVJWRUQpKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCBkNDFhMDY2Li44Yzk2MGI0IDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC0xNzQyLDcgKzE3NDIsNyBAQAogCXVuc2lnbmVkIGxvbmcgZW5kX3BmbiA9IHN0YXJ0X3BmbiArIHNpemU7CiAJdW5zaWduZWQgbG9uZyBwZm47CiAKLQlmb3IgKHBmbiA9IHN0YXJ0X3BmbjsgcGZuIDwgZW5kX3BmbjsgcGZuKyssIHBhZ2UrKykgeworCWZvciAocGZuID0gc3RhcnRfcGZuOyBwZm4gPCBlbmRfcGZuOyBwZm4rKykgewogCQlpZiAoIWVhcmx5X3Bmbl92YWxpZChwZm4pKQogCQkJY29udGludWU7CiAJCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwpkaWZmIC0tZ2l0IGEvbW0vc3dhcC5jIGIvbW0vc3dhcC5jCmluZGV4IGVlNmQ3MWMuLmNiYjQ4ZTcgMTAwNjQ0Ci0tLSBhL21tL3N3YXAuYworKysgYi9tbS9zd2FwLmMKQEAgLTM4NCw2ICszODQsOCBAQAogCXJldHVybiBwYWdldmVjX2NvdW50KHB2ZWMpOwogfQogCitFWFBPUlRfU1lNQk9MKHBhZ2V2ZWNfbG9va3VwKTsKKwogdW5zaWduZWQgcGFnZXZlY19sb29rdXBfdGFnKHN0cnVjdCBwYWdldmVjICpwdmVjLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJcGdvZmZfdCAqaW5kZXgsIGludCB0YWcsIHVuc2lnbmVkIG5yX3BhZ2VzKQogewpkaWZmIC0tZ2l0IGEvbW0vdGlueS1zaG1lbS5jIGIvbW0vdGlueS1zaG1lbS5jCmluZGV4IGNkYzZkNDMuLmY5ZDZhOWMgMTAwNjQ0Ci0tLSBhL21tL3Rpbnktc2htZW0uYworKysgYi9tbS90aW55LXNobWVtLmMKQEAgLTkwLDcgKzkwLDcgQEAKIAlmaWxlLT5mX21vZGUgPSBGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQ7CiAKIAkvKiBub3RpZnkgZXZlcnlvbmUgYXMgdG8gdGhlIGNoYW5nZSBvZiBmaWxlIHNpemUgKi8KLQllcnJvciA9IGRvX3RydW5jYXRlKGRlbnRyeSwgc2l6ZSwgZmlsZSk7CisJZXJyb3IgPSBkb190cnVuY2F0ZShkZW50cnksIHNpemUsIDAsIGZpbGUpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gY2xvc2VfZmlsZTsKIApkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2NvbmZpZwppbmRleCA2MGY2ZjMyLi45Mjk2YjI2OSAxMDA2NDQKLS0tIGEvbmV0L0tjb25maWcKKysrIGIvbmV0L0tjb25maWcKQEAgLTE1OSw2ICsxNTksNyBAQAogc291cmNlICJkcml2ZXJzL25ldC9hcHBsZXRhbGsvS2NvbmZpZyIKIHNvdXJjZSAibmV0L3gyNS9LY29uZmlnIgogc291cmNlICJuZXQvbGFwYi9LY29uZmlnIgorc291cmNlICJuZXQvdGlwYy9LY29uZmlnIgogCiBjb25maWcgTkVUX0RJVkVSVAogCWJvb2wgIkZyYW1lIERpdmVydGVyIChFWFBFUklNRU5UQUwpIgpkaWZmIC0tZ2l0IGEvbmV0L01ha2VmaWxlIGIvbmV0L01ha2VmaWxlCmluZGV4IGY1MTQxYjkuLjA2NTc5NmYgMTAwNjQ0Ci0tLSBhL25ldC9NYWtlZmlsZQorKysgYi9uZXQvTWFrZWZpbGUKQEAgLTQ1LDYgKzQ1LDcgQEAKIG9iai0kKENPTkZJR19JUF9EQ0NQKQkJKz0gZGNjcC8KIG9iai0kKENPTkZJR19JUF9TQ1RQKQkJKz0gc2N0cC8KIG9iai0kKENPTkZJR19JRUVFODAyMTEpCQkrPSBpZWVlODAyMTEvCitvYmotJChDT05GSUdfVElQQykJCSs9IHRpcGMvCiAKIGlmZXEgKCQoQ09ORklHX05FVCkseSkKIG9iai0kKENPTkZJR19TWVNDVEwpCQkrPSBzeXNjdGxfbmV0Lm8KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwppbmRleCA5ZjZlMDE5Li5hMjljMTIzIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpbHRlci5jIGIvbmV0L2NvcmUvZmlsdGVyLmMKaW5kZXggOWViOWQwMC4uYTUyNjY1ZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmlsdGVyLmMKKysrIGIvbmV0L2NvcmUvZmlsdGVyLmMKQEAgLTI4Nyw3ICsyODcsOSBAQAogICogbm8gcmVmZXJlbmNlcyBvciBqdW1wcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UsIG5vIGlsbGVnYWwKICAqIGluc3RydWN0aW9ucywgYW5kIG11c3QgZW5kIHdpdGggYSBSRVQgaW5zdHJ1Y3Rpb24uCiAgKgotICogUmV0dXJucyAwIGlmIHRoZSBydWxlIHNldCBpcyBsZWdhbCBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgaWYgbm90LgorICogQWxsIGp1bXBzIGFyZSBmb3J3YXJkIGFzIHRoZXkgYXJlIG5vdCBzaWduZWQuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBydWxlIHNldCBpcyBsZWdhbCBvciAtRUlOVkFMIGlmIG5vdC4KICAqLwogaW50IHNrX2Noa19maWx0ZXIoc3RydWN0IHNvY2tfZmlsdGVyICpmaWx0ZXIsIGludCBmbGVuKQogewpAQCAtMjk5LDcgKzMwMSw2IEBACiAKIAkvKiBjaGVjayB0aGUgZmlsdGVyIGNvZGUgbm93ICovCiAJZm9yIChwYyA9IDA7IHBjIDwgZmxlbjsgcGMrKykgewotCQkvKiBhbGwganVtcHMgYXJlIGZvcndhcmQgYXMgdGhleSBhcmUgbm90IHNpZ25lZCAqLwogCQlmdGVzdCA9ICZmaWx0ZXJbcGNdOwogCiAJCS8qIE9ubHkgYWxsb3cgdmFsaWQgaW5zdHJ1Y3Rpb25zICovCkBAIC0zODMsMTEgKzM4NCw2IEBACiAJCX0KIAl9CiAKLQkvKgotCSAqIFRoZSBwcm9ncmFtIG11c3QgZW5kIHdpdGggYSByZXR1cm4uIFdlIGRvbid0IGNhcmUgd2hlcmUgdGhleQotCSAqIGp1bXBlZCB3aXRoaW4gdGhlIHNjcmlwdCAoaXRzIGFsd2F5cyBmb3J3YXJkcykgYnV0IGluIHRoZSBlbmQKLQkgKiB0aGV5IF93aWxsXyBoaXQgdGhpcy4KLQkgKi8KICAgICAgICAgcmV0dXJuIChCUEZfQ0xBU1MoZmlsdGVyW2ZsZW4gLSAxXS5jb2RlKSA9PSBCUEZfUkVUKSA/IDAgOiAtRUlOVkFMOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IGE5ODkzZWMuLmRiNzgzMDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCkBAIC0xODIsNiArMTgyLDcgQEAKIAogY29uZmlnIElQX05GX0lQVEFCTEVTCiAJdHJpc3RhdGUgIklQIHRhYmxlcyBzdXBwb3J0IChyZXF1aXJlZCBmb3IgZmlsdGVyaW5nL21hc3EvTkFUKSIKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJaGVscAogCSAgaXB0YWJsZXMgaXMgYSBnZW5lcmFsLCBleHRlbnNpYmxlIHBhY2tldCBpZGVudGlmaWNhdGlvbiBmcmFtZXdvcmsuCiAJICBUaGUgcGFja2V0IGZpbHRlcmluZyBhbmQgZnVsbCBOQVQgKG1hc3F1ZXJhZGluZywgcG9ydCBmb3J3YXJkaW5nLApAQCAtMTkxLDE2ICsxOTIsNiBAQAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKICMgVGhlIG1hdGNoZXMuCi1jb25maWcgSVBfTkZfTUFUQ0hfTElNSVQKLQl0cmlzdGF0ZSAibGltaXQgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgbGltaXQgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBjb250cm9sIHRoZSByYXRlIGF0IHdoaWNoIGEgcnVsZSBjYW4gYmUKLQkgIG1hdGNoZWQ6IG1haW5seSB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgTE9HIHRhcmdldCAoIkxPRwotCSAgdGFyZ2V0IHN1cHBvcnQiLCBiZWxvdykgYW5kIHRvIGF2b2lkIHNvbWUgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrcy4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9NQVRDSF9JUFJBTkdFCiAJdHJpc3RhdGUgIklQIHJhbmdlIG1hdGNoIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwpAQCAtMjEwLDM3ICsyMDEsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQX05GX01BVENIX01BQwotCXRyaXN0YXRlICJNQUMgYWRkcmVzcyBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBNQUMgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZSBzb3VyY2UKLQkgIEV0aGVybmV0IGFkZHJlc3Mgb2YgdGhlIHBhY2tldC4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9QS1RUWVBFCi0JdHJpc3RhdGUgIlBhY2tldCB0eXBlIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIFBhY2tldCB0eXBlIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggYSBwYWNrZXQgYnkKLQkgIGl0cyAiY2xhc3MiLCBlZy4gQlJPQURDQVNULCBNVUxUSUNBU1QsIC4uLgotCi0JICBUeXBpY2FsIHVzYWdlOgotCSAgaXB0YWJsZXMgLUEgSU5QVVQgLW0gcGt0dHlwZSAtLXBrdC10eXBlIGJyb2FkY2FzdCAtaiBMT0cKLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9NQVJLCi0JdHJpc3RhdGUgIm5ldGZpbHRlciBNQVJLIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIE5ldGZpbHRlciBtYXJrIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUKLQkgIGBuZm1hcmsnIHZhbHVlIGluIHRoZSBwYWNrZXQuICBUaGlzIGNhbiBiZSBzZXQgYnkgdGhlIE1BUksgdGFyZ2V0Ci0JICAoc2VlIGJlbG93KS4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9NQVRDSF9NVUxUSVBPUlQKIAl0cmlzdGF0ZSAiTXVsdGlwbGUgcG9ydCBtYXRjaCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKQEAgLTMwMSwxNSArMjYxLDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUF9ORl9NQVRDSF9MRU5HVEgKLQl0cmlzdGF0ZSAiTEVOR1RIIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gbWF0Y2ggdGhlIGxlbmd0aCBvZiBhIHBhY2tldCBhZ2FpbnN0IGEKLQkgIHNwZWNpZmljIHZhbHVlIG9yIHJhbmdlIG9mIHZhbHVlcy4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9NQVRDSF9UVEwKIAl0cmlzdGF0ZSAiVFRMIG1hdGNoIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwpAQCAtMzE5LDUwICsyNzAsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQX05GX01BVENIX1RDUE1TUwotCXRyaXN0YXRlICJ0Y3Btc3MgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGB0Y3Btc3MnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIGV4YW1pbmUgdGhlCi0JICBNU1MgdmFsdWUgb2YgVENQIFNZTiBwYWNrZXRzLCB3aGljaCBjb250cm9sIHRoZSBtYXhpbXVtIHBhY2tldCBzaXplCi0JICBmb3IgdGhhdCBjb25uZWN0aW9uLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX01BVENIX0hFTFBFUgotCXRyaXN0YXRlICJIZWxwZXIgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLX0lQVjQKLQloZWxwCi0JICBIZWxwZXIgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGluIGR5bmFtaWMgY29ubmVjdGlvbnMKLQkgIHRyYWNrZWQgYnkgYSBjb25udHJhY2staGVscGVyLCBpZS4gaXBfY29ubnRyYWNrX2Z0cAotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgWS4KLQotY29uZmlnIElQX05GX01BVENIX1NUQVRFCi0JdHJpc3RhdGUgIkNvbm5lY3Rpb24gc3RhdGUgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLX0lQVjQKLQloZWxwCi0JICBDb25uZWN0aW9uIHN0YXRlIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGVpcgotCSAgcmVsYXRpb25zaGlwIHRvIGEgdHJhY2tlZCBjb25uZWN0aW9uIChpZS4gcHJldmlvdXMgcGFja2V0cykuICBUaGlzCi0JICBpcyBhIHBvd2VyZnVsIHRvb2wgZm9yIHBhY2tldCBjbGFzc2lmaWNhdGlvbi4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9DT05OVFJBQ0sKLQl0cmlzdGF0ZSAiQ29ubmVjdGlvbiB0cmFja2luZyBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0tfSVBWNAotCWhlbHAKLQkgIFRoaXMgaXMgYSBnZW5lcmFsIGNvbm50cmFjayBtYXRjaCBtb2R1bGUsIGEgc3VwZXJzZXQgb2YgdGhlIHN0YXRlIG1hdGNoLgotCi0JICBJdCBhbGxvd3MgbWF0Y2hpbmcgb24gYWRkaXRpb25hbCBjb25udHJhY2sgaW5mb3JtYXRpb24sIHdoaWNoIGlzCi0JICB1c2VmdWwgaW4gY29tcGxleCBjb25maWd1cmF0aW9ucywgc3VjaCBhcyBOQVQgZ2F0ZXdheXMgd2l0aCBtdWx0aXBsZQotCSAgaW50ZXJuZXQgbGlua3Mgb3IgdHVubmVscy4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9NQVRDSF9PV05FUgogCXRyaXN0YXRlICJPd25lciBtYXRjaCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKQEAgLTM3MiwxNSArMjc5LDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUF9ORl9NQVRDSF9QSFlTREVWCi0JdHJpc3RhdGUgIlBoeXNkZXYgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIEJSSURHRV9ORVRGSUxURVIKLQloZWxwCi0JICBQaHlzZGV2IHBhY2tldCBtYXRjaGluZyBtYXRjaGVzIGFnYWluc3QgdGhlIHBoeXNpY2FsIGJyaWRnZSBwb3J0cwotCSAgdGhlIElQIHBhY2tldCBhcnJpdmVkIG9uIG9yIHdpbGwgbGVhdmUgYnkuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgSVBfTkZfTUFUQ0hfQUREUlRZUEUKIAl0cmlzdGF0ZSAgJ2FkZHJlc3MgdHlwZSBtYXRjaCBzdXBwb3J0JwogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKQEAgLTM5MSw3NSArMjg5LDYgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgogCi1jb25maWcgSVBfTkZfTUFUQ0hfUkVBTE0KLQl0cmlzdGF0ZSAgJ3JlYWxtIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCXNlbGVjdCBORVRfQ0xTX1JPVVRFCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGByZWFsbScgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gdXNlIHRoZSByZWFsbQotCSAga2V5IGZyb20gdGhlIHJvdXRpbmcgc3Vic3lzdGVtIGluc2lkZSBpcHRhYmxlcy4KLQkKLQkgIFRoaXMgbWF0Y2ggcHJldHR5IG11Y2ggcmVzZW1ibGVzIHRoZSBDT05GSUdfTkVUX0NMU19ST1VURTQgb3B0aW9uIAotCSAgaW4gdGMgd29ybGQuCi0JCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KLQotY29uZmlnIElQX05GX01BVENIX1NDVFAKLQl0cmlzdGF0ZSAgJ1NDVFAgcHJvdG9jb2wgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgV2l0aCB0aGlzIG9wdGlvbiBlbmFibGVkLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgaXB0YWJsZXMKLQkgIGBzY3RwJyBtYXRjaCBpbiBvcmRlciB0byBtYXRjaCBvbiBTQ1RQIHNvdXJjZS9kZXN0aW5hdGlvbiBwb3J0cwotCSAgYW5kIFNDVFAgY2h1bmsgdHlwZXMuCi0KLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgotCi1jb25maWcgSVBfTkZfTUFUQ0hfRENDUAotCXRyaXN0YXRlICAnRENDUCBwcm90b2NvbCBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBXaXRoIHRoaXMgb3B0aW9uIGVuYWJsZWQsIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlIHRoZSBpcHRhYmxlcwotCSAgYGRjY3AnIG1hdGNoIGluIG9yZGVyIHRvIG1hdGNoIG9uIERDQ1Agc291cmNlL2Rlc3RpbmF0aW9uIHBvcnRzCi0JICBhbmQgRENDUCBmbGFncy4KLQotCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9DT01NRU5UCi0JdHJpc3RhdGUgICdjb21tZW50IG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgY29tbWVudCcgZHVtbXktbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gcHV0Ci0JICBjb21tZW50cyBpbiB5b3VyIGlwdGFibGVzIHJ1bGVzZXQuCi0KLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgotCi1jb25maWcgSVBfTkZfTUFUQ0hfQ09OTk1BUksKLQl0cmlzdGF0ZSAgJ0Nvbm5lY3Rpb24gbWFyayBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQlkZXBlbmRzIG9uIChJUF9ORl9DT05OVFJBQ0sgJiYgSVBfTkZfQ09OTlRSQUNLX01BUkspIHx8IChORl9DT05OVFJBQ0tfTUFSSyAmJiBORl9DT05OVFJBQ0tfSVBWNCkKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhZGRzIGEgYGNvbm5tYXJrJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBtYXRjaCB0aGUKLQkgIGNvbm5lY3Rpb24gbWFyayB2YWx1ZSBwcmV2aW91c2x5IHNldCBmb3IgdGhlIHNlc3Npb24gYnkgYENPTk5NQVJLJy4gCi0JCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKLQkgIGlwdF9jb25ubWFyay5vLiAgSWYgdW5zdXJlLCBzYXkgYE4nLgotCi1jb25maWcgSVBfTkZfTUFUQ0hfQ09OTkJZVEVTCi0JdHJpc3RhdGUgICdDb25uZWN0aW9uIGJ5dGUvcGFja2V0IGNvdW50ZXIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JZGVwZW5kcyBvbiAoSVBfTkZfQ09OTlRSQUNLICYmIElQX05GX0NUX0FDQ1QpIHx8IChORl9DVF9BQ0NUICYmIE5GX0NPTk5UUkFDS19JUFY0KQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgY29ubmJ5dGVzJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBtYXRjaCB0aGUKLQkgIG51bWJlciBvZiBieXRlcyBhbmQvb3IgcGFja2V0cyBmb3IgZWFjaCBkaXJlY3Rpb24gd2l0aGluIGEgY29ubmVjdGlvbi4KLQotCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCi0KIGNvbmZpZyBJUF9ORl9NQVRDSF9IQVNITElNSVQKIAl0cmlzdGF0ZSAgJ2hhc2hsaW1pdCBtYXRjaCBzdXBwb3J0JwogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKQEAgLTQ3NCwxOSArMzAzLDYgQEAKIAkgIGRlc3RpbmF0aW9uIElQJyBvciBgNTAwcHBzIGZyb20gYW55IGdpdmVuIHNvdXJjZSBJUCcgIHdpdGggYSBzaW5nbGUKIAkgIElQdGFibGVzIHJ1bGUuCiAKLWNvbmZpZyBJUF9ORl9NQVRDSF9TVFJJTkcKLQl0cmlzdGF0ZSAgJ3N0cmluZyBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgCi0Jc2VsZWN0IFRFWFRTRUFSQ0gKLQlzZWxlY3QgVEVYVFNFQVJDSF9LTVAKLQlzZWxlY3QgVEVYVFNFQVJDSF9CTQotCXNlbGVjdCBURVhUU0VBUkNIX0ZTTQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgc3RyaW5nJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBsb29rIGZvcgotCSAgcGF0dGVybiBtYXRjaGluZ3MgaW4gcGFja2V0cy4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9NQVRDSF9QT0xJQ1kKICAgICAgICB0cmlzdGF0ZSAiSVBzZWMgcG9saWN5IG1hdGNoIHN1cHBvcnQiCiAgICAgICAgZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBYRlJNCkBAIC01NzIsMTcgKzM4OCw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVBfTkZfVEFSR0VUX05GUVVFVUUKLQl0cmlzdGF0ZSAiTkZRVUVVRSBUYXJnZXQgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgVGhpcyBUYXJnZXQgcmVwbGFjZWQgdGhlIG9sZCBvYnNvbGV0ZSBRVUVVRSB0YXJnZXQuCi0KLQkgIEFzIG9wcG9zZWQgdG8gUVVFVUUsIGl0IHN1cHBvcnRzIDY1NTM1IGRpZmZlcmVudCBxdWV1ZXMsCi0JICBub3QganVzdCBvbmUuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiAjIE5BVCArIHNwZWNpZmljIHRhcmdldHMKIGNvbmZpZyBJUF9ORl9OQVQKIAl0cmlzdGF0ZSAiRnVsbCBOQVQiCkBAIC03MzUsMzEgKzU0MCw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVBfTkZfVEFSR0VUX01BUksKLQl0cmlzdGF0ZSAiTUFSSyB0YXJnZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX01BTkdMRQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgTUFSSycgdGFyZ2V0LCB3aGljaCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBydWxlcwotCSAgaW4gdGhlIGBtYW5nbGUnIHRhYmxlIHdoaWNoIGFsdGVyIHRoZSBuZXRmaWx0ZXIgbWFyayAobmZtYXJrKSBmaWVsZAotCSAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrZXQgcHJpb3IgdG8gcm91dGluZy4gVGhpcyBjYW4gY2hhbmdlCi0JICB0aGUgcm91dGluZyBtZXRob2QgKHNlZSBgVXNlIG5ldGZpbHRlciBNQVJLIHZhbHVlIGFzIHJvdXRpbmcKLQkgIGtleScpIGFuZCBjYW4gYWxzbyBiZSB1c2VkIGJ5IG90aGVyIHN1YnN5c3RlbXMgdG8gY2hhbmdlIHRoZWlyCi0JICBiZWhhdmlvci4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBJUF9ORl9UQVJHRVRfQ0xBU1NJRlkKLQl0cmlzdGF0ZSAiQ0xBU1NJRlkgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9NQU5HTEUKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhZGRzIGEgYENMQVNTSUZZJyB0YXJnZXQsIHdoaWNoIGVuYWJsZXMgdGhlIHVzZXIgdG8gc2V0Ci0JICB0aGUgcHJpb3JpdHkgb2YgYSBwYWNrZXQuIFNvbWUgcWRpc2NzIGNhbiB1c2UgdGhpcyB2YWx1ZSBmb3IKLQkgIGNsYXNzaWZpY2F0aW9uLCBhbW9uZyB0aGVzZSBhcmU6Ci0KLSAgCSAgYXRtLCBjYnEsIGRzbWFyaywgcGZpZm9fZmFzdCwgaHRiLCBwcmlvCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgSVBfTkZfVEFSR0VUX1RUTAogCXRyaXN0YXRlICAnVFRMIHRhcmdldCBzdXBwb3J0JwogCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFCkBAIC03NzQsMTkgKzU1NCw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVBfTkZfVEFSR0VUX0NPTk5NQVJLCi0JdHJpc3RhdGUgICdDT05OTUFSSyB0YXJnZXQgc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX01BTkdMRQotCWRlcGVuZHMgb24gKElQX05GX0NPTk5UUkFDSyAmJiBJUF9ORl9DT05OVFJBQ0tfTUFSSykgfHwgKE5GX0NPTk5UUkFDS19NQVJLICYmIE5GX0NPTk5UUkFDS19JUFY0KQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgQ09OTk1BUksnIHRhcmdldCwgd2hpY2ggYWxsb3dzIG9uZSB0byBtYW5pcHVsYXRlCi0JICB0aGUgY29ubmVjdGlvbiBtYXJrIHZhbHVlLiAgU2ltaWxhciB0byB0aGUgTUFSSyB0YXJnZXQsIGJ1dAotCSAgYWZmZWN0cyB0aGUgY29ubmVjdGlvbiBtYXJrIHZhbHVlIHJhdGhlciB0aGFuIHRoZSBwYWNrZXQgbWFyayB2YWx1ZS4KLQkKLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAotCSAgaXB0X0NPTk5NQVJLLm8uICBJZiB1bnN1cmUsIHNheSBgTicuCi0KIGNvbmZpZyBJUF9ORl9UQVJHRVRfQ0xVU1RFUklQCiAJdHJpc3RhdGUgIkNMVVNURVJJUCB0YXJnZXQgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIElQX05GX01BTkdMRSAmJiBFWFBFUklNRU5UQUwKQEAgLTgxMCwyMyArNTc3LDEwIEBACiAJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCiAJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KIAotY29uZmlnIElQX05GX1RBUkdFVF9OT1RSQUNLCi0JdHJpc3RhdGUgICdOT1RSQUNLIHRhcmdldCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfUkFXCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLX0lQVjQKLQloZWxwCi0JICBUaGUgTk9UUkFDSyB0YXJnZXQgYWxsb3dzIGEgc2VsZWN0IHJ1bGUgdG8gc3BlY2lmeQotCSAgd2hpY2ggcGFja2V0cyAqbm90KiB0byBlbnRlciB0aGUgY29ubnRyYWNrL05BVAotCSAgc3Vic3lzdGVtIHdpdGggYWxsIHRoZSBjb25zZXF1ZW5jZXMgKG5vIElDTVAgZXJyb3IgdHJhY2tpbmcsCi0JICBubyBwcm90b2NvbCBoZWxwZXJzIGZvciB0aGUgc2VsZWN0ZWQgcGFja2V0cykuCi0JCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KLQotCiAjIEFSUCB0YWJsZXMKIGNvbmZpZyBJUF9ORl9BUlBUQUJMRVMKIAl0cmlzdGF0ZSAiQVJQIHRhYmxlcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAloZWxwCiAJICBhcnB0YWJsZXMgaXMgYSBnZW5lcmFsLCBleHRlbnNpYmxlIHBhY2tldCBpZGVudGlmaWNhdGlvbiBmcmFtZXdvcmsuCiAJICBUaGUgQVJQIHBhY2tldCBmaWx0ZXJpbmcgYW5kIG1hbmdsaW5nIChtYW5pcHVsYXRpb24pc3Vic3lzdGVtcwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IDU0OWIwMWEuLmJjZWZlNjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTQ3LDE0ICs0Nyw4IEBACiAKICMgbWF0Y2hlcwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0hFTFBFUikgKz0gaXB0X2hlbHBlci5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfTElNSVQpICs9IGlwdF9saW1pdC5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfSEFTSExJTUlUKSArPSBpcHRfaGFzaGxpbWl0Lm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9TQ1RQKSArPSBpcHRfc2N0cC5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfRENDUCkgKz0gaXB0X2RjY3Aubwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX01BUkspICs9IGlwdF9tYXJrLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9NQUMpICs9IGlwdF9tYWMubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0lQUkFOR0UpICs9IGlwdF9pcHJhbmdlLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9QS1RUWVBFKSArPSBpcHRfcGt0dHlwZS5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfTVVMVElQT1JUKSArPSBpcHRfbXVsdGlwb3J0Lm8KIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9PV05FUikgKz0gaXB0X293bmVyLm8KIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9UT1MpICs9IGlwdF90b3MubwpAQCAtNjIsNDAgKzU2LDI1IEBACiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfRUNOKSArPSBpcHRfZWNuLm8KIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9EU0NQKSArPSBpcHRfZHNjcC5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQKSArPSBpcHRfYWgubyBpcHRfZXNwLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9MRU5HVEgpICs9IGlwdF9sZW5ndGgubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1RUTCkgKz0gaXB0X3R0bC5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfU1RBVEUpICs9IGlwdF9zdGF0ZS5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQ09OTk1BUkspICs9IGlwdF9jb25ubWFyay5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQ09OTlRSQUNLKSArPSBpcHRfY29ubnRyYWNrLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9DT05OQllURVMpICs9IGlwdF9jb25uYnl0ZXMubwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1RDUE1TUykgKz0gaXB0X3RjcG1zcy5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfUkVBTE0pICs9IGlwdF9yZWFsbS5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQUREUlRZUEUpICs9IGlwdF9hZGRydHlwZS5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfUEhZU0RFVikgKz0gaXB0X3BoeXNkZXYubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1BPTElDWSkgKz0gaXB0X3BvbGljeS5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQ09NTUVOVCkgKz0gaXB0X2NvbW1lbnQubwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1NUUklORykgKz0gaXB0X3N0cmluZy5vCiAKICMgdGFyZ2V0cwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1QpICs9IGlwdF9SRUpFQ1Qubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9UT1MpICs9IGlwdF9UT1Mubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9FQ04pICs9IGlwdF9FQ04ubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9EU0NQKSArPSBpcHRfRFNDUC5vCi1vYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX01BUkspICs9IGlwdF9NQVJLLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERSkgKz0gaXB0X01BU1FVRVJBREUubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVCkgKz0gaXB0X1JFRElSRUNULm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQKSArPSBpcHRfTkVUTUFQLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfU0FNRSkgKz0gaXB0X1NBTUUubwotb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9DTEFTU0lGWSkgKz0gaXB0X0NMQVNTSUZZLm8KIG9iai0kKENPTkZJR19JUF9ORl9OQVRfU05NUF9CQVNJQykgKz0gaXBfbmF0X3NubXBfYmFzaWMubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9MT0cpICs9IGlwdF9MT0cubwotb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9DT05OTUFSSykgKz0gaXB0X0NPTk5NQVJLLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfVUxPRykgKz0gaXB0X1VMT0cubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9UQ1BNU1MpICs9IGlwdF9UQ1BNU1Mubwotb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9OT1RSQUNLKSArPSBpcHRfTk9UUkFDSy5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX0NMVVNURVJJUCkgKz0gaXB0X0NMVVNURVJJUC5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX1RUTCkgKz0gaXB0X1RUTC5vCi1vYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX05GUVVFVUUpICs9IGlwdF9ORlFVRVVFLm8KIAogIyBnZW5lcmljIEFSUCB0YWJsZXMKIG9iai0kKENPTkZJR19JUF9ORl9BUlBUQUJMRVMpICs9IGFycF90YWJsZXMubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMKaW5kZXggYjZkNTI4NC4uYWZlM2Q4ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtNTUsMjggKzU2LDkgQEAKICNlbHNlCiAjZGVmaW5lIEFSUF9ORl9BU1NFUlQoeCkKICNlbmRpZgotI2RlZmluZSBTTVBfQUxJR04oeCkgKCgoeCkgKyBTTVBfQ0FDSEVfQllURVMtMSkgJiB+KFNNUF9DQUNIRV9CWVRFUy0xKSkKIAotc3RhdGljIERFQ0xBUkVfTVVURVgoYXJwdF9tdXRleCk7Ci0KLSNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KSBBUlBfTkZfQVNTRVJUKGRvd25fdHJ5bG9jaygmYXJwdF9tdXRleCkgIT0gMCkKLSNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkgQVJQX05GX0FTU0VSVChkb3duX3RyeWxvY2soJmFycHRfbXV0ZXgpICE9IDApCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbGlzdGhlbHAuaD4KIAotc3RydWN0IGFycHRfdGFibGVfaW5mbyB7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0JdW5zaWduZWQgaW50IG51bWJlcjsKLQl1bnNpZ25lZCBpbnQgaW5pdGlhbF9lbnRyaWVzOwotCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0FSUF9OVU1IT09LU107Ci0JdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9BUlBfTlVNSE9PS1NdOwotCXZvaWQgKmVudHJpZXNbTlJfQ1BVU107Ci19OwotCi1zdGF0aWMgTElTVF9IRUFEKGFycHRfdGFyZ2V0KTsKLXN0YXRpYyBMSVNUX0hFQUQoYXJwdF90YWJsZXMpOwotI2RlZmluZSBTRVRfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCA9IChiKTsgKGMpLnBjbnQgPSAocCk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQUREX0NPVU5URVIoYyxiLHApIGRvIHsgKGMpLmJjbnQgKz0gKGIpOyAoYykucGNudCArPSAocCk7IH0gd2hpbGUoMCkKLQogc3RhdGljIGlubGluZSBpbnQgYXJwX2RldmFkZHJfY29tcGFyZShjb25zdCBzdHJ1Y3QgYXJwdF9kZXZhZGRyX2luZm8gKmFwLAogCQkJCSAgICAgIGNoYXIgKmhkcl9hZGRyLCBpbnQgbGVuKQogewpAQCAtMjIzLDkgKzIwNSw5IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYXJwdF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCiAJCQkgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCiAJCQkgICAgICAgdm9pZCAqdXNlcmluZm8pCiB7CkBAIC0yNTQsNiArMjM2LDcgQEAKIAlzdHJ1Y3QgYXJwdF9lbnRyeSAqZSwgKmJhY2s7CiAJY29uc3QgY2hhciAqaW5kZXYsICpvdXRkZXY7CiAJdm9pZCAqdGFibGVfYmFzZTsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSA9IHRhYmxlLT5wcml2YXRlOwogCiAJLyogQVJQIGhlYWRlciwgcGx1cyAyIGRldmljZSBhZGRyZXNzZXMsIHBsdXMgMiBJUCBhZGRyZXNzZXMuICAqLwogCWlmICghcHNrYl9tYXlfcHVsbCgoKnBza2IpLCAoc2l6ZW9mKHN0cnVjdCBhcnBoZHIpICsKQEAgLTI2NSw5ICsyNDgsOSBAQAogCW91dGRldiA9IG91dCA/IG91dC0+bmFtZSA6IG51bGxkZXZuYW1lOwogCiAJcmVhZF9sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0JdGFibGVfYmFzZSA9ICh2b2lkICopdGFibGUtPnByaXZhdGUtPmVudHJpZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKLQllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHRhYmxlLT5wcml2YXRlLT5ob29rX2VudHJ5W2hvb2tdKTsKLQliYWNrID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHRhYmxlLT5wcml2YXRlLT51bmRlcmZsb3dbaG9va10pOworCXRhYmxlX2Jhc2UgPSAodm9pZCAqKXByaXZhdGUtPmVudHJpZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHByaXZhdGUtPmhvb2tfZW50cnlbaG9va10pOworCWJhY2sgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgcHJpdmF0ZS0+dW5kZXJmbG93W2hvb2tdKTsKIAogCWFycCA9ICgqcHNrYiktPm5oLmFycGg7CiAJZG8gewpAQCAtMzE1LDggKzI5OCw4IEBACiAJCQkJICogYWJzLiB2ZXJkaWN0cwogCQkJCSAqLwogCQkJCXZlcmRpY3QgPSB0LT51Lmtlcm5lbC50YXJnZXQtPnRhcmdldChwc2tiLAotCQkJCQkJCQkgICAgIGhvb2ssCiAJCQkJCQkJCSAgICAgaW4sIG91dCwKKwkJCQkJCQkJICAgICBob29rLAogCQkJCQkJCQkgICAgIHQtPmRhdGEsCiAJCQkJCQkJCSAgICAgdXNlcmRhdGEpOwogCkBAIC0zNDEsMTA2ICszMjQsNiBAQAogCQlyZXR1cm4gdmVyZGljdDsKIH0KIAotLyoKLSAqIFRoZXNlIGFyZSB3ZWlyZCwgYnV0IG1vZHVsZSBsb2FkaW5nIG11c3Qgbm90IGJlIGRvbmUgd2l0aCBtdXRleAotICogaGVsZCAoc2luY2UgdGhleSB3aWxsIHJlZ2lzdGVyKSwgYW5kIHdlIGhhdmUgdG8gaGF2ZSBhIHNpbmdsZQotICogZnVuY3Rpb24gdG8gdXNlIHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKCkuCi0gKi8KLQotLyogRmluZCB0YWJsZSBieSBuYW1lLCBncmFicyBtdXRleCAmIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgYXJwdF90YWJsZSAqZmluZF90YWJsZV9sb2NrKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGFycHRfdGFibGUgKnQ7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhcnB0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmYXJwdF90YWJsZXMsIGxpc3QpCi0JCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldCh0LT5tZSkpCi0JCQlyZXR1cm4gdDsKLQl1cCgmYXJwdF9tdXRleCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyogRmluZCB0YXJnZXQsIGdyYWJzIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgYXJwdF90YXJnZXQgKmZpbmRfdGFyZ2V0KGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQotewotCXN0cnVjdCBhcnB0X3RhcmdldCAqdDsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFycHRfbXV0ZXgpICE9IDApCi0JCXJldHVybiBFUlJfUFRSKC1FSU5UUik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZhcnB0X3RhcmdldCwgbGlzdCkgewotCQlpZiAoc3RyY21wKHQtPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCWlmICh0LT5yZXZpc2lvbiA9PSByZXZpc2lvbikgewotCQkJCWlmICh0cnlfbW9kdWxlX2dldCh0LT5tZSkpIHsKLQkJCQkJdXAoJmFycHRfbXV0ZXgpOwotCQkJCQlyZXR1cm4gdDsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQllcnIgPSAtRVBST1RPVFlQRTsgLyogRm91bmQgc29tZXRoaW5nLiAqLwotCQl9Ci0JfQotCXVwKCZhcnB0X211dGV4KTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi1zdHJ1Y3QgYXJwdF90YXJnZXQgKmFycHRfZmluZF90YXJnZXQoY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCi17Ci0Jc3RydWN0IGFycHRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLQl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhcmdldChuYW1lLCByZXZpc2lvbiksCi0JCQkJCSAiYXJwdF8lcyIsIG5hbWUpOwotCWlmIChJU19FUlIodGFyZ2V0KSB8fCAhdGFyZ2V0KQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gdGFyZ2V0OwotfQotCi1zdGF0aWMgaW50IHRhcmdldF9yZXZmbihjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50ICpiZXN0cCkKLXsKLQlzdHJ1Y3QgYXJwdF90YXJnZXQgKnQ7Ci0JaW50IGhhdmVfcmV2ID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmFycHRfdGFyZ2V0LCBsaXN0KSB7Ci0JCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJaWYgKHQtPnJldmlzaW9uID4gKmJlc3RwKQotCQkJCSpiZXN0cCA9IHQtPnJldmlzaW9uOwotCQkJaWYgKHQtPnJldmlzaW9uID09IHJldmlzaW9uKQotCQkJCWhhdmVfcmV2ID0xOwotCQl9Ci0JfQotCXJldHVybiBoYXZlX3JldjsKLX0KLQotLyogUmV0dXJucyB0cnVlIG9yIGZhbHNlIChpZiBubyBzdWNoIGV4dGVuc2lvbiBhdCBhbGwpICovCi1zdGF0aWMgaW5saW5lIGludCBmaW5kX3JldmlzaW9uKGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLAotCQkJCWludCAoKnJldmZuKShjb25zdCBjaGFyICosIHU4LCBpbnQgKiksCi0JCQkJaW50ICplcnIpCi17Ci0JaW50IGhhdmVfcmV2LCBiZXN0ID0gLTE7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhcnB0X211dGV4KSAhPSAwKSB7Ci0JCSplcnIgPSAtRUlOVFI7Ci0JCXJldHVybiAxOwotCX0KLQloYXZlX3JldiA9IHJldmZuKG5hbWUsIHJldmlzaW9uLCAmYmVzdCk7Ci0JdXAoJmFycHRfbXV0ZXgpOwotCi0JLyogTm90aGluZyBhdCBhbGw/ICBSZXR1cm4gMCB0byB0cnkgbG9hZGluZyBtb2R1bGUuICovCi0JaWYgKGJlc3QgPT0gLTEpIHsKLQkJKmVyciA9IC1FTk9FTlQ7Ci0JCXJldHVybiAwOwotCX0KLQotCSplcnIgPSBiZXN0OwotCWlmICghaGF2ZV9yZXYpCi0JCSplcnIgPSAtRVBST1RPTk9TVVBQT1JUOwotCXJldHVybiAxOwotfQotCi0KIC8qIEFsbCB6ZXJvZXMgPT0gdW5jb25kaXRpb25hbCBydWxlLiAqLwogc3RhdGljIGlubGluZSBpbnQgdW5jb25kaXRpb25hbChjb25zdCBzdHJ1Y3QgYXJwdF9hcnAgKmFycCkKIHsKQEAgLTQ1Niw3ICszMzksNyBAQAogLyogRmlndXJlcyBvdXQgZnJvbSB3aGF0IGhvb2sgZWFjaCBydWxlIGNhbiBiZSBjYWxsZWQ6IHJldHVybnMgMCBpZgogICogdGhlcmUgYXJlIGxvb3BzLiAgUHV0cyBob29rIGJpdG1hc2sgaW4gY29tZWZyb20uCiAgKi8KLXN0YXRpYyBpbnQgbWFya19zb3VyY2VfY2hhaW5zKHN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKm5ld2luZm8sCitzdGF0aWMgaW50IG1hcmtfc291cmNlX2NoYWlucyhzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKIAkJCSAgICAgIHVuc2lnbmVkIGludCB2YWxpZF9ob29rcywgdm9pZCAqZW50cnkwKQogewogCXVuc2lnbmVkIGludCBob29rOwpAQCAtNTg3LDggKzQ3MCw4IEBACiAJfQogCiAJdCA9IGFycHRfZ2V0X3RhcmdldChlKTsKLQl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhcmdldCh0LT51LnVzZXIubmFtZSwKLQkJCQkJCSAgICAgdC0+dS51c2VyLnJldmlzaW9uKSwKKwl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhcmdldChORl9BUlAsIHQtPnUudXNlci5uYW1lLAorCQkJCQkJCXQtPnUudXNlci5yZXZpc2lvbiksCiAJCQkJCSAiYXJwdF8lcyIsIHQtPnUudXNlci5uYW1lKTsKIAlpZiAoSVNfRVJSKHRhcmdldCkgfHwgIXRhcmdldCkgewogCQlkdXByaW50ZigiY2hlY2tfZW50cnk6IGAlcycgbm90IGZvdW5kXG4iLCB0LT51LnVzZXIubmFtZSk7CkBAIC02MjIsNyArNTA1LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfZW50cnlfc2l6ZV9hbmRfaG9va3Moc3RydWN0IGFycHRfZW50cnkgKmUsCi0JCQkJCSAgICAgc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJCQkJICAgICBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKIAkJCQkJICAgICB1bnNpZ25lZCBjaGFyICpiYXNlLAogCQkJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmxpbWl0LAogCQkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqaG9va19lbnRyaWVzLApAQCAtNjU2LDcgKzUzOSw3IEBACiAgICAgICAgICAgIDwgMCAobm90IEFSUFRfUkVUVVJOKS4gLS1SUiAqLwogCiAJLyogQ2xlYXIgY291bnRlcnMgYW5kIGNvbWVmcm9tICovCi0JZS0+Y291bnRlcnMgPSAoKHN0cnVjdCBhcnB0X2NvdW50ZXJzKSB7IDAsIDAgfSk7CisJZS0+Y291bnRlcnMgPSAoKHN0cnVjdCB4dF9jb3VudGVycykgeyAwLCAwIH0pOwogCWUtPmNvbWVmcm9tID0gMDsKIAogCSgqaSkrKzsKQEAgLTY4Myw3ICs1NjYsNyBAQAogICovCiBzdGF0aWMgaW50IHRyYW5zbGF0ZV90YWJsZShjb25zdCBjaGFyICpuYW1lLAogCQkJICAgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLAotCQkJICAgc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJCSAgIHN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLAogCQkJICAgdm9pZCAqZW50cnkwLAogCQkJICAgdW5zaWduZWQgaW50IHNpemUsCiAJCQkgICB1bnNpZ25lZCBpbnQgbnVtYmVyLApAQCAtNzY0LDM0ICs2NDcsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICpyZXBsYWNlX3RhYmxlKHN0cnVjdCBhcnB0X3RhYmxlICp0YWJsZSwKLQkJCQkJICAgICB1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzLAotCQkJCQkgICAgIHN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKm5ld2luZm8sCi0JCQkJCSAgICAgaW50ICplcnJvcikKLXsKLQlzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICpvbGRpbmZvOwotCi0JLyogRG8gdGhlIHN1YnN0aXR1dGlvbi4gKi8KLQl3cml0ZV9sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0JLyogQ2hlY2sgaW5zaWRlIGxvY2s6IGlzIHRoZSBvbGQgbnVtYmVyIGNvcnJlY3Q/ICovCi0JaWYgKG51bV9jb3VudGVycyAhPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyKSB7Ci0JCWR1cHJpbnRmKCJudW1fY291bnRlcnMgIT0gdGFibGUtPnByaXZhdGUtPm51bWJlciAoJXUvJXUpXG4iLAotCQkJIG51bV9jb3VudGVycywgdGFibGUtPnByaXZhdGUtPm51bWJlcik7Ci0JCXdyaXRlX3VubG9ja19iaCgmdGFibGUtPmxvY2spOwotCQkqZXJyb3IgPSAtRUFHQUlOOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb2xkaW5mbyA9IHRhYmxlLT5wcml2YXRlOwotCXRhYmxlLT5wcml2YXRlID0gbmV3aW5mbzsKLQluZXdpbmZvLT5pbml0aWFsX2VudHJpZXMgPSBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXM7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0KLQlyZXR1cm4gb2xkaW5mbzsKLX0KLQogLyogR2V0cyBjb3VudGVycy4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGFkZF9lbnRyeV90b19jb3VudGVyKGNvbnN0IHN0cnVjdCBhcnB0X2VudHJ5ICplLAotCQkJCSAgICAgICBzdHJ1Y3QgYXJwdF9jb3VudGVycyB0b3RhbFtdLAorCQkJCSAgICAgICBzdHJ1Y3QgeHRfY291bnRlcnMgdG90YWxbXSwKIAkJCQkgICAgICAgdW5zaWduZWQgaW50ICppKQogewogCUFERF9DT1VOVEVSKHRvdGFsWyppXSwgZS0+Y291bnRlcnMuYmNudCwgZS0+Y291bnRlcnMucGNudCk7CkBAIC04MDEsNyArNjU5LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgc2V0X2VudHJ5X3RvX2NvdW50ZXIoY29uc3Qgc3RydWN0IGFycHRfZW50cnkgKmUsCi0JCQkJICAgICAgIHN0cnVjdCBhcnB0X2NvdW50ZXJzIHRvdGFsW10sCisJCQkJICAgICAgIHN0cnVjdCB4dF9jb3VudGVycyB0b3RhbFtdLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmkpCiB7CiAJU0VUX0NPVU5URVIodG90YWxbKmldLCBlLT5jb3VudGVycy5iY250LCBlLT5jb3VudGVycy5wY250KTsKQEAgLTgxMCw4ICs2NjgsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBnZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IGFycHRfdGFibGVfaW5mbyAqdCwKLQkJCSBzdHJ1Y3QgYXJwdF9jb3VudGVycyBjb3VudGVyc1tdKQorc3RhdGljIHZvaWQgZ2V0X2NvdW50ZXJzKGNvbnN0IHN0cnVjdCB4dF90YWJsZV9pbmZvICp0LAorCQkJIHN0cnVjdCB4dF9jb3VudGVycyBjb3VudGVyc1tdKQogewogCXVuc2lnbmVkIGludCBjcHU7CiAJdW5zaWduZWQgaW50IGk7CkBAIC04NDksNyArNzA3LDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgb2ZmLCBudW0sIGNvdW50ZXJzaXplOwogCXN0cnVjdCBhcnB0X2VudHJ5ICplOwotCXN0cnVjdCBhcnB0X2NvdW50ZXJzICpjb3VudGVyczsKKwlzdHJ1Y3QgeHRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlID0gdGFibGUtPnByaXZhdGU7CiAJaW50IHJldCA9IDA7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeTsKIApAQCAtODU3LDE4ICs3MTYsMTggQEAKIAkgKiAob3RoZXIgdGhhbiBjb21lZnJvbSwgd2hpY2ggdXNlcnNwYWNlIGRvZXNuJ3QgY2FyZQogCSAqIGFib3V0KS4KIAkgKi8KLQljb3VudGVyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXJwdF9jb3VudGVycykgKiB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOwotCWNvdW50ZXJzID0gdm1hbGxvYyhjb3VudGVyc2l6ZSk7CisJY291bnRlcnNpemUgPSBzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSAqIHByaXZhdGUtPm51bWJlcjsKKwljb3VudGVycyA9IHZtYWxsb2Nfbm9kZShjb3VudGVyc2l6ZSwgbnVtYV9ub2RlX2lkKCkpOwogCiAJaWYgKGNvdW50ZXJzID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogRmlyc3QsIHN1bSBjb3VudGVycy4uLiAqLwogCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQlnZXRfY291bnRlcnModGFibGUtPnByaXZhdGUsIGNvdW50ZXJzKTsKKwlnZXRfY291bnRlcnMocHJpdmF0ZSwgY291bnRlcnMpOwogCXdyaXRlX3VubG9ja19iaCgmdGFibGUtPmxvY2spOwogCi0JbG9jX2NwdV9lbnRyeSA9IHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOworCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCS8qIC4uLiB0aGVuIGNvcHkgZW50aXJlIHRoaW5nIC4uLiAqLwogCWlmIChjb3B5X3RvX3VzZXIodXNlcnB0ciwgbG9jX2NwdV9lbnRyeSwgdG90YWxfc2l6ZSkgIT0gMCkgewogCQlyZXQgPSAtRUZBVUxUOwpAQCAtOTExLDc1ICs3NzAsMzQgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBhcnB0X3RhYmxlICp0OwogCi0JdCA9IGZpbmRfdGFibGVfbG9jayhlbnRyaWVzLT5uYW1lKTsKKwl0ID0geHRfZmluZF90YWJsZV9sb2NrKE5GX0FSUCwgZW50cmllcy0+bmFtZSk7CiAJaWYgKHQgfHwgIUlTX0VSUih0KSkgeworCQlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSA9IHQtPnByaXZhdGU7CiAJCWR1cHJpbnRmKCJ0LT5wcml2YXRlLT5udW1iZXIgPSAldVxuIiwKLQkJCSB0LT5wcml2YXRlLT5udW1iZXIpOwotCQlpZiAoZW50cmllcy0+c2l6ZSA9PSB0LT5wcml2YXRlLT5zaXplKQotCQkJcmV0ID0gY29weV9lbnRyaWVzX3RvX3VzZXIodC0+cHJpdmF0ZS0+c2l6ZSwKKwkJCSBwcml2YXRlLT5udW1iZXIpOworCQlpZiAoZW50cmllcy0+c2l6ZSA9PSBwcml2YXRlLT5zaXplKQorCQkJcmV0ID0gY29weV9lbnRyaWVzX3RvX3VzZXIocHJpdmF0ZS0+c2l6ZSwKIAkJCQkJCSAgIHQsIHVwdHItPmVudHJ5dGFibGUpOwogCQllbHNlIHsKIAkJCWR1cHJpbnRmKCJnZXRfZW50cmllczogSSd2ZSBnb3QgJXUgbm90ICV1IVxuIiwKLQkJCQkgdC0+cHJpdmF0ZS0+c2l6ZSwKLQkJCQkgZW50cmllcy0+c2l6ZSk7CisJCQkJIHByaXZhdGUtPnNpemUsIGVudHJpZXMtPnNpemUpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJfQogCQltb2R1bGVfcHV0KHQtPm1lKTsKLQkJdXAoJmFycHRfbXV0ZXgpOworCQl4dF90YWJsZV91bmxvY2sodCk7CiAJfSBlbHNlCiAJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfdGFibGVfaW5mbyhzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICppbmZvKQotewotCWludCBjcHU7Ci0JZm9yX2VhY2hfY3B1KGNwdSkgewotCQlpZiAoaW5mby0+c2l6ZSA8PSBQQUdFX1NJWkUpCi0JCQlrZnJlZShpbmZvLT5lbnRyaWVzW2NwdV0pOwotCQllbHNlCi0JCQl2ZnJlZShpbmZvLT5lbnRyaWVzW2NwdV0pOwotCX0KLQlrZnJlZShpbmZvKTsKLX0KLQotc3RhdGljIHN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKmFsbG9jX3RhYmxlX2luZm8odW5zaWduZWQgaW50IHNpemUpCi17Ci0Jc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbzsKLQlpbnQgY3B1OwotCQotCW5ld2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXdpbmZvKQotCQlyZXR1cm4gTlVMTDsKLQotCW5ld2luZm8tPnNpemUgPSBzaXplOwotCi0JZm9yX2VhY2hfY3B1KGNwdSkgewotCQlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCi0JCQluZXdpbmZvLT5lbnRyaWVzW2NwdV0gPSBrbWFsbG9jX25vZGUoc2l6ZSwKLQkJCQkJCQlHRlBfS0VSTkVMLAotCQkJCQkJCWNwdV90b19ub2RlKGNwdSkpOwotCQllbHNlCi0JCQluZXdpbmZvLT5lbnRyaWVzW2NwdV0gPSB2bWFsbG9jX25vZGUoc2l6ZSwKLQkJCQkJCQkgICAgIGNwdV90b19ub2RlKGNwdSkpOwotCi0JCWlmIChuZXdpbmZvLT5lbnRyaWVzW2NwdV0gPT0gTlVMTCkgewotCQkJZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbmV3aW5mbzsKLX0KLQogc3RhdGljIGludCBkb19yZXBsYWNlKHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCWludCByZXQ7CiAJc3RydWN0IGFycHRfcmVwbGFjZSB0bXA7CiAJc3RydWN0IGFycHRfdGFibGUgKnQ7Ci0Jc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbywgKm9sZGluZm87Ci0Jc3RydWN0IGFycHRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLCAqb2xkaW5mbzsKKwlzdHJ1Y3QgeHRfY291bnRlcnMgKmNvdW50ZXJzOwogCXZvaWQgKmxvY19jcHVfZW50cnksICpsb2NfY3B1X29sZF9lbnRyeTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXplb2YodG1wKSkgIT0gMCkKQEAgLTk4OSwxMSArODA3LDcgQEAKIAlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLnNpemUpCiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAKLQkvKiBQZWRhbnRyeTogcHJldmVudCB0aGVtIGZyb20gaGl0dGluZyBCVUcoKSBpbiB2bWFsbG9jLmMgLS1SUiAqLwotCWlmICgoU01QX0FMSUdOKHRtcC5zaXplKSA+PiBQQUdFX1NISUZUKSArIDIgPiBudW1fcGh5c3BhZ2VzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW5ld2luZm8gPSBhbGxvY190YWJsZV9pbmZvKHRtcC5zaXplKTsKKwluZXdpbmZvID0geHRfYWxsb2NfdGFibGVfaW5mbyh0bXAuc2l6ZSk7CiAJaWYgKCFuZXdpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTAwNSw3ICs4MTksNyBAQAogCQlnb3RvIGZyZWVfbmV3aW5mbzsKIAl9CiAKLQljb3VudGVycyA9IHZtYWxsb2ModG1wLm51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgYXJwdF9jb3VudGVycykpOworCWNvdW50ZXJzID0gdm1hbGxvYyh0bXAubnVtX2NvdW50ZXJzICogc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykpOwogCWlmICghY291bnRlcnMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmcmVlX25ld2luZm87CkBAIC0xMDE5LDcgKzgzMyw3IEBACiAKIAlkdXByaW50ZigiYXJwX3RhYmxlczogVHJhbnNsYXRlZCB0YWJsZVxuIik7CiAKLQl0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF90YWJsZV9sb2NrKHRtcC5uYW1lKSwKKwl0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YWJsZV9sb2NrKE5GX0FSUCwgdG1wLm5hbWUpLAogCQkJCSAgICAiYXJwdGFibGVfJXMiLCB0bXAubmFtZSk7CiAJaWYgKCF0IHx8IElTX0VSUih0KSkgewogCQlyZXQgPSB0ID8gUFRSX0VSUih0KSA6IC1FTk9FTlQ7CkBAIC0xMDM0LDcgKzg0OCw3IEBACiAJCWdvdG8gcHV0X21vZHVsZTsKIAl9CiAKLQlvbGRpbmZvID0gcmVwbGFjZV90YWJsZSh0LCB0bXAubnVtX2NvdW50ZXJzLCBuZXdpbmZvLCAmcmV0KTsKKwlvbGRpbmZvID0geHRfcmVwbGFjZV90YWJsZSh0LCB0bXAubnVtX2NvdW50ZXJzLCBuZXdpbmZvLCAmcmV0KTsKIAlpZiAoIW9sZGluZm8pCiAJCWdvdG8gcHV0X21vZHVsZTsKIApAQCAtMTA1NCwyMyArODY4LDIzIEBACiAJbG9jX2NwdV9vbGRfZW50cnkgPSBvbGRpbmZvLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCUFSUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X29sZF9lbnRyeSwgb2xkaW5mby0+c2l6ZSwgY2xlYW51cF9lbnRyeSxOVUxMKTsKIAotCWZyZWVfdGFibGVfaW5mbyhvbGRpbmZvKTsKKwl4dF9mcmVlX3RhYmxlX2luZm8ob2xkaW5mbyk7CiAJaWYgKGNvcHlfdG9fdXNlcih0bXAuY291bnRlcnMsIGNvdW50ZXJzLAotCQkJIHNpemVvZihzdHJ1Y3QgYXJwdF9jb3VudGVycykgKiB0bXAubnVtX2NvdW50ZXJzKSAhPSAwKQorCQkJIHNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpICogdG1wLm51bV9jb3VudGVycykgIT0gMCkKIAkJcmV0ID0gLUVGQVVMVDsKIAl2ZnJlZShjb3VudGVycyk7Ci0JdXAoJmFycHRfbXV0ZXgpOworCXh0X3RhYmxlX3VubG9jayh0KTsKIAlyZXR1cm4gcmV0OwogCiAgcHV0X21vZHVsZToKIAltb2R1bGVfcHV0KHQtPm1lKTsKLQl1cCgmYXJwdF9tdXRleCk7CisJeHRfdGFibGVfdW5sb2NrKHQpOwogIGZyZWVfbmV3aW5mb19jb3VudGVyc191bnRyYW5zOgogCUFSUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LCBuZXdpbmZvLT5zaXplLCBjbGVhbnVwX2VudHJ5LCBOVUxMKTsKICBmcmVlX25ld2luZm9fY291bnRlcnM6CiAJdmZyZWUoY291bnRlcnMpOwogIGZyZWVfbmV3aW5mbzoKLQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwNzgsNyArODkyLDcgQEAKICAqIGFuZCBldmVyeXRoaW5nIGlzIE9LLgogICovCiBzdGF0aWMgaW5saW5lIGludCBhZGRfY291bnRlcl90b19lbnRyeShzdHJ1Y3QgYXJwdF9lbnRyeSAqZSwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGFycHRfY291bnRlcnMgYWRkbWVbXSwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHh0X2NvdW50ZXJzIGFkZG1lW10sCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCAqaSkKIHsKIApAQCAtMTA5MSwxNSArOTA1LDE2IEBACiBzdGF0aWMgaW50IGRvX2FkZF9jb3VudGVycyh2b2lkIF9fdXNlciAqdXNlciwgdW5zaWduZWQgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgYXJwdF9jb3VudGVyc19pbmZvIHRtcCwgKnBhZGRjOworCXN0cnVjdCB4dF9jb3VudGVyc19pbmZvIHRtcCwgKnBhZGRjOwogCXN0cnVjdCBhcnB0X3RhYmxlICp0OworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOwogCWludCByZXQgPSAwOwogCXZvaWQgKmxvY19jcHVfZW50cnk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlciwgc2l6ZW9mKHRtcCkpICE9IDApCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKGxlbiAhPSBzaXplb2YodG1wKSArIHRtcC5udW1fY291bnRlcnMqc2l6ZW9mKHN0cnVjdCBhcnB0X2NvdW50ZXJzKSkKKwlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLm51bV9jb3VudGVycypzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwYWRkYyA9IHZtYWxsb2MobGVuKTsKQEAgLTExMTEsMjkgKzkyNiwzMCBAQAogCQlnb3RvIGZyZWU7CiAJfQogCi0JdCA9IGZpbmRfdGFibGVfbG9jayh0bXAubmFtZSk7CisJdCA9IHh0X2ZpbmRfdGFibGVfbG9jayhORl9BUlAsIHRtcC5uYW1lKTsKIAlpZiAoIXQgfHwgSVNfRVJSKHQpKSB7CiAJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKIAkJZ290byBmcmVlOwogCX0KIAogCXdyaXRlX2xvY2tfYmgoJnQtPmxvY2spOwotCWlmICh0LT5wcml2YXRlLT5udW1iZXIgIT0gcGFkZGMtPm51bV9jb3VudGVycykgeworCXByaXZhdGUgPSB0LT5wcml2YXRlOworCWlmIChwcml2YXRlLT5udW1iZXIgIT0gcGFkZGMtPm51bV9jb3VudGVycykgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIHVubG9ja191cF9mcmVlOwogCX0KIAogCWkgPSAwOwogCS8qIENob29zZSB0aGUgY29weSB0aGF0IGlzIG9uIG91ciBub2RlICovCi0JbG9jX2NwdV9lbnRyeSA9IHQtPnByaXZhdGUtPmVudHJpZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlsb2NfY3B1X2VudHJ5ID0gcHJpdmF0ZS0+ZW50cmllc1tzbXBfcHJvY2Vzc29yX2lkKCldOwogCUFSUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LAotCQkJICAgdC0+cHJpdmF0ZS0+c2l6ZSwKKwkJCSAgIHByaXZhdGUtPnNpemUsCiAJCQkgICBhZGRfY291bnRlcl90b19lbnRyeSwKIAkJCSAgIHBhZGRjLT5jb3VudGVycywKIAkJCSAgICZpKTsKICB1bmxvY2tfdXBfZnJlZToKIAl3cml0ZV91bmxvY2tfYmgoJnQtPmxvY2spOwotCXVwKCZhcnB0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAJbW9kdWxlX3B1dCh0LT5tZSk7CiAgZnJlZToKIAl2ZnJlZShwYWRkYyk7CkBAIC0xMTkwLDI1ICsxMDA2LDI2IEBACiAJCX0KIAkJbmFtZVtBUlBUX1RBQkxFX01BWE5BTUVMRU4tMV0gPSAnXDAnOwogCi0JCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhYmxlX2xvY2sobmFtZSksCisJCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhYmxlX2xvY2soTkZfQVJQLCBuYW1lKSwKIAkJCQkJICAgICJhcnB0YWJsZV8lcyIsIG5hbWUpOwogCQlpZiAodCAmJiAhSVNfRVJSKHQpKSB7CiAJCQlzdHJ1Y3QgYXJwdF9nZXRpbmZvIGluZm87CisJCQlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSA9IHQtPnByaXZhdGU7CiAKIAkJCWluZm8udmFsaWRfaG9va3MgPSB0LT52YWxpZF9ob29rczsKLQkJCW1lbWNweShpbmZvLmhvb2tfZW50cnksIHQtPnByaXZhdGUtPmhvb2tfZW50cnksCisJCQltZW1jcHkoaW5mby5ob29rX2VudHJ5LCBwcml2YXRlLT5ob29rX2VudHJ5LAogCQkJICAgICAgIHNpemVvZihpbmZvLmhvb2tfZW50cnkpKTsKLQkJCW1lbWNweShpbmZvLnVuZGVyZmxvdywgdC0+cHJpdmF0ZS0+dW5kZXJmbG93LAorCQkJbWVtY3B5KGluZm8udW5kZXJmbG93LCBwcml2YXRlLT51bmRlcmZsb3csCiAJCQkgICAgICAgc2l6ZW9mKGluZm8udW5kZXJmbG93KSk7Ci0JCQlpbmZvLm51bV9lbnRyaWVzID0gdC0+cHJpdmF0ZS0+bnVtYmVyOwotCQkJaW5mby5zaXplID0gdC0+cHJpdmF0ZS0+c2l6ZTsKKwkJCWluZm8ubnVtX2VudHJpZXMgPSBwcml2YXRlLT5udW1iZXI7CisJCQlpbmZvLnNpemUgPSBwcml2YXRlLT5zaXplOwogCQkJc3RyY3B5KGluZm8ubmFtZSwgbmFtZSk7CiAKIAkJCWlmIChjb3B5X3RvX3VzZXIodXNlciwgJmluZm8sICpsZW4pICE9IDApCiAJCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWVsc2UKIAkJCQlyZXQgPSAwOwotCQkJdXAoJmFycHRfbXV0ZXgpOworCQkJeHRfdGFibGVfdW5sb2NrKHQpOwogCQkJbW9kdWxlX3B1dCh0LT5tZSk7CiAJCX0gZWxzZQogCQkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwpAQCAtMTIzMyw3ICsxMDUwLDcgQEAKIAl9CiAKIAljYXNlIEFSUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVDogewotCQlzdHJ1Y3QgYXJwdF9nZXRfcmV2aXNpb24gcmV2OworCQlzdHJ1Y3QgeHRfZ2V0X3JldmlzaW9uIHJldjsKIAogCQlpZiAoKmxlbiAhPSBzaXplb2YocmV2KSkgewogCQkJcmV0ID0gLUVJTlZBTDsKQEAgLTEyNDQsOCArMTA2MSw4IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfcmV2aXNpb24ocmV2Lm5hbWUsIHJldi5yZXZpc2lvbiwKLQkJCQkJCSAgICAgIHRhcmdldF9yZXZmbiwgJnJldCksCisJCXRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfcmV2aXNpb24oTkZfQVJQLCByZXYubmFtZSwKKwkJCQkJCQkgcmV2LnJldmlzaW9uLCAxLCAmcmV0KSwKIAkJCQkJImFycHRfJXMiLCByZXYubmFtZSk7CiAJCWJyZWFrOwogCX0KQEAgLTEyNTgsMzggKzEwNzUsMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCi1pbnQgYXJwdF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGFycHRfdGFyZ2V0ICp0YXJnZXQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmYXJwdF9tdXRleCk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCi0JbGlzdF9hZGQoJnRhcmdldC0+bGlzdCwgJmFycHRfdGFyZ2V0KTsKLQl1cCgmYXJwdF9tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGFycHRfdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGFycHRfdGFyZ2V0ICp0YXJnZXQpCi17Ci0JZG93bigmYXJwdF9tdXRleCk7Ci0JTElTVF9ERUxFVEUoJmFycHRfdGFyZ2V0LCB0YXJnZXQpOwotCXVwKCZhcnB0X211dGV4KTsKLX0KLQogaW50IGFycHRfcmVnaXN0ZXJfdGFibGUoc3RydWN0IGFycHRfdGFibGUgKnRhYmxlLAogCQkJY29uc3Qgc3RydWN0IGFycHRfcmVwbGFjZSAqcmVwbCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKm5ld2luZm87Ci0Jc3RhdGljIHN0cnVjdCBhcnB0X3RhYmxlX2luZm8gYm9vdHN0cmFwCisJc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm87CisJc3RhdGljIHN0cnVjdCB4dF90YWJsZV9pbmZvIGJvb3RzdHJhcAogCQk9IHsgMCwgMCwgMCwgeyAwIH0sIHsgMCB9LCB7IH0gfTsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCi0JbmV3aW5mbyA9IGFsbG9jX3RhYmxlX2luZm8ocmVwbC0+c2l6ZSk7CisJbmV3aW5mbyA9IHh0X2FsbG9jX3RhYmxlX2luZm8ocmVwbC0+c2l6ZSk7CiAJaWYgKCFuZXdpbmZvKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCXJldHVybiByZXQ7CkBAIC0xMzA0LDYwICsxMDk5LDMzIEBACiAJCQkgICAgICByZXBsLT5udW1fZW50cmllcywKIAkJCSAgICAgIHJlcGwtPmhvb2tfZW50cnksCiAJCQkgICAgICByZXBsLT51bmRlcmZsb3cpOworCiAJZHVwcmludGYoImFycHRfcmVnaXN0ZXJfdGFibGU6IHRyYW5zbGF0ZSB0YWJsZSBnaXZlcyAlZFxuIiwgcmV0KTsKIAlpZiAocmV0ICE9IDApIHsKLQkJZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOworCQl4dF9mcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZhcnB0X211dGV4KTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOworCWlmICh4dF9yZWdpc3Rlcl90YWJsZSh0YWJsZSwgJmJvb3RzdHJhcCwgbmV3aW5mbykgIT0gMCkgeworCQl4dF9mcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogRG9uJ3QgYXV0b2xvYWQ6IHdlJ2QgZWF0IG91ciB0YWlsLi4uICovCi0JaWYgKGxpc3RfbmFtZWRfZmluZCgmYXJwdF90YWJsZXMsIHRhYmxlLT5uYW1lKSkgewotCQlyZXQgPSAtRUVYSVNUOwotCQlnb3RvIGZyZWVfdW5sb2NrOwotCX0KLQotCS8qIFNpbXBsaWZpZXMgcmVwbGFjZV90YWJsZSBjb2RlLiAqLwotCXRhYmxlLT5wcml2YXRlID0gJmJvb3RzdHJhcDsKLQlpZiAoIXJlcGxhY2VfdGFibGUodGFibGUsIDAsIG5ld2luZm8sICZyZXQpKQotCQlnb3RvIGZyZWVfdW5sb2NrOwotCi0JZHVwcmludGYoInRhYmxlLT5wcml2YXRlLT5udW1iZXIgPSAldVxuIiwKLQkJIHRhYmxlLT5wcml2YXRlLT5udW1iZXIpOwotCQotCS8qIHNhdmUgbnVtYmVyIG9mIGluaXRpYWwgZW50cmllcyAqLwotCXRhYmxlLT5wcml2YXRlLT5pbml0aWFsX2VudHJpZXMgPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOwotCi0Jcndsb2NrX2luaXQoJnRhYmxlLT5sb2NrKTsKLQlsaXN0X3ByZXBlbmQoJmFycHRfdGFibGVzLCB0YWJsZSk7Ci0KLSB1bmxvY2s6Ci0JdXAoJmFycHRfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci0KLSBmcmVlX3VubG9jazoKLQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7Ci0JZ290byB1bmxvY2s7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgYXJwdF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCBhcnB0X3RhYmxlICp0YWJsZSkKIHsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCi0JZG93bigmYXJwdF9tdXRleCk7Ci0JTElTVF9ERUxFVEUoJmFycHRfdGFibGVzLCB0YWJsZSk7Ci0JdXAoJmFycHRfbXV0ZXgpOworCXByaXZhdGUgPSB4dF91bnJlZ2lzdGVyX3RhYmxlKHRhYmxlKTsKIAogCS8qIERlY3JlYXNlIG1vZHVsZSB1c2FnZSBjb3VudHMgYW5kIGZyZWUgcmVzb3VyY2VzICovCi0JbG9jX2NwdV9lbnRyeSA9IHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwotCUFSUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LCB0YWJsZS0+cHJpdmF0ZS0+c2l6ZSwKKwlsb2NfY3B1X2VudHJ5ID0gcHJpdmF0ZS0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlBUlBUX0VOVFJZX0lURVJBVEUobG9jX2NwdV9lbnRyeSwgcHJpdmF0ZS0+c2l6ZSwKIAkJCSAgIGNsZWFudXBfZW50cnksIE5VTEwpOwotCWZyZWVfdGFibGVfaW5mbyh0YWJsZS0+cHJpdmF0ZSk7CisJeHRfZnJlZV90YWJsZV9pbmZvKHByaXZhdGUpOwogfQogCiAvKiBUaGUgYnVpbHQtaW4gdGFyZ2V0czogc3RhbmRhcmQgKE5VTEwpIGFuZCBlcnJvci4gKi8KQEAgLTEzODAsNTIgKzExNDgsMTUgQEAKIAkuZ2V0CQk9IGRvX2FycHRfZ2V0X2N0bCwKIH07CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGlubGluZSBpbnQgcHJpbnRfbmFtZShjb25zdCBzdHJ1Y3QgYXJwdF90YWJsZSAqdCwKLQkJCSAgICAgb2ZmX3Qgc3RhcnRfb2Zmc2V0LCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgsCi0JCQkgICAgIG9mZl90ICpwb3MsIHVuc2lnbmVkIGludCAqY291bnQpCi17Ci0JaWYgKCgqY291bnQpKysgPj0gc3RhcnRfb2Zmc2V0KSB7Ci0JCXVuc2lnbmVkIGludCBuYW1lbGVuOwotCi0JCW5hbWVsZW4gPSBzcHJpbnRmKGJ1ZmZlciArICpwb3MsICIlc1xuIiwgdC0+bmFtZSk7Ci0JCWlmICgqcG9zICsgbmFtZWxlbiA+IGxlbmd0aCkgewotCQkJLyogU3RvcCBpdGVyYXRpbmcgKi8KLQkJCXJldHVybiAxOwotCQl9Ci0JCSpwb3MgKz0gbmFtZWxlbjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXJwdF9nZXRfdGFibGVzKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCi17Ci0Jb2ZmX3QgcG9zID0gMDsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXJwdF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlMSVNUX0ZJTkQoJmFycHRfdGFibGVzLCBwcmludF9uYW1lLCBzdHJ1Y3QgYXJwdF90YWJsZSAqLAotCQkgIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgsICZwb3MsICZjb3VudCk7Ci0KLQl1cCgmYXJwdF9tdXRleCk7Ci0KLQkvKiBgc3RhcnQnIGhhY2sgLSBzZWUgZnMvcHJvYy9nZW5lcmljLmMgbGluZSB+MTA1ICovCi0JKnN0YXJ0PShjaGFyICopKCh1bnNpZ25lZCBsb25nKWNvdW50LW9mZnNldCk7Ci0JcmV0dXJuIHBvczsKLX0KLSNlbmRpZiAvKkNPTkZJR19QUk9DX0ZTKi8KLQogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKKwl4dF9wcm90b19pbml0KE5GX0FSUCk7CisKIAkvKiBOb29uZSBlbHNlIHdpbGwgYmUgZG93bmluZyBzZW0gbm93LCBzbyB3ZSB3b24ndCBzbGVlcCAqLwotCWRvd24oJmFycHRfbXV0ZXgpOwotCWxpc3RfYXBwZW5kKCZhcnB0X3RhcmdldCwgJmFycHRfc3RhbmRhcmRfdGFyZ2V0KTsKLQlsaXN0X2FwcGVuZCgmYXJwdF90YXJnZXQsICZhcnB0X2Vycm9yX3RhcmdldCk7Ci0JdXAoJmFycHRfbXV0ZXgpOworCXh0X3JlZ2lzdGVyX3RhcmdldChORl9BUlAsICZhcnB0X3N0YW5kYXJkX3RhcmdldCk7CisJeHRfcmVnaXN0ZXJfdGFyZ2V0KE5GX0FSUCwgJmFycHRfZXJyb3JfdGFyZ2V0KTsKIAogCS8qIFJlZ2lzdGVyIHNldHNvY2tvcHQgKi8KIAlyZXQgPSBuZl9yZWdpc3Rlcl9zb2Nrb3B0KCZhcnB0X3NvY2tvcHRzKTsKQEAgLTE0MzQsMTkgKzExNjUsNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JewotCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7Ci0KLQkJcHJvYyA9IHByb2NfbmV0X2NyZWF0ZSgiYXJwX3RhYmxlc19uYW1lcyIsIDAsIGFycHRfZ2V0X3RhYmxlcyk7Ci0JCWlmICghcHJvYykgewotCQkJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZhcnB0X3NvY2tvcHRzKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCXByb2MtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JfQotI2VuZGlmCi0KIAlwcmludGsoImFycF90YWJsZXM6IChDKSAyMDAyIERhdmlkIFMuIE1pbGxlclxuIik7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDU0LDE2ICsxMTcyLDEyIEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewogCW5mX3VucmVnaXN0ZXJfc29ja29wdCgmYXJwdF9zb2Nrb3B0cyk7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlwcm9jX25ldF9yZW1vdmUoImFycF90YWJsZXNfbmFtZXMiKTsKLSNlbmRpZgorCXh0X3Byb3RvX2ZpbmkoTkZfQVJQKTsKIH0KIAogRVhQT1JUX1NZTUJPTChhcnB0X3JlZ2lzdGVyX3RhYmxlKTsKIEVYUE9SVF9TWU1CT0woYXJwdF91bnJlZ2lzdGVyX3RhYmxlKTsKIEVYUE9SVF9TWU1CT0woYXJwdF9kb190YWJsZSk7Ci1FWFBPUlRfU1lNQk9MKGFycHRfcmVnaXN0ZXJfdGFyZ2V0KTsKLUVYUE9SVF9TWU1CT0woYXJwdF91bnJlZ2lzdGVyX3RhcmdldCk7CiAKIG1vZHVsZV9pbml0KGluaXQpOwogbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdF9tYW5nbGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnB0X21hbmdsZS5jCmluZGV4IDNlNTkyZWMuLmM5NzY1MGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9hcnB0X21hbmdsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnB0X21hbmdsZS5jCkBAIC04LDggKzgsOSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJhcnB0YWJsZXMgYXJwIHBheWxvYWQgbWFuZ2xlIHRhcmdldCIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci10YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgaG9va251bSwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8sIHZvaWQgKnVzZXJpbmZvKQordGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAorICAgdm9pZCAqdXNlcmluZm8pCiB7CiAJY29uc3Qgc3RydWN0IGFycHRfbWFuZ2xlICptYW5nbGUgPSB0YXJnaW5mbzsKIAlzdHJ1Y3QgYXJwaGRyICphcnA7CkBAIC02NCw3ICs2NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCBzdHJ1Y3QgYXJwdF9lbnRyeSAqZSwgdm9pZCAqdGFyZ2luZm8sCitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZSwgdm9pZCAqdGFyZ2luZm8sCiAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLCB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewogCWNvbnN0IHN0cnVjdCBhcnB0X21hbmdsZSAqbWFuZ2xlID0gdGFyZ2luZm87CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdGFibGVfZmlsdGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdGFibGVfZmlsdGVyLmMKaW5kZXggMGQ3NTlmNS4uZjZhYjQ1ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnB0YWJsZV9maWx0ZXIuYwpAQCAtMTQ1LDYgKzE0NSw3IEBACiAJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKIAkucHJpdmF0ZQk9IE5VTEwsCiAJLm1lCQk9IFRISVNfTU9EVUxFLAorCS5hZgkJPSBORl9BUlAsCiB9OwogCiAvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKaW5kZXggOWRlYzEyOS4uODMzZmNiNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTk0NCw3ICs5NDQsNyBAQAogCiAvKiBTb21lIG1vZHVsZXMgbmVlZCB1cywgYnV0IGRvbid0IGRlcGVuZCBkaXJlY3RseSBvbiBhbnkgc3ltYm9sLgogICAgVGhleSBzaG91bGQgY2FsbCB0aGlzLiAqLwotdm9pZCBuZWVkX2lwX2Nvbm50cmFjayh2b2lkKQordm9pZCBuZWVkX2Nvbm50cmFjayh2b2lkKQogewogfQogCkBAIC05NjIsNyArOTYyLDcgQEAKIEVYUE9SVF9TWU1CT0woaW52ZXJ0X3R1cGxlcHIpOwogRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfYWx0ZXJfcmVwbHkpOwogRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfZGVzdHJveWVkKTsKLUVYUE9SVF9TWU1CT0wobmVlZF9pcF9jb25udHJhY2spOworRVhQT1JUX1NZTUJPTChuZWVkX2Nvbm50cmFjayk7CiBFWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIpOwogRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIpOwogRVhQT1JUX1NZTUJPTChpcF9jdF9pdGVyYXRlX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9ydWxlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYwppbmRleCBjYjY2YjhiLi4xZGU4NjI4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYwpAQCAtOTUsNiArOTUsNyBAQAogCS52YWxpZF9ob29rcwk9IE5BVF9WQUxJRF9IT09LUywKIAkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELAogCS5tZQkJPSBUSElTX01PRFVMRSwKKwkuYWYJCT0gQUZfSU5FVCwKIH07CiAKIC8qIFNvdXJjZSBOQVQgKi8KQEAgLTE2OCw3ICsxNjksNyBAQAogfQogCiBzdGF0aWMgaW50IGlwdF9zbmF0X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCiAJCQkgICAgICAgdm9pZCAqdGFyZ2luZm8sCiAJCQkgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpAQCAtMjAxLDcgKzIwMiw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaXB0X2RuYXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKIAkJCSAgICAgICB2b2lkICp0YXJnaW5mbywKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCmluZGV4IDhiOGExZjAuLmFkNDM4ZmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCkBAIC0zNjQsNyArMzY0LDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCW5lZWRfaXBfY29ubnRyYWNrKCk7CisJbmVlZF9jb25udHJhY2soKTsKIAogCWlmICghaW5pdCkgZ290byBjbGVhbnVwOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKaW5kZXggODc3YmM5Ni4uMjM3MWIyMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYwpAQCAtMiw3ICsyLDcgQEAKICAqIFBhY2tldCBtYXRjaGluZyBjb2RlLgogICoKICAqIENvcHlyaWdodCAoQykgMTk5OSBQYXVsIGBSdXN0eScgUnVzc2VsbCAmIE1pY2hhZWwgSi4gTmV1bGluZwotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA1IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0xMSw2ICsxMSw4IEBACiAgKiAxOSBKYW4gMjAwMiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgogICogCS0gaW5jcmVhc2UgbW9kdWxlIHVzYWdlIGNvdW50IGFzIHNvb24gYXMgd2UgaGF2ZSBydWxlcyBpbnNpZGUKICAqIAkgIGEgdGFibGUKKyAqIDA4IE9jdCAyMDA1IEhhcmFsZCBXZWx0ZSA8bGFmb3JlQG5ldGZpbHRlci5vcmc+CisgKiAJLSBHZW5lcmFsaXplIGludG8gInhfdGFibGVzIiBsYXllciBhbmQgIntpcCxpcDYsYXJwfV90YWJsZXMiCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgpAQCAtMjAsOCArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KICNpbmNsdWRlIDxsaW51eC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtNjIsMTQgKzYzLDYgQEAKICNlbHNlCiAjZGVmaW5lIElQX05GX0FTU0VSVCh4KQogI2VuZGlmCi0jZGVmaW5lIFNNUF9BTElHTih4KSAoKCh4KSArIFNNUF9DQUNIRV9CWVRFUy0xKSAmIH4oU01QX0NBQ0hFX0JZVEVTLTEpKQotCi1zdGF0aWMgREVDTEFSRV9NVVRFWChpcHRfbXV0ZXgpOwotCi0vKiBNdXN0IGhhdmUgbXV0ZXggKi8KLSNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KSBJUF9ORl9BU1NFUlQoZG93bl90cnlsb2NrKCZpcHRfbXV0ZXgpICE9IDApCi0jZGVmaW5lIEFTU0VSVF9XUklURV9MT0NLKHgpIElQX05GX0FTU0VSVChkb3duX3RyeWxvY2soJmlwdF9tdXRleCkgIT0gMCkKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9saXN0aGVscC5oPgogCiAjaWYgMAogLyogQWxsIHRoZSBiZXR0ZXIgdG8gZGVidWcgeW91IHdpdGguLi4gKi8KQEAgLTg2LDM2ICs3OSw2IEBACiAKICAgIEhlbmNlIHRoZSBzdGFydCBvZiBhbnkgdGFibGUgaXMgZ2l2ZW4gYnkgZ2V0X3RhYmxlKCkgYmVsb3cuICAqLwogCi0vKiBUaGUgdGFibGUgaXRzZWxmICovCi1zdHJ1Y3QgaXB0X3RhYmxlX2luZm8KLXsKLQkvKiBTaXplIHBlciB0YWJsZSAqLwotCXVuc2lnbmVkIGludCBzaXplOwotCS8qIE51bWJlciBvZiBlbnRyaWVzOiBGSVhNRS4gLS1SUiAqLwotCXVuc2lnbmVkIGludCBudW1iZXI7Ci0JLyogSW5pdGlhbCBudW1iZXIgb2YgZW50cmllcy4gTmVlZGVkIGZvciBtb2R1bGUgdXNhZ2UgY291bnQgKi8KLQl1bnNpZ25lZCBpbnQgaW5pdGlhbF9lbnRyaWVzOwotCi0JLyogRW50cnkgcG9pbnRzIGFuZCB1bmRlcmZsb3dzICovCi0JdW5zaWduZWQgaW50IGhvb2tfZW50cnlbTkZfSVBfTlVNSE9PS1NdOwotCXVuc2lnbmVkIGludCB1bmRlcmZsb3dbTkZfSVBfTlVNSE9PS1NdOwotCi0JLyogaXB0X2VudHJ5IHRhYmxlczogb25lIHBlciBDUFUgKi8KLQl2b2lkICplbnRyaWVzW05SX0NQVVNdOwotfTsKLQotc3RhdGljIExJU1RfSEVBRChpcHRfdGFyZ2V0KTsKLXN0YXRpYyBMSVNUX0hFQUQoaXB0X21hdGNoKTsKLXN0YXRpYyBMSVNUX0hFQUQoaXB0X3RhYmxlcyk7Ci0jZGVmaW5lIFNFVF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ID0gKGIpOyAoYykucGNudCA9IChwKTsgfSB3aGlsZSgwKQotI2RlZmluZSBBRERfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCArPSAoYik7IChjKS5wY250ICs9IChwKTsgfSB3aGlsZSgwKQotCi0jaWYgMAotI2RlZmluZSBkb3duKHgpIGRvIHsgcHJpbnRrKCJET1dOOiV1OiIgI3ggIlxuIiwgX19MSU5FX18pOyBkb3duKHgpOyB9IHdoaWxlKDApCi0jZGVmaW5lIGRvd25faW50ZXJydXB0aWJsZSh4KSAoeyBpbnQgX19yOyBwcmludGsoIkRPV05pOiV1OiIgI3ggIlxuIiwgX19MSU5FX18pOyBfX3IgPSBkb3duX2ludGVycnVwdGlibGUoeCk7IGlmIChfX3IgIT0gMCkgcHJpbnRrKCJBQk9SVC1ET1dOaToldVxuIiwgX19MSU5FX18pOyBfX3I7IH0pCi0jZGVmaW5lIHVwKHgpIGRvIHsgcHJpbnRrKCJVUDoldToiICN4ICJcbiIsIF9fTElORV9fKTsgdXAoeCk7IH0gd2hpbGUoMCkKLSNlbmRpZgotCiAvKiBSZXR1cm5zIHdoZXRoZXIgbWF0Y2hlcyBydWxlIG9yIG5vdC4gKi8KIHN0YXRpYyBpbmxpbmUgaW50CiBpcF9wYWNrZXRfbWF0Y2goY29uc3Qgc3RydWN0IGlwaGRyICppcCwKQEAgLTIzNCw3ICsxOTcsOCBAQAogCSAgICAgaW50ICpob3Rkcm9wKQogewogCS8qIFN0b3AgaXRlcmF0aW9uIGlmIGl0IGRvZXNuJ3QgbWF0Y2ggKi8KLQlpZiAoIW0tPnUua2VybmVsLm1hdGNoLT5tYXRjaChza2IsIGluLCBvdXQsIG0tPmRhdGEsIG9mZnNldCwgaG90ZHJvcCkpCisJaWYgKCFtLT51Lmtlcm5lbC5tYXRjaC0+bWF0Y2goc2tiLCBpbiwgb3V0LCBtLT5kYXRhLCBvZmZzZXQsIAorCSAgICBza2ItPm5oLmlwaC0+aWhsKjQsIGhvdGRyb3ApKQogCQlyZXR1cm4gMTsKIAllbHNlCiAJCXJldHVybiAwOwpAQCAtMjY1LDYgKzIyOSw3IEBACiAJY29uc3QgY2hhciAqaW5kZXYsICpvdXRkZXY7CiAJdm9pZCAqdGFibGVfYmFzZTsKIAlzdHJ1Y3QgaXB0X2VudHJ5ICplLCAqYmFjazsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSA9IHRhYmxlLT5wcml2YXRlOwogCiAJLyogSW5pdGlhbGl6YXRpb24gKi8KIAlpcCA9ICgqcHNrYiktPm5oLmlwaDsKQEAgLTI4MSwyNCArMjQ2LDExIEBACiAKIAlyZWFkX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKIAlJUF9ORl9BU1NFUlQodGFibGUtPnZhbGlkX2hvb2tzICYgKDEgPDwgaG9vaykpOwotCXRhYmxlX2Jhc2UgPSAodm9pZCAqKXRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3NtcF9wcm9jZXNzb3JfaWQoKV07Ci0JZSA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCB0YWJsZS0+cHJpdmF0ZS0+aG9va19lbnRyeVtob29rXSk7Ci0KLSNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCi0JLyogQ2hlY2sgbm9vbmUgZWxzZSB1c2luZyBvdXIgdGFibGUgKi8KLQlpZiAoKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tICE9IDB4ZGVhZDU3YWMKLQkgICAgJiYgKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tICE9IDB4ZWVlZWVlZWMpIHsKLQkJcHJpbnRrKCJBU1NFUlQ6IENQVSAjJXUsICVzIGNvbWVmcm9tKCVwKSA9ICVYXG4iLAotCQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLAotCQkgICAgICAgdGFibGUtPm5hbWUsCi0JCSAgICAgICAmKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tLAotCQkgICAgICAgKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tKTsKLQl9Ci0JKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tID0gMHg1N2FjYzAwMTsKLSNlbmRpZgorCXRhYmxlX2Jhc2UgPSAodm9pZCAqKXByaXZhdGUtPmVudHJpZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHByaXZhdGUtPmhvb2tfZW50cnlbaG9va10pOwogCiAJLyogRm9yIHJldHVybiBmcm9tIGJ1aWx0aW4gY2hhaW4gKi8KLQliYWNrID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHRhYmxlLT5wcml2YXRlLT51bmRlcmZsb3dbaG9va10pOworCWJhY2sgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgcHJpdmF0ZS0+dW5kZXJmbG93W2hvb2tdKTsKIAogCWRvIHsKIAkJSVBfTkZfQVNTRVJUKGUpOwpAQCAtMzg0LDkgKzMzNiw2IEBACiAJCX0KIAl9IHdoaWxlICghaG90ZHJvcCk7CiAKLSNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCi0JKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tID0gMHhkZWFkNTdhYzsKLSNlbmRpZgogCXJlYWRfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CiAKICNpZmRlZiBERUJVR19BTExPV19BTEwKQEAgLTM5OCwxNDUgKzM0Nyw2IEBACiAjZW5kaWYKIH0KIAotLyoKLSAqIFRoZXNlIGFyZSB3ZWlyZCwgYnV0IG1vZHVsZSBsb2FkaW5nIG11c3Qgbm90IGJlIGRvbmUgd2l0aCBtdXRleAotICogaGVsZCAoc2luY2UgdGhleSB3aWxsIHJlZ2lzdGVyKSwgYW5kIHdlIGhhdmUgdG8gaGF2ZSBhIHNpbmdsZQotICogZnVuY3Rpb24gdG8gdXNlIHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKCkuCi0gKi8KLQotLyogRmluZCB0YWJsZSBieSBuYW1lLCBncmFicyBtdXRleCAmIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXB0X3RhYmxlICpmaW5kX3RhYmxlX2xvY2soY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgaXB0X3RhYmxlICp0OwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXB0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmaXB0X3RhYmxlcywgbGlzdCkKLQkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwICYmIHRyeV9tb2R1bGVfZ2V0KHQtPm1lKSkKLQkJCXJldHVybiB0OwotCXVwKCZpcHRfbXV0ZXgpOwotCXJldHVybiBOVUxMOwotfQotCi0vKiBGaW5kIG1hdGNoLCBncmFicyByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwdF9tYXRjaCAqZmluZF9tYXRjaChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKLXsKLQlzdHJ1Y3QgaXB0X21hdGNoICptOwotCWludCBlcnIgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXB0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShtLCAmaXB0X21hdGNoLCBsaXN0KSB7Ci0JCWlmIChzdHJjbXAobS0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJaWYgKG0tPnJldmlzaW9uID09IHJldmlzaW9uKSB7Ci0JCQkJaWYgKHRyeV9tb2R1bGVfZ2V0KG0tPm1lKSkgewotCQkJCQl1cCgmaXB0X211dGV4KTsKLQkJCQkJcmV0dXJuIG07Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJZXJyID0gLUVQUk9UT1RZUEU7IC8qIEZvdW5kIHNvbWV0aGluZy4gKi8KLQkJfQotCX0KLQl1cCgmaXB0X211dGV4KTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi0vKiBGaW5kIHRhcmdldCwgZ3JhYnMgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcHRfdGFyZ2V0ICpmaW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKLXsKLQlzdHJ1Y3QgaXB0X3RhcmdldCAqdDsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlRSKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmlwdF90YXJnZXQsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAodC0+cmV2aXNpb24gPT0gcmV2aXNpb24pIHsKLQkJCQlpZiAodHJ5X21vZHVsZV9nZXQodC0+bWUpKSB7Ci0JCQkJCXVwKCZpcHRfbXV0ZXgpOwotCQkJCQlyZXR1cm4gdDsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQllcnIgPSAtRVBST1RPVFlQRTsgLyogRm91bmQgc29tZXRoaW5nLiAqLwotCQl9Ci0JfQotCXVwKCZpcHRfbXV0ZXgpOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLXN0cnVjdCBpcHRfdGFyZ2V0ICppcHRfZmluZF90YXJnZXQoY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCi17Ci0Jc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldDsKLQotCXRhcmdldCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFyZ2V0KG5hbWUsIHJldmlzaW9uKSwKLQkJCQkJICJpcHRfJXMiLCBuYW1lKTsKLQlpZiAoSVNfRVJSKHRhcmdldCkgfHwgIXRhcmdldCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHRhcmdldDsKLX0KLQotc3RhdGljIGludCBtYXRjaF9yZXZmbihjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50ICpiZXN0cCkKLXsKLQlzdHJ1Y3QgaXB0X21hdGNoICptOwotCWludCBoYXZlX3JldiA9IDA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZpcHRfbWF0Y2gsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcChtLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAobS0+cmV2aXNpb24gPiAqYmVzdHApCi0JCQkJKmJlc3RwID0gbS0+cmV2aXNpb247Ci0JCQlpZiAobS0+cmV2aXNpb24gPT0gcmV2aXNpb24pCi0JCQkJaGF2ZV9yZXYgPSAxOwotCQl9Ci0JfQotCXJldHVybiBoYXZlX3JldjsKLX0KLQotc3RhdGljIGludCB0YXJnZXRfcmV2Zm4oY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCAqYmVzdHApCi17Ci0Jc3RydWN0IGlwdF90YXJnZXQgKnQ7Ci0JaW50IGhhdmVfcmV2ID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmlwdF90YXJnZXQsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAodC0+cmV2aXNpb24gPiAqYmVzdHApCi0JCQkJKmJlc3RwID0gdC0+cmV2aXNpb247Ci0JCQlpZiAodC0+cmV2aXNpb24gPT0gcmV2aXNpb24pCi0JCQkJaGF2ZV9yZXYgPSAxOwotCQl9Ci0JfQotCXJldHVybiBoYXZlX3JldjsKLX0KLQotLyogUmV0dXJucyB0cnVlIG9yIGZhbHNlIChpZiBubyBzdWNoIGV4dGVuc2lvbiBhdCBhbGwpICovCi1zdGF0aWMgaW5saW5lIGludCBmaW5kX3JldmlzaW9uKGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLAotCQkJCWludCAoKnJldmZuKShjb25zdCBjaGFyICosIHU4LCBpbnQgKiksCi0JCQkJaW50ICplcnIpCi17Ci0JaW50IGhhdmVfcmV2LCBiZXN0ID0gLTE7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcHRfbXV0ZXgpICE9IDApIHsKLQkJKmVyciA9IC1FSU5UUjsKLQkJcmV0dXJuIDE7Ci0JfQotCWhhdmVfcmV2ID0gcmV2Zm4obmFtZSwgcmV2aXNpb24sICZiZXN0KTsKLQl1cCgmaXB0X211dGV4KTsKLQotCS8qIE5vdGhpbmcgYXQgYWxsPyAgUmV0dXJuIDAgdG8gdHJ5IGxvYWRpbmcgbW9kdWxlLiAqLwotCWlmIChiZXN0ID09IC0xKSB7Ci0JCSplcnIgPSAtRU5PRU5UOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkqZXJyID0gYmVzdDsKLQlpZiAoIWhhdmVfcmV2KQotCQkqZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKLQlyZXR1cm4gMTsKLX0KLQotCiAvKiBBbGwgemVyb2VzID09IHVuY29uZGl0aW9uYWwgcnVsZS4gKi8KIHN0YXRpYyBpbmxpbmUgaW50CiB1bmNvbmRpdGlvbmFsKGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwKQpAQCAtNTUzLDcgKzM2Myw3IEBACiAvKiBGaWd1cmVzIG91dCBmcm9tIHdoYXQgaG9vayBlYWNoIHJ1bGUgY2FuIGJlIGNhbGxlZDogcmV0dXJucyAwIGlmCiAgICB0aGVyZSBhcmUgbG9vcHMuICBQdXRzIGhvb2sgYml0bWFzayBpbiBjb21lZnJvbS4gKi8KIHN0YXRpYyBpbnQKLW1hcmtfc291cmNlX2NoYWlucyhzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm5ld2luZm8sCittYXJrX3NvdXJjZV9jaGFpbnMoc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sCiAJCSAgIHVuc2lnbmVkIGludCB2YWxpZF9ob29rcywgdm9pZCAqZW50cnkwKQogewogCXVuc2lnbmVkIGludCBob29rOwpAQCAtNjk5LDcgKzUwOSw3IEBACiB7CiAJc3RydWN0IGlwdF9tYXRjaCAqbWF0Y2g7CiAKLQltYXRjaCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfbWF0Y2gobS0+dS51c2VyLm5hbWUsCisJbWF0Y2ggPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX21hdGNoKEFGX0lORVQsIG0tPnUudXNlci5uYW1lLAogCQkJCQkJICAgbS0+dS51c2VyLnJldmlzaW9uKSwKIAkJCQkJImlwdF8lcyIsIG0tPnUudXNlci5uYW1lKTsKIAlpZiAoSVNfRVJSKG1hdGNoKSB8fCAhbWF0Y2gpIHsKQEAgLTc0NCw3ICs1NTQsOCBAQAogCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKIAogCXQgPSBpcHRfZ2V0X3RhcmdldChlKTsKLQl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhcmdldCh0LT51LnVzZXIubmFtZSwKKwl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhcmdldChBRl9JTkVULAorCQkJCQkJICAgICB0LT51LnVzZXIubmFtZSwKIAkJCQkJCSAgICAgdC0+dS51c2VyLnJldmlzaW9uKSwKIAkJCQkJICJpcHRfJXMiLCB0LT51LnVzZXIubmFtZSk7CiAJaWYgKElTX0VSUih0YXJnZXQpIHx8ICF0YXJnZXQpIHsKQEAgLTc4MSw3ICs1OTIsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludAogY2hlY2tfZW50cnlfc2l6ZV9hbmRfaG9va3Moc3RydWN0IGlwdF9lbnRyeSAqZSwKLQkJCSAgIHN0cnVjdCBpcHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJCSAgIHN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLAogCQkJICAgdW5zaWduZWQgY2hhciAqYmFzZSwKIAkJCSAgIHVuc2lnbmVkIGNoYXIgKmxpbWl0LAogCQkJICAgY29uc3QgdW5zaWduZWQgaW50ICpob29rX2VudHJpZXMsCkBAIC04MTUsNyArNjI2LDcgQEAKICAgICAgICAgICAgPCAwIChub3QgSVBUX1JFVFVSTikuIC0tUlIgKi8KIAogCS8qIENsZWFyIGNvdW50ZXJzIGFuZCBjb21lZnJvbSAqLwotCWUtPmNvdW50ZXJzID0gKChzdHJ1Y3QgaXB0X2NvdW50ZXJzKSB7IDAsIDAgfSk7CisJZS0+Y291bnRlcnMgPSAoKHN0cnVjdCB4dF9jb3VudGVycykgeyAwLCAwIH0pOwogCWUtPmNvbWVmcm9tID0gMDsKIAogCSgqaSkrKzsKQEAgLTg0NSw3ICs2NTYsNyBAQAogc3RhdGljIGludAogdHJhbnNsYXRlX3RhYmxlKGNvbnN0IGNoYXIgKm5hbWUsCiAJCXVuc2lnbmVkIGludCB2YWxpZF9ob29rcywKLQkJc3RydWN0IGlwdF90YWJsZV9pbmZvICpuZXdpbmZvLAorCQlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKIAkJdm9pZCAqZW50cnkwLAogCQl1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJdW5zaWduZWQgaW50IG51bWJlciwKQEAgLTkyMiw0OCArNzMzLDEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFibGVfaW5mbyAqCi1yZXBsYWNlX3RhYmxlKHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlLAotCSAgICAgIHVuc2lnbmVkIGludCBudW1fY291bnRlcnMsCi0JICAgICAgc3RydWN0IGlwdF90YWJsZV9pbmZvICpuZXdpbmZvLAotCSAgICAgIGludCAqZXJyb3IpCi17Ci0Jc3RydWN0IGlwdF90YWJsZV9pbmZvICpvbGRpbmZvOwotCi0jaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRwotCXsKLQkJaW50IGNwdTsKLQotCQlmb3JfZWFjaF9jcHUoY3B1KSB7Ci0JCQlzdHJ1Y3QgaXB0X2VudHJ5ICp0YWJsZV9iYXNlID0gbmV3aW5mby0+ZW50cmllc1tjcHVdOwotCQkJaWYgKHRhYmxlX2Jhc2UpCi0JCQkJdGFibGVfYmFzZS0+Y29tZWZyb20gPSAweGRlYWQ1N2FjOwotCQl9Ci0JfQotI2VuZGlmCi0KLQkvKiBEbyB0aGUgc3Vic3RpdHV0aW9uLiAqLwotCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQkvKiBDaGVjayBpbnNpZGUgbG9jazogaXMgdGhlIG9sZCBudW1iZXIgY29ycmVjdD8gKi8KLQlpZiAobnVtX2NvdW50ZXJzICE9IHRhYmxlLT5wcml2YXRlLT5udW1iZXIpIHsKLQkJZHVwcmludGYoIm51bV9jb3VudGVycyAhPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyICgldS8ldSlcbiIsCi0JCQkgbnVtX2NvdW50ZXJzLCB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0JCSplcnJvciA9IC1FQUdBSU47Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvbGRpbmZvID0gdGFibGUtPnByaXZhdGU7Ci0JdGFibGUtPnByaXZhdGUgPSBuZXdpbmZvOwotCW5ld2luZm8tPmluaXRpYWxfZW50cmllcyA9IG9sZGluZm8tPmluaXRpYWxfZW50cmllczsKLQl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQotCXJldHVybiBvbGRpbmZvOwotfQotCiAvKiBHZXRzIGNvdW50ZXJzLiAqLwogc3RhdGljIGlubGluZSBpbnQKIGFkZF9lbnRyeV90b19jb3VudGVyKGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCi0JCSAgICAgc3RydWN0IGlwdF9jb3VudGVycyB0b3RhbFtdLAorCQkgICAgIHN0cnVjdCB4dF9jb3VudGVycyB0b3RhbFtdLAogCQkgICAgIHVuc2lnbmVkIGludCAqaSkKIHsKIAlBRERfQ09VTlRFUih0b3RhbFsqaV0sIGUtPmNvdW50ZXJzLmJjbnQsIGUtPmNvdW50ZXJzLnBjbnQpOwpAQCAtOTg0LDggKzc1Nyw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1nZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IGlwdF90YWJsZV9pbmZvICp0LAotCSAgICAgc3RydWN0IGlwdF9jb3VudGVycyBjb3VudGVyc1tdKQorZ2V0X2NvdW50ZXJzKGNvbnN0IHN0cnVjdCB4dF90YWJsZV9pbmZvICp0LAorCSAgICAgc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzW10pCiB7CiAJdW5zaWduZWQgaW50IGNwdTsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTEwMjQsMTQgKzc5NywxNSBAQAogewogCXVuc2lnbmVkIGludCBvZmYsIG51bSwgY291bnRlcnNpemU7CiAJc3RydWN0IGlwdF9lbnRyeSAqZTsKLQlzdHJ1Y3QgaXB0X2NvdW50ZXJzICpjb3VudGVyczsKKwlzdHJ1Y3QgeHRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlID0gdGFibGUtPnByaXZhdGU7CiAJaW50IHJldCA9IDA7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeTsKIAogCS8qIFdlIG5lZWQgYXRvbWljIHNuYXBzaG90IG9mIGNvdW50ZXJzOiByZXN0IGRvZXNuJ3QgY2hhbmdlCiAJICAgKG90aGVyIHRoYW4gY29tZWZyb20sIHdoaWNoIHVzZXJzcGFjZSBkb2Vzbid0IGNhcmUKIAkgICBhYm91dCkuICovCi0JY291bnRlcnNpemUgPSBzaXplb2Yoc3RydWN0IGlwdF9jb3VudGVycykgKiB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOworCWNvdW50ZXJzaXplID0gc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykgKiBwcml2YXRlLT5udW1iZXI7CiAJY291bnRlcnMgPSB2bWFsbG9jX25vZGUoY291bnRlcnNpemUsIG51bWFfbm9kZV9pZCgpKTsKIAogCWlmIChjb3VudGVycyA9PSBOVUxMKQpAQCAtMTAzOSwxNCArODEzLDE0IEBACiAKIAkvKiBGaXJzdCwgc3VtIGNvdW50ZXJzLi4uICovCiAJd3JpdGVfbG9ja19iaCgmdGFibGUtPmxvY2spOwotCWdldF9jb3VudGVycyh0YWJsZS0+cHJpdmF0ZSwgY291bnRlcnMpOworCWdldF9jb3VudGVycyhwcml2YXRlLCBjb3VudGVycyk7CiAJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CiAKIAkvKiBjaG9vc2UgdGhlIGNvcHkgdGhhdCBpcyBvbiBvdXIgbm9kZS9jcHUsIC4uLgogCSAqIFRoaXMgY2hvaWNlIGlzIGxhenkgKGJlY2F1c2UgY3VycmVudCB0aHJlYWQgaXMKIAkgKiBhbGxvd2VkIHRvIG1pZ3JhdGUgdG8gYW5vdGhlciBjcHUpCiAJICovCi0JbG9jX2NwdV9lbnRyeSA9IHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOworCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCS8qIC4uLiB0aGVuIGNvcHkgZW50aXJlIHRoaW5nIC4uLiAqLwogCWlmIChjb3B5X3RvX3VzZXIodXNlcnB0ciwgbG9jX2NwdV9lbnRyeSwgdG90YWxfc2l6ZSkgIT0gMCkgewogCQlyZXQgPSAtRUZBVUxUOwpAQCAtMTEwOCw3NCArODgyLDM2IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgaXB0X3RhYmxlICp0OwogCi0JdCA9IGZpbmRfdGFibGVfbG9jayhlbnRyaWVzLT5uYW1lKTsKKwl0ID0geHRfZmluZF90YWJsZV9sb2NrKEFGX0lORVQsIGVudHJpZXMtPm5hbWUpOwogCWlmICh0ICYmICFJU19FUlIodCkpIHsKKwkJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGUgPSB0LT5wcml2YXRlOwogCQlkdXByaW50ZigidC0+cHJpdmF0ZS0+bnVtYmVyID0gJXVcbiIsCi0JCQkgdC0+cHJpdmF0ZS0+bnVtYmVyKTsKLQkJaWYgKGVudHJpZXMtPnNpemUgPT0gdC0+cHJpdmF0ZS0+c2l6ZSkKLQkJCXJldCA9IGNvcHlfZW50cmllc190b191c2VyKHQtPnByaXZhdGUtPnNpemUsCisJCQkgcHJpdmF0ZS0+bnVtYmVyKTsKKwkJaWYgKGVudHJpZXMtPnNpemUgPT0gcHJpdmF0ZS0+c2l6ZSkKKwkJCXJldCA9IGNvcHlfZW50cmllc190b191c2VyKHByaXZhdGUtPnNpemUsCiAJCQkJCQkgICB0LCB1cHRyLT5lbnRyeXRhYmxlKTsKIAkJZWxzZSB7CiAJCQlkdXByaW50ZigiZ2V0X2VudHJpZXM6IEkndmUgZ290ICV1IG5vdCAldSFcbiIsCi0JCQkJIHQtPnByaXZhdGUtPnNpemUsCisJCQkJIHByaXZhdGUtPnNpemUsCiAJCQkJIGVudHJpZXMtPnNpemUpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJfQogCQltb2R1bGVfcHV0KHQtPm1lKTsKLQkJdXAoJmlwdF9tdXRleCk7CisJCXh0X3RhYmxlX3VubG9jayh0KTsKIAl9IGVsc2UKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV90YWJsZV9pbmZvKHN0cnVjdCBpcHRfdGFibGVfaW5mbyAqaW5mbykKLXsKLQlpbnQgY3B1OwotCWZvcl9lYWNoX2NwdShjcHUpIHsKLQkJaWYgKGluZm8tPnNpemUgPD0gUEFHRV9TSVpFKQotCQkJa2ZyZWUoaW5mby0+ZW50cmllc1tjcHVdKTsKLQkJZWxzZQotCQkJdmZyZWUoaW5mby0+ZW50cmllc1tjcHVdKTsKLQl9Ci0Ja2ZyZWUoaW5mbyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKmFsbG9jX3RhYmxlX2luZm8odW5zaWduZWQgaW50IHNpemUpCi17Ci0Jc3RydWN0IGlwdF90YWJsZV9pbmZvICpuZXdpbmZvOwotCWludCBjcHU7Ci0KLQluZXdpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwdF90YWJsZV9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXdpbmZvKQotCQlyZXR1cm4gTlVMTDsKLQotCW5ld2luZm8tPnNpemUgPSBzaXplOwotCi0JZm9yX2VhY2hfY3B1KGNwdSkgewotCQlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCi0JCQluZXdpbmZvLT5lbnRyaWVzW2NwdV0gPSBrbWFsbG9jX25vZGUoc2l6ZSwKLQkJCQlHRlBfS0VSTkVMLAotCQkJCWNwdV90b19ub2RlKGNwdSkpOwotCQllbHNlCi0JCQluZXdpbmZvLT5lbnRyaWVzW2NwdV0gPSB2bWFsbG9jX25vZGUoc2l6ZSwgY3B1X3RvX25vZGUoY3B1KSk7Ci0JCWlmIChuZXdpbmZvLT5lbnRyaWVzW2NwdV0gPT0gMCkgewotCQkJZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbmV3aW5mbzsKLX0KLQogc3RhdGljIGludAogZG9fcmVwbGFjZSh2b2lkIF9fdXNlciAqdXNlciwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBpcHRfcmVwbGFjZSB0bXA7CiAJc3RydWN0IGlwdF90YWJsZSAqdDsKLQlzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm5ld2luZm8sICpvbGRpbmZvOwotCXN0cnVjdCBpcHRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLCAqb2xkaW5mbzsKKwlzdHJ1Y3QgeHRfY291bnRlcnMgKmNvdW50ZXJzOwogCXZvaWQgKmxvY19jcHVfZW50cnksICpsb2NfY3B1X29sZF9lbnRyeTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXplb2YodG1wKSkgIT0gMCkKQEAgLTExODUsMTEgKzkyMSw3IEBACiAJaWYgKGxlbiAhPSBzaXplb2YodG1wKSArIHRtcC5zaXplKQogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCi0JLyogUGVkYW50cnk6IHByZXZlbnQgdGhlbSBmcm9tIGhpdHRpbmcgQlVHKCkgaW4gdm1hbGxvYy5jIC0tUlIgKi8KLQlpZiAoKFNNUF9BTElHTih0bXAuc2l6ZSkgPj4gUEFHRV9TSElGVCkgKyAyID4gbnVtX3BoeXNwYWdlcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQluZXdpbmZvID0gYWxsb2NfdGFibGVfaW5mbyh0bXAuc2l6ZSk7CisJbmV3aW5mbyA9IHh0X2FsbG9jX3RhYmxlX2luZm8odG1wLnNpemUpOwogCWlmICghbmV3aW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEyMDEsNyArOTMzLDcgQEAKIAkJZ290byBmcmVlX25ld2luZm87CiAJfQogCi0JY291bnRlcnMgPSB2bWFsbG9jKHRtcC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IGlwdF9jb3VudGVycykpOworCWNvdW50ZXJzID0gdm1hbGxvYyh0bXAubnVtX2NvdW50ZXJzICogc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykpOwogCWlmICghY291bnRlcnMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmcmVlX25ld2luZm87CkBAIC0xMjE1LDcgKzk0Nyw3IEBACiAKIAlkdXByaW50ZigiaXBfdGFibGVzOiBUcmFuc2xhdGVkIHRhYmxlXG4iKTsKIAotCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhYmxlX2xvY2sodG1wLm5hbWUpLAorCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhYmxlX2xvY2soQUZfSU5FVCwgdG1wLm5hbWUpLAogCQkJCSAgICAiaXB0YWJsZV8lcyIsIHRtcC5uYW1lKTsKIAlpZiAoIXQgfHwgSVNfRVJSKHQpKSB7CiAJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKQEAgLTEyMzAsNyArOTYyLDcgQEAKIAkJZ290byBwdXRfbW9kdWxlOwogCX0KIAotCW9sZGluZm8gPSByZXBsYWNlX3RhYmxlKHQsIHRtcC5udW1fY291bnRlcnMsIG5ld2luZm8sICZyZXQpOworCW9sZGluZm8gPSB4dF9yZXBsYWNlX3RhYmxlKHQsIHRtcC5udW1fY291bnRlcnMsIG5ld2luZm8sICZyZXQpOwogCWlmICghb2xkaW5mbykKIAkJZ290byBwdXRfbW9kdWxlOwogCkBAIC0xMjQ5LDIzICs5ODEsMjMgQEAKIAkvKiBEZWNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnRzIGFuZCBmcmVlIHJlc291cmNlICovCiAJbG9jX2NwdV9vbGRfZW50cnkgPSBvbGRpbmZvLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCUlQVF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfb2xkX2VudHJ5LCBvbGRpbmZvLT5zaXplLCBjbGVhbnVwX2VudHJ5LE5VTEwpOwotCWZyZWVfdGFibGVfaW5mbyhvbGRpbmZvKTsKKwl4dF9mcmVlX3RhYmxlX2luZm8ob2xkaW5mbyk7CiAJaWYgKGNvcHlfdG9fdXNlcih0bXAuY291bnRlcnMsIGNvdW50ZXJzLAotCQkJIHNpemVvZihzdHJ1Y3QgaXB0X2NvdW50ZXJzKSAqIHRtcC5udW1fY291bnRlcnMpICE9IDApCisJCQkgc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykgKiB0bXAubnVtX2NvdW50ZXJzKSAhPSAwKQogCQlyZXQgPSAtRUZBVUxUOwogCXZmcmVlKGNvdW50ZXJzKTsKLQl1cCgmaXB0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAJcmV0dXJuIHJldDsKIAogIHB1dF9tb2R1bGU6CiAJbW9kdWxlX3B1dCh0LT5tZSk7Ci0JdXAoJmlwdF9tdXRleCk7CisJeHRfdGFibGVfdW5sb2NrKHQpOwogIGZyZWVfbmV3aW5mb19jb3VudGVyc191bnRyYW5zOgogCUlQVF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksIG5ld2luZm8tPnNpemUsIGNsZWFudXBfZW50cnksTlVMTCk7CiAgZnJlZV9uZXdpbmZvX2NvdW50ZXJzOgogCXZmcmVlKGNvdW50ZXJzKTsKICBmcmVlX25ld2luZm86Ci0JZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOworCXh0X2ZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjczLDcgKzEwMDUsNyBAQAogICogYW5kIGV2ZXJ5dGhpbmcgaXMgT0suICovCiBzdGF0aWMgaW5saW5lIGludAogYWRkX2NvdW50ZXJfdG9fZW50cnkoc3RydWN0IGlwdF9lbnRyeSAqZSwKLQkJICAgICBjb25zdCBzdHJ1Y3QgaXB0X2NvdW50ZXJzIGFkZG1lW10sCisJCSAgICAgY29uc3Qgc3RydWN0IHh0X2NvdW50ZXJzIGFkZG1lW10sCiAJCSAgICAgdW5zaWduZWQgaW50ICppKQogewogI2lmIDAKQEAgLTEyOTUsMTUgKzEwMjcsMTYgQEAKIGRvX2FkZF9jb3VudGVycyh2b2lkIF9fdXNlciAqdXNlciwgdW5zaWduZWQgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgaXB0X2NvdW50ZXJzX2luZm8gdG1wLCAqcGFkZGM7CisJc3RydWN0IHh0X2NvdW50ZXJzX2luZm8gdG1wLCAqcGFkZGM7CiAJc3RydWN0IGlwdF90YWJsZSAqdDsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKIAlpbnQgcmV0ID0gMDsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXIsIHNpemVvZih0bXApKSAhPSAwKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChsZW4gIT0gc2l6ZW9mKHRtcCkgKyB0bXAubnVtX2NvdW50ZXJzKnNpemVvZihzdHJ1Y3QgaXB0X2NvdW50ZXJzKSkKKwlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLm51bV9jb3VudGVycypzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwYWRkYyA9IHZtYWxsb2Nfbm9kZShsZW4sIG51bWFfbm9kZV9pZCgpKTsKQEAgLTEzMTUsMjkgKzEwNDgsMzAgQEAKIAkJZ290byBmcmVlOwogCX0KIAotCXQgPSBmaW5kX3RhYmxlX2xvY2sodG1wLm5hbWUpOworCXQgPSB4dF9maW5kX3RhYmxlX2xvY2soQUZfSU5FVCwgdG1wLm5hbWUpOwogCWlmICghdCB8fCBJU19FUlIodCkpIHsKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwogCQlnb3RvIGZyZWU7CiAJfQogCiAJd3JpdGVfbG9ja19iaCgmdC0+bG9jayk7Ci0JaWYgKHQtPnByaXZhdGUtPm51bWJlciAhPSBwYWRkYy0+bnVtX2NvdW50ZXJzKSB7CisJcHJpdmF0ZSA9IHQtPnByaXZhdGU7CisJaWYgKHByaXZhdGUtPm51bWJlciAhPSBwYWRkYy0+bnVtX2NvdW50ZXJzKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gdW5sb2NrX3VwX2ZyZWU7CiAJfQogCiAJaSA9IDA7CiAJLyogQ2hvb3NlIHRoZSBjb3B5IHRoYXQgaXMgb24gb3VyIG5vZGUgKi8KLQlsb2NfY3B1X2VudHJ5ID0gdC0+cHJpdmF0ZS0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlsb2NfY3B1X2VudHJ5ID0gcHJpdmF0ZS0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKIAlJUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LAotCQkJICB0LT5wcml2YXRlLT5zaXplLAorCQkJICBwcml2YXRlLT5zaXplLAogCQkJICBhZGRfY291bnRlcl90b19lbnRyeSwKIAkJCSAgcGFkZGMtPmNvdW50ZXJzLAogCQkJICAmaSk7CiAgdW5sb2NrX3VwX2ZyZWU6CiAJd3JpdGVfdW5sb2NrX2JoKCZ0LT5sb2NrKTsKLQl1cCgmaXB0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAJbW9kdWxlX3B1dCh0LT5tZSk7CiAgZnJlZToKIAl2ZnJlZShwYWRkYyk7CkBAIC0xMzk2LDI1ICsxMTMwLDI2IEBACiAJCX0KIAkJbmFtZVtJUFRfVEFCTEVfTUFYTkFNRUxFTi0xXSA9ICdcMCc7CiAKLQkJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFibGVfbG9jayhuYW1lKSwKKwkJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFibGVfbG9jayhBRl9JTkVULCBuYW1lKSwKIAkJCQkJICAgICJpcHRhYmxlXyVzIiwgbmFtZSk7CiAJCWlmICh0ICYmICFJU19FUlIodCkpIHsKIAkJCXN0cnVjdCBpcHRfZ2V0aW5mbyBpbmZvOworCQkJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGUgPSB0LT5wcml2YXRlOwogCiAJCQlpbmZvLnZhbGlkX2hvb2tzID0gdC0+dmFsaWRfaG9va3M7Ci0JCQltZW1jcHkoaW5mby5ob29rX2VudHJ5LCB0LT5wcml2YXRlLT5ob29rX2VudHJ5LAorCQkJbWVtY3B5KGluZm8uaG9va19lbnRyeSwgcHJpdmF0ZS0+aG9va19lbnRyeSwKIAkJCSAgICAgICBzaXplb2YoaW5mby5ob29rX2VudHJ5KSk7Ci0JCQltZW1jcHkoaW5mby51bmRlcmZsb3csIHQtPnByaXZhdGUtPnVuZGVyZmxvdywKKwkJCW1lbWNweShpbmZvLnVuZGVyZmxvdywgcHJpdmF0ZS0+dW5kZXJmbG93LAogCQkJICAgICAgIHNpemVvZihpbmZvLnVuZGVyZmxvdykpOwotCQkJaW5mby5udW1fZW50cmllcyA9IHQtPnByaXZhdGUtPm51bWJlcjsKLQkJCWluZm8uc2l6ZSA9IHQtPnByaXZhdGUtPnNpemU7CisJCQlpbmZvLm51bV9lbnRyaWVzID0gcHJpdmF0ZS0+bnVtYmVyOworCQkJaW5mby5zaXplID0gcHJpdmF0ZS0+c2l6ZTsKIAkJCW1lbWNweShpbmZvLm5hbWUsIG5hbWUsIHNpemVvZihpbmZvLm5hbWUpKTsKIAogCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyLCAmaW5mbywgKmxlbikgIT0gMCkKIAkJCQlyZXQgPSAtRUZBVUxUOwogCQkJZWxzZQogCQkJCXJldCA9IDA7Ci0JCQl1cCgmaXB0X211dGV4KTsKKwkJCXh0X3RhYmxlX3VubG9jayh0KTsKIAkJCW1vZHVsZV9wdXQodC0+bWUpOwogCQl9IGVsc2UKIAkJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKQEAgLTE0NDEsNyArMTE3Niw3IEBACiAJY2FzZSBJUFRfU09fR0VUX1JFVklTSU9OX01BVENIOgogCWNhc2UgSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQ6IHsKIAkJc3RydWN0IGlwdF9nZXRfcmV2aXNpb24gcmV2OwotCQlpbnQgKCpyZXZmbikoY29uc3QgY2hhciAqLCB1OCwgaW50ICopOworCQlpbnQgdGFyZ2V0OwogCiAJCWlmICgqbGVuICE9IHNpemVvZihyZXYpKSB7CiAJCQlyZXQgPSAtRUlOVkFMOwpAQCAtMTQ1MywxMiArMTE4OCwxMyBAQAogCQl9CiAKIAkJaWYgKGNtZCA9PSBJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVCkKLQkJCXJldmZuID0gdGFyZ2V0X3JldmZuOworCQkJdGFyZ2V0ID0gMTsKIAkJZWxzZQotCQkJcmV2Zm4gPSBtYXRjaF9yZXZmbjsKKwkJCXRhcmdldCA9IDA7CiAKLQkJdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF9yZXZpc2lvbihyZXYubmFtZSwgcmV2LnJldmlzaW9uLAotCQkJCQkJICAgICAgcmV2Zm4sICZyZXQpLAorCQl0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3JldmlzaW9uKEFGX0lORVQsIHJldi5uYW1lLAorCQkJCQkJCSByZXYucmV2aXNpb24sCisJCQkJCQkJIHRhcmdldCwgJnJldCksCiAJCQkJCSJpcHRfJXMiLCByZXYubmFtZSk7CiAJCWJyZWFrOwogCX0KQEAgLTE0NzEsNjAgKzEyMDcsMTUgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCi1pbnQKLWlwdF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldCkKK2ludCBpcHRfcmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSwgY29uc3Qgc3RydWN0IGlwdF9yZXBsYWNlICpyZXBsKQogewogCWludCByZXQ7Ci0KLQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCWxpc3RfYWRkKCZ0YXJnZXQtPmxpc3QsICZpcHRfdGFyZ2V0KTsKLQl1cCgmaXB0X211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkCi1pcHRfdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldCkKLXsKLQlkb3duKCZpcHRfbXV0ZXgpOwotCUxJU1RfREVMRVRFKCZpcHRfdGFyZ2V0LCB0YXJnZXQpOwotCXVwKCZpcHRfbXV0ZXgpOwotfQotCi1pbnQKLWlwdF9yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgaXB0X21hdGNoICptYXRjaCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZpcHRfbXV0ZXgpOwotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIHJldDsKLQotCWxpc3RfYWRkKCZtYXRjaC0+bGlzdCwgJmlwdF9tYXRjaCk7Ci0JdXAoJmlwdF9tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkCi1pcHRfdW5yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgaXB0X21hdGNoICptYXRjaCkKLXsKLQlkb3duKCZpcHRfbXV0ZXgpOwotCUxJU1RfREVMRVRFKCZpcHRfbWF0Y2gsIG1hdGNoKTsKLQl1cCgmaXB0X211dGV4KTsKLX0KLQotaW50IGlwdF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSwgY29uc3Qgc3RydWN0IGlwdF9yZXBsYWNlICpyZXBsKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGlwdF90YWJsZV9pbmZvICpuZXdpbmZvOwotCXN0YXRpYyBzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gYm9vdHN0cmFwCisJc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm87CisJc3RhdGljIHN0cnVjdCB4dF90YWJsZV9pbmZvIGJvb3RzdHJhcAogCQk9IHsgMCwgMCwgMCwgeyAwIH0sIHsgMCB9LCB7IH0gfTsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCi0JbmV3aW5mbyA9IGFsbG9jX3RhYmxlX2luZm8ocmVwbC0+c2l6ZSk7CisJbmV3aW5mbyA9IHh0X2FsbG9jX3RhYmxlX2luZm8ocmVwbC0+c2l6ZSk7CiAJaWYgKCFuZXdpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTU0MCwyNDYgKzEyMzEsMjkgQEAKIAkJCSAgICAgIHJlcGwtPmhvb2tfZW50cnksCiAJCQkgICAgICByZXBsLT51bmRlcmZsb3cpOwogCWlmIChyZXQgIT0gMCkgewotCQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJCXh0X2ZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKKwlpZiAoeHRfcmVnaXN0ZXJfdGFibGUodGFibGUsICZib290c3RyYXAsIG5ld2luZm8pICE9IDApIHsKKwkJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIERvbid0IGF1dG9sb2FkOiB3ZSdkIGVhdCBvdXIgdGFpbC4uLiAqLwotCWlmIChsaXN0X25hbWVkX2ZpbmQoJmlwdF90YWJsZXMsIHRhYmxlLT5uYW1lKSkgewotCQlyZXQgPSAtRUVYSVNUOwotCQlnb3RvIGZyZWVfdW5sb2NrOwotCX0KLQotCS8qIFNpbXBsaWZpZXMgcmVwbGFjZV90YWJsZSBjb2RlLiAqLwotCXRhYmxlLT5wcml2YXRlID0gJmJvb3RzdHJhcDsKLQlpZiAoIXJlcGxhY2VfdGFibGUodGFibGUsIDAsIG5ld2luZm8sICZyZXQpKQotCQlnb3RvIGZyZWVfdW5sb2NrOwotCi0JZHVwcmludGYoInRhYmxlLT5wcml2YXRlLT5udW1iZXIgPSAldVxuIiwKLQkJIHRhYmxlLT5wcml2YXRlLT5udW1iZXIpOwotCQotCS8qIHNhdmUgbnVtYmVyIG9mIGluaXRpYWwgZW50cmllcyAqLwotCXRhYmxlLT5wcml2YXRlLT5pbml0aWFsX2VudHJpZXMgPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOwotCi0Jcndsb2NrX2luaXQoJnRhYmxlLT5sb2NrKTsKLQlsaXN0X3ByZXBlbmQoJmlwdF90YWJsZXMsIHRhYmxlKTsKLQotIHVubG9jazoKLQl1cCgmaXB0X211dGV4KTsKLQlyZXR1cm4gcmV0OwotCi0gZnJlZV91bmxvY2s6Ci0JZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwotCWdvdG8gdW5sb2NrOworCXJldHVybiAwOwogfQogCiB2b2lkIGlwdF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlKQogeworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOwogCXZvaWQgKmxvY19jcHVfZW50cnk7CiAKLQlkb3duKCZpcHRfbXV0ZXgpOwotCUxJU1RfREVMRVRFKCZpcHRfdGFibGVzLCB0YWJsZSk7Ci0JdXAoJmlwdF9tdXRleCk7CisgCXByaXZhdGUgPSB4dF91bnJlZ2lzdGVyX3RhYmxlKHRhYmxlKTsKIAogCS8qIERlY3JlYXNlIG1vZHVsZSB1c2FnZSBjb3VudHMgYW5kIGZyZWUgcmVzb3VyY2VzICovCi0JbG9jX2NwdV9lbnRyeSA9IHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwotCUlQVF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksIHRhYmxlLT5wcml2YXRlLT5zaXplLAotCQkJICBjbGVhbnVwX2VudHJ5LCBOVUxMKTsKLQlmcmVlX3RhYmxlX2luZm8odGFibGUtPnByaXZhdGUpOwotfQotCi0vKiBSZXR1cm5zIDEgaWYgdGhlIHBvcnQgaXMgbWF0Y2hlZCBieSB0aGUgcmFuZ2UsIDAgb3RoZXJ3aXNlICovCi1zdGF0aWMgaW5saW5lIGludAotcG9ydF9tYXRjaCh1X2ludDE2X3QgbWluLCB1X2ludDE2X3QgbWF4LCB1X2ludDE2X3QgcG9ydCwgaW50IGludmVydCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gKHBvcnQgPj0gbWluICYmIHBvcnQgPD0gbWF4KSBeIGludmVydDsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci10Y3BfZmluZF9vcHRpb24odV9pbnQ4X3Qgb3B0aW9uLAotCQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQl1bnNpZ25lZCBpbnQgb3B0bGVuLAotCQlpbnQgaW52ZXJ0LAotCQlpbnQgKmhvdGRyb3ApCi17Ci0JLyogdGNwLmRvZmYgaXMgb25seSA0IGJpdHMsIGllLiBtYXggMTUgKiA0IGJ5dGVzICovCi0JdV9pbnQ4X3QgX29wdFs2MCAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKV0sICpvcDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWR1cHJpbnRmKCJ0Y3BfbWF0Y2g6IGZpbmRpbmcgb3B0aW9uXG4iKTsKLQotCWlmICghb3B0bGVuKQotCQlyZXR1cm4gaW52ZXJ0OwotCi0JLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgaGVhZGVyLCBkcm9wIHBhY2tldC4gKi8KLQlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCi0JCQkJc2tiLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLAotCQkJCW9wdGxlbiwgX29wdCk7Ci0JaWYgKG9wID09IE5VTEwpIHsKLQkJKmhvdGRyb3AgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuOyApIHsKLQkJaWYgKG9wW2ldID09IG9wdGlvbikgcmV0dXJuICFpbnZlcnQ7Ci0JCWlmIChvcFtpXSA8IDIpIGkrKzsKLQkJZWxzZSBpICs9IG9wW2krMV0/OjE7Ci0JfQotCi0JcmV0dXJuIGludmVydDsKLX0KLQotc3RhdGljIGludAotdGNwX21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCSAgaW50IG9mZnNldCwKLQkgIGludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7Ci0JY29uc3Qgc3RydWN0IGlwdF90Y3AgKnRjcGluZm8gPSBtYXRjaGluZm87Ci0KLQlpZiAob2Zmc2V0KSB7Ci0JCS8qIFRvIHF1b3RlIEFsYW46Ci0KLQkJICAgRG9uJ3QgYWxsb3cgYSBmcmFnbWVudCBvZiBUQ1AgOCBieXRlcyBpbi4gTm9ib2R5IG5vcm1hbAotCQkgICBjYXVzZXMgdGhpcy4gSXRzIGEgY3JhY2tlciB0cnlpbmcgdG8gYnJlYWsgaW4gYnkgZG9pbmcgYQotCQkgICBmbGFnIG92ZXJ3cml0ZSB0byBwYXNzIHRoZSBkaXJlY3Rpb24gY2hlY2tzLgotCQkqLwotCQlpZiAob2Zmc2V0ID09IDEpIHsKLQkJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MSBmcmFnLlxuIik7Ci0JCQkqaG90ZHJvcCA9IDE7Ci0JCX0KLQkJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KLQkJcmV0dXJuIDA7Ci0JfQotCi0jZGVmaW5lIEZXSU5WVENQKGJvb2wsaW52ZmxnKSAoKGJvb2wpIF4gISEodGNwaW5mby0+aW52ZmxhZ3MgJiBpbnZmbGcpKQotCi0JdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCi0JCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKLQlpZiAodGggPT0gTlVMTCkgewotCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQotCQkgICBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuICovCi0JCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MCB0aW55Z3JhbS5cbiIpOwotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghcG9ydF9tYXRjaCh0Y3BpbmZvLT5zcHRzWzBdLCB0Y3BpbmZvLT5zcHRzWzFdLAotCQkJbnRvaHModGgtPnNvdXJjZSksCi0JCQkhISh0Y3BpbmZvLT5pbnZmbGFncyAmIElQVF9UQ1BfSU5WX1NSQ1BUKSkpCi0JCXJldHVybiAwOwotCWlmICghcG9ydF9tYXRjaCh0Y3BpbmZvLT5kcHRzWzBdLCB0Y3BpbmZvLT5kcHRzWzFdLAotCQkJbnRvaHModGgtPmRlc3QpLAotCQkJISEodGNwaW5mby0+aW52ZmxhZ3MgJiBJUFRfVENQX0lOVl9EU1RQVCkpKQotCQlyZXR1cm4gMDsKLQlpZiAoIUZXSU5WVENQKCgoKHVuc2lnbmVkIGNoYXIgKil0aClbMTNdICYgdGNwaW5mby0+ZmxnX21hc2spCi0JCSAgICAgID09IHRjcGluZm8tPmZsZ19jbXAsCi0JCSAgICAgIElQVF9UQ1BfSU5WX0ZMQUdTKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKHRjcGluZm8tPm9wdGlvbikgewotCQlpZiAodGgtPmRvZmYgKiA0IDwgc2l6ZW9mKF90Y3BoKSkgewotCQkJKmhvdGRyb3AgPSAxOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKCF0Y3BfZmluZF9vcHRpb24odGNwaW5mby0+b3B0aW9uLCBza2IsCi0JCQkJICAgICB0aC0+ZG9mZio0IC0gc2l6ZW9mKF90Y3BoKSwKLQkJCQkgICAgIHRjcGluZm8tPmludmZsYWdzICYgSVBUX1RDUF9JTlZfT1BUSU9OLAotCQkJCSAgICAgaG90ZHJvcCkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KLXN0YXRpYyBpbnQKLXRjcF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JICAgICAgIHZvaWQgKm1hdGNoaW5mbywKLQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKLQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X3RjcCAqdGNwaW5mbyA9IG1hdGNoaW5mbzsKLQotCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBUQ1AsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCi0JcmV0dXJuIGlwLT5wcm90byA9PSBJUFBST1RPX1RDUAotCQkmJiAhKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pCi0JCSYmIG1hdGNoc2l6ZSA9PSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfdGNwKSkKLQkJJiYgISh0Y3BpbmZvLT5pbnZmbGFncyAmIH5JUFRfVENQX0lOVl9NQVNLKTsKLX0KLQotc3RhdGljIGludAotdWRwX21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCSAgaW50IG9mZnNldCwKLQkgIGludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgdWRwaGRyIF91ZHBoLCAqdWg7Ci0JY29uc3Qgc3RydWN0IGlwdF91ZHAgKnVkcGluZm8gPSBtYXRjaGluZm87Ci0KLQkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLwotCWlmIChvZmZzZXQpCi0JCXJldHVybiAwOwotCi0JdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCi0JCQkJc2l6ZW9mKF91ZHBoKSwgJl91ZHBoKTsKLQlpZiAodWggPT0gTlVMTCkgewotCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQotCQkgICBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuICovCi0JCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFVEUCB0aW55Z3JhbS5cbiIpOwotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiBwb3J0X21hdGNoKHVkcGluZm8tPnNwdHNbMF0sIHVkcGluZm8tPnNwdHNbMV0sCi0JCQkgIG50b2hzKHVoLT5zb3VyY2UpLAotCQkJICAhISh1ZHBpbmZvLT5pbnZmbGFncyAmIElQVF9VRFBfSU5WX1NSQ1BUKSkKLQkJJiYgcG9ydF9tYXRjaCh1ZHBpbmZvLT5kcHRzWzBdLCB1ZHBpbmZvLT5kcHRzWzFdLAotCQkJICAgICAgbnRvaHModWgtPmRlc3QpLAotCQkJICAgICAgISEodWRwaW5mby0+aW52ZmxhZ3MgJiBJUFRfVURQX0lOVl9EU1RQVCkpOwotfQotCi0vKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCi1zdGF0aWMgaW50Ci11ZHBfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAotCSAgICAgICB2b2lkICptYXRjaGluZm8sCi0JICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAotCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWNvbnN0IHN0cnVjdCBpcHRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOwotCi0JLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IFVEUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KLQlpZiAoaXAtPnByb3RvICE9IElQUFJPVE9fVURQIHx8IChpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkgewotCQlkdXByaW50ZigiaXB0X3VkcDogUHJvdG9jb2wgJXUgIT0gJXVcbiIsIGlwLT5wcm90bywKLQkJCSBJUFBST1RPX1VEUCk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAobWF0Y2hpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfdWRwKSkpIHsKLQkJZHVwcmludGYoImlwdF91ZHA6IG1hdGNoc2l6ZSAldSAhPSAldVxuIiwKLQkJCSBtYXRjaGluZm9zaXplLCBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfdWRwKSkpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHVkcGluZm8tPmludmZsYWdzICYgfklQVF9VRFBfSU5WX01BU0spIHsKLQkJZHVwcmludGYoImlwdF91ZHA6IHVua25vd24gZmxhZ3MgJVhcbiIsCi0JCQkgdWRwaW5mby0+aW52ZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKKwlsb2NfY3B1X2VudHJ5ID0gcHJpdmF0ZS0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlJUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LCBwcml2YXRlLT5zaXplLCBjbGVhbnVwX2VudHJ5LCBOVUxMKTsKKwl4dF9mcmVlX3RhYmxlX2luZm8ocHJpdmF0ZSk7CiB9CiAKIC8qIFJldHVybnMgMSBpZiB0aGUgdHlwZSBhbmQgY29kZSBpcyBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KQEAgLTE3OTgsNiArMTI3Miw3IEBACiAJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKIAkgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAJICAgaW50IG9mZnNldCwKKwkgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKIAkgICBpbnQgKmhvdGRyb3ApCiB7CiAJc3RydWN0IGljbXBoZHIgX2ljbXBoLCAqaWM7CkBAIC0xODA3LDggKzEyODIsNyBAQAogCWlmIChvZmZzZXQpCiAJCXJldHVybiAwOwogCi0JaWMgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCi0JCQkJc2l6ZW9mKF9pY21waCksICZfaWNtcGgpOworCWljID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF9pY21waCksICZfaWNtcGgpOwogCWlmIChpYyA9PSBOVUxMKSB7CiAJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCiAJCSAqIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4KQEAgLTE4MjgsMTEgKzEzMDIsMTIgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGljbXBfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJICAgY29uc3Qgdm9pZCAqaW5mbywKIAkgICB2b2lkICptYXRjaGluZm8sCiAJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogeworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaW5mbzsKIAljb25zdCBzdHJ1Y3QgaXB0X2ljbXAgKmljbXBpbmZvID0gbWF0Y2hpbmZvOwogCiAJLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IElDTVAsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCkBAIC0xODYyLDEyMyArMTMzNywyMiBAQAogCS5nZXQJCT0gZG9faXB0X2dldF9jdGwsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCB0Y3BfbWF0Y2hzdHJ1Y3QgPSB7Ci0JLm5hbWUJCT0gInRjcCIsCi0JLm1hdGNoCQk9ICZ0Y3BfbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmdGNwX2NoZWNrZW50cnksCi19OwotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCB1ZHBfbWF0Y2hzdHJ1Y3QgPSB7Ci0JLm5hbWUJCT0gInVkcCIsCi0JLm1hdGNoCQk9ICZ1ZHBfbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmdWRwX2NoZWNrZW50cnksCi19OwotCiBzdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBpY21wX21hdGNoc3RydWN0ID0gewogCS5uYW1lCQk9ICJpY21wIiwKIAkubWF0Y2gJCT0gJmljbXBfbWF0Y2gsCiAJLmNoZWNrZW50cnkJPSAmaWNtcF9jaGVja2VudHJ5LAogfTsKIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW5saW5lIGludCBwcmludF9uYW1lKGNvbnN0IGNoYXIgKmksCi0JCQkgICAgIG9mZl90IHN0YXJ0X29mZnNldCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoLAotCQkJICAgICBvZmZfdCAqcG9zLCB1bnNpZ25lZCBpbnQgKmNvdW50KQotewotCWlmICgoKmNvdW50KSsrID49IHN0YXJ0X29mZnNldCkgewotCQl1bnNpZ25lZCBpbnQgbmFtZWxlbjsKLQotCQluYW1lbGVuID0gc3ByaW50ZihidWZmZXIgKyAqcG9zLCAiJXNcbiIsCi0JCQkJICBpICsgc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpKTsKLQkJaWYgKCpwb3MgKyBuYW1lbGVuID4gbGVuZ3RoKSB7Ci0JCQkvKiBTdG9wIGl0ZXJhdGluZyAqLwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJKnBvcyArPSBuYW1lbGVuOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHJpbnRfdGFyZ2V0KGNvbnN0IHN0cnVjdCBpcHRfdGFyZ2V0ICp0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IHN0YXJ0X29mZnNldCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90ICpwb3MsIHVuc2lnbmVkIGludCAqY291bnQpCi17Ci0JaWYgKHQgPT0gJmlwdF9zdGFuZGFyZF90YXJnZXQgfHwgdCA9PSAmaXB0X2Vycm9yX3RhcmdldCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHByaW50X25hbWUoKGNoYXIgKil0LCBzdGFydF9vZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoLCBwb3MsIGNvdW50KTsKLX0KLQotc3RhdGljIGludCBpcHRfZ2V0X3RhYmxlcyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotewotCW9mZl90IHBvcyA9IDA7Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlMSVNUX0ZJTkQoJmlwdF90YWJsZXMsIHByaW50X25hbWUsIHZvaWQgKiwKLQkJICBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoLCAmcG9zLCAmY291bnQpOwotCi0JdXAoJmlwdF9tdXRleCk7Ci0KLQkvKiBgc3RhcnQnIGhhY2sgLSBzZWUgZnMvcHJvYy9nZW5lcmljLmMgbGluZSB+MTA1ICovCi0JKnN0YXJ0PShjaGFyICopKCh1bnNpZ25lZCBsb25nKWNvdW50LW9mZnNldCk7Ci0JcmV0dXJuIHBvczsKLX0KLQotc3RhdGljIGludCBpcHRfZ2V0X3RhcmdldHMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKLXsKLQlvZmZfdCBwb3MgPSAwOwotCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcHRfbXV0ZXgpICE9IDApCi0JCXJldHVybiAwOwotCi0JTElTVF9GSU5EKCZpcHRfdGFyZ2V0LCBwcmludF90YXJnZXQsIHN0cnVjdCBpcHRfdGFyZ2V0ICosCi0JCSAgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgJnBvcywgJmNvdW50KTsKLQkKLQl1cCgmaXB0X211dGV4KTsKLQotCSpzdGFydCA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKWNvdW50IC0gb2Zmc2V0KTsKLQlyZXR1cm4gcG9zOwotfQotCi1zdGF0aWMgaW50IGlwdF9nZXRfbWF0Y2hlcyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotewotCW9mZl90IHBvcyA9IDA7Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0JCi0JTElTVF9GSU5EKCZpcHRfbWF0Y2gsIHByaW50X25hbWUsIHZvaWQgKiwKLQkJICBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoLCAmcG9zLCAmY291bnQpOwotCi0JdXAoJmlwdF9tdXRleCk7Ci0KLQkqc3RhcnQgPSAoY2hhciAqKSgodW5zaWduZWQgbG9uZyljb3VudCAtIG9mZnNldCk7Ci0JcmV0dXJuIHBvczsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB7IGNoYXIgKm5hbWU7IGdldF9pbmZvX3QgKmdldF9pbmZvOyB9IGlwdF9wcm9jX2VudHJ5W10gPQoteyB7ICJpcF90YWJsZXNfbmFtZXMiLCBpcHRfZ2V0X3RhYmxlcyB9LAotICB7ICJpcF90YWJsZXNfdGFyZ2V0cyIsIGlwdF9nZXRfdGFyZ2V0cyB9LAotICB7ICJpcF90YWJsZXNfbWF0Y2hlcyIsIGlwdF9nZXRfbWF0Y2hlcyB9LAotICB7IE5VTEwsIE5VTEx9IH07Ci0jZW5kaWYgLypDT05GSUdfUFJPQ19GUyovCi0KIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCisJeHRfcHJvdG9faW5pdChBRl9JTkVUKTsKKwogCS8qIE5vb25lIGVsc2Ugd2lsbCBiZSBkb3duaW5nIHNlbSBub3csIHNvIHdlIHdvbid0IHNsZWVwICovCi0JZG93bigmaXB0X211dGV4KTsKLQlsaXN0X2FwcGVuZCgmaXB0X3RhcmdldCwgJmlwdF9zdGFuZGFyZF90YXJnZXQpOwotCWxpc3RfYXBwZW5kKCZpcHRfdGFyZ2V0LCAmaXB0X2Vycm9yX3RhcmdldCk7Ci0JbGlzdF9hcHBlbmQoJmlwdF9tYXRjaCwgJnRjcF9tYXRjaHN0cnVjdCk7Ci0JbGlzdF9hcHBlbmQoJmlwdF9tYXRjaCwgJnVkcF9tYXRjaHN0cnVjdCk7Ci0JbGlzdF9hcHBlbmQoJmlwdF9tYXRjaCwgJmljbXBfbWF0Y2hzdHJ1Y3QpOwotCXVwKCZpcHRfbXV0ZXgpOworCXh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X3N0YW5kYXJkX3RhcmdldCk7CisJeHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfZXJyb3JfdGFyZ2V0KTsKKwl4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaWNtcF9tYXRjaHN0cnVjdCk7CiAKIAkvKiBSZWdpc3RlciBzZXRzb2Nrb3B0ICovCiAJcmV0ID0gbmZfcmVnaXN0ZXJfc29ja29wdCgmaXB0X3NvY2tvcHRzKTsKQEAgLTE5ODcsNDkgKzEzNjEsMjMgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpcHRfcHJvY19lbnRyeVtpXS5uYW1lOyBpKyspIHsKLQkJcHJvYyA9IHByb2NfbmV0X2NyZWF0ZShpcHRfcHJvY19lbnRyeVtpXS5uYW1lLCAwLAotCQkJCSAgICAgICBpcHRfcHJvY19lbnRyeVtpXS5nZXRfaW5mbyk7Ci0JCWlmICghcHJvYykgewotCQkJd2hpbGUgKC0taSA+PSAwKQotCQkJCXByb2NfbmV0X3JlbW92ZShpcHRfcHJvY19lbnRyeVtpXS5uYW1lKTsKLQkJCW5mX3VucmVnaXN0ZXJfc29ja29wdCgmaXB0X3NvY2tvcHRzKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCXByb2MtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JfQotCX0KLSNlbmRpZgotCi0JcHJpbnRrKCJpcF90YWJsZXM6IChDKSAyMDAwLTIwMDIgTmV0ZmlsdGVyIGNvcmUgdGVhbVxuIik7CisJcHJpbnRrKCJpcF90YWJsZXM6IChDKSAyMDAwLTIwMDYgTmV0ZmlsdGVyIENvcmUgVGVhbVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7CiAJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZpcHRfc29ja29wdHMpOwotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JewotCWludCBpOwotCWZvciAoaSA9IDA7IGlwdF9wcm9jX2VudHJ5W2ldLm5hbWU7IGkrKykKLQkJcHJvY19uZXRfcmVtb3ZlKGlwdF9wcm9jX2VudHJ5W2ldLm5hbWUpOwotCX0KLSNlbmRpZgorCisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaWNtcF9tYXRjaHN0cnVjdCk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9lcnJvcl90YXJnZXQpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfc3RhbmRhcmRfdGFyZ2V0KTsKKworCXh0X3Byb3RvX2ZpbmkoQUZfSU5FVCk7CiB9CiAKIEVYUE9SVF9TWU1CT0woaXB0X3JlZ2lzdGVyX3RhYmxlKTsKIEVYUE9SVF9TWU1CT0woaXB0X3VucmVnaXN0ZXJfdGFibGUpOwotRVhQT1JUX1NZTUJPTChpcHRfcmVnaXN0ZXJfbWF0Y2gpOwotRVhQT1JUX1NZTUJPTChpcHRfdW5yZWdpc3Rlcl9tYXRjaCk7CiBFWFBPUlRfU1lNQk9MKGlwdF9kb190YWJsZSk7Ci1FWFBPUlRfU1lNQk9MKGlwdF9yZWdpc3Rlcl90YXJnZXQpOwotRVhQT1JUX1NZTUJPTChpcHRfdW5yZWdpc3Rlcl90YXJnZXQpOwotRVhQT1JUX1NZTUJPTChpcHRfZmluZF90YXJnZXQpOwotCiBtb2R1bGVfaW5pdChpbml0KTsKIG1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKaW5kZXggNDVjNTJkOC4uZDliYzk3MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCkBAIC0zNzksMTIgKzM3OSwxMyBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCSAgIGNvbnN0IHZvaWQgKmVfdm9pZCwKICAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCiAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CiAJc3RydWN0IGlwdF9jbHVzdGVyaXBfdGd0X2luZm8gKmNpcGluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplID0gZV92b2lkOwogCiAJc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmNvbmZpZzsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9EU0NQLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0RTQ1AuYwppbmRleCA2ZTMxOTU3Li44OThjZGY3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0RTQ1AuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0RTQ1AuYwpAQCAtNTcsNyArNTcsNyBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCSAgIGNvbnN0IHZvaWQgKmVfdm9pZCwKICAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCiAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYwppbmRleCBhMTMxOTY5Li43MDY0NDU0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMKQEAgLTExMywxMiArMTEzLDEzIEBACiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgY29uc3Qgdm9pZCAqZV92b2lkLAogICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X0VDTl9pbmZvICplaW5mbyA9IChzdHJ1Y3QgaXB0X0VDTl9pbmZvICopdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSA9IGVfdm9pZDsKIAogCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X0VDTl9pbmZvKSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUNOOiB0YXJnaW5mb3NpemUgJXUgIT0gJVp1XG4iLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKaW5kZXggMzBiZTBmMS4uNjYwNmRkYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCkBAIC00MzEsNyArNDMxLDcgQEAKIH0KIAogc3RhdGljIGludCBpcHRfbG9nX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKmUsCiAJCQkgICAgICB2b2lkICp0YXJnaW5mbywKIAkJCSAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYwppbmRleCAyNzg2MDUxLi4xMmM1NmQzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYwpAQCAtNDAsNyArNDAsNyBAQAogLyogRklYTUU6IE11bHRpcGxlIHRhcmdldHMuIC0tUlIgKi8KIHN0YXRpYyBpbnQKIG1hc3F1ZXJhZGVfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJIGNvbnN0IHZvaWQgKmUsCiAJCSB2b2lkICp0YXJnaW5mbywKIAkJIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJCSB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMKaW5kZXggZTZlN2I2MC4uYjA3NDQ2NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jCkBAIC0zMSw3ICszMSw3IEBACiAKIHN0YXRpYyBpbnQKIGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisgICAgICBjb25zdCB2b2lkICplLAogICAgICAgdm9pZCAqdGFyZ2luZm8sCiAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkZRVUVVRS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORlFVRVVFLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZWRjOWIuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORlFVRVVFLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBpcHRhYmxlcyBtb2R1bGUgZm9yIHVzaW5nIG5ldyBuZXRmaWx0ZXIgbmV0bGluayBxdWV1ZQotICoKLSAqIChDKSAyMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyAKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X05GUVVFVUUuaD4KLQotTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIE5GUVVFVUUgdGFyZ2V0Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgdm9pZCAqdXNlcmluZm8pCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9ORlFfaW5mbyAqdGluZm8gPSB0YXJnaW5mbzsKLQotCXJldHVybiBORl9RVUVVRV9OUih0aW5mby0+cXVldWVudW0pOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAotICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKLSAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKLSAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9ORlFfaW5mbykpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUVVFVUU6IHRhcmdpbmZvc2l6ZSAldSAhPSAlWnVcbiIsCi0JCSAgICAgICB0YXJnaW5mb3NpemUsCi0JCSAgICAgICBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfTkZRX2luZm8pKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X05GUV9yZWcgPSB7Ci0JLm5hbWUJCT0gIk5GUVVFVUUiLAotCS50YXJnZXQJCT0gdGFyZ2V0LAotCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9ORlFfcmVnKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9ORlFfcmVnKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYwppbmRleCA1MjQ1YmZkLi4xNDBiZTUxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jCkBAIC0zMyw3ICszMyw3IEBACiAvKiBGSVhNRTogVGFrZSBtdWx0aXBsZSByYW5nZXMgLS1SUiAqLwogc3RhdGljIGludAogcmVkaXJlY3RfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCSAgICAgICBjb25zdCB2b2lkICplLAogCSAgICAgICB2b2lkICp0YXJnaW5mbywKIAkgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCmluZGV4IDY2OTM1MjYuLjNlYjQ3YWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYwpAQCAtMjgyLDEyICsyODIsMTMgQEAKIH0KIAogc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgY29uc3Qgdm9pZCAqZV92b2lkLAogCQkgdm9pZCAqdGFyZ2luZm8sCiAJCSB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKICAJY29uc3Qgc3RydWN0IGlwdF9yZWplY3RfaW5mbyAqcmVqaW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUgPSBlX3ZvaWQ7CiAKICAJaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfcmVqZWN0X2luZm8pKSkgewogICAJCURFQlVHUCgiUkVKRUNUOiB0YXJnaW5mb3NpemUgJXUgIT0gMFxuIiwgdGFyZ2luZm9zaXplKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfU0FNRS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKaW5kZXggN2EwNTM2ZC4uYTIyZGU1OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogc3RhdGljIGludAogc2FtZV9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkgICAgICBjb25zdCB2b2lkICplLAogCSAgICAgIHZvaWQgKnRhcmdpbmZvLAogCSAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVENQTVNTLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RDUE1TUy5jCmluZGV4IDhkYjcwZDYuLmMxMjI4NDEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVENQTVNTLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UQ1BNU1MuYwpAQCAtMjEwLDEyICsyMTAsMTMgQEAKIC8qIE11c3Qgc3BlY2lmeSAtcCB0Y3AgLS1zeW4vLS10Y3AtZmxhZ3MgU1lOICovCiBzdGF0aWMgaW50CiBpcHRfdGNwbXNzX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgICAgICBjb25zdCB2b2lkICplX3ZvaWQsCiAJCSAgICAgIHZvaWQgKnRhcmdpbmZvLAogCQkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewogCWNvbnN0IHN0cnVjdCBpcHRfdGNwbXNzX2luZm8gKnRjcG1zc2luZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplID0gZV92b2lkOwogCiAJaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfdGNwbXNzX2luZm8pKSkgewogCQlERUJVR1AoImlwdF90Y3Btc3NfY2hlY2tlbnRyeTogdGFyZ2luZm9zaXplICV1ICE9ICV1XG4iLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVE9TLmMKaW5kZXggZGVhZGIzNi4uM2E0NGE1NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RPUy5jCkBAIC01Miw3ICs1Miw3IEBACiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgY29uc3Qgdm9pZCAqZV92b2lkLAogICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RUTC5jCmluZGV4IGI5YWU2YTkuLmI3NjllYjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UVEwuYwpAQCAtNjYsNyArNjYsNyBAQAogfQogCiBzdGF0aWMgaW50IGlwdF90dGxfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCWNvbnN0IHZvaWQgKmUsCiAJCXZvaWQgKnRhcmdpbmZvLAogCQl1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQl1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYwppbmRleCAzODY0MWNkLi42NDFkYmM0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYwpAQCAtMzMwLDcgKzMzMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaXB0X3Vsb2dfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICplLAogCQkJICAgICAgIHZvaWQgKnRhcmdpbmZvLAogCQkJICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2ttYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jCmluZGV4IGUxOWMyYTUuLmQ2YjgzYTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWRkcnR5cGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FkZHJ0eXBlLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogc3RhdGljIGludCBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JCSBpbnQgb2Zmc2V0LCBpbnQgKmhvdGRyb3ApCisJCSBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCBpcHRfYWRkcnR5cGVfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwpAQCAtNDMsNyArNDMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaXAsCiAJCSAgICAgIHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWguYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWguYwppbmRleCBhMGZlYTg0Li4xNDRhZGZlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FoLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9haC5jCkBAIC00MSw2ICs0MSw3IEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewogCXN0cnVjdCBpcF9hdXRoX2hkciBfYWhkciwgKmFoOwpAQCAtNTAsNyArNTEsNyBAQAogCWlmIChvZmZzZXQpCiAJCXJldHVybiAwOwogCi0JYWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCwKKwlhaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsCiAJCQkJc2l6ZW9mKF9haGRyKSwgJl9haGRyKTsKIAlpZiAoYWggPT0gTlVMTCkgewogCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQpAQCAtNjksMTIgKzcwLDEzIEBACiAvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICBjb25zdCB2b2lkICppcF92b2lkLAogCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKIAkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewogCWNvbnN0IHN0cnVjdCBpcHRfYWggKmFoaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IGlwX3ZvaWQ7CiAKIAkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gQUgsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCiAJaWYgKGlwLT5wcm90byAhPSBJUFBST1RPX0FIIHx8IChpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb21tZW50LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2NvbW1lbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3NmExZS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2NvbW1lbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBJbXBsZW1lbnRzIGEgZHVtbXkgbWF0Y2ggdG8gYWxsb3cgYXR0YWNoaW5nIGNvbW1lbnRzIHRvIHJ1bGVzCi0gKgotICogMjAwMy0wNS0xMyBCcmFkIEZpc2hlciAoYnJhZEBpbmZvLWxpbmsubmV0KQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29tbWVudC5oPgotCi1NT0RVTEVfQVVUSE9SKCJCcmFkIEZpc2hlciA8YnJhZEBpbmZvLWxpbmsubmV0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBjb21tZW50IG1hdGNoIG1vZHVsZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JLyogV2UgYWx3YXlzIG1hdGNoICovCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLSAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCS8qIENoZWNrIHRoZSBzaXplICovCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY29tbWVudF9pbmZvKSkpCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBjb21tZW50X21hdGNoID0gewotCS5uYW1lCQk9ICJjb21tZW50IiwKLQkubWF0Y2gJCT0gbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAotCS5tZQkJPSBUSElTX01PRFVMRQotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJmNvbW1lbnRfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZjb21tZW50X21hdGNoKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZGNjcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9kY2NwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzI3OGIuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9kY2NwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqIGlwdGFibGVzIG1vZHVsZSBmb3IgRENDUCBwcm90b2NvbCBoZWFkZXIgbWF0Y2hpbmcKLSAqCi0gKiAoQykgMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2RjY3AuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9kY2NwLmg+Ci0KLSNkZWZpbmUgRENDSEVDSyhjb25kLCBvcHRpb24sIGZsYWcsIGludmZsYWcpICghKChmbGFnKSAmIChvcHRpb24pKSBcCi0JCSAgICAgICAgICAgICAgICAgIHx8ICghISgoaW52ZmxhZykgJiAob3B0aW9uKSkgXiAoY29uZCkpKQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqZGNjcF9vcHRidWY7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRjY3BfYnVmbG9jayk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1kY2NwX2ZpbmRfb3B0aW9uKHVfaW50OF90IG9wdGlvbiwKLQkJIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSBjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoLAotCQkgaW50ICpob3Rkcm9wKQotewotCS8qIHRjcC5kb2ZmIGlzIG9ubHkgNCBiaXRzLCBpZS4gbWF4IDE1ICogNCBieXRlcyAqLwotCXVuc2lnbmVkIGNoYXIgKm9wOwotCXVuc2lnbmVkIGludCBvcHRvZmYgPSBfX2RjY3BfaGRyX2xlbihkaCk7Ci0JdW5zaWduZWQgaW50IG9wdGxlbiA9IGRoLT5kY2NwaF9kb2ZmKjQgLSBfX2RjY3BfaGRyX2xlbihkaCk7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlpZiAoZGgtPmRjY3BoX2RvZmYgKiA0IDwgX19kY2NwX2hkcl9sZW4oZGgpKSB7Ci0JCSpob3Rkcm9wID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCFvcHRsZW4pCi0JCXJldHVybiAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZkY2NwX2J1ZmxvY2spOwotCW9wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKLQkJCQlza2ItPm5oLmlwaC0+aWhsKjQgKyBvcHRvZmYsCi0JCQkJb3B0bGVuLCBkY2NwX29wdGJ1Zik7Ci0JaWYgKG9wID09IE5VTEwpIHsKLQkJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgaGVhZGVyLCBkcm9wIHBhY2tldC4gKi8KLQkJc3Bpbl91bmxvY2tfYmgoJmRjY3BfYnVmbG9jayk7Ci0JCSpob3Rkcm9wID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG9wdGxlbjsgKSB7Ci0JCWlmIChvcFtpXSA9PSBvcHRpb24pIHsKLQkJCXNwaW5fdW5sb2NrX2JoKCZkY2NwX2J1ZmxvY2spOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlpZiAob3BbaV0gPCAyKSAKLQkJCWkrKzsKLQkJZWxzZSAKLQkJCWkgKz0gb3BbaSsxXT86MTsKLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmZGNjcF9idWZsb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW5saW5lIGludAotbWF0Y2hfdHlwZXMoY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCwgdV9pbnQxNl90IHR5cGVtYXNrKQotewotCXJldHVybiAodHlwZW1hc2sgJiAoMSA8PCBkaC0+ZGNjcGhfdHlwZSkpOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotbWF0Y2hfb3B0aW9uKHVfaW50OF90IG9wdGlvbiwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgICAgIGNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGgsIGludCAqaG90ZHJvcCkKLXsKLQlyZXR1cm4gZGNjcF9maW5kX29wdGlvbihvcHRpb24sIHNrYiwgZGgsIGhvdGRyb3ApOwotfQotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9kY2NwX2luZm8gKmluZm8gPSAKLQkJCQkoY29uc3Qgc3RydWN0IGlwdF9kY2NwX2luZm8gKiltYXRjaGluZm87Ci0Jc3RydWN0IGRjY3BfaGRyIF9kaCwgKmRoOwotCi0JaWYgKG9mZnNldCkKLQkJcmV0dXJuIDA7Ci0JCi0JZGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsIHNpemVvZihfZGgpLCAmX2RoKTsKLQlpZiAoZGggPT0gTlVMTCkgewotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotICAgICAgIAl9Ci0KLQlyZXR1cm4gIERDQ0hFQ0soKChudG9ocyhkaC0+ZGNjcGhfc3BvcnQpID49IGluZm8tPnNwdHNbMF0pIAotCQkJJiYgKG50b2hzKGRoLT5kY2NwaF9zcG9ydCkgPD0gaW5mby0+c3B0c1sxXSkpLCAKLQkJICAgCUlQVF9EQ0NQX1NSQ19QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQotCQkmJiBEQ0NIRUNLKCgobnRvaHMoZGgtPmRjY3BoX2Rwb3J0KSA+PSBpbmZvLT5kcHRzWzBdKSAKLQkJCSYmIChudG9ocyhkaC0+ZGNjcGhfZHBvcnQpIDw9IGluZm8tPmRwdHNbMV0pKSwgCi0JCQlJUFRfRENDUF9ERVNUX1BPUlRTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCi0JCSYmIERDQ0hFQ0sobWF0Y2hfdHlwZXMoZGgsIGluZm8tPnR5cGVtYXNrKSwKLQkJCSAgIElQVF9EQ0NQX1RZUEUsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncykKLQkJJiYgRENDSEVDSyhtYXRjaF9vcHRpb24oaW5mby0+b3B0aW9uLCBza2IsIGRoLCBob3Rkcm9wKSwKLQkJCSAgIElQVF9EQ0NQX09QVElPTiwgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKTsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JICAgdm9pZCAqbWF0Y2hpbmZvLAotCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X2RjY3BfaW5mbyAqaW5mbzsKLQotCWluZm8gPSAoY29uc3Qgc3RydWN0IGlwdF9kY2NwX2luZm8gKiltYXRjaGluZm87Ci0KLQlyZXR1cm4gaXAtPnByb3RvID09IElQUFJPVE9fRENDUAotCQkmJiAhKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pCi0JCSYmIG1hdGNoc2l6ZSA9PSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfZGNjcF9pbmZvKSkKLQkJJiYgIShpbmZvLT5mbGFncyAmIH5JUFRfRENDUF9WQUxJRF9GTEFHUykKLQkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5JUFRfRENDUF9WQUxJRF9GTEFHUykKLQkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5pbmZvLT5mbGFncyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGRjY3BfbWF0Y2ggPSAKLXsgCi0JLm5hbWUgCQk9ICJkY2NwIiwKLQkubWF0Y2gJCT0gJm1hdGNoLAotCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCi0JLm1lIAkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JLyogZG9mZiBpcyA4IGJpdHMsIHNvIHRoZSBtYXhpbXVtIG9wdGlvbiBzaXplIGlzICg0KjI1NikuICBEb24ndCBwdXQKLQkgKiB0aGlzIGluIEJTUyBzaW5jZSBEYXZlTSBpcyB3b3JyaWVkIGFib3V0IGxvY2tlZCBUTEIncyBmb3Iga2VybmVsCi0JICogQlNTLiAqLwotCWRjY3Bfb3B0YnVmID0ga21hbGxvYygyNTYgKiA0LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRjY3Bfb3B0YnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlyZXQgPSBpcHRfcmVnaXN0ZXJfbWF0Y2goJmRjY3BfbWF0Y2gpOwotCWlmIChyZXQpCi0JCWtmcmVlKGRjY3Bfb3B0YnVmKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJmRjY3BfbWF0Y2gpOwotCWtmcmVlKGRjY3Bfb3B0YnVmKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1hdGNoIGZvciBEQ0NQIHByb3RvY29sIHBhY2tldHMiKTsKLQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9kc2NwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2RzY3AuYwppbmRleCA1ZGY1MmE2Li45MjA2M2I0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2RzY3AuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2RzY3AuYwpAQCAtMjEsNyArMjEsNyBAQAogCiBzdGF0aWMgaW50IG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKIAkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLQkJIGludCBvZmZzZXQsIGludCAqaG90ZHJvcCkKKwkJIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLCBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IGlwdF9kc2NwX2luZm8gKmluZm8gPSBtYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKQEAgLTMxLDcgKzMxLDcgQEAKIAlyZXR1cm4gKChpcGgtPnRvcyZJUFRfRFNDUF9NQVNLKSA9PSBzaF9kc2NwKSBeIGluZm8tPmludmVydDsKIH0KIAotc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCitzdGF0aWMgaW50IGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICppcCwKIAkJICAgICAgdm9pZCAqbWF0Y2hpbmZvLCB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMKaW5kZXggYjZmNzE4MS4uZTY4YjBjNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCkBAIC02Nyw3ICs2Nyw3IEBACiAKIHN0YXRpYyBpbnQgbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCQkgaW50IG9mZnNldCwgaW50ICpob3Rkcm9wKQorCQkgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X2Vjbl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCkBAIC04NSwxMSArODUsMTIgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCitzdGF0aWMgaW50IGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICppcF92b2lkLAogCQkgICAgICB2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CiAJY29uc3Qgc3RydWN0IGlwdF9lY25faW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IGlwX3ZvaWQ7CiAKIAlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9lY25faW5mbykpKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZXNwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2VzcC5jCmluZGV4IGUxZDBkZDMuLjlkZTE5MWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZXNwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lc3AuYwpAQCAtNDIsNiArNDIsNyBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKIAlzdHJ1Y3QgaXBfZXNwX2hkciBfZXNwLCAqZWg7CkBAIC01MSw3ICs1Miw3IEBACiAJaWYgKG9mZnNldCkKIAkJcmV0dXJuIDA7CiAKLQllaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwgKiA0LAorCWVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwKIAkJCQlzaXplb2YoX2VzcCksICZfZXNwKTsKIAlpZiAoZWggPT0gTlVMTCkgewogCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQpAQCAtNzAsMTIgKzcxLDEzIEBACiAvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICBjb25zdCB2b2lkICppcF92b2lkLAogCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKIAkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewogCWNvbnN0IHN0cnVjdCBpcHRfZXNwICplc3BpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaXBfdm9pZDsKIAogCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBFU1AsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCiAJaWYgKGlwLT5wcm90byAhPSBJUFBST1RPX0VTUCB8fCAoaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaGFzaGxpbWl0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hhc2hsaW1pdC5jCmluZGV4IDJkZDFjY2MuLjRmZTQ4YzEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaGFzaGxpbWl0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9oYXNobGltaXQuYwpAQCAtNDI5LDYgKzQyOSw3IEBACiAJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJCWNvbnN0IHZvaWQgKm1hdGNoaW5mbywKIAkJaW50IG9mZnNldCwKKwkJdW5zaWduZWQgaW50IHByb3RvZmYsCiAJCWludCAqaG90ZHJvcCkKIHsKIAlzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9pbmZvICpyID0gCkBAIC01MDQsNyArNTA1LDcgQEAKIAogc3RhdGljIGludAogaGFzaGxpbWl0X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgICAgIGNvbnN0IHZvaWQgKmluZiwKIAkJICAgICB2b2lkICptYXRjaGluZm8sCiAJCSAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9pcHJhbmdlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2lwcmFuZ2UuYwppbmRleCBiODM1YjdiLi4xM2ZiMTZmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2lwcmFuZ2UuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2lwcmFuZ2UuYwpAQCAtMjgsNyArMjgsNyBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsIGludCAqaG90ZHJvcCkKKyAgICAgIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLCBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IGlwdF9pcHJhbmdlX2luZm8gKmluZm8gPSBtYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKQEAgLTYzLDcgKzYzLDcgQEAKIH0KIAogc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJIGNvbnN0IHZvaWQgKmluZiwKIAkJIHZvaWQgKm1hdGNoaW5mbywKIAkJIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9sZW5ndGguYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbGVuZ3RoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYWJjZmIuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9sZW5ndGguYworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggcGFja2V0IGxlbmd0aC4gKi8KLS8qIChDKSAxOTk5LTIwMDEgSmFtZXMgTW9ycmlzIDxqbW9ycm9zQGludGVyY29kZS5jb20uYXU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGVuZ3RoLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0KLU1PRFVMRV9BVVRIT1IoIkphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJUCB0YWJsZXMgcGFja2V0IGxlbmd0aCBtYXRjaGluZyBtb2R1bGUiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIGludAotbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0gICAgICBpbnQgb2Zmc2V0LAotICAgICAgaW50ICpob3Rkcm9wKQotewotCWNvbnN0IHN0cnVjdCBpcHRfbGVuZ3RoX2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0JdV9pbnQxNl90IHBrdGxlbiA9IG50b2hzKHNrYi0+bmguaXBoLT50b3RfbGVuKTsKLQkKLQlyZXR1cm4gKHBrdGxlbiA+PSBpbmZvLT5taW4gJiYgcGt0bGVuIDw9IGluZm8tPm1heCkgXiBpbmZvLT5pbnZlcnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLSAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2xlbmd0aF9pbmZvKSkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGxlbmd0aF9tYXRjaCA9IHsKLQkubmFtZQkJPSAibGVuZ3RoIiwKLQkubWF0Y2gJCT0gJm1hdGNoLAotCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJmxlbmd0aF9tYXRjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJmxlbmd0aF9tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X211bHRpcG9ydC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tdWx0aXBvcnQuYwppbmRleCA5OWU4MTg4Li4yZDUyMzI2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X211bHRpcG9ydC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbXVsdGlwb3J0LmMKQEAgLTk3LDYgKzk3LDcgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJdTE2IF9wb3J0c1syXSwgKnBwdHI7CkBAIC0xMDUsNyArMTA2LDcgQEAKIAlpZiAob2Zmc2V0KQogCQlyZXR1cm4gMDsKIAotCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCwKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwKIAkJCQkgIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOwogCWlmIChwcHRyID09IE5VTEwpIHsKIAkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKQEAgLTEyOCw2ICsxMjksNyBAQAogCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCSBjb25zdCB2b2lkICptYXRjaGluZm8sCiAJIGludCBvZmZzZXQsCisJIHVuc2lnbmVkIGludCBwcm90b2ZmLAogCSBpbnQgKmhvdGRyb3ApCiB7CiAJdTE2IF9wb3J0c1syXSwgKnBwdHI7CkBAIC0xMzYsNyArMTM4LDcgQEAKIAlpZiAob2Zmc2V0KQogCQlyZXR1cm4gMDsKIAotCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCwKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwKIAkJCQkgIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOwogCWlmIChwcHRyID09IE5VTEwpIHsKIAkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKQEAgLTE1NCw3ICsxNTYsNyBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJICAgY29uc3Qgdm9pZCAqaXAsCiAJICAgdm9pZCAqbWF0Y2hpbmZvLAogCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKQEAgLTE2NCw3ICsxNjYsNyBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5X3YxKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICAgICBjb25zdCB2b2lkICppcCwKIAkgICAgICB2b2lkICptYXRjaGluZm8sCiAJICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jCmluZGV4IDBjZWUyODYuLjQ4NDNkMGMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfb3duZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X293bmVyLmMKQEAgLTI3LDYgKzI3LDcgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IGlwdF9vd25lcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwpAQCAtNTEsNyArNTIsNyBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICAgICAgIGNvbnN0IHZvaWQgKmlwLAogICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3BoeXNkZXYuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcGh5c2Rldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2Y1NTQ4Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcGh5c2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggdGhlIGJyaWRnZSBwb3J0IGluIGFuZAotICogb3V0IGRldmljZSBmb3IgSVAgcGFja2V0cyBjb21pbmcgaW50byBjb250YWN0IHdpdGggYSBicmlkZ2UuICovCi0KLS8qIChDKSAyMDAxLTIwMDMgQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGh5c2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KLSNkZWZpbmUgTUFUQ0ggICAxCi0jZGVmaW5lIE5PTUFUQ0ggMAotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBicmlkZ2UgcGh5c2ljYWwgZGV2aWNlIG1hdGNoIG1vZHVsZSIpOwotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JaW50IGk7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgbnVsbGRldm5hbWVbSUZOQU1TSVpdOwotCWNvbnN0IHN0cnVjdCBpcHRfcGh5c2Rldl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCXVuc2lnbmVkIGludCByZXQ7Ci0JY29uc3QgY2hhciAqaW5kZXYsICpvdXRkZXY7Ci0Jc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2U7Ci0KLQkvKiBOb3QgYSBicmlkZ2VkIElQIHBhY2tldCBvciBubyBpbmZvIGF2YWlsYWJsZSB5ZXQ6Ci0JICogTE9DQUxfT1VUL21hbmdsZSBhbmQgTE9DQUxfT1VUL25hdCBkb24ndCBrbm93IGlmCi0JICogdGhlIGRlc3RpbmF0aW9uIGRldmljZSB3aWxsIGJlIGEgYnJpZGdlLiAqLwotCWlmICghKG5mX2JyaWRnZSA9IHNrYi0+bmZfYnJpZGdlKSkgewotCQkvKiBSZXR1cm4gTUFUQ0ggaWYgdGhlIGludmVydCBmbGFncyBvZiB0aGUgdXNlZCBvcHRpb25zIGFyZSBvbiAqLwotCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9CUklER0VEKSAmJgotCQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9CUklER0VEKSkKLQkJCXJldHVybiBOT01BVENIOwotCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9JU0lOKSAmJgotCQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9JU0lOKSkKLQkJCXJldHVybiBOT01BVENIOwotCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9JU09VVCkgJiYKLQkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfSVNPVVQpKQotCQkJcmV0dXJuIE5PTUFUQ0g7Ci0JCWlmICgoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX0lOKSAmJgotCQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9JTikpCi0JCQlyZXR1cm4gTk9NQVRDSDsKLQkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfT1VUKSAmJgotCQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9PVVQpKQotCQkJcmV0dXJuIE5PTUFUQ0g7Ci0JCXJldHVybiBNQVRDSDsKLQl9Ci0KLQkvKiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaW4gdGhlIEZPUldBUkQgYW5kIFBPU1RST1VUSU5HIGNoYWlucyAqLwotCWlmICgoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX0JSSURHRUQpICYmCi0JICAgICghIShuZl9icmlkZ2UtPm1hc2sgJiBCUk5GX0JSSURHRUQpIF4KLQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9CUklER0VEKSkpCi0JCXJldHVybiBOT01BVENIOwotCi0JaWYgKChpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfSVNJTiAmJgotCSAgICAoIW5mX2JyaWRnZS0+cGh5c2luZGV2IF4gISEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfSVNJTikpKSB8fAotCSAgICAoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX0lTT1VUICYmCi0JICAgICghbmZfYnJpZGdlLT5waHlzb3V0ZGV2IF4gISEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfSVNPVVQpKSkpCi0JCXJldHVybiBOT01BVENIOwotCi0JaWYgKCEoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX0lOKSkKLQkJZ290byBtYXRjaF9vdXRkZXY7Ci0JaW5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldiA/IG5mX2JyaWRnZS0+cGh5c2luZGV2LT5uYW1lIDogbnVsbGRldm5hbWU7Ci0JZm9yIChpID0gMCwgcmV0ID0gMDsgaSA8IElGTkFNU0laL3NpemVvZih1bnNpZ25lZCBpbnQpOyBpKyspIHsKLQkJcmV0IHw9ICgoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZGV2KVtpXQotCQkJXiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPnBoeXNpbmRldilbaV0pCi0JCQkmICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+aW5fbWFzaylbaV07Ci0JfQotCi0JaWYgKChyZXQgPT0gMCkgXiAhKGluZm8tPmludmVydCAmIElQVF9QSFlTREVWX09QX0lOKSkKLQkJcmV0dXJuIE5PTUFUQ0g7Ci0KLW1hdGNoX291dGRldjoKLQlpZiAoIShpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfT1VUKSkKLQkJcmV0dXJuIE1BVENIOwotCW91dGRldiA9IG5mX2JyaWRnZS0+cGh5c291dGRldiA/Ci0JCSBuZl9icmlkZ2UtPnBoeXNvdXRkZXYtPm5hbWUgOiBudWxsZGV2bmFtZTsKLQlmb3IgKGkgPSAwLCByZXQgPSAwOyBpIDwgSUZOQU1TSVovc2l6ZW9mKHVuc2lnbmVkIGludCk7IGkrKykgewotCQlyZXQgfD0gKCgoY29uc3QgdW5zaWduZWQgaW50ICopb3V0ZGV2KVtpXQotCQkJXiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPnBoeXNvdXRkZXYpW2ldKQotCQkJJiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPm91dF9tYXNrKVtpXTsKLQl9Ci0KLQlyZXR1cm4gKHJldCAhPSAwKSBeICEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfT1VUKTsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLQkJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKLQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWNvbnN0IHN0cnVjdCBpcHRfcGh5c2Rldl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfcGh5c2Rldl9pbmZvKSkpCi0JCXJldHVybiAwOwotCWlmICghKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9NQVNLKSB8fAotCSAgICBpbmZvLT5iaXRtYXNrICYgfklQVF9QSFlTREVWX09QX01BU0spCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBwaHlzZGV2X21hdGNoID0gewotCS5uYW1lCQk9ICJwaHlzZGV2IiwKLQkubWF0Y2gJCT0gJm1hdGNoLAotCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJnBoeXNkZXZfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZwaHlzZGV2X21hdGNoKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcGt0dHlwZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9wa3R0eXBlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZGIxZGMuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9wa3R0eXBlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiAoQykgMTk5OS0yMDAxIE1pY2hhbCBMdWR2aWcgPG1pY2hhbEBsb2dpeC5jej4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BrdHR5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiTWljaGFsIEx1ZHZpZyA8bWljaGFsQGxvZ2l4LmN6PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJUCB0YWJsZXMgbWF0Y2ggdG8gbWF0Y2ggb24gbGlua2xheWVyIHBhY2tldCB0eXBlIik7Ci0KLXN0YXRpYyBpbnQgbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0gICAgICBpbnQgb2Zmc2V0LAotICAgICAgaW50ICpob3Rkcm9wKQotewotICAgIGNvbnN0IHN0cnVjdCBpcHRfcGt0dHlwZV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCi0gICAgcmV0dXJuIChza2ItPnBrdF90eXBlID09IGluZm8tPnBrdHR5cGUpIF4gaW5mby0+aW52ZXJ0OwotfQotCi1zdGF0aWMgaW50IGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLQkJICAgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCQkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotLyoKLQlpZiAoaG9va19tYXNrCi0JICAgICYgfigoMSA8PCBORl9JUF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUF9MT0NBTF9JTikKLQkJfCAoMSA8PCBORl9JUF9GT1JXQVJEKSkpIHsKLQkJcHJpbnRrKCJpcHRfcGt0dHlwZTogb25seSB2YWxpZCBmb3IgUFJFX1JPVVRJTkcsIExPQ0FMX0lOIG9yIEZPUldBUkQuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotKi8KLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9wa3R0eXBlX2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggcGt0dHlwZV9tYXRjaCA9IHsKLQkubmFtZQkJPSAicGt0dHlwZSIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAotCS5tZQkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZwa3R0eXBlX21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmcGt0dHlwZV9tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYwppbmRleCA1ZGRjY2IxLi40NDYxMWQ2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcmVjZW50LmMKQEAgLTEwNCw2ICsxMDQsNyBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCk7CiAKIC8qIEZ1bmN0aW9uIHRvIGhhc2ggYSBnaXZlbiBhZGRyZXNzIGludG8gdGhlIGhhc2ggdGFibGUgb2YgdGFibGVfc2l6ZSBzaXplICovCkBAIC0zMTcsNyArMzE4LDcgQEAKIAlza2ItPm5oLmlwaC0+ZGFkZHIgPSAwOwogCS8qIENsZWFyIHR0bCBzaW5jZSB3ZSBoYXZlIG5vIHdheSBvZiBrbm93aW5nIGl0ICovCiAJc2tiLT5uaC5pcGgtPnR0bCA9IDA7Ci0JbWF0Y2goc2tiLE5VTEwsTlVMTCxpbmZvLDAsTlVMTCk7CisJbWF0Y2goc2tiLE5VTEwsTlVMTCxpbmZvLDAsMCxOVUxMKTsKIAogCWtmcmVlKHNrYi0+bmguaXBoKTsKIG91dF9mcmVlX3NrYjoKQEAgLTM1Nyw2ICszNTgsNyBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKIAlpbnQgcGt0X2NvdW50LCBoaXRzX2ZvdW5kLCBhbnM7CkBAIC02NTQsNyArNjU2LDcgQEAKICAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgICAgICBjb25zdCB2b2lkICppcCwKICAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9zdGF0ZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9zdGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDdmMTZiLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc3RhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggY29ubmVjdGlvbiB0cmFja2luZyBpbmZvcm1hdGlvbi4gKi8KLQotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdGF0ZS5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3RhdGUgbWF0Y2ggbW9kdWxlIik7Ci0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X3N0YXRlX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCXVuc2lnbmVkIGludCBzdGF0ZWJpdDsKLQotCWlmIChuZl9jdF9pc191bnRyYWNrZWQoc2tiKSkKLQkJc3RhdGViaXQgPSBJUFRfU1RBVEVfVU5UUkFDS0VEOwotCWVsc2UgaWYgKCFuZl9jdF9nZXRfY3RpbmZvKHNrYiwgJmN0aW5mbykpCi0JCXN0YXRlYml0ID0gSVBUX1NUQVRFX0lOVkFMSUQ7Ci0JZWxzZQotCQlzdGF0ZWJpdCA9IElQVF9TVEFURV9CSVQoY3RpbmZvKTsKLQotCXJldHVybiAoc2luZm8tPnN0YXRlbWFzayAmIHN0YXRlYml0KTsKLX0KLQotc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLQkJIHZvaWQgKm1hdGNoaW5mbywKLQkJIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JCSB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YXRlX2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggc3RhdGVfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gInN0YXRlIiwKLQkubWF0Y2gJCT0gJm1hdGNoLAotCS5jaGVja2VudHJ5CT0gJmNoZWNrLAotCS5tZQkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQluZWVkX2lwX2Nvbm50cmFjaygpOwotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJnN0YXRlX21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmc3RhdGVfbWF0Y2gpOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90Y3Btc3MuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdGNwbXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYzliMTYuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90Y3Btc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIFRDUCBNU1MgdmFsdWVzLiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDIwMDAgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3RjcG1zcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotCi0jZGVmaW5lIFRIX1NZTiAweDAyCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBUQ1AgTVNTIG1hdGNoIG1vZHVsZSIpOwotCi0vKiBSZXR1cm5zIDEgaWYgdGhlIG1zcyBvcHRpb24gaXMgc2V0IGFuZCBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1tc3NvcHRpb25fbWF0Y2godV9pbnQxNl90IG1pbiwgdV9pbnQxNl90IG1heCwKLQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJaW50IGludmVydCwKLQkJaW50ICpob3Rkcm9wKQotewotCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKLQkvKiB0Y3AuZG9mZiBpcyBvbmx5IDQgYml0cywgaWUuIG1heCAxNSAqIDQgYnl0ZXMgKi8KLQl1OCBfb3B0WzE1ICogNCAtIHNpemVvZihfdGNwaCldLCAqb3A7Ci0JdW5zaWduZWQgaW50IGksIG9wdGxlbjsKLQotCS8qIElmIHdlIGRvbid0IGhhdmUgdGhlIHdob2xlIGhlYWRlciwgZHJvcCBwYWNrZXQuICovCi0JdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCwKLQkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOwotCWlmICh0aCA9PSBOVUxMKQotCQlnb3RvIGRyb3BpdDsKLQotCS8qIE1hbGZvcm1lZC4gKi8KLQlpZiAodGgtPmRvZmYqNCA8IHNpemVvZigqdGgpKQotCQlnb3RvIGRyb3BpdDsKLQotCW9wdGxlbiA9IHRoLT5kb2ZmKjQgLSBzaXplb2YoKnRoKTsKLQlpZiAoIW9wdGxlbikKLQkJZ290byBvdXQ7Ci0KLQkvKiBUcnVuY2F0ZWQgb3B0aW9ucy4gKi8KLQlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwgKiA0ICsgc2l6ZW9mKCp0aCksCi0JCQkJb3B0bGVuLCBfb3B0KTsKLQlpZiAob3AgPT0gTlVMTCkKLQkJZ290byBkcm9waXQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuOyApIHsKLQkJaWYgKG9wW2ldID09IFRDUE9QVF9NU1MKLQkJICAgICYmIChvcHRsZW4gLSBpKSA+PSBUQ1BPTEVOX01TUwotCQkgICAgJiYgb3BbaSsxXSA9PSBUQ1BPTEVOX01TUykgewotCQkJdV9pbnQxNl90IG1zc3ZhbDsKLQotCQkJbXNzdmFsID0gKG9wW2krMl0gPDwgOCkgfCBvcFtpKzNdOwotCQkJCi0JCQlyZXR1cm4gKG1zc3ZhbCA+PSBtaW4gJiYgbXNzdmFsIDw9IG1heCkgXiBpbnZlcnQ7Ci0JCX0KLQkJaWYgKG9wW2ldIDwgMikgaSsrOwotCQllbHNlIGkgKz0gb3BbaSsxXT86MTsKLQl9Ci1vdXQ6Ci0JcmV0dXJuIGludmVydDsKLQotIGRyb3BpdDoKLQkqaG90ZHJvcCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X3RjcG1zc19tYXRjaF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCi0JcmV0dXJuIG1zc29wdGlvbl9tYXRjaChpbmZvLT5tc3NfbWluLCBpbmZvLT5tc3NfbWF4LCBza2IsCi0JCQkgICAgICAgaW5mby0+aW52ZXJ0LCBob3Rkcm9wKTsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAotICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfdGNwbXNzX21hdGNoX2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBNdXN0IHNwZWNpZnkgLXAgdGNwICovCi0JaWYgKGlwLT5wcm90byAhPSBJUFBST1RPX1RDUCB8fCAoaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykpIHsKLQkJcHJpbnRrKCJ0Y3Btc3M6IE9ubHkgd29ya3Mgb24gVENQIHBhY2tldHNcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggdGNwbXNzX21hdGNoID0gewotCS5uYW1lCQk9ICJ0Y3Btc3MiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmdGNwbXNzX21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmdGNwbXNzX21hdGNoKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdG9zLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3Rvcy5jCmluZGV4IDA4NmExYmIuLjlhYjc2NWUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdG9zLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90b3MuYwpAQCAtMjMsNiArMjMsNyBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X3Rvc19pbmZvICppbmZvID0gbWF0Y2hpbmZvOwpAQCAtMzIsNyArMzMsNyBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICAgICAgIGNvbnN0IHZvaWQgKmlwLAogICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90dGwuYwppbmRleCAyMTlhYTlkLi44MmRhNTNmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdHRsLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogc3RhdGljIGludCBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JCSBpbnQgb2Zmc2V0LCBpbnQgKmhvdGRyb3ApCisJCSBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCBpcHRfdHRsX2luZm8gKmluZm8gPSBtYXRjaGluZm87CiAKQEAgLTQ3LDcgKzQ3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCitzdGF0aWMgaW50IGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICAqaXAsCiAJCSAgICAgIHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMKaW5kZXggMjYwYTRmMC4uMjEyYTMwNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMKQEAgLTc4LDcgKzc4LDggQEAKIAkubmFtZQkJPSAiZmlsdGVyIiwKIAkudmFsaWRfaG9va3MJPSBGSUxURVJfVkFMSURfSE9PS1MsCiAJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKLQkubWUJCT0gVEhJU19NT0RVTEUKKwkubWUJCT0gVEhJU19NT0RVTEUsCisJLmFmCQk9IEFGX0lORVQsCiB9OwogCiAvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMuICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCmluZGV4IDE2MGViMTEuLjMyMTJhNWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCkBAIC0xMDksNiArMTA5LDcgQEAKIAkudmFsaWRfaG9va3MJPSBNQU5HTEVfVkFMSURfSE9PS1MsCiAJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKIAkubWUJCT0gVEhJU19NT0RVTEUsCisJLmFmCQk9IEFGX0lORVQsCiB9OwogCiAvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMuICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3Jhdy5jCmluZGV4IDQ3NDQ5YmEuLmZkYjllOWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3Jhdy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3Jhdy5jCkBAIC04Myw3ICs4Myw4IEBACiAJLm5hbWUgPSAicmF3IiwgCiAJLnZhbGlkX2hvb2tzID0gIFJBV19WQUxJRF9IT09LUywgCiAJLmxvY2sgPSBSV19MT0NLX1VOTE9DS0VELCAKLQkubWUgPSBUSElTX01PRFVMRQorCS5tZSA9IFRISVNfTU9EVUxFLAorCS5hZiA9IEFGX0lORVQsCiB9OwogCiAvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMuICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYwppbmRleCAwYzU2YzUyYS4uMTY3NjE5ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCkBAIC01NzUsNyArNTc1LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCW5lZWRfbmZfY29ubnRyYWNrKCk7CisJbmVlZF9jb25udHJhY2soKTsKIAlyZXR1cm4gaW5pdF9vcl9jbGVhbnVwKDEpOwogfQogCkBAIC01ODcsOSArNTg3LDQgQEAKIG1vZHVsZV9pbml0KGluaXQpOwogbW9kdWxlX2V4aXQoZmluaSk7CiAKLXZvaWQgbmVlZF9pcF9jb25udHJhY2sodm9pZCkKLXsKLX0KLQotRVhQT1JUX1NZTUJPTChuZWVkX2lwX2Nvbm50cmFjayk7CiBFWFBPUlRfU1lNQk9MKG5mX2N0X2lwdjRfZ2F0aGVyX2ZyYWdzKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X3N0YXRlLmMgYi9uZXQvaXB2NC94ZnJtNF9zdGF0ZS5jCmluZGV4IGQyM2UwN2YuLmRiYWJmODEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X3N0YXRlLmMKKysrIGIvbmV0L2lwdjQveGZybTRfc3RhdGUuYwpAQCAtNDIsNiArNDIsMjEgQEAKIAl4LT5wcm9wcy5zYWRkciA9IHRtcGwtPnNhZGRyOwogCWlmICh4LT5wcm9wcy5zYWRkci5hNCA9PSAwKQogCQl4LT5wcm9wcy5zYWRkci5hNCA9IHNhZGRyLT5hNDsKKwlpZiAodG1wbC0+bW9kZSAmJiB4LT5wcm9wcy5zYWRkci5hNCA9PSAwKSB7CisJCXN0cnVjdCBydGFibGUgKnJ0OworCSAgICAgICAgc3RydWN0IGZsb3dpIGZsX3R1bm5lbCA9IHsKKyAgICAgICAgCSAgICAgICAgLm5sX3UgPSB7CisgICAgICAgIAkJCS5pcDRfdSA9IHsKKwkJCQkJLmRhZGRyID0geC0+aWQuZGFkZHIuYTQsCisJCQkJfQorCQkJfQorCQl9OworCQlpZiAoIXhmcm1fZHN0X2xvb2t1cCgoc3RydWN0IHhmcm1fZHN0ICoqKSZydCwKKwkJICAgICAgICAgICAgICAgICAgICAgJmZsX3R1bm5lbCwgQUZfSU5FVCkpIHsKKwkJCXgtPnByb3BzLnNhZGRyLmE0ID0gcnQtPnJ0X3NyYzsKKwkJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQl9CisJfQogCXgtPnByb3BzLm1vZGUgPSB0bXBsLT5tb2RlOwogCXgtPnByb3BzLnJlcWlkID0gdG1wbC0+cmVxaWQ7CiAJeC0+cHJvcHMuZmFtaWx5ID0gQUZfSU5FVDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IDcxMjlkNDIuLmRmYjRmMTQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtMjY0NCw3ICsyNjQ0LDcgQEAKIHsKIAlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnAgPSAoc3RydWN0IGluZXQ2X2lmYWRkciAqKXY7CiAJc2VxX3ByaW50ZihzZXEsCi0JCSAgICIlMDR4JTA0eCUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICU4c1xuIiwKKwkJICAgTklQNl9GTVQgIiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICU4c1xuIiwKIAkJICAgTklQNihpZnAtPmFkZHIpLAogCQkgICBpZnAtPmlkZXYtPmRldi0+aWZpbmRleCwKIAkJICAgaWZwLT5wcmVmaXhfbGVuLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWg2LmMgYi9uZXQvaXB2Ni9haDYuYwppbmRleCAxM2NjN2Y4Li5jNzkzMmNiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9haDYuYworKysgYi9uZXQvaXB2Ni9haDYuYwpAQCAtMzMyLDggKzMzMiw3IEBACiAJaWYgKCF4KQogCQlyZXR1cm47CiAKLQlORVRERUJVRyhLRVJOX0RFQlVHICJwbXR1IGRpc2NvdmVyeSBvbiBTQSBBSC8lMDh4LyIKLQkJICIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJTkVUREVCVUcoS0VSTl9ERUJVRyAicG10dSBkaXNjb3Zlcnkgb24gU0EgQUgvJTA4eC8iIE5JUDZfRk1UICJcbiIsCiAJCSBudG9obChhaC0+c3BpKSwgTklQNihpcGgtPmRhZGRyKSk7CiAKIAl4ZnJtX3N0YXRlX3B1dCh4KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FueWNhc3QuYyBiL25ldC9pcHY2L2FueWNhc3QuYwppbmRleCA2NWU3M2FjLi43MmJkMDhhZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYW55Y2FzdC5jCisrKyBiL25ldC9pcHY2L2FueWNhc3QuYwpAQCAtNTMyLDkgKzUzMiw3IEBACiAJc3RydWN0IGFjNl9pdGVyX3N0YXRlICpzdGF0ZSA9IGFjNl9zZXFfcHJpdmF0ZShzZXEpOwogCiAJc2VxX3ByaW50ZihzZXEsCi0JCSAgICIlLTRkICUtMTVzICIKLQkJICAgIiUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHglMDR4ICIKLQkJICAgIiU1ZFxuIiwKKwkJICAgIiUtNGQgJS0xNXMgIiBOSVA2X0ZNVCAiICU1ZFxuIiwKIAkJICAgc3RhdGUtPmRldi0+aWZpbmRleCwgc3RhdGUtPmRldi0+bmFtZSwKIAkJICAgTklQNihpbS0+YWNhX2FkZHIpLAogCQkgICBpbS0+YWNhX3VzZXJzKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2VzcDYuYyBiL25ldC9pcHY2L2VzcDYuYwppbmRleCA2ZGU4ZWUxLi43YjViOTRmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9lc3A2LmMKKysrIGIvbmV0L2lwdjYvZXNwNi5jCkBAIC0yNjYsOCArMjY2LDcgQEAKIAl4ID0geGZybV9zdGF0ZV9sb29rdXAoKHhmcm1fYWRkcmVzc190ICopJmlwaC0+ZGFkZHIsIGVzcGgtPnNwaSwgSVBQUk9UT19FU1AsIEFGX0lORVQ2KTsKIAlpZiAoIXgpCiAJCXJldHVybjsKLQlwcmludGsoS0VSTl9ERUJVRyAicG10dSBkaXNjb3Zlcnkgb24gU0EgRVNQLyUwOHgvIgotCQkJIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwgCisJcHJpbnRrKEtFUk5fREVCVUcgInBtdHUgZGlzY292ZXJ5IG9uIFNBIEVTUC8lMDh4LyIgTklQNl9GTVQgIlxuIiwgCiAJCQludG9obChlc3BoLT5zcGkpLCBOSVA2KGlwaC0+ZGFkZHIpKTsKIAl4ZnJtX3N0YXRlX3B1dCh4KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2ljbXAuYyBiL25ldC9pcHY2L2ljbXAuYwppbmRleCA1M2M4MWZjLi5mY2Y4ODMxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pY21wLmMKKysrIGIvbmV0L2lwdjYvaWNtcC5jCkBAIC02MDcsNyArNjA3LDcgQEAKIAkJc2tiLT5jc3VtID0gfmNzdW1faXB2Nl9tYWdpYyhzYWRkciwgZGFkZHIsIHNrYi0+bGVuLAogCQkJCQkgICAgIElQUFJPVE9fSUNNUFY2LCAwKTsKIAkJaWYgKF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIklDTVB2NiBjaGVja3N1bSBmYWlsZWQgWyUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCA+ICUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eF1cbiIsCisJCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJJQ01QdjYgY2hlY2tzdW0gZmFpbGVkIFsiIE5JUDZfRk1UICIgPiAiIE5JUDZfRk1UICJdXG4iLAogCQkJCSAgICAgICBOSVA2KCpzYWRkciksIE5JUDYoKmRhZGRyKSk7CiAJCQlnb3RvIGRpc2NhcmRfaXQ7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwppbmRleCA5NjRhZDlkLi40MTgzYzhkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKKysrIGIvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCkBAIC02MjksOSArNjI5LDcgQEAKIHsKIAl3aGlsZShmbCkgewogCQlzZXFfcHJpbnRmKHNlcSwKLQkJCSAgICIlMDVYICUtMWQgJS02ZCAlLTZkICUtNmxkICUtOGxkICIKLQkJCSAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCi0JCQkgICAiJS00ZFxuIiwKKwkJCSAgICIlMDVYICUtMWQgJS02ZCAlLTZkICUtNmxkICUtOGxkICIgTklQNl9GTVQgIiAlLTRkXG4iLAogCQkJICAgKHVuc2lnbmVkKW50b2hsKGZsLT5sYWJlbCksCiAJCQkgICBmbC0+c2hhcmUsCiAJCQkgICAodW5zaWduZWQpZmwtPm93bmVyLApAQCAtNjQ3LDggKzY0NSw4IEBACiBzdGF0aWMgaW50IGlwNmZsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKLQkJc2VxX3B1dHMoc2VxLCAiTGFiZWwgUyBPd25lciAgVXNlcnMgIExpbmdlciBFeHBpcmVzICAiCi0JCQkgICAgICAiRHN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0XG4iKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTVzICUtMXMgJS02cyAlLTZzICUtNnMgJS04cyAlLTM5cyAlc1xuIiwKKwkJCSAgICJMYWJlbCIsICJTIiwgIk93bmVyIiwgIlVzZXJzIiwgIkxpbmdlciIsICJFeHBpcmVzIiwgIkRzdCIsICJPcHQiKTsKIAllbHNlCiAJCWlwNmZsX2ZsX3NlcV9zaG93KHNlcSwgdik7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcGNvbXA2LmMgYi9uZXQvaXB2Ni9pcGNvbXA2LmMKaW5kZXggNjI2ZGQzOS4uZDUxMWE4OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXBjb21wNi5jCisrKyBiL25ldC9pcHY2L2lwY29tcDYuYwpAQCAtMjEyLDggKzIxMiw3IEBACiAJaWYgKCF4KQogCQlyZXR1cm47CiAKLQlwcmludGsoS0VSTl9ERUJVRyAicG10dSBkaXNjb3Zlcnkgb24gU0EgSVBDT01QLyUwOHgvIgotCQkJIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAicG10dSBkaXNjb3Zlcnkgb24gU0EgSVBDT01QLyUwOHgvIiBOSVA2X0ZNVCAiXG4iLAogCQkJc3BpLCBOSVA2KGlwaC0+ZGFkZHIpKTsKIAl4ZnJtX3N0YXRlX3B1dCh4KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L21jYXN0LmMgYi9uZXQvaXB2Ni9tY2FzdC5jCmluZGV4IGNjM2U5ZjUuLjBlMDNlYWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21jYXN0LmMKKysrIGIvbmV0L2lwdjYvbWNhc3QuYwpAQCAtMjM3Myw3ICsyMzczLDcgQEAKIAlzdHJ1Y3QgaWdtcDZfbWNfaXRlcl9zdGF0ZSAqc3RhdGUgPSBpZ21wNl9tY19zZXFfcHJpdmF0ZShzZXEpOwogCiAJc2VxX3ByaW50ZihzZXEsCi0JCSAgICIlLTRkICUtMTVzICUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHglMDR4ICU1ZCAlMDhYICVsZFxuIiwgCisJCSAgICIlLTRkICUtMTVzICIgTklQNl9GTVQgIiAlNWQgJTA4WCAlbGRcbiIsIAogCQkgICBzdGF0ZS0+ZGV2LT5pZmluZGV4LCBzdGF0ZS0+ZGV2LT5uYW1lLAogCQkgICBOSVA2KGltLT5tY2FfYWRkciksCiAJCSAgIGltLT5tY2FfdXNlcnMsIGltLT5tY2FfZmxhZ3MsCkBAIC0yNTQyLDE1ICsyNTQyLDEyIEBACiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CiAJCXNlcV9wcmludGYoc2VxLCAKIAkJCSAgICIlM3MgJTZzICIKLQkJCSAgICIlMzJzICUzMnMgJTZzICU2c1xuIiwgIklkeCIsCisJCQkgICAiJTM5cyAlMzlzICU2cyAlNnNcbiIsICJJZHgiLAogCQkJICAgIkRldmljZSIsICJNdWx0aWNhc3QgQWRkcmVzcyIsCiAJCQkgICAiU291cmNlIEFkZHJlc3MiLCAiSU5DIiwgIkVYQyIpOwogCX0gZWxzZSB7CiAJCXNlcV9wcmludGYoc2VxLAotCQkJICAgIiUzZCAlNi42cyAiCi0JCQkgICAiJTA0eCUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHggIgotCQkJICAgIiUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHglMDR4ICIKLQkJCSAgICIlNmx1ICU2bHVcbiIsCisJCQkgICAiJTNkICU2LjZzICIgTklQNl9GTVQgIiAiIE5JUDZfRk1UICIgJTZsdSAlNmx1XG4iLAogCQkJICAgc3RhdGUtPmRldi0+aWZpbmRleCwgc3RhdGUtPmRldi0+bmFtZSwKIAkJCSAgIE5JUDYoc3RhdGUtPmltLT5tY2FfYWRkciksCiAJCQkgICBOSVA2KHBzZi0+c2ZfYWRkciksCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZGlzYy5jIGIvbmV0L2lwdjYvbmRpc2MuYwppbmRleCAzMDVkOWVlLi5jYjg4NTZiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZGlzYy5jCisrKyBiL25ldC9pcHY2L25kaXNjLmMKQEAgLTY5Miw3ICs2OTIsNyBAQAogCQlpZiAoIShuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSkgewogCQkJTkRfUFJJTlRLMShLRVJOX0RFQlVHCiAJCQkJICAgIiVzKCk6IHRyeWluZyB0byB1Y2FzdCBwcm9iZSBpbiBOVURfSU5WQUxJRDogIgotCQkJCSAgICIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJCQkJICAgTklQNl9GTVQgIlxuIiwKIAkJCQkgICBfX0ZVTkNUSU9OX18sCiAJCQkJICAgTklQNigqdGFyZ2V0KSk7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggMTA1ZGQ2OS4uMmQ2ZjhlYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTQxLDYgKzQxLDcgQEAKIAogY29uZmlnIElQNl9ORl9JUFRBQkxFUwogCXRyaXN0YXRlICJJUDYgdGFibGVzIHN1cHBvcnQgKHJlcXVpcmVkIGZvciBmaWx0ZXJpbmcvbWFzcS9OQVQpIgorCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAloZWxwCiAJICBpcDZ0YWJsZXMgaXMgYSBnZW5lcmFsLCBleHRlbnNpYmxlIHBhY2tldCBpZGVudGlmaWNhdGlvbiBmcmFtZXdvcmsuCiAJICBDdXJyZW50bHkgb25seSB0aGUgcGFja2V0IGZpbHRlcmluZyBhbmQgcGFja2V0IG1hbmdsaW5nIHN1YnN5c3RlbQpAQCAtNTAsMjUgKzUxLDYgQEAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCiAjIFRoZSBzaW1wbGUgbWF0Y2hlcy4KLWNvbmZpZyBJUDZfTkZfTUFUQ0hfTElNSVQKLQl0cmlzdGF0ZSAibGltaXQgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIGxpbWl0IG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gY29udHJvbCB0aGUgcmF0ZSBhdCB3aGljaCBhIHJ1bGUgY2FuIGJlCi0JICBtYXRjaGVkOiBtYWlubHkgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIExPRyB0YXJnZXQgKCJMT0cKLQkgIHRhcmdldCBzdXBwb3J0IiwgYmVsb3cpIGFuZCB0byBhdm9pZCBzb21lIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFja3MuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgSVA2X05GX01BVENIX01BQwotCXRyaXN0YXRlICJNQUMgYWRkcmVzcyBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCi0JaGVscAotCSAgbWFjIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUgc291cmNlCi0JICBFdGhlcm5ldCBhZGRyZXNzIG9mIHRoZSBwYWNrZXQuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgSVA2X05GX01BVENIX1JUCiAJdHJpc3RhdGUgIlJvdXRpbmcgaGVhZGVyIG1hdGNoIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKQEAgLTEyNCwxNiArMTA2LDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUDZfTkZfTUFUQ0hfTUFSSwotCXRyaXN0YXRlICJuZXRmaWx0ZXIgTUFSSyBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCi0JaGVscAotCSAgTmV0ZmlsdGVyIG1hcmsgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZQotCSAgYG5mbWFyaycgdmFsdWUgaW4gdGhlIHBhY2tldC4gIFRoaXMgY2FuIGJlIHNldCBieSB0aGUgTUFSSyB0YXJnZXQKLQkgIChzZWUgYmVsb3cpLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQNl9ORl9NQVRDSF9JUFY2SEVBREVSCiAJdHJpc3RhdGUgIklQdjYgRXh0ZW5zaW9uIEhlYWRlcnMgTWF0Y2giCiAJZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKQEAgLTE1MSwxNSArMTIzLDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUDZfTkZfTUFUQ0hfTEVOR1RICi0JdHJpc3RhdGUgIlBhY2tldCBMZW5ndGggbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gbWF0Y2ggdGhlIGxlbmd0aCBvZiBhIHBhY2tldCBhZ2FpbnN0IGEKLQkgIHNwZWNpZmljIHZhbHVlIG9yIHJhbmdlIG9mIHZhbHVlcy4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUDZfTkZfTUFUQ0hfRVVJNjQKIAl0cmlzdGF0ZSAiRVVJNjQgYWRkcmVzcyBjaGVjayIKIAlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUwpAQCAtMTcwLDE1ICsxMzMsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQNl9ORl9NQVRDSF9QSFlTREVWCi0JdHJpc3RhdGUgIlBoeXNkZXYgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUyAmJiBCUklER0VfTkVURklMVEVSCi0JaGVscAotCSAgUGh5c2RldiBwYWNrZXQgbWF0Y2hpbmcgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwaHlzaWNhbCBicmlkZ2UgcG9ydHMKLQkgIHRoZSBJUCBwYWNrZXQgYXJyaXZlZCBvbiBvciB3aWxsIGxlYXZlIGJ5LgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQNl9ORl9NQVRDSF9QT0xJQ1kKIAl0cmlzdGF0ZSAiSVBzZWMgcG9saWN5IG1hdGNoIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMgJiYgWEZSTQpAQCAtMjE5LDE3ICsxNzMsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQNl9ORl9UQVJHRVRfTkZRVUVVRQotCXRyaXN0YXRlICJORlFVRVVFIFRhcmdldCBTdXBwb3J0IgotCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCi0JaGVscAotCSAgVGhpcyBUYXJnZXQgcmVwbGFjZWQgdGhlIG9sZCBvYnNvbGV0ZSBRVUVVRSB0YXJnZXQuCi0KLQkgIEFzIG9wcG9zZWQgdG8gUVVFVUUsIGl0IHN1cHBvcnRzIDY1NTM1IGRpZmZlcmVudCBxdWV1ZXMsCi0JICBub3QganVzdCBvbmUuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgSVA2X05GX01BTkdMRQogCXRyaXN0YXRlICJQYWNrZXQgbWFuZ2xpbmciCiAJZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKQEAgLTI0MCwxOSArMTgzLDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUDZfTkZfVEFSR0VUX01BUksKLQl0cmlzdGF0ZSAiTUFSSyB0YXJnZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQNl9ORl9NQU5HTEUKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhZGRzIGEgYE1BUksnIHRhcmdldCwgd2hpY2ggYWxsb3dzIHlvdSB0byBjcmVhdGUgcnVsZXMKLQkgIGluIHRoZSBgbWFuZ2xlJyB0YWJsZSB3aGljaCBhbHRlciB0aGUgbmV0ZmlsdGVyIG1hcmsgKG5mbWFyaykgZmllbGQKLQkgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2V0IHBhY2tldCBwcmlvciB0byByb3V0aW5nLiBUaGlzIGNhbiBjaGFuZ2UKLQkgIHRoZSByb3V0aW5nIG1ldGhvZCAoc2VlIGBVc2UgbmV0ZmlsdGVyIE1BUksgdmFsdWUgYXMgcm91dGluZwotCSAga2V5JykgYW5kIGNhbiBhbHNvIGJlIHVzZWQgYnkgb3RoZXIgc3Vic3lzdGVtcyB0byBjaGFuZ2UgdGhlaXIKLQkgIGJlaGF2aW9yLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQNl9ORl9UQVJHRVRfSEwKIAl0cmlzdGF0ZSAgJ0hMIChob3BsaW1pdCkgdGFyZ2V0IHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBJUDZfTkZfTUFOR0xFCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggYzBjODA5Yi4uNjYzYjQ3NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtNCwxMCArNCw3IEBACiAKICMgTGluayBvcmRlciBtYXR0ZXJzIGhlcmUuCiBvYmotJChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSArPSBpcDZfdGFibGVzLm8KLW9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfTElNSVQpICs9IGlwNnRfbGltaXQubwotb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9NQVJLKSArPSBpcDZ0X21hcmsubwogb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9MRU5HVEgpICs9IGlwNnRfbGVuZ3RoLm8KLW9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfTUFDKSArPSBpcDZ0X21hYy5vCiBvYmotJChDT05GSUdfSVA2X05GX01BVENIX1JUKSArPSBpcDZ0X3J0Lm8KIG9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfT1BUUykgKz0gaXA2dF9oYmgubyBpcDZ0X2RzdC5vCiBvYmotJChDT05GSUdfSVA2X05GX01BVENIX0lQVjZIRUFERVIpICs9IGlwNnRfaXB2NmhlYWRlci5vCkBAIC0xNywxMiArMTQsOSBAQAogb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9FVUk2NCkgKz0gaXA2dF9ldWk2NC5vCiBvYmotJChDT05GSUdfSVA2X05GX01BVENIX01VTFRJUE9SVCkgKz0gaXA2dF9tdWx0aXBvcnQubwogb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9PV05FUikgKz0gaXA2dF9vd25lci5vCi1vYmotJChDT05GSUdfSVA2X05GX01BVENIX1BIWVNERVYpICs9IGlwNnRfcGh5c2Rldi5vCiBvYmotJChDT05GSUdfSVA2X05GX0ZJTFRFUikgKz0gaXA2dGFibGVfZmlsdGVyLm8KIG9iai0kKENPTkZJR19JUDZfTkZfTUFOR0xFKSArPSBpcDZ0YWJsZV9tYW5nbGUubwotb2JqLSQoQ09ORklHX0lQNl9ORl9UQVJHRVRfTUFSSykgKz0gaXA2dF9NQVJLLm8KIG9iai0kKENPTkZJR19JUDZfTkZfVEFSR0VUX0hMKSArPSBpcDZ0X0hMLm8KLW9iai0kKENPTkZJR19JUDZfTkZfVEFSR0VUX05GUVVFVUUpICs9IGlwNnRfTkZRVUVVRS5vCiBvYmotJChDT05GSUdfSVA2X05GX1FVRVVFKSArPSBpcDZfcXVldWUubwogb2JqLSQoQ09ORklHX0lQNl9ORl9UQVJHRVRfTE9HKSArPSBpcDZ0X0xPRy5vCiBvYmotJChDT05GSUdfSVA2X05GX1JBVykgKz0gaXA2dGFibGVfcmF3Lm8KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCmluZGV4IDEzOTAzNzAuLjg0NzA2OGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYwpAQCAtMTMsNiArMTMsOSBAQAogICogCSAgYSB0YWJsZQogICogMDYgSnVuIDIwMDIgQW5kcmFzIEtpcy1TemFibyA8a2lzemFAc2NoLmJtZS5odT4KICAqICAgICAgLSBuZXcgZXh0ZW5zaW9uIGhlYWRlciBwYXJzZXIgY29kZQorICogMTUgT2N0IDIwMDUgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKiAJLSBVbmlmaWNhdGlvbiBvZiB7aXAsaXA2fV90YWJsZXMgaW50byB4X3RhYmxlcworICogCS0gUmVtb3ZlZCB0Y3AgYW5kIHVkcCBjb2RlLCBzaW5jZSBpdCdzIG5vdCBpcHY2IHNwZWNpZmljCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KQEAgLTIzLDggKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+CiAjaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMzMsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4iKTsKQEAgLTY3LDEzICs2OSw4IEBACiAjZWxzZQogI2RlZmluZSBJUF9ORl9BU1NFUlQoeCkKICNlbmRpZgotI2RlZmluZSBTTVBfQUxJR04oeCkgKCgoeCkgKyBTTVBfQ0FDSEVfQllURVMtMSkgJiB+KFNNUF9DQUNIRV9CWVRFUy0xKSkKIAotc3RhdGljIERFQ0xBUkVfTVVURVgoaXA2dF9tdXRleCk7CiAKLS8qIE11c3QgaGF2ZSBtdXRleCAqLwotI2RlZmluZSBBU1NFUlRfUkVBRF9MT0NLKHgpIElQX05GX0FTU0VSVChkb3duX3RyeWxvY2soJmlwNnRfbXV0ZXgpICE9IDApCi0jZGVmaW5lIEFTU0VSVF9XUklURV9MT0NLKHgpIElQX05GX0FTU0VSVChkb3duX3RyeWxvY2soJmlwNnRfbXV0ZXgpICE9IDApCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbGlzdGhlbHAuaD4KIAogI2lmIDAKQEAgLTkxLDMwICs4OCw2IEBACiAKICAgIEhlbmNlIHRoZSBzdGFydCBvZiBhbnkgdGFibGUgaXMgZ2l2ZW4gYnkgZ2V0X3RhYmxlKCkgYmVsb3cuICAqLwogCi0vKiBUaGUgdGFibGUgaXRzZWxmICovCi1zdHJ1Y3QgaXA2dF90YWJsZV9pbmZvCi17Ci0JLyogU2l6ZSBwZXIgdGFibGUgKi8KLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQkvKiBOdW1iZXIgb2YgZW50cmllczogRklYTUUuIC0tUlIgKi8KLQl1bnNpZ25lZCBpbnQgbnVtYmVyOwotCS8qIEluaXRpYWwgbnVtYmVyIG9mIGVudHJpZXMuIE5lZWRlZCBmb3IgbW9kdWxlIHVzYWdlIGNvdW50ICovCi0JdW5zaWduZWQgaW50IGluaXRpYWxfZW50cmllczsKLQotCS8qIEVudHJ5IHBvaW50cyBhbmQgdW5kZXJmbG93cyAqLwotCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0lQNl9OVU1IT09LU107Ci0JdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9JUDZfTlVNSE9PS1NdOwotCi0JLyogaXA2dF9lbnRyeSB0YWJsZXM6IG9uZSBwZXIgQ1BVICovCi0Jdm9pZCAqZW50cmllc1tOUl9DUFVTXTsKLX07Ci0KLXN0YXRpYyBMSVNUX0hFQUQoaXA2dF90YXJnZXQpOwotc3RhdGljIExJU1RfSEVBRChpcDZ0X21hdGNoKTsKLXN0YXRpYyBMSVNUX0hFQUQoaXA2dF90YWJsZXMpOwotI2RlZmluZSBTRVRfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCA9IChiKTsgKGMpLnBjbnQgPSAocCk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQUREX0NPVU5URVIoYyxiLHApIGRvIHsgKGMpLmJjbnQgKz0gKGIpOyAoYykucGNudCArPSAocCk7IH0gd2hpbGUoMCkKLQogI2lmIDAKICNkZWZpbmUgZG93bih4KSBkbyB7IHByaW50aygiRE9XTjoldToiICN4ICJcbiIsIF9fTElORV9fKTsgZG93bih4KTsgfSB3aGlsZSgwKQogI2RlZmluZSBkb3duX2ludGVycnVwdGlibGUoeCkgKHsgaW50IF9fcjsgcHJpbnRrKCJET1dOaToldToiICN4ICJcbiIsIF9fTElORV9fKTsgX19yID0gZG93bl9pbnRlcnJ1cHRpYmxlKHgpOyBpZiAoX19yICE9IDApIHByaW50aygiQUJPUlQtRE9XTmk6JXVcbiIsIF9fTElORV9fKTsgX19yOyB9KQpAQCAtMjk3LDcgKzI3MCw3IEBACiAJICAgICAgdW5zaWduZWQgaW50IGhvb2ssCiAJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICAgICAgc3RydWN0IGlwNnRfdGFibGUgKnRhYmxlLAorCSAgICAgIHN0cnVjdCB4dF90YWJsZSAqdGFibGUsCiAJICAgICAgdm9pZCAqdXNlcmRhdGEpCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgbnVsbGRldm5hbWVbSUZOQU1TSVpdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKGxvbmcpKSkpOwpAQCAtMzA5LDYgKzI4Miw3IEBACiAJY29uc3QgY2hhciAqaW5kZXYsICpvdXRkZXY7CiAJdm9pZCAqdGFibGVfYmFzZTsKIAlzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwgKmJhY2s7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGU7CiAKIAkvKiBJbml0aWFsaXphdGlvbiAqLwogCWluZGV2ID0gaW4gPyBpbi0+bmFtZSA6IG51bGxkZXZuYW1lOwpAQCAtMzIxLDkgKzI5NSwxMCBAQAogCSAqIG1hdGNoIGl0LiAqLwogCiAJcmVhZF9sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CisJcHJpdmF0ZSA9IHRhYmxlLT5wcml2YXRlOwogCUlQX05GX0FTU0VSVCh0YWJsZS0+dmFsaWRfaG9va3MgJiAoMSA8PCBob29rKSk7Ci0JdGFibGVfYmFzZSA9ICh2b2lkICopdGFibGUtPnByaXZhdGUtPmVudHJpZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKLQllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHRhYmxlLT5wcml2YXRlLT5ob29rX2VudHJ5W2hvb2tdKTsKKwl0YWJsZV9iYXNlID0gKHZvaWQgKilwcml2YXRlLT5lbnRyaWVzW3NtcF9wcm9jZXNzb3JfaWQoKV07CisJZSA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCBwcml2YXRlLT5ob29rX2VudHJ5W2hvb2tdKTsKIAogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKIAkvKiBDaGVjayBub29uZSBlbHNlIHVzaW5nIG91ciB0YWJsZSAqLwpAQCAtMzM5LDcgKzMxNCw3IEBACiAjZW5kaWYKIAogCS8qIEZvciByZXR1cm4gZnJvbSBidWlsdGluIGNoYWluICovCi0JYmFjayA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCB0YWJsZS0+cHJpdmF0ZS0+dW5kZXJmbG93W2hvb2tdKTsKKwliYWNrID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHByaXZhdGUtPnVuZGVyZmxvd1tob29rXSk7CiAKIAlkbyB7CiAJCUlQX05GX0FTU0VSVChlKTsKQEAgLTQzOSwxNDUgKzQxNCw2IEBACiAjZW5kaWYKIH0KIAotLyoKLSAqIFRoZXNlIGFyZSB3ZWlyZCwgYnV0IG1vZHVsZSBsb2FkaW5nIG11c3Qgbm90IGJlIGRvbmUgd2l0aCBtdXRleAotICogaGVsZCAoc2luY2UgdGhleSB3aWxsIHJlZ2lzdGVyKSwgYW5kIHdlIGhhdmUgdG8gaGF2ZSBhIHNpbmdsZQotICogZnVuY3Rpb24gdG8gdXNlIHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKCkuCi0gKi8KLQotLyogRmluZCB0YWJsZSBieSBuYW1lLCBncmFicyBtdXRleCAmIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXA2dF90YWJsZSAqZmluZF90YWJsZV9sb2NrKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGlwNnRfdGFibGUgKnQ7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmaXA2dF90YWJsZXMsIGxpc3QpCi0JCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldCh0LT5tZSkpCi0JCQlyZXR1cm4gdDsKLQl1cCgmaXA2dF9tdXRleCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEZpbmQgbWF0Y2gsIGdyYWJzIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXA2dF9tYXRjaCAqZmluZF9tYXRjaChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKLXsKLQlzdHJ1Y3QgaXA2dF9tYXRjaCAqbTsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwNnRfbXV0ZXgpICE9IDApCi0JCXJldHVybiBFUlJfUFRSKC1FSU5UUik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZpcDZ0X21hdGNoLCBsaXN0KSB7Ci0JCWlmIChzdHJjbXAobS0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJaWYgKG0tPnJldmlzaW9uID09IHJldmlzaW9uKSB7Ci0JCQkJaWYgKHRyeV9tb2R1bGVfZ2V0KG0tPm1lKSkgewotCQkJCQl1cCgmaXA2dF9tdXRleCk7Ci0JCQkJCXJldHVybiBtOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWVyciA9IC1FUFJPVE9UWVBFOyAvKiBGb3VuZCBzb21ldGhpbmcuICovCi0JCX0KLQl9Ci0JdXAoJmlwNnRfbXV0ZXgpOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLS8qIEZpbmQgdGFyZ2V0LCBncmFicyByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwNnRfdGFyZ2V0ICpmaW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKLXsKLQlzdHJ1Y3QgaXA2dF90YXJnZXQgKnQ7Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmaXA2dF90YXJnZXQsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAodC0+cmV2aXNpb24gPT0gcmV2aXNpb24pIHsKLQkJCQlpZiAodHJ5X21vZHVsZV9nZXQodC0+bWUpKSB7Ci0JCQkJCXVwKCZpcDZ0X211dGV4KTsKLQkJCQkJcmV0dXJuIHQ7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJZXJyID0gLUVQUk9UT1RZUEU7IC8qIEZvdW5kIHNvbWV0aGluZy4gKi8KLQkJfQotCX0KLQl1cCgmaXA2dF9tdXRleCk7Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKLX0KLQotc3RydWN0IGlwNnRfdGFyZ2V0ICppcDZ0X2ZpbmRfdGFyZ2V0KGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQotewotCXN0cnVjdCBpcDZ0X3RhcmdldCAqdGFyZ2V0OwotCi0JdGFyZ2V0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF90YXJnZXQobmFtZSwgcmV2aXNpb24pLAotCQkJCQkgImlwNnRfJXMiLCBuYW1lKTsKLQlpZiAoSVNfRVJSKHRhcmdldCkgfHwgIXRhcmdldCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHRhcmdldDsKLX0KLQotc3RhdGljIGludCBtYXRjaF9yZXZmbihjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50ICpiZXN0cCkKLXsKLQlzdHJ1Y3QgaXA2dF9tYXRjaCAqbTsKLQlpbnQgaGF2ZV9yZXYgPSAwOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShtLCAmaXA2dF9tYXRjaCwgbGlzdCkgewotCQlpZiAoc3RyY21wKG0tPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCWlmIChtLT5yZXZpc2lvbiA+ICpiZXN0cCkKLQkJCQkqYmVzdHAgPSBtLT5yZXZpc2lvbjsKLQkJCWlmIChtLT5yZXZpc2lvbiA9PSByZXZpc2lvbikKLQkJCQloYXZlX3JldiA9IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIGhhdmVfcmV2OwotfQotCi1zdGF0aWMgaW50IHRhcmdldF9yZXZmbihjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50ICpiZXN0cCkKLXsKLQlzdHJ1Y3QgaXA2dF90YXJnZXQgKnQ7Ci0JaW50IGhhdmVfcmV2ID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmlwNnRfdGFyZ2V0LCBsaXN0KSB7Ci0JCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJaWYgKHQtPnJldmlzaW9uID4gKmJlc3RwKQotCQkJCSpiZXN0cCA9IHQtPnJldmlzaW9uOwotCQkJaWYgKHQtPnJldmlzaW9uID09IHJldmlzaW9uKQotCQkJCWhhdmVfcmV2ID0gMTsKLQkJfQotCX0KLQlyZXR1cm4gaGF2ZV9yZXY7Ci19Ci0KLS8qIFJldHVybnMgdHJ1ZSBvciBmYWxzIChpZiBubyBzdWNoIGV4dGVuc2lvbiBhdCBhbGwpICovCi1zdGF0aWMgaW5saW5lIGludCBmaW5kX3JldmlzaW9uKGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLAotCQkJCWludCAoKnJldmZuKShjb25zdCBjaGFyICosIHU4LCBpbnQgKiksCi0JCQkJaW50ICplcnIpCi17Ci0JaW50IGhhdmVfcmV2LCBiZXN0ID0gLTE7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KSAhPSAwKSB7Ci0JCSplcnIgPSAtRUlOVFI7Ci0JCXJldHVybiAxOwotCX0KLQloYXZlX3JldiA9IHJldmZuKG5hbWUsIHJldmlzaW9uLCAmYmVzdCk7Ci0JdXAoJmlwNnRfbXV0ZXgpOwotCi0JLyogTm90aGluZyBhdCBhbGw/ICBSZXR1cm4gMCB0byB0cnkgbG9hZGluZyBtb2R1bGUuICovCi0JaWYgKGJlc3QgPT0gLTEpIHsKLQkJKmVyciA9IC1FTk9FTlQ7Ci0JCXJldHVybiAwOwotCX0KLQotCSplcnIgPSBiZXN0OwotCWlmICghaGF2ZV9yZXYpCi0JCSplcnIgPSAtRVBST1RPTk9TVVBQT1JUOwotCXJldHVybiAxOwotfQotCi0KIC8qIEFsbCB6ZXJvZXMgPT0gdW5jb25kaXRpb25hbCBydWxlLiAqLwogc3RhdGljIGlubGluZSBpbnQKIHVuY29uZGl0aW9uYWwoY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2KQpAQCAtNTk0LDcgKzQzMCw3IEBACiAvKiBGaWd1cmVzIG91dCBmcm9tIHdoYXQgaG9vayBlYWNoIHJ1bGUgY2FuIGJlIGNhbGxlZDogcmV0dXJucyAwIGlmCiAgICB0aGVyZSBhcmUgbG9vcHMuICBQdXRzIGhvb2sgYml0bWFzayBpbiBjb21lZnJvbS4gKi8KIHN0YXRpYyBpbnQKLW1hcmtfc291cmNlX2NoYWlucyhzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICpuZXdpbmZvLAorbWFya19zb3VyY2VfY2hhaW5zKHN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLAogCQkgICB1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3MsIHZvaWQgKmVudHJ5MCkKIHsKIAl1bnNpZ25lZCBpbnQgaG9vazsKQEAgLTc0MCwxMSArNTc2LDExIEBACiB7CiAJc3RydWN0IGlwNnRfbWF0Y2ggKm1hdGNoOwogCi0JbWF0Y2ggPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX21hdGNoKG0tPnUudXNlci5uYW1lLAotCQkJCQkJICAgbS0+dS51c2VyLnJldmlzaW9uKSwKKwltYXRjaCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfbWF0Y2goQUZfSU5FVDYsIG0tPnUudXNlci5uYW1lLAorCQkJICAgICAgCQltLT51LnVzZXIucmV2aXNpb24pLAogCQkJCQkiaXA2dF8lcyIsIG0tPnUudXNlci5uYW1lKTsKIAlpZiAoSVNfRVJSKG1hdGNoKSB8fCAhbWF0Y2gpIHsKLQkJZHVwcmludGYoImNoZWNrX21hdGNoOiBgJXMnIG5vdCBmb3VuZFxuIiwgbS0+dS51c2VyLm5hbWUpOworCSAgCWR1cHJpbnRmKCJjaGVja19tYXRjaDogYCVzJyBub3QgZm91bmRcbiIsIG0tPnUudXNlci5uYW1lKTsKIAkJcmV0dXJuIG1hdGNoID8gUFRSX0VSUihtYXRjaCkgOiAtRU5PRU5UOwogCX0KIAltLT51Lmtlcm5lbC5tYXRjaCA9IG1hdGNoOwpAQCAtNzg1LDggKzYyMSw5IEBACiAJCWdvdG8gY2xlYW51cF9tYXRjaGVzOwogCiAJdCA9IGlwNnRfZ2V0X3RhcmdldChlKTsKLQl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhcmdldCh0LT51LnVzZXIubmFtZSwKLQkJCQkJCSAgICAgdC0+dS51c2VyLnJldmlzaW9uKSwKKwl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhcmdldChBRl9JTkVUNiwKKwkJCQkJCQl0LT51LnVzZXIubmFtZSwKKwkJCQkJCQl0LT51LnVzZXIucmV2aXNpb24pLAogCQkJCQkgImlwNnRfJXMiLCB0LT51LnVzZXIubmFtZSk7CiAJaWYgKElTX0VSUih0YXJnZXQpIHx8ICF0YXJnZXQpIHsKIAkJZHVwcmludGYoImNoZWNrX2VudHJ5OiBgJXMnIG5vdCBmb3VuZFxuIiwgdC0+dS51c2VyLm5hbWUpOwpAQCAtODIyLDcgKzY1OSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50CiBjaGVja19lbnRyeV9zaXplX2FuZF9ob29rcyhzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKLQkJCSAgIHN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKm5ld2luZm8sCisJCQkgICBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKIAkJCSAgIHVuc2lnbmVkIGNoYXIgKmJhc2UsCiAJCQkgICB1bnNpZ25lZCBjaGFyICpsaW1pdCwKIAkJCSAgIGNvbnN0IHVuc2lnbmVkIGludCAqaG9va19lbnRyaWVzLApAQCAtODU2LDcgKzY5Myw3IEBACiAgICAgICAgICAgIDwgMCAobm90IElQNlRfUkVUVVJOKS4gLS1SUiAqLwogCiAJLyogQ2xlYXIgY291bnRlcnMgYW5kIGNvbWVmcm9tICovCi0JZS0+Y291bnRlcnMgPSAoKHN0cnVjdCBpcDZ0X2NvdW50ZXJzKSB7IDAsIDAgfSk7CisJZS0+Y291bnRlcnMgPSAoKHN0cnVjdCB4dF9jb3VudGVycykgeyAwLCAwIH0pOwogCWUtPmNvbWVmcm9tID0gMDsKIAogCSgqaSkrKzsKQEAgLTg4Niw3ICs3MjMsNyBAQAogc3RhdGljIGludAogdHJhbnNsYXRlX3RhYmxlKGNvbnN0IGNoYXIgKm5hbWUsCiAJCXVuc2lnbmVkIGludCB2YWxpZF9ob29rcywKLQkJc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sCiAJCXZvaWQgKmVudHJ5MCwKIAkJdW5zaWduZWQgaW50IHNpemUsCiAJCXVuc2lnbmVkIGludCBudW1iZXIsCkBAIC05NjMsNDggKzgwMCwxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICoKLXJlcGxhY2VfdGFibGUoc3RydWN0IGlwNnRfdGFibGUgKnRhYmxlLAotCSAgICAgIHVuc2lnbmVkIGludCBudW1fY291bnRlcnMsCi0JICAgICAgc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqbmV3aW5mbywKLQkgICAgICBpbnQgKmVycm9yKQotewotCXN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKm9sZGluZm87Ci0KLSNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCi0JewotCQlpbnQgY3B1OwotCi0JCWZvcl9lYWNoX2NwdShjcHUpIHsKLQkJCXN0cnVjdCBpcDZ0X2VudHJ5ICp0YWJsZV9iYXNlID0gbmV3aW5mby0+ZW50cmllc1tjcHVdOwotCQkJaWYgKHRhYmxlX2Jhc2UpCi0JCQkJdGFibGVfYmFzZS0+Y29tZWZyb20gPSAweGRlYWQ1N2FjOwotCQl9Ci0JfQotI2VuZGlmCi0KLQkvKiBEbyB0aGUgc3Vic3RpdHV0aW9uLiAqLwotCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQkvKiBDaGVjayBpbnNpZGUgbG9jazogaXMgdGhlIG9sZCBudW1iZXIgY29ycmVjdD8gKi8KLQlpZiAobnVtX2NvdW50ZXJzICE9IHRhYmxlLT5wcml2YXRlLT5udW1iZXIpIHsKLQkJZHVwcmludGYoIm51bV9jb3VudGVycyAhPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyICgldS8ldSlcbiIsCi0JCQkgbnVtX2NvdW50ZXJzLCB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0JCSplcnJvciA9IC1FQUdBSU47Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvbGRpbmZvID0gdGFibGUtPnByaXZhdGU7Ci0JdGFibGUtPnByaXZhdGUgPSBuZXdpbmZvOwotCW5ld2luZm8tPmluaXRpYWxfZW50cmllcyA9IG9sZGluZm8tPmluaXRpYWxfZW50cmllczsKLQl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQotCXJldHVybiBvbGRpbmZvOwotfQotCiAvKiBHZXRzIGNvdW50ZXJzLiAqLwogc3RhdGljIGlubGluZSBpbnQKIGFkZF9lbnRyeV90b19jb3VudGVyKGNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5ICplLAotCQkgICAgIHN0cnVjdCBpcDZ0X2NvdW50ZXJzIHRvdGFsW10sCisJCSAgICAgc3RydWN0IHh0X2NvdW50ZXJzIHRvdGFsW10sCiAJCSAgICAgdW5zaWduZWQgaW50ICppKQogewogCUFERF9DT1VOVEVSKHRvdGFsWyppXSwgZS0+Y291bnRlcnMuYmNudCwgZS0+Y291bnRlcnMucGNudCk7CkBAIC0xMDI1LDggKzgyNCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1nZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqdCwKLQkgICAgIHN0cnVjdCBpcDZ0X2NvdW50ZXJzIGNvdW50ZXJzW10pCitnZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IHh0X3RhYmxlX2luZm8gKnQsCisJICAgICBzdHJ1Y3QgeHRfY291bnRlcnMgY291bnRlcnNbXSkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1OwogCXVuc2lnbmVkIGludCBpOwpAQCAtMTA2MCwxOSArODU5LDIwIEBACiAKIHN0YXRpYyBpbnQKIGNvcHlfZW50cmllc190b191c2VyKHVuc2lnbmVkIGludCB0b3RhbF9zaXplLAotCQkgICAgIHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSwKKwkJICAgICBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAogCQkgICAgIHZvaWQgX191c2VyICp1c2VycHRyKQogewogCXVuc2lnbmVkIGludCBvZmYsIG51bSwgY291bnRlcnNpemU7CiAJc3RydWN0IGlwNnRfZW50cnkgKmU7Ci0Jc3RydWN0IGlwNnRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnM7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGUgPSB0YWJsZS0+cHJpdmF0ZTsKIAlpbnQgcmV0ID0gMDsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCiAJLyogV2UgbmVlZCBhdG9taWMgc25hcHNob3Qgb2YgY291bnRlcnM6IHJlc3QgZG9lc24ndCBjaGFuZ2UKIAkgICAob3RoZXIgdGhhbiBjb21lZnJvbSwgd2hpY2ggdXNlcnNwYWNlIGRvZXNuJ3QgY2FyZQogCSAgIGFib3V0KS4gKi8KLQljb3VudGVyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXA2dF9jb3VudGVycykgKiB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOworCWNvdW50ZXJzaXplID0gc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykgKiBwcml2YXRlLT5udW1iZXI7CiAJY291bnRlcnMgPSB2bWFsbG9jKGNvdW50ZXJzaXplKTsKIAogCWlmIChjb3VudGVycyA9PSBOVUxMKQpAQCAtMTA4MCwxMSArODgwLDExIEBACiAKIAkvKiBGaXJzdCwgc3VtIGNvdW50ZXJzLi4uICovCiAJd3JpdGVfbG9ja19iaCgmdGFibGUtPmxvY2spOwotCWdldF9jb3VudGVycyh0YWJsZS0+cHJpdmF0ZSwgY291bnRlcnMpOworCWdldF9jb3VudGVycyhwcml2YXRlLCBjb3VudGVycyk7CiAJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CiAKIAkvKiBjaG9vc2UgdGhlIGNvcHkgdGhhdCBpcyBvbiBvdXJjIG5vZGUvY3B1ICovCi0JbG9jX2NwdV9lbnRyeSA9IHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOworCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCWlmIChjb3B5X3RvX3VzZXIodXNlcnB0ciwgbG9jX2NwdV9lbnRyeSwgdG90YWxfc2l6ZSkgIT0gMCkgewogCQlyZXQgPSAtRUZBVUxUOwogCQlnb3RvIGZyZWVfY291bnRlcnM7CkBAIC0xMTQzLDg3ICs5NDMsNDIgQEAKIAkgICAgc3RydWN0IGlwNnRfZ2V0X2VudHJpZXMgX191c2VyICp1cHRyKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGlwNnRfdGFibGUgKnQ7CisJc3RydWN0IHh0X3RhYmxlICp0OwogCi0JdCA9IGZpbmRfdGFibGVfbG9jayhlbnRyaWVzLT5uYW1lKTsKKwl0ID0geHRfZmluZF90YWJsZV9sb2NrKEFGX0lORVQ2LCBlbnRyaWVzLT5uYW1lKTsKIAlpZiAodCAmJiAhSVNfRVJSKHQpKSB7Ci0JCWR1cHJpbnRmKCJ0LT5wcml2YXRlLT5udW1iZXIgPSAldVxuIiwKLQkJCSB0LT5wcml2YXRlLT5udW1iZXIpOwotCQlpZiAoZW50cmllcy0+c2l6ZSA9PSB0LT5wcml2YXRlLT5zaXplKQotCQkJcmV0ID0gY29weV9lbnRyaWVzX3RvX3VzZXIodC0+cHJpdmF0ZS0+c2l6ZSwKKwkJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGUgPSB0LT5wcml2YXRlOworCQlkdXByaW50ZigidC0+cHJpdmF0ZS0+bnVtYmVyID0gJXVcbiIsIHByaXZhdGUtPm51bWJlcik7CisJCWlmIChlbnRyaWVzLT5zaXplID09IHByaXZhdGUtPnNpemUpCisJCQlyZXQgPSBjb3B5X2VudHJpZXNfdG9fdXNlcihwcml2YXRlLT5zaXplLAogCQkJCQkJICAgdCwgdXB0ci0+ZW50cnl0YWJsZSk7CiAJCWVsc2UgewogCQkJZHVwcmludGYoImdldF9lbnRyaWVzOiBJJ3ZlIGdvdCAldSBub3QgJXUhXG4iLAotCQkJCSB0LT5wcml2YXRlLT5zaXplLAotCQkJCSBlbnRyaWVzLT5zaXplKTsKKwkJCQkgcHJpdmF0ZS0+c2l6ZSwgZW50cmllcy0+c2l6ZSk7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQl9CiAJCW1vZHVsZV9wdXQodC0+bWUpOwotCQl1cCgmaXA2dF9tdXRleCk7CisJCXh0X3RhYmxlX3VubG9jayh0KTsKIAl9IGVsc2UKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV90YWJsZV9pbmZvKHN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKmluZm8pCi17Ci0JaW50IGNwdTsKLQlmb3JfZWFjaF9jcHUoY3B1KSB7Ci0JCWlmIChpbmZvLT5zaXplIDw9IFBBR0VfU0laRSkKLQkJCWtmcmVlKGluZm8tPmVudHJpZXNbY3B1XSk7Ci0JCWVsc2UKLQkJCXZmcmVlKGluZm8tPmVudHJpZXNbY3B1XSk7Ci0JfQotCWtmcmVlKGluZm8pOwotfQotCi1zdGF0aWMgc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqYWxsb2NfdGFibGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICpuZXdpbmZvOwotCWludCBjcHU7Ci0KLQluZXdpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwNnRfdGFibGVfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghbmV3aW5mbykKLQkJcmV0dXJuIE5VTEw7Ci0KLQluZXdpbmZvLT5zaXplID0gc2l6ZTsKLQotCWZvcl9lYWNoX2NwdShjcHUpIHsKLQkJaWYgKHNpemUgPD0gUEFHRV9TSVpFKQotCQkJbmV3aW5mby0+ZW50cmllc1tjcHVdID0ga21hbGxvY19ub2RlKHNpemUsCi0JCQkJCQkJR0ZQX0tFUk5FTCwKLQkJCQkJCQljcHVfdG9fbm9kZShjcHUpKTsKLQkJZWxzZQotCQkJbmV3aW5mby0+ZW50cmllc1tjcHVdID0gdm1hbGxvY19ub2RlKHNpemUsCi0JCQkJCQkJICAgICBjcHVfdG9fbm9kZShjcHUpKTsKLQkJaWYgKG5ld2luZm8tPmVudHJpZXNbY3B1XSA9PSBOVUxMKSB7Ci0JCQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiBuZXdpbmZvOwotfQotCiBzdGF0aWMgaW50CiBkb19yZXBsYWNlKHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCWludCByZXQ7CiAJc3RydWN0IGlwNnRfcmVwbGFjZSB0bXA7Ci0Jc3RydWN0IGlwNnRfdGFibGUgKnQ7Ci0Jc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqbmV3aW5mbywgKm9sZGluZm87Ci0Jc3RydWN0IGlwNnRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF90YWJsZSAqdDsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywgKm9sZGluZm87CisJc3RydWN0IHh0X2NvdW50ZXJzICpjb3VudGVyczsKIAl2b2lkICpsb2NfY3B1X2VudHJ5LCAqbG9jX2NwdV9vbGRfZW50cnk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlciwgc2l6ZW9mKHRtcCkpICE9IDApCiAJCXJldHVybiAtRUZBVUxUOwogCi0JLyogUGVkYW50cnk6IHByZXZlbnQgdGhlbSBmcm9tIGhpdHRpbmcgQlVHKCkgaW4gdm1hbGxvYy5jIC0tUlIgKi8KLQlpZiAoKFNNUF9BTElHTih0bXAuc2l6ZSkgPj4gUEFHRV9TSElGVCkgKyAyID4gbnVtX3BoeXNwYWdlcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQluZXdpbmZvID0gYWxsb2NfdGFibGVfaW5mbyh0bXAuc2l6ZSk7CisJbmV3aW5mbyA9IHh0X2FsbG9jX3RhYmxlX2luZm8odG1wLnNpemUpOwogCWlmICghbmV3aW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEyMzUsNyArOTkwLDcgQEAKIAkJZ290byBmcmVlX25ld2luZm87CiAJfQogCi0JY291bnRlcnMgPSB2bWFsbG9jKHRtcC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IGlwNnRfY291bnRlcnMpKTsKKwljb3VudGVycyA9IHZtYWxsb2ModG1wLm51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpKTsKIAlpZiAoIWNvdW50ZXJzKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZnJlZV9uZXdpbmZvOwpAQCAtMTI0OSw3ICsxMDA0LDcgQEAKIAogCWR1cHJpbnRmKCJpcF90YWJsZXM6IFRyYW5zbGF0ZWQgdGFibGVcbiIpOwogCi0JdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFibGVfbG9jayh0bXAubmFtZSksCisJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFibGVfbG9jayhBRl9JTkVUNiwgdG1wLm5hbWUpLAogCQkJCSAgICAiaXA2dGFibGVfJXMiLCB0bXAubmFtZSk7CiAJaWYgKCF0IHx8IElTX0VSUih0KSkgewogCQlyZXQgPSB0ID8gUFRSX0VSUih0KSA6IC1FTk9FTlQ7CkBAIC0xMjY0LDcgKzEwMTksNyBAQAogCQlnb3RvIHB1dF9tb2R1bGU7CiAJfQogCi0Jb2xkaW5mbyA9IHJlcGxhY2VfdGFibGUodCwgdG1wLm51bV9jb3VudGVycywgbmV3aW5mbywgJnJldCk7CisJb2xkaW5mbyA9IHh0X3JlcGxhY2VfdGFibGUodCwgdG1wLm51bV9jb3VudGVycywgbmV3aW5mbywgJnJldCk7CiAJaWYgKCFvbGRpbmZvKQogCQlnb3RvIHB1dF9tb2R1bGU7CiAKQEAgLTEyODMsMjMgKzEwMzgsMjMgQEAKIAkvKiBEZWNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnRzIGFuZCBmcmVlIHJlc291cmNlICovCiAJbG9jX2NwdV9vbGRfZW50cnkgPSBvbGRpbmZvLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCUlQNlRfRU5UUllfSVRFUkFURShsb2NfY3B1X29sZF9lbnRyeSwgb2xkaW5mby0+c2l6ZSwgY2xlYW51cF9lbnRyeSxOVUxMKTsKLQlmcmVlX3RhYmxlX2luZm8ob2xkaW5mbyk7CisJeHRfZnJlZV90YWJsZV9pbmZvKG9sZGluZm8pOwogCWlmIChjb3B5X3RvX3VzZXIodG1wLmNvdW50ZXJzLCBjb3VudGVycywKLQkJCSBzaXplb2Yoc3RydWN0IGlwNnRfY291bnRlcnMpICogdG1wLm51bV9jb3VudGVycykgIT0gMCkKKwkJCSBzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSAqIHRtcC5udW1fY291bnRlcnMpICE9IDApCiAJCXJldCA9IC1FRkFVTFQ7CiAJdmZyZWUoY291bnRlcnMpOwotCXVwKCZpcDZ0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAJcmV0dXJuIHJldDsKIAogIHB1dF9tb2R1bGU6CiAJbW9kdWxlX3B1dCh0LT5tZSk7Ci0JdXAoJmlwNnRfbXV0ZXgpOworCXh0X3RhYmxlX3VubG9jayh0KTsKICBmcmVlX25ld2luZm9fY291bnRlcnNfdW50cmFuczoKIAlJUDZUX0VOVFJZX0lURVJBVEUobG9jX2NwdV9lbnRyeSwgbmV3aW5mby0+c2l6ZSwgY2xlYW51cF9lbnRyeSxOVUxMKTsKICBmcmVlX25ld2luZm9fY291bnRlcnM6CiAJdmZyZWUoY291bnRlcnMpOwogIGZyZWVfbmV3aW5mbzoKLQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEzMDcsNyArMTA2Miw3IEBACiAgKiBhbmQgZXZlcnl0aGluZyBpcyBPSy4gKi8KIHN0YXRpYyBpbmxpbmUgaW50CiBhZGRfY291bnRlcl90b19lbnRyeShzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKLQkJICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9jb3VudGVycyBhZGRtZVtdLAorCQkgICAgIGNvbnN0IHN0cnVjdCB4dF9jb3VudGVycyBhZGRtZVtdLAogCQkgICAgIHVuc2lnbmVkIGludCAqaSkKIHsKICNpZiAwCkBAIC0xMzI5LDE1ICsxMDg0LDE2IEBACiBkb19hZGRfY291bnRlcnModm9pZCBfX3VzZXIgKnVzZXIsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IGlwNnRfY291bnRlcnNfaW5mbyB0bXAsICpwYWRkYzsKLQlzdHJ1Y3QgaXA2dF90YWJsZSAqdDsKKwlzdHJ1Y3QgeHRfY291bnRlcnNfaW5mbyB0bXAsICpwYWRkYzsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKKwlzdHJ1Y3QgeHRfdGFibGUgKnQ7CiAJaW50IHJldCA9IDA7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXplb2YodG1wKSkgIT0gMCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLm51bV9jb3VudGVycypzaXplb2Yoc3RydWN0IGlwNnRfY291bnRlcnMpKQorCWlmIChsZW4gIT0gc2l6ZW9mKHRtcCkgKyB0bXAubnVtX2NvdW50ZXJzKnNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBhZGRjID0gdm1hbGxvYyhsZW4pOwpAQCAtMTM0OSwyOSArMTEwNSwzMCBAQAogCQlnb3RvIGZyZWU7CiAJfQogCi0JdCA9IGZpbmRfdGFibGVfbG9jayh0bXAubmFtZSk7CisJdCA9IHh0X2ZpbmRfdGFibGVfbG9jayhBRl9JTkVUNiwgdG1wLm5hbWUpOwogCWlmICghdCB8fCBJU19FUlIodCkpIHsKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwogCQlnb3RvIGZyZWU7CiAJfQogCiAJd3JpdGVfbG9ja19iaCgmdC0+bG9jayk7Ci0JaWYgKHQtPnByaXZhdGUtPm51bWJlciAhPSBwYWRkYy0+bnVtX2NvdW50ZXJzKSB7CisJcHJpdmF0ZSA9IHQtPnByaXZhdGU7CisJaWYgKHByaXZhdGUtPm51bWJlciAhPSBwYWRkYy0+bnVtX2NvdW50ZXJzKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gdW5sb2NrX3VwX2ZyZWU7CiAJfQogCiAJaSA9IDA7CiAJLyogQ2hvb3NlIHRoZSBjb3B5IHRoYXQgaXMgb24gb3VyIG5vZGUgKi8KLQlsb2NfY3B1X2VudHJ5ID0gdC0+cHJpdmF0ZS0+ZW50cmllc1tzbXBfcHJvY2Vzc29yX2lkKCldOworCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3NtcF9wcm9jZXNzb3JfaWQoKV07CiAJSVA2VF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksCi0JCQkgIHQtPnByaXZhdGUtPnNpemUsCisJCQkgIHByaXZhdGUtPnNpemUsCiAJCQkgIGFkZF9jb3VudGVyX3RvX2VudHJ5LAogCQkJICBwYWRkYy0+Y291bnRlcnMsCiAJCQkgICZpKTsKICB1bmxvY2tfdXBfZnJlZToKIAl3cml0ZV91bmxvY2tfYmgoJnQtPmxvY2spOwotCXVwKCZpcDZ0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAJbW9kdWxlX3B1dCh0LT5tZSk7CiAgZnJlZToKIAl2ZnJlZShwYWRkYyk7CkBAIC0xNDE1LDcgKzExNzIsNyBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBJUDZUX1NPX0dFVF9JTkZPOiB7CiAJCWNoYXIgbmFtZVtJUDZUX1RBQkxFX01BWE5BTUVMRU5dOwotCQlzdHJ1Y3QgaXA2dF90YWJsZSAqdDsKKwkJc3RydWN0IHh0X3RhYmxlICp0OwogCiAJCWlmICgqbGVuICE9IHNpemVvZihzdHJ1Y3QgaXA2dF9nZXRpbmZvKSkgewogCQkJZHVwcmludGYoImxlbmd0aCAldSAhPSAldVxuIiwgKmxlbiwKQEAgLTE0MzAsMjUgKzExODcsMjYgQEAKIAkJfQogCQluYW1lW0lQNlRfVEFCTEVfTUFYTkFNRUxFTi0xXSA9ICdcMCc7CiAKLQkJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFibGVfbG9jayhuYW1lKSwKKwkJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFibGVfbG9jayhBRl9JTkVUNiwgbmFtZSksCiAJCQkJCSAgICAiaXA2dGFibGVfJXMiLCBuYW1lKTsKIAkJaWYgKHQgJiYgIUlTX0VSUih0KSkgewogCQkJc3RydWN0IGlwNnRfZ2V0aW5mbyBpbmZvOworCQkJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGUgPSB0LT5wcml2YXRlOwogCiAJCQlpbmZvLnZhbGlkX2hvb2tzID0gdC0+dmFsaWRfaG9va3M7Ci0JCQltZW1jcHkoaW5mby5ob29rX2VudHJ5LCB0LT5wcml2YXRlLT5ob29rX2VudHJ5LAorCQkJbWVtY3B5KGluZm8uaG9va19lbnRyeSwgcHJpdmF0ZS0+aG9va19lbnRyeSwKIAkJCSAgICAgICBzaXplb2YoaW5mby5ob29rX2VudHJ5KSk7Ci0JCQltZW1jcHkoaW5mby51bmRlcmZsb3csIHQtPnByaXZhdGUtPnVuZGVyZmxvdywKKwkJCW1lbWNweShpbmZvLnVuZGVyZmxvdywgcHJpdmF0ZS0+dW5kZXJmbG93LAogCQkJICAgICAgIHNpemVvZihpbmZvLnVuZGVyZmxvdykpOwotCQkJaW5mby5udW1fZW50cmllcyA9IHQtPnByaXZhdGUtPm51bWJlcjsKLQkJCWluZm8uc2l6ZSA9IHQtPnByaXZhdGUtPnNpemU7CisJCQlpbmZvLm51bV9lbnRyaWVzID0gcHJpdmF0ZS0+bnVtYmVyOworCQkJaW5mby5zaXplID0gcHJpdmF0ZS0+c2l6ZTsKIAkJCW1lbWNweShpbmZvLm5hbWUsIG5hbWUsIHNpemVvZihpbmZvLm5hbWUpKTsKIAogCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyLCAmaW5mbywgKmxlbikgIT0gMCkKIAkJCQlyZXQgPSAtRUZBVUxUOwogCQkJZWxzZQogCQkJCXJldCA9IDA7Ci0JCQl1cCgmaXA2dF9tdXRleCk7CisJCQl4dF90YWJsZV91bmxvY2sodCk7CiAJCQltb2R1bGVfcHV0KHQtPm1lKTsKIAkJfSBlbHNlCiAJCQlyZXQgPSB0ID8gUFRSX0VSUih0KSA6IC1FTk9FTlQ7CkBAIC0xNDc1LDcgKzEyMzMsNyBAQAogCWNhc2UgSVA2VF9TT19HRVRfUkVWSVNJT05fTUFUQ0g6CiAJY2FzZSBJUDZUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQ6IHsKIAkJc3RydWN0IGlwNnRfZ2V0X3JldmlzaW9uIHJldjsKLQkJaW50ICgqcmV2Zm4pKGNvbnN0IGNoYXIgKiwgdTgsIGludCAqKTsKKwkJaW50IHRhcmdldDsKIAogCQlpZiAoKmxlbiAhPSBzaXplb2YocmV2KSkgewogCQkJcmV0ID0gLUVJTlZBTDsKQEAgLTE0ODcsMTIgKzEyNDUsMTMgQEAKIAkJfQogCiAJCWlmIChjbWQgPT0gSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUKQotCQkJcmV2Zm4gPSB0YXJnZXRfcmV2Zm47CisJCQl0YXJnZXQgPSAxOwogCQllbHNlCi0JCQlyZXZmbiA9IG1hdGNoX3JldmZuOworCQkJdGFyZ2V0ID0gMDsKIAotCQl0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3JldmlzaW9uKHJldi5uYW1lLCByZXYucmV2aXNpb24sCi0JCQkJCQkgICAgICByZXZmbiwgJnJldCksCisJCXRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfcmV2aXNpb24oQUZfSU5FVDYsIHJldi5uYW1lLAorCQkJCQkJCSByZXYucmV2aXNpb24sCisJCQkJCQkJIHRhcmdldCwgJnJldCksCiAJCQkJCSJpcDZ0XyVzIiwgcmV2Lm5hbWUpOwogCQlicmVhazsKIAl9CkBAIC0xNTA1LDYxICsxMjY0LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogUmVnaXN0cmF0aW9uIGhvb2tzIGZvciB0YXJnZXRzLiAqLwotaW50Ci1pcDZ0X3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgaXA2dF90YXJnZXQgKnRhcmdldCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0JbGlzdF9hZGQoJnRhcmdldC0+bGlzdCwgJmlwNnRfdGFyZ2V0KTsKLQl1cCgmaXA2dF9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZAotaXA2dF91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgaXA2dF90YXJnZXQgKnRhcmdldCkKLXsKLQlkb3duKCZpcDZ0X211dGV4KTsKLQlMSVNUX0RFTEVURSgmaXA2dF90YXJnZXQsIHRhcmdldCk7Ci0JdXAoJmlwNnRfbXV0ZXgpOwotfQotCi1pbnQKLWlwNnRfcmVnaXN0ZXJfbWF0Y2goc3RydWN0IGlwNnRfbWF0Y2ggKm1hdGNoKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmlwNnRfbXV0ZXgpOwotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIHJldDsKLQotCWxpc3RfYWRkKCZtYXRjaC0+bGlzdCwgJmlwNnRfbWF0Y2gpOwotCXVwKCZpcDZ0X211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQKLWlwNnRfdW5yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgaXA2dF9tYXRjaCAqbWF0Y2gpCi17Ci0JZG93bigmaXA2dF9tdXRleCk7Ci0JTElTVF9ERUxFVEUoJmlwNnRfbWF0Y2gsIG1hdGNoKTsKLQl1cCgmaXA2dF9tdXRleCk7Ci19Ci0KLWludCBpcDZ0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSwKK2ludCBpcDZ0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCB4dF90YWJsZSAqdGFibGUsCiAJCQljb25zdCBzdHJ1Y3QgaXA2dF9yZXBsYWNlICpyZXBsKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqbmV3aW5mbzsKLQlzdGF0aWMgc3RydWN0IGlwNnRfdGFibGVfaW5mbyBib290c3RyYXAKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbzsKKwlzdGF0aWMgc3RydWN0IHh0X3RhYmxlX2luZm8gYm9vdHN0cmFwCiAJCT0geyAwLCAwLCAwLCB7IDAgfSwgeyAwIH0sIHsgfSB9OwogCXZvaWQgKmxvY19jcHVfZW50cnk7CiAKLQluZXdpbmZvID0gYWxsb2NfdGFibGVfaW5mbyhyZXBsLT5zaXplKTsKKwluZXdpbmZvID0geHRfYWxsb2NfdGFibGVfaW5mbyhyZXBsLT5zaXplKTsKIAlpZiAoIW5ld2luZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNTczLDI0NCArMTI4NywyOSBAQAogCQkJICAgICAgcmVwbC0+aG9va19lbnRyeSwKIAkJCSAgICAgIHJlcGwtPnVuZGVyZmxvdyk7CiAJaWYgKHJldCAhPSAwKSB7Ci0JCWZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKKwkJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmaXA2dF9tdXRleCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKKwlpZiAoeHRfcmVnaXN0ZXJfdGFibGUodGFibGUsICZib290c3RyYXAsIG5ld2luZm8pICE9IDApIHsKKwkJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIERvbid0IGF1dG9sb2FkOiB3ZSdkIGVhdCBvdXIgdGFpbC4uLiAqLwotCWlmIChsaXN0X25hbWVkX2ZpbmQoJmlwNnRfdGFibGVzLCB0YWJsZS0+bmFtZSkpIHsKLQkJcmV0ID0gLUVFWElTVDsKLQkJZ290byBmcmVlX3VubG9jazsKLQl9Ci0KLQkvKiBTaW1wbGlmaWVzIHJlcGxhY2VfdGFibGUgY29kZS4gKi8KLQl0YWJsZS0+cHJpdmF0ZSA9ICZib290c3RyYXA7Ci0JaWYgKCFyZXBsYWNlX3RhYmxlKHRhYmxlLCAwLCBuZXdpbmZvLCAmcmV0KSkKLQkJZ290byBmcmVlX3VubG9jazsKLQotCWR1cHJpbnRmKCJ0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyID0gJXVcbiIsCi0JCSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyKTsKLQotCS8qIHNhdmUgbnVtYmVyIG9mIGluaXRpYWwgZW50cmllcyAqLwotCXRhYmxlLT5wcml2YXRlLT5pbml0aWFsX2VudHJpZXMgPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOwotCi0Jcndsb2NrX2luaXQoJnRhYmxlLT5sb2NrKTsKLQlsaXN0X3ByZXBlbmQoJmlwNnRfdGFibGVzLCB0YWJsZSk7Ci0KLSB1bmxvY2s6Ci0JdXAoJmlwNnRfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci0KLSBmcmVlX3VubG9jazoKLQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7Ci0JZ290byB1bmxvY2s7CisJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaXA2dF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSkKK3ZvaWQgaXA2dF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCB4dF90YWJsZSAqdGFibGUpCiB7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGU7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeTsKIAotCWRvd24oJmlwNnRfbXV0ZXgpOwotCUxJU1RfREVMRVRFKCZpcDZ0X3RhYmxlcywgdGFibGUpOwotCXVwKCZpcDZ0X211dGV4KTsKKwlwcml2YXRlID0geHRfdW5yZWdpc3Rlcl90YWJsZSh0YWJsZSk7CiAKIAkvKiBEZWNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnRzIGFuZCBmcmVlIHJlc291cmNlcyAqLwotCWxvY19jcHVfZW50cnkgPSB0YWJsZS0+cHJpdmF0ZS0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKLQlJUDZUX0VOVFJZX0lURVJBVEUobG9jX2NwdV9lbnRyeSwgdGFibGUtPnByaXZhdGUtPnNpemUsCi0JCQkgIGNsZWFudXBfZW50cnksIE5VTEwpOwotCWZyZWVfdGFibGVfaW5mbyh0YWJsZS0+cHJpdmF0ZSk7Ci19Ci0KLS8qIFJldHVybnMgMSBpZiB0aGUgcG9ydCBpcyBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1wb3J0X21hdGNoKHVfaW50MTZfdCBtaW4sIHVfaW50MTZfdCBtYXgsIHVfaW50MTZfdCBwb3J0LCBpbnQgaW52ZXJ0KQotewotCWludCByZXQ7Ci0KLQlyZXQgPSAocG9ydCA+PSBtaW4gJiYgcG9ydCA8PSBtYXgpIF4gaW52ZXJ0OwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXRjcF9maW5kX29wdGlvbih1X2ludDhfdCBvcHRpb24sCi0JCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCXVuc2lnbmVkIGludCB0Y3BvZmYsCi0JCXVuc2lnbmVkIGludCBvcHRsZW4sCi0JCWludCBpbnZlcnQsCi0JCWludCAqaG90ZHJvcCkKLXsKLQkvKiB0Y3AuZG9mZiBpcyBvbmx5IDQgYml0cywgaWUuIG1heCAxNSAqIDQgYnl0ZXMgKi8KLQl1X2ludDhfdCBfb3B0WzYwIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpXSwgKm9wOwotCXVuc2lnbmVkIGludCBpOwotCi0JZHVwcmludGYoInRjcF9tYXRjaDogZmluZGluZyBvcHRpb25cbiIpOwotCWlmICghb3B0bGVuKQotCQlyZXR1cm4gaW52ZXJ0OwotCS8qIElmIHdlIGRvbid0IGhhdmUgdGhlIHdob2xlIGhlYWRlciwgZHJvcCBwYWNrZXQuICovCi0Jb3AgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCB0Y3BvZmYgKyBzaXplb2Yoc3RydWN0IHRjcGhkciksIG9wdGxlbiwKLQkJCQlfb3B0KTsKLQlpZiAob3AgPT0gTlVMTCkgewotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47ICkgewotCQlpZiAob3BbaV0gPT0gb3B0aW9uKSByZXR1cm4gIWludmVydDsKLQkJaWYgKG9wW2ldIDwgMikgaSsrOwotCQllbHNlIGkgKz0gb3BbaSsxXT86MTsKLQl9Ci0KLQlyZXR1cm4gaW52ZXJ0OwotfQotCi1zdGF0aWMgaW50Ci10Y3BfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JICBpbnQgb2Zmc2V0LAotCSAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0JICBpbnQgKmhvdGRyb3ApCi17Ci0Jc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOwotCWNvbnN0IHN0cnVjdCBpcDZ0X3RjcCAqdGNwaW5mbyA9IG1hdGNoaW5mbzsKLQotCWlmIChvZmZzZXQpIHsKLQkJLyogVG8gcXVvdGUgQWxhbjoKLQotCQkgICBEb24ndCBhbGxvdyBhIGZyYWdtZW50IG9mIFRDUCA4IGJ5dGVzIGluLiBOb2JvZHkgbm9ybWFsCi0JCSAgIGNhdXNlcyB0aGlzLiBJdHMgYSBjcmFja2VyIHRyeWluZyB0byBicmVhayBpbiBieSBkb2luZyBhCi0JCSAgIGZsYWcgb3ZlcndyaXRlIHRvIHBhc3MgdGhlIGRpcmVjdGlvbiBjaGVja3MuCi0JCSovCi0JCWlmIChvZmZzZXQgPT0gMSkgewotCQkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVENQIG9mZnNldD0xIGZyYWcuXG4iKTsKLQkJCSpob3Rkcm9wID0gMTsKLQkJfQotCQkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLwotCQlyZXR1cm4gMDsKLQl9Ci0KLSNkZWZpbmUgRldJTlZUQ1AoYm9vbCxpbnZmbGcpICgoYm9vbCkgXiAhISh0Y3BpbmZvLT5pbnZmbGFncyAmIGludmZsZykpCi0KLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7Ci0JaWYgKHRoID09IE5VTEwpIHsKLQkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKLQkJICAgY2FuJ3QuICBIZW5jZSwgbm8gY2hvaWNlIGJ1dCB0byBkcm9wLiAqLwotCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBUQ1Agb2Zmc2V0PTAgdGlueWdyYW0uXG4iKTsKLQkJKmhvdGRyb3AgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIXBvcnRfbWF0Y2godGNwaW5mby0+c3B0c1swXSwgdGNwaW5mby0+c3B0c1sxXSwKLQkJCW50b2hzKHRoLT5zb3VyY2UpLAotCQkJISEodGNwaW5mby0+aW52ZmxhZ3MgJiBJUDZUX1RDUF9JTlZfU1JDUFQpKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFwb3J0X21hdGNoKHRjcGluZm8tPmRwdHNbMF0sIHRjcGluZm8tPmRwdHNbMV0sCi0JCQludG9ocyh0aC0+ZGVzdCksCi0JCQkhISh0Y3BpbmZvLT5pbnZmbGFncyAmIElQNlRfVENQX0lOVl9EU1RQVCkpKQotCQlyZXR1cm4gMDsKLQlpZiAoIUZXSU5WVENQKCgoKHVuc2lnbmVkIGNoYXIgKil0aClbMTNdICYgdGNwaW5mby0+ZmxnX21hc2spCi0JCSAgICAgID09IHRjcGluZm8tPmZsZ19jbXAsCi0JCSAgICAgIElQNlRfVENQX0lOVl9GTEFHUykpCi0JCXJldHVybiAwOwotCWlmICh0Y3BpbmZvLT5vcHRpb24pIHsKLQkJaWYgKHRoLT5kb2ZmICogNCA8IHNpemVvZihfdGNwaCkpIHsKLQkJCSpob3Rkcm9wID0gMTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmICghdGNwX2ZpbmRfb3B0aW9uKHRjcGluZm8tPm9wdGlvbiwgc2tiLCBwcm90b2ZmLAotCQkJCSAgICAgdGgtPmRvZmYqNCAtIHNpemVvZigqdGgpLAotCQkJCSAgICAgdGNwaW5mby0+aW52ZmxhZ3MgJiBJUDZUX1RDUF9JTlZfT1BUSU9OLAotCQkJCSAgICAgaG90ZHJvcCkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KLXN0YXRpYyBpbnQKLXRjcF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2LAotCSAgICAgICB2b2lkICptYXRjaGluZm8sCi0JICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JY29uc3Qgc3RydWN0IGlwNnRfdGNwICp0Y3BpbmZvID0gbWF0Y2hpbmZvOwotCi0JLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IFRDUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KLQlyZXR1cm4gaXB2Ni0+cHJvdG8gPT0gSVBQUk9UT19UQ1AKLQkJJiYgIShpcHY2LT5pbnZmbGFncyAmIElQNlRfSU5WX1BST1RPKQotCQkmJiBtYXRjaHNpemUgPT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfdGNwKSkKLQkJJiYgISh0Y3BpbmZvLT5pbnZmbGFncyAmIH5JUDZUX1RDUF9JTlZfTUFTSyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXVkcF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLQkgIGludCBvZmZzZXQsCi0JICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLQkgIGludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgdWRwaGRyIF91ZHBoLCAqdWg7Ci0JY29uc3Qgc3RydWN0IGlwNnRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOwotCi0JLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KLQlpZiAob2Zmc2V0KQotCQlyZXR1cm4gMDsKLQotCXVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF91ZHBoKSwgJl91ZHBoKTsKLQlpZiAodWggPT0gTlVMTCkgewotCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQotCQkgICBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuICovCi0JCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFVEUCB0aW55Z3JhbS5cbiIpOwotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiBwb3J0X21hdGNoKHVkcGluZm8tPnNwdHNbMF0sIHVkcGluZm8tPnNwdHNbMV0sCi0JCQkgIG50b2hzKHVoLT5zb3VyY2UpLAotCQkJICAhISh1ZHBpbmZvLT5pbnZmbGFncyAmIElQNlRfVURQX0lOVl9TUkNQVCkpCi0JCSYmIHBvcnRfbWF0Y2godWRwaW5mby0+ZHB0c1swXSwgdWRwaW5mby0+ZHB0c1sxXSwKLQkJCSAgICAgIG50b2hzKHVoLT5kZXN0KSwKLQkJCSAgICAgICEhKHVkcGluZm8tPmludmZsYWdzICYgSVA2VF9VRFBfSU5WX0RTVFBUKSk7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KLXN0YXRpYyBpbnQKLXVkcF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2LAotCSAgICAgICB2b2lkICptYXRjaGluZm8sCi0JICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAotCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWNvbnN0IHN0cnVjdCBpcDZ0X3VkcCAqdWRwaW5mbyA9IG1hdGNoaW5mbzsKLQotCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBVRFAsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCi0JaWYgKGlwdjYtPnByb3RvICE9IElQUFJPVE9fVURQIHx8IChpcHY2LT5pbnZmbGFncyAmIElQNlRfSU5WX1BST1RPKSkgewotCQlkdXByaW50ZigiaXA2dF91ZHA6IFByb3RvY29sICV1ICE9ICV1XG4iLCBpcHY2LT5wcm90bywKLQkJCSBJUFBST1RPX1VEUCk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAobWF0Y2hpbmZvc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF91ZHApKSkgewotCQlkdXByaW50ZigiaXA2dF91ZHA6IG1hdGNoc2l6ZSAldSAhPSAldVxuIiwKLQkJCSBtYXRjaGluZm9zaXplLCBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF91ZHApKSk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAodWRwaW5mby0+aW52ZmxhZ3MgJiB+SVA2VF9VRFBfSU5WX01BU0spIHsKLQkJZHVwcmludGYoImlwNnRfdWRwOiB1bmtub3duIGZsYWdzICVYXG4iLAotCQkJIHVkcGluZm8tPmludmZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7CisJbG9jX2NwdV9lbnRyeSA9IHByaXZhdGUtPmVudHJpZXNbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV07CisJSVA2VF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksIHByaXZhdGUtPnNpemUsIGNsZWFudXBfZW50cnksIE5VTEwpOworCXh0X2ZyZWVfdGFibGVfaW5mbyhwcml2YXRlKTsKIH0KIAogLyogUmV0dXJucyAxIGlmIHRoZSB0eXBlIGFuZCBjb2RlIGlzIG1hdGNoZWQgYnkgdGhlIHJhbmdlLCAwIG90aGVyd2lzZSAqLwpAQCAtMTg1OCwxMSArMTM1NywxMiBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogaWNtcDZfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2LAorCSAgIGNvbnN0IHZvaWQgKmVudHJ5LAogCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CisJY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2ID0gZW50cnk7CiAJY29uc3Qgc3RydWN0IGlwNnRfaWNtcCAqaWNtcGluZm8gPSBtYXRjaGluZm87CiAKIAkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gSUNNUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KQEAgLTE4OTIsMTY0ICsxMzkyLDQyIEBACiAJLmdldAkJPSBkb19pcDZ0X2dldF9jdGwsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggdGNwX21hdGNoc3RydWN0ID0gewotCS5uYW1lCQk9ICJ0Y3AiLAotCS5tYXRjaAkJPSAmdGNwX21hdGNoLAotCS5jaGVja2VudHJ5CT0gJnRjcF9jaGVja2VudHJ5LAotfTsKLQotc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIHVkcF9tYXRjaHN0cnVjdCA9IHsKLQkubmFtZQkJPSAidWRwIiwKLQkubWF0Y2gJCT0gJnVkcF9tYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZ1ZHBfY2hlY2tlbnRyeSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBpY21wNl9tYXRjaHN0cnVjdCA9IHsKIAkubmFtZQkJPSAiaWNtcDYiLAogCS5tYXRjaAkJPSAmaWNtcDZfbWF0Y2gsCiAJLmNoZWNrZW50cnkJPSAmaWNtcDZfY2hlY2tlbnRyeSwKIH07CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGlubGluZSBpbnQgcHJpbnRfbmFtZShjb25zdCBjaGFyICppLAotCQkJICAgICBvZmZfdCBzdGFydF9vZmZzZXQsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCwKLQkJCSAgICAgb2ZmX3QgKnBvcywgdW5zaWduZWQgaW50ICpjb3VudCkKLXsKLQlpZiAoKCpjb3VudCkrKyA+PSBzdGFydF9vZmZzZXQpIHsKLQkJdW5zaWduZWQgaW50IG5hbWVsZW47Ci0KLQkJbmFtZWxlbiA9IHNwcmludGYoYnVmZmVyICsgKnBvcywgIiVzXG4iLAotCQkJCSAgaSArIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSk7Ci0JCWlmICgqcG9zICsgbmFtZWxlbiA+IGxlbmd0aCkgewotCQkJLyogU3RvcCBpdGVyYXRpbmcgKi8KLQkJCXJldHVybiAxOwotCQl9Ci0JCSpwb3MgKz0gbmFtZWxlbjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHByaW50X3RhcmdldChjb25zdCBzdHJ1Y3QgaXA2dF90YXJnZXQgKnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3Qgc3RhcnRfb2Zmc2V0LCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3QgKnBvcywgdW5zaWduZWQgaW50ICpjb3VudCkKLXsKLQlpZiAodCA9PSAmaXA2dF9zdGFuZGFyZF90YXJnZXQgfHwgdCA9PSAmaXA2dF9lcnJvcl90YXJnZXQpCi0JCXJldHVybiAwOwotCXJldHVybiBwcmludF9uYW1lKChjaGFyICopdCwgc3RhcnRfb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgcG9zLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgaXA2dF9nZXRfdGFibGVzKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCi17Ci0Jb2ZmX3QgcG9zID0gMDsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXA2dF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlMSVNUX0ZJTkQoJmlwNnRfdGFibGVzLCBwcmludF9uYW1lLCBjaGFyICosCi0JCSAgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgJnBvcywgJmNvdW50KTsKLQotCXVwKCZpcDZ0X211dGV4KTsKLQotCS8qIGBzdGFydCcgaGFjayAtIHNlZSBmcy9wcm9jL2dlbmVyaWMuYyBsaW5lIH4xMDUgKi8KLQkqc3RhcnQ9KGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpY291bnQtb2Zmc2V0KTsKLQlyZXR1cm4gcG9zOwotfQotCi1zdGF0aWMgaW50IGlwNnRfZ2V0X3RhcmdldHMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKLXsKLQlvZmZfdCBwb3MgPSAwOwotCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gMDsKLQotCUxJU1RfRklORCgmaXA2dF90YXJnZXQsIHByaW50X3RhcmdldCwgc3RydWN0IGlwNnRfdGFyZ2V0ICosCi0JCSAgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgJnBvcywgJmNvdW50KTsKLQotCXVwKCZpcDZ0X211dGV4KTsKLQotCSpzdGFydCA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKWNvdW50IC0gb2Zmc2V0KTsKLQlyZXR1cm4gcG9zOwotfQotCi1zdGF0aWMgaW50IGlwNnRfZ2V0X21hdGNoZXMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKLXsKLQlvZmZfdCBwb3MgPSAwOwotCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gMDsKLQotCUxJU1RfRklORCgmaXA2dF9tYXRjaCwgcHJpbnRfbmFtZSwgY2hhciAqLAotCQkgIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgsICZwb3MsICZjb3VudCk7Ci0KLQl1cCgmaXA2dF9tdXRleCk7Ci0KLQkqc3RhcnQgPSAoY2hhciAqKSgodW5zaWduZWQgbG9uZyljb3VudCAtIG9mZnNldCk7Ci0JcmV0dXJuIHBvczsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB7IGNoYXIgKm5hbWU7IGdldF9pbmZvX3QgKmdldF9pbmZvOyB9IGlwNnRfcHJvY19lbnRyeVtdID0KLXsgeyAiaXA2X3RhYmxlc19uYW1lcyIsIGlwNnRfZ2V0X3RhYmxlcyB9LAotICB7ICJpcDZfdGFibGVzX3RhcmdldHMiLCBpcDZ0X2dldF90YXJnZXRzIH0sCi0gIHsgImlwNl90YWJsZXNfbWF0Y2hlcyIsIGlwNnRfZ2V0X21hdGNoZXMgfSwKLSAgeyBOVUxMLCBOVUxMfSB9OwotI2VuZGlmIC8qQ09ORklHX1BST0NfRlMqLwotCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIAorCXh0X3Byb3RvX2luaXQoQUZfSU5FVDYpOworCiAJLyogTm9vbmUgZWxzZSB3aWxsIGJlIGRvd25pbmcgc2VtIG5vdywgc28gd2Ugd29uJ3Qgc2xlZXAgKi8KLQlkb3duKCZpcDZ0X211dGV4KTsKLQlsaXN0X2FwcGVuZCgmaXA2dF90YXJnZXQsICZpcDZ0X3N0YW5kYXJkX3RhcmdldCk7Ci0JbGlzdF9hcHBlbmQoJmlwNnRfdGFyZ2V0LCAmaXA2dF9lcnJvcl90YXJnZXQpOwotCWxpc3RfYXBwZW5kKCZpcDZ0X21hdGNoLCAmdGNwX21hdGNoc3RydWN0KTsKLQlsaXN0X2FwcGVuZCgmaXA2dF9tYXRjaCwgJnVkcF9tYXRjaHN0cnVjdCk7Ci0JbGlzdF9hcHBlbmQoJmlwNnRfbWF0Y2gsICZpY21wNl9tYXRjaHN0cnVjdCk7Ci0JdXAoJmlwNnRfbXV0ZXgpOworCXh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfc3RhbmRhcmRfdGFyZ2V0KTsKKwl4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X2Vycm9yX3RhcmdldCk7CisJeHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZpY21wNl9tYXRjaHN0cnVjdCk7CiAKIAkvKiBSZWdpc3RlciBzZXRzb2Nrb3B0ICovCiAJcmV0ID0gbmZfcmVnaXN0ZXJfc29ja29wdCgmaXA2dF9zb2Nrb3B0cyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZHVwcmludGYoIlVuYWJsZSB0byByZWdpc3RlciBzb2Nrb3B0cy5cbiIpOworCQl4dF9wcm90b19maW5pKEFGX0lORVQ2KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXsKLQkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOwotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSAwOyBpcDZ0X3Byb2NfZW50cnlbaV0ubmFtZTsgaSsrKSB7Ci0JCQlwcm9jID0gcHJvY19uZXRfY3JlYXRlKGlwNnRfcHJvY19lbnRyeVtpXS5uYW1lLCAwLAotCQkJCQkgICAgICAgaXA2dF9wcm9jX2VudHJ5W2ldLmdldF9pbmZvKTsKLQkJCWlmICghcHJvYykgewotCQkJCXdoaWxlICgtLWkgPj0gMCkKLQkJCQkgICAgICAgcHJvY19uZXRfcmVtb3ZlKGlwNnRfcHJvY19lbnRyeVtpXS5uYW1lKTsKLQkJCQluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmlwNnRfc29ja29wdHMpOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQkJcHJvYy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQkJfQotCX0KLSNlbmRpZgotCi0JcHJpbnRrKCJpcDZfdGFibGVzOiAoQykgMjAwMC0yMDAyIE5ldGZpbHRlciBjb3JlIHRlYW1cbiIpOworCXByaW50aygiaXA2X3RhYmxlczogKEMpIDIwMDAtMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtXG4iKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKIAluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmlwNnRfc29ja29wdHMpOwotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaXA2dF9wcm9jX2VudHJ5W2ldLm5hbWU7IGkrKykKLQkJCXByb2NfbmV0X3JlbW92ZShpcDZ0X3Byb2NfZW50cnlbaV0ubmFtZSk7Ci0JfQotI2VuZGlmCisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmljbXA2X21hdGNoc3RydWN0KTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfZXJyb3JfdGFyZ2V0KTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfc3RhbmRhcmRfdGFyZ2V0KTsKKwl4dF9wcm90b19maW5pKEFGX0lORVQ2KTsKIH0KIAogLyoKQEAgLTIxMjgsMTAgKzE1MDYsNiBAQAogRVhQT1JUX1NZTUJPTChpcDZ0X3JlZ2lzdGVyX3RhYmxlKTsKIEVYUE9SVF9TWU1CT0woaXA2dF91bnJlZ2lzdGVyX3RhYmxlKTsKIEVYUE9SVF9TWU1CT0woaXA2dF9kb190YWJsZSk7Ci1FWFBPUlRfU1lNQk9MKGlwNnRfcmVnaXN0ZXJfbWF0Y2gpOwotRVhQT1JUX1NZTUJPTChpcDZ0X3VucmVnaXN0ZXJfbWF0Y2gpOwotRVhQT1JUX1NZTUJPTChpcDZ0X3JlZ2lzdGVyX3RhcmdldCk7Ci1FWFBPUlRfU1lNQk9MKGlwNnRfdW5yZWdpc3Rlcl90YXJnZXQpOwogRVhQT1JUX1NZTUJPTChpcDZ0X2V4dF9oZHIpOwogRVhQT1JUX1NZTUJPTChpcHY2X2ZpbmRfaGRyKTsKIEVYUE9SVF9TWU1CT0woaXA2X21hc2tlZF9hZGRyY21wKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0hMLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ITC5jCmluZGV4IDhmNTU0OWIuLjMwNjIwMGMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0hMLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfSEwuYwpAQCAtNjIsNyArNjIsNyBAQAogfQogCiBzdGF0aWMgaW50IGlwNnRfaGxfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCWNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5ICplLAorCQljb25zdCB2b2lkICplbnRyeSwKIAkJdm9pZCAqdGFyZ2luZm8sCiAJCXVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJCXVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCmluZGV4IGFlNDY1M2IuLjc3YzcyNTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCkBAIC02Myw5ICs2Myw4IEBACiAJCXJldHVybjsKIAl9CiAKLQkvKiBNYXggbGVuZ3RoOiA4OCAiU1JDPTAwMDAuMDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAuMDAwMCBEU1Q9MDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwIiAqLwotCXByaW50aygiU1JDPSUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAiLCBOSVA2KGloLT5zYWRkcikpOwotCXByaW50aygiRFNUPSUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAiLCBOSVA2KGloLT5kYWRkcikpOworCS8qIE1heCBsZW5ndGg6IDg4ICJTUkM9MDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwIERTVD0wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAgIiAqLworCXByaW50aygiU1JDPSIgTklQNl9GTVQgIiBEU1Q9IiBOSVA2X0ZNVCAiICIsIE5JUDYoaWgtPnNhZGRyKSwgTklQNihpaC0+ZGFkZHIpKTsKIAogCS8qIE1heCBsZW5ndGg6IDQ0ICJMRU49NjU1MzUgVEM9MjU1IEhPUExJTUlUPTI1NSBGTE9XTEJMPUZGRkZGICIgKi8KIAlwcmludGsoIkxFTj0lWnUgVEM9JXUgSE9QTElNSVQ9JXUgRkxPV0xCTD0ldSAiLApAQCAtNDQ0LDcgKzQ0Myw3IEBACiAKIAogc3RhdGljIGludCBpcDZ0X2xvZ19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKIAkJCSAgICAgICB2b2lkICp0YXJnaW5mbywKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9NQVJLLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9NQVJLLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjhmYjguLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTUFSSy5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBORk1BUksgZmllbGQgb2YgYW4gc2tiLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9NQVJLLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgdm9pZCAqdXNlcmluZm8pCi17Ci0JY29uc3Qgc3RydWN0IGlwNnRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKLQotCWlmKCgqcHNrYiktPm5mbWFyayAhPSBtYXJraW5mby0+bWFyaykKLQkJKCpwc2tiKS0+bmZtYXJrID0gbWFya2luZm8tPm1hcms7Ci0KLQlyZXR1cm4gSVA2VF9DT05USU5VRTsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUsCi0gICAgICAgICAgIHZvaWQgKnRhcmdpbmZvLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmICh0YXJnaW5mb3NpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfbWFya190YXJnZXRfaW5mbykpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk1BUks6IHRhcmdpbmZvc2l6ZSAldSAhPSAlWnVcbiIsCi0JCSAgICAgICB0YXJnaW5mb3NpemUsCi0JCSAgICAgICBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tYXJrX3RhcmdldF9pbmZvKSkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc3RyY21wKHRhYmxlbmFtZSwgIm1hbmdsZSIpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwgdGFibGVuYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YXJnZXQgaXA2dF9tYXJrX3JlZyA9IHsgCi0JLm5hbWUJCT0gIk1BUksiLAotCS50YXJnZXQJCT0gdGFyZ2V0LAotCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlwcmludGsoS0VSTl9ERUJVRyAicmVnaXN0ZXJpbmcgaXB2NiBtYXJrIHRhcmdldFxuIik7Ci0JaWYgKGlwNnRfcmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X21hcmtfcmVnKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcDZ0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X21hcmtfcmVnKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X05GUVVFVUUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X05GUVVFVUUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlMzczMC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ORlFVRVVFLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBpcDZ0YWJsZXMgbW9kdWxlIGZvciB1c2luZyBuZXcgbmV0ZmlsdGVyIG5ldGxpbmsgcXVldWUKLSAqCi0gKiAoQykgMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTkZRVUVVRS5oPgotCi1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXA2dGFibGVzIE5GUVVFVUUgdGFyZ2V0Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgdm9pZCAqdXNlcmluZm8pCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9ORlFfaW5mbyAqdGluZm8gPSB0YXJnaW5mbzsKLQotCXJldHVybiBORl9RVUVVRV9OUih0aW5mby0+cXVldWVudW0pOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKLSAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X05GUV9pbmZvKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZRVUVVRTogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKLQkJICAgICAgIHRhcmdpbmZvc2l6ZSwKLQkJICAgICAgIElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfTkZRX2luZm8pKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwNnRfdGFyZ2V0IGlwdF9ORlFfcmVnID0gewotCS5uYW1lCQk9ICJORlFVRVVFIiwKLQkudGFyZ2V0CQk9IHRhcmdldCwKLQkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCXJldHVybiBpcDZ0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X05GUV9yZWcpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwNnRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9ORlFfcmVnKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X1JFSkVDVC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKaW5kZXggYjAzZTg3YS4uYzc0NTcxNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKQEAgLTIxOCwxMiArMjE4LDEzIEBACiB9CiAKIHN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUsCisJCSBjb25zdCB2b2lkICplbnRyeSwKIAkJIHZvaWQgKnRhcmdpbmZvLAogCQkgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkJIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CiAgCWNvbnN0IHN0cnVjdCBpcDZ0X3JlamVjdF9pbmZvICpyZWppbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUgPSBlbnRyeTsKIAogIAlpZiAodGFyZ2luZm9zaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3JlamVjdF9pbmZvKSkpIHsKICAgCQlERUJVR1AoImlwNnRfUkVKRUNUOiB0YXJnaW5mb3NpemUgJXUgIT0gMFxuIiwgdGFyZ2luZm9zaXplKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9haC5jCmluZGV4IGY1YzFhN2YuLjIxOWEzMDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfYWguYwpAQCAtOTgsNyArOTgsNyBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKKyAgICAgICAgICBjb25zdCB2b2lkICplbnRyeSwKICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCiAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCiAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2RzdC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZHN0LmMKaW5kZXggNDhjZjVmOS4uODBmZTgyNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZHN0LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZHN0LmMKQEAgLTE3OCw3ICsxNzgsNyBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKKyAgICAgICAgICBjb25zdCB2b2lkICppbmZvLAogICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXNwLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9lc3AuYwppbmRleCBlMTgyOGY2Li43MjQyODVkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9lc3AuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9lc3AuYwpAQCAtNzYsNyArNzYsNyBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKKwkgICBjb25zdCB2b2lkICppcCwKIAkgICB2b2lkICptYXRjaGluZm8sCiAJICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCiAJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2V1aTY0LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jCmluZGV4IDYxNmMyY2IuLmRkZjVmNTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2V1aTY0LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXVpNjQuYwpAQCAtNjIsNyArNjIsNyBAQAogCiBzdGF0aWMgaW50CiBpcDZ0X2V1aTY0X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAorCQkgICBjb25zdCB2b2lkICAqaXAsCiAJCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2ZyYWcuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2ZyYWcuYwppbmRleCBkMTU0OWIyLi5hOTk2NGI5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZnJhZy5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisgICAgICAgICAgY29uc3Qgdm9pZCAqaXAsCiAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAogICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCmluZGV4IGUzYmM4ZTIuLmVkOGRlZDEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisgICAgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCiAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAogICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGwuYwppbmRleCAwYmVhZmY1Li5jNWQ5MDc5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hsLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKK3N0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmVudHJ5LAogCQkgICAgICB2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMKaW5kZXggMzJlNjdmMC4uZmRhMWNlYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaXB2NmhlYWRlci5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2lwdjZoZWFkZXIuYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAKIHN0YXRpYyBpbnQKIGlwdjZoZWFkZXJfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisJCSAgICAgIGNvbnN0IHZvaWQgKmlwLAogCQkgICAgICB2b2lkICptYXRjaGluZm8sCiAJCSAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9sZW5ndGguYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2xlbmd0aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDUzN2QzLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2xlbmd0aC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogTGVuZ3RoIE1hdGNoIC0gSVB2NiBQb3J0ICovCi0KLS8qIChDKSAxOTk5LTIwMDEgSmFtZXMgTW9ycmlzIDxqbW9ycm9zQGludGVyY29kZS5jb20uYXU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2xlbmd0aC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIklQdjYgcGFja2V0IGxlbmd0aCBtYXRjaCIpOwotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXA2dF9sZW5ndGhfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQl1X2ludDE2X3QgcGt0bGVuID0gbnRvaHMoc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKLQkKLQlyZXR1cm4gKHBrdGxlbiA+PSBpbmZvLT5taW4gJiYgcGt0bGVuIDw9IGluZm8tPm1heCkgXiBpbmZvLT5pbnZlcnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAotICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9sZW5ndGhfaW5mbykpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggbGVuZ3RoX21hdGNoID0gewotCS5uYW1lCQk9ICJsZW5ndGgiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJmxlbmd0aF9tYXRjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZsZW5ndGhfbWF0Y2gpOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbGltaXQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2xpbWl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzgyZjYuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbGltaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKiBLZXJuZWwgbW9kdWxlIHRvIGNvbnRyb2wgdGhlIHJhdGUKLSAqCi0gKiAyIFNlcHRlbWJlciAxOTk5OiBDaGFuZ2VkIGZyb20gdGhlIHRhcmdldCBSQVRFIHRvIHRoZSBtYXRjaAotICogICAgICAgICAgICAgICAgICAgYGxpbWl0JywgcmVtb3ZlZCBsb2dnaW5nLiAgRGlkIEkgbWVudGlvbiB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgICBBbGV4ZXkgaXMgYSBmdWNraW5nIGdlbml1cz8KLSAqICAgICAgICAgICAgICAgICAgIFJ1c3R5IFJ1c3NlbGwgKHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdSkuICAqLwotCi0vKiAoQykgMTk5OSBK6XL0bWUgZGUgVml2aWUgPGRldml2aWVAaW5mby5lbnNlcmIudS1ib3JkZWF1eC5mcj4KLSAqIChDKSAxOTk5IEhlcnbpIEV5Y2hlbm5lIDxleWNoZW5uZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9saW1pdC5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJIZXJ2ZSBFeWNoZW5uZSA8cnZAd2FsbGZpcmUub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJyYXRlIGxpbWl0aW5nIHdpdGhpbiBpcDZ0YWJsZXMiKTsKLQotLyogVGhlIGFsZ29yaXRobSB1c2VkIGlzIHRoZSBTaW1wbGUgVG9rZW4gQnVja2V0IEZpbHRlciAoVEJGKQotICogc2VlIG5ldC9zY2hlZC9zY2hfdGJmLmMgaW4gdGhlIGxpbnV4IHNvdXJjZSB0cmVlCi0gKi8KLQotc3RhdGljIERFRklORV9TUElOTE9DSyhsaW1pdF9sb2NrKTsKLQotLyogUnVzdHk6IFRoaXMgaXMgbXkgKG5vbi1tYXRoZW1hdGljYWxseS1pbmNsaW5lZCkgdW5kZXJzdGFuZGluZyBvZgotICAgdGhpcyBhbGdvcml0aG0uICBUaGUgYGF2ZXJhZ2UgcmF0ZScgaW4gamlmZmllcyBiZWNvbWVzIHlvdXIgaW5pdGlhbAotICAgYW1vdW50IG9mIGNyZWRpdCBgY3JlZGl0JyBhbmQgdGhlIG1vc3QgY3JlZGl0IHlvdSBjYW4gZXZlciBoYXZlCi0gICBgY3JlZGl0X2NhcCcuICBUaGUgYHBlYWsgcmF0ZScgYmVjb21lcyB0aGUgY29zdCBvZiBwYXNzaW5nIHRoZQotICAgdGVzdCwgYGNvc3QnLgotCi0gICBgcHJldicgdHJhY2tzIHRoZSBsYXN0IHBhY2tldCBoaXQ6IHlvdSBnYWluIG9uZSBjcmVkaXQgcGVyIGppZmZ5LgotICAgSWYgeW91IGdldCBjcmVkaXQgYmFsYW5jZSBtb3JlIHRoYW4gdGhpcywgdGhlIGV4dHJhIGNyZWRpdCBpcwotICAgZGlzY2FyZGVkLiAgRXZlcnkgdGltZSB0aGUgbWF0Y2ggcGFzc2VzLCB5b3UgbG9zZSBgY29zdCcgY3JlZGl0czsKLSAgIGlmIHlvdSBkb24ndCBoYXZlIHRoYXQgbWFueSwgdGhlIHRlc3QgZmFpbHMuCi0KLSAgIFNlZSBBbGV4ZXkncyBmb3JtYWwgZXhwbGFuYXRpb24gaW4gbmV0L3NjaGVkL3NjaF90YmYuYy4KLQotICAgVG8gYXZvaWQgdW5kZXJmbG93LCB3ZSBtdWx0aXBseSBieSAxMjggKGllLiB5b3UgZ2V0IDEyOCBjcmVkaXRzIHBlcgotICAgamlmZnkpLiAgSGVuY2UgYSBjb3N0IG9mIDJeMzItMSwgbWVhbnMgb25lIHBhc3MgcGVyIDMyNzY4IHNlY29uZHMKLSAgIGF0IDEwMjRIWiAob3Igb25lIGV2ZXJ5IDkgaG91cnMpLiAgQSBjb3N0IG9mIDEgbWVhbnMgMTI4MDAgcGFzc2VzCi0gICBwZXIgc2Vjb25kIGF0IDEwMEhaLiAgKi8KLQotI2RlZmluZSBDUkVESVRTX1BFUl9KSUZGWSAxMjgKLQotc3RhdGljIGludAotaXA2dF9saW1pdF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCWNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLQkJaW50IG9mZnNldCwKLQkJdW5zaWduZWQgaW50IHByb3RvZmYsCi0JCWludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgaXA2dF9yYXRlaW5mbyAqciA9ICgoc3RydWN0IGlwNnRfcmF0ZWluZm8gKiltYXRjaGluZm8pLT5tYXN0ZXI7Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCi0Jc3Bpbl9sb2NrX2JoKCZsaW1pdF9sb2NrKTsKLQlyLT5jcmVkaXQgKz0gKG5vdyAtIHhjaGcoJnItPnByZXYsIG5vdykpICogQ1JFRElUU19QRVJfSklGRlk7Ci0JaWYgKHItPmNyZWRpdCA+IHItPmNyZWRpdF9jYXApCi0JCXItPmNyZWRpdCA9IHItPmNyZWRpdF9jYXA7Ci0KLQlpZiAoci0+Y3JlZGl0ID49IHItPmNvc3QpIHsKLQkJLyogV2UncmUgbm90IGxpbWl0ZWQuICovCi0JCXItPmNyZWRpdCAtPSByLT5jb3N0OwotCQlzcGluX3VubG9ja19iaCgmbGltaXRfbG9jayk7Ci0JCXJldHVybiAxOwotCX0KLQotICAgICAgIAlzcGluX3VubG9ja19iaCgmbGltaXRfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFByZWNpc2lvbiBzYXZlci4gKi8KLXN0YXRpYyB1X2ludDMyX3QKLXVzZXIyY3JlZGl0cyh1X2ludDMyX3QgdXNlcikKLXsKLQkvKiBJZiBtdWx0aXBseWluZyB3b3VsZCBvdmVyZmxvdy4uLiAqLwotCWlmICh1c2VyID4gMHhGRkZGRkZGRiAvIChIWipDUkVESVRTX1BFUl9KSUZGWSkpCi0JCS8qIERpdmlkZSBmaXJzdC4gKi8KLQkJcmV0dXJuICh1c2VyIC8gSVA2VF9MSU1JVF9TQ0FMRSkgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZOwotCi0JcmV0dXJuICh1c2VyICogSFogKiBDUkVESVRTX1BFUl9KSUZGWSkgLyBJUDZUX0xJTUlUX1NDQUxFOwotfQotCi1zdGF0aWMgaW50Ci1pcDZ0X2xpbWl0X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCi0JCSAgICAgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JCSAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQlzdHJ1Y3QgaXA2dF9yYXRlaW5mbyAqciA9IG1hdGNoaW5mbzsKLQotCWlmIChtYXRjaHNpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfcmF0ZWluZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICovCi0JaWYgKHItPmJ1cnN0ID09IDAKLQkgICAgfHwgdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KSA8IHVzZXIyY3JlZGl0cyhyLT5hdmcpKSB7Ci0JCXByaW50aygiQ2FsbCBydXN0eTogb3ZlcmZsb3cgaW4gaXA2dF9saW1pdDogJXUvJXVcbiIsCi0JCSAgICAgICByLT5hdmcsIHItPmJ1cnN0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogVXNlciBhdmcgaW4gc2Vjb25kcyAqIElQNlRfTElNSVRfU0NBTEU6IGNvbnZlcnQgdG8gamlmZmllcyAqCi0JICAgMTI4LiAqLwotCXItPnByZXYgPSBqaWZmaWVzOwotCXItPmNyZWRpdCA9IHVzZXIyY3JlZGl0cyhyLT5hdmcgKiByLT5idXJzdCk7CSAvKiBDcmVkaXRzIGZ1bGwuICovCi0Jci0+Y3JlZGl0X2NhcCA9IHVzZXIyY3JlZGl0cyhyLT5hdmcgKiByLT5idXJzdCk7IC8qIENyZWRpdHMgZnVsbC4gKi8KLQlyLT5jb3N0ID0gdXNlcjJjcmVkaXRzKHItPmF2Zyk7Ci0KLQkvKiBGb3IgU01QLCB3ZSBvbmx5IHdhbnQgdG8gdXNlIG9uZSBzZXQgb2YgY291bnRlcnMuICovCi0Jci0+bWFzdGVyID0gcjsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggaXA2dF9saW1pdF9yZWcgPSB7Ci0JLm5hbWUJCT0gImxpbWl0IiwKLQkubWF0Y2gJCT0gaXA2dF9saW1pdF9tYXRjaCwKLQkuY2hlY2tlbnRyeQk9IGlwNnRfbGltaXRfY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JaWYgKGlwNnRfcmVnaXN0ZXJfbWF0Y2goJmlwNnRfbGltaXRfcmVnKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZpcDZ0X2xpbWl0X3JlZyk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tYWMuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X21hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQ4MTUyLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X21hYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBNQUMgYWRkcmVzcyBwYXJhbWV0ZXJzLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tYWMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTUFDIGFkZHJlc3MgbWF0Y2hpbmcgbW9kdWxlIGZvciBJUHY2Iik7Ci1NT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4iKTsKLQotc3RhdGljIGludAotbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0gICAgICBpbnQgb2Zmc2V0LAotICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0gICAgY29uc3Qgc3RydWN0IGlwNnRfbWFjX2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0KLSAgICAvKiBJcyBtYWMgcG9pbnRlciB2YWxpZD8gKi8KLSAgICByZXR1cm4gKHNrYi0+bWFjLnJhdyA+PSBza2ItPmhlYWQKLQkgICAgJiYgKHNrYi0+bWFjLnJhdyArIEVUSF9ITEVOKSA8PSBza2ItPmRhdGEKLQkgICAgLyogSWYgc28sIGNvbXBhcmUuLi4gKi8KLQkgICAgJiYgKCghY29tcGFyZV9ldGhlcl9hZGRyKGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIGluZm8tPnNyY2FkZHIpKQotCQleIGluZm8tPmludmVydCkpOwotfQotCi1zdGF0aWMgaW50Ci1pcDZ0X21hY19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKLQkJICAgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCQkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmIChob29rX21hc2sKLQkgICAgJiB+KCgxIDw8IE5GX0lQNl9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUDZfTE9DQUxfSU4pCi0JCXwgKDEgPDwgTkZfSVA2X0ZPUldBUkQpKSkgewotCQlwcmludGsoImlwNnRfbWFjOiBvbmx5IHZhbGlkIGZvciBQUkVfUk9VVElORywgTE9DQUxfSU4gb3IiCi0JCSAgICAgICAiIEZPUldBUkRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAobWF0Y2hzaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X21hY19pbmZvKSkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBtYWNfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gIm1hYyIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZpcDZ0X21hY19jaGVja2VudHJ5LAotCS5tZQkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXA2dF9yZWdpc3Rlcl9tYXRjaCgmbWFjX21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJm1hY19tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tYXJrLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tYXJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZmMzZGUuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbWFyay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBORk1BUksgdmFsdWVzLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hcmsuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlwNnRhYmxlcyBtYXJrIG1hdGNoIik7Ci0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgaW50ICpob3Rkcm9wKQotewotCWNvbnN0IHN0cnVjdCBpcDZ0X21hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQotCXJldHVybiAoKHNrYi0+bmZtYXJrICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAotICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tYXJrX2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIG1hcmtfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gIm1hcmsiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJm1hcmtfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmbWFya19tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tdWx0aXBvcnQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X211bHRpcG9ydC5jCmluZGV4IDZlMzI0NjEuLjQ5Zjc4MjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X211bHRpcG9ydC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X211bHRpcG9ydC5jCkBAIC04NCwxMSArODQsMTIgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisJICAgY29uc3Qgdm9pZCAqaW5mbywKIAkgICB2b2lkICptYXRjaGluZm8sCiAJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogeworCWNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAgPSBpbmZvOwogCWNvbnN0IHN0cnVjdCBpcDZ0X211bHRpcG9ydCAqbXVsdGlpbmZvID0gbWF0Y2hpbmZvOwogCiAJaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tdWx0aXBvcnQpKSkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X293bmVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9vd25lci5jCmluZGV4IDRkZTRjZGEuLjU0MDliMzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X293bmVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfb3duZXIuYwpAQCAtNTMsNyArNTMsNyBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKKyAgICAgICAgICAgY29uc3Qgdm9pZCAgKmlwLAogICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9waHlzZGV2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9waHlzZGV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNTE1YzguLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcGh5c2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggdGhlIGJyaWRnZSBwb3J0IGluIGFuZAotICogb3V0IGRldmljZSBmb3IgSVAgcGFja2V0cyBjb21pbmcgaW50byBjb250YWN0IHdpdGggYSBicmlkZ2UuICovCi0KLS8qIChDKSAyMDAxLTIwMDMgQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3BoeXNkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgotI2RlZmluZSBNQVRDSCAgIDEKLSNkZWZpbmUgTk9NQVRDSCAwCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIGJyaWRnZSBwaHlzaWNhbCBkZXZpY2UgbWF0Y2ggbW9kdWxlIik7Ci0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgaW50ICpob3Rkcm9wKQotewotCWludCBpOwotCXN0YXRpYyBjb25zdCBjaGFyIG51bGxkZXZuYW1lW0lGTkFNU0laXTsKLQljb25zdCBzdHJ1Y3QgaXA2dF9waHlzZGV2X2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0JdW5zaWduZWQgaW50IHJldDsKLQljb25zdCBjaGFyICppbmRldiwgKm91dGRldjsKLQlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZTsKLQotCS8qIE5vdCBhIGJyaWRnZWQgSVAgcGFja2V0IG9yIG5vIGluZm8gYXZhaWxhYmxlIHlldDoKLQkgKiBMT0NBTF9PVVQvbWFuZ2xlIGFuZCBMT0NBTF9PVVQvbmF0IGRvbid0IGtub3cgaWYKLQkgKiB0aGUgZGVzdGluYXRpb24gZGV2aWNlIHdpbGwgYmUgYSBicmlkZ2UuICovCi0JaWYgKCEobmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2UpKSB7Ci0JCS8qIFJldHVybiBNQVRDSCBpZiB0aGUgaW52ZXJ0IGZsYWdzIG9mIHRoZSB1c2VkIG9wdGlvbnMgYXJlIG9uICovCi0JCWlmICgoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9CUklER0VEKSAmJgotCQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfQlJJREdFRCkpCi0JCQlyZXR1cm4gTk9NQVRDSDsKLQkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX0lTSU4pICYmCi0JCSAgICAhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9JU0lOKSkKLQkJCXJldHVybiBOT01BVENIOwotCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUDZUX1BIWVNERVZfT1BfSVNPVVQpICYmCi0JCSAgICAhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9JU09VVCkpCi0JCQlyZXR1cm4gTk9NQVRDSDsKLQkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX0lOKSAmJgotCQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfSU4pKQotCQkJcmV0dXJuIE5PTUFUQ0g7Ci0JCWlmICgoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9PVVQpICYmCi0JCSAgICAhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9PVVQpKQotCQkJcmV0dXJuIE5PTUFUQ0g7Ci0JCXJldHVybiBNQVRDSDsKLQl9Ci0KLQkvKiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaW4gdGhlIEZPUldBUkQgYW5kIFBPU1RST1VUSU5HIGNoYWlucyAqLwotCWlmICgoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9CUklER0VEKSAmJgotCSAgICAoISEobmZfYnJpZGdlLT5tYXNrICYgQlJORl9CUklER0VEKSBeCi0JICAgICEoaW5mby0+aW52ZXJ0ICYgSVA2VF9QSFlTREVWX09QX0JSSURHRUQpKSkKLQkJcmV0dXJuIE5PTUFUQ0g7Ci0KLQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUDZUX1BIWVNERVZfT1BfSVNJTiAmJgotCSAgICAoIW5mX2JyaWRnZS0+cGh5c2luZGV2IF4gISEoaW5mby0+aW52ZXJ0ICYgSVA2VF9QSFlTREVWX09QX0lTSU4pKSkgfHwKLQkgICAgKGluZm8tPmJpdG1hc2sgJiBJUDZUX1BIWVNERVZfT1BfSVNPVVQgJiYKLQkgICAgKCFuZl9icmlkZ2UtPnBoeXNvdXRkZXYgXiAhIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfSVNPVVQpKSkpCi0JCXJldHVybiBOT01BVENIOwotCi0JaWYgKCEoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9JTikpCi0JCWdvdG8gbWF0Y2hfb3V0ZGV2OwotCWluZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXYgPyBuZl9icmlkZ2UtPnBoeXNpbmRldi0+bmFtZSA6IG51bGxkZXZuYW1lOwotCWZvciAoaSA9IDAsIHJldCA9IDA7IGkgPCBJRk5BTVNJWi9zaXplb2YodW5zaWduZWQgaW50KTsgaSsrKSB7Ci0JCXJldCB8PSAoKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmRldilbaV0KLQkJCV4gKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmZvLT5waHlzaW5kZXYpW2ldKQotCQkJJiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPmluX21hc2spW2ldOwotCX0KLQotCWlmICgocmV0ID09IDApIF4gIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfSU4pKQotCQlyZXR1cm4gTk9NQVRDSDsKLQotbWF0Y2hfb3V0ZGV2OgotCWlmICghKGluZm8tPmJpdG1hc2sgJiBJUDZUX1BIWVNERVZfT1BfT1VUKSkKLQkJcmV0dXJuIE1BVENIOwotCW91dGRldiA9IG5mX2JyaWRnZS0+cGh5c291dGRldiA/Ci0JCSBuZl9icmlkZ2UtPnBoeXNvdXRkZXYtPm5hbWUgOiBudWxsZGV2bmFtZTsKLQlmb3IgKGkgPSAwLCByZXQgPSAwOyBpIDwgSUZOQU1TSVovc2l6ZW9mKHVuc2lnbmVkIGludCk7IGkrKykgewotCQlyZXQgfD0gKCgoY29uc3QgdW5zaWduZWQgaW50ICopb3V0ZGV2KVtpXQotCQkJXiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPnBoeXNvdXRkZXYpW2ldKQotCQkJJiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPm91dF9tYXNrKVtpXTsKLQl9Ci0KLQlyZXR1cm4gKHJldCAhPSAwKSBeICEoaW5mby0+aW52ZXJ0ICYgSVA2VF9QSFlTREVWX09QX09VVCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKLQkJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKLQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWNvbnN0IHN0cnVjdCBpcDZ0X3BoeXNkZXZfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQotCWlmIChtYXRjaHNpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfcGh5c2Rldl9pbmZvKSkpCi0JCXJldHVybiAwOwotCWlmICghKGluZm8tPmJpdG1hc2sgJiBJUDZUX1BIWVNERVZfT1BfTUFTSykgfHwKLQkgICAgaW5mby0+Yml0bWFzayAmIH5JUDZUX1BIWVNERVZfT1BfTUFTSykKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBwaHlzZGV2X21hdGNoID0gewotCS5uYW1lCQk9ICJwaHlzZGV2IiwKLQkubWF0Y2gJCT0gJm1hdGNoLAotCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZwaHlzZGV2X21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJnBoeXNkZXZfbWF0Y2gpOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMKaW5kZXggYzFlNzcwZS4uODQ2NWI0MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jCkBAIC0xODMsNyArMTgzLDcgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisgICAgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCiAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAogICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfZmlsdGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfZmlsdGVyLmMKaW5kZXggNGMwMDI4Ni4uY2U0YTk2OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYwpAQCAtOTcsNiArOTcsNyBAQAogCS52YWxpZF9ob29rcwk9IEZJTFRFUl9WQUxJRF9IT09LUywKIAkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELAogCS5tZQkJPSBUSElTX01PRFVMRSwKKwkuYWYJCT0gQUZfSU5FVDYsCiB9OwogCiAvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMuICovCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKaW5kZXggODVjMWU2ZS4uMzBhNDYyNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYwpAQCAtMTI3LDYgKzEyNyw3IEBACiAJLnZhbGlkX2hvb2tzCT0gTUFOR0xFX1ZBTElEX0hPT0tTLAogCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCiAJLm1lCQk9IFRISVNfTU9EVUxFLAorCS5hZgkJPSBBRl9JTkVUNiwKIH07CiAKIC8qIFRoZSB3b3JrIGNvbWVzIGluIGhlcmUgZnJvbSBuZXRmaWx0ZXIuYy4gKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYwppbmRleCBjMjk4MmVmLi5kYjI4YmEzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfcmF3LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3Jhdy5jCkBAIC0xMDYsMTEgKzEwNiwxMiBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YWJsZSBwYWNrZXRfcmF3ID0geyAKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFibGUgcGFja2V0X3JhdyA9IHsgCiAJLm5hbWUgPSAicmF3IiwgCiAJLnZhbGlkX2hvb2tzID0gUkFXX1ZBTElEX0hPT0tTLCAKIAkubG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQsIAotCS5tZSA9IFRISVNfTU9EVUxFCisJLm1lID0gVEhJU19NT0RVTEUsCisJLmFmID0gQUZfSU5FVDYsCiB9OwogCiAvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMuICovCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYwppbmRleCBlNTdkNmZjLi5hYzcwMmEyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKQEAgLTc0LDcgKzc0LDcgQEAKIHN0YXRpYyBpbnQgaXB2Nl9wcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCiAJCQkgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCiB7Ci0JcmV0dXJuIHNlcV9wcmludGYocywgInNyYz0leDoleDoleDoleDoleDoleDoleDoleCBkc3Q9JXg6JXg6JXg6JXg6JXg6JXg6JXg6JXggIiwKKwlyZXR1cm4gc2VxX3ByaW50ZihzLCAic3JjPSIgTklQNl9GTVQgIiBkc3Q9IiBOSVA2X0ZNVCAiICIsCiAJCQkgIE5JUDYoKigoc3RydWN0IGluNl9hZGRyICopdHVwbGUtPnNyYy51My5pcDYpKSwKIAkJCSAgTklQNigqKChzdHJ1Y3QgaW42X2FkZHIgKil0dXBsZS0+ZHN0LnUzLmlwNikpKTsKIH0KQEAgLTU4NCw3ICs1ODQsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JbmVlZF9uZl9jb25udHJhY2soKTsKKwluZWVkX2Nvbm50cmFjaygpOwogCXJldHVybiBpbml0X29yX2NsZWFudXAoMSk7CiB9CiAKQEAgLTU5NSw5ICs1OTUsMyBAQAogCiBtb2R1bGVfaW5pdChpbml0KTsKIG1vZHVsZV9leGl0KGZpbmkpOwotCi12b2lkIG5lZWRfaXA2X2Nvbm50cmFjayh2b2lkKQotewotfQotCi1FWFBPUlRfU1lNQk9MKG5lZWRfaXA2X2Nvbm50cmFjayk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKaW5kZXggZjNlNWZmYi4uODRlZjlhMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYwpAQCAtNzAsOCArNzAsOCBAQAogCiBzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUKIHsKLQlzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUJKm5leHQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBscnVfbGlzdDsJCS8qIGxydSBsaXN0IG1lbWJlcgkqLworCXN0cnVjdCBobGlzdF9ub2RlCWxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlscnVfbGlzdDsJLyogbHJ1IGxpc3QgbWVtYmVyCSovCiAKIAlfX3UzMgkJCWlkOwkJLyogZnJhZ21lbnQgaWQJCSovCiAJc3RydWN0IGluNl9hZGRyCQlzYWRkcjsKQEAgLTkwLDE0ICs5MCwxMyBAQAogI2RlZmluZSBGSVJTVF9JTgkJMgogI2RlZmluZSBMQVNUX0lOCQkJMQogCV9fdTE2CQkJbmhvZmZzZXQ7Ci0Jc3RydWN0IG5mX2N0X2ZyYWc2X3F1ZXVlCSoqcHByZXY7CiB9OwogCiAvKiBIYXNoIHRhYmxlLiAqLwogCiAjZGVmaW5lIEZSQUc2UV9IQVNIU1oJNjQKIAotc3RhdGljIHN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSAqbmZfY3RfZnJhZzZfaGFzaFtGUkFHNlFfSEFTSFNaXTsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBuZl9jdF9mcmFnNl9oYXNoW0ZSQUc2UV9IQVNIU1pdOwogc3RhdGljIERFRklORV9SV0xPQ0sobmZfY3RfZnJhZzZfbG9jayk7CiBzdGF0aWMgdTMyIG5mX2N0X2ZyYWc2X2hhc2hfcm5kOwogc3RhdGljIExJU1RfSEVBRChuZl9jdF9mcmFnNl9scnVfbGlzdCk7CkBAIC0xMDUsOSArMTA0LDcgQEAKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2ZxX3VubGluayhzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUgKmZxKQogewotCWlmIChmcS0+bmV4dCkKLQkJZnEtPm5leHQtPnBwcmV2ID0gZnEtPnBwcmV2OwotCSpmcS0+cHByZXYgPSBmcS0+bmV4dDsKKwlobGlzdF9kZWwoJmZxLT5saXN0KTsKIAlsaXN0X2RlbCgmZnEtPmxydV9saXN0KTsKIAluZl9jdF9mcmFnNl9ucXVldWVzLS07CiB9CkBAIC0xNTgsMjggKzE1NSwxOCBAQAogCWdldF9yYW5kb21fYnl0ZXMoJm5mX2N0X2ZyYWc2X2hhc2hfcm5kLCBzaXplb2YodTMyKSk7CiAJZm9yIChpID0gMDsgaSA8IEZSQUc2UV9IQVNIU1o7IGkrKykgewogCQlzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUgKnE7CisJCXN0cnVjdCBobGlzdF9ub2RlICpwLCAqbjsKIAotCQlxID0gbmZfY3RfZnJhZzZfaGFzaFtpXTsKLQkJd2hpbGUgKHEpIHsKLQkJCXN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSAqbmV4dCA9IHEtPm5leHQ7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocSwgcCwgbiwgJm5mX2N0X2ZyYWc2X2hhc2hbaV0sIGxpc3QpIHsKIAkJCXVuc2lnbmVkIGludCBodmFsID0gaXA2cWhhc2hmbihxLT5pZCwKIAkJCQkJCSAgICAgICAmcS0+c2FkZHIsCiAJCQkJCQkgICAgICAgJnEtPmRhZGRyKTsKLQogCQkJaWYgKGh2YWwgIT0gaSkgewotCQkJCS8qIFVubGluay4gKi8KLQkJCQlpZiAocS0+bmV4dCkKLQkJCQkJcS0+bmV4dC0+cHByZXYgPSBxLT5wcHJldjsKLQkJCQkqcS0+cHByZXYgPSBxLT5uZXh0OwotCisJCQkJaGxpc3RfZGVsKCZxLT5saXN0KTsKIAkJCQkvKiBSZWxpbmsgdG8gbmV3IGhhc2ggY2hhaW4uICovCi0JCQkJaWYgKChxLT5uZXh0ID0gbmZfY3RfZnJhZzZfaGFzaFtodmFsXSkgIT0gTlVMTCkKLQkJCQkJcS0+bmV4dC0+cHByZXYgPSAmcS0+bmV4dDsKLQkJCQluZl9jdF9mcmFnNl9oYXNoW2h2YWxdID0gcTsKLQkJCQlxLT5wcHJldiA9ICZuZl9jdF9mcmFnNl9oYXNoW2h2YWxdOworCQkJCWhsaXN0X2FkZF9oZWFkKCZxLT5saXN0LAorCQkJCQkgICAgICAgJm5mX2N0X2ZyYWc2X2hhc2hbaHZhbF0pOwogCQkJfQotCi0JCQlxID0gbmV4dDsKIAkJfQogCX0KIAl3cml0ZV91bmxvY2soJm5mX2N0X2ZyYWc2X2xvY2spOwpAQCAtMzE0LDE1ICszMDEsMTcgQEAKIAogLyogQ3JlYXRpb24gcHJpbWl0aXZlcy4gKi8KIAotCiBzdGF0aWMgc3RydWN0IG5mX2N0X2ZyYWc2X3F1ZXVlICpuZl9jdF9mcmFnNl9pbnRlcm4odW5zaWduZWQgaW50IGhhc2gsCiAJCQkJCSAgc3RydWN0IG5mX2N0X2ZyYWc2X3F1ZXVlICpmcV9pbikKIHsKIAlzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUgKmZxOworI2lmZGVmIENPTkZJR19TTVAKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKKyNlbmRpZgogCiAJd3JpdGVfbG9jaygmbmZfY3RfZnJhZzZfbG9jayk7CiAjaWZkZWYgQ09ORklHX1NNUAotCWZvciAoZnEgPSBuZl9jdF9mcmFnNl9oYXNoW2hhc2hdOyBmcTsgZnEgPSBmcS0+bmV4dCkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZxLCBuLCAmbmZfY3RfZnJhZzZfaGFzaFtoYXNoXSwgbGlzdCkgewogCQlpZiAoZnEtPmlkID09IGZxX2luLT5pZCAmJiAKIAkJICAgICFpcHY2X2FkZHJfY21wKCZmcV9pbi0+c2FkZHIsICZmcS0+c2FkZHIpICYmCiAJCSAgICAhaXB2Nl9hZGRyX2NtcCgmZnFfaW4tPmRhZGRyLCAmZnEtPmRhZGRyKSkgewpAQCAtMzQwLDEwICszMjksNyBAQAogCQlhdG9taWNfaW5jKCZmcS0+cmVmY250KTsKIAogCWF0b21pY19pbmMoJmZxLT5yZWZjbnQpOwotCWlmICgoZnEtPm5leHQgPSBuZl9jdF9mcmFnNl9oYXNoW2hhc2hdKSAhPSBOVUxMKQotCQlmcS0+bmV4dC0+cHByZXYgPSAmZnEtPm5leHQ7Ci0JbmZfY3RfZnJhZzZfaGFzaFtoYXNoXSA9IGZxOwotCWZxLT5wcHJldiA9ICZuZl9jdF9mcmFnNl9oYXNoW2hhc2hdOworCWhsaXN0X2FkZF9oZWFkKCZmcS0+bGlzdCwgJm5mX2N0X2ZyYWc2X2hhc2hbaGFzaF0pOwogCUlOSVRfTElTVF9IRUFEKCZmcS0+bHJ1X2xpc3QpOwogCWxpc3RfYWRkX3RhaWwoJmZxLT5scnVfbGlzdCwgJm5mX2N0X2ZyYWc2X2xydV9saXN0KTsKIAluZl9jdF9mcmFnNl9ucXVldWVzKys7CkBAIC0zODQsMTAgKzM3MCwxMSBAQAogZnFfZmluZCh1MzIgaWQsIHN0cnVjdCBpbjZfYWRkciAqc3JjLCBzdHJ1Y3QgaW42X2FkZHIgKmRzdCkKIHsKIAlzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUgKmZxOworCXN0cnVjdCBobGlzdF9ub2RlICpuOwogCXVuc2lnbmVkIGludCBoYXNoID0gaXA2cWhhc2hmbihpZCwgc3JjLCBkc3QpOwogCiAJcmVhZF9sb2NrKCZuZl9jdF9mcmFnNl9sb2NrKTsKLQlmb3IgKGZxID0gbmZfY3RfZnJhZzZfaGFzaFtoYXNoXTsgZnE7IGZxID0gZnEtPm5leHQpIHsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShmcSwgbiwgJm5mX2N0X2ZyYWc2X2hhc2hbaGFzaF0sIGxpc3QpIHsKIAkJaWYgKGZxLT5pZCA9PSBpZCAmJiAKIAkJICAgICFpcHY2X2FkZHJfY21wKHNyYywgJmZxLT5zYWRkcikgJiYKIAkJICAgICFpcHY2X2FkZHJfY21wKGRzdCwgJmZxLT5kYWRkcikpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X3N0YXRlLmMgYi9uZXQvaXB2Ni94ZnJtNl9zdGF0ZS5jCmluZGV4IGJmMGQwYWIuLmE1NzIzMDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X3N0YXRlLmMKKysrIGIvbmV0L2lwdjYveGZybTZfc3RhdGUuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Bma2V5djIuaD4KICNpbmNsdWRlIDxsaW51eC9pcHNlYy5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8geGZybTZfc3RhdGVfYWZpbmZvOwogCkBAIC00MSw2ICs0MiwyMiBAQAogCW1lbWNweSgmeC0+cHJvcHMuc2FkZHIsICZ0bXBsLT5zYWRkciwgc2l6ZW9mKHgtPnByb3BzLnNhZGRyKSk7CiAJaWYgKGlwdjZfYWRkcl9hbnkoKHN0cnVjdCBpbjZfYWRkciopJngtPnByb3BzLnNhZGRyKSkKIAkJbWVtY3B5KCZ4LT5wcm9wcy5zYWRkciwgc2FkZHIsIHNpemVvZih4LT5wcm9wcy5zYWRkcikpOworCWlmICh0bXBsLT5tb2RlICYmIGlwdjZfYWRkcl9hbnkoKHN0cnVjdCBpbjZfYWRkciopJngtPnByb3BzLnNhZGRyKSkgeworCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCQlzdHJ1Y3QgZmxvd2kgZmxfdHVubmVsID0geworCQkJLm5sX3UgPSB7CisJCQkJLmlwNl91ID0geworCQkJCQkuZGFkZHIgPSAqKHN0cnVjdCBpbjZfYWRkciAqKWRhZGRyLAorCQkJCX0KKwkJCX0KKwkJfTsKKwkJaWYgKCF4ZnJtX2RzdF9sb29rdXAoKHN0cnVjdCB4ZnJtX2RzdCAqKikmcnQsCisJCSAgICAgICAgICAgICAgICAgICAgICZmbF90dW5uZWwsIEFGX0lORVQ2KSkgeworCQkJaXB2Nl9nZXRfc2FkZHIoJnJ0LT51LmRzdCwgKHN0cnVjdCBpbjZfYWRkciAqKWRhZGRyLAorCQkJICAgICAgICAgICAgICAgKHN0cnVjdCBpbjZfYWRkciAqKSZ4LT5wcm9wcy5zYWRkcik7CisJCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJfQorCX0KIAl4LT5wcm9wcy5tb2RlID0gdG1wbC0+bW9kZTsKIAl4LT5wcm9wcy5yZXFpZCA9IHRtcGwtPnJlcWlkOwogCXgtPnByb3BzLmZhbWlseSA9IEFGX0lORVQ2OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfdHVubmVsLmMgYi9uZXQvaXB2Ni94ZnJtNl90dW5uZWwuYwppbmRleCBkYTA5ZmYyLi44Y2ZjNThiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl90dW5uZWwuYworKysgYi9uZXQvaXB2Ni94ZnJtNl90dW5uZWwuYwpAQCAtMjU5LDggKzI1OSw3IEBACiAJc3BpID0gMDsKIAlnb3RvIG91dDsKIGFsbG9jX3NwaToKLQlYNlRQUklOVEszKEtFUk5fREVCVUcgIiVzKCk6IGFsbG9jYXRlIG5ldyBzcGkgZm9yICIKLQkJCSAgICAgICIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsIAorCVg2VFBSSU5USzMoS0VSTl9ERUJVRyAiJXMoKTogYWxsb2NhdGUgbmV3IHNwaSBmb3IgIiBOSVA2X0ZNVCAiXG4iLAogCQkJICAgICAgX19GVU5DVElPTl9fLCAKIAkJCSAgICAgIE5JUDYoKihzdHJ1Y3QgaW42X2FkZHIgKilzYWRkcikpOwogCXg2c3BpID0ga21lbV9jYWNoZV9hbGxvYyh4ZnJtNl90dW5uZWxfc3BpX2ttZW0sIFNMQUJfQVRPTUlDKTsKQEAgLTMyMyw5ICszMjIsOCBAQAogCQkJCSAgbGlzdF9ieWFkZHIpCiAJewogCQlpZiAobWVtY21wKCZ4NnNwaS0+YWRkciwgc2FkZHIsIHNpemVvZih4NnNwaS0+YWRkcikpID09IDApIHsKLQkJCVg2VFBSSU5USzMoS0VSTl9ERUJVRyAiJXMoKTogeDZzcGkgb2JqZWN0ICIKLQkJCQkJICAgICAgImZvciAlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHggIgotCQkJCQkgICAgICAiZm91bmQgYXQgJXBcbiIsCisJCQlYNlRQUklOVEszKEtFUk5fREVCVUcgIiVzKCk6IHg2c3BpIG9iamVjdCBmb3IgIiBOSVA2X0ZNVCAKKwkJCQkJICAgICAgIiBmb3VuZCBhdCAlcFxuIiwKIAkJCQkgICBfX0ZVTkNUSU9OX18sIAogCQkJCSAgIE5JUDYoKihzdHJ1Y3QgaW42X2FkZHIgKilzYWRkciksCiAJCQkJICAgeDZzcGkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDdkNTVmOWMuLjk5YzBhMGYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTEwMywzICsxMDMsMjYxIEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGEgbmV0bGluay1iYXNlZCB1c2Vyc3BhY2UgaW50ZXJmYWNlCiAKIGVuZG1lbnUKKworY29uZmlnIE5FVEZJTFRFUl9YVEFCTEVTCisJdHJpc3RhdGUgIk5ldGZpbHRlciBYdGFibGVzIHN1cHBvcnQgKHJlcXVpcmVkIGZvciBpcF90YWJsZXMpIgorCWhlbHAKKwkgIFRoaXMgaXMgcmVxdWlyZWQgaWYgeW91IGludGVuZCB0byB1c2UgYW55IG9mIGlwX3RhYmxlcywKKwkgIGlwNl90YWJsZXMgb3IgYXJwX3RhYmxlcy4KKworIyBhbHBoYWJldGljYWxseSBvcmRlcmVkIGxpc3Qgb2YgdGFyZ2V0cworCitjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWQorCXRyaXN0YXRlICciQ0xBU1NJRlkiIHRhcmdldCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYENMQVNTSUZZJyB0YXJnZXQsIHdoaWNoIGVuYWJsZXMgdGhlIHVzZXIgdG8gc2V0CisJICB0aGUgcHJpb3JpdHkgb2YgYSBwYWNrZXQuIFNvbWUgcWRpc2NzIGNhbiB1c2UgdGhpcyB2YWx1ZSBmb3IKKwkgIGNsYXNzaWZpY2F0aW9uLCBhbW9uZyB0aGVzZSBhcmU6CisKKyAgCSAgYXRtLCBjYnEsIGRzbWFyaywgcGZpZm9fZmFzdCwgaHRiLCBwcmlvCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSworCXRyaXN0YXRlICAnIkNPTk5NQVJLIiB0YXJnZXQgc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJZGVwZW5kcyBvbiBJUF9ORl9NQU5HTEUgfHwgSVA2X05GX01BTkdMRQorCWRlcGVuZHMgb24gKElQX05GX0NPTk5UUkFDSyAmJiBJUF9ORl9DT05OVFJBQ0tfTUFSSykgfHwgKE5GX0NPTk5UUkFDS19NQVJLICYmIE5GX0NPTk5UUkFDS19JUFY0KQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgQ09OTk1BUksnIHRhcmdldCwgd2hpY2ggYWxsb3dzIG9uZSB0byBtYW5pcHVsYXRlCisJICB0aGUgY29ubmVjdGlvbiBtYXJrIHZhbHVlLiAgU2ltaWxhciB0byB0aGUgTUFSSyB0YXJnZXQsIGJ1dAorCSAgYWZmZWN0cyB0aGUgY29ubmVjdGlvbiBtYXJrIHZhbHVlIHJhdGhlciB0aGFuIHRoZSBwYWNrZXQgbWFyayB2YWx1ZS4KKwkKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgaXB0X0NPTk5NQVJLLm8uICBJZiB1bnN1cmUsIHNheSBgTicuCisKK2NvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX01BUksKKwl0cmlzdGF0ZSAnIk1BUksiIHRhcmdldCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYE1BUksnIHRhcmdldCwgd2hpY2ggYWxsb3dzIHlvdSB0byBjcmVhdGUgcnVsZXMKKwkgIGluIHRoZSBgbWFuZ2xlJyB0YWJsZSB3aGljaCBhbHRlciB0aGUgbmV0ZmlsdGVyIG1hcmsgKG5mbWFyaykgZmllbGQKKwkgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2V0IHByaW9yIHRvIHJvdXRpbmcuIFRoaXMgY2FuIGNoYW5nZQorCSAgdGhlIHJvdXRpbmcgbWV0aG9kIChzZWUgYFVzZSBuZXRmaWx0ZXIgTUFSSyB2YWx1ZSBhcyByb3V0aW5nCisJICBrZXknKSBhbmQgY2FuIGFsc28gYmUgdXNlZCBieSBvdGhlciBzdWJzeXN0ZW1zIHRvIGNoYW5nZSB0aGVpcgorCSAgYmVoYXZpb3IuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFCisJdHJpc3RhdGUgJyJORlFVRVVFIiB0YXJnZXQgU3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgVGhpcyBUYXJnZXQgcmVwbGFjZWQgdGhlIG9sZCBvYnNvbGV0ZSBRVUVVRSB0YXJnZXQuCisKKwkgIEFzIG9wcG9zZWQgdG8gUVVFVUUsIGl0IHN1cHBvcnRzIDY1NTM1IGRpZmZlcmVudCBxdWV1ZXMsCisJICBub3QganVzdCBvbmUuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9OT1RSQUNLCisJdHJpc3RhdGUgICciTk9UUkFDSyIgdGFyZ2V0IHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWRlcGVuZHMgb24gSVBfTkZfUkFXIHx8IElQNl9ORl9SQVcKKwlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0sKKwloZWxwCisJICBUaGUgTk9UUkFDSyB0YXJnZXQgYWxsb3dzIGEgc2VsZWN0IHJ1bGUgdG8gc3BlY2lmeQorCSAgd2hpY2ggcGFja2V0cyAqbm90KiB0byBlbnRlciB0aGUgY29ubnRyYWNrL05BVAorCSAgc3Vic3lzdGVtIHdpdGggYWxsIHRoZSBjb25zZXF1ZW5jZXMgKG5vIElDTVAgZXJyb3IgdHJhY2tpbmcsCisJICBubyBwcm90b2NvbCBoZWxwZXJzIGZvciB0aGUgc2VsZWN0ZWQgcGFja2V0cykuCisJCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UCisJdHJpc3RhdGUgICciY29tbWVudCIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb21tZW50JyBkdW1teS1tYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBwdXQKKwkgIGNvbW1lbnRzIGluIHlvdXIgaXB0YWJsZXMgcnVsZXNldC4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCisKK2NvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkJZVEVTCisJdHJpc3RhdGUgICciY29ubmJ5dGVzIiBwZXItY29ubmVjdGlvbiBjb3VudGVyIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWRlcGVuZHMgb24gKElQX05GX0NPTk5UUkFDSyAmJiBJUF9ORl9DVF9BQ0NUKSB8fCBORl9DVF9BQ0NUCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb25uYnl0ZXMnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZQorCSAgbnVtYmVyIG9mIGJ5dGVzIGFuZC9vciBwYWNrZXRzIGZvciBlYWNoIGRpcmVjdGlvbiB3aXRoaW4gYSBjb25uZWN0aW9uLgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9DT05OTUFSSworCXRyaXN0YXRlICAnImNvbm5tYXJrIiBjb25uZWN0aW9uIG1hcmsgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJZGVwZW5kcyBvbiAoSVBfTkZfQ09OTlRSQUNLICYmIElQX05GX0NPTk5UUkFDS19NQVJLKSB8fCBORl9DT05OVFJBQ0tfTUFSSworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgY29ubm1hcmsnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZQorCSAgY29ubmVjdGlvbiBtYXJrIHZhbHVlIHByZXZpb3VzbHkgc2V0IGZvciB0aGUgc2Vzc2lvbiBieSBgQ09OTk1BUksnLiAKKwkKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgaXB0X2Nvbm5tYXJrLm8uICBJZiB1bnN1cmUsIHNheSBgTicuCisKK2NvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLCisJdHJpc3RhdGUgJyJjb25udHJhY2siIGNvbm5lY3Rpb24gdHJhY2tpbmcgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLCisJaGVscAorCSAgVGhpcyBpcyBhIGdlbmVyYWwgY29ubnRyYWNrIG1hdGNoIG1vZHVsZSwgYSBzdXBlcnNldCBvZiB0aGUgc3RhdGUgbWF0Y2guCisKKwkgIEl0IGFsbG93cyBtYXRjaGluZyBvbiBhZGRpdGlvbmFsIGNvbm50cmFjayBpbmZvcm1hdGlvbiwgd2hpY2ggaXMKKwkgIHVzZWZ1bCBpbiBjb21wbGV4IGNvbmZpZ3VyYXRpb25zLCBzdWNoIGFzIE5BVCBnYXRld2F5cyB3aXRoIG11bHRpcGxlCisJICBpbnRlcm5ldCBsaW5rcyBvciB0dW5uZWxzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQCisJdHJpc3RhdGUgICciRENDUCIgcHJvdG9jb2wgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBlbmFibGVkLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgaXB0YWJsZXMKKwkgIGBkY2NwJyBtYXRjaCBpbiBvcmRlciB0byBtYXRjaCBvbiBEQ0NQIHNvdXJjZS9kZXN0aW5hdGlvbiBwb3J0cworCSAgYW5kIERDQ1AgZmxhZ3MuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX0hFTFBFUgorCXRyaXN0YXRlICciaGVscGVyIiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0sKKwloZWxwCisJICBIZWxwZXIgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGluIGR5bmFtaWMgY29ubmVjdGlvbnMKKwkgIHRyYWNrZWQgYnkgYSBjb25udHJhY2staGVscGVyLCBpZS4gaXBfY29ubnRyYWNrX2Z0cAorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEgKKwl0cmlzdGF0ZSAnImxlbmd0aCIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIGEgcGFja2V0IGFnYWluc3QgYQorCSAgc3BlY2lmaWMgdmFsdWUgb3IgcmFuZ2Ugb2YgdmFsdWVzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVAorCXRyaXN0YXRlICcibGltaXQiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWhlbHAKKwkgIGxpbWl0IG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gY29udHJvbCB0aGUgcmF0ZSBhdCB3aGljaCBhIHJ1bGUgY2FuIGJlCisJICBtYXRjaGVkOiBtYWlubHkgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIExPRyB0YXJnZXQgKCJMT0cKKwkgIHRhcmdldCBzdXBwb3J0IiwgYmVsb3cpIGFuZCB0byBhdm9pZCBzb21lIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFja3MuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX01BQworCXRyaXN0YXRlICcibWFjIiBhZGRyZXNzIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWhlbHAKKwkgIE1BQyBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlIHNvdXJjZQorCSAgRXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUgcGFja2V0LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9NQVJLCisJdHJpc3RhdGUgJyJtYXJrIiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBOZXRmaWx0ZXIgbWFyayBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlCisJICBgbmZtYXJrJyB2YWx1ZSBpbiB0aGUgcGFja2V0LiAgVGhpcyBjYW4gYmUgc2V0IGJ5IHRoZSBNQVJLIHRhcmdldAorCSAgKHNlZSBiZWxvdykuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1BIWVNERVYKKwl0cmlzdGF0ZSAnInBoeXNkZXYiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUyAmJiBCUklER0VfTkVURklMVEVSCisJaGVscAorCSAgUGh5c2RldiBwYWNrZXQgbWF0Y2hpbmcgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwaHlzaWNhbCBicmlkZ2UgcG9ydHMKKwkgIHRoZSBJUCBwYWNrZXQgYXJyaXZlZCBvbiBvciB3aWxsIGxlYXZlIGJ5LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFCisJdHJpc3RhdGUgJyJwa3R0eXBlIiBwYWNrZXQgdHlwZSBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBQYWNrZXQgdHlwZSBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIGEgcGFja2V0IGJ5CisJICBpdHMgImNsYXNzIiwgZWcuIEJST0FEQ0FTVCwgTVVMVElDQVNULCAuLi4KKworCSAgVHlwaWNhbCB1c2FnZToKKwkgIGlwdGFibGVzIC1BIElOUFVUIC1tIHBrdHR5cGUgLS1wa3QtdHlwZSBicm9hZGNhc3QgLWogTE9HCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1JFQUxNCisJdHJpc3RhdGUgICcicmVhbG0iIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCXNlbGVjdCBORVRfQ0xTX1JPVVRFCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGByZWFsbScgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gdXNlIHRoZSByZWFsbQorCSAga2V5IGZyb20gdGhlIHJvdXRpbmcgc3Vic3lzdGVtIGluc2lkZSBpcHRhYmxlcy4KKwkKKwkgIFRoaXMgbWF0Y2ggcHJldHR5IG11Y2ggcmVzZW1ibGVzIHRoZSBDT05GSUdfTkVUX0NMU19ST1VURTQgb3B0aW9uIAorCSAgaW4gdGMgd29ybGQuCisJCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TQ1RQCisJdHJpc3RhdGUgICcic2N0cCIgcHJvdG9jb2wgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBlbmFibGVkLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgCisJICBgc2N0cCcgbWF0Y2ggaW4gb3JkZXIgdG8gbWF0Y2ggb24gU0NUUCBzb3VyY2UvZGVzdGluYXRpb24gcG9ydHMKKwkgIGFuZCBTQ1RQIGNodW5rIHR5cGVzLgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TVEFURQorCXRyaXN0YXRlICcic3RhdGUiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLIHx8IE5GX0NPTk5UUkFDSworCWhlbHAKKwkgIENvbm5lY3Rpb24gc3RhdGUgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZWlyCisJICByZWxhdGlvbnNoaXAgdG8gYSB0cmFja2VkIGNvbm5lY3Rpb24gKGllLiBwcmV2aW91cyBwYWNrZXRzKS4gIFRoaXMKKwkgIGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgcGFja2V0IGNsYXNzaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkcKKwl0cmlzdGF0ZSAgJyJzdHJpbmciIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCXNlbGVjdCBURVhUU0VBUkNICisJc2VsZWN0IFRFWFRTRUFSQ0hfS01QCisJc2VsZWN0IFRFWFRTRUFSQ0hfQk0KKwlzZWxlY3QgVEVYVFNFQVJDSF9GU00KKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYHN0cmluZycgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gbG9vayBmb3IKKwkgIHBhdHRlcm4gbWF0Y2hpbmdzIGluIHBhY2tldHMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1RDUE1TUworCXRyaXN0YXRlICcidGNwbXNzIiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYHRjcG1zcycgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gZXhhbWluZSB0aGUKKwkgIE1TUyB2YWx1ZSBvZiBUQ1AgU1lOIHBhY2tldHMsIHdoaWNoIGNvbnRyb2wgdGhlIG1heGltdW0gcGFja2V0IHNpemUKKwkgIGZvciB0aGF0IGNvbm5lY3Rpb24uCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQppbmRleCBjYjIxODMxLi43NDYxNzJlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTEsNCArMSw1IEBACiBuZXRmaWx0ZXItb2JqcyA6PSBjb3JlLm8gbmZfbG9nLm8gbmZfcXVldWUubyBuZl9zb2Nrb3B0Lm8KK25mX2Nvbm50cmFjay1vYmpzCTo9IG5mX2Nvbm50cmFja19jb3JlLm8gbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUubyBuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljLm8gbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMubyBuZl9jb25udHJhY2tfcHJvdG9fdGNwLm8gbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5vCiAKIG9iai0kKENPTkZJR19ORVRGSUxURVIpID0gbmV0ZmlsdGVyLm8KIApAQCAtNiwxMyArNyw0MyBAQAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX1FVRVVFKSArPSBuZm5ldGxpbmtfcXVldWUubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0xPRykgKz0gbmZuZXRsaW5rX2xvZy5vCiAKLW5mX2Nvbm50cmFjay1vYmpzCTo9IG5mX2Nvbm50cmFja19jb3JlLm8gbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUubyBuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljLm8gbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMubyBuZl9jb25udHJhY2tfcHJvdG9fdGNwLm8gbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5vCi0KKyMgY29ubmVjdGlvbiB0cmFja2luZwogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDSykgKz0gbmZfY29ubnRyYWNrLm8KLW9iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfRlRQKSArPSBuZl9jb25udHJhY2tfZnRwLm8KIAogIyBTQ1RQIHByb3RvY29sIGNvbm5lY3Rpb24gdHJhY2tpbmcKIG9iai0kKENPTkZJR19ORl9DVF9QUk9UT19TQ1RQKSArPSBuZl9jb25udHJhY2tfcHJvdG9fc2N0cC5vCiAKICMgbmV0bGluayBpbnRlcmZhY2UgZm9yIG5mX2Nvbm50cmFjawogb2JqLSQoQ09ORklHX05GX0NUX05FVExJTkspICs9IG5mX2Nvbm50cmFja19uZXRsaW5rLm8KKworIyBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlcnMKK29iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfRlRQKSArPSBuZl9jb25udHJhY2tfZnRwLm8KKworIyBnZW5lcmljIFggdGFibGVzIAorb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTKSArPSB4X3RhYmxlcy5vIHh0X3RjcHVkcC5vCisKKyMgdGFyZ2V0cworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlkpICs9IHh0X0NMQVNTSUZZLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLKSArPSB4dF9DT05OTUFSSy5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLKSArPSB4dF9NQVJLLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUUpICs9IHh0X05GUVVFVUUubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTk9UUkFDSykgKz0geHRfTk9UUkFDSy5vCisKKyMgbWF0Y2hlcworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UKSArPSB4dF9jb21tZW50Lm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkJZVEVTKSArPSB4dF9jb25uYnl0ZXMubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTUFSSykgKz0geHRfY29ubm1hcmsubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0spICs9IHh0X2Nvbm50cmFjay5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1ApICs9IHh0X2RjY3Aubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVIpICs9IHh0X2hlbHBlci5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSCkgKz0geHRfbGVuZ3RoLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQpICs9IHh0X2xpbWl0Lm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDKSArPSB4dF9tYWMubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQVJLKSArPSB4dF9tYXJrLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRSkgKz0geHRfcGt0dHlwZS5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNKSArPSB4dF9yZWFsbS5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFApICs9IHh0X3NjdHAubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURSkgKz0geHRfc3RhdGUubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkcpICs9IHh0X3N0cmluZy5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RDUE1TUykgKz0geHRfdGNwbXNzLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEhZU0RFVikgKz0geHRfcGh5c2Rldi5vCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCmluZGV4IGQ1YTZlYWYuLmFiMGM5MjAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCkBAIC01NDUsMTEgKzU0NSwxMSBAQAogICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBJUCBhZGRyZXNzLiAgU2ltcGx5IGRvbid0IHJlY29yZCBpdCBmb3IKICAgICAgICAgICAgICAgICAgICBOQVQuICovCiAJCWlmIChjbWQubDNudW0gPT0gUEZfSU5FVCkgewotICAgICAgICAgICAgICAgIAlERUJVR1AoImNvbm50cmFja19mdHA6IE5PVCBSRUNPUkRJTkc6ICV1LCV1LCV1LCV1ICE9ICV1LiV1LiV1LiV1XG4iLAorICAgICAgICAgICAgICAgIAlERUJVR1AoImNvbm50cmFja19mdHA6IE5PVCBSRUNPUkRJTkc6ICIgTklQUVVBRF9GTVQgIiAhPSAiIE5JUFFVQURfRk1UICJcbiIsCiAJCQkgICAgICAgTklQUVVBRChjbWQudTMuaXApLAogCQkJICAgICAgIE5JUFFVQUQoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51My5pcCkpOwogCQl9IGVsc2UgewotCQkJREVCVUdQKCJjb25udHJhY2tfZnRwOiBOT1QgUkVDT1JESU5HOiAleDoleDoleDoleDoleDoleDoleDoleCAhPSAleDoleDoleDoleDoleDoleDoleDoleFxuIiwKKwkJCURFQlVHUCgiY29ubnRyYWNrX2Z0cDogTk9UIFJFQ09SRElORzogIiBOSVA2X0ZNVCAiICE9ICIgTklQNl9GTVQgIlxuIiwKIAkJCSAgICAgICBOSVA2KCooKHN0cnVjdCBpbjZfYWRkciAqKWNtZC51My5pcDYpKSwKIAkJCSAgICAgICBOSVA2KCooKHN0cnVjdCBpbjZfYWRkciAqKWN0LT50dXBsZWhhc2hbZGlyXQogCQkJCQkJCS50dXBsZS5zcmMudTMuaXA2KSkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCmluZGV4IDM1MzFkMTQuLjYxNzU5OWEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTgyMSw3ICs4MjEsNyBAQAogCiAvKiBTb21lIG1vZHVsZXMgbmVlZCB1cywgYnV0IGRvbid0IGRlcGVuZCBkaXJlY3RseSBvbiBhbnkgc3ltYm9sLgogICAgVGhleSBzaG91bGQgY2FsbCB0aGlzLiAqLwotdm9pZCBuZWVkX25mX2Nvbm50cmFjayh2b2lkKQordm9pZCBuZWVkX2Nvbm50cmFjayh2b2lkKQogewogfQogCkBAIC04NDEsNyArODQxLDcgQEAKIEVYUE9SVF9TWU1CT0wobmZfY3RfaW52ZXJ0X3R1cGxlcHIpOwogRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfYWx0ZXJfcmVwbHkpOwogRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfZGVzdHJveWVkKTsKLUVYUE9SVF9TWU1CT0wobmVlZF9uZl9jb25udHJhY2spOworRVhQT1JUX1NZTUJPTChuZWVkX2Nvbm50cmFjayk7CiBFWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIpOwogRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIpOwogRVhQT1JUX1NZTUJPTChuZl9jdF9pdGVyYXRlX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jIGIvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ODE3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMKQEAgLTAsMCArMSw2MjQgQEAKKy8qCisgKiB4X3RhYmxlcyBjb3JlIC0gQmFja2VuZCBmb3Ige2lwLGlwNixhcnB9X3RhYmxlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA2IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIEJhc2VkIG9uIGV4aXN0aW5nIGlwX3RhYmxlcyBjb2RlIHdoaWNoIGlzCisgKiAgIENvcHlyaWdodCAoQykgMTk5OSBQYXVsIGBSdXN0eScgUnVzc2VsbCAmIE1pY2hhZWwgSi4gTmV1bGluZworICogICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJbaXAsaXA2LGFycF1fdGFibGVzIGJhY2tlbmQgbW9kdWxlIik7CisKKyNkZWZpbmUgU01QX0FMSUdOKHgpICgoKHgpICsgU01QX0NBQ0hFX0JZVEVTLTEpICYgfihTTVBfQ0FDSEVfQllURVMtMSkpCisKK3N0cnVjdCB4dF9hZiB7CisJc3RydWN0IHNlbWFwaG9yZSBtdXRleDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1hdGNoOworCXN0cnVjdCBsaXN0X2hlYWQgdGFyZ2V0OworCXN0cnVjdCBsaXN0X2hlYWQgdGFibGVzOworfTsKKworc3RhdGljIHN0cnVjdCB4dF9hZiAqeHQ7CisKKyNpZmRlZiBERUJVR19JUF9GSVJFV0FMTF9VU0VSCisjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworZW51bSB7CisJVEFCTEUsCisJVEFSR0VULAorCU1BVENILAorfTsKKworLyogUmVnaXN0cmF0aW9uIGhvb2tzIGZvciB0YXJnZXRzLiAqLworaW50Cit4dF9yZWdpc3Rlcl90YXJnZXQoaW50IGFmLCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQpCit7CisJaW50IHJldDsKKworCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmeHRbYWZdLm11dGV4KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisJbGlzdF9hZGQoJnRhcmdldC0+bGlzdCwgJnh0W2FmXS50YXJnZXQpOworCXVwKCZ4dFthZl0ubXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHh0X3JlZ2lzdGVyX3RhcmdldCk7CisKK3ZvaWQKK3h0X3VucmVnaXN0ZXJfdGFyZ2V0KGludCBhZiwgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0KQoreworCWRvd24oJnh0W2FmXS5tdXRleCk7CisJTElTVF9ERUxFVEUoJnh0W2FmXS50YXJnZXQsIHRhcmdldCk7CisJdXAoJnh0W2FmXS5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKHh0X3VucmVnaXN0ZXJfdGFyZ2V0KTsKKworaW50Cit4dF9yZWdpc3Rlcl9tYXRjaChpbnQgYWYsIHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gpCit7CisJaW50IHJldDsKKworCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmeHRbYWZdLm11dGV4KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlsaXN0X2FkZCgmbWF0Y2gtPmxpc3QsICZ4dFthZl0ubWF0Y2gpOworCXVwKCZ4dFthZl0ubXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woeHRfcmVnaXN0ZXJfbWF0Y2gpOworCit2b2lkCit4dF91bnJlZ2lzdGVyX21hdGNoKGludCBhZiwgc3RydWN0IHh0X21hdGNoICptYXRjaCkKK3sKKwlkb3duKCZ4dFthZl0ubXV0ZXgpOworCUxJU1RfREVMRVRFKCZ4dFthZl0ubWF0Y2gsIG1hdGNoKTsKKwl1cCgmeHRbYWZdLm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woeHRfdW5yZWdpc3Rlcl9tYXRjaCk7CisKKworLyoKKyAqIFRoZXNlIGFyZSB3ZWlyZCwgYnV0IG1vZHVsZSBsb2FkaW5nIG11c3Qgbm90IGJlIGRvbmUgd2l0aCBtdXRleAorICogaGVsZCAoc2luY2UgdGhleSB3aWxsIHJlZ2lzdGVyKSwgYW5kIHdlIGhhdmUgdG8gaGF2ZSBhIHNpbmdsZQorICogZnVuY3Rpb24gdG8gdXNlIHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKCkuCisgKi8KKworLyogRmluZCBtYXRjaCwgZ3JhYnMgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCitzdHJ1Y3QgeHRfbWF0Y2ggKnh0X2ZpbmRfbWF0Y2goaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKK3sKKwlzdHJ1Y3QgeHRfbWF0Y2ggKm07CisJaW50IGVyciA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ4dFthZl0ubXV0ZXgpICE9IDApCisJCXJldHVybiBFUlJfUFRSKC1FSU5UUik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZ4dFthZl0ubWF0Y2gsIGxpc3QpIHsKKwkJaWYgKHN0cmNtcChtLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlpZiAobS0+cmV2aXNpb24gPT0gcmV2aXNpb24pIHsKKwkJCQlpZiAodHJ5X21vZHVsZV9nZXQobS0+bWUpKSB7CisJCQkJCXVwKCZ4dFthZl0ubXV0ZXgpOworCQkJCQlyZXR1cm4gbTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQllcnIgPSAtRVBST1RPVFlQRTsgLyogRm91bmQgc29tZXRoaW5nLiAqLworCQl9CisJfQorCXVwKCZ4dFthZl0ubXV0ZXgpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CitFWFBPUlRfU1lNQk9MKHh0X2ZpbmRfbWF0Y2gpOworCisvKiBGaW5kIHRhcmdldCwgZ3JhYnMgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCitzdHJ1Y3QgeHRfdGFyZ2V0ICp4dF9maW5kX3RhcmdldChpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQoreworCXN0cnVjdCB4dF90YXJnZXQgKnQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ4dFthZl0ubXV0ZXgpICE9IDApCisJCXJldHVybiBFUlJfUFRSKC1FSU5UUik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZ4dFthZl0udGFyZ2V0LCBsaXN0KSB7CisJCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaWYgKHQtPnJldmlzaW9uID09IHJldmlzaW9uKSB7CisJCQkJaWYgKHRyeV9tb2R1bGVfZ2V0KHQtPm1lKSkgeworCQkJCQl1cCgmeHRbYWZdLm11dGV4KTsKKwkJCQkJcmV0dXJuIHQ7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJZXJyID0gLUVQUk9UT1RZUEU7IC8qIEZvdW5kIHNvbWV0aGluZy4gKi8KKwkJfQorCX0KKwl1cCgmeHRbYWZdLm11dGV4KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorRVhQT1JUX1NZTUJPTCh4dF9maW5kX3RhcmdldCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICp4dF9wcmVmaXhbTlBST1RPXSA9IHsKKwlbQUZfSU5FVF0gCT0gImlwdF8lcyIsCisJW0FGX0lORVQ2XSAJPSAiaXA2dF8lcyIsCisJW05GX0FSUF0JPSAiYXJwdF8lcyIsCit9OworCitzdHJ1Y3QgeHRfdGFyZ2V0ICp4dF9yZXF1ZXN0X2ZpbmRfdGFyZ2V0KGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCit7CisJc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0OworCisJdGFyZ2V0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YXJnZXQoYWYsIG5hbWUsIHJldmlzaW9uKSwKKwkJCQkJIHh0X3ByZWZpeFthZl0sIG5hbWUpOworCWlmIChJU19FUlIodGFyZ2V0KSB8fCAhdGFyZ2V0KQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdGFyZ2V0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoeHRfcmVxdWVzdF9maW5kX3RhcmdldCk7CisKK3N0YXRpYyBpbnQgbWF0Y2hfcmV2Zm4oaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50ICpiZXN0cCkKK3sKKwlzdHJ1Y3QgeHRfbWF0Y2ggKm07CisJaW50IGhhdmVfcmV2ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgJnh0W2FmXS5tYXRjaCwgbGlzdCkgeworCQlpZiAoc3RyY21wKG0tPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCWlmIChtLT5yZXZpc2lvbiA+ICpiZXN0cCkKKwkJCQkqYmVzdHAgPSBtLT5yZXZpc2lvbjsKKwkJCWlmIChtLT5yZXZpc2lvbiA9PSByZXZpc2lvbikKKwkJCQloYXZlX3JldiA9IDE7CisJCX0KKwl9CisJcmV0dXJuIGhhdmVfcmV2OworfQorCitzdGF0aWMgaW50IHRhcmdldF9yZXZmbihpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLCBpbnQgKmJlc3RwKQoreworCXN0cnVjdCB4dF90YXJnZXQgKnQ7CisJaW50IGhhdmVfcmV2ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJnh0W2FmXS50YXJnZXQsIGxpc3QpIHsKKwkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlpZiAodC0+cmV2aXNpb24gPiAqYmVzdHApCisJCQkJKmJlc3RwID0gdC0+cmV2aXNpb247CisJCQlpZiAodC0+cmV2aXNpb24gPT0gcmV2aXNpb24pCisJCQkJaGF2ZV9yZXYgPSAxOworCQl9CisJfQorCXJldHVybiBoYXZlX3JldjsKK30KKworLyogUmV0dXJucyB0cnVlIG9yIGZhbHNlIChpZiBubyBzdWNoIGV4dGVuc2lvbiBhdCBhbGwpICovCitpbnQgeHRfZmluZF9yZXZpc2lvbihpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLCBpbnQgdGFyZ2V0LAorCQkgICAgIGludCAqZXJyKQoreworCWludCBoYXZlX3JldiwgYmVzdCA9IC0xOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmeHRbYWZdLm11dGV4KSAhPSAwKSB7CisJCSplcnIgPSAtRUlOVFI7CisJCXJldHVybiAxOworCX0KKwlpZiAodGFyZ2V0ID09IDEpCisJCWhhdmVfcmV2ID0gdGFyZ2V0X3JldmZuKGFmLCBuYW1lLCByZXZpc2lvbiwgJmJlc3QpOworCWVsc2UKKwkJaGF2ZV9yZXYgPSBtYXRjaF9yZXZmbihhZiwgbmFtZSwgcmV2aXNpb24sICZiZXN0KTsKKwl1cCgmeHRbYWZdLm11dGV4KTsKKworCS8qIE5vdGhpbmcgYXQgYWxsPyAgUmV0dXJuIDAgdG8gdHJ5IGxvYWRpbmcgbW9kdWxlLiAqLworCWlmIChiZXN0ID09IC0xKSB7CisJCSplcnIgPSAtRU5PRU5UOworCQlyZXR1cm4gMDsKKwl9CisKKwkqZXJyID0gYmVzdDsKKwlpZiAoIWhhdmVfcmV2KQorCQkqZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X2ZpbmRfcmV2aXNpb24pOworCitzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqeHRfYWxsb2NfdGFibGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbzsKKwlpbnQgY3B1OworCisJLyogUGVkYW50cnk6IHByZXZlbnQgdGhlbSBmcm9tIGhpdHRpbmcgQlVHKCkgaW4gdm1hbGxvYy5jIC0tUlIgKi8KKwlpZiAoKFNNUF9BTElHTihzaXplKSA+PiBQQUdFX1NISUZUKSArIDIgPiBudW1fcGh5c3BhZ2VzKQorCQlyZXR1cm4gTlVMTDsKKworCW5ld2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeHRfdGFibGVfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghbmV3aW5mbykKKwkJcmV0dXJuIE5VTEw7CisKKwluZXdpbmZvLT5zaXplID0gc2l6ZTsKKworCWZvcl9lYWNoX2NwdShjcHUpIHsKKwkJaWYgKHNpemUgPD0gUEFHRV9TSVpFKQorCQkJbmV3aW5mby0+ZW50cmllc1tjcHVdID0ga21hbGxvY19ub2RlKHNpemUsCisJCQkJCQkJR0ZQX0tFUk5FTCwKKwkJCQkJCQljcHVfdG9fbm9kZShjcHUpKTsKKwkJZWxzZQorCQkJbmV3aW5mby0+ZW50cmllc1tjcHVdID0gdm1hbGxvY19ub2RlKHNpemUsCisJCQkJCQkJY3B1X3RvX25vZGUoY3B1KSk7CisKKwkJaWYgKG5ld2luZm8tPmVudHJpZXNbY3B1XSA9PSBOVUxMKSB7CisJCQl4dF9mcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBuZXdpbmZvOworfQorRVhQT1JUX1NZTUJPTCh4dF9hbGxvY190YWJsZV9pbmZvKTsKKwordm9pZCB4dF9mcmVlX3RhYmxlX2luZm8oc3RydWN0IHh0X3RhYmxlX2luZm8gKmluZm8pCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX2NwdShjcHUpIHsKKwkJaWYgKGluZm8tPnNpemUgPD0gUEFHRV9TSVpFKQorCQkJa2ZyZWUoaW5mby0+ZW50cmllc1tjcHVdKTsKKwkJZWxzZQorCQkJdmZyZWUoaW5mby0+ZW50cmllc1tjcHVdKTsKKwl9CisJa2ZyZWUoaW5mbyk7Cit9CitFWFBPUlRfU1lNQk9MKHh0X2ZyZWVfdGFibGVfaW5mbyk7CisKKy8qIEZpbmQgdGFibGUgYnkgbmFtZSwgZ3JhYnMgbXV0ZXggJiByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KK3N0cnVjdCB4dF90YWJsZSAqeHRfZmluZF90YWJsZV9sb2NrKGludCBhZiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgeHRfdGFibGUgKnQ7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ4dFthZl0ubXV0ZXgpICE9IDApCisJCXJldHVybiBFUlJfUFRSKC1FSU5UUik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZ4dFthZl0udGFibGVzLCBsaXN0KQorCQlpZiAoc3RyY21wKHQtPm5hbWUsIG5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQodC0+bWUpKQorCQkJcmV0dXJuIHQ7CisJdXAoJnh0W2FmXS5tdXRleCk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4dF9maW5kX3RhYmxlX2xvY2spOworCit2b2lkIHh0X3RhYmxlX3VubG9jayhzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKQoreworCXVwKCZ4dFt0YWJsZS0+YWZdLm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X3RhYmxlX3VubG9jayk7CisKKworc3RydWN0IHh0X3RhYmxlX2luZm8gKgoreHRfcmVwbGFjZV90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAorCSAgICAgIHVuc2lnbmVkIGludCBudW1fY291bnRlcnMsCisJICAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sCisJICAgICAgaW50ICplcnJvcikKK3sKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqb2xkaW5mbywgKnByaXZhdGU7CisKKwkvKiBEbyB0aGUgc3Vic3RpdHV0aW9uLiAqLworCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKwlwcml2YXRlID0gdGFibGUtPnByaXZhdGU7CisJLyogQ2hlY2sgaW5zaWRlIGxvY2s6IGlzIHRoZSBvbGQgbnVtYmVyIGNvcnJlY3Q/ICovCisJaWYgKG51bV9jb3VudGVycyAhPSBwcml2YXRlLT5udW1iZXIpIHsKKwkJZHVwcmludGYoIm51bV9jb3VudGVycyAhPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyICgldS8ldSlcbiIsCisJCQkgbnVtX2NvdW50ZXJzLCBwcml2YXRlLT5udW1iZXIpOworCQl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKwkJKmVycm9yID0gLUVBR0FJTjsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW9sZGluZm8gPSBwcml2YXRlOworCXRhYmxlLT5wcml2YXRlID0gbmV3aW5mbzsKKwluZXdpbmZvLT5pbml0aWFsX2VudHJpZXMgPSBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXM7CisJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CisKKwlyZXR1cm4gb2xkaW5mbzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X3JlcGxhY2VfdGFibGUpOworCitpbnQgeHRfcmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSwKKwkJICAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKmJvb3RzdHJhcCwKKwkJICAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKKworCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmeHRbdGFibGUtPmFmXS5tdXRleCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJLyogRG9uJ3QgYXV0b2xvYWQ6IHdlJ2QgZWF0IG91ciB0YWlsLi4uICovCisJaWYgKGxpc3RfbmFtZWRfZmluZCgmeHRbdGFibGUtPmFmXS50YWJsZXMsIHRhYmxlLT5uYW1lKSkgeworCQlyZXQgPSAtRUVYSVNUOworCQlnb3RvIHVubG9jazsKKwl9CisKKwkvKiBTaW1wbGlmaWVzIHJlcGxhY2VfdGFibGUgY29kZS4gKi8KKwl0YWJsZS0+cHJpdmF0ZSA9IGJvb3RzdHJhcDsKKwlpZiAoIXh0X3JlcGxhY2VfdGFibGUodGFibGUsIDAsIG5ld2luZm8sICZyZXQpKQorCQlnb3RvIHVubG9jazsKKworCXByaXZhdGUgPSB0YWJsZS0+cHJpdmF0ZTsKKwlkdXByaW50ZigidGFibGUtPnByaXZhdGUtPm51bWJlciA9ICV1XG4iLCBwcml2YXRlLT5udW1iZXIpOworCisJLyogc2F2ZSBudW1iZXIgb2YgaW5pdGlhbCBlbnRyaWVzICovCisJcHJpdmF0ZS0+aW5pdGlhbF9lbnRyaWVzID0gcHJpdmF0ZS0+bnVtYmVyOworCisJcndsb2NrX2luaXQoJnRhYmxlLT5sb2NrKTsKKwlsaXN0X3ByZXBlbmQoJnh0W3RhYmxlLT5hZl0udGFibGVzLCB0YWJsZSk7CisKKwlyZXQgPSAwOworIHVubG9jazoKKwl1cCgmeHRbdGFibGUtPmFmXS5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X3JlZ2lzdGVyX3RhYmxlKTsKKwordm9pZCAqeHRfdW5yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKQoreworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOworCisJZG93bigmeHRbdGFibGUtPmFmXS5tdXRleCk7CisJcHJpdmF0ZSA9IHRhYmxlLT5wcml2YXRlOworCUxJU1RfREVMRVRFKCZ4dFt0YWJsZS0+YWZdLnRhYmxlcywgdGFibGUpOworCXVwKCZ4dFt0YWJsZS0+YWZdLm11dGV4KTsKKworCXJldHVybiBwcml2YXRlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeHRfdW5yZWdpc3Rlcl90YWJsZSk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGNoYXIgKnh0X3Byb3RvX3ByZWZpeFtOUFJPVE9dID0geworCVtBRl9JTkVUXQk9ICJpcCIsCisJW0FGX0lORVQ2XQk9ICJpcDYiLAorCVtORl9BUlBdCT0gImFycCIsCit9OworCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqeHRfZ2V0X2lkeChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gbGlzdC0+bmV4dDsKKworCWlmICghaGVhZCB8fCBsaXN0X2VtcHR5KGxpc3QpKQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlIChwb3MgJiYgKGhlYWQgPSBoZWFkLT5uZXh0KSkgeworCQlpZiAoaGVhZCA9PSBsaXN0KQorCQkJcmV0dXJuIE5VTEw7CisJCXBvcy0tOworCX0KKwlyZXR1cm4gcG9zID8gTlVMTCA6IGhlYWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICp0eXBlMmxpc3QodV9pbnQxNl90IGFmLCB1X2ludDE2X3QgdHlwZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBUQVJHRVQ6CisJCWxpc3QgPSAmeHRbYWZdLnRhcmdldDsKKwkJYnJlYWs7CisJY2FzZSBNQVRDSDoKKwkJbGlzdCA9ICZ4dFthZl0ubWF0Y2g7CisJCWJyZWFrOworCWNhc2UgVEFCTEU6CisJCWxpc3QgPSAmeHRbYWZdLnRhYmxlczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGlzdCA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCXJldHVybiBsaXN0OworfQorCitzdGF0aWMgdm9pZCAqeHRfdGd0X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSAoc3RydWN0IHByb2NfZGlyX2VudHJ5ICopIHNlcS0+cHJpdmF0ZTsKKwl1X2ludDE2X3QgYWYgPSAodW5zaWduZWQgbG9uZylwZGUtPmRhdGEgJiAweGZmZmY7CisJdV9pbnQxNl90IHR5cGUgPSAodW5zaWduZWQgbG9uZylwZGUtPmRhdGEgPj4gMTY7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworCWlmIChhZiA+PSBOUFJPVE8pCisJCXJldHVybiBOVUxMOworCisJbGlzdCA9IHR5cGUybGlzdChhZiwgdHlwZSk7CisJaWYgKCFsaXN0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnh0W2FmXS5tdXRleCkgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJCisJcmV0dXJuIHh0X2dldF9pZHgobGlzdCwgc2VxLCAqcG9zKTsKK30KKworc3RhdGljIHZvaWQgKnh0X3RndF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBzZXEtPnByaXZhdGU7CisJdV9pbnQxNl90IGFmID0gKHVuc2lnbmVkIGxvbmcpcGRlLT5kYXRhICYgMHhmZmZmOworCXVfaW50MTZfdCB0eXBlID0gKHVuc2lnbmVkIGxvbmcpcGRlLT5kYXRhID4+IDE2OworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisKKwlpZiAoYWYgPj0gTlBST1RPKQorCQlyZXR1cm4gTlVMTDsKKwkKKwlsaXN0ID0gdHlwZTJsaXN0KGFmLCB0eXBlKTsKKwlpZiAoIWxpc3QpCisJCXJldHVybiBOVUxMOworCisJKCpwb3MpKys7CisJcmV0dXJuIHh0X2dldF9pZHgobGlzdCwgc2VxLCAqcG9zKTsKK30KKworc3RhdGljIHZvaWQgeHRfdGd0X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gc2VxLT5wcml2YXRlOworCXVfaW50MTZfdCBhZiA9ICh1bnNpZ25lZCBsb25nKXBkZS0+ZGF0YSAmIDB4ZmZmZjsKKworCXVwKCZ4dFthZl0ubXV0ZXgpOworfQorCitzdGF0aWMgaW50IHh0X25hbWVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJY2hhciAqbmFtZSA9IChjaGFyICopdiArIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKTsKKworCWlmIChzdHJsZW4obmFtZSkpCisJCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCBuYW1lKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHh0X3RndF9zZXFfb3BzID0geworCS5zdGFydAk9IHh0X3RndF9zZXFfc3RhcnQsCisJLm5leHQJPSB4dF90Z3Rfc2VxX25leHQsCisJLnN0b3AJPSB4dF90Z3Rfc2VxX3N0b3AsCisJLnNob3cJPSB4dF9uYW1lX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCB4dF90Z3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc2VxX29wZW4oZmlsZSwgJnh0X3RndF9zZXFfb3BzKTsKKwlpZiAoIXJldCkgeworCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoaW5vZGUpOworCisJCXNlcS0+cHJpdmF0ZSA9IHBkZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB4dF9maWxlX29wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4JID0geHRfdGd0X29wZW4sCisJLnJlYWQJID0gc2VxX3JlYWQsCisJLmxsc2VlawkgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKyNkZWZpbmUgRk9STUFUX1RBQkxFUwkiX3RhYmxlc19uYW1lcyIKKyNkZWZpbmUJRk9STUFUX01BVENIRVMJIl90YWJsZXNfbWF0Y2hlcyIKKyNkZWZpbmUgRk9STUFUX1RBUkdFVFMgCSJfdGFibGVzX3RhcmdldHMiCisKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCitpbnQgeHRfcHJvdG9faW5pdChpbnQgYWYpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwljaGFyIGJ1ZltYVF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CisjZW5kaWYKKworCWlmIChhZiA+PSBOUFJPVE8pCisJCXJldHVybiAtRUlOVkFMOworCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNhdChidWYsIEZPUk1BVF9UQUJMRVMsIHNpemVvZihidWYpKTsKKwlwcm9jID0gcHJvY19uZXRfZm9wc19jcmVhdGUoYnVmLCAwNDQwLCAmeHRfZmlsZV9vcHMpOworCWlmICghcHJvYykKKwkJZ290byBvdXQ7CisJcHJvYy0+ZGF0YSA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZykgYWYgfCAoVEFCTEUgPDwgMTYpKTsKKworCisJc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY2F0KGJ1ZiwgRk9STUFUX01BVENIRVMsIHNpemVvZihidWYpKTsKKwlwcm9jID0gcHJvY19uZXRfZm9wc19jcmVhdGUoYnVmLCAwNDQwLCAmeHRfZmlsZV9vcHMpOworCWlmICghcHJvYykKKwkJZ290byBvdXRfcmVtb3ZlX3RhYmxlczsKKwlwcm9jLT5kYXRhID0gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBhZiB8IChNQVRDSCA8PCAxNikpOworCisJc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY2F0KGJ1ZiwgRk9STUFUX1RBUkdFVFMsIHNpemVvZihidWYpKTsKKwlwcm9jID0gcHJvY19uZXRfZm9wc19jcmVhdGUoYnVmLCAwNDQwLCAmeHRfZmlsZV9vcHMpOworCWlmICghcHJvYykKKwkJZ290byBvdXRfcmVtb3ZlX21hdGNoZXM7CisJcHJvYy0+ZGF0YSA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZykgYWYgfCAoVEFSR0VUIDw8IDE2KSk7CisjZW5kaWYKKworCXJldHVybiAwOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK291dF9yZW1vdmVfbWF0Y2hlczoKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjYXQoYnVmLCBGT1JNQVRfTUFUQ0hFUywgc2l6ZW9mKGJ1ZikpOworCXByb2NfbmV0X3JlbW92ZShidWYpOworCitvdXRfcmVtb3ZlX3RhYmxlczoKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjYXQoYnVmLCBGT1JNQVRfVEFCTEVTLCBzaXplb2YoYnVmKSk7CisJcHJvY19uZXRfcmVtb3ZlKGJ1Zik7CitvdXQ6CisJcmV0dXJuIC0xOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MX0dQTCh4dF9wcm90b19pbml0KTsKKwordm9pZCB4dF9wcm90b19maW5pKGludCBhZikKK3sKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWNoYXIgYnVmW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOworCisJc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY2F0KGJ1ZiwgRk9STUFUX1RBQkxFUywgc2l6ZW9mKGJ1ZikpOworCXByb2NfbmV0X3JlbW92ZShidWYpOworCisJc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY2F0KGJ1ZiwgRk9STUFUX1RBUkdFVFMsIHNpemVvZihidWYpKTsKKwlwcm9jX25ldF9yZW1vdmUoYnVmKTsKKworCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNhdChidWYsIEZPUk1BVF9NQVRDSEVTLCBzaXplb2YoYnVmKSk7CisJcHJvY19uZXRfcmVtb3ZlKGJ1Zik7CisjZW5kaWYgLypDT05GSUdfUFJPQ19GUyovCit9CitFWFBPUlRfU1lNQk9MX0dQTCh4dF9wcm90b19maW5pKTsKKworCitzdGF0aWMgaW50IF9faW5pdCB4dF9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwl4dCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB4dF9hZikgKiBOUFJPVE8sIEdGUF9LRVJORUwpOworCWlmICgheHQpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IE5QUk9UTzsgaSsrKSB7CisJCWluaXRfTVVURVgoJnh0W2ldLm11dGV4KTsKKwkJSU5JVF9MSVNUX0hFQUQoJnh0W2ldLnRhcmdldCk7CisJCUlOSVRfTElTVF9IRUFEKCZ4dFtpXS5tYXRjaCk7CisJCUlOSVRfTElTVF9IRUFEKCZ4dFtpXS50YWJsZXMpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHh0X2Zpbmkodm9pZCkKK3sKKwlrZnJlZSh4dCk7Cit9CisKK21vZHVsZV9pbml0KHh0X2luaXQpOworbW9kdWxlX2V4aXQoeHRfZmluaSk7CisKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xBU1NJRlkuYyBiL25ldC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuYwpzaW1pbGFyaXR5IGluZGV4IDY2JQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMQVNTSUZZLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuYwppbmRleCBkYWI3OGQ4Li43OGVlMjY2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMQVNTSUZZLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9DTEFTU0lGWS5jCkBAIC0xNSwxMiArMTUsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NMQVNTSUZZLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmg+CiAKIE1PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBxZGlzYyBjbGFzc2lmaWNhdGlvbiB0YXJnZXQgbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9DTEFTU0lGWSIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50CiB0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLApAQCAtMzAsMjUgKzMxLDI1IEBACiAgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCiAgICAgICAgdm9pZCAqdXNlcmluZm8pCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9jbGFzc2lmeV90YXJnZXRfaW5mbyAqY2xpbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IHh0X2NsYXNzaWZ5X3RhcmdldF9pbmZvICpjbGluZm8gPSB0YXJnaW5mbzsKIAotCWlmKCgqcHNrYiktPnByaW9yaXR5ICE9IGNsaW5mby0+cHJpb3JpdHkpIAorCWlmICgoKnBza2IpLT5wcmlvcml0eSAhPSBjbGluZm8tPnByaW9yaXR5KQogCQkoKnBza2IpLT5wcmlvcml0eSA9IGNsaW5mby0+cHJpb3JpdHk7CiAKLQlyZXR1cm4gSVBUX0NPTlRJTlVFOworCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisgICAgICAgICAgIGNvbnN0IHZvaWQgKmUsCiAgICAgICAgICAgIHZvaWQgKnRhcmdpbmZvLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewotCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2NsYXNzaWZ5X3RhcmdldF9pbmZvKSkpeworCWlmICh0YXJnaW5mb3NpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9jbGFzc2lmeV90YXJnZXRfaW5mbykpKXsKIAkJcHJpbnRrKEtFUk5fRVJSICJDTEFTU0lGWTogaW52YWxpZCBzaXplICgldSAhPSAlWnUpLlxuIiwKIAkJICAgICAgIHRhcmdpbmZvc2l6ZSwKLQkJICAgICAgIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9jbGFzc2lmeV90YXJnZXRfaW5mbykpKTsKKwkJICAgICAgIFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8pKSk7CiAJCXJldHVybiAwOwogCX0KIAkKQEAgLTY5LDIxICs3MCwzOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X2NsYXNzaWZ5X3JlZyA9IHsgCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBjbGFzc2lmeV9yZWcgPSB7IAorCS5uYW1lIAkJPSAiQ0xBU1NJRlkiLCAKKwkudGFyZ2V0IAk9IHRhcmdldCwKKwkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCisJLm1lIAkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBjbGFzc2lmeTZfcmVnID0geyAKIAkubmFtZSAJCT0gIkNMQVNTSUZZIiwgCiAJLnRhcmdldCAJPSB0YXJnZXQsCiAJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAogCS5tZSAJCT0gVEhJU19NT0RVTEUsCiB9OwogCisKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X2NsYXNzaWZ5X3JlZyk7CisJaW50IHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmY2xhc3NpZnlfcmVnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmY2xhc3NpZnk2X3JlZyk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmNsYXNzaWZ5X3JlZyk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X2NsYXNzaWZ5X3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmNsYXNzaWZ5X3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZjbGFzc2lmeTZfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NPTk5NQVJLLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMKc2ltaWxhcml0eSBpbmRleCA3MyUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DT05OTUFSSy5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMKaW5kZXggOGFjYWM1YS4uMjI1MDZlMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DT05OTUFSSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYwpAQCAtMjYsOSArMjYsMTAgQEAKIE1PRFVMRV9BVVRIT1IoIkhlbnJpayBOb3Jkc3Ryb20gPGhub0BtYXJhc3l0ZW1zLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIENPTk5NQVJLIG1hdGNoaW5nIG1vZHVsZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcHRfQ09OTk1BUksiKTsKIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DT05OTUFSSy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgogCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC0zOSw3ICs0MCw3IEBACiAgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCiAgICAgICAgdm9pZCAqdXNlcmluZm8pCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9jb25ubWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8gKm1hcmtpbmZvID0gdGFyZ2luZm87CiAJdV9pbnQzMl90IGRpZmY7CiAJdV9pbnQzMl90IG5mbWFyazsKIAl1X2ludDMyX3QgbmV3bWFyazsKQEAgLTQ4LDE3ICs0OSwxNyBAQAogCiAJaWYgKGN0bWFyaykgewogCSAgICBzd2l0Y2gobWFya2luZm8tPm1vZGUpIHsKLQkgICAgY2FzZSBJUFRfQ09OTk1BUktfU0VUOgorCSAgICBjYXNlIFhUX0NPTk5NQVJLX1NFVDoKIAkJbmV3bWFyayA9ICgqY3RtYXJrICYgfm1hcmtpbmZvLT5tYXNrKSB8IG1hcmtpbmZvLT5tYXJrOwogCQlpZiAobmV3bWFyayAhPSAqY3RtYXJrKQogCQkgICAgKmN0bWFyayA9IG5ld21hcms7CiAJCWJyZWFrOwotCSAgICBjYXNlIElQVF9DT05OTUFSS19TQVZFOgorCSAgICBjYXNlIFhUX0NPTk5NQVJLX1NBVkU6CiAJCW5ld21hcmsgPSAoKmN0bWFyayAmIH5tYXJraW5mby0+bWFzaykgfCAoKCpwc2tiKS0+bmZtYXJrICYgbWFya2luZm8tPm1hc2spOwogCQlpZiAoKmN0bWFyayAhPSBuZXdtYXJrKQogCQkgICAgKmN0bWFyayA9IG5ld21hcms7CiAJCWJyZWFrOwotCSAgICBjYXNlIElQVF9DT05OTUFSS19SRVNUT1JFOgorCSAgICBjYXNlIFhUX0NPTk5NQVJLX1JFU1RPUkU6CiAJCW5mbWFyayA9ICgqcHNrYiktPm5mbWFyazsKIAkJZGlmZiA9ICgqY3RtYXJrIF4gbmZtYXJrKSAmIG1hcmtpbmZvLT5tYXNrOwogCQlpZiAoZGlmZiAhPSAwKQpAQCAtNjcsMjUgKzY4LDI1IEBACiAJICAgIH0KIAl9CiAKLQlyZXR1cm4gSVBUX0NPTlRJTlVFOworCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkgICBjb25zdCB2b2lkICplbnRyeSwKIAkgICB2b2lkICp0YXJnaW5mbywKIAkgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0Jc3RydWN0IGlwdF9jb25ubWFya190YXJnZXRfaW5mbyAqbWF0Y2hpbmZvID0gdGFyZ2luZm87Ci0JaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY29ubm1hcmtfdGFyZ2V0X2luZm8pKSkgeworCXN0cnVjdCB4dF9jb25ubWFya190YXJnZXRfaW5mbyAqbWF0Y2hpbmZvID0gdGFyZ2luZm87CisJaWYgKHRhcmdpbmZvc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2Nvbm5tYXJrX3RhcmdldF9pbmZvKSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ09OTk1BUks6IHRhcmdpbmZvc2l6ZSAldSAhPSAlWnVcbiIsCiAJCSAgICAgICB0YXJnaW5mb3NpemUsCi0JCSAgICAgICBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY29ubm1hcmtfdGFyZ2V0X2luZm8pKSk7CisJCSAgICAgICBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2Nvbm5tYXJrX3RhcmdldF9pbmZvKSkpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAobWF0Y2hpbmZvLT5tb2RlID09IElQVF9DT05OTUFSS19SRVNUT1JFKSB7CisJaWYgKG1hdGNoaW5mby0+bW9kZSA9PSBYVF9DT05OTUFSS19SRVNUT1JFKSB7CiAJICAgIGlmIChzdHJjbXAodGFibGVuYW1lLCAibWFuZ2xlIikgIT0gMCkgewogCQkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiQ09OTk1BUks6IHJlc3RvcmUgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwgdGFibGVuYW1lKTsKIAkJICAgIHJldHVybiAwOwpAQCAtMTAwLDcgKzEwMSwxMyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X2Nvbm5tYXJrX3JlZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGNvbm5tYXJrX3JlZyA9IHsKKwkubmFtZSA9ICJDT05OTUFSSyIsCisJLnRhcmdldCA9ICZ0YXJnZXQsCisJLmNoZWNrZW50cnkgPSAmY2hlY2tlbnRyeSwKKwkubWUgPSBUSElTX01PRFVMRQorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGNvbm5tYXJrNl9yZWcgPSB7CiAJLm5hbWUgPSAiQ09OTk1BUksiLAogCS50YXJnZXQgPSAmdGFyZ2V0LAogCS5jaGVja2VudHJ5ID0gJmNoZWNrZW50cnksCkBAIC0xMDksMTMgKzExNiwyNSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JbmVlZF9pcF9jb25udHJhY2soKTsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X2Nvbm5tYXJrX3JlZyk7CisJaW50IHJldDsKKworCW5lZWRfY29ubnRyYWNrKCk7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmNvbm5tYXJrX3JlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmNvbm5tYXJrNl9yZWcpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZjb25ubWFya19yZWcpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9jb25ubWFya19yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZjb25ubWFya19yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmY29ubm1hcms2X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVJLLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X01BUksuYwpzaW1pbGFyaXR5IGluZGV4IDYxJQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BUksuYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9NQVJLLmMKaW5kZXggNTJiNGYyYy4uMGMxMWVlOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVJLLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9NQVJLLmMKQEAgLTEyLDEyICsxMiwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTUFSSy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9NQVJLLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBNQVJLIG1vZGlmaWNhdGlvbiBtb2R1bGUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXBbNl10YWJsZXMgTUFSSyBtb2RpZmljYXRpb24gbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9NQVJLIik7CitNT0RVTEVfQUxJQVMoImlwNnRfTUFSSyIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50CiB0YXJnZXRfdjAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLApAQCAtMjcsMTIgKzI5LDEyIEBACiAJICBjb25zdCB2b2lkICp0YXJnaW5mbywKIAkgIHZvaWQgKnVzZXJpbmZvKQogewotCWNvbnN0IHN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKIAogCWlmKCgqcHNrYiktPm5mbWFyayAhPSBtYXJraW5mby0+bWFyaykKIAkJKCpwc2tiKS0+bmZtYXJrID0gbWFya2luZm8tPm1hcms7CiAKLQlyZXR1cm4gSVBUX0NPTlRJTlVFOworCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludApAQCAtNDMsMTkgKzQ1LDE5IEBACiAJICBjb25zdCB2b2lkICp0YXJnaW5mbywKIAkgIHZvaWQgKnVzZXJpbmZvKQogewotCWNvbnN0IHN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mb192MSAqbWFya2luZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mb192MSAqbWFya2luZm8gPSB0YXJnaW5mbzsKIAlpbnQgbWFyayA9IDA7CiAKIAlzd2l0Y2ggKG1hcmtpbmZvLT5tb2RlKSB7Ci0JY2FzZSBJUFRfTUFSS19TRVQ6CisJY2FzZSBYVF9NQVJLX1NFVDoKIAkJbWFyayA9IG1hcmtpbmZvLT5tYXJrOwogCQlicmVhazsKIAkJCi0JY2FzZSBJUFRfTUFSS19BTkQ6CisJY2FzZSBYVF9NQVJLX0FORDoKIAkJbWFyayA9ICgqcHNrYiktPm5mbWFyayAmIG1hcmtpbmZvLT5tYXJrOwogCQlicmVhazsKIAkJCi0JY2FzZSBJUFRfTUFSS19PUjoKKwljYXNlIFhUX01BUktfT1I6CiAJCW1hcmsgPSAoKnBza2IpLT5uZm1hcmsgfCBtYXJraW5mby0+bWFyazsKIAkJYnJlYWs7CiAJfQpAQCAtNjMsMjMgKzY1LDIzIEBACiAJaWYoKCpwc2tiKS0+bmZtYXJrICE9IG1hcmspCiAJCSgqcHNrYiktPm5mbWFyayA9IG1hcms7CiAKLQlyZXR1cm4gSVBUX0NPTlRJTlVFOworCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5X3YwKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCSAgICAgIGNvbnN0IHZvaWQgKmVudHJ5LAogCSAgICAgIHZvaWQgKnRhcmdpbmZvLAogCSAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQlzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm8gKm1hcmtpbmZvID0gdGFyZ2luZm87CisJc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm8gKm1hcmtpbmZvID0gdGFyZ2luZm87CiAKLQlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvKSkpIHsKKwlpZiAodGFyZ2luZm9zaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mbykpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1BUks6IHRhcmdpbmZvc2l6ZSAldSAhPSAlWnVcbiIsCiAJCSAgICAgICB0YXJnaW5mb3NpemUsCi0JCSAgICAgICBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mbykpKTsKKwkJICAgICAgIFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mbykpKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC05OCwxNyArMTAwLDE3IEBACiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnlfdjEoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgICAgY29uc3Qgdm9pZCAqZW50cnksCiAJICAgICAgdm9pZCAqdGFyZ2luZm8sCiAJICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewotCXN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mb192MSAqbWFya2luZm8gPSB0YXJnaW5mbzsKKwlzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mb192MSAqbWFya2luZm8gPSB0YXJnaW5mbzsKIAotCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm9fdjEpKSl7CisJaWYgKHRhcmdpbmZvc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm9fdjEpKSl7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1BUks6IHRhcmdpbmZvc2l6ZSAldSAhPSAlWnVcbiIsCiAJCSAgICAgICB0YXJnaW5mb3NpemUsCi0JCSAgICAgICBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mb192MSkpKTsKKwkJICAgICAgIFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mb192MSkpKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMTcsOSArMTE5LDkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKG1hcmtpbmZvLT5tb2RlICE9IElQVF9NQVJLX1NFVAotCSAgICAmJiBtYXJraW5mby0+bW9kZSAhPSBJUFRfTUFSS19BTkQKLQkgICAgJiYgbWFya2luZm8tPm1vZGUgIT0gSVBUX01BUktfT1IpIHsKKwlpZiAobWFya2luZm8tPm1vZGUgIT0gWFRfTUFSS19TRVQKKwkgICAgJiYgbWFya2luZm8tPm1vZGUgIT0gWFRfTUFSS19BTkQKKwkgICAgJiYgbWFya2luZm8tPm1vZGUgIT0gWFRfTUFSS19PUikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJNQVJLOiB1bmtub3duIG1vZGUgJXVcbiIsCiAJCSAgICAgICBtYXJraW5mby0+bW9kZSk7CiAJCXJldHVybiAwOwpAQCAtMTMzLDcgKzEzNSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfbWFya19yZWdfdjAgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfbWFya19yZWdfdjAgPSB7CiAJLm5hbWUJCT0gIk1BUksiLAogCS50YXJnZXQJCT0gdGFyZ2V0X3YwLAogCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeV92MCwKQEAgLTE0MSw3ICsxNDMsNyBAQAogCS5yZXZpc2lvbgk9IDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X21hcmtfcmVnX3YxID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X21hcmtfcmVnX3YxID0gewogCS5uYW1lCQk9ICJNQVJLIiwKIAkudGFyZ2V0CQk9IHRhcmdldF92MSwKIAkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnlfdjEsCkBAIC0xNDksMjMgKzE1MSw0MCBAQAogCS5yZXZpc2lvbgk9IDEsCiB9OwogCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcDZ0X21hcmtfcmVnX3YwID0geworCS5uYW1lCQk9ICJNQVJLIiwKKwkudGFyZ2V0CQk9IHRhcmdldF92MCwKKwkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnlfdjAsCisJLm1lCQk9IFRISVNfTU9EVUxFLAorCS5yZXZpc2lvbgk9IDAsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9tYXJrX3JlZ192MCk7Ci0JaWYgKCFlcnIpIHsKLQkJZXJyID0gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X21hcmtfcmVnX3YxKTsKLQkJaWYgKGVycikKLQkJCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X21hcmtfcmVnX3YwKTsKKwllcnIgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9tYXJrX3JlZ192MCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X21hcmtfcmVnX3YxKTsKKwlpZiAoZXJyKQorCQl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X21hcmtfcmVnX3YwKTsKKworCWVyciA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfbWFya19yZWdfdjApOworCWlmIChlcnIpIHsKKwkJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9tYXJrX3JlZ192MCk7CisJCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfbWFya19yZWdfdjEpOwogCX0KKwogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbWFya19yZWdfdjApOwotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X21hcmtfcmVnX3YxKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X21hcmtfcmVnX3YwKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X21hcmtfcmVnX3YxKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfbWFya19yZWdfdjApOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfTkZRVUVVRS5jIGIvbmV0L25ldGZpbHRlci94dF9ORlFVRVVFLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3NmI2ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfTkZRVUVVRS5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiBpcHRhYmxlcyBtb2R1bGUgZm9yIHVzaW5nIG5ldyBuZXRmaWx0ZXIgbmV0bGluayBxdWV1ZQorICoKKyAqIChDKSAyMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyAKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9ORlFVRVVFLmg+CisKK01PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJbaXAsaXA2LGFycF1fdGFibGVzIE5GUVVFVUUgdGFyZ2V0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwdF9ORlFVRVVFIik7CitNT0RVTEVfQUxJQVMoImlwNnRfTkZRVUVVRSIpOworTU9EVUxFX0FMSUFTKCJhcnB0X05GUVVFVUUiKTsKKworc3RhdGljIHVuc2lnbmVkIGludAordGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKKyAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKKyAgICAgICB2b2lkICp1c2VyaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgeHRfTkZRX2luZm8gKnRpbmZvID0gdGFyZ2luZm87CisKKwlyZXR1cm4gTkZfUVVFVUVfTlIodGluZm8tPnF1ZXVlbnVtKTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgdm9pZCAqZW50cnksCisgICAgICAgICAgIHZvaWQgKnRhcmdpbmZvLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWlmICh0YXJnaW5mb3NpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9ORlFfaW5mbykpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUVVFVUU6IHRhcmdpbmZvc2l6ZSAldSAhPSAlWnVcbiIsCisJCSAgICAgICB0YXJnaW5mb3NpemUsCisJCSAgICAgICBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X05GUV9pbmZvKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X05GUV9yZWcgPSB7CisJLm5hbWUJCT0gIk5GUVVFVUUiLAorCS50YXJnZXQJCT0gdGFyZ2V0LAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcDZ0X05GUV9yZWcgPSB7CisJLm5hbWUJCT0gIk5GUVVFVUUiLAorCS50YXJnZXQJCT0gdGFyZ2V0LAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBhcnB0X05GUV9yZWcgPSB7CisJLm5hbWUJCT0gIk5GUVVFVUUiLAorCS50YXJnZXQJCT0gdGFyZ2V0LAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9ORlFfcmVnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfTkZRX3JlZyk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfaXA7CisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KE5GX0FSUCwgJmFycHRfTkZRX3JlZyk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfaXA2OworCisJcmV0dXJuIHJldDsKK291dF9pcDY6CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X05GUV9yZWcpOworb3V0X2lwOgorCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfTkZRX3JlZyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KE5GX0FSUCwgJmFycHRfTkZRX3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X05GUV9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfTkZRX3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05PVFJBQ0suYyBiL25ldC9uZXRmaWx0ZXIveHRfTk9UUkFDSy5jCnNpbWlsYXJpdHkgaW5kZXggNjklCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfTk9UUkFDSy5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X05PVFJBQ0suYwppbmRleCBlM2M2OWQwLi4yNGQ0NzdhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05PVFJBQ0suYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X05PVFJBQ0suYwpAQCAtNCw5ICs0LDEyIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KIAorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcHRfTk9UUkFDSyIpOworCiBzdGF0aWMgdW5zaWduZWQgaW50CiB0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAogICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKQEAgLTE3LDcgKzIwLDcgQEAKIHsKIAkvKiBQcmV2aW91c2x5IHNlZW4gKGxvb3BiYWNrKT8gSWdub3JlLiAqLwogCWlmICgoKnBza2IpLT5uZmN0ICE9IE5VTEwpCi0JCXJldHVybiBJUFRfQ09OVElOVUU7CisJCXJldHVybiBYVF9DT05USU5VRTsKIAogCS8qIEF0dGFjaCBmYWtlIGNvbm50cmFjayBlbnRyeS4gCiAJICAgSWYgdGhlcmUgaXMgYSByZWFsIGN0IGVudHJ5IGNvcnJlc3BvbmRpZyB0byB0aGlzIHBhY2tldCwgCkBAIC0yNywxMiArMzAsMTIgQEAKIAkoKnBza2IpLT5uZmN0aW5mbyA9IElQX0NUX05FVzsKIAluZl9jb25udHJhY2tfZ2V0KCgqcHNrYiktPm5mY3QpOwogCi0JcmV0dXJuIElQVF9DT05USU5VRTsKKwlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgY29uc3Qgdm9pZCAqZW50cnksCiAgICAgICAgICAgIHZvaWQgKnRhcmdpbmZvLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpAQCAtNTEsMjYgKzU0LDM5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfbm90cmFja19yZWcgPSB7IAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgbm90cmFja19yZWcgPSB7IAogCS5uYW1lID0gIk5PVFJBQ0siLCAKIAkudGFyZ2V0ID0gdGFyZ2V0LCAKIAkuY2hlY2tlbnRyeSA9IGNoZWNrZW50cnksCi0JLm1lID0gVEhJU19NT0RVTEUgCisJLm1lID0gVEhJU19NT0RVTEUsCit9Oworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgbm90cmFjazZfcmVnID0geyAKKwkubmFtZSA9ICJOT1RSQUNLIiwgCisJLnRhcmdldCA9IHRhcmdldCwgCisJLmNoZWNrZW50cnkgPSBjaGVja2VudHJ5LAorCS5tZSA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCWlmIChpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbm90cmFja19yZWcpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpbnQgcmV0OwogCi0JcmV0dXJuIDA7CisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZub3RyYWNrX3JlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJm5vdHJhY2s2X3JlZyk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJm5vdHJhY2tfcmVnKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbm90cmFja19yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmbm90cmFjazZfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmbm90cmFja19yZWcpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKIG1vZHVsZV9leGl0KGZpbmkpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9jb21tZW50LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2NvbW1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmE2ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9jb21tZW50LmMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIEltcGxlbWVudHMgYSBkdW1teSBtYXRjaCB0byBhbGxvdyBhdHRhY2hpbmcgY29tbWVudHMgdG8gcnVsZXMKKyAqCisgKiAyMDAzLTA1LTEzIEJyYWQgRmlzaGVyIChicmFkQGluZm8tbGluay5uZXQpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb21tZW50Lmg+CisKK01PRFVMRV9BVVRIT1IoIkJyYWQgRmlzaGVyIDxicmFkQGluZm8tbGluay5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIGNvbW1lbnQgbWF0Y2ggbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwdF9jb21tZW50Iik7CitNT0RVTEVfQUxJQVMoImlwNnRfY29tbWVudCIpOworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9vZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJLyogV2UgYWx3YXlzIG1hdGNoICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorICAgICAgICAgICBjb25zdCB2b2lkICppcCwKKyAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCS8qIENoZWNrIHRoZSBzaXplICovCisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2NvbW1lbnRfaW5mbykpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBjb21tZW50X21hdGNoID0geworCS5uYW1lCQk9ICJjb21tZW50IiwKKwkubWF0Y2gJCT0gbWF0Y2gsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRQorfTsKKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBjb21tZW50Nl9tYXRjaCA9IHsKKwkubmFtZQkJPSAiY29tbWVudCIsCisJLm1hdGNoCQk9IG1hdGNoLAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbW1lbnRfbWF0Y2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmNvbW1lbnQ2X21hdGNoKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZjb21tZW50X21hdGNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmY29tbWVudF9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmNvbW1lbnQ2X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubmJ5dGVzLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5jCnNpbWlsYXJpdHkgaW5kZXggNjYlCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubmJ5dGVzLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmMKaW5kZXggZDY4YTA0OC4uMTUwZDJhNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb25uYnl0ZXMuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5jCkBAIC02LDEzICs2LDE1IEBACiAgKiAJLSBhZGQgZnVuY3Rpb25hbGl0eSB0byBtYXRjaCBudW1iZXIgb2YgcGFja2V0cwogICogCS0gYWRkIGZ1bmN0aW9uYWxpdHkgdG8gbWF0Y2ggYXZlcmFnZSBwYWNrZXQgc2l6ZQogICogCS0gYWRkIHN1cHBvcnQgdG8gbWF0Y2ggZGlyZWN0aW9ucyBzZXBlcmF0ZWx5CisgKiAyMDA1LTEwLTE2IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICogCS0gUG9ydCB0byB4X3RhYmxlcwogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25uYnl0ZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmg+CiAKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CkBAIC0yMCw2ICsyMiw3IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgbWF0Y2ggZm9yIG1hdGNoaW5nIG51bWJlciBvZiBwa3RzL2J5dGVzIHBlciBjb25uZWN0aW9uIik7CitNT0RVTEVfQUxJQVMoImlwdF9jb25uYnl0ZXMiKTsKIAogLyogNjRiaXQgZGl2aXNvciwgZGl2aWRlbmQgYW5kIHJlc3VsdC4gZHluYW1pYyBwcmVjaXNpb24gKi8KIHN0YXRpYyB1X2ludDY0X3QgZGl2NjRfNjQodV9pbnQ2NF90IGRpdmlkZW5kLCB1X2ludDY0X3QgZGl2aXNvcikKQEAgLTQzLDkgKzQ2LDEwIEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewotCWNvbnN0IHN0cnVjdCBpcHRfY29ubmJ5dGVzX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25uYnl0ZXNfaW5mbyAqc2luZm8gPSBtYXRjaGluZm87CiAJdV9pbnQ2NF90IHdoYXQgPSAwOwkvKiBpbml0aWFsaXplIHRvIG1ha2UgZ2NjIGhhcHB5ICovCiAJY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19jb3VudGVyICpjb3VudGVyczsKIApAQCAtNTMsNDUgKzU3LDQ1IEBACiAJCXJldHVybiAwOyAvKiBubyBtYXRjaCAqLwogCiAJc3dpdGNoIChzaW5mby0+d2hhdCkgewotCWNhc2UgSVBUX0NPTk5CWVRFU19QS1RTOgorCWNhc2UgWFRfQ09OTkJZVEVTX1BLVFM6CiAJCXN3aXRjaCAoc2luZm8tPmRpcmVjdGlvbikgewotCQljYXNlIElQVF9DT05OQllURVNfRElSX09SSUdJTkFMOgorCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUw6CiAJCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzOwogCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfUkVQTFk6CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9SRVBMWToKIAkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLnBhY2tldHM7CiAJCQlicmVhazsKLQkJY2FzZSBJUFRfQ09OTkJZVEVTX0RJUl9CT1RIOgorCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfQk9USDoKIAkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLnBhY2tldHM7CiAJCQl3aGF0ICs9IGNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0ucGFja2V0czsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgSVBUX0NPTk5CWVRFU19CWVRFUzoKKwljYXNlIFhUX0NPTk5CWVRFU19CWVRFUzoKIAkJc3dpdGNoIChzaW5mby0+ZGlyZWN0aW9uKSB7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUw6CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTDoKIAkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLmJ5dGVzOwogCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfUkVQTFk6CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9SRVBMWToKIAkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLmJ5dGVzOwogCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfQk9USDoKKwkJY2FzZSBYVF9DT05OQllURVNfRElSX0JPVEg6CiAJCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5ieXRlczsKIAkJCXdoYXQgKz0gY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5ieXRlczsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgSVBUX0NPTk5CWVRFU19BVkdQS1Q6CisJY2FzZSBYVF9DT05OQllURVNfQVZHUEtUOgogCQlzd2l0Y2ggKHNpbmZvLT5kaXJlY3Rpb24pIHsKLQkJY2FzZSBJUFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTDoKKwkJY2FzZSBYVF9DT05OQllURVNfRElSX09SSUdJTkFMOgogCQkJd2hhdCA9IGRpdjY0XzY0KGNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0uYnl0ZXMsCiAJCQkJCWNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0ucGFja2V0cyk7CiAJCQlicmVhazsKLQkJY2FzZSBJUFRfQ09OTkJZVEVTX0RJUl9SRVBMWToKKwkJY2FzZSBYVF9DT05OQllURVNfRElSX1JFUExZOgogCQkJd2hhdCA9IGRpdjY0XzY0KGNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXMsCiAJCQkJCWNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0ucGFja2V0cyk7CiAJCQlicmVhazsKLQkJY2FzZSBJUFRfQ09OTkJZVEVTX0RJUl9CT1RIOgorCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfQk9USDoKIAkJCXsKIAkJCQl1X2ludDY0X3QgYnl0ZXM7CiAJCQkJdV9pbnQ2NF90IHBrdHM7CkBAIC0xMTcsMzAgKzEyMSwzNiBAQAogfQogCiBzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgY29uc3Qgdm9pZCAqaXAsCiAJCSB2b2lkICptYXRjaGluZm8sCiAJCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2Nvbm5ieXRlc19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY29ubmJ5dGVzX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOwogCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY29ubmJ5dGVzX2luZm8pKSkKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfY29ubmJ5dGVzX2luZm8pKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoc2luZm8tPndoYXQgIT0gSVBUX0NPTk5CWVRFU19QS1RTICYmCi0JICAgIHNpbmZvLT53aGF0ICE9IElQVF9DT05OQllURVNfQllURVMgJiYKLQkgICAgc2luZm8tPndoYXQgIT0gSVBUX0NPTk5CWVRFU19BVkdQS1QpCisJaWYgKHNpbmZvLT53aGF0ICE9IFhUX0NPTk5CWVRFU19QS1RTICYmCisJICAgIHNpbmZvLT53aGF0ICE9IFhUX0NPTk5CWVRFU19CWVRFUyAmJgorCSAgICBzaW5mby0+d2hhdCAhPSBYVF9DT05OQllURVNfQVZHUEtUKQogCQlyZXR1cm4gMDsKIAotCWlmIChzaW5mby0+ZGlyZWN0aW9uICE9IElQVF9DT05OQllURVNfRElSX09SSUdJTkFMICYmCi0JICAgIHNpbmZvLT5kaXJlY3Rpb24gIT0gSVBUX0NPTk5CWVRFU19ESVJfUkVQTFkgJiYKLQkgICAgc2luZm8tPmRpcmVjdGlvbiAhPSBJUFRfQ09OTkJZVEVTX0RJUl9CT1RIKQorCWlmIChzaW5mby0+ZGlyZWN0aW9uICE9IFhUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUwgJiYKKwkgICAgc2luZm8tPmRpcmVjdGlvbiAhPSBYVF9DT05OQllURVNfRElSX1JFUExZICYmCisJICAgIHNpbmZvLT5kaXJlY3Rpb24gIT0gWFRfQ09OTkJZVEVTX0RJUl9CT1RIKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBzdGF0ZV9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggY29ubmJ5dGVzX21hdGNoID0geworCS5uYW1lCQk9ICJjb25uYnl0ZXMiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFCit9Oworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBjb25uYnl0ZXM2X21hdGNoID0gewogCS5uYW1lCQk9ICJjb25uYnl0ZXMiLAogCS5tYXRjaAkJPSAmbWF0Y2gsCiAJLmNoZWNrZW50cnkJPSAmY2hlY2ssCkBAIC0xNDksMTIgKzE1OSwyMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmc3RhdGVfbWF0Y2gpOworCWludCByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5ieXRlc19tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmY29ubmJ5dGVzNl9tYXRjaCk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmY29ubmJ5dGVzX21hdGNoKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZzdGF0ZV9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmY29ubmJ5dGVzX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmY29ubmJ5dGVzNl9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb25ubWFyay5jIGIvbmV0L25ldGZpbHRlci94dF9jb25ubWFyay5jCnNpbWlsYXJpdHkgaW5kZXggNzAlCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubm1hcmsuYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9jb25ubWFyay5jCmluZGV4IDUzMDZlZjIuLmQwNmU5MjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubm1hcmsuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmMKQEAgLTI1LDkgKzI1LDEwIEBACiBNT0RVTEVfQVVUSE9SKCJIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5dGVtcy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBjb25ubWFyayBtYXRjaCBtb2R1bGUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X2Nvbm5tYXJrIik7CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubm1hcmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KIAogc3RhdGljIGludApAQCAtMzYsOSArMzcsMTAgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9jb25ubWFya19pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25ubWFya19pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCXVfaW50MzJfdCBjdGluZm87CiAJY29uc3QgdV9pbnQzMl90ICpjdG1hcmsgPSBuZl9jdF9nZXRfbWFyayhza2IsICZjdGluZm8pOwogCWlmICghY3RtYXJrKQpAQCAtNDksMTQgKzUxLDE0IEBACiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCSAgIGNvbnN0IHZvaWQgKmlwLAogCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0Jc3RydWN0IGlwdF9jb25ubWFya19pbmZvICpjbSA9IAotCQkJCShzdHJ1Y3QgaXB0X2Nvbm5tYXJrX2luZm8gKiltYXRjaGluZm87Ci0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY29ubm1hcmtfaW5mbykpKQorCXN0cnVjdCB4dF9jb25ubWFya19pbmZvICpjbSA9IAorCQkJCShzdHJ1Y3QgeHRfY29ubm1hcmtfaW5mbyAqKW1hdGNoaW5mbzsKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfY29ubm1hcmtfaW5mbykpKQogCQlyZXR1cm4gMDsKIAogCWlmIChjbS0+bWFyayA+IDB4ZmZmZmZmZmYgfHwgY20tPm1hc2sgPiAweGZmZmZmZmZmKSB7CkBAIC02NywyMSArNjksNDAgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggY29ubm1hcmtfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbm5tYXJrX21hdGNoID0geworCS5uYW1lID0gImNvbm5tYXJrIiwKKwkubWF0Y2ggPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkgPSAmY2hlY2tlbnRyeSwKKwkubWUgPSBUSElTX01PRFVMRQorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggY29ubm1hcms2X21hdGNoID0gewogCS5uYW1lID0gImNvbm5tYXJrIiwKIAkubWF0Y2ggPSAmbWF0Y2gsCiAJLmNoZWNrZW50cnkgPSAmY2hlY2tlbnRyeSwKIAkubWUgPSBUSElTX01PRFVMRQogfTsKIAorCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmY29ubm1hcmtfbWF0Y2gpOworCWludCByZXQ7CisKKwluZWVkX2Nvbm50cmFjaygpOworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5tYXJrX21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZjb25ubWFyazZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5tYXJrX21hdGNoKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZjb25ubWFya19tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmNvbm5tYXJrNl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmY29ubm1hcmtfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubnRyYWNrLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCnNpbWlsYXJpdHkgaW5kZXggNjMlCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubnRyYWNrLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmMKaW5kZXggYzhkMTg3MC4uZmZkZWJjOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb25udHJhY2suYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCkBAIC0xOCwxMiArMTgsMTMgQEAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogI2VuZGlmCiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgY29ubmVjdGlvbiB0cmFja2luZyBtYXRjaCBtb2R1bGUiKTsKK01PRFVMRV9BTElBUygiaXB0X2Nvbm50cmFjayIpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTU9EVUxFKQogCkBAIC0zMyw5ICszNCwxMCBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2Nvbm50cmFja19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY29ubnRyYWNrX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOwogCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCXVuc2lnbmVkIGludCBzdGF0ZWJpdDsKQEAgLTQ1LDU4ICs0Nyw1OCBAQAogI2RlZmluZSBGV0lOVihib29sLGludmZsZykgKChib29sKSBeICEhKHNpbmZvLT5pbnZmbGFncyAmIGludmZsZykpCiAKIAlpZiAoY3QgPT0gJmlwX2Nvbm50cmFja191bnRyYWNrZWQpCi0JCXN0YXRlYml0ID0gSVBUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQ7CisJCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRDsKIAllbHNlIGlmIChjdCkKLSAJCXN0YXRlYml0ID0gSVBUX0NPTk5UUkFDS19TVEFURV9CSVQoY3RpbmZvKTsKKyAJCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pOwogIAllbHNlCi0gCQlzdGF0ZWJpdCA9IElQVF9DT05OVFJBQ0tfU1RBVEVfSU5WQUxJRDsKKyAJCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQ7CiAgCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19TVEFURSkgeworCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19TVEFURSkgewogCQlpZiAoY3QpIHsKIAkJCWlmKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMuaXAgIT0KIAkJCSAgICBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwKQotCQkJCXN0YXRlYml0IHw9IElQVF9DT05OVFJBQ0tfU1RBVEVfU05BVDsKKwkJCQlzdGF0ZWJpdCB8PSBYVF9DT05OVFJBQ0tfU1RBVEVfU05BVDsKIAogCQkJaWYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5pcCAhPQogCQkJICAgIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXApCi0JCQkJc3RhdGViaXQgfD0gSVBUX0NPTk5UUkFDS19TVEFURV9ETkFUOworCQkJCXN0YXRlYml0IHw9IFhUX0NPTk5UUkFDS19TVEFURV9ETkFUOwogCQl9CiAKLQkJaWYgKEZXSU5WKChzdGF0ZWJpdCAmIHNpbmZvLT5zdGF0ZW1hc2spID09IDAsIElQVF9DT05OVFJBQ0tfU1RBVEUpKQorCQlpZiAoRldJTlYoKHN0YXRlYml0ICYgc2luZm8tPnN0YXRlbWFzaykgPT0gMCwgWFRfQ09OTlRSQUNLX1NUQVRFKSkKIAkJCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUFJPVE8pIHsKLQkJaWYgKCFjdCB8fCBGV0lOVihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5wcm90b251bSwgSVBUX0NPTk5UUkFDS19QUk9UTykpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1BST1RPKSB7CisJCWlmICghY3QgfHwgRldJTlYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QucHJvdG9udW0sIFhUX0NPTk5UUkFDS19QUk9UTykpCiAgICAgICAgICAgICAgICAgCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfT1JJR1NSQykgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLnNyYy5pcCwgSVBUX0NPTk5UUkFDS19PUklHU1JDKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfT1JJR1NSQykgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLnNyYy5pcCwgWFRfQ09OTlRSQUNLX09SSUdTUkMpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19PUklHRFNUKSB7Ci0JCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QuaXAmc2luZm8tPmRpcG1za1tJUF9DVF9ESVJfT1JJR0lOQUxdLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uZHN0LmlwLCBJUFRfQ09OTlRSQUNLX09SSUdEU1QpKQorCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19PUklHRFNUKSB7CisJCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QuaXAmc2luZm8tPmRpcG1za1tJUF9DVF9ESVJfT1JJR0lOQUxdLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uZHN0LmlwLCBYVF9DT05OVFJBQ0tfT1JJR0RTVCkpCiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1JFUExTUkMpIHsKLQkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCZzaW5mby0+c2lwbXNrW0lQX0NUX0RJUl9SRVBMWV0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX1JFUExZXS5zcmMuaXAsIElQVF9DT05OVFJBQ0tfUkVQTFNSQykpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1JFUExTUkMpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCZzaW5mby0+c2lwbXNrW0lQX0NUX0RJUl9SRVBMWV0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX1JFUExZXS5zcmMuaXAsIFhUX0NPTk5UUkFDS19SRVBMU1JDKSkKIAkJCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUkVQTERTVCkgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLmRzdC5pcCwgSVBUX0NPTk5UUkFDS19SRVBMRFNUKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUkVQTERTVCkgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLmRzdC5pcCwgWFRfQ09OTlRSQUNLX1JFUExEU1QpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19TVEFUVVMpIHsKLQkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnN0YXR1cyAmIHNpbmZvLT5zdGF0dXNtYXNrKSA9PSAwLCBJUFRfQ09OTlRSQUNLX1NUQVRVUykpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1NUQVRVUykgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+c3RhdHVzICYgc2luZm8tPnN0YXR1c21hc2spID09IDAsIFhUX0NPTk5UUkFDS19TVEFUVVMpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19FWFBJUkVTKSB7CisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX0VYUElSRVMpIHsKIAkJdW5zaWduZWQgbG9uZyBleHBpcmVzOwogCiAJCWlmKCFjdCkKQEAgLTEwNCw3ICsxMDYsNyBAQAogCiAJCWV4cGlyZXMgPSB0aW1lcl9wZW5kaW5nKCZjdC0+dGltZW91dCkgPyAoY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpL0haIDogMDsKIAotCQlpZiAoRldJTlYoIShleHBpcmVzID49IHNpbmZvLT5leHBpcmVzX21pbiAmJiBleHBpcmVzIDw9IHNpbmZvLT5leHBpcmVzX21heCksIElQVF9DT05OVFJBQ0tfRVhQSVJFUykpCisJCWlmIChGV0lOVighKGV4cGlyZXMgPj0gc2luZm8tPmV4cGlyZXNfbWluICYmIGV4cGlyZXMgPD0gc2luZm8tPmV4cGlyZXNfbWF4KSwgWFRfQ09OTlRSQUNLX0VYUElSRVMpKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMTgsOSArMTIwLDEwIEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewotCWNvbnN0IHN0cnVjdCBpcHRfY29ubnRyYWNrX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25udHJhY2tfaW5mbyAqc2luZm8gPSBtYXRjaGluZm87CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCXVuc2lnbmVkIGludCBzdGF0ZWJpdDsKQEAgLTEzMCw1OCArMTMzLDU4IEBACiAjZGVmaW5lIEZXSU5WKGJvb2wsaW52ZmxnKSAoKGJvb2wpIF4gISEoc2luZm8tPmludmZsYWdzICYgaW52ZmxnKSkKIAogCWlmIChjdCA9PSAmbmZfY29ubnRyYWNrX3VudHJhY2tlZCkKLQkJc3RhdGViaXQgPSBJUFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRDsKKwkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfVU5UUkFDS0VEOwogCWVsc2UgaWYgKGN0KQotIAkJc3RhdGViaXQgPSBJUFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pOworIAkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbyk7CiAgCWVsc2UKLSAJCXN0YXRlYml0ID0gSVBUX0NPTk5UUkFDS19TVEFURV9JTlZBTElEOworIAkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfSU5WQUxJRDsKICAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1NUQVRFKSB7CisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1NUQVRFKSB7CiAJCWlmIChjdCkgewogCQkJaWYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy51My5pcCAhPQogCQkJICAgIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QudTMuaXApCi0JCQkJc3RhdGViaXQgfD0gSVBUX0NPTk5UUkFDS19TVEFURV9TTkFUOworCQkJCXN0YXRlYml0IHw9IFhUX0NPTk5UUkFDS19TVEFURV9TTkFUOwogCiAJCQlpZihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnUzLmlwICE9CiAJCQkgICAgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy51My5pcCkKLQkJCQlzdGF0ZWJpdCB8PSBJUFRfQ09OTlRSQUNLX1NUQVRFX0ROQVQ7CisJCQkJc3RhdGViaXQgfD0gWFRfQ09OTlRSQUNLX1NUQVRFX0ROQVQ7CiAJCX0KIAotCQlpZiAoRldJTlYoKHN0YXRlYml0ICYgc2luZm8tPnN0YXRlbWFzaykgPT0gMCwgSVBUX0NPTk5UUkFDS19TVEFURSkpCisJCWlmIChGV0lOVigoc3RhdGViaXQgJiBzaW5mby0+c3RhdGVtYXNrKSA9PSAwLCBYVF9DT05OVFJBQ0tfU1RBVEUpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19QUk9UTykgewotCQlpZiAoIWN0IHx8IEZXSU5WKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0gIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uZHN0LnByb3RvbnVtLCBJUFRfQ09OTlRSQUNLX1BST1RPKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUFJPVE8pIHsKKwkJaWYgKCFjdCB8fCBGV0lOVihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5wcm90b251bSwgWFRfQ09OTlRSQUNLX1BST1RPKSkKICAgICAgICAgICAgICAgICAJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19PUklHU1JDKSB7Ci0JCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMudTMuaXAmc2luZm8tPnNpcG1za1tJUF9DVF9ESVJfT1JJR0lOQUxdLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uc3JjLmlwLCBJUFRfQ09OTlRSQUNLX09SSUdTUkMpKQorCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19PUklHU1JDKSB7CisJCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMudTMuaXAmc2luZm8tPnNpcG1za1tJUF9DVF9ESVJfT1JJR0lOQUxdLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uc3JjLmlwLCBYVF9DT05OVFJBQ0tfT1JJR1NSQykpCiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX09SSUdEU1QpIHsKLQkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC51My5pcCZzaW5mby0+ZGlwbXNrW0lQX0NUX0RJUl9PUklHSU5BTF0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QuaXAsIElQVF9DT05OVFJBQ0tfT1JJR0RTVCkpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX09SSUdEU1QpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC51My5pcCZzaW5mby0+ZGlwbXNrW0lQX0NUX0RJUl9PUklHSU5BTF0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QuaXAsIFhUX0NPTk5UUkFDS19PUklHRFNUKSkKIAkJCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUkVQTFNSQykgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUzLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLnNyYy5pcCwgSVBUX0NPTk5UUkFDS19SRVBMU1JDKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUkVQTFNSQykgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUzLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLnNyYy5pcCwgWFRfQ09OTlRSQUNLX1JFUExTUkMpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19SRVBMRFNUKSB7Ci0JCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QudTMuaXAmc2luZm8tPmRpcG1za1tJUF9DVF9ESVJfUkVQTFldLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9SRVBMWV0uZHN0LmlwLCBJUFRfQ09OTlRSQUNLX1JFUExEU1QpKQorCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19SRVBMRFNUKSB7CisJCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QudTMuaXAmc2luZm8tPmRpcG1za1tJUF9DVF9ESVJfUkVQTFldLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9SRVBMWV0uZHN0LmlwLCBYVF9DT05OVFJBQ0tfUkVQTERTVCkpCiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1NUQVRVUykgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+c3RhdHVzICYgc2luZm8tPnN0YXR1c21hc2spID09IDAsIElQVF9DT05OVFJBQ0tfU1RBVFVTKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfU1RBVFVTKSB7CisJCWlmICghY3QgfHwgRldJTlYoKGN0LT5zdGF0dXMgJiBzaW5mby0+c3RhdHVzbWFzaykgPT0gMCwgWFRfQ09OTlRSQUNLX1NUQVRVUykpCiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX0VYUElSRVMpIHsKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfRVhQSVJFUykgewogCQl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CiAKIAkJaWYoIWN0KQpAQCAtMTg5LDcgKzE5Miw3IEBACiAKIAkJZXhwaXJlcyA9IHRpbWVyX3BlbmRpbmcoJmN0LT50aW1lb3V0KSA/IChjdC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykvSFogOiAwOwogCi0JCWlmIChGV0lOVighKGV4cGlyZXMgPj0gc2luZm8tPmV4cGlyZXNfbWluICYmIGV4cGlyZXMgPD0gc2luZm8tPmV4cGlyZXNfbWF4KSwgSVBUX0NPTk5UUkFDS19FWFBJUkVTKSkKKwkJaWYgKEZXSU5WKCEoZXhwaXJlcyA+PSBzaW5mby0+ZXhwaXJlc19taW4gJiYgZXhwaXJlcyA8PSBzaW5mby0+ZXhwaXJlc19tYXgpLCBYVF9DT05OVFJBQ0tfRVhQSVJFUykpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE5OSwxOCArMjAyLDE4IEBACiAjZW5kaWYgLyogQ09ORklHX05GX0lQX0NPTk5UUkFDSyAqLwogCiBzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgY29uc3Qgdm9pZCAqaXAsCiAJCSB2b2lkICptYXRjaGluZm8sCiAJCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9jb25udHJhY2tfaW5mbykpKQorCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9jb25udHJhY2tfaW5mbykpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBjb25udHJhY2tfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbm50cmFja19tYXRjaCA9IHsKIAkubmFtZQkJPSAiY29ubnRyYWNrIiwKIAkubWF0Y2gJCT0gJm1hdGNoLAogCS5jaGVja2VudHJ5CT0gJmNoZWNrLApAQCAtMjE5LDEzICsyMjIsMTYgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCW5lZWRfaXBfY29ubnRyYWNrKCk7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmY29ubnRyYWNrX21hdGNoKTsKKwlpbnQgcmV0OworCW5lZWRfY29ubnRyYWNrKCk7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm50cmFja19tYXRjaCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZjb25udHJhY2tfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm50cmFja19tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9kY2NwLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2RjY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzlmNDJmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9kY2NwLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBpcHRhYmxlcyBtb2R1bGUgZm9yIERDQ1AgcHJvdG9jb2wgaGVhZGVyIG1hdGNoaW5nCisgKgorICogKEMpIDIwMDUgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2NwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfZGNjcC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWF0Y2ggZm9yIERDQ1AgcHJvdG9jb2wgcGFja2V0cyIpOworTU9EVUxFX0FMSUFTKCJpcHRfZGNjcCIpOworCisjZGVmaW5lIERDQ0hFQ0soY29uZCwgb3B0aW9uLCBmbGFnLCBpbnZmbGFnKSAoISgoZmxhZykgJiAob3B0aW9uKSkgXAorCQkgICAgICAgICAgICAgICAgICB8fCAoISEoKGludmZsYWcpICYgKG9wdGlvbikpIF4gKGNvbmQpKSkKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmRjY3Bfb3B0YnVmOworc3RhdGljIERFRklORV9TUElOTE9DSyhkY2NwX2J1ZmxvY2spOworCitzdGF0aWMgaW5saW5lIGludAorZGNjcF9maW5kX29wdGlvbih1X2ludDhfdCBvcHRpb24sCisJCSBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgdW5zaWduZWQgaW50IHByb3RvZmYsCisJCSBjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoLAorCQkgaW50ICpob3Rkcm9wKQoreworCS8qIHRjcC5kb2ZmIGlzIG9ubHkgNCBiaXRzLCBpZS4gbWF4IDE1ICogNCBieXRlcyAqLworCXVuc2lnbmVkIGNoYXIgKm9wOworCXVuc2lnbmVkIGludCBvcHRvZmYgPSBfX2RjY3BfaGRyX2xlbihkaCk7CisJdW5zaWduZWQgaW50IG9wdGxlbiA9IGRoLT5kY2NwaF9kb2ZmKjQgLSBfX2RjY3BfaGRyX2xlbihkaCk7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoZGgtPmRjY3BoX2RvZmYgKiA0IDwgX19kY2NwX2hkcl9sZW4oZGgpKSB7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFvcHRsZW4pCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2JoKCZkY2NwX2J1ZmxvY2spOworCW9wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiArIG9wdG9mZiwgb3B0bGVuLCBkY2NwX29wdGJ1Zik7CisJaWYgKG9wID09IE5VTEwpIHsKKwkJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgaGVhZGVyLCBkcm9wIHBhY2tldC4gKi8KKwkJc3Bpbl91bmxvY2tfYmgoJmRjY3BfYnVmbG9jayk7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG9wdGxlbjsgKSB7CisJCWlmIChvcFtpXSA9PSBvcHRpb24pIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZkY2NwX2J1ZmxvY2spOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlpZiAob3BbaV0gPCAyKSAKKwkJCWkrKzsKKwkJZWxzZSAKKwkJCWkgKz0gb3BbaSsxXT86MTsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmZGNjcF9idWZsb2NrKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGludAorbWF0Y2hfdHlwZXMoY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCwgdV9pbnQxNl90IHR5cGVtYXNrKQoreworCXJldHVybiAodHlwZW1hc2sgJiAoMSA8PCBkaC0+ZGNjcGhfdHlwZSkpOworfQorCitzdGF0aWMgaW5saW5lIGludAorbWF0Y2hfb3B0aW9uKHVfaW50OF90IG9wdGlvbiwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IHByb3RvZmYsCisJICAgICBjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoLCBpbnQgKmhvdGRyb3ApCit7CisJcmV0dXJuIGRjY3BfZmluZF9vcHRpb24ob3B0aW9uLCBza2IsIHByb3RvZmYsIGRoLCBob3Rkcm9wKTsKK30KKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IHh0X2RjY3BfaW5mbyAqaW5mbyA9IAorCQkJCShjb25zdCBzdHJ1Y3QgeHRfZGNjcF9pbmZvICopbWF0Y2hpbmZvOworCXN0cnVjdCBkY2NwX2hkciBfZGgsICpkaDsKKworCWlmIChvZmZzZXQpCisJCXJldHVybiAwOworCQorCWRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF9kaCksICZfZGgpOworCWlmIChkaCA9PSBOVUxMKSB7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisgICAgICAgCX0KKworCXJldHVybiAgRENDSEVDSygoKG50b2hzKGRoLT5kY2NwaF9zcG9ydCkgPj0gaW5mby0+c3B0c1swXSkgCisJCQkmJiAobnRvaHMoZGgtPmRjY3BoX3Nwb3J0KSA8PSBpbmZvLT5zcHRzWzFdKSksIAorCQkgICAJWFRfRENDUF9TUkNfUE9SVFMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncykKKwkJJiYgRENDSEVDSygoKG50b2hzKGRoLT5kY2NwaF9kcG9ydCkgPj0gaW5mby0+ZHB0c1swXSkgCisJCQkmJiAobnRvaHMoZGgtPmRjY3BoX2Rwb3J0KSA8PSBpbmZvLT5kcHRzWzFdKSksIAorCQkJWFRfRENDUF9ERVNUX1BPUlRTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCisJCSYmIERDQ0hFQ0sobWF0Y2hfdHlwZXMoZGgsIGluZm8tPnR5cGVtYXNrKSwKKwkJCSAgIFhUX0RDQ1BfVFlQRSwgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQorCQkmJiBEQ0NIRUNLKG1hdGNoX29wdGlvbihpbmZvLT5vcHRpb24sIHNrYiwgcHJvdG9mZiwgZGgsCisJCQkJCWhvdGRyb3ApLAorCQkJICAgWFRfRENDUF9PUFRJT04sIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgIGNvbnN0IHZvaWQgKmluZiwKKwkgICB2b2lkICptYXRjaGluZm8sCisJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaW5mOworCWNvbnN0IHN0cnVjdCB4dF9kY2NwX2luZm8gKmluZm87CisKKwlpbmZvID0gKGNvbnN0IHN0cnVjdCB4dF9kY2NwX2luZm8gKiltYXRjaGluZm87CisKKwlyZXR1cm4gaXAtPnByb3RvID09IElQUFJPVE9fRENDUAorCQkmJiAhKGlwLT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykKKwkJJiYgbWF0Y2hzaXplID09IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfZGNjcF9pbmZvKSkKKwkJJiYgIShpbmZvLT5mbGFncyAmIH5YVF9EQ0NQX1ZBTElEX0ZMQUdTKQorCQkmJiAhKGluZm8tPmludmZsYWdzICYgflhUX0RDQ1BfVkFMSURfRkxBR1MpCisJCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+aW5mby0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5Nihjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgdm9pZCAqaW5mLAorCSAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCA9IGluZjsKKwljb25zdCBzdHJ1Y3QgeHRfZGNjcF9pbmZvICppbmZvOworCisJaW5mbyA9IChjb25zdCBzdHJ1Y3QgeHRfZGNjcF9pbmZvICopbWF0Y2hpbmZvOworCisJcmV0dXJuIGlwLT5wcm90byA9PSBJUFBST1RPX0RDQ1AKKwkJJiYgIShpcC0+aW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pCisJCSYmIG1hdGNoc2l6ZSA9PSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2RjY3BfaW5mbykpCisJCSYmICEoaW5mby0+ZmxhZ3MgJiB+WFRfRENDUF9WQUxJRF9GTEFHUykKKwkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5YVF9EQ0NQX1ZBTElEX0ZMQUdTKQorCQkmJiAhKGluZm8tPmludmZsYWdzICYgfmluZm8tPmZsYWdzKTsKK30KKworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGRjY3BfbWF0Y2ggPSAKK3sgCisJLm5hbWUgCQk9ICJkY2NwIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lIAkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGRjY3A2X21hdGNoID0gCit7IAorCS5uYW1lIAkJPSAiZGNjcCIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5NiwKKwkubWUgCQk9IFRISVNfTU9EVUxFLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8qIGRvZmYgaXMgOCBiaXRzLCBzbyB0aGUgbWF4aW11bSBvcHRpb24gc2l6ZSBpcyAoNCoyNTYpLiAgRG9uJ3QgcHV0CisJICogdGhpcyBpbiBCU1Mgc2luY2UgRGF2ZU0gaXMgd29ycmllZCBhYm91dCBsb2NrZWQgVExCJ3MgZm9yIGtlcm5lbAorCSAqIEJTUy4gKi8KKwlkY2NwX29wdGJ1ZiA9IGttYWxsb2MoMjU2ICogNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkY2NwX29wdGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmRjY3BfbWF0Y2gpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2tmcmVlOworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmZGNjcDZfbWF0Y2gpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnOworCisJcmV0dXJuIHJldDsKKworb3V0X3VucmVnOgorCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmRjY3BfbWF0Y2gpOworb3V0X2tmcmVlOgorCWtmcmVlKGRjY3Bfb3B0YnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmRjY3A2X21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZkY2NwX21hdGNoKTsKKwlrZnJlZShkY2NwX29wdGJ1Zik7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hlbHBlci5jIGIvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYwpzaW1pbGFyaXR5IGluZGV4IDcyJQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hlbHBlci5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X2hlbHBlci5jCmluZGV4IGFlZjY0OWUuLjM4YjY3MTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaGVscGVyLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oPgpAQCAtMjMsMTIgKzIyLDE0IEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgogI2VuZGlmCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9oZWxwZXIuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTWFydGluIEpvc2Vmc3NvbiA8Z2FuZGFsZkBuZXRmaWx0ZXIub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBoZWxwZXIgbWF0Y2ggbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9oZWxwZXIiKTsKK01PRFVMRV9BTElBUygiaXA2dF9oZWxwZXIiKTsKIAogI2lmIDAKICNkZWZpbmUgREVCVUdQIHByaW50awpAQCAtNDMsMjcgKzQ0LDI4IEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewotCWNvbnN0IHN0cnVjdCBpcHRfaGVscGVyX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2hlbHBlcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCWludCByZXQgPSBpbmZvLT5pbnZlcnQ7CiAJCiAJY3QgPSBpcF9jb25udHJhY2tfZ2V0KChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYiwgJmN0aW5mbyk7CiAJaWYgKCFjdCkgewotCQlERUJVR1AoImlwdF9oZWxwZXI6IEVlayEgaW52YWxpZCBjb25udHJhY2s/XG4iKTsKKwkJREVCVUdQKCJ4dF9oZWxwZXI6IEVlayEgaW52YWxpZCBjb25udHJhY2s/XG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlpZiAoIWN0LT5tYXN0ZXIpIHsKLQkJREVCVUdQKCJpcHRfaGVscGVyOiBjb25udHJhY2sgJXAgaGFzIG5vIG1hc3RlclxuIiwgY3QpOworCQlERUJVR1AoInh0X2hlbHBlcjogY29ubnRyYWNrICVwIGhhcyBubyBtYXN0ZXJcbiIsIGN0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZWFkX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKIAlpZiAoIWN0LT5tYXN0ZXItPmhlbHBlcikgewotCQlERUJVR1AoImlwdF9oZWxwZXI6IG1hc3RlciBjdCAlcCBoYXMgbm8gaGVscGVyXG4iLCAKKwkJREVCVUdQKCJ4dF9oZWxwZXI6IG1hc3RlciBjdCAlcCBoYXMgbm8gaGVscGVyXG4iLCAKIAkJCWV4cC0+ZXhwZWN0YW50KTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KQEAgLTg5LDI3ICs5MSwyOCBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2hlbHBlcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9oZWxwZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJaW50IHJldCA9IGluZm8tPmludmVydDsKIAkKIAljdCA9IG5mX2N0X2dldCgoc3RydWN0IHNrX2J1ZmYgKilza2IsICZjdGluZm8pOwogCWlmICghY3QpIHsKLQkJREVCVUdQKCJpcHRfaGVscGVyOiBFZWshIGludmFsaWQgY29ubnRyYWNrP1xuIik7CisJCURFQlVHUCgieHRfaGVscGVyOiBFZWshIGludmFsaWQgY29ubnRyYWNrP1xuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJaWYgKCFjdC0+bWFzdGVyKSB7Ci0JCURFQlVHUCgiaXB0X2hlbHBlcjogY29ubnRyYWNrICVwIGhhcyBubyBtYXN0ZXJcbiIsIGN0KTsKKwkJREVCVUdQKCJ4dF9oZWxwZXI6IGNvbm50cmFjayAlcCBoYXMgbm8gbWFzdGVyXG4iLCBjdCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJcmVhZF9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAJaWYgKCFjdC0+bWFzdGVyLT5oZWxwZXIpIHsKLQkJREVCVUdQKCJpcHRfaGVscGVyOiBtYXN0ZXIgY3QgJXAgaGFzIG5vIGhlbHBlclxuIiwgCisJCURFQlVHUCgieHRfaGVscGVyOiBtYXN0ZXIgY3QgJXAgaGFzIG5vIGhlbHBlclxuIiwgCiAJCQlleHAtPmV4cGVjdGFudCk7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CkBAIC0xMjksMjMgKzEzMiwyOSBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJCSBjb25zdCB2b2lkICppbmYsCiAJCSB2b2lkICptYXRjaGluZm8sCiAJCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQlzdHJ1Y3QgaXB0X2hlbHBlcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCXN0cnVjdCB4dF9oZWxwZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAogCWluZm8tPm5hbWVbMjldID0gJ1wwJzsKIAogCS8qIHZlcmlmeSBzaXplICovCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfaGVscGVyX2luZm8pKSkKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfaGVscGVyX2luZm8pKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggaGVscGVyX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBoZWxwZXJfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImhlbHBlciIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9Oworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBoZWxwZXI2X21hdGNoID0gewogCS5uYW1lCQk9ICJoZWxwZXIiLAogCS5tYXRjaAkJPSAmbWF0Y2gsCiAJLmNoZWNrZW50cnkJPSAmY2hlY2ssCkBAIC0xNTQsMTMgKzE2MywyNCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JbmVlZF9pcF9jb25udHJhY2soKTsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZoZWxwZXJfbWF0Y2gpOworCWludCByZXQ7CisJbmVlZF9jb25udHJhY2soKTsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZoZWxwZXJfbWF0Y2gpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZoZWxwZXI2X21hdGNoKTsKKwlpZiAocmV0IDwgMCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaGVscGVyX21hdGNoKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJmhlbHBlcl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaGVscGVyX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmaGVscGVyNl9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9sZW5ndGguYyBiL25ldC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljOGZhZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmMKQEAgLTAsMCArMSw5OSBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBwYWNrZXQgbGVuZ3RoLiAqLworLyogKEMpIDE5OTktMjAwMSBKYW1lcyBNb3JyaXMgPGptb3Jyb3NAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKK01PRFVMRV9BVVRIT1IoIkphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUCB0YWJsZXMgcGFja2V0IGxlbmd0aCBtYXRjaGluZyBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X2xlbmd0aCIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X2xlbmd0aCIpOworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfbGVuZ3RoX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJdV9pbnQxNl90IHBrdGxlbiA9IG50b2hzKHNrYi0+bmguaXBoLT50b3RfbGVuKTsKKwkKKwlyZXR1cm4gKHBrdGxlbiA+PSBpbmZvLT5taW4gJiYgcGt0bGVuIDw9IGluZm8tPm1heCkgXiBpbmZvLT5pbnZlcnQ7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoNihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfbGVuZ3RoX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJdV9pbnQxNl90IHBrdGxlbiA9IG50b2hzKHNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuKSArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJCisJcmV0dXJuIChwa3RsZW4gPj0gaW5mby0+bWluICYmIHBrdGxlbiA8PSBpbmZvLT5tYXgpIF4gaW5mby0+aW52ZXJ0OworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgICAgICAgY29uc3Qgdm9pZCAqaXAsCisgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfbGVuZ3RoX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBsZW5ndGhfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImxlbmd0aCIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGxlbmd0aDZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImxlbmd0aCIsCisJLm1hdGNoCQk9ICZtYXRjaDYsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbGVuZ3RoX21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmbGVuZ3RoNl9tYXRjaCk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbGVuZ3RoX21hdGNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbGVuZ3RoX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmbGVuZ3RoNl9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2xpbWl0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2xpbWl0LmMKc2ltaWxhcml0eSBpbmRleCA3OCUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9saW1pdC5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X2xpbWl0LmMKaW5kZXggMGMyNGRjYy4uMTVlNDA1MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9saW1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbGltaXQuYwpAQCAtMTgsMTIgKzE4LDE0IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9saW1pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9saW1pdC5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJIZXJ2ZSBFeWNoZW5uZSA8cnZAd2FsbGZpcmUub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyByYXRlIGxpbWl0IG1hdGNoIik7CitNT0RVTEVfQUxJQVMoImlwdF9saW1pdCIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X2xpbWl0Iik7CiAKIC8qIFRoZSBhbGdvcml0aG0gdXNlZCBpcyB0aGUgU2ltcGxlIFRva2VuIEJ1Y2tldCBGaWx0ZXIgKFRCRikKICAqIHNlZSBuZXQvc2NoZWQvc2NoX3RiZi5jIGluIHRoZSBsaW51eCBzb3VyY2UgdHJlZQpAQCAtNjgsOSArNzAsMTAgQEAKIAkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKIAkJY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogCQlpbnQgb2Zmc2V0LAorCQl1bnNpZ25lZCBpbnQgcHJvdG9mZiwKIAkJaW50ICpob3Rkcm9wKQogewotCXN0cnVjdCBpcHRfcmF0ZWluZm8gKnIgPSAoKHN0cnVjdCBpcHRfcmF0ZWluZm8gKiltYXRjaGluZm8pLT5tYXN0ZXI7CisJc3RydWN0IHh0X3JhdGVpbmZvICpyID0gKChzdHJ1Y3QgeHRfcmF0ZWluZm8gKiltYXRjaGluZm8pLT5tYXN0ZXI7CiAJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCiAJc3Bpbl9sb2NrX2JoKCZsaW1pdF9sb2NrKTsKQEAgLTk2LDMyICs5OSwzMiBAQAogCS8qIElmIG11bHRpcGx5aW5nIHdvdWxkIG92ZXJmbG93Li4uICovCiAJaWYgKHVzZXIgPiAweEZGRkZGRkZGIC8gKEhaKkNSRURJVFNfUEVSX0pJRkZZKSkKIAkJLyogRGl2aWRlIGZpcnN0LiAqLwotCQlyZXR1cm4gKHVzZXIgLyBJUFRfTElNSVRfU0NBTEUpICogSFogKiBDUkVESVRTX1BFUl9KSUZGWTsKKwkJcmV0dXJuICh1c2VyIC8gWFRfTElNSVRfU0NBTEUpICogSFogKiBDUkVESVRTX1BFUl9KSUZGWTsKIAotCXJldHVybiAodXNlciAqIEhaICogQ1JFRElUU19QRVJfSklGRlkpIC8gSVBUX0xJTUlUX1NDQUxFOworCXJldHVybiAodXNlciAqIEhaICogQ1JFRElUU19QRVJfSklGRlkpIC8gWFRfTElNSVRfU0NBTEU7CiB9CiAKIHN0YXRpYyBpbnQKIGlwdF9saW1pdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJICAgICBjb25zdCB2b2lkICppbmYsCiAJCSAgICAgdm9pZCAqbWF0Y2hpbmZvLAogCQkgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQlzdHJ1Y3QgaXB0X3JhdGVpbmZvICpyID0gbWF0Y2hpbmZvOworCXN0cnVjdCB4dF9yYXRlaW5mbyAqciA9IG1hdGNoaW5mbzsKIAotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3JhdGVpbmZvKSkpCisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3JhdGVpbmZvKSkpCiAJCXJldHVybiAwOwogCiAJLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAqLwogCWlmIChyLT5idXJzdCA9PSAwCiAJICAgIHx8IHVzZXIyY3JlZGl0cyhyLT5hdmcgKiByLT5idXJzdCkgPCB1c2VyMmNyZWRpdHMoci0+YXZnKSkgewotCQlwcmludGsoIk92ZXJmbG93IGluIGlwdF9saW1pdCwgdHJ5IGxvd2VyOiAldS8ldVxuIiwKKwkJcHJpbnRrKCJPdmVyZmxvdyBpbiB4dF9saW1pdCwgdHJ5IGxvd2VyOiAldS8ldVxuIiwKIAkJICAgICAgIHItPmF2Zywgci0+YnVyc3QpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBVc2VyIGF2ZyBpbiBzZWNvbmRzICogSVBUX0xJTUlUX1NDQUxFOiBjb252ZXJ0IHRvIGppZmZpZXMgKgorCS8qIFVzZXIgYXZnIGluIHNlY29uZHMgKiBYVF9MSU1JVF9TQ0FMRTogY29udmVydCB0byBqaWZmaWVzICoKIAkgICAxMjguICovCiAJci0+cHJldiA9IGppZmZpZXM7CiAJci0+Y3JlZGl0ID0gdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KTsJIC8qIENyZWRpdHMgZnVsbC4gKi8KQEAgLTEzNCw3ICsxMzcsMTMgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggaXB0X2xpbWl0X3JlZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggaXB0X2xpbWl0X3JlZyA9IHsKKwkubmFtZQkJPSAibGltaXQiLAorCS5tYXRjaAkJPSBpcHRfbGltaXRfbWF0Y2gsCisJLmNoZWNrZW50cnkJPSBpcHRfbGltaXRfY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9Oworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBsaW1pdDZfcmVnID0gewogCS5uYW1lCQk9ICJsaW1pdCIsCiAJLm1hdGNoCQk9IGlwdF9saW1pdF9tYXRjaCwKIAkuY2hlY2tlbnRyeQk9IGlwdF9saW1pdF9jaGVja2VudHJ5LApAQCAtMTQzLDE0ICsxNTIsMjMgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCWlmIChpcHRfcmVnaXN0ZXJfbWF0Y2goJmlwdF9saW1pdF9yZWcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKKwlpbnQgcmV0OworCQorCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZpcHRfbGltaXRfcmVnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCQorCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmbGltaXQ2X3JlZyk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaXB0X2xpbWl0X3JlZyk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZpcHRfbGltaXRfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZpcHRfbGltaXRfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmbGltaXQ2X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tYWMuYyBiL25ldC9uZXRmaWx0ZXIveHRfbWFjLmMKc2ltaWxhcml0eSBpbmRleCA2NSUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tYWMuYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9tYWMuYwppbmRleCAxYjliYjQ1Li4wNDYxZGNiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X21hYy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbWFjLmMKQEAgLTEzLDEyICsxMywxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9tYWMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9tYWMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgbWFjIG1hdGNoaW5nIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfbWFjIik7CitNT0RVTEVfQUxJQVMoImlwNnRfbWFjIik7CiAKIHN0YXRpYyBpbnQKIG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCkBAIC0yNiw5ICsyOSwxMCBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLSAgICBjb25zdCBzdHJ1Y3QgaXB0X21hY19pbmZvICppbmZvID0gbWF0Y2hpbmZvOworICAgIGNvbnN0IHN0cnVjdCB4dF9tYWNfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAogICAgIC8qIElzIG1hYyBwb2ludGVyIHZhbGlkPyAqLwogICAgIHJldHVybiAoc2tiLT5tYWMucmF3ID49IHNrYi0+aGVhZApAQCAtNDAsNyArNDQsNyBAQAogCiBzdGF0aWMgaW50CiBpcHRfbWFjX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJICAgY29uc3Qgdm9pZCAqaW5mLAogCQkgICB2b2lkICptYXRjaGluZm8sCiAJCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCkBAIC00OSwxNyArNTMsMjMgQEAKIAlpZiAoaG9va19tYXNrCiAJICAgICYgfigoMSA8PCBORl9JUF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUF9MT0NBTF9JTikKIAkJfCAoMSA8PCBORl9JUF9GT1JXQVJEKSkpIHsKLQkJcHJpbnRrKCJpcHRfbWFjOiBvbmx5IHZhbGlkIGZvciBQUkVfUk9VVElORywgTE9DQUxfSU4gb3IgRk9SV0FSRC5cbiIpOworCQlwcmludGsoInh0X21hYzogb25seSB2YWxpZCBmb3IgUFJFX1JPVVRJTkcsIExPQ0FMX0lOIG9yIEZPUldBUkQuXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfbWFjX2luZm8pKSkKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfbWFjX2luZm8pKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggbWFjX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBtYWNfbWF0Y2ggPSB7CisJLm5hbWUJCT0gIm1hYyIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZpcHRfbWFjX2NoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggbWFjNl9tYXRjaCA9IHsKIAkubmFtZQkJPSAibWFjIiwKIAkubWF0Y2gJCT0gJm1hdGNoLAogCS5jaGVja2VudHJ5CT0gJmlwdF9tYWNfY2hlY2tlbnRyeSwKQEAgLTY4LDEyICs3OCwyMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmbWFjX21hdGNoKTsKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZtYWNfbWF0Y2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJm1hYzZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJm1hY19tYXRjaCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZtYWNfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJm1hY19tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJm1hYzZfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbWFyay5jIGIvbmV0L25ldGZpbHRlci94dF9tYXJrLmMKc2ltaWxhcml0eSBpbmRleCA2MCUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tYXJrLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfbWFyay5jCmluZGV4IDAwYmVmNmMuLjJhMGFjNjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbWFyay5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbWFyay5jCkBAIC0xMCwxMiArMTAsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9tYXJrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X21hcmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIG1hcmsgbWF0Y2hpbmcgbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9tYXJrIik7CitNT0RVTEVfQUxJQVMoImlwNnRfbWFyayIpOwogCiBzdGF0aWMgaW50CiBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMjMsMjMgKzI1LDI0IEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewotCWNvbnN0IHN0cnVjdCBpcHRfbWFya19pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9tYXJrX2luZm8gKmluZm8gPSBtYXRjaGluZm87CiAKIAlyZXR1cm4gKChza2ItPm5mbWFyayAmIGluZm8tPm1hc2spID09IGluZm8tPm1hcmspIF4gaW5mby0+aW52ZXJ0OwogfQogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICAgICAgIGNvbnN0IHZvaWQgKmVudHJ5LAogICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0Jc3RydWN0IGlwdF9tYXJrX2luZm8gKm1pbmZvID0gKHN0cnVjdCBpcHRfbWFya19pbmZvICopIG1hdGNoaW5mbzsKKwlzdHJ1Y3QgeHRfbWFya19pbmZvICptaW5mbyA9IChzdHJ1Y3QgeHRfbWFya19pbmZvICopIG1hdGNoaW5mbzsKIAotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X21hcmtfaW5mbykpKQorCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9tYXJrX2luZm8pKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAobWluZm8tPm1hcmsgPiAweGZmZmZmZmZmIHx8IG1pbmZvLT5tYXNrID4gMHhmZmZmZmZmZikgewpAQCAtNTAsNyArNTMsMTQgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggbWFya19tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggbWFya19tYXRjaCA9IHsKKwkubmFtZQkJPSAibWFyayIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggbWFyazZfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gIm1hcmsiLAogCS5tYXRjaAkJPSAmbWF0Y2gsCiAJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKQEAgLTU5LDEyICs2OSwyMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmbWFya19tYXRjaCk7CisJaW50IHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbWFya19tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmbWFyazZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJm1hcmtfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmbWFya19tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbWFya19tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJm1hcms2X21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYyBiL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YmI1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCB0aGUgYnJpZGdlIHBvcnQgaW4gYW5kCisgKiBvdXQgZGV2aWNlIGZvciBJUCBwYWNrZXRzIGNvbWluZyBpbnRvIGNvbnRhY3Qgd2l0aCBhIGJyaWRnZS4gKi8KKworLyogKEMpIDIwMDEtMjAwMyBCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9waHlzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgorI2RlZmluZSBNQVRDSCAgIDEKKyNkZWZpbmUgTk9NQVRDSCAwCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIGJyaWRnZSBwaHlzaWNhbCBkZXZpY2UgbWF0Y2ggbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9waHlzZGV2Iik7CitNT0RVTEVfQUxJQVMoImlwNnRfcGh5c2RldiIpOworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwlpbnQgaTsKKwlzdGF0aWMgY29uc3QgY2hhciBudWxsZGV2bmFtZVtJRk5BTVNJWl07CisJY29uc3Qgc3RydWN0IHh0X3BoeXNkZXZfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwl1bnNpZ25lZCBpbnQgcmV0OworCWNvbnN0IGNoYXIgKmluZGV2LCAqb3V0ZGV2OworCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlOworCisJLyogTm90IGEgYnJpZGdlZCBJUCBwYWNrZXQgb3Igbm8gaW5mbyBhdmFpbGFibGUgeWV0OgorCSAqIExPQ0FMX09VVC9tYW5nbGUgYW5kIExPQ0FMX09VVC9uYXQgZG9uJ3Qga25vdyBpZgorCSAqIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2Ugd2lsbCBiZSBhIGJyaWRnZS4gKi8KKwlpZiAoIShuZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZSkpIHsKKwkJLyogUmV0dXJuIE1BVENIIGlmIHRoZSBpbnZlcnQgZmxhZ3Mgb2YgdGhlIHVzZWQgb3B0aW9ucyBhcmUgb24gKi8KKwkJaWYgKChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9CUklER0VEKSAmJgorCQkgICAgIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0JSSURHRUQpKQorCQkJcmV0dXJuIE5PTUFUQ0g7CisJCWlmICgoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfSVNJTikgJiYKKwkJICAgICEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9JU0lOKSkKKwkJCXJldHVybiBOT01BVENIOworCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX0lTT1VUKSAmJgorCQkgICAgIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0lTT1VUKSkKKwkJCXJldHVybiBOT01BVENIOworCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX0lOKSAmJgorCQkgICAgIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0lOKSkKKwkJCXJldHVybiBOT01BVENIOworCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX09VVCkgJiYKKwkJICAgICEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9PVVQpKQorCQkJcmV0dXJuIE5PTUFUQ0g7CisJCXJldHVybiBNQVRDSDsKKwl9CisKKwkvKiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaW4gdGhlIEZPUldBUkQgYW5kIFBPU1RST1VUSU5HIGNoYWlucyAqLworCWlmICgoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfQlJJREdFRCkgJiYKKwkgICAgKCEhKG5mX2JyaWRnZS0+bWFzayAmIEJSTkZfQlJJREdFRCkgXgorCSAgICAhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfQlJJREdFRCkpKQorCQlyZXR1cm4gTk9NQVRDSDsKKworCWlmICgoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfSVNJTiAmJgorCSAgICAoIW5mX2JyaWRnZS0+cGh5c2luZGV2IF4gISEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9JU0lOKSkpIHx8CisJICAgIChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9JU09VVCAmJgorCSAgICAoIW5mX2JyaWRnZS0+cGh5c291dGRldiBeICEhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfSVNPVVQpKSkpCisJCXJldHVybiBOT01BVENIOworCisJaWYgKCEoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfSU4pKQorCQlnb3RvIG1hdGNoX291dGRldjsKKwlpbmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2ID8gbmZfYnJpZGdlLT5waHlzaW5kZXYtPm5hbWUgOiBudWxsZGV2bmFtZTsKKwlmb3IgKGkgPSAwLCByZXQgPSAwOyBpIDwgSUZOQU1TSVovc2l6ZW9mKHVuc2lnbmVkIGludCk7IGkrKykgeworCQlyZXQgfD0gKCgoY29uc3QgdW5zaWduZWQgaW50ICopaW5kZXYpW2ldCisJCQleICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+cGh5c2luZGV2KVtpXSkKKwkJCSYgKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmZvLT5pbl9tYXNrKVtpXTsKKwl9CisKKwlpZiAoKHJldCA9PSAwKSBeICEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9JTikpCisJCXJldHVybiBOT01BVENIOworCittYXRjaF9vdXRkZXY6CisJaWYgKCEoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfT1VUKSkKKwkJcmV0dXJuIE1BVENIOworCW91dGRldiA9IG5mX2JyaWRnZS0+cGh5c291dGRldiA/CisJCSBuZl9icmlkZ2UtPnBoeXNvdXRkZXYtPm5hbWUgOiBudWxsZGV2bmFtZTsKKwlmb3IgKGkgPSAwLCByZXQgPSAwOyBpIDwgSUZOQU1TSVovc2l6ZW9mKHVuc2lnbmVkIGludCk7IGkrKykgeworCQlyZXQgfD0gKCgoY29uc3QgdW5zaWduZWQgaW50ICopb3V0ZGV2KVtpXQorCQkJXiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPnBoeXNvdXRkZXYpW2ldKQorCQkJJiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPm91dF9tYXNrKVtpXTsKKwl9CisKKwlyZXR1cm4gKHJldCAhPSAwKSBeICEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9PVVQpOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmlwLAorCQkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IHh0X3BoeXNkZXZfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9waHlzZGV2X2luZm8pKSkKKwkJcmV0dXJuIDA7CisJaWYgKCEoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfTUFTSykgfHwKKwkgICAgaW5mby0+Yml0bWFzayAmIH5YVF9QSFlTREVWX09QX01BU0spCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHBoeXNkZXZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInBoeXNkZXYiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHBoeXNkZXY2X21hdGNoID0geworCS5uYW1lCQk9ICJwaHlzZGV2IiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmcGh5c2Rldl9tYXRjaCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnBoeXNkZXY2X21hdGNoKTsKKwlpZiAocmV0IDwgMCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmcGh5c2Rldl9tYXRjaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnBoeXNkZXZfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZwaHlzZGV2Nl9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3BrdHR5cGUuYyBiL25ldC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMWIyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3BrdHR5cGUuYwpAQCAtMCwwICsxLDgyIEBACisvKiAoQykgMTk5OS0yMDAxIE1pY2hhbCBMdWR2aWcgPG1pY2hhbEBsb2dpeC5jej4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3BrdHR5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWljaGFsIEx1ZHZpZyA8bWljaGFsQGxvZ2l4LmN6PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUCB0YWJsZXMgbWF0Y2ggdG8gbWF0Y2ggb24gbGlua2xheWVyIHBhY2tldCB0eXBlIik7CitNT0RVTEVfQUxJQVMoImlwdF9wa3R0eXBlIik7CitNT0RVTEVfQUxJQVMoImlwNnRfcGt0dHlwZSIpOworCitzdGF0aWMgaW50IG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCB4dF9wa3R0eXBlX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisKKwlyZXR1cm4gKHNrYi0+cGt0X3R5cGUgPT0gaW5mby0+cGt0dHlwZSkgXiBpbmZvLT5pbnZlcnQ7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSAgIGNvbnN0IHZvaWQgKmlwLAorCQkgICB2b2lkICptYXRjaGluZm8sCisJCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3BrdHR5cGVfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHBrdHR5cGVfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInBrdHR5cGUiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9Oworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBwa3R0eXBlNl9tYXRjaCA9IHsKKwkubmFtZQkJPSAicGt0dHlwZSIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnBrdHR5cGVfbWF0Y2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnBrdHR5cGU2X21hdGNoKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZwa3R0eXBlX21hdGNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmcGt0dHlwZV9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnBrdHR5cGU2X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcmVhbG0uYyBiL25ldC9uZXRmaWx0ZXIveHRfcmVhbG0uYwpzaW1pbGFyaXR5IGluZGV4IDcwJQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlYWxtLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfcmVhbG0uYwppbmRleCA1NGE2ODk3Li4yYjdlMTc4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlYWxtLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9yZWFsbS5jCkBAIC0xNCwxMiArMTQsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWFsbS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAKIE1PRFVMRV9BVVRIT1IoIlNhbXBzYSBSYW50YSA8c2FtcHNhQG5ldHNvbmljLmZpPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyByZWFsbSBtYXRjaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYX3RhYmxlcyByZWFsbSBtYXRjaCIpOworTU9EVUxFX0FMSUFTKCJpcHRfcmVhbG0iKTsKIAogc3RhdGljIGludAogbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTI3LDE2ICsyOSwxNyBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X3JlYWxtX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X3JlYWxtX2luZm8gKmluZm8gPSBtYXRjaGluZm87CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CiAgICAgCiAJcmV0dXJuIChpbmZvLT5pZCA9PSAoZHN0LT50Y2xhc3NpZCAmIGluZm8tPm1hc2spKSBeIGluZm8tPmludmVydDsKIH0KIAogc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICppcCwKICAgICAgICAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpAQCAtNDQsMTggKzQ3LDE4IEBACiAJaWYgKGhvb2tfbWFzawogCSAgICAmIH4oKDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HKSB8ICgxIDw8IE5GX0lQX0ZPUldBUkQpIHwKIAkgICAgICAgICgxIDw8IE5GX0lQX0xPQ0FMX09VVCkgfCAoMSA8PCBORl9JUF9MT0NBTF9JTikpKSB7Ci0JCXByaW50aygiaXB0X3JlYWxtOiBvbmx5IHZhbGlkIGZvciBQT1NUX1JPVVRJTkcsIExPQ0FMX09VVCwgIgorCQlwcmludGsoInh0X3JlYWxtOiBvbmx5IHZhbGlkIGZvciBQT1NUX1JPVVRJTkcsIExPQ0FMX09VVCwgIgogCQkgICAgICAgIkxPQ0FMX0lOIG9yIEZPUldBUkQuXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3JlYWxtX2luZm8pKSkgewotCQlwcmludGsoImlwdF9yZWFsbTogaW52YWxpZCBtYXRjaHNpemUuXG4iKTsKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfcmVhbG1faW5mbykpKSB7CisJCXByaW50aygieHRfcmVhbG06IGludmFsaWQgbWF0Y2hzaXplLlxuIik7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggcmVhbG1fbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHJlYWxtX21hdGNoID0gewogCS5uYW1lCQk9ICJyZWFsbSIsCiAJLm1hdGNoCQk9IG1hdGNoLCAKIAkuY2hlY2tlbnRyeQk9IGNoZWNrLApAQCAtNjQsMTIgKzY3LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZyZWFsbV9tYXRjaCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZyZWFsbV9tYXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnJlYWxtX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZyZWFsbV9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9zY3RwLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3NjdHAuYwpzaW1pbGFyaXR5IGluZGV4IDYyJQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3NjdHAuYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9zY3RwLmMKaW5kZXggZmUyYjMyNy4uMTBmYmZjNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9zY3RwLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKQEAgLTEsMTAgKzEsMTggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L3NjdHAuaD4KIAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9zY3RwLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3NjdHAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIktpcmFuIEt1bWFyIEltbWlkaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXRjaCBmb3IgU0NUUCBwcm90b2NvbCBwYWNrZXRzIik7CitNT0RVTEVfQUxJQVMoImlwdF9zY3RwIik7CiAKICNpZmRlZiBERUJVR19TQ1RQCiAjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKGZvcm1hdCAsICMjIGFyZ3MpCkBAIC0xNiw3ICsyNCw3IEBACiAJCQkJCSAgICAgIHx8ICghISgoaW52ZmxhZykgJiAob3B0aW9uKSkgXiAoY29uZCkpKQogCiBzdGF0aWMgaW50Ci1tYXRjaF9mbGFncyhjb25zdCBzdHJ1Y3QgaXB0X3NjdHBfZmxhZ19pbmZvICpmbGFnX2luZm8sCittYXRjaF9mbGFncyhjb25zdCBzdHJ1Y3QgeHRfc2N0cF9mbGFnX2luZm8gKmZsYWdfaW5mbywKIAkgICAgY29uc3QgaW50IGZsYWdfY291bnQsCiAJICAgIHVfaW50OF90IGNodW5rdHlwZSwKIAkgICAgdV9pbnQ4X3QgY2h1bmtmbGFncykKQEAgLTMyLDE1ICs0MCwxNSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgaW5saW5lIGludAogbWF0Y2hfcGFja2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LAogCSAgICAgY29uc3QgdV9pbnQzMl90ICpjaHVua21hcCwKIAkgICAgIGludCBjaHVua19tYXRjaF90eXBlLAotCSAgICAgY29uc3Qgc3RydWN0IGlwdF9zY3RwX2ZsYWdfaW5mbyAqZmxhZ19pbmZvLAorCSAgICAgY29uc3Qgc3RydWN0IHh0X3NjdHBfZmxhZ19pbmZvICpmbGFnX2luZm8sCiAJICAgICBjb25zdCBpbnQgZmxhZ19jb3VudCwKIAkgICAgIGludCAqaG90ZHJvcCkKIHsKLQlpbnQgb2Zmc2V0OwogCXVfaW50MzJfdCBjaHVua21hcGNvcHlbMjU2IC8gc2l6ZW9mICh1X2ludDMyX3QpXTsKIAlzY3RwX2NodW5raGRyX3QgX3NjaCwgKnNjaDsKIApAQCAtNTIsNyArNjAsNiBAQAogCQlTQ1RQX0NIVU5LTUFQX0NPUFkoY2h1bmttYXBjb3B5LCBjaHVua21hcCk7CiAJfQogCi0Jb2Zmc2V0ID0gc2tiLT5uaC5pcGgtPmlobCAqIDQgKyBzaXplb2YgKHNjdHBfc2N0cGhkcl90KTsKIAlkbyB7CiAJCXNjaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9zY2gpLCAmX3NjaCk7CiAJCWlmIChzY2ggPT0gTlVMTCkgewpAQCAtMTE4LDE5ICsxMjUsMjAgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9zY3RwX2luZm8gKmluZm87CisJY29uc3Qgc3RydWN0IHh0X3NjdHBfaW5mbyAqaW5mbzsKIAlzY3RwX3NjdHBoZHJfdCBfc2gsICpzaDsKIAotCWluZm8gPSAoY29uc3Qgc3RydWN0IGlwdF9zY3RwX2luZm8gKiltYXRjaGluZm87CisJaW5mbyA9IChjb25zdCBzdHJ1Y3QgeHRfc2N0cF9pbmZvICopbWF0Y2hpbmZvOwogCiAJaWYgKG9mZnNldCkgewogCQlkdXByaW50ZigiRHJvcHBpbmcgbm9uLWZpcnN0IGZyYWdtZW50Li4gRklYTUVcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJCi0Jc2ggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsIHNpemVvZihfc2gpLCAmX3NoKTsKKwlzaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfc2gpLCAmX3NoKTsKIAlpZiAoc2ggPT0gTlVMTCkgewogCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBUQ1Agb2Zmc2V0PTAgdGlueWdyYW0uXG4iKTsKIAkJKmhvdGRyb3AgPSAxOwpAQCAtMTQwLDY0ICsxNDgsMTAzIEBACiAKIAlyZXR1cm4gIFNDQ0hFQ0soKChudG9ocyhzaC0+c291cmNlKSA+PSBpbmZvLT5zcHRzWzBdKSAKIAkJCSYmIChudG9ocyhzaC0+c291cmNlKSA8PSBpbmZvLT5zcHRzWzFdKSksIAotCQkgICAJSVBUX1NDVFBfU1JDX1BPUlRTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCisJCSAgIAlYVF9TQ1RQX1NSQ19QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQogCQkmJiBTQ0NIRUNLKCgobnRvaHMoc2gtPmRlc3QpID49IGluZm8tPmRwdHNbMF0pIAogCQkJJiYgKG50b2hzKHNoLT5kZXN0KSA8PSBpbmZvLT5kcHRzWzFdKSksIAotCQkJSVBUX1NDVFBfREVTVF9QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQotCQkmJiBTQ0NIRUNLKG1hdGNoX3BhY2tldChza2IsIGluZm8tPmNodW5rbWFwLCBpbmZvLT5jaHVua19tYXRjaF90eXBlLAorCQkJWFRfU0NUUF9ERVNUX1BPUlRTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCisJCSYmIFNDQ0hFQ0sobWF0Y2hfcGFja2V0KHNrYiwgcHJvdG9mZiwKKwkJCQkJaW5mby0+Y2h1bmttYXAsIGluZm8tPmNodW5rX21hdGNoX3R5cGUsCiAgCQkJCQlpbmZvLT5mbGFnX2luZm8sIGluZm8tPmZsYWdfY291bnQsIAogCQkJCQlob3Rkcm9wKSwKLQkJCSAgIElQVF9TQ1RQX0NIVU5LX1RZUEVTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpOworCQkJICAgWFRfU0NUUF9DSFVOS19UWVBFUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKTsKIH0KIAogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJICAgY29uc3Qgdm9pZCAqaW5mLAogCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9zY3RwX2luZm8gKmluZm87CisJY29uc3Qgc3RydWN0IHh0X3NjdHBfaW5mbyAqaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IGluZjsKIAotCWluZm8gPSAoY29uc3Qgc3RydWN0IGlwdF9zY3RwX2luZm8gKiltYXRjaGluZm87CisJaW5mbyA9IChjb25zdCBzdHJ1Y3QgeHRfc2N0cF9pbmZvICopbWF0Y2hpbmZvOwogCiAJcmV0dXJuIGlwLT5wcm90byA9PSBJUFBST1RPX1NDVFAKLQkJJiYgIShpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKQotCQkmJiBtYXRjaHNpemUgPT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3NjdHBfaW5mbykpCi0JCSYmICEoaW5mby0+ZmxhZ3MgJiB+SVBUX1NDVFBfVkFMSURfRkxBR1MpCi0JCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+SVBUX1NDVFBfVkFMSURfRkxBR1MpCisJCSYmICEoaXAtPmludmZsYWdzICYgWFRfSU5WX1BST1RPKQorCQkmJiBtYXRjaHNpemUgPT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9zY3RwX2luZm8pKQorCQkmJiAhKGluZm8tPmZsYWdzICYgflhUX1NDVFBfVkFMSURfRkxBR1MpCisJCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+WFRfU0NUUF9WQUxJRF9GTEFHUykKIAkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5pbmZvLT5mbGFncykKLQkJJiYgKCghKGluZm8tPmZsYWdzICYgSVBUX1NDVFBfQ0hVTktfVFlQRVMpKSB8fCAKKwkJJiYgKCghKGluZm8tPmZsYWdzICYgWFRfU0NUUF9DSFVOS19UWVBFUykpIHx8IAogCQkJKGluZm8tPmNodW5rX21hdGNoX3R5cGUgJgogCQkJCShTQ1RQX0NIVU5LX01BVENIX0FMTCAKIAkJCQl8IFNDVFBfQ0hVTktfTUFUQ0hfQU5ZCiAJCQkJfCBTQ1RQX0NIVU5LX01BVENIX09OTFkpKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHNjdHBfbWF0Y2ggPSAKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnk2KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICBjb25zdCB2b2lkICppbmYsCisJICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgeHRfc2N0cF9pbmZvICppbmZvOworCWNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAgPSBpbmY7CisKKwlpbmZvID0gKGNvbnN0IHN0cnVjdCB4dF9zY3RwX2luZm8gKiltYXRjaGluZm87CisKKwlyZXR1cm4gaXAtPnByb3RvID09IElQUFJPVE9fU0NUUAorCQkmJiAhKGlwLT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykKKwkJJiYgbWF0Y2hzaXplID09IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfc2N0cF9pbmZvKSkKKwkJJiYgIShpbmZvLT5mbGFncyAmIH5YVF9TQ1RQX1ZBTElEX0ZMQUdTKQorCQkmJiAhKGluZm8tPmludmZsYWdzICYgflhUX1NDVFBfVkFMSURfRkxBR1MpCisJCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+aW5mby0+ZmxhZ3MpCisJCSYmICgoIShpbmZvLT5mbGFncyAmIFhUX1NDVFBfQ0hVTktfVFlQRVMpKSB8fCAKKwkJCShpbmZvLT5jaHVua19tYXRjaF90eXBlICYKKwkJCQkoU0NUUF9DSFVOS19NQVRDSF9BTEwgCisJCQkJfCBTQ1RQX0NIVU5LX01BVENIX0FOWQorCQkJCXwgU0NUUF9DSFVOS19NQVRDSF9PTkxZKSkpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggc2N0cF9tYXRjaCA9IAogeyAKLQkubGlzdCA9IHsgTlVMTCwgTlVMTH0sCiAJLm5hbWUgPSAic2N0cCIsCiAJLm1hdGNoID0gJm1hdGNoLAogCS5jaGVja2VudHJ5ID0gJmNoZWNrZW50cnksCi0JLmRlc3Ryb3kgPSBOVUxMLAorCS5tZSA9IFRISVNfTU9EVUxFCit9Oworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBzY3RwNl9tYXRjaCA9IAoreyAKKwkubmFtZSA9ICJzY3RwIiwKKwkubWF0Y2ggPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkgPSAmY2hlY2tlbnRyeTYsCiAJLm1lID0gVEhJU19NT0RVTEUKIH07CiAKKwogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJnNjdHBfbWF0Y2gpOworCWludCByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnNjdHBfbWF0Y2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnNjdHA2X21hdGNoKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZzY3RwX21hdGNoKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnNjdHBfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZzY3RwNl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmc2N0cF9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwogbW9kdWxlX2V4aXQoZmluaSk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIktpcmFuIEt1bWFyIEltbWlkaSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXRjaCBmb3IgU0NUUCBwcm90b2NvbCBwYWNrZXRzIik7Ci0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc3RhdGUuYyBiL25ldC9uZXRmaWx0ZXIveHRfc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWNlODA4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9zdGF0ZS5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggY29ubmVjdGlvbiB0cmFja2luZyBpbmZvcm1hdGlvbi4gKi8KKworLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNSBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9zdGF0ZS5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwWzZdX3RhYmxlcyBjb25uZWN0aW9uIHRyYWNraW5nIHN0YXRlIG1hdGNoIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfc3RhdGUiKTsKK01PRFVMRV9BTElBUygiaXA2dF9zdGF0ZSIpOworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfc3RhdGVfaW5mbyAqc2luZm8gPSBtYXRjaGluZm87CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJdW5zaWduZWQgaW50IHN0YXRlYml0OworCisJaWYgKG5mX2N0X2lzX3VudHJhY2tlZChza2IpKQorCQlzdGF0ZWJpdCA9IFhUX1NUQVRFX1VOVFJBQ0tFRDsKKwllbHNlIGlmICghbmZfY3RfZ2V0X2N0aW5mbyhza2IsICZjdGluZm8pKQorCQlzdGF0ZWJpdCA9IFhUX1NUQVRFX0lOVkFMSUQ7CisJZWxzZQorCQlzdGF0ZWJpdCA9IFhUX1NUQVRFX0JJVChjdGluZm8pOworCisJcmV0dXJuIChzaW5mby0+c3RhdGVtYXNrICYgc3RhdGViaXQpOworfQorCitzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJIGNvbnN0IHZvaWQgKmlwLAorCQkgdm9pZCAqbWF0Y2hpbmZvLAorCQkgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3N0YXRlX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBzdGF0ZV9tYXRjaCA9IHsKKwkubmFtZQkJPSAic3RhdGUiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBzdGF0ZTZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInN0YXRlIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJbmVlZF9jb25udHJhY2soKTsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZzdGF0ZV9tYXRjaCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnN0YXRlNl9tYXRjaCk7CisJaWYgKHJldCA8IDApCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwmc3RhdGVfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZzdGF0ZV9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnN0YXRlNl9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3N0cmluZy5jIGIvbmV0L25ldGZpbHRlci94dF9zdHJpbmcuYwpzaW1pbGFyaXR5IGluZGV4IDY2JQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3N0cmluZy5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X3N0cmluZy5jCmluZGV4IGI1ZGVmMjAuLjdjN2Q1YzggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc3RyaW5nLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zdHJpbmcuYwpAQCAtMTEsMjMgKzExLDI2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90ZXh0c2VhcmNoLmg+CiAKIE1PRFVMRV9BVVRIT1IoIlBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BldXJvZGV2Lm5ldD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIHN0cmluZyBtYXRjaCBtb2R1bGUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X3N0cmluZyIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X3N0cmluZyIpOwogCiBzdGF0aWMgaW50IG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCQkgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogCQkgaW50IG9mZnNldCwKKwkJIHVuc2lnbmVkIGludCBwcm90b2ZmLAogCQkgaW50ICpob3Rkcm9wKQogewogCXN0cnVjdCB0c19zdGF0ZSBzdGF0ZTsKLQlzdHJ1Y3QgaXB0X3N0cmluZ19pbmZvICpjb25mID0gKHN0cnVjdCBpcHRfc3RyaW5nX2luZm8gKikgbWF0Y2hpbmZvOworCXN0cnVjdCB4dF9zdHJpbmdfaW5mbyAqY29uZiA9IChzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKikgbWF0Y2hpbmZvOwogCiAJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCB0c19zdGF0ZSkpOwogCkBAIC0zNiwxOCArMzksMTggQEAKIAkJCSAgICAgIT0gVUlOVF9NQVgpICYmICFjb25mLT5pbnZlcnQ7CiB9CiAKLSNkZWZpbmUgU1RSSU5HX1RFWFRfUFJJVihtKSAoKHN0cnVjdCBpcHRfc3RyaW5nX2luZm8gKikgbSkKKyNkZWZpbmUgU1RSSU5HX1RFWFRfUFJJVihtKSAoKHN0cnVjdCB4dF9zdHJpbmdfaW5mbyAqKSBtKQogCiBzdGF0aWMgaW50IGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJICAgICAgY29uc3Qgdm9pZCAqaXAsCiAJCSAgICAgIHZvaWQgKm1hdGNoaW5mbywKIAkJICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQlzdHJ1Y3QgaXB0X3N0cmluZ19pbmZvICpjb25mID0gbWF0Y2hpbmZvOworCXN0cnVjdCB4dF9zdHJpbmdfaW5mbyAqY29uZiA9IG1hdGNoaW5mbzsKIAlzdHJ1Y3QgdHNfY29uZmlnICp0c19jb25mOwogCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RyaW5nX2luZm8pKSkKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfc3RyaW5nX2luZm8pKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBEYW1uLCBjYW4ndCBoYW5kbGUgdGhpcyBjYXNlIHByb3Blcmx5IHdpdGggaXB0YWJsZXMuLi4gKi8KQEAgLTY5LDcgKzcyLDE0IEBACiAJdGV4dHNlYXJjaF9kZXN0cm95KFNUUklOR19URVhUX1BSSVYobWF0Y2hpbmZvKS0+Y29uZmlnKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggc3RyaW5nX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBzdHJpbmdfbWF0Y2ggPSB7CisJLm5hbWUgCQk9ICJzdHJpbmciLAorCS5tYXRjaCAJCT0gbWF0Y2gsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCS5kZXN0cm95IAk9IGRlc3Ryb3ksCisJLm1lIAkJPSBUSElTX01PRFVMRQorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggc3RyaW5nNl9tYXRjaCA9IHsKIAkubmFtZSAJCT0gInN0cmluZyIsCiAJLm1hdGNoIAkJPSBtYXRjaCwKIAkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCkBAIC03OSwxMiArODksMjIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJnN0cmluZ19tYXRjaCk7CisJaW50IHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZzdHJpbmdfbWF0Y2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZzdHJpbmc2X21hdGNoKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZzdHJpbmdfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmc3RyaW5nX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZzdHJpbmdfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZzdHJpbmc2X21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3RjcG1zcy5jIGIvbmV0L25ldGZpbHRlci94dF90Y3Btc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Y3ZjUzMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfdGNwbXNzLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggVENQIE1TUyB2YWx1ZXMuICovCisKKy8qIENvcHlyaWdodCAoQykgMjAwMCBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyAqIFBvcnRpb25zIChDKSAyMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF90Y3Btc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworI2RlZmluZSBUSF9TWU4gMHgwMgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgVENQIE1TUyBtYXRjaCBtb2R1bGUiKTsKK01PRFVMRV9BTElBUygiaXB0X3RjcG1zcyIpOworCisvKiBSZXR1cm5zIDEgaWYgdGhlIG1zcyBvcHRpb24gaXMgc2V0IGFuZCBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cittc3NvcHRpb25fbWF0Y2godV9pbnQxNl90IG1pbiwgdV9pbnQxNl90IG1heCwKKwkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJdW5zaWduZWQgaW50IHByb3RvZmYsCisJCWludCBpbnZlcnQsCisJCWludCAqaG90ZHJvcCkKK3sKKwlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CisJLyogdGNwLmRvZmYgaXMgb25seSA0IGJpdHMsIGllLiBtYXggMTUgKiA0IGJ5dGVzICovCisJdTggX29wdFsxNSAqIDQgLSBzaXplb2YoX3RjcGgpXSwgKm9wOworCXVuc2lnbmVkIGludCBpLCBvcHRsZW47CisKKwkvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSB3aG9sZSBoZWFkZXIsIGRyb3AgcGFja2V0LiAqLworCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKKwlpZiAodGggPT0gTlVMTCkKKwkJZ290byBkcm9waXQ7CisKKwkvKiBNYWxmb3JtZWQuICovCisJaWYgKHRoLT5kb2ZmKjQgPCBzaXplb2YoKnRoKSkKKwkJZ290byBkcm9waXQ7CisKKwlvcHRsZW4gPSB0aC0+ZG9mZio0IC0gc2l6ZW9mKCp0aCk7CisJaWYgKCFvcHRsZW4pCisJCWdvdG8gb3V0OworCisJLyogVHJ1bmNhdGVkIG9wdGlvbnMuICovCisJb3AgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmICsgc2l6ZW9mKCp0aCksIG9wdGxlbiwgX29wdCk7CisJaWYgKG9wID09IE5VTEwpCisJCWdvdG8gZHJvcGl0OworCisJZm9yIChpID0gMDsgaSA8IG9wdGxlbjsgKSB7CisJCWlmIChvcFtpXSA9PSBUQ1BPUFRfTVNTCisJCSAgICAmJiAob3B0bGVuIC0gaSkgPj0gVENQT0xFTl9NU1MKKwkJICAgICYmIG9wW2krMV0gPT0gVENQT0xFTl9NU1MpIHsKKwkJCXVfaW50MTZfdCBtc3N2YWw7CisKKwkJCW1zc3ZhbCA9IChvcFtpKzJdIDw8IDgpIHwgb3BbaSszXTsKKwkJCQorCQkJcmV0dXJuIChtc3N2YWwgPj0gbWluICYmIG1zc3ZhbCA8PSBtYXgpIF4gaW52ZXJ0OworCQl9CisJCWlmIChvcFtpXSA8IDIpIGkrKzsKKwkJZWxzZSBpICs9IG9wW2krMV0/OjE7CisJfQorb3V0OgorCXJldHVybiBpbnZlcnQ7CisKKyBkcm9waXQ6CisJKmhvdGRyb3AgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfdGNwbXNzX21hdGNoX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisKKwlyZXR1cm4gbXNzb3B0aW9uX21hdGNoKGluZm8tPm1zc19taW4sIGluZm8tPm1zc19tYXgsIHNrYiwgcHJvdG9mZiwKKwkJCSAgICAgICBpbmZvLT5pbnZlcnQsIGhvdGRyb3ApOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgICAgICAgY29uc3Qgdm9pZCAqaXBpbmZvLAorICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAgPSBpcGluZm87CisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3RjcG1zc19tYXRjaF9pbmZvKSkpCisJCXJldHVybiAwOworCisJLyogTXVzdCBzcGVjaWZ5IC1wIHRjcCAqLworCWlmIChpcC0+cHJvdG8gIT0gSVBQUk9UT19UQ1AgfHwgKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pKSB7CisJCXByaW50aygidGNwbXNzOiBPbmx5IHdvcmtzIG9uIFRDUCBwYWNrZXRzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnk2KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICBjb25zdCB2b2lkICppcGluZm8sCisgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwID0gaXBpbmZvOworCisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3RjcG1zc19tYXRjaF9pbmZvKSkpCisJCXJldHVybiAwOworCisJLyogTXVzdCBzcGVjaWZ5IC1wIHRjcCAqLworCWlmIChpcC0+cHJvdG8gIT0gSVBQUk9UT19UQ1AgfHwgKGlwLT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykpIHsKKwkJcHJpbnRrKCJ0Y3Btc3M6IE9ubHkgd29ya3Mgb24gVENQIHBhY2tldHNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB0Y3Btc3NfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInRjcG1zcyIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdGNwbXNzNl9tYXRjaCA9IHsKKwkubmFtZQkJPSAidGNwbXNzIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnk2LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnRjcG1zc19tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmdGNwbXNzNl9tYXRjaCk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmdGNwbXNzX21hdGNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnRjcG1zczZfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnRjcG1zc19tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3RjcHVkcC5jIGIvbmV0L25ldGZpbHRlci94dF90Y3B1ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjljODExCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF90Y3B1ZHAuYwpAQCAtMCwwICsxLDMzNCBAQAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgorCitNT0RVTEVfREVTQ1JJUFRJT04oInhfdGFibGVzIG1hdGNoIGZvciBUQ1AgYW5kIFVEUCwgc3VwcG9ydHMgSVB2NCBhbmQgSVB2NiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJ4dF90Y3AiKTsKK01PRFVMRV9BTElBUygieHRfdWRwIik7CitNT0RVTEVfQUxJQVMoImlwdF91ZHAiKTsKK01PRFVMRV9BTElBUygiaXB0X3RjcCIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X3VkcCIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X3RjcCIpOworCisjaWZkZWYgREVCVUdfSVBfRklSRVdBTExfVVNFUgorI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKworLyogUmV0dXJucyAxIGlmIHRoZSBwb3J0IGlzIG1hdGNoZWQgYnkgdGhlIHJhbmdlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGlubGluZSBpbnQKK3BvcnRfbWF0Y2godV9pbnQxNl90IG1pbiwgdV9pbnQxNl90IG1heCwgdV9pbnQxNl90IHBvcnQsIGludCBpbnZlcnQpCit7CisJaW50IHJldDsKKworCXJldCA9IChwb3J0ID49IG1pbiAmJiBwb3J0IDw9IG1heCkgXiBpbnZlcnQ7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordGNwX2ZpbmRfb3B0aW9uKHVfaW50OF90IG9wdGlvbiwKKwkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJdW5zaWduZWQgaW50IHByb3RvZmYsCisJCXVuc2lnbmVkIGludCBvcHRsZW4sCisJCWludCBpbnZlcnQsCisJCWludCAqaG90ZHJvcCkKK3sKKwkvKiB0Y3AuZG9mZiBpcyBvbmx5IDQgYml0cywgaWUuIG1heCAxNSAqIDQgYnl0ZXMgKi8KKwl1X2ludDhfdCBfb3B0WzYwIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpXSwgKm9wOworCXVuc2lnbmVkIGludCBpOworCisJZHVwcmludGYoInRjcF9tYXRjaDogZmluZGluZyBvcHRpb25cbiIpOworCisJaWYgKCFvcHRsZW4pCisJCXJldHVybiBpbnZlcnQ7CisKKwkvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSB3aG9sZSBoZWFkZXIsIGRyb3AgcGFja2V0LiAqLworCW9wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSwKKwkJCQlvcHRsZW4sIF9vcHQpOworCWlmIChvcCA9PSBOVUxMKSB7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG9wdGxlbjsgKSB7CisJCWlmIChvcFtpXSA9PSBvcHRpb24pIHJldHVybiAhaW52ZXJ0OworCQlpZiAob3BbaV0gPCAyKSBpKys7CisJCWVsc2UgaSArPSBvcFtpKzFdPzoxOworCX0KKworCXJldHVybiBpbnZlcnQ7Cit9CisKK3N0YXRpYyBpbnQKK3RjcF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKwkgIGludCBvZmZzZXQsCisJICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkgIGludCAqaG90ZHJvcCkKK3sKKwlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CisJY29uc3Qgc3RydWN0IHh0X3RjcCAqdGNwaW5mbyA9IG1hdGNoaW5mbzsKKworCWlmIChvZmZzZXQpIHsKKwkJLyogVG8gcXVvdGUgQWxhbjoKKworCQkgICBEb24ndCBhbGxvdyBhIGZyYWdtZW50IG9mIFRDUCA4IGJ5dGVzIGluLiBOb2JvZHkgbm9ybWFsCisJCSAgIGNhdXNlcyB0aGlzLiBJdHMgYSBjcmFja2VyIHRyeWluZyB0byBicmVhayBpbiBieSBkb2luZyBhCisJCSAgIGZsYWcgb3ZlcndyaXRlIHRvIHBhc3MgdGhlIGRpcmVjdGlvbiBjaGVja3MuCisJCSovCisJCWlmIChvZmZzZXQgPT0gMSkgeworCQkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVENQIG9mZnNldD0xIGZyYWcuXG4iKTsKKwkJCSpob3Rkcm9wID0gMTsKKwkJfQorCQkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLworCQlyZXR1cm4gMDsKKwl9CisKKyNkZWZpbmUgRldJTlZUQ1AoYm9vbCxpbnZmbGcpICgoYm9vbCkgXiAhISh0Y3BpbmZvLT5pbnZmbGFncyAmIGludmZsZykpCisKKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7CisJaWYgKHRoID09IE5VTEwpIHsKKwkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKKwkJICAgY2FuJ3QuICBIZW5jZSwgbm8gY2hvaWNlIGJ1dCB0byBkcm9wLiAqLworCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBUQ1Agb2Zmc2V0PTAgdGlueWdyYW0uXG4iKTsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXBvcnRfbWF0Y2godGNwaW5mby0+c3B0c1swXSwgdGNwaW5mby0+c3B0c1sxXSwKKwkJCW50b2hzKHRoLT5zb3VyY2UpLAorCQkJISEodGNwaW5mby0+aW52ZmxhZ3MgJiBYVF9UQ1BfSU5WX1NSQ1BUKSkpCisJCXJldHVybiAwOworCWlmICghcG9ydF9tYXRjaCh0Y3BpbmZvLT5kcHRzWzBdLCB0Y3BpbmZvLT5kcHRzWzFdLAorCQkJbnRvaHModGgtPmRlc3QpLAorCQkJISEodGNwaW5mby0+aW52ZmxhZ3MgJiBYVF9UQ1BfSU5WX0RTVFBUKSkpCisJCXJldHVybiAwOworCWlmICghRldJTlZUQ1AoKCgodW5zaWduZWQgY2hhciAqKXRoKVsxM10gJiB0Y3BpbmZvLT5mbGdfbWFzaykKKwkJICAgICAgPT0gdGNwaW5mby0+ZmxnX2NtcCwKKwkJICAgICAgWFRfVENQX0lOVl9GTEFHUykpCisJCXJldHVybiAwOworCWlmICh0Y3BpbmZvLT5vcHRpb24pIHsKKwkJaWYgKHRoLT5kb2ZmICogNCA8IHNpemVvZihfdGNwaCkpIHsKKwkJCSpob3Rkcm9wID0gMTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmICghdGNwX2ZpbmRfb3B0aW9uKHRjcGluZm8tPm9wdGlvbiwgc2tiLCBwcm90b2ZmLAorCQkJCSAgICAgdGgtPmRvZmYqNCAtIHNpemVvZihfdGNwaCksCisJCQkJICAgICB0Y3BpbmZvLT5pbnZmbGFncyAmIFhUX1RDUF9JTlZfT1BUSU9OLAorCQkJCSAgICAgaG90ZHJvcCkpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KK3N0YXRpYyBpbnQKK3RjcF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICAgICAgY29uc3Qgdm9pZCAqaW5mbywKKwkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfdGNwICp0Y3BpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IFRDUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KKwlyZXR1cm4gaXAtPnByb3RvID09IElQUFJPVE9fVENQCisJCSYmICEoaXAtPmludmZsYWdzICYgWFRfSU5WX1BST1RPKQorCQkmJiBtYXRjaHNpemUgPT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF90Y3ApKQorCQkmJiAhKHRjcGluZm8tPmludmZsYWdzICYgflhUX1RDUF9JTlZfTUFTSyk7Cit9CisKKy8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KK3N0YXRpYyBpbnQKK3RjcDZfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgICAgIGNvbnN0IHZvaWQgKmVudHJ5LAorCSAgICAgICB2b2lkICptYXRjaGluZm8sCisJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2ID0gZW50cnk7CisJY29uc3Qgc3RydWN0IHh0X3RjcCAqdGNwaW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBUQ1AsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCisJcmV0dXJuIGlwdjYtPnByb3RvID09IElQUFJPVE9fVENQCisJCSYmICEoaXB2Ni0+aW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pCisJCSYmIG1hdGNoc2l6ZSA9PSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3RjcCkpCisJCSYmICEodGNwaW5mby0+aW52ZmxhZ3MgJiB+WFRfVENQX0lOVl9NQVNLKTsKK30KKworCitzdGF0aWMgaW50Cit1ZHBfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICBjb25zdCB2b2lkICptYXRjaGluZm8sCisJICBpbnQgb2Zmc2V0LAorCSAgdW5zaWduZWQgaW50IHByb3RvZmYsCisJICBpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IHVkcGhkciBfdWRwaCwgKnVoOworCWNvbnN0IHN0cnVjdCB4dF91ZHAgKnVkcGluZm8gPSBtYXRjaGluZm87CisKKwkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLworCWlmIChvZmZzZXQpCisJCXJldHVybiAwOworCisJdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX3VkcGgpLCAmX3VkcGgpOworCWlmICh1aCA9PSBOVUxMKSB7CisJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCisJCSAgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KKwkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVURQIHRpbnlncmFtLlxuIik7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHBvcnRfbWF0Y2godWRwaW5mby0+c3B0c1swXSwgdWRwaW5mby0+c3B0c1sxXSwKKwkJCSAgbnRvaHModWgtPnNvdXJjZSksCisJCQkgICEhKHVkcGluZm8tPmludmZsYWdzICYgWFRfVURQX0lOVl9TUkNQVCkpCisJCSYmIHBvcnRfbWF0Y2godWRwaW5mby0+ZHB0c1swXSwgdWRwaW5mby0+ZHB0c1sxXSwKKwkJCSAgICAgIG50b2hzKHVoLT5kZXN0KSwKKwkJCSAgICAgICEhKHVkcGluZm8tPmludmZsYWdzICYgWFRfVURQX0lOVl9EU1RQVCkpOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50Cit1ZHBfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgICAgIGNvbnN0IHZvaWQgKmluZm8sCisJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCisJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAgPSBpbmZvOworCWNvbnN0IHN0cnVjdCB4dF91ZHAgKnVkcGluZm8gPSBtYXRjaGluZm87CisKKwkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gVURQLCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLworCWlmIChpcC0+cHJvdG8gIT0gSVBQUk9UT19VRFAgfHwgKGlwLT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykpIHsKKwkJZHVwcmludGYoImlwdF91ZHA6IFByb3RvY29sICV1ICE9ICV1XG4iLCBpcC0+cHJvdG8sCisJCQkgSVBQUk9UT19VRFApOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG1hdGNoaW5mb3NpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF91ZHApKSkgeworCQlkdXByaW50ZigiaXB0X3VkcDogbWF0Y2hzaXplICV1ICE9ICV1XG4iLAorCQkJIG1hdGNoaW5mb3NpemUsIFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfdWRwKSkpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHVkcGluZm8tPmludmZsYWdzICYgflhUX1VEUF9JTlZfTUFTSykgeworCQlkdXByaW50ZigiaXB0X3VkcDogdW5rbm93biBmbGFncyAlWFxuIiwKKwkJCSB1ZHBpbmZvLT5pbnZmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50Cit1ZHA2X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKKwkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKKwkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwdjYgPSBlbnRyeTsKKwljb25zdCBzdHJ1Y3QgeHRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IFVEUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KKwlpZiAoaXB2Ni0+cHJvdG8gIT0gSVBQUk9UT19VRFAgfHwgKGlwdjYtPmludmZsYWdzICYgWFRfSU5WX1BST1RPKSkgeworCQlkdXByaW50ZigiaXA2dF91ZHA6IFByb3RvY29sICV1ICE9ICV1XG4iLCBpcHY2LT5wcm90bywKKwkJCSBJUFBST1RPX1VEUCk7CisJCXJldHVybiAwOworCX0KKwlpZiAobWF0Y2hpbmZvc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3VkcCkpKSB7CisJCWR1cHJpbnRmKCJpcDZ0X3VkcDogbWF0Y2hzaXplICV1ICE9ICV1XG4iLAorCQkJIG1hdGNoaW5mb3NpemUsIFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfdWRwKSkpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHVkcGluZm8tPmludmZsYWdzICYgflhUX1VEUF9JTlZfTUFTSykgeworCQlkdXByaW50ZigiaXA2dF91ZHA6IHVua25vd24gZmxhZ3MgJVhcbiIsCisJCQkgdWRwaW5mby0+aW52ZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB0Y3BfbWF0Y2hzdHJ1Y3QgPSB7CisJLm5hbWUJCT0gInRjcCIsCisJLm1hdGNoCQk9ICZ0Y3BfbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmdGNwX2NoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdGNwNl9tYXRjaHN0cnVjdCA9IHsKKwkubmFtZQkJPSAidGNwIiwKKwkubWF0Y2gJCT0gJnRjcF9tYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZ0Y3A2X2NoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB1ZHBfbWF0Y2hzdHJ1Y3QgPSB7CisJLm5hbWUJCT0gInVkcCIsCisJLm1hdGNoCQk9ICZ1ZHBfbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmdWRwX2NoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdWRwNl9tYXRjaHN0cnVjdCA9IHsKKwkubmFtZQkJPSAidWRwIiwKKwkubWF0Y2gJCT0gJnVkcF9tYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZ1ZHA2X2NoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnRjcF9tYXRjaHN0cnVjdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmdGNwNl9tYXRjaHN0cnVjdCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5yZWdfdGNwOworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnVkcF9tYXRjaHN0cnVjdCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5yZWdfdGNwNjsKKwkKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnVkcDZfbWF0Y2hzdHJ1Y3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnX3VkcDsKKworCXJldHVybiByZXQ7CisKK291dF91bnJlZ191ZHA6CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmdGNwX21hdGNoc3RydWN0KTsKK291dF91bnJlZ190Y3A2OgorCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZ0Y3A2X21hdGNoc3RydWN0KTsKK291dF91bnJlZ190Y3A6CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmdGNwX21hdGNoc3RydWN0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZ1ZHA2X21hdGNoc3RydWN0KTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ1ZHBfbWF0Y2hzdHJ1Y3QpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZ0Y3A2X21hdGNoc3RydWN0KTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ0Y3BfbWF0Y2hzdHJ1Y3QpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwppbmRleCAzYjEzNzg0Li40YWUxNTM4IDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwpAQCAtMjIyLDExICsyMjIsNiBAQAogCQlnb3RvIGVycm91dF9sb2NrZWQ7CiAJfQogCi0JaWYgKCF0cnlfbW9kdWxlX2dldChmYW1pbHktPm93bmVyKSkgewotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyb3V0X2xvY2tlZDsKLQl9Ci0KIAlpZiAoZmFtaWx5LT5pZCA9PSBHRU5MX0lEX0dFTkVSQVRFKSB7CiAJCXUxNiBuZXdpZCA9IGdlbmxfZ2VuZXJhdGVfaWQoKTsKIApAQCAtMjgzLDcgKzI3OCw2IEBACiAJCUlOSVRfTElTVF9IRUFEKCZmYW1pbHktPm9wc19saXN0KTsKIAkJZ2VubF91bmxvY2soKTsKIAotCQltb2R1bGVfcHV0KGZhbWlseS0+b3duZXIpOwogCQlrZnJlZShmYW1pbHktPmF0dHJidWYpOwogCQlnZW5sX2N0cmxfZXZlbnQoQ1RSTF9DTURfREVMRkFNSUxZLCBmYW1pbHkpOwogCQlyZXR1cm4gMDsKQEAgLTUzNSw3ICs1MjksNiBAQAogCS5uYW1lID0gIm5sY3RybCIsCiAJLnZlcnNpb24gPSAweDEsCiAJLm1heGF0dHIgPSBDVFJMX0FUVFJfTUFYLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZ2VubF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvS2NvbmZpZyBiL25ldC9zY2hlZC9LY29uZmlnCmluZGV4IDhhMjYwZDQuLjc3OGIxZTUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9LY29uZmlnCisrKyBiL25ldC9zY2hlZC9LY29uZmlnCkBAIC00NCw3ICs0NCw3IEBACiAKIGNob2ljZQogCXByb21wdCAiUGFja2V0IHNjaGVkdWxlciBjbG9jayBzb3VyY2UiCi0JZGVmYXVsdCBORVRfU0NIX0NMS19KSUZGSUVTCisJZGVmYXVsdCBORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkKIAktLS1oZWxwLS0tCiAJICBQYWNrZXQgc2NoZWR1bGVycyBuZWVkIGEgbW9ub3RvbmljIGNsb2NrIHRoYXQgaW5jcmVtZW50cyBhdCBhIHN0YXRpYwogCSAgcmF0ZS4gVGhlIGtlcm5lbCBwcm92aWRlcyBzZXZlcmFsIHN1aXRhYmxlIGludGVyZmFjZXMsIGVhY2ggd2l0aApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9pcHQuYyBiL25ldC9zY2hlZC9hY3RfaXB0LmMKaW5kZXggYjUwMDE5My4uMzlhMjJhMyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9pcHQuYworKysgYi9uZXQvc2NoZWQvYWN0X2lwdC5jCkBAIC02Miw3ICs2Miw3IEBACiAJc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldDsKIAlpbnQgcmV0ID0gMDsKIAotCXRhcmdldCA9IGlwdF9maW5kX3RhcmdldCh0LT51LnVzZXIubmFtZSwgdC0+dS51c2VyLnJldmlzaW9uKTsKKwl0YXJnZXQgPSB4dF9maW5kX3RhcmdldChBRl9JTkVULCB0LT51LnVzZXIubmFtZSwgdC0+dS51c2VyLnJldmlzaW9uKTsKIAlpZiAoIXRhcmdldCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lwdjYuYyBiL25ldC9zY3RwL2lwdjYuYwppbmRleCAwNGM3ZmFiLi4yZTI2NjEyIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9pcHY2LmMKKysrIGIvbmV0L3NjdHAvaXB2Ni5jCkBAIC0xODAsOCArMTgwLDcgQEAKIAl9CiAKIAlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IHNrYjolcCwgbGVuOiVkLCAiCi0JCQkgICJzcmM6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICIKLQkJCSAgImRzdDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJCQkgICJzcmM6IiBOSVA2X0ZNVCAiIGRzdDoiIE5JUDZfRk1UICJcbiIsCiAJCQkgIF9fRlVOQ1RJT05fXywgc2tiLCBza2ItPmxlbiwKIAkJCSAgTklQNihmbC5mbDZfc3JjKSwgTklQNihmbC5mbDZfZHN0KSk7CiAKQEAgLTIwNiwxMyArMjA1LDEzIEBACiAJCWZsLm9pZiA9IGRhZGRyLT52Ni5zaW42X3Njb3BlX2lkOwogCQogCi0JU0NUUF9ERUJVR19QUklOVEsoIiVzOiBEU1Q9JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICIsCisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBEU1Q9IiBOSVA2X0ZNVCAiICIsCiAJCQkgIF9fRlVOQ1RJT05fXywgTklQNihmbC5mbDZfZHN0KSk7CiAKIAlpZiAoc2FkZHIpIHsKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9zcmMsICZzYWRkci0+djYuc2luNl9hZGRyKTsKIAkJU0NUUF9ERUJVR19QUklOVEsoCi0JCQkiU1JDPSUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAtICIsCisJCQkiU1JDPSIgTklQNl9GTVQgIiAtICIsCiAJCQlOSVA2KGZsLmZsNl9zcmMpKTsKIAl9CiAKQEAgLTIyMSw4ICsyMjAsNyBAQAogCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwogCQlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKilkc3Q7CiAJCVNDVFBfREVCVUdfUFJJTlRLKAotCQkJInJ0Nl9kc3Q6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICIKLQkJCSJydDZfc3JjOiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJCSJydDZfZHN0OiIgTklQNl9GTVQgIiBydDZfc3JjOiIgTklQNl9GTVQgIlxuIiwKIAkJCU5JUDYocnQtPnJ0NmlfZHN0LmFkZHIpLCBOSVA2KHJ0LT5ydDZpX3NyYy5hZGRyKSk7CiAJfSBlbHNlIHsKIAkJU0NUUF9ERUJVR19QUklOVEsoIk5PIFJPVVRFXG4iKTsKQEAgLTI3MSwxMyArMjY5LDEyIEBACiAJX191OCBibWF0Y2hsZW47CiAKIAlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IGFzb2M6JXAgZHN0OiVwICIKLQkJCSAgImRhZGRyOiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAiLAorCQkJICAiZGFkZHI6IiBOSVA2X0ZNVCAiICIsCiAJCQkgIF9fRlVOQ1RJT05fXywgYXNvYywgZHN0LCBOSVA2KGRhZGRyLT52Ni5zaW42X2FkZHIpKTsKIAogCWlmICghYXNvYykgewogCQlpcHY2X2dldF9zYWRkcihkc3QsICZkYWRkci0+djYuc2luNl9hZGRyLCZzYWRkci0+djYuc2luNl9hZGRyKTsKLQkJU0NUUF9ERUJVR19QUklOVEsoInNhZGRyIGZyb20gaXB2Nl9nZXRfc2FkZHI6ICIKLQkJCQkgICIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJCVNDVFBfREVCVUdfUFJJTlRLKCJzYWRkciBmcm9tIGlwdjZfZ2V0X3NhZGRyOiAiIE5JUDZfRk1UICJcbiIsCiAJCQkJICBOSVA2KHNhZGRyLT52Ni5zaW42X2FkZHIpKTsKIAkJcmV0dXJuOwogCX0KQEAgLTMwNSwxMyArMzAyLDExIEBACiAKIAlpZiAoYmFkZHIpIHsKIAkJbWVtY3B5KHNhZGRyLCBiYWRkciwgc2l6ZW9mKHVuaW9uIHNjdHBfYWRkcikpOwotCQlTQ1RQX0RFQlVHX1BSSU5USygic2FkZHI6ICIKLQkJCQkgICIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJCVNDVFBfREVCVUdfUFJJTlRLKCJzYWRkcjogIiBOSVA2X0ZNVCAiXG4iLAogCQkJCSAgTklQNihzYWRkci0+djYuc2luNl9hZGRyKSk7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXNvYzolcCBDb3VsZCBub3QgZmluZCBhIHZhbGlkIHNvdXJjZSAiCi0JCSAgICAgICAiYWRkcmVzcyBmb3IgdGhlICIKLQkJICAgICAgICJkZXN0OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJICAgICAgICJhZGRyZXNzIGZvciB0aGUgZGVzdDoiIE5JUDZfRk1UICJcbiIsCiAJCSAgICAgICBfX0ZVTkNUSU9OX18sIGFzb2MsIE5JUDYoZGFkZHItPnY2LnNpbjZfYWRkcikpOwogCX0KIApAQCAtNjc1LDggKzY3MCw3IEBACiAvKiBEdW1wIHRoZSB2NiBhZGRyIHRvIHRoZSBzZXEgZmlsZS4gKi8KIHN0YXRpYyB2b2lkIHNjdHBfdjZfc2VxX2R1bXBfYWRkcihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdW5pb24gc2N0cF9hZGRyICphZGRyKQogewotCXNlcV9wcmludGYoc2VxLCAiJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICIsCi0JCSAgIE5JUDYoYWRkci0+djYuc2luNl9hZGRyKSk7CisJc2VxX3ByaW50ZihzZXEsIE5JUDZfRk1UICIgIiwgTklQNihhZGRyLT52Ni5zaW42X2FkZHIpKTsKIH0KIAogLyogSW5pdGlhbGl6ZSBhIFBGX0lORVQ2IHNvY2tldCBtc2dfbmFtZS4gKi8KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jIGIvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKaW5kZXggNTU3YTdkOS4uNDc3ZDdmOCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKKysrIGIvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKQEAgLTEwMzYsMTQgKzEwMzYsMTQgQEAKIAkJaWYgKGZyb21fYWRkci5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiJXMgYXNzb2NpYXRpb24gJXAgY291bGQgbm90IGZpbmQgYWRkcmVzcyAiCi0JCQkgICAgICAgIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJCSAgICAgICBOSVA2X0ZNVCAiXG4iLAogCQkJICAgICAgIF9fRlVOQ1RJT05fXywKIAkJCSAgICAgICBhc29jLAogCQkJICAgICAgIE5JUDYoZnJvbV9hZGRyLnY2LnNpbjZfYWRkcikpOwogCQl9IGVsc2UgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICAgICIlcyBhc3NvY2lhdGlvbiAlcCBjb3VsZCBub3QgZmluZCBhZGRyZXNzICIKLQkJCSAgICAgICAiJXUuJXUuJXUuJXVcbiIsCisJCQkgICAgICAgTklQUVVBRF9GTVQgIlxuIiwKIAkJCSAgICAgICBfX0ZVTkNUSU9OX18sCiAJCQkgICAgICAgYXNvYywKIAkJCSAgICAgICBOSVBRVUFEKGZyb21fYWRkci52NC5zaW5fYWRkci5zX2FkZHIpKTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL0tjb25maWcgYi9uZXQvdGlwYy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YWIxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9LY29uZmlnCkBAIC0wLDAgKzEsMTEyIEBACisjCisjIFRJUEMgY29uZmlndXJhdGlvbgorIworCittZW51ICJUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBJTkVUICYmIEVYUEVSSU1FTlRBTAorCitjb25maWcgVElQQworCXRyaXN0YXRlICJUaGUgVElQQyBQcm90b2NvbCAoRVhQRVJJTUVOVEFMKSIKKwktLS1oZWxwLS0tCisJICBUQkQuCisKKwkgIFRoaXMgcHJvdG9jb2wgc3VwcG9ydCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaAorCSAgY2FuIGJlIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdQorCSAgd2FudCkuIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdGlwYy4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdAorCSAgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFRJUENfQURWQU5DRUQKKwlib29sICJUSVBDOiBBZHZhbmNlZCBjb25maWd1cmF0aW9uIgorCWRlcGVuZHMgb24gVElQQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheWluZyBZIGhlcmUgd2lsbCBvcGVuIHNvbWUgYWR2YW5jZWQgY29uZmlndXJhdGlvbgorICAgICAgICAgIGZvciBUSVBDLiBNb3N0IHVzZXJzIGRvIG5vdCBuZWVkIHRvIGJvdGhlciwgc28gaWYKKyAgICAgICAgICB1bnN1cmUsIGp1c3Qgc2F5IE4uCisKK2NvbmZpZyBUSVBDX1pPTkVTCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiB6b25lcyBpbiBuZXR3b3JrIgorCWRlcGVuZHMgb24gVElQQyAmJiBUSVBDX0FEVkFOQ0VECisJZGVmYXVsdCAiMyIKKwloZWxwCisJIE1heCBudW1iZXIgb2Ygem9uZXMgaW5zaWRlIFRJUEMgbmV0d29yay4gTWF4IHN1cHBvcnRlZCB2YWx1ZSAKKyAgICAgICAgIGlzIDI1NSB6b25lcywgbWluaW11bSBpcyAxCisKKwkgRGVmYXVsdCBpcyAzIHpvbmVzIGluIGEgbmV0d29yazsgc2V0dGluZyB0aGlzIHRvIGhpZ2hlcgorCSBhbGxvd3MgbW9yZSB6b25lcyBidXQgbWlnaHQgdXNlIG1vcmUgbWVtb3J5LgorCitjb25maWcgVElQQ19DTFVTVEVSUworCWludCAiTWF4aW11bSBudW1iZXIgb2YgY2x1c3RlcnMgaW4gYSB6b25lIgorCWRlcGVuZHMgb24gVElQQyAmJiBUSVBDX0FEVkFOQ0VECisJZGVmYXVsdCAiMSIKKwloZWxwCisgICAgICAgICAgKioqT25seSAxIChvbmUgY2x1c3RlciBpbiBhIHpvbmUpIGlzIHN1cHBvcnRlZCBieSBjdXJyZW50IGNvZGUuCisgICAgICAgICAgQW55IHZhbHVlIHNldCBoZXJlIHdpbGwgYmUgb3ZlcnJpZGRlbi4qKioKKworICAgICAgICAgIChNYXggbnVtYmVyIG9mIGNsdXN0ZXJzIGluc2lkZSBUSVBDIHpvbmUuIE1heCBzdXBwb3J0ZWQgCisgICAgICAgICAgdmFsdWUgaXMgNDA5NSBjbHVzdGVycywgbWluaW11bSBpcyAxLgorCisJICBEZWZhdWx0IGlzIDE7IHNldHRpbmcgdGhpcyB0byBzbWFsbGVyIHZhbHVlIG1pZ2h0IHNhdmUgCisgICAgICAgICAgc29tZSBtZW1vcnksIHNldHRpbmcgaXQgdG8gaGlnaGVyCisJICBhbGxvd3MgbW9yZSBjbHVzdGVycyBhbmQgbWlnaHQgY29uc3VtZSBtb3JlIG1lbW9yeS4pCisKK2NvbmZpZyBUSVBDX05PREVTCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiBub2RlcyBpbiBjbHVzdGVyIgorCWRlcGVuZHMgb24gVElQQyAmJiBUSVBDX0FEVkFOQ0VECisJZGVmYXVsdCAiMjU1IgorCWhlbHAKKwkgIE1heGltdW0gbnVtYmVyIG9mIG5vZGVzIGluc2lkZSBhIFRJUEMgY2x1c3Rlci4gTWF4aW11bSAKKyAgICAgICAgICBzdXBwb3J0ZWQgdmFsdWUgaXMgMjA0NyBub2RlcywgbWluaW11bSBpcyA4LiAKKworCSAgU2V0dGluZyB0aGlzIHRvIGEgc21hbGxlciB2YWx1ZSBzYXZlcyBzb21lIG1lbW9yeSwgCisJICBzZXR0aW5nIGl0IHRvIGhpZ2hlciBhbGxvd3MgbW9yZSBub2Rlcy4KKworY29uZmlnIFRJUENfU0xBVkVfTk9ERVMKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIHNsYXZlIG5vZGVzIGluIGNsdXN0ZXIiCisJZGVwZW5kcyBvbiBUSVBDICYmIFRJUENfQURWQU5DRUQKKwlkZWZhdWx0ICIwIgorCWhlbHAKKyAgICAgICAgICAqKipUaGlzIGNhcGFiaWxpdHkgaXMgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IGNvZGUuKioqCisJICAKKwkgIE1heGltdW0gbnVtYmVyIG9mIHNsYXZlIG5vZGVzIGluc2lkZSBhIFRJUEMgY2x1c3Rlci4gTWF4aW11bSAKKyAgICAgICAgICBzdXBwb3J0ZWQgdmFsdWUgaXMgMjA0NyBub2RlcywgbWluaW11bSBpcyAwLiAKKworCSAgU2V0dGluZyB0aGlzIHRvIGEgc21hbGxlciB2YWx1ZSBzYXZlcyBzb21lIG1lbW9yeSwgCisJICBzZXR0aW5nIGl0IHRvIGhpZ2hlciBhbGxvd3MgbW9yZSBub2Rlcy4KKworY29uZmlnIFRJUENfUE9SVFMKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIHBvcnRzIGluIGEgbm9kZSIKKwlkZXBlbmRzIG9uIFRJUEMgJiYgVElQQ19BRFZBTkNFRAorCWRlZmF1bHQgIjgxOTEiCisJaGVscAorCSAgTWF4aW11bSBudW1iZXIgb2YgcG9ydHMgd2l0aGluIGEgbm9kZS4gTWF4aW11bSAKKyAgICAgICAgICBzdXBwb3J0ZWQgdmFsdWUgaXMgNjQ1MzUgbm9kZXMsIG1pbmltdW0gaXMgMTI3LiAKKworCSAgU2V0dGluZyB0aGlzIHRvIGEgc21hbGxlciB2YWx1ZSBzYXZlcyBzb21lIG1lbW9yeSwgCisJICBzZXR0aW5nIGl0IHRvIGhpZ2hlciBhbGxvd3MgbW9yZSBwb3J0cy4KKworY29uZmlnIFRJUENfTE9HCisJaW50ICJTaXplIG9mIGxvZyBidWZmZXIiCisJZGVwZW5kcyBvbiBUSVBDICYmIFRJUENfQURWQU5DRUQKKwlkZWZhdWx0IDAKKwloZWxwCisgCSAgU2l6ZSAoaW4gYnl0ZXMpIG9mIFRJUEMncyBpbnRlcm5hbCBsb2cgYnVmZmVyLCB3aGljaCByZWNvcmRzIHRoZQorCSAgb2NjdXJyZW5jZSBvZiBzaWduaWZpY2FudCBldmVudHMuICBNYXhpbXVtIHN1cHBvcnRlZCB2YWx1ZQorCSAgaXMgMzI3NjggYnl0ZXMsIG1pbmltdW0gaXMgMC4KKworCSAgVGhlcmUgaXMgbm8gbmVlZCB0byBlbmFibGUgdGhlIGxvZyBidWZmZXIgdW5sZXNzIHRoZSBub2RlIHdpbGwgYmUKKwkgIG1hbmFnZWQgcmVtb3RlbHkgdmlhIFRJUEMuCisKK2NvbmZpZyBUSVBDX0RFQlVHCisJYm9vbCAiRW5hYmxlIGRlYnVnZ2luZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gVElQQworCWRlZmF1bHQgbgorCWhlbHAKKyAJICBUaGlzIHdpbGwgZW5hYmxlIGRlYnVnZ2luZyBvZiBUSVBDLgorCisJICBPbmx5IHNheSBZIGhlcmUgaWYgeW91IGFyZSBoYXZpbmcgdHJvdWJsZSB3aXRoIFRJUEMuICBJdCB3aWxsCisJICBlbmFibGUgdGhlIGRpc3BsYXkgb2YgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBpcyBnb2luZyBvbi4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvTWFrZWZpbGUgYi9uZXQvdGlwYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2ViNzAyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IFRJUEMgbGF5ZXIKKyMKKworb2JqLSQoQ09ORklHX1RJUEMpIDo9IHRpcGMubworCit0aXBjLXkJKz0gYWRkci5vIGJjYXN0Lm8gYmVhcmVyLm8gY29uZmlnLm8gY2x1c3Rlci5vIFwKKwkgICBjb3JlLm8gaGFuZGxlci5vIGxpbmsubyBkaXNjb3Zlci5vIG1zZy5vICBcCisJICAgbmFtZV9kaXN0ci5vICBzdWJzY3IubyBuYW1lX3RhYmxlLm8gbmV0Lm8gIFwKKwkgICBuZXRsaW5rLm8gbm9kZS5vIG5vZGVfc3Vic2NyLm8gcG9ydC5vIHJlZi5vICBcCisJICAgc29ja2V0Lm8gdXNlcl9yZWcubyB6b25lLm8gZGJnLm8gZXRoX21lZGlhLm8KKworIyBFbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYWRkci5jIGIvbmV0L3RpcGMvYWRkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYTIyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9hZGRyLmMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIG5ldC90aXBjL2FkZHIuYzogVElQQyBhZGRyZXNzIHV0aWxpdHkgcm91dGluZXMKKyAqICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAiem9uZS5oIgorI2luY2x1ZGUgImNsdXN0ZXIuaCIKKyNpbmNsdWRlICJuZXQuaCIKKwordTMyIHRpcGNfZ2V0X2FkZHIodm9pZCkKK3sKKwlyZXR1cm4gdGlwY19vd25fYWRkcjsKK30KKworLyoqCisgKiBhZGRyX2RvbWFpbl92YWxpZCAtIHZhbGlkYXRlcyBhIG5ldHdvcmsgZG9tYWluIGFkZHJlc3MKKyAqIAorICogQWNjZXB0cyA8Wi5DLk4+LCA8Wi5DLjA+LCA8Wi4wLjA+LCBhbmQgPDAuMC4wPiwgCisgKiB3aGVyZSBaLCBDLCBhbmQgTiBhcmUgbm9uLXplcm8gYW5kIGRvIG5vdCBleGNlZWQgdGhlIGNvbmZpZ3VyZWQgbGltaXRzLgorICogCisgKiBSZXR1cm5zIDEgaWYgZG9tYWluIGFkZHJlc3MgaXMgdmFsaWQsIG90aGVyd2lzZSAwCisgKi8KKworaW50IGFkZHJfZG9tYWluX3ZhbGlkKHUzMiBhZGRyKQoreworCXUzMiBuID0gdGlwY19ub2RlKGFkZHIpOworCXUzMiBjID0gdGlwY19jbHVzdGVyKGFkZHIpOworCXUzMiB6ID0gdGlwY196b25lKGFkZHIpOworCXUzMiBtYXhfbm9kZXMgPSB0aXBjX21heF9ub2RlczsKKworCWlmIChpc19zbGF2ZShhZGRyKSkKKwkJbWF4X25vZGVzID0gTE9XRVNUX1NMQVZFICsgdGlwY19tYXhfc2xhdmVzOworCWlmIChuID4gbWF4X25vZGVzKQorCQlyZXR1cm4gMDsKKwlpZiAoYyA+IHRpcGNfbWF4X2NsdXN0ZXJzKQorCQlyZXR1cm4gMDsKKwlpZiAoeiA+IHRpcGNfbWF4X3pvbmVzKQorCQlyZXR1cm4gMDsKKworCWlmIChuICYmICgheiB8fCAhYykpCisJCXJldHVybiAwOworCWlmIChjICYmICF6KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBhZGRyX25vZGVfdmFsaWQgLSB2YWxpZGF0ZXMgYSBwcm9wb3NlZCBuZXR3b3JrIGFkZHJlc3MgZm9yIHRoaXMgbm9kZQorICogCisgKiBBY2NlcHRzIDxaLkMuTj4sIHdoZXJlIFosIEMsIGFuZCBOIGFyZSBub24temVybyBhbmQgZG8gbm90IGV4Y2VlZCAKKyAqIHRoZSBjb25maWd1cmVkIGxpbWl0cy4KKyAqIAorICogUmV0dXJucyAxIGlmIGFkZHJlc3MgY2FuIGJlIHVzZWQsIG90aGVyd2lzZSAwCisgKi8KKworaW50IGFkZHJfbm9kZV92YWxpZCh1MzIgYWRkcikKK3sKKwlyZXR1cm4gKGFkZHJfZG9tYWluX3ZhbGlkKGFkZHIpICYmIHRpcGNfbm9kZShhZGRyKSk7Cit9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL2FkZHIuaCBiL25ldC90aXBjL2FkZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmNhNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvYWRkci5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogbmV0L3RpcGMvYWRkci5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgYWRkcmVzcyB1dGlsaXR5IHJvdXRpbmVzCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19BRERSX0gKKyNkZWZpbmUgX1RJUENfQUREUl9ICisKK3N0YXRpYyBpbmxpbmUgdTMyIG93bl9ub2RlKHZvaWQpCit7CisJcmV0dXJuIHRpcGNfbm9kZSh0aXBjX293bl9hZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgb3duX2NsdXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gdGlwY19jbHVzdGVyKHRpcGNfb3duX2FkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBvd25fem9uZSh2b2lkKQoreworCXJldHVybiB0aXBjX3pvbmUodGlwY19vd25fYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGluX293bl9jbHVzdGVyKHUzMiBhZGRyKQoreworCXJldHVybiAhKChhZGRyIF4gdGlwY19vd25fYWRkcikgPj4gMTIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbl9vd25fem9uZSh1MzIgYWRkcikKK3sKKwlyZXR1cm4gISgoYWRkciBeIHRpcGNfb3duX2FkZHIpID4+IDI0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfc2xhdmUodTMyIGFkZHIpCit7CisJcmV0dXJuIGFkZHIgJiAweDgwMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWF5X3JvdXRlKHUzMiBhZGRyKQoreworCXJldHVybihhZGRyIF4gdGlwY19vd25fYWRkcikgPj4gMTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGluX3Njb3BlKHUzMiBkb21haW4sIHUzMiBhZGRyKQoreworCWlmICghZG9tYWluIHx8IChkb21haW4gPT0gYWRkcikpCisJCXJldHVybiAxOworCWlmIChkb21haW4gPT0gKGFkZHIgJiAweGZmZmZmMDAwdSkpIC8qIGRvbWFpbiA8Wi5DLjA+ICovCisJCXJldHVybiAxOworCWlmIChkb21haW4gPT0gKGFkZHIgJiAweGZmMDAwMDAwdSkpIC8qIGRvbWFpbiA8Wi4wLjA+ICovCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKioKKyAqIGFkZHJfc2NvcGUgLSBjb252ZXJ0IG1lc3NhZ2UgbG9va3VwIGRvbWFpbiB0byBlcXVpdmFsZW50IDItYml0IHNjb3BlIHZhbHVlCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgYWRkcl9zY29wZSh1MzIgZG9tYWluKQoreworCWlmIChsaWtlbHkoIWRvbWFpbikpCisJCXJldHVybiBUSVBDX1pPTkVfU0NPUEU7CisJaWYgKHRpcGNfbm9kZShkb21haW4pKQorCQlyZXR1cm4gVElQQ19OT0RFX1NDT1BFOworCWlmICh0aXBjX2NsdXN0ZXIoZG9tYWluKSkKKwkJcmV0dXJuIFRJUENfQ0xVU1RFUl9TQ09QRTsKKwlyZXR1cm4gVElQQ19aT05FX1NDT1BFOworfQorCisvKioKKyAqIGFkZHJfZG9tYWluIC0gY29udmVydCAyLWJpdCBzY29wZSB2YWx1ZSB0byBlcXVpdmFsZW50IG1lc3NhZ2UgbG9va3VwIGRvbWFpbgorICogIAorICogTmVlZGVkIHdoZW4gYWRkcmVzcyBvZiBhIG5hbWVkIG1lc3NhZ2UgbXVzdCBiZSBsb29rZWQgdXAgYSBzZWNvbmQgdGltZSAKKyAqIGFmdGVyIGEgbmV0d29yayBob3AuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgYWRkcl9kb21haW4oaW50IHNjKQoreworCWlmIChsaWtlbHkoc2MgPT0gVElQQ19OT0RFX1NDT1BFKSkKKwkJcmV0dXJuIHRpcGNfb3duX2FkZHI7CisJaWYgKHNjID09IFRJUENfQ0xVU1RFUl9TQ09QRSkKKwkJcmV0dXJuIHRpcGNfYWRkcih0aXBjX3pvbmUodGlwY19vd25fYWRkciksCisJCQkJIHRpcGNfY2x1c3Rlcih0aXBjX293bl9hZGRyKSwgMCk7CisJcmV0dXJuIHRpcGNfYWRkcih0aXBjX3pvbmUodGlwY19vd25fYWRkciksIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmFkZHJfc3RyaW5nX2ZpbGwoY2hhciAqc3RyaW5nLCB1MzIgYWRkcikKK3sKKwlzbnByaW50ZihzdHJpbmcsIDE2LCAiPCV1LiV1LiV1PiIsCisJCSB0aXBjX3pvbmUoYWRkciksIHRpcGNfY2x1c3RlcihhZGRyKSwgdGlwY19ub2RlKGFkZHIpKTsKKwlyZXR1cm4gc3RyaW5nOworfQorCitpbnQgYWRkcl9kb21haW5fdmFsaWQodTMyKTsKK2ludCBhZGRyX25vZGVfdmFsaWQodTMyIGFkZHIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL2JjYXN0LmMgYi9uZXQvdGlwYy9iY2FzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MTNkNjIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9iY2FzdC5jCkBAIC0wLDAgKzEsODA2IEBACisvKgorICogbmV0L3RpcGMvYmNhc3QuYzogVElQQyBicm9hZGNhc3QgY29kZQorICogICAgIAorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgIm5ldC5oIgorI2luY2x1ZGUgIm5vZGUuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisjaW5jbHVkZSAibmFtZV9kaXN0ci5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorI2luY2x1ZGUgIm5hbWVfdGFibGUuaCIKKyNpbmNsdWRlICJiY2FzdC5oIgorCisKKyNkZWZpbmUgTUFYX1BLVF9ERUZBVUxUX01DQVNUIDE1MDAJLyogYmNhc3QgbGluayBtYXggcGFja2V0IHNpemUgKGZpeGVkKSAqLworCisjZGVmaW5lIEJDTElOS19XSU5fREVGQVVMVCAyMAkJLyogYmNhc3QgbGluayB3aW5kb3cgc2l6ZSAoZGVmYXVsdCkgKi8KKworI2RlZmluZSBCQ0xJTktfTE9HX0JVRl9TSVpFIDAKKworLyoqCisgKiBzdHJ1Y3QgYmNiZWFyZXJfcGFpciAtIGEgcGFpciBvZiBiZWFyZXJzIHVzZWQgYnkgYnJvYWRjYXN0IGxpbmsKKyAqIEBwcmltYXJ5OiBwb2ludGVyIHRvIHByaW1hcnkgYmVhcmVyCisgKiBAc2Vjb25kYXJ5OiBwb2ludGVyIHRvIHNlY29uZGFyeSBiZWFyZXIKKyAqIAorICogQmVhcmVycyBtdXN0IGhhdmUgc2FtZSBwcmlvcml0eSBhbmQgc2FtZSBzZXQgb2YgcmVhY2hhYmxlIGRlc3RpbmF0aW9ucyAKKyAqIHRvIGJlIHBhaXJlZC4KKyAqLworCitzdHJ1Y3QgYmNiZWFyZXJfcGFpciB7CisJc3RydWN0IGJlYXJlciAqcHJpbWFyeTsKKwlzdHJ1Y3QgYmVhcmVyICpzZWNvbmRhcnk7Cit9OworCisvKioKKyAqIHN0cnVjdCBiY2JlYXJlciAtIGJlYXJlciB1c2VkIGJ5IGJyb2FkY2FzdCBsaW5rCisgKiBAYmVhcmVyOiAobm9uLXN0YW5kYXJkKSBicm9hZGNhc3QgYmVhcmVyIHN0cnVjdHVyZQorICogQG1lZGlhOiAobm9uLXN0YW5kYXJkKSBicm9hZGNhc3QgbWVkaWEgc3RydWN0dXJlCisgKiBAYnBhaXJzOiBhcnJheSBvZiBiZWFyZXIgcGFpcnMKKyAqIEBicGFpcnNfdGVtcDogYXJyYXkgb2YgYmVhcmVyIHBhaXJzIHVzZWQgZHVyaW5nIGNyZWF0aW9uIG9mICJicGFpcnMiCisgKi8KKworc3RydWN0IGJjYmVhcmVyIHsKKwlzdHJ1Y3QgYmVhcmVyIGJlYXJlcjsKKwlzdHJ1Y3QgbWVkaWEgbWVkaWE7CisJc3RydWN0IGJjYmVhcmVyX3BhaXIgYnBhaXJzW01BWF9CRUFSRVJTXTsKKwlzdHJ1Y3QgYmNiZWFyZXJfcGFpciBicGFpcnNfdGVtcFtUSVBDX05VTV9MSU5LX1BSSV07Cit9OworCisvKioKKyAqIHN0cnVjdCBiY2xpbmsgLSBsaW5rIHVzZWQgZm9yIGJyb2FkY2FzdCBtZXNzYWdlcworICogQGxpbms6IChub24tc3RhbmRhcmQpIGJyb2FkY2FzdCBsaW5rIHN0cnVjdHVyZQorICogQG5vZGU6IChub24tc3RhbmRhcmQpIG5vZGUgc3RydWN0dXJlIHJlcHJlc2VudGluZyBiJ2Nhc3QgbGluaydzIHBlZXIgbm9kZQorICogCisgKiBIYW5kbGVzIHNlcXVlbmNlIG51bWJlcmluZywgZnJhZ21lbnRhdGlvbiwgYnVuZGxpbmcsIGV0Yy4KKyAqLworCitzdHJ1Y3QgYmNsaW5rIHsKKwlzdHJ1Y3QgbGluayBsaW5rOworCXN0cnVjdCBub2RlIG5vZGU7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYmNiZWFyZXIgKmJjYmVhcmVyID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgYmNsaW5rICpiY2xpbmsgPSBOVUxMOworc3RhdGljIHN0cnVjdCBsaW5rICpiY2wgPSBOVUxMOworc3RhdGljIHNwaW5sb2NrX3QgYmNfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKworY2hhciBiY19saW5rX25hbWVbXSA9ICJtdWx0aWNhc3QtbGluayI7CisKKworc3RhdGljIGlubGluZSB1MzIgYnVmX3NlcW5vKHN0cnVjdCBza19idWZmICpidWYpCit7CisJcmV0dXJuIG1zZ19zZXFubyhidWZfbXNnKGJ1ZikpOworfSAKKworc3RhdGljIGlubGluZSB1MzIgYmNidWZfYWNrcyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXJldHVybiAodTMyKSh1bnNpZ25lZCBsb25nKVRJUENfU0tCX0NCKGJ1ZiktPmhhbmRsZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjYnVmX3NldF9hY2tzKHN0cnVjdCBza19idWZmICpidWYsIHUzMiBhY2tzKQoreworCVRJUENfU0tCX0NCKGJ1ZiktPmhhbmRsZSA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpYWNrczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjYnVmX2RlY3JfYWNrcyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCWJjYnVmX3NldF9hY2tzKGJ1ZiwgYmNidWZfYWNrcyhidWYpIC0gMSk7Cit9CisKKworLyoqIAorICogYmNsaW5rX3NldF9nYXAgLSBzZXQgZ2FwIGFjY29yZGluZyB0byBjb250ZW50cyBvZiBjdXJyZW50IGRlZmVycmVkIHBrdCBxdWV1ZQorICogCisgKiBDYWxsZWQgd2l0aCAnbm9kZScgbG9ja2VkLCBiY19sb2NrIHVubG9ja2VkCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGJjbGlua19zZXRfZ2FwKHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gbl9wdHItPmJjbGluay5kZWZlcnJlZF9oZWFkOworCisJbl9wdHItPmJjbGluay5nYXBfYWZ0ZXIgPSBuX3B0ci0+YmNsaW5rLmdhcF90byA9CisJCW1vZChuX3B0ci0+YmNsaW5rLmxhc3RfaW4pOworCWlmICh1bmxpa2VseShidWYgIT0gTlVMTCkpCisJCW5fcHRyLT5iY2xpbmsuZ2FwX3RvID0gbW9kKGJ1Zl9zZXFubyhidWYpIC0gMSk7Cit9CisKKy8qKiAKKyAqIGJjbGlua19hY2tfYWxsb3dlZCAtIHRlc3QgaWYgQUNLIG9yIE5BQ0sgbWVzc2FnZSBjYW4gYmUgc2VudCBhdCB0aGlzIG1vbWVudAorICogCisgKiBUaGlzIG1lY2hhbmlzbSBlbmRlYXZvdXJzIHRvIHByZXZlbnQgYWxsIG5vZGVzIGluIG5ldHdvcmsgZnJvbSB0cnlpbmcKKyAqIHRvIEFDSyBvciBOQUNLIGF0IHRoZSBzYW1lIHRpbWUuCisgKiAKKyAqIE5vdGU6IFRJUEMgdXNlcyBhIGRpZmZlcmVudCB0cmlnZ2VyIHRvIGRpc3RyaWJ1dGUgQUNLcyB0aGFuIGl0IGRvZXMgdG8KKyAqICAgICAgIGRpc3RyaWJ1dGUgTkFDS3MsIGJ1dCB0cmllcyB0byB1c2UgdGhlIHNhbWUgc3BhY2luZyAoZGl2aWRlIGJ5IDE2KS4gCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgYmNsaW5rX2Fja19hbGxvd2VkKHUzMiBuKQoreworCXJldHVybigobiAlIFRJUENfTUlOX0xJTktfV0lOKSA9PSB0aXBjX293bl90YWcpOworfQorCisKKy8qKiAKKyAqIGJjbGlua19yZXRyYW5zbWl0X3BrdCAtIHJldHJhbnNtaXQgYnJvYWRjYXN0IHBhY2tldHMKKyAqIEBhZnRlcjogc2VxdWVuY2UgbnVtYmVyIG9mIGxhc3QgcGFja2V0IHRvICpub3QqIHJldHJhbnNtaXQKKyAqIEB0bzogc2VxdWVuY2UgbnVtYmVyIG9mIGxhc3QgcGFja2V0IHRvIHJldHJhbnNtaXQKKyAqIAorICogQ2FsbGVkIHdpdGggJ25vZGUnIGxvY2tlZCwgYmNfbG9jayB1bmxvY2tlZAorICovCisKK3N0YXRpYyB2b2lkIGJjbGlua19yZXRyYW5zbWl0X3BrdCh1MzIgYWZ0ZXIsIHUzMiB0bykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCisJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKwlidWYgPSBiY2wtPmZpcnN0X291dDsKKwl3aGlsZSAoYnVmICYmIGxlc3NfZXEoYnVmX3NlcW5vKGJ1ZiksIGFmdGVyKSkgeworCQlidWYgPSBidWYtPm5leHQ7ICAgICAgICAgICAgICAgIAorCX0KKwlpZiAoYnVmICE9IE5VTEwpCisJCWxpbmtfcmV0cmFuc21pdChiY2wsIGJ1ZiwgbW9kKHRvIC0gYWZ0ZXIpKTsKKwlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7ICAgICAgICAgICAgICAKK30KKworLyoqIAorICogYmNsaW5rX2Fja25vd2xlZGdlIC0gaGFuZGxlIGFja25vd2xlZGdlbWVudCBvZiBicm9hZGNhc3QgcGFja2V0cworICogQG5fcHRyOiBub2RlIHRoYXQgc2VudCBhY2tub3dsZWRnZW1lbnQgaW5mbworICogQGFja2VkOiBicm9hZGNhc3Qgc2VxdWVuY2UgIyB0aGF0IGhhcyBiZWVuIGFja25vd2xlZGdlZAorICogCisgKiBOb2RlIGlzIGxvY2tlZCwgYmNfbG9jayB1bmxvY2tlZC4KKyAqLworCit2b2lkIGJjbGlua19hY2tub3dsZWRnZShzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHUzMiBhY2tlZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqY3JzOworCXN0cnVjdCBza19idWZmICpuZXh0OworCXVuc2lnbmVkIGludCByZWxlYXNlZCA9IDA7CisKKwlpZiAobGVzc19lcShhY2tlZCwgbl9wdHItPmJjbGluay5hY2tlZCkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisKKwkvKiBTa2lwIG92ZXIgcGFja2V0cyB0aGF0IG5vZGUgaGFzIHByZXZpb3VzbHkgYWNrbm93bGVkZ2VkICovCisKKwljcnMgPSBiY2wtPmZpcnN0X291dDsKKwl3aGlsZSAoY3JzICYmIGxlc3NfZXEoYnVmX3NlcW5vKGNycyksIG5fcHRyLT5iY2xpbmsuYWNrZWQpKSB7CisJCWNycyA9IGNycy0+bmV4dDsKKwl9CisKKwkvKiBVcGRhdGUgcGFja2V0cyB0aGF0IG5vZGUgaXMgbm93IGFja25vd2xlZGdpbmcgKi8KKworCXdoaWxlIChjcnMgJiYgbGVzc19lcShidWZfc2Vxbm8oY3JzKSwgYWNrZWQpKSB7CisJCW5leHQgPSBjcnMtPm5leHQ7CisJCWJjYnVmX2RlY3JfYWNrcyhjcnMpOworCQlpZiAoYmNidWZfYWNrcyhjcnMpID09IDApIHsKKwkJCWJjbC0+Zmlyc3Rfb3V0ID0gbmV4dDsKKwkJCWJjbC0+b3V0X3F1ZXVlX3NpemUtLTsKKwkJCWJ1Zl9kaXNjYXJkKGNycyk7CisJCQlyZWxlYXNlZCA9IDE7CisJCX0KKwkJY3JzID0gbmV4dDsKKwl9CisJbl9wdHItPmJjbGluay5hY2tlZCA9IGFja2VkOworCisJLyogVHJ5IHJlc29sdmluZyBicm9hZGNhc3QgbGluayBjb25nZXN0aW9uLCBpZiBuZWNlc3NhcnkgKi8KKworCWlmICh1bmxpa2VseShiY2wtPm5leHRfb3V0KSkKKwkJbGlua19wdXNoX3F1ZXVlKGJjbCk7CisJaWYgKHVubGlrZWx5KHJlbGVhc2VkICYmICFsaXN0X2VtcHR5KCZiY2wtPndhaXRpbmdfcG9ydHMpKSkKKwkJbGlua193YWtldXBfcG9ydHMoYmNsLCAwKTsKKwlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7Cit9CisKKy8qKiAKKyAqIGJjbGlua19zZW5kX2FjayAtIHVuaWNhc3QgYW4gQUNLIG1zZworICogCisgKiBuZXRfbG9jayBhbmQgbm9kZSBsb2NrIHNldAorICovCisKK3N0YXRpYyB2b2lkIGJjbGlua19zZW5kX2FjayhzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJc3RydWN0IGxpbmsgKmxfcHRyID0gbl9wdHItPmFjdGl2ZV9saW5rc1tuX3B0ci0+YWRkciAmIDFdOworCisJaWYgKGxfcHRyICE9IE5VTEwpCisJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgMCwgMCwgMCwgMCwgMCk7Cit9CisKKy8qKiAKKyAqIGJjbGlua19zZW5kX25hY2stIGJyb2FkY2FzdCBhIE5BQ0sgbXNnCisgKiAKKyAqIG5ldF9sb2NrIGFuZCBub2RlIGxvY2sgc2V0CisgKi8KKworc3RhdGljIHZvaWQgYmNsaW5rX3NlbmRfbmFjayhzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKworCWlmICghbGVzcyhuX3B0ci0+YmNsaW5rLmdhcF9hZnRlciwgbl9wdHItPmJjbGluay5nYXBfdG8pKQorCQlyZXR1cm47CisKKwlidWYgPSBidWZfYWNxdWlyZShJTlRfSF9TSVpFKTsKKwlpZiAoYnVmKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX2luaXQobXNnLCBCQ0FTVF9QUk9UT0NPTCwgU1RBVEVfTVNHLAorCQkJIFRJUENfT0ssIElOVF9IX1NJWkUsIG5fcHRyLT5hZGRyKTsKKwkJbXNnX3NldF9tY19uZXRpZChtc2csIHRpcGNfbmV0X2lkKTsKKwkJbXNnX3NldF9iY2FzdF9hY2sobXNnLCBtb2Qobl9wdHItPmJjbGluay5sYXN0X2luKSk7IAorCQltc2dfc2V0X2JjZ2FwX2FmdGVyKG1zZywgbl9wdHItPmJjbGluay5nYXBfYWZ0ZXIpOworCQltc2dfc2V0X2JjZ2FwX3RvKG1zZywgbl9wdHItPmJjbGluay5nYXBfdG8pOworCQltc2dfc2V0X2JjYXN0X3RhZyhtc2csIHRpcGNfb3duX3RhZyk7CisKKwkJaWYgKGJlYXJlcl9zZW5kKCZiY2JlYXJlci0+YmVhcmVyLCBidWYsIDApKSB7CisJCQliY2wtPnN0YXRzLnNlbnRfbmFja3MrKzsKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCX0gZWxzZSB7CisJCQliZWFyZXJfc2NoZWR1bGUoYmNsLT5iX3B0ciwgYmNsKTsKKwkJCWJjbC0+cHJvdG9fbXNnX3F1ZXVlID0gYnVmOworCQkJYmNsLT5zdGF0cy5iZWFyZXJfY29uZ3MrKzsKKwkJfQorCisJCS8qIAorCQkgKiBFbnN1cmUgd2UgZG9lc24ndCBzZW5kIGFub3RoZXIgTkFDSyBtc2cgdG8gdGhlIG5vZGUKKwkJICogdW50aWwgMTYgbW9yZSBkZWZlcnJlZCBtZXNzYWdlcyBhcnJpdmUgZnJvbSBpdAorCQkgKiAoaS5lLiBoZWxwcyBwcmV2ZW50IGFsbCBub2RlcyBmcm9tIE5BQ0snaW5nIGF0IHNhbWUgdGltZSkKKwkJICovCisJCQorCQluX3B0ci0+YmNsaW5rLm5hY2tfc3luYyA9IHRpcGNfb3duX3RhZzsKKwl9Cit9CisKKy8qKiAKKyAqIGJjbGlua19jaGVja19nYXAgLSBzZW5kIGEgTkFDSyBpZiBhIHNlcXVlbmNlIGdhcCBleGlzdHMKKyAqCisgKiBuZXRfbG9jayBhbmQgbm9kZSBsb2NrIHNldAorICovCisKK3ZvaWQgYmNsaW5rX2NoZWNrX2dhcChzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHUzMiBsYXN0X3NlbnQpCit7CisJaWYgKCFuX3B0ci0+YmNsaW5rLnN1cHBvcnRlZCB8fAorCSAgICBsZXNzX2VxKGxhc3Rfc2VudCwgbW9kKG5fcHRyLT5iY2xpbmsubGFzdF9pbikpKQorCQlyZXR1cm47CisKKwliY2xpbmtfc2V0X2dhcChuX3B0cik7CisJaWYgKG5fcHRyLT5iY2xpbmsuZ2FwX2FmdGVyID09IG5fcHRyLT5iY2xpbmsuZ2FwX3RvKQorCQluX3B0ci0+YmNsaW5rLmdhcF90byA9IGxhc3Rfc2VudDsKKwliY2xpbmtfc2VuZF9uYWNrKG5fcHRyKTsKK30KKworLyoqIAorICogYmNsaW5rX3BlZWtfbmFjayAtIHByb2Nlc3MgYSBOQUNLIG1zZyBtZWFudCBmb3IgYW5vdGhlciBub2RlCisgKiAKKyAqIE9ubHkgbmV0X2xvY2sgc2V0LgorICovCisKK3ZvaWQgYmNsaW5rX3BlZWtfbmFjayh1MzIgZGVzdCwgdTMyIHNlbmRlcl90YWcsIHUzMiBnYXBfYWZ0ZXIsIHUzMiBnYXBfdG8pCit7CisJc3RydWN0IG5vZGUgKm5fcHRyID0gbm9kZV9maW5kKGRlc3QpOworCXUzMiBteV9hZnRlciwgbXlfdG87CisKKwlpZiAodW5saWtlbHkoIW5fcHRyIHx8ICFub2RlX2lzX3VwKG5fcHRyKSkpCisJCXJldHVybjsKKwlub2RlX2xvY2sobl9wdHIpOworCS8qCisJICogTW9kaWZ5IGdhcCB0byBzdXBwcmVzcyB1bm5lY2Vzc2FyeSBOQUNLcyBmcm9tIHRoaXMgbm9kZQorCSAqLworCW15X2FmdGVyID0gbl9wdHItPmJjbGluay5nYXBfYWZ0ZXI7CisJbXlfdG8gPSBuX3B0ci0+YmNsaW5rLmdhcF90bzsKKworCWlmIChsZXNzX2VxKGdhcF9hZnRlciwgbXlfYWZ0ZXIpKSB7CisJCWlmIChsZXNzKG15X2FmdGVyLCBnYXBfdG8pICYmIGxlc3MoZ2FwX3RvLCBteV90bykpCisJCQluX3B0ci0+YmNsaW5rLmdhcF9hZnRlciA9IGdhcF90bzsKKwkJZWxzZSBpZiAobGVzc19lcShteV90bywgZ2FwX3RvKSkKKwkJCW5fcHRyLT5iY2xpbmsuZ2FwX3RvID0gbl9wdHItPmJjbGluay5nYXBfYWZ0ZXI7CisJfSBlbHNlIGlmIChsZXNzX2VxKGdhcF9hZnRlciwgbXlfdG8pKSB7CisJCWlmIChsZXNzX2VxKG15X3RvLCBnYXBfdG8pKQorCQkJbl9wdHItPmJjbGluay5nYXBfdG8gPSBnYXBfYWZ0ZXI7CisJfSBlbHNlIHsKKwkJLyogCisJCSAqIEV4cGFuZCBnYXAgaWYgbWlzc2luZyBidWZzIG5vdCBpbiBkZWZlcnJlZCBxdWV1ZToKKwkJICovCisJCXN0cnVjdCBza19idWZmICpidWYgPSBuX3B0ci0+YmNsaW5rLmRlZmVycmVkX2hlYWQ7CisJCXUzMiBwcmV2ID0gbl9wdHItPmJjbGluay5nYXBfdG87CisKKwkJZm9yICg7IGJ1ZjsgYnVmID0gYnVmLT5uZXh0KSB7CisJCQl1MzIgc2Vxbm8gPSBidWZfc2Vxbm8oYnVmKTsKKworCQkJaWYgKG1vZChzZXFubyAtIHByZXYpICE9IDEpCisJCQkJYnVmID0gTlVMTDsKKwkJCWlmIChzZXFubyA9PSBnYXBfYWZ0ZXIpCisJCQkJYnJlYWs7CisJCQlwcmV2ID0gc2Vxbm87CisJCX0KKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJbl9wdHItPmJjbGluay5nYXBfdG8gPSBnYXBfYWZ0ZXI7CisJfQorCS8qCisJICogU29tZSBub2RlcyBtYXkgc2VuZCBhIGNvbXBsZW1lbnRhcnkgTkFDSyBub3c6CisJICovIAorCWlmIChiY2xpbmtfYWNrX2FsbG93ZWQoc2VuZGVyX3RhZyArIDEpKSB7CisJCWlmIChuX3B0ci0+YmNsaW5rLmdhcF90byAhPSBuX3B0ci0+YmNsaW5rLmdhcF9hZnRlcikgeworCQkJYmNsaW5rX3NlbmRfbmFjayhuX3B0cik7CisJCQliY2xpbmtfc2V0X2dhcChuX3B0cik7CisJCX0KKwl9CisJbm9kZV91bmxvY2sobl9wdHIpOworfQorCisvKioKKyAqIGJjbGlua19zZW5kX21zZyAtIGJyb2FkY2FzdCBhIHBhY2tldCB0byBhbGwgbm9kZXMgaW4gY2x1c3RlcgorICovCisKK2ludCBiY2xpbmtfc2VuZF9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlpbnQgcmVzOworCisJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKworCXJlcyA9IGxpbmtfc2VuZF9idWYoYmNsLCBidWYpOworCWlmICh1bmxpa2VseShyZXMgPT0gLUVMSU5LQ09ORykpCisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJZWxzZQorCQliY2wtPnN0YXRzLnNlbnRfaW5mbysrOworCisJaWYgKGJjbC0+b3V0X3F1ZXVlX3NpemUgPiBiY2wtPnN0YXRzLm1heF9xdWV1ZV9zeikKKwkJYmNsLT5zdGF0cy5tYXhfcXVldWVfc3ogPSBiY2wtPm91dF9xdWV1ZV9zaXplOworCWJjbC0+c3RhdHMucXVldWVfc3pfY291bnRzKys7CisJYmNsLT5zdGF0cy5hY2N1X3F1ZXVlX3N6ICs9IGJjbC0+b3V0X3F1ZXVlX3NpemU7CisKKwlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBiY2xpbmtfcmVjdl9wa3QgLSByZWNlaXZlIGEgYnJvYWRjYXN0IHBhY2tldCwgYW5kIGRlbGl2ZXIgdXB3YXJkcworICogCisgKiBuZXRfbG9jayBpcyByZWFkX2xvY2tlZCwgbm8gb3RoZXIgbG9ja3Mgc2V0CisgKi8KKwordm9pZCBiY2xpbmtfcmVjdl9wa3Qoc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sgICAgICAgIAorCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCXN0cnVjdCBub2RlKiBub2RlID0gbm9kZV9maW5kKG1zZ19wcmV2bm9kZShtc2cpKTsKKwl1MzIgbmV4dF9pbjsKKwl1MzIgc2Vxbm87CisJc3RydWN0IHNrX2J1ZmYgKmRlZmVycmVkOworCisJbXNnX2RiZyhtc2csICI8QkM8PDwiKTsKKworCWlmICh1bmxpa2VseSghbm9kZSB8fCAhbm9kZV9pc191cChub2RlKSB8fCAhbm9kZS0+YmNsaW5rLnN1cHBvcnRlZCB8fCAKKwkJICAgICAobXNnX21jX25ldGlkKG1zZykgIT0gdGlwY19uZXRfaWQpKSkgeworCQlidWZfZGlzY2FyZChidWYpOworCQlyZXR1cm47CisJfQorCisJaWYgKHVubGlrZWx5KG1zZ191c2VyKG1zZykgPT0gQkNBU1RfUFJPVE9DT0wpKSB7CisJCW1zZ19kYmcobXNnLCAiPEJDTkFDSzw8PCIpOworCQlpZiAobXNnX2Rlc3Rub2RlKG1zZykgPT0gdGlwY19vd25fYWRkcikgeworCQkJbm9kZV9sb2NrKG5vZGUpOworCQkJYmNsaW5rX2Fja25vd2xlZGdlKG5vZGUsIG1zZ19iY2FzdF9hY2sobXNnKSk7CisJCQlub2RlX3VubG9jayhub2RlKTsKKwkJCWJjbC0+c3RhdHMucmVjdl9uYWNrcysrOworCQkJYmNsaW5rX3JldHJhbnNtaXRfcGt0KG1zZ19iY2dhcF9hZnRlcihtc2cpLAorCQkJCQkgICAgICBtc2dfYmNnYXBfdG8obXNnKSk7CisJCX0gZWxzZSB7CisJCQliY2xpbmtfcGVla19uYWNrKG1zZ19kZXN0bm9kZShtc2cpLAorCQkJCQkgbXNnX2JjYXN0X3RhZyhtc2cpLAorCQkJCQkgbXNnX2JjZ2FwX2FmdGVyKG1zZyksCisJCQkJCSBtc2dfYmNnYXBfdG8obXNnKSk7CisJCX0KKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJcmV0dXJuOworCX0KKworCW5vZGVfbG9jayhub2RlKTsKK3JlY2VpdmU6CisJZGVmZXJyZWQgPSBub2RlLT5iY2xpbmsuZGVmZXJyZWRfaGVhZDsKKwluZXh0X2luID0gbW9kKG5vZGUtPmJjbGluay5sYXN0X2luICsgMSk7CisJc2Vxbm8gPSBtc2dfc2Vxbm8obXNnKTsKKworCWlmIChsaWtlbHkoc2Vxbm8gPT0gbmV4dF9pbikpIHsKKwkJYmNsLT5zdGF0cy5yZWN2X2luZm8rKzsKKwkJbm9kZS0+YmNsaW5rLmxhc3RfaW4rKzsKKwkJYmNsaW5rX3NldF9nYXAobm9kZSk7CisJCWlmICh1bmxpa2VseShiY2xpbmtfYWNrX2FsbG93ZWQoc2Vxbm8pKSkgeworCQkJYmNsaW5rX3NlbmRfYWNrKG5vZGUpOworCQkJYmNsLT5zdGF0cy5zZW50X2Fja3MrKzsKKwkJfQorCQlpZiAobGlrZWx5KG1zZ19pc2RhdGEobXNnKSkpIHsKKwkJCW5vZGVfdW5sb2NrKG5vZGUpOworCQkJcG9ydF9yZWN2X21jYXN0KGJ1ZiwgTlVMTCk7CisJCX0gZWxzZSBpZiAobXNnX3VzZXIobXNnKSA9PSBNU0dfQlVORExFUikgeworCQkJYmNsLT5zdGF0cy5yZWN2X2J1bmRsZXMrKzsKKwkJCWJjbC0+c3RhdHMucmVjdl9idW5kbGVkICs9IG1zZ19tc2djbnQobXNnKTsKKwkJCW5vZGVfdW5sb2NrKG5vZGUpOworCQkJbGlua19yZWN2X2J1bmRsZShidWYpOworCQl9IGVsc2UgaWYgKG1zZ191c2VyKG1zZykgPT0gTVNHX0ZSQUdNRU5URVIpIHsKKwkJCWJjbC0+c3RhdHMucmVjdl9mcmFnbWVudHMrKzsKKwkJCWlmIChsaW5rX3JlY3ZfZnJhZ21lbnQoJm5vZGUtPmJjbGluay5kZWZyYWdtLAorCQkJCQkgICAgICAgJmJ1ZiwgJm1zZykpCisJCQkJYmNsLT5zdGF0cy5yZWN2X2ZyYWdtZW50ZWQrKzsKKwkJCW5vZGVfdW5sb2NrKG5vZGUpOworCQkJbmV0X3JvdXRlX21zZyhidWYpOworCQl9IGVsc2UgeworCQkJbm9kZV91bmxvY2sobm9kZSk7CisJCQluZXRfcm91dGVfbXNnKGJ1Zik7CisJCX0KKwkJaWYgKGRlZmVycmVkICYmIChidWZfc2Vxbm8oZGVmZXJyZWQpID09IG1vZChuZXh0X2luICsgMSkpKSB7CisJCQlub2RlX2xvY2sobm9kZSk7CisJCQlidWYgPSBkZWZlcnJlZDsKKwkJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJCW5vZGUtPmJjbGluay5kZWZlcnJlZF9oZWFkID0gZGVmZXJyZWQtPm5leHQ7CisJCQlnb3RvIHJlY2VpdmU7CisJCX0KKwkJcmV0dXJuOworCX0gZWxzZSBpZiAobGVzcyhuZXh0X2luLCBzZXFubykpIHsKKwkJdTMyIGdhcF9hZnRlciA9IG5vZGUtPmJjbGluay5nYXBfYWZ0ZXI7CisJCXUzMiBnYXBfdG8gPSBub2RlLT5iY2xpbmsuZ2FwX3RvOworCisJCWlmIChsaW5rX2RlZmVyX3BrdCgmbm9kZS0+YmNsaW5rLmRlZmVycmVkX2hlYWQsCisJCQkJICAgJm5vZGUtPmJjbGluay5kZWZlcnJlZF90YWlsLAorCQkJCSAgIGJ1ZikpIHsKKwkJCW5vZGUtPmJjbGluay5uYWNrX3N5bmMrKzsKKwkJCWJjbC0+c3RhdHMuZGVmZXJyZWRfcmVjdisrOworCQkJaWYgKHNlcW5vID09IG1vZChnYXBfYWZ0ZXIgKyAxKSkKKwkJCQlub2RlLT5iY2xpbmsuZ2FwX2FmdGVyID0gc2Vxbm87CisJCQllbHNlIGlmIChsZXNzKGdhcF9hZnRlciwgc2Vxbm8pICYmIGxlc3Moc2Vxbm8sIGdhcF90bykpCisJCQkJbm9kZS0+YmNsaW5rLmdhcF90byA9IHNlcW5vOworCQl9CisJCWlmIChiY2xpbmtfYWNrX2FsbG93ZWQobm9kZS0+YmNsaW5rLm5hY2tfc3luYykpIHsKKwkJCWlmIChnYXBfdG8gIT0gZ2FwX2FmdGVyKQorCQkJCWJjbGlua19zZW5kX25hY2sobm9kZSk7CisJCQliY2xpbmtfc2V0X2dhcChub2RlKTsKKwkJfQorCX0gZWxzZSB7CisJCWJjbC0+c3RhdHMuZHVwbGljYXRlcysrOworCQlidWZfZGlzY2FyZChidWYpOworCX0KKwlub2RlX3VubG9jayhub2RlKTsKK30KKwordTMyIGJjbGlua19nZXRfbGFzdF9zZW50KHZvaWQpCit7CisJdTMyIGxhc3Rfc2VudCA9IG1vZChiY2wtPm5leHRfb3V0X25vIC0gMSk7CisKKwlpZiAoYmNsLT5uZXh0X291dCkKKwkJbGFzdF9zZW50ID0gbW9kKGJ1Zl9zZXFubyhiY2wtPm5leHRfb3V0KSAtIDEpOworCXJldHVybiBsYXN0X3NlbnQ7Cit9CisKK3UzMiBiY2xpbmtfYWNrc19taXNzaW5nKHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwlyZXR1cm4gKG5fcHRyLT5iY2xpbmsuc3VwcG9ydGVkICYmCisJCShiY2xpbmtfZ2V0X2xhc3Rfc2VudCgpICE9IG5fcHRyLT5iY2xpbmsuYWNrZWQpKTsKK30KKworCisvKioKKyAqIGJjYmVhcmVyX3NlbmQgLSBzZW5kIGEgcGFja2V0IHRocm91Z2ggdGhlIGJyb2FkY2FzdCBwc2V1ZG8tYmVhcmVyCisgKiAKKyAqIFNlbmQgdGhyb3VnaCBhcyBtYW55IGJlYXJlcnMgYXMgbmVjZXNzYXJ5IHRvIHJlYWNoIGFsbCBub2RlcworICogdGhhdCBzdXBwb3J0IFRJUEMgbXVsdGljYXN0aW5nLgorICogCisgKiBSZXR1cm5zIDAgaWYgcGFja2V0IHNlbnQgc3VjY2Vzc2Z1bGx5LCBub24temVybyBpZiBub3QKKyAqLworCitpbnQgYmNiZWFyZXJfc2VuZChzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAorCQkgIHN0cnVjdCB0aXBjX2JlYXJlciAqdW51c2VkMSwKKwkJICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICp1bnVzZWQyKQoreworCXN0YXRpYyBpbnQgc2VuZF9jb3VudCA9IDA7CisKKwlzdHJ1Y3Qgbm9kZV9tYXAgcmVtYWluczsKKwlzdHJ1Y3Qgbm9kZV9tYXAgcmVtYWluc19uZXc7CisJaW50IGJwX2luZGV4OworCWludCBzd2FwX3RpbWU7CisKKwkvKiBQcmVwYXJlIGJ1ZmZlciBmb3IgYnJvYWRjYXN0aW5nIChpZiBmaXJzdCB0aW1lIHRyeWluZyB0byBzZW5kIGl0KSAqLworCisJaWYgKGxpa2VseSghbXNnX25vbl9zZXEoYnVmX21zZyhidWYpKSkpIHsKKwkJc3RydWN0IHRpcGNfbXNnICptc2c7CisKKwkJYXNzZXJ0KGNsdXN0ZXJfYmNhc3Rfbm9kZXMuY291bnQgIT0gMCk7CisJCWJjYnVmX3NldF9hY2tzKGJ1ZiwgY2x1c3Rlcl9iY2FzdF9ub2Rlcy5jb3VudCk7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX3NldF9ub25fc2VxKG1zZyk7CisJCW1zZ19zZXRfbWNfbmV0aWQobXNnLCB0aXBjX25ldF9pZCk7CisJfQorCisJLyogRGV0ZXJtaW5lIGlmIGJlYXJlciBwYWlycyBzaG91bGQgYmUgc3dhcHBlZCBmb2xsb3dpbmcgdGhpcyBhdHRlbXB0ICovCisKKwlpZiAoKHN3YXBfdGltZSA9ICgrK3NlbmRfY291bnQgPj0gMTApKSkKKwkJc2VuZF9jb3VudCA9IDA7CisKKwkvKiBTZW5kIGJ1ZmZlciBvdmVyIGJlYXJlcnMgdW50aWwgYWxsIHRhcmdldHMgcmVhY2hlZCAqLworCQorCXJlbWFpbnMgPSBjbHVzdGVyX2JjYXN0X25vZGVzOworCisJZm9yIChicF9pbmRleCA9IDA7IGJwX2luZGV4IDwgTUFYX0JFQVJFUlM7IGJwX2luZGV4KyspIHsKKwkJc3RydWN0IGJlYXJlciAqcCA9IGJjYmVhcmVyLT5icGFpcnNbYnBfaW5kZXhdLnByaW1hcnk7CisJCXN0cnVjdCBiZWFyZXIgKnMgPSBiY2JlYXJlci0+YnBhaXJzW2JwX2luZGV4XS5zZWNvbmRhcnk7CisKKwkJaWYgKCFwKQorCQkJYnJlYWs7CS8qIG5vIG1vcmUgYmVhcmVycyB0byB0cnkgKi8KKworCQlubWFwX2RpZmYoJnJlbWFpbnMsICZwLT5ub2RlcywgJnJlbWFpbnNfbmV3KTsKKwkJaWYgKHJlbWFpbnNfbmV3LmNvdW50ID09IHJlbWFpbnMuY291bnQpCisJCQljb250aW51ZTsJLyogYmVhcmVyIHBhaXIgZG9lc24ndCBhZGQgYW55dGhpbmcgKi8KKworCQlpZiAoIXAtPnB1YmwuYmxvY2tlZCAmJgorCQkgICAgIXAtPm1lZGlhLT5zZW5kX21zZyhidWYsICZwLT5wdWJsLCAmcC0+bWVkaWEtPmJjYXN0X2FkZHIpKSB7CisJCQlpZiAoc3dhcF90aW1lICYmIHMgJiYgIXMtPnB1YmwuYmxvY2tlZCkKKwkJCQlnb3RvIHN3YXA7CisJCQllbHNlCisJCQkJZ290byB1cGRhdGU7CisJCX0KKworCQlpZiAoIXMgfHwgcy0+cHVibC5ibG9ja2VkIHx8CisJCSAgICBzLT5tZWRpYS0+c2VuZF9tc2coYnVmLCAmcy0+cHVibCwgJnMtPm1lZGlhLT5iY2FzdF9hZGRyKSkKKwkJCWNvbnRpbnVlOwkvKiB1bmFibGUgdG8gc2VuZCB1c2luZyBiZWFyZXIgcGFpciAqLworc3dhcDoKKwkJYmNiZWFyZXItPmJwYWlyc1ticF9pbmRleF0ucHJpbWFyeSA9IHM7CisJCWJjYmVhcmVyLT5icGFpcnNbYnBfaW5kZXhdLnNlY29uZGFyeSA9IHA7Cit1cGRhdGU6CisJCWlmIChyZW1haW5zX25ldy5jb3VudCA9PSAwKQorCQkJcmV0dXJuIFRJUENfT0s7CisKKwkJcmVtYWlucyA9IHJlbWFpbnNfbmV3OworCX0KKwkKKwkvKiBVbmFibGUgdG8gcmVhY2ggYWxsIHRhcmdldHMgKi8KKworCWJjYmVhcmVyLT5iZWFyZXIucHVibC5ibG9ja2VkID0gMTsKKwliY2wtPnN0YXRzLmJlYXJlcl9jb25ncysrOworCXJldHVybiB+VElQQ19PSzsKK30KKworLyoqCisgKiBiY2JlYXJlcl9zb3J0IC0gY3JlYXRlIHNldHMgb2YgYmVhcmVyIHBhaXJzIHVzZWQgYnkgYnJvYWRjYXN0IGJlYXJlcgorICovCisKK3ZvaWQgYmNiZWFyZXJfc29ydCh2b2lkKQoreworCXN0cnVjdCBiY2JlYXJlcl9wYWlyICpicF90ZW1wID0gYmNiZWFyZXItPmJwYWlyc190ZW1wOworCXN0cnVjdCBiY2JlYXJlcl9wYWlyICpicF9jdXJyOworCWludCBiX2luZGV4OworCWludCBwcmk7CisKKwlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCisJLyogR3JvdXAgYmVhcmVycyBieSBwcmlvcml0eSAoY2FuIGFzc3VtZSBtYXggb2YgdHdvIHBlciBwcmlvcml0eSkgKi8KKworCW1lbXNldChicF90ZW1wLCAwLCBzaXplb2YoYmNiZWFyZXItPmJwYWlyc190ZW1wKSk7CisKKwlmb3IgKGJfaW5kZXggPSAwOyBiX2luZGV4IDwgTUFYX0JFQVJFUlM7IGJfaW5kZXgrKykgeworCQlzdHJ1Y3QgYmVhcmVyICpiID0gJmJlYXJlcnNbYl9pbmRleF07CisKKwkJaWYgKCFiLT5hY3RpdmUgfHwgIWItPm5vZGVzLmNvdW50KQorCQkJY29udGludWU7CisKKwkJaWYgKCFicF90ZW1wW2ItPnByaW9yaXR5XS5wcmltYXJ5KQorCQkJYnBfdGVtcFtiLT5wcmlvcml0eV0ucHJpbWFyeSA9IGI7CisJCWVsc2UKKwkJCWJwX3RlbXBbYi0+cHJpb3JpdHldLnNlY29uZGFyeSA9IGI7CisJfQorCisJLyogQ3JlYXRlIGFycmF5IG9mIGJlYXJlciBwYWlycyBmb3IgYnJvYWRjYXN0aW5nICovCisKKwlicF9jdXJyID0gYmNiZWFyZXItPmJwYWlyczsKKwltZW1zZXQoYmNiZWFyZXItPmJwYWlycywgMCwgc2l6ZW9mKGJjYmVhcmVyLT5icGFpcnMpKTsKKworCWZvciAocHJpID0gKFRJUENfTlVNX0xJTktfUFJJIC0gMSk7IHByaSA+PSAwOyBwcmktLSkgeworCisJCWlmICghYnBfdGVtcFtwcmldLnByaW1hcnkpCisJCQljb250aW51ZTsKKworCQlicF9jdXJyLT5wcmltYXJ5ID0gYnBfdGVtcFtwcmldLnByaW1hcnk7CisKKwkJaWYgKGJwX3RlbXBbcHJpXS5zZWNvbmRhcnkpIHsKKwkJCWlmIChubWFwX2VxdWFsKCZicF90ZW1wW3ByaV0ucHJpbWFyeS0+bm9kZXMsCisJCQkJICAgICAgICZicF90ZW1wW3ByaV0uc2Vjb25kYXJ5LT5ub2RlcykpIHsKKwkJCQlicF9jdXJyLT5zZWNvbmRhcnkgPSBicF90ZW1wW3ByaV0uc2Vjb25kYXJ5OworCQkJfSBlbHNlIHsKKwkJCQlicF9jdXJyKys7CisJCQkJYnBfY3Vyci0+cHJpbWFyeSA9IGJwX3RlbXBbcHJpXS5zZWNvbmRhcnk7CisJCQl9CisJCX0KKworCQlicF9jdXJyKys7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworfQorCisvKioKKyAqIGJjYmVhcmVyX3B1c2ggLSByZXNvbHZlIGJlYXJlciBjb25nZXN0aW9uCisgKiAKKyAqIEZvcmNlcyBiY2xpbmsgdG8gcHVzaCBvdXQgYW55IHVuc2VudCBwYWNrZXRzLCB1bnRpbCBhbGwgcGFja2V0cyBhcmUgZ29uZQorICogb3IgY29uZ2VzdGlvbiByZW9jY3Vycy4KKyAqIE5vIGxvY2tzIHNldCB3aGVuIGZ1bmN0aW9uIGNhbGxlZAorICovCisKK3ZvaWQgYmNiZWFyZXJfcHVzaCh2b2lkKQoreworCXN0cnVjdCBiZWFyZXIgKmJfcHRyOworCisJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKwliX3B0ciA9ICZiY2JlYXJlci0+YmVhcmVyOworCWlmIChiX3B0ci0+cHVibC5ibG9ja2VkKSB7CisJCWJfcHRyLT5wdWJsLmJsb2NrZWQgPSAwOworCQliZWFyZXJfbG9ja19wdXNoKGJfcHRyKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworfQorCisKK2ludCBiY2xpbmtfc3RhdHMoY2hhciAqYnVmLCBjb25zdCB1MzIgYnVmX3NpemUpCit7CisJc3RydWN0IHByaW50X2J1ZiBwYjsKKworCWlmICghYmNsKQorCQlyZXR1cm4gMDsKKworCXByaW50YnVmX2luaXQoJnBiLCBidWYsIGJ1Zl9zaXplKTsKKworCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisKKwl0aXBjX3ByaW50ZigmcGIsICJMaW5rIDwlcz5cbiIKKwkJICAgICAgICAgIiAgV2luZG93OiV1IHBhY2tldHNcbiIsIAorCQkgICAgYmNsLT5uYW1lLCBiY2wtPnF1ZXVlX2xpbWl0WzBdKTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIFJYIHBhY2tldHM6JXUgZnJhZ21lbnRzOiV1LyV1IGJ1bmRsZXM6JXUvJXVcbiIsIAorCQkgICAgYmNsLT5zdGF0cy5yZWN2X2luZm8sCisJCSAgICBiY2wtPnN0YXRzLnJlY3ZfZnJhZ21lbnRzLAorCQkgICAgYmNsLT5zdGF0cy5yZWN2X2ZyYWdtZW50ZWQsCisJCSAgICBiY2wtPnN0YXRzLnJlY3ZfYnVuZGxlcywKKwkJICAgIGJjbC0+c3RhdHMucmVjdl9idW5kbGVkKTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIFRYIHBhY2tldHM6JXUgZnJhZ21lbnRzOiV1LyV1IGJ1bmRsZXM6JXUvJXVcbiIsIAorCQkgICAgYmNsLT5zdGF0cy5zZW50X2luZm8sCisJCSAgICBiY2wtPnN0YXRzLnNlbnRfZnJhZ21lbnRzLAorCQkgICAgYmNsLT5zdGF0cy5zZW50X2ZyYWdtZW50ZWQsIAorCQkgICAgYmNsLT5zdGF0cy5zZW50X2J1bmRsZXMsCisJCSAgICBiY2wtPnN0YXRzLnNlbnRfYnVuZGxlZCk7CisJdGlwY19wcmludGYoJnBiLCAiICBSWCBuYWtzOiV1IGRlZnM6JXUgZHVwczoldVxuIiwgCisJCSAgICBiY2wtPnN0YXRzLnJlY3ZfbmFja3MsCisJCSAgICBiY2wtPnN0YXRzLmRlZmVycmVkX3JlY3YsIAorCQkgICAgYmNsLT5zdGF0cy5kdXBsaWNhdGVzKTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIFRYIG5ha3M6JXUgYWNrczoldSBkdXBzOiV1XG4iLCAKKwkJICAgIGJjbC0+c3RhdHMuc2VudF9uYWNrcywgCisJCSAgICBiY2wtPnN0YXRzLnNlbnRfYWNrcywgCisJCSAgICBiY2wtPnN0YXRzLnJldHJhbnNtaXR0ZWQpOworCXRpcGNfcHJpbnRmKCZwYiwgIiAgQ29uZ2VzdGlvbiBiZWFyZXI6JXUgbGluazoldSAgU2VuZCBxdWV1ZSBtYXg6JXUgYXZnOiV1XG4iLAorCQkgICAgYmNsLT5zdGF0cy5iZWFyZXJfY29uZ3MsCisJCSAgICBiY2wtPnN0YXRzLmxpbmtfY29uZ3MsCisJCSAgICBiY2wtPnN0YXRzLm1heF9xdWV1ZV9zeiwKKwkJICAgIGJjbC0+c3RhdHMucXVldWVfc3pfY291bnRzCisJCSAgICA/IChiY2wtPnN0YXRzLmFjY3VfcXVldWVfc3ogLyBiY2wtPnN0YXRzLnF1ZXVlX3N6X2NvdW50cykKKwkJICAgIDogMCk7CisKKwlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7CisJcmV0dXJuIHByaW50YnVmX3ZhbGlkYXRlKCZwYik7Cit9CisKK2ludCBiY2xpbmtfcmVzZXRfc3RhdHModm9pZCkKK3sKKwlpZiAoIWJjbCkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisJbWVtc2V0KCZiY2wtPnN0YXRzLCAwLCBzaXplb2YoYmNsLT5zdGF0cykpOworCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworaW50IGJjbGlua19zZXRfcXVldWVfbGltaXRzKHUzMiBsaW1pdCkKK3sKKwlpZiAoIWJjbCkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwlpZiAoKGxpbWl0IDwgVElQQ19NSU5fTElOS19XSU4pIHx8IChsaW1pdCA+IFRJUENfTUFYX0xJTktfV0lOKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCWxpbmtfc2V0X3F1ZXVlX2xpbWl0cyhiY2wsIGxpbWl0KTsKKwlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCBiY2xpbmtfaW5pdCh2b2lkKQoreworCWJjYmVhcmVyID0ga21hbGxvYyhzaXplb2YoKmJjYmVhcmVyKSwgR0ZQX0FUT01JQyk7CisJYmNsaW5rID0ga21hbGxvYyhzaXplb2YoKmJjbGluayksIEdGUF9BVE9NSUMpOworCWlmICghYmNiZWFyZXIgfHwgIWJjbGluaykgeworIG5vbWVtOgorCSAJd2FybigiTWVtb3J5IHNxdWVlemU7IEZhaWxlZCB0byBjcmVhdGUgbXVsdGljYXN0IGxpbmtcbiIpOworCQlrZnJlZShiY2JlYXJlcik7CisJCWJjYmVhcmVyID0gTlVMTDsKKwkJa2ZyZWUoYmNsaW5rKTsKKwkJYmNsaW5rID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGJjYmVhcmVyLCAwLCBzaXplb2Yoc3RydWN0IGJjYmVhcmVyKSk7CisJSU5JVF9MSVNUX0hFQUQoJmJjYmVhcmVyLT5iZWFyZXIuY29uZ19saW5rcyk7CisJYmNiZWFyZXItPmJlYXJlci5tZWRpYSA9ICZiY2JlYXJlci0+bWVkaWE7CisJYmNiZWFyZXItPm1lZGlhLnNlbmRfbXNnID0gYmNiZWFyZXJfc2VuZDsKKwlzcHJpbnRmKGJjYmVhcmVyLT5tZWRpYS5uYW1lLCAidGlwYy1tdWx0aWNhc3QiKTsKKworCWJjbCA9ICZiY2xpbmstPmxpbms7CisJbWVtc2V0KGJjbGluaywgMCwgc2l6ZW9mKHN0cnVjdCBiY2xpbmspKTsKKwlJTklUX0xJU1RfSEVBRCgmYmNsLT53YWl0aW5nX3BvcnRzKTsKKwliY2wtPm5leHRfb3V0X25vID0gMTsKKwliY2xpbmstPm5vZGUubG9jayA9ICBTUElOX0xPQ0tfVU5MT0NLRUQ7ICAgICAgICAKKwliY2wtPm93bmVyID0gJmJjbGluay0+bm9kZTsKKyAgICAgICAgYmNsLT5tYXhfcGt0ID0gTUFYX1BLVF9ERUZBVUxUX01DQVNUOworCWxpbmtfc2V0X3F1ZXVlX2xpbWl0cyhiY2wsIEJDTElOS19XSU5fREVGQVVMVCk7CisJYmNsLT5iX3B0ciA9ICZiY2JlYXJlci0+YmVhcmVyOworCWJjbC0+c3RhdGUgPSBXT1JLSU5HX1dPUktJTkc7CisJc3ByaW50ZihiY2wtPm5hbWUsIGJjX2xpbmtfbmFtZSk7CisKKwlpZiAoQkNMSU5LX0xPR19CVUZfU0laRSkgeworCQljaGFyICpwYiA9IGttYWxsb2MoQkNMSU5LX0xPR19CVUZfU0laRSwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKCFwYikKKwkJCWdvdG8gbm9tZW07CisJCXByaW50YnVmX2luaXQoJmJjbC0+cHJpbnRfYnVmLCBwYiwgQkNMSU5LX0xPR19CVUZfU0laRSk7CisJfQorCisJcmV0dXJuIFRJUENfT0s7Cit9CisKK3ZvaWQgYmNsaW5rX3N0b3Aodm9pZCkKK3sKKwlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCWlmIChiY2JlYXJlcikgeworCQlsaW5rX3N0b3AoYmNsKTsKKwkJaWYgKEJDTElOS19MT0dfQlVGX1NJWkUpCisJCQlrZnJlZShiY2wtPnByaW50X2J1Zi5idWYpOworCQliY2wgPSBOVUxMOworCQlrZnJlZShiY2xpbmspOworCQliY2xpbmsgPSBOVUxMOworCQlrZnJlZShiY2JlYXJlcik7CisJCWJjYmVhcmVyID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iY2FzdC5oIGIvbmV0L3RpcGMvYmNhc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDMwZTUyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvYmNhc3QuaApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIG5ldC90aXBjL2JjYXN0Lmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBicm9hZGNhc3QgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX0JDQVNUX0gKKyNkZWZpbmUgX1RJUENfQkNBU1RfSAorCisjZGVmaW5lIE1BWF9OT0RFUyA0MDk2CisjZGVmaW5lIFdTSVpFIDMyCisKKy8qKgorICogc3RydWN0IG5vZGVfbWFwIC0gc2V0IG9mIG5vZGUgaWRlbnRpZmllcnMKKyAqIEBjb3VudDogIyBvZiBub2RlcyBpbiBzZXQKKyAqIEBtYXA6IGJpdG1hcCBvZiBub2RlIGlkZW50aWZpZXJzIHRoYXQgYXJlIGluIHRoZSBzZXQKKyAqLworCitzdHJ1Y3Qgbm9kZV9tYXAgeworCXUzMiBjb3VudDsKKwl1MzIgbWFwW01BWF9OT0RFUyAvIFdTSVpFXTsKK307CisKKworI2RlZmluZSBQTFNJWkUgMzIKKworLyoqCisgKiBzdHJ1Y3QgcG9ydF9saXN0IC0gc2V0IG9mIG5vZGUgbG9jYWwgZGVzdGluYXRpb24gcG9ydHMKKyAqIEBjb3VudDogIyBvZiBwb3J0cyBpbiBzZXQgKG9ubHkgdmFsaWQgZm9yIGZpcnN0IGVudHJ5IGluIGxpc3QpCisgKiBAbmV4dDogcG9pbnRlciB0byBuZXh0IGVudHJ5IGluIGxpc3QKKyAqIEBwb3J0czogYXJyYXkgb2YgcG9ydCByZWZlcmVuY2VzCisgKi8KKworc3RydWN0IHBvcnRfbGlzdCB7CisJaW50IGNvdW50OworCXN0cnVjdCBwb3J0X2xpc3QgKm5leHQ7CisJdTMyIHBvcnRzW1BMU0laRV07Cit9OworCisKK3N0cnVjdCBub2RlOworCitleHRlcm4gY2hhciBiY19saW5rX25hbWVbXTsKKworCisvKioKKyAqIG5tYXBfZ2V0IC0gZGV0ZXJtaW5lIGlmIG5vZGUgZXhpc3RzIGluIGEgbm9kZSBtYXAKKyAqLworCitzdGF0aWMgaW5saW5lIGludCBubWFwX2dldChzdHJ1Y3Qgbm9kZV9tYXAgKm5tX3B0ciwgdTMyIG5vZGUpCit7CisJaW50IG4gPSB0aXBjX25vZGUobm9kZSk7CisJaW50IHcgPSBuIC8gV1NJWkU7CisJaW50IGIgPSBuICUgV1NJWkU7CisKKwlyZXR1cm4gbm1fcHRyLT5tYXBbd10gJiAoMSA8PCBiKTsKK30KKworLyoqCisgKiBubWFwX2FkZCAtIGFkZCBhIG5vZGUgdG8gYSBub2RlIG1hcAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBubWFwX2FkZChzdHJ1Y3Qgbm9kZV9tYXAgKm5tX3B0ciwgdTMyIG5vZGUpCit7CisJaW50IG4gPSB0aXBjX25vZGUobm9kZSk7CisJaW50IHcgPSBuIC8gV1NJWkU7CisJdTMyIG1hc2sgPSAoMSA8PCAobiAlIFdTSVpFKSk7CisKKwlpZiAoKG5tX3B0ci0+bWFwW3ddICYgbWFzaykgPT0gMCkgeworCQlubV9wdHItPmNvdW50Kys7CisJCW5tX3B0ci0+bWFwW3ddIHw9IG1hc2s7CisJfQorfQorCisvKiogCisgKiBubWFwX3JlbW92ZSAtIHJlbW92ZSBhIG5vZGUgZnJvbSBhIG5vZGUgbWFwCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG5tYXBfcmVtb3ZlKHN0cnVjdCBub2RlX21hcCAqbm1fcHRyLCB1MzIgbm9kZSkKK3sKKwlpbnQgbiA9IHRpcGNfbm9kZShub2RlKTsKKwlpbnQgdyA9IG4gLyBXU0laRTsKKwl1MzIgbWFzayA9ICgxIDw8IChuICUgV1NJWkUpKTsKKworCWlmICgobm1fcHRyLT5tYXBbd10gJiBtYXNrKSAhPSAwKSB7CisJCW5tX3B0ci0+bWFwW3ddICY9IH5tYXNrOworCQlubV9wdHItPmNvdW50LS07CisJfQorfQorCisvKioKKyAqIG5tYXBfZXF1YWwgLSB0ZXN0IGZvciBlcXVhbGl0eSBvZiBub2RlIG1hcHMKKyAqLworCitzdGF0aWMgaW5saW5lIGludCBubWFwX2VxdWFsKHN0cnVjdCBub2RlX21hcCAqbm1fYSwgc3RydWN0IG5vZGVfbWFwICpubV9iKQoreworCXJldHVybiAhbWVtY21wKG5tX2EsIG5tX2IsIHNpemVvZigqbm1fYSkpOworfQorCisvKioKKyAqIG5tYXBfZGlmZiAtIGZpbmQgZGlmZmVyZW5jZXMgYmV0d2VlbiBub2RlIG1hcHMKKyAqIEBubV9hOiBpbnB1dCBub2RlIG1hcCBBCisgKiBAbm1fYjogaW5wdXQgbm9kZSBtYXAgQgorICogQG5tX2RpZmY6IG91dHB1dCBub2RlIG1hcCBBLUIgKGkuZS4gbm9kZXMgb2YgQSB0aGF0IGFyZSBub3QgaW4gQikKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbm1hcF9kaWZmKHN0cnVjdCBub2RlX21hcCAqbm1fYSwgc3RydWN0IG5vZGVfbWFwICpubV9iLAorCQkJICAgICBzdHJ1Y3Qgbm9kZV9tYXAgKm5tX2RpZmYpCit7CisJaW50IHN0b3AgPSBzaXplb2Yobm1fYS0+bWFwKSAvIHNpemVvZih1MzIpOworCWludCB3OworCWludCBiOworCXUzMiBtYXA7CisKKwltZW1zZXQobm1fZGlmZiwgMCwgc2l6ZW9mKCpubV9kaWZmKSk7CisJZm9yICh3ID0gMDsgdyA8IHN0b3A7IHcrKykgeworCQltYXAgPSBubV9hLT5tYXBbd10gXiAobm1fYS0+bWFwW3ddICYgbm1fYi0+bWFwW3ddKTsKKwkJbm1fZGlmZi0+bWFwW3ddID0gbWFwOworCQlpZiAobWFwICE9IDApIHsKKwkJCWZvciAoYiA9IDAgOyBiIDwgV1NJWkU7IGIrKykgeworCQkJCWlmIChtYXAgJiAoMSA8PCBiKSkKKwkJCQkJbm1fZGlmZi0+Y291bnQrKzsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiBwb3J0X2xpc3RfYWRkIC0gYWRkIGEgcG9ydCB0byBhIHBvcnQgbGlzdCwgZW5zdXJpbmcgbm8gZHVwbGljYXRlcworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwb3J0X2xpc3RfYWRkKHN0cnVjdCBwb3J0X2xpc3QgKnBsX3B0ciwgdTMyIHBvcnQpCit7CisJc3RydWN0IHBvcnRfbGlzdCAqaXRlbSA9IHBsX3B0cjsKKwlpbnQgaTsKKwlpbnQgaXRlbV9zeiA9IFBMU0laRTsKKwlpbnQgY250ID0gcGxfcHRyLT5jb3VudDsKKworCWZvciAoOyA7IGNudCAtPSBpdGVtX3N6LCBpdGVtID0gaXRlbS0+bmV4dCkgeworCQlpZiAoY250IDwgUExTSVpFKQorCQkJaXRlbV9zeiA9IGNudDsKKwkJZm9yIChpID0gMDsgaSA8IGl0ZW1fc3o7IGkrKykKKwkJCWlmIChpdGVtLT5wb3J0c1tpXSA9PSBwb3J0KQorCQkJCXJldHVybjsKKwkJaWYgKGkgPCBQTFNJWkUpIHsKKwkJCWl0ZW0tPnBvcnRzW2ldID0gcG9ydDsKKwkJCXBsX3B0ci0+Y291bnQrKzsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIWl0ZW0tPm5leHQpIHsKKwkJCWl0ZW0tPm5leHQgPSBrbWFsbG9jKHNpemVvZigqaXRlbSksIEdGUF9BVE9NSUMpOworCQkJaWYgKCFpdGVtLT5uZXh0KSB7CisJCQkJd2FybigiTWVtb3J5IHNxdWVlemU6IG11bHRpY2FzdCBkZXN0aW5hdGlvbiBwb3J0IGxpc3QgaXMgaW5jb21wbGV0ZVxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaXRlbS0+bmV4dC0+bmV4dCA9IE5VTEw7CisJCX0KKwl9Cit9CisKKy8qKgorICogcG9ydF9saXN0X2ZyZWUgLSBmcmVlIGR5bmFtaWNhbGx5IGNyZWF0ZWQgZW50cmllcyBpbiBwb3J0X2xpc3QgY2hhaW4KKyAqIAorICogTm90ZTogRmlyc3QgaXRlbSBpcyBvbiBzdGFjaywgc28gaXQgZG9lc24ndCBuZWVkIHRvIGJlIHJlbGVhc2VkCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBvcnRfbGlzdF9mcmVlKHN0cnVjdCBwb3J0X2xpc3QgKnBsX3B0cikKK3sKKwlzdHJ1Y3QgcG9ydF9saXN0ICppdGVtOworCXN0cnVjdCBwb3J0X2xpc3QgKm5leHQ7CisKKwlmb3IgKGl0ZW0gPSBwbF9wdHItPm5leHQ7IGl0ZW07IGl0ZW0gPSBuZXh0KSB7CisJCW5leHQgPSBpdGVtLT5uZXh0OworCQlrZnJlZShpdGVtKTsKKwl9Cit9CisKKworaW50ICBiY2xpbmtfaW5pdCh2b2lkKTsKK3ZvaWQgYmNsaW5rX3N0b3Aodm9pZCk7Cit2b2lkIGJjbGlua19hY2tub3dsZWRnZShzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHUzMiBhY2tlZCk7CitpbnQgIGJjbGlua19zZW5kX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK3ZvaWQgYmNsaW5rX3JlY3ZfcGt0KHN0cnVjdCBza19idWZmICpidWYpOwordTMyICBiY2xpbmtfZ2V0X2xhc3Rfc2VudCh2b2lkKTsKK3UzMiAgYmNsaW5rX2Fja3NfbWlzc2luZyhzdHJ1Y3Qgbm9kZSAqbl9wdHIpOwordm9pZCBiY2xpbmtfY2hlY2tfZ2FwKHN0cnVjdCBub2RlICpuX3B0ciwgdTMyIHNlcW5vKTsKK2ludCAgYmNsaW5rX3N0YXRzKGNoYXIgKnN0YXRzX2J1ZiwgY29uc3QgdTMyIGJ1Zl9zaXplKTsKK2ludCAgYmNsaW5rX3Jlc2V0X3N0YXRzKHZvaWQpOworaW50ICBiY2xpbmtfc2V0X3F1ZXVlX2xpbWl0cyh1MzIgbGltaXQpOwordm9pZCBiY2JlYXJlcl9zb3J0KHZvaWQpOwordm9pZCBiY2JlYXJlcl9wdXNoKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL2JlYXJlci5jIGIvbmV0L3RpcGMvYmVhcmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkMTlmZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2JlYXJlci5jCkBAIC0wLDAgKzEsNjkyIEBACisvKgorICogbmV0L3RpcGMvYmVhcmVyLmM6IFRJUEMgYmVhcmVyIGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAiZGlzY292ZXIuaCIKKyNpbmNsdWRlICJiY2FzdC5oIgorCisjZGVmaW5lIE1BWF9BRERSX1NUUiAzMgorCitzdGF0aWMgc3RydWN0IG1lZGlhICptZWRpYV9saXN0ID0gMDsKK3N0YXRpYyB1MzIgbWVkaWFfY291bnQgPSAwOworCitzdHJ1Y3QgYmVhcmVyICpiZWFyZXJzID0gMDsKKworLyoqCisgKiBtZWRpYV9uYW1lX3ZhbGlkIC0gdmFsaWRhdGUgbWVkaWEgbmFtZQorICogCisgKiBSZXR1cm5zIDEgaWYgbWVkaWEgbmFtZSBpcyB2YWxpZCwgb3RoZXJ3aXNlIDAuCisgKi8KKworc3RhdGljIGludCBtZWRpYV9uYW1lX3ZhbGlkKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdTMyIGxlbjsKKworCWxlbiA9IHN0cmxlbihuYW1lKTsKKwlpZiAoKGxlbiArIDEpID4gVElQQ19NQVhfTUVESUFfTkFNRSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChzdHJzcG4obmFtZSwgdGlwY19hbHBoYWJldCkgPT0gbGVuKTsKK30KKworLyoqCisgKiBtZWRpYV9maW5kIC0gbG9jYXRlcyBzcGVjaWZpZWQgbWVkaWEgb2JqZWN0IGJ5IG5hbWUKKyAqLworCitzdGF0aWMgc3RydWN0IG1lZGlhICptZWRpYV9maW5kKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG1lZGlhICptX3B0cjsKKwl1MzIgaTsKKworCWZvciAoaSA9IDAsIG1fcHRyID0gbWVkaWFfbGlzdDsgaSA8IG1lZGlhX2NvdW50OyBpKyssIG1fcHRyKyspIHsKKwkJaWYgKCFzdHJjbXAobV9wdHItPm5hbWUsIG5hbWUpKQorCQkJcmV0dXJuIG1fcHRyOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0aXBjX3JlZ2lzdGVyX21lZGlhIC0gcmVnaXN0ZXIgYSBtZWRpYSB0eXBlCisgKiAKKyAqIEJlYXJlcnMgZm9yIHRoaXMgbWVkaWEgdHlwZSBtdXN0IGJlIGFjdGl2YXRlZCBzZXBhcmF0ZWx5IGF0IGEgbGF0ZXIgc3RhZ2UuCisgKi8KKworaW50ICB0aXBjX3JlZ2lzdGVyX21lZGlhKHUzMiBtZWRpYV90eXBlLAorCQkJIGNoYXIgKm5hbWUsIAorCQkJIGludCAoKmVuYWJsZSkoc3RydWN0IHRpcGNfYmVhcmVyICopLCAKKwkJCSB2b2lkICgqZGlzYWJsZSkoc3RydWN0IHRpcGNfYmVhcmVyICopLCAKKwkJCSBpbnQgKCpzZW5kX21zZykoc3RydWN0IHNrX2J1ZmYgKiwgCisJCQkJCSBzdHJ1Y3QgdGlwY19iZWFyZXIgKiwKKwkJCQkJIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKiksIAorCQkJIGNoYXIgKigqYWRkcjJzdHIpKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsCisJCQkJCSAgIGNoYXIgKnN0cl9idWYsIGludCBzdHJfc2l6ZSksCisJCQkgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYmNhc3RfYWRkciwKKwkJCSBjb25zdCB1MzIgYmVhcmVyX3ByaW9yaXR5LAorCQkJIGNvbnN0IHUzMiBsaW5rX3RvbGVyYW5jZSwgIC8qIFttc10gKi8KKwkJCSBjb25zdCB1MzIgc2VuZF93aW5kb3dfbGltaXQpCit7CisJc3RydWN0IG1lZGlhICptX3B0cjsKKwl1MzIgbWVkaWFfaWQ7CisJdTMyIGk7CisJaW50IHJlcyA9IC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2JoKCZuZXRfbG9jayk7CisJaWYgKCFtZWRpYV9saXN0KQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoIW1lZGlhX25hbWVfdmFsaWQobmFtZSkpIHsKKwkJd2FybigiTWVkaWEgcmVnaXN0cmF0aW9uIGVycm9yOiBpbGxlZ2FsIG5hbWUgPCVzPlxuIiwgbmFtZSk7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKCFiY2FzdF9hZGRyKSB7CisJCXdhcm4oIk1lZGlhIHJlZ2lzdHJhdGlvbiBlcnJvcjogbm8gYnJvYWRjYXN0IGFkZHJlc3Mgc3VwcGxpZWRcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCWlmIChiZWFyZXJfcHJpb3JpdHkgPj0gVElQQ19OVU1fTElOS19QUkkpIHsKKwkJd2FybigiTWVkaWEgcmVnaXN0cmF0aW9uIGVycm9yOiBwcmlvcml0eSAldVxuIiwgYmVhcmVyX3ByaW9yaXR5KTsKKwkJZ290byBleGl0OworCX0KKwlpZiAoKGxpbmtfdG9sZXJhbmNlIDwgVElQQ19NSU5fTElOS19UT0wpIHx8IAorCSAgICAobGlua190b2xlcmFuY2UgPiBUSVBDX01BWF9MSU5LX1RPTCkpIHsKKwkJd2FybigiTWVkaWEgcmVnaXN0cmF0aW9uIGVycm9yOiB0b2xlcmFuY2UgJXVcbiIsIGxpbmtfdG9sZXJhbmNlKTsKKwkJZ290byBleGl0OworCX0KKworCW1lZGlhX2lkID0gbWVkaWFfY291bnQrKzsKKwlpZiAobWVkaWFfaWQgPj0gTUFYX01FRElBKSB7CisJCXdhcm4oIkF0dGVtcHQgdG8gcmVnaXN0ZXIgbW9yZSB0aGFuICV1IG1lZGlhXG4iLCBNQVhfTUVESUEpOworCQltZWRpYV9jb3VudC0tOworCQlnb3RvIGV4aXQ7CisJfQorCWZvciAoaSA9IDA7IGkgPCBtZWRpYV9pZDsgaSsrKSB7CisJCWlmIChtZWRpYV9saXN0W2ldLnR5cGVfaWQgPT0gbWVkaWFfdHlwZSkgeworCQkJd2FybigiQXR0ZW1wdCB0byByZWdpc3RlciBzZWNvbmQgbWVkaWEgd2l0aCB0eXBlICV1XG4iLCAKKwkJCSAgICAgbWVkaWFfdHlwZSk7CisJCQltZWRpYV9jb3VudC0tOworCQkJZ290byBleGl0OworCQl9CisJCWlmICghc3RyY21wKG5hbWUsIG1lZGlhX2xpc3RbaV0ubmFtZSkpIHsKKwkJCXdhcm4oIkF0dGVtcHQgdG8gcmUtcmVnaXN0ZXIgbWVkaWEgbmFtZSA8JXM+XG4iLCBuYW1lKTsKKwkJCW1lZGlhX2NvdW50LS07CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwltX3B0ciA9ICZtZWRpYV9saXN0W21lZGlhX2lkXTsKKwltX3B0ci0+dHlwZV9pZCA9IG1lZGlhX3R5cGU7CisJbV9wdHItPnNlbmRfbXNnID0gc2VuZF9tc2c7CisJbV9wdHItPmVuYWJsZV9iZWFyZXIgPSBlbmFibGU7CisJbV9wdHItPmRpc2FibGVfYmVhcmVyID0gZGlzYWJsZTsKKwltX3B0ci0+YWRkcjJzdHIgPSBhZGRyMnN0cjsKKwltZW1jcHkoJm1fcHRyLT5iY2FzdF9hZGRyLCBiY2FzdF9hZGRyLCBzaXplb2YoKmJjYXN0X2FkZHIpKTsKKwltX3B0ci0+YmNhc3QgPSAxOworCXN0cmNweShtX3B0ci0+bmFtZSwgbmFtZSk7CisJbV9wdHItPnByaW9yaXR5ID0gYmVhcmVyX3ByaW9yaXR5OworCW1fcHRyLT50b2xlcmFuY2UgPSBsaW5rX3RvbGVyYW5jZTsKKwltX3B0ci0+d2luZG93ID0gc2VuZF93aW5kb3dfbGltaXQ7CisJZGJnKCJNZWRpYSA8JXM+IHJlZ2lzdGVyZWRcbiIsIG5hbWUpOworCXJlcyA9IDA7CitleGl0OgorCXdyaXRlX3VubG9ja19iaCgmbmV0X2xvY2spOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogbWVkaWFfYWRkcl9wcmludGYgLSByZWNvcmQgbWVkaWEgYWRkcmVzcyBpbiBwcmludCBidWZmZXIKKyAqLworCit2b2lkIG1lZGlhX2FkZHJfcHJpbnRmKHN0cnVjdCBwcmludF9idWYgKnBiLCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphKQoreworCXN0cnVjdCBtZWRpYSAqbV9wdHI7CisJdTMyIG1lZGlhX3R5cGU7CisJdTMyIGk7CisKKwltZWRpYV90eXBlID0gbnRvaGwoYS0+dHlwZSk7CisJZm9yIChpID0gMCwgbV9wdHIgPSBtZWRpYV9saXN0OyBpIDwgbWVkaWFfY291bnQ7IGkrKywgbV9wdHIrKykgeworCQlpZiAobV9wdHItPnR5cGVfaWQgPT0gbWVkaWFfdHlwZSkKKwkJCWJyZWFrOworCX0KKworCWlmICgoaSA8IG1lZGlhX2NvdW50KSAmJiAobV9wdHItPmFkZHIyc3RyICE9IE5VTEwpKSB7CisJCWNoYXIgYWRkcl9zdHJbTUFYX0FERFJfU1RSXTsKKworCQl0aXBjX3ByaW50ZihwYiwgIiVzKCVzKSAiLCBtX3B0ci0+bmFtZSwgCisJCQkgICAgbV9wdHItPmFkZHIyc3RyKGEsIGFkZHJfc3RyLCBzaXplb2YoYWRkcl9zdHIpKSk7CisJfSBlbHNlIHsKKwkJdW5jaGFyICphZGRyID0gKHVuY2hhciAqKSZhLT5kZXZfYWRkcjsKKworCQl0aXBjX3ByaW50ZihwYiwgIlVOS05PV04oJXUpOiIsIG1lZGlhX3R5cGUpOworCQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZigqYSkgLSBzaXplb2YoYS0+dHlwZSkpOyBpKyspIHsKKwkJCXRpcGNfcHJpbnRmKHBiLCAiJTAyeCAiLCBhZGRyW2ldKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBtZWRpYV9nZXRfbmFtZXMgLSByZWNvcmQgbmFtZXMgb2YgcmVnaXN0ZXJlZCBtZWRpYSBpbiBidWZmZXIKKyAqLworCitzdHJ1Y3Qgc2tfYnVmZiAqbWVkaWFfZ2V0X25hbWVzKHZvaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgbWVkaWEgKm1fcHRyOworCWludCBpOworCisJYnVmID0gY2ZnX3JlcGx5X2FsbG9jKE1BWF9NRURJQSAqIFRMVl9TUEFDRShUSVBDX01BWF9NRURJQV9OQU1FKSk7CisJaWYgKCFidWYpCisJCXJldHVybiBOVUxMOworCisJcmVhZF9sb2NrX2JoKCZuZXRfbG9jayk7CisJZm9yIChpID0gMCwgbV9wdHIgPSBtZWRpYV9saXN0OyBpIDwgbWVkaWFfY291bnQ7IGkrKywgbV9wdHIrKykgeworCQljZmdfYXBwZW5kX3RsdihidWYsIFRJUENfVExWX01FRElBX05BTUUsIG1fcHRyLT5uYW1lLCAKKwkJCSAgICAgICBzdHJsZW4obV9wdHItPm5hbWUpICsgMSk7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisJcmV0dXJuIGJ1ZjsKK30KKworLyoqCisgKiBiZWFyZXJfbmFtZV92YWxpZGF0ZSAtIHZhbGlkYXRlICYgKG9wdGlvbmFsbHkpIGRlY29uc3RydWN0IGJlYXJlciBuYW1lCisgKiBAbmFtZSAtIHB0ciB0byBiZWFyZXIgbmFtZSBzdHJpbmcKKyAqIEBuYW1lX3BhcnRzIC0gcHRyIHRvIGFyZWEgZm9yIGJlYXJlciBuYW1lIGNvbXBvbmVudHMgKG9yIE5VTEwgaWYgbm90IG5lZWRlZCkKKyAqIAorICogUmV0dXJucyAxIGlmIGJlYXJlciBuYW1lIGlzIHZhbGlkLCBvdGhlcndpc2UgMC4KKyAqLworCitzdGF0aWMgaW50IGJlYXJlcl9uYW1lX3ZhbGlkYXRlKGNvbnN0IGNoYXIgKm5hbWUsIAorCQkJCXN0cnVjdCBiZWFyZXJfbmFtZSAqbmFtZV9wYXJ0cykKK3sKKwljaGFyIG5hbWVfY29weVtUSVBDX01BWF9CRUFSRVJfTkFNRV07CisJY2hhciAqbWVkaWFfbmFtZTsKKwljaGFyICppZl9uYW1lOworCXUzMiBtZWRpYV9sZW47CisJdTMyIGlmX2xlbjsKKworCS8qIGNvcHkgYmVhcmVyIG5hbWUgJiBlbnN1cmUgbGVuZ3RoIGlzIE9LICovCisKKwluYW1lX2NvcHlbVElQQ19NQVhfQkVBUkVSX05BTUUgLSAxXSA9IDA7CisJLyogbmVlZCBhYm92ZSBpbiBjYXNlIG5vbi1Qb3NpeCBzdHJuY3B5KCkgZG9lc24ndCBwYWQgd2l0aCBudWxscyAqLworCXN0cm5jcHkobmFtZV9jb3B5LCBuYW1lLCBUSVBDX01BWF9CRUFSRVJfTkFNRSk7CisJaWYgKG5hbWVfY29weVtUSVBDX01BWF9CRUFSRVJfTkFNRSAtIDFdICE9IDApCisJCXJldHVybiAwOworCisJLyogZW5zdXJlIGFsbCBjb21wb25lbnQgcGFydHMgb2YgYmVhcmVyIG5hbWUgYXJlIHByZXNlbnQgKi8KKworCW1lZGlhX25hbWUgPSBuYW1lX2NvcHk7CisJaWYgKChpZl9uYW1lID0gc3RyY2hyKG1lZGlhX25hbWUsICc6JykpID09IE5VTEwpCisJCXJldHVybiAwOworCSooaWZfbmFtZSsrKSA9IDA7CisJbWVkaWFfbGVuID0gaWZfbmFtZSAtIG1lZGlhX25hbWU7CisJaWZfbGVuID0gc3RybGVuKGlmX25hbWUpICsgMTsKKworCS8qIHZhbGlkYXRlIGNvbXBvbmVudCBwYXJ0cyBvZiBiZWFyZXIgbmFtZSAqLworCisJaWYgKChtZWRpYV9sZW4gPD0gMSkgfHwgKG1lZGlhX2xlbiA+IFRJUENfTUFYX01FRElBX05BTUUpIHx8IAorCSAgICAoaWZfbGVuIDw9IDEpIHx8IChpZl9sZW4gPiBUSVBDX01BWF9JRl9OQU1FKSB8fCAKKwkgICAgKHN0cnNwbihtZWRpYV9uYW1lLCB0aXBjX2FscGhhYmV0KSAhPSAobWVkaWFfbGVuIC0gMSkpIHx8CisJICAgIChzdHJzcG4oaWZfbmFtZSwgdGlwY19hbHBoYWJldCkgIT0gKGlmX2xlbiAtIDEpKSkKKwkJcmV0dXJuIDA7CisKKwkvKiByZXR1cm4gYmVhcmVyIG5hbWUgY29tcG9uZW50cywgaWYgbmVjZXNzYXJ5ICovCisKKwlpZiAobmFtZV9wYXJ0cykgeworCQlzdHJjcHkobmFtZV9wYXJ0cy0+bWVkaWFfbmFtZSwgbWVkaWFfbmFtZSk7CisJCXN0cmNweShuYW1lX3BhcnRzLT5pZl9uYW1lLCBpZl9uYW1lKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogYmVhcmVyX2ZpbmQgLSBsb2NhdGVzIGJlYXJlciBvYmplY3Qgd2l0aCBtYXRjaGluZyBiZWFyZXIgbmFtZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgYmVhcmVyICpiZWFyZXJfZmluZChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBiZWFyZXIgKmJfcHRyOworCXUzMiBpOworCisJZm9yIChpID0gMCwgYl9wdHIgPSBiZWFyZXJzOyBpIDwgTUFYX0JFQVJFUlM7IGkrKywgYl9wdHIrKykgeworCQlpZiAoYl9wdHItPmFjdGl2ZSAmJiAoIXN0cmNtcChiX3B0ci0+cHVibC5uYW1lLCBuYW1lKSkpCisJCQlyZXR1cm4gYl9wdHI7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGJlYXJlcl9maW5kIC0gbG9jYXRlcyBiZWFyZXIgb2JqZWN0IHdpdGggbWF0Y2hpbmcgaW50ZXJmYWNlIG5hbWUKKyAqLworCitzdHJ1Y3QgYmVhcmVyICpiZWFyZXJfZmluZF9pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSkKK3sKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0cjsKKwljaGFyICpiX2lmX25hbWU7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwLCBiX3B0ciA9IGJlYXJlcnM7IGkgPCBNQVhfQkVBUkVSUzsgaSsrLCBiX3B0cisrKSB7CisJCWlmICghYl9wdHItPmFjdGl2ZSkKKwkJCWNvbnRpbnVlOworCQliX2lmX25hbWUgPSBzdHJjaHIoYl9wdHItPnB1YmwubmFtZSwgJzonKSArIDE7CisJCWlmICghc3RyY21wKGJfaWZfbmFtZSwgaWZfbmFtZSkpCisJCQlyZXR1cm4gYl9wdHI7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGJlYXJlcl9nZXRfbmFtZXMgLSByZWNvcmQgbmFtZXMgb2YgYmVhcmVycyBpbiBidWZmZXIKKyAqLworCitzdHJ1Y3Qgc2tfYnVmZiAqYmVhcmVyX2dldF9uYW1lcyh2b2lkKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IG1lZGlhICptX3B0cjsKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0cjsKKwlpbnQgaSwgajsKKworCWJ1ZiA9IGNmZ19yZXBseV9hbGxvYyhNQVhfQkVBUkVSUyAqIFRMVl9TUEFDRShUSVBDX01BWF9CRUFSRVJfTkFNRSkpOworCWlmICghYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCXJlYWRfbG9ja19iaCgmbmV0X2xvY2spOworCWZvciAoaSA9IDAsIG1fcHRyID0gbWVkaWFfbGlzdDsgaSA8IG1lZGlhX2NvdW50OyBpKyssIG1fcHRyKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IE1BWF9CRUFSRVJTOyBqKyspIHsKKwkJCWJfcHRyID0gJmJlYXJlcnNbal07CisJCQlpZiAoYl9wdHItPmFjdGl2ZSAmJiAoYl9wdHItPm1lZGlhID09IG1fcHRyKSkgeworCQkJCWNmZ19hcHBlbmRfdGx2KGJ1ZiwgVElQQ19UTFZfQkVBUkVSX05BTUUsIAorCQkJCQkgICAgICAgYl9wdHItPnB1YmwubmFtZSwgCisJCQkJCSAgICAgICBzdHJsZW4oYl9wdHItPnB1YmwubmFtZSkgKyAxKTsKKwkJCX0KKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOworCXJldHVybiBidWY7Cit9CisKK3ZvaWQgYmVhcmVyX2FkZF9kZXN0KHN0cnVjdCBiZWFyZXIgKmJfcHRyLCB1MzIgZGVzdCkKK3sKKwlubWFwX2FkZCgmYl9wdHItPm5vZGVzLCBkZXN0KTsKKwlkaXNjX3VwZGF0ZV9saW5rX3JlcShiX3B0ci0+bGlua19yZXEpOworCWJjYmVhcmVyX3NvcnQoKTsKK30KKwordm9pZCBiZWFyZXJfcmVtb3ZlX2Rlc3Qoc3RydWN0IGJlYXJlciAqYl9wdHIsIHUzMiBkZXN0KQoreworCW5tYXBfcmVtb3ZlKCZiX3B0ci0+bm9kZXMsIGRlc3QpOworCWRpc2NfdXBkYXRlX2xpbmtfcmVxKGJfcHRyLT5saW5rX3JlcSk7CisJYmNiZWFyZXJfc29ydCgpOworfQorCisvKgorICogYmVhcmVyX3B1c2goKTogUmVzb2x2ZSBiZWFyZXIgY29uZ2VzdGlvbi4gRm9yY2UgdGhlIHdhaXRpbmcKKyAqIGxpbmtzIHRvIHB1c2ggb3V0IHRoZWlyIHVuc2VudCBwYWNrZXRzLCBvbmUgcGFja2V0IHBlciBsaW5rCisgKiBwZXIgaXRlcmF0aW9uLCB1bnRpbCBhbGwgcGFja2V0cyBhcmUgZ29uZSBvciBjb25nZXN0aW9uIHJlb2NjdXJzLgorICogJ25ldF9sb2NrJyBpcyByZWFkX2xvY2tlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiBiZWFyZXIubG9jayBtdXN0IGJlIHRha2VuIGJlZm9yZSBjYWxsaW5nCisgKiBSZXR1cm5zIGJpbmFyeSB0cnVlKDEpIG9yZSBmYWxzZSgwKQorICovCitzdGF0aWMgaW50IGJlYXJlcl9wdXNoKHN0cnVjdCBiZWFyZXIgKmJfcHRyKQoreworCXUzMiByZXMgPSBUSVBDX09LOworCXN0cnVjdCBsaW5rICpsbiwgKnRsbjsKKworCWlmIChiX3B0ci0+cHVibC5ibG9ja2VkKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmYl9wdHItPmNvbmdfbGlua3MpICYmIChyZXMgIT0gUFVTSF9GQUlMRUQpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsbiwgdGxuLCAmYl9wdHItPmNvbmdfbGlua3MsIGxpbmtfbGlzdCkgeworCQkJcmVzID0gbGlua19wdXNoX3BhY2tldChsbik7CisJCQlpZiAocmVzID09IFBVU0hfRkFJTEVEKQorCQkJCWJyZWFrOworCQkJaWYgKHJlcyA9PSBQVVNIX0ZJTklTSEVEKQorCQkJCWxpc3RfbW92ZV90YWlsKCZsbi0+bGlua19saXN0LCAmYl9wdHItPmxpbmtzKTsKKwkJfQorCX0KKwlyZXR1cm4gbGlzdF9lbXB0eSgmYl9wdHItPmNvbmdfbGlua3MpOworfQorCit2b2lkIGJlYXJlcl9sb2NrX3B1c2goc3RydWN0IGJlYXJlciAqYl9wdHIpCit7CisJaW50IHJlczsKKworCXNwaW5fbG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJcmVzID0gYmVhcmVyX3B1c2goYl9wdHIpOworCXNwaW5fdW5sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKKwlpZiAocmVzKQorCQliY2JlYXJlcl9wdXNoKCk7Cit9CisKKworLyoKKyAqIEludGVycnVwdCBlbmFibGluZyBuZXcgcmVxdWVzdHMgYWZ0ZXIgYmVhcmVyIGNvbmdlc3Rpb24gb3IgYmxvY2tpbmc6ICAgIAorICogU2VlIGJlYXJlcl9zZW5kKCkuICAgCisgKi8KK3ZvaWQgdGlwY19jb250aW51ZShzdHJ1Y3QgdGlwY19iZWFyZXIgKnRiX3B0cikKK3sKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0ciA9IChzdHJ1Y3QgYmVhcmVyICopdGJfcHRyOworCisJc3Bpbl9sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKKwliX3B0ci0+Y29udGludWVfY291bnQrKzsKKwlpZiAoIWxpc3RfZW1wdHkoJmJfcHRyLT5jb25nX2xpbmtzKSkKKwkJa19zaWduYWwoKEhhbmRsZXIpYmVhcmVyX2xvY2tfcHVzaCwgKHVuc2lnbmVkIGxvbmcpYl9wdHIpOworCWJfcHRyLT5wdWJsLmJsb2NrZWQgPSAwOworCXNwaW5fdW5sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKK30KKworLyoKKyAqIFNjaGVkdWxlIGxpbmsgZm9yIHNlbmRpbmcgb2YgbWVzc2FnZXMgYWZ0ZXIgdGhlIGJlYXJlciAKKyAqIGhhcyBiZWVuIGRlYmxvY2tlZCBieSAnY29udGludWUoKScuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCAKKyAqIHdoZW4gc29tZWJvZHkgdHJpZXMgdG8gc2VuZCBhIG1lc3NhZ2UgdmlhIHRoaXMgbGluayB3aGlsZSAKKyAqIHRoZSBiZWFyZXIgaXMgY29uZ2VzdGVkLiAnbmV0X2xvY2snIGlzIGluIHJlYWRfbG9jayBoZXJlCisgKiBiZWFyZXIubG9jayBpcyBidXN5CisgKi8KKworc3RhdGljIHZvaWQgYmVhcmVyX3NjaGVkdWxlX3VubG9ja2VkKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJbGlzdF9tb3ZlX3RhaWwoJmxfcHRyLT5saW5rX2xpc3QsICZiX3B0ci0+Y29uZ19saW5rcyk7Cit9CisKKy8qCisgKiBTY2hlZHVsZSBsaW5rIGZvciBzZW5kaW5nIG9mIG1lc3NhZ2VzIGFmdGVyIHRoZSBiZWFyZXIgCisgKiBoYXMgYmVlbiBkZWJsb2NrZWQgYnkgJ2NvbnRpbnVlKCknLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgCisgKiB3aGVuIHNvbWVib2R5IHRyaWVzIHRvIHNlbmQgYSBtZXNzYWdlIHZpYSB0aGlzIGxpbmsgd2hpbGUgCisgKiB0aGUgYmVhcmVyIGlzIGNvbmdlc3RlZC4gJ25ldF9sb2NrJyBpcyBpbiByZWFkX2xvY2sgaGVyZSwKKyAqIGJlYXJlci5sb2NrIGlzIGZyZWUKKyAqLworCit2b2lkIGJlYXJlcl9zY2hlZHVsZShzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXNwaW5fbG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJYmVhcmVyX3NjaGVkdWxlX3VubG9ja2VkKGJfcHRyLCBsX3B0cik7CisJc3Bpbl91bmxvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworfQorCisKKy8qCisgKiBiZWFyZXJfcmVzb2x2ZV9jb25nZXN0aW9uKCk6IENoZWNrIGlmIHRoZXJlIGlzIGJlYXJlciBjb25nZXN0aW9uLAorICogYW5kIGlmIHRoZXJlIGlzLCB0cnkgdG8gcmVzb2x2ZSBpdCBiZWZvcmUgcmV0dXJuaW5nLgorICogJ25ldF9sb2NrJyBpcyByZWFkX2xvY2tlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKi8KK2ludCBiZWFyZXJfcmVzb2x2ZV9jb25nZXN0aW9uKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJaW50IHJlcyA9IDE7CisKKwlpZiAobGlzdF9lbXB0eSgmYl9wdHItPmNvbmdfbGlua3MpKQorCQlyZXR1cm4gMTsKKwlzcGluX2xvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCWlmICghYmVhcmVyX3B1c2goYl9wdHIpKSB7CisJCWJlYXJlcl9zY2hlZHVsZV91bmxvY2tlZChiX3B0ciwgbF9wdHIpOworCQlyZXMgPSAwOworCX0KKwlzcGluX3VubG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJcmV0dXJuIHJlczsKK30KKworCisvKioKKyAqIHRpcGNfZW5hYmxlX2JlYXJlciAtIGVuYWJsZSBiZWFyZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICovICAgICAgICAgICAgICAKKworaW50IHRpcGNfZW5hYmxlX2JlYXJlcihjb25zdCBjaGFyICpuYW1lLCB1MzIgYmNhc3Rfc2NvcGUsIHUzMiBwcmlvcml0eSkKK3sKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0cjsKKwlzdHJ1Y3QgbWVkaWEgKm1fcHRyOworCXN0cnVjdCBiZWFyZXJfbmFtZSBiX25hbWU7CisJY2hhciBhZGRyX3N0cmluZ1sxNl07CisJdTMyIGJlYXJlcl9pZDsKKwl1MzIgd2l0aF90aGlzX3ByaW87CisJdTMyIGk7CisJaW50IHJlcyA9IC1FSU5WQUw7CisKKwlpZiAodGlwY19tb2RlICE9IFRJUENfTkVUX01PREUpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJaWYgKCFiZWFyZXJfbmFtZV92YWxpZGF0ZShuYW1lLCAmYl9uYW1lKSB8fAorCSAgICAhYWRkcl9kb21haW5fdmFsaWQoYmNhc3Rfc2NvcGUpIHx8CisJICAgICFpbl9zY29wZShiY2FzdF9zY29wZSwgdGlwY19vd25fYWRkcikgfHwKKwkgICAgKHByaW9yaXR5ID4gVElQQ19OVU1fTElOS19QUkkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdyaXRlX2xvY2tfYmgoJm5ldF9sb2NrKTsKKwlpZiAoIWJlYXJlcnMpCisJCWdvdG8gZmFpbGVkOworCisJbV9wdHIgPSBtZWRpYV9maW5kKGJfbmFtZS5tZWRpYV9uYW1lKTsKKwlpZiAoIW1fcHRyKSB7CisJCXdhcm4oIk5vIG1lZGlhIDwlcz5cbiIsIGJfbmFtZS5tZWRpYV9uYW1lKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCWlmIChwcmlvcml0eSA9PSBUSVBDX05VTV9MSU5LX1BSSSkKKwkJcHJpb3JpdHkgPSBtX3B0ci0+cHJpb3JpdHk7CisKK3Jlc3RhcnQ6CisJYmVhcmVyX2lkID0gTUFYX0JFQVJFUlM7CisJd2l0aF90aGlzX3ByaW8gPSAxOworCWZvciAoaSA9IE1BWF9CRUFSRVJTOyBpLS0gIT0gMDsgKSB7CisJCWlmICghYmVhcmVyc1tpXS5hY3RpdmUpIHsKKwkJCWJlYXJlcl9pZCA9IGk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChuYW1lLCBiZWFyZXJzW2ldLnB1YmwubmFtZSkpIHsKKwkJCXdhcm4oIkJlYXJlciA8JXM+IGFscmVhZHkgZW5hYmxlZFxuIiwgbmFtZSk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCQlpZiAoKGJlYXJlcnNbaV0ucHJpb3JpdHkgPT0gcHJpb3JpdHkpICYmCisJCSAgICAoKyt3aXRoX3RoaXNfcHJpbyA+IDIpKSB7CisJCQlpZiAocHJpb3JpdHktLSA9PSAwKSB7CisJCQkJd2FybigiVGhpcmQgYmVhcmVyIDwlcz4gd2l0aCBwcmlvcml0eSAldSwgdW5hYmxlIHRvIGxvd2VyIHRvICV1XG4iLAorCQkJCSAgICAgbmFtZSwgcHJpb3JpdHkgKyAxLCBwcmlvcml0eSk7CisJCQkJZ290byBmYWlsZWQ7CisJCQl9CisJCQl3YXJuKCJUaGlyZCBiZWFyZXIgPCVzPiB3aXRoIHByaW9yaXR5ICV1LCBsb3dlcmluZyB0byAldVxuIiwKKwkJCSAgICAgbmFtZSwgcHJpb3JpdHkgKyAxLCBwcmlvcml0eSk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwl9CisJaWYgKGJlYXJlcl9pZCA+PSBNQVhfQkVBUkVSUykgeworCQl3YXJuKCJBdHRlbXB0IHRvIGVuYWJsZSBtb3JlIHRoYW4gJWQgYmVhcmVyc1xuIiwgTUFYX0JFQVJFUlMpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwliX3B0ciA9ICZiZWFyZXJzW2JlYXJlcl9pZF07CisJbWVtc2V0KGJfcHRyLCAwLCBzaXplb2Yoc3RydWN0IGJlYXJlcikpOworCisJc3RyY3B5KGJfcHRyLT5wdWJsLm5hbWUsIG5hbWUpOworCXJlcyA9IG1fcHRyLT5lbmFibGVfYmVhcmVyKCZiX3B0ci0+cHVibCk7CisJaWYgKHJlcykgeworCQl3YXJuKCJGYWlsZWQgdG8gZW5hYmxlIGJlYXJlciA8JXM+XG4iLCBuYW1lKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJYl9wdHItPmlkZW50aXR5ID0gYmVhcmVyX2lkOworCWJfcHRyLT5tZWRpYSA9IG1fcHRyOworCWJfcHRyLT5uZXRfcGxhbmUgPSBiZWFyZXJfaWQgKyAnQSc7CisJYl9wdHItPmFjdGl2ZSA9IDE7CisJYl9wdHItPmRldGVjdF9zY29wZSA9IGJjYXN0X3Njb3BlOworCWJfcHRyLT5wcmlvcml0eSA9IHByaW9yaXR5OworCUlOSVRfTElTVF9IRUFEKCZiX3B0ci0+Y29uZ19saW5rcyk7CisJSU5JVF9MSVNUX0hFQUQoJmJfcHRyLT5saW5rcyk7CisJaWYgKG1fcHRyLT5iY2FzdCkgeworCQliX3B0ci0+bGlua19yZXEgPSBkaXNjX2luaXRfbGlua19yZXEoYl9wdHIsICZtX3B0ci0+YmNhc3RfYWRkciwKKwkJCQkJCSAgICAgYmNhc3Rfc2NvcGUsIDIpOworCX0KKwliX3B0ci0+cHVibC5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCXdyaXRlX3VubG9ja19iaCgmbmV0X2xvY2spOworCWluZm8oIkVuYWJsZWQgYmVhcmVyIDwlcz4sIGRpc2NvdmVyeSBkb21haW4gJXNcbiIsCisJICAgICBuYW1lLCBhZGRyX3N0cmluZ19maWxsKGFkZHJfc3RyaW5nLCBiY2FzdF9zY29wZSkpOworCXJldHVybiAwOworZmFpbGVkOgorCXdyaXRlX3VubG9ja19iaCgmbmV0X2xvY2spOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogdGlwY19ibG9ja19iZWFyZXIoKTogQmxvY2sgdGhlIGJlYXJlciB3aXRoIHRoZSBnaXZlbiBuYW1lLAorICogICAgICAgICAgICAgICAgICAgICAgYW5kIHJlc2V0IGFsbCBpdHMgbGlua3MKKyAqLworCitpbnQgdGlwY19ibG9ja19iZWFyZXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0ciA9IDA7CisJc3RydWN0IGxpbmsgKmxfcHRyOworCXN0cnVjdCBsaW5rICp0ZW1wX2xfcHRyOworCisJaWYgKHRpcGNfbW9kZSAhPSBUSVBDX05FVF9NT0RFKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJcmVhZF9sb2NrX2JoKCZuZXRfbG9jayk7CisJYl9wdHIgPSBiZWFyZXJfZmluZChuYW1lKTsKKwlpZiAoIWJfcHRyKSB7CisJCXdhcm4oIkF0dGVtcHQgdG8gYmxvY2sgdW5rbm93biBiZWFyZXIgPCVzPlxuIiwgbmFtZSk7CisJCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJYl9wdHItPnB1YmwuYmxvY2tlZCA9IDE7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxfcHRyLCB0ZW1wX2xfcHRyLCAmYl9wdHItPmxpbmtzLCBsaW5rX2xpc3QpIHsKKwkJc3RydWN0IG5vZGUgKm5fcHRyID0gbF9wdHItPm93bmVyOworCisJCXNwaW5fbG9ja19iaCgmbl9wdHItPmxvY2spOworCQlsaW5rX3Jlc2V0KGxfcHRyKTsKKwkJc3Bpbl91bmxvY2tfYmgoJm5fcHRyLT5sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisJaW5mbygiQmxvY2tlZCBiZWFyZXIgPCVzPlxuIiwgbmFtZSk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qKgorICogYmVhcmVyX2Rpc2FibGUgLQorICogCisgKiBOb3RlOiBUaGlzIHJvdXRpbmUgYXNzdW1lcyBjYWxsZXIgaG9sZHMgbmV0X2xvY2suCisgKi8KKworc3RhdGljIGludCBiZWFyZXJfZGlzYWJsZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBiZWFyZXIgKmJfcHRyOworCXN0cnVjdCBsaW5rICpsX3B0cjsKKwlzdHJ1Y3QgbGluayAqdGVtcF9sX3B0cjsKKworCWlmICh0aXBjX21vZGUgIT0gVElQQ19ORVRfTU9ERSkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCWJfcHRyID0gYmVhcmVyX2ZpbmQobmFtZSk7CisJaWYgKCFiX3B0cikgeworCQl3YXJuKCJBdHRlbXB0IHRvIGRpc2FibGUgdW5rbm93biBiZWFyZXIgPCVzPlxuIiwgbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRpc2Nfc3RvcF9saW5rX3JlcShiX3B0ci0+bGlua19yZXEpOworCXNwaW5fbG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJYl9wdHItPmxpbmtfcmVxID0gTlVMTDsKKwliX3B0ci0+cHVibC5ibG9ja2VkID0gMTsKKwlpZiAoYl9wdHItPm1lZGlhLT5kaXNhYmxlX2JlYXJlcikgeworCQlzcGluX3VubG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJCXdyaXRlX3VubG9ja19iaCgmbmV0X2xvY2spOworCQliX3B0ci0+bWVkaWEtPmRpc2FibGVfYmVhcmVyKCZiX3B0ci0+cHVibCk7CisJCXdyaXRlX2xvY2tfYmgoJm5ldF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxfcHRyLCB0ZW1wX2xfcHRyLCAmYl9wdHItPmxpbmtzLCBsaW5rX2xpc3QpIHsKKwkJbGlua19kZWxldGUobF9wdHIpOworCX0KKwlzcGluX3VubG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJaW5mbygiRGlzYWJsZWQgYmVhcmVyIDwlcz5cbiIsIG5hbWUpOworCW1lbXNldChiX3B0ciwgMCwgc2l6ZW9mKHN0cnVjdCBiZWFyZXIpKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworaW50IHRpcGNfZGlzYWJsZV9iZWFyZXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgcmVzOworCisJd3JpdGVfbG9ja19iaCgmbmV0X2xvY2spOworCXJlcyA9IGJlYXJlcl9kaXNhYmxlKG5hbWUpOworCXdyaXRlX3VubG9ja19iaCgmbmV0X2xvY2spOworCXJldHVybiByZXM7Cit9CisKKworCitpbnQgYmVhcmVyX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzOworCisJd3JpdGVfbG9ja19iaCgmbmV0X2xvY2spOworCWJlYXJlcnMgPSBrbWFsbG9jKE1BWF9CRUFSRVJTICogc2l6ZW9mKHN0cnVjdCBiZWFyZXIpLCBHRlBfQVRPTUlDKTsKKwltZWRpYV9saXN0ID0ga21hbGxvYyhNQVhfTUVESUEgKiBzaXplb2Yoc3RydWN0IG1lZGlhKSwgR0ZQX0FUT01JQyk7CisJaWYgKGJlYXJlcnMgJiYgbWVkaWFfbGlzdCkgeworCQltZW1zZXQoYmVhcmVycywgMCwgTUFYX0JFQVJFUlMgKiBzaXplb2Yoc3RydWN0IGJlYXJlcikpOworCQltZW1zZXQobWVkaWFfbGlzdCwgMCwgTUFYX01FRElBICogc2l6ZW9mKHN0cnVjdCBtZWRpYSkpOworCQlyZXMgPSBUSVBDX09LOworCX0gZWxzZSB7CisJCWtmcmVlKGJlYXJlcnMpOworCQlrZnJlZShtZWRpYV9saXN0KTsKKwkJYmVhcmVycyA9IDA7CisJCW1lZGlhX2xpc3QgPSAwOworCQlyZXMgPSAtRU5PTUVNOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCit2b2lkIGJlYXJlcl9zdG9wKHZvaWQpCit7CisJdTMyIGk7CisKKwlpZiAoIWJlYXJlcnMpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgaSsrKSB7CisJCWlmIChiZWFyZXJzW2ldLmFjdGl2ZSkKKwkJCWJlYXJlcnNbaV0ucHVibC5ibG9ja2VkID0gMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKKwkJaWYgKGJlYXJlcnNbaV0uYWN0aXZlKQorCQkJYmVhcmVyX2Rpc2FibGUoYmVhcmVyc1tpXS5wdWJsLm5hbWUpOworCX0KKwlrZnJlZShiZWFyZXJzKTsKKwlrZnJlZShtZWRpYV9saXN0KTsKKwliZWFyZXJzID0gMDsKKwltZWRpYV9saXN0ID0gMDsKKwltZWRpYV9jb3VudCA9IDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmVhcmVyLmggYi9uZXQvdGlwYy9iZWFyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWU2M2QzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvYmVhcmVyLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBuZXQvdGlwYy9iZWFyZXIuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIGJlYXJlciBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfQkVBUkVSX0gKKyNkZWZpbmUgX1RJUENfQkVBUkVSX0gKKworI2luY2x1ZGUgPG5ldC90aXBjL3RpcGNfYmVhcmVyLmg+CisjaW5jbHVkZSAiYmNhc3QuaCIKKworI2RlZmluZSBNQVhfQkVBUkVSUyA4CisjZGVmaW5lIE1BWF9NRURJQSA0CisKKworLyoqCisgKiBzdHJ1Y3QgbWVkaWEgLSBUSVBDIG1lZGlhIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBpbnRlcm5hbCB1c2VycworICogQHNlbmRfbXNnOiByb3V0aW5lIHdoaWNoIGhhbmRsZXMgYnVmZmVyIHRyYW5zbWlzc2lvbgorICogQGVuYWJsZV9iZWFyZXI6IHJvdXRpbmUgd2hpY2ggZW5hYmxlcyBhIGJlYXJlcgorICogQGRpc2FibGVfYmVhcmVyOiByb3V0aW5lIHdoaWNoIGRpc2FibGVzIGEgYmVhcmVyCisgKiBAYWRkcjJzdHI6IHJvdXRpbmUgd2hpY2ggY29udmVydHMgYmVhcmVyJ3MgYWRkcmVzcyB0byBzdHJpbmcgZm9ybQorICogQGJjYXN0X2FkZHI6IG1lZGlhIGFkZHJlc3MgdXNlZCBpbiBicm9hZGNhc3RpbmcKKyAqIEBiY2FzdDogbm9uLXplcm8gaWYgbWVkaWEgc3VwcG9ydHMgYnJvYWRjYXN0aW5nIFtjdXJyZW50bHkgbWFuZGF0b3J5XQorICogQHByaW9yaXR5OiBkZWZhdWx0IGxpbmsgKGFuZCBiZWFyZXIpIHByaW9yaXR5CisgKiBAdG9sZXJhbmNlOiBkZWZhdWx0IHRpbWUgKGluIG1zKSBiZWZvcmUgZGVjbGFyaW5nIGxpbmsgZmFpbHVyZQorICogQHdpbmRvdzogZGVmYXVsdCB3aW5kb3cgKGluIHBhY2tldHMpIGJlZm9yZSBkZWNsYXJpbmcgbGluayBjb25nZXN0aW9uCisgKiBAdHlwZV9pZDogVElQQyBtZWRpYSBpZGVudGlmaWVyIFtkZWZpbmVkIGluIHRpcGNfYmVhcmVyLmhdCisgKiBAbmFtZTogbWVkaWEgbmFtZQorICovCisgCitzdHJ1Y3QgbWVkaWEgeworCWludCAoKnNlbmRfbXNnKShzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCAKKwkJCXN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsCisJCQlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpkZXN0KTsKKwlpbnQgKCplbmFibGVfYmVhcmVyKShzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyKTsKKwl2b2lkICgqZGlzYWJsZV9iZWFyZXIpKHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIpOworCWNoYXIgKigqYWRkcjJzdHIpKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsIAorCQkJICBjaGFyICpzdHJfYnVmLCBpbnQgc3RyX3NpemUpOworCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgYmNhc3RfYWRkcjsKKwlpbnQgYmNhc3Q7CisJdTMyIHByaW9yaXR5OworCXUzMiB0b2xlcmFuY2U7CisJdTMyIHdpbmRvdzsKKwl1MzIgdHlwZV9pZDsKKwljaGFyIG5hbWVbVElQQ19NQVhfTUVESUFfTkFNRV07Cit9OworCisvKioKKyAqIHN0cnVjdCBiZWFyZXIgLSBUSVBDIGJlYXJlciBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gaW50ZXJuYWwgdXNlcnMKKyAqIEBwdWJsOiBiZWFyZXIgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIHByaXZpbGVnZWQgdXNlcnMKKyAqIEBtZWRpYTogcHRyIHRvIG1lZGlhIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggYmVhcmVyCisgKiBAcHJpb3JpdHk6IGRlZmF1bHQgbGluayBwcmlvcml0eSBmb3IgYmVhcmVyCisgKiBAZGV0ZWN0X3Njb3BlOiBuZXR3b3JrIGFkZHJlc3MgbWFzayB1c2VkIGR1cmluZyBhdXRvbWF0aWMgbGluayBjcmVhdGlvbgorICogQGlkZW50aXR5OiBhcnJheSBpbmRleCBvZiB0aGlzIGJlYXJlciB3aXRoaW4gVElQQyBiZWFyZXIgYXJyYXkKKyAqIEBsaW5rX3JlcTogcHRyIHRvIChvcHRpb25hbCkgc3RydWN0dXJlIG1ha2luZyBwZXJpb2RpYyBsaW5rIHNldHVwIHJlcXVlc3RzCisgKiBAbGlua3M6IGxpc3Qgb2Ygbm9uLWNvbmdlc3RlZCBsaW5rcyBhc3NvY2lhdGVkIHdpdGggYmVhcmVyCisgKiBAY29uZ19saW5rczogbGlzdCBvZiBjb25nZXN0ZWQgbGlua3MgYXNzb2NpYXRlZCB3aXRoIGJlYXJlcgorICogQGNvbnRpbnVlX2NvdW50OiAjIG9mIHRpbWVzIGJlYXJlciBoYXMgcmVzdW1lZCBhZnRlciBjb25nZXN0aW9uIG9yIGJsb2NraW5nCisgKiBAYWN0aXZlOiBub24temVybyBpZiBiZWFyZXIgc3RydWN0dXJlIGlzIHJlcHJlc2VudHMgYSBiZWFyZXIKKyAqIEBuZXRfcGxhbmU6IG5ldHdvcmsgcGxhbmUgKCdBJyB0aHJvdWdoICdIJykgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCBiZWFyZXIKKyAqIEBub2RlczogaW5kaWNhdGVzIHdoaWNoIG5vZGVzIGluIGNsdXN0ZXIgY2FuIGJlIHJlYWNoZWQgdGhyb3VnaCBiZWFyZXIKKyAqLworIAorc3RydWN0IGJlYXJlciB7CisJc3RydWN0IHRpcGNfYmVhcmVyIHB1Ymw7CisJc3RydWN0IG1lZGlhICptZWRpYTsKKwl1MzIgcHJpb3JpdHk7CisJdTMyIGRldGVjdF9zY29wZTsKKwl1MzIgaWRlbnRpdHk7CisJc3RydWN0IGxpbmtfcmVxICpsaW5rX3JlcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbmtzOworCXN0cnVjdCBsaXN0X2hlYWQgY29uZ19saW5rczsKKwl1MzIgY29udGludWVfY291bnQ7CisJaW50IGFjdGl2ZTsKKwljaGFyIG5ldF9wbGFuZTsKKwlzdHJ1Y3Qgbm9kZV9tYXAgbm9kZXM7Cit9OworCitzdHJ1Y3QgYmVhcmVyX25hbWUgeworCWNoYXIgbWVkaWFfbmFtZVtUSVBDX01BWF9NRURJQV9OQU1FXTsKKwljaGFyIGlmX25hbWVbVElQQ19NQVhfSUZfTkFNRV07Cit9OworCitzdHJ1Y3QgbGluazsKKworZXh0ZXJuIHN0cnVjdCBiZWFyZXIgKmJlYXJlcnM7CisKK3ZvaWQgbWVkaWFfYWRkcl9wcmludGYoc3RydWN0IHByaW50X2J1ZiAqcGIsIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEpOworc3RydWN0IHNrX2J1ZmYgKm1lZGlhX2dldF9uYW1lcyh2b2lkKTsKKworc3RydWN0IHNrX2J1ZmYgKmJlYXJlcl9nZXRfbmFtZXModm9pZCk7Cit2b2lkIGJlYXJlcl9hZGRfZGVzdChzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgdTMyIGRlc3QpOwordm9pZCBiZWFyZXJfcmVtb3ZlX2Rlc3Qoc3RydWN0IGJlYXJlciAqYl9wdHIsIHUzMiBkZXN0KTsKK3ZvaWQgYmVhcmVyX3NjaGVkdWxlKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpOworc3RydWN0IGJlYXJlciAqYmVhcmVyX2ZpbmRfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUpOworaW50IGJlYXJlcl9yZXNvbHZlX2Nvbmdlc3Rpb24oc3RydWN0IGJlYXJlciAqYl9wdHIsIHN0cnVjdCBsaW5rICpsX3B0cik7CitpbnQgYmVhcmVyX2luaXQodm9pZCk7Cit2b2lkIGJlYXJlcl9zdG9wKHZvaWQpOworaW50IGJlYXJlcl9icm9hZGNhc3Qoc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0ciwKKwkJICAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpkZXN0KTsKK3ZvaWQgYmVhcmVyX2xvY2tfcHVzaChzdHJ1Y3QgYmVhcmVyICpiX3B0cik7CisKKworLyoqCisgKiBiZWFyZXJfc2VuZC0gc2VuZHMgYnVmZmVyIHRvIGRlc3RpbmF0aW9uIG92ZXIgYmVhcmVyIAorICogCisgKiBSZXR1cm5zIHRydWUgKDEpIGlmIHN1Y2Nlc3NmdWwsIG9yIGZhbHNlICgwKSBpZiB1bmFibGUgdG8gc2VuZAorICogCisgKiBJTVBPUlRBTlQ6CisgKiBUaGUgbWVkaWEgc2VuZCByb3V0aW5lIG11c3Qgbm90IGFsdGVyIHRoZSBidWZmZXIgYmVpbmcgcGFzc2VkIGluCisgKiBhcyBpdCBtYXkgYmUgbmVlZGVkIGZvciBsYXRlciByZXRyYW5zbWlzc2lvbiEKKyAqIAorICogSWYgdGhlIG1lZGlhIHNlbmQgcm91dGluZSByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUgKGluZGljYXRpbmcgdGhhdCAKKyAqIGl0IHdhcyB1bmFibGUgdG8gc2VuZCB0aGUgYnVmZmVyKSwgaXQgbXVzdDoKKyAqICAgMSkgbWFyayB0aGUgYmVhcmVyIGFzIGJsb2NrZWQsCisgKiAgIDIpIGNhbGwgdGlwY19jb250aW51ZSgpIG9uY2UgdGhlIGJlYXJlciBpcyBhYmxlIHRvIHNlbmQgYWdhaW4uCisgKiBNZWRpYSB0eXBlcyB0aGF0IGFyZSB1bmFibGUgdG8gbWVldCB0aGVzZSB0d28gY3JpdGVyYSBtdXN0IGVuc3VyZSB0aGVpcgorICogc2VuZCByb3V0aW5lIGFsd2F5cyByZXR1cm5zIHN1Y2Nlc3MgLS0gZXZlbiBpZiB0aGUgYnVmZmVyIHdhcyBub3Qgc2VudCAtLQorICogYW5kIGxldCBUSVBDJ3MgbGluayBjb2RlIGRlYWwgd2l0aCB0aGUgdW5kZWxpdmVyZWQgbWVzc2FnZS4gCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgYmVhcmVyX3NlbmQoc3RydWN0IGJlYXJlciAqYl9wdHIsIHN0cnVjdCBza19idWZmICpidWYsCisJCQkgICAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpkZXN0KQoreworCXJldHVybiAhYl9wdHItPm1lZGlhLT5zZW5kX21zZyhidWYsICZiX3B0ci0+cHVibCwgZGVzdCk7Cit9CisKKy8qKgorICogYmVhcmVyX2Nvbmdlc3RlZCAtIGRldGVybWluZXMgaWYgYmVhcmVyIGlzIGN1cnJlbnRseSBjb25nZXN0ZWQKKyAqLworCitzdGF0aWMgaW5saW5lIGludCBiZWFyZXJfY29uZ2VzdGVkKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJaWYgKHVubGlrZWx5KGJfcHRyLT5wdWJsLmJsb2NrZWQpKQorCQlyZXR1cm4gMTsKKwlpZiAobGlrZWx5KGxpc3RfZW1wdHkoJmJfcHRyLT5jb25nX2xpbmtzKSkpCisJCXJldHVybiAwOworCXJldHVybiAhYmVhcmVyX3Jlc29sdmVfY29uZ2VzdGlvbihiX3B0ciwgbF9wdHIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL2NsdXN0ZXIuYyBiL25ldC90aXBjL2NsdXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGY3YmFjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvY2x1c3Rlci5jCkBAIC0wLDAgKzEsNTc2IEBACisvKgorICogbmV0L3RpcGMvY2x1c3Rlci5jOiBUSVBDIGNsdXN0ZXIgbWFuYWdlbWVudCByb3V0aW5lcworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImNsdXN0ZXIuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAibm9kZV9zdWJzY3IuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAibm9kZS5oIgorI2luY2x1ZGUgIm5ldC5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorCit2b2lkIGNsdXN0ZXJfbXVsdGljYXN0KHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgCisJCSAgICAgICB1MzIgbG93ZXIsIHUzMiB1cHBlcik7CitzdHJ1Y3Qgc2tfYnVmZiAqY2x1c3Rlcl9wcmVwYXJlX3JvdXRpbmdfbXNnKHUzMiBkYXRhX3NpemUsIHUzMiBkZXN0KTsKKworc3RydWN0IG5vZGUgKipsb2NhbF9ub2RlcyA9IDA7CitzdHJ1Y3Qgbm9kZV9tYXAgY2x1c3Rlcl9iY2FzdF9ub2RlcyA9IHswLHswLH19OwordTMyIGhpZ2hlc3RfYWxsb3dlZF9zbGF2ZSA9IDA7CisKK3N0cnVjdCBjbHVzdGVyICpjbHVzdGVyX2NyZWF0ZSh1MzIgYWRkcikKK3sKKwlzdHJ1Y3QgX3pvbmUgKnpfcHRyOworCXN0cnVjdCBjbHVzdGVyICpjX3B0cjsKKwlpbnQgbWF4X25vZGVzOyAKKwlpbnQgYWxsb2M7CisKKwljX3B0ciA9IChzdHJ1Y3QgY2x1c3RlciAqKWttYWxsb2Moc2l6ZW9mKCpjX3B0ciksIEdGUF9BVE9NSUMpOworCWlmIChjX3B0ciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwltZW1zZXQoY19wdHIsIDAsIHNpemVvZigqY19wdHIpKTsKKworCWNfcHRyLT5hZGRyID0gdGlwY19hZGRyKHRpcGNfem9uZShhZGRyKSwgdGlwY19jbHVzdGVyKGFkZHIpLCAwKTsKKwlpZiAoaW5fb3duX2NsdXN0ZXIoYWRkcikpCisJCW1heF9ub2RlcyA9IExPV0VTVF9TTEFWRSArIHRpcGNfbWF4X3NsYXZlczsKKwllbHNlCisJCW1heF9ub2RlcyA9IHRpcGNfbWF4X25vZGVzICsgMTsKKwlhbGxvYyA9IHNpemVvZih2b2lkICopICogKG1heF9ub2RlcyArIDEpOworCWNfcHRyLT5ub2RlcyA9IChzdHJ1Y3Qgbm9kZSAqKilrbWFsbG9jKGFsbG9jLCBHRlBfQVRPTUlDKTsKKwlpZiAoY19wdHItPm5vZGVzID09IE5VTEwpIHsKKwkJa2ZyZWUoY19wdHIpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtc2V0KGNfcHRyLT5ub2RlcywgMCwgYWxsb2MpOyAgCisJaWYgKGluX293bl9jbHVzdGVyKGFkZHIpKQorCQlsb2NhbF9ub2RlcyA9IGNfcHRyLT5ub2RlczsKKwljX3B0ci0+aGlnaGVzdF9zbGF2ZSA9IExPV0VTVF9TTEFWRSAtIDE7CisJY19wdHItPmhpZ2hlc3Rfbm9kZSA9IDA7CisJCisJel9wdHIgPSB6b25lX2ZpbmQodGlwY196b25lKGFkZHIpKTsKKwlpZiAoel9wdHIgPT0gTlVMTCkgeworCQl6X3B0ciA9IHpvbmVfY3JlYXRlKGFkZHIpOworCX0KKwlpZiAoel9wdHIgIT0gTlVMTCkgeworCQl6b25lX2F0dGFjaF9jbHVzdGVyKHpfcHRyLCBjX3B0cik7CisJCWNfcHRyLT5vd25lciA9IHpfcHRyOworCX0KKwllbHNlIHsKKwkJa2ZyZWUoY19wdHIpOworCQljX3B0ciA9IDA7CisJfQorCisJcmV0dXJuIGNfcHRyOworfQorCit2b2lkIGNsdXN0ZXJfZGVsZXRlKHN0cnVjdCBjbHVzdGVyICpjX3B0cikKK3sKKwl1MzIgbl9udW07CisKKwlpZiAoIWNfcHRyKQorCQlyZXR1cm47CisJZm9yIChuX251bSA9IDE7IG5fbnVtIDw9IGNfcHRyLT5oaWdoZXN0X25vZGU7IG5fbnVtKyspIHsKKwkJbm9kZV9kZWxldGUoY19wdHItPm5vZGVzW25fbnVtXSk7CisJfQorCWZvciAobl9udW0gPSBMT1dFU1RfU0xBVkU7IG5fbnVtIDw9IGNfcHRyLT5oaWdoZXN0X3NsYXZlOyBuX251bSsrKSB7CisJCW5vZGVfZGVsZXRlKGNfcHRyLT5ub2Rlc1tuX251bV0pOworCX0KKwlrZnJlZShjX3B0ci0+bm9kZXMpOworCWtmcmVlKGNfcHRyKTsKK30KKwordTMyIGNsdXN0ZXJfbmV4dF9ub2RlKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIGFkZHIpCit7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCXUzMiBuX251bSA9IHRpcGNfbm9kZShhZGRyKSArIDE7CisKKwlpZiAoIWNfcHRyKQorCQlyZXR1cm4gYWRkcjsKKwlmb3IgKDsgbl9udW0gPD0gY19wdHItPmhpZ2hlc3Rfbm9kZTsgbl9udW0rKykgeworCQluX3B0ciA9IGNfcHRyLT5ub2Rlc1tuX251bV07CisJCWlmIChuX3B0ciAmJiBub2RlX2hhc19hY3RpdmVfbGlua3Mobl9wdHIpKQorCQkJcmV0dXJuIG5fcHRyLT5hZGRyOworCX0KKwlmb3IgKG5fbnVtID0gMTsgbl9udW0gPCB0aXBjX25vZGUoYWRkcik7IG5fbnVtKyspIHsKKwkJbl9wdHIgPSBjX3B0ci0+bm9kZXNbbl9udW1dOworCQlpZiAobl9wdHIgJiYgbm9kZV9oYXNfYWN0aXZlX2xpbmtzKG5fcHRyKSkKKwkJCXJldHVybiBuX3B0ci0+YWRkcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2x1c3Rlcl9hdHRhY2hfbm9kZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwl1MzIgbl9udW0gPSB0aXBjX25vZGUobl9wdHItPmFkZHIpOworCXUzMiBtYXhfbl9udW0gPSB0aXBjX21heF9ub2RlczsKKworCWlmIChpbl9vd25fY2x1c3RlcihuX3B0ci0+YWRkcikpCisJCW1heF9uX251bSA9IGhpZ2hlc3RfYWxsb3dlZF9zbGF2ZTsKKwlhc3NlcnQobl9udW0gPiAwKTsKKwlhc3NlcnQobl9udW0gPD0gbWF4X25fbnVtKTsKKwlhc3NlcnQoY19wdHItPm5vZGVzW25fbnVtXSA9PSAwKTsKKwljX3B0ci0+bm9kZXNbbl9udW1dID0gbl9wdHI7CisJaWYgKG5fbnVtID4gY19wdHItPmhpZ2hlc3Rfbm9kZSkKKwkJY19wdHItPmhpZ2hlc3Rfbm9kZSA9IG5fbnVtOworfQorCisvKioKKyAqIGNsdXN0ZXJfc2VsZWN0X3JvdXRlciAtIHNlbGVjdCByb3V0ZXIgdG8gYSBjbHVzdGVyCisgKiAKKyAqIFVzZXMgZGV0ZXJtaW5pc3RpYyBhbmQgZmFpciBhbGdvcml0aG0uCisgKi8KKwordTMyIGNsdXN0ZXJfc2VsZWN0X3JvdXRlcihzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiByZWYpCit7CisJdTMyIG5fbnVtOworCXUzMiB1bGltID0gY19wdHItPmhpZ2hlc3Rfbm9kZTsKKwl1MzIgbWFzazsKKwl1MzIgdHN0YXJ0OworCisJYXNzZXJ0KCFpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikpOworCWlmICghdWxpbSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTdGFydCBlbnRyeSBtdXN0IGJlIHJhbmRvbSAqLworCW1hc2sgPSB0aXBjX21heF9ub2RlczsKKwl3aGlsZSAobWFzayA+IHVsaW0pCisJCW1hc2sgPj49IDE7CisJdHN0YXJ0ID0gcmVmICYgbWFzazsKKwluX251bSA9IHRzdGFydDsKKworCS8qIExvb2t1cCB1cHdhcmRzIHdpdGggd3JhcC1hcm91bmQgKi8KKwlkbyB7CisJCWlmIChub2RlX2lzX3VwKGNfcHRyLT5ub2Rlc1tuX251bV0pKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoKytuX251bSA8PSB1bGltKTsKKwlpZiAobl9udW0gPiB1bGltKSB7CisJCW5fbnVtID0gMTsKKwkJZG8geworCQkJaWYgKG5vZGVfaXNfdXAoY19wdHItPm5vZGVzW25fbnVtXSkpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKCsrbl9udW0gPCB0c3RhcnQpOworCQlpZiAobl9udW0gPT0gdHN0YXJ0KQorCQkJcmV0dXJuIDA7CisJfQorCWFzc2VydChuX251bSA8PSB1bGltKTsKKwlyZXR1cm4gbm9kZV9zZWxlY3Rfcm91dGVyKGNfcHRyLT5ub2Rlc1tuX251bV0sIHJlZik7Cit9CisKKy8qKgorICogY2x1c3Rlcl9zZWxlY3Rfbm9kZSAtIHNlbGVjdCBkZXN0aW5hdGlvbiBub2RlIHdpdGhpbiBhIHJlbW90ZSBjbHVzdGVyCisgKiAKKyAqIFVzZXMgZGV0ZXJtaW5pc3RpYyBhbmQgZmFpciBhbGdvcml0aG0uCisgKi8KKworc3RydWN0IG5vZGUgKmNsdXN0ZXJfc2VsZWN0X25vZGUoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgc2VsZWN0b3IpCit7CisJdTMyIG5fbnVtOworCXUzMiBtYXNrID0gdGlwY19tYXhfbm9kZXM7CisJdTMyIHN0YXJ0X2VudHJ5OworCisJYXNzZXJ0KCFpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikpOworCWlmICghY19wdHItPmhpZ2hlc3Rfbm9kZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTdGFydCBlbnRyeSBtdXN0IGJlIHJhbmRvbSAqLworCXdoaWxlIChtYXNrID4gY19wdHItPmhpZ2hlc3Rfbm9kZSkgeworCQltYXNrID4+PSAxOworCX0KKwlzdGFydF9lbnRyeSA9IChzZWxlY3RvciAmIG1hc2spID8gc2VsZWN0b3IgJiBtYXNrIDogMXU7CisJYXNzZXJ0KHN0YXJ0X2VudHJ5IDw9IGNfcHRyLT5oaWdoZXN0X25vZGUpOworCisJLyogTG9va3VwIHVwd2FyZHMgd2l0aCB3cmFwLWFyb3VuZCAqLworCWZvciAobl9udW0gPSBzdGFydF9lbnRyeTsgbl9udW0gPD0gY19wdHItPmhpZ2hlc3Rfbm9kZTsgbl9udW0rKykgeworCQlpZiAobm9kZV9oYXNfYWN0aXZlX2xpbmtzKGNfcHRyLT5ub2Rlc1tuX251bV0pKQorCQkJcmV0dXJuIGNfcHRyLT5ub2Rlc1tuX251bV07CisJfQorCWZvciAobl9udW0gPSAxOyBuX251bSA8IHN0YXJ0X2VudHJ5OyBuX251bSsrKSB7CisJCWlmIChub2RlX2hhc19hY3RpdmVfbGlua3MoY19wdHItPm5vZGVzW25fbnVtXSkpCisJCQlyZXR1cm4gY19wdHItPm5vZGVzW25fbnVtXTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgICBSb3V0aW5nIHRhYmxlIG1hbmFnZW1lbnQ6IFNlZSBkZXNjcmlwdGlvbiBpbiBub2RlLmMKKyAqLworCitzdHJ1Y3Qgc2tfYnVmZiAqY2x1c3Rlcl9wcmVwYXJlX3JvdXRpbmdfbXNnKHUzMiBkYXRhX3NpemUsIHUzMiBkZXN0KQoreworCXUzMiBzaXplID0gSU5UX0hfU0laRSArIGRhdGFfc2l6ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gYnVmX2FjcXVpcmUoc2l6ZSk7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisKKwlpZiAoYnVmKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbWVtc2V0KChjaGFyICopbXNnLCAwLCBzaXplKTsKKwkJbXNnX2luaXQobXNnLCBST1VURV9ESVNUUklCVVRPUiwgMCwgVElQQ19PSywgSU5UX0hfU0laRSwgZGVzdCk7CisJfQorCXJldHVybiBidWY7Cit9CisKK3ZvaWQgY2x1c3Rlcl9iY2FzdF9uZXdfcm91dGUoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgZGVzdCwKKwkJCSAgICAgdTMyIGxvd2VyLCB1MzIgdXBwZXIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGNsdXN0ZXJfcHJlcGFyZV9yb3V0aW5nX21zZygwLCBjX3B0ci0+YWRkcik7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisKKwlpZiAoYnVmKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX3NldF9yZW1vdGVfbm9kZShtc2csIGRlc3QpOworCQltc2dfc2V0X3R5cGUobXNnLCBST1VURV9BRERJVElPTik7CisJCWNsdXN0ZXJfbXVsdGljYXN0KGNfcHRyLCBidWYsIGxvd2VyLCB1cHBlcik7CisJfSBlbHNlIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU6IGJyb2FkY2FzdCBvZiBuZXcgcm91dGUgZmFpbGVkXG4iKTsKKwl9Cit9CisKK3ZvaWQgY2x1c3Rlcl9iY2FzdF9sb3N0X3JvdXRlKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIGRlc3QsCisJCQkgICAgICB1MzIgbG93ZXIsIHUzMiB1cHBlcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gY2x1c3Rlcl9wcmVwYXJlX3JvdXRpbmdfbXNnKDAsIGNfcHRyLT5hZGRyKTsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKworCWlmIChidWYpIHsKKwkJbXNnID0gYnVmX21zZyhidWYpOworCQltc2dfc2V0X3JlbW90ZV9ub2RlKG1zZywgZGVzdCk7CisJCW1zZ19zZXRfdHlwZShtc2csIFJPVVRFX1JFTU9WQUwpOworCQljbHVzdGVyX211bHRpY2FzdChjX3B0ciwgYnVmLCBsb3dlciwgdXBwZXIpOworCX0gZWxzZSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOiBicm9hZGNhc3Qgb2YgbG9zdCByb3V0ZSBmYWlsZWRcbiIpOworCX0KK30KKwordm9pZCBjbHVzdGVyX3NlbmRfc2xhdmVfcm91dGVzKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIGRlc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1MzIgaGlnaGVzdCA9IGNfcHRyLT5oaWdoZXN0X3NsYXZlOworCXUzMiBuX251bTsKKwlpbnQgc2VuZCA9IDA7CisKKwlhc3NlcnQoIWlzX3NsYXZlKGRlc3QpKTsKKwlhc3NlcnQoaW5fb3duX2NsdXN0ZXIoZGVzdCkpOworCWFzc2VydChpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikpOworCWlmIChoaWdoZXN0IDw9IExPV0VTVF9TTEFWRSkKKwkJcmV0dXJuOworCWJ1ZiA9IGNsdXN0ZXJfcHJlcGFyZV9yb3V0aW5nX21zZyhoaWdoZXN0IC0gTE9XRVNUX1NMQVZFICsgMSwKKwkJCQkJICBjX3B0ci0+YWRkcik7CisJaWYgKGJ1ZikgeworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1zZ19zZXRfcmVtb3RlX25vZGUobXNnLCBjX3B0ci0+YWRkcik7CisJCW1zZ19zZXRfdHlwZShtc2csIFNMQVZFX1JPVVRJTkdfVEFCTEUpOworCQlmb3IgKG5fbnVtID0gTE9XRVNUX1NMQVZFOyBuX251bSA8PSBoaWdoZXN0OyBuX251bSsrKSB7CisJCQlpZiAoY19wdHItPm5vZGVzW25fbnVtXSAmJiAKKwkJCSAgICBub2RlX2hhc19hY3RpdmVfbGlua3MoY19wdHItPm5vZGVzW25fbnVtXSkpIHsKKwkJCQlzZW5kID0gMTsKKwkJCQltc2dfc2V0X2RhdGFvY3RldChtc2csIG5fbnVtKTsKKwkJCX0KKwkJfQorCQlpZiAoc2VuZCkKKwkJCWxpbmtfc2VuZChidWYsIGRlc3QsIGRlc3QpOworCQllbHNlCisJCQlidWZfZGlzY2FyZChidWYpOworCX0gZWxzZSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOiBicm9hZGNhc3Qgb2YgbG9zdCByb3V0ZSBmYWlsZWRcbiIpOworCX0KK30KKwordm9pZCBjbHVzdGVyX3NlbmRfZXh0X3JvdXRlcyhzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBkZXN0KQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJdTMyIGhpZ2hlc3QgPSBjX3B0ci0+aGlnaGVzdF9ub2RlOworCXUzMiBuX251bTsKKwlpbnQgc2VuZCA9IDA7CisKKwlpZiAoaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpKQorCQlyZXR1cm47CisJYXNzZXJ0KCFpc19zbGF2ZShkZXN0KSk7CisJYXNzZXJ0KGluX293bl9jbHVzdGVyKGRlc3QpKTsKKwloaWdoZXN0ID0gY19wdHItPmhpZ2hlc3Rfbm9kZTsKKwlidWYgPSBjbHVzdGVyX3ByZXBhcmVfcm91dGluZ19tc2coaGlnaGVzdCArIDEsIGNfcHRyLT5hZGRyKTsKKwlpZiAoYnVmKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX3NldF9yZW1vdGVfbm9kZShtc2csIGNfcHRyLT5hZGRyKTsKKwkJbXNnX3NldF90eXBlKG1zZywgRVhUX1JPVVRJTkdfVEFCTEUpOworCQlmb3IgKG5fbnVtID0gMTsgbl9udW0gPD0gaGlnaGVzdDsgbl9udW0rKykgeworCQkJaWYgKGNfcHRyLT5ub2Rlc1tuX251bV0gJiYgCisJCQkgICAgbm9kZV9oYXNfYWN0aXZlX2xpbmtzKGNfcHRyLT5ub2Rlc1tuX251bV0pKSB7CisJCQkJc2VuZCA9IDE7CisJCQkJbXNnX3NldF9kYXRhb2N0ZXQobXNnLCBuX251bSk7CisJCQl9CisJCX0KKwkJaWYgKHNlbmQpCisJCQlsaW5rX3NlbmQoYnVmLCBkZXN0LCBkZXN0KTsKKwkJZWxzZQorCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwl9IGVsc2UgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTogYnJvYWRjYXN0IG9mIGV4dGVybmFsIHJvdXRlIGZhaWxlZFxuIik7CisJfQorfQorCit2b2lkIGNsdXN0ZXJfc2VuZF9sb2NhbF9yb3V0ZXMoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCXUzMiBoaWdoZXN0ID0gY19wdHItPmhpZ2hlc3Rfbm9kZTsKKwl1MzIgbl9udW07CisJaW50IHNlbmQgPSAwOworCisJYXNzZXJ0KGlzX3NsYXZlKGRlc3QpKTsKKwlhc3NlcnQoaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpKTsKKwlidWYgPSBjbHVzdGVyX3ByZXBhcmVfcm91dGluZ19tc2coaGlnaGVzdCwgY19wdHItPmFkZHIpOworCWlmIChidWYpIHsKKwkJbXNnID0gYnVmX21zZyhidWYpOworCQltc2dfc2V0X3JlbW90ZV9ub2RlKG1zZywgY19wdHItPmFkZHIpOworCQltc2dfc2V0X3R5cGUobXNnLCBMT0NBTF9ST1VUSU5HX1RBQkxFKTsKKwkJZm9yIChuX251bSA9IDE7IG5fbnVtIDw9IGhpZ2hlc3Q7IG5fbnVtKyspIHsKKwkJCWlmIChjX3B0ci0+bm9kZXNbbl9udW1dICYmIAorCQkJICAgIG5vZGVfaGFzX2FjdGl2ZV9saW5rcyhjX3B0ci0+bm9kZXNbbl9udW1dKSkgeworCQkJCXNlbmQgPSAxOworCQkJCW1zZ19zZXRfZGF0YW9jdGV0KG1zZywgbl9udW0pOworCQkJfQorCQl9CisJCWlmIChzZW5kKQorCQkJbGlua19zZW5kKGJ1ZiwgZGVzdCwgZGVzdCk7CisJCWVsc2UKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJfSBlbHNlIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU6IGJyb2FkY2FzdCBvZiBsb2NhbCByb3V0ZSBmYWlsZWRcbiIpOworCX0KK30KKwordm9pZCBjbHVzdGVyX3JlY3Zfcm91dGluZ190YWJsZShzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCXN0cnVjdCBjbHVzdGVyICpjX3B0cjsKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CisJdW5jaGFyICpub2RlX3RhYmxlOworCXUzMiB0YWJsZV9zaXplOworCXUzMiByb3V0ZXI7CisJdTMyIHJlbV9ub2RlID0gbXNnX3JlbW90ZV9ub2RlKG1zZyk7CisJdTMyIHpfbnVtOworCXUzMiBjX251bTsKKwl1MzIgbl9udW07CisKKwljX3B0ciA9IGNsdXN0ZXJfZmluZChyZW1fbm9kZSk7CisJaWYgKCFjX3B0cikgeworCQljX3B0ciA9IGNsdXN0ZXJfY3JlYXRlKHJlbV9ub2RlKTsKKwkJaWYgKCFjX3B0cikgeworCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCW5vZGVfdGFibGUgPSBidWYtPmRhdGEgKyBtc2dfaGRyX3N6KG1zZyk7CisJdGFibGVfc2l6ZSA9IG1zZ19zaXplKG1zZykgLSBtc2dfaGRyX3N6KG1zZyk7CisJcm91dGVyID0gbXNnX3ByZXZub2RlKG1zZyk7CisJel9udW0gPSB0aXBjX3pvbmUocmVtX25vZGUpOworCWNfbnVtID0gdGlwY19jbHVzdGVyKHJlbV9ub2RlKTsKKworCXN3aXRjaCAobXNnX3R5cGUobXNnKSkgeworCWNhc2UgTE9DQUxfUk9VVElOR19UQUJMRToKKwkJYXNzZXJ0KGlzX3NsYXZlKHRpcGNfb3duX2FkZHIpKTsKKwljYXNlIEVYVF9ST1VUSU5HX1RBQkxFOgorCQlmb3IgKG5fbnVtID0gMTsgbl9udW0gPCB0YWJsZV9zaXplOyBuX251bSsrKSB7CisJCQlpZiAobm9kZV90YWJsZVtuX251bV0pIHsKKwkJCQl1MzIgYWRkciA9IHRpcGNfYWRkcih6X251bSwgY19udW0sIG5fbnVtKTsKKwkJCQluX3B0ciA9IGNfcHRyLT5ub2Rlc1tuX251bV07CisJCQkJaWYgKCFuX3B0cikgeworCQkJCQluX3B0ciA9IG5vZGVfY3JlYXRlKGFkZHIpOworCQkJCX0KKwkJCQlpZiAobl9wdHIpCisJCQkJCW5vZGVfYWRkX3JvdXRlcihuX3B0ciwgcm91dGVyKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIFNMQVZFX1JPVVRJTkdfVEFCTEU6CisJCWFzc2VydCghaXNfc2xhdmUodGlwY19vd25fYWRkcikpOworCQlhc3NlcnQoaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpKTsKKwkJZm9yIChuX251bSA9IDE7IG5fbnVtIDwgdGFibGVfc2l6ZTsgbl9udW0rKykgeworCQkJaWYgKG5vZGVfdGFibGVbbl9udW1dKSB7CisJCQkJdTMyIHNsYXZlX251bSA9IG5fbnVtICsgTE9XRVNUX1NMQVZFOworCQkJCXUzMiBhZGRyID0gdGlwY19hZGRyKHpfbnVtLCBjX251bSwgc2xhdmVfbnVtKTsKKwkJCQluX3B0ciA9IGNfcHRyLT5ub2Rlc1tzbGF2ZV9udW1dOworCQkJCWlmICghbl9wdHIpIHsKKwkJCQkJbl9wdHIgPSBub2RlX2NyZWF0ZShhZGRyKTsKKwkJCQl9CisJCQkJaWYgKG5fcHRyKQorCQkJCQlub2RlX2FkZF9yb3V0ZXIobl9wdHIsIHJvdXRlcik7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBST1VURV9BRERJVElPTjoKKwkJaWYgKCFpc19zbGF2ZSh0aXBjX293bl9hZGRyKSkgeworCQkJYXNzZXJ0KCFpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikKKwkJCSAgICAgICB8fCBpc19zbGF2ZShyZW1fbm9kZSkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0KGluX293bl9jbHVzdGVyKGNfcHRyLT5hZGRyKQorCQkJICAgICAgICYmICFpc19zbGF2ZShyZW1fbm9kZSkpOworCQl9CisJCW5fcHRyID0gY19wdHItPm5vZGVzW3RpcGNfbm9kZShyZW1fbm9kZSldOworCQlpZiAoIW5fcHRyKQorCQkJbl9wdHIgPSBub2RlX2NyZWF0ZShyZW1fbm9kZSk7CisJCWlmIChuX3B0cikKKwkJCW5vZGVfYWRkX3JvdXRlcihuX3B0ciwgcm91dGVyKTsKKwkJYnJlYWs7CisJY2FzZSBST1VURV9SRU1PVkFMOgorCQlpZiAoIWlzX3NsYXZlKHRpcGNfb3duX2FkZHIpKSB7CisJCQlhc3NlcnQoIWluX293bl9jbHVzdGVyKGNfcHRyLT5hZGRyKQorCQkJICAgICAgIHx8IGlzX3NsYXZlKHJlbV9ub2RlKSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnQoaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpCisJCQkgICAgICAgJiYgIWlzX3NsYXZlKHJlbV9ub2RlKSk7CisJCX0KKwkJbl9wdHIgPSBjX3B0ci0+bm9kZXNbdGlwY19ub2RlKHJlbV9ub2RlKV07CisJCWlmIChuX3B0cikKKwkJCW5vZGVfcmVtb3ZlX3JvdXRlcihuX3B0ciwgcm91dGVyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXNzZXJ0KCEiSWxsZWdhbCByb3V0aW5nIG1hbmFnZXIgbWVzc2FnZSByZWNlaXZlZFxuIik7CisJfQorCWJ1Zl9kaXNjYXJkKGJ1Zik7Cit9CisKK3ZvaWQgY2x1c3Rlcl9yZW1vdmVfYXNfcm91dGVyKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIHJvdXRlcikKK3sKKwl1MzIgc3RhcnRfZW50cnk7CisJdTMyIHRzdG9wOworCXUzMiBuX251bTsKKworCWlmIChpc19zbGF2ZShyb3V0ZXIpKQorCQlyZXR1cm47CS8qIFNsYXZlIG5vZGVzIGNhbiBub3QgYmUgcm91dGVycyAqLworCisJaWYgKGluX293bl9jbHVzdGVyKGNfcHRyLT5hZGRyKSkgeworCQlzdGFydF9lbnRyeSA9IExPV0VTVF9TTEFWRTsKKwkJdHN0b3AgPSBjX3B0ci0+aGlnaGVzdF9zbGF2ZTsKKwl9IGVsc2UgeworCQlzdGFydF9lbnRyeSA9IDE7CisJCXRzdG9wID0gY19wdHItPmhpZ2hlc3Rfbm9kZTsKKwl9CisKKwlmb3IgKG5fbnVtID0gc3RhcnRfZW50cnk7IG5fbnVtIDw9IHRzdG9wOyBuX251bSsrKSB7CisJCWlmIChjX3B0ci0+bm9kZXNbbl9udW1dKSB7CisJCQlub2RlX3JlbW92ZV9yb3V0ZXIoY19wdHItPm5vZGVzW25fbnVtXSwgcm91dGVyKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBjbHVzdGVyX211bHRpY2FzdCAtIG11bHRpY2FzdCBtZXNzYWdlIHRvIGxvY2FsIG5vZGVzIAorICovCisKK3ZvaWQgY2x1c3Rlcl9tdWx0aWNhc3Qoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCAKKwkJICAgICAgIHUzMiBsb3dlciwgdTMyIHVwcGVyKQoreworCXN0cnVjdCBza19idWZmICpidWZfY29weTsKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CisJdTMyIG5fbnVtOworCXUzMiB0c3RvcDsKKworCWFzc2VydChsb3dlciA8PSB1cHBlcik7CisJYXNzZXJ0KCgobG93ZXIgPj0gMSkgJiYgKGxvd2VyIDw9IHRpcGNfbWF4X25vZGVzKSkgfHwKKwkgICAgICAgKChsb3dlciA+PSBMT1dFU1RfU0xBVkUpICYmIChsb3dlciA8PSBoaWdoZXN0X2FsbG93ZWRfc2xhdmUpKSk7CisJYXNzZXJ0KCgodXBwZXIgPj0gMSkgJiYgKHVwcGVyIDw9IHRpcGNfbWF4X25vZGVzKSkgfHwKKwkgICAgICAgKCh1cHBlciA+PSBMT1dFU1RfU0xBVkUpICYmICh1cHBlciA8PSBoaWdoZXN0X2FsbG93ZWRfc2xhdmUpKSk7CisJYXNzZXJ0KGluX293bl9jbHVzdGVyKGNfcHRyLT5hZGRyKSk7CisKKwl0c3RvcCA9IGlzX3NsYXZlKHVwcGVyKSA/IGNfcHRyLT5oaWdoZXN0X3NsYXZlIDogY19wdHItPmhpZ2hlc3Rfbm9kZTsKKwlpZiAodHN0b3AgPiB1cHBlcikKKwkJdHN0b3AgPSB1cHBlcjsKKwlmb3IgKG5fbnVtID0gbG93ZXI7IG5fbnVtIDw9IHRzdG9wOyBuX251bSsrKSB7CisJCW5fcHRyID0gY19wdHItPm5vZGVzW25fbnVtXTsKKwkJaWYgKG5fcHRyICYmIG5vZGVfaGFzX2FjdGl2ZV9saW5rcyhuX3B0cikpIHsKKwkJCWJ1Zl9jb3B5ID0gc2tiX2NvcHkoYnVmLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChidWZfY29weSA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJbXNnX3NldF9kZXN0bm9kZShidWZfbXNnKGJ1Zl9jb3B5KSwgbl9wdHItPmFkZHIpOworCQkJbGlua19zZW5kKGJ1Zl9jb3B5LCBuX3B0ci0+YWRkciwgbl9wdHItPmFkZHIpOworCQl9CisJfQorCWJ1Zl9kaXNjYXJkKGJ1Zik7Cit9CisKKy8qKgorICogY2x1c3Rlcl9icm9hZGNhc3QgLSBicm9hZGNhc3QgbWVzc2FnZSB0byBhbGwgbm9kZXMgd2l0aGluIGNsdXN0ZXIKKyAqLworCit2b2lkIGNsdXN0ZXJfYnJvYWRjYXN0KHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1Zl9jb3B5OworCXN0cnVjdCBjbHVzdGVyICpjX3B0cjsKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CisJdTMyIG5fbnVtOworCXUzMiB0c3RhcnQ7CisJdTMyIHRzdG9wOworCXUzMiBub2RlX3R5cGU7CisKKwlpZiAodGlwY19tb2RlID09IFRJUENfTkVUX01PREUpIHsKKwkJY19wdHIgPSBjbHVzdGVyX2ZpbmQodGlwY19vd25fYWRkcik7CisJCWFzc2VydChpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikpOwkvKiBGb3Igbm93ICovCisKKwkJLyogU2VuZCB0byBzdGFuZGFyZCBub2RlcywgdGhlbiByZXBlYXQgbG9vcCBzZW5kaW5nIHRvIHNsYXZlcyAqLworCQl0c3RhcnQgPSAxOworCQl0c3RvcCA9IGNfcHRyLT5oaWdoZXN0X25vZGU7CisJCWZvciAobm9kZV90eXBlID0gMTsgbm9kZV90eXBlIDw9IDI7IG5vZGVfdHlwZSsrKSB7CisJCQlmb3IgKG5fbnVtID0gdHN0YXJ0OyBuX251bSA8PSB0c3RvcDsgbl9udW0rKykgeworCQkJCW5fcHRyID0gY19wdHItPm5vZGVzW25fbnVtXTsKKwkJCQlpZiAobl9wdHIgJiYgbm9kZV9oYXNfYWN0aXZlX2xpbmtzKG5fcHRyKSkgeworCQkJCQlidWZfY29weSA9IHNrYl9jb3B5KGJ1ZiwgR0ZQX0FUT01JQyk7CisJCQkJCWlmIChidWZfY29weSA9PSBOVUxMKQorCQkJCQkJZ290byBleGl0OworCQkJCQltc2dfc2V0X2Rlc3Rub2RlKGJ1Zl9tc2coYnVmX2NvcHkpLCAKKwkJCQkJCQkgbl9wdHItPmFkZHIpOworCQkJCQlsaW5rX3NlbmQoYnVmX2NvcHksIG5fcHRyLT5hZGRyLCAKKwkJCQkJCSAgbl9wdHItPmFkZHIpOworCQkJCX0KKwkJCX0KKwkJCXRzdGFydCA9IExPV0VTVF9TTEFWRTsKKwkJCXRzdG9wID0gY19wdHItPmhpZ2hlc3Rfc2xhdmU7CisJCX0KKwl9CitleGl0OgorCWJ1Zl9kaXNjYXJkKGJ1Zik7Cit9CisKK2ludCBjbHVzdGVyX2luaXQodm9pZCkKK3sKKwloaWdoZXN0X2FsbG93ZWRfc2xhdmUgPSBMT1dFU1RfU0xBVkUgKyB0aXBjX21heF9zbGF2ZXM7CisJcmV0dXJuIGNsdXN0ZXJfY3JlYXRlKHRpcGNfb3duX2FkZHIpID8gVElQQ19PSyA6IC1FTk9NRU07Cit9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL2NsdXN0ZXIuaCBiL25ldC90aXBjL2NsdXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmZiMDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvY2x1c3Rlci5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBuZXQvdGlwYy9jbHVzdGVyLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBjbHVzdGVyIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19DTFVTVEVSX0gKKyNkZWZpbmUgX1RJUENfQ0xVU1RFUl9ICisKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAiem9uZS5oIgorCisjZGVmaW5lIExPV0VTVF9TTEFWRSAgMjA0OHUKKworLyoqCisgKiBzdHJ1Y3QgY2x1c3RlciAtIFRJUEMgY2x1c3RlciBzdHJ1Y3R1cmUKKyAqIEBhZGRyOiBuZXR3b3JrIGFkZHJlc3Mgb2YgY2x1c3RlcgorICogQG93bmVyOiBwb2ludGVyIHRvIHpvbmUgdGhhdCBjbHVzdGVyIGJlbG9uZ3MgdG8KKyAqIEBub2RlczogYXJyYXkgb2YgcG9pbnRlcnMgdG8gYWxsIG5vZGVzIHdpdGhpbiBjbHVzdGVyCisgKiBAaGlnaGVzdF9ub2RlOiBpZCBvZiBoaWdoZXN0IG51bWJlcmVkIG5vZGUgd2l0aGluIGNsdXN0ZXIKKyAqIEBoaWdoZXN0X3NsYXZlOiAodXNlZCBmb3Igc2Vjb25kYXJ5IG5vZGUgc3VwcG9ydCkKKyAqLworIAorc3RydWN0IGNsdXN0ZXIgeworCXUzMiBhZGRyOworCXN0cnVjdCBfem9uZSAqb3duZXI7CisJc3RydWN0IG5vZGUgKipub2RlczsKKwl1MzIgaGlnaGVzdF9ub2RlOworCXUzMiBoaWdoZXN0X3NsYXZlOworfTsKKworCitleHRlcm4gc3RydWN0IG5vZGUgKipsb2NhbF9ub2RlczsKK2V4dGVybiB1MzIgaGlnaGVzdF9hbGxvd2VkX3NsYXZlOworZXh0ZXJuIHN0cnVjdCBub2RlX21hcCBjbHVzdGVyX2JjYXN0X25vZGVzOworCit2b2lkIGNsdXN0ZXJfcmVtb3ZlX2FzX3JvdXRlcihzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiByb3V0ZXIpOwordm9pZCBjbHVzdGVyX3NlbmRfZXh0X3JvdXRlcyhzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBkZXN0KTsKK3N0cnVjdCBub2RlICpjbHVzdGVyX3NlbGVjdF9ub2RlKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIHNlbGVjdG9yKTsKK3UzMiBjbHVzdGVyX3NlbGVjdF9yb3V0ZXIoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgcmVmKTsKK3ZvaWQgY2x1c3Rlcl9yZWN2X3JvdXRpbmdfdGFibGUoc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CitzdHJ1Y3QgY2x1c3RlciAqY2x1c3Rlcl9jcmVhdGUodTMyIGFkZHIpOwordm9pZCBjbHVzdGVyX2RlbGV0ZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIpOwordm9pZCBjbHVzdGVyX2F0dGFjaF9ub2RlKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgc3RydWN0IG5vZGUgKm5fcHRyKTsKK3ZvaWQgY2x1c3Rlcl9zZW5kX3NsYXZlX3JvdXRlcyhzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBkZXN0KTsKK3ZvaWQgY2x1c3Rlcl9icm9hZGNhc3Qoc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CitpbnQgY2x1c3Rlcl9pbml0KHZvaWQpOwordTMyIGNsdXN0ZXJfbmV4dF9ub2RlKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIGFkZHIpOwordm9pZCBjbHVzdGVyX2JjYXN0X25ld19yb3V0ZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBkZXN0LCB1MzIgbG8sIHUzMiBoaSk7Cit2b2lkIGNsdXN0ZXJfc2VuZF9sb2NhbF9yb3V0ZXMoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgZGVzdCk7Cit2b2lkIGNsdXN0ZXJfYmNhc3RfbG9zdF9yb3V0ZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBkZXN0LCB1MzIgbG8sIHUzMiBoaSk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNsdXN0ZXIgKmNsdXN0ZXJfZmluZCh1MzIgYWRkcikKK3sKKwlzdHJ1Y3QgX3pvbmUgKnpfcHRyID0gem9uZV9maW5kKGFkZHIpOworCisJaWYgKHpfcHRyKQorCQlyZXR1cm4gel9wdHItPmNsdXN0ZXJzWzFdOworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvbmZpZy5jIGIvbmV0L3RpcGMvY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkZWY0ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2NvbmZpZy5jCkBAIC0wLDAgKzEsNzE4IEBACisvKgorICogbmV0L3RpcGMvY29uZmlnLmM6IFRJUEMgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiem9uZS5oIgorI2luY2x1ZGUgImFkZHIuaCIKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisjaW5jbHVkZSAibm9kZS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImRpc2NvdmVyLmgiCisKK3N0cnVjdCBzdWJzY3JfZGF0YSB7CisJY2hhciB1c3JfaGFuZGxlWzhdOworCXUzMiBkb21haW47CisJdTMyIHBvcnRfcmVmOworCXN0cnVjdCBsaXN0X2hlYWQgc3ViZF9saXN0OworfTsKKworc3RydWN0IG1hbmFnZXIgeworCXUzMiB1c2VyX3JlZjsKKwl1MzIgcG9ydF9yZWY7CisJdTMyIHN1YnNjcl9yZWY7CisJdTMyIGxpbmtfc3Vic2NyaXB0aW9uczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbmtfc3Vic2NyaWJlcnM7Cit9OworCitzdGF0aWMgc3RydWN0IG1hbmFnZXIgbW5nID0geyAwfTsKKworc3RhdGljIHNwaW5sb2NrX3QgY29uZmlnX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKK3N0YXRpYyBjb25zdCB2b2lkICpyZXFfdGx2X2FyZWE7CS8qIHJlcXVlc3QgbWVzc2FnZSBUTFYgYXJlYSAqLworc3RhdGljIGludCByZXFfdGx2X3NwYWNlOwkJLyogcmVxdWVzdCBtZXNzYWdlIFRMViBhcmVhIHNpemUgKi8KK3N0YXRpYyBpbnQgcmVwX2hlYWRyb29tOwkJLyogcmVwbHkgbWVzc2FnZSBoZWFkcm9vbSB0byB1c2UgKi8KKworCit2b2lkIGNmZ19saW5rX2V2ZW50KHUzMiBhZGRyLCBjaGFyICpuYW1lLCBpbnQgdXApCit7CisJLyogVElQQyBET0VTTidUIEhBTkRMRSBMSU5LIEVWRU5UIFNVQlNDUklQVElPTlMgQVQgVEhFIE1PTUVOVCAqLworfQorCisKK3N0cnVjdCBza19idWZmICpjZmdfcmVwbHlfYWxsb2MoaW50IHBheWxvYWRfc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCisJYnVmID0gYWxsb2Nfc2tiKHJlcF9oZWFkcm9vbSArIHBheWxvYWRfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKGJ1ZikKKwkJc2tiX3Jlc2VydmUoYnVmLCByZXBfaGVhZHJvb20pOworCXJldHVybiBidWY7Cit9CisKK2ludCBjZmdfYXBwZW5kX3RsdihzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCBpbnQgdGx2X3R5cGUsIAorCQkgICB2b2lkICp0bHZfZGF0YSwgaW50IHRsdl9kYXRhX3NpemUpCit7CisJc3RydWN0IHRsdl9kZXNjICp0bHYgPSAoc3RydWN0IHRsdl9kZXNjICopYnVmLT50YWlsOworCWludCBuZXdfdGx2X3NwYWNlID0gVExWX1NQQUNFKHRsdl9kYXRhX3NpemUpOworCisJaWYgKHNrYl90YWlscm9vbShidWYpIDwgbmV3X3Rsdl9zcGFjZSkgeworCQlkYmcoImNmZ19hcHBlbmRfdGx2IHVuYWJsZSB0byBhcHBlbmQgVExWXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXNrYl9wdXQoYnVmLCBuZXdfdGx2X3NwYWNlKTsKKwl0bHYtPnRsdl90eXBlID0gaHRvbnModGx2X3R5cGUpOworCXRsdi0+dGx2X2xlbiAgPSBodG9ucyhUTFZfTEVOR1RIKHRsdl9kYXRhX3NpemUpKTsKKwlpZiAodGx2X2RhdGFfc2l6ZSAmJiB0bHZfZGF0YSkKKwkJbWVtY3B5KFRMVl9EQVRBKHRsdiksIHRsdl9kYXRhLCB0bHZfZGF0YV9zaXplKTsKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IHNrX2J1ZmYgKmNmZ19yZXBseV91bnNpZ25lZF90eXBlKHUxNiB0bHZfdHlwZSwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJdTMyIHZhbHVlX25ldDsKKworCWJ1ZiA9IGNmZ19yZXBseV9hbGxvYyhUTFZfU1BBQ0Uoc2l6ZW9mKHZhbHVlKSkpOworCWlmIChidWYpIHsKKwkJdmFsdWVfbmV0ID0gaHRvbmwodmFsdWUpOworCQljZmdfYXBwZW5kX3RsdihidWYsIHRsdl90eXBlLCAmdmFsdWVfbmV0LCAKKwkJCSAgICAgICBzaXplb2YodmFsdWVfbmV0KSk7CisJfQorCXJldHVybiBidWY7Cit9CisKK3N0cnVjdCBza19idWZmICpjZmdfcmVwbHlfc3RyaW5nX3R5cGUodTE2IHRsdl90eXBlLCBjaGFyICpzdHJpbmcpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlpbnQgc3RyaW5nX2xlbiA9IHN0cmxlbihzdHJpbmcpICsgMTsKKworCWJ1ZiA9IGNmZ19yZXBseV9hbGxvYyhUTFZfU1BBQ0Uoc3RyaW5nX2xlbikpOworCWlmIChidWYpCisJCWNmZ19hcHBlbmRfdGx2KGJ1ZiwgdGx2X3R5cGUsIHN0cmluZywgc3RyaW5nX2xlbik7CisJcmV0dXJuIGJ1ZjsKK30KKworCisKKworI2lmIDAKKworLyogTm93IG9ic29sZXRlIGNvZGUgZm9yIGhhbmRsaW5nIGNvbW1hbmRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgdGhlIG5ldyB3YXkgKi8KKworaW50IHRpcGNfY2ZnX2NtZChjb25zdCBzdHJ1Y3QgdGlwY19jbWRfbXNnICogbXNnLAorCQkgY2hhciAqZGF0YSwKKwkJIHUzMiBzeiwKKwkJIHUzMiAqcmV0X3NpemUsCisJCSBzdHJ1Y3QgdGlwY19wb3J0aWQgKm9yaWcpCit7CisJaW50IHJ2ID0gLUVJTlZBTDsKKwl1MzIgY21kID0gbXNnLT5jbWQ7CisKKwkqcmV0X3NpemUgPSAwOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSVBDX1JFTU9WRV9MSU5LOgorCWNhc2UgVElQQ19DTURfQkxPQ0tfTElOSzoKKwljYXNlIFRJUENfQ01EX1VOQkxPQ0tfTElOSzoKKwkJaWYgKCFjZmdfY2hlY2tfY29ubmVjdGlvbihvcmlnKSkKKwkJCXJ2ID0gbGlua19jb250cm9sKG1zZy0+YXJndi5saW5rX25hbWUsIG1zZy0+Y21kLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0VTVEFCTElTSDoKKwkJeworCQkJaW50IGNvbm5lY3RlZDsKKworCQkJdGlwY19pc2Nvbm5lY3RlZChtbmcuY29ubl9wb3J0X3JlZiwgJmNvbm5lY3RlZCk7CisJCQlpZiAoY29ubmVjdGVkIHx8ICFvcmlnKSB7CisJCQkJcnYgPSBUSVBDX0ZBSUxVUkU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlydiA9IHRpcGNfY29ubmVjdDJwb3J0KG1uZy5jb25uX3BvcnRfcmVmLCBvcmlnKTsKKwkJCWlmIChydiA9PSBUSVBDX09LKQorCQkJCW9yaWcgPSAwOworCQkJYnJlYWs7CisJCX0KKwljYXNlIFRJUENfR0VUX1BFRVJfQUREUkVTUzoKKwkJKnJldF9zaXplID0gbGlua19wZWVyX2FkZHIobXNnLT5hcmd2LmxpbmtfbmFtZSwgZGF0YSwgc3opOworCQlicmVhazsKKwljYXNlIFRJUENfR0VUX1JPVVRFUzoKKwkJcnYgPSBUSVBDX09LOworCQlicmVhazsKKwlkZWZhdWx0OiB7fQorCX0KKwlpZiAoKnJldF9zaXplKQorCQlydiA9IFRJUENfT0s7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBjZmdfY21kX2V2ZW50KHN0cnVjdCB0aXBjX2NtZF9tc2cgKm1zZywKKwkJCSAgY2hhciAqZGF0YSwKKwkJCSAgdTMyIHN6LCAgICAgICAgCisJCQkgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZykKK3sKKwlpbnQgcnYgPSAtRUlOVkFMOworCXN0cnVjdCB0aXBjX2NtZF9yZXN1bHRfbXNnIHJtc2c7CisJc3RydWN0IGlvdmVjIG1zZ19zZWN0WzJdOworCWludCAqYXJnOworCisJbXNnLT5jbWQgPSBudG9obChtc2ctPmNtZCk7CisKKwljZmdfcHJlcGFyZV9yZXNfbXNnKG1zZy0+Y21kLCBtc2ctPnVzcl9oYW5kbGUsIHJ2LCAmcm1zZywgbXNnX3NlY3QsIAorCQkJICAgIGRhdGEsIDApOworCWlmIChudG9obChtc2ctPm1hZ2ljKSAhPSBUSVBDX01BR0lDKQorCQlnb3RvIGV4aXQ7CisKKwlzd2l0Y2ggKG1zZy0+Y21kKSB7CisJY2FzZSBUSVBDX0NSRUFURV9MSU5LOgorCQlpZiAoIWNmZ19jaGVja19jb25uZWN0aW9uKG9yaWcpKQorCQkJcnYgPSBkaXNjX2NyZWF0ZV9saW5rKCZtc2ctPmFyZ3YuY3JlYXRlX2xpbmspOworCQlicmVhazsKKwljYXNlIFRJUENfTElOS19TVUJTQ1JJQkU6CisJCXsKKwkJCXN0cnVjdCBzdWJzY3JfZGF0YSAqc3ViOworCisJCQlpZiAobW5nLmxpbmtfc3Vic2NyaXB0aW9ucyA+IDY0KQorCQkJCWJyZWFrOworCQkJc3ViID0gKHN0cnVjdCBzdWJzY3JfZGF0YSAqKWttYWxsb2Moc2l6ZW9mKCpzdWIpLAorCQkJCQkJCSAgICBHRlBfQVRPTUlDKTsKKwkJCWlmIChzdWIgPT0gTlVMTCkgeworCQkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBkcm9wcGVkIHJlbW90ZSBsaW5rIHN1YnNjcmlwdGlvblxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlJTklUX0xJU1RfSEVBRCgmc3ViLT5zdWJkX2xpc3QpOworCQkJdGlwY19jcmVhdGVwb3J0KG1uZy51c2VyX3JlZiwKKwkJCQkJKHZvaWQgKilzdWIsCisJCQkJCVRJUENfSElHSF9JTVBPUlRBTkNFLAorCQkJCQkwLAorCQkJCQkwLAorCQkJCQkodGlwY19jb25uX3NodXRkb3duX2V2ZW50KWNmZ19saW5rc3Vic2NyX2NhbmNlbCwKKwkJCQkJMCwKKwkJCQkJMCwKKwkJCQkJKHRpcGNfY29ubl9tc2dfZXZlbnQpY2ZnX2xpbmtzdWJzY3JfY2FuY2VsLAorCQkJCQkwLAorCQkJCQkmc3ViLT5wb3J0X3JlZik7CisJCQlpZiAoIXN1Yi0+cG9ydF9yZWYpIHsKKwkJCQlrZnJlZShzdWIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtY3B5KHN1Yi0+dXNyX2hhbmRsZSxtc2ctPnVzcl9oYW5kbGUsCisJCQkgICAgICAgc2l6ZW9mKHN1Yi0+dXNyX2hhbmRsZSkpOworCQkJc3ViLT5kb21haW4gPSBtc2ctPmFyZ3YuZG9tYWluOworCQkJbGlzdF9hZGRfdGFpbCgmc3ViLT5zdWJkX2xpc3QsICZtbmcubGlua19zdWJzY3JpYmVycyk7CisJCQl0aXBjX2Nvbm5lY3QycG9ydChzdWItPnBvcnRfcmVmLCBvcmlnKTsKKwkJCXJtc2cucmV0dmFsID0gVElQQ19PSzsKKwkJCXRpcGNfc2VuZChzdWItPnBvcnRfcmVmLCAydSwgbXNnX3NlY3QpOworCQkJbW5nLmxpbmtfc3Vic2NyaXB0aW9ucysrOworCQkJcmV0dXJuOworCQl9CisJZGVmYXVsdDoKKwkJcnYgPSB0aXBjX2NmZ19jbWQobXNnLCBkYXRhLCBzeiwgKHUzMiAqKSZtc2dfc2VjdFsxXS5pb3ZfbGVuLCBvcmlnKTsKKwl9CisJZXhpdDoKKwlybXNnLnJlc3VsdF9sZW4gPSBodG9ubChtc2dfc2VjdFsxXS5pb3ZfbGVuKTsKKwlybXNnLnJldHZhbCA9IGh0b25sKHJ2KTsKKwljZmdfcmVzcG9uZChtc2dfc2VjdCwgMnUsIG9yaWcpOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX2VuYWJsZV9iZWFyZXIodm9pZCkKK3sKKwlzdHJ1Y3QgdGlwY19iZWFyZXJfY29uZmlnICphcmdzOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9CRUFSRVJfQ09ORklHKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCWFyZ3MgPSAoc3RydWN0IHRpcGNfYmVhcmVyX2NvbmZpZyAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJaWYgKHRpcGNfZW5hYmxlX2JlYXJlcihhcmdzLT5uYW1lLAorCQkJICAgICAgIG50b2hsKGFyZ3MtPmRldGVjdF9zY29wZSksCisJCQkgICAgICAgbnRvaGwoYXJncy0+cHJpb3JpdHkpKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoInVuYWJsZSB0byBlbmFibGUgYmVhcmVyIik7CisKKwlyZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfZGlzYWJsZV9iZWFyZXIodm9pZCkKK3sKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX0JFQVJFUl9OQU1FKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCWlmICh0aXBjX2Rpc2FibGVfYmVhcmVyKChjaGFyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKSkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKCJ1bmFibGUgdG8gZGlzYWJsZSBiZWFyZXIiKTsKKworCXJldHVybiBjZmdfcmVwbHlfbm9uZSgpOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNmZ19zZXRfb3duX2FkZHIodm9pZCkKK3sKKwl1MzIgYWRkcjsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfTkVUX0FERFIpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJYWRkciA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwlhZGRyID0gbnRvaGwoYWRkcik7CisJaWYgKGFkZHIgPT0gdGlwY19vd25fYWRkcikKKwkJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7CisJaWYgKCFhZGRyX25vZGVfdmFsaWQoYWRkcikpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKKwkJCQkJICAgICAgIiAobm9kZSBhZGRyZXNzKSIpOworCWlmICh0aXBjX293bl9hZGRyKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVECisJCQkJCSAgICAgICIgKGNhbm5vdCBjaGFuZ2Ugbm9kZSBhZGRyZXNzIG9uY2UgYXNzaWduZWQpIik7CisKKwlzcGluX3VubG9ja19iaCgmY29uZmlnX2xvY2spOworCXN0b3BfbmV0KCk7CisJdGlwY19vd25fYWRkciA9IGFkZHI7CisJc3RhcnRfbmV0KCk7CisJc3Bpbl9sb2NrX2JoKCZjb25maWdfbG9jayk7CisJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9yZW1vdGVfbW5nKHZvaWQpCit7CisJdTMyIHZhbHVlOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwl0aXBjX3JlbW90ZV9tYW5hZ2VtZW50ID0gKHZhbHVlICE9IDApOworCXJldHVybiBjZmdfcmVwbHlfbm9uZSgpOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNmZ19zZXRfbWF4X3B1YmxpY2F0aW9ucyh2b2lkKQoreworCXUzMiB2YWx1ZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDEsIDY1NTM1KSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQorCQkJCQkgICAgICAiIChtYXggcHVibGljYXRpb25zIG11c3QgYmUgMS02NTUzNSkiKTsKKwl0aXBjX21heF9wdWJsaWNhdGlvbnMgPSB2YWx1ZTsKKwlyZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfc2V0X21heF9zdWJzY3JpcHRpb25zKHZvaWQpCit7CisJdTMyIHZhbHVlOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMSwgNjU1MzUpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCisJCQkJCSAgICAgICIgKG1heCBzdWJzY3JpcHRpb25zIG11c3QgYmUgMS02NTUzNSIpOworCXRpcGNfbWF4X3N1YnNjcmlwdGlvbnMgPSB2YWx1ZTsKKwlyZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfc2V0X21heF9wb3J0cyh2b2lkKQoreworCWludCBvcmlnX21vZGU7CisJdTMyIHZhbHVlOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDEyNywgNjU1MzUpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCisJCQkJCSAgICAgICIgKG1heCBwb3J0cyBtdXN0IGJlIDEyNy02NTUzNSkiKTsKKworCWlmICh2YWx1ZSA9PSB0aXBjX21heF9wb3J0cykKKwkJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnRpcGNfdXNlcl9jb3VudCkgPiAyKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVECisJCQkJCSAgICAgICIgKGNhbm5vdCBjaGFuZ2UgbWF4IHBvcnRzIHdoaWxlIFRJUEMgdXNlcnMgZXhpc3QpIik7CisKKwlzcGluX3VubG9ja19iaCgmY29uZmlnX2xvY2spOworCW9yaWdfbW9kZSA9IHRpcGNfZ2V0X21vZGUoKTsKKwlpZiAob3JpZ19tb2RlID09IFRJUENfTkVUX01PREUpCisJCXN0b3BfbmV0KCk7CisJc3RvcF9jb3JlKCk7CisJdGlwY19tYXhfcG9ydHMgPSB2YWx1ZTsKKwlzdGFydF9jb3JlKCk7CisJaWYgKG9yaWdfbW9kZSA9PSBUSVBDX05FVF9NT0RFKQorCQlzdGFydF9uZXQoKTsKKwlzcGluX2xvY2tfYmgoJmNvbmZpZ19sb2NrKTsKKwlyZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpzZXRfbmV0X21heChpbnQgdmFsdWUsIGludCAqcGFyYW1ldGVyKQoreworCWludCBvcmlnX21vZGU7CisKKwlpZiAodmFsdWUgIT0gKnBhcmFtZXRlcikgeworCQlvcmlnX21vZGUgPSB0aXBjX2dldF9tb2RlKCk7CisJCWlmIChvcmlnX21vZGUgPT0gVElQQ19ORVRfTU9ERSkKKwkJCXN0b3BfbmV0KCk7CisJCSpwYXJhbWV0ZXIgPSB2YWx1ZTsKKwkJaWYgKG9yaWdfbW9kZSA9PSBUSVBDX05FVF9NT0RFKQorCQkJc3RhcnRfbmV0KCk7CisJfQorCisJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9tYXhfem9uZXModm9pZCkKK3sKKwl1MzIgdmFsdWU7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKwl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMSwgMjU1KSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQorCQkJCQkgICAgICAiIChtYXggem9uZXMgbXVzdCBiZSAxLTI1NSkiKTsKKwlyZXR1cm4gc2V0X25ldF9tYXgodmFsdWUsICZ0aXBjX21heF96b25lcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9tYXhfY2x1c3RlcnModm9pZCkKK3sKKwl1MzIgdmFsdWU7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKwl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwlpZiAodmFsdWUgIT0gMSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX1NVUFBPUlRFRAorCQkJCQkgICAgICAiIChtYXggY2x1c3RlcnMgZml4ZWQgYXQgMSkiKTsKKwlyZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfc2V0X21heF9ub2Rlcyh2b2lkKQoreworCXUzMiB2YWx1ZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOworCXZhbHVlID0gbnRvaGwodmFsdWUpOworCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCA4LCAyMDQ3KSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQorCQkJCQkgICAgICAiIChtYXggbm9kZXMgbXVzdCBiZSA4LTIwNDcpIik7CisJcmV0dXJuIHNldF9uZXRfbWF4KHZhbHVlLCAmdGlwY19tYXhfbm9kZXMpOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNmZ19zZXRfbWF4X3NsYXZlcyh2b2lkKQoreworCXUzMiB2YWx1ZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOworCXZhbHVlID0gbnRvaGwodmFsdWUpOworCWlmICh2YWx1ZSAhPSAwKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVECisJCQkJCSAgICAgICIgKG1heCBzZWNvbmRhcnkgbm9kZXMgZml4ZWQgYXQgMCkiKTsKKwlyZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfc2V0X25ldGlkKHZvaWQpCit7CisJdTMyIHZhbHVlOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDEsIDk5OTkpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCisJCQkJCSAgICAgICIgKG5ldHdvcmsgaWQgbXVzdCBiZSAxLTk5OTkpIik7CisKKwlpZiAodGlwY19vd25fYWRkcikKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX1NVUFBPUlRFRAorCQkJCQkgICAgICAiIChjYW5ub3QgY2hhbmdlIG5ldHdvcmsgaWQgb25jZSBwYXJ0IG9mIG5ldHdvcmspIik7CisJCisJcmV0dXJuIHNldF9uZXRfbWF4KHZhbHVlLCAmdGlwY19uZXRfaWQpOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX2RvX2NtZCh1MzIgb3JpZ19ub2RlLCB1MTYgY21kLCBjb25zdCB2b2lkICpyZXF1ZXN0X2FyZWEsCisJCQkgICBpbnQgcmVxdWVzdF9zcGFjZSwgaW50IHJlcGx5X2hlYWRyb29tKQoreworCXN0cnVjdCBza19idWZmICpyZXBfdGx2X2J1ZjsKKworCXNwaW5fbG9ja19iaCgmY29uZmlnX2xvY2spOworCisJLyogU2F2ZSByZXF1ZXN0IGFuZCByZXBseSBkZXRhaWxzIGluIGEgd2VsbC1rbm93biBsb2NhdGlvbiAqLworCisJcmVxX3Rsdl9hcmVhID0gcmVxdWVzdF9hcmVhOworCXJlcV90bHZfc3BhY2UgPSByZXF1ZXN0X3NwYWNlOworCXJlcF9oZWFkcm9vbSA9IHJlcGx5X2hlYWRyb29tOworCisJLyogQ2hlY2sgY29tbWFuZCBhdXRob3JpemF0aW9uICovCisKKwlpZiAobGlrZWx5KG9yaWdfbm9kZSA9PSB0aXBjX293bl9hZGRyKSkgeworCQkvKiBjb21tYW5kIGlzIHBlcm1pdHRlZCAqLworCX0gZWxzZSBpZiAoY21kID49IDB4ODAwMCkgeworCQlyZXBfdGx2X2J1ZiA9IGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX1NVUFBPUlRFRAorCQkJCQkJICAgICAiIChjYW5ub3QgYmUgZG9uZSByZW1vdGVseSkiKTsKKwkJZ290byBleGl0OworCX0gZWxzZSBpZiAoIXRpcGNfcmVtb3RlX21hbmFnZW1lbnQpIHsKKwkJcmVwX3Rsdl9idWYgPSBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PX1JFTU9URSk7CisJCWdvdG8gZXhpdDsKKwl9CisJZWxzZSBpZiAoY21kID49IDB4NDAwMCkgeworCQl1MzIgZG9tYWluID0gMDsKKworCQlpZiAoKG5hbWV0YmxfdHJhbnNsYXRlKFRJUENfWk1fU1JWLCAwLCAmZG9tYWluKSA9PSAwKSB8fAorCQkgICAgKGRvbWFpbiAhPSBvcmlnX25vZGUpKSB7CisJCQlyZXBfdGx2X2J1ZiA9IGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX1pPTkVfTVNUUik7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwkvKiBDYWxsIGFwcHJvcHJpYXRlIHByb2Nlc3Npbmcgcm91dGluZSAqLworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJUENfQ01EX05PT1A6CisJCXJlcF90bHZfYnVmID0gY2ZnX3JlcGx5X25vbmUoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTk9ERVM6CisJCXJlcF90bHZfYnVmID0gbm9kZV9nZXRfbm9kZXMocmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTElOS1M6CisJCXJlcF90bHZfYnVmID0gbm9kZV9nZXRfbGlua3MocmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TSE9XX0xJTktfU1RBVFM6CisJCXJlcF90bHZfYnVmID0gbGlua19jbWRfc2hvd19zdGF0cyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1JFU0VUX0xJTktfU1RBVFM6CisJCXJlcF90bHZfYnVmID0gbGlua19jbWRfcmVzZXRfc3RhdHMocmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TSE9XX05BTUVfVEFCTEU6CisJCXJlcF90bHZfYnVmID0gbmFtZXRibF9nZXQocmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfQkVBUkVSX05BTUVTOgorCQlyZXBfdGx2X2J1ZiA9IGJlYXJlcl9nZXRfbmFtZXMoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUVESUFfTkFNRVM6CisJCXJlcF90bHZfYnVmID0gbWVkaWFfZ2V0X25hbWVzKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0hPV19QT1JUUzoKKwkJcmVwX3Rsdl9idWYgPSBwb3J0X2dldF9wb3J0cygpOworCQlicmVhazsKKyNpZiAwCisJY2FzZSBUSVBDX0NNRF9TSE9XX1BPUlRfU1RBVFM6CisJCXJlcF90bHZfYnVmID0gcG9ydF9zaG93X3N0YXRzKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfUkVTRVRfUE9SVF9TVEFUUzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9TVVBQT1JURUQpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgVElQQ19DTURfU0VUX0xPR19TSVpFOgorCQlyZXBfdGx2X2J1ZiA9IGxvZ19yZXNpemUocmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9EVU1QX0xPRzoKKwkJcmVwX3Rsdl9idWYgPSBsb2dfZHVtcCgpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1NFVF9MSU5LX1RPTDoKKwljYXNlIFRJUENfQ01EX1NFVF9MSU5LX1BSSToKKwljYXNlIFRJUENfQ01EX1NFVF9MSU5LX1dJTkRPVzoKKwkJcmVwX3Rsdl9idWYgPSBsaW5rX2NtZF9jb25maWcocmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBjbWQpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX0VOQUJMRV9CRUFSRVI6CisJCXJlcF90bHZfYnVmID0gY2ZnX2VuYWJsZV9iZWFyZXIoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9ESVNBQkxFX0JFQVJFUjoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfZGlzYWJsZV9iZWFyZXIoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTk9ERV9BRERSOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19zZXRfb3duX2FkZHIoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfUkVNT1RFX01ORzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X3JlbW90ZV9tbmcoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTUFYX1BPUlRTOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19zZXRfbWF4X3BvcnRzKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX01BWF9QVUJMOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19zZXRfbWF4X3B1YmxpY2F0aW9ucygpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1NFVF9NQVhfU1VCU0NSOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19zZXRfbWF4X3N1YnNjcmlwdGlvbnMoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTUFYX1pPTkVTOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19zZXRfbWF4X3pvbmVzKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX01BWF9DTFVTVEVSUzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X21heF9jbHVzdGVycygpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1NFVF9NQVhfTk9ERVM6CisJCXJlcF90bHZfYnVmID0gY2ZnX3NldF9tYXhfbm9kZXMoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTUFYX1NMQVZFUzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X21heF9zbGF2ZXMoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTkVUSUQ6CisJCXJlcF90bHZfYnVmID0gY2ZnX3NldF9uZXRpZCgpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX0dFVF9SRU1PVEVfTU5HOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19yZXBseV91bnNpZ25lZCh0aXBjX3JlbW90ZV9tYW5hZ2VtZW50KTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUFYX1BPUlRTOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19yZXBseV91bnNpZ25lZCh0aXBjX21heF9wb3J0cyk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfR0VUX01BWF9QVUJMOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19yZXBseV91bnNpZ25lZCh0aXBjX21heF9wdWJsaWNhdGlvbnMpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX0dFVF9NQVhfU1VCU0NSOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19yZXBseV91bnNpZ25lZCh0aXBjX21heF9zdWJzY3JpcHRpb25zKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUFYX1pPTkVTOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19yZXBseV91bnNpZ25lZCh0aXBjX21heF96b25lcyk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfR0VUX01BWF9DTFVTVEVSUzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfcmVwbHlfdW5zaWduZWQodGlwY19tYXhfY2x1c3RlcnMpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX0dFVF9NQVhfTk9ERVM6CisJCXJlcF90bHZfYnVmID0gY2ZnX3JlcGx5X3Vuc2lnbmVkKHRpcGNfbWF4X25vZGVzKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUFYX1NMQVZFUzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfcmVwbHlfdW5zaWduZWQodGlwY19tYXhfc2xhdmVzKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTkVUSUQ6CisJCXJlcF90bHZfYnVmID0gY2ZnX3JlcGx5X3Vuc2lnbmVkKHRpcGNfbmV0X2lkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVwX3Rsdl9idWYgPSBOVUxMOworCQlicmVhazsKKwl9CisKKwkvKiBSZXR1cm4gcmVwbHkgYnVmZmVyICovCitleGl0OgorCXNwaW5fdW5sb2NrX2JoKCZjb25maWdfbG9jayk7CisJcmV0dXJuIHJlcF90bHZfYnVmOworfQorCitzdGF0aWMgdm9pZCBjZmdfbmFtZWRfbXNnX2V2ZW50KHZvaWQgKnVzZXJkYXRhLAorCQkJCXUzMiBwb3J0X3JlZiwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqKmJ1ZiwKKwkJCQljb25zdCB1bmNoYXIgKm1zZywKKwkJCQl1MzIgc2l6ZSwKKwkJCQl1MzIgaW1wb3J0YW5jZSwgCisJCQkJc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnLAorCQkJCXN0cnVjdCB0aXBjX25hbWVfc2VxIGNvbnN0ICpkZXN0KQoreworCXN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyICpyZXFfaGRyOworCXN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyICpyZXBfaGRyOworCXN0cnVjdCBza19idWZmICpyZXBfYnVmOworCisJLyogVmFsaWRhdGUgY29uZmlndXJhdGlvbiBtZXNzYWdlIGhlYWRlciAoaWdub3JlIGludmFsaWQgbWVzc2FnZSkgKi8KKworCXJlcV9oZHIgPSAoc3RydWN0IHRpcGNfY2ZnX21zZ19oZHIgKiltc2c7CisJaWYgKChzaXplIDwgc2l6ZW9mKCpyZXFfaGRyKSkgfHwKKwkgICAgKHNpemUgIT0gVENNX0FMSUdOKG50b2hsKHJlcV9oZHItPnRjbV9sZW4pKSkgfHwKKwkgICAgKG50b2hzKHJlcV9oZHItPnRjbV9mbGFncykgIT0gVENNX0ZfUkVRVUVTVCkpIHsKKwkJd2FybigiZGlzY2FyZGVkIGludmFsaWQgY29uZmlndXJhdGlvbiBtZXNzYWdlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEdlbmVyYXRlIHJlcGx5IGZvciByZXF1ZXN0IChpZiBjYW4ndCwgcmV0dXJuIHJlcXVlc3QpICovCisKKwlyZXBfYnVmID0gY2ZnX2RvX2NtZChvcmlnLT5ub2RlLAorCQkJICAgICBudG9ocyhyZXFfaGRyLT50Y21fdHlwZSksIAorCQkJICAgICBtc2cgKyBzaXplb2YoKnJlcV9oZHIpLAorCQkJICAgICBzaXplIC0gc2l6ZW9mKCpyZXFfaGRyKSwKKwkJCSAgICAgQlVGX0hFQURST09NICsgTUFYX0hfU0laRSArIHNpemVvZigqcmVwX2hkcikpOworCWlmIChyZXBfYnVmKSB7CisJCXNrYl9wdXNoKHJlcF9idWYsIHNpemVvZigqcmVwX2hkcikpOworCQlyZXBfaGRyID0gKHN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyICopcmVwX2J1Zi0+ZGF0YTsKKwkJbWVtY3B5KHJlcF9oZHIsIHJlcV9oZHIsIHNpemVvZigqcmVwX2hkcikpOworCQlyZXBfaGRyLT50Y21fbGVuID0gaHRvbmwocmVwX2J1Zi0+bGVuKTsKKwkJcmVwX2hkci0+dGNtX2ZsYWdzICY9IGh0b25zKH5UQ01fRl9SRVFVRVNUKTsKKwl9IGVsc2UgeworCQlyZXBfYnVmID0gKmJ1ZjsKKwkJKmJ1ZiA9IE5VTEw7CisJfQorCisJLyogTkVFRCBUTyBBREQgQ09ERSBUTyBIQU5ETEUgRkFJTEVEIFNFTkQgKFNVQ0ggQVMgQ09OR0VTVElPTikgKi8KKwl0aXBjX3NlbmRfYnVmMnBvcnQocG9ydF9yZWYsIG9yaWcsIHJlcF9idWYsIHJlcF9idWYtPmxlbik7Cit9CisKK2ludCBjZmdfaW5pdCh2b2lkKQoreworCXN0cnVjdCB0aXBjX25hbWVfc2VxIHNlcTsKKwlpbnQgcmVzOworCisJbWVtc2V0KCZtbmcsIDAsIHNpemVvZihtbmcpKTsKKwlJTklUX0xJU1RfSEVBRCgmbW5nLmxpbmtfc3Vic2NyaWJlcnMpOworCisJcmVzID0gdGlwY19hdHRhY2goJm1uZy51c2VyX3JlZiwgMCwgMCk7CisJaWYgKHJlcykKKwkJZ290byBmYWlsZWQ7CisKKwlyZXMgPSB0aXBjX2NyZWF0ZXBvcnQobW5nLnVzZXJfcmVmLCAwLCBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UsCisJCQkgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorCQkJICAgICAgTlVMTCwgY2ZnX25hbWVkX21zZ19ldmVudCwgTlVMTCwKKwkJCSAgICAgIE5VTEwsICZtbmcucG9ydF9yZWYpOworCWlmIChyZXMpCisJCWdvdG8gZmFpbGVkOworCisJc2VxLnR5cGUgPSBUSVBDX0NGR19TUlY7CisJc2VxLmxvd2VyID0gc2VxLnVwcGVyID0gdGlwY19vd25fYWRkcjsKKwlyZXMgPSBuYW1ldGJsX3B1Ymxpc2hfcnN2KG1uZy5wb3J0X3JlZiwgVElQQ19aT05FX1NDT1BFLCAmc2VxKTsKKwlpZiAocmVzKQorCQlnb3RvIGZhaWxlZDsKKworCXJldHVybiAwOworCitmYWlsZWQ6CisJZXJyKCJVbmFibGUgdG8gY3JlYXRlIGNvbmZpZ3VyYXRpb24gc2VydmljZVxuIik7CisJdGlwY19kZXRhY2gobW5nLnVzZXJfcmVmKTsKKwltbmcudXNlcl9yZWYgPSAwOworCXJldHVybiByZXM7Cit9CisKK3ZvaWQgY2ZnX3N0b3Aodm9pZCkKK3sKKwlpZiAobW5nLnVzZXJfcmVmKSB7CisJCXRpcGNfZGV0YWNoKG1uZy51c2VyX3JlZik7CisJCW1uZy51c2VyX3JlZiA9IDA7CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvY29uZmlnLmggYi9uZXQvdGlwYy9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDYzNzdkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvY29uZmlnLmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIG5ldC90aXBjL2NvbmZpZy5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgY29uZmlndXJhdGlvbiBzZXJ2aWNlIGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19DT05GSUdfSAorI2RlZmluZSBfVElQQ19DT05GSUdfSAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC90aXBjLmg+CisjaW5jbHVkZSA8bGludXgvdGlwY19jb25maWcuaD4KKyNpbmNsdWRlICJsaW5rLmgiCisKK3N0cnVjdCBza19idWZmICpjZmdfcmVwbHlfYWxsb2MoaW50IHBheWxvYWRfc2l6ZSk7CitpbnQgY2ZnX2FwcGVuZF90bHYoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgaW50IHRsdl90eXBlLCAKKwkJICAgdm9pZCAqdGx2X2RhdGEsIGludCB0bHZfZGF0YV9zaXplKTsKK3N0cnVjdCBza19idWZmICpjZmdfcmVwbHlfdW5zaWduZWRfdHlwZSh1MTYgdGx2X3R5cGUsIHUzMiB2YWx1ZSk7CitzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3JlcGx5X3N0cmluZ190eXBlKHUxNiB0bHZfdHlwZSwgY2hhciAqc3RyaW5nKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3JlcGx5X25vbmUodm9pZCkKK3sKKwlyZXR1cm4gY2ZnX3JlcGx5X2FsbG9jKDApOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpjZmdfcmVwbHlfdW5zaWduZWQodTMyIHZhbHVlKQoreworCXJldHVybiBjZmdfcmVwbHlfdW5zaWduZWRfdHlwZShUSVBDX1RMVl9VTlNJR05FRCwgdmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKGNoYXIgKnN0cmluZykKK3sKKwlyZXR1cm4gY2ZnX3JlcGx5X3N0cmluZ190eXBlKFRJUENfVExWX0VSUk9SX1NUUklORywgc3RyaW5nKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3JlcGx5X3VsdHJhX3N0cmluZyhjaGFyICpzdHJpbmcpCit7CisJcmV0dXJuIGNmZ19yZXBseV9zdHJpbmdfdHlwZShUSVBDX1RMVl9VTFRSQV9TVFJJTkcsIHN0cmluZyk7Cit9CisKK3N0cnVjdCBza19idWZmICpjZmdfZG9fY21kKHUzMiBvcmlnX25vZGUsIHUxNiBjbWQsIAorCQkJICAgY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSwgCisJCQkgICBpbnQgaGVhZHJvb20pOworCit2b2lkIGNmZ19saW5rX2V2ZW50KHUzMiBhZGRyLCBjaGFyICpuYW1lLCBpbnQgdXApOworaW50ICBjZmdfaW5pdCh2b2lkKTsKK3ZvaWQgY2ZnX3N0b3Aodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvY29yZS5jIGIvbmV0L3RpcGMvY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4M2FjMDYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9jb3JlLmMKQEAgLTAsMCArMSwyODUgQEAKKy8qCisgKiBuZXQvdGlwYy9jb3JlLmM6IFRJUEMgbW9kdWxlIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJyZWYuaCIKKyNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJ1c2VyX3JlZy5oIgorI2luY2x1ZGUgIm5hbWVfdGFibGUuaCIKKyNpbmNsdWRlICJzdWJzY3IuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworaW50ICBldGhfbWVkaWFfc3RhcnQodm9pZCk7Cit2b2lkIGV0aF9tZWRpYV9zdG9wKHZvaWQpOworaW50ICBoYW5kbGVyX3N0YXJ0KHZvaWQpOwordm9pZCBoYW5kbGVyX3N0b3Aodm9pZCk7CitpbnQgIHNvY2tldF9pbml0KHZvaWQpOwordm9pZCBzb2NrZXRfc3RvcCh2b2lkKTsKK2ludCAgbmV0bGlua19zdGFydCh2b2lkKTsKK3ZvaWQgbmV0bGlua19zdG9wKHZvaWQpOworCisjZGVmaW5lIE1PRF9OQU1FICJ0aXBjX3N0YXJ0OiAiCisKKyNpZm5kZWYgQ09ORklHX1RJUENfWk9ORVMKKyNkZWZpbmUgQ09ORklHX1RJUENfWk9ORVMgMworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1RJUENfQ0xVU1RFUlMKKyNkZWZpbmUgQ09ORklHX1RJUENfQ0xVU1RFUlMgMQorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1RJUENfTk9ERVMKKyNkZWZpbmUgQ09ORklHX1RJUENfTk9ERVMgMjU1CisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfVElQQ19TTEFWRV9OT0RFUworI2RlZmluZSBDT05GSUdfVElQQ19TTEFWRV9OT0RFUyAwCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfVElQQ19QT1JUUworI2RlZmluZSBDT05GSUdfVElQQ19QT1JUUyA4MTkxCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfVElQQ19MT0cKKyNkZWZpbmUgQ09ORklHX1RJUENfTE9HIDAKKyNlbmRpZgorCisvKiBnbG9iYWwgdmFyaWFibGVzIHVzZWQgYnkgbXVsdGlwbGUgc3ViLXN5c3RlbXMgd2l0aGluIFRJUEMgKi8KKworaW50IHRpcGNfbW9kZSA9IFRJUENfTk9UX1JVTk5JTkc7CitpbnQgdGlwY19yYW5kb207CithdG9taWNfdCB0aXBjX3VzZXJfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKKworY29uc3QgY2hhciB0aXBjX2FscGhhYmV0W10gPSAKKwkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlfIjsKKworLyogY29uZmlndXJhYmxlIFRJUEMgcGFyYW1ldGVycyAqLworCit1MzIgdGlwY19vd25fYWRkcjsKK2ludCB0aXBjX21heF96b25lczsKK2ludCB0aXBjX21heF9jbHVzdGVyczsKK2ludCB0aXBjX21heF9ub2RlczsKK2ludCB0aXBjX21heF9zbGF2ZXM7CitpbnQgdGlwY19tYXhfcG9ydHM7CitpbnQgdGlwY19tYXhfc3Vic2NyaXB0aW9uczsKK2ludCB0aXBjX21heF9wdWJsaWNhdGlvbnM7CitpbnQgdGlwY19uZXRfaWQ7CitpbnQgdGlwY19yZW1vdGVfbWFuYWdlbWVudDsKKworCitpbnQgdGlwY19nZXRfbW9kZSh2b2lkKQoreworCXJldHVybiB0aXBjX21vZGU7Cit9CisKKy8qKgorICogc3RvcF9uZXQgLSBzaHV0IGRvd24gVElQQyBuZXR3b3JraW5nIHN1Yi1zeXN0ZW1zCisgKi8KKwordm9pZCBzdG9wX25ldCh2b2lkKQoreworCWV0aF9tZWRpYV9zdG9wKCk7CisJdGlwY19zdG9wX25ldCgpOworfQorCisvKioKKyAqIHN0YXJ0X25ldCAtIHN0YXJ0IFRJUEMgbmV0d29ya2luZyBzdWItc3lzdGVtcworICovCisKK2ludCBzdGFydF9uZXQodm9pZCkKK3sKKwlpbnQgcmVzOworCisJaWYgKChyZXMgPSB0aXBjX3N0YXJ0X25ldCgpKSB8fAorCSAgICAocmVzID0gZXRoX21lZGlhX3N0YXJ0KCkpKSB7CisJCXN0b3BfbmV0KCk7CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qKgorICogc3RvcF9jb3JlIC0gc3dpdGNoIFRJUEMgZnJvbSBTSU5HTEUgTk9ERSB0byBOT1QgUlVOTklORyBtb2RlCisgKi8KKwordm9pZCBzdG9wX2NvcmUodm9pZCkKK3sKKwlpZiAodGlwY19tb2RlICE9IFRJUENfTk9ERV9NT0RFKQorCQlyZXR1cm47CisKKwl0aXBjX21vZGUgPSBUSVBDX05PVF9SVU5OSU5HOworCisJbmV0bGlua19zdG9wKCk7CisJaGFuZGxlcl9zdG9wKCk7CisJY2ZnX3N0b3AoKTsKKwlzdWJzY3Jfc3RvcCgpOworCXJlZ19zdG9wKCk7CisJbmFtZXRibF9zdG9wKCk7CisJcmVmX3RhYmxlX3N0b3AoKTsKKwlzb2NrZXRfc3RvcCgpOworfQorCisvKioKKyAqIHN0YXJ0X2NvcmUgLSBzd2l0Y2ggVElQQyBmcm9tIE5PVCBSVU5OSU5HIHRvIFNJTkdMRSBOT0RFIG1vZGUKKyAqLworCitpbnQgc3RhcnRfY29yZSh2b2lkKQoreworCWludCByZXM7CisKKwlpZiAodGlwY19tb2RlICE9IFRJUENfTk9UX1JVTk5JTkcpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwlnZXRfcmFuZG9tX2J5dGVzKCZ0aXBjX3JhbmRvbSwgc2l6ZW9mKHRpcGNfcmFuZG9tKSk7CisJdGlwY19tb2RlID0gVElQQ19OT0RFX01PREU7CisKKwlpZiAoKHJlcyA9IGhhbmRsZXJfc3RhcnQoKSkgfHwgCisJICAgIChyZXMgPSByZWZfdGFibGVfaW5pdCh0aXBjX21heF9wb3J0cyArIHRpcGNfbWF4X3N1YnNjcmlwdGlvbnMsCisJCQkJICB0aXBjX3JhbmRvbSkpIHx8CisJICAgIChyZXMgPSByZWdfc3RhcnQoKSkgfHwKKwkgICAgKHJlcyA9IG5hbWV0YmxfaW5pdCgpKSB8fAorICAgICAgICAgICAgKHJlcyA9IGtfc2lnbmFsKChIYW5kbGVyKXN1YnNjcl9zdGFydCwgMCkpIHx8CisJICAgIChyZXMgPSBrX3NpZ25hbCgoSGFuZGxlciljZmdfaW5pdCwgMCkpIHx8IAorCSAgICAocmVzID0gbmV0bGlua19zdGFydCgpKSB8fAorCSAgICAocmVzID0gc29ja2V0X2luaXQoKSkpIHsKKwkJc3RvcF9jb3JlKCk7CisJfQorCXJldHVybiByZXM7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgdGlwY19pbml0KHZvaWQpCit7CisJaW50IHJlczsKKworCWxvZ19yZWluaXQoQ09ORklHX1RJUENfTE9HKTsKKwlpbmZvKCJBY3RpdmF0ZWQgKGNvbXBpbGVkICIgX19EQVRFX18gIiAiIF9fVElNRV9fICIpXG4iKTsKKworCXRpcGNfb3duX2FkZHIgPSAwOworCXRpcGNfcmVtb3RlX21hbmFnZW1lbnQgPSAxOworCXRpcGNfbWF4X3B1YmxpY2F0aW9ucyA9IDEwMDAwOworCXRpcGNfbWF4X3N1YnNjcmlwdGlvbnMgPSAyMDAwOworCXRpcGNfbWF4X3BvcnRzID0gZGVsaW1pdChDT05GSUdfVElQQ19QT1JUUywgMTI3LCA2NTUzNik7CisJdGlwY19tYXhfem9uZXMgPSBkZWxpbWl0KENPTkZJR19USVBDX1pPTkVTLCAxLCA1MTEpOworCXRpcGNfbWF4X2NsdXN0ZXJzID0gZGVsaW1pdChDT05GSUdfVElQQ19DTFVTVEVSUywgMSwgMSk7CisJdGlwY19tYXhfbm9kZXMgPSBkZWxpbWl0KENPTkZJR19USVBDX05PREVTLCA4LCAyMDQ3KTsKKwl0aXBjX21heF9zbGF2ZXMgPSBkZWxpbWl0KENPTkZJR19USVBDX1NMQVZFX05PREVTLCAwLCAyMDQ3KTsKKwl0aXBjX25ldF9pZCA9IDQ3MTE7CisKKwlpZiAoKHJlcyA9IHN0YXJ0X2NvcmUoKSkpCisJCWVycigiVW5hYmxlIHRvIHN0YXJ0IGluIHNpbmdsZSBub2RlIG1vZGVcbiIpOworCWVsc2UJCisJCWluZm8oIlN0YXJ0ZWQgaW4gc2luZ2xlIG5vZGUgbW9kZVxuIik7CisgICAgICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0aXBjX2V4aXQodm9pZCkKK3sKKwlzdG9wX25ldCgpOworCXN0b3BfY29yZSgpOworCWluZm8oIkRlYWN0aXZhdGVkXG4iKTsKKwlsb2dfc3RvcCgpOworfQorCittb2R1bGVfaW5pdCh0aXBjX2luaXQpOworbW9kdWxlX2V4aXQodGlwY19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUSVBDOiBUcmFuc3BhcmVudCBJbnRlciBQcm9jZXNzIENvbW11bmljYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKworLyogTmF0aXZlIFRJUEMgQVBJIGZvciBrZXJuZWwtc3BhY2UgYXBwbGljYXRpb25zIChzZWUgdGlwYy5oKSAqLworCitFWFBPUlRfU1lNQk9MKHRpcGNfYXR0YWNoKTsKK0VYUE9SVF9TWU1CT0wodGlwY19kZXRhY2gpOworRVhQT1JUX1NZTUJPTCh0aXBjX2dldF9hZGRyKTsKK0VYUE9SVF9TWU1CT0wodGlwY19nZXRfbW9kZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfY3JlYXRlcG9ydCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfZGVsZXRlcG9ydCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfb3duaWRlbnRpdHkpOworRVhQT1JUX1NZTUJPTCh0aXBjX3BvcnRpbXBvcnRhbmNlKTsKK0VYUE9SVF9TWU1CT0wodGlwY19zZXRfcG9ydGltcG9ydGFuY2UpOworRVhQT1JUX1NZTUJPTCh0aXBjX3BvcnR1bnJlbGlhYmxlKTsKK0VYUE9SVF9TWU1CT0wodGlwY19zZXRfcG9ydHVucmVsaWFibGUpOworRVhQT1JUX1NZTUJPTCh0aXBjX3BvcnR1bnJldHVybmFibGUpOworRVhQT1JUX1NZTUJPTCh0aXBjX3NldF9wb3J0dW5yZXR1cm5hYmxlKTsKK0VYUE9SVF9TWU1CT0wodGlwY19wdWJsaXNoKTsKK0VYUE9SVF9TWU1CT0wodGlwY193aXRoZHJhdyk7CitFWFBPUlRfU1lNQk9MKHRpcGNfY29ubmVjdDJwb3J0KTsKK0VYUE9SVF9TWU1CT0wodGlwY19kaXNjb25uZWN0KTsKK0VYUE9SVF9TWU1CT0wodGlwY19zaHV0ZG93bik7CitFWFBPUlRfU1lNQk9MKHRpcGNfaXNjb25uZWN0ZWQpOworRVhQT1JUX1NZTUJPTCh0aXBjX3BlZXIpOworRVhQT1JUX1NZTUJPTCh0aXBjX3JlZl92YWxpZCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2VuZCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2VuZF9idWYpOworRVhQT1JUX1NZTUJPTCh0aXBjX3NlbmQybmFtZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfZm9yd2FyZDJuYW1lKTsKK0VYUE9SVF9TWU1CT0wodGlwY19zZW5kX2J1ZjJuYW1lKTsKK0VYUE9SVF9TWU1CT0wodGlwY19mb3J3YXJkX2J1ZjJuYW1lKTsKK0VYUE9SVF9TWU1CT0wodGlwY19zZW5kMnBvcnQpOworRVhQT1JUX1NZTUJPTCh0aXBjX2ZvcndhcmQycG9ydCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2VuZF9idWYycG9ydCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfZm9yd2FyZF9idWYycG9ydCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfbXVsdGljYXN0KTsKKy8qIEVYUE9SVF9TWU1CT0wodGlwY19tdWx0aWNhc3RfYnVmKTsgbm90IGF2YWlsYWJsZSB5ZXQgKi8KK0VYUE9SVF9TWU1CT0wodGlwY19pc3B1Ymxpc2hlZCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfYXZhaWxhYmxlX25vZGVzKTsKKworLyogVElQQyBBUEkgZm9yIGV4dGVybmFsIGJlYXJlcnMgKHNlZSB0aXBjX2JlYXJlci5oKSAqLworCitFWFBPUlRfU1lNQk9MKHRpcGNfYmxvY2tfYmVhcmVyKTsKK0VYUE9SVF9TWU1CT0wodGlwY19jb250aW51ZSk7IAorRVhQT1JUX1NZTUJPTCh0aXBjX2Rpc2FibGVfYmVhcmVyKTsKK0VYUE9SVF9TWU1CT0wodGlwY19lbmFibGVfYmVhcmVyKTsKK0VYUE9SVF9TWU1CT0wodGlwY19yZWN2X21zZyk7CitFWFBPUlRfU1lNQk9MKHRpcGNfcmVnaXN0ZXJfbWVkaWEpOyAKKworLyogVElQQyBBUEkgZm9yIGV4dGVybmFsIEFQSXMgKHNlZSB0aXBjX3BvcnQuaCkgKi8KKworRVhQT1JUX1NZTUJPTCh0aXBjX2NyZWF0ZXBvcnRfcmF3KTsKK0VYUE9SVF9TWU1CT0wodGlwY19zZXRfbXNnX29wdGlvbik7CitFWFBPUlRfU1lNQk9MKHRpcGNfcmVqZWN0X21zZyk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2VuZF9idWZfZmFzdCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfYWNrbm93bGVkZ2UpOworRVhQT1JUX1NZTUJPTCh0aXBjX2dldF9wb3J0KTsKK0VYUE9SVF9TWU1CT0wodGlwY19nZXRfaGFuZGxlKTsKKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvY29yZS5oIGIvbmV0L3RpcGMvY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OWI2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9jb3JlLmgKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBuZXQvdGlwYy9jb3JlLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBnbG9iYWwgZGVjbGFyYXRpb25zCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfQ09SRV9ICisjZGVmaW5lIF9USVBDX0NPUkVfSAorCisjaW5jbHVkZSA8bmV0L3RpcGMvdGlwYy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgkKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisvKgorICogVElQQyBkZWJ1Z2dpbmcgY29kZQorICovCisKKyNkZWZpbmUgYXNzZXJ0KGkpICBCVUdfT04oIShpKSkKKworc3RydWN0IHRpcGNfbXNnOworZXh0ZXJuIHN0cnVjdCBwcmludF9idWYgKkNPTlMsICpMT0c7CitleHRlcm4gc3RydWN0IHByaW50X2J1ZiAqVEVFKHN0cnVjdCBwcmludF9idWYgKiwgc3RydWN0IHByaW50X2J1ZiAqKTsKK3ZvaWQgbXNnX3ByaW50KHN0cnVjdCBwcmludF9idWYqLHN0cnVjdCB0aXBjX21zZyAqLGNvbnN0IGNoYXIqKTsKK3ZvaWQgdGlwY19wcmludGYoc3RydWN0IHByaW50X2J1ZiAqLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Cit2b2lkIHRpcGNfZHVtcChzdHJ1Y3QgcHJpbnRfYnVmKixjb25zdCBjaGFyICpmbXQsIC4uLik7CisKKyNpZmRlZiBDT05GSUdfVElQQ19ERUJVRworCisvKgorICogVElQQyBkZWJ1ZyBzdXBwb3J0IGluY2x1ZGVkOgorICogLSBzeXN0ZW0gbWVzc2FnZXMgYXJlIHByaW50ZWQgdG8gVElQQ19PVVRQVVQgcHJpbnQgYnVmZmVyCisgKiAtIGRlYnVnIG1lc3NhZ2VzIGFyZSBwcmludGVkIHRvIERCR19PVVRQVVQgcHJpbnQgYnVmZmVyCisgKi8KKworI2RlZmluZSBlcnIoZm10LCBhcmcuLi4pICB0aXBjX3ByaW50ZihUSVBDX09VVFBVVCwgS0VSTl9FUlIgIlRJUEM6ICIgZm10LCAjIyBhcmcpCisjZGVmaW5lIHdhcm4oZm10LCBhcmcuLi4pIHRpcGNfcHJpbnRmKFRJUENfT1VUUFVULCBLRVJOX1dBUk5JTkcgIlRJUEM6ICIgZm10LCAjIyBhcmcpCisjZGVmaW5lIGluZm8oZm10LCBhcmcuLi4pIHRpcGNfcHJpbnRmKFRJUENfT1VUUFVULCBLRVJOX05PVElDRSAiVElQQzogIiBmbXQsICMjIGFyZykKKworI2RlZmluZSBkYmcoZm10LCBhcmcuLi4pICBkbyB7aWYgKERCR19PVVRQVVQpIHRpcGNfcHJpbnRmKERCR19PVVRQVVQsIGZtdCwgIyMgYXJnKTt9IHdoaWxlKDApCisjZGVmaW5lIG1zZ19kYmcobXNnLCB0eHQpIGRvIHtpZiAoREJHX09VVFBVVCkgbXNnX3ByaW50KERCR19PVVRQVVQsIG1zZywgdHh0KTt9IHdoaWxlKDApCisjZGVmaW5lIGR1bXAoZm10LCBhcmcuLi4pIGRvIHtpZiAoREJHX09VVFBVVCkgdGlwY19kdW1wKERCR19PVVRQVVQsIGZtdCwgIyNhcmcpO30gd2hpbGUoMCkKKworCisvKgkKKyAqIEJ5IGRlZmF1bHQsIFRJUENfT1VUUFVUIGlzIGRlZmluZWQgdG8gYmUgc3lzdGVtIGNvbnNvbGUgYW5kIFRJUEMgbG9nIGJ1ZmZlciwKKyAqIHdoaWxlIERCR19PVVRQVVQgaXMgdGhlIG51bGwgcHJpbnQgYnVmZmVyLiAgVGhlc2UgZGVmYXVsdHMgY2FuIGJlIGNoYW5nZWQKKyAqIGhlcmUsIG9yIG9uIGEgcGVyIC5jIGZpbGUgYmFzaXMsIGJ5IHJlZGVmaW5pbmcgdGhlc2Ugc3ltYm9scy4gIFRoZSBmb2xsb3dpbmcKKyAqIHByaW50IGJ1ZmZlciBvcHRpb25zIGFyZSBhdmFpbGFibGU6CisgKgorICogTlVMTAkJCTogT3V0cHV0IHRvIG51bGwgcHJpbnQgYnVmZmVyIChpLmUuIHByaW50IG5vd2hlcmUpCisgKiBDT05TCQkJOiBPdXRwdXQgdG8gc3lzdGVtIGNvbnNvbGUKKyAqIExPRwkJCTogT3V0cHV0IHRvIFRJUEMgbG9nIGJ1ZmZlciAKKyAqICZidWYgCQk6IE91dHB1dCB0byB1c2VyLWRlZmluZWQgYnVmZmVyIChzdHJ1Y3QgcHJpbnRfYnVmICopCisgKiBURUUoJmJ1Zl9hLCZidWZfYikJOiBPdXRwdXQgdG8gdHdvIHByaW50IGJ1ZmZlcnMgKGVnLiBURUUoQ09OUyxMT0cpICkKKyAqLworCisjaWZuZGVmIFRJUENfT1VUUFVUCisjZGVmaW5lIFRJUENfT1VUUFVUIFRFRShDT05TLExPRykKKyNlbmRpZgorCisjaWZuZGVmIERCR19PVVRQVVQKKyNkZWZpbmUgREJHX09VVFBVVCBOVUxMCisjZW5kaWYKKworI2Vsc2UKKworI2lmbmRlZiBEQkdfT1VUUFVUCisjZGVmaW5lIERCR19PVVRQVVQgTlVMTAorI2VuZGlmCisKKy8qCisgKiBUSVBDIGRlYnVnIHN1cHBvcnQgbm90IGluY2x1ZGVkOgorICogLSBzeXN0ZW0gbWVzc2FnZXMgYXJlIHByaW50ZWQgdG8gc3lzdGVtIGNvbnNvbGUKKyAqIC0gZGVidWcgbWVzc2FnZXMgYXJlIG5vdCBwcmludGVkCisgKi8KKworI2RlZmluZSBlcnIoZm10LCBhcmcuLi4pICBwcmludGsoS0VSTl9FUlIgIlRJUEM6ICIgZm10ICwgIyMgYXJnKQorI2RlZmluZSBpbmZvKGZtdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICJUSVBDOiAiIGZtdCAsICMjIGFyZykKKyNkZWZpbmUgd2FybihmbXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiVElQQzogIiBmbXQgLCAjIyBhcmcpCisKKyNkZWZpbmUgZGJnKGZtdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbXNnX2RiZyhtc2csdHh0KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZHVtcChmbXQsYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworI2VuZGlmCQkJICAKKworCisvKiAKKyAqIFRJUEMtc3BlY2lmaWMgZXJyb3IgY29kZXMKKyAqLworCisjZGVmaW5lIEVMSU5LQ09ORyBFQUdBSU4JLyogbGluayBjb25nZXN0aW9uIDw9PiByZXNvdXJjZSB1bmF2YWlsYWJsZSAqLworCisvKgorICogR2xvYmFsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisgKi8KKworZXh0ZXJuIHUzMiB0aXBjX293bl9hZGRyOworZXh0ZXJuIGludCB0aXBjX21heF96b25lczsKK2V4dGVybiBpbnQgdGlwY19tYXhfY2x1c3RlcnM7CitleHRlcm4gaW50IHRpcGNfbWF4X25vZGVzOworZXh0ZXJuIGludCB0aXBjX21heF9zbGF2ZXM7CitleHRlcm4gaW50IHRpcGNfbWF4X3BvcnRzOworZXh0ZXJuIGludCB0aXBjX21heF9zdWJzY3JpcHRpb25zOworZXh0ZXJuIGludCB0aXBjX21heF9wdWJsaWNhdGlvbnM7CitleHRlcm4gaW50IHRpcGNfbmV0X2lkOworZXh0ZXJuIGludCB0aXBjX3JlbW90ZV9tYW5hZ2VtZW50OworCisvKgorICogT3RoZXIgZ2xvYmFsIHZhcmlhYmxlcworICovCisKK2V4dGVybiBpbnQgdGlwY19tb2RlOworZXh0ZXJuIGludCB0aXBjX3JhbmRvbTsKK2V4dGVybiBjb25zdCBjaGFyIHRpcGNfYWxwaGFiZXRbXTsKK2V4dGVybiBhdG9taWNfdCB0aXBjX3VzZXJfY291bnQ7CisKKworLyoKKyAqIFJvdXRpbmVzIGF2YWlsYWJsZSB0byBwcml2aWxlZ2VkIHN1YnN5c3RlbXMKKyAqLworCitleHRlcm4gaW50ICBzdGFydF9jb3JlKHZvaWQpOworZXh0ZXJuIHZvaWQgc3RvcF9jb3JlKHZvaWQpOworZXh0ZXJuIGludCAgc3RhcnRfbmV0KHZvaWQpOworZXh0ZXJuIHZvaWQgc3RvcF9uZXQodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlbGltaXQoaW50IHZhbCwgaW50IG1pbiwgaW50IG1heCkKK3sKKwlpZiAodmFsID4gbWF4KQorCQlyZXR1cm4gbWF4OworCWlmICh2YWwgPCBtaW4pCisJCXJldHVybiBtaW47CisJcmV0dXJuIHZhbDsKK30KKworCisvKgorICogVElQQyB0aW1lciBhbmQgc2lnbmFsIGNvZGUKKyAqLworCit0eXBlZGVmIHZvaWQgKCpIYW5kbGVyKSAodW5zaWduZWQgbG9uZyk7CisKK3UzMiBrX3NpZ25hbChIYW5kbGVyIHJvdXRpbmUsIHVuc2lnbmVkIGxvbmcgYXJndW1lbnQpOworCisvKioKKyAqIGtfaW5pdF90aW1lciAtIGluaXRpYWxpemUgYSB0aW1lcgorICogQHRpbWVyOiBwb2ludGVyIHRvIHRpbWVyIHN0cnVjdHVyZQorICogQHJvdXRpbmU6IHBvaW50ZXIgdG8gcm91dGluZSB0byBpbnZva2Ugd2hlbiB0aW1lciBleHBpcmVzCisgKiBAYXJndW1lbnQ6IHZhbHVlIHRvIHBhc3MgdG8gcm91dGluZSB3aGVuIHRpbWVyIGV4cGlyZXMKKyAqIAorICogVGltZXIgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdXNlIChhbmQgdGVybWluYXRlZCB3aGVuIG5vIGxvbmdlciBuZWVkZWQpLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrX2luaXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLCBIYW5kbGVyIHJvdXRpbmUsIAorCQkJCXVuc2lnbmVkIGxvbmcgYXJndW1lbnQpCit7CisJZGJnKCJpbml0aWFsaXppbmcgdGltZXIgJXBcbiIsIHRpbWVyKTsKKwlpbml0X3RpbWVyKHRpbWVyKTsKKwl0aW1lci0+ZnVuY3Rpb24gPSByb3V0aW5lOworCXRpbWVyLT5kYXRhID0gYXJndW1lbnQ7Cit9CisKKy8qKgorICoga19zdGFydF90aW1lciAtIHN0YXJ0IGEgdGltZXIKKyAqIEB0aW1lcjogcG9pbnRlciB0byB0aW1lciBzdHJ1Y3R1cmUKKyAqIEBtc2VjOiB0aW1lIHRvIGRlbGF5IChpbiBtcykKKyAqIAorICogU2NoZWR1bGVzIGEgcHJldmlvdXNseSBpbml0aWFsaXplZCB0aW1lciBmb3IgbGF0ZXIgZXhlY3V0aW9uLgorICogSWYgdGltZXIgaXMgYWxyZWFkeSBydW5uaW5nLCB0aGUgbmV3IHRpbWVvdXQgb3ZlcnJpZGVzIHRoZSBwcmV2aW91cyByZXF1ZXN0LgorICogCisgKiBUbyBlbnN1cmUgdGhlIHRpbWVyIGRvZXNuJ3QgZXhwaXJlIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGRlbGF5IGVsYXBzZXMsCisgKiB0aGUgYW1vdW50IG9mIGRlbGF5IGlzIHJvdW5kZWQgdXAgd2hlbiBjb252ZXJ0aW5nIHRvIHRoZSBqaWZmaWVzCisgKiB0aGVuIGFuIGFkZGl0aW9uYWwgamlmZnkgaXMgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCAKKyAqIHRoZSBzdGFydGluZyB0aW1lIG1heSBiZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBjdXJyZW50IGppZmZ5LgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrX3N0YXJ0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgdW5zaWduZWQgbG9uZyBtc2VjKQoreworCWRiZygic3RhcnRpbmcgdGltZXIgJXAgZm9yICV1XG4iLCB0aW1lciwgbXNlYyk7CisJbW9kX3RpbWVyKHRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhtc2VjKSArIDEpOworfQorCisvKioKKyAqIGtfY2FuY2VsX3RpbWVyIC0gY2FuY2VsIGEgdGltZXIKKyAqIEB0aW1lcjogcG9pbnRlciB0byB0aW1lciBzdHJ1Y3R1cmUKKyAqIAorICogQ2FuY2VscyBhIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgdGltZXIuICAKKyAqIENhbiBiZSBjYWxsZWQgc2FmZWx5IGV2ZW4gaWYgdGhlIHRpbWVyIGlzIGFscmVhZHkgaW5hY3RpdmUuCisgKiAKKyAqIFdBUk5JTkc6IE11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIGhvbGRpbmcgbG9ja3MgcmVxdWlyZWQgYnkgdGhlIHRpbWVyJ3MKKyAqICAgICAgICAgIHRpbWVvdXQgcm91dGluZSwgb3RoZXJ3aXNlIGRlYWRsb2NrIGNhbiBvY2N1ciBvbiBTTVAgc3lzdGVtcyEKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQga19jYW5jZWxfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCWRiZygiY2FuY2VsbGluZyB0aW1lciAlcFxuIiwgdGltZXIpOworCWRlbF90aW1lcl9zeW5jKHRpbWVyKTsKK30KKworLyoqCisgKiBrX3Rlcm1fdGltZXIgLSB0ZXJtaW5hdGUgYSB0aW1lcgorICogQHRpbWVyOiBwb2ludGVyIHRvIHRpbWVyIHN0cnVjdHVyZQorICogCisgKiBQcmV2ZW50cyBmdXJ0aGVyIHVzZSBvZiBhIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgdGltZXIuCisgKiAKKyAqIFdBUk5JTkc6IENhbGxlciBtdXN0IGVuc3VyZSB0aW1lciBpc24ndCBjdXJyZW50bHkgcnVubmluZy4KKyAqIAorICogKERvIG5vdCAiZW5oYW5jZSIgdGhpcyByb3V0aW5lIHRvIGF1dG9tYXRpY2FsbHkgY2FuY2VsIGFuIGFjdGl2ZSB0aW1lciwKKyAqIG90aGVyd2lzZSBkZWFkbG9jayBjYW4gYXJpc2Ugd2hlbiBhIHRpbWVvdXQgcm91dGluZSBjYWxscyBrX3Rlcm1fdGltZXIuKQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrX3Rlcm1fdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCWRiZygidGVybWluYXRpbmcgdGltZXIgJXBcbiIsIHRpbWVyKTsKK30KKworCisvKgorICogVElQQyBtZXNzYWdlIGJ1ZmZlciBjb2RlCisgKgorICogVElQQyBtZXNzYWdlIGJ1ZmZlciBoZWFkcm9vbSBsZWF2ZXMgcm9vbSBmb3IgMTQgYnl0ZSBFdGhlcm5ldCBoZWFkZXIsIAorICogd2hpbGUgZW5zdXJpbmcgVElQQyBoZWFkZXIgaXMgd29yZCBhbGlnbmVkIGZvciBxdWlja2VyIGFjY2VzcworICovCisKKyNkZWZpbmUgQlVGX0hFQURST09NIDE2dSAKKworc3RydWN0IHRpcGNfc2tiX2NiIHsKKwl2b2lkICpoYW5kbGU7Cit9OworCisjZGVmaW5lIFRJUENfU0tCX0NCKF9fc2tiKSAoKHN0cnVjdCB0aXBjX3NrYl9jYiAqKSYoKF9fc2tiKS0+Y2JbMF0pKQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRpcGNfbXNnICpidWZfbXNnKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgdGlwY19tc2cgKilza2ItPmRhdGE7Cit9CisKKy8qKgorICogYnVmX2FjcXVpcmUgLSBjcmVhdGVzIGEgVElQQyBtZXNzYWdlIGJ1ZmZlcgorICogQHNpemU6IG1lc3NhZ2Ugc2l6ZSAoaW5jbHVkaW5nIFRJUEMgaGVhZGVyKQorICoKKyAqIFJldHVybnMgYSBuZXcgYnVmZmVyLiAgU3BhY2UgaXMgcmVzZXJ2ZWQgZm9yIGEgZGF0YSBsaW5rIGhlYWRlci4KKyAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpidWZfYWNxdWlyZSh1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCBidWZfc2l6ZSA9IChCVUZfSEVBRFJPT00gKyBzaXplICsgMykgJiB+M3U7CisKKwlza2IgPSBhbGxvY19za2IoYnVmX3NpemUsIEdGUF9BVE9NSUMpOworCWlmIChza2IpIHsKKwkJc2tiX3Jlc2VydmUoc2tiLCBCVUZfSEVBRFJPT00pOworCQlza2JfcHV0KHNrYiwgc2l6ZSk7CisJCXNrYi0+bmV4dCA9IE5VTEw7CisJfQorCXJldHVybiBza2I7Cit9CisKKy8qKgorICogYnVmX2Rpc2NhcmQgLSBmcmVlcyBhIFRJUEMgbWVzc2FnZSBidWZmZXIKKyAqIEBza2I6IG1lc3NhZ2UgYnVmZmVyCisgKgorICogRnJlZXMgYSBuZXcgYnVmZmVyLiAgSWYgcGFzc2VkIE5VTEwsIGp1c3QgcmV0dXJucy4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYnVmX2Rpc2NhcmQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAobGlrZWx5KHNrYiAhPSBOVUxMKSkKKwkJa2ZyZWVfc2tiKHNrYik7Cit9CisKKyNlbmRpZgkJCQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGJnLmMgYi9uZXQvdGlwYy9kYmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWQ2MGExCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvZGJnLmMKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisgKiBuZXQvdGlwYy9kYmcuYzogVElQQyBwcmludCBidWZmZXIgcm91dGluZXMgZm9yIGRlYnVnZ2lnbgorICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImRiZy5oIgorCisjZGVmaW5lIE1BWF9TVFJJTkcgNTEyCisKK3N0YXRpYyBjaGFyIHByaW50X3N0cmluZ1tNQVhfU1RSSU5HXTsKK3N0YXRpYyBzcGlubG9ja190IHByaW50X2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKK3N0YXRpYyBzdHJ1Y3QgcHJpbnRfYnVmIGNvbnNfYnVmID0geyBOVUxMLCAwLCBOVUxMLCBOVUxMIH07CitzdHJ1Y3QgcHJpbnRfYnVmICpDT05TID0gJmNvbnNfYnVmOworCitzdGF0aWMgc3RydWN0IHByaW50X2J1ZiBsb2dfYnVmID0geyBOVUxMLCAwLCBOVUxMLCBOVUxMIH07CitzdHJ1Y3QgcHJpbnRfYnVmICpMT0cgPSAmbG9nX2J1ZjsKKworCisjZGVmaW5lIEZPUk1BVChQVFIsTEVOLEZNVCkgXAore1wKKyAgICAgICB2YV9saXN0IGFyZ3M7XAorICAgICAgIHZhX3N0YXJ0KGFyZ3MsIEZNVCk7XAorICAgICAgIExFTiA9IHZzcHJpbnRmKFBUUiwgRk1ULCBhcmdzKTtcCisgICAgICAgdmFfZW5kKGFyZ3MpO1wKKyAgICAgICAqKFBUUiArIExFTikgPSAnXDAnO1wKK30KKworLyoKKyAqIExvY2tpbmcgcG9saWN5IHdoZW4gdXNpbmcgcHJpbnQgYnVmZmVycy4KKyAqCisgKiAxKSBSb3V0aW5lcyBvZiB0aGUgZm9ybSBwcmludGJ1Zl9YWFgoKSByZWx5IG9uIHRoZSBjYWxsZXIgdG8gcHJldmVudAorICogICAgc2ltdWx0YW5lb3VzIHVzZSBvZiB0aGUgcHJpbnQgYnVmZmVyKHMpIGJlaW5nIG1hbmlwdWxhdGVkLgorICogMikgdGlwY19wcmludGYoKSB1c2VzICdwcmludF9sb2NrJyB0byBwcmV2ZW50IHNpbXVsdGFuZW91cyB1c2Ugb2YKKyAqICAgICdwcmludF9zdHJpbmcnIGFuZCB0byBwcm90ZWN0IGl0cyBwcmludCBidWZmZXIocykuCisgKiAzKSBURUUoKSB1c2VzICdwcmludF9sb2NrJyB0byBwcm90ZWN0IGl0cyBwcmludCBidWZmZXIocykuCisgKiA0KSBSb3V0aW5lcyBvZiB0aGUgZm9ybSBsb2dfWFhYKCkgdXNlcyAncHJpbnRfbG9jaycgdG8gcHJvdGVjdCBMT0cuCisgKi8KKworLyoqCisgKiBwcmludGJ1Zl9pbml0IC0gaW5pdGlhbGl6ZSBwcmludCBidWZmZXIgdG8gZW1wdHkKKyAqLworCit2b2lkIHByaW50YnVmX2luaXQoc3RydWN0IHByaW50X2J1ZiAqcGIsIGNoYXIgKnJhdywgdTMyIHN6KQoreworCWlmICghcGIgfHwgIXJhdyB8fCAoc3ogPCAoTUFYX1NUUklORyArIDEpKSkKKwkJcmV0dXJuOworCisJcGItPmNycyA9IHBiLT5idWYgPSByYXc7CisJcGItPnNpemUgPSBzejsKKwlwYi0+bmV4dCA9IDA7CisJcGItPmJ1ZlswXSA9IDA7CisJcGItPmJ1Zltzei0xXSA9IH4wOworfQorCisvKioKKyAqIHByaW50YnVmX3Jlc2V0IC0gcmVpbml0aWFsaXplIHByaW50IGJ1ZmZlciB0byBlbXB0eSBzdGF0ZQorICovCisKK3ZvaWQgcHJpbnRidWZfcmVzZXQoc3RydWN0IHByaW50X2J1ZiAqcGIpCit7CisJaWYgKHBiICYmIHBiLT5idWYpCisJCXByaW50YnVmX2luaXQocGIsIHBiLT5idWYsIHBiLT5zaXplKTsKK30KKworLyoqCisgKiBwcmludGJ1Zl9lbXB0eSAtIHRlc3QgaWYgcHJpbnQgYnVmZmVyIGlzIGluIGVtcHR5IHN0YXRlCisgKi8KKworaW50IHByaW50YnVmX2VtcHR5KHN0cnVjdCBwcmludF9idWYgKnBiKQoreworCXJldHVybiAoIXBiIHx8ICFwYi0+YnVmIHx8IChwYi0+Y3JzID09IHBiLT5idWYpKTsKK30KKworLyoqCisgKiBwcmludGJ1Zl92YWxpZGF0ZSAtIGNoZWNrIGZvciBwcmludCBidWZmZXIgb3ZlcmZsb3cKKyAqIAorICogVmVyaWZpZXMgdGhhdCBhIHByaW50IGJ1ZmZlciBoYXMgY2FwdHVyZWQgYWxsIGRhdGEgd3JpdHRlbiB0byBpdC4gCisgKiBJZiBkYXRhIGhhcyBiZWVuIGxvc3QsIGxpbmVhcml6ZSBidWZmZXIgYW5kIHByZXBlbmQgYW4gZXJyb3IgbWVzc2FnZQorICogCisgKiBSZXR1cm5zIGxlbmd0aCBvZiBwcmludCBidWZmZXIgZGF0YSBzdHJpbmcgKGluY2x1ZGluZyB0cmFpbGluZyBOVUxMKQorICovCisKK2ludCBwcmludGJ1Zl92YWxpZGF0ZShzdHJ1Y3QgcHJpbnRfYnVmICpwYikKK3sKKyAgICAgICAgY2hhciAqZXJyID0gIiAgICAgICAgICAgICAqKiogUFJJTlQgQlVGRkVSIFdSQVBQRUQgQVJPVU5EICoqKlxuIjsKKyAgICAgICAgY2hhciAqY3BfYnVmOworICAgICAgICBzdHJ1Y3QgcHJpbnRfYnVmIGNiOworCisJaWYgKCFwYiB8fCAhcGItPmJ1ZikKKwkJcmV0dXJuIDA7CisKKwlpZiAocGItPmJ1ZltwYi0+c2l6ZSAtIDFdID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICBjcF9idWYgPSBrbWFsbG9jKHBiLT5zaXplLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgICAgICAgICBpZiAoY3BfYnVmICE9IE5VTEwpeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRidWZfaW5pdCgmY2IsIGNwX2J1ZiwgcGItPnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRidWZfbW92ZSgmY2IsIHBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50YnVmX21vdmUocGIsICZjYik7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShjcF9idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBiLT5idWYsIGVyciwgc3RybGVuKGVycikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGJ1Zl9yZXNldChwYik7CisgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX3ByaW50ZihwYiwgZXJyKTsKKyAgICAgICAgICAgICAgICB9CisJfQorCXJldHVybiAocGItPmNycyAtIHBiLT5idWYgKyAxKTsKK30KKworLyoqCisgKiBwcmludGJ1Zl9tb3ZlIC0gbW92ZSBwcmludCBidWZmZXIgY29udGVudHMgdG8gYW5vdGhlciBwcmludCBidWZmZXIKKyAqIAorICogQ3VycmVudCBjb250ZW50cyBvZiBkZXN0aW5hdGlvbiBwcmludCBidWZmZXIgKGlmIGFueSkgYXJlIGRpc2NhcmRlZC4KKyAqIFNvdXJjZSBwcmludCBidWZmZXIgYmVjb21lcyBlbXB0eSBpZiBhIHN1Y2Nlc3NmdWwgbW92ZSBvY2N1cnMuCisgKi8KKwordm9pZCBwcmludGJ1Zl9tb3ZlKHN0cnVjdCBwcmludF9idWYgKnBiX3RvLCBzdHJ1Y3QgcHJpbnRfYnVmICpwYl9mcm9tKQoreworCWludCBsZW47CisKKwkvKiBIYW5kbGUgdGhlIGNhc2VzIHdoZXJlIGNvbnRlbnRzIGNhbid0IGJlIG1vdmVkICovCisKKwlpZiAoIXBiX3RvIHx8ICFwYl90by0+YnVmKQorCQlyZXR1cm47CisKKwlpZiAoIXBiX2Zyb20gfHwgIXBiX2Zyb20tPmJ1ZikgeworCQlwcmludGJ1Zl9yZXNldChwYl90byk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocGJfdG8tPnNpemUgPCBwYl9mcm9tLT5zaXplKSB7CisJCXByaW50YnVmX3Jlc2V0KHBiX3RvKTsKKwkJdGlwY19wcmludGYocGJfdG8sICIqKiogUFJJTlQgQlVGRkVSIE9WRVJGTE9XICoqKiIpOworCQlyZXR1cm47CisJfQorCisJLyogQ29weSBkYXRhIGZyb20gY2hhciBhZnRlciBjdXJzb3IgdG8gZW5kIChpZiB1c2VkKSAqLworCWxlbiA9IHBiX2Zyb20tPmJ1ZiArIHBiX2Zyb20tPnNpemUgLSBwYl9mcm9tLT5jcnMgLSAyOworCWlmICgocGJfZnJvbS0+YnVmW3BiX2Zyb20tPnNpemUtMV0gPT0gMCkgJiYgKGxlbiA+IDApKSB7CisJCXN0cmNweShwYl90by0+YnVmLCBwYl9mcm9tLT5jcnMgKyAxKTsKKwkJcGJfdG8tPmNycyA9IHBiX3RvLT5idWYgKyBsZW47CisJfSBlbHNlCisJCXBiX3RvLT5jcnMgPSBwYl90by0+YnVmOworCisJLyogQ29weSBkYXRhIGZyb20gc3RhcnQgdG8gY3Vyc29yIChhbHdheXMpICovCisJbGVuID0gcGJfZnJvbS0+Y3JzIC0gcGJfZnJvbS0+YnVmOworCXN0cmNweShwYl90by0+Y3JzLCBwYl9mcm9tLT5idWYpOworCXBiX3RvLT5jcnMgKz0gbGVuOworCisJcHJpbnRidWZfcmVzZXQocGJfZnJvbSk7Cit9CisKKy8qKgorICogdGlwY19wcmludGYgLSBhcHBlbmQgZm9ybWF0dGVkIG91dHB1dCB0byBwcmludCBidWZmZXIgY2hhaW4KKyAqLworCit2b2lkIHRpcGNfcHJpbnRmKHN0cnVjdCBwcmludF9idWYgKnBiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlpbnQgY2hhcnNfdG9fYWRkOworCWludCBjaGFyc19sZWZ0OworCWNoYXIgc2F2ZV9jaGFyOworCXN0cnVjdCBwcmludF9idWYgKnBiX25leHQ7CisKKwlzcGluX2xvY2tfYmgoJnByaW50X2xvY2spOworCUZPUk1BVChwcmludF9zdHJpbmcsIGNoYXJzX3RvX2FkZCwgZm10KTsKKwlpZiAoY2hhcnNfdG9fYWRkID49IE1BWF9TVFJJTkcpCisJCXN0cmNweShwcmludF9zdHJpbmcsICIqKiogU1RSSU5HIFRPTyBMT05HICoqKiIpOworCisJd2hpbGUgKHBiKSB7CisJCWlmIChwYiA9PSBDT05TKQorCQkJcHJpbnRrKHByaW50X3N0cmluZyk7CisJCWVsc2UgaWYgKHBiLT5idWYpIHsKKwkJCWNoYXJzX2xlZnQgPSBwYi0+YnVmICsgcGItPnNpemUgLSBwYi0+Y3JzIC0gMTsKKwkJCWlmIChjaGFyc190b19hZGQgPD0gY2hhcnNfbGVmdCkgeworCQkJCXN0cmNweShwYi0+Y3JzLCBwcmludF9zdHJpbmcpOworCQkJCXBiLT5jcnMgKz0gY2hhcnNfdG9fYWRkOworCQkJfSBlbHNlIHsKKwkJCQlzdHJjcHkocGItPmJ1ZiwgcHJpbnRfc3RyaW5nICsgY2hhcnNfbGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVfY2hhciA9IHByaW50X3N0cmluZ1tjaGFyc19sZWZ0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3RyaW5nW2NoYXJzX2xlZnRdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHBiLT5jcnMsIHByaW50X3N0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0cmluZ1tjaGFyc19sZWZ0XSA9IHNhdmVfY2hhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGItPmNycyA9IHBiLT5idWYgKyBjaGFyc190b19hZGQgLSBjaGFyc19sZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwkJcGJfbmV4dCA9IHBiLT5uZXh0OworCQlwYi0+bmV4dCA9IDA7CisJCXBiID0gcGJfbmV4dDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnByaW50X2xvY2spOworfQorCisvKioKKyAqIFRFRSAtIHBlcmZvcm0gbmV4dCBvdXRwdXQgb3BlcmF0aW9uIG9uIGJvdGggcHJpbnQgYnVmZmVycyAgCisgKi8KKworc3RydWN0IHByaW50X2J1ZiAqVEVFKHN0cnVjdCBwcmludF9idWYgKmIwLCBzdHJ1Y3QgcHJpbnRfYnVmICpiMSkKK3sKKwlzdHJ1Y3QgcHJpbnRfYnVmICpwYiA9IGIwOworCisJaWYgKCFiMCB8fCAoYjAgPT0gYjEpKQorCQlyZXR1cm4gYjE7CisJaWYgKCFiMSkKKwkJcmV0dXJuIGIwOworCisJc3Bpbl9sb2NrX2JoKCZwcmludF9sb2NrKTsKKwl3aGlsZSAocGItPm5leHQpIHsKKwkJaWYgKChwYi0+bmV4dCA9PSBiMSkgfHwgKHBiLT5uZXh0ID09IGIwKSkKKwkJCXBiLT5uZXh0ID0gcGItPm5leHQtPm5leHQ7CisJCWVsc2UKKwkJCXBiID0gcGItPm5leHQ7CisJfQorCXBiLT5uZXh0ID0gYjE7CisJc3Bpbl91bmxvY2tfYmgoJnByaW50X2xvY2spOworCXJldHVybiBiMDsKK30KKworLyoqCisgKiBwcmludF90b19jb25zb2xlIC0gd3JpdGUgc3RyaW5nIG9mIGJ5dGVzIHRvIGNvbnNvbGUgaW4gbXVsdGlwbGUgY2h1bmtzCisgKi8KKworc3RhdGljIHZvaWQgcHJpbnRfdG9fY29uc29sZShjaGFyICpjcnMsIGludCBsZW4pCit7CisJaW50IHJlc3QgPSBsZW47CisKKwl3aGlsZSAocmVzdCA+IDApIHsKKwkJaW50IHN6ID0gcmVzdCA8IE1BWF9TVFJJTkcgPyByZXN0IDogTUFYX1NUUklORzsKKwkJY2hhciBjID0gY3JzW3N6XTsKKworCQljcnNbc3pdID0gMDsKKwkJcHJpbnRrKChjb25zdCBjaGFyICopY3JzKTsKKwkJY3JzW3N6XSA9IGM7CisJCXJlc3QgLT0gc3o7CisJCWNycyArPSBzejsKKwl9Cit9CisKKy8qKgorICogcHJpbnRidWZfZHVtcCAtIHdyaXRlIHByaW50IGJ1ZmZlciBjb250ZW50cyB0byBjb25zb2xlCisgKi8KKworc3RhdGljIHZvaWQgcHJpbnRidWZfZHVtcChzdHJ1Y3QgcHJpbnRfYnVmICpwYikKK3sKKwlpbnQgbGVuOworCisJLyogRHVtcCBwcmludCBidWZmZXIgZnJvbSBjaGFyIGFmdGVyIGN1cnNvciB0byBlbmQgKGlmIHVzZWQpICovCisJbGVuID0gcGItPmJ1ZiArIHBiLT5zaXplIC0gcGItPmNycyAtIDI7CisJaWYgKChwYi0+YnVmW3BiLT5zaXplIC0gMV0gPT0gMCkgJiYgKGxlbiA+IDApKQorCQlwcmludF90b19jb25zb2xlKHBiLT5jcnMgKyAxLCBsZW4pOworCisJLyogRHVtcCBwcmludCBidWZmZXIgZnJvbSBzdGFydCB0byBjdXJzb3IgKGFsd2F5cykgKi8KKwlsZW4gPSBwYi0+Y3JzIC0gcGItPmJ1ZjsKKwlwcmludF90b19jb25zb2xlKHBiLT5idWYsIGxlbik7Cit9CisKKy8qKgorICogdGlwY19kdW1wIC0gZHVtcCBub24tY29uc29sZSBwcmludCBidWZmZXIocykgdG8gY29uc29sZQorICovCisKK3ZvaWQgdGlwY19kdW1wKHN0cnVjdCBwcmludF9idWYgKnBiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlpbnQgbGVuOworCisJc3Bpbl9sb2NrX2JoKCZwcmludF9sb2NrKTsKKwlGT1JNQVQoQ09OUy0+YnVmLCBsZW4sIGZtdCk7CisJcHJpbnRrKENPTlMtPmJ1Zik7CisKKwlmb3IgKDsgcGI7IHBiID0gcGItPm5leHQpIHsKKwkJaWYgKHBiID09IENPTlMpCisJCQljb250aW51ZTsKKwkJcHJpbnRrKCJcbi0tLS0gU3RhcnQgb2YgZHVtcCwlcyBsb2cgLS0tLVxuXG4iLCAKKwkJICAgICAgIChwYiA9PSBMT0cpID8gImdsb2JhbCIgOiAibG9jYWwiKTsKKwkJcHJpbnRidWZfZHVtcChwYik7CisJCXByaW50YnVmX3Jlc2V0KHBiKTsKKwkJcHJpbnRrKCJcbi0tLS0tLS0tIEVuZCBvZiBkdW1wIC0tLS0tLS0tXG4iKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnByaW50X2xvY2spOworfQorCisvKioKKyAqIGxvZ19zdG9wIC0gZnJlZSB1cCBUSVBDIGxvZyBwcmludCBidWZmZXIgCisgKi8KKwordm9pZCBsb2dfc3RvcCh2b2lkKQoreworCXNwaW5fbG9ja19iaCgmcHJpbnRfbG9jayk7CisJaWYgKExPRy0+YnVmKSB7CisJCWtmcmVlKExPRy0+YnVmKTsKKwkJTE9HLT5idWYgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19iaCgmcHJpbnRfbG9jayk7Cit9CisKKy8qKgorICogbG9nX3JlaW5pdCAtIHNldCBUSVBDIGxvZyBwcmludCBidWZmZXIgdG8gc3BlY2lmaWVkIHNpemUKKyAqLworCit2b2lkIGxvZ19yZWluaXQoaW50IGxvZ19zaXplKQoreworCWxvZ19zdG9wKCk7CisKKwlpZiAobG9nX3NpemUpIHsKKwkJaWYgKGxvZ19zaXplIDw9IE1BWF9TVFJJTkcpCisJCQlsb2dfc2l6ZSA9IE1BWF9TVFJJTkcgKyAxOworCQlzcGluX2xvY2tfYmgoJnByaW50X2xvY2spOworCQlwcmludGJ1Zl9pbml0KExPRywga21hbGxvYyhsb2dfc2l6ZSwgR0ZQX0FUT01JQyksIGxvZ19zaXplKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnByaW50X2xvY2spOworCX0KK30KKworLyoqCisgKiBsb2dfcmVzaXplIC0gcmVjb25maWd1cmUgc2l6ZSBvZiBUSVBDIGxvZyBidWZmZXIKKyAqLworCitzdHJ1Y3Qgc2tfYnVmZiAqbG9nX3Jlc2l6ZShjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKQoreworCXUzMiB2YWx1ZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDAsIDMyNzY4KSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQorCQkJCQkgICAgICAiIChsb2cgc2l6ZSBtdXN0IGJlIDAtMzI3NjgpIik7CisJbG9nX3JlaW5pdCh2YWx1ZSk7CisJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7Cit9CisKKy8qKgorICogbG9nX2R1bXAgLSBjYXB0dXJlIFRJUEMgbG9nIGJ1ZmZlciBjb250ZW50cyBpbiBjb25maWd1cmF0aW9uIG1lc3NhZ2UKKyAqLworCitzdHJ1Y3Qgc2tfYnVmZiAqbG9nX2R1bXAodm9pZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHk7CisKKwlzcGluX2xvY2tfYmgoJnByaW50X2xvY2spOworCWlmICghTE9HLT5idWYpCisJCXJlcGx5ID0gY2ZnX3JlcGx5X3VsdHJhX3N0cmluZygibG9nIG5vdCBhY3RpdmF0ZWRcbiIpOworCWVsc2UgaWYgKHByaW50YnVmX2VtcHR5KExPRykpCisJCXJlcGx5ID0gY2ZnX3JlcGx5X3VsdHJhX3N0cmluZygibG9nIGlzIGVtcHR5XG4iKTsKKwllbHNlIHsKKwkJc3RydWN0IHRsdl9kZXNjICpyZXBfdGx2OworCQlzdHJ1Y3QgcHJpbnRfYnVmIHBiOworCQlpbnQgc3RyX2xlbjsKKworCQlzdHJfbGVuID0gbWluKExPRy0+c2l6ZSwgMzI3Njh1KTsKKwkJcmVwbHkgPSBjZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKHN0cl9sZW4pKTsKKwkJaWYgKHJlcGx5KSB7CisJCQlyZXBfdGx2ID0gKHN0cnVjdCB0bHZfZGVzYyAqKXJlcGx5LT5kYXRhOworCQkJcHJpbnRidWZfaW5pdCgmcGIsIFRMVl9EQVRBKHJlcF90bHYpLCBzdHJfbGVuKTsKKwkJCXByaW50YnVmX21vdmUoJnBiLCBMT0cpOworCQkJc3RyX2xlbiA9IHN0cmxlbihUTFZfREFUQShyZXBfdGx2KSkgKyAxOworCQkJc2tiX3B1dChyZXBseSwgVExWX1NQQUNFKHN0cl9sZW4pKTsKKwkJCVRMVl9TRVQocmVwX3RsdiwgVElQQ19UTFZfVUxUUkFfU1RSSU5HLCBOVUxMLCBzdHJfbGVuKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmcHJpbnRfbG9jayk7CisJcmV0dXJuIHJlcGx5OworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kYmcuaCBiL25ldC90aXBjL2RiZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YjJhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9kYmcuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogbmV0L3RpcGMvZGJnLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBwcmludCBidWZmZXIgcm91dGluZXMKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19EQkdfSAorI2RlZmluZSBfVElQQ19EQkdfSAorCitzdHJ1Y3QgcHJpbnRfYnVmIHsKKwljaGFyICpidWY7CisJdTMyIHNpemU7CisJY2hhciAqY3JzOworCXN0cnVjdCBwcmludF9idWYgKm5leHQ7Cit9OworCit2b2lkIHByaW50YnVmX2luaXQoc3RydWN0IHByaW50X2J1ZiAqcGIsIGNoYXIgKmJ1ZiwgdTMyIHN6KTsKK3ZvaWQgcHJpbnRidWZfcmVzZXQoc3RydWN0IHByaW50X2J1ZiAqcGIpOworaW50ICBwcmludGJ1Zl9lbXB0eShzdHJ1Y3QgcHJpbnRfYnVmICpwYik7CitpbnQgIHByaW50YnVmX3ZhbGlkYXRlKHN0cnVjdCBwcmludF9idWYgKnBiKTsKK3ZvaWQgcHJpbnRidWZfbW92ZShzdHJ1Y3QgcHJpbnRfYnVmICpwYl90bywgc3RydWN0IHByaW50X2J1ZiAqcGJfZnJvbSk7CisKK3ZvaWQgbG9nX3JlaW5pdChpbnQgbG9nX3NpemUpOwordm9pZCBsb2dfc3RvcCh2b2lkKTsKKworc3RydWN0IHNrX2J1ZmYgKmxvZ19yZXNpemUoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSk7CitzdHJ1Y3Qgc2tfYnVmZiAqbG9nX2R1bXAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGlzY292ZXIuYyBiL25ldC90aXBjL2Rpc2NvdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEwNmVmMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2Rpc2NvdmVyLmMKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBuZXQvdGlwYy9kaXNjb3Zlci5jCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgInpvbmUuaCIKKyNpbmNsdWRlICJkaXNjb3Zlci5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisKKyNkZWZpbmUgVElQQ19MSU5LX1JFUV9JTklUCTEyNQkvKiBtaW4gZGVsYXkgZHVyaW5nIGJlYXJlciBzdGFydCB1cCAqLworI2RlZmluZSBUSVBDX0xJTktfUkVRX0ZBU1QJMjAwMAkvKiBub3JtYWwgZGVsYXkgaWYgYmVhcmVyIGhhcyBubyBsaW5rcyAqLworI2RlZmluZSBUSVBDX0xJTktfUkVRX1NMT1cJNjAwMDAwCS8qIG5vcm1hbCBkZWxheSBpZiBiZWFyZXIgaGFzIGxpbmtzICovCisKKyNpZiAwCisjZGVmaW5lICBHRVRfTk9ERV9JTkZPICAgICAgICAgMzAwCisjZGVmaW5lICBHRVRfTk9ERV9JTkZPX1JFU1VMVCAgMzAxCisjZGVmaW5lICBGT1JXQVJEX0xJTktfUFJPQkUgICAgMzAyCisjZGVmaW5lICBMSU5LX1JFUVVFU1RfUkVKRUNURUQgMzAzCisjZGVmaW5lICBMSU5LX1JFUVVFU1RfQUNDRVBURUQgMzA0CisjZGVmaW5lICBEUk9QX0xJTktfUkVRVUVTVCAgICAgMzA1CisjZGVmaW5lICBDSEVDS19MSU5LX0NPVU5UICAgICAgMzA2CisjZW5kaWYKKworLyogCisgKiBUT0RPOiBNb3N0IG9mIHRoZSBpbnRlci1jbHVzdGVyIHNldHVwIHN0dWZmIHNob3VsZCBiZQorICogcmV3cml0dGVuLCBhbmQgYmUgbWFkZSBjb25mb3JtYW50IHdpdGggc3BlY2lmaWNhdGlvbi4KKyAqLyAKKworCisvKioKKyAqIHN0cnVjdCBsaW5rX3JlcSAtIGluZm9ybWF0aW9uIGFib3V0IGFuIG9uZ29pbmcgbGluayBzZXR1cCByZXF1ZXN0CisgKiBAYmVhcmVyOiBiZWFyZXIgaXNzdWluZyByZXF1ZXN0cworICogQGRlc3Q6IGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHJlcXVlc3QgbWVzc2FnZXMKKyAqIEBidWY6IHJlcXVlc3QgbWVzc2FnZSB0byBiZSAocmVwZWF0ZWRseSkgc2VudAorICogQHRpbWVyOiB0aW1lciBnb3Zlcm5pbmcgcGVyaW9kIGJldHdlZW4gcmVxdWVzdHMKKyAqIEB0aW1lcl9pbnR2OiBjdXJyZW50IGludGVydmFsIGJldHdlZW4gcmVxdWVzdHMgKGluIG1zKQorICovCitzdHJ1Y3QgbGlua19yZXEgeworCXN0cnVjdCBiZWFyZXIgKmJlYXJlcjsKKwlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIGRlc3Q7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl1bnNpZ25lZCBpbnQgdGltZXJfaW50djsKK307CisKKworI2lmIDAKK2ludCBkaXNjX2NyZWF0ZV9saW5rKGNvbnN0IHN0cnVjdCB0aXBjX2xpbmtfY3JlYXRlICphcmd2KSAKK3sKKwkvKiAKKwkgKiBDb2RlIGZvciBpbnRlciBjbHVzdGVyIGxpbmsgc2V0dXAgaGVyZSAKKwkgKi8KKwlyZXR1cm4gVElQQ19PSzsKK30KKyNlbmRpZgorCisvKgorICogZGlzY19sb3N0X2xpbmsoKTogQSBsaW5rIGhhcyBsb3N0IGNvbnRhY3QKKyAqLworCit2b2lkIGRpc2NfbGlua19ldmVudCh1MzIgYWRkciwgY2hhciAqbmFtZSwgaW50IHVwKSAKK3sKKwlpZiAoaW5fb3duX2NsdXN0ZXIoYWRkcikpCisJCXJldHVybjsKKwkvKiAKKwkgKiBDb2RlIGZvciBpbnRlciBjbHVzdGVyIGxpbmsgc2V0dXAgaGVyZSAKKwkgKi8KK30KKworLyoqIAorICogZGlzY19pbml0X21zZyAtIGluaXRpYWxpemUgYSBsaW5rIHNldHVwIG1lc3NhZ2UKKyAqIEB0eXBlOiBtZXNzYWdlIHR5cGUgKHJlcXVlc3Qgb3IgcmVzcG9uc2UpCisgKiBAcmVxX2xpbmtzOiBudW1iZXIgb2YgbGlua3MgYXNzb2NpYXRlZCB3aXRoIG1lc3NhZ2UKKyAqIEBkZXN0X2RvbWFpbjogbmV0d29yayBkb21haW4gb2Ygbm9kZShzKSB3aGljaCBzaG91bGQgcmVzcG9uZCB0byBtZXNzYWdlCisgKiBAYl9wdHI6IHB0ciB0byBiZWFyZXIgaXNzdWluZyBtZXNzYWdlCisgKi8KKworc3RydWN0IHNrX2J1ZmYgKmRpc2NfaW5pdF9tc2codTMyIHR5cGUsCisJCQkgICAgICB1MzIgcmVxX2xpbmtzLAorCQkJICAgICAgdTMyIGRlc3RfZG9tYWluLAorCQkJICAgICAgc3RydWN0IGJlYXJlciAqYl9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGJ1Zl9hY3F1aXJlKERTQ19IX1NJWkUpOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCisJaWYgKGJ1ZikgeworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1zZ19pbml0KG1zZywgTElOS19DT05GSUcsIHR5cGUsIFRJUENfT0ssIERTQ19IX1NJWkUsCisJCQkgZGVzdF9kb21haW4pOworCQltc2dfc2V0X25vbl9zZXEobXNnKTsKKwkJbXNnX3NldF9yZXFfbGlua3MobXNnLCByZXFfbGlua3MpOworCQltc2dfc2V0X2Rlc3RfZG9tYWluKG1zZywgZGVzdF9kb21haW4pOworCQltc2dfc2V0X2JjX25ldGlkKG1zZywgdGlwY19uZXRfaWQpOworCQltc2dfc2V0X21lZGlhX2FkZHIobXNnLCAmYl9wdHItPnB1YmwuYWRkcik7CisJfQorCXJldHVybiBidWY7Cit9CisKKy8qKgorICogZGlzY19yZWN2X21zZyAtIGhhbmRsZSBpbmNvbWluZyBsaW5rIHNldHVwIG1lc3NhZ2UgKHJlcXVlc3Qgb3IgcmVzcG9uc2UpCisgKiBAYnVmOiBidWZmZXIgY29udGFpbmluZyBtZXNzYWdlCisgKi8KKwordm9pZCBkaXNjX3JlY3ZfbXNnKHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IGJlYXJlciAqYl9wdHIgPSAoc3RydWN0IGJlYXJlciAqKVRJUENfU0tCX0NCKGJ1ZiktPmhhbmRsZTsKKwlzdHJ1Y3QgbGluayAqbGluazsKKwlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIG1lZGlhX2FkZHI7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJdTMyIGRlc3QgPSBtc2dfZGVzdF9kb21haW4obXNnKTsKKwl1MzIgb3JpZyA9IG1zZ19wcmV2bm9kZShtc2cpOworCXUzMiBuZXRfaWQgPSBtc2dfYmNfbmV0aWQobXNnKTsKKwl1MzIgdHlwZSA9IG1zZ190eXBlKG1zZyk7CisKKwltc2dfZ2V0X21lZGlhX2FkZHIobXNnLCZtZWRpYV9hZGRyKTsKKwltc2dfZGJnKG1zZywgIlJFQ1Y6Iik7CisJYnVmX2Rpc2NhcmQoYnVmKTsKKworCWlmIChuZXRfaWQgIT0gdGlwY19uZXRfaWQpCisJCXJldHVybjsKKwlpZiAoIWFkZHJfZG9tYWluX3ZhbGlkKGRlc3QpKQorCQlyZXR1cm47CisJaWYgKCFhZGRyX25vZGVfdmFsaWQob3JpZykpCisJCXJldHVybjsKKwlpZiAob3JpZyA9PSB0aXBjX293bl9hZGRyKQorCQlyZXR1cm47CisJaWYgKCFpbl9zY29wZShkZXN0LCB0aXBjX293bl9hZGRyKSkKKwkJcmV0dXJuOworCWlmIChpc19zbGF2ZSh0aXBjX293bl9hZGRyKSAmJiBpc19zbGF2ZShvcmlnKSkKKwkJcmV0dXJuOworCWlmIChpc19zbGF2ZShvcmlnKSAmJiAhaW5fb3duX2NsdXN0ZXIob3JpZykpCisJCXJldHVybjsKKwlpZiAoaW5fb3duX2NsdXN0ZXIob3JpZykpIHsKKwkJLyogQWx3YXlzIGFjY2VwdCBsaW5rIGhlcmUgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKnJidWY7CisJCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmFkZHI7CisJCXN0cnVjdCBub2RlICpuX3B0ciA9IG5vZGVfZmluZChvcmlnKTsKKwkJaW50IGxpbmtfdXA7CisJCWRiZygiIGluIG93biBjbHVzdGVyXG4iKTsKKwkJaWYgKG5fcHRyID09IE5VTEwpIHsKKwkJCW5fcHRyID0gbm9kZV9jcmVhdGUob3JpZyk7CisJCX0KKwkJaWYgKG5fcHRyID09IE5VTEwpIHsKKwkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBGYWlsZWQgdG8gY3JlYXRlIG5vZGVcbiIpOworCQkJcmV0dXJuOworCQl9CisJCXNwaW5fbG9ja19iaCgmbl9wdHItPmxvY2spOworCQlsaW5rID0gbl9wdHItPmxpbmtzW2JfcHRyLT5pZGVudGl0eV07CisJCWlmICghbGluaykgeworCQkJZGJnKCJjcmVhdGluZyBsaW5rXG4iKTsKKwkJCWxpbmsgPSBsaW5rX2NyZWF0ZShiX3B0ciwgb3JpZywgJm1lZGlhX2FkZHIpOworCQkJaWYgKCFsaW5rKSB7CisJCQkJc3Bpbl91bmxvY2tfYmgoJm5fcHRyLT5sb2NrKTsgICAgICAgICAgICAgICAgCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWFkZHIgPSAmbGluay0+bWVkaWFfYWRkcjsKKwkJaWYgKG1lbWNtcChhZGRyLCAmbWVkaWFfYWRkciwgc2l6ZW9mKCphZGRyKSkpIHsKKwkJCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCisJCQl3YXJuKCJOZXcgYmVhcmVyIGFkZHJlc3MgZm9yICVzXG4iLCAKKwkJCSAgICAgYWRkcl9zdHJpbmdfZmlsbChhZGRyX3N0cmluZywgb3JpZykpOworCQkJbWVtY3B5KGFkZHIsICZtZWRpYV9hZGRyLCBzaXplb2YoKmFkZHIpKTsKKwkJCWxpbmtfcmVzZXQobGluayk7ICAgICAKKwkJfQorCQlsaW5rX3VwID0gbGlua19pc191cChsaW5rKTsKKwkJc3Bpbl91bmxvY2tfYmgoJm5fcHRyLT5sb2NrKTsgICAgICAgICAgICAgICAgCisJCWlmICgodHlwZSA9PSBEU0NfUkVTUF9NU0cpIHx8IGxpbmtfdXApCisJCQlyZXR1cm47CisJCXJidWYgPSBkaXNjX2luaXRfbXNnKERTQ19SRVNQX01TRywgMSwgb3JpZywgYl9wdHIpOworCQlpZiAocmJ1ZiAhPSBOVUxMKSB7CisJCQltc2dfZGJnKGJ1Zl9tc2cocmJ1ZiksIlNFTkQ6Iik7CisJCQliX3B0ci0+bWVkaWEtPnNlbmRfbXNnKHJidWYsICZiX3B0ci0+cHVibCwgJm1lZGlhX2FkZHIpOworCQkJYnVmX2Rpc2NhcmQocmJ1Zik7CisJCX0KKwl9Cit9CisKKy8qKgorICogZGlzY19zdG9wX2xpbmtfcmVxIC0gc3RvcCBzZW5kaW5nIHBlcmlvZGljIGxpbmsgc2V0dXAgcmVxdWVzdHMKKyAqIEByZXE6IHB0ciB0byBsaW5rIHJlcXVlc3Qgc3RydWN0dXJlCisgKi8KKwordm9pZCBkaXNjX3N0b3BfbGlua19yZXEoc3RydWN0IGxpbmtfcmVxICpyZXEpIAoreworCWlmICghcmVxKQorCQlyZXR1cm47CisJCQorCWtfY2FuY2VsX3RpbWVyKCZyZXEtPnRpbWVyKTsKKwlrX3Rlcm1fdGltZXIoJnJlcS0+dGltZXIpOworCWJ1Zl9kaXNjYXJkKHJlcS0+YnVmKTsKKwlrZnJlZShyZXEpOworfSAKKworLyoqCisgKiBkaXNjX3VwZGF0ZV9saW5rX3JlcSAtIHVwZGF0ZSBmcmVxdWVuY3kgb2YgcGVyaW9kaWMgbGluayBzZXR1cCByZXF1ZXN0cworICogQHJlcTogcHRyIHRvIGxpbmsgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqLworCit2b2lkIGRpc2NfdXBkYXRlX2xpbmtfcmVxKHN0cnVjdCBsaW5rX3JlcSAqcmVxKSAKK3sKKwlpZiAoIXJlcSkKKwkJcmV0dXJuOworCisJaWYgKHJlcS0+dGltZXJfaW50diA9PSBUSVBDX0xJTktfUkVRX1NMT1cpIHsKKwkJaWYgKCFyZXEtPmJlYXJlci0+bm9kZXMuY291bnQpIHsKKwkJCXJlcS0+dGltZXJfaW50diA9IFRJUENfTElOS19SRVFfRkFTVDsKKwkJCWtfc3RhcnRfdGltZXIoJnJlcS0+dGltZXIsIHJlcS0+dGltZXJfaW50dik7CisJCX0KKwl9IGVsc2UgaWYgKHJlcS0+dGltZXJfaW50diA9PSBUSVBDX0xJTktfUkVRX0ZBU1QpIHsKKwkJaWYgKHJlcS0+YmVhcmVyLT5ub2Rlcy5jb3VudCkgeworCQkJcmVxLT50aW1lcl9pbnR2ID0gVElQQ19MSU5LX1JFUV9TTE9XOworCQkJa19zdGFydF90aW1lcigmcmVxLT50aW1lciwgcmVxLT50aW1lcl9pbnR2KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGxlYXZlIHRpbWVyICJhcyBpcyIgaWYgaGF2ZW4ndCB5ZXQgcmVhY2hlZCBhICJub3JtYWwiIHJhdGUgKi8KKwl9Cit9IAorCisvKioKKyAqIGRpc2NfdGltZW91dCAtIHNlbmQgYSBwZXJpb2RpYyBsaW5rIHNldHVwIHJlcXVlc3QKKyAqIEByZXE6IHB0ciB0byBsaW5rIHJlcXVlc3Qgc3RydWN0dXJlCisgKiAKKyAqIENhbGxlZCB3aGVuZXZlciBhIGxpbmsgc2V0dXAgcmVxdWVzdCB0aW1lciBhc3NvY2lhdGVkIHdpdGggYSBiZWFyZXIgZXhwaXJlcy4KKyAqLworCitzdGF0aWMgdm9pZCBkaXNjX3RpbWVvdXQoc3RydWN0IGxpbmtfcmVxICpyZXEpIAoreworCXNwaW5fbG9ja19iaCgmcmVxLT5iZWFyZXItPnB1YmwubG9jayk7CisKKwlyZXEtPmJlYXJlci0+bWVkaWEtPnNlbmRfbXNnKHJlcS0+YnVmLCAmcmVxLT5iZWFyZXItPnB1YmwsICZyZXEtPmRlc3QpOworCisJaWYgKChyZXEtPnRpbWVyX2ludHYgPT0gVElQQ19MSU5LX1JFUV9TTE9XKSB8fAorCSAgICAocmVxLT50aW1lcl9pbnR2ID09IFRJUENfTElOS19SRVFfRkFTVCkpIHsKKwkJLyogbGVhdmUgdGltZXIgaW50ZXJ2YWwgImFzIGlzIiBpZiBhbHJlYWR5IGF0IGEgIm5vcm1hbCIgcmF0ZSAqLworCX0gZWxzZSB7CisJCXJlcS0+dGltZXJfaW50diAqPSAyOworCQlpZiAocmVxLT50aW1lcl9pbnR2ID4gVElQQ19MSU5LX1JFUV9TTE9XKQorCQkJcmVxLT50aW1lcl9pbnR2ID0gVElQQ19MSU5LX1JFUV9TTE9XOworCQlpZiAoKHJlcS0+dGltZXJfaW50diA9PSBUSVBDX0xJTktfUkVRX0ZBU1QpICYmIAorCQkgICAgKHJlcS0+YmVhcmVyLT5ub2Rlcy5jb3VudCkpCisJCQlyZXEtPnRpbWVyX2ludHYgPSBUSVBDX0xJTktfUkVRX1NMT1c7CisJfQorCWtfc3RhcnRfdGltZXIoJnJlcS0+dGltZXIsIHJlcS0+dGltZXJfaW50dik7CisKKwlzcGluX3VubG9ja19iaCgmcmVxLT5iZWFyZXItPnB1YmwubG9jayk7Cit9CisKKy8qKgorICogZGlzY19pbml0X2xpbmtfcmVxIC0gc3RhcnQgc2VuZGluZyBwZXJpb2RpYyBsaW5rIHNldHVwIHJlcXVlc3RzCisgKiBAYl9wdHI6IHB0ciB0byBiZWFyZXIgaXNzdWluZyByZXF1ZXN0cworICogQGRlc3Q6IGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHJlcXVlc3QgbWVzc2FnZXMKKyAqIEBkZXN0X2RvbWFpbjogbmV0d29yayBkb21haW4gb2Ygbm9kZShzKSB3aGljaCBzaG91bGQgcmVzcG9uZCB0byBtZXNzYWdlCisgKiBAcmVxX2xpbmtzOiBtYXggbnVtYmVyIG9mIGRlc2lyZWQgbGlua3MKKyAqIAorICogUmV0dXJucyBwb2ludGVyIHRvIGxpbmsgcmVxdWVzdCBzdHJ1Y3R1cmUsIG9yIE5VTEwgaWYgdW5hYmxlIHRvIGNyZWF0ZS4KKyAqLworCitzdHJ1Y3QgbGlua19yZXEgKmRpc2NfaW5pdF9saW5rX3JlcShzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgCisJCQkJICAgIGNvbnN0IHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmRlc3QsCisJCQkJICAgIHUzMiBkZXN0X2RvbWFpbiwKKwkJCQkgICAgdTMyIHJlcV9saW5rcykgCit7CisJc3RydWN0IGxpbmtfcmVxICpyZXE7CisKKwlyZXEgPSAoc3RydWN0IGxpbmtfcmVxICopa21hbGxvYyhzaXplb2YoKnJlcSksIEdGUF9BVE9NSUMpOworCWlmICghcmVxKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcS0+YnVmID0gZGlzY19pbml0X21zZyhEU0NfUkVRX01TRywgcmVxX2xpbmtzLCBkZXN0X2RvbWFpbiwgYl9wdHIpOworCWlmICghcmVxLT5idWYpIHsKKwkJa2ZyZWUocmVxKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtY3B5KCZyZXEtPmRlc3QsIGRlc3QsIHNpemVvZigqZGVzdCkpOworCXJlcS0+YmVhcmVyID0gYl9wdHI7CisJcmVxLT50aW1lcl9pbnR2ID0gVElQQ19MSU5LX1JFUV9JTklUOworCWtfaW5pdF90aW1lcigmcmVxLT50aW1lciwgKEhhbmRsZXIpZGlzY190aW1lb3V0LCAodW5zaWduZWQgbG9uZylyZXEpOworCWtfc3RhcnRfdGltZXIoJnJlcS0+dGltZXIsIHJlcS0+dGltZXJfaW50dik7CisJcmV0dXJuIHJlcTsKK30gCisKZGlmZiAtLWdpdCBhL25ldC90aXBjL2Rpc2NvdmVyLmggYi9uZXQvdGlwYy9kaXNjb3Zlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNjExNGQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9kaXNjb3Zlci5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBuZXQvdGlwYy9kaXNjb3Zlci5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19ESVNDT1ZFUl9ICisjZGVmaW5lIF9USVBDX0RJU0NPVkVSX0gKKworI2luY2x1ZGUgPGxpbnV4L3RpcGMuaD4KKworc3RydWN0IGxpbmtfcmVxOworCitzdHJ1Y3QgbGlua19yZXEgKmRpc2NfaW5pdF9saW5rX3JlcShzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgCisJCQkgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpkZXN0LAorCQkJICAgICAgICAgICAgdTMyIGRlc3RfZG9tYWluLAorCQkJICAgICAgICAgICAgdTMyIHJlcV9saW5rcyk7Cit2b2lkIGRpc2NfdXBkYXRlX2xpbmtfcmVxKHN0cnVjdCBsaW5rX3JlcSAqcmVxKTsKK3ZvaWQgZGlzY19zdG9wX2xpbmtfcmVxKHN0cnVjdCBsaW5rX3JlcSAqcmVxKTsKKwordm9pZCBkaXNjX3JlY3ZfbXNnKHN0cnVjdCBza19idWZmICpidWYpOworCit2b2lkIGRpc2NfbGlua19ldmVudCh1MzIgYWRkciwgY2hhciAqbmFtZSwgaW50IHVwKTsKKyNpZiAwCitpbnQgIGRpc2NfY3JlYXRlX2xpbmsoY29uc3Qgc3RydWN0IHRpcGNfbGlua19jcmVhdGUgKmFyZ3YpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZXRoX21lZGlhLmMgYi9uZXQvdGlwYy9ldGhfbWVkaWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQwNDYyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvZXRoX21lZGlhLmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBuZXQvdGlwYy9ldGhfbWVkaWEuYzogRXRoZXJuZXQgYmVhcmVyIHN1cHBvcnQgZm9yIFRJUEMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG5ldC90aXBjL3RpcGMuaD4KKyNpbmNsdWRlIDxuZXQvdGlwYy90aXBjX2JlYXJlci5oPgorI2luY2x1ZGUgPG5ldC90aXBjL3RpcGNfbXNnLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjZGVmaW5lIE1BWF9FVEhfQkVBUkVSUwkJMgorI2RlZmluZSBUSVBDX1BST1RPQ09MCQkweDg4Y2EKKyNkZWZpbmUgRVRIX0xJTktfUFJJT1JJVFkJMTAKKyNkZWZpbmUgRVRIX0xJTktfVE9MRVJBTkNFCVRJUENfREVGX0xJTktfVE9MCisKKworLyoqCisgKiBzdHJ1Y3QgZXRoX2JlYXJlciAtIEV0aGVybmV0IGJlYXJlciBkYXRhIHN0cnVjdHVyZQorICogQGJlYXJlcjogcHRyIHRvIGFzc29jaWF0ZWQgImdlbmVyaWMiIGJlYXJlciBzdHJ1Y3R1cmUKKyAqIEBkZXY6IHB0ciB0byBhc3NvY2lhdGVkIEV0aGVybmV0IG5ldHdvcmsgZGV2aWNlCisgKiBAdGlwY19wYWNrZXRfdHlwZTogdXNlZCBpbiBiaW5kaW5nIFRJUEMgdG8gRXRoZXJuZXQgZHJpdmVyCisgKi8KKyAKK3N0cnVjdCBldGhfYmVhcmVyIHsKKwlzdHJ1Y3QgdGlwY19iZWFyZXIgKmJlYXJlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBwYWNrZXRfdHlwZSB0aXBjX3BhY2tldF90eXBlOworfTsKKworc3RhdGljIHN0cnVjdCBldGhfYmVhcmVyIGV0aF9iZWFyZXJzW01BWF9FVEhfQkVBUkVSU107CitzdGF0aWMgaW50IGV0aF9zdGFydGVkID0gMDsKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbm90aWZpZXI7CisKKy8qKgorICogc2VuZF9tc2cgLSBzZW5kIGEgVElQQyBtZXNzYWdlIG91dCBvdmVyIGFuIEV0aGVybmV0IGludGVyZmFjZSAKKyAqLworCitzdGF0aWMgaW50IHNlbmRfbXNnKHN0cnVjdCBza19idWZmICpidWYsIHN0cnVjdCB0aXBjX2JlYXJlciAqdGJfcHRyLCAKKwkJICAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmRlc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKmNsb25lOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwljbG9uZSA9IHNrYl9jbG9uZShidWYsIEdGUF9BVE9NSUMpOworCWlmIChjbG9uZSkgeworCQljbG9uZS0+bmgucmF3ID0gY2xvbmUtPmRhdGE7CisJCWRldiA9ICgoc3RydWN0IGV0aF9iZWFyZXIgKikodGJfcHRyLT51c3JfaGFuZGxlKSktPmRldjsKKwkJY2xvbmUtPmRldiA9IGRldjsKKwkJZGV2LT5oYXJkX2hlYWRlcihjbG9uZSwgZGV2LCBUSVBDX1BST1RPQ09MLCAKKwkJCQkgJmRlc3QtPmRldl9hZGRyLmV0aF9hZGRyLAorCQkJCSBkZXYtPmRldl9hZGRyLCBjbG9uZS0+bGVuKTsKKwkJZGV2X3F1ZXVlX3htaXQoY2xvbmUpOworCX0KKwlyZXR1cm4gVElQQ19PSzsKK30KKworLyoqCisgKiByZWN2X21zZyAtIGhhbmRsZSBpbmNvbWluZyBUSVBDIG1lc3NhZ2UgZnJvbSBhbiBFdGhlcm5ldCBpbnRlcmZhY2UKKyAqIAorICogUm91dGluZSB0cnVuY2F0ZXMgYW55IEV0aGVybmV0IHBhZGRpbmcvQ1JDIGFwcGVuZGVkIHRvIHRoZSBtZXNzYWdlLAorICogYW5kIGVuc3VyZXMgbWVzc2FnZSBzaXplIG1hdGNoZXMgYWN0dWFsIGxlbmd0aAorICovCisKK3N0YXRpYyBpbnQgcmVjdl9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJCSAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCit7CisJc3RydWN0IGV0aF9iZWFyZXIgKmViX3B0ciA9IChzdHJ1Y3QgZXRoX2JlYXJlciAqKXB0LT5hZl9wYWNrZXRfcHJpdjsKKwl1MzIgc2l6ZTsKKworCWlmIChsaWtlbHkoZWJfcHRyLT5iZWFyZXIpKSB7CisJCXNpemUgPSBtc2dfc2l6ZSgoc3RydWN0IHRpcGNfbXNnICopYnVmLT5kYXRhKTsKKwkJc2tiX3RyaW0oYnVmLCBzaXplKTsKKwkJaWYgKGxpa2VseShidWYtPmxlbiA9PSBzaXplKSkgeworCQkJYnVmLT5uZXh0ID0gTlVMTDsKKwkJCXRpcGNfcmVjdl9tc2coYnVmLCBlYl9wdHItPmJlYXJlcik7CisJCX0gZWxzZSB7CisJCQlrZnJlZV9za2IoYnVmKTsKKwkJfQorCX0gZWxzZSB7CisJCWtmcmVlX3NrYihidWYpOworCX0KKwlyZXR1cm4gVElQQ19PSzsKK30KKworLyoqCisgKiBlbmFibGVfYmVhcmVyIC0gYXR0YWNoIFRJUEMgYmVhcmVyIHRvIGFuIEV0aGVybmV0IGludGVyZmFjZSAKKyAqLworCitzdGF0aWMgaW50IGVuYWJsZV9iZWFyZXIoc3RydWN0IHRpcGNfYmVhcmVyICp0Yl9wdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9iYXNlOworCXN0cnVjdCBldGhfYmVhcmVyICplYl9wdHIgPSAmZXRoX2JlYXJlcnNbMF07CisJc3RydWN0IGV0aF9iZWFyZXIgKnN0b3AgPSAmZXRoX2JlYXJlcnNbTUFYX0VUSF9CRUFSRVJTXTsKKwljaGFyICpkcml2ZXJfbmFtZSA9IHN0cmNocigoY29uc3QgY2hhciAqKXRiX3B0ci0+bmFtZSwgJzonKSArIDE7CisKKwkvKiBGaW5kIGRldmljZSB3aXRoIHNwZWNpZmllZCBuYW1lICovCisKKwl3aGlsZSAoZGV2ICYmIGRldi0+bmFtZSAmJgorCSAgICAgICAobWVtY21wKGRldi0+bmFtZSwgZHJpdmVyX25hbWUsIHN0cmxlbihkZXYtPm5hbWUpKSkpIHsKKwkJZGV2ID0gZGV2LT5uZXh0OworCX0KKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBGaW5kIEV0aGVybmV0IGJlYXJlciBmb3IgZGV2aWNlIChvciBjcmVhdGUgb25lKSAqLworCisJZm9yICg7KGViX3B0ciAhPSBzdG9wKSAmJiBlYl9wdHItPmRldiAmJiAoZWJfcHRyLT5kZXYgIT0gZGV2KTsgZWJfcHRyKyspOworCWlmIChlYl9wdHIgPT0gc3RvcCkKKwkJcmV0dXJuIC1FRFFVT1Q7CisJaWYgKCFlYl9wdHItPmRldikgeworCQllYl9wdHItPmRldiA9IGRldjsKKwkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLnR5cGUgPSBfX2NvbnN0YW50X2h0b25zKFRJUENfUFJPVE9DT0wpOworCQllYl9wdHItPnRpcGNfcGFja2V0X3R5cGUuZGV2ID0gZGV2OworCQllYl9wdHItPnRpcGNfcGFja2V0X3R5cGUuZnVuYyA9IHJlY3ZfbXNnOworCQllYl9wdHItPnRpcGNfcGFja2V0X3R5cGUuYWZfcGFja2V0X3ByaXYgPSBlYl9wdHI7CisJCUlOSVRfTElTVF9IRUFEKCYoZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmxpc3QpKTsKKwkJZGV2X2hvbGQoZGV2KTsKKwkJZGV2X2FkZF9wYWNrKCZlYl9wdHItPnRpcGNfcGFja2V0X3R5cGUpOworCX0KKworCS8qIEFzc29jaWF0ZSBUSVBDIGJlYXJlciB3aXRoIEV0aGVybmV0IGJlYXJlciAqLworCisJZWJfcHRyLT5iZWFyZXIgPSB0Yl9wdHI7CisJdGJfcHRyLT51c3JfaGFuZGxlID0gKHZvaWQgKillYl9wdHI7CisJdGJfcHRyLT5tdHUgPSBkZXYtPm10dTsKKwl0Yl9wdHItPmJsb2NrZWQgPSAwOyAKKwl0Yl9wdHItPmFkZHIudHlwZSA9IGh0b25sKFRJUENfTUVESUFfVFlQRV9FVEgpOworCW1lbWNweSgmdGJfcHRyLT5hZGRyLmRldl9hZGRyLCAmZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCXJldHVybiAwOworfQorCisvKioKKyAqIGRpc2FibGVfYmVhcmVyIC0gZGV0YWNoIFRJUEMgYmVhcmVyIGZyb20gYW4gRXRoZXJuZXQgaW50ZXJmYWNlIAorICoKKyAqIFdlIHJlYWxseSBzaG91bGQgZG8gZGV2X3JlbW92ZV9wYWNrKCkgaGVyZSwgYnV0IHRoaXMgZnVuY3Rpb24gY2FuIG5vdCBiZQorICogY2FsbGVkIGF0IHRhc2tsZXQgbGV2ZWwuID0+IFVzZSBldGhfYmVhcmVyLT5iZWFyZXIgYXMgYSBmbGFnIHRvIHRocm93IGF3YXkKKyAqIGluY29taW5nIGJ1ZmZlcnMsICYgcG9zdHBvbmUgZGV2X3JlbW92ZV9wYWNrKCkgdG8gZXRoX21lZGlhX3N0b3AoKSBvbiBleGl0LgorICovCisKK3N0YXRpYyB2b2lkIGRpc2FibGVfYmVhcmVyKHN0cnVjdCB0aXBjX2JlYXJlciAqdGJfcHRyKQoreworCSgoc3RydWN0IGV0aF9iZWFyZXIgKil0Yl9wdHItPnVzcl9oYW5kbGUpLT5iZWFyZXIgPSAwOworfQorCisvKioKKyAqIHJlY3Zfbm90aWZpY2F0aW9uIC0gaGFuZGxlIGRldmljZSB1cGRhdGVzIGZyb20gT1MKKyAqCisgKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBFdGhlcm5ldCBiZWFyZXIgKGlmIGFueSkgYXNzb2NpYXRlZCB3aXRoIHRoZSAKKyAqIHNwZWNpZmllZCBkZXZpY2UuCisgKi8KKworc3RhdGljIGludCByZWN2X25vdGlmaWNhdGlvbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGV2dCwgCisJCQkgICAgIHZvaWQgKmR2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkdjsKKwlzdHJ1Y3QgZXRoX2JlYXJlciAqZWJfcHRyID0gJmV0aF9iZWFyZXJzWzBdOworCXN0cnVjdCBldGhfYmVhcmVyICpzdG9wID0gJmV0aF9iZWFyZXJzW01BWF9FVEhfQkVBUkVSU107CisKKwl3aGlsZSAoKGViX3B0ci0+ZGV2ICE9IGRldikpIHsKKwkJaWYgKCsrZWJfcHRyID09IHN0b3ApCisJCQlyZXR1cm4gTk9USUZZX0RPTkU7CS8qIGNvdWxkbid0IGZpbmQgZGV2aWNlICovCisJfQorCWlmICghZWJfcHRyLT5iZWFyZXIpCisJCXJldHVybiBOT1RJRllfRE9ORTsJCS8qIGJlYXJlciBoYWQgYmVlbiBkaXNhYmxlZCAqLworCisgICAgICAgIGViX3B0ci0+YmVhcmVyLT5tdHUgPSBkZXYtPm10dTsKKworCXN3aXRjaCAoZXZ0KSB7CisJY2FzZSBORVRERVZfQ0hBTkdFOgorCQlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQkJdGlwY19jb250aW51ZShlYl9wdHItPmJlYXJlcik7CisJCWVsc2UKKwkJCXRpcGNfYmxvY2tfYmVhcmVyKGViX3B0ci0+YmVhcmVyLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfVVA6CisJCXRpcGNfY29udGludWUoZWJfcHRyLT5iZWFyZXIpOworCQlicmVhazsKKwljYXNlIE5FVERFVl9ET1dOOgorCQl0aXBjX2Jsb2NrX2JlYXJlcihlYl9wdHItPmJlYXJlci0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX0NIQU5HRU1UVToKKyAgICAgICAgY2FzZSBORVRERVZfQ0hBTkdFQUREUjoKKwkJdGlwY19ibG9ja19iZWFyZXIoZWJfcHRyLT5iZWFyZXItPm5hbWUpOworICAgICAgICAgICAgICAgIHRpcGNfY29udGludWUoZWJfcHRyLT5iZWFyZXIpOworCQlicmVhazsKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIE5FVERFVl9DSEFOR0VOQU1FOgorCQl0aXBjX2Rpc2FibGVfYmVhcmVyKGViX3B0ci0+YmVhcmVyLT5uYW1lKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfT0s7Cit9CisKKy8qKgorICogZXRoX2FkZHIyc3RyIC0gY29udmVydCBFdGhlcm5ldCBhZGRyZXNzIHRvIHN0cmluZworICovCisKK3N0YXRpYyBjaGFyICpldGhfYWRkcjJzdHIoc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSwgY2hhciAqc3RyX2J1ZiwgaW50IHN0cl9zaXplKQoreyAgICAgICAgICAgICAgICAgICAgICAgCisJdW5jaGFyICphZGRyID0gKHVuY2hhciAqKSZhLT5kZXZfYWRkcjsKKworCWlmIChzdHJfc2l6ZSA8IDE4KQorCQkqc3RyX2J1ZiA9ICdcMCc7CisJZWxzZQorCQlzcHJpbnRmKHN0cl9idWYsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQlhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKwlyZXR1cm4gc3RyX2J1ZjsKK30KKworLyoqCisgKiBldGhfbWVkaWFfc3RhcnQgLSBhY3RpdmF0ZSBFdGhlcm5ldCBiZWFyZXIgc3VwcG9ydAorICoKKyAqIFJlZ2lzdGVyIEV0aGVybmV0IG1lZGlhIHR5cGUgd2l0aCBUSVBDIGJlYXJlciBjb2RlLiAgQWxzbyByZWdpc3RlcgorICogd2l0aCBPUyBmb3Igbm90aWZpY2F0aW9ucyBhYm91dCBkZXZpY2Ugc3RhdGUgY2hhbmdlcy4KKyAqLworCitpbnQgZXRoX21lZGlhX3N0YXJ0KHZvaWQpCit7ICAgICAgICAgICAgICAgICAgICAgICAKKwlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIGJjYXN0X2FkZHI7CisJaW50IHJlczsKKworCWlmIChldGhfc3RhcnRlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJmJjYXN0X2FkZHIsIDB4ZmYsIHNpemVvZihiY2FzdF9hZGRyKSk7CisJbWVtc2V0KGV0aF9iZWFyZXJzLCAwLCBzaXplb2YoZXRoX2JlYXJlcnMpKTsKKworCXJlcyA9IHRpcGNfcmVnaXN0ZXJfbWVkaWEoVElQQ19NRURJQV9UWVBFX0VUSCwgImV0aCIsCisJCQkJICBlbmFibGVfYmVhcmVyLCBkaXNhYmxlX2JlYXJlciwgc2VuZF9tc2csIAorCQkJCSAgZXRoX2FkZHIyc3RyLCAmYmNhc3RfYWRkciwgRVRIX0xJTktfUFJJT1JJVFksIAorCQkJCSAgRVRIX0xJTktfVE9MRVJBTkNFLCBUSVBDX0RFRl9MSU5LX1dJTik7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCW5vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSAmcmVjdl9ub3RpZmljYXRpb247CisJbm90aWZpZXIucHJpb3JpdHkgPSAwOworCXJlcyA9IHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbm90aWZpZXIpOworCWlmICghcmVzKQorCQlldGhfc3RhcnRlZCA9IDE7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBldGhfbWVkaWFfc3RvcCAtIGRlYWN0aXZhdGUgRXRoZXJuZXQgYmVhcmVyIHN1cHBvcnQKKyAqLworCit2b2lkIGV0aF9tZWRpYV9zdG9wKHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoIWV0aF9zdGFydGVkKQorCQlyZXR1cm47CisKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbm90aWZpZXIpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfRVRIX0JFQVJFUlMgOyBpKyspIHsKKwkJaWYgKGV0aF9iZWFyZXJzW2ldLmJlYXJlcikgeworCQkJZXRoX2JlYXJlcnNbaV0uYmVhcmVyLT5ibG9ja2VkID0gMTsKKwkJCWV0aF9iZWFyZXJzW2ldLmJlYXJlciA9IDA7CisJCX0KKwkJaWYgKGV0aF9iZWFyZXJzW2ldLmRldikgeworCQkJZGV2X3JlbW92ZV9wYWNrKCZldGhfYmVhcmVyc1tpXS50aXBjX3BhY2tldF90eXBlKTsKKwkJCWRldl9wdXQoZXRoX2JlYXJlcnNbaV0uZGV2KTsKKwkJfQorCX0KKwltZW1zZXQoJmV0aF9iZWFyZXJzLCAwLCBzaXplb2YoZXRoX2JlYXJlcnMpKTsKKwlldGhfc3RhcnRlZCA9IDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9oYW5kbGVyLmMgYi9uZXQvdGlwYy9oYW5kbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyMDAxMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2hhbmRsZXIuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIG5ldC90aXBjL2hhbmRsZXIuYzogVElQQyBzaWduYWwgaGFuZGxpbmcKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKworc3RydWN0IHF1ZXVlX2l0ZW0geworCXN0cnVjdCBsaXN0X2hlYWQgbmV4dF9zaWduYWw7CisJdm9pZCAoKmhhbmRsZXIpICh1bnNpZ25lZCBsb25nKTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7Cit9OworCitzdGF0aWMga21lbV9jYWNoZV90ICp0aXBjX3F1ZXVlX2l0ZW1fY2FjaGU7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzaWduYWxfcXVldWVfaGVhZDsKK3N0YXRpYyBzcGlubG9ja190IHFpdGVtX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgaW50IGhhbmRsZXJfZW5hYmxlZCA9IDA7CisKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfc2lnbmFsX3F1ZXVlKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworCitzdGF0aWMgREVDTEFSRV9UQVNLTEVUX0RJU0FCTEVEKHRpcGNfdGFza2xldCwgcHJvY2Vzc19zaWduYWxfcXVldWUsIDApOworCisKK3Vuc2lnbmVkIGludCBrX3NpZ25hbChIYW5kbGVyIHJvdXRpbmUsIHVuc2lnbmVkIGxvbmcgYXJndW1lbnQpCit7CisJc3RydWN0IHF1ZXVlX2l0ZW0gKml0ZW07CisKKwlpZiAoIWhhbmRsZXJfZW5hYmxlZCkgeworCQllcnIoIlNpZ25hbCByZXF1ZXN0IGlnbm9yZWQgYnkgaGFuZGxlclxuIik7CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZxaXRlbV9sb2NrKTsKKwlpdGVtID0ga21lbV9jYWNoZV9hbGxvYyh0aXBjX3F1ZXVlX2l0ZW1fY2FjaGUsIEdGUF9BVE9NSUMpOworCWlmICghaXRlbSkgeworCQllcnIoIlNpZ25hbCBxdWV1ZSBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnFpdGVtX2xvY2spOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaXRlbS0+aGFuZGxlciA9IHJvdXRpbmU7CisJaXRlbS0+ZGF0YSA9IGFyZ3VtZW50OworCWxpc3RfYWRkX3RhaWwoJml0ZW0tPm5leHRfc2lnbmFsLCAmc2lnbmFsX3F1ZXVlX2hlYWQpOworCXNwaW5fdW5sb2NrX2JoKCZxaXRlbV9sb2NrKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZ0aXBjX3Rhc2tsZXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3NpZ25hbF9xdWV1ZSh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCXN0cnVjdCBxdWV1ZV9pdGVtICpfX3ZvbGF0aWxlX18gaXRlbTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsLCAqbjsKKworCXNwaW5fbG9ja19iaCgmcWl0ZW1fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIG4sICZzaWduYWxfcXVldWVfaGVhZCkgeworCQlpdGVtID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgcXVldWVfaXRlbSwgbmV4dF9zaWduYWwpOworCQlsaXN0X2RlbCgmaXRlbS0+bmV4dF9zaWduYWwpOworCQlzcGluX3VubG9ja19iaCgmcWl0ZW1fbG9jayk7CisJCWl0ZW0tPmhhbmRsZXIoaXRlbS0+ZGF0YSk7CisJCXNwaW5fbG9ja19iaCgmcWl0ZW1fbG9jayk7CisJCWttZW1fY2FjaGVfZnJlZSh0aXBjX3F1ZXVlX2l0ZW1fY2FjaGUsIGl0ZW0pOworCX0KKwlzcGluX3VubG9ja19iaCgmcWl0ZW1fbG9jayk7Cit9CisKK2ludCBoYW5kbGVyX3N0YXJ0KHZvaWQpCit7CisJdGlwY19xdWV1ZV9pdGVtX2NhY2hlID0gCisJCWttZW1fY2FjaGVfY3JlYXRlKCJ0aXBjX3F1ZXVlX2l0ZW1zIiwgc2l6ZW9mKHN0cnVjdCBxdWV1ZV9pdGVtKSwKKwkJCQkgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCwgTlVMTCk7CisJaWYgKCF0aXBjX3F1ZXVlX2l0ZW1fY2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9MSVNUX0hFQUQoJnNpZ25hbF9xdWV1ZV9oZWFkKTsKKwl0YXNrbGV0X2VuYWJsZSgmdGlwY190YXNrbGV0KTsKKwloYW5kbGVyX2VuYWJsZWQgPSAxOworCXJldHVybiAwOworfQorCit2b2lkIGhhbmRsZXJfc3RvcCh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmwsICpuOworCXN0cnVjdCBxdWV1ZV9pdGVtICppdGVtOyAKKworCWlmICghaGFuZGxlcl9lbmFibGVkKQorCQlyZXR1cm47CisKKwloYW5kbGVyX2VuYWJsZWQgPSAwOworCXRhc2tsZXRfZGlzYWJsZSgmdGlwY190YXNrbGV0KTsKKwl0YXNrbGV0X2tpbGwoJnRpcGNfdGFza2xldCk7CisKKwlzcGluX2xvY2tfYmgoJnFpdGVtX2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBuLCAmc2lnbmFsX3F1ZXVlX2hlYWQpIHsKKwkJaXRlbSA9IGxpc3RfZW50cnkobCwgc3RydWN0IHF1ZXVlX2l0ZW0sIG5leHRfc2lnbmFsKTsKKwkJbGlzdF9kZWwoJml0ZW0tPm5leHRfc2lnbmFsKTsKKwkJa21lbV9jYWNoZV9mcmVlKHRpcGNfcXVldWVfaXRlbV9jYWNoZSwgaXRlbSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZxaXRlbV9sb2NrKTsKKworCWttZW1fY2FjaGVfZGVzdHJveSh0aXBjX3F1ZXVlX2l0ZW1fY2FjaGUpOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9saW5rLmMgYi9uZXQvdGlwYy9saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2NWY0YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2xpbmsuYwpAQCAtMCwwICsxLDMxNjcgQEAKKy8qCisgKiBuZXQvdGlwYy9saW5rLmM6IFRJUEMgbGluayBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAibmV0LmgiCisjaW5jbHVkZSAibm9kZS5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAibm9kZV9zdWJzY3IuaCIKKyNpbmNsdWRlICJuYW1lX2Rpc3RyLmgiCisjaW5jbHVkZSAiYmVhcmVyLmgiCisjaW5jbHVkZSAibmFtZV90YWJsZS5oIgorI2luY2x1ZGUgImRpc2NvdmVyLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiYmNhc3QuaCIKKworCisvKiAKKyAqIExpbWl0IGZvciBkZWZlcnJlZCByZWNlcHRpb24gcXVldWU6IAorICovCisKKyNkZWZpbmUgREVGX1FVRVVFX0xJTUlUIDI1NnUKKworLyogCisgKiBMaW5rIHN0YXRlIGV2ZW50czogCisgKi8KKworI2RlZmluZSAgU1RBUlRJTkdfRVZUICAgIDg1NjM4NDc2OAkvKiBsaW5rIHByb2Nlc3NpbmcgdHJpZ2dlciAqLworI2RlZmluZSAgVFJBRkZJQ19NU0dfRVZUIDU2MDgxNXUJLyogcngnZCA/Pz8gKi8KKyNkZWZpbmUgIFRJTUVPVVRfRVZUICAgICA1NjA4MTd1CS8qIGxpbmsgdGltZXIgZXhwaXJlZCAqLworCisvKiAgIAorICogVGhlIGZvbGxvd2luZyB0d28gJ21lc3NhZ2UgdHlwZXMnIGlzIHJlYWxseSBqdXN0IGltcGxlbWVudGF0aW9uIAorICogZGF0YSBjb252ZW5pZW50bHkgc3RvcmVkIGluIHRoZSBtZXNzYWdlIGhlYWRlci4gCisgKiBUaGV5IG11c3Qgbm90IGJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgcHJvdG9jb2wKKyAqLworI2RlZmluZSBPUEVOX01TRyAgIDAKKyNkZWZpbmUgQ0xPU0VEX01TRyAxCisKKy8qIAorICogU3RhdGUgdmFsdWUgc3RvcmVkIGluICdleHBfbXNnX2NvdW50JworICovCisKKyNkZWZpbmUgU1RBUlRfQ0hBTkdFT1ZFUiAxMDAwMDB1CisKKy8qKgorICogc3RydWN0IGxpbmtfbmFtZSAtIGRlY29uc3RydWN0ZWQgbGluayBuYW1lCisgKiBAYWRkcl9sb2NhbDogbmV0d29yayBhZGRyZXNzIG9mIG5vZGUgYXQgdGhpcyBlbmQKKyAqIEBpZl9sb2NhbDogbmFtZSBvZiBpbnRlcmZhY2UgYXQgdGhpcyBlbmQKKyAqIEBhZGRyX3BlZXI6IG5ldHdvcmsgYWRkcmVzcyBvZiBub2RlIGF0IGZhciBlbmQKKyAqIEBpZl9wZWVyOiBuYW1lIG9mIGludGVyZmFjZSBhdCBmYXIgZW5kCisgKi8KKworc3RydWN0IGxpbmtfbmFtZSB7CisJdTMyIGFkZHJfbG9jYWw7CisJY2hhciBpZl9sb2NhbFtUSVBDX01BWF9JRl9OQU1FXTsKKwl1MzIgYWRkcl9wZWVyOworCWNoYXIgaWZfcGVlcltUSVBDX01BWF9JRl9OQU1FXTsKK307CisKKyNpZiAwCisKKy8qIExJTksgRVZFTlQgQ09ERSBJUyBOT1QgU1VQUE9SVEVEIEFUIFBSRVNFTlQgKi8KKworLyoqIAorICogc3RydWN0IGxpbmtfZXZlbnQgLSBsaW5rIHVwL2Rvd24gZXZlbnQgbm90aWZpY2F0aW9uCisgKi8KKworc3RydWN0IGxpbmtfZXZlbnQgeworCXUzMiBhZGRyOworCWludCB1cDsKKwl2b2lkICgqZmNuKSh1MzIsIGNoYXIgKiwgaW50KTsKKwljaGFyIG5hbWVbVElQQ19NQVhfTElOS19OQU1FXTsKK307CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBsaW5rX2hhbmRsZV9vdXRfb2Zfc2VxX21zZyhzdHJ1Y3QgbGluayAqbF9wdHIsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpidWYpOworc3RhdGljIHZvaWQgbGlua19yZWN2X3Byb3RvX21zZyhzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBza19idWZmICpidWYpOworc3RhdGljIGludCAgbGlua19yZWN2X2NoYW5nZW92ZXJfbXNnKHN0cnVjdCBsaW5rICoqbF9wdHIsIHN0cnVjdCBza19idWZmICoqYnVmKTsKK3N0YXRpYyB2b2lkIGxpbmtfc2V0X3N1cGVydmlzaW9uX3Byb3BzKHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIHRvbGVyYW5jZSk7CitzdGF0aWMgaW50ICBsaW5rX3NlbmRfc2VjdGlvbnNfbG9uZyhzdHJ1Y3QgcG9ydCAqc2VuZGVyLAorCQkJCSAgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LAorCQkJCSAgICB1MzIgbnVtX3NlY3QsIHUzMiBkZXN0bm9kZSk7CitzdGF0aWMgdm9pZCBsaW5rX2NoZWNrX2RlZnJhZ21fYnVmcyhzdHJ1Y3QgbGluayAqbF9wdHIpOworc3RhdGljIHZvaWQgbGlua19zdGF0ZV9ldmVudChzdHJ1Y3QgbGluayAqbF9wdHIsIHUzMiBldmVudCk7CitzdGF0aWMgdm9pZCBsaW5rX3Jlc2V0X3N0YXRpc3RpY3Moc3RydWN0IGxpbmsgKmxfcHRyKTsKK3N0YXRpYyB2b2lkIGxpbmtfcHJpbnQoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3QgcHJpbnRfYnVmICpidWYsIAorCQkgICAgICAgY29uc3QgY2hhciAqc3RyKTsKKworLyoKKyAqIERlYnVnZ2luZyBjb2RlIHVzZWQgYnkgbGluayByb3V0aW5lcyBvbmx5CisgKgorICogV2hlbiBkZWJ1Z2dpbmcgbGluayBwcm9ibGVtcyBvbiBhIHN5c3RlbSB0aGF0IGhhcyBtdWx0aXBsZSBsaW5rcywKKyAqIHRoZSBzdGFuZGFyZCBUSVBDIGRlYnVnZ2luZyByb3V0aW5lcyBtYXkgbm90IGJlIHVzZWZ1bCBzaW5jZSB0aGV5CisgKiBhbGxvdyB0aGUgb3V0cHV0IGZyb20gbXVsdGlwbGUgbGlua3MgdG8gYmUgaW50ZXJtaXhlZC4gIEZvciB0aGlzIHJlYXNvbgorICogcm91dGluZXMgb2YgdGhlIGZvcm0gImRiZ19saW5rX1hYWCgpIiBoYXZlIGJlZW4gY3JlYXRlZCB0aGF0IHdpbGwgY2FwdHVyZQorICogZGVidWcgaW5mbyBpbnRvIGEgbGluaydzIHBlcnNvbmFsIHByaW50IGJ1ZmZlciwgd2hpY2ggY2FuIHRoZW4gYmUgZHVtcGVkCisgKiBpbnRvIHRoZSBUSVBDIHN5c3RlbSBsb2cgKExPRykgdXBvbiByZXF1ZXN0LgorICoKKyAqIFRvIGVuYWJsZSBwZXItbGluayBkZWJ1Z2dpbmcsIHVzZSBMSU5LX0xPR19CVUZfU0laRSB0byBzcGVjaWZ5IHRoZSBzaXplCisgKiBvZiB0aGUgcHJpbnQgYnVmZmVyIHVzZWQgYnkgZWFjaCBsaW5rLiAgSWYgTElOS19MT0dfQlVGX1NJWkUgaXMgc2V0IHRvIDAsCisgKiB0aGUgZGJnX2xpbmtfWFhYKCkgcm91dGluZXMgc2ltcGx5IHNlbmQgdGhlaXIgb3V0cHV0IHRvIHRoZSBzdGFuZGFyZCAKKyAqIGRlYnVnIHByaW50IGJ1ZmZlciAoREJHX09VVFBVVCksIGlmIGl0IGhhcyBiZWVuIGRlZmluZWQ7IHRoaXMgY2FuIGJlIHVzZWZ1bAorICogd2hlbiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIGxpbmsgaW4gdGhlIHN5c3RlbSBiZWluZyBkZWJ1Z2dlZC4KKyAqCisgKiBOb3RlczoKKyAqIC0gV2hlbiBlbmFibGVkLCBMSU5LX0xPR19CVUZfU0laRSBzaG91bGQgYmUgc2V0IHRvIGF0IGxlYXN0IDEwMDAgKGJ5dGVzKQorICogLSAibF9wdHIiIG11c3QgYmUgdmFsaWQgd2hlbiB1c2luZyBkYmdfbGlua19YWFgoKSBtYWNyb3MgIAorICovCisKKyNkZWZpbmUgTElOS19MT0dfQlVGX1NJWkUgMAorCisjZGVmaW5lIGRiZ19saW5rKGZtdCwgYXJnLi4uKSAgZG8ge2lmIChMSU5LX0xPR19CVUZfU0laRSkgdGlwY19wcmludGYoJmxfcHRyLT5wcmludF9idWYsIGZtdCwgIyMgYXJnKTsgfSB3aGlsZSgwKQorI2RlZmluZSBkYmdfbGlua19tc2cobXNnLCB0eHQpIGRvIHtpZiAoTElOS19MT0dfQlVGX1NJWkUpIG1zZ19wcmludCgmbF9wdHItPnByaW50X2J1ZiwgbXNnLCB0eHQpOyB9IHdoaWxlKDApCisjZGVmaW5lIGRiZ19saW5rX3N0YXRlKHR4dCkgZG8ge2lmIChMSU5LX0xPR19CVUZfU0laRSkgbGlua19wcmludChsX3B0ciwgJmxfcHRyLT5wcmludF9idWYsIHR4dCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgZGJnX2xpbmtfZHVtcCgpIGRvIHsgXAorCWlmIChMSU5LX0xPR19CVUZfU0laRSkgeyBcCisJCXRpcGNfcHJpbnRmKExPRywgIlxuXG5EdW1waW5nIGxpbmsgPCVzPjpcbiIsIGxfcHRyLT5uYW1lKTsgXAorCQlwcmludGJ1Zl9tb3ZlKExPRywgJmxfcHRyLT5wcmludF9idWYpOyBcCisJfSBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGJnX3ByaW50X2xpbmsoc3RydWN0IGxpbmsgKmxfcHRyLCBjb25zdCBjaGFyICpzdHIpCit7CisJaWYgKERCR19PVVRQVVQpCisJCWxpbmtfcHJpbnQobF9wdHIsIERCR19PVVRQVVQsIHN0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYmdfcHJpbnRfYnVmX2NoYWluKHN0cnVjdCBza19idWZmICpyb290X2J1ZikKK3sKKwlpZiAoREJHX09VVFBVVCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gcm9vdF9idWY7CisKKwkJd2hpbGUgKGJ1ZikgeworCQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICJJbiBjaGFpbjogIik7CisJCQlidWYgPSBidWYtPm5leHQ7CisJCX0KKwl9Cit9CisKKy8qCisgKiAgU2ltcGxlIGlubGluZWQgbGluayByb3V0aW5lcworICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFsaWduKHVuc2lnbmVkIGludCBpKQoreworCXJldHVybiAoaSArIDMpICYgfjN1OworfQorCitzdGF0aWMgaW5saW5lIGludCBsaW5rX3dvcmtpbmdfd29ya2luZyhzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJcmV0dXJuIChsX3B0ci0+c3RhdGUgPT0gV09SS0lOR19XT1JLSU5HKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGlua193b3JraW5nX3Vua25vd24oc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXJldHVybiAobF9wdHItPnN0YXRlID09IFdPUktJTkdfVU5LTk9XTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmtfcmVzZXRfdW5rbm93bihzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJcmV0dXJuIChsX3B0ci0+c3RhdGUgPT0gUkVTRVRfVU5LTk9XTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmtfcmVzZXRfcmVzZXQoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXJldHVybiAobF9wdHItPnN0YXRlID09IFJFU0VUX1JFU0VUKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGlua19ibG9ja2VkKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlyZXR1cm4gKGxfcHRyLT5leHBfbXNnX2NvdW50IHx8IGxfcHRyLT5ibG9ja2VkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGlua19jb25nZXN0ZWQoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXJldHVybiAobF9wdHItPm91dF9xdWV1ZV9zaXplID49IGxfcHRyLT5xdWV1ZV9saW1pdFswXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGxpbmtfbWF4X3BrdChzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJcmV0dXJuIGxfcHRyLT5tYXhfcGt0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlua19pbml0X21heF9wa3Qoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXUzMiBtYXhfcGt0OworCQorCW1heF9wa3QgPSAobF9wdHItPmJfcHRyLT5wdWJsLm10dSAmIH4zKTsKKwlpZiAobWF4X3BrdCA+IE1BWF9NU0dfU0laRSkKKwkJbWF4X3BrdCA9IE1BWF9NU0dfU0laRTsKKworICAgICAgICBsX3B0ci0+bWF4X3BrdF90YXJnZXQgPSBtYXhfcGt0OworCWlmIChsX3B0ci0+bWF4X3BrdF90YXJnZXQgPCBNQVhfUEtUX0RFRkFVTFQpCisJCWxfcHRyLT5tYXhfcGt0ID0gbF9wdHItPm1heF9wa3RfdGFyZ2V0OworCWVsc2UgCisJCWxfcHRyLT5tYXhfcGt0ID0gTUFYX1BLVF9ERUZBVUxUOworCisgICAgICAgIGxfcHRyLT5tYXhfcGt0X3Byb2JlcyA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGxpbmtfbmV4dF9zZW50KHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlpZiAobF9wdHItPm5leHRfb3V0KQorCQlyZXR1cm4gbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPm5leHRfb3V0KSk7CisJcmV0dXJuIG1vZChsX3B0ci0+bmV4dF9vdXRfbm8pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBsaW5rX2xhc3Rfc2VudChzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJcmV0dXJuIG1vZChsaW5rX25leHRfc2VudChsX3B0cikgLSAxKTsKK30KKworLyoKKyAqICBTaW1wbGUgbm9uLWlubGluZWQgbGluayByb3V0aW5lcyAoaS5lLiByZWZlcmVuY2VkIG91dHNpZGUgdGhpcyBmaWxlKQorICovCisKK2ludCBsaW5rX2lzX3VwKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlpZiAoIWxfcHRyKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKGxpbmtfd29ya2luZ193b3JraW5nKGxfcHRyKSB8fCBsaW5rX3dvcmtpbmdfdW5rbm93bihsX3B0cikpOworfQorCitpbnQgbGlua19pc19hY3RpdmUoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXJldHVybiAoKGxfcHRyLT5vd25lci0+YWN0aXZlX2xpbmtzWzBdID09IGxfcHRyKSB8fAorCQkobF9wdHItPm93bmVyLT5hY3RpdmVfbGlua3NbMV0gPT0gbF9wdHIpKTsKK30KKworLyoqCisgKiBsaW5rX25hbWVfdmFsaWRhdGUgLSB2YWxpZGF0ZSAmIChvcHRpb25hbGx5KSBkZWNvbnN0cnVjdCBsaW5rIG5hbWUKKyAqIEBuYW1lIC0gcHRyIHRvIGxpbmsgbmFtZSBzdHJpbmcKKyAqIEBuYW1lX3BhcnRzIC0gcHRyIHRvIGFyZWEgZm9yIGxpbmsgbmFtZSBjb21wb25lbnRzIChvciBOVUxMIGlmIG5vdCBuZWVkZWQpCisgKiAKKyAqIFJldHVybnMgMSBpZiBsaW5rIG5hbWUgaXMgdmFsaWQsIG90aGVyd2lzZSAwLgorICovCisKK3N0YXRpYyBpbnQgbGlua19uYW1lX3ZhbGlkYXRlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBsaW5rX25hbWUgKm5hbWVfcGFydHMpCit7CisJY2hhciBuYW1lX2NvcHlbVElQQ19NQVhfTElOS19OQU1FXTsKKwljaGFyICphZGRyX2xvY2FsOworCWNoYXIgKmlmX2xvY2FsOworCWNoYXIgKmFkZHJfcGVlcjsKKwljaGFyICppZl9wZWVyOworCWNoYXIgZHVtbXk7CisJdTMyIHpfbG9jYWwsIGNfbG9jYWwsIG5fbG9jYWw7CisJdTMyIHpfcGVlciwgY19wZWVyLCBuX3BlZXI7CisJdTMyIGlmX2xvY2FsX2xlbjsKKwl1MzIgaWZfcGVlcl9sZW47CisKKwkvKiBjb3B5IGxpbmsgbmFtZSAmIGVuc3VyZSBsZW5ndGggaXMgT0sgKi8KKworCW5hbWVfY29weVtUSVBDX01BWF9MSU5LX05BTUUgLSAxXSA9IDA7CisJLyogbmVlZCBhYm92ZSBpbiBjYXNlIG5vbi1Qb3NpeCBzdHJuY3B5KCkgZG9lc24ndCBwYWQgd2l0aCBudWxscyAqLworCXN0cm5jcHkobmFtZV9jb3B5LCBuYW1lLCBUSVBDX01BWF9MSU5LX05BTUUpOworCWlmIChuYW1lX2NvcHlbVElQQ19NQVhfTElOS19OQU1FIC0gMV0gIT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBlbnN1cmUgYWxsIGNvbXBvbmVudCBwYXJ0cyBvZiBsaW5rIG5hbWUgYXJlIHByZXNlbnQgKi8KKworCWFkZHJfbG9jYWwgPSBuYW1lX2NvcHk7CisJaWYgKChpZl9sb2NhbCA9IHN0cmNocihhZGRyX2xvY2FsLCAnOicpKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwkqKGlmX2xvY2FsKyspID0gMDsKKwlpZiAoKGFkZHJfcGVlciA9IHN0cmNocihpZl9sb2NhbCwgJy0nKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJKihhZGRyX3BlZXIrKykgPSAwOworCWlmX2xvY2FsX2xlbiA9IGFkZHJfcGVlciAtIGlmX2xvY2FsOworCWlmICgoaWZfcGVlciA9IHN0cmNocihhZGRyX3BlZXIsICc6JykpID09IE5VTEwpCisJCXJldHVybiAwOworCSooaWZfcGVlcisrKSA9IDA7CisJaWZfcGVlcl9sZW4gPSBzdHJsZW4oaWZfcGVlcikgKyAxOworCisJLyogdmFsaWRhdGUgY29tcG9uZW50IHBhcnRzIG9mIGxpbmsgbmFtZSAqLworCisJaWYgKChzc2NhbmYoYWRkcl9sb2NhbCwgIiV1LiV1LiV1JWMiLAorCQkgICAgJnpfbG9jYWwsICZjX2xvY2FsLCAmbl9sb2NhbCwgJmR1bW15KSAhPSAzKSB8fAorCSAgICAoc3NjYW5mKGFkZHJfcGVlciwgIiV1LiV1LiV1JWMiLAorCQkgICAgJnpfcGVlciwgJmNfcGVlciwgJm5fcGVlciwgJmR1bW15KSAhPSAzKSB8fAorCSAgICAoel9sb2NhbCA+IDI1NSkgfHwgKGNfbG9jYWwgPiA0MDk1KSB8fCAobl9sb2NhbCA+IDQwOTUpIHx8CisJICAgICh6X3BlZXIgID4gMjU1KSB8fCAoY19wZWVyICA+IDQwOTUpIHx8IChuX3BlZXIgID4gNDA5NSkgfHwKKwkgICAgKGlmX2xvY2FsX2xlbiA8PSAxKSB8fCAoaWZfbG9jYWxfbGVuID4gVElQQ19NQVhfSUZfTkFNRSkgfHwgCisJICAgIChpZl9wZWVyX2xlbiAgPD0gMSkgfHwgKGlmX3BlZXJfbGVuICA+IFRJUENfTUFYX0lGX05BTUUpIHx8IAorCSAgICAoc3Ryc3BuKGlmX2xvY2FsLCB0aXBjX2FscGhhYmV0KSAhPSAoaWZfbG9jYWxfbGVuIC0gMSkpIHx8CisJICAgIChzdHJzcG4oaWZfcGVlciwgdGlwY19hbHBoYWJldCkgIT0gKGlmX3BlZXJfbGVuIC0gMSkpKQorCQlyZXR1cm4gMDsKKworCS8qIHJldHVybiBsaW5rIG5hbWUgY29tcG9uZW50cywgaWYgbmVjZXNzYXJ5ICovCisKKwlpZiAobmFtZV9wYXJ0cykgeworCQluYW1lX3BhcnRzLT5hZGRyX2xvY2FsID0gdGlwY19hZGRyKHpfbG9jYWwsIGNfbG9jYWwsIG5fbG9jYWwpOworCQlzdHJjcHkobmFtZV9wYXJ0cy0+aWZfbG9jYWwsIGlmX2xvY2FsKTsKKwkJbmFtZV9wYXJ0cy0+YWRkcl9wZWVyID0gdGlwY19hZGRyKHpfcGVlciwgY19wZWVyLCBuX3BlZXIpOworCQlzdHJjcHkobmFtZV9wYXJ0cy0+aWZfcGVlciwgaWZfcGVlcik7CisJfQorCXJldHVybiAxOworfQorCisvKioKKyAqIGxpbmtfdGltZW91dCAtIGhhbmRsZSBleHBpcmF0aW9uIG9mIGxpbmsgdGltZXIKKyAqIEBsX3B0cjogcG9pbnRlciB0byBsaW5rCisgKiAKKyAqIFRoaXMgcm91dGluZSBtdXN0IG5vdCBncmFiICJuZXRfbG9jayIgdG8gYXZvaWQgYSBwb3RlbnRpYWwgZGVhZGxvY2sgY29uZmxpY3QKKyAqIHdpdGggbGlua19kZWxldGUoKS4gIChUaGVyZSBpcyBubyByaXNrIHRoYXQgdGhlIG5vZGUgd2lsbCBiZSBkZWxldGVkIGJ5CisgKiBhbm90aGVyIHRocmVhZCBiZWNhdXNlIGxpbmtfZGVsZXRlKCkgYWx3YXlzIGNhbmNlbHMgdGhlIGxpbmsgdGltZXIgYmVmb3JlCisgKiBub2RlX2RlbGV0ZSgpIGlzIGNhbGxlZC4pCisgKi8KKworc3RhdGljIHZvaWQgbGlua190aW1lb3V0KHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlub2RlX2xvY2sobF9wdHItPm93bmVyKTsKKworCS8qIHVwZGF0ZSBjb3VudGVycyB1c2VkIGluIHN0YXRpc3RpY2FsIHByb2ZpbGluZyBvZiBzZW5kIHRyYWZmaWMgKi8KKworCWxfcHRyLT5zdGF0cy5hY2N1X3F1ZXVlX3N6ICs9IGxfcHRyLT5vdXRfcXVldWVfc2l6ZTsKKwlsX3B0ci0+c3RhdHMucXVldWVfc3pfY291bnRzKys7CisKKwlpZiAobF9wdHItPm91dF9xdWV1ZV9zaXplID4gbF9wdHItPnN0YXRzLm1heF9xdWV1ZV9zeikKKwkJbF9wdHItPnN0YXRzLm1heF9xdWV1ZV9zeiA9IGxfcHRyLT5vdXRfcXVldWVfc2l6ZTsKKworCWlmIChsX3B0ci0+Zmlyc3Rfb3V0KSB7CisJCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhsX3B0ci0+Zmlyc3Rfb3V0KTsKKwkJdTMyIGxlbmd0aCA9IG1zZ19zaXplKG1zZyk7CisKKwkJaWYgKChtc2dfdXNlcihtc2cpID09IE1TR19GUkFHTUVOVEVSKQorCQkgICAgJiYgKG1zZ190eXBlKG1zZykgPT0gRklSU1RfRlJBR01FTlQpKSB7CisJCQlsZW5ndGggPSBtc2dfc2l6ZShtc2dfZ2V0X3dyYXBwZWQobXNnKSk7CisJCX0KKwkJaWYgKGxlbmd0aCkgeworCQkJbF9wdHItPnN0YXRzLm1zZ19sZW5ndGhzX3RvdGFsICs9IGxlbmd0aDsKKwkJCWxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX2NvdW50cysrOworCQkJaWYgKGxlbmd0aCA8PSA2NCkKKwkJCQlsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzBdKys7CisJCQllbHNlIGlmIChsZW5ndGggPD0gMjU2KQorCQkJCWxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbMV0rKzsKKwkJCWVsc2UgaWYgKGxlbmd0aCA8PSAxMDI0KQorCQkJCWxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbMl0rKzsKKwkJCWVsc2UgaWYgKGxlbmd0aCA8PSA0MDk2KQorCQkJCWxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbM10rKzsKKwkJCWVsc2UgaWYgKGxlbmd0aCA8PSAxNjM4NCkKKwkJCQlsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzRdKys7CisJCQllbHNlIGlmIChsZW5ndGggPD0gMzI3NjgpCisJCQkJbF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVs1XSsrOworCQkJZWxzZQorCQkJCWxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbNl0rKzsKKwkJfQorCX0KKworCS8qIGRvIGFsbCBvdGhlciBsaW5rIHByb2Nlc3NpbmcgcGVyZm9ybWVkIG9uIGEgcGVyaW9kaWMgYmFzaXMgKi8KKworCWxpbmtfY2hlY2tfZGVmcmFnbV9idWZzKGxfcHRyKTsKKworCWxpbmtfc3RhdGVfZXZlbnQobF9wdHIsIFRJTUVPVVRfRVZUKTsKKworCWlmIChsX3B0ci0+bmV4dF9vdXQpCisJCWxpbmtfcHVzaF9xdWV1ZShsX3B0cik7CisKKwlub2RlX3VubG9jayhsX3B0ci0+b3duZXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlua19zZXRfdGltZXIoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgdGltZSkKK3sKKwlrX3N0YXJ0X3RpbWVyKCZsX3B0ci0+dGltZXIsIHRpbWUpOworfQorCisvKioKKyAqIGxpbmtfY3JlYXRlIC0gY3JlYXRlIGEgbmV3IGxpbmsKKyAqIEBiX3B0cjogcG9pbnRlciB0byBhc3NvY2lhdGVkIGJlYXJlcgorICogQHBlZXI6IG5ldHdvcmsgYWRkcmVzcyBvZiBub2RlIGF0IG90aGVyIGVuZCBvZiBsaW5rCisgKiBAbWVkaWFfYWRkcjogbWVkaWEgYWRkcmVzcyB0byB1c2Ugd2hlbiBzZW5kaW5nIG1lc3NhZ2VzIG92ZXIgbGluaworICogCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gbGluay4KKyAqLworCitzdHJ1Y3QgbGluayAqbGlua19jcmVhdGUoc3RydWN0IGJlYXJlciAqYl9wdHIsIGNvbnN0IHUzMiBwZWVyLAorCQkJIGNvbnN0IHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKm1lZGlhX2FkZHIpCit7CisJc3RydWN0IGxpbmsgKmxfcHRyOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCWNoYXIgKmlmX25hbWU7CisKKwlsX3B0ciA9IChzdHJ1Y3QgbGluayAqKWttYWxsb2Moc2l6ZW9mKCpsX3B0ciksIEdGUF9BVE9NSUMpOworCWlmICghbF9wdHIpIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU7IEZhaWxlZCB0byBjcmVhdGUgbGlua1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQobF9wdHIsIDAsIHNpemVvZigqbF9wdHIpKTsKKworCWxfcHRyLT5hZGRyID0gcGVlcjsKKwlpZl9uYW1lID0gc3RyY2hyKGJfcHRyLT5wdWJsLm5hbWUsICc6JykgKyAxOworCXNwcmludGYobF9wdHItPm5hbWUsICIldS4ldS4ldTolcy0ldS4ldS4ldToiLAorCQl0aXBjX3pvbmUodGlwY19vd25fYWRkciksIHRpcGNfY2x1c3Rlcih0aXBjX293bl9hZGRyKSwKKwkJdGlwY19ub2RlKHRpcGNfb3duX2FkZHIpLCAKKwkJaWZfbmFtZSwKKwkJdGlwY196b25lKHBlZXIpLCB0aXBjX2NsdXN0ZXIocGVlciksIHRpcGNfbm9kZShwZWVyKSk7CisJCS8qIG5vdGU6IHBlZXIgaS9mIGlzIGFwcGVuZGVkIHRvIGxpbmsgbmFtZSBieSByZXNldC9hY3RpdmF0ZSAqLworCW1lbWNweSgmbF9wdHItPm1lZGlhX2FkZHIsIG1lZGlhX2FkZHIsIHNpemVvZigqbWVkaWFfYWRkcikpOworCWtfaW5pdF90aW1lcigmbF9wdHItPnRpbWVyLCAoSGFuZGxlcilsaW5rX3RpbWVvdXQsICh1bnNpZ25lZCBsb25nKWxfcHRyKTsKKwlsaXN0X2FkZF90YWlsKCZsX3B0ci0+bGlua19saXN0LCAmYl9wdHItPmxpbmtzKTsKKwlsX3B0ci0+Y2hlY2twb2ludCA9IDE7CisJbF9wdHItPmJfcHRyID0gYl9wdHI7CisJbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMobF9wdHIsIGJfcHRyLT5tZWRpYS0+dG9sZXJhbmNlKTsKKwlsX3B0ci0+c3RhdGUgPSBSRVNFVF9VTktOT1dOOworCisJbF9wdHItPnBtc2cgPSAoc3RydWN0IHRpcGNfbXNnICopJmxfcHRyLT5wcm90b19tc2c7CisJbXNnID0gbF9wdHItPnBtc2c7CisJbXNnX2luaXQobXNnLCBMSU5LX1BST1RPQ09MLCBSRVNFVF9NU0csIFRJUENfT0ssIElOVF9IX1NJWkUsIGxfcHRyLT5hZGRyKTsKKwltc2dfc2V0X3NpemUobXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOworCW1zZ19zZXRfc2Vzc2lvbihtc2csIHRpcGNfcmFuZG9tKTsKKwltc2dfc2V0X2JlYXJlcl9pZChtc2csIGJfcHRyLT5pZGVudGl0eSk7CisJc3RyY3B5KChjaGFyICopbXNnX2RhdGEobXNnKSwgaWZfbmFtZSk7CisKKwlsX3B0ci0+cHJpb3JpdHkgPSBiX3B0ci0+cHJpb3JpdHk7CisJbGlua19zZXRfcXVldWVfbGltaXRzKGxfcHRyLCBiX3B0ci0+bWVkaWEtPndpbmRvdyk7CisKKwlsaW5rX2luaXRfbWF4X3BrdChsX3B0cik7CisKKwlsX3B0ci0+bmV4dF9vdXRfbm8gPSAxOworCUlOSVRfTElTVF9IRUFEKCZsX3B0ci0+d2FpdGluZ19wb3J0cyk7CisKKwlsaW5rX3Jlc2V0X3N0YXRpc3RpY3MobF9wdHIpOworCisJbF9wdHItPm93bmVyID0gbm9kZV9hdHRhY2hfbGluayhsX3B0cik7CisJaWYgKCFsX3B0ci0+b3duZXIpIHsKKwkJa2ZyZWUobF9wdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoTElOS19MT0dfQlVGX1NJWkUpIHsKKwkJY2hhciAqcGIgPSBrbWFsbG9jKExJTktfTE9HX0JVRl9TSVpFLCBHRlBfQVRPTUlDKTsKKworCQlpZiAoIXBiKSB7CisJCQlrZnJlZShsX3B0cik7CisJCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgRmFpbGVkIHRvIGNyZWF0ZSBsaW5rXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXByaW50YnVmX2luaXQoJmxfcHRyLT5wcmludF9idWYsIHBiLCBMSU5LX0xPR19CVUZfU0laRSk7CisJfQorCisJa19zaWduYWwoKEhhbmRsZXIpbGlua19zdGFydCwgKHVuc2lnbmVkIGxvbmcpbF9wdHIpOworCisJZGJnKCJsaW5rX2NyZWF0ZSgpOiB0b2xlcmFuY2UgPSAldSxjb250IGludHYgPSAldSwgYWJvcnRfbGltaXQgPSAldVxuIiwKKwkgICAgbF9wdHItPnRvbGVyYW5jZSwgbF9wdHItPmNvbnRpbnVpdHlfaW50ZXJ2YWwsIGxfcHRyLT5hYm9ydF9saW1pdCk7CisJCisJcmV0dXJuIGxfcHRyOworfQorCisvKiogCisgKiBsaW5rX2RlbGV0ZSAtIGRlbGV0ZSBhIGxpbmsKKyAqIEBsX3B0cjogcG9pbnRlciB0byBsaW5rCisgKiAKKyAqIE5vdGU6ICduZXRfbG9jaycgaXMgd3JpdGVfbG9ja2VkLCBiZWFyZXIgaXMgbG9ja2VkLgorICogVGhpcyByb3V0aW5lIG11c3Qgbm90IGdyYWIgdGhlIG5vZGUgbG9jayB1bnRpbCBhZnRlciBsaW5rIHRpbWVyIGNhbmNlbGxhdGlvbgorICogdG8gYXZvaWQgYSBwb3RlbnRpYWwgZGVhZGxvY2sgc2l0dWF0aW9uLiAgCisgKi8KKwordm9pZCBsaW5rX2RlbGV0ZShzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJaWYgKCFsX3B0cikgeworCQllcnIoIkF0dGVtcHQgdG8gZGVsZXRlIG5vbi1leGlzdGVudCBsaW5rXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRiZygibGlua19kZWxldGUoKVxuIik7CisKKwlrX2NhbmNlbF90aW1lcigmbF9wdHItPnRpbWVyKTsKKwkKKwlub2RlX2xvY2sobF9wdHItPm93bmVyKTsKKwlsaW5rX3Jlc2V0KGxfcHRyKTsKKwlub2RlX2RldGFjaF9saW5rKGxfcHRyLT5vd25lciwgbF9wdHIpOworCWxpbmtfc3RvcChsX3B0cik7CisJbGlzdF9kZWxfaW5pdCgmbF9wdHItPmxpbmtfbGlzdCk7CisJaWYgKExJTktfTE9HX0JVRl9TSVpFKQorCQlrZnJlZShsX3B0ci0+cHJpbnRfYnVmLmJ1Zik7CisJbm9kZV91bmxvY2sobF9wdHItPm93bmVyKTsKKwlrX3Rlcm1fdGltZXIoJmxfcHRyLT50aW1lcik7CisJa2ZyZWUobF9wdHIpOworfQorCit2b2lkIGxpbmtfc3RhcnQoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCWRiZygibGlua19zdGFydCAleFxuIiwgbF9wdHIpOworCWxpbmtfc3RhdGVfZXZlbnQobF9wdHIsIFNUQVJUSU5HX0VWVCk7Cit9CisKKy8qKgorICogbGlua19zY2hlZHVsZV9wb3J0IC0gc2NoZWR1bGUgcG9ydCBmb3IgZGVmZXJyZWQgc2VuZGluZyAKKyAqIEBsX3B0cjogcG9pbnRlciB0byBsaW5rCisgKiBAb3JpZ3BvcnQ6IHJlZmVyZW5jZSB0byBzZW5kaW5nIHBvcnQKKyAqIEBzejogYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICogCisgKiBTY2hlZHVsZXMgcG9ydCBmb3IgcmVuZXdlZCBzZW5kaW5nIG9mIG1lc3NhZ2VzIGFmdGVyIGxpbmsgY29uZ2VzdGlvbiAKKyAqIGhhcyBhYmF0ZWQuCisgKi8KKworc3RhdGljIGludCBsaW5rX3NjaGVkdWxlX3BvcnQoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgb3JpZ3BvcnQsIHUzMiBzeikKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisKKwlzcGluX2xvY2tfYmgoJnBvcnRfbGlzdF9sb2NrKTsKKwlwX3B0ciA9IHBvcnRfbG9jayhvcmlncG9ydCk7CisJaWYgKHBfcHRyKSB7CisJCWlmICghcF9wdHItPndha2V1cCkKKwkJCWdvdG8gZXhpdDsKKwkJaWYgKCFsaXN0X2VtcHR5KCZwX3B0ci0+d2FpdF9saXN0KSkKKwkJCWdvdG8gZXhpdDsKKwkJcF9wdHItPmNvbmdlc3RlZF9saW5rID0gbF9wdHI7CisJCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDE7CisJCXBfcHRyLT53YWl0aW5nX3BrdHMgPSAxICsgKChzeiAtIDEpIC8gbGlua19tYXhfcGt0KGxfcHRyKSk7CisJCWxpc3RfYWRkX3RhaWwoJnBfcHRyLT53YWl0X2xpc3QsICZsX3B0ci0+d2FpdGluZ19wb3J0cyk7CisJCWxfcHRyLT5zdGF0cy5saW5rX2NvbmdzKys7CitleGl0OgorCQlwb3J0X3VubG9jayhwX3B0cik7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZwb3J0X2xpc3RfbG9jayk7CisJcmV0dXJuIC1FTElOS0NPTkc7Cit9CisKK3ZvaWQgbGlua193YWtldXBfcG9ydHMoc3RydWN0IGxpbmsgKmxfcHRyLCBpbnQgYWxsKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgcG9ydCAqdGVtcF9wX3B0cjsKKwlpbnQgd2luID0gbF9wdHItPnF1ZXVlX2xpbWl0WzBdIC0gbF9wdHItPm91dF9xdWV1ZV9zaXplOworCisJaWYgKGFsbCkKKwkJd2luID0gMTAwMDAwOworCWlmICh3aW4gPD0gMCkKKwkJcmV0dXJuOworCWlmICghc3Bpbl90cnlsb2NrX2JoKCZwb3J0X2xpc3RfbG9jaykpCisJCXJldHVybjsKKwlpZiAobGlua19jb25nZXN0ZWQobF9wdHIpKQorCQlnb3RvIGV4aXQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBfcHRyLCB0ZW1wX3BfcHRyLCAmbF9wdHItPndhaXRpbmdfcG9ydHMsIAorCQkJCSB3YWl0X2xpc3QpIHsKKwkJaWYgKHdpbiA8PSAwKQorCQkJYnJlYWs7CisJCWxpc3RfZGVsX2luaXQoJnBfcHRyLT53YWl0X2xpc3QpOworCQlwX3B0ci0+Y29uZ2VzdGVkX2xpbmsgPSAwOworCQlhc3NlcnQocF9wdHItPndha2V1cCk7CisJCXNwaW5fbG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwkJcF9wdHItPnB1YmwuY29uZ2VzdGVkID0gMDsKKwkJcF9wdHItPndha2V1cCgmcF9wdHItPnB1YmwpOworCQl3aW4gLT0gcF9wdHItPndhaXRpbmdfcGt0czsKKwkJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJfQorCitleGl0OgorCXNwaW5fdW5sb2NrX2JoKCZwb3J0X2xpc3RfbG9jayk7Cit9CisKKy8qKiAKKyAqIGxpbmtfcmVsZWFzZV9vdXRxdWV1ZSAtIHB1cmdlIGxpbmsncyBvdXRib3VuZCBtZXNzYWdlIHF1ZXVlCisgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluaworICovCisKK3N0YXRpYyB2b2lkIGxpbmtfcmVsZWFzZV9vdXRxdWV1ZShzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGxfcHRyLT5maXJzdF9vdXQ7CisJc3RydWN0IHNrX2J1ZmYgKm5leHQ7CisKKwl3aGlsZSAoYnVmKSB7CisJCW5leHQgPSBidWYtPm5leHQ7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCWJ1ZiA9IG5leHQ7CisJfQorCWxfcHRyLT5maXJzdF9vdXQgPSBOVUxMOworCWxfcHRyLT5vdXRfcXVldWVfc2l6ZSA9IDA7Cit9CisKKy8qKgorICogbGlua19yZXNldF9mcmFnbWVudHMgLSBwdXJnZSBsaW5rJ3MgaW5ib3VuZCBtZXNzYWdlIGZyYWdtZW50cyBxdWV1ZQorICogQGxfcHRyOiBwb2ludGVyIHRvIGxpbmsKKyAqLworCit2b2lkIGxpbmtfcmVzZXRfZnJhZ21lbnRzKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gbF9wdHItPmRlZnJhZ21fYnVmOworCXN0cnVjdCBza19idWZmICpuZXh0OworCisJd2hpbGUgKGJ1ZikgeworCQluZXh0ID0gYnVmLT5uZXh0OworCQlidWZfZGlzY2FyZChidWYpOworCQlidWYgPSBuZXh0OworCX0KKwlsX3B0ci0+ZGVmcmFnbV9idWYgPSBOVUxMOworfQorCisvKiogCisgKiBsaW5rX3N0b3AgLSBwdXJnZSBhbGwgaW5ib3VuZCBhbmQgb3V0Ym91bmQgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIGxpbmsKKyAqIEBsX3B0cjogcG9pbnRlciB0byBsaW5rCisgKi8KKwordm9pZCBsaW5rX3N0b3Aoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHNrX2J1ZmYgKm5leHQ7CisKKwlidWYgPSBsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luOworCXdoaWxlIChidWYpIHsKKwkJbmV4dCA9IGJ1Zi0+bmV4dDsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJYnVmID0gbmV4dDsKKwl9CisKKwlidWYgPSBsX3B0ci0+Zmlyc3Rfb3V0OworCXdoaWxlIChidWYpIHsKKwkJbmV4dCA9IGJ1Zi0+bmV4dDsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJYnVmID0gbmV4dDsKKwl9CisKKwlsaW5rX3Jlc2V0X2ZyYWdtZW50cyhsX3B0cik7CisKKwlidWZfZGlzY2FyZChsX3B0ci0+cHJvdG9fbXNnX3F1ZXVlKTsKKwlsX3B0ci0+cHJvdG9fbXNnX3F1ZXVlID0gTlVMTDsKK30KKworI2lmIDAKKworLyogTElOSyBFVkVOVCBDT0RFIElTIE5PVCBTVVBQT1JURUQgQVQgUFJFU0VOVCAqLworCitzdGF0aWMgdm9pZCBsaW5rX3JlY3ZfZXZlbnQoc3RydWN0IGxpbmtfZXZlbnQgKmV2KQoreworCWV2LT5mY24oZXYtPmFkZHIsIGV2LT5uYW1lLCBldi0+dXApOworCWtmcmVlKGV2KTsKK30KKworc3RhdGljIHZvaWQgbGlua19zZW5kX2V2ZW50KHZvaWQgKCpmY24pKHUzMiBhLCBjaGFyICpuLCBpbnQgdXApLAorCQkJICAgIHN0cnVjdCBsaW5rICpsX3B0ciwgaW50IHVwKQoreworCXN0cnVjdCBsaW5rX2V2ZW50ICpldjsKKwkKKwlldiA9IGttYWxsb2Moc2l6ZW9mKCpldiksIEdGUF9BVE9NSUMpOworCWlmICghZXYpIHsKKwkJd2FybigiTGluayBldmVudCBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworCQlyZXR1cm47CisJfQorCWV2LT5hZGRyID0gbF9wdHItPmFkZHI7CisJZXYtPnVwID0gdXA7CisJZXYtPmZjbiA9IGZjbjsKKwltZW1jcHkoZXYtPm5hbWUsIGxfcHRyLT5uYW1lLCBUSVBDX01BWF9MSU5LX05BTUUpOworCWtfc2lnbmFsKChIYW5kbGVyKWxpbmtfcmVjdl9ldmVudCwgKHVuc2lnbmVkIGxvbmcpZXYpOworfQorCisjZWxzZQorCisjZGVmaW5lIGxpbmtfc2VuZF9ldmVudChmY24sIGxfcHRyLCB1cCkgZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYKKwordm9pZCBsaW5rX3Jlc2V0KHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXUzMiBwcmV2X3N0YXRlID0gbF9wdHItPnN0YXRlOworCXUzMiBjaGVja3BvaW50ID0gbF9wdHItPm5leHRfaW5fbm87CisJCisJbXNnX3NldF9zZXNzaW9uKGxfcHRyLT5wbXNnLCBtc2dfc2Vzc2lvbihsX3B0ci0+cG1zZykgKyAxKTsKKworICAgICAgICAvKiBMaW5rIGlzIGRvd24sIGFjY2VwdCBhbnkgc2Vzc2lvbjogKi8KKwlsX3B0ci0+cGVlcl9zZXNzaW9uID0gMDsKKworICAgICAgICAvKiBQcmVwYXJlIGZvciBtYXggcGFja2V0IHNpemUgbmVnb3RpYXRpb24gKi8KKwlsaW5rX2luaXRfbWF4X3BrdChsX3B0cik7CisJCisJbF9wdHItPnN0YXRlID0gUkVTRVRfVU5LTk9XTjsKKwlkYmdfbGlua19zdGF0ZSgiUmVzZXR0aW5nIExpbmtcbiIpOworCisJaWYgKChwcmV2X3N0YXRlID09IFJFU0VUX1VOS05PV04pIHx8IChwcmV2X3N0YXRlID09IFJFU0VUX1JFU0VUKSkKKwkJcmV0dXJuOworCisJbm9kZV9saW5rX2Rvd24obF9wdHItPm93bmVyLCBsX3B0cik7CisJYmVhcmVyX3JlbW92ZV9kZXN0KGxfcHRyLT5iX3B0ciwgbF9wdHItPmFkZHIpOworI2lmIDAKKwl0aXBjX3ByaW50ZihDT05TLCAiXG5SZXNldCBsaW5rIDwlcz5cbiIsIGxfcHRyLT5uYW1lKTsKKwlkYmdfbGlua19kdW1wKCk7CisjZW5kaWYKKwlpZiAobm9kZV9oYXNfYWN0aXZlX2xpbmtzKGxfcHRyLT5vd25lcikgJiYKKwkgICAgbF9wdHItPm93bmVyLT5wZXJtaXRfY2hhbmdlb3ZlcikgeworCQlsX3B0ci0+cmVzZXRfY2hlY2twb2ludCA9IGNoZWNrcG9pbnQ7CisJCWxfcHRyLT5leHBfbXNnX2NvdW50ID0gU1RBUlRfQ0hBTkdFT1ZFUjsKKwl9CisKKwkvKiBDbGVhbiB1cCBhbGwgcXVldWVzOiAqLworCisJbGlua19yZWxlYXNlX291dHF1ZXVlKGxfcHRyKTsKKwlidWZfZGlzY2FyZChsX3B0ci0+cHJvdG9fbXNnX3F1ZXVlKTsKKwlsX3B0ci0+cHJvdG9fbXNnX3F1ZXVlID0gTlVMTDsKKwlidWYgPSBsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luOworCXdoaWxlIChidWYpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBidWYtPm5leHQ7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCWJ1ZiA9IG5leHQ7CisJfQorCWlmICghbGlzdF9lbXB0eSgmbF9wdHItPndhaXRpbmdfcG9ydHMpKQorCQlsaW5rX3dha2V1cF9wb3J0cyhsX3B0ciwgMSk7CisKKwlsX3B0ci0+cmV0cmFuc21fcXVldWVfaGVhZCA9IDA7CisJbF9wdHItPnJldHJhbnNtX3F1ZXVlX3NpemUgPSAwOworCWxfcHRyLT5sYXN0X291dCA9IE5VTEw7CisJbF9wdHItPmZpcnN0X291dCA9IE5VTEw7CisJbF9wdHItPm5leHRfb3V0ID0gTlVMTDsKKwlsX3B0ci0+dW5hY2tlZF93aW5kb3cgPSAwOworCWxfcHRyLT5jaGVja3BvaW50ID0gMTsKKwlsX3B0ci0+bmV4dF9vdXRfbm8gPSAxOworCWxfcHRyLT5kZWZlcnJlZF9pbnF1ZXVlX3N6ID0gMDsKKwlsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luID0gTlVMTDsKKwlsX3B0ci0+bmV3ZXN0X2RlZmVycmVkX2luID0gTlVMTDsKKwlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOworCWxfcHRyLT5zdGFsZV9jb3VudCA9IDA7CisJbGlua19yZXNldF9zdGF0aXN0aWNzKGxfcHRyKTsKKworCWxpbmtfc2VuZF9ldmVudChjZmdfbGlua19ldmVudCwgbF9wdHIsIDApOworCWlmICghaW5fb3duX2NsdXN0ZXIobF9wdHItPmFkZHIpKQorCQlsaW5rX3NlbmRfZXZlbnQoZGlzY19saW5rX2V2ZW50LCBsX3B0ciwgMCk7Cit9CisKKworc3RhdGljIHZvaWQgbGlua19hY3RpdmF0ZShzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJbF9wdHItPm5leHRfaW5fbm8gPSAxOworCW5vZGVfbGlua191cChsX3B0ci0+b3duZXIsIGxfcHRyKTsKKwliZWFyZXJfYWRkX2Rlc3QobF9wdHItPmJfcHRyLCBsX3B0ci0+YWRkcik7CisJbGlua19zZW5kX2V2ZW50KGNmZ19saW5rX2V2ZW50LCBsX3B0ciwgMSk7CisJaWYgKCFpbl9vd25fY2x1c3RlcihsX3B0ci0+YWRkcikpCisJCWxpbmtfc2VuZF9ldmVudChkaXNjX2xpbmtfZXZlbnQsIGxfcHRyLCAxKTsKK30KKworLyoqCisgKiBsaW5rX3N0YXRlX2V2ZW50IC0gbGluayBmaW5pdGUgc3RhdGUgbWFjaGluZQorICogQGxfcHRyOiBwb2ludGVyIHRvIGxpbmsKKyAqIEBldmVudDogc3RhdGUgbWFjaGluZSBldmVudCB0byBwcm9jZXNzCisgKi8KKworc3RhdGljIHZvaWQgbGlua19zdGF0ZV9ldmVudChzdHJ1Y3QgbGluayAqbF9wdHIsIHVuc2lnbmVkIGV2ZW50KQoreworCXN0cnVjdCBsaW5rICpvdGhlcjsgCisJdTMyIGNvbnRfaW50diA9IGxfcHRyLT5jb250aW51aXR5X2ludGVydmFsOworCisJaWYgKCFsX3B0ci0+c3RhcnRlZCAmJiAoZXZlbnQgIT0gU1RBUlRJTkdfRVZUKSkKKwkJcmV0dXJuOwkJLyogTm90IHlldC4gKi8KKworCWlmIChsaW5rX2Jsb2NrZWQobF9wdHIpKSB7CisJCWlmIChldmVudCA9PSBUSU1FT1VUX0VWVCkgeworCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CisJCX0KKwkJcmV0dXJuOwkgIC8qIENoYW5nZW92ZXIgZ29pbmcgb24gKi8KKwl9CisJZGJnX2xpbmsoIlNUQVRFX0VWOiA8JXM+ICIsIGxfcHRyLT5uYW1lKTsKKworCXN3aXRjaCAobF9wdHItPnN0YXRlKSB7CisJY2FzZSBXT1JLSU5HX1dPUktJTkc6CisJCWRiZ19saW5rKCJXVy8iKTsKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIFRSQUZGSUNfTVNHX0VWVDoKKwkJCWRiZ19saW5rKCJUUkYtIik7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBBQ1RJVkFURV9NU0c6CisJCQlkYmdfbGluaygiQUNUXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFRJTUVPVVRfRVZUOgorCQkJZGJnX2xpbmsoIlRJTSAiKTsKKwkJCWlmIChsX3B0ci0+bmV4dF9pbl9ubyAhPSBsX3B0ci0+Y2hlY2twb2ludCkgeworCQkJCWxfcHRyLT5jaGVja3BvaW50ID0gbF9wdHItPm5leHRfaW5fbm87CisJCQkJaWYgKGJjbGlua19hY2tzX21pc3NpbmcobF9wdHItPm93bmVyKSkgeworCQkJCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csIAorCQkJCQkJCSAgICAwLCAwLCAwLCAwLCAwKTsKKwkJCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQkJfSBlbHNlIGlmIChsX3B0ci0+bWF4X3BrdCA8IGxfcHRyLT5tYXhfcGt0X3RhcmdldCkgeworCQkJCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csIAorCQkJCQkJCSAgICAxLCAwLCAwLCAwLCAwKTsKKwkJCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQkJfQorCQkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGJnX2xpbmsoIiAtPiBXVVxuIik7CisJCQlsX3B0ci0+c3RhdGUgPSBXT1JLSU5HX1VOS05PV047CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOworCQkJbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgU1RBVEVfTVNHLCAxLCAwLCAwLCAwLCAwKTsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50diAvIDQpOworCQkJYnJlYWs7CisJCWNhc2UgUkVTRVRfTVNHOgorCQkJZGJnX2xpbmsoIlJFUyAtPiBSUlxuIik7CisJCQlsaW5rX3Jlc2V0KGxfcHRyKTsKKwkJCWxfcHRyLT5zdGF0ZSA9IFJFU0VUX1JFU0VUOworCQkJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKKwkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIEFDVElWQVRFX01TRywgMCwgMCwgMCwgMCwgMCk7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIoIlVua25vd24gbGluayBldmVudCAldSBpbiBXVyBzdGF0ZVxuIiwgZXZlbnQpOworCQl9CisJCWJyZWFrOworCWNhc2UgV09SS0lOR19VTktOT1dOOgorCQlkYmdfbGluaygiV1UvIik7CisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBUUkFGRklDX01TR19FVlQ6CisJCQlkYmdfbGluaygiVFJGLSIpOworCQljYXNlIEFDVElWQVRFX01TRzoKKwkJCWRiZ19saW5rKCJBQ1QgLT4gV1dcbiIpOworCQkJbF9wdHItPnN0YXRlID0gV09SS0lOR19XT1JLSU5HOworCQkJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKKwkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQkJYnJlYWs7CisJCWNhc2UgUkVTRVRfTVNHOgorCQkJZGJnX2xpbmsoIlJFUyAtPiBSUlxuIik7CisJCQlsaW5rX3Jlc2V0KGxfcHRyKTsKKwkJCWxfcHRyLT5zdGF0ZSA9IFJFU0VUX1JFU0VUOworCQkJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKKwkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIEFDVElWQVRFX01TRywgMCwgMCwgMCwgMCwgMCk7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQkJYnJlYWs7CisJCWNhc2UgVElNRU9VVF9FVlQ6CisJCQlkYmdfbGluaygiVElNICIpOworCQkJaWYgKGxfcHRyLT5uZXh0X2luX25vICE9IGxfcHRyLT5jaGVja3BvaW50KSB7CisJCQkJZGJnX2xpbmsoIi0+IFdXIFxuIik7CisJCQkJbF9wdHItPnN0YXRlID0gV09SS0lOR19XT1JLSU5HOworCQkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CisJCQkJbF9wdHItPmNoZWNrcG9pbnQgPSBsX3B0ci0+bmV4dF9pbl9ubzsKKwkJCQlpZiAoYmNsaW5rX2Fja3NfbWlzc2luZyhsX3B0ci0+b3duZXIpKSB7CisJCQkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywKKwkJCQkJCQkgICAgMCwgMCwgMCwgMCwgMCk7CisJCQkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJCX0KKwkJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKKwkJCX0gZWxzZSBpZiAobF9wdHItPmZzbV9tc2dfY250IDwgbF9wdHItPmFib3J0X2xpbWl0KSB7CisJCQkJZGJnX2xpbmsoIlByb2JpbmcgJXUvJXUsdGltZXIgPSAldSBtcylcbiIsCisJCQkJCSBsX3B0ci0+ZnNtX21zZ19jbnQsIGxfcHRyLT5hYm9ydF9saW1pdCwKKwkJCQkJIGNvbnRfaW50diAvIDQpOworCQkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgCisJCQkJCQkgICAgMSwgMCwgMCwgMCwgMCk7CisJCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50diAvIDQpOworCQkJfSBlbHNlIHsJLyogTGluayBoYXMgZmFpbGVkICovCisJCQkJZGJnX2xpbmsoIi0+IFJVICgldSBwcm9iZXMgdW5hbnN3ZXJlZClcbiIsCisJCQkJCSBsX3B0ci0+ZnNtX21zZ19jbnQpOworCQkJCWxpbmtfcmVzZXQobF9wdHIpOworCQkJCWxfcHRyLT5zdGF0ZSA9IFJFU0VUX1VOS05PV047CisJCQkJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKKwkJCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBSRVNFVF9NU0csCisJCQkJCQkgICAgMCwgMCwgMCwgMCwgMCk7CisJCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycigiVW5rbm93biBsaW5rIGV2ZW50ICV1IGluIFdVIHN0YXRlXG4iLCBldmVudCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSRVNFVF9VTktOT1dOOgorCQlkYmdfbGluaygiUlUvIik7CisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBUUkFGRklDX01TR19FVlQ6CisJCQlkYmdfbGluaygiVFJGLVxuIik7CisJCQlicmVhazsKKwkJY2FzZSBBQ1RJVkFURV9NU0c6CisJCQlvdGhlciA9IGxfcHRyLT5vd25lci0+YWN0aXZlX2xpbmtzWzBdOworCQkJaWYgKG90aGVyICYmIGxpbmtfd29ya2luZ191bmtub3duKG90aGVyKSkgeworCQkJCWRiZ19saW5rKCJBQ1RcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGJnX2xpbmsoIkFDVCAtPiBXV1xuIik7CisJCQlsX3B0ci0+c3RhdGUgPSBXT1JLSU5HX1dPUktJTkc7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOworCQkJbGlua19hY3RpdmF0ZShsX3B0cik7CisJCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csIDEsIDAsIDAsIDAsIDApOworCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKKwkJCWJyZWFrOworCQljYXNlIFJFU0VUX01TRzoKKwkJCWRiZ19saW5rKCJSRVMgXG4iKTsKKwkJCWRiZ19saW5rKCIgLT4gUlJcbiIpOworCQkJbF9wdHItPnN0YXRlID0gUkVTRVRfUkVTRVQ7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOworCQkJbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgQUNUSVZBVEVfTVNHLCAxLCAwLCAwLCAwLCAwKTsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CisJCQlicmVhazsKKwkJY2FzZSBTVEFSVElOR19FVlQ6CisJCQlkYmdfbGluaygiU1RBUlQtIik7CisJCQlsX3B0ci0+c3RhcnRlZCA9IDE7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBUSU1FT1VUX0VWVDoKKwkJCWRiZ19saW5rKCJUSU0gXG4iKTsKKwkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFJFU0VUX01TRywgMCwgMCwgMCwgMCwgMCk7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIoIlVua25vd24gbGluayBldmVudCAldSBpbiBSVSBzdGF0ZVxuIiwgZXZlbnQpOworCQl9CisJCWJyZWFrOworCWNhc2UgUkVTRVRfUkVTRVQ6CisJCWRiZ19saW5rKCJSUi8gIik7CisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBUUkFGRklDX01TR19FVlQ6CisJCQlkYmdfbGluaygiVFJGLSIpOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgQUNUSVZBVEVfTVNHOgorCQkJb3RoZXIgPSBsX3B0ci0+b3duZXItPmFjdGl2ZV9saW5rc1swXTsKKwkJCWlmIChvdGhlciAmJiBsaW5rX3dvcmtpbmdfdW5rbm93bihvdGhlcikpIHsKKwkJCQlkYmdfbGluaygiQUNUXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRiZ19saW5rKCJBQ1QgLT4gV1dcbiIpOworCQkJbF9wdHItPnN0YXRlID0gV09SS0lOR19XT1JLSU5HOworCQkJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKKwkJCWxpbmtfYWN0aXZhdGUobF9wdHIpOworCQkJbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgU1RBVEVfTVNHLCAxLCAwLCAwLCAwLCAwKTsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CisJCQlicmVhazsKKwkJY2FzZSBSRVNFVF9NU0c6CisJCQlkYmdfbGluaygiUkVTXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFRJTUVPVVRfRVZUOgorCQkJZGJnX2xpbmsoIlRJTVxuIik7CisJCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBBQ1RJVkFURV9NU0csIDAsIDAsIDAsIDAsIDApOworCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKKwkJCWRiZ19saW5rKCJmc21fbXNnX2NudCAldVxuIiwgbF9wdHItPmZzbV9tc2dfY250KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyKCJVbmtub3duIGxpbmsgZXZlbnQgJXUgaW4gUlIgc3RhdGVcbiIsIGV2ZW50KTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIoIlVua25vd24gbGluayBzdGF0ZSAldS8ldVxuIiwgbF9wdHItPnN0YXRlLCBldmVudCk7CisJfQorfQorCisvKgorICogbGlua19idW5kbGVfYnVmKCk6IEFwcGVuZCBjb250ZW50cyBvZiBhIGJ1ZmZlciB0bworICogdGhlIHRhaWwgb2YgYW4gZXhpc3Rpbmcgb25lLiAKKyAqLworCitzdGF0aWMgaW50IGxpbmtfYnVuZGxlX2J1ZihzdHJ1Y3QgbGluayAqbF9wdHIsCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqYnVuZGxlciwgCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCB0aXBjX21zZyAqYnVuZGxlcl9tc2cgPSBidWZfbXNnKGJ1bmRsZXIpOworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCXUzMiBzaXplID0gbXNnX3NpemUobXNnKTsKKwl1MzIgdG9fcG9zID0gYWxpZ24obXNnX3NpemUoYnVuZGxlcl9tc2cpKTsKKwl1MzIgcmVzdCA9IGxpbmtfbWF4X3BrdChsX3B0cikgLSB0b19wb3M7CisKKwlpZiAobXNnX3VzZXIoYnVuZGxlcl9tc2cpICE9IE1TR19CVU5ETEVSKQorCQlyZXR1cm4gMDsKKwlpZiAobXNnX3R5cGUoYnVuZGxlcl9tc2cpICE9IE9QRU5fTVNHKQorCQlyZXR1cm4gMDsKKwlpZiAocmVzdCA8IGFsaWduKHNpemUpKQorCQlyZXR1cm4gMDsKKworCXNrYl9wdXQoYnVuZGxlciwgKHRvX3BvcyAtIG1zZ19zaXplKGJ1bmRsZXJfbXNnKSkgKyBzaXplKTsKKwltZW1jcHkoYnVuZGxlci0+ZGF0YSArIHRvX3BvcywgYnVmLT5kYXRhLCBzaXplKTsKKwltc2dfc2V0X3NpemUoYnVuZGxlcl9tc2csIHRvX3BvcyArIHNpemUpOworCW1zZ19zZXRfbXNnY250KGJ1bmRsZXJfbXNnLCBtc2dfbXNnY250KGJ1bmRsZXJfbXNnKSArIDEpOworCWRiZygiUGFja2VkIG1zZyAjICV1KCV1IG9jdGV0cykgaW50byBwb3MgJXUgaW4gYnVmKCMldSlcbiIsCisJICAgIG1zZ19tc2djbnQoYnVuZGxlcl9tc2cpLCBzaXplLCB0b19wb3MsIG1zZ19zZXFubyhidW5kbGVyX21zZykpOworCW1zZ19kYmcobXNnLCAiUEFDS0Q6Iik7CisJYnVmX2Rpc2NhcmQoYnVmKTsKKwlsX3B0ci0+c3RhdHMuc2VudF9idW5kbGVkKys7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaW5rX2FkZF90b19vdXRxdWV1ZShzdHJ1Y3QgbGluayAqbF9wdHIsIAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCAKKwkJCQkJc3RydWN0IHRpcGNfbXNnICptc2cpCit7CisJdTMyIGFjayA9IG1vZChsX3B0ci0+bmV4dF9pbl9ubyAtIDEpOworCXUzMiBzZXFubyA9IG1vZChsX3B0ci0+bmV4dF9vdXRfbm8rKyk7CisKKwltc2dfc2V0X3dvcmQobXNnLCAyLCAoKGFjayA8PCAxNikgfCBzZXFubykpOworCW1zZ19zZXRfYmNhc3RfYWNrKG1zZywgbF9wdHItPm93bmVyLT5iY2xpbmsubGFzdF9pbik7CisJYnVmLT5uZXh0ID0gTlVMTDsKKwlpZiAobF9wdHItPmZpcnN0X291dCkgeworCQlsX3B0ci0+bGFzdF9vdXQtPm5leHQgPSBidWY7CisJCWxfcHRyLT5sYXN0X291dCA9IGJ1ZjsKKwl9IGVsc2UKKwkJbF9wdHItPmZpcnN0X291dCA9IGxfcHRyLT5sYXN0X291dCA9IGJ1ZjsKKwlsX3B0ci0+b3V0X3F1ZXVlX3NpemUrKzsKK30KKworLyogCisgKiBsaW5rX3NlbmRfYnVmKCkgaXMgdGhlICdmdWxsIHBhdGgnIGZvciBtZXNzYWdlcywgY2FsbGVkIGZyb20gCisgKiBpbnNpZGUgVElQQyB3aGVuIHRoZSAnZmFzdCBwYXRoJyBpbiB0aXBjX3NlbmRfYnVmCisgKiBoYXMgZmFpbGVkLCBhbmQgZnJvbSBsaW5rX3NlbmQoKQorICovCisKK2ludCBsaW5rX3NlbmRfYnVmKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwl1MzIgc2l6ZSA9IG1zZ19zaXplKG1zZyk7CisJdTMyIGRzeiA9IG1zZ19kYXRhX3N6KG1zZyk7CisJdTMyIHF1ZXVlX3NpemUgPSBsX3B0ci0+b3V0X3F1ZXVlX3NpemU7CisJdTMyIGltcCA9IG1zZ190b3RfaW1wb3J0YW5jZShtc2cpOworCXUzMiBxdWV1ZV9saW1pdCA9IGxfcHRyLT5xdWV1ZV9saW1pdFtpbXBdOworCXUzMiBtYXhfcGFja2V0ID0gbGlua19tYXhfcGt0KGxfcHRyKTsKKworCW1zZ19zZXRfcHJldm5vZGUobXNnLCB0aXBjX293bl9hZGRyKTsJLyogSWYgcm91dGVkIG1lc3NhZ2UgKi8KKworCS8qIE1hdGNoIG1zZyBpbXBvcnRhbmNlIGFnYWluc3QgcXVldWUgbGltaXRzOiAqLworCisJaWYgKHVubGlrZWx5KHF1ZXVlX3NpemUgPj0gcXVldWVfbGltaXQpKSB7CisJCWlmIChpbXAgPD0gVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKSB7CisJCQlyZXR1cm4gbGlua19zY2hlZHVsZV9wb3J0KGxfcHRyLCBtc2dfb3JpZ3BvcnQobXNnKSwKKwkJCQkJCSAgc2l6ZSk7CisJCX0KKwkJbXNnX2RiZyhtc2csICJUSVBDOiBDb25nZXN0aW9uLCB0aHJvd2luZyBhd2F5XG4iKTsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJaWYgKGltcCA+IENPTk5fTUFOQUdFUikgeworCQkJd2FybigiUmVzZXR0aW5nIDwlcz4sIHNlbmQgcXVldWUgZnVsbCIsIGxfcHRyLT5uYW1lKTsKKwkJCWxpbmtfcmVzZXQobF9wdHIpOworCQl9CisJCXJldHVybiBkc3o7CisJfQorCisJLyogRnJhZ21lbnRhdGlvbiBuZWVkZWQgPyAqLworCisJaWYgKHNpemUgPiBtYXhfcGFja2V0KQorCQlyZXR1cm4gbGlua19zZW5kX2xvbmdfYnVmKGxfcHRyLCBidWYpOworCisJLyogUGFja2V0IGNhbiBiZSBxdWV1ZWQgb3Igc2VudDogKi8KKworCWlmIChxdWV1ZV9zaXplID4gbF9wdHItPnN0YXRzLm1heF9xdWV1ZV9zeikKKwkJbF9wdHItPnN0YXRzLm1heF9xdWV1ZV9zeiA9IHF1ZXVlX3NpemU7CisKKwlpZiAobGlrZWx5KCFiZWFyZXJfY29uZ2VzdGVkKGxfcHRyLT5iX3B0ciwgbF9wdHIpICYmIAorCQkgICAhbGlua19jb25nZXN0ZWQobF9wdHIpKSkgeworCQlsaW5rX2FkZF90b19vdXRxdWV1ZShsX3B0ciwgYnVmLCBtc2cpOworCisJCWlmIChsaWtlbHkoYmVhcmVyX3NlbmQobF9wdHItPmJfcHRyLCBidWYsICZsX3B0ci0+bWVkaWFfYWRkcikpKSB7CisJCQlsX3B0ci0+dW5hY2tlZF93aW5kb3cgPSAwOworCQl9IGVsc2UgeworCQkJYmVhcmVyX3NjaGVkdWxlKGxfcHRyLT5iX3B0ciwgbF9wdHIpOworCQkJbF9wdHItPnN0YXRzLmJlYXJlcl9jb25ncysrOworCQkJbF9wdHItPm5leHRfb3V0ID0gYnVmOworCQl9CisJCXJldHVybiBkc3o7CisJfQorCS8qIENvbmdlc3Rpb246IGNhbiBtZXNzYWdlIGJlIGJ1bmRsZWQgPzogKi8KKworCWlmICgobXNnX3VzZXIobXNnKSAhPSBDSEFOR0VPVkVSX1BST1RPQ09MKSAmJgorCSAgICAobXNnX3VzZXIobXNnKSAhPSBNU0dfRlJBR01FTlRFUikpIHsKKworCQkvKiBUcnkgYWRkaW5nIG1lc3NhZ2UgdG8gYW4gZXhpc3RpbmcgYnVuZGxlICovCisKKwkJaWYgKGxfcHRyLT5uZXh0X291dCAmJiAKKwkJICAgIGxpbmtfYnVuZGxlX2J1ZihsX3B0ciwgbF9wdHItPmxhc3Rfb3V0LCBidWYpKSB7CisJCQliZWFyZXJfcmVzb2x2ZV9jb25nZXN0aW9uKGxfcHRyLT5iX3B0ciwgbF9wdHIpOworCQkJcmV0dXJuIGRzejsKKwkJfQorCisJCS8qIFRyeSBjcmVhdGluZyBhIG5ldyBidW5kbGUgKi8KKworCQlpZiAoc2l6ZSA8PSBtYXhfcGFja2V0ICogMiAvIDMpIHsKKwkJCXN0cnVjdCBza19idWZmICpidW5kbGVyID0gYnVmX2FjcXVpcmUobWF4X3BhY2tldCk7CisJCQlzdHJ1Y3QgdGlwY19tc2cgYnVuZGxlcl9oZHI7CisKKwkJCWlmIChidW5kbGVyKSB7CisJCQkJbXNnX2luaXQoJmJ1bmRsZXJfaGRyLCBNU0dfQlVORExFUiwgT1BFTl9NU0csCisJCQkJCSBUSVBDX09LLCBJTlRfSF9TSVpFLCBsX3B0ci0+YWRkcik7CisJCQkJbWVtY3B5KGJ1bmRsZXItPmRhdGEsICh1bmNoYXIgKikmYnVuZGxlcl9oZHIsIAorCQkJCSAgICAgICBJTlRfSF9TSVpFKTsKKwkJCQlza2JfdHJpbShidW5kbGVyLCBJTlRfSF9TSVpFKTsKKwkJCQlsaW5rX2J1bmRsZV9idWYobF9wdHIsIGJ1bmRsZXIsIGJ1Zik7CisJCQkJYnVmID0gYnVuZGxlcjsKKwkJCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCQkJbF9wdHItPnN0YXRzLnNlbnRfYnVuZGxlcysrOworCQkJfQorCQl9CisJfQorCWlmICghbF9wdHItPm5leHRfb3V0KQorCQlsX3B0ci0+bmV4dF9vdXQgPSBidWY7CisJbGlua19hZGRfdG9fb3V0cXVldWUobF9wdHIsIGJ1ZiwgbXNnKTsKKwliZWFyZXJfcmVzb2x2ZV9jb25nZXN0aW9uKGxfcHRyLT5iX3B0ciwgbF9wdHIpOworCXJldHVybiBkc3o7Cit9CisKKy8qIAorICogbGlua19zZW5kKCk6IHNhbWUgYXMgbGlua19zZW5kX2J1ZigpLCBidXQgdGhlIGxpbmsgdG8gdXNlIGhhcyAKKyAqIG5vdCBiZWVuIHNlbGVjdGVkIHlldCwgYW5kIHRoZSB0aGUgb3duZXIgbm9kZSBpcyBub3QgbG9ja2VkCisgKiBDYWxsZWQgYnkgVElQQyBpbnRlcm5hbCB1c2VycywgZS5nLiB0aGUgbmFtZSBkaXN0cmlidXRvcgorICovCisKK2ludCBsaW5rX3NlbmQoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgdTMyIGRlc3QsIHUzMiBzZWxlY3RvcikKK3sKKwlzdHJ1Y3QgbGluayAqbF9wdHI7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCWludCByZXMgPSAtRUxJTktDT05HOworCisJcmVhZF9sb2NrX2JoKCZuZXRfbG9jayk7CisJbl9wdHIgPSBub2RlX3NlbGVjdChkZXN0LCBzZWxlY3Rvcik7CisJaWYgKG5fcHRyKSB7CisJCW5vZGVfbG9jayhuX3B0cik7CisJCWxfcHRyID0gbl9wdHItPmFjdGl2ZV9saW5rc1tzZWxlY3RvciAmIDFdOworCQlkYmcoImxpbmtfc2VuZDogZm91bmQgbGluayAleCBmb3IgZGVzdCAleFxuIiwgbF9wdHIsIGRlc3QpOworCQlpZiAobF9wdHIpIHsKKwkJCXJlcyA9IGxpbmtfc2VuZF9idWYobF9wdHIsIGJ1Zik7CisJCX0KKwkJbm9kZV91bmxvY2sobl9wdHIpOworCX0gZWxzZSB7CisJCWRiZygiQXR0ZW1wdCB0byBzZW5kIG1zZyB0byB1bmtub3duIG5vZGU6XG4iKTsKKwkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksIj4+PiIpOworCQlidWZfZGlzY2FyZChidWYpOworCX0KKwlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOworCXJldHVybiByZXM7Cit9CisKKy8qIAorICogbGlua19zZW5kX2J1Zl9mYXN0OiBFbnRyeSBmb3IgZGF0YSBtZXNzYWdlcyB3aGVyZSB0aGUgCisgKiBkZXN0aW5hdGlvbiBsaW5rIGlzIGtub3duIGFuZCB0aGUgaGVhZGVyIGlzIGNvbXBsZXRlLAorICogaW5jbHVzaXZlIHRvdGFsIG1lc3NhZ2UgbGVuZ3RoLiBWZXJ5IHRpbWUgY3JpdGljYWwuCisgKiBMaW5rIGlzIGxvY2tlZC4gUmV0dXJucyB1c2VyIGRhdGEgbGVuZ3RoLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmtfc2VuZF9idWZfZmFzdChzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBza19idWZmICpidWYsCisJCQkJICAgICB1MzIgKnVzZWRfbWF4X3BrdCkKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwlpbnQgcmVzID0gbXNnX2RhdGFfc3oobXNnKTsKKworCWlmIChsaWtlbHkoIWxpbmtfY29uZ2VzdGVkKGxfcHRyKSkpIHsKKwkJaWYgKGxpa2VseShtc2dfc2l6ZShtc2cpIDw9IGxpbmtfbWF4X3BrdChsX3B0cikpKSB7CisJCQlpZiAobGlrZWx5KGxpc3RfZW1wdHkoJmxfcHRyLT5iX3B0ci0+Y29uZ19saW5rcykpKSB7CisJCQkJbGlua19hZGRfdG9fb3V0cXVldWUobF9wdHIsIGJ1ZiwgbXNnKTsKKwkJCQlpZiAobGlrZWx5KGJlYXJlcl9zZW5kKGxfcHRyLT5iX3B0ciwgYnVmLAorCQkJCQkJICAgICAgICZsX3B0ci0+bWVkaWFfYWRkcikpKSB7CisJCQkJCWxfcHRyLT51bmFja2VkX3dpbmRvdyA9IDA7CisJCQkJCW1zZ19kYmcobXNnLCJTRU5UX0ZBU1Q6Iik7CisJCQkJCXJldHVybiByZXM7CisJCQkJfQorCQkJCWRiZygiZmFpbGVkIHNlbnQgZmFzdC4uLlxuIik7CisJCQkJYmVhcmVyX3NjaGVkdWxlKGxfcHRyLT5iX3B0ciwgbF9wdHIpOworCQkJCWxfcHRyLT5zdGF0cy5iZWFyZXJfY29uZ3MrKzsKKwkJCQlsX3B0ci0+bmV4dF9vdXQgPSBidWY7CisJCQkJcmV0dXJuIHJlczsKKwkJCX0KKwkJfQorCQllbHNlCisJCQkqdXNlZF9tYXhfcGt0ID0gbGlua19tYXhfcGt0KGxfcHRyKTsKKwl9CisJcmV0dXJuIGxpbmtfc2VuZF9idWYobF9wdHIsIGJ1Zik7ICAvKiBBbGwgb3RoZXIgY2FzZXMgKi8KK30KKworLyogCisgKiB0aXBjX3NlbmRfYnVmX2Zhc3Q6IEVudHJ5IGZvciBkYXRhIG1lc3NhZ2VzIHdoZXJlIHRoZSAKKyAqIGRlc3RpbmF0aW9uIG5vZGUgaXMga25vd24gYW5kIHRoZSBoZWFkZXIgaXMgY29tcGxldGUsCisgKiBpbmNsdXNpdmUgdG90YWwgbWVzc2FnZSBsZW5ndGguCisgKiBSZXR1cm5zIHVzZXIgZGF0YSBsZW5ndGguCisgKi8KK2ludCB0aXBjX3NlbmRfYnVmX2Zhc3Qoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgdTMyIGRlc3Rub2RlKQoreworCXN0cnVjdCBsaW5rICpsX3B0cjsKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CisJaW50IHJlczsKKwl1MzIgc2VsZWN0b3IgPSBtc2dfb3JpZ3BvcnQoYnVmX21zZyhidWYpKSAmIDE7CisJdTMyIGR1bW15OworCisJaWYgKGRlc3Rub2RlID09IHRpcGNfb3duX2FkZHIpCisJCXJldHVybiBwb3J0X3JlY3ZfbXNnKGJ1Zik7CisKKwlyZWFkX2xvY2tfYmgoJm5ldF9sb2NrKTsKKwluX3B0ciA9IG5vZGVfc2VsZWN0KGRlc3Rub2RlLCBzZWxlY3Rvcik7CisJaWYgKGxpa2VseShuX3B0cikpIHsKKwkJbm9kZV9sb2NrKG5fcHRyKTsKKwkJbF9wdHIgPSBuX3B0ci0+YWN0aXZlX2xpbmtzW3NlbGVjdG9yXTsKKwkJZGJnKCJzZW5kX2Zhc3Q6IGJ1ZiAleCBzZWxlY3RlZCAleCwgZGVzdG5vZGUgPSAleFxuIiwKKwkJICAgIGJ1ZiwgbF9wdHIsIGRlc3Rub2RlKTsKKwkJaWYgKGxpa2VseShsX3B0cikpIHsKKwkJCXJlcyA9IGxpbmtfc2VuZF9idWZfZmFzdChsX3B0ciwgYnVmLCAmZHVtbXkpOworCQkJbm9kZV91bmxvY2sobl9wdHIpOworCQkJcmVhZF91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwkJCXJldHVybiByZXM7CisJCX0KKwkJbm9kZV91bmxvY2sobl9wdHIpOworCX0KKwlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOworCXJlcyA9IG1zZ19kYXRhX3N6KGJ1Zl9tc2coYnVmKSk7CisJdGlwY19yZWplY3RfbXNnKGJ1ZiwgVElQQ19FUlJfTk9fTk9ERSk7CisJcmV0dXJuIHJlczsKK30KKworCisvKiAKKyAqIGxpbmtfc2VuZF9zZWN0aW9uc19mYXN0OiBFbnRyeSBmb3IgbWVzc2FnZXMgd2hlcmUgdGhlIAorICogZGVzdGluYXRpb24gcHJvY2Vzc29yIGlzIGtub3duIGFuZCB0aGUgaGVhZGVyIGlzIGNvbXBsZXRlLAorICogZXhjZXB0IGZvciB0b3RhbCBtZXNzYWdlIGxlbmd0aC4gCisgKiBSZXR1cm5zIHVzZXIgZGF0YSBsZW5ndGggb3IgZXJybm8uCisgKi8KK2ludCBsaW5rX3NlbmRfc2VjdGlvbnNfZmFzdChzdHJ1Y3QgcG9ydCAqc2VuZGVyLCAKKwkJCSAgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LAorCQkJICAgIGNvbnN0IHUzMiBudW1fc2VjdCwgCisJCQkgICAgdTMyIGRlc3RhZGRyKQoreworCXN0cnVjdCB0aXBjX21zZyAqaGRyID0gJnNlbmRlci0+cHVibC5waGRyOworCXN0cnVjdCBsaW5rICpsX3B0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCBub2RlICpub2RlOworCWludCByZXM7CisJdTMyIHNlbGVjdG9yID0gbXNnX29yaWdwb3J0KGhkcikgJiAxOworCisJYXNzZXJ0KGRlc3RhZGRyICE9IHRpcGNfb3duX2FkZHIpOworCithZ2FpbjoKKwkvKgorCSAqIFRyeSBidWlsZGluZyBtZXNzYWdlIHVzaW5nIHBvcnQncyBtYXhfcGt0IGhpbnQuCisJICogKE11c3Qgbm90IGhvbGQgYW55IGxvY2tzIHdoaWxlIGJ1aWxkaW5nIG1lc3NhZ2UuKQorCSAqLworCisJcmVzID0gbXNnX2J1aWxkKGhkciwgbXNnX3NlY3QsIG51bV9zZWN0LCBzZW5kZXItPm1heF9wa3QsCisJCQkhc2VuZGVyLT51c2VyX3BvcnQsICZidWYpOworCisJcmVhZF9sb2NrX2JoKCZuZXRfbG9jayk7CisJbm9kZSA9IG5vZGVfc2VsZWN0KGRlc3RhZGRyLCBzZWxlY3Rvcik7CisJaWYgKGxpa2VseShub2RlKSkgeworCQlub2RlX2xvY2sobm9kZSk7CisJCWxfcHRyID0gbm9kZS0+YWN0aXZlX2xpbmtzW3NlbGVjdG9yXTsKKwkJaWYgKGxpa2VseShsX3B0cikpIHsKKwkJCWlmIChsaWtlbHkoYnVmKSkgeworCQkJCXJlcyA9IGxpbmtfc2VuZF9idWZfZmFzdChsX3B0ciwgYnVmLAorCQkJCQkJCSAmc2VuZGVyLT5tYXhfcGt0KTsKKwkJCQlpZiAodW5saWtlbHkocmVzIDwgMCkpCisJCQkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CitleGl0OgorCQkJCW5vZGVfdW5sb2NrKG5vZGUpOworCQkJCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisJCQkJcmV0dXJuIHJlczsKKwkJCX0KKworCQkJLyogRXhpdCBpZiBidWlsZCByZXF1ZXN0IHdhcyBpbnZhbGlkICovCisKKwkJCWlmICh1bmxpa2VseShyZXMgPCAwKSkKKwkJCQlnb3RvIGV4aXQ7CisKKwkJCS8qIEV4aXQgaWYgbGluayAob3IgYmVhcmVyKSBpcyBjb25nZXN0ZWQgKi8KKworCQkJaWYgKGxpbmtfY29uZ2VzdGVkKGxfcHRyKSB8fCAKKwkJCSAgICAhbGlzdF9lbXB0eSgmbF9wdHItPmJfcHRyLT5jb25nX2xpbmtzKSkgeworCQkJCXJlcyA9IGxpbmtfc2NoZWR1bGVfcG9ydChsX3B0ciwKKwkJCQkJCQkgc2VuZGVyLT5wdWJsLnJlZiwgcmVzKTsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisKKwkJCS8qIAorCQkJICogTWVzc2FnZSBzaXplIGV4Y2VlZHMgbWF4X3BrdCBoaW50OyB1cGRhdGUgaGludCwKKwkJCSAqIHRoZW4gcmUtdHJ5IGZhc3QgcGF0aCBvciBmcmFnbWVudCB0aGUgbWVzc2FnZQorCQkJICovCisKKwkJCXNlbmRlci0+bWF4X3BrdCA9IGxpbmtfbWF4X3BrdChsX3B0cik7CisJCQlub2RlX3VubG9jayhub2RlKTsKKwkJCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisKKworCQkJaWYgKChtc2dfaGRyX3N6KGhkcikgKyByZXMpIDw9IHNlbmRlci0+bWF4X3BrdCkKKwkJCQlnb3RvIGFnYWluOworCisJCQlyZXR1cm4gbGlua19zZW5kX3NlY3Rpb25zX2xvbmcoc2VuZGVyLCBtc2dfc2VjdCwKKwkJCQkJCSAgICAgICBudW1fc2VjdCwgZGVzdGFkZHIpOworCQl9CisJCW5vZGVfdW5sb2NrKG5vZGUpOworCX0KKwlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOworCisJLyogQ291bGRuJ3QgZmluZCBhIGxpbmsgdG8gdGhlIGRlc3RpbmF0aW9uIG5vZGUgKi8KKworCWlmIChidWYpCisJCXJldHVybiB0aXBjX3JlamVjdF9tc2coYnVmLCBUSVBDX0VSUl9OT19OT0RFKTsKKwlpZiAocmVzID49IDApCisJCXJldHVybiBwb3J0X3JlamVjdF9zZWN0aW9ucyhzZW5kZXIsIGhkciwgbXNnX3NlY3QsIG51bV9zZWN0LAorCQkJCQkgICAgVElQQ19FUlJfTk9fTk9ERSk7CisJcmV0dXJuIHJlczsKK30KKworLyogCisgKiBsaW5rX3NlbmRfc2VjdGlvbnNfbG9uZygpOiBFbnRyeSBmb3IgbG9uZyBtZXNzYWdlcyB3aGVyZSB0aGUgCisgKiBkZXN0aW5hdGlvbiBub2RlIGlzIGtub3duIGFuZCB0aGUgaGVhZGVyIGlzIGNvbXBsZXRlLAorICogaW5jbHVzaXZlIHRvdGFsIG1lc3NhZ2UgbGVuZ3RoLiAKKyAqIExpbmsgYW5kIGJlYXJlciBjb25nZXN0aW9uIHN0YXR1cyBoYXZlIGJlZW4gY2hlY2tlZCB0byBiZSBvaywKKyAqIGFuZCBhcmUgaWdub3JlZCBpZiB0aGV5IGNoYW5nZS4KKyAqCisgKiBOb3RlIHRoYXQgZnJhZ21lbnRzIGRvIG5vdCB1c2UgdGhlIGZ1bGwgbGluayBNVFUgc28gdGhhdCB0aGV5IHdvbid0IGhhdmUKKyAqIHRvIHVuZGVyZ28gcmVmcmFnbWVudGF0aW9uIGlmIGxpbmsgY2hhbmdlb3ZlciBjYXVzZXMgdGhlbSB0byBiZSBzZW50CisgKiBvdmVyIGFub3RoZXIgbGluayB3aXRoIGFuIGFkZGl0aW9uYWwgdHVubmVsIGhlYWRlciBhZGRlZCBhcyBwcmVmaXguCisgKiAoUmVmcmFnbWVudGF0aW9uIHdpbGwgc3RpbGwgb2NjdXIgaWYgdGhlIG90aGVyIGxpbmsgaGFzIGEgc21hbGxlciBNVFUuKQorICoKKyAqIFJldHVybnMgdXNlciBkYXRhIGxlbmd0aCBvciBlcnJuby4KKyAqLworc3RhdGljIGludCBsaW5rX3NlbmRfc2VjdGlvbnNfbG9uZyhzdHJ1Y3QgcG9ydCAqc2VuZGVyLAorCQkJCSAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsCisJCQkJICAgdTMyIG51bV9zZWN0LAorCQkJCSAgIHUzMiBkZXN0YWRkcikKK3sKKwlzdHJ1Y3QgbGluayAqbF9wdHI7CisJc3RydWN0IG5vZGUgKm5vZGU7CisJc3RydWN0IHRpcGNfbXNnICpoZHIgPSAmc2VuZGVyLT5wdWJsLnBoZHI7CisJdTMyIGRzeiA9IG1zZ19kYXRhX3N6KGhkcik7CisJdTMyIG1heF9wa3QsZnJhZ21fc3oscmVzdDsKKwlzdHJ1Y3QgdGlwY19tc2cgZnJhZ21faGRyOworCXN0cnVjdCBza19idWZmICpidWYsKmJ1Zl9jaGFpbiwqcHJldjsKKwl1MzIgZnJhZ21fY3JzLGZyYWdtX3Jlc3QsaHN6LHNlY3RfcmVzdDsKKwljb25zdCB1bmNoYXIgKnNlY3RfY3JzOworCWludCBjdXJyX3NlY3Q7CisJdTMyIGZyYWdtX25vOworCithZ2FpbjoKKwlmcmFnbV9ubyA9IDE7CisJbWF4X3BrdCA9IHNlbmRlci0+bWF4X3BrdCAtIElOVF9IX1NJWkU7ICAKKwkJLyogbGVhdmUgcm9vbSBmb3IgdHVubmVsIGhlYWRlciBpbiBjYXNlIG9mIGxpbmsgY2hhbmdlb3ZlciAqLworCWZyYWdtX3N6ID0gbWF4X3BrdCAtIElOVF9IX1NJWkU7IAorCQkvKiBsZWF2ZSByb29tIGZvciBmcmFnbWVudGF0aW9uIGhlYWRlciBpbiBlYWNoIGZyYWdtZW50ICovCisJcmVzdCA9IGRzejsKKwlmcmFnbV9jcnMgPSAwOworCWZyYWdtX3Jlc3QgPSAwOworCXNlY3RfcmVzdCA9IDA7CisJc2VjdF9jcnMgPSAwOworCWN1cnJfc2VjdCA9IC0xOworCisJLyogUHJlcGFyZSByZXVzYWJsZSBmcmFnbWVudCBoZWFkZXI6ICovCisKKwltc2dfZGJnKGhkciwgIj5GUkFHTUVOVElORz4iKTsKKwltc2dfaW5pdCgmZnJhZ21faGRyLCBNU0dfRlJBR01FTlRFUiwgRklSU1RfRlJBR01FTlQsCisJCSBUSVBDX09LLCBJTlRfSF9TSVpFLCBtc2dfZGVzdG5vZGUoaGRyKSk7CisJbXNnX3NldF9saW5rX3NlbGVjdG9yKCZmcmFnbV9oZHIsIHNlbmRlci0+cHVibC5yZWYpOworCW1zZ19zZXRfc2l6ZSgmZnJhZ21faGRyLCBtYXhfcGt0KTsKKwltc2dfc2V0X2ZyYWdtX25vKCZmcmFnbV9oZHIsIDEpOworCisJLyogUHJlcGFyZSBoZWFkZXIgb2YgZmlyc3QgZnJhZ21lbnQ6ICovCisKKwlidWZfY2hhaW4gPSBidWYgPSBidWZfYWNxdWlyZShtYXhfcGt0KTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJYnVmLT5uZXh0ID0gTlVMTDsKKwltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopJmZyYWdtX2hkciwgSU5UX0hfU0laRSk7CisJaHN6ID0gbXNnX2hkcl9zeihoZHIpOworCW1lbWNweShidWYtPmRhdGEgKyBJTlRfSF9TSVpFLCAodW5jaGFyICopaGRyLCBoc3opOworCW1zZ19kYmcoYnVmX21zZyhidWYpLCAiPkJVSUxEPiIpOworCisJLyogQ2hvcCB1cCBtZXNzYWdlOiAqLworCisJZnJhZ21fY3JzID0gSU5UX0hfU0laRSArIGhzejsKKwlmcmFnbV9yZXN0ID0gZnJhZ21fc3ogLSBoc3o7CisKKwlkbyB7CQkvKiBGb3IgYWxsIHNlY3Rpb25zICovCisJCXUzMiBzejsKKworCQlpZiAoIXNlY3RfcmVzdCkgeworCQkJc2VjdF9yZXN0ID0gbXNnX3NlY3RbKytjdXJyX3NlY3RdLmlvdl9sZW47CisJCQlzZWN0X2NycyA9IChjb25zdCB1bmNoYXIgKiltc2dfc2VjdFtjdXJyX3NlY3RdLmlvdl9iYXNlOworCQl9CisKKwkJaWYgKHNlY3RfcmVzdCA8IGZyYWdtX3Jlc3QpCisJCQlzeiA9IHNlY3RfcmVzdDsKKwkJZWxzZQorCQkJc3ogPSBmcmFnbV9yZXN0OworCisJCWlmIChsaWtlbHkoIXNlbmRlci0+dXNlcl9wb3J0KSkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1Zi0+ZGF0YSArIGZyYWdtX2Nycywgc2VjdF9jcnMsIHN6KSkgeworZXJyb3I6CisJCQkJZm9yICg7IGJ1Zl9jaGFpbjsgYnVmX2NoYWluID0gYnVmKSB7CisJCQkJCWJ1ZiA9IGJ1Zl9jaGFpbi0+bmV4dDsKKwkJCQkJYnVmX2Rpc2NhcmQoYnVmX2NoYWluKTsKKwkJCQl9CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0gZWxzZQorCQkJbWVtY3B5KGJ1Zi0+ZGF0YSArIGZyYWdtX2Nycywgc2VjdF9jcnMsIHN6KTsKKworCQlzZWN0X2NycyArPSBzejsKKwkJc2VjdF9yZXN0IC09IHN6OworCQlmcmFnbV9jcnMgKz0gc3o7CisJCWZyYWdtX3Jlc3QgLT0gc3o7CisJCXJlc3QgLT0gc3o7CisKKwkJaWYgKCFmcmFnbV9yZXN0ICYmIHJlc3QpIHsKKworCQkJLyogSW5pdGlhdGUgbmV3IGZyYWdtZW50OiAqLworCQkJaWYgKHJlc3QgPD0gZnJhZ21fc3opIHsKKwkJCQlmcmFnbV9zeiA9IHJlc3Q7CisJCQkJbXNnX3NldF90eXBlKCZmcmFnbV9oZHIsTEFTVF9GUkFHTUVOVCk7CisJCQl9IGVsc2UgeworCQkJCW1zZ19zZXRfdHlwZSgmZnJhZ21faGRyLCBGUkFHTUVOVCk7CisJCQl9CisJCQltc2dfc2V0X3NpemUoJmZyYWdtX2hkciwgZnJhZ21fc3ogKyBJTlRfSF9TSVpFKTsKKwkJCW1zZ19zZXRfZnJhZ21fbm8oJmZyYWdtX2hkciwgKytmcmFnbV9ubyk7CisJCQlwcmV2ID0gYnVmOworCQkJYnVmID0gYnVmX2FjcXVpcmUoZnJhZ21fc3ogKyBJTlRfSF9TSVpFKTsKKwkJCWlmICghYnVmKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCWJ1Zi0+bmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXByZXYtPm5leHQgPSBidWY7CisJCQltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopJmZyYWdtX2hkciwgSU5UX0hfU0laRSk7CisJCQlmcmFnbV9jcnMgPSBJTlRfSF9TSVpFOworCQkJZnJhZ21fcmVzdCA9IGZyYWdtX3N6OworCQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksIiAgPkJVSUxEPiIpOworCQl9CisJfQorCXdoaWxlIChyZXN0ID4gMCk7CisKKwkvKiAKKwkgKiBOb3cgd2UgaGF2ZSBhIGJ1ZmZlciBjaGFpbi4gU2VsZWN0IGEgbGluayBhbmQgY2hlY2sKKwkgKiB0aGF0IHBhY2tldCBzaXplIGlzIHN0aWxsIE9LCisJICovCisJbm9kZSA9IG5vZGVfc2VsZWN0KGRlc3RhZGRyLCBzZW5kZXItPnB1YmwucmVmICYgMSk7CisJaWYgKGxpa2VseShub2RlKSkgeworCQlub2RlX2xvY2sobm9kZSk7CisJCWxfcHRyID0gbm9kZS0+YWN0aXZlX2xpbmtzW3NlbmRlci0+cHVibC5yZWYgJiAxXTsKKwkJaWYgKCFsX3B0cikgeworCQkJbm9kZV91bmxvY2sobm9kZSk7CisJCQlnb3RvIHJlamVjdDsKKwkJfQorCQlpZiAobGlua19tYXhfcGt0KGxfcHRyKSA8IG1heF9wa3QpIHsKKwkJCXNlbmRlci0+bWF4X3BrdCA9IGxpbmtfbWF4X3BrdChsX3B0cik7CisJCQlub2RlX3VubG9jayhub2RlKTsKKwkJCWZvciAoOyBidWZfY2hhaW47IGJ1Zl9jaGFpbiA9IGJ1ZikgeworCQkJCWJ1ZiA9IGJ1Zl9jaGFpbi0+bmV4dDsKKwkJCQlidWZfZGlzY2FyZChidWZfY2hhaW4pOworCQkJfQorCQkJZ290byBhZ2FpbjsKKwkJfQorCX0gZWxzZSB7CityZWplY3Q6CisJCWZvciAoOyBidWZfY2hhaW47IGJ1Zl9jaGFpbiA9IGJ1ZikgeworCQkJYnVmID0gYnVmX2NoYWluLT5uZXh0OworCQkJYnVmX2Rpc2NhcmQoYnVmX2NoYWluKTsKKwkJfQorCQlyZXR1cm4gcG9ydF9yZWplY3Rfc2VjdGlvbnMoc2VuZGVyLCBoZHIsIG1zZ19zZWN0LCBudW1fc2VjdCwKKwkJCQkJICAgIFRJUENfRVJSX05PX05PREUpOworCX0KKworCS8qIEFwcGVuZCB3aG9sZSBjaGFpbiB0byBzZW5kIHF1ZXVlOiAqLworCisJYnVmID0gYnVmX2NoYWluOworCWxfcHRyLT5sb25nX21zZ19zZXFfbm8gPSBtb2QobF9wdHItPmxvbmdfbXNnX3NlcV9ubyArIDEpOworCWlmICghbF9wdHItPm5leHRfb3V0KQorCQlsX3B0ci0+bmV4dF9vdXQgPSBidWZfY2hhaW47CisJbF9wdHItPnN0YXRzLnNlbnRfZnJhZ21lbnRlZCsrOworCXdoaWxlIChidWYpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBidWYtPm5leHQ7CisJCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCisJCWxfcHRyLT5zdGF0cy5zZW50X2ZyYWdtZW50cysrOworCQltc2dfc2V0X2xvbmdfbXNnbm8obXNnLCBsX3B0ci0+bG9uZ19tc2dfc2VxX25vKTsKKwkJbGlua19hZGRfdG9fb3V0cXVldWUobF9wdHIsIGJ1ZiwgbXNnKTsKKwkJbXNnX2RiZyhtc2csICI+QUREPiIpOworCQlidWYgPSBuZXh0OworCX0KKworCS8qIFNlbmQgaXQsIGlmIHBvc3NpYmxlOiAqLworCisJbGlua19wdXNoX3F1ZXVlKGxfcHRyKTsKKwlub2RlX3VubG9jayhub2RlKTsKKwlyZXR1cm4gZHN6OworfQorCisvKiAKKyAqIGxpbmtfcHVzaF9wYWNrZXQ6IFB1c2ggb25lIHVuc2VudCBwYWNrZXQgdG8gdGhlIG1lZGlhCisgKi8KK3UzMiBsaW5rX3B1c2hfcGFja2V0KHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gbF9wdHItPmZpcnN0X291dDsKKwl1MzIgcl9xX3NpemUgPSBsX3B0ci0+cmV0cmFuc21fcXVldWVfc2l6ZTsKKwl1MzIgcl9xX2hlYWQgPSBsX3B0ci0+cmV0cmFuc21fcXVldWVfaGVhZDsKKworCS8qIFN0ZXAgdG8gcG9zaXRpb24gd2hlcmUgcmV0cmFuc21pc3Npb24gZmFpbGVkLCBpZiBhbnksICAgICovCisJLyogY29uc2lkZXIgdGhhdCBidWZmZXJzIG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgaW4gbWVhbnRpbWUgKi8KKworCWlmIChyX3Ffc2l6ZSAmJiBidWYpIHsKKwkJdTMyIGxhc3QgPSBsZXNzZXIobW9kKHJfcV9oZWFkICsgcl9xX3NpemUpLCAKKwkJCQkgIGxpbmtfbGFzdF9zZW50KGxfcHRyKSk7CisJCXUzMiBmaXJzdCA9IG1zZ19zZXFubyhidWZfbXNnKGJ1ZikpOworCisJCXdoaWxlIChidWYgJiYgbGVzcyhmaXJzdCwgcl9xX2hlYWQpKSB7CisJCQlmaXJzdCA9IG1vZChmaXJzdCArIDEpOworCQkJYnVmID0gYnVmLT5uZXh0OworCQl9CisJCWxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9oZWFkID0gcl9xX2hlYWQgPSBmaXJzdDsKKwkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX3NpemUgPSByX3Ffc2l6ZSA9IG1vZChsYXN0IC0gZmlyc3QpOworCX0KKworCS8qIENvbnRpbnVlIHJldHJhbnNtaXNzaW9uIG5vdywgaWYgdGhlcmUgaXMgYW55dGhpbmc6ICovCisKKwlpZiAocl9xX3NpemUgJiYgYnVmICYmICFza2JfY2xvbmVkKGJ1ZikpIHsKKwkJbXNnX3NldF9hY2soYnVmX21zZyhidWYpLCBtb2QobF9wdHItPm5leHRfaW5fbm8gLSAxKSk7CisJCW1zZ19zZXRfYmNhc3RfYWNrKGJ1Zl9tc2coYnVmKSwgbF9wdHItPm93bmVyLT5iY2xpbmsubGFzdF9pbik7IAorCQlpZiAoYmVhcmVyX3NlbmQobF9wdHItPmJfcHRyLCBidWYsICZsX3B0ci0+bWVkaWFfYWRkcikpIHsKKwkJCW1zZ19kYmcoYnVmX21zZyhidWYpLCAiPkRFRi1SRVRSPiIpOworCQkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX2hlYWQgPSBtb2QoKytyX3FfaGVhZCk7CisJCQlsX3B0ci0+cmV0cmFuc21fcXVldWVfc2l6ZSA9IC0tcl9xX3NpemU7CisJCQlsX3B0ci0+c3RhdHMucmV0cmFuc21pdHRlZCsrOworCQkJcmV0dXJuIFRJUENfT0s7CisJCX0gZWxzZSB7CisJCQlsX3B0ci0+c3RhdHMuYmVhcmVyX2NvbmdzKys7CisJCQltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgInw+REVGLVJFVFI+Iik7CisJCQlyZXR1cm4gUFVTSF9GQUlMRUQ7CisJCX0KKwl9CisKKwkvKiBTZW5kIGRlZmVycmVkIHByb3RvY29sIG1lc3NhZ2UsIGlmIGFueTogKi8KKworCWJ1ZiA9IGxfcHRyLT5wcm90b19tc2dfcXVldWU7CisJaWYgKGJ1ZikgeworCQltc2dfc2V0X2FjayhidWZfbXNnKGJ1ZiksIG1vZChsX3B0ci0+bmV4dF9pbl9ubyAtIDEpKTsKKwkJbXNnX3NldF9iY2FzdF9hY2soYnVmX21zZyhidWYpLGxfcHRyLT5vd25lci0+YmNsaW5rLmxhc3RfaW4pOyAKKwkJaWYgKGJlYXJlcl9zZW5kKGxfcHRyLT5iX3B0ciwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpKSB7CisJCQltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgIj5ERUYtUFJPVD4iKTsKKwkJCWxfcHRyLT51bmFja2VkX3dpbmRvdyA9IDA7CisJCQlidWZfZGlzY2FyZChidWYpOworCQkJbF9wdHItPnByb3RvX21zZ19xdWV1ZSA9IDA7CisJCQlyZXR1cm4gVElQQ19PSzsKKwkJfSBlbHNlIHsKKwkJCW1zZ19kYmcoYnVmX21zZyhidWYpLCAifD5ERUYtUFJPVD4iKTsKKwkJCWxfcHRyLT5zdGF0cy5iZWFyZXJfY29uZ3MrKzsKKwkJCXJldHVybiBQVVNIX0ZBSUxFRDsKKwkJfQorCX0KKworCS8qIFNlbmQgb25lIGRlZmVycmVkIGRhdGEgbWVzc2FnZSwgaWYgc2VuZCB3aW5kb3cgbm90IGZ1bGw6ICovCisKKwlidWYgPSBsX3B0ci0+bmV4dF9vdXQ7CisJaWYgKGJ1ZikgeworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJdTMyIG5leHQgPSBtc2dfc2Vxbm8obXNnKTsKKwkJdTMyIGZpcnN0ID0gbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPmZpcnN0X291dCkpOworCisJCWlmIChtb2QobmV4dCAtIGZpcnN0KSA8IGxfcHRyLT5xdWV1ZV9saW1pdFswXSkgeworCQkJbXNnX3NldF9hY2sobXNnLCBtb2QobF9wdHItPm5leHRfaW5fbm8gLSAxKSk7CisJCQltc2dfc2V0X2JjYXN0X2Fjayhtc2csIGxfcHRyLT5vd25lci0+YmNsaW5rLmxhc3RfaW4pOyAKKwkJCWlmIChiZWFyZXJfc2VuZChsX3B0ci0+Yl9wdHIsIGJ1ZiwgJmxfcHRyLT5tZWRpYV9hZGRyKSkgeworCQkJCWlmIChtc2dfdXNlcihtc2cpID09IE1TR19CVU5ETEVSKQorCQkJCQltc2dfc2V0X3R5cGUobXNnLCBDTE9TRURfTVNHKTsKKwkJCQltc2dfZGJnKG1zZywgIj5QVVNILURBVEE+Iik7CisJCQkJbF9wdHItPm5leHRfb3V0ID0gYnVmLT5uZXh0OworCQkJCXJldHVybiBUSVBDX09LOworCQkJfSBlbHNlIHsKKwkJCQltc2dfZGJnKG1zZywgInxQVVNILURBVEF8Iik7CisJCQkJbF9wdHItPnN0YXRzLmJlYXJlcl9jb25ncysrOworCQkJCXJldHVybiBQVVNIX0ZBSUxFRDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gUFVTSF9GSU5JU0hFRDsKK30KKworLyoKKyAqIHB1c2hfcXVldWUoKTogcHVzaCBvdXQgdGhlIHVuc2VudCBtZXNzYWdlcyBvZiBhIGxpbmsgd2hlcmUKKyAqICAgICAgICAgICAgICAgY29uZ2VzdGlvbiBoYXMgYWJhdGVkLiBOb2RlIGlzIGxvY2tlZAorICovCit2b2lkIGxpbmtfcHVzaF9xdWV1ZShzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJdTMyIHJlczsKKworCWlmIChiZWFyZXJfY29uZ2VzdGVkKGxfcHRyLT5iX3B0ciwgbF9wdHIpKQorCQlyZXR1cm47CisKKwlkbyB7CisJCXJlcyA9IGxpbmtfcHVzaF9wYWNrZXQobF9wdHIpOworCX0KKwl3aGlsZSAocmVzID09IFRJUENfT0spOworCWlmIChyZXMgPT0gUFVTSF9GQUlMRUQpCisJCWJlYXJlcl9zY2hlZHVsZShsX3B0ci0+Yl9wdHIsIGxfcHRyKTsKK30KKwordm9pZCBsaW5rX3JldHJhbnNtaXQoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCAKKwkJICAgICB1MzIgcmV0cmFuc21pdHMpCit7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisKKwlkYmcoIlJldHJhbnNtaXR0aW5nICV1IGluIGxpbmsgJXhcbiIsIHJldHJhbnNtaXRzLCBsX3B0cik7CisKKwlpZiAoYmVhcmVyX2Nvbmdlc3RlZChsX3B0ci0+Yl9wdHIsIGxfcHRyKSAmJiBidWYgJiYgIXNrYl9jbG9uZWQoYnVmKSkgeworCQltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgIj5OT19SRVRSLT5CQ09ORz4iKTsKKwkJZGJnX3ByaW50X2xpbmsobF9wdHIsICIgICAiKTsKKwkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX2hlYWQgPSBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKKwkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX3NpemUgPSByZXRyYW5zbWl0czsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAocmV0cmFuc21pdHMgJiYgKGJ1ZiAhPSBsX3B0ci0+bmV4dF9vdXQpICYmIGJ1ZiAmJiAhc2tiX2Nsb25lZChidWYpKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX3NldF9hY2sobXNnLCBtb2QobF9wdHItPm5leHRfaW5fbm8gLSAxKSk7CisJCW1zZ19zZXRfYmNhc3RfYWNrKG1zZywgbF9wdHItPm93bmVyLT5iY2xpbmsubGFzdF9pbik7IAorCQlpZiAoYmVhcmVyX3NlbmQobF9wdHItPmJfcHRyLCBidWYsICZsX3B0ci0+bWVkaWFfYWRkcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhdGNoIGlmIHJldHJhbnNtaXNzaW9ucyBmYWlsIHJlcGVhdGVkbHk6ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9wdHItPmxhc3RfcmV0cmFuc21pdHRlZCA9PSBtc2dfc2Vxbm8obXNnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytsX3B0ci0+c3RhbGVfY291bnQgPiAxMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfcHJpbnQoQ09OUywgYnVmX21zZyhidWYpLCAiPlJFVFI+Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbygiLi4uUmV0cmFuc21pdHRlZCAldSB0aW1lc1xuIiwKKwkJCQkJICAgICBsX3B0ci0+c3RhbGVfY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfcHJpbnQobF9wdHIsIENPTlMsICJSZXNldHRpbmcgTGlua1xuIik7OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVzZXQobF9wdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3B0ci0+c3RhbGVfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbF9wdHItPmxhc3RfcmV0cmFuc21pdHRlZCA9IG1zZ19zZXFubyhtc2cpOworCisJCQltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgIj5SRVRSPiIpOworCQkJYnVmID0gYnVmLT5uZXh0OworCQkJcmV0cmFuc21pdHMtLTsKKwkJCWxfcHRyLT5zdGF0cy5yZXRyYW5zbWl0dGVkKys7CisJCX0gZWxzZSB7CisJCQliZWFyZXJfc2NoZWR1bGUobF9wdHItPmJfcHRyLCBsX3B0cik7CisJCQlsX3B0ci0+c3RhdHMuYmVhcmVyX2NvbmdzKys7CisJCQlsX3B0ci0+cmV0cmFuc21fcXVldWVfaGVhZCA9IG1zZ19zZXFubyhidWZfbXNnKGJ1ZikpOworCQkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX3NpemUgPSByZXRyYW5zbWl0czsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlsX3B0ci0+cmV0cmFuc21fcXVldWVfaGVhZCA9IGxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9zaXplID0gMDsKK30KKworLyogCisgKiBsaW5rX3JlY3Zfbm9uX3NlcTogUmVjZWl2ZSBwYWNrZXRzIHdoaWNoIGFyZSBvdXRzaWRlCisgKiAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmsgc2VxdWVuY2UgZmxvdworICovCisKK3N0YXRpYyB2b2lkIGxpbmtfcmVjdl9ub25fc2VxKHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisKKwlpZiAobXNnX3VzZXIobXNnKSA9PSAgTElOS19DT05GSUcpCisJCWRpc2NfcmVjdl9tc2coYnVmKTsKKwllbHNlCisJCWJjbGlua19yZWN2X3BrdChidWYpOworfQorCisvKiogCisgKiBsaW5rX2luc2VydF9kZWZlcnJlZF9xdWV1ZSAtIGluc2VydCBkZWZlcnJlZCBtZXNzYWdlcyBiYWNrIGludG8gcmVjZWl2ZSBjaGFpbgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbGlua19pbnNlcnRfZGVmZXJyZWRfcXVldWUoc3RydWN0IGxpbmsgKmxfcHRyLCAKKwkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwl1MzIgc2VxX25vOworCisJaWYgKGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4gPT0gTlVMTCkKKwkJcmV0dXJuIGJ1ZjsKKworCXNlcV9ubyA9IG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4pKTsKKwlpZiAoc2VxX25vID09IG1vZChsX3B0ci0+bmV4dF9pbl9ubykpIHsKKwkJbF9wdHItPm5ld2VzdF9kZWZlcnJlZF9pbi0+bmV4dCA9IGJ1ZjsKKwkJYnVmID0gbF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbjsKKwkJbF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbiA9IE5VTEw7CisJCWxfcHRyLT5kZWZlcnJlZF9pbnF1ZXVlX3N6ID0gMDsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKwordm9pZCB0aXBjX3JlY3ZfbXNnKHN0cnVjdCBza19idWZmICpoZWFkLCBzdHJ1Y3QgdGlwY19iZWFyZXIgKnRiX3B0cikKK3sKKwlyZWFkX2xvY2tfYmgoJm5ldF9sb2NrKTsKKwl3aGlsZSAoaGVhZCkgeworCQlzdHJ1Y3QgYmVhcmVyICpiX3B0cjsKKwkJc3RydWN0IG5vZGUgKm5fcHRyOworCQlzdHJ1Y3QgbGluayAqbF9wdHI7CisJCXN0cnVjdCBza19idWZmICpjcnM7CisJCXN0cnVjdCBza19idWZmICpidWYgPSBoZWFkOworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJdTMyIHNlcV9ubyA9IG1zZ19zZXFubyhtc2cpOworCQl1MzIgYWNrZCA9IG1zZ19hY2sobXNnKTsKKwkJdTMyIHJlbGVhc2VkID0gMDsKKwkJaW50IHR5cGU7CisKKwkJYl9wdHIgPSAoc3RydWN0IGJlYXJlciAqKXRiX3B0cjsKKwkJVElQQ19TS0JfQ0IoYnVmKS0+aGFuZGxlID0gYl9wdHI7CisKKwkJaGVhZCA9IGhlYWQtPm5leHQ7CisJCWlmICh1bmxpa2VseShtc2dfdmVyc2lvbihtc2cpICE9IFRJUENfVkVSU0lPTikpCisJCQlnb3RvIGNvbnQ7CisjaWYgMAorCQlpZiAobXNnX3VzZXIobXNnKSAhPSBMSU5LX1BST1RPQ09MKQorI2VuZGlmCisJCQltc2dfZGJnKG1zZywiPFJFQzwiKTsKKworCQlpZiAodW5saWtlbHkobXNnX25vbl9zZXEobXNnKSkpIHsKKwkJCWxpbmtfcmVjdl9ub25fc2VxKGJ1Zik7CisJCQljb250aW51ZTsKKwkJfQorCQluX3B0ciA9IG5vZGVfZmluZChtc2dfcHJldm5vZGUobXNnKSk7CisJCWlmICh1bmxpa2VseSghbl9wdHIpKQorCQkJZ290byBjb250OworCisJCW5vZGVfbG9jayhuX3B0cik7CisJCWxfcHRyID0gbl9wdHItPmxpbmtzW2JfcHRyLT5pZGVudGl0eV07CisJCWlmICh1bmxpa2VseSghbF9wdHIpKSB7CisJCQlub2RlX3VubG9jayhuX3B0cik7CisJCQlnb3RvIGNvbnQ7CisJCX0KKwkJLyogCisJCSAqIFJlbGVhc2UgYWNrZWQgbWVzc2FnZXMgCisJCSAqLworCQlpZiAobGVzcyhuX3B0ci0+YmNsaW5rLmFja2VkLCBtc2dfYmNhc3RfYWNrKG1zZykpKSB7CisJCQlpZiAobm9kZV9pc191cChuX3B0cikgJiYgbl9wdHItPmJjbGluay5zdXBwb3J0ZWQpCisJCQkJYmNsaW5rX2Fja25vd2xlZGdlKG5fcHRyLCBtc2dfYmNhc3RfYWNrKG1zZykpOworCQl9CisKKwkJY3JzID0gbF9wdHItPmZpcnN0X291dDsKKwkJd2hpbGUgKChjcnMgIT0gbF9wdHItPm5leHRfb3V0KSAmJiAKKwkJICAgICAgIGxlc3NfZXEobXNnX3NlcW5vKGJ1Zl9tc2coY3JzKSksIGFja2QpKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IGNycy0+bmV4dDsKKworCQkJYnVmX2Rpc2NhcmQoY3JzKTsKKwkJCWNycyA9IG5leHQ7CisJCQlyZWxlYXNlZCsrOworCQl9CisJCWlmIChyZWxlYXNlZCkgeworCQkJbF9wdHItPmZpcnN0X291dCA9IGNyczsKKwkJCWxfcHRyLT5vdXRfcXVldWVfc2l6ZSAtPSByZWxlYXNlZDsKKwkJfQorCQlpZiAodW5saWtlbHkobF9wdHItPm5leHRfb3V0KSkKKwkJCWxpbmtfcHVzaF9xdWV1ZShsX3B0cik7CisJCWlmICh1bmxpa2VseSghbGlzdF9lbXB0eSgmbF9wdHItPndhaXRpbmdfcG9ydHMpKSkKKwkJCWxpbmtfd2FrZXVwX3BvcnRzKGxfcHRyLCAwKTsKKwkJaWYgKHVubGlrZWx5KCsrbF9wdHItPnVuYWNrZWRfd2luZG93ID49IFRJUENfTUlOX0xJTktfV0lOKSkgeworCQkJbF9wdHItPnN0YXRzLnNlbnRfYWNrcysrOworCQkJbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgU1RBVEVfTVNHLCAwLCAwLCAwLCAwLCAwKTsKKwkJfQorCitwcm90b2NvbF9jaGVjazoKKwkJaWYgKGxpa2VseShsaW5rX3dvcmtpbmdfd29ya2luZyhsX3B0cikpKSB7CisJCQlpZiAobGlrZWx5KHNlcV9ubyA9PSBtb2QobF9wdHItPm5leHRfaW5fbm8pKSkgeworCQkJCWxfcHRyLT5uZXh0X2luX25vKys7CisJCQkJaWYgKHVubGlrZWx5KGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4pKQorCQkJCQloZWFkID0gbGlua19pbnNlcnRfZGVmZXJyZWRfcXVldWUobF9wdHIsCisJCQkJCQkJCQkgIGhlYWQpOworCQkJCWlmIChsaWtlbHkobXNnX2lzX2Rlc3QobXNnLCB0aXBjX293bl9hZGRyKSkpIHsKK2RlbGl2ZXI6CisJCQkJCWlmIChsaWtlbHkobXNnX2lzZGF0YShtc2cpKSkgeworCQkJCQkJbm9kZV91bmxvY2sobl9wdHIpOworCQkJCQkJcG9ydF9yZWN2X21zZyhidWYpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJc3dpdGNoIChtc2dfdXNlcihtc2cpKSB7CisJCQkJCWNhc2UgTVNHX0JVTkRMRVI6CisJCQkJCQlsX3B0ci0+c3RhdHMucmVjdl9idW5kbGVzKys7CisJCQkJCQlsX3B0ci0+c3RhdHMucmVjdl9idW5kbGVkICs9IAorCQkJCQkJCW1zZ19tc2djbnQobXNnKTsKKwkJCQkJCW5vZGVfdW5sb2NrKG5fcHRyKTsKKwkJCQkJCWxpbmtfcmVjdl9idW5kbGUoYnVmKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQljYXNlIFJPVVRFX0RJU1RSSUJVVE9SOgorCQkJCQkJbm9kZV91bmxvY2sobl9wdHIpOworCQkJCQkJY2x1c3Rlcl9yZWN2X3JvdXRpbmdfdGFibGUoYnVmKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQljYXNlIE5BTUVfRElTVFJJQlVUT1I6CisJCQkJCQlub2RlX3VubG9jayhuX3B0cik7CisJCQkJCQluYW1lZF9yZWN2KGJ1Zik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJY2FzZSBDT05OX01BTkFHRVI6CisJCQkJCQlub2RlX3VubG9jayhuX3B0cik7CisJCQkJCQlwb3J0X3JlY3ZfcHJvdG9fbXNnKGJ1Zik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJY2FzZSBNU0dfRlJBR01FTlRFUjoKKwkJCQkJCWxfcHRyLT5zdGF0cy5yZWN2X2ZyYWdtZW50cysrOworCQkJCQkJaWYgKGxpbmtfcmVjdl9mcmFnbWVudCgKKwkJCQkJCQkmbF9wdHItPmRlZnJhZ21fYnVmLCAKKwkJCQkJCQkmYnVmLCAmbXNnKSkgeworCQkJCQkJCWxfcHRyLT5zdGF0cy5yZWN2X2ZyYWdtZW50ZWQrKzsKKwkJCQkJCQlnb3RvIGRlbGl2ZXI7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBDSEFOR0VPVkVSX1BST1RPQ09MOgorCQkJCQkJdHlwZSA9IG1zZ190eXBlKG1zZyk7CisJCQkJCQlpZiAobGlua19yZWN2X2NoYW5nZW92ZXJfbXNnKAorCQkJCQkJCSZsX3B0ciwgJmJ1ZikpIHsKKwkJCQkJCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCQkJCQkJc2VxX25vID0gbXNnX3NlcW5vKG1zZyk7CisJCQkJCQkJVElQQ19TS0JfQ0IoYnVmKS0+aGFuZGxlIAorCQkJCQkJCQk9IGJfcHRyOworCQkJCQkJCWlmICh0eXBlID09IE9SSUdJTkFMX01TRykKKwkJCQkJCQkJZ290byBkZWxpdmVyOworCQkJCQkJCWdvdG8gcHJvdG9jb2xfY2hlY2s7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlub2RlX3VubG9jayhuX3B0cik7CisJCQkJbmV0X3JvdXRlX21zZyhidWYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbGlua19oYW5kbGVfb3V0X29mX3NlcV9tc2cobF9wdHIsIGJ1Zik7CisJCQloZWFkID0gbGlua19pbnNlcnRfZGVmZXJyZWRfcXVldWUobF9wdHIsIGhlYWQpOworCQkJbm9kZV91bmxvY2sobl9wdHIpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobXNnX3VzZXIobXNnKSA9PSBMSU5LX1BST1RPQ09MKSB7CisJCQlsaW5rX3JlY3ZfcHJvdG9fbXNnKGxfcHRyLCBidWYpOworCQkJaGVhZCA9IGxpbmtfaW5zZXJ0X2RlZmVycmVkX3F1ZXVlKGxfcHRyLCBoZWFkKTsKKwkJCW5vZGVfdW5sb2NrKG5fcHRyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1zZ19kYmcobXNnLCJOU0VRPFJFQzwiKTsKKwkJbGlua19zdGF0ZV9ldmVudChsX3B0ciwgVFJBRkZJQ19NU0dfRVZUKTsKKworCQlpZiAobGlua193b3JraW5nX3dvcmtpbmcobF9wdHIpKSB7CisJCQkvKiBSZS1pbnNlcnQgaW4gZnJvbnQgb2YgcXVldWUgKi8KKwkJCW1zZ19kYmcobXNnLCJSRUNWLVJFSU5TOiIpOworCQkJYnVmLT5uZXh0ID0gaGVhZDsKKwkJCWhlYWQgPSBidWY7CisJCQlub2RlX3VubG9jayhuX3B0cik7CisJCQljb250aW51ZTsKKwkJfQorCQlub2RlX3VubG9jayhuX3B0cik7Citjb250OgorCQlidWZfZGlzY2FyZChidWYpOworCX0KKwlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOworfQorCisvKiAKKyAqIGxpbmtfZGVmZXJfYnVmKCk6IFNvcnQgYSByZWNlaXZlZCBvdXQtb2Ytc2VxdWVuY2UgcGFja2V0IAorICogICAgICAgICAgICAgICAgICAgaW50byB0aGUgZGVmZXJyZWQgcmVjZXB0aW9uIHF1ZXVlLgorICogUmV0dXJucyB0aGUgaW5jcmVhc2Ugb2YgdGhlIHF1ZXVlIGxlbmd0aCxpLmUuIDAgb3IgMQorICovCisKK3UzMiBsaW5rX2RlZmVyX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWQsCisJCSAgIHN0cnVjdCBza19idWZmICoqdGFpbCwKKwkJICAgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcHJldiA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKmNycyA9ICpoZWFkOworCXUzMiBzZXFfbm8gPSBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKKworCWJ1Zi0+bmV4dCA9IE5VTEw7CisKKwkvKiBFbXB0eSBxdWV1ZSA/ICovCisJaWYgKCpoZWFkID09IE5VTEwpIHsKKwkJKmhlYWQgPSAqdGFpbCA9IGJ1ZjsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogTGFzdCA/ICovCisJaWYgKGxlc3MobXNnX3NlcW5vKGJ1Zl9tc2coKnRhaWwpKSwgc2VxX25vKSkgeworCQkoKnRhaWwpLT5uZXh0ID0gYnVmOworCQkqdGFpbCA9IGJ1ZjsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU2NhbiB0aHJvdWdoIHF1ZXVlIGFuZCBzb3J0IGl0IGluICovCisJZG8geworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coY3JzKTsKKworCQlpZiAobGVzcyhzZXFfbm8sIG1zZ19zZXFubyhtc2cpKSkgeworCQkJYnVmLT5uZXh0ID0gY3JzOworCQkJaWYgKHByZXYpCisJCQkJcHJldi0+bmV4dCA9IGJ1ZjsKKwkJCWVsc2UKKwkJCQkqaGVhZCA9IGJ1ZjsgICAKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChzZXFfbm8gPT0gbXNnX3NlcW5vKG1zZykpIHsKKwkJCWJyZWFrOworCQl9CisJCXByZXYgPSBjcnM7CisJCWNycyA9IGNycy0+bmV4dDsKKwl9CisJd2hpbGUgKGNycyk7CisKKwkvKiBNZXNzYWdlIGlzIGEgZHVwbGljYXRlIG9mIGFuIGV4aXN0aW5nIG1lc3NhZ2UgKi8KKworCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKKy8qKiAKKyAqIGxpbmtfaGFuZGxlX291dF9vZl9zZXFfbXNnIC0gaGFuZGxlIGFycml2YWwgb2Ygb3V0LW9mLXNlcXVlbmNlIHBhY2tldAorICovCisKK3N0YXRpYyB2b2lkIGxpbmtfaGFuZGxlX291dF9vZl9zZXFfbXNnKHN0cnVjdCBsaW5rICpsX3B0ciwgCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpidWYpCit7CisJdTMyIHNlcV9ubyA9IG1zZ19zZXFubyhidWZfbXNnKGJ1ZikpOworCisJaWYgKGxpa2VseShtc2dfdXNlcihidWZfbXNnKGJ1ZikpID09IExJTktfUFJPVE9DT0wpKSB7CisJCWxpbmtfcmVjdl9wcm90b19tc2cobF9wdHIsIGJ1Zik7CisJCXJldHVybjsKKwl9CisKKwlkYmcoInJ4IE9PUyBtc2c6IHNlcV9ubyAldSwgZXhwZWN0aW5nICV1ICgldSlcbiIsIAorCSAgICBzZXFfbm8sIG1vZChsX3B0ci0+bmV4dF9pbl9ubyksIGxfcHRyLT5uZXh0X2luX25vKTsKKworCS8qIFJlY29yZCBPT1MgcGFja2V0IGFycml2YWwgKGZvcmNlIG1pc21hdGNoIG9uIG5leHQgdGltZW91dCkgKi8KKworCWxfcHRyLT5jaGVja3BvaW50LS07CisKKwkvKiAKKwkgKiBEaXNjYXJkIHBhY2tldCBpZiBhIGR1cGxpY2F0ZTsgb3RoZXJ3aXNlIGFkZCBpdCB0byBkZWZlcnJlZCBxdWV1ZQorCSAqIGFuZCBub3RpZnkgcGVlciBvZiBnYXAgYXMgcGVyIHByb3RvY29sIHNwZWNpZmljYXRpb24KKwkgKi8KKworCWlmIChsZXNzKHNlcV9ubywgbW9kKGxfcHRyLT5uZXh0X2luX25vKSkpIHsKKwkJbF9wdHItPnN0YXRzLmR1cGxpY2F0ZXMrKzsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChsaW5rX2RlZmVyX3BrdCgmbF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbiwKKwkJCSAgICZsX3B0ci0+bmV3ZXN0X2RlZmVycmVkX2luLCBidWYpKSB7CisJCWxfcHRyLT5kZWZlcnJlZF9pbnF1ZXVlX3N6Kys7CisJCWxfcHRyLT5zdGF0cy5kZWZlcnJlZF9yZWN2Kys7CisJCWlmICgobF9wdHItPmRlZmVycmVkX2lucXVldWVfc3ogJSAxNikgPT0gMSkKKwkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgMCwgMCwgMCwgMCwgMCk7CisJfSBlbHNlCisJCWxfcHRyLT5zdGF0cy5kdXBsaWNhdGVzKys7Cit9CisKKy8qCisgKiBTZW5kIHByb3RvY29sIG1lc3NhZ2UgdG8gdGhlIG90aGVyIGVuZHBvaW50LgorICovCit2b2lkIGxpbmtfc2VuZF9wcm90b19tc2coc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgbXNnX3R5cCwgaW50IHByb2JlX21zZywKKwkJCSB1MzIgZ2FwLCB1MzIgdG9sZXJhbmNlLCB1MzIgcHJpb3JpdHksIHUzMiBhY2tfbXR1KQoreworCXN0cnVjdCBza19idWZmICpidWYgPSAwOworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gbF9wdHItPnBtc2c7CisgICAgICAgIHUzMiBtc2dfc2l6ZSA9IHNpemVvZihsX3B0ci0+cHJvdG9fbXNnKTsKKworCWlmIChsaW5rX2Jsb2NrZWQobF9wdHIpKQorCQlyZXR1cm47CisJbXNnX3NldF90eXBlKG1zZywgbXNnX3R5cCk7CisJbXNnX3NldF9uZXRfcGxhbmUobXNnLCBsX3B0ci0+Yl9wdHItPm5ldF9wbGFuZSk7CisJbXNnX3NldF9iY2FzdF9hY2sobXNnLCBtb2QobF9wdHItPm93bmVyLT5iY2xpbmsubGFzdF9pbikpOyAKKwltc2dfc2V0X2xhc3RfYmNhc3QobXNnLCBiY2xpbmtfZ2V0X2xhc3Rfc2VudCgpKTsKKworCWlmIChtc2dfdHlwID09IFNUQVRFX01TRykgeworCQl1MzIgbmV4dF9zZW50ID0gbW9kKGxfcHRyLT5uZXh0X291dF9ubyk7CisKKwkJaWYgKCFsaW5rX2lzX3VwKGxfcHRyKSkKKwkJCXJldHVybjsKKwkJaWYgKGxfcHRyLT5uZXh0X291dCkKKwkJCW5leHRfc2VudCA9IG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5uZXh0X291dCkpOworCQltc2dfc2V0X25leHRfc2VudChtc2csIG5leHRfc2VudCk7CisJCWlmIChsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luKSB7CisJCQl1MzIgcmVjID0gbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbikpOworCQkJZ2FwID0gbW9kKHJlYyAtIG1vZChsX3B0ci0+bmV4dF9pbl9ubykpOworCQl9CisJCW1zZ19zZXRfc2VxX2dhcChtc2csIGdhcCk7CisJCWlmIChnYXApCisJCQlsX3B0ci0+c3RhdHMuc2VudF9uYWNrcysrOworCQltc2dfc2V0X2xpbmtfdG9sZXJhbmNlKG1zZywgdG9sZXJhbmNlKTsKKwkJbXNnX3NldF9saW5rcHJpbyhtc2csIHByaW9yaXR5KTsKKwkJbXNnX3NldF9tYXhfcGt0KG1zZywgYWNrX210dSk7CisJCW1zZ19zZXRfYWNrKG1zZywgbW9kKGxfcHRyLT5uZXh0X2luX25vIC0gMSkpOworCQltc2dfc2V0X3Byb2JlKG1zZywgcHJvYmVfbXNnICE9IDApOworCQlpZiAocHJvYmVfbXNnKSB7IAorCQkJdTMyIG10dSA9IGxfcHRyLT5tYXhfcGt0OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG10dSA8IGxfcHRyLT5tYXhfcGt0X3RhcmdldCkgJiYKKwkJCSAgICBsaW5rX3dvcmtpbmdfd29ya2luZyhsX3B0cikgJiYKKwkJCSAgICBsX3B0ci0+ZnNtX21zZ19jbnQpIHsKKwkJCQltc2dfc2l6ZSA9IChtdHUgKyAobF9wdHItPm1heF9wa3RfdGFyZ2V0IC0gbXR1KS8yICsgMikgJiB+MzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfcHRyLT5tYXhfcGt0X3Byb2JlcyA9PSAxMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcHRyLT5tYXhfcGt0X3RhcmdldCA9IChtc2dfc2l6ZSAtIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcHRyLT5tYXhfcGt0X3Byb2JlcyA9IDA7CisJCQkJCW1zZ19zaXplID0gKG10dSArIChsX3B0ci0+bWF4X3BrdF90YXJnZXQgLSBtdHUpLzIgKyAyKSAmIH4zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJbF9wdHItPm1heF9wa3RfcHJvYmVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKwkJCWxfcHRyLT5zdGF0cy5zZW50X3Byb2JlcysrOworICAgICAgICAgICAgICAgIH0KKwkJbF9wdHItPnN0YXRzLnNlbnRfc3RhdGVzKys7CisJfSBlbHNlIHsJCS8qIFJFU0VUX01TRyBvciBBQ1RJVkFURV9NU0cgKi8KKwkJbXNnX3NldF9hY2sobXNnLCBtb2QobF9wdHItPnJlc2V0X2NoZWNrcG9pbnQgLSAxKSk7CisJCW1zZ19zZXRfc2VxX2dhcChtc2csIDApOworCQltc2dfc2V0X25leHRfc2VudChtc2csIDEpOworCQltc2dfc2V0X2xpbmtfdG9sZXJhbmNlKG1zZywgbF9wdHItPnRvbGVyYW5jZSk7CisJCW1zZ19zZXRfbGlua3ByaW8obXNnLCBsX3B0ci0+cHJpb3JpdHkpOworCQltc2dfc2V0X21heF9wa3QobXNnLCBsX3B0ci0+bWF4X3BrdF90YXJnZXQpOworCX0KKworCWlmIChub2RlX2hhc19yZWR1bmRhbnRfbGlua3MobF9wdHItPm93bmVyKSkgeworCQltc2dfc2V0X3JlZHVuZGFudF9saW5rKG1zZyk7CisJfSBlbHNlIHsKKwkJbXNnX2NsZWFyX3JlZHVuZGFudF9saW5rKG1zZyk7CisJfQorCW1zZ19zZXRfbGlua3ByaW8obXNnLCBsX3B0ci0+cHJpb3JpdHkpOworCisJLyogRW5zdXJlIHNlcXVlbmNlIG51bWJlciB3aWxsIG5vdCBmaXQgOiAqLworCisJbXNnX3NldF9zZXFubyhtc2csIG1vZChsX3B0ci0+bmV4dF9vdXRfbm8gKyAoMHhmZmZmLzIpKSk7CisKKwkvKiBDb25nZXN0aW9uPyAqLworCisJaWYgKGJlYXJlcl9jb25nZXN0ZWQobF9wdHItPmJfcHRyLCBsX3B0cikpIHsKKwkJaWYgKCFsX3B0ci0+cHJvdG9fbXNnX3F1ZXVlKSB7CisJCQlsX3B0ci0+cHJvdG9fbXNnX3F1ZXVlID0KKwkJCQlidWZfYWNxdWlyZShzaXplb2YobF9wdHItPnByb3RvX21zZykpOworCQl9CisJCWJ1ZiA9IGxfcHRyLT5wcm90b19tc2dfcXVldWU7CisJCWlmICghYnVmKQorCQkJcmV0dXJuOworCQltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopbXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOworCQlyZXR1cm47CisJfQorCW1zZ19zZXRfdGltZXN0YW1wKG1zZywgamlmZmllc190b19tc2VjcyhqaWZmaWVzKSk7CisKKwkvKiBNZXNzYWdlIGNhbiBiZSBzZW50ICovCisKKwltc2dfZGJnKG1zZywgIj4+Iik7CisKKwlidWYgPSBidWZfYWNxdWlyZShtc2dfc2l6ZSk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKiltc2csIHNpemVvZihsX3B0ci0+cHJvdG9fbXNnKSk7CisgICAgICAgIG1zZ19zZXRfc2l6ZShidWZfbXNnKGJ1ZiksIG1zZ19zaXplKTsKKworCWlmIChiZWFyZXJfc2VuZChsX3B0ci0+Yl9wdHIsIGJ1ZiwgJmxfcHRyLT5tZWRpYV9hZGRyKSkgeworCQlsX3B0ci0+dW5hY2tlZF93aW5kb3cgPSAwOworCQlidWZfZGlzY2FyZChidWYpOworCQlyZXR1cm47CisJfQorCisJLyogTmV3IGNvbmdlc3Rpb24gKi8KKwliZWFyZXJfc2NoZWR1bGUobF9wdHItPmJfcHRyLCBsX3B0cik7CisJbF9wdHItPnByb3RvX21zZ19xdWV1ZSA9IGJ1ZjsKKwlsX3B0ci0+c3RhdHMuYmVhcmVyX2NvbmdzKys7Cit9CisKKy8qCisgKiBSZWNlaXZlIHByb3RvY29sIG1lc3NhZ2UgOgorICogTm90ZSB0aGF0IG5ldHdvcmsgcGxhbmUgaWQgcHJvcGFnYXRlcyB0aHJvdWdoIHRoZSBuZXR3b3JrLCBhbmQgbWF5IAorICogY2hhbmdlIGF0IGFueSB0aW1lLiBUaGUgbm9kZSB3aXRoIGxvd2VzdCBhZGRyZXNzIHJ1bGVzICAgIAorICovCisKK3N0YXRpYyB2b2lkIGxpbmtfcmVjdl9wcm90b19tc2coc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXUzMiByZWNfZ2FwID0gMDsKKwl1MzIgbWF4X3BrdF9pbmZvOworICAgICAgICB1MzIgbWF4X3BrdF9hY2s7CisJdTMyIG1zZ190b2w7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisKKwlkYmcoIkFUKCV1KToiLCBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpKTsKKwltc2dfZGJnKG1zZywgIjw8Iik7CisJaWYgKGxpbmtfYmxvY2tlZChsX3B0cikpCisJCWdvdG8gZXhpdDsKKworCS8qIHJlY29yZCB1bm51bWJlcmVkIHBhY2tldCBhcnJpdmFsIChmb3JjZSBtaXNtYXRjaCBvbiBuZXh0IHRpbWVvdXQpICovCisKKwlsX3B0ci0+Y2hlY2twb2ludC0tOworCisJaWYgKGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lICE9IG1zZ19uZXRfcGxhbmUobXNnKSkKKwkJaWYgKHRpcGNfb3duX2FkZHIgPiBtc2dfcHJldm5vZGUobXNnKSkKKwkJCWxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lID0gbXNnX25ldF9wbGFuZShtc2cpOworCisJbF9wdHItPm93bmVyLT5wZXJtaXRfY2hhbmdlb3ZlciA9IG1zZ19yZWR1bmRhbnRfbGluayhtc2cpOworCisJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJCisJY2FzZSBSRVNFVF9NU0c6CisJCWlmICghbGlua193b3JraW5nX3Vua25vd24obF9wdHIpICYmIGxfcHRyLT5wZWVyX3Nlc3Npb24pIHsKKwkJCWlmIChtc2dfc2Vzc2lvbihtc2cpID09IGxfcHRyLT5wZWVyX3Nlc3Npb24pIHsKKwkJCQlkYmcoIkR1cGxpY2F0ZSBSRVNFVDogJXU8LT4ldVxuIiwKKwkJCQkgICAgbXNnX3Nlc3Npb24obXNnKSwgbF9wdHItPnBlZXJfc2Vzc2lvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCWJyZWFrOyAvKiBkdXBsaWNhdGU6IGlnbm9yZSAqLworCQkJfQorCQl9CisJCS8qIGZhbGwgdGhydScgKi8KKwljYXNlIEFDVElWQVRFX01TRzoKKwkJLyogVXBkYXRlIGxpbmsgc2V0dGluZ3MgYWNjb3JkaW5nIG90aGVyIGVuZHBvaW50J3MgdmFsdWVzICovCisKKwkJc3RyY3B5KChzdHJyY2hyKGxfcHRyLT5uYW1lLCAnOicpICsgMSksIChjaGFyICopbXNnX2RhdGEobXNnKSk7CisKKwkJaWYgKChtc2dfdG9sID0gbXNnX2xpbmtfdG9sZXJhbmNlKG1zZykpICYmCisJCSAgICAobXNnX3RvbCA+IGxfcHRyLT50b2xlcmFuY2UpKQorCQkJbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMobF9wdHIsIG1zZ190b2wpOworCisJCWlmIChtc2dfbGlua3ByaW8obXNnKSA+IGxfcHRyLT5wcmlvcml0eSkKKwkJCWxfcHRyLT5wcmlvcml0eSA9IG1zZ19saW5rcHJpbyhtc2cpOworCisJCW1heF9wa3RfaW5mbyA9IG1zZ19tYXhfcGt0KG1zZyk7CisgICAgICAgICAgICAgICAgaWYgKG1heF9wa3RfaW5mbykgeworCQkJaWYgKG1heF9wa3RfaW5mbyA8IGxfcHRyLT5tYXhfcGt0X3RhcmdldCkKKwkJCQlsX3B0ci0+bWF4X3BrdF90YXJnZXQgPSBtYXhfcGt0X2luZm87CisJCQlpZiAobF9wdHItPm1heF9wa3QgPiBsX3B0ci0+bWF4X3BrdF90YXJnZXQpCisJCQkJbF9wdHItPm1heF9wa3QgPSBsX3B0ci0+bWF4X3BrdF90YXJnZXQ7CisJCX0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3B0ci0+bWF4X3BrdCA9IGxfcHRyLT5tYXhfcGt0X3RhcmdldDsKKwkJfQorCQlsX3B0ci0+b3duZXItPmJjbGluay5zdXBwb3J0ZWQgPSAobWF4X3BrdF9pbmZvICE9IDApOworCisJCWxpbmtfc3RhdGVfZXZlbnQobF9wdHIsIG1zZ190eXBlKG1zZykpOworCisJCWxfcHRyLT5wZWVyX3Nlc3Npb24gPSBtc2dfc2Vzc2lvbihtc2cpOworCQlsX3B0ci0+cGVlcl9iZWFyZXJfaWQgPSBtc2dfYmVhcmVyX2lkKG1zZyk7CisKKwkJLyogU3luY2hyb25pemUgYnJvYWRjYXN0IHNlcXVlbmNlIG51bWJlcnMgKi8KKwkJaWYgKCFub2RlX2hhc19yZWR1bmRhbnRfbGlua3MobF9wdHItPm93bmVyKSkgeworCQkJbF9wdHItPm93bmVyLT5iY2xpbmsubGFzdF9pbiA9IG1vZChtc2dfbGFzdF9iY2FzdChtc2cpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNUQVRFX01TRzoKKworCQlpZiAoKG1zZ190b2wgPSBtc2dfbGlua190b2xlcmFuY2UobXNnKSkpCisJCQlsaW5rX3NldF9zdXBlcnZpc2lvbl9wcm9wcyhsX3B0ciwgbXNnX3RvbCk7CisJCQorCQlpZiAobXNnX2xpbmtwcmlvKG1zZykgJiYgCisJCSAgICAobXNnX2xpbmtwcmlvKG1zZykgIT0gbF9wdHItPnByaW9yaXR5KSkgeworCQkJd2FybigiQ2hhbmdpbmcgcHJpbyA8JXM+OiAldS0+JXVcbiIsCisJCQkgICAgIGxfcHRyLT5uYW1lLCBsX3B0ci0+cHJpb3JpdHksIG1zZ19saW5rcHJpbyhtc2cpKTsKKwkJCWxfcHRyLT5wcmlvcml0eSA9IG1zZ19saW5rcHJpbyhtc2cpOworCQkJbGlua19yZXNldChsX3B0cik7IC8qIEVuZm9yY2UgY2hhbmdlIHRvIHRha2UgZWZmZWN0ICovCisJCQlicmVhazsKKwkJfQorCQlsaW5rX3N0YXRlX2V2ZW50KGxfcHRyLCBUUkFGRklDX01TR19FVlQpOworCQlsX3B0ci0+c3RhdHMucmVjdl9zdGF0ZXMrKzsKKwkJaWYgKGxpbmtfcmVzZXRfdW5rbm93bihsX3B0cikpCisJCQlicmVhazsKKworCQlpZiAobGVzc19lcShtb2QobF9wdHItPm5leHRfaW5fbm8pLCBtc2dfbmV4dF9zZW50KG1zZykpKSB7CisJCQlyZWNfZ2FwID0gbW9kKG1zZ19uZXh0X3NlbnQobXNnKSAtIAorCQkJCSAgICAgIG1vZChsX3B0ci0+bmV4dF9pbl9ubykpOworCQl9CisKKwkJbWF4X3BrdF9hY2sgPSBtc2dfbWF4X3BrdChtc2cpOworICAgICAgICAgICAgICAgIGlmIChtYXhfcGt0X2FjayA+IGxfcHRyLT5tYXhfcGt0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYmcoIkxpbmsgPCVzPiB1cGRhdGVkIE1UVSAldSAtPiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3B0ci0+bmFtZSwgbF9wdHItPm1heF9wa3QsIG1heF9wa3RfYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfcHRyLT5tYXhfcGt0ID0gbWF4X3BrdF9hY2s7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3B0ci0+bWF4X3BrdF9wcm9iZXMgPSAwOworICAgICAgICAgICAgICAgIH0KKworCQltYXhfcGt0X2FjayA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG1zZ19wcm9iZShtc2cpKSB7CisJCQlsX3B0ci0+c3RhdHMucmVjdl9wcm9iZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2dfc2l6ZShtc2cpID4gc2l6ZW9mKGxfcHRyLT5wcm90b19tc2cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9wa3RfYWNrID0gbXNnX3NpemUobXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKwkJLyogUHJvdG9jb2wgbWVzc2FnZSBiZWZvcmUgcmV0cmFuc21pdHMsIHJlZHVjZSBsb3NzIHJpc2sgKi8KKworCQliY2xpbmtfY2hlY2tfZ2FwKGxfcHRyLT5vd25lciwgbXNnX2xhc3RfYmNhc3QobXNnKSk7CisKKwkJaWYgKHJlY19nYXAgfHwgKG1zZ19wcm9iZShtc2cpKSkgeworCQkJbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgU1RBVEVfTVNHLAorCQkJCQkgICAgMCwgcmVjX2dhcCwgMCwgMCwgbWF4X3BrdF9hY2spOworCQl9CisJCWlmIChtc2dfc2VxX2dhcChtc2cpKSB7CisJCQltc2dfZGJnKG1zZywgIldpdGggR2FwOiIpOworCQkJbF9wdHItPnN0YXRzLnJlY3ZfbmFja3MrKzsKKwkJCWxpbmtfcmV0cmFuc21pdChsX3B0ciwgbF9wdHItPmZpcnN0X291dCwKKwkJCQkJbXNnX3NlcV9nYXAobXNnKSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI8RElTQ0FSRElORyBVTktOT1dOPCIpOworCX0KK2V4aXQ6CisJYnVmX2Rpc2NhcmQoYnVmKTsKK30KKworCisvKgorICogbGlua190dW5uZWwoKTogU2VuZCBvbmUgbWVzc2FnZSB2aWEgYSBsaW5rIGJlbG9uZ2luZyB0byAKKyAqIGFub3RoZXIgYmVhcmVyLiBPd25lciBub2RlIGlzIGxvY2tlZC4KKyAqLwordm9pZCBsaW5rX3R1bm5lbChzdHJ1Y3QgbGluayAqbF9wdHIsIAorCSAgICBzdHJ1Y3QgdGlwY19tc2cgKnR1bm5lbF9oZHIsIAorCSAgICBzdHJ1Y3QgdGlwY19tc2cgICptc2csCisJICAgIHUzMiBzZWxlY3RvcikKK3sKKwlzdHJ1Y3QgbGluayAqdHVubmVsOworCXN0cnVjdCBza19idWZmICpidWY7CisJdTMyIGxlbmd0aCA9IG1zZ19zaXplKG1zZyk7CisKKwl0dW5uZWwgPSBsX3B0ci0+b3duZXItPmFjdGl2ZV9saW5rc1tzZWxlY3RvciAmIDFdOworCWlmICghbGlua19pc191cCh0dW5uZWwpKQorCQlyZXR1cm47CisJbXNnX3NldF9zaXplKHR1bm5lbF9oZHIsIGxlbmd0aCArIElOVF9IX1NJWkUpOworCWJ1ZiA9IGJ1Zl9hY3F1aXJlKGxlbmd0aCArIElOVF9IX1NJWkUpOworCWlmICghYnVmKQorCQlyZXR1cm47CisJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKXR1bm5lbF9oZHIsIElOVF9IX1NJWkUpOworCW1lbWNweShidWYtPmRhdGEgKyBJTlRfSF9TSVpFLCAodW5jaGFyICopbXNnLCBsZW5ndGgpOworCWRiZygiJWMtPiVjOiIsIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lLCB0dW5uZWwtPmJfcHRyLT5uZXRfcGxhbmUpOworCW1zZ19kYmcoYnVmX21zZyhidWYpLCAiPlNFTkQ+Iik7CisJYXNzZXJ0KHR1bm5lbCk7CisJbGlua19zZW5kX2J1Zih0dW5uZWwsIGJ1Zik7Cit9CisKKworCisvKgorICogY2hhbmdlb3ZlcigpOiBTZW5kIHdob2xlIG1lc3NhZ2UgcXVldWUgdmlhIHRoZSByZW1haW5pbmcgbGluaworICogICAgICAgICAgICAgICBPd25lciBub2RlIGlzIGxvY2tlZC4KKyAqLworCit2b2lkIGxpbmtfY2hhbmdlb3ZlcihzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJdTMyIG1zZ2NvdW50ID0gbF9wdHItPm91dF9xdWV1ZV9zaXplOworCXN0cnVjdCBza19idWZmICpjcnMgPSBsX3B0ci0+Zmlyc3Rfb3V0OworCXN0cnVjdCBsaW5rICp0dW5uZWwgPSBsX3B0ci0+b3duZXItPmFjdGl2ZV9saW5rc1swXTsKKwlpbnQgc3BsaXRfYnVuZGxlcyA9IG5vZGVfaGFzX3JlZHVuZGFudF9saW5rcyhsX3B0ci0+b3duZXIpOworCXN0cnVjdCB0aXBjX21zZyB0dW5uZWxfaGRyOworCisJaWYgKCF0dW5uZWwpCisJCXJldHVybjsKKworCWlmICghbF9wdHItPm93bmVyLT5wZXJtaXRfY2hhbmdlb3ZlcikKKwkJcmV0dXJuOworCisJbXNnX2luaXQoJnR1bm5lbF9oZHIsIENIQU5HRU9WRVJfUFJPVE9DT0wsCisJCSBPUklHSU5BTF9NU0csIFRJUENfT0ssIElOVF9IX1NJWkUsIGxfcHRyLT5hZGRyKTsKKwltc2dfc2V0X2JlYXJlcl9pZCgmdHVubmVsX2hkciwgbF9wdHItPnBlZXJfYmVhcmVyX2lkKTsKKwltc2dfc2V0X21zZ2NudCgmdHVubmVsX2hkciwgbXNnY291bnQpOworCWlmICghbF9wdHItPmZpcnN0X291dCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCisJCWFzc2VydCghbXNnY291bnQpOworCQlidWYgPSBidWZfYWNxdWlyZShJTlRfSF9TSVpFKTsKKwkJaWYgKGJ1ZikgeworCQkJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKSZ0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKKwkJCW1zZ19zZXRfc2l6ZSgmdHVubmVsX2hkciwgSU5UX0hfU0laRSk7CisJCQlkYmcoIiVjLT4lYzoiLCBsX3B0ci0+Yl9wdHItPm5ldF9wbGFuZSwKKwkJCSAgICB0dW5uZWwtPmJfcHRyLT5uZXRfcGxhbmUpOworCQkJbXNnX2RiZygmdHVubmVsX2hkciwgIkVNUFRZPlNFTkQ+Iik7CisJCQlsaW5rX3NlbmRfYnVmKHR1bm5lbCwgYnVmKTsKKwkJfSBlbHNlIHsKKwkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBsaW5rIGNoYW5nZW92ZXIgZmFpbGVkXG4iKTsKKwkJfQorCQlyZXR1cm47CisJfQorCXdoaWxlIChjcnMpIHsKKwkJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGNycyk7CisKKwkJaWYgKChtc2dfdXNlcihtc2cpID09IE1TR19CVU5ETEVSKSAmJiBzcGxpdF9idW5kbGVzKSB7CisJCQl1MzIgbXNnY291bnQgPSBtc2dfbXNnY250KG1zZyk7CisJCQlzdHJ1Y3QgdGlwY19tc2cgKm0gPSBtc2dfZ2V0X3dyYXBwZWQobXNnKTsKKwkJCXVuY2hhciogcG9zID0gKHVuY2hhciopbTsKKworCQkJd2hpbGUgKG1zZ2NvdW50LS0pIHsKKwkJCQltc2dfc2V0X3NlcW5vKG0sbXNnX3NlcW5vKG1zZykpOworCQkJCWxpbmtfdHVubmVsKGxfcHRyLCAmdHVubmVsX2hkciwgbSwKKwkJCQkJICAgIG1zZ19saW5rX3NlbGVjdG9yKG0pKTsKKwkJCQlwb3MgKz0gYWxpZ24obXNnX3NpemUobSkpOworCQkJCW0gPSAoc3RydWN0IHRpcGNfbXNnICopcG9zOworCQkJfQorCQl9IGVsc2UgeworCQkJbGlua190dW5uZWwobF9wdHIsICZ0dW5uZWxfaGRyLCBtc2csCisJCQkJICAgIG1zZ19saW5rX3NlbGVjdG9yKG1zZykpOworCQl9CisJCWNycyA9IGNycy0+bmV4dDsKKwl9Cit9CisKK3ZvaWQgbGlua19zZW5kX2R1cGxpY2F0ZShzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBsaW5rICp0dW5uZWwpCit7CisJc3RydWN0IHNrX2J1ZmYgKml0ZXI7CisJc3RydWN0IHRpcGNfbXNnIHR1bm5lbF9oZHI7CisKKwltc2dfaW5pdCgmdHVubmVsX2hkciwgQ0hBTkdFT1ZFUl9QUk9UT0NPTCwKKwkJIERVUExJQ0FURV9NU0csIFRJUENfT0ssIElOVF9IX1NJWkUsIGxfcHRyLT5hZGRyKTsKKwltc2dfc2V0X21zZ2NudCgmdHVubmVsX2hkciwgbF9wdHItPm91dF9xdWV1ZV9zaXplKTsKKwltc2dfc2V0X2JlYXJlcl9pZCgmdHVubmVsX2hkciwgbF9wdHItPnBlZXJfYmVhcmVyX2lkKTsKKwlpdGVyID0gbF9wdHItPmZpcnN0X291dDsKKwl3aGlsZSAoaXRlcikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqb3V0YnVmOworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coaXRlcik7CisJCXUzMiBsZW5ndGggPSBtc2dfc2l6ZShtc2cpOworCisJCWlmIChtc2dfdXNlcihtc2cpID09IE1TR19CVU5ETEVSKQorCQkJbXNnX3NldF90eXBlKG1zZywgQ0xPU0VEX01TRyk7CisJCW1zZ19zZXRfYWNrKG1zZywgbW9kKGxfcHRyLT5uZXh0X2luX25vIC0gMSkpOwkvKiBVcGRhdGUgKi8KKwkJbXNnX3NldF9iY2FzdF9hY2sobXNnLCBsX3B0ci0+b3duZXItPmJjbGluay5sYXN0X2luKTsgCisJCW1zZ19zZXRfc2l6ZSgmdHVubmVsX2hkciwgbGVuZ3RoICsgSU5UX0hfU0laRSk7CisJCW91dGJ1ZiA9IGJ1Zl9hY3F1aXJlKGxlbmd0aCArIElOVF9IX1NJWkUpOworCQlpZiAob3V0YnVmID09IE5VTEwpIHsKKwkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBidWZmZXIgZHVwbGljYXRpb24gZmFpbGVkXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQltZW1jcHkob3V0YnVmLT5kYXRhLCAodW5jaGFyICopJnR1bm5lbF9oZHIsIElOVF9IX1NJWkUpOworCQltZW1jcHkob3V0YnVmLT5kYXRhICsgSU5UX0hfU0laRSwgaXRlci0+ZGF0YSwgbGVuZ3RoKTsKKwkJZGJnKCIlYy0+JWM6IiwgbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUsCisJCSAgICB0dW5uZWwtPmJfcHRyLT5uZXRfcGxhbmUpOworCQltc2dfZGJnKGJ1Zl9tc2cob3V0YnVmKSwgIj5TRU5EPiIpOworCQlsaW5rX3NlbmRfYnVmKHR1bm5lbCwgb3V0YnVmKTsKKwkJaWYgKCFsaW5rX2lzX3VwKGxfcHRyKSkKKwkJCXJldHVybjsKKwkJaXRlciA9IGl0ZXItPm5leHQ7CisJfQorfQorCisKKworLyoqCisgKiBidWZfZXh0cmFjdCAtIGV4dHJhY3RzIGVtYmVkZGVkIFRJUEMgbWVzc2FnZSBmcm9tIGFub3RoZXIgbWVzc2FnZQorICogQHNrYjogZW5jYXBzdWxhdGluZyBtZXNzYWdlIGJ1ZmZlcgorICogQGZyb21fcG9zOiBvZmZzZXQgdG8gZXh0cmFjdCBmcm9tCisgKgorICogUmV0dXJucyBhIG5ldyBtZXNzYWdlIGJ1ZmZlciBjb250YWluaW5nIGFuIGVtYmVkZGVkIG1lc3NhZ2UuICBUaGUgCisgKiBlbmNhcHN1bGF0aW5nIG1lc3NhZ2UgaXRzZWxmIGlzIGxlZnQgdW5jaGFuZ2VkLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYnVmX2V4dHJhY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGZyb21fcG9zKQoreworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gKHN0cnVjdCB0aXBjX21zZyAqKShza2ItPmRhdGEgKyBmcm9tX3Bvcyk7CisJdTMyIHNpemUgPSBtc2dfc2l6ZShtc2cpOworCXN0cnVjdCBza19idWZmICplYjsKKworCWViID0gYnVmX2FjcXVpcmUoc2l6ZSk7CisJaWYgKGViKQorCQltZW1jcHkoZWItPmRhdGEsICh1bmNoYXIgKiltc2csIHNpemUpOworCXJldHVybiBlYjsKK30KKworLyogCisgKiAgbGlua19yZWN2X2NoYW5nZW92ZXJfbXNnKCk6IFJlY2VpdmUgdHVubmVsZWQgcGFja2V0IHNlbnQKKyAqICB2aWEgb3RoZXIgbGluay4gTm9kZSBpcyBsb2NrZWQuIFJldHVybiBleHRyYWN0ZWQgYnVmZmVyLgorICovCisKK3N0YXRpYyBpbnQgbGlua19yZWN2X2NoYW5nZW92ZXJfbXNnKHN0cnVjdCBsaW5rICoqbF9wdHIsCisJCQkJICAgIHN0cnVjdCBza19idWZmICoqYnVmKQoreworCXN0cnVjdCBza19idWZmICp0dW5uZWxfYnVmID0gKmJ1ZjsKKwlzdHJ1Y3QgbGluayAqZGVzdF9saW5rOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCXN0cnVjdCB0aXBjX21zZyAqdHVubmVsX21zZyA9IGJ1Zl9tc2codHVubmVsX2J1Zik7CisJdTMyIG1zZ190eXAgPSBtc2dfdHlwZSh0dW5uZWxfbXNnKTsKKwl1MzIgbXNnX2NvdW50ID0gbXNnX21zZ2NudCh0dW5uZWxfbXNnKTsKKworCWRlc3RfbGluayA9ICgqbF9wdHIpLT5vd25lci0+bGlua3NbbXNnX2JlYXJlcl9pZCh0dW5uZWxfbXNnKV07CisJYXNzZXJ0KGRlc3RfbGluayAhPSAqbF9wdHIpOworCWlmICghZGVzdF9saW5rKSB7CisJCW1zZ19kYmcodHVubmVsX21zZywgIk5PTElOSy88UkVDPCIpOworCQlnb3RvIGV4aXQ7CisJfQorCWRiZygiJWM8LSVjOiIsIGRlc3RfbGluay0+Yl9wdHItPm5ldF9wbGFuZSwKKwkgICAgKCpsX3B0ciktPmJfcHRyLT5uZXRfcGxhbmUpOworCSpsX3B0ciA9IGRlc3RfbGluazsKKwltc2cgPSBtc2dfZ2V0X3dyYXBwZWQodHVubmVsX21zZyk7CisKKwlpZiAobXNnX3R5cCA9PSBEVVBMSUNBVEVfTVNHKSB7CisJCWlmIChsZXNzKG1zZ19zZXFubyhtc2cpLCBtb2QoZGVzdF9saW5rLT5uZXh0X2luX25vKSkpIHsKKwkJCW1zZ19kYmcodHVubmVsX21zZywgIkRST1AvPFJFQzwiKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQkqYnVmID0gYnVmX2V4dHJhY3QodHVubmVsX2J1ZixJTlRfSF9TSVpFKTsKKwkJaWYgKCpidWYgPT0gTlVMTCkgeworCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBleHRyYWN0IG1zZ1xuIik7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJbXNnX2RiZyh0dW5uZWxfbXNnLCAiVE5MPFJFQzwiKTsKKwkJYnVmX2Rpc2NhcmQodHVubmVsX2J1Zik7CisJCXJldHVybiAxOworCX0KKworCS8qIEZpcnN0IG9yaWdpbmFsIG1lc3NhZ2UgPzogKi8KKworCWlmIChsaW5rX2lzX3VwKGRlc3RfbGluaykpIHsKKwkJbXNnX2RiZyh0dW5uZWxfbXNnLCAiVVAvRklSU1QvPFJFQzwiKTsKKwkJbGlua19yZXNldChkZXN0X2xpbmspOworCQlkZXN0X2xpbmstPmV4cF9tc2dfY291bnQgPSBtc2dfY291bnQ7CisJCWlmICghbXNnX2NvdW50KQorCQkJZ290byBleGl0OworCX0gZWxzZSBpZiAoZGVzdF9saW5rLT5leHBfbXNnX2NvdW50ID09IFNUQVJUX0NIQU5HRU9WRVIpIHsKKwkJbXNnX2RiZyh0dW5uZWxfbXNnLCAiQkxLL0ZJUlNULzxSRUM8Iik7CisJCWRlc3RfbGluay0+ZXhwX21zZ19jb3VudCA9IG1zZ19jb3VudDsKKwkJaWYgKCFtc2dfY291bnQpCisJCQlnb3RvIGV4aXQ7CisJfQorCisJLyogUmVjZWl2ZSBvcmlnaW5hbCBtZXNzYWdlICovCisKKwlpZiAoZGVzdF9saW5rLT5leHBfbXNnX2NvdW50ID09IDApIHsKKwkJbXNnX2RiZyh0dW5uZWxfbXNnLCAiT1ZFUkRVRS9EUk9QLzxSRUM8Iik7CisJCWRiZ19wcmludF9saW5rKGRlc3RfbGluaywgIkxJTks6Iik7CisJCWdvdG8gZXhpdDsKKwl9CisJZGVzdF9saW5rLT5leHBfbXNnX2NvdW50LS07CisJaWYgKGxlc3MobXNnX3NlcW5vKG1zZyksIGRlc3RfbGluay0+cmVzZXRfY2hlY2twb2ludCkpIHsKKwkJbXNnX2RiZyh0dW5uZWxfbXNnLCAiRFJPUC9EVVBMLzxSRUM8Iik7CisJCWdvdG8gZXhpdDsKKwl9IGVsc2UgeworCQkqYnVmID0gYnVmX2V4dHJhY3QodHVubmVsX2J1ZiwgSU5UX0hfU0laRSk7CisJCWlmICgqYnVmICE9IE5VTEwpIHsKKwkJCW1zZ19kYmcodHVubmVsX21zZywgIlROTDxSRUM8Iik7CisJCQlidWZfZGlzY2FyZCh0dW5uZWxfYnVmKTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IGRyb3BwZWQgaW5jb21pbmcgbXNnXG4iKTsKKwkJfQorCX0KK2V4aXQ6CisJKmJ1ZiA9IDA7CisJYnVmX2Rpc2NhcmQodHVubmVsX2J1Zik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgQnVuZGxlciBmdW5jdGlvbmFsaXR5OgorICovCit2b2lkIGxpbmtfcmVjdl9idW5kbGUoc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwl1MzIgbXNnY291bnQgPSBtc2dfbXNnY250KGJ1Zl9tc2coYnVmKSk7CisJdTMyIHBvcyA9IElOVF9IX1NJWkU7CisJc3RydWN0IHNrX2J1ZmYgKm9idWY7CisKKwltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgIjxCTkRMPDogIik7CisJd2hpbGUgKG1zZ2NvdW50LS0pIHsKKwkJb2J1ZiA9IGJ1Zl9leHRyYWN0KGJ1ZiwgcG9zKTsKKwkJaWYgKG9idWYgPT0gTlVMTCkgeworCQkJY2hhciBhZGRyX3N0cmluZ1sxNl07CisKKwkJCXdhcm4oIkJ1ZmZlciBhbGxvY2F0aW9uIGZhaWx1cmU7XG4iKTsKKwkJCXdhcm4oIiAgaW5jb21pbmcgbWVzc2FnZShzKSBmcm9tICVzIGxvc3RcbiIsCisJCQkgICAgIGFkZHJfc3RyaW5nX2ZpbGwoYWRkcl9zdHJpbmcsIAorCQkJCQkgICAgICBtc2dfb3JpZ25vZGUoYnVmX21zZyhidWYpKSkpOworCQkJcmV0dXJuOworCQl9OworCQlwb3MgKz0gYWxpZ24obXNnX3NpemUoYnVmX21zZyhvYnVmKSkpOworCQltc2dfZGJnKGJ1Zl9tc2cob2J1ZiksICIgICAgIC8iKTsKKwkJbmV0X3JvdXRlX21zZyhvYnVmKTsKKwl9CisJYnVmX2Rpc2NhcmQoYnVmKTsKK30KKworLyoKKyAqICBGcmFnbWVudGF0aW9uL2RlZnJhZ21lbnRhdGlvbjoKKyAqLworCisKKy8qIAorICogbGlua19zZW5kX2xvbmdfYnVmOiBFbnRyeSBmb3IgYnVmZmVycyBuZWVkaW5nIGZyYWdtZW50YXRpb24uCisgKiBUaGUgYnVmZmVyIGlzIGNvbXBsZXRlLCBpbmNsdXNpdmUgdG90YWwgbWVzc2FnZSBsZW5ndGguIAorICogUmV0dXJucyB1c2VyIGRhdGEgbGVuZ3RoLgorICovCitpbnQgbGlua19zZW5kX2xvbmdfYnVmKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKmlubXNnID0gYnVmX21zZyhidWYpOworCXN0cnVjdCB0aXBjX21zZyBmcmFnbV9oZHI7CisJdTMyIGluc2l6ZSA9IG1zZ19zaXplKGlubXNnKTsKKwl1MzIgZHN6ID0gbXNnX2RhdGFfc3ooaW5tc2cpOworCXVuY2hhciAqY3JzID0gYnVmLT5kYXRhOworCXUzMiByZXN0ID0gaW5zaXplOworCXUzMiBwYWNrX3N6ID0gbGlua19tYXhfcGt0KGxfcHRyKTsKKwl1MzIgZnJhZ21fc3ogPSBwYWNrX3N6IC0gSU5UX0hfU0laRTsKKwl1MzIgZnJhZ21fbm8gPSAxOworCXUzMiBkZXN0YWRkciA9IG1zZ19kZXN0bm9kZShpbm1zZyk7CisKKwlpZiAobXNnX3Nob3J0KGlubXNnKSkKKwkJZGVzdGFkZHIgPSBsX3B0ci0+YWRkcjsKKworCWlmIChtc2dfcm91dGVkKGlubXNnKSkKKwkJbXNnX3NldF9wcmV2bm9kZShpbm1zZywgdGlwY19vd25fYWRkcik7CisKKwkvKiBQcmVwYXJlIHJldXNhYmxlIGZyYWdtZW50IGhlYWRlcjogKi8KKworCW1zZ19pbml0KCZmcmFnbV9oZHIsIE1TR19GUkFHTUVOVEVSLCBGSVJTVF9GUkFHTUVOVCwKKwkJIFRJUENfT0ssIElOVF9IX1NJWkUsIGRlc3RhZGRyKTsKKwltc2dfc2V0X2xpbmtfc2VsZWN0b3IoJmZyYWdtX2hkciwgbXNnX2xpbmtfc2VsZWN0b3IoaW5tc2cpKTsKKwltc2dfc2V0X2xvbmdfbXNnbm8oJmZyYWdtX2hkciwgbW9kKGxfcHRyLT5sb25nX21zZ19zZXFfbm8rKykpOworCW1zZ19zZXRfZnJhZ21fbm8oJmZyYWdtX2hkciwgZnJhZ21fbm8pOworCWxfcHRyLT5zdGF0cy5zZW50X2ZyYWdtZW50ZWQrKzsKKworCS8qIENob3AgdXAgbWVzc2FnZTogKi8KKworCXdoaWxlIChyZXN0ID4gMCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ207CisKKwkJaWYgKHJlc3QgPD0gZnJhZ21fc3opIHsKKwkJCWZyYWdtX3N6ID0gcmVzdDsKKwkJCW1zZ19zZXRfdHlwZSgmZnJhZ21faGRyLCBMQVNUX0ZSQUdNRU5UKTsKKwkJfQorCQlmcmFnbSA9IGJ1Zl9hY3F1aXJlKGZyYWdtX3N6ICsgSU5UX0hfU0laRSk7CisJCWlmIChmcmFnbSA9PSBOVUxMKSB7CisJCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZmFpbGVkIHRvIGZyYWdtZW50IG1zZ1xuIik7CisJCQlkc3ogPSAtRU5PTUVNOworCQkJZ290byBleGl0OworCQl9CisJCW1zZ19zZXRfc2l6ZSgmZnJhZ21faGRyLCBmcmFnbV9zeiArIElOVF9IX1NJWkUpOworCQltZW1jcHkoZnJhZ20tPmRhdGEsICh1bmNoYXIgKikmZnJhZ21faGRyLCBJTlRfSF9TSVpFKTsKKwkJbWVtY3B5KGZyYWdtLT5kYXRhICsgSU5UX0hfU0laRSwgY3JzLCBmcmFnbV9zeik7CisKKwkJLyogIFNlbmQgcXVldWVkIG1lc3NhZ2VzIGZpcnN0LCBpZiBhbnk6ICovCisKKwkJbF9wdHItPnN0YXRzLnNlbnRfZnJhZ21lbnRzKys7CisJCWxpbmtfc2VuZF9idWYobF9wdHIsIGZyYWdtKTsKKwkJaWYgKCFsaW5rX2lzX3VwKGxfcHRyKSkKKwkJCXJldHVybiBkc3o7CisJCW1zZ19zZXRfZnJhZ21fbm8oJmZyYWdtX2hkciwgKytmcmFnbV9ubyk7CisJCXJlc3QgLT0gZnJhZ21fc3o7CisJCWNycyArPSBmcmFnbV9zejsKKwkJbXNnX3NldF90eXBlKCZmcmFnbV9oZHIsIEZSQUdNRU5UKTsKKwl9CitleGl0OgorCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJcmV0dXJuIGRzejsKK30KKworLyogCisgKiBBIHBlbmRpbmcgbWVzc2FnZSBiZWluZyByZS1hc3NlbWJsZWQgbXVzdCBzdG9yZSBjZXJ0YWluIHZhbHVlcyAKKyAqIHRvIGhhbmRsZSBzdWJzZXF1ZW50IGZyYWdtZW50cyBjb3JyZWN0bHkuIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIAorICogaGVscCBzdG9yaW5nIHRoZXNlIHZhbHVlcyBpbiB1bnVzZWQsIGF2YWlsYWJsZSBmaWVsZHMgaW4gdGhlCisgKiBwZW5kaW5nIG1lc3NhZ2UuIFRoaXMgbWFrZXMgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiB1bmVjZXNzYXJ5LgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIGdldF9sb25nX21zZ19zZXFubyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXJldHVybiBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9sb25nX21zZ19zZXFubyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgc2Vxbm8pCit7CisJbXNnX3NldF9zZXFubyhidWZfbXNnKGJ1ZiksIHNlcW5vKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgZ2V0X2ZyYWdtX3NpemUoc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlyZXR1cm4gbXNnX2FjayhidWZfbXNnKGJ1ZikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZyYWdtX3NpemUoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgdTMyIHN6KQoreworCW1zZ19zZXRfYWNrKGJ1Zl9tc2coYnVmKSwgc3opOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfZXhwZWN0ZWRfZnJhZ3Moc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlyZXR1cm4gbXNnX2JjYXN0X2FjayhidWZfbXNnKGJ1ZikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2V4cGVjdGVkX2ZyYWdzKHN0cnVjdCBza19idWZmICpidWYsIHUzMiBleHApCit7CisJbXNnX3NldF9iY2FzdF9hY2soYnVmX21zZyhidWYpLCBleHApOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfdGltZXJfY250KHN0cnVjdCBza19idWZmICpidWYpCit7CisJcmV0dXJuIG1zZ19yZXJvdXRlX2NudChidWZfbXNnKGJ1ZikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5jcl90aW1lcl9jbnQoc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwltc2dfaW5jcl9yZXJvdXRlX2NudChidWZfbXNnKGJ1ZikpOworfQorCisvKiAKKyAqIGxpbmtfcmVjdl9mcmFnbWVudCgpOiBDYWxsZWQgd2l0aCBub2RlIGxvY2sgb24uIFJldHVybnMgCisgKiB0aGUgcmVhc3NlbWJsZWQgYnVmZmVyIGlmIG1lc3NhZ2UgaXMgY29tcGxldGUuCisgKi8KK2ludCBsaW5rX3JlY3ZfZnJhZ21lbnQoc3RydWN0IHNrX2J1ZmYgKipwZW5kaW5nLCBzdHJ1Y3Qgc2tfYnVmZiAqKmZiLCAKKwkJICAgICAgIHN0cnVjdCB0aXBjX21zZyAqKm0pCit7CisJc3RydWN0IHNrX2J1ZmYgKnByZXYgPSAwOworCXN0cnVjdCBza19idWZmICpmYnVmID0gKmZiOworCXN0cnVjdCB0aXBjX21zZyAqZnJhZ20gPSBidWZfbXNnKGZidWYpOworCXN0cnVjdCBza19idWZmICpwYnVmID0gKnBlbmRpbmc7CisJdTMyIGxvbmdfbXNnX3NlcV9ubyA9IG1zZ19sb25nX21zZ25vKGZyYWdtKTsKKworCSpmYiA9IDA7CisJbXNnX2RiZyhmcmFnbSwiRlJHPFJFQzwiKTsKKworCS8qIElzIHRoZXJlIGFuIGluY29tcGxldGUgbWVzc2FnZSB3YWl0aW5nIGZvciB0aGlzIGZyYWdtZW50PyAqLworCisJd2hpbGUgKHBidWYgJiYgKChtc2dfc2Vxbm8oYnVmX21zZyhwYnVmKSkgIT0gbG9uZ19tc2dfc2VxX25vKQorCQkJfHwgKG1zZ19vcmlnbm9kZShmcmFnbSkgIT0gbXNnX29yaWdub2RlKGJ1Zl9tc2cocGJ1ZikpKSkpIHsKKwkJcHJldiA9IHBidWY7CisJCXBidWYgPSBwYnVmLT5uZXh0OworCX0KKworCWlmICghcGJ1ZiAmJiAobXNnX3R5cGUoZnJhZ20pID09IEZJUlNUX0ZSQUdNRU5UKSkgeworCQlzdHJ1Y3QgdGlwY19tc2cgKmltc2cgPSAoc3RydWN0IHRpcGNfbXNnICopbXNnX2RhdGEoZnJhZ20pOworCQl1MzIgbXNnX3N6ID0gbXNnX3NpemUoaW1zZyk7CisJCXUzMiBmcmFnbV9zeiA9IG1zZ19kYXRhX3N6KGZyYWdtKTsKKwkJdTMyIGV4cF9mcmFnbV9jbnQgPSBtc2dfc3ovZnJhZ21fc3ogKyAhIShtc2dfc3ogJSBmcmFnbV9zeik7CisJCXUzMiBtYXggPSAgVElQQ19NQVhfVVNFUl9NU0dfU0laRSArIExPTkdfSF9TSVpFOworCQlpZiAobXNnX3R5cGUoaW1zZykgPT0gVElQQ19NQ0FTVF9NU0cpCisJCQltYXggPSBUSVBDX01BWF9VU0VSX01TR19TSVpFICsgTUNBU1RfSF9TSVpFOworCQlpZiAobXNnX3NpemUoaW1zZykgPiBtYXgpIHsKKwkJCW1zZ19kYmcoZnJhZ20sIjxSRUM8T3ZlcnNpemVkOiAiKTsKKwkJCWJ1Zl9kaXNjYXJkKGZidWYpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcGJ1ZiA9IGJ1Zl9hY3F1aXJlKG1zZ19zaXplKGltc2cpKTsKKwkJaWYgKHBidWYgIT0gTlVMTCkgeworCQkJcGJ1Zi0+bmV4dCA9ICpwZW5kaW5nOworCQkJKnBlbmRpbmcgPSBwYnVmOworCQkJbWVtY3B5KHBidWYtPmRhdGEsICh1bmNoYXIgKilpbXNnLCBtc2dfZGF0YV9zeihmcmFnbSkpOworCisJCQkvKiAgUHJlcGFyZSBidWZmZXIgZm9yIHN1YnNlcXVlbnQgZnJhZ21lbnRzLiAqLworCisJCQlzZXRfbG9uZ19tc2dfc2Vxbm8ocGJ1ZiwgbG9uZ19tc2dfc2VxX25vKTsgCisJCQlzZXRfZnJhZ21fc2l6ZShwYnVmLGZyYWdtX3N6KTsgCisJCQlzZXRfZXhwZWN0ZWRfZnJhZ3MocGJ1ZixleHBfZnJhZ21fY250IC0gMSk7IAorCQl9IGVsc2UgeworCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IGdvdCBubyBkZWZyYWdtZW50aW5nIGJ1ZmZlclxuIik7CisJCX0KKwkJYnVmX2Rpc2NhcmQoZmJ1Zik7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAocGJ1ZiAmJiAobXNnX3R5cGUoZnJhZ20pICE9IEZJUlNUX0ZSQUdNRU5UKSkgeworCQl1MzIgZHN6ID0gbXNnX2RhdGFfc3ooZnJhZ20pOworCQl1MzIgZnN6ID0gZ2V0X2ZyYWdtX3NpemUocGJ1Zik7CisJCXUzMiBjcnMgPSAoKG1zZ19mcmFnbV9ubyhmcmFnbSkgLSAxKSAqIGZzeik7CisJCXUzMiBleHBfZnJhZ3MgPSBnZXRfZXhwZWN0ZWRfZnJhZ3MocGJ1ZikgLSAxOworCQltZW1jcHkocGJ1Zi0+ZGF0YSArIGNycywgbXNnX2RhdGEoZnJhZ20pLCBkc3opOworCQlidWZfZGlzY2FyZChmYnVmKTsKKworCQkvKiBJcyBtZXNzYWdlIGNvbXBsZXRlPyAqLworCisJCWlmIChleHBfZnJhZ3MgPT0gMCkgeworCQkJaWYgKHByZXYpCisJCQkJcHJldi0+bmV4dCA9IHBidWYtPm5leHQ7CisJCQllbHNlCisJCQkJKnBlbmRpbmcgPSBwYnVmLT5uZXh0OworCQkJbXNnX3Jlc2V0X3Jlcm91dGVfY250KGJ1Zl9tc2cocGJ1ZikpOworCQkJKmZiID0gcGJ1ZjsKKwkJCSptID0gYnVmX21zZyhwYnVmKTsKKwkJCXJldHVybiAxOworCQl9CisJCXNldF9leHBlY3RlZF9mcmFncyhwYnVmLGV4cF9mcmFncyk7ICAgICAKKwkJcmV0dXJuIDA7CisJfQorCWRiZygiIERpc2NhcmRpbmcgb3JwaGFuIGZyYWdtZW50ICV4XG4iLGZidWYpOworCW1zZ19kYmcoZnJhZ20sIk9SUEhBTjoiKTsKKwlkYmcoIlBlbmRpbmcgbG9uZyBidWZmZXJzOlxuIik7CisJZGJnX3ByaW50X2J1Zl9jaGFpbigqcGVuZGluZyk7CisJYnVmX2Rpc2NhcmQoZmJ1Zik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbGlua19jaGVja19kZWZyYWdtX2J1ZnMgLSBmbHVzaCBzdGFsZSBpbmNvbWluZyBtZXNzYWdlIGZyYWdtZW50cworICogQGxfcHRyOiBwb2ludGVyIHRvIGxpbmsKKyAqLworCitzdGF0aWMgdm9pZCBsaW5rX2NoZWNrX2RlZnJhZ21fYnVmcyhzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnByZXYgPSAwOworCXN0cnVjdCBza19idWZmICpuZXh0ID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gbF9wdHItPmRlZnJhZ21fYnVmOworCisJaWYgKCFidWYpCisJCXJldHVybjsKKwlpZiAoIWxpbmtfd29ya2luZ193b3JraW5nKGxfcHRyKSkKKwkJcmV0dXJuOworCXdoaWxlIChidWYpIHsKKwkJdTMyIGNudCA9IGdldF90aW1lcl9jbnQoYnVmKTsKKworCQluZXh0ID0gYnVmLT5uZXh0OworCQlpZiAoY250IDwgNCkgeworCQkJaW5jcl90aW1lcl9jbnQoYnVmKTsKKwkJCXByZXYgPSBidWY7CisJCX0gZWxzZSB7CisJCQlkYmcoIiBEaXNjYXJkaW5nIGluY29tcGxldGUgbG9uZyBidWZmZXJcbiIpOworCQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICJMT05HOiIpOworCQkJZGJnX3ByaW50X2xpbmsobF9wdHIsICJjdXJyOiIpOworCQkJZGJnKCJQZW5kaW5nIGxvbmcgYnVmZmVyczpcbiIpOworCQkJZGJnX3ByaW50X2J1Zl9jaGFpbihsX3B0ci0+ZGVmcmFnbV9idWYpOworCQkJaWYgKHByZXYpCisJCQkJcHJldi0+bmV4dCA9IGJ1Zi0+bmV4dDsKKwkJCWVsc2UKKwkJCQlsX3B0ci0+ZGVmcmFnbV9idWYgPSBidWYtPm5leHQ7CisJCQlidWZfZGlzY2FyZChidWYpOworCQl9CisJCWJ1ZiA9IG5leHQ7CisJfQorfQorCisKKworc3RhdGljIHZvaWQgbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgdG9sZXJhbmNlKQoreworCWxfcHRyLT50b2xlcmFuY2UgPSB0b2xlcmFuY2U7CisJbF9wdHItPmNvbnRpbnVpdHlfaW50ZXJ2YWwgPQorCQkoKHRvbGVyYW5jZSAvIDQpID4gNTAwKSA/IDUwMCA6IHRvbGVyYW5jZSAvIDQ7CisJbF9wdHItPmFib3J0X2xpbWl0ID0gdG9sZXJhbmNlIC8gKGxfcHRyLT5jb250aW51aXR5X2ludGVydmFsIC8gNCk7Cit9CisKKwordm9pZCBsaW5rX3NldF9xdWV1ZV9saW1pdHMoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgd2luZG93KQoreworCS8qIERhdGEgbWVzc2FnZXMgZnJvbSB0aGlzIG5vZGUsIGluY2x1c2l2ZSBGSVJTVF9GUkFHTSAqLworCWxfcHRyLT5xdWV1ZV9saW1pdFtEQVRBX0xPV10gPSB3aW5kb3c7CisJbF9wdHItPnF1ZXVlX2xpbWl0W0RBVEFfTUVESVVNXSA9ICh3aW5kb3cgLyAzKSAqIDQ7CisJbF9wdHItPnF1ZXVlX2xpbWl0W0RBVEFfSElHSF0gPSAod2luZG93IC8gMykgKiA1OworCWxfcHRyLT5xdWV1ZV9saW1pdFtEQVRBX0NSSVRJQ0FMXSA9ICh3aW5kb3cgLyAzKSAqIDY7CisJLyogVHJhbnNpdGluZyBkYXRhIG1lc3NhZ2VzLGluY2x1c2l2ZSBGSVJTVF9GUkFHTSAqLworCWxfcHRyLT5xdWV1ZV9saW1pdFtEQVRBX0xPVyArIDRdID0gMzAwOworCWxfcHRyLT5xdWV1ZV9saW1pdFtEQVRBX01FRElVTSArIDRdID0gNjAwOworCWxfcHRyLT5xdWV1ZV9saW1pdFtEQVRBX0hJR0ggKyA0XSA9IDkwMDsKKwlsX3B0ci0+cXVldWVfbGltaXRbREFUQV9DUklUSUNBTCArIDRdID0gMTIwMDsKKwlsX3B0ci0+cXVldWVfbGltaXRbQ09OTl9NQU5BR0VSXSA9IDEyMDA7CisJbF9wdHItPnF1ZXVlX2xpbWl0W1JPVVRFX0RJU1RSSUJVVE9SXSA9IDEyMDA7CisJbF9wdHItPnF1ZXVlX2xpbWl0W0NIQU5HRU9WRVJfUFJPVE9DT0xdID0gMjUwMDsKKwlsX3B0ci0+cXVldWVfbGltaXRbTkFNRV9ESVNUUklCVVRPUl0gPSAzMDAwOworCS8qIEZSQUdNRU5UIGFuZCBMQVNUX0ZSQUdNRU5UIHBhY2tldHMgKi8KKwlsX3B0ci0+cXVldWVfbGltaXRbTVNHX0ZSQUdNRU5URVJdID0gNDAwMDsKK30KKworLyoqCisgKiBsaW5rX2ZpbmRfbGluayAtIGxvY2F0ZSBsaW5rIGJ5IG5hbWUKKyAqIEBuYW1lIC0gcHRyIHRvIGxpbmsgbmFtZSBzdHJpbmcKKyAqIEBub2RlIC0gcHRyIHRvIGFyZWEgdG8gYmUgZmlsbGVkIHdpdGggcHRyIHRvIGFzc29jaWF0ZWQgbm9kZQorICogCisgKiBDYWxsZXIgbXVzdCBob2xkICduZXRfbG9jaycgdG8gZW5zdXJlIG5vZGUgYW5kIGJlYXJlciBhcmUgbm90IGRlbGV0ZWQ7CisgKiB0aGlzIGFsc28gcHJldmVudHMgbGluayBkZWxldGlvbi4KKyAqIAorICogUmV0dXJucyBwb2ludGVyIHRvIGxpbmsgKG9yIDAgaWYgaW52YWxpZCBsaW5rIG5hbWUpLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgbGluayAqbGlua19maW5kX2xpbmsoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG5vZGUgKipub2RlKQoreworCXN0cnVjdCBsaW5rX25hbWUgbGlua19uYW1lX3BhcnRzOworCXN0cnVjdCBiZWFyZXIgKmJfcHRyOworCXN0cnVjdCBsaW5rICpsX3B0cjsgCisKKwlpZiAoIWxpbmtfbmFtZV92YWxpZGF0ZShuYW1lLCAmbGlua19uYW1lX3BhcnRzKSkKKwkJcmV0dXJuIDA7CisKKwliX3B0ciA9IGJlYXJlcl9maW5kX2ludGVyZmFjZShsaW5rX25hbWVfcGFydHMuaWZfbG9jYWwpOworCWlmICghYl9wdHIpCisJCXJldHVybiAwOworCisJKm5vZGUgPSBub2RlX2ZpbmQobGlua19uYW1lX3BhcnRzLmFkZHJfcGVlcik7IAorCWlmICghKm5vZGUpCisJCXJldHVybiAwOworCisJbF9wdHIgPSAoKm5vZGUpLT5saW5rc1tiX3B0ci0+aWRlbnRpdHldOworCWlmICghbF9wdHIgfHwgc3RyY21wKGxfcHRyLT5uYW1lLCBuYW1lKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gbF9wdHI7Cit9CisKK3N0cnVjdCBza19idWZmICpsaW5rX2NtZF9jb25maWcoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSwgCisJCQkgICAgICAgIHUxNiBjbWQpCit7CisJc3RydWN0IHRpcGNfbGlua19jb25maWcgKmFyZ3M7CisgICAgICAgIHUzMiBuZXdfdmFsdWU7CisJc3RydWN0IGxpbmsgKmxfcHRyOworCXN0cnVjdCBub2RlICpub2RlOworICAgICAgICBpbnQgcmVzOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9MSU5LX0NPTkZJRykpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwlhcmdzID0gKHN0cnVjdCB0aXBjX2xpbmtfY29uZmlnICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwluZXdfdmFsdWUgPSBudG9obChhcmdzLT52YWx1ZSk7CisKKwlpZiAoIXN0cmNtcChhcmdzLT5uYW1lLCBiY19saW5rX25hbWUpKSB7CisJCWlmICgoY21kID09IFRJUENfQ01EX1NFVF9MSU5LX1dJTkRPVykgJiYKKwkJICAgIChiY2xpbmtfc2V0X3F1ZXVlX2xpbWl0cyhuZXdfdmFsdWUpID09IDApKQorCQkJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7CisJICAgICAgIAlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVECisJCQkJCSAgICAgICIgKGNhbm5vdCBjaGFuZ2Ugc2V0dGluZyBvbiBicm9hZGNhc3QgbGluaykiKTsKKwl9CisKKwlyZWFkX2xvY2tfYmgoJm5ldF9sb2NrKTsKKwlsX3B0ciA9IGxpbmtfZmluZF9saW5rKGFyZ3MtPm5hbWUsICZub2RlKTsgCisJaWYgKCFsX3B0cikgeworCQlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOworCSAgICAgICAJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoImxpbmsgbm90IGZvdW5kIik7CisJfQorCisJbm9kZV9sb2NrKG5vZGUpOworCXJlcyA9IC1FSU5WQUw7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJUENfQ01EX1NFVF9MSU5LX1RPTDogCisJCWlmICgobmV3X3ZhbHVlID49IFRJUENfTUlOX0xJTktfVE9MKSAmJiAKKwkJICAgIChuZXdfdmFsdWUgPD0gVElQQ19NQVhfTElOS19UT0wpKSB7CisJCQlsaW5rX3NldF9zdXBlcnZpc2lvbl9wcm9wcyhsX3B0ciwgbmV3X3ZhbHVlKTsKKwkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgCisJCQkJCSAgICAwLCAwLCBuZXdfdmFsdWUsIDAsIDApOworCQkJcmVzID0gVElQQ19PSzsKKwkJfQorCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1NFVF9MSU5LX1BSSTogCisJCWlmIChuZXdfdmFsdWUgPCBUSVBDX05VTV9MSU5LX1BSSSkgeworCQkJbF9wdHItPnByaW9yaXR5ID0gbmV3X3ZhbHVlOworCQkJbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgU1RBVEVfTVNHLCAKKwkJCQkJICAgIDAsIDAsIDAsIG5ld192YWx1ZSwgMCk7CisJCQlyZXMgPSBUSVBDX09LOworCQl9CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX0xJTktfV0lORE9XOiAKKwkJaWYgKChuZXdfdmFsdWUgPj0gVElQQ19NSU5fTElOS19XSU4pICYmIAorCQkgICAgKG5ld192YWx1ZSA8PSBUSVBDX01BWF9MSU5LX1dJTikpIHsKKwkJCWxpbmtfc2V0X3F1ZXVlX2xpbWl0cyhsX3B0ciwgbmV3X3ZhbHVlKTsKKwkJCXJlcyA9IFRJUENfT0s7CisJCX0KKwkJYnJlYWs7CisJfQorCW5vZGVfdW5sb2NrKG5vZGUpOworCisJcmVhZF91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwlpZiAocmVzKQorCSAgICAgICAJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoImNhbm5vdCBjaGFuZ2UgbGluayBzZXR0aW5nIik7CisKKwlyZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKK30KKworLyoqCisgKiBsaW5rX3Jlc2V0X3N0YXRpc3RpY3MgLSByZXNldCBsaW5rIHN0YXRpc3RpY3MKKyAqIEBsX3B0cjogcG9pbnRlciB0byBsaW5rCisgKi8KKworc3RhdGljIHZvaWQgbGlua19yZXNldF9zdGF0aXN0aWNzKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwltZW1zZXQoJmxfcHRyLT5zdGF0cywgMCwgc2l6ZW9mKGxfcHRyLT5zdGF0cykpOworCWxfcHRyLT5zdGF0cy5zZW50X2luZm8gPSBsX3B0ci0+bmV4dF9vdXRfbm87CisJbF9wdHItPnN0YXRzLnJlY3ZfaW5mbyA9IGxfcHRyLT5uZXh0X2luX25vOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqbGlua19jbWRfcmVzZXRfc3RhdHMoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSkKK3sKKwljaGFyICpsaW5rX25hbWU7CisJc3RydWN0IGxpbmsgKmxfcHRyOyAKKwlzdHJ1Y3Qgbm9kZSAqbm9kZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfTElOS19OQU1FKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCWxpbmtfbmFtZSA9IChjaGFyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwlpZiAoIXN0cmNtcChsaW5rX25hbWUsIGJjX2xpbmtfbmFtZSkpIHsKKwkJaWYgKGJjbGlua19yZXNldF9zdGF0cygpKQorCQkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoImxpbmsgbm90IGZvdW5kIik7CisJCXJldHVybiBjZmdfcmVwbHlfbm9uZSgpOworCX0KKworCXJlYWRfbG9ja19iaCgmbmV0X2xvY2spOworCWxfcHRyID0gbGlua19maW5kX2xpbmsobGlua19uYW1lLCAmbm9kZSk7IAorCWlmICghbF9wdHIpIHsKKwkJcmVhZF91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoImxpbmsgbm90IGZvdW5kIik7CisJfQorCisJbm9kZV9sb2NrKG5vZGUpOworCWxpbmtfcmVzZXRfc3RhdGlzdGljcyhsX3B0cik7CisJbm9kZV91bmxvY2sobm9kZSk7CisJcmVhZF91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwlyZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKK30KKworLyoqCisgKiBwZXJjZW50IC0gY29udmVydCBjb3VudCB0byBhIHBlcmNlbnRhZ2Ugb2YgdG90YWwgKHJvdW5kaW5nIHVwIG9yIGRvd24pCisgKi8KKworc3RhdGljIHUzMiBwZXJjZW50KHUzMiBjb3VudCwgdTMyIHRvdGFsKQoreworCXJldHVybiAoY291bnQgKiAxMDAgKyAodG90YWwgLyAyKSkgLyB0b3RhbDsKK30KKworLyoqCisgKiBsaW5rX3N0YXRzIC0gcHJpbnQgbGluayBzdGF0aXN0aWNzCisgKiBAbmFtZTogbGluayBuYW1lCisgKiBAYnVmOiBwcmludCBidWZmZXIgYXJlYQorICogQGJ1Zl9zaXplOiBzaXplIG9mIHByaW50IGJ1ZmZlciBhcmVhCisgKiAKKyAqIFJldHVybnMgbGVuZ3RoIG9mIHByaW50IGJ1ZmZlciBkYXRhIHN0cmluZyAob3IgMCBpZiBlcnJvcikKKyAqLworCitzdGF0aWMgaW50IGxpbmtfc3RhdHMoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqYnVmLCBjb25zdCB1MzIgYnVmX3NpemUpCit7CisJc3RydWN0IHByaW50X2J1ZiBwYjsKKwlzdHJ1Y3QgbGluayAqbF9wdHI7IAorCXN0cnVjdCBub2RlICpub2RlOworCWNoYXIgKnN0YXR1czsKKwl1MzIgcHJvZmlsZV90b3RhbCA9IDA7CisKKwlpZiAoIXN0cmNtcChuYW1lLCBiY19saW5rX25hbWUpKQorCQlyZXR1cm4gYmNsaW5rX3N0YXRzKGJ1ZiwgYnVmX3NpemUpOworCisJcHJpbnRidWZfaW5pdCgmcGIsIGJ1ZiwgYnVmX3NpemUpOworCisJcmVhZF9sb2NrX2JoKCZuZXRfbG9jayk7CisJbF9wdHIgPSBsaW5rX2ZpbmRfbGluayhuYW1lLCAmbm9kZSk7IAorCWlmICghbF9wdHIpIHsKKwkJcmVhZF91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCW5vZGVfbG9jayhub2RlKTsKKworCWlmIChsaW5rX2lzX2FjdGl2ZShsX3B0cikpCisJCXN0YXR1cyA9ICJBQ1RJVkUiOworCWVsc2UgaWYgKGxpbmtfaXNfdXAobF9wdHIpKQorCQlzdGF0dXMgPSAiU1RBTkRCWSI7CisJZWxzZQorCQlzdGF0dXMgPSAiREVGVU5DVCI7CisJdGlwY19wcmludGYoJnBiLCAiTGluayA8JXM+XG4iCisJCSAgICAgICAgICIgICVzICBNVFU6JXUgIFByaW9yaXR5OiV1ICBUb2xlcmFuY2U6JXUgbXMiCisJCSAgICAgICAgICIgIFdpbmRvdzoldSBwYWNrZXRzXG4iLCAKKwkJICAgIGxfcHRyLT5uYW1lLCBzdGF0dXMsIGxpbmtfbWF4X3BrdChsX3B0ciksIAorCQkgICAgbF9wdHItPnByaW9yaXR5LCBsX3B0ci0+dG9sZXJhbmNlLCBsX3B0ci0+cXVldWVfbGltaXRbMF0pOworCXRpcGNfcHJpbnRmKCZwYiwgIiAgUlggcGFja2V0czoldSBmcmFnbWVudHM6JXUvJXUgYnVuZGxlczoldS8ldVxuIiwgCisJCSAgICBsX3B0ci0+bmV4dF9pbl9ubyAtIGxfcHRyLT5zdGF0cy5yZWN2X2luZm8sCisJCSAgICBsX3B0ci0+c3RhdHMucmVjdl9mcmFnbWVudHMsCisJCSAgICBsX3B0ci0+c3RhdHMucmVjdl9mcmFnbWVudGVkLAorCQkgICAgbF9wdHItPnN0YXRzLnJlY3ZfYnVuZGxlcywKKwkJICAgIGxfcHRyLT5zdGF0cy5yZWN2X2J1bmRsZWQpOworCXRpcGNfcHJpbnRmKCZwYiwgIiAgVFggcGFja2V0czoldSBmcmFnbWVudHM6JXUvJXUgYnVuZGxlczoldS8ldVxuIiwgCisJCSAgICBsX3B0ci0+bmV4dF9vdXRfbm8gLSBsX3B0ci0+c3RhdHMuc2VudF9pbmZvLAorCQkgICAgbF9wdHItPnN0YXRzLnNlbnRfZnJhZ21lbnRzLAorCQkgICAgbF9wdHItPnN0YXRzLnNlbnRfZnJhZ21lbnRlZCwgCisJCSAgICBsX3B0ci0+c3RhdHMuc2VudF9idW5kbGVzLAorCQkgICAgbF9wdHItPnN0YXRzLnNlbnRfYnVuZGxlZCk7CisJcHJvZmlsZV90b3RhbCA9IGxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX2NvdW50czsKKwlpZiAoIXByb2ZpbGVfdG90YWwpCisJCXByb2ZpbGVfdG90YWwgPSAxOworCXRpcGNfcHJpbnRmKCZwYiwgIiAgVFggcHJvZmlsZSBzYW1wbGU6JXUgcGFja2V0cyAgYXZlcmFnZToldSBvY3RldHNcbiIKKwkJICAgICAgICAgIiAgMC02NDoldSUlIC0yNTY6JXUlJSAtMTAyNDoldSUlIC00MDk2OiV1JSUgIgorCQkgICAgICAgICAiLTE2MzU0OiV1JSUgLTMyNzY4OiV1JSUgLTY2MDAwOiV1JSVcbiIsCisJCSAgICBsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9jb3VudHMsCisJCSAgICBsX3B0ci0+c3RhdHMubXNnX2xlbmd0aHNfdG90YWwgLyBwcm9maWxlX3RvdGFsLAorCQkgICAgcGVyY2VudChsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzBdLCBwcm9maWxlX3RvdGFsKSwKKwkJICAgIHBlcmNlbnQobF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVsxXSwgcHJvZmlsZV90b3RhbCksCisJCSAgICBwZXJjZW50KGxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbMl0sIHByb2ZpbGVfdG90YWwpLAorCQkgICAgcGVyY2VudChsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzNdLCBwcm9maWxlX3RvdGFsKSwKKwkJICAgIHBlcmNlbnQobF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVs0XSwgcHJvZmlsZV90b3RhbCksCisJCSAgICBwZXJjZW50KGxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbNV0sIHByb2ZpbGVfdG90YWwpLAorCQkgICAgcGVyY2VudChsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzZdLCBwcm9maWxlX3RvdGFsKSk7CisJdGlwY19wcmludGYoJnBiLCAiICBSWCBzdGF0ZXM6JXUgcHJvYmVzOiV1IG5ha3M6JXUgZGVmczoldSBkdXBzOiV1XG4iLCAKKwkJICAgIGxfcHRyLT5zdGF0cy5yZWN2X3N0YXRlcywKKwkJICAgIGxfcHRyLT5zdGF0cy5yZWN2X3Byb2JlcywKKwkJICAgIGxfcHRyLT5zdGF0cy5yZWN2X25hY2tzLAorCQkgICAgbF9wdHItPnN0YXRzLmRlZmVycmVkX3JlY3YsIAorCQkgICAgbF9wdHItPnN0YXRzLmR1cGxpY2F0ZXMpOworCXRpcGNfcHJpbnRmKCZwYiwgIiAgVFggc3RhdGVzOiV1IHByb2JlczoldSBuYWtzOiV1IGFja3M6JXUgZHVwczoldVxuIiwgCisJCSAgICBsX3B0ci0+c3RhdHMuc2VudF9zdGF0ZXMsIAorCQkgICAgbF9wdHItPnN0YXRzLnNlbnRfcHJvYmVzLCAKKwkJICAgIGxfcHRyLT5zdGF0cy5zZW50X25hY2tzLCAKKwkJICAgIGxfcHRyLT5zdGF0cy5zZW50X2Fja3MsIAorCQkgICAgbF9wdHItPnN0YXRzLnJldHJhbnNtaXR0ZWQpOworCXRpcGNfcHJpbnRmKCZwYiwgIiAgQ29uZ2VzdGlvbiBiZWFyZXI6JXUgbGluazoldSAgU2VuZCBxdWV1ZSBtYXg6JXUgYXZnOiV1XG4iLAorCQkgICAgbF9wdHItPnN0YXRzLmJlYXJlcl9jb25ncywKKwkJICAgIGxfcHRyLT5zdGF0cy5saW5rX2NvbmdzLCAKKwkJICAgIGxfcHRyLT5zdGF0cy5tYXhfcXVldWVfc3osCisJCSAgICBsX3B0ci0+c3RhdHMucXVldWVfc3pfY291bnRzCisJCSAgICA/IChsX3B0ci0+c3RhdHMuYWNjdV9xdWV1ZV9zeiAvIGxfcHRyLT5zdGF0cy5xdWV1ZV9zel9jb3VudHMpCisJCSAgICA6IDApOworCisJbm9kZV91bmxvY2sobm9kZSk7CisJcmVhZF91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwlyZXR1cm4gcHJpbnRidWZfdmFsaWRhdGUoJnBiKTsKK30KKworI2RlZmluZSBNQVhfTElOS19TVEFUU19JTkZPIDIwMDAKKworc3RydWN0IHNrX2J1ZmYgKmxpbmtfY21kX3Nob3dfc3RhdHMoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCB0bHZfZGVzYyAqcmVwX3RsdjsKKwlpbnQgc3RyX2xlbjsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfTElOS19OQU1FKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCWJ1ZiA9IGNmZ19yZXBseV9hbGxvYyhUTFZfU1BBQ0UoTUFYX0xJTktfU1RBVFNfSU5GTykpOworCWlmICghYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcF90bHYgPSAoc3RydWN0IHRsdl9kZXNjICopYnVmLT5kYXRhOworCisJc3RyX2xlbiA9IGxpbmtfc3RhdHMoKGNoYXIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpLAorCQkJICAgICAoY2hhciAqKVRMVl9EQVRBKHJlcF90bHYpLCBNQVhfTElOS19TVEFUU19JTkZPKTsKKwlpZiAoIXN0cl9sZW4pIHsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkgICAgICAgCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKCJsaW5rIG5vdCBmb3VuZCIpOworCX0KKworCXNrYl9wdXQoYnVmLCBUTFZfU1BBQ0Uoc3RyX2xlbikpOworCVRMVl9TRVQocmVwX3RsdiwgVElQQ19UTFZfVUxUUkFfU1RSSU5HLCBOVUxMLCBzdHJfbGVuKTsKKworCXJldHVybiBidWY7Cit9CisKKyNpZiAwCitpbnQgbGlua19jb250cm9sKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBvcCwgdTMyIHZhbCkKK3sKKwlpbnQgcmVzID0gLUVJTlZBTDsKKwlzdHJ1Y3QgbGluayAqbF9wdHI7CisJdTMyIGJlYXJlcl9pZDsKKwlzdHJ1Y3Qgbm9kZSAqIG5vZGU7CisJdTMyIGE7CisKKwlhID0gbGlua19uYW1lMmFkZHIobmFtZSwgJmJlYXJlcl9pZCk7CisJcmVhZF9sb2NrX2JoKCZuZXRfbG9jayk7CisJbm9kZSA9IG5vZGVfZmluZChhKTsKKwlpZiAobm9kZSkgeworCQlub2RlX2xvY2sobm9kZSk7CisJCWxfcHRyID0gbm9kZS0+bGlua3NbYmVhcmVyX2lkXTsKKwkJaWYgKGxfcHRyKSB7CisJCQlpZiAob3AgPT0gVElQQ19SRU1PVkVfTElOSykgeworCQkJCXN0cnVjdCBiZWFyZXIgKmJfcHRyID0gbF9wdHItPmJfcHRyOworCQkJCXNwaW5fbG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJCQkJbGlua19kZWxldGUobF9wdHIpOworCQkJCXNwaW5fdW5sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKKwkJCX0KKwkJCWlmIChvcCA9PSBUSVBDX0NNRF9CTE9DS19MSU5LKSB7CisJCQkJbGlua19yZXNldChsX3B0cik7CisJCQkJbF9wdHItPmJsb2NrZWQgPSAxOworCQkJfQorCQkJaWYgKG9wID09IFRJUENfQ01EX1VOQkxPQ0tfTElOSykgeworCQkJCWxfcHRyLT5ibG9ja2VkID0gMDsKKwkJCX0KKwkJCXJlcyA9IFRJUENfT0s7CisJCX0KKwkJbm9kZV91bmxvY2sobm9kZSk7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisJcmV0dXJuIHJlczsKK30KKyNlbmRpZgorCisvKioKKyAqIGxpbmtfZ2V0X21heF9wa3QgLSBnZXQgbWF4aW11bSBwYWNrZXQgc2l6ZSB0byB1c2Ugd2hlbiBzZW5kaW5nIHRvIGRlc3RpbmF0aW9uCisgKiBAZGVzdDogbmV0d29yayBhZGRyZXNzIG9mIGRlc3RpbmF0aW9uIG5vZGUKKyAqIEBzZWxlY3RvcjogdXNlZCB0byBzZWxlY3QgZnJvbSBzZXQgb2YgYWN0aXZlIGxpbmtzCisgKiAKKyAqIElmIG5vIGFjdGl2ZSBsaW5rIGNhbiBiZSBmb3VuZCwgdXNlcyBkZWZhdWx0IG1heGltdW0gcGFja2V0IHNpemUuCisgKi8KKwordTMyIGxpbmtfZ2V0X21heF9wa3QodTMyIGRlc3QsIHUzMiBzZWxlY3RvcikKK3sKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CisJc3RydWN0IGxpbmsgKmxfcHRyOworCXUzMiByZXMgPSBNQVhfUEtUX0RFRkFVTFQ7CisJCisJaWYgKGRlc3QgPT0gdGlwY19vd25fYWRkcikKKwkJcmV0dXJuIE1BWF9NU0dfU0laRTsKKworCXJlYWRfbG9ja19iaCgmbmV0X2xvY2spOyAgICAgICAgCisJbl9wdHIgPSBub2RlX3NlbGVjdChkZXN0LCBzZWxlY3Rvcik7CisJaWYgKG5fcHRyKSB7CisJCW5vZGVfbG9jayhuX3B0cik7CisJCWxfcHRyID0gbl9wdHItPmFjdGl2ZV9saW5rc1tzZWxlY3RvciAmIDFdOworCQlpZiAobF9wdHIpCisJCQlyZXMgPSBsaW5rX21heF9wa3QobF9wdHIpOworCQlub2RlX3VubG9jayhuX3B0cik7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7ICAgICAgIAorCXJldHVybiByZXM7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBsaW5rX2R1bXBfcmVjX3F1ZXVlKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqY3JzOworCisJaWYgKCFsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luKSB7CisJCWluZm8oIlJlY2VwdGlvbiBxdWV1ZSBlbXB0eVxuIik7CisJCXJldHVybjsKKwl9CisJaW5mbygiQ29udGVudHMgb2YgUmVjZXB0aW9uIHF1ZXVlOlxuIik7CisJY3JzID0gbF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbjsKKwl3aGlsZSAoY3JzKSB7CisJCWlmIChjcnMtPmRhdGEgPT0gKHZvaWQgKikweDAwMDBhM2EzKSB7CisJCQlpbmZvKCJidWZmZXIgJXggaW52YWxpZFxuIiwgY3JzKTsKKwkJCXJldHVybjsKKwkJfQorCQltc2dfZGJnKGJ1Zl9tc2coY3JzKSwgIkluIHJlYyBxdWV1ZTogXG4iKTsKKwkJY3JzID0gY3JzLT5uZXh0OworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBsaW5rX2R1bXBfc2VuZF9xdWV1ZShzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJaWYgKGxfcHRyLT5uZXh0X291dCkgeworCQlpbmZvKCJcbkNvbnRlbnRzIG9mIHVuc2VudCBxdWV1ZTpcbiIpOworCQlkYmdfcHJpbnRfYnVmX2NoYWluKGxfcHRyLT5uZXh0X291dCk7CisJfQorCWluZm8oIlxuQ29udGVudHMgb2Ygc2VuZCBxdWV1ZTpcbiIpOworCWlmIChsX3B0ci0+Zmlyc3Rfb3V0KSB7CisJCWRiZ19wcmludF9idWZfY2hhaW4obF9wdHItPmZpcnN0X291dCk7CisJfQorCWluZm8oIkVtcHR5IHNlbmQgcXVldWVcbiIpOworfQorCitzdGF0aWMgdm9pZCBsaW5rX3ByaW50KHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHByaW50X2J1ZiAqYnVmLAorCQkgICAgICAgY29uc3QgY2hhciAqc3RyKQoreworCXRpcGNfcHJpbnRmKGJ1Ziwgc3RyKTsKKwlpZiAobGlua19yZXNldF9yZXNldChsX3B0cikgfHwgbGlua19yZXNldF91bmtub3duKGxfcHRyKSkKKwkJcmV0dXJuOworCXRpcGNfcHJpbnRmKGJ1ZiwgIkxpbmsgJXg8JXM+OiIsCisJCSAgICBsX3B0ci0+YWRkciwgbF9wdHItPmJfcHRyLT5wdWJsLm5hbWUpOworCXRpcGNfcHJpbnRmKGJ1ZiwgIjogTlhPKCV1KToiLCBtb2QobF9wdHItPm5leHRfb3V0X25vKSk7CisJdGlwY19wcmludGYoYnVmLCAiTlhJKCV1KToiLCBtb2QobF9wdHItPm5leHRfaW5fbm8pKTsKKwl0aXBjX3ByaW50ZihidWYsICJTUVVFIik7CisJaWYgKGxfcHRyLT5maXJzdF9vdXQpIHsKKwkJdGlwY19wcmludGYoYnVmLCAiWyV1Li4iLCBtc2dfc2Vxbm8oYnVmX21zZyhsX3B0ci0+Zmlyc3Rfb3V0KSkpOworCQlpZiAobF9wdHItPm5leHRfb3V0KQorCQkJdGlwY19wcmludGYoYnVmLCAiJXUuLiIsCisJCQkJICAgIG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5uZXh0X291dCkpKTsKKwkJdGlwY19wcmludGYoYnVmLCAiJXVdIiwKKwkJCSAgICBtc2dfc2Vxbm8oYnVmX21zZworCQkJCSAgICAgIChsX3B0ci0+bGFzdF9vdXQpKSwgbF9wdHItPm91dF9xdWV1ZV9zaXplKTsKKwkJaWYgKChtb2QobXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPmxhc3Rfb3V0KSkgLSAKKwkJCSBtc2dfc2Vxbm8oYnVmX21zZyhsX3B0ci0+Zmlyc3Rfb3V0KSkpIAorCQkgICAgICE9IChsX3B0ci0+b3V0X3F1ZXVlX3NpemUgLSAxKSkKKwkJICAgIHx8IChsX3B0ci0+bGFzdF9vdXQtPm5leHQgIT0gMCkpIHsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuU2VuZCBxdWV1ZSBpbmNvbnNpc3RlbmN5XG4iKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgImZpcnN0X291dD0gJXggIiwgbF9wdHItPmZpcnN0X291dCk7CisJCQl0aXBjX3ByaW50ZihidWYsICJuZXh0X291dD0gJXggIiwgbF9wdHItPm5leHRfb3V0KTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgImxhc3Rfb3V0PSAleCAiLCBsX3B0ci0+bGFzdF9vdXQpOworCQkJbGlua19kdW1wX3NlbmRfcXVldWUobF9wdHIpOworCQl9CisJfSBlbHNlCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIltdIik7CisJdGlwY19wcmludGYoYnVmLCAiU1FTSVooJXUpIiwgbF9wdHItPm91dF9xdWV1ZV9zaXplKTsKKwlpZiAobF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbikgeworCQl1MzIgbyA9IG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4pKTsKKwkJdTMyIG4gPSBtc2dfc2Vxbm8oYnVmX21zZyhsX3B0ci0+bmV3ZXN0X2RlZmVycmVkX2luKSk7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpSUVVFWyV1Li4ldV0iLCBvLCBuKTsKKwkJaWYgKGxfcHRyLT5kZWZlcnJlZF9pbnF1ZXVlX3N6ICE9IG1vZCgobiArIDEpIC0gbykpIHsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpSUVNJWigldSkiLAorCQkJCSAgICBsX3B0ci0+ZGVmZXJyZWRfaW5xdWV1ZV9zeik7CisJCX0KKwl9CisJaWYgKGxpbmtfd29ya2luZ191bmtub3duKGxfcHRyKSkKKwkJdGlwY19wcmludGYoYnVmLCAiOldVIik7CisJaWYgKGxpbmtfcmVzZXRfcmVzZXQobF9wdHIpKQorCQl0aXBjX3ByaW50ZihidWYsICI6UlIiKTsKKwlpZiAobGlua19yZXNldF91bmtub3duKGxfcHRyKSkKKwkJdGlwY19wcmludGYoYnVmLCAiOlJVIik7CisJaWYgKGxpbmtfd29ya2luZ193b3JraW5nKGxfcHRyKSkKKwkJdGlwY19wcmludGYoYnVmLCAiOldXIik7CisJdGlwY19wcmludGYoYnVmLCAiXG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbGluay5oIGIvbmV0L3RpcGMvbGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNTUzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9saW5rLmgKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBuZXQvdGlwYy9saW5rLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBsaW5rIGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk1LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX0xJTktfSAorI2RlZmluZSBfVElQQ19MSU5LX0gKKworI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorI2luY2x1ZGUgIm5vZGUuaCIKKworI2RlZmluZSBQVVNIX0ZBSUxFRCAgIDEKKyNkZWZpbmUgUFVTSF9GSU5JU0hFRCAyCisKKy8qIAorICogTGluayBzdGF0ZXMgCisgKi8KKworI2RlZmluZSBXT1JLSU5HX1dPUktJTkcgNTYwODEwdQorI2RlZmluZSBXT1JLSU5HX1VOS05PV04gNTYwODExdQorI2RlZmluZSBSRVNFVF9VTktOT1dOICAgNTYwODEydQorI2RlZmluZSBSRVNFVF9SRVNFVCAgICAgNTYwODEzdQorCisvKiAKKyAqIFN0YXJ0aW5nIHZhbHVlIGZvciBtYXhpbXVtIHBhY2tldCBzaXplIG5lZ290aWF0aW9uIG9uIHVuaWNhc3QgbGlua3MKKyAqICh1bmxlc3MgYmVhcmVyIE1UVSBpcyBsZXNzKQorICovCisKKyNkZWZpbmUgTUFYX1BLVF9ERUZBVUxUIDE1MDAKKworLyoqCisgKiBzdHJ1Y3QgbGluayAtIFRJUEMgbGluayBkYXRhIHN0cnVjdHVyZQorICogQGFkZHI6IG5ldHdvcmsgYWRkcmVzcyBvZiBsaW5rJ3MgcGVlciBub2RlCisgKiBAbmFtZTogbGluayBuYW1lIGNoYXJhY3RlciBzdHJpbmcKKyAqIEBtZWRpYV9hZGRyOiBtZWRpYSBhZGRyZXNzIHRvIHVzZSB3aGVuIHNlbmRpbmcgbWVzc2FnZXMgb3ZlciBsaW5rCisgKiBAdGltZXI6IGxpbmsgdGltZXIKKyAqIEBvd25lcjogcG9pbnRlciB0byBwZWVyIG5vZGUKKyAqIEBsaW5rX2xpc3Q6IGFkamFjZW50IGxpbmtzIGluIGJlYXJlcidzIGxpc3Qgb2YgbGlua3MKKyAqIEBzdGFydGVkOiBpbmRpY2F0ZXMgaWYgbGluayBoYXMgYmVlbiBzdGFydGVkCisgKiBAY2hlY2twb2ludDogcmVmZXJlbmNlIHBvaW50IGZvciB0cmlnZ2VyaW5nIGxpbmsgY29udGludWl0eSBjaGVja2luZworICogQHBlZXJfc2Vzc2lvbjogbGluayBzZXNzaW9uICMgYmVpbmcgdXNlZCBieSBwZWVyIGVuZCBvZiBsaW5rCisgKiBAcGVlcl9iZWFyZXJfaWQ6IGJlYXJlciBpZCB1c2VkIGJ5IGxpbmsncyBwZWVyIGVuZHBvaW50CisgKiBAYl9wdHI6IHBvaW50ZXIgdG8gYmVhcmVyIHVzZWQgYnkgbGluaworICogQHRvbGVyYW5jZTogbWluaW11bSBsaW5rIGNvbnRpbnVpdHkgbG9zcyBuZWVkZWQgdG8gcmVzZXQgbGluayBbaW4gbXNdIAorICogQGNvbnRpbnVpdHlfaW50ZXJ2YWw6IGxpbmsgY29udGludWl0eSB0ZXN0aW5nIGludGVydmFsIFtpbiBtc10KKyAqIEBhYm9ydF9saW1pdDogIyBvZiB1bmFja25vd2xlZGdlZCBjb250aW51aXR5IHByb2JlcyBuZWVkZWQgdG8gcmVzZXQgbGluaworICogQHN0YXRlOiBjdXJyZW50IHN0YXRlIG9mIGxpbmsgRlNNCisgKiBAYmxvY2tlZDogaW5kaWNhdGVzIGlmIGxpbmsgaGFzIGJlZW4gYWRtaW5pc3RyYXRpdmVseSBibG9ja2VkCisgKiBAZnNtX21zZ19jbnQ6ICMgb2YgcHJvdG9jb2wgbWVzc2FnZXMgbGluayBGU00gaGFzIHNlbnQgaW4gY3VycmVudCBzdGF0ZQorICogQHByb3RvX21zZzogdGVtcGxhdGUgZm9yIGNvbnRyb2wgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5IGxpbmsKKyAqIEBwbXNnOiBjb252ZW5pZW5jZSBwb2ludGVyIHRvICJwcm90b19tc2ciIGZpZWxkCisgKiBAcHJpb3JpdHk6IGN1cnJlbnQgbGluayBwcmlvcml0eQorICogQHF1ZXVlX2xpbWl0OiBvdXRib3VuZCBtZXNzYWdlIHF1ZXVlIGNvbmdlc3Rpb24gdGhyZXNob2xkcyAoaW5kZXhlZCBieSB1c2VyKQorICogQGV4cF9tc2dfY291bnQ6ICMgb2YgdHVubmVsbGVkIG1lc3NhZ2VzIGV4cGVjdGVkIGR1cmluZyBsaW5rIGNoYW5nZW92ZXIKKyAqIEByZXNldF9jaGVja3BvaW50OiBzZXEgIyBvZiBsYXN0IGFja25vd2xlZGdlZCBtZXNzYWdlIGF0IHRpbWUgb2YgbGluayByZXNldAorICogQG1heF9wa3Q6IGN1cnJlbnQgbWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgdGhpcyBsaW5rCisgKiBAbWF4X3BrdF90YXJnZXQ6IGRlc2lyZWQgbWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgdGhpcyBsaW5rCisgKiBAbWF4X3BrdF9wcm9iZXM6ICMgb2YgcHJvYmVzIGJhc2VkIG9uIGN1cnJlbnQgKG1heF9wa3QsIG1heF9wa3RfdGFyZ2V0KQorICogQG91dF9xdWV1ZV9zaXplOiAjIG9mIG1lc3NhZ2VzIGluIG91dGJvdW5kIG1lc3NhZ2UgcXVldWUKKyAqIEBmaXJzdF9vdXQ6IHB0ciB0byBmaXJzdCBvdXRib3VuZCBtZXNzYWdlIGluIHF1ZXVlCisgKiBAbGFzdF9vdXQ6IHB0ciB0byBsYXN0IG91dGJvdW5kIG1lc3NhZ2UgaW4gcXVldWUKKyAqIEBuZXh0X291dF9ubzogbmV4dCBzZXF1ZW5jZSBudW1iZXIgdG8gdXNlIGZvciBvdXRib3VuZCBtZXNzYWdlcworICogQGxhc3RfcmV0cmFuc21pdHRlZDogc2VxdWVuY2UgbnVtYmVyIG9mIG1vc3QgcmVjZW50bHkgcmV0cmFuc21pdHRlZCBtZXNzYWdlCisgKiBAc3RhbGVfY291bnQ6ICMgb2YgaWRlbnRpY2FsIHJldHJhbnNtaXQgcmVxdWVzdHMgbWFkZSBieSBwZWVyCisgKiBAbmV4dF9pbl9ubzogbmV4dCBzZXF1ZW5jZSBudW1iZXIgdG8gZXhwZWN0IGZvciBpbmJvdW5kIG1lc3NhZ2VzCisgKiBAZGVmZXJyZWRfaW5xdWV1ZV9zejogIyBvZiBtZXNzYWdlcyBpbiBpbmJvdW5kIG1lc3NhZ2UgcXVldWUKKyAqIEBvbGRlc3RfZGVmZXJyZWRfaW46IHB0ciB0byBmaXJzdCBpbmJvdW5kIG1lc3NhZ2UgaW4gcXVldWUKKyAqIEBuZXdlc3RfZGVmZXJyZWRfaW46IHB0ciB0byBsYXN0IGluYm91bmQgbWVzc2FnZSBpbiBxdWV1ZQorICogQHVuYWNrZWRfd2luZG93OiAjIG9mIGluYm91bmQgbWVzc2FnZXMgcngnZCB3aXRob3V0IGFjaydpbmcgYmFjayB0byBwZWVyCisgKiBAcHJvdG9fbXNnX3F1ZXVlOiBwdHIgdG8gKHNpbmdsZSkgb3V0Ym91bmQgY29udHJvbCBtZXNzYWdlCisgKiBAcmV0cmFuc21fcXVldWVfc2l6ZTogbnVtYmVyIG9mIG1lc3NhZ2VzIHRvIHJldHJhbnNtaXQKKyAqIEByZXRyYW5zbV9xdWV1ZV9oZWFkOiBzZXF1ZW5jZSBudW1iZXIgb2YgZmlyc3QgbWVzc2FnZSB0byByZXRyYW5zbWl0CisgKiBAbmV4dF9vdXQ6IHB0ciB0byBmaXJzdCB1bnNlbnQgb3V0Ym91bmQgbWVzc2FnZSBpbiBxdWV1ZQorICogQHdhaXRpbmdfcG9ydHM6IGxpbmtlZCBsaXN0IG9mIHBvcnRzIHdhaXRpbmcgZm9yIGxpbmsgY29uZ2VzdGlvbiB0byBhYmF0ZQorICogQGxvbmdfbXNnX3NlcV9ubzogbmV4dCBpZGVudGlmaWVyIHRvIHVzZSBmb3Igb3V0Ym91bmQgZnJhZ21lbnRlZCBtZXNzYWdlcworICogQGRlZnJhZ21fYnVmOiBsaXN0IG9mIHBhcnRpYWxseSByZWFzc2VtYmxlZCBpbmJvdW5kIG1lc3NhZ2UgZnJhZ21lbnRzCisgKiBAc3RhdHM6IGNvbGxlY3RzIHN0YXRpc3RpY3MgcmVnYXJkaW5nIGxpbmsgYWN0aXZpdHkKKyAqIEBwcmludF9idWY6IHByaW50IGJ1ZmZlciB1c2VkIHRvIGxvZyBsaW5rIGFjdGl2aXR5CisgKi8KKyAKK3N0cnVjdCBsaW5rIHsKKwl1MzIgYWRkcjsKKwljaGFyIG5hbWVbVElQQ19NQVhfTElOS19OQU1FXTsKKwlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIG1lZGlhX2FkZHI7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJc3RydWN0IG5vZGUgKm93bmVyOworCXN0cnVjdCBsaXN0X2hlYWQgbGlua19saXN0OworCisJLyogTWFuYWdlbWVudCBhbmQgbGluayBzdXBlcnZpc2lvbiBkYXRhICovCisJaW50IHN0YXJ0ZWQ7CisJdTMyIGNoZWNrcG9pbnQ7CisJdTMyIHBlZXJfc2Vzc2lvbjsKKwl1MzIgcGVlcl9iZWFyZXJfaWQ7CisJc3RydWN0IGJlYXJlciAqYl9wdHI7CisJdTMyIHRvbGVyYW5jZTsKKwl1MzIgY29udGludWl0eV9pbnRlcnZhbDsKKwl1MzIgYWJvcnRfbGltaXQ7CisJaW50IHN0YXRlOworCWludCBibG9ja2VkOworCXUzMiBmc21fbXNnX2NudDsKKwlzdHJ1Y3QgeworCQl1bmNoYXIgaGRyW0lOVF9IX1NJWkVdOworCQl1bmNoYXIgYm9keVtUSVBDX01BWF9JRl9OQU1FXTsKKwl9IHByb3RvX21zZzsKKwlzdHJ1Y3QgdGlwY19tc2cgKnBtc2c7CisJdTMyIHByaW9yaXR5OworCXUzMiBxdWV1ZV9saW1pdFsxNV07CS8qIHF1ZXVlX2xpbWl0WzBdPT13aW5kb3cgbGltaXQgKi8KKworCS8qIENoYW5nZW92ZXIgKi8KKwl1MzIgZXhwX21zZ19jb3VudDsKKwl1MzIgcmVzZXRfY2hlY2twb2ludDsKKworICAgICAgICAvKiBNYXggcGFja2V0IG5lZ290aWF0aW9uICovCisgICAgICAgIHUzMiBtYXhfcGt0OworICAgICAgICB1MzIgbWF4X3BrdF90YXJnZXQ7CisgICAgICAgIHUzMiBtYXhfcGt0X3Byb2JlczsKKworCS8qIFNlbmRpbmcgKi8KKwl1MzIgb3V0X3F1ZXVlX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKmZpcnN0X291dDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbGFzdF9vdXQ7CisJdTMyIG5leHRfb3V0X25vOworICAgICAgICB1MzIgbGFzdF9yZXRyYW5zbWl0dGVkOworICAgICAgICB1MzIgc3RhbGVfY291bnQ7CisKKwkvKiBSZWNlcHRpb24gKi8KKwl1MzIgbmV4dF9pbl9ubzsKKwl1MzIgZGVmZXJyZWRfaW5xdWV1ZV9zejsKKwlzdHJ1Y3Qgc2tfYnVmZiAqb2xkZXN0X2RlZmVycmVkX2luOworCXN0cnVjdCBza19idWZmICpuZXdlc3RfZGVmZXJyZWRfaW47CisJdTMyIHVuYWNrZWRfd2luZG93OworCisJLyogQ29uZ2VzdGlvbiBoYW5kbGluZyAqLworCXN0cnVjdCBza19idWZmICpwcm90b19tc2dfcXVldWU7CisJdTMyIHJldHJhbnNtX3F1ZXVlX3NpemU7CisJdTMyIHJldHJhbnNtX3F1ZXVlX2hlYWQ7CisJc3RydWN0IHNrX2J1ZmYgKm5leHRfb3V0OworCXN0cnVjdCBsaXN0X2hlYWQgd2FpdGluZ19wb3J0czsKKworCS8qIEZyYWdtZW50YXRpb24vZGVmcmFnbWVudGF0aW9uICovCisJdTMyIGxvbmdfbXNnX3NlcV9ubzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZGVmcmFnbV9idWY7CisKKyAgICAgICAgLyogU3RhdGlzdGljcyAqLworCXN0cnVjdCB7CisJCXUzMiBzZW50X2luZm87CQkvKiB1c2VkIGluIGNvdW50aW5nICMgc2VudCBwYWNrZXRzICovCisJCXUzMiByZWN2X2luZm87CQkvKiB1c2VkIGluIGNvdW50aW5nICMgcmVjdidkIHBhY2tldHMgKi8KKwkJdTMyIHNlbnRfc3RhdGVzOworCQl1MzIgcmVjdl9zdGF0ZXM7CisJCXUzMiBzZW50X3Byb2JlczsKKwkJdTMyIHJlY3ZfcHJvYmVzOworCQl1MzIgc2VudF9uYWNrczsKKwkJdTMyIHJlY3ZfbmFja3M7CisJCXUzMiBzZW50X2Fja3M7CisJCXUzMiBzZW50X2J1bmRsZWQ7CisJCXUzMiBzZW50X2J1bmRsZXM7CisJCXUzMiByZWN2X2J1bmRsZWQ7CisJCXUzMiByZWN2X2J1bmRsZXM7CisJCXUzMiByZXRyYW5zbWl0dGVkOworCQl1MzIgc2VudF9mcmFnbWVudGVkOworCQl1MzIgc2VudF9mcmFnbWVudHM7CisJCXUzMiByZWN2X2ZyYWdtZW50ZWQ7CisJCXUzMiByZWN2X2ZyYWdtZW50czsKKwkJdTMyIGxpbmtfY29uZ3M7CQkvKiAjIHBvcnQgc2VuZHMgYmxvY2tlZCBieSBjb25nZXN0aW9uICovCisJCXUzMiBiZWFyZXJfY29uZ3M7CisJCXUzMiBkZWZlcnJlZF9yZWN2OworCQl1MzIgZHVwbGljYXRlczsKKworCQkvKiBmb3Igc3RhdGlzdGljYWwgcHJvZmlsaW5nIG9mIHNlbmQgcXVldWUgc2l6ZSAqLworCisJCXUzMiBtYXhfcXVldWVfc3o7CisJCXUzMiBhY2N1X3F1ZXVlX3N6OworCQl1MzIgcXVldWVfc3pfY291bnRzOworCisJCS8qIGZvciBzdGF0aXN0aWNhbCBwcm9maWxpbmcgb2YgbWVzc2FnZSBsZW5ndGhzICovCisKKwkJdTMyIG1zZ19sZW5ndGhfY291bnRzOworCQl1MzIgbXNnX2xlbmd0aHNfdG90YWw7CisJCXUzMiBtc2dfbGVuZ3RoX3Byb2ZpbGVbN107CisjaWYgMAorCQl1MzIgc2VudF90dW5uZWxlZDsKKwkJdTMyIHJlY3ZfdHVubmVsZWQ7CisjZW5kaWYKKwl9IHN0YXRzOworCisJc3RydWN0IHByaW50X2J1ZiBwcmludF9idWY7Cit9OworCitzdHJ1Y3QgcG9ydDsKKworc3RydWN0IGxpbmsgKmxpbmtfY3JlYXRlKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBjb25zdCB1MzIgcGVlciwKKwkJCSBjb25zdCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICptZWRpYV9hZGRyKTsKK3ZvaWQgbGlua19kZWxldGUoc3RydWN0IGxpbmsgKmxfcHRyKTsKK3ZvaWQgbGlua19jaGFuZ2VvdmVyKHN0cnVjdCBsaW5rICpsX3B0cik7Cit2b2lkIGxpbmtfc2VuZF9kdXBsaWNhdGUoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3QgbGluayAqZGVzdCk7Cit2b2lkIGxpbmtfcmVzZXRfZnJhZ21lbnRzKHN0cnVjdCBsaW5rICpsX3B0cik7CitpbnQgbGlua19pc191cChzdHJ1Y3QgbGluayAqbF9wdHIpOworaW50IGxpbmtfaXNfYWN0aXZlKHN0cnVjdCBsaW5rICpsX3B0cik7Cit2b2lkIGxpbmtfc3RhcnQoc3RydWN0IGxpbmsgKmxfcHRyKTsKK3UzMiBsaW5rX3B1c2hfcGFja2V0KHN0cnVjdCBsaW5rICpsX3B0cik7Cit2b2lkIGxpbmtfc3RvcChzdHJ1Y3QgbGluayAqbF9wdHIpOworc3RydWN0IHNrX2J1ZmYgKmxpbmtfY21kX2NvbmZpZyhjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlLCB1MTYgY21kKTsKK3N0cnVjdCBza19idWZmICpsaW5rX2NtZF9zaG93X3N0YXRzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpOworc3RydWN0IHNrX2J1ZmYgKmxpbmtfY21kX3Jlc2V0X3N0YXRzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpOwordm9pZCBsaW5rX3Jlc2V0KHN0cnVjdCBsaW5rICpsX3B0cik7CitpbnQgbGlua19zZW5kKHN0cnVjdCBza19idWZmICpidWYsIHUzMiBkZXN0LCB1MzIgc2VsZWN0b3IpOworaW50IGxpbmtfc2VuZF9idWYoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK3UzMiBsaW5rX2dldF9tYXhfcGt0KHUzMiBkZXN0LHUzMiBzZWxlY3Rvcik7CitpbnQgbGlua19zZW5kX3NlY3Rpb25zX2Zhc3Qoc3RydWN0IHBvcnQqIHNlbmRlciwgCisJCQkgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCwKKwkJCSAgICBjb25zdCB1MzIgbnVtX3NlY3QsIAorCQkJICAgIHUzMiBkZXN0bm9kZSk7CisKK2ludCBsaW5rX3NlbmRfbG9uZ19idWYoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK3ZvaWQgbGlua190dW5uZWwoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3QgdGlwY19tc2cgKnRubF9oZHIsCisJCSBzdHJ1Y3QgdGlwY19tc2cgKm1zZywgdTMyIHNlbGVjdG9yKTsKK3ZvaWQgbGlua19yZWN2X2J1bmRsZShzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK2ludCAgbGlua19yZWN2X2ZyYWdtZW50KHN0cnVjdCBza19idWZmICoqcGVuZGluZywKKwkJCXN0cnVjdCBza19idWZmICoqZmIsCisJCQlzdHJ1Y3QgdGlwY19tc2cgKiptc2cpOwordm9pZCBsaW5rX3NlbmRfcHJvdG9fbXNnKHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIG1zZ190eXAsIGludCBwcm9iLCB1MzIgZ2FwLCAKKwkJCSB1MzIgdG9sZXJhbmNlLCB1MzIgcHJpb3JpdHksIHUzMiBhY2tlZF9tdHUpOwordm9pZCBsaW5rX3B1c2hfcXVldWUoc3RydWN0IGxpbmsgKmxfcHRyKTsKK3UzMiBsaW5rX2RlZmVyX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWQsIHN0cnVjdCBza19idWZmICoqdGFpbCwKKwkJICAgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7Cit2b2lkIGxpbmtfd2FrZXVwX3BvcnRzKHN0cnVjdCBsaW5rICpsX3B0ciwgaW50IGFsbCk7Cit2b2lkIGxpbmtfc2V0X3F1ZXVlX2xpbWl0cyhzdHJ1Y3QgbGluayAqbF9wdHIsIHUzMiB3aW5kb3cpOwordm9pZCBsaW5rX3JldHJhbnNtaXQoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqc3RhcnQsIHUzMiByZXRyYW5zbWl0cyk7CisKKy8qCisgKiBMaW5rIHNlcXVlbmNlIG51bWJlciBtYW5pcHVsYXRpb24gcm91dGluZXMgKHVzZXMgbW9kdWxvIDIqKjE2IGFyaXRobWV0aWMpCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgbW9kKHUzMiB4KQoreworCXJldHVybiB4ICYgMHhmZmZmdTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYmV0d2Vlbih1MzIgbG93ZXIsIHUzMiB1cHBlciwgdTMyIG4pCit7CisJaWYgKChsb3dlciA8IG4pICYmIChuIDwgdXBwZXIpKQorCQlyZXR1cm4gMTsKKwlpZiAoKHVwcGVyIDwgbG93ZXIpICYmICgobiA+IGxvd2VyKSB8fCAobiA8IHVwcGVyKSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsZXNzX2VxKHUzMiBsZWZ0LCB1MzIgcmlnaHQpCit7CisJcmV0dXJuIChtb2QocmlnaHQgLSBsZWZ0KSA8IDMyNzY4dSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxlc3ModTMyIGxlZnQsIHUzMiByaWdodCkKK3sKKwlyZXR1cm4gKGxlc3NfZXEobGVmdCwgcmlnaHQpICYmIChtb2QocmlnaHQpICE9IG1vZChsZWZ0KSkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBsZXNzZXIodTMyIGxlZnQsIHUzMiByaWdodCkKK3sKKwlyZXR1cm4gbGVzc19lcShsZWZ0LCByaWdodCkgPyBsZWZ0IDogcmlnaHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbXNnLmMgYi9uZXQvdGlwYy9tc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2RiYzU1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbXNnLmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisgKiBuZXQvdGlwYy9tc2cuYzogVElQQyBtZXNzYWdlIGhlYWRlciByb3V0aW5lcworICogICAgIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAiYmVhcmVyLmgiCisKKwordm9pZCBtc2dfc2V0X21lZGlhX2FkZHIoc3RydWN0IHRpcGNfbXNnICptLCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphKQoreworCW1lbWNweSgmKChpbnQgKiltKVs1XSwgYSwgc2l6ZW9mKCphKSk7Cit9CisKK3ZvaWQgbXNnX2dldF9tZWRpYV9hZGRyKHN0cnVjdCB0aXBjX21zZyAqbSwgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSkKK3sKKwltZW1jcHkoYSwgJigoaW50KiltKVs1XSwgc2l6ZW9mKCphKSk7Cit9CisKKwordm9pZCBtc2dfcHJpbnQoc3RydWN0IHByaW50X2J1ZiAqYnVmLCBzdHJ1Y3QgdGlwY19tc2cgKm1zZywgY29uc3QgY2hhciAqc3RyKQoreworCXUzMiB1c3IgPSBtc2dfdXNlcihtc2cpOworCXRpcGNfcHJpbnRmKGJ1Ziwgc3RyKTsKKworCXN3aXRjaCAodXNyKSB7CisJY2FzZSBNU0dfQlVORExFUjoKKwkJdGlwY19wcmludGYoYnVmLCAiQk5ETDo6Iik7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIk1TR1MoJXUpOiIsIG1zZ19tc2djbnQobXNnKSk7CisJCWJyZWFrOworCWNhc2UgQkNBU1RfUFJPVE9DT0w6CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIkJDQVNUUDo6Iik7CisJCWJyZWFrOworCWNhc2UgTVNHX0ZSQUdNRU5URVI6CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIkZSQUdNOjoiKTsKKwkJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJCWNhc2UgRklSU1RfRlJBR01FTlQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJGSVJTVDoiKTsKKwkJCWJyZWFrOworCQljYXNlIEZSQUdNRU5UOgorCQkJdGlwY19wcmludGYoYnVmLCAiQk9EWToiKTsKKwkJCWJyZWFrOworCQljYXNlIExBU1RfRlJBR01FTlQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJMQVNUOiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJVTktOT1dOOiV4Iixtc2dfdHlwZShtc2cpKTsKKworCQl9CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIk5PKCV1LyV1KToiLG1zZ19sb25nX21zZ25vKG1zZyksCisJCQkgICAgbXNnX2ZyYWdtX25vKG1zZykpOworCQlicmVhazsKKwljYXNlIERBVEFfTE9XOgorCWNhc2UgREFUQV9NRURJVU06CisJY2FzZSBEQVRBX0hJR0g6CisJY2FzZSBEQVRBX0NSSVRJQ0FMOgorCQl0aXBjX3ByaW50ZihidWYsICJEQVQldToiLCBtc2dfdXNlcihtc2cpKTsKKwkJaWYgKG1zZ19zaG9ydChtc2cpKSB7CisJCQl0aXBjX3ByaW50ZihidWYsICJDT046Iik7CisJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwkJY2FzZSBUSVBDX0NPTk5fTVNHOgorCQkJdGlwY19wcmludGYoYnVmLCAiQ09OOiIpOworCQkJYnJlYWs7CisJCWNhc2UgVElQQ19NQ0FTVF9NU0c6CisJCQl0aXBjX3ByaW50ZihidWYsICJNQ1NUOiIpOworCQkJYnJlYWs7CisJCWNhc2UgVElQQ19OQU1FRF9NU0c6CisJCQl0aXBjX3ByaW50ZihidWYsICJOQU06Iik7CisJCQlicmVhazsKKwkJY2FzZSBUSVBDX0RJUkVDVF9NU0c6CisJCQl0aXBjX3ByaW50ZihidWYsICJESVI6Iik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlVOS05PV04gVFlQRSAldSIsbXNnX3R5cGUobXNnKSk7CisJCX0KKwkJaWYgKG1zZ19yb3V0ZWQobXNnKSAmJiAhbXNnX25vbl9zZXEobXNnKSkKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlJPVVQ6Iik7CisJCWlmIChtc2dfcmVyb3V0ZV9jbnQobXNnKSkKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlJFUk9VVEVEKCV1KToiLAorCQkJCSAgICBtc2dfcmVyb3V0ZV9jbnQobXNnKSk7CisJCWJyZWFrOworCWNhc2UgTkFNRV9ESVNUUklCVVRPUjoKKwkJdGlwY19wcmludGYoYnVmLCAiTk1EOjoiKTsKKwkJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJCWNhc2UgUFVCTElDQVRJT046CisJCQl0aXBjX3ByaW50ZihidWYsICJQVUJMKCV1KToiLCAobXNnX3NpemUobXNnKSAtIG1zZ19oZHJfc3oobXNnKSkgLyAyMCk7CS8qIEl0ZW1zICovCisJCQlicmVhazsKKwkJY2FzZSBXSVRIRFJBV0FMOgorCQkJdGlwY19wcmludGYoYnVmLCAiV0RSVzoiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGlwY19wcmludGYoYnVmLCAiVU5LTk9XTjoleCIsbXNnX3R5cGUobXNnKSk7CisJCX0KKwkJaWYgKG1zZ19yb3V0ZWQobXNnKSkKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlJPVVQ6Iik7CisJCWlmIChtc2dfcmVyb3V0ZV9jbnQobXNnKSkKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlJFUk9VVEVEKCV1KToiLAorCQkJCSAgICBtc2dfcmVyb3V0ZV9jbnQobXNnKSk7CisJCWJyZWFrOworCWNhc2UgQ09OTl9NQU5BR0VSOgorCQl0aXBjX3ByaW50ZihidWYsICJDT05OX01ORzoiKTsKKwkJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJCWNhc2UgQ09OTl9QUk9CRToKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlBST0JFOiIpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OTl9QUk9CRV9SRVBMWToKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlBST0JFX1JFUExZOiIpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OTl9BQ0s6CisJCQl0aXBjX3ByaW50ZihidWYsICJDT05OX0FDSzoiKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkFDSygldSk6Iixtc2dfbXNnY250KG1zZykpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJVTktOT1dOIFRZUEU6JXgiLG1zZ190eXBlKG1zZykpOworCQl9CisJCWlmIChtc2dfcm91dGVkKG1zZykpCisJCQl0aXBjX3ByaW50ZihidWYsICJST1VUOiIpOworCQlpZiAobXNnX3Jlcm91dGVfY250KG1zZykpCisJCQl0aXBjX3ByaW50ZihidWYsICJSRVJPVVRFRCgldSk6Iixtc2dfcmVyb3V0ZV9jbnQobXNnKSk7CisJCWJyZWFrOworCWNhc2UgTElOS19QUk9UT0NPTDoKKwkJdGlwY19wcmludGYoYnVmLCAiUFJPVDpUSU0oJXUpOiIsbXNnX3RpbWVzdGFtcChtc2cpKTsKKwkJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJCWNhc2UgU1RBVEVfTVNHOgorCQkJdGlwY19wcmludGYoYnVmLCAiU1RBVEU6Iik7CisJCQl0aXBjX3ByaW50ZihidWYsICIlczoiLG1zZ19wcm9iZShtc2cpID8gIlBSQiIgOiIiKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIk5YUygldSk6Iixtc2dfbmV4dF9zZW50KG1zZykpOworCQkJdGlwY19wcmludGYoYnVmLCAiR0FQKCV1KToiLG1zZ19zZXFfZ2FwKG1zZykpOworCQkJdGlwY19wcmludGYoYnVmLCAiTFNUQkMoJXUpOiIsbXNnX2xhc3RfYmNhc3QobXNnKSk7CisJCQlicmVhazsKKwkJY2FzZSBSRVNFVF9NU0c6CisJCQl0aXBjX3ByaW50ZihidWYsICJSRVNFVDoiKTsKKwkJCWlmIChtc2dfc2l6ZShtc2cpICE9IG1zZ19oZHJfc3oobXNnKSkKKwkJCQl0aXBjX3ByaW50ZihidWYsICJCRUFSOiVzOiIsbXNnX2RhdGEobXNnKSk7CisJCQlicmVhazsKKwkJY2FzZSBBQ1RJVkFURV9NU0c6CisJCQl0aXBjX3ByaW50ZihidWYsICJBQ1RJVkFURToiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGlwY19wcmludGYoYnVmLCAiVU5LTk9XTiBUWVBFOiV4Iixtc2dfdHlwZShtc2cpKTsKKwkJfQorCQl0aXBjX3ByaW50ZihidWYsICJQTEFORSglYyk6Iixtc2dfbmV0X3BsYW5lKG1zZykpOworCQl0aXBjX3ByaW50ZihidWYsICJTRVNTKCV1KToiLG1zZ19zZXNzaW9uKG1zZykpOworCQlicmVhazsKKwljYXNlIENIQU5HRU9WRVJfUFJPVE9DT0w6CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlRVTkw6Iik7CisJCXN3aXRjaCAobXNnX3R5cGUobXNnKSkgeworCQljYXNlIERVUExJQ0FURV9NU0c6CisJCQl0aXBjX3ByaW50ZihidWYsICJEVVBMOiIpOworCQkJYnJlYWs7CisJCWNhc2UgT1JJR0lOQUxfTVNHOgorCQkJdGlwY19wcmludGYoYnVmLCAiT1JJRzoiKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkVYUCgldSkiLG1zZ19tc2djbnQobXNnKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlVOS05PV04gVFlQRToleCIsbXNnX3R5cGUobXNnKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBST1VURV9ESVNUUklCVVRPUjoKKwkJdGlwY19wcmludGYoYnVmLCAiUk9VVElOR19NTkc6Iik7CisJCXN3aXRjaCAobXNnX3R5cGUobXNnKSkgeworCQljYXNlIEVYVF9ST1VUSU5HX1RBQkxFOgorCQkJdGlwY19wcmludGYoYnVmLCAiRVhUX1RCTDoiKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlRPOiV4OiIsbXNnX3JlbW90ZV9ub2RlKG1zZykpOworCQkJYnJlYWs7CisJCWNhc2UgTE9DQUxfUk9VVElOR19UQUJMRToKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkxPQ0FMX1RCTDoiKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlRPOiV4OiIsbXNnX3JlbW90ZV9ub2RlKG1zZykpOworCQkJYnJlYWs7CisJCWNhc2UgU0xBVkVfUk9VVElOR19UQUJMRToKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkRQX1RCTDoiKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlRPOiV4OiIsbXNnX3JlbW90ZV9ub2RlKG1zZykpOworCQkJYnJlYWs7CisJCWNhc2UgUk9VVEVfQURESVRJT046CisJCQl0aXBjX3ByaW50ZihidWYsICJBREQ6Iik7CisJCQl0aXBjX3ByaW50ZihidWYsICJUTzoleDoiLG1zZ19yZW1vdGVfbm9kZShtc2cpKTsKKwkJCWJyZWFrOworCQljYXNlIFJPVVRFX1JFTU9WQUw6CisJCQl0aXBjX3ByaW50ZihidWYsICJSRU1PVkU6Iik7CisJCQl0aXBjX3ByaW50ZihidWYsICJUTzoleDoiLG1zZ19yZW1vdGVfbm9kZShtc2cpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGlwY19wcmludGYoYnVmLCAiVU5LTk9XTiBUWVBFOiV4Iixtc2dfdHlwZShtc2cpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIExJTktfQ09ORklHOgorCQl0aXBjX3ByaW50ZihidWYsICJDRkc6Iik7CisJCXN3aXRjaCAobXNnX3R5cGUobXNnKSkgeworCQljYXNlIERTQ19SRVFfTVNHOgorCQkJdGlwY19wcmludGYoYnVmLCAiRFNDX1JFUToiKTsKKwkJCWJyZWFrOworCQljYXNlIERTQ19SRVNQX01TRzoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkRTQ19SRVNQOiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJVTktOT1dOIFRZUEU6JXg6Iixtc2dfdHlwZShtc2cpKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlVOS05PV04gVVNFUjoiKTsKKwl9CisKKwlzd2l0Y2ggKHVzcikgeworCWNhc2UgQ09OTl9NQU5BR0VSOgorCWNhc2UgTkFNRV9ESVNUUklCVVRPUjoKKwljYXNlIERBVEFfTE9XOgorCWNhc2UgREFUQV9NRURJVU06CisJY2FzZSBEQVRBX0hJR0g6CisJY2FzZSBEQVRBX0NSSVRJQ0FMOgorCQlpZiAobXNnX3Nob3J0KG1zZykpCisJCQlicmVhazsJLyogTm8gZXJyb3IgKi8KKwkJc3dpdGNoIChtc2dfZXJyY29kZShtc2cpKSB7CisJCWNhc2UgVElQQ19PSzoKKwkJCWJyZWFrOworCQljYXNlIFRJUENfRVJSX05PX05BTUU6CisJCQl0aXBjX3ByaW50ZihidWYsICJOT19OQU1FOiIpOworCQkJYnJlYWs7CisJCWNhc2UgVElQQ19FUlJfTk9fUE9SVDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIk5PX1BPUlQ6Iik7CisJCQlicmVhazsKKwkJY2FzZSBUSVBDX0VSUl9OT19OT0RFOgorCQkJdGlwY19wcmludGYoYnVmLCAiTk9fUFJPQzoiKTsKKwkJCWJyZWFrOworCQljYXNlIFRJUENfRVJSX09WRVJMT0FEOgorCQkJdGlwY19wcmludGYoYnVmLCAiT1ZFUkxPQUQ6Iik7CisJCQlicmVhazsKKwkJY2FzZSBUSVBDX0NPTk5fU0hVVERPV046CisJCQl0aXBjX3ByaW50ZihidWYsICJTSFVURE9XTjoiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGlwY19wcmludGYoYnVmLCAiVU5LTk9XTiBFUlJPUigleCk6IiwKKwkJCQkgICAgbXNnX2VycmNvZGUobXNnKSk7CisJCX0KKwlkZWZhdWx0Ont9CisJfQorCisJdGlwY19wcmludGYoYnVmLCAiSFooJXUpOiIsIG1zZ19oZHJfc3oobXNnKSk7CisJdGlwY19wcmludGYoYnVmLCAiU1ooJXUpOiIsIG1zZ19zaXplKG1zZykpOworCXRpcGNfcHJpbnRmKGJ1ZiwgIlNRTk8oJXUpOiIsIG1zZ19zZXFubyhtc2cpKTsKKworCWlmIChtc2dfbm9uX3NlcShtc2cpKQorCQl0aXBjX3ByaW50ZihidWYsICJOT1NFUToiKTsKKwllbHNlIHsKKwkJdGlwY19wcmludGYoYnVmLCAiQUNLKCV1KToiLCBtc2dfYWNrKG1zZykpOworCX0KKwl0aXBjX3ByaW50ZihidWYsICJCQUNLKCV1KToiLCBtc2dfYmNhc3RfYWNrKG1zZykpOworCXRpcGNfcHJpbnRmKGJ1ZiwgIlBSTkQoJXgpIiwgbXNnX3ByZXZub2RlKG1zZykpOworCisJaWYgKG1zZ19pc2RhdGEobXNnKSkgeworCQlpZiAobXNnX25hbWVkKG1zZykpIHsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIk5UWVAoJXUpOiIsIG1zZ19uYW1ldHlwZShtc2cpKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIk5JTlNUKCV1KSIsIG1zZ19uYW1laW5zdChtc2cpKTsKKwkJfQorCX0KKworCWlmICgodXNyICE9IExJTktfUFJPVE9DT0wpICYmICh1c3IgIT0gTElOS19DT05GSUcpICYmCisJICAgICh1c3IgIT0gTVNHX0JVTkRMRVIpKSB7CisJCWlmICghbXNnX3Nob3J0KG1zZykpIHsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpPUklHKCV4OiV1KToiLAorCQkJCSAgICBtc2dfb3JpZ25vZGUobXNnKSwgbXNnX29yaWdwb3J0KG1zZykpOworCQkJdGlwY19wcmludGYoYnVmLCAiOkRFU1QoJXg6JXUpOiIsCisJCQkJICAgIG1zZ19kZXN0bm9kZShtc2cpLCBtc2dfZGVzdHBvcnQobXNnKSk7CisJCX0gZWxzZSB7CisJCQl0aXBjX3ByaW50ZihidWYsICI6T1BSVCgldSk6IiwgbXNnX29yaWdwb3J0KG1zZykpOworCQkJdGlwY19wcmludGYoYnVmLCAiOkRQUlQoJXUpOiIsIG1zZ19kZXN0cG9ydChtc2cpKTsKKwkJfQorCQlpZiAobXNnX3JvdXRlZChtc2cpICYmICFtc2dfbm9uX3NlcShtc2cpKQorCQkJdGlwY19wcmludGYoYnVmLCAiOlRTRVFOKCV1KSIsIG1zZ190cmFuc3Bfc2Vxbm8obXNnKSk7CisJfQorCWlmIChtc2dfdXNlcihtc2cpID09IE5BTUVfRElTVFJJQlVUT1IpIHsKKwkJdGlwY19wcmludGYoYnVmLCAiOk9OT0QoJXgpOiIsIG1zZ19vcmlnbm9kZShtc2cpKTsKKwkJdGlwY19wcmludGYoYnVmLCAiOkROT0QoJXgpOiIsIG1zZ19kZXN0bm9kZShtc2cpKTsKKwkJaWYgKG1zZ19yb3V0ZWQobXNnKSkgeworCQkJdGlwY19wcmludGYoYnVmLCAiOkNTRVFOKCV1KSIsIG1zZ190cmFuc3Bfc2Vxbm8obXNnKSk7CisJCX0KKwl9CisKKwlpZiAobXNnX3VzZXIobXNnKSA9PSAgTElOS19DT05GSUcpIHsKKwkJdTMyKiByYXcgPSAodTMyKiltc2c7CisJCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIqIG9yaWcgPSAoc3RydWN0IHRpcGNfbWVkaWFfYWRkciopJnJhd1s1XTsKKwkJdGlwY19wcmludGYoYnVmLCAiOlJFUUwoJXUpOiIsIG1zZ19yZXFfbGlua3MobXNnKSk7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpERE9NKCV4KToiLCBtc2dfZGVzdF9kb21haW4obXNnKSk7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpORVRJRCgldSk6IiwgbXNnX2JjX25ldGlkKG1zZykpOworCQltZWRpYV9hZGRyX3ByaW50ZihidWYsIG9yaWcpOworCX0KKwlpZiAobXNnX3VzZXIobXNnKSA9PSBCQ0FTVF9QUk9UT0NPTCkgeworCQl0aXBjX3ByaW50ZihidWYsICJCQ05BQ0s6QUZURVIoJXUpOiIsIG1zZ19iY2dhcF9hZnRlcihtc2cpKTsKKwkJdGlwY19wcmludGYoYnVmLCAiVE8oJXUpOiIsIG1zZ19iY2dhcF90byhtc2cpKTsKKwl9CisJdGlwY19wcmludGYoYnVmLCAiXG4iKTsKKwlpZiAoKHVzciA9PSBDSEFOR0VPVkVSX1BST1RPQ09MKSAmJiAobXNnX21zZ2NudChtc2cpKSkgeworCQltc2dfcHJpbnQoYnVmLG1zZ19nZXRfd3JhcHBlZChtc2cpLCIgICAgICAvIik7CisJfQorCWlmICgodXNyID09IE1TR19GUkFHTUVOVEVSKSAmJiAobXNnX3R5cGUobXNnKSA9PSBGSVJTVF9GUkFHTUVOVCkpIHsKKwkJbXNnX3ByaW50KGJ1Zixtc2dfZ2V0X3dyYXBwZWQobXNnKSwiICAgICAgLyIpOworCX0KK30KZGlmZiAtLWdpdCBhL25ldC90aXBjL21zZy5oIGIvbmV0L3RpcGMvbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyYzgxOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL21zZy5oCkBAIC0wLDAgKzEsODE4IEBACisvKgorICogbmV0L3RpcGMvbXNnLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBtZXNzYWdlIGhlYWRlciByb3V0aW5lcworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX01TR19ICisjZGVmaW5lIF9USVBDX01TR19ICisKKyNpbmNsdWRlIDxuZXQvdGlwYy90aXBjX21zZy5oPgorCisjZGVmaW5lIFRJUENfVkVSU0lPTiAgICAgICAgICAgICAgMgorI2RlZmluZSBEQVRBX0xPVyAgICAgICAgICAgICAgICAgIFRJUENfTE9XX0lNUE9SVEFOQ0UKKyNkZWZpbmUgREFUQV9NRURJVU0gICAgICAgICAgICAgICBUSVBDX01FRElVTV9JTVBPUlRBTkNFCisjZGVmaW5lIERBVEFfSElHSCAgICAgICAgICAgICAgICAgVElQQ19ISUdIX0lNUE9SVEFOQ0UKKyNkZWZpbmUgREFUQV9DUklUSUNBTCAgICAgICAgICAgICBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UKKyNkZWZpbmUgU0hPUlRfSF9TSVpFICAgICAgICAgICAgICAyNAkvKiBDb25uZWN0ZWQsaW4gY2x1c3RlciAqLworI2RlZmluZSBESVJfTVNHX0hfU0laRSAgICAgICAgICAgIDMyCS8qIERpcmVjdGx5IGFkZHJlc3NlZCBtZXNzYWdlcyAqLworI2RlZmluZSBDT05OX01TR19IX1NJWkUgICAgICAgICAgIDM2CS8qIFJvdXRlZCBjb25uZWN0ZWQgbXNncyovCisjZGVmaW5lIExPTkdfSF9TSVpFICAgICAgICAgICAgICAgNDAJLyogTmFtZWQgTWVzc2FnZXMgKi8KKyNkZWZpbmUgTUNBU1RfSF9TSVpFICAgICAgICAgICAgICA0NAkvKiBNdWx0aWNhc3QgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTUFYX0hfU0laRSAgICAgICAgICAgICAgICA2MAkvKiBJbmNsdXNpdmUgZnVsbCBvcHRpb25zICovCisjZGVmaW5lIE1BWF9NU0dfU0laRSAoTUFYX0hfU0laRSArIFRJUENfTUFYX1VTRVJfTVNHX1NJWkUpCisjZGVmaW5lIExJTktfQ09ORklHICAgICAgICAgICAgICAgMTMKKworCisvKgorCQlUSVBDIHVzZXIgZGF0YSBtZXNzYWdlIGhlYWRlciBmb3JtYXQsIHZlcnNpb24gMgorCQkKKwktIEZ1bmRhbWVudGFsIGRlZmluaXRpb25zIGF2YWlsYWJsZSB0byBwcml2aWxlZ2VkIFRJUEMgdXNlcnMKKwkgIGFyZSBsb2NhdGVkIGluIHRpcGNfbXNnLmguCisJLSBSZW1haW5pbmcgZGVmaW5pdGlvbnMgYXZhaWxhYmxlIHRvIFRJUEMgaW50ZXJuYWwgdXNlcnMgYXBwZWFyIGJlbG93LiAKKyovCisKKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfd29yZChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiB3LCB1MzIgdmFsKQoreworCW0tPmhkclt3XSA9IGh0b25sKHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2JpdHMoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgdywKKwkJCQl1MzIgcG9zLCB1MzIgbWFzaywgdTMyIHZhbCkKK3sKKwl1MzIgd29yZCA9IG1zZ193b3JkKG0sdykgJiB+KG1hc2sgPDwgcG9zKTsKKwltc2dfc2V0X3dvcmQobSwgdywgKHdvcmQgfD0gKHZhbCA8PCBwb3MpKSk7Cit9CisKKy8qIAorICogV29yZCAwCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3ZlcnNpb24oc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAwLCAyOSwgNyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3ZlcnNpb24oc3RydWN0IHRpcGNfbXNnICptKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMCwgMjksIDB4ZiwgVElQQ19WRVJTSU9OKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3VzZXIoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAwLCAyNSwgMHhmKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2lzZGF0YShzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIChtc2dfdXNlcihtKSA8PSBEQVRBX0NSSVRJQ0FMKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfdXNlcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMCwgMjUsIDB4Ziwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2ltcG9ydGFuY2Uoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgaSkgCit7CisJbXNnX3NldF91c2VyKG0sIGkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9oZHJfc3ooc3RydWN0IHRpcGNfbXNnICptLHUzMiBuKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMCwgMjEsIDB4Ziwgbj4+Mik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1zZ19ub25fc2VxKHN0cnVjdCB0aXBjX21zZyAqbSkgCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDAsIDIwLCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbm9uX3NlcShzdHJ1Y3QgdGlwY19tc2cgKm0pIAoreworCW1zZ19zZXRfYml0cyhtLCAwLCAyMCwgMSwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1zZ19kZXN0X2Ryb3BwYWJsZShzdHJ1Y3QgdGlwY19tc2cgKm0pIAoreworCXJldHVybiBtc2dfYml0cyhtLCAwLCAxOSwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2Rlc3RfZHJvcHBhYmxlKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIGQpIAoreworCW1zZ19zZXRfYml0cyhtLCAwLCAxOSwgMSwgZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1zZ19zcmNfZHJvcHBhYmxlKHN0cnVjdCB0aXBjX21zZyAqbSkgCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDAsIDE4LCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfc3JjX2Ryb3BwYWJsZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBkKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMCwgMTgsIDEsIGQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9zaXplKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIHN6KQoreworCW0tPmhkclswXSA9IGh0b25sKChtc2dfd29yZChtLCAwKSAmIH4weDFmZmZmKSB8IHN6KTsKK30KKworCisvKiAKKyAqIFdvcmQgMQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3R5cGUoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDEsIDI5LCAweDcsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9lcnJjb2RlKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIGVycikgCit7CisJbXNnX3NldF9iaXRzKG0sIDEsIDI1LCAweGYsIGVycik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19yZXJvdXRlX2NudChzdHJ1Y3QgdGlwY19tc2cgKm0pIAoreworCXJldHVybiBtc2dfYml0cyhtLCAxLCAyMSwgMHhmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19pbmNyX3Jlcm91dGVfY250KHN0cnVjdCB0aXBjX21zZyAqbSkgCit7CisJbXNnX3NldF9iaXRzKG0sIDEsIDIxLCAweGYsIG1zZ19yZXJvdXRlX2NudChtKSArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3Jlc2V0X3Jlcm91dGVfY250KHN0cnVjdCB0aXBjX21zZyAqbSkgCit7CisJbXNnX3NldF9iaXRzKG0sIDEsIDIxLCAweGYsIDApOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbG9va3VwX3Njb3BlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMSwgMTksIDB4Myk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2xvb2t1cF9zY29wZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMSwgMTksIDB4Mywgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X29wdGlvbnMoc3RydWN0IHRpcGNfbXNnICptLCBjb25zdCBjaGFyICpvcHQsIHUzMiBzeikgCit7CisJdTMyIGhzeiA9IG1zZ19oZHJfc3oobSk7CisJY2hhciAqdG8gPSAoY2hhciAqKSZtLT5oZHJbaHN6LzRdOworCisJaWYgKChoc3ogPCBESVJfTVNHX0hfU0laRSkgfHwgKChoc3ogKyBzeikgPiBNQVhfSF9TSVpFKSkKKwkJcmV0dXJuOworCW1zZ19zZXRfYml0cyhtLCAxLCAxNiwgMHg3LCAoaHN6IC0gMjgpLzQpOworCW1zZ19zZXRfaGRyX3N6KG0sIGhzeiArIHN6KTsKKwltZW1jcHkodG8sIG9wdCwgc3opOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfYmNhc3RfYWNrKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMSwgMCwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfYmNhc3RfYWNrKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfYml0cyhtLCAxLCAwLCAweGZmZmYsIG4pOworfQorCisKKy8qIAorICogV29yZCAyCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2FjayhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDIsIDE2LCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9hY2soc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDIsIDE2LCAweGZmZmYsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfc2Vxbm8oc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAyLCAwLCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9zZXFubyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMiwgMCwgMHhmZmZmLCBuKTsKK30KKworCisvKiAKKyAqIFdvcmRzIDMtMTAKKyAqLworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3ByZXZub2RlKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIGEpIAoreworCW1zZ19zZXRfd29yZChtLCAzLCBhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfb3JpZ3BvcnQoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgcCkgCit7CisJbXNnX3NldF93b3JkKG0sIDQsIHApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9kZXN0cG9ydChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBwKSAKK3sKKwltc2dfc2V0X3dvcmQobSwgNSwgcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X21jX25ldGlkKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIHApIAoreworCW1zZ19zZXRfd29yZChtLCA1LCBwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfb3JpZ25vZGUoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgYSkgCit7CisJbXNnX3NldF93b3JkKG0sIDYsIGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9kZXN0bm9kZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBhKSAKK3sKKwltc2dfc2V0X3dvcmQobSwgNywgYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1zZ19pc19kZXN0KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIGQpIAoreworCXJldHVybihtc2dfc2hvcnQobSkgfHwgKG1zZ19kZXN0bm9kZShtKSA9PSBkKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19yb3V0ZWQoc3RydWN0IHRpcGNfbXNnICptKQoreworCWlmIChsaWtlbHkobXNnX3Nob3J0KG0pKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuKG1zZ19kZXN0bm9kZShtKSBeIG1zZ19vcmlnbm9kZShtKSkgPj4gMTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X25hbWV0eXBlKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfd29yZChtLCA4LCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3RyYW5zcF9zZXFubyhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF90aW1lc3RhbXAoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X3dvcmQobSwgOCwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ190aW1lc3RhbXAoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfd29yZChtLCA4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfdHJhbnNwX3NlcW5vKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF93b3JkKG0sIDgsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9uYW1lbG93ZXIoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF93b3JkKG0sIDksIG4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9uYW1laW5zdChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X25hbWVsb3dlcihtLCBuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbmFtZXVwcGVyKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfd29yZChtLCAxMCwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRpcGNfbXNnICptc2dfZ2V0X3dyYXBwZWQoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiAoc3RydWN0IHRpcGNfbXNnICopbXNnX2RhdGEobSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfZXhwYW5kKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIGRlc3Rub2RlKSAKK3sKKwlpZiAoIW1zZ19zaG9ydChtKSkKKwkJcmV0dXJuOworCW1zZ19zZXRfaGRyX3N6KG0sIExPTkdfSF9TSVpFKTsKKwltc2dfc2V0X29yaWdub2RlKG0sIG1zZ19wcmV2bm9kZShtKSk7CisJbXNnX3NldF9kZXN0bm9kZShtLCBkZXN0bm9kZSk7CisJbWVtc2V0KCZtLT5oZHJbOF0sIDAsIDEyKTsKK30KKworCisKKy8qCisJCVRJUEMgaW50ZXJuYWwgbWVzc2FnZSBoZWFkZXIgZm9ybWF0LCB2ZXJzaW9uIDIKKworICAgICAgIDEgMCA5IDggNyA2IDUgNHwzIDIgMSAwIDkgOCA3IDZ8NSA0IDMgMiAxIDAgOSA4fDcgNiA1IDQgMyAyIDEgMCAKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3MDp8dmVycyB8bXNnIHVzcnxoZHIgc3ogfG58cmVzcnZ8ICAgICAgICAgICAgcGFja2V0IHNpemUgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHcxOnxtIHR5cHxyc3Y9MHwgICBzZXF1ZW5jZSBnYXAgICAgfCAgICAgICBicm9hZGNhc3QgYWNrIG5vICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzI6fCBsaW5rIGxldmVsIGFjayBuby9iY19nYXBfZnJvbSB8ICAgICBzZXEgbm8gLyBiY2FzdF9nYXBfdG8gICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3Mzp8ICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyBub2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHc0OnwgIG5leHQgc2VudCBicm9hZGNhc3QvZnJhZ20gbm8gfCBuZXh0IHNlbnQgcGt0LyBmcmFnbSBtc2cgbm8gICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzU6fCAgICAgICAgICBzZXNzaW9uIG5vICAgICAgICAgICB8cnN2PTB8cnxiZXJpZHxsaW5rIHByaW98bmV0cGx8cHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3Njp8ICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmF0aW5nIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHc3OnwgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzg6fCAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgc2VxdWVuY2UgbnVtYmVyICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3OTp8ICAgbXNnIGNvdW50IC8gYmNhc3QgdGFnICAgICAgIHwgICAgICAgbGluayB0b2xlcmFuY2UgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAvICAgICAgICAgICAgICAgICAgICAgVXNlciBTcGVjaWZpYyBEYXRhICAgICAgICAgICAgICAgICAgICAgICAgLworICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKKyAgICAgIE5COiBDT05OX01BTkFHRVIgdXNlIGRhdGEgbWVzc2FnZSBmb3JtYXQuIExJTktfQ09ORklHIGhhcyBvd24gZm9ybWF0LgorKi8gICAKKworLyogCisgKiBJbnRlcm5hbCB1c2VycworICovCisKKyNkZWZpbmUgIEJDQVNUX1BST1RPQ09MICAgICAgIDUKKyNkZWZpbmUgIE1TR19CVU5ETEVSICAgICAgICAgIDYKKyNkZWZpbmUgIExJTktfUFJPVE9DT0wgICAgICAgIDcKKyNkZWZpbmUgIENPTk5fTUFOQUdFUiAgICAgICAgIDgKKyNkZWZpbmUgIFJPVVRFX0RJU1RSSUJVVE9SICAgIDkKKyNkZWZpbmUgIENIQU5HRU9WRVJfUFJPVE9DT0wgIDEwCisjZGVmaW5lICBOQU1FX0RJU1RSSUJVVE9SICAgICAxMQorI2RlZmluZSAgTVNHX0ZSQUdNRU5URVIgICAgICAgMTIKKyNkZWZpbmUgIExJTktfQ09ORklHICAgICAgICAgIDEzCisjZGVmaW5lICBJTlRfSF9TSVpFICAgICAgICAgICA0MAorI2RlZmluZSAgRFNDX0hfU0laRSAgICAgICAgICAgNDAKKworLyogCisgKiAgQ29ubmVjdGlvbiBtYW5hZ2VtZW50IHByb3RvY29sIG1lc3NhZ2VzCisgKi8KKworI2RlZmluZSBDT05OX1BST0JFICAgICAgICAwCisjZGVmaW5lIENPTk5fUFJPQkVfUkVQTFkgIDEKKyNkZWZpbmUgQ09OTl9BQ0sgICAgICAgICAgMgorCisvKiAKKyAqIE5hbWUgZGlzdHJpYnV0b3IgbWVzc2FnZXMKKyAqLworCisjZGVmaW5lIFBVQkxJQ0FUSU9OICAgICAgIDAKKyNkZWZpbmUgV0lUSERSQVdBTCAgICAgICAgMQorCisKKy8qIAorICogV29yZCAxCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3NlcV9nYXAoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAxLCAxNiwgMHhmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3NlcV9nYXAoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgMSwgMTYsIDB4ZmYsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfcmVxX2xpbmtzKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMSwgMTYsIDB4ZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfcmVxX2xpbmtzKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfYml0cyhtLCAxLCAxNiwgMHhmZmYsIG4pOworfQorCisKKy8qIAorICogV29yZCAyCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2Rlc3RfZG9tYWluKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2Rlc3RfZG9tYWluKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfd29yZChtLCAyLCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2JjZ2FwX2FmdGVyKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMiwgMTYsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2JjZ2FwX2FmdGVyKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDIsIDE2LCAweGZmZmYsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfYmNnYXBfdG8oc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAyLCAwLCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9iY2dhcF90byhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMiwgMCwgMHhmZmZmLCBuKTsKK30KKworCisvKiAKKyAqIFdvcmQgNAorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19sYXN0X2JjYXN0KHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNCwgMTYsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2xhc3RfYmNhc3Qoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgNCwgMTYsIDB4ZmZmZiwgbik7Cit9CisKKworc3RhdGljIGlubGluZSB1MzIgbXNnX2ZyYWdtX25vKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNCwgMTYsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2ZyYWdtX25vKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDQsIDE2LCAweGZmZmYsIG4pOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19uZXh0X3NlbnQoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCA0LCAwLCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9uZXh0X3NlbnQoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgNCwgMCwgMHhmZmZmLCBuKTsKK30KKworCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbG9uZ19tc2dubyhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDQsIDAsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2xvbmdfbXNnbm8oc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgNCwgMCwgMHhmZmZmLCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2JjX25ldGlkKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2JjX25ldGlkKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIGlkKQoreworCW1zZ19zZXRfd29yZChtLCA0LCBpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19saW5rX3NlbGVjdG9yKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNCwgMCwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2xpbmtfc2VsZWN0b3Ioc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgNCwgMCwgMSwgKG4gJiAxKSk7Cit9CisKKy8qIAorICogV29yZCA1CisgKi8KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3Nlc3Npb24oc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCA1LCAxNiwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfc2Vzc2lvbihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKQoreworCW1zZ19zZXRfYml0cyhtLCA1LCAxNiwgMHhmZmZmLCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3Byb2JlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNSwgMCwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3Byb2JlKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIHZhbCkKK3sKKwltc2dfc2V0X2JpdHMobSwgNSwgMCwgMSwgKHZhbCAmIDEpKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyIG1zZ19uZXRfcGxhbmUoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCA1LCAxLCA3KSArICdBJzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbmV0X3BsYW5lKHN0cnVjdCB0aXBjX21zZyAqbSwgY2hhciBuKQoreworCW1zZ19zZXRfYml0cyhtLCA1LCAxLCA3LCAobiAtICdBJykpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbGlua3ByaW8oc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCA1LCA0LCAweDFmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbGlua3ByaW8oc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgNSwgNCwgMHgxZiwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19iZWFyZXJfaWQoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCA1LCA5LCAweDcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9iZWFyZXJfaWQoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgNSwgOSwgMHg3LCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3JlZHVuZGFudF9saW5rKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNSwgMTIsIDB4MSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3JlZHVuZGFudF9saW5rKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwltc2dfc2V0X2JpdHMobSwgNSwgMTIsIDB4MSwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfY2xlYXJfcmVkdW5kYW50X2xpbmsoc3RydWN0IHRpcGNfbXNnICptKQoreworCW1zZ19zZXRfYml0cyhtLCA1LCAxMiwgMHgxLCAwKTsKK30KKworCisvKiAKKyAqIFdvcmQgOQorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19tc2djbnQoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCA5LCAxNiwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbXNnY250KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDksIDE2LCAweGZmZmYsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfYmNhc3RfdGFnKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgOSwgMTYsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2JjYXN0X3RhZyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKQoreworCW1zZ19zZXRfYml0cyhtLCA5LCAxNiwgMHhmZmZmLCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX21heF9wa3Qoc3RydWN0IHRpcGNfbXNnICptKSAKK3sKKwlyZXR1cm4gKG1zZ19iaXRzKG0sIDksIDE2LCAweGZmZmYpICogNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X21heF9wa3Qoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDksIDE2LCAweGZmZmYsIChuIC8gNCkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbGlua190b2xlcmFuY2Uoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCA5LCAwLCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9saW5rX3RvbGVyYW5jZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKQoreworCW1zZ19zZXRfYml0cyhtLCA5LCAwLCAweGZmZmYsIG4pOworfQorCisvKiAKKyAqIFJvdXRpbmcgdGFibGUgbWVzc2FnZSBkYXRhCisgKi8KKworCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfcmVtb3RlX25vZGUoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfd29yZChtLCBtc2dfaGRyX3N6KG0pLzQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9yZW1vdGVfbm9kZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBhKQoreworCW1zZ19zZXRfd29yZChtLCBtc2dfaGRyX3N6KG0pLzQsIGEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtc2dfZGF0YW9jdGV0KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIHBvcykKK3sKKwlyZXR1cm4obXNnX2RhdGEobSlbcG9zICsgNF0gIT0gMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2RhdGFvY3RldChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBwb3MpCit7CisJbXNnX2RhdGEobSlbcG9zICsgNF0gPSAxOworfQorCisvKiAKKyAqIFNlZ21lbnRhdGlvbiBtZXNzYWdlIHR5cGVzCisgKi8KKworI2RlZmluZSBGSVJTVF9GUkFHTUVOVCAgICAgMAorI2RlZmluZSBGUkFHTUVOVCAgICAgICAgICAgMQorI2RlZmluZSBMQVNUX0ZSQUdNRU5UICAgICAgMgorCisvKiAKKyAqIExpbmsgbWFuYWdlbWVudCBwcm90b2NvbCBtZXNzYWdlIHR5cGVzCisgKi8KKworI2RlZmluZSBTVEFURV9NU0cgICAgICAgMAorI2RlZmluZSBSRVNFVF9NU0cgICAgICAgMQorI2RlZmluZSBBQ1RJVkFURV9NU0cgICAgMgorCisvKiAKKyAqIENoYW5nZW92ZXIgdHVubmVsIG1lc3NhZ2UgdHlwZXMKKyAqLworI2RlZmluZSBEVVBMSUNBVEVfTVNHICAgIDAKKyNkZWZpbmUgT1JJR0lOQUxfTVNHICAgICAxCisKKy8qIAorICogUm91dGluZyB0YWJsZSBtZXNzYWdlIHR5cGVzCisgKi8KKyNkZWZpbmUgRVhUX1JPVVRJTkdfVEFCTEUgICAgMAorI2RlZmluZSBMT0NBTF9ST1VUSU5HX1RBQkxFICAxCisjZGVmaW5lIFNMQVZFX1JPVVRJTkdfVEFCTEUgIDIKKyNkZWZpbmUgUk9VVEVfQURESVRJT04gICAgICAgMworI2RlZmluZSBST1VURV9SRU1PVkFMICAgICAgICA0CisKKy8qIAorICogQ29uZmlnIHByb3RvY29sIG1lc3NhZ2UgdHlwZXMKKyAqLworCisjZGVmaW5lIERTQ19SRVFfTVNHICAgICAgICAgIDAKKyNkZWZpbmUgRFNDX1JFU1BfTVNHICAgICAgICAgMQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfdG90X2ltcG9ydGFuY2Uoc3RydWN0IHRpcGNfbXNnICptKQoreworCWlmIChsaWtlbHkobXNnX2lzZGF0YShtKSkpIHsKKwkJaWYgKGxpa2VseShtc2dfb3JpZ25vZGUobSkgPT0gdGlwY19vd25fYWRkcikpCisJCQlyZXR1cm4gbXNnX2ltcG9ydGFuY2UobSk7CisJCXJldHVybiBtc2dfaW1wb3J0YW5jZShtKSArIDQ7CisJfQorCWlmICgobXNnX3VzZXIobSkgPT0gTVNHX0ZSQUdNRU5URVIpICAmJgorCSAgICAobXNnX3R5cGUobSkgPT0gRklSU1RfRlJBR01FTlQpKQorCQlyZXR1cm4gbXNnX2ltcG9ydGFuY2UobXNnX2dldF93cmFwcGVkKG0pKTsKKwlyZXR1cm4gbXNnX2ltcG9ydGFuY2UobSk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19pbml0KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIHVzZXIsIHUzMiB0eXBlLCAKKwkJCSAgICB1MzIgZXJyLCB1MzIgaHNpemUsIHUzMiBkZXN0bm9kZSkKK3sKKwltZW1zZXQobSwgMCwgaHNpemUpOworCW1zZ19zZXRfdmVyc2lvbihtKTsKKwltc2dfc2V0X3VzZXIobSwgdXNlcik7CisJbXNnX3NldF9oZHJfc3oobSwgaHNpemUpOworCW1zZ19zZXRfc2l6ZShtLCBoc2l6ZSk7CisJbXNnX3NldF9wcmV2bm9kZShtLCB0aXBjX293bl9hZGRyKTsKKwltc2dfc2V0X3R5cGUobSwgdHlwZSk7CisJbXNnX3NldF9lcnJjb2RlKG0sIGVycik7CisJaWYgKCFtc2dfc2hvcnQobSkpIHsKKwkJbXNnX3NldF9vcmlnbm9kZShtLCB0aXBjX293bl9hZGRyKTsKKwkJbXNnX3NldF9kZXN0bm9kZShtLCBkZXN0bm9kZSk7CisJfQorfQorCisvKiogCisgKiBtc2dfY2FsY19kYXRhX3NpemUgLSBkZXRlcm1pbmUgdG90YWwgZGF0YSBzaXplIGZvciBtZXNzYWdlCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgbXNnX2NhbGNfZGF0YV9zaXplKHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsIHUzMiBudW1fc2VjdCkKK3sKKwlpbnQgZHN6ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fc2VjdDsgaSsrKQorCQlkc3ogKz0gbXNnX3NlY3RbaV0uaW92X2xlbjsKKwlyZXR1cm4gZHN6OworfQorCisvKiogCisgKiBtc2dfYnVpbGQgLSBjcmVhdGUgbWVzc2FnZSB1c2luZyBzcGVjaWZpZWQgaGVhZGVyIGFuZCBkYXRhCisgKiAKKyAqIE5vdGU6IENhbGxlciBtdXN0IG5vdCBob2xkIGFueSBsb2NrcyBpbiBjYXNlIGNvcHlfZnJvbV91c2VyKCkgaXMgaW50ZXJydXB0ZWQhCisgKiAKKyAqIFJldHVybnMgbWVzc2FnZSBkYXRhIHNpemUgb3IgZXJybm8KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBtc2dfYnVpbGQoc3RydWN0IHRpcGNfbXNnICpoZHIsIAorCQkJICAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsIHUzMiBudW1fc2VjdCwKKwkJCSAgICBpbnQgbWF4X3NpemUsIGludCB1c3JtZW0sIHN0cnVjdCBza19idWZmKiogYnVmKQoreworCWludCBkc3osIHN6LCBoc3osIHBvcywgcmVzLCBjbnQ7CisKKwlkc3ogPSBtc2dfY2FsY19kYXRhX3NpemUobXNnX3NlY3QsIG51bV9zZWN0KTsKKwlpZiAodW5saWtlbHkoZHN6ID4gVElQQ19NQVhfVVNFUl9NU0dfU0laRSkpIHsKKwkJKmJ1ZiA9IE5VTEw7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBvcyA9IGhzeiA9IG1zZ19oZHJfc3ooaGRyKTsKKwlzeiA9IGhzeiArIGRzejsKKwltc2dfc2V0X3NpemUoaGRyLCBzeik7CisJaWYgKHVubGlrZWx5KHN6ID4gbWF4X3NpemUpKSB7CisJCSpidWYgPSBOVUxMOworCQlyZXR1cm4gZHN6OworCX0KKworCSpidWYgPSBidWZfYWNxdWlyZShzeik7CisJaWYgKCEoKmJ1ZikpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweSgoKmJ1ZiktPmRhdGEsICh1bmNoYXIgKiloZHIsIGhzeik7CisJZm9yIChyZXMgPSAxLCBjbnQgPSAwOyByZXMgJiYgKGNudCA8IG51bV9zZWN0KTsgY250KyspIHsKKwkJaWYgKGxpa2VseSh1c3JtZW0pKQorCQkJcmVzID0gIWNvcHlfZnJvbV91c2VyKCgqYnVmKS0+ZGF0YSArIHBvcywgCisJCQkJCSAgICAgIG1zZ19zZWN0W2NudF0uaW92X2Jhc2UsIAorCQkJCQkgICAgICBtc2dfc2VjdFtjbnRdLmlvdl9sZW4pOworCQllbHNlCisJCQltZW1jcHkoKCpidWYpLT5kYXRhICsgcG9zLCBtc2dfc2VjdFtjbnRdLmlvdl9iYXNlLCAKKwkJCSAgICAgICBtc2dfc2VjdFtjbnRdLmlvdl9sZW4pOworCQlwb3MgKz0gbXNnX3NlY3RbY250XS5pb3ZfbGVuOworCX0KKwlpZiAobGlrZWx5KHJlcykpCisJCXJldHVybiBkc3o7CisKKwlidWZfZGlzY2FyZCgqYnVmKTsKKwkqYnVmID0gTlVMTDsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworCitzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyOworCitleHRlcm4gdm9pZCBtc2dfc2V0X21lZGlhX2FkZHIoc3RydWN0IHRpcGNfbXNnICptLAorCQkJICAgICAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEpOworCitleHRlcm4gdm9pZCBtc2dfZ2V0X21lZGlhX2FkZHIoc3RydWN0IHRpcGNfbXNnICptLAorCQkJICAgICAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbmFtZV9kaXN0ci5jIGIvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxY2JhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBuZXQvdGlwYy9uYW1lX2Rpc3RyLmM6IFRJUEMgbmFtZSBkaXN0cmlidXRpb24gY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImNsdXN0ZXIuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAibmFtZV9kaXN0ci5oIgorCisjdW5kZWYgIERCR19PVVRQVVQKKyNkZWZpbmUgREJHX09VVFBVVCBOVUxMCisKKyNkZWZpbmUgSVRFTV9TSVpFIHNpemVvZihzdHJ1Y3QgZGlzdHJfaXRlbSkKKworLyoqCisgKiBzdHJ1Y3QgZGlzdHJfaXRlbSAtIHB1YmxpY2F0aW9uIGluZm8gZGlzdHJpYnV0ZWQgdG8gb3RoZXIgbm9kZXMKKyAqIEB0eXBlOiBuYW1lIHNlcXVlbmNlIHR5cGUKKyAqIEBsb3dlcjogbmFtZSBzZXF1ZW5jZSBsb3dlciBib3VuZAorICogQHVwcGVyOiBuYW1lIHNlcXVlbmNlIHVwcGVyIGJvdW5kCisgKiBAcmVmOiBwdWJsaXNoaW5nIHBvcnQgcmVmZXJlbmNlCisgKiBAa2V5OiBwdWJsaWNhdGlvbiBrZXkKKyAqIAorICogPT09PiBBbGwgZmllbGRzIGFyZSBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyLiA8PT09CisgKiAKKyAqIEZpcnN0IDMgZmllbGRzIGlkZW50aWZ5IChuYW1lIG9yKSBuYW1lIHNlcXVlbmNlIGJlaW5nIHB1Ymxpc2hlZC4KKyAqIFJlZmVyZW5jZSBmaWVsZCB1bmlxdWVseSBpZGVudGlmaWVzIHBvcnQgdGhhdCBwdWJsaXNoZWQgbmFtZSBzZXF1ZW5jZS4KKyAqIEtleSBmaWVsZCB1bmlxdWVseSBpZGVudGlmaWVzIHB1YmxpY2F0aW9uLCBpbiB0aGUgZXZlbnQgYSBwb3J0IGhhcworICogbXVsdGlwbGUgcHVibGljYXRpb25zIG9mIHRoZSBzYW1lIG5hbWUgc2VxdWVuY2UuCisgKiAKKyAqIE5vdGU6IFRoZXJlIGlzIG5vIGZpZWxkIHRoYXQgaWRlbnRpZmllcyB0aGUgcHVibGlzaGluZyBub2RlIGJlY2F1c2UgaXQgaXMgCisgKiB0aGUgc2FtZSBmb3IgYWxsIGl0ZW1zIGNvbnRhaW5lZCB3aXRoaW4gYSBwdWJsaWNhdGlvbiBtZXNzYWdlLgorICovCisKK3N0cnVjdCBkaXN0cl9pdGVtIHsKKwl1MzIgdHlwZTsKKwl1MzIgbG93ZXI7CisJdTMyIHVwcGVyOworCXUzMiByZWY7CisJdTMyIGtleTsKK307CisKKy8qKgorICogTGlzdCBvZiBleHRlcm5hbGx5IHZpc2libGUgcHVibGljYXRpb25zIGJ5IHRoaXMgbm9kZSAtLSAKKyAqIHRoYXQgaXMsIGFsbCBwdWJsaWNhdGlvbnMgaGF2aW5nIHNjb3BlID4gVElQQ19OT0RFX1NDT1BFLgorICovCisKK3N0YXRpYyBMSVNUX0hFQUQocHVibF9yb290KTsKK3N0YXRpYyB1MzIgcHVibF9jbnQgPSAwOwkJCisKKy8qKgorICogcHVibF90b19pdGVtIC0gYWRkIHB1YmxpY2F0aW9uIGluZm8gdG8gYSBwdWJsaWNhdGlvbiBtZXNzYWdlCisgKi8KKworc3RhdGljIHZvaWQgcHVibF90b19pdGVtKHN0cnVjdCBkaXN0cl9pdGVtICppLCBzdHJ1Y3QgcHVibGljYXRpb24gKnApCit7CisJaS0+dHlwZSA9IGh0b25sKHAtPnR5cGUpOworCWktPmxvd2VyID0gaHRvbmwocC0+bG93ZXIpOworCWktPnVwcGVyID0gaHRvbmwocC0+dXBwZXIpOworCWktPnJlZiA9IGh0b25sKHAtPnJlZik7CisJaS0+a2V5ID0gaHRvbmwocC0+a2V5KTsKKwlkYmcoInB1YmxfdG9faXRlbTogJXUsICV1LCAldVxuIiwgcC0+dHlwZSwgcC0+bG93ZXIsIHAtPnVwcGVyKTsKK30KKworLyoqCisgKiBuYW1lZF9wcmVwYXJlX2J1ZiAtIGFsbG9jYXRlICYgaW5pdGlhbGl6ZSBhIHB1YmxpY2F0aW9uIG1lc3NhZ2UKKyAqLworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKm5hbWVkX3ByZXBhcmVfYnVmKHUzMiB0eXBlLCB1MzIgc2l6ZSwgdTMyIGRlc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGJ1Zl9hY3F1aXJlKExPTkdfSF9TSVpFICsgc2l6ZSk7ICAKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKworCWlmIChidWYgIT0gTlVMTCkgeworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1zZ19pbml0KG1zZywgTkFNRV9ESVNUUklCVVRPUiwgdHlwZSwgVElQQ19PSywgCisJCQkgTE9OR19IX1NJWkUsIGRlc3QpOworCQltc2dfc2V0X3NpemUobXNnLCBMT05HX0hfU0laRSArIHNpemUpOworCX0KKwlyZXR1cm4gYnVmOworfQorCisvKioKKyAqIG5hbWVkX3B1Ymxpc2ggLSB0ZWxsIG90aGVyIG5vZGVzIGFib3V0IGEgbmV3IHB1YmxpY2F0aW9uIGJ5IHRoaXMgbm9kZQorICovCisKK3ZvaWQgbmFtZWRfcHVibGlzaChzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgZGlzdHJfaXRlbSAqaXRlbTsKKworCWxpc3RfYWRkKCZwdWJsLT5sb2NhbF9saXN0LCAmcHVibF9yb290KTsKKwlwdWJsX2NudCsrOworCisJYnVmID0gbmFtZWRfcHJlcGFyZV9idWYoUFVCTElDQVRJT04sIElURU1fU0laRSwgMCk7CisJaWYgKCFidWYpIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBkaXN0cmlidXRlIHB1YmxpY2F0aW9uXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWl0ZW0gPSAoc3RydWN0IGRpc3RyX2l0ZW0gKiltc2dfZGF0YShidWZfbXNnKGJ1ZikpOworCXB1YmxfdG9faXRlbShpdGVtLCBwdWJsKTsKKwlkYmcoIm5hbWVkX3dpdGhkcmF3OiBicm9hZGNhc3RpbmcgcHVibGlzaCBtc2dcbiIpOworCWNsdXN0ZXJfYnJvYWRjYXN0KGJ1Zik7Cit9CisKKy8qKgorICogbmFtZWRfd2l0aGRyYXcgLSB0ZWxsIG90aGVyIG5vZGVzIGFib3V0IGEgd2l0aGRyYXduIHB1YmxpY2F0aW9uIGJ5IHRoaXMgbm9kZQorICovCisKK3ZvaWQgbmFtZWRfd2l0aGRyYXcoc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IGRpc3RyX2l0ZW0gKml0ZW07CisKKwlsaXN0X2RlbCgmcHVibC0+bG9jYWxfbGlzdCk7CisJcHVibF9jbnQtLTsKKworCWJ1ZiA9IG5hbWVkX3ByZXBhcmVfYnVmKFdJVEhEUkFXQUwsIElURU1fU0laRSwgMCk7CisJaWYgKCFidWYpIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBkaXN0cmlidXRlIHdpdGhkcmF3YWxcbiIpOworCQlyZXR1cm47CisJfQorCisJaXRlbSA9IChzdHJ1Y3QgZGlzdHJfaXRlbSAqKW1zZ19kYXRhKGJ1Zl9tc2coYnVmKSk7CisJcHVibF90b19pdGVtKGl0ZW0sIHB1YmwpOworCWRiZygibmFtZWRfd2l0aGRyYXc6IGJyb2FkY2FzdGluZyB3aXRoZHJhdyBtc2dcbiIpOworCWNsdXN0ZXJfYnJvYWRjYXN0KGJ1Zik7Cit9CisKKy8qKgorICogbmFtZWRfbm9kZV91cCAtIHRlbGwgc3BlY2lmaWVkIG5vZGUgYWJvdXQgYWxsIHB1YmxpY2F0aW9ucyBieSB0aGlzIG5vZGUKKyAqLworCit2b2lkIG5hbWVkX25vZGVfdXAodW5zaWduZWQgbG9uZyBub2RlKQoreworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKwlzdHJ1Y3QgZGlzdHJfaXRlbSAqaXRlbSA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IDA7CisJdTMyIGxlZnQgPSAwOworCXUzMiByZXN0OworCXUzMiBtYXhfaXRlbV9idWY7CisKKwlhc3NlcnQoaW5fb3duX2NsdXN0ZXIobm9kZSkpOworCXJlYWRfbG9ja19iaCgmbmFtZXRibF9sb2NrKTsgCisJbWF4X2l0ZW1fYnVmID0gVElQQ19NQVhfVVNFUl9NU0dfU0laRSAvIElURU1fU0laRTsKKwltYXhfaXRlbV9idWYgKj0gSVRFTV9TSVpFOworCXJlc3QgPSBwdWJsX2NudCAqIElURU1fU0laRTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocHVibCwgJnB1Ymxfcm9vdCwgbG9jYWxfbGlzdCkgeworCQlpZiAoIWJ1ZikgeworCQkJbGVmdCA9IChyZXN0IDw9IG1heF9pdGVtX2J1ZikgPyByZXN0IDogbWF4X2l0ZW1fYnVmOworCQkJcmVzdCAtPSBsZWZ0OworCQkJYnVmID0gbmFtZWRfcHJlcGFyZV9idWYoUFVCTElDQVRJT04sIGxlZnQsIG5vZGUpOyAgICAgICAKKwkJCWlmIChidWYgPT0gTlVMTCkgeworCQkJCXdhcm4oIk1lbW9yeSBTcXVlZXplOyBjb3VsZCBub3Qgc2VuZCBwdWJsaWNhdGlvblxuIik7CisJCQkJZ290byBleGl0OworCQkJfQorCQkJaXRlbSA9IChzdHJ1Y3QgZGlzdHJfaXRlbSAqKW1zZ19kYXRhKGJ1Zl9tc2coYnVmKSk7CisJCX0KKwkJcHVibF90b19pdGVtKGl0ZW0sIHB1YmwpOworCQlpdGVtKys7CisJCWxlZnQgLT0gSVRFTV9TSVpFOworCQlpZiAoIWxlZnQpIHsKKwkJCW1zZ19zZXRfbGlua19zZWxlY3RvcihidWZfbXNnKGJ1ZiksIG5vZGUpOworCQkJZGJnKCJuYW1lZF9ub2RlX3VwOiBzZW5kaW5nIHB1Ymxpc2ggbXNnIHRvICIKKwkJCSAgICAiPCV1LiV1LiV1PlxuIiwgdGlwY196b25lKG5vZGUpLCAKKwkJCSAgICB0aXBjX2NsdXN0ZXIobm9kZSksIHRpcGNfbm9kZShub2RlKSk7CisJCQlsaW5rX3NlbmQoYnVmLCBub2RlLCBub2RlKTsKKwkJCWJ1ZiA9IDA7CisJCX0KKwl9CitleGl0OgorCXJlYWRfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOyAKK30KKworLyoqCisgKiBub2RlX2lzX2Rvd24gLSByZW1vdmUgcHVibGljYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgZmFpbGVkIG5vZGUKKyAqIAorICogSW52b2tlZCBmb3IgZWFjaCBwdWJsaWNhdGlvbiBpc3N1ZWQgYnkgYSBuZXdseSBmYWlsZWQgbm9kZS4gIAorICogUmVtb3ZlcyBwdWJsaWNhdGlvbiBzdHJ1Y3R1cmUgZnJvbSBuYW1lIHRhYmxlICYgZGVsZXRlcyBpdC4KKyAqIEluIHJhcmUgY2FzZXMgdGhlIGxpbmsgbWF5IGhhdmUgY29tZSBiYWNrIHVwIGFnYWluIHdoZW4gdGhpcworICogZnVuY3Rpb24gaXMgY2FsbGVkLCBhbmQgd2UgaGF2ZSB0d28gaXRlbXMgcmVwcmVzZW50aW5nIHRoZSBzYW1lCisgKiBwdWJsaWNhdGlvbi4gTnVkZ2UgdGhpcyBpdGVtJ3Mga2V5IHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gdGhlIG90aGVyLgorICogKE5vdGU6IFB1YmxpY2F0aW9uJ3Mgbm9kZSBzdWJzY3JpcHRpb24gaXMgYWxyZWFkeSB1bnN1YnNjcmliZWQuKQorICovCisKK3N0YXRpYyB2b2lkIG5vZGVfaXNfZG93bihzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwpCit7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwOworICAgICAgICB3cml0ZV9sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCWRiZygibm9kZV9pc19kb3duOiB3aXRoZHJhd2luZyAldSwgJXUsICV1XG4iLCAKKwkgICAgcHVibC0+dHlwZSwgcHVibC0+bG93ZXIsIHB1YmwtPnVwcGVyKTsKKyAgICAgICAgcHVibC0+a2V5ICs9IDEyMjIzNDU7CisJcCA9IG5hbWV0YmxfcmVtb3ZlX3B1YmwocHVibC0+dHlwZSwgcHVibC0+bG93ZXIsIAorCQkJCXB1YmwtPm5vZGUsIHB1YmwtPnJlZiwgcHVibC0+a2V5KTsKKyAgICAgICAgYXNzZXJ0KHAgPT0gcHVibCk7CisJd3JpdGVfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCWlmIChwdWJsKQorCQlrZnJlZShwdWJsKTsKK30KKworLyoqCisgKiBuYW1lZF9yZWN2IC0gcHJvY2VzcyBuYW1lIHRhYmxlIHVwZGF0ZSBtZXNzYWdlIHNlbnQgYnkgYW5vdGhlciBub2RlCisgKi8KKwordm9pZCBuYW1lZF9yZWN2KHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCXN0cnVjdCBkaXN0cl9pdGVtICppdGVtID0gKHN0cnVjdCBkaXN0cl9pdGVtICopbXNnX2RhdGEobXNnKTsKKwl1MzIgY291bnQgPSBtc2dfZGF0YV9zeihtc2cpIC8gSVRFTV9TSVpFOworCisJd3JpdGVfbG9ja19iaCgmbmFtZXRibF9sb2NrKTsgCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJaWYgKG1zZ190eXBlKG1zZykgPT0gUFVCTElDQVRJT04pIHsKKwkJCWRiZygibmFtZWRfcmVjdjogZ290IHB1YmxpY2F0aW9uIGZvciAldSwgJXUsICV1XG4iLCAKKwkJCSAgICBudG9obChpdGVtLT50eXBlKSwgbnRvaGwoaXRlbS0+bG93ZXIpLAorCQkJICAgIG50b2hsKGl0ZW0tPnVwcGVyKSk7CisJCQlwdWJsID0gbmFtZXRibF9pbnNlcnRfcHVibChudG9obChpdGVtLT50eXBlKSwgCisJCQkJCQkgICBudG9obChpdGVtLT5sb3dlciksCisJCQkJCQkgICBudG9obChpdGVtLT51cHBlciksCisJCQkJCQkgICBUSVBDX0NMVVNURVJfU0NPUEUsCisJCQkJCQkgICBtc2dfb3JpZ25vZGUobXNnKSwgCisJCQkJCQkgICBudG9obChpdGVtLT5yZWYpLAorCQkJCQkJICAgbnRvaGwoaXRlbS0+a2V5KSk7CisJCQlpZiAocHVibCkgeworCQkJCW5vZGVzdWJfc3Vic2NyaWJlKCZwdWJsLT5zdWJzY3IsIAorCQkJCQkJICBtc2dfb3JpZ25vZGUobXNnKSwgCisJCQkJCQkgIHB1YmwsCisJCQkJCQkgIChuZXRfZXZfaGFuZGxlcilub2RlX2lzX2Rvd24pOworCQkJfQorCQl9IGVsc2UgaWYgKG1zZ190eXBlKG1zZykgPT0gV0lUSERSQVdBTCkgeworCQkJZGJnKCJuYW1lZF9yZWN2OiBnb3Qgd2l0aGRyYXdsIGZvciAldSwgJXUsICV1XG4iLCAKKwkJCSAgICBudG9obChpdGVtLT50eXBlKSwgbnRvaGwoaXRlbS0+bG93ZXIpLAorCQkJICAgIG50b2hsKGl0ZW0tPnVwcGVyKSk7CisJCQlwdWJsID0gbmFtZXRibF9yZW1vdmVfcHVibChudG9obChpdGVtLT50eXBlKSwKKwkJCQkJCSAgIG50b2hsKGl0ZW0tPmxvd2VyKSwKKwkJCQkJCSAgIG1zZ19vcmlnbm9kZShtc2cpLAorCQkJCQkJICAgbnRvaGwoaXRlbS0+cmVmKSwKKwkJCQkJCSAgIG50b2hsKGl0ZW0tPmtleSkpOworCisJCQlpZiAocHVibCkgeworCQkJCW5vZGVzdWJfdW5zdWJzY3JpYmUoJnB1YmwtPnN1YnNjcik7CisgICAgICAgIAkJCWtmcmVlKHB1YmwpOworCQkJfQorCQl9IGVsc2UgeworCQkJd2FybigibmFtZWRfcmVjdjogdW5rbm93biBtc2dcbiIpOworCQl9CisJCWl0ZW0rKzsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOyAKKwlidWZfZGlzY2FyZChidWYpOworfQorCisvKioKKyAqIG5hbWVkX3JlaW5pdCAtIHJlLWluaXRpYWxpemUgbG9jYWwgcHVibGljYXRpb24gbGlzdAorICogCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIFRJUEMgbmV0d29ya2luZyBpcyAocmUpZW5hYmxlZC4KKyAqIEFsbCBleGlzdGluZyBwdWJsaWNhdGlvbnMgYnkgdGhpcyBub2RlIHRoYXQgaGF2ZSAiY2x1c3RlciIgb3IgInpvbmUiIHNjb3BlCisgKiBhcmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBub2RlJ3MgY3VycmVudCBuZXR3b3JrIGFkZHJlc3MuCisgKiAoSWYgdGhlIG5vZGUncyBhZGRyZXNzIGlzIHVuY2hhbmdlZCwgdGhlIHVwZGF0ZSBsb29wIHRlcm1pbmF0ZXMgaW1tZWRpYXRlbHkuKQorICovCisKK3ZvaWQgbmFtZWRfcmVpbml0KHZvaWQpCit7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCisJd3JpdGVfbG9ja19iaCgmbmFtZXRibF9sb2NrKTsgCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwdWJsLCAmcHVibF9yb290LCBsb2NhbF9saXN0KSB7CisJCWlmIChwdWJsLT5ub2RlID09IHRpcGNfb3duX2FkZHIpCisJCQlicmVhazsKKwkJcHVibC0+bm9kZSA9IHRpcGNfb3duX2FkZHI7CisJfQorCXdyaXRlX3VubG9ja19iaCgmbmFtZXRibF9sb2NrKTsgCit9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmggYi9uZXQvdGlwYy9uYW1lX2Rpc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0YmRlYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL25hbWVfZGlzdHIuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogbmV0L3RpcGMvbmFtZV9kaXN0ci5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgbmFtZSBkaXN0cmlidXRpb24gY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX05BTUVfRElTVFJfSAorI2RlZmluZSBfVElQQ19OQU1FX0RJU1RSX0gKKworI2luY2x1ZGUgIm5hbWVfdGFibGUuaCIKKwordm9pZCBuYW1lZF9wdWJsaXNoKHN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibCk7Cit2b2lkIG5hbWVkX3dpdGhkcmF3KHN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibCk7Cit2b2lkIG5hbWVkX25vZGVfdXAodW5zaWduZWQgbG9uZyBub2RlKTsKK3ZvaWQgbmFtZWRfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK3ZvaWQgbmFtZWRfcmVpbml0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL25hbWVfdGFibGUuYyBiL25ldC90aXBjL25hbWVfdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzJjODNlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbmFtZV90YWJsZS5jCkBAIC0wLDAgKzEsMTA3OSBAQAorLyoKKyAqIG5ldC90aXBjL25hbWVfdGFibGUuYzogVElQQyBuYW1lIHRhYmxlIGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgIm5hbWVfdGFibGUuaCIKKyNpbmNsdWRlICJuYW1lX2Rpc3RyLmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisjaW5jbHVkZSAic3Vic2NyLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgImNsdXN0ZXIuaCIKKyNpbmNsdWRlICJiY2FzdC5oIgorCitpbnQgdGlwY19uYW1ldGJsX3NpemUgPSAxMDI0OwkJLyogbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KKworLyoqCisgKiBzdHJ1Y3Qgc3ViX3NlcSAtIGNvbnRhaW5lciBmb3IgYWxsIHB1Ymxpc2hlZCBpbnN0YW5jZXMgb2YgYSBuYW1lIHNlcXVlbmNlCisgKiBAbG93ZXI6IG5hbWUgc2VxdWVuY2UgbG93ZXIgYm91bmQKKyAqIEB1cHBlcjogbmFtZSBzZXF1ZW5jZSB1cHBlciBib3VuZAorICogQG5vZGVfbGlzdDogY2lyY3VsYXIgbGlzdCBvZiBtYXRjaGluZyBwdWJsaWNhdGlvbnMgd2l0aCA+PSBub2RlIHNjb3BlCisgKiBAY2x1c3Rlcl9saXN0OiBjaXJjdWxhciBsaXN0IG9mIG1hdGNoaW5nIHB1YmxpY2F0aW9ucyB3aXRoID49IGNsdXN0ZXIgc2NvcGUKKyAqIEB6b25lX2xpc3Q6IGNpcmN1bGFyIGxpc3Qgb2YgbWF0Y2hpbmcgcHVibGljYXRpb25zIHdpdGggPj0gem9uZSBzY29wZQorICovCisKK3N0cnVjdCBzdWJfc2VxIHsKKwl1MzIgbG93ZXI7CisJdTMyIHVwcGVyOworCXN0cnVjdCBwdWJsaWNhdGlvbiAqbm9kZV9saXN0OworCXN0cnVjdCBwdWJsaWNhdGlvbiAqY2x1c3Rlcl9saXN0OworCXN0cnVjdCBwdWJsaWNhdGlvbiAqem9uZV9saXN0OworfTsKKworLyoqIAorICogc3RydWN0IG5hbWVfc2VxIC0gY29udGFpbmVyIGZvciBhbGwgcHVibGlzaGVkIGluc3RhbmNlcyBvZiBhIG5hbWUgdHlwZQorICogQHR5cGU6IDMyIGJpdCAndHlwZScgdmFsdWUgZm9yIG5hbWUgc2VxdWVuY2UKKyAqIEBzc2VxOiBwb2ludGVyIHRvIGR5bmFtaWNhbGx5LXNpemVkIGFycmF5IG9mIHN1Yi1zZXF1ZW5jZXMgb2YgdGhpcyAndHlwZSc7CisgKiAgICAgICAgc3ViLXNlcXVlbmNlcyBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlcgorICogQGFsbG9jOiBudW1iZXIgb2Ygc3ViLXNlcXVlbmNlcyBjdXJyZW50bHkgaW4gYXJyYXkKKyAqIEBmaXJzdF9mcmVlOiB1cHBlciBib3VuZCBvZiBoaWdoZXN0IHN1Yi1zZXF1ZW5jZSArIDEKKyAqIEBuc19saXN0OiBsaW5rcyB0byBhZGphY2VudCBuYW1lIHNlcXVlbmNlcyBpbiBoYXNoIGNoYWluCisgKiBAc3Vic2NyaXB0aW9uczogbGlzdCBvZiBzdWJzY3JpcHRpb25zIGZvciB0aGlzICd0eXBlJworICogQGxvY2s6IHNwaW5sb2NrIGNvbnRyb2xsaW5nIGFjY2VzcyB0byBuYW1lIHNlcXVlbmNlIHN0cnVjdHVyZQorICovCisKK3N0cnVjdCBuYW1lX3NlcSB7CisJdTMyIHR5cGU7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXFzOworCXUzMiBhbGxvYzsKKwl1MzIgZmlyc3RfZnJlZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBuc19saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgc3Vic2NyaXB0aW9uczsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCisvKioKKyAqIHN0cnVjdCBuYW1lX3RhYmxlIC0gdGFibGUgY29udGFpbmluZyBhbGwgZXhpc3RpbmcgcG9ydCBuYW1lIHB1YmxpY2F0aW9ucworICogQHR5cGVzOiBwb2ludGVyIHRvIGZpeGVkLXNpemVkIGFycmF5IG9mIG5hbWUgc2VxdWVuY2UgbGlzdHMsIAorICogICAgICAgICBhY2Nlc3NlZCB2aWEgaGFzaGluZyBvbiAndHlwZSc7IG5hbWUgc2VxdWVuY2UgbGlzdHMgYXJlICpub3QqIHNvcnRlZAorICogQGxvY2FsX3B1YmxfY291bnQ6IG51bWJlciBvZiBwdWJsaWNhdGlvbnMgaXNzdWVkIGJ5IHRoaXMgbm9kZQorICovCisKK3N0cnVjdCBuYW1lX3RhYmxlIHsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqdHlwZXM7CisJdTMyIGxvY2FsX3B1YmxfY291bnQ7Cit9OworCitzdHJ1Y3QgbmFtZV90YWJsZSB0YWJsZSA9IHsgTlVMTCB9IDsKK3N0YXRpYyBhdG9taWNfdCByc3ZfcHVibF9vayA9IEFUT01JQ19JTklUKDApOworcndsb2NrX3QgbmFtZXRibF9sb2NrID0gUldfTE9DS19VTkxPQ0tFRDsKKworCitzdGF0aWMgaW5saW5lIGludCBoYXNoKGludCB4KQoreworCXJldHVybih4ICYgKHRpcGNfbmFtZXRibF9zaXplIC0gMSkpOworfQorCisvKioKKyAqIHB1YmxfY3JlYXRlIC0gY3JlYXRlIGEgcHVibGljYXRpb24gc3RydWN0dXJlCisgKi8KKworc3RhdGljIHN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibF9jcmVhdGUodTMyIHR5cGUsIHUzMiBsb3dlciwgdTMyIHVwcGVyLCAKKwkJCQkgICAgICAgdTMyIHNjb3BlLCB1MzIgbm9kZSwgdTMyIHBvcnRfcmVmLCAgIAorCQkJCSAgICAgICB1MzIga2V5KQoreworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibCA9CisJCShzdHJ1Y3QgcHVibGljYXRpb24gKilrbWFsbG9jKHNpemVvZigqcHVibCksIEdGUF9BVE9NSUMpOworCWlmIChwdWJsID09IE5VTEwpIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBjcmVhdGUgcHVibGljYXRpb25cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQocHVibCwgMCwgc2l6ZW9mKCpwdWJsKSk7CisJcHVibC0+dHlwZSA9IHR5cGU7CisJcHVibC0+bG93ZXIgPSBsb3dlcjsKKwlwdWJsLT51cHBlciA9IHVwcGVyOworCXB1YmwtPnNjb3BlID0gc2NvcGU7CisJcHVibC0+bm9kZSA9IG5vZGU7CisJcHVibC0+cmVmID0gcG9ydF9yZWY7CisJcHVibC0+a2V5ID0ga2V5OworCUlOSVRfTElTVF9IRUFEKCZwdWJsLT5sb2NhbF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcHVibC0+cHBvcnRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnB1YmwtPnN1YnNjci5ub2Rlc3ViX2xpc3QpOworCXJldHVybiBwdWJsOworfQorCisvKioKKyAqIHN1YnNlcV9hbGxvYyAtIGFsbG9jYXRlIGEgc3BlY2lmaWVkIG51bWJlciBvZiBzdWItc2VxdWVuY2Ugc3RydWN0dXJlcworICovCisKK3N0cnVjdCBzdWJfc2VxICpzdWJzZXFfYWxsb2ModTMyIGNudCkKK3sKKwl1MzIgc3ogPSBjbnQgKiBzaXplb2Yoc3RydWN0IHN1Yl9zZXEpOworCXN0cnVjdCBzdWJfc2VxICpzc2VxID0gKHN0cnVjdCBzdWJfc2VxICopa21hbGxvYyhzeiwgR0ZQX0FUT01JQyk7CisKKwlpZiAoc3NlcSkKKwkJbWVtc2V0KHNzZXEsIDAsIHN6KTsKKwlyZXR1cm4gc3NlcTsKK30KKworLyoqCisgKiBuYW1lc2VxX2NyZWF0ZSAtIGNyZWF0ZSBhIG5hbWUgc2VxdWVuY2Ugc3RydWN0dXJlIGZvciB0aGUgc3BlY2lmaWVkICd0eXBlJworICogCisgKiBBbGxvY2F0ZXMgYSBzaW5nbGUgc3ViLXNlcXVlbmNlIHN0cnVjdHVyZSBhbmQgc2V0cyBpdCB0byBhbGwgMCdzLgorICovCisKK3N0cnVjdCBuYW1lX3NlcSAqbmFtZXNlcV9jcmVhdGUodTMyIHR5cGUsIHN0cnVjdCBobGlzdF9oZWFkICpzZXFfaGVhZCkKK3sKKwlzdHJ1Y3QgbmFtZV9zZXEgKm5zZXEgPSAKKwkJKHN0cnVjdCBuYW1lX3NlcSAqKWttYWxsb2Moc2l6ZW9mKCpuc2VxKSwgR0ZQX0FUT01JQyk7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXEgPSBzdWJzZXFfYWxsb2MoMSk7CisKKwlpZiAoIW5zZXEgfHwgIXNzZXEpIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBjcmVhdGUgbmFtZSBzZXF1ZW5jZVxuIik7CisJCWtmcmVlKG5zZXEpOworCQlrZnJlZShzc2VxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KG5zZXEsIDAsIHNpemVvZigqbnNlcSkpOworCW5zZXEtPmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisJbnNlcS0+dHlwZSA9IHR5cGU7CisJbnNlcS0+c3NlcXMgPSBzc2VxOworCWRiZygibmFtZXNlcV9jcmVhdGUoKSBuc2VxID0gJXggdHlwZSAldSwgc3NzZXFzICV4LCBmZjogJXVcbiIsCisJICAgIG5zZXEsIHR5cGUsIG5zZXEtPnNzZXFzLCBuc2VxLT5maXJzdF9mcmVlKTsKKwluc2VxLT5hbGxvYyA9IDE7CisJSU5JVF9ITElTVF9OT0RFKCZuc2VxLT5uc19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmbnNlcS0+c3Vic2NyaXB0aW9ucyk7CisJaGxpc3RfYWRkX2hlYWQoJm5zZXEtPm5zX2xpc3QsIHNlcV9oZWFkKTsKKwlyZXR1cm4gbnNlcTsKK30KKworLyoqCisgKiBuYW1lc2VxX2ZpbmRfc3Vic2VxIC0gZmluZCBzdWItc2VxdWVuY2UgKGlmIGFueSkgbWF0Y2hpbmcgYSBuYW1lIGluc3RhbmNlCisgKiAgCisgKiBWZXJ5IHRpbWUtY3JpdGljYWwsIHNvIGJpbmFyeSBzZWFyY2hlcyB0aHJvdWdoIHN1Yi1zZXF1ZW5jZSBhcnJheS4KKyAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzdWJfc2VxICpuYW1lc2VxX2ZpbmRfc3Vic2VxKHN0cnVjdCBuYW1lX3NlcSAqbnNlcSwgCisJCQkJCQkgIHUzMiBpbnN0YW5jZSkKK3sKKwlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcXMgPSBuc2VxLT5zc2VxczsKKwlpbnQgbG93ID0gMDsKKwlpbnQgaGlnaCA9IG5zZXEtPmZpcnN0X2ZyZWUgLSAxOworCWludCBtaWQ7CisKKwl3aGlsZSAobG93IDw9IGhpZ2gpIHsKKwkJbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKKwkJaWYgKGluc3RhbmNlIDwgc3NlcXNbbWlkXS5sb3dlcikKKwkJCWhpZ2ggPSBtaWQgLSAxOworCQllbHNlIGlmIChpbnN0YW5jZSA+IHNzZXFzW21pZF0udXBwZXIpCisJCQlsb3cgPSBtaWQgKyAxOworCQllbHNlCisJCQlyZXR1cm4gJnNzZXFzW21pZF07CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIG5hbWVzZXFfbG9jYXRlX3N1YnNlcSAtIGRldGVybWluZSBwb3NpdGlvbiBvZiBuYW1lIGluc3RhbmNlIGluIHN1Yi1zZXF1ZW5jZQorICogCisgKiBSZXR1cm5zIGluZGV4IGluIHN1Yi1zZXF1ZW5jZSBhcnJheSBvZiB0aGUgZW50cnkgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkCisgKiBpbnN0YW5jZSB2YWx1ZTsgaWYgbm8gZW50cnkgY29udGFpbnMgdGhhdCB2YWx1ZSwgcmV0dXJucyB0aGUgcG9zaXRpb24KKyAqIHdoZXJlIGEgbmV3IGVudHJ5IGZvciBpdCB3b3VsZCBiZSBpbnNlcnRlZCBpbiB0aGUgYXJyYXkuCisgKgorICogTm90ZTogU2ltaWxhciB0byBiaW5hcnkgc2VhcmNoIGNvZGUgZm9yIGxvY2F0aW5nIGEgc3ViLXNlcXVlbmNlLgorICovCisKK3N0YXRpYyB1MzIgbmFtZXNlcV9sb2NhdGVfc3Vic2VxKHN0cnVjdCBuYW1lX3NlcSAqbnNlcSwgdTMyIGluc3RhbmNlKQoreworCXN0cnVjdCBzdWJfc2VxICpzc2VxcyA9IG5zZXEtPnNzZXFzOworCWludCBsb3cgPSAwOworCWludCBoaWdoID0gbnNlcS0+Zmlyc3RfZnJlZSAtIDE7CisJaW50IG1pZDsKKworCXdoaWxlIChsb3cgPD0gaGlnaCkgeworCQltaWQgPSAobG93ICsgaGlnaCkgLyAyOworCQlpZiAoaW5zdGFuY2UgPCBzc2Vxc1ttaWRdLmxvd2VyKQorCQkJaGlnaCA9IG1pZCAtIDE7CisJCWVsc2UgaWYgKGluc3RhbmNlID4gc3NlcXNbbWlkXS51cHBlcikKKwkJCWxvdyA9IG1pZCArIDE7CisJCWVsc2UKKwkJCXJldHVybiBtaWQ7CisJfQorCXJldHVybiBsb3c7Cit9CisKKy8qKgorICogbmFtZXNlcV9pbnNlcnRfcHVibCAtIAorICovCisKK3N0cnVjdCBwdWJsaWNhdGlvbiAqbmFtZXNlcV9pbnNlcnRfcHVibChzdHJ1Y3QgbmFtZV9zZXEgKm5zZXEsCisJCQkJCXUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwKKwkJCQkJdTMyIHNjb3BlLCB1MzIgbm9kZSwgdTMyIHBvcnQsIHUzMiBrZXkpCit7CisJc3RydWN0IHN1YnNjcmlwdGlvbiAqczsKKwlzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdDsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1Ymw7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXE7CisJaW50IGNyZWF0ZWRfc3Vic2VxID0gMDsKKworCWFzc2VydChuc2VxLT5maXJzdF9mcmVlIDw9IG5zZXEtPmFsbG9jKTsKKwlzc2VxID0gbmFtZXNlcV9maW5kX3N1YnNlcShuc2VxLCBsb3dlcik7CisJZGJnKCJuYW1lc2VxX2luczogZm9yIHNlcSAleCw8JXUsJXU+LCBmb3VuZCBzc2VxICV4XG4iLAorCSAgICBuc2VxLCB0eXBlLCBsb3dlciwgc3NlcSk7CisJaWYgKHNzZXEpIHsKKworCQkvKiBMb3dlciBlbmQgb3ZlcmxhcHMgZXhpc3RpbmcgZW50cnkgPT4gbmVlZCBhbiBleGFjdCBtYXRjaCAqLworCisJCWlmICgoc3NlcS0+bG93ZXIgIT0gbG93ZXIpIHx8IChzc2VxLT51cHBlciAhPSB1cHBlcikpIHsKKwkJCXdhcm4oIk92ZXJsYXBwaW5nIHB1YmwgPCV1LCV1LCV1PlxuIiwgdHlwZSwgbG93ZXIsIHVwcGVyKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJdTMyIGluc3BvczsKKwkJc3RydWN0IHN1Yl9zZXEgKmZyZWVzc2VxOworCisJCS8qIEZpbmQgd2hlcmUgbG93ZXIgZW5kIHNob3VsZCBiZSBpbnNlcnRlZCAqLworCisJCWluc3BvcyA9IG5hbWVzZXFfbG9jYXRlX3N1YnNlcShuc2VxLCBsb3dlcik7CisKKwkJLyogRmFpbCBpZiB1cHBlciBlbmQgb3ZlcmxhcHMgaW50byBhbiBleGlzdGluZyBlbnRyeSAqLworCisJCWlmICgoaW5zcG9zIDwgbnNlcS0+Zmlyc3RfZnJlZSkgJiYKKwkJICAgICh1cHBlciA+PSBuc2VxLT5zc2Vxc1tpbnNwb3NdLmxvd2VyKSkgeworCQkJd2FybigiT3ZlcmxhcHBpbmcgcHVibCA8JXUsJXUsJXU+XG4iLCB0eXBlLCBsb3dlciwgdXBwZXIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBFbnN1cmUgdGhlcmUgaXMgc3BhY2UgZm9yIG5ldyBzdWItc2VxdWVuY2UgKi8KKworCQlpZiAobnNlcS0+Zmlyc3RfZnJlZSA9PSBuc2VxLT5hbGxvYykgeworCQkJc3RydWN0IHN1Yl9zZXEgKnNzZXFzID0gbnNlcS0+c3NlcXM7CisJCQluc2VxLT5zc2VxcyA9IHN1YnNlcV9hbGxvYyhuc2VxLT5hbGxvYyAqIDIpOworCQkJaWYgKG5zZXEtPnNzZXFzICE9IE5VTEwpIHsKKwkJCQltZW1jcHkobnNlcS0+c3NlcXMsIHNzZXFzLAorCQkJCSAgICAgICBuc2VxLT5hbGxvYyAqIHNpemVvZiAoc3RydWN0IHN1Yl9zZXEpKTsKKwkJCQlrZnJlZShzc2Vxcyk7CisJCQkJZGJnKCJBbGxvY2F0ZWQgJXUgc3NlcXNcbiIsIG5zZXEtPmFsbG9jKTsKKwkJCQluc2VxLT5hbGxvYyAqPSAyOworCQkJfSBlbHNlIHsKKwkJCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZmFpbGVkIHRvIGNyZWF0ZSBzdWItc2VxdWVuY2VcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWRiZygiSGF2ZSAldSBzc2VxcyBmb3IgdHlwZSAldVxuIiwgbnNlcS0+YWxsb2MsIHR5cGUpOworCisJCS8qIEluc2VydCBuZXcgc3ViLXNlcXVlbmNlICovCisKKwkJZGJnKCJpbnMgaW4gcG9zICV1LCBmZiA9ICV1XG4iLCBpbnNwb3MsIG5zZXEtPmZpcnN0X2ZyZWUpOworCQlzc2VxID0gJm5zZXEtPnNzZXFzW2luc3Bvc107CisJCWZyZWVzc2VxID0gJm5zZXEtPnNzZXFzW25zZXEtPmZpcnN0X2ZyZWVdOworCQltZW1tb3ZlKHNzZXEgKyAxLCBzc2VxLCAoZnJlZXNzZXEgLSBzc2VxKSAqIHNpemVvZiAoKnNzZXEpKTsKKwkJbWVtc2V0KHNzZXEsIDAsIHNpemVvZiAoKnNzZXEpKTsKKwkJbnNlcS0+Zmlyc3RfZnJlZSsrOworCQlzc2VxLT5sb3dlciA9IGxvd2VyOworCQlzc2VxLT51cHBlciA9IHVwcGVyOworCQljcmVhdGVkX3N1YnNlcSA9IDE7CisJfQorCWRiZygiaW5zZXJ0aW5nICgldSAldSAldSkgZnJvbSAleDoldSBpbnRvIHNzZXEgJXgoJXUsJXUpIG9mIHNlcSAleFxuIiwKKwkgICAgdHlwZSwgbG93ZXIsIHVwcGVyLCBub2RlLCBwb3J0LCBzc2VxLAorCSAgICBzc2VxLT5sb3dlciwgc3NlcS0+dXBwZXIsIG5zZXEpOworCisJLyogSW5zZXJ0IGEgcHVibGljYXRpb246ICovCisKKwlwdWJsID0gcHVibF9jcmVhdGUodHlwZSwgbG93ZXIsIHVwcGVyLCBzY29wZSwgbm9kZSwgcG9ydCwga2V5KTsKKwlpZiAoIXB1YmwpCisJCXJldHVybiAwOworCWRiZygiaW5zZXJ0aW5nIHB1YmwgJXgsIG5vZGU9JXggcHVibC0+bm9kZT0leCwgc3Vic2NyLT5ub2RlPSV4XG4iLAorCSAgICBwdWJsLCBub2RlLCBwdWJsLT5ub2RlLCBwdWJsLT5zdWJzY3Iubm9kZSk7CisKKwlpZiAoIXNzZXEtPnpvbmVfbGlzdCkKKwkJc3NlcS0+em9uZV9saXN0ID0gcHVibC0+em9uZV9saXN0X25leHQgPSBwdWJsOworCWVsc2UgeworCQlwdWJsLT56b25lX2xpc3RfbmV4dCA9IHNzZXEtPnpvbmVfbGlzdC0+em9uZV9saXN0X25leHQ7CisJCXNzZXEtPnpvbmVfbGlzdC0+em9uZV9saXN0X25leHQgPSBwdWJsOworCX0KKworCWlmIChpbl9vd25fY2x1c3Rlcihub2RlKSkgeworCQlpZiAoIXNzZXEtPmNsdXN0ZXJfbGlzdCkKKwkJCXNzZXEtPmNsdXN0ZXJfbGlzdCA9IHB1YmwtPmNsdXN0ZXJfbGlzdF9uZXh0ID0gcHVibDsKKwkJZWxzZSB7CisJCQlwdWJsLT5jbHVzdGVyX2xpc3RfbmV4dCA9CisJCQlzc2VxLT5jbHVzdGVyX2xpc3QtPmNsdXN0ZXJfbGlzdF9uZXh0OworCQkJc3NlcS0+Y2x1c3Rlcl9saXN0LT5jbHVzdGVyX2xpc3RfbmV4dCA9IHB1Ymw7CisJCX0KKwl9CisKKwlpZiAobm9kZSA9PSB0aXBjX293bl9hZGRyKSB7CisJCWlmICghc3NlcS0+bm9kZV9saXN0KQorCQkJc3NlcS0+bm9kZV9saXN0ID0gcHVibC0+bm9kZV9saXN0X25leHQgPSBwdWJsOworCQllbHNlIHsKKwkJCXB1YmwtPm5vZGVfbGlzdF9uZXh0ID0gc3NlcS0+bm9kZV9saXN0LT5ub2RlX2xpc3RfbmV4dDsKKwkJCXNzZXEtPm5vZGVfbGlzdC0+bm9kZV9saXN0X25leHQgPSBwdWJsOworCQl9CisJfQorCisJLyogCisJICogQW55IHN1YnNjcmlwdGlvbnMgd2FpdGluZyBmb3Igbm90aWZpY2F0aW9uPyAKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocywgc3QsICZuc2VxLT5zdWJzY3JpcHRpb25zLCBuYW1lc2VxX2xpc3QpIHsKKwkJZGJnKCJjYWxsaW5nIHJlcG9ydF9vdmVybGFwKClcbiIpOworCQlzdWJzY3JfcmVwb3J0X292ZXJsYXAocywKKwkJCQkgICAgICBwdWJsLT5sb3dlciwKKwkJCQkgICAgICBwdWJsLT51cHBlciwKKwkJCQkgICAgICBUSVBDX1BVQkxJU0hFRCwKKwkJCQkgICAgICBwdWJsLT5yZWYsIAorCQkJCSAgICAgIHB1YmwtPm5vZGUsCisJCQkJICAgICAgY3JlYXRlZF9zdWJzZXEpOworCX0KKwlyZXR1cm4gcHVibDsKK30KKworLyoqCisgKiBuYW1lc2VxX3JlbW92ZV9wdWJsIC0KKyAqLworCitzdHJ1Y3QgcHVibGljYXRpb24gKm5hbWVzZXFfcmVtb3ZlX3B1Ymwoc3RydWN0IG5hbWVfc2VxICpuc2VxLCB1MzIgaW5zdCwKKwkJCQkJdTMyIG5vZGUsIHUzMiByZWYsIHUzMiBrZXkpCit7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHJldjsKKwlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcSA9IG5hbWVzZXFfZmluZF9zdWJzZXEobnNlcSwgaW5zdCk7CisJc3RydWN0IHN1Yl9zZXEgKmZyZWU7CisJc3RydWN0IHN1YnNjcmlwdGlvbiAqcywgKnN0OworCWludCByZW1vdmVkX3N1YnNlcSA9IDA7CisKKwlhc3NlcnQobnNlcSk7CisKKwlpZiAoIXNzZXEpIHsKKwkJaW50IGk7CisKKwkJd2FybigiV2l0aGRyYXcgdW5rbm93biA8JXUsJXU+P1xuIiwgbnNlcS0+dHlwZSwgaW5zdCk7CisJCWFzc2VydChuc2VxLT5zc2Vxcyk7CisJCWRiZygiRHVtcGluZyBzdWJzZXFzICV4IGZvciAleCwgYWxsb2MgPSAldSxmZj0ldVxuIiwKKwkJICAgIG5zZXEtPnNzZXFzLCBuc2VxLCBuc2VxLT5hbGxvYywgCisJCSAgICBuc2VxLT5maXJzdF9mcmVlKTsKKwkJZm9yIChpID0gMDsgaSA8IG5zZXEtPmZpcnN0X2ZyZWU7IGkrKykgeworCQkJZGJnKCJTdWJzZXEgJXUoJXgpOiBsb3dlciA9ICV1LHVwcGVyID0gJXVcbiIsCisJCQkgICAgaSwgJm5zZXEtPnNzZXFzW2ldLCBuc2VxLT5zc2Vxc1tpXS5sb3dlciwKKwkJCSAgICBuc2VxLT5zc2Vxc1tpXS51cHBlcik7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWRiZygibmFtZXNlcV9yZW1vdmU6IHNlcTogJXgsIHNzZXEgJXgsIDwldSwldT4ga2V5ICV1XG4iLAorCSAgICBuc2VxLCBzc2VxLCBuc2VxLT50eXBlLCBpbnN0LCBrZXkpOworCisJcHJldiA9IHNzZXEtPnpvbmVfbGlzdDsKKwlwdWJsID0gc3NlcS0+em9uZV9saXN0LT56b25lX2xpc3RfbmV4dDsKKwl3aGlsZSAoKHB1YmwtPmtleSAhPSBrZXkpIHx8IChwdWJsLT5yZWYgIT0gcmVmKSB8fCAKKwkgICAgICAgKHB1YmwtPm5vZGUgJiYgKHB1YmwtPm5vZGUgIT0gbm9kZSkpKSB7CisJCXByZXYgPSBwdWJsOworCQlwdWJsID0gcHVibC0+em9uZV9saXN0X25leHQ7CisJCWFzc2VydChwcmV2ICE9IHNzZXEtPnpvbmVfbGlzdCk7CisJfQorCWlmIChwdWJsICE9IHNzZXEtPnpvbmVfbGlzdCkKKwkJcHJldi0+em9uZV9saXN0X25leHQgPSBwdWJsLT56b25lX2xpc3RfbmV4dDsKKwllbHNlIGlmIChwdWJsLT56b25lX2xpc3RfbmV4dCAhPSBwdWJsKSB7CisJCXByZXYtPnpvbmVfbGlzdF9uZXh0ID0gcHVibC0+em9uZV9saXN0X25leHQ7CisJCXNzZXEtPnpvbmVfbGlzdCA9IHB1YmwtPnpvbmVfbGlzdF9uZXh0OworCX0gZWxzZSB7CisJCXNzZXEtPnpvbmVfbGlzdCA9IDA7CisJfQorCisJaWYgKGluX293bl9jbHVzdGVyKG5vZGUpKSB7CisJCXByZXYgPSBzc2VxLT5jbHVzdGVyX2xpc3Q7CisJCXB1YmwgPSBzc2VxLT5jbHVzdGVyX2xpc3QtPmNsdXN0ZXJfbGlzdF9uZXh0OworCQl3aGlsZSAoKHB1YmwtPmtleSAhPSBrZXkpIHx8IChwdWJsLT5yZWYgIT0gcmVmKSB8fCAKKwkJICAgICAgIChwdWJsLT5ub2RlICYmIChwdWJsLT5ub2RlICE9IG5vZGUpKSkgeworCQkJcHJldiA9IHB1Ymw7CisJCQlwdWJsID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7CisJCQlhc3NlcnQocHJldiAhPSBzc2VxLT5jbHVzdGVyX2xpc3QpOworCQl9CisJCWlmIChwdWJsICE9IHNzZXEtPmNsdXN0ZXJfbGlzdCkKKwkJCXByZXYtPmNsdXN0ZXJfbGlzdF9uZXh0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7CisJCWVsc2UgaWYgKHB1YmwtPmNsdXN0ZXJfbGlzdF9uZXh0ICE9IHB1YmwpIHsKKwkJCXByZXYtPmNsdXN0ZXJfbGlzdF9uZXh0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7CisJCQlzc2VxLT5jbHVzdGVyX2xpc3QgPSBwdWJsLT5jbHVzdGVyX2xpc3RfbmV4dDsKKwkJfSBlbHNlIHsKKwkJCXNzZXEtPmNsdXN0ZXJfbGlzdCA9IDA7CisJCX0KKwl9CisKKwlpZiAobm9kZSA9PSB0aXBjX293bl9hZGRyKSB7CisJCXByZXYgPSBzc2VxLT5ub2RlX2xpc3Q7CisJCXB1YmwgPSBzc2VxLT5ub2RlX2xpc3QtPm5vZGVfbGlzdF9uZXh0OworCQl3aGlsZSAoKHB1YmwtPmtleSAhPSBrZXkpIHx8IChwdWJsLT5yZWYgIT0gcmVmKSB8fCAKKwkJICAgICAgIChwdWJsLT5ub2RlICYmIChwdWJsLT5ub2RlICE9IG5vZGUpKSkgeworCQkJcHJldiA9IHB1Ymw7CisJCQlwdWJsID0gcHVibC0+bm9kZV9saXN0X25leHQ7CisJCQlhc3NlcnQocHJldiAhPSBzc2VxLT5ub2RlX2xpc3QpOworCQl9CisJCWlmIChwdWJsICE9IHNzZXEtPm5vZGVfbGlzdCkKKwkJCXByZXYtPm5vZGVfbGlzdF9uZXh0ID0gcHVibC0+bm9kZV9saXN0X25leHQ7CisJCWVsc2UgaWYgKHB1YmwtPm5vZGVfbGlzdF9uZXh0ICE9IHB1YmwpIHsKKwkJCXByZXYtPm5vZGVfbGlzdF9uZXh0ID0gcHVibC0+bm9kZV9saXN0X25leHQ7CisJCQlzc2VxLT5ub2RlX2xpc3QgPSBwdWJsLT5ub2RlX2xpc3RfbmV4dDsKKwkJfSBlbHNlIHsKKwkJCXNzZXEtPm5vZGVfbGlzdCA9IDA7CisJCX0KKwl9CisJYXNzZXJ0KCFwdWJsLT5ub2RlIHx8IChwdWJsLT5ub2RlID09IG5vZGUpKTsKKwlhc3NlcnQocHVibC0+cmVmID09IHJlZik7CisJYXNzZXJ0KHB1YmwtPmtleSA9PSBrZXkpOworCisJLyogCisJICogQ29udHJhY3Qgc3Vic2VxIGxpc3QgaWYgbm8gbW9yZSBwdWJsaWNhdGlvbnM6CisJICovCisJaWYgKCFzc2VxLT5ub2RlX2xpc3QgJiYgIXNzZXEtPmNsdXN0ZXJfbGlzdCAmJiAhc3NlcS0+em9uZV9saXN0KSB7CisJCWZyZWUgPSAmbnNlcS0+c3NlcXNbbnNlcS0+Zmlyc3RfZnJlZS0tXTsKKwkJbWVtbW92ZShzc2VxLCBzc2VxICsgMSwgKGZyZWUgLSAoc3NlcSArIDEpKSAqIHNpemVvZiAoKnNzZXEpKTsKKwkJcmVtb3ZlZF9zdWJzZXEgPSAxOworCX0KKworCS8qIAorCSAqIEFueSBzdWJzY3JpcHRpb25zIHdhaXRpbmcgPyAKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocywgc3QsICZuc2VxLT5zdWJzY3JpcHRpb25zLCBuYW1lc2VxX2xpc3QpIHsKKwkJc3Vic2NyX3JlcG9ydF9vdmVybGFwKHMsCisJCQkJICAgICAgcHVibC0+bG93ZXIsCisJCQkJICAgICAgcHVibC0+dXBwZXIsCisJCQkJICAgICAgVElQQ19XSVRIRFJBV04sIAorCQkJCSAgICAgIHB1YmwtPnJlZiwgCisJCQkJICAgICAgcHVibC0+bm9kZSwKKwkJCQkgICAgICByZW1vdmVkX3N1YnNlcSk7CisJfQorCXJldHVybiBwdWJsOworfQorCisvKioKKyAqIG5hbWVzZXFfc3Vic2NyaWJlOiBhdHRhY2ggYSBzdWJzY3JpcHRpb24sIGFuZCBpc3N1ZQorICogdGhlIHByZXNjcmliZWQgbnVtYmVyIG9mIGV2ZW50cyBpZiB0aGVyZSBpcyBhbnkgc3ViLQorICogc2VxdWVuY2Ugb3ZlcmxhcHBpbmcgd2l0aCB0aGUgcmVxdWVzdGVkIHNlcXVlbmNlCisgKi8KKwordm9pZCBuYW1lc2VxX3N1YnNjcmliZShzdHJ1Y3QgbmFtZV9zZXEgKm5zZXEsIHN0cnVjdCBzdWJzY3JpcHRpb24gKnMpCit7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXEgPSBuc2VxLT5zc2VxczsKKworCWxpc3RfYWRkKCZzLT5uYW1lc2VxX2xpc3QsICZuc2VxLT5zdWJzY3JpcHRpb25zKTsKKworCWlmICghc3NlcSkKKwkJcmV0dXJuOworCisJd2hpbGUgKHNzZXEgIT0gJm5zZXEtPnNzZXFzW25zZXEtPmZpcnN0X2ZyZWVdKSB7CisJCXN0cnVjdCBwdWJsaWNhdGlvbiAqemwgPSBzc2VxLT56b25lX2xpc3Q7CisJCWlmICh6bCAmJiBzdWJzY3Jfb3ZlcmxhcChzLHNzZXEtPmxvd2VyLHNzZXEtPnVwcGVyKSkgeworCQkJc3RydWN0IHB1YmxpY2F0aW9uICpjcnMgPSB6bDsKKwkJCWludCBtdXN0X3JlcG9ydCA9IDE7CisKKwkJCWRvIHsKKwkJCQlzdWJzY3JfcmVwb3J0X292ZXJsYXAocywgCisJCQkJCQkgICAgICAgc3NlcS0+bG93ZXIsIAorCQkJCQkJICAgICAgIHNzZXEtPnVwcGVyLAorCQkJCQkJICAgICAgIFRJUENfUFVCTElTSEVELAorCQkJCQkJICAgICAgIGNycy0+cmVmLAorCQkJCQkJICAgICAgIGNycy0+bm9kZSwKKwkJCQkJCSAgICAgICBtdXN0X3JlcG9ydCk7CisJCQkJbXVzdF9yZXBvcnQgPSAwOworCQkJCWNycyA9IGNycy0+em9uZV9saXN0X25leHQ7CisJCQl9IHdoaWxlIChjcnMgIT0gemwpOworCQl9CisJCXNzZXErKzsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmFtZV9zZXEgKm5hbWV0YmxfZmluZF9zZXEodTMyIHR5cGUpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKnNlcV9oZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpzZXFfbm9kZTsKKwlzdHJ1Y3QgbmFtZV9zZXEgKm5zOworCisJZGJnKCJmaW5kX3NlcSAldSwoJXUsMHgleCkgdGFibGUgPSAlcCwgaGFzaFt0eXBlXSA9ICV1XG4iLAorCSAgICB0eXBlLCBudG9obCh0eXBlKSwgdHlwZSwgdGFibGUudHlwZXMsIGhhc2godHlwZSkpOworCisJc2VxX2hlYWQgPSAmdGFibGUudHlwZXNbaGFzaCh0eXBlKV07CisJaGxpc3RfZm9yX2VhY2hfZW50cnkobnMsIHNlcV9ub2RlLCBzZXFfaGVhZCwgbnNfbGlzdCkgeworCQlpZiAobnMtPnR5cGUgPT0gdHlwZSkgeworCQkJZGJnKCJmb3VuZCAleFxuIiwgbnMpOworCQkJcmV0dXJuIG5zOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9OworCitzdHJ1Y3QgcHVibGljYXRpb24gKm5hbWV0YmxfaW5zZXJ0X3B1YmwodTMyIHR5cGUsIHUzMiBsb3dlciwgdTMyIHVwcGVyLAorCQkgICAgdTMyIHNjb3BlLCB1MzIgbm9kZSwgdTMyIHBvcnQsIHUzMiBrZXkpCit7CisJc3RydWN0IG5hbWVfc2VxICpzZXEgPSBuYW1ldGJsX2ZpbmRfc2VxKHR5cGUpOworCisJZGJnKCJpbnNfcHVibDogPCV1LCV4LCV4PiBmb3VuZCAleFxuIiwgdHlwZSwgbG93ZXIsIHVwcGVyLCBzZXEpOworCWlmIChsb3dlciA+IHVwcGVyKSB7CisJCXdhcm4oIkZhaWxlZCB0byBwdWJsaXNoIGlsbGVnYWwgPCV1LCV1LCV1PlxuIiwKKwkJICAgICB0eXBlLCBsb3dlciwgdXBwZXIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkYmcoIlB1Ymxpc2hpbmcgPCV1LCV1LCV1PiBmcm9tICV4XG4iLCB0eXBlLCBsb3dlciwgdXBwZXIsIG5vZGUpOworCWlmICghc2VxKSB7CisJCXNlcSA9IG5hbWVzZXFfY3JlYXRlKHR5cGUsICZ0YWJsZS50eXBlc1toYXNoKHR5cGUpXSk7CisJCWRiZygibmFtZXRibF9pbnNlcnRfcHVibDogY3JlYXRlZCAleFxuIiwgc2VxKTsKKwl9CisJaWYgKCFzZXEpCisJCXJldHVybiAwOworCisJYXNzZXJ0KHNlcS0+dHlwZSA9PSB0eXBlKTsKKwlyZXR1cm4gbmFtZXNlcV9pbnNlcnRfcHVibChzZXEsIHR5cGUsIGxvd2VyLCB1cHBlciwKKwkJCQkgICBzY29wZSwgbm9kZSwgcG9ydCwga2V5KTsKK30KKworc3RydWN0IHB1YmxpY2F0aW9uICpuYW1ldGJsX3JlbW92ZV9wdWJsKHUzMiB0eXBlLCB1MzIgbG93ZXIsIAorCQkJCQl1MzIgbm9kZSwgdTMyIHJlZiwgdTMyIGtleSkKK3sKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1Ymw7CisJc3RydWN0IG5hbWVfc2VxICpzZXEgPSBuYW1ldGJsX2ZpbmRfc2VxKHR5cGUpOworCisJaWYgKCFzZXEpCisJCXJldHVybiAwOworCisJZGJnKCJXaXRoZHJhd2luZyA8JXUsJXU+IGZyb20gJXhcbiIsIHR5cGUsIGxvd2VyLCBub2RlKTsKKwlwdWJsID0gbmFtZXNlcV9yZW1vdmVfcHVibChzZXEsIGxvd2VyLCBub2RlLCByZWYsIGtleSk7CisKKwlpZiAoIXNlcS0+Zmlyc3RfZnJlZSAmJiBsaXN0X2VtcHR5KCZzZXEtPnN1YnNjcmlwdGlvbnMpKSB7CisJCWhsaXN0X2RlbF9pbml0KCZzZXEtPm5zX2xpc3QpOworCQlrZnJlZShzZXEtPnNzZXFzKTsKKwkJa2ZyZWUoc2VxKTsKKwl9CisJcmV0dXJuIHB1Ymw7Cit9CisKKy8qCisgKiBuYW1ldGJsX3RyYW5zbGF0ZSgpOiBUcmFuc2xhdGUgdGlwY19uYW1lIC0+IHRpcGNfcG9ydGlkLgorICogICAgICAgICAgICAgICAgICAgICAgVmVyeSB0aW1lLWNyaXRpY2FsLgorICoKKyAqIE5vdGU6IG9uIGVudHJ5ICdkZXN0bm9kZScgaXMgdGhlIHNlYXJjaCBkb21haW4gdXNlZCBkdXJpbmcgdHJhbnNsYXRpb247CisgKiAgICAgICBvbiBleGl0IGl0IHBhc3NlcyBiYWNrIHRoZSBub2RlIGFkZHJlc3Mgb2YgdGhlIG1hdGNoaW5nIHBvcnQgKGlmIGFueSkKKyAqLworCit1MzIgbmFtZXRibF90cmFuc2xhdGUodTMyIHR5cGUsIHUzMiBpbnN0YW5jZSwgdTMyICpkZXN0bm9kZSkKK3sKKwlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcTsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwgPSAwOworCXN0cnVjdCBuYW1lX3NlcSAqc2VxOworCXUzMiByZWY7CisKKwlpZiAoIWluX3Njb3BlKCpkZXN0bm9kZSwgdGlwY19vd25fYWRkcikpCisJCXJldHVybiAwOworCisJcmVhZF9sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCXNlcSA9IG5hbWV0YmxfZmluZF9zZXEodHlwZSk7CisJaWYgKHVubGlrZWx5KCFzZXEpKQorCQlnb3RvIG5vdF9mb3VuZDsKKwlzc2VxID0gbmFtZXNlcV9maW5kX3N1YnNlcShzZXEsIGluc3RhbmNlKTsKKwlpZiAodW5saWtlbHkoIXNzZXEpKQorCQlnb3RvIG5vdF9mb3VuZDsKKwlzcGluX2xvY2tfYmgoJnNlcS0+bG9jayk7CisKKwkvKiBDbG9zZXN0LUZpcnN0IEFsZ29yaXRobTogKi8KKwlpZiAobGlrZWx5KCEqZGVzdG5vZGUpKSB7CisJCXB1YmwgPSBzc2VxLT5ub2RlX2xpc3Q7CisJCWlmIChwdWJsKSB7CisJCQlzc2VxLT5ub2RlX2xpc3QgPSBwdWJsLT5ub2RlX2xpc3RfbmV4dDsKK2ZvdW5kOgorCQkJcmVmID0gcHVibC0+cmVmOworCQkJKmRlc3Rub2RlID0gcHVibC0+bm9kZTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzZXEtPmxvY2spOworCQkJcmVhZF91bmxvY2tfYmgoJm5hbWV0YmxfbG9jayk7CisJCQlyZXR1cm4gcmVmOworCQl9CisJCXB1YmwgPSBzc2VxLT5jbHVzdGVyX2xpc3Q7CisJCWlmIChwdWJsKSB7CisJCQlzc2VxLT5jbHVzdGVyX2xpc3QgPSBwdWJsLT5jbHVzdGVyX2xpc3RfbmV4dDsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwkJcHVibCA9IHNzZXEtPnpvbmVfbGlzdDsKKwkJaWYgKHB1YmwpIHsKKwkJCXNzZXEtPnpvbmVfbGlzdCA9IHB1YmwtPnpvbmVfbGlzdF9uZXh0OworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCS8qIFJvdW5kLVJvYmluIEFsZ29yaXRobTogKi8KKwllbHNlIGlmICgqZGVzdG5vZGUgPT0gdGlwY19vd25fYWRkcikgeworCQlwdWJsID0gc3NlcS0+bm9kZV9saXN0OworCQlpZiAocHVibCkgeworCQkJc3NlcS0+bm9kZV9saXN0ID0gcHVibC0+bm9kZV9saXN0X25leHQ7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfSBlbHNlIGlmIChpbl9vd25fY2x1c3RlcigqZGVzdG5vZGUpKSB7CisJCXB1YmwgPSBzc2VxLT5jbHVzdGVyX2xpc3Q7CisJCWlmIChwdWJsKSB7CisJCQlzc2VxLT5jbHVzdGVyX2xpc3QgPSBwdWJsLT5jbHVzdGVyX2xpc3RfbmV4dDsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9IGVsc2UgeworCQlwdWJsID0gc3NlcS0+em9uZV9saXN0OworCQlpZiAocHVibCkgeworCQkJc3NlcS0+em9uZV9saXN0ID0gcHVibC0+em9uZV9saXN0X25leHQ7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZzZXEtPmxvY2spOworbm90X2ZvdW5kOgorCSpkZXN0bm9kZSA9IDA7CisJcmVhZF91bmxvY2tfYmgoJm5hbWV0YmxfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbmFtZXRibF9tY190cmFuc2xhdGUgLSBmaW5kIG11bHRpY2FzdCBkZXN0aW5hdGlvbnMKKyAqIAorICogQ3JlYXRlcyBsaXN0IG9mIGFsbCBsb2NhbCBwb3J0cyB0aGF0IG92ZXJsYXAgdGhlIGdpdmVuIG11bHRpY2FzdCBhZGRyZXNzOworICogYWxzbyBkZXRlcm1pbmVzIGlmIGFueSBvZmYtbm9kZSBwb3J0cyBvdmVybGFwLgorICoKKyAqIE5vdGU6IFB1YmxpY2F0aW9ucyB3aXRoIGEgc2NvcGUgbmFycm93ZXIgdGhhbiAnbGltaXQnIGFyZSBpZ25vcmVkLgorICogKGkuZS4gbG9jYWwgbm9kZS1zY29wZSBwdWJsaWNhdGlvbnMgbXVzdG4ndCByZWNlaXZlIG1lc3NhZ2VzIGFycml2aW5nCisgKiBmcm9tIGFub3RoZXIgbm9kZSwgZXZlbiBpZiB0aGUgbXVsdGNhc3QgbGluayBicm91Z2h0IGl0IGhlcmUpCisgKiAKKyAqIFJldHVybnMgbm9uLXplcm8gaWYgYW55IG9mZi1ub2RlIHBvcnRzIG92ZXJsYXAKKyAqLworCitpbnQgbmFtZXRibF9tY190cmFuc2xhdGUodTMyIHR5cGUsIHUzMiBsb3dlciwgdTMyIHVwcGVyLCB1MzIgbGltaXQsCisJCQkgc3RydWN0IHBvcnRfbGlzdCAqZHBvcnRzKQoreworCXN0cnVjdCBuYW1lX3NlcSAqc2VxOworCXN0cnVjdCBzdWJfc2VxICpzc2VxOworCXN0cnVjdCBzdWJfc2VxICpzc2VxX3N0b3A7CisJaW50IHJlcyA9IDA7CisKKwlyZWFkX2xvY2tfYmgoJm5hbWV0YmxfbG9jayk7CisJc2VxID0gbmFtZXRibF9maW5kX3NlcSh0eXBlKTsKKwlpZiAoIXNlcSkKKwkJZ290byBleGl0OworCisJc3Bpbl9sb2NrX2JoKCZzZXEtPmxvY2spOworCisJc3NlcSA9IHNlcS0+c3NlcXMgKyBuYW1lc2VxX2xvY2F0ZV9zdWJzZXEoc2VxLCBsb3dlcik7CisJc3NlcV9zdG9wID0gc2VxLT5zc2VxcyArIHNlcS0+Zmlyc3RfZnJlZTsKKwlmb3IgKDsgc3NlcSAhPSBzc2VxX3N0b3A7IHNzZXErKykgeworCQlzdHJ1Y3QgcHVibGljYXRpb24gKnB1Ymw7CisKKwkJaWYgKHNzZXEtPmxvd2VyID4gdXBwZXIpCisJCQlicmVhazsKKwkJcHVibCA9IHNzZXEtPmNsdXN0ZXJfbGlzdDsKKwkJaWYgKHB1YmwgJiYgKHB1YmwtPnNjb3BlIDw9IGxpbWl0KSkKKwkJCWRvIHsKKwkJCQlpZiAocHVibC0+bm9kZSA9PSB0aXBjX293bl9hZGRyKQorCQkJCQlwb3J0X2xpc3RfYWRkKGRwb3J0cywgcHVibC0+cmVmKTsKKwkJCQllbHNlCisJCQkJCXJlcyA9IDE7CisJCQkJcHVibCA9IHB1YmwtPmNsdXN0ZXJfbGlzdF9uZXh0OworCQkJfSB3aGlsZSAocHVibCAhPSBzc2VxLT5jbHVzdGVyX2xpc3QpOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZzZXEtPmxvY2spOworZXhpdDoKKwlyZWFkX3VubG9ja19iaCgmbmFtZXRibF9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIG5hbWV0YmxfcHVibGlzaF9yc3YgLSBwdWJsaXNoIHBvcnQgbmFtZSB1c2luZyBhIHJlc2VydmVkIG5hbWUgdHlwZQorICovCisKK2ludCBuYW1ldGJsX3B1Ymxpc2hfcnN2KHUzMiByZWYsIHVuc2lnbmVkIGludCBzY29wZSwgCisJCQlzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqc2VxKQoreworCWludCByZXM7CisKKwlhdG9taWNfaW5jKCZyc3ZfcHVibF9vayk7CisJcmVzID0gdGlwY19wdWJsaXNoKHJlZiwgc2NvcGUsIHNlcSk7CisJYXRvbWljX2RlYygmcnN2X3B1Ymxfb2spOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogbmFtZXRibF9wdWJsaXNoIC0gYWRkIG5hbWUgcHVibGljYXRpb24gdG8gbmV0d29yayBuYW1lIHRhYmxlcworICovCisKK3N0cnVjdCBwdWJsaWNhdGlvbiAqbmFtZXRibF9wdWJsaXNoKHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwgCisJCQkJICAgIHUzMiBzY29wZSwgdTMyIHBvcnRfcmVmLCB1MzIga2V5KQoreworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKworCWlmICh0YWJsZS5sb2NhbF9wdWJsX2NvdW50ID49IHRpcGNfbWF4X3B1YmxpY2F0aW9ucykgeworCQl3YXJuKCJGYWlsZWQgcHVibGlzaDogbWF4ICV1IGxvY2FsIHB1YmxpY2F0aW9uXG4iLCAKKwkJICAgICB0aXBjX21heF9wdWJsaWNhdGlvbnMpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCh0eXBlIDwgVElQQ19SRVNFUlZFRF9UWVBFUykgJiYgIWF0b21pY19yZWFkKCZyc3ZfcHVibF9vaykpIHsKKwkJd2FybigiRmFpbGVkIHRvIHB1Ymxpc2ggcmVzZXJ2ZWQgbmFtZSA8JXUsJXUsJXU+XG4iLAorCQkgICAgIHR5cGUsIGxvd2VyLCB1cHBlcik7CisJCXJldHVybiAwOworCX0KKworCXdyaXRlX2xvY2tfYmgoJm5hbWV0YmxfbG9jayk7CisJdGFibGUubG9jYWxfcHVibF9jb3VudCsrOworCXB1YmwgPSBuYW1ldGJsX2luc2VydF9wdWJsKHR5cGUsIGxvd2VyLCB1cHBlciwgc2NvcGUsCisJCQkJICAgdGlwY19vd25fYWRkciwgcG9ydF9yZWYsIGtleSk7CisJaWYgKHB1YmwgJiYgKHNjb3BlICE9IFRJUENfTk9ERV9TQ09QRSkpIHsKKwkJbmFtZWRfcHVibGlzaChwdWJsKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCXJldHVybiBwdWJsOworfQorCisvKioKKyAqIG5hbWV0Ymxfd2l0aGRyYXcgLSB3aXRoZHJhdyBuYW1lIHB1YmxpY2F0aW9uIGZyb20gbmV0d29yayBuYW1lIHRhYmxlcworICovCisKK2ludCBuYW1ldGJsX3dpdGhkcmF3KHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiByZWYsIHUzMiBrZXkpCit7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCisJZGJnKCJuYW1ldGJsX3dpdGhkcmF3OjwlZCwlZCwlZD5cbiIsIHR5cGUsIGxvd2VyLCBrZXkpOworCXdyaXRlX2xvY2tfYmgoJm5hbWV0YmxfbG9jayk7CisJcHVibCA9IG5hbWV0YmxfcmVtb3ZlX3B1YmwodHlwZSwgbG93ZXIsIHRpcGNfb3duX2FkZHIsIHJlZiwga2V5KTsKKwlpZiAocHVibCkgeworCQl0YWJsZS5sb2NhbF9wdWJsX2NvdW50LS07CisJCWlmIChwdWJsLT5zY29wZSAhPSBUSVBDX05PREVfU0NPUEUpCisJCQluYW1lZF93aXRoZHJhdyhwdWJsKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCQlsaXN0X2RlbF9pbml0KCZwdWJsLT5wcG9ydF9saXN0KTsKKwkJa2ZyZWUocHVibCk7CisJCXJldHVybiAxOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJm5hbWV0YmxfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbmFtZXRibF9zdWJzY3JpYmUgLSBhZGQgYSBzdWJzY3JpcHRpb24gb2JqZWN0IHRvIHRoZSBuYW1lIHRhYmxlCisgKi8KKwordm9pZAorbmFtZXRibF9zdWJzY3JpYmUoc3RydWN0IHN1YnNjcmlwdGlvbiAqcykKK3sKKwl1MzIgdHlwZSA9IHMtPnNlcS50eXBlOworCXN0cnVjdCBuYW1lX3NlcSAqc2VxOworCisgICAgICAgIHdyaXRlX2xvY2tfYmgoJm5hbWV0YmxfbG9jayk7CisJc2VxID0gbmFtZXRibF9maW5kX3NlcSh0eXBlKTsKKwlpZiAoIXNlcSkgeworCQlzZXEgPSBuYW1lc2VxX2NyZWF0ZSh0eXBlLCAmdGFibGUudHlwZXNbaGFzaCh0eXBlKV0pOworCX0KKyAgICAgICAgaWYgKHNlcSl7CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2JoKCZzZXEtPmxvY2spOworICAgICAgICAgICAgICAgIGRiZygibmFtZXRibF9zdWJzY3JpYmU6Zm91bmQgJXggZm9yIDwldSwldSwldT5cbiIsCisgICAgICAgICAgICAgICAgICAgIHNlcSwgdHlwZSwgcy0+c2VxLmxvd2VyLCBzLT5zZXEudXBwZXIpOworICAgICAgICAgICAgICAgIGFzc2VydChzZXEtPnR5cGUgPT0gdHlwZSk7CisgICAgICAgICAgICAgICAgbmFtZXNlcV9zdWJzY3JpYmUoc2VxLCBzKTsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19iaCgmc2VxLT5sb2NrKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZV91bmxvY2tfYmgoJm5hbWV0YmxfbG9jayk7Cit9CisKKy8qKgorICogbmFtZXRibF91bnN1YnNjcmliZSAtIHJlbW92ZSBhIHN1YnNjcmlwdGlvbiBvYmplY3QgZnJvbSBuYW1lIHRhYmxlCisgKi8KKwordm9pZAorbmFtZXRibF91bnN1YnNjcmliZShzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzKQoreworCXN0cnVjdCBuYW1lX3NlcSAqc2VxOworCisgICAgICAgIHdyaXRlX2xvY2tfYmgoJm5hbWV0YmxfbG9jayk7CisgICAgICAgIHNlcSA9IG5hbWV0YmxfZmluZF9zZXEocy0+c2VxLnR5cGUpOworCWlmIChzZXEgIT0gTlVMTCl7CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2JoKCZzZXEtPmxvY2spOworICAgICAgICAgICAgICAgIGxpc3RfZGVsX2luaXQoJnMtPm5hbWVzZXFfbGlzdCk7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfYmgoJnNlcS0+bG9jayk7CisgICAgICAgICAgICAgICAgaWYgKChzZXEtPmZpcnN0X2ZyZWUgPT0gMCkgJiYgbGlzdF9lbXB0eSgmc2VxLT5zdWJzY3JpcHRpb25zKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGxpc3RfZGVsX2luaXQoJnNlcS0+bnNfbGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShzZXEtPnNzZXFzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKHNlcSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdyaXRlX3VubG9ja19iaCgmbmFtZXRibF9sb2NrKTsKK30KKworCisvKioKKyAqIHN1YnNlcV9saXN0OiBwcmludCBzcGVjaWZpZWQgc3ViLXNlcXVlbmNlIGNvbnRlbnRzIGludG8gdGhlIGdpdmVuIGJ1ZmZlcgorICovCisKK3N0YXRpYyB2b2lkIHN1YnNlcV9saXN0KHN0cnVjdCBzdWJfc2VxICpzc2VxLCBzdHJ1Y3QgcHJpbnRfYnVmICpidWYsIHUzMiBkZXB0aCwKKwkJCXUzMiBpbmRleCkKK3sKKwljaGFyIHBvcnRJZFN0clsyN107CisJY2hhciAqc2NvcGVTdHI7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsID0gc3NlcS0+em9uZV9saXN0OworCisJdGlwY19wcmludGYoYnVmLCAiJS0xMHUgJS0xMHUgIiwgc3NlcS0+bG93ZXIsIHNzZXEtPnVwcGVyKTsKKworCWlmIChkZXB0aCA9PSAyIHx8ICFwdWJsKSB7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuIik7CisJCXJldHVybjsKKwl9CisKKwlkbyB7CisJCXNwcmludGYgKHBvcnRJZFN0ciwgIjwldS4ldS4ldToldT4iLAorCQkJIHRpcGNfem9uZShwdWJsLT5ub2RlKSwgdGlwY19jbHVzdGVyKHB1YmwtPm5vZGUpLAorCQkJIHRpcGNfbm9kZShwdWJsLT5ub2RlKSwgcHVibC0+cmVmKTsKKwkJdGlwY19wcmludGYoYnVmLCAiJS0yNnMgIiwgcG9ydElkU3RyKTsKKwkJaWYgKGRlcHRoID4gMykgeworCQkJaWYgKHB1YmwtPm5vZGUgIT0gdGlwY19vd25fYWRkcikKKwkJCQlzY29wZVN0ciA9ICIiOworCQkJZWxzZSBpZiAocHVibC0+c2NvcGUgPT0gVElQQ19OT0RFX1NDT1BFKQorCQkJCXNjb3BlU3RyID0gIm5vZGUiOworCQkJZWxzZSBpZiAocHVibC0+c2NvcGUgPT0gVElQQ19DTFVTVEVSX1NDT1BFKQorCQkJCXNjb3BlU3RyID0gImNsdXN0ZXIiOworCQkJZWxzZQorCQkJCXNjb3BlU3RyID0gInpvbmUiOworCQkJdGlwY19wcmludGYoYnVmLCAiJS0xMHUgJXMiLCBwdWJsLT5rZXksIHNjb3BlU3RyKTsKKwkJfQorCisJCXB1YmwgPSBwdWJsLT56b25lX2xpc3RfbmV4dDsKKwkJaWYgKHB1YmwgPT0gc3NlcS0+em9uZV9saXN0KQorCQkJYnJlYWs7CisKKwkJdGlwY19wcmludGYoYnVmLCAiXG4lMzNzIiwgIiAiKTsKKwl9IHdoaWxlICgxKTsKKworCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuIik7Cit9CisKKy8qKgorICogbmFtZXNlcV9saXN0OiBwcmludCBzcGVjaWZpZWQgbmFtZSBzZXF1ZW5jZSBjb250ZW50cyBpbnRvIHRoZSBnaXZlbiBidWZmZXIKKyAqLworCitzdGF0aWMgdm9pZCBuYW1lc2VxX2xpc3Qoc3RydWN0IG5hbWVfc2VxICpzZXEsIHN0cnVjdCBwcmludF9idWYgKmJ1ZiwgdTMyIGRlcHRoLAorCQkJIHUzMiB0eXBlLCB1MzIgbG93Ym91bmQsIHUzMiB1cGJvdW5kLCB1MzIgaW5kZXgpCit7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXE7CisJY2hhciB0eXBlYXJlYVsxMV07CisKKwlzcHJpbnRmKHR5cGVhcmVhLCAiJS0xMHUiLCBzZXEtPnR5cGUpOworCisJaWYgKGRlcHRoID09IDEpIHsKKwkJdGlwY19wcmludGYoYnVmLCAiJXNcbiIsIHR5cGVhcmVhKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoc3NlcSA9IHNlcS0+c3NlcXM7IHNzZXEgIT0gJnNlcS0+c3NlcXNbc2VxLT5maXJzdF9mcmVlXTsgc3NlcSsrKSB7CisJCWlmICgobG93Ym91bmQgPD0gc3NlcS0+dXBwZXIpICYmICh1cGJvdW5kID49IHNzZXEtPmxvd2VyKSkgeworCQkJdGlwY19wcmludGYoYnVmLCAiJXMgIiwgdHlwZWFyZWEpOworCQkJc3Vic2VxX2xpc3Qoc3NlcSwgYnVmLCBkZXB0aCwgaW5kZXgpOworCQkJc3ByaW50Zih0eXBlYXJlYSwgIiUxMHMiLCAiICIpOworCQl9CisJfQorfQorCisvKioKKyAqIG5hbWV0YmxfaGVhZGVyIC0gcHJpbnQgbmFtZSB0YWJsZSBoZWFkZXIgaW50byB0aGUgZ2l2ZW4gYnVmZmVyCisgKi8KKworc3RhdGljIHZvaWQgbmFtZXRibF9oZWFkZXIoc3RydWN0IHByaW50X2J1ZiAqYnVmLCB1MzIgZGVwdGgpCit7CisJdGlwY19wcmludGYoYnVmLCAiVHlwZSAgICAgICAiKTsKKworCWlmIChkZXB0aCA+IDEpCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIkxvd2VyICAgICAgVXBwZXIgICAgICAiKTsKKwlpZiAoZGVwdGggPiAyKQorCQl0aXBjX3ByaW50ZihidWYsICJQb3J0IElkZW50aXR5ICAgICAgICAgICAgICAiKTsKKwlpZiAoZGVwdGggPiAzKQorCQl0aXBjX3ByaW50ZihidWYsICJQdWJsaWNhdGlvbiIpOworCisJdGlwY19wcmludGYoYnVmLCAiXG4tLS0tLS0tLS0tLSIpOworCisJaWYgKGRlcHRoID4gMSkKKwkJdGlwY19wcmludGYoYnVmLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tICIpOworCWlmIChkZXB0aCA+IDIpCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICIpOworCWlmIChkZXB0aCA+IDMpCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIi0tLS0tLS0tLS0tLS0tLS0tLSIpOworCisJdGlwY19wcmludGYoYnVmLCAiXG4iKTsKK30KKworLyoqCisgKiBuYW1ldGJsX2xpc3QgLSBwcmludCBzcGVjaWZpZWQgbmFtZSB0YWJsZSBjb250ZW50cyBpbnRvIHRoZSBnaXZlbiBidWZmZXIKKyAqLworCitzdGF0aWMgdm9pZCBuYW1ldGJsX2xpc3Qoc3RydWN0IHByaW50X2J1ZiAqYnVmLCB1MzIgZGVwdGhfaW5mbywgCisJCQkgdTMyIHR5cGUsIHUzMiBsb3dib3VuZCwgdTMyIHVwYm91bmQpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKnNlcV9oZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpzZXFfbm9kZTsKKwlzdHJ1Y3QgbmFtZV9zZXEgKnNlcTsKKwlpbnQgYWxsX3R5cGVzOworCXUzMiBkZXB0aDsKKwl1MzIgaTsKKworCWFsbF90eXBlcyA9IChkZXB0aF9pbmZvICYgVElQQ19OVFFfQUxMVFlQRVMpOworCWRlcHRoID0gKGRlcHRoX2luZm8gJiB+VElQQ19OVFFfQUxMVFlQRVMpOworCisJaWYgKGRlcHRoID09IDApCisJCXJldHVybjsKKworCWlmIChhbGxfdHlwZXMpIHsKKwkJLyogZGlzcGxheSBhbGwgZW50cmllcyBpbiBuYW1lIHRhYmxlIHRvIHNwZWNpZmllZCBkZXB0aCAqLworCQluYW1ldGJsX2hlYWRlcihidWYsIGRlcHRoKTsKKwkJbG93Ym91bmQgPSAwOworCQl1cGJvdW5kID0gfjA7CisJCWZvciAoaSA9IDA7IGkgPCB0aXBjX25hbWV0Ymxfc2l6ZTsgaSsrKSB7CisJCQlzZXFfaGVhZCA9ICZ0YWJsZS50eXBlc1tpXTsKKwkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlcSwgc2VxX25vZGUsIHNlcV9oZWFkLCBuc19saXN0KSB7CisJCQkJbmFtZXNlcV9saXN0KHNlcSwgYnVmLCBkZXB0aCwgc2VxLT50eXBlLCAKKwkJCQkJICAgICBsb3dib3VuZCwgdXBib3VuZCwgaSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBkaXNwbGF5IG9ubHkgdGhlIHNlcXVlbmNlIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHR5cGUgKi8KKwkJaWYgKHVwYm91bmQgPCBsb3dib3VuZCkgeworCQkJdGlwY19wcmludGYoYnVmLCAiaW52YWxpZCBuYW1lIHNlcXVlbmNlIHNwZWNpZmllZFxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJbmFtZXRibF9oZWFkZXIoYnVmLCBkZXB0aCk7CisJCWkgPSBoYXNoKHR5cGUpOworCQlzZXFfaGVhZCA9ICZ0YWJsZS50eXBlc1tpXTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoc2VxLCBzZXFfbm9kZSwgc2VxX2hlYWQsIG5zX2xpc3QpIHsKKwkJCWlmIChzZXEtPnR5cGUgPT0gdHlwZSkgeworCQkJCW5hbWVzZXFfbGlzdChzZXEsIGJ1ZiwgZGVwdGgsIHR5cGUsIAorCQkJCQkgICAgIGxvd2JvdW5kLCB1cGJvdW5kLCBpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBuYW1ldGJsX3ByaW50KHN0cnVjdCBwcmludF9idWYgKmJ1ZiwgY29uc3QgY2hhciAqc3RyKQoreworCXRpcGNfcHJpbnRmKGJ1Ziwgc3RyKTsKKwlyZWFkX2xvY2tfYmgoJm5hbWV0YmxfbG9jayk7CisJbmFtZXRibF9saXN0KGJ1ZiwgMCwgMCwgMCwgMCk7CisJcmVhZF91bmxvY2tfYmgoJm5hbWV0YmxfbG9jayk7Cit9CisKKyNkZWZpbmUgTUFYX05BTUVfVEJMX1FVRVJZIDMyNzY4CisKK3N0cnVjdCBza19idWZmICpuYW1ldGJsX2dldChjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpcGNfbmFtZV90YWJsZV9xdWVyeSAqYXJndjsKKwlzdHJ1Y3QgdGx2X2Rlc2MgKnJlcF90bHY7CisJc3RydWN0IHByaW50X2J1ZiBiOworCWludCBzdHJfbGVuOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9OQU1FX1RCTF9RVUVSWSkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwlidWYgPSBjZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKE1BWF9OQU1FX1RCTF9RVUVSWSkpOworCWlmICghYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcF90bHYgPSAoc3RydWN0IHRsdl9kZXNjICopYnVmLT5kYXRhOworCXByaW50YnVmX2luaXQoJmIsIFRMVl9EQVRBKHJlcF90bHYpLCBNQVhfTkFNRV9UQkxfUVVFUlkpOworCWFyZ3YgPSAoc3RydWN0IHRpcGNfbmFtZV90YWJsZV9xdWVyeSAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJcmVhZF9sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCW5hbWV0YmxfbGlzdCgmYiwgbnRvaGwoYXJndi0+ZGVwdGgpLCBudG9obChhcmd2LT50eXBlKSwgCisJCSAgICAgbnRvaGwoYXJndi0+bG93Ym91bmQpLCBudG9obChhcmd2LT51cGJvdW5kKSk7CisJcmVhZF91bmxvY2tfYmgoJm5hbWV0YmxfbG9jayk7CisJc3RyX2xlbiA9IHByaW50YnVmX3ZhbGlkYXRlKCZiKTsKKworCXNrYl9wdXQoYnVmLCBUTFZfU1BBQ0Uoc3RyX2xlbikpOworCVRMVl9TRVQocmVwX3RsdiwgVElQQ19UTFZfVUxUUkFfU1RSSU5HLCBOVUxMLCBzdHJfbGVuKTsKKworCXJldHVybiBidWY7Cit9CisKK3ZvaWQgbmFtZXRibF9kdW1wKHZvaWQpCit7CisJbmFtZXRibF9saXN0KENPTlMsIDAsIDAsIDAsIDApOworfQorCitpbnQgbmFtZXRibF9pbml0KHZvaWQpCit7CisJaW50IGFycmF5X3NpemUgPSBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpICogdGlwY19uYW1ldGJsX3NpemU7CisKKwl0YWJsZS50eXBlcyA9IChzdHJ1Y3QgaGxpc3RfaGVhZCAqKWttYWxsb2MoYXJyYXlfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCF0YWJsZS50eXBlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3cml0ZV9sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCW1lbXNldCh0YWJsZS50eXBlcywgMCwgYXJyYXlfc2l6ZSk7CisJdGFibGUubG9jYWxfcHVibF9jb3VudCA9IDA7CisJd3JpdGVfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCXJldHVybiAwOworfQorCit2b2lkIG5hbWV0Ymxfc3RvcCh2b2lkKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpzZXFfaGVhZDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqc2VxX25vZGU7CisJc3RydWN0IGhsaXN0X25vZGUgKnRtcDsKKwlzdHJ1Y3QgbmFtZV9zZXEgKnNlcTsKKwl1MzIgaTsKKworCWlmICghdGFibGUudHlwZXMpCisJCXJldHVybjsKKworCXdyaXRlX2xvY2tfYmgoJm5hbWV0YmxfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IHRpcGNfbmFtZXRibF9zaXplOyBpKyspIHsKKwkJc2VxX2hlYWQgPSAmdGFibGUudHlwZXNbaV07CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2VxLCBzZXFfbm9kZSwgdG1wLCBzZXFfaGVhZCwgbnNfbGlzdCkgeworCQkJc3RydWN0IHN1Yl9zZXEgKnNzZXEgPSBzZXEtPnNzZXFzOworCisJCQlmb3IgKDsgc3NlcSAhPSAmc2VxLT5zc2Vxc1tzZXEtPmZpcnN0X2ZyZWVdOyBzc2VxKyspIHsKKwkJCQlzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwgPSBzc2VxLT56b25lX2xpc3Q7CisJCQkJYXNzZXJ0KHB1YmwpOworCQkJCWRvIHsKKwkJCQkJc3RydWN0IHB1YmxpY2F0aW9uICpuZXh0ID0KKwkJCQkJCXB1YmwtPnpvbmVfbGlzdF9uZXh0OworCQkJCQlrZnJlZShwdWJsKTsKKwkJCQkJcHVibCA9IG5leHQ7CisJCQkJfQorCQkJCXdoaWxlIChwdWJsICE9IHNzZXEtPnpvbmVfbGlzdCk7CisJCQl9CisJCX0KKwl9CisJa2ZyZWUodGFibGUudHlwZXMpOworCXRhYmxlLnR5cGVzID0gTlVMTDsKKwl3cml0ZV91bmxvY2tfYmgoJm5hbWV0YmxfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX3RhYmxlLmggYi9uZXQvdGlwYy9uYW1lX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyNjkzMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL25hbWVfdGFibGUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIG5ldC90aXBjL25hbWVfdGFibGUuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG5hbWUgdGFibGUgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfTkFNRV9UQUJMRV9ICisjZGVmaW5lIF9USVBDX05BTUVfVEFCTEVfSAorCisjaW5jbHVkZSAibm9kZV9zdWJzY3IuaCIKKworc3RydWN0IHN1YnNjcmlwdGlvbjsKK3N0cnVjdCBwb3J0X2xpc3Q7CisKKy8qCisgKiBUSVBDIG5hbWUgdHlwZXMgcmVzZXJ2ZWQgZm9yIGludGVybmFsIFRJUEMgdXNlIChib3RoIGN1cnJlbnQgYW5kIHBsYW5uZWQpCisgKi8KKworI2RlZmluZSBUSVBDX1pNX1NSViAzICAJCS8qIHpvbmUgbWFzdGVyIHNlcnZpY2UgbmFtZSB0eXBlICovCisKKworLyoqCisgKiBzdHJ1Y3QgcHVibGljYXRpb24gLSBpbmZvIGFib3V0IGEgcHVibGlzaGVkIChuYW1lIG9yKSBuYW1lIHNlcXVlbmNlCisgKiBAdHlwZTogbmFtZSBzZXF1ZW5jZSB0eXBlCisgKiBAbG93ZXI6IG5hbWUgc2VxdWVuY2UgbG93ZXIgYm91bmQKKyAqIEB1cHBlcjogbmFtZSBzZXF1ZW5jZSB1cHBlciBib3VuZAorICogQHNjb3BlOiBzY29wZSBvZiBwdWJsaWNhdGlvbgorICogQG5vZGU6IG5ldHdvcmsgYWRkcmVzcyBvZiBwdWJsaXNoaW5nIHBvcnQncyBub2RlCisgKiBAcmVmOiBwdWJsaXNoaW5nIHBvcnQKKyAqIEBrZXk6IHB1YmxpY2F0aW9uIGtleQorICogQHN1YnNjcjogc3Vic2NyaXB0aW9uIHRvICJub2RlIGRvd24iIGV2ZW50IChmb3Igb2ZmLW5vZGUgcHVibGljYXRpb25zIG9ubHkpCisgKiBAbG9jYWxfbGlzdDogYWRqYWNlbnQgZW50cmllcyBpbiBsaXN0IG9mIHB1YmxpY2F0aW9ucyBtYWRlIGJ5IHRoaXMgbm9kZQorICogQHBwb3J0X2xpc3Q6IGFkamFjZW50IGVudHJpZXMgaW4gbGlzdCBvZiBwdWJsaWNhdGlvbnMgbWFkZSBieSB0aGlzIHBvcnQKKyAqIEBub2RlX2xpc3Q6IG5leHQgbWF0Y2hpbmcgbmFtZSBzZXEgcHVibGljYXRpb24gd2l0aCA+PSBub2RlIHNjb3BlCisgKiBAY2x1c3Rlcl9saXN0OiBuZXh0IG1hdGNoaW5nIG5hbWUgc2VxIHB1YmxpY2F0aW9uIHdpdGggPj0gY2x1c3RlciBzY29wZQorICogQHpvbmVfbGlzdDogbmV4dCBtYXRjaGluZyBuYW1lIHNlcSBwdWJsaWNhdGlvbiB3aXRoID49IHpvbmUgc2NvcGUKKyAqIAorICogTm90ZSB0aGF0IHRoZSBub2RlIGxpc3QsIGNsdXN0ZXIgbGlzdCwgYW5kIHpvbmUgbGlzdCBhcmUgY2lyY3VsYXIgbGlzdHMuCisgKi8KKworc3RydWN0IHB1YmxpY2F0aW9uIHsKKwl1MzIgdHlwZTsKKwl1MzIgbG93ZXI7CisJdTMyIHVwcGVyOworCXUzMiBzY29wZTsKKwl1MzIgbm9kZTsKKwl1MzIgcmVmOworCXUzMiBrZXk7CisJc3RydWN0IG5vZGVfc3Vic2NyIHN1YnNjcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxvY2FsX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBwcG9ydF9saXN0OworCXN0cnVjdCBwdWJsaWNhdGlvbiAqbm9kZV9saXN0X25leHQ7CisJc3RydWN0IHB1YmxpY2F0aW9uICpjbHVzdGVyX2xpc3RfbmV4dDsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnpvbmVfbGlzdF9uZXh0OworfTsKKworCitleHRlcm4gcndsb2NrX3QgbmFtZXRibF9sb2NrOworCitzdHJ1Y3Qgc2tfYnVmZiAqbmFtZXRibF9nZXQoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSk7Cit1MzIgbmFtZXRibF90cmFuc2xhdGUodTMyIHR5cGUsIHUzMiBpbnN0YW5jZSwgdTMyICpub2RlKTsKK2ludCBuYW1ldGJsX21jX3RyYW5zbGF0ZSh1MzIgdHlwZSwgdTMyIGxvd2VyLCB1MzIgdXBwZXIsIHUzMiBsaW1pdCwgCisJCQkgc3RydWN0IHBvcnRfbGlzdCAqZHBvcnRzKTsKK2ludCBuYW1ldGJsX3B1Ymxpc2hfcnN2KHUzMiByZWYsIHVuc2lnbmVkIGludCBzY29wZSwgCisJCQlzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqc2VxKTsKK3N0cnVjdCBwdWJsaWNhdGlvbiAqbmFtZXRibF9wdWJsaXNoKHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwKKwkJCQkgICAgdTMyIHNjb3BlLCB1MzIgcG9ydF9yZWYsIHUzMiBrZXkpOworaW50IG5hbWV0Ymxfd2l0aGRyYXcodTMyIHR5cGUsIHUzMiBsb3dlciwgdTMyIHJlZiwgdTMyIGtleSk7CitzdHJ1Y3QgcHVibGljYXRpb24gKm5hbWV0YmxfaW5zZXJ0X3B1YmwodTMyIHR5cGUsIHUzMiBsb3dlciwgdTMyIHVwcGVyLAorCQkJCQl1MzIgc2NvcGUsIHUzMiBub2RlLCB1MzIgcmVmLCB1MzIga2V5KTsKK3N0cnVjdCBwdWJsaWNhdGlvbiAqbmFtZXRibF9yZW1vdmVfcHVibCh1MzIgdHlwZSwgdTMyIGxvd2VyLCAKKwkJCQkJdTMyIG5vZGUsIHUzMiByZWYsIHUzMiBrZXkpOwordm9pZCBuYW1ldGJsX3N1YnNjcmliZShzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzKTsKK3ZvaWQgbmFtZXRibF91bnN1YnNjcmliZShzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzKTsKK2ludCBuYW1ldGJsX2luaXQodm9pZCk7Cit2b2lkIG5hbWV0Ymxfc3RvcCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uZXQuYyBiL25ldC90aXBjL25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MjZiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9uZXQuYwpAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIG5ldC90aXBjL25ldC5jOiBUSVBDIG5ldHdvcmsgcm91dGluZyBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5NS0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiYmVhcmVyLmgiCisjaW5jbHVkZSAibmV0LmgiCisjaW5jbHVkZSAiem9uZS5oIgorI2luY2x1ZGUgImFkZHIuaCIKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisjaW5jbHVkZSAibmFtZV9kaXN0ci5oIgorI2luY2x1ZGUgInN1YnNjci5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJtc2cuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAiYmNhc3QuaCIKKyNpbmNsdWRlICJkaXNjb3Zlci5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisvKiAKKyAqIFRoZSBUSVBDIGxvY2tpbmcgcG9saWN5IGlzIGRlc2lnbmVkIHRvIGVuc3VyZSBhIHZlcnkgZmluZSBsb2NraW5nCisgKiBncmFudWxhcml0eSwgcGVybWl0dGluZyBjb21wbGV0ZSBwYXJhbGxlbCBhY2Nlc3MgdG8gaW5kaXZpZHVhbAorICogcG9ydCBhbmQgbm9kZS9saW5rIGluc3RhbmNlcy4gVGhlIGNvZGUgY29uc2lzdHMgb2YgdGhyZWUgbWFqb3IgCisgKiBsb2NraW5nIGRvbWFpbnMsIGVhY2ggcHJvdGVjdGVkIHdpdGggdGhlaXIgb3duIGRpc2p1bmN0IHNldCBvZiBsb2Nrcy4KKyAqCisgKiAxOiBUaGUgcm91dGluZyBoaWVyYXJjaHkuCisgKiAgICBDb21wcmlzZXMgdGhlIHN0cnVjdHVyZXMgJ3pvbmUnLCAnY2x1c3RlcicsICdub2RlJywgJ2xpbmsnIAorICogICAgYW5kICdiZWFyZXInLiBUaGUgd2hvbGUgaGllcmFyY2h5IGlzIHByb3RlY3RlZCBieSBhIGJpZyAKKyAqICAgIHJlYWQvd3JpdGUgbG9jaywgbmV0X2xvY2ssIHRvIGVuc3N1cmUgdGhhdCBub3RoaW5nIGlzIGFkZGVkIAorICogICAgb3IgcmVtb3ZlZCB3aGlsZSBjb2RlIGlzIGFjY2Vzc2luZyBhbnkgb2YgdGhlc2Ugc3RydWN0dXJlcy4gCisgKiAgICBUaGlzIGxheWVyIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIHRoZSB0d28gb3RoZXJzIHdoaWxlIHRoZXkgCisgKiAgICBob2xkIGFueSBvZiB0aGVpciBvd24gbG9ja3MuCisgKiAgICBOZWl0aGVyIG11c3QgaXQgaXRzZWxmIGRvIGFueSB1cGNhbGxzIHRvIHRoZSBvdGhlciB0d28gYmVmb3JlCisgKiAgICBpdCBoYXMgcmVsZWFzZWQgbmV0X2xvY2sgYW5kIG90aGVyIHByb3RlY3RpdmUgbG9ja3MuCisgKgorICogICBXaXRoaW4gdGhlIG5ldF9sb2NrIGRvbWFpbiB0aGVyZSBhcmUgdHdvIHN1Yi1kb21haW5zOydub2RlJyBhbmQgCisgKiAgICdiZWFyZXInLCB3aGVyZSBsb2NhbCB3cml0ZSBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQsCisgKiAgIHByb3ZpZGVkIHRoYXQgdGhvc2UgYXJlIHByb3RlY3RlZCBieSBpbmRpdmlkdWFsIHNwaW5fbG9ja3MKKyAqICAgcGVyIGluc3RhbmNlLiBDb2RlIGhvbGRpbmcgbmV0X2xvY2socmVhZCkgYW5kIGEgbm9kZSBzcGluX2xvY2sgCisgKiAgIGlzIHBlcm1pdHRlZCB0byBwb2tlIGFyb3VuZCBpbiBib3RoIHRoZSBub2RlIGl0c2VsZiBhbmQgaXRzCisgKiAgIHN1Ym9yZGluYXRlIGxpbmtzLiBJLmUsIGl0IGNhbiB1cGRhdGUgbGluayBjb3VudGVycyBhbmQgcXVldWVzLCAKKyAqICAgY2hhbmdlIGxpbmsgc3RhdGUsIHNlbmQgcHJvdG9jb2wgbWVzc2FnZXMsIGFuZCBhbHRlciB0aGUgCisgKiAgICJhY3RpdmVfbGlua3MiIGFycmF5IGluIHRoZSBub2RlOyBidXQgaXQgY2FuIF9ub3RfIHJlbW92ZSBhIGxpbmsgCisgKiAgIG9yIGEgbm9kZSBmcm9tIHRoZSBvdmVyYWxsIHN0cnVjdHVyZS4KKyAqICAgQ29ycmVzcG9uZGluZ2x5LCBpbmRpdmlkdWFsIGJlYXJlcnMgbWF5IGNoYW5nZSBzdGF0dXMgd2l0aGluIGEgCisgKiAgIG5ldF9sb2NrKHJlYWQpLCBwcm90ZWN0ZWQgYnkgYW4gaW5kaXZpZHVhbCBzcGluX2xvY2sgYmVyIGJlYXJlciAKKyAqICAgaW5zdGFuY2UsIGJ1dCBpdCBuZWVkcyBuZXRfbG9jayh3cml0ZSkgdG8gcmVtb3ZlL2FkZCBhbnkgYmVhcmVycy4KKyAqICAgICAKKyAqCisgKiAgMjogVGhlIHRyYW5zcG9ydCBsZXZlbCBvZiB0aGUgcHJvdG9jb2wuIAorICogICAgIFRoaXMgY29uc2lzdHMgb2YgdGhlIHN0cnVjdHVyZXMgcG9ydCwgKGFuZCBpdHMgdXNlciBsZXZlbCAKKyAqICAgICByZXByZXNlbnRhdGlvbnMsIHN1Y2ggYXMgdXNlcl9wb3J0IGFuZCB0aXBjX3NvY2spLCByZWZlcmVuY2UgYW5kIAorICogICAgIHRpcGNfdXNlciAocG9ydC5jLCByZWcuYywgc29ja2V0LmMpLiAKKyAqCisgKiAgICAgVGhpcyBsYXllciBoYXMgZm91ciBkaWZmZXJlbnQgbG9ja3M6CisgKiAgICAgLSBUaGUgdGlwY19wb3J0IHNwaW5fbG9jay4gVGhpcyBpcyBwcm90ZWN0aW5nIGVhY2ggcG9ydCBpbnN0YW5jZQorICogICAgICAgZnJvbSBwYXJhbGxlbCBkYXRhIGFjY2VzcyBhbmQgcmVtb3ZhbC4gU2luY2Ugd2UgY2FuIG5vdCBwbGFjZSAKKyAqICAgICAgIHRoaXMgbG9jayBpbiB0aGUgcG9ydCBpdHNlbGYsIGl0IGhhcyBiZWVuIHBsYWNlZCBpbiB0aGUgCisgKiAgICAgICBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZSB0YWJsZSBlbnRyeSwgd2hpY2ggaGFzIHRoZSBzYW1lIGxpZmUKKyAqICAgICAgIGN5Y2xlIGFzIHRoZSBtb2R1bGUuIFRoaXMgZW50cnkgaXMgZGlmZmljdWx0IHRvIGFjY2VzcyBmcm9tIAorICogICAgICAgb3V0c2lkZSB0aGUgVElQQyBjb3JlLCBob3dldmVyLCBzbyBhIHBvaW50ZXIgdG8gdGhlIGxvY2sgaGFzIAorICogICAgICAgYmVlbiBhZGRlZCBpbiB0aGUgcG9ydCBpbnN0YW5jZSwgLXRvIGJlIHVzZWQgZm9yIHVubG9ja2luZyAKKyAqICAgICAgIG9ubHkuCisgKiAgICAgLSBBIHJlYWQvd3JpdGUgbG9jayB0byBwcm90ZWN0IHRoZSByZWZlcmVuY2UgdGFibGUgaXRzZWxmICh0ZWcuYykuIAorICogICAgICAgKE5vYm9keSBpcyB1c2luZyByZWFkLW9ubHkgYWNjZXNzIHRvIHRoaXMsIHNvIGl0IGNhbiBqdXN0IGFzIAorICogICAgICAgd2VsbCBiZSBjaGFuZ2VkIHRvIGEgc3Bpbl9sb2NrKQorICogICAgIC0gQSBzcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgcmVnaXN0cnkgb2Yga2VybmVsL2RyaXZlciB1c2VycyAocmVnLmMpCisgKiAgICAgLSBBIGdsb2JhbCBzcGluX2xvY2sgKHBvcnRfbG9jayksIHdoaWNoIG9ubHkgdGFzayBpcyB0byBlbnN1cmUgCisgKiAgICAgICBjb25zaXN0ZW5jeSB3aGVyZSBtb3JlIHRoYW4gb25lIHBvcnQgaXMgaW52b2x2ZWQgaW4gYW4gb3BlcmF0aW9uLAorICogICAgICAgaS5lLiwgd2hlIGEgcG9ydCBpcyBwYXJ0IG9mIGEgbGlua2VkIGxpc3Qgb2YgcG9ydHMuCisgKiAgICAgICBUaGVyZSBhcmUgdHdvIHN1Y2ggbGlzdHM7ICdwb3J0X2xpc3QnLCB3aGljaCBpcyB1c2VkIGZvciBtYW5hZ2VtZW50LAorICogICAgICAgYW5kICd3YWl0X2xpc3QnLCB3aGljaCBpcyB1c2VkIHRvIHF1ZXVlIHBvcnRzIGR1cmluZyBjb25nZXN0aW9uLgorICogICAgIAorICogIDM6IFRoZSBuYW1lIHRhYmxlIChuYW1lX3RhYmxlLmMsIG5hbWVfZGlzdHIuYywgc3Vic2NyaXB0aW9uLmMpCisgKiAgICAgLSBUaGVyZSBpcyBvbmUgYmlnIHJlYWQvd3JpdGUtbG9jayAobmFtZXRibF9sb2NrKSBwcm90ZWN0aW5nIHRoZSAKKyAqICAgICAgIG92ZXJhbGwgbmFtZSB0YWJsZSBzdHJ1Y3R1cmUuIE5vdGhpbmcgbXVzdCBiZSBhZGRlZC9yZW1vdmVkIHRvIAorICogICAgICAgdGhpcyBzdHJ1Y3R1cmUgd2l0aG91dCBob2xkaW5nIHdyaXRlIGFjY2VzcyB0byBpdC4KKyAqICAgICAtIFRoZXJlIGlzIG9uZSBsb2NhbCBzcGluX2xvY2sgcGVyIHN1Yl9zZXF1ZW5jZSwgd2hpY2ggY2FuIGJlIHNlZW4KKyAqICAgICAgIGFzIGEgc3ViLWRvbWFpbiB0byB0aGUgbmFtZXRibF9sb2NrIGRvbWFpbi4gSXQgaXMgdXNlZCBvbmx5CisgKiAgICAgICBmb3IgdHJhbnNsYXRpb24gb3BlcmF0aW9ucywgYW5kIGlzIG5lZWRlZCBiZWNhdXNlIGEgdHJhbnNsYXRpb24KKyAqICAgICAgIHN0ZXBzIHRoZSByb290IG9mIHRoZSAncHVibGljYXRpb24nIGxpbmtlZCBsaXN0IGJldHdlZW4gZWFjaCBsb29rdXAuCisgKiAgICAgICBUaGlzIGlzIGFsd2F5cyB1c2VkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBuYW1ldGJsX2xvY2socmVhZCkuCisgKiAgICAgLSBBIGxvY2FsIHNwaW5fbG9jayBwcm90ZWN0aW5nIHRoZSBxdWV1ZSBvZiBzdWJzY3JpYmVyIGV2ZW50cy4KKyovCisKK3J3bG9ja190IG5ldF9sb2NrID0gUldfTE9DS19VTkxPQ0tFRDsKK3N0cnVjdCBuZXR3b3JrIG5ldCA9IHsgMCB9OworCitzdHJ1Y3Qgbm9kZSAqbmV0X3NlbGVjdF9yZW1vdGVfbm9kZSh1MzIgYWRkciwgdTMyIHJlZikgCit7CisJcmV0dXJuIHpvbmVfc2VsZWN0X3JlbW90ZV9ub2RlKG5ldC56b25lc1t0aXBjX3pvbmUoYWRkcildLCBhZGRyLCByZWYpOworfQorCit1MzIgbmV0X3NlbGVjdF9yb3V0ZXIodTMyIGFkZHIsIHUzMiByZWYpCit7CisJcmV0dXJuIHpvbmVfc2VsZWN0X3JvdXRlcihuZXQuem9uZXNbdGlwY196b25lKGFkZHIpXSwgYWRkciwgcmVmKTsKK30KKworCit1MzIgbmV0X25leHRfbm9kZSh1MzIgYSkKK3sKKwlpZiAobmV0LnpvbmVzW3RpcGNfem9uZShhKV0pCisJCXJldHVybiB6b25lX25leHRfbm9kZShhKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZXRfcmVtb3ZlX2FzX3JvdXRlcih1MzIgcm91dGVyKQoreworCXUzMiB6X251bTsKKworCWZvciAoel9udW0gPSAxOyB6X251bSA8PSB0aXBjX21heF96b25lczsgel9udW0rKykgeworCQlpZiAoIW5ldC56b25lc1t6X251bV0pCisJCQljb250aW51ZTsKKwkJem9uZV9yZW1vdmVfYXNfcm91dGVyKG5ldC56b25lc1t6X251bV0sIHJvdXRlcik7CisJfQorfQorCit2b2lkIG5ldF9zZW5kX2V4dGVybmFsX3JvdXRlcyh1MzIgZGVzdCkKK3sKKwl1MzIgel9udW07CisKKwlmb3IgKHpfbnVtID0gMTsgel9udW0gPD0gdGlwY19tYXhfem9uZXM7IHpfbnVtKyspIHsKKwkJaWYgKG5ldC56b25lc1t6X251bV0pCisJCQl6b25lX3NlbmRfZXh0ZXJuYWxfcm91dGVzKG5ldC56b25lc1t6X251bV0sIGRlc3QpOworCX0KK30KKworaW50IG5ldF9pbml0KHZvaWQpCit7CisJdTMyIHN6ID0gc2l6ZW9mKHN0cnVjdCBfem9uZSAqKSAqICh0aXBjX21heF96b25lcyArIDEpOworCisJbWVtc2V0KCZuZXQsIDAsIHNpemVvZihuZXQpKTsKKwluZXQuem9uZXMgPSAoc3RydWN0IF96b25lICoqKWttYWxsb2Moc3osIEdGUF9BVE9NSUMpOworCWlmICghbmV0LnpvbmVzKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQobmV0LnpvbmVzLCAwLCBzeik7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK3ZvaWQgbmV0X3N0b3Aodm9pZCkKK3sKKwl1MzIgel9udW07CisKKwlpZiAoIW5ldC56b25lcykKKwkJcmV0dXJuOworCisJZm9yICh6X251bSA9IDE7IHpfbnVtIDw9IHRpcGNfbWF4X3pvbmVzOyB6X251bSsrKSB7CisJCXpvbmVfZGVsZXRlKG5ldC56b25lc1t6X251bV0pOworCX0KKwlrZnJlZShuZXQuem9uZXMpOworCW5ldC56b25lcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9yb3V0ZV9uYW1lZF9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwl1MzIgZG5vZGU7CisJdTMyIGRwb3J0OworCisJaWYgKCFtc2dfbmFtZWQobXNnKSkgeworCQltc2dfZGJnKG1zZywgIm5ldC0+ZHJvcF9uYW06Iik7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCXJldHVybjsKKwl9CisKKwlkbm9kZSA9IGFkZHJfZG9tYWluKG1zZ19sb29rdXBfc2NvcGUobXNnKSk7CisJZHBvcnQgPSBuYW1ldGJsX3RyYW5zbGF0ZShtc2dfbmFtZXR5cGUobXNnKSwgbXNnX25hbWVpbnN0KG1zZyksICZkbm9kZSk7CisJZGJnKCJuZXQtPmxvb2t1cDwldSwldT4tPjwldSwleD5cbiIsCisJICAgIG1zZ19uYW1ldHlwZShtc2cpLCBtc2dfbmFtZWluc3QobXNnKSwgZHBvcnQsIGRub2RlKTsKKwlpZiAoZHBvcnQpIHsKKwkJbXNnX3NldF9kZXN0bm9kZShtc2csIGRub2RlKTsKKwkJbXNnX3NldF9kZXN0cG9ydChtc2csIGRwb3J0KTsKKwkJbmV0X3JvdXRlX21zZyhidWYpOworCQlyZXR1cm47CisJfQorCW1zZ19kYmcobXNnLCAibmV0LT5yZWo6Tk8gTkFNRTogIik7CisJdGlwY19yZWplY3RfbXNnKGJ1ZiwgVElQQ19FUlJfTk9fTkFNRSk7Cit9CisKK3ZvaWQgbmV0X3JvdXRlX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCXUzMiBkbm9kZTsKKworCWlmICghYnVmKQorCQlyZXR1cm47CisJbXNnID0gYnVmX21zZyhidWYpOworCisJbXNnX2luY3JfcmVyb3V0ZV9jbnQobXNnKTsKKwlpZiAobXNnX3Jlcm91dGVfY250KG1zZykgPiA2KSB7CisJCWlmIChtc2dfZXJyY29kZShtc2cpKSB7CisJCQltc2dfZGJnKG1zZywgIk5FVD5ESVNDPjoiKTsKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCX0gZWxzZSB7CisJCQltc2dfZGJnKG1zZywgIk5FVD5SRUo+OiIpOworCQkJdGlwY19yZWplY3RfbXNnKGJ1ZiwgbXNnX2Rlc3Rwb3J0KG1zZykgPyAKKwkJCQkJVElQQ19FUlJfTk9fUE9SVCA6IFRJUENfRVJSX05PX05BTUUpOworCQl9CisJCXJldHVybjsKKwl9CisKKwltc2dfZGJnKG1zZywgIm5ldC0+cm91dDogIik7CisKKwkvKiBIYW5kbGUgbWVzc2FnZSBmb3IgdGhpcyBub2RlICovCisJZG5vZGUgPSBtc2dfc2hvcnQobXNnKSA/IHRpcGNfb3duX2FkZHIgOiBtc2dfZGVzdG5vZGUobXNnKTsKKwlpZiAoaW5fc2NvcGUoZG5vZGUsIHRpcGNfb3duX2FkZHIpKSB7CisJCWlmIChtc2dfaXNkYXRhKG1zZykpIHsKKwkJCWlmIChtc2dfbWNhc3QobXNnKSkgCisJCQkJcG9ydF9yZWN2X21jYXN0KGJ1ZiwgTlVMTCk7CisJCQllbHNlIGlmIChtc2dfZGVzdHBvcnQobXNnKSkKKwkJCQlwb3J0X3JlY3ZfbXNnKGJ1Zik7CisJCQllbHNlCisJCQkJbmV0X3JvdXRlX25hbWVkX21zZyhidWYpOworCQkJcmV0dXJuOworCQl9CisJCXN3aXRjaCAobXNnX3VzZXIobXNnKSkgeworCQljYXNlIFJPVVRFX0RJU1RSSUJVVE9SOgorCQkJY2x1c3Rlcl9yZWN2X3JvdXRpbmdfdGFibGUoYnVmKTsKKwkJCWJyZWFrOworCQljYXNlIE5BTUVfRElTVFJJQlVUT1I6CisJCQluYW1lZF9yZWN2KGJ1Zik7CisJCQlicmVhazsKKwkJY2FzZSBDT05OX01BTkFHRVI6CisJCQlwb3J0X3JlY3ZfcHJvdG9fbXNnKGJ1Zik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1zZ19kYmcobXNnLCJEUk9QL05FVC88UkVDPCIpOworCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogSGFuZGxlIG1lc3NhZ2UgZm9yIGFub3RoZXIgbm9kZSAqLworCW1zZ19kYmcobXNnLCAiTkVUPlNFTkQ+OiAiKTsKKwlsaW5rX3NlbmQoYnVmLCBkbm9kZSwgbXNnX2xpbmtfc2VsZWN0b3IobXNnKSk7Cit9CisKK2ludCB0aXBjX3N0YXJ0X25ldCh2b2lkKQoreworCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCWludCByZXM7CisKKwlpZiAodGlwY19tb2RlICE9IFRJUENfTk9ERV9NT0RFKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJdGlwY19tb2RlID0gVElQQ19ORVRfTU9ERTsKKwluYW1lZF9yZWluaXQoKTsKKwlwb3J0X3JlaW5pdCgpOworCisJaWYgKChyZXMgPSBiZWFyZXJfaW5pdCgpKSB8fAorCSAgICAocmVzID0gbmV0X2luaXQoKSkgfHwKKwkgICAgKHJlcyA9IGNsdXN0ZXJfaW5pdCgpKSB8fAorCSAgICAocmVzID0gYmNsaW5rX2luaXQoKSkpIHsKKwkJcmV0dXJuIHJlczsKKwl9CisgICAgICAgIHN1YnNjcl9zdG9wKCk7CisJY2ZnX3N0b3AoKTsKKwlrX3NpZ25hbCgoSGFuZGxlcilzdWJzY3Jfc3RhcnQsIDApOworCWtfc2lnbmFsKChIYW5kbGVyKWNmZ19pbml0LCAwKTsKKwlpbmZvKCJTdGFydGVkIGluIG5ldHdvcmsgbW9kZVxuIik7CisJaW5mbygiT3duIG5vZGUgYWRkcmVzcyAlcywgbmV0d29yayBpZGVudGl0eSAldVxuIiwKKwkgICAgIGFkZHJfc3RyaW5nX2ZpbGwoYWRkcl9zdHJpbmcsIHRpcGNfb3duX2FkZHIpLCB0aXBjX25ldF9pZCk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK3ZvaWQgdGlwY19zdG9wX25ldCh2b2lkKQoreworCWlmICh0aXBjX21vZGUgIT0gVElQQ19ORVRfTU9ERSkKKwkJcmV0dXJuOworICAgICAgICB3cml0ZV9sb2NrX2JoKCZuZXRfbG9jayk7CisJYmVhcmVyX3N0b3AoKTsKKwl0aXBjX21vZGUgPSBUSVBDX05PREVfTU9ERTsKKwliY2xpbmtfc3RvcCgpOworCW5ldF9zdG9wKCk7CisgICAgICAgIHdyaXRlX3VubG9ja19iaCgmbmV0X2xvY2spOworCWluZm8oIkxlZnQgbmV0d29yayBtb2RlIFxuIik7Cit9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL25ldC5oIGIvbmV0L3RpcGMvbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4YzZkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9uZXQuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogbmV0L3RpcGMvbmV0Lmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBuZXR3b3JrIHJvdXRpbmcgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX05FVF9ICisjZGVmaW5lIF9USVBDX05FVF9ICisKK3N0cnVjdCBfem9uZTsKKworLyoqCisgKiBzdHJ1Y3QgbmV0d29yayAtIFRJUEMgbmV0d29yayBzdHJ1Y3R1cmUKKyAqIEB6b25lczogYXJyYXkgb2YgcG9pbnRlcnMgdG8gYWxsIHpvbmVzIHdpdGhpbiBuZXR3b3JrCisgKi8KKyAKK3N0cnVjdCBuZXR3b3JrIHsKKwlzdHJ1Y3QgX3pvbmUgKip6b25lczsKK307CisKKworZXh0ZXJuIHN0cnVjdCBuZXR3b3JrIG5ldDsKK2V4dGVybiByd2xvY2tfdCBuZXRfbG9jazsKKworaW50IG5ldF9pbml0KHZvaWQpOwordm9pZCBuZXRfc3RvcCh2b2lkKTsKK3ZvaWQgbmV0X3JlbW92ZV9hc19yb3V0ZXIodTMyIHJvdXRlcik7Cit2b2lkIG5ldF9zZW5kX2V4dGVybmFsX3JvdXRlcyh1MzIgZGVzdCk7Cit2b2lkIG5ldF9yb3V0ZV9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CitzdHJ1Y3Qgbm9kZSAqbmV0X3NlbGVjdF9yZW1vdGVfbm9kZSh1MzIgYWRkciwgdTMyIHJlZik7Cit1MzIgbmV0X3NlbGVjdF9yb3V0ZXIodTMyIGFkZHIsIHUzMiByZWYpOworCitpbnQgdGlwY19zdGFydF9uZXQodm9pZCk7Cit2b2lkIHRpcGNfc3RvcF9uZXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbmV0bGluay5jIGIvbmV0L3RpcGMvbmV0bGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjNmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9uZXRsaW5rLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBuZXQvdGlwYy9uZXRsaW5rLmM6IFRJUEMgY29uZmlndXJhdGlvbiBoYW5kbGluZworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKworc3RhdGljIGludCBoYW5kbGVfY21kKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IHNrX2J1ZmYgKnJlcF9idWY7CisJc3RydWN0IG5sbXNnaGRyICpyZXBfbmxoOworCXN0cnVjdCBubG1zZ2hkciAqcmVxX25saCA9IGluZm8tPm5saGRyOworCXN0cnVjdCB0aXBjX2dlbmxtc2doZHIgKnJlcV91c2VyaGRyID0gaW5mby0+dXNlcmhkcjsKKwlpbnQgaGRyX3NwYWNlID0gTkxNU0dfU1BBQ0UoR0VOTF9IRFJMRU4gKyBUSVBDX0dFTkxfSERSTEVOKTsKKworCWlmICgocmVxX3VzZXJoZHItPmNtZCAmIDB4QzAwMCkgJiYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSkKKwkJcmVwX2J1ZiA9IGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX05FVF9BRE1JTik7CisJZWxzZQorCQlyZXBfYnVmID0gY2ZnX2RvX2NtZChyZXFfdXNlcmhkci0+ZGVzdCwKKwkJCQkgICAgIHJlcV91c2VyaGRyLT5jbWQsCisJCQkJICAgICBOTE1TR19EQVRBKHJlcV9ubGgpICsgR0VOTF9IRFJMRU4gKyBUSVBDX0dFTkxfSERSTEVOLAorCQkJCSAgICAgTkxNU0dfUEFZTE9BRChyZXFfbmxoLCBHRU5MX0hEUkxFTiArIFRJUENfR0VOTF9IRFJMRU4pLAorCQkJCSAgICAgaGRyX3NwYWNlKTsKKworCWlmIChyZXBfYnVmKSB7CisJCXNrYl9wdXNoKHJlcF9idWYsIGhkcl9zcGFjZSk7CisJCXJlcF9ubGggPSAoc3RydWN0IG5sbXNnaGRyICopcmVwX2J1Zi0+ZGF0YTsKKwkJbWVtY3B5KHJlcF9ubGgsIHJlcV9ubGgsIGhkcl9zcGFjZSk7CisJCXJlcF9ubGgtPm5sbXNnX2xlbiA9IHJlcF9idWYtPmxlbjsKKwkJZ2VubG1zZ191bmljYXN0KHJlcF9idWYsIHJlcV9ubGgtPm5sbXNnX3BpZCk7CisJfQorCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IGZhbWlseSA9IHsKKyAgICAgICAgLmlkCQk9IEdFTkxfSURfR0VORVJBVEUsCisgICAgICAgIC5uYW1lCQk9IFRJUENfR0VOTF9OQU1FLAorICAgICAgICAudmVyc2lvbgk9IFRJUENfR0VOTF9WRVJTSU9OLAorICAgICAgICAuaGRyc2l6ZQk9IFRJUENfR0VOTF9IRFJMRU4sCisgICAgICAgIC5tYXhhdHRyCT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9vcHMgb3BzID0geworCS5jbWQJCT0gVElQQ19HRU5MX0NNRCwKKwkuZG9pdAkJPSBoYW5kbGVfY21kLAorfTsKKworc3RhdGljIGludCBmYW1pbHlfcmVnaXN0ZXJlZCA9IDA7CisKK2ludCBuZXRsaW5rX3N0YXJ0KHZvaWQpCit7CisKKworCWlmIChnZW5sX3JlZ2lzdGVyX2ZhbWlseSgmZmFtaWx5KSkKKwkJZ290byBlcnI7CisKKwlmYW1pbHlfcmVnaXN0ZXJlZCA9IDE7CisKKwlpZiAoZ2VubF9yZWdpc3Rlcl9vcHMoJmZhbWlseSwgJm9wcykpCisJCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisKKyAgICAgICAgcmV0dXJuIDA7CisKKyBlcnJfdW5yZWdpc3RlcjoKKwlnZW5sX3VucmVnaXN0ZXJfZmFtaWx5KCZmYW1pbHkpOworCWZhbWlseV9yZWdpc3RlcmVkID0gMDsKKyBlcnI6CisJZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgbmV0bGluayBpbnRlcmZhY2VcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorCit2b2lkIG5ldGxpbmtfc3RvcCh2b2lkKQoreworCWlmIChmYW1pbHlfcmVnaXN0ZXJlZCkgeworCQlnZW5sX3VucmVnaXN0ZXJfZmFtaWx5KCZmYW1pbHkpOworCQlmYW1pbHlfcmVnaXN0ZXJlZCA9IDA7CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbm9kZS5jIGIvbmV0L3RpcGMvbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Njg4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9ub2RlLmMKQEAgLTAsMCArMSw2NzkgQEAKKy8qCisgKiBuZXQvdGlwYy9ub2RlLmM6IFRJUEMgbm9kZSBtYW5hZ2VtZW50IHJvdXRpbmVzCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibm9kZS5oIgorI2luY2x1ZGUgImNsdXN0ZXIuaCIKKyNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAibm9kZV9zdWJzY3IuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorI2luY2x1ZGUgIm5hbWVfZGlzdHIuaCIKKyNpbmNsdWRlICJuZXQuaCIKKwordm9pZCBub2RlX3ByaW50KHN0cnVjdCBwcmludF9idWYgKmJ1Ziwgc3RydWN0IG5vZGUgKm5fcHRyLCBjaGFyICpzdHIpOworc3RhdGljIHZvaWQgbm9kZV9sb3N0X2NvbnRhY3Qoc3RydWN0IG5vZGUgKm5fcHRyKTsKK3N0YXRpYyB2b2lkIG5vZGVfZXN0YWJsaXNoZWRfY29udGFjdChzdHJ1Y3Qgbm9kZSAqbl9wdHIpOworCitzdHJ1Y3Qgbm9kZSAqbm9kZXMgPSBOVUxMOwkvKiBzb3J0ZWQgbGlzdCBvZiBub2RlcyB3aXRoaW4gY2x1c3RlciAqLworCit1MzIgdGlwY19vd25fdGFnID0gMDsKKworc3RydWN0IG5vZGUgKm5vZGVfY3JlYXRlKHUzMiBhZGRyKQoreworCXN0cnVjdCBjbHVzdGVyICpjX3B0cjsKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CisgICAgICAgIHN0cnVjdCBub2RlICoqY3Vycl9ub2RlOworCisJbl9wdHIgPSBrbWFsbG9jKHNpemVvZigqbl9wdHIpLEdGUF9BVE9NSUMpOworICAgICAgICBpZiAobl9wdHIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1lbXNldChuX3B0ciwgMCwgc2l6ZW9mKCpuX3B0cikpOworICAgICAgICAgICAgICAgIG5fcHRyLT5hZGRyID0gYWRkcjsKKyAgICAgICAgICAgICAgICBuX3B0ci0+bG9jayA9ICBTUElOX0xPQ0tfVU5MT0NLRUQ7CQorICAgICAgICAgICAgICAgIElOSVRfTElTVF9IRUFEKCZuX3B0ci0+bnN1Yik7CisJCisJCWNfcHRyID0gY2x1c3Rlcl9maW5kKGFkZHIpOworICAgICAgICAgICAgICAgIGlmIChjX3B0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgY19wdHIgPSBjbHVzdGVyX2NyZWF0ZShhZGRyKTsKKyAgICAgICAgICAgICAgICBpZiAoY19wdHIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbl9wdHItPm93bmVyID0gY19wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2F0dGFjaF9ub2RlKGNfcHRyLCBuX3B0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBuX3B0ci0+bGFzdF9yb3V0ZXIgPSAtMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zZXJ0IG5vZGUgaW50byBvcmRlcmVkIGxpc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY3Vycl9ub2RlID0gJm5vZGVzOyAqY3Vycl9ub2RlOyAKKwkJCSAgICAgY3Vycl9ub2RlID0gJigqY3Vycl9ub2RlKS0+bmV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkciA8ICgqY3Vycl9ub2RlKS0+YWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fcHRyLT5uZXh0ID0gKmN1cnJfbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKCpjdXJyX25vZGUpID0gbl9wdHI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKG5fcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5fcHRyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKwlyZXR1cm4gbl9wdHI7Cit9CisKK3ZvaWQgbm9kZV9kZWxldGUoc3RydWN0IG5vZGUgKm5fcHRyKQoreworCWlmICghbl9wdHIpCisJCXJldHVybjsKKworI2lmIDAKKwkvKiBOb3QgbmVlZGVkIGJlY2F1c2UgbGlua3MgYXJlIGFscmVhZHkgZGVsZXRlZCB2aWEgYmVhcmVyX3N0b3AoKSAqLworCisJdTMyIGxfbnVtOworCisJZm9yIChsX251bSA9IDA7IGxfbnVtIDwgTUFYX0JFQVJFUlM7IGxfbnVtKyspIHsKKwkJbGlua19kZWxldGUobl9wdHItPmxpbmtzW2xfbnVtXSk7CisJfQorI2VuZGlmCisKKwlkYmcoIm5vZGUgJXggZGVsZXRlZFxuIiwgbl9wdHItPmFkZHIpOworCWtmcmVlKG5fcHRyKTsKK30KKworCisvKioKKyAqIG5vZGVfbGlua191cCAtIGhhbmRsZSBhZGRpdGlvbiBvZiBsaW5rCisgKiAKKyAqIExpbmsgYmVjb21lcyBhY3RpdmUgKGFsb25lIG9yIHNoYXJlZCkgb3Igc3RhbmRieSwgZGVwZW5kaW5nIG9uIGl0cyBwcmlvcml0eS4KKyAqLworCit2b2lkIG5vZGVfbGlua191cChzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlzdHJ1Y3QgbGluayAqKmFjdGl2ZSA9ICZuX3B0ci0+YWN0aXZlX2xpbmtzWzBdOworCisJaW5mbygiRXN0YWJsaXNoZWQgbGluayA8JXM+IG9uIG5ldHdvcmsgcGxhbmUgJWNcbiIsCisJICAgICBsX3B0ci0+bmFtZSwgbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUpOworCQorCWlmICghYWN0aXZlWzBdKSB7CisJCWRiZygiIGxpbmsgJXggaW50byAleC8leFxuIiwgbF9wdHIsICZhY3RpdmVbMF0sICZhY3RpdmVbMV0pOworCQlhY3RpdmVbMF0gPSBhY3RpdmVbMV0gPSBsX3B0cjsKKwkJbm9kZV9lc3RhYmxpc2hlZF9jb250YWN0KG5fcHRyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobF9wdHItPnByaW9yaXR5IDwgYWN0aXZlWzBdLT5wcmlvcml0eSkgeyAKKwkJaW5mbygiTGluayBpcyBzdGFuZGJ5XG4iKTsKKwkJcmV0dXJuOworCX0KKwlsaW5rX3NlbmRfZHVwbGljYXRlKGFjdGl2ZVswXSwgbF9wdHIpOworCWlmIChsX3B0ci0+cHJpb3JpdHkgPT0gYWN0aXZlWzBdLT5wcmlvcml0eSkgeyAKKwkJYWN0aXZlWzBdID0gbF9wdHI7CisJCXJldHVybjsKKwl9CisJaW5mbygiTGluayA8JXM+IG9uIG5ldHdvcmsgcGxhbmUgJWMgYmVjb21lcyBzdGFuZGJ5XG4iLAorCSAgICAgYWN0aXZlWzBdLT5uYW1lLCBhY3RpdmVbMF0tPmJfcHRyLT5uZXRfcGxhbmUpOworCWFjdGl2ZVswXSA9IGFjdGl2ZVsxXSA9IGxfcHRyOworfQorCisvKioKKyAqIG5vZGVfc2VsZWN0X2FjdGl2ZV9saW5rcyAtIHNlbGVjdCBhY3RpdmUgbGluaworICovCisKK3N0YXRpYyB2b2lkIG5vZGVfc2VsZWN0X2FjdGl2ZV9saW5rcyhzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJc3RydWN0IGxpbmsgKiphY3RpdmUgPSAmbl9wdHItPmFjdGl2ZV9saW5rc1swXTsKKwl1MzIgaTsKKwl1MzIgaGlnaGVzdF9wcmlvID0gMDsKKworICAgICAgICBhY3RpdmVbMF0gPSBhY3RpdmVbMV0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgbGluayAqbF9wdHIgPSBuX3B0ci0+bGlua3NbaV07CisKKwkJaWYgKCFsX3B0ciB8fCAhbGlua19pc191cChsX3B0cikgfHwKKwkJICAgIChsX3B0ci0+cHJpb3JpdHkgPCBoaWdoZXN0X3ByaW8pKQorCQkJY29udGludWU7CisKKwkJaWYgKGxfcHRyLT5wcmlvcml0eSA+IGhpZ2hlc3RfcHJpbykgeworICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdF9wcmlvID0gbF9wdHItPnByaW9yaXR5OworCQkJYWN0aXZlWzBdID0gYWN0aXZlWzFdID0gbF9wdHI7CisJCX0gZWxzZSB7CisJCQlhY3RpdmVbMV0gPSBsX3B0cjsKKwkJfQorCX0KK30KKworLyoqCisgKiBub2RlX2xpbmtfZG93biAtIGhhbmRsZSBsb3NzIG9mIGxpbmsKKyAqLworCit2b2lkIG5vZGVfbGlua19kb3duKHN0cnVjdCBub2RlICpuX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXN0cnVjdCBsaW5rICoqYWN0aXZlOworCisJaWYgKCFsaW5rX2lzX2FjdGl2ZShsX3B0cikpIHsKKwkJaW5mbygiTG9zdCBzdGFuZGJ5IGxpbmsgPCVzPiBvbiBuZXR3b3JrIHBsYW5lICVjXG4iLAorCQkgICAgIGxfcHRyLT5uYW1lLCBsX3B0ci0+Yl9wdHItPm5ldF9wbGFuZSk7CisJCXJldHVybjsKKwl9CisJaW5mbygiTG9zdCBsaW5rIDwlcz4gb24gbmV0d29yayBwbGFuZSAlY1xuIiwKKwkJbF9wdHItPm5hbWUsIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lKTsKKworCWFjdGl2ZSA9ICZuX3B0ci0+YWN0aXZlX2xpbmtzWzBdOworCWlmIChhY3RpdmVbMF0gPT0gbF9wdHIpCisJCWFjdGl2ZVswXSA9IGFjdGl2ZVsxXTsKKwlpZiAoYWN0aXZlWzFdID09IGxfcHRyKQorCQlhY3RpdmVbMV0gPSBhY3RpdmVbMF07CisJaWYgKGFjdGl2ZVswXSA9PSBsX3B0cikKKwkJbm9kZV9zZWxlY3RfYWN0aXZlX2xpbmtzKG5fcHRyKTsKKwlpZiAobm9kZV9pc191cChuX3B0cikpIAorCQlsaW5rX2NoYW5nZW92ZXIobF9wdHIpOworCWVsc2UgCisJCW5vZGVfbG9zdF9jb250YWN0KG5fcHRyKTsKK30KKworaW50IG5vZGVfaGFzX2FjdGl2ZV9saW5rcyhzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJcmV0dXJuIChuX3B0ciAmJiAKKwkJKChuX3B0ci0+YWN0aXZlX2xpbmtzWzBdKSB8fCAobl9wdHItPmFjdGl2ZV9saW5rc1sxXSkpKTsKK30KKworaW50IG5vZGVfaGFzX3JlZHVuZGFudF9saW5rcyhzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJcmV0dXJuIChub2RlX2hhc19hY3RpdmVfbGlua3Mobl9wdHIpICYmCisJCShuX3B0ci0+YWN0aXZlX2xpbmtzWzBdICE9IG5fcHRyLT5hY3RpdmVfbGlua3NbMV0pKTsKK30KKworaW50IG5vZGVfaGFzX2FjdGl2ZV9yb3V0ZXMoc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXJldHVybiAobl9wdHIgJiYgKG5fcHRyLT5sYXN0X3JvdXRlciA+PSAwKSk7Cit9CisKK2ludCBub2RlX2lzX3VwKHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwlyZXR1cm4gKG5vZGVfaGFzX2FjdGl2ZV9saW5rcyhuX3B0cikgfHwgbm9kZV9oYXNfYWN0aXZlX3JvdXRlcyhuX3B0cikpOworfQorCitzdHJ1Y3Qgbm9kZSAqbm9kZV9hdHRhY2hfbGluayhzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJc3RydWN0IG5vZGUgKm5fcHRyID0gbm9kZV9maW5kKGxfcHRyLT5hZGRyKTsKKworCWlmICghbl9wdHIpCisJCW5fcHRyID0gbm9kZV9jcmVhdGUobF9wdHItPmFkZHIpOworICAgICAgICBpZiAobl9wdHIpIHsKKwkJdTMyIGJlYXJlcl9pZCA9IGxfcHRyLT5iX3B0ci0+aWRlbnRpdHk7CisJCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCisgICAgICAgICAgICAgICAgYXNzZXJ0KGJlYXJlcl9pZCA8IE1BWF9CRUFSRVJTKTsKKyAgICAgICAgICAgICAgICBpZiAobl9wdHItPmxpbmtfY250ID49IDIpIHsKKwkJCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIoIkF0dGVtcHQgdG8gY3JlYXRlIHRoaXJkIGxpbmsgdG8gJXNcbiIsCisJCQkgICAgYWRkcl9zdHJpbmdfZmlsbChhZGRyX3N0cmluZywgbl9wdHItPmFkZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghbl9wdHItPmxpbmtzW2JlYXJlcl9pZF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5fcHRyLT5saW5rc1tiZWFyZXJfaWRdID0gbF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXQuem9uZXNbdGlwY196b25lKGxfcHRyLT5hZGRyKV0tPmxpbmtzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBuX3B0ci0+bGlua19jbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuX3B0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyKCJBdHRlbXB0IHRvIGVzdGFibGlzaCBzZWNvbmQgbGluayBvbiA8JXM+IHRvIDwlcz4gXG4iLAorICAgICAgICAgICAgICAgICAgICBsX3B0ci0+Yl9wdHItPnB1YmwubmFtZSwgCisJCSAgICBhZGRyX3N0cmluZ19maWxsKGFkZHJfc3RyaW5nLCBsX3B0ci0+YWRkcikpOworICAgICAgICB9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbm9kZV9kZXRhY2hfbGluayhzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwluX3B0ci0+bGlua3NbbF9wdHItPmJfcHRyLT5pZGVudGl0eV0gPSAwOworCW5ldC56b25lc1t0aXBjX3pvbmUobF9wdHItPmFkZHIpXS0+bGlua3MtLTsKKwluX3B0ci0+bGlua19jbnQtLTsKK30KKworLyoKKyAqIFJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCAtIGZpdmUgY2FzZXMgdG8gaGFuZGxlOgorICoKKyAqIDE6IEEgbGluayB0b3dhcmRzIGEgem9uZS9jbHVzdGVyIGV4dGVybmFsIG5vZGUgY29tZXMgdXAuCisgKiAgICA9PiBTZW5kIGEgbXVsdGljYXN0IG1lc3NhZ2UgdXBkYXRpbmcgcm91dGluZyB0YWJsZXMgb2YgYWxsIAorICogICAgc3lzdGVtIG5vZGVzIHdpdGhpbiBvd24gY2x1c3RlciB0aGF0IHRoZSBuZXcgZGVzdGluYXRpb24gCisgKiAgICBjYW4gYmUgcmVhY2hlZCB2aWEgdGhpcyBub2RlLiAKKyAqICAgIChub2RlLmVzdGFibGlzaGVkQ29udGFjdCgpPT5jbHVzdGVyLm11bHRpY2FzdE5ld1JvdXRlKCkpCisgKgorICogMjogQSBsaW5rIHRvd2FyZHMgYSBzbGF2ZSBub2RlIGNvbWVzIHVwLgorICogICAgPT4gU2VuZCBhIG11bHRpY2FzdCBtZXNzYWdlIHVwZGF0aW5nIHJvdXRpbmcgdGFibGVzIG9mIGFsbCAKKyAqICAgIHN5c3RlbSBub2RlcyB3aXRoaW4gb3duIGNsdXN0ZXIgdGhhdCB0aGUgbmV3IGRlc3RpbmF0aW9uIAorICogICAgY2FuIGJlIHJlYWNoZWQgdmlhIHRoaXMgbm9kZS4gCisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT0+Y2x1c3Rlci5tdWx0aWNhc3ROZXdSb3V0ZSgpKQorICogICAgPT4gU2VuZCBhICBtZXNzYWdlIHRvIHRoZSBzbGF2ZSBub2RlIGFib3V0IGV4aXN0ZW5jZSAKKyAqICAgIG9mIGFsbCBzeXN0ZW0gbm9kZXMgd2l0aGluIGNsdXN0ZXI6CisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT0+Y2x1c3Rlci5zZW5kTG9jYWxSb3V0ZXMoKSkKKyAqCisgKiAzOiBBIG5ldyBjbHVzdGVyIGxvY2FsIHN5c3RlbSBub2RlIGJlY29tZXMgYXZhaWxhYmxlLgorICogICAgPT4gU2VuZCBtZXNzYWdlKHMpIHRvIHRoaXMgcGFydGljdWxhciBub2RlIGNvbnRhaW5pbmcKKyAqICAgIGluZm9ybWF0aW9uIGFib3V0IGFsbCBjbHVzdGVyIGV4dGVybmFsIGFuZCBzbGF2ZQorICogICAgIG5vZGVzIHdoaWNoIGNhbiBiZSByZWFjaGVkIHZpYSB0aGlzIG5vZGUuCisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT09Pm5ldHdvcmsuc2VuZEV4dGVybmFsUm91dGVzKCkpCisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT09Pm5ldHdvcmsuc2VuZFNsYXZlUm91dGVzKCkpCisgKiAgICA9PiBTZW5kIG1lc3NhZ2VzIHRvIGFsbCBkaXJlY3RseSBjb25uZWN0ZWQgc2xhdmUgbm9kZXMgCisgKiAgICBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGlzdGVuY2Ugb2YgdGhlIG5ldyBub2RlCisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT0+Y2x1c3Rlci5tdWx0aWNhc3ROZXdSb3V0ZSgpKQorICogICAgCisgKiA0OiBUaGUgbGluayB0b3dhcmRzIGEgem9uZS9jbHVzdGVyIGV4dGVybmFsIG5vZGUgb3Igc2xhdmUKKyAqICAgIG5vZGUgZ29lcyBkb3duLgorICogICAgPT4gU2VuZCBhIG11bHRjYXN0IG1lc3NhZ2UgdXBkYXRpbmcgcm91dGluZyB0YWJsZXMgb2YgYWxsIAorICogICAgbm9kZXMgd2l0aGluIGNsdXN0ZXIgdGhhdCB0aGUgbmV3IGRlc3RpbmF0aW9uIGNhbiBub3QgYW55CisgKiAgICBsb25nZXIgYmUgcmVhY2hlZCB2aWEgdGhpcyBub2RlLgorICogICAgKG5vZGUubG9zdEFsbExpbmtzKCk9PmNsdXN0ZXIuYmNhc3RMb3N0Um91dGUoKSkKKyAqCisgKiA1OiBBIGNsdXN0ZXIgbG9jYWwgc3lzdGVtIG5vZGUgYmVjb21lcyB1bmF2YWlsYWJsZS4KKyAqICAgID0+IFJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byB0aGlzIG5vZGUgZnJvbSB0aGUgbG9jYWwKKyAqICAgIHJvdXRpbmcgdGFibGVzLiBOb3RlOiBUaGlzIGlzIGEgY29tcGxldGVseSBub2RlCisgKiAgICBsb2NhbCBvcGVyYXRpb24uCisgKiAgICAobm9kZS5sb3N0QWxsTGlua3MoKT0+bmV0d29yay5yZW1vdmVBc1JvdXRlcigpKQorICogICAgPT4gU2VuZCBtZXNzYWdlcyB0byBhbGwgZGlyZWN0bHkgY29ubmVjdGVkIHNsYXZlIG5vZGVzIAorICogICAgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBsb3NzIG9mIHRoZSBub2RlCisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT0+Y2x1c3Rlci5tdWx0aWNhc3RMb3N0Um91dGUoKSkKKyAqCisgKi8KKworc3RhdGljIHZvaWQgbm9kZV9lc3RhYmxpc2hlZF9jb250YWN0KHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHI7CisKKwlkYmcoIm5vZGVfZXN0YWJsaXNoZWRfY29udGFjdDotPiAleFxuIiwgbl9wdHItPmFkZHIpOworCWlmICghbm9kZV9oYXNfYWN0aXZlX3JvdXRlcyhuX3B0cikpIHsgCisJCWtfc2lnbmFsKChIYW5kbGVyKW5hbWVkX25vZGVfdXAsIG5fcHRyLT5hZGRyKTsKKwl9CisKKyAgICAgICAgLyogU3luY3Jvbml6ZSBicm9hZGNhc3QgYWNrcyAqLworICAgICAgICBuX3B0ci0+YmNsaW5rLmFja2VkID0gYmNsaW5rX2dldF9sYXN0X3NlbnQoKTsKKworCWlmIChpc19zbGF2ZSh0aXBjX293bl9hZGRyKSkKKwkJcmV0dXJuOworCWlmICghaW5fb3duX2NsdXN0ZXIobl9wdHItPmFkZHIpKSB7CisJCS8qIFVzYWdlIGNhc2UgMSAoc2VlIGFib3ZlKSAqLworCQljX3B0ciA9IGNsdXN0ZXJfZmluZCh0aXBjX293bl9hZGRyKTsKKwkJaWYgKCFjX3B0cikKKwkJCWNfcHRyID0gY2x1c3Rlcl9jcmVhdGUodGlwY19vd25fYWRkcik7CisgICAgICAgICAgICAgICAgaWYgKGNfcHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9iY2FzdF9uZXdfcm91dGUoY19wdHIsIG5fcHRyLT5hZGRyLCAxLCAKKwkJCQkJCXRpcGNfbWF4X25vZGVzKTsKKwkJcmV0dXJuOworCX0gCisKKwljX3B0ciA9IG5fcHRyLT5vd25lcjsKKwlpZiAoaXNfc2xhdmUobl9wdHItPmFkZHIpKSB7CisJCS8qIFVzYWdlIGNhc2UgMiAoc2VlIGFib3ZlKSAqLworCQljbHVzdGVyX2JjYXN0X25ld19yb3V0ZShjX3B0ciwgbl9wdHItPmFkZHIsIDEsIHRpcGNfbWF4X25vZGVzKTsKKwkJY2x1c3Rlcl9zZW5kX2xvY2FsX3JvdXRlcyhjX3B0ciwgbl9wdHItPmFkZHIpOworCQlyZXR1cm47CisJfQorCisJaWYgKG5fcHRyLT5iY2xpbmsuc3VwcG9ydGVkKSB7CisJCW5tYXBfYWRkKCZjbHVzdGVyX2JjYXN0X25vZGVzLCBuX3B0ci0+YWRkcik7CisJCWlmIChuX3B0ci0+YWRkciA8IHRpcGNfb3duX2FkZHIpCisJCQl0aXBjX293bl90YWcrKzsKKwl9CisKKwkvKiBDYXNlIDMgKHNlZSBhYm92ZSkgKi8KKwluZXRfc2VuZF9leHRlcm5hbF9yb3V0ZXMobl9wdHItPmFkZHIpOworCWNsdXN0ZXJfc2VuZF9zbGF2ZV9yb3V0ZXMoY19wdHIsIG5fcHRyLT5hZGRyKTsKKwljbHVzdGVyX2JjYXN0X25ld19yb3V0ZShjX3B0ciwgbl9wdHItPmFkZHIsIExPV0VTVF9TTEFWRSwKKwkJCQloaWdoZXN0X2FsbG93ZWRfc2xhdmUpOworfQorCitzdGF0aWMgdm9pZCBub2RlX2xvc3RfY29udGFjdChzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJc3RydWN0IGNsdXN0ZXIgKmNfcHRyOworCXN0cnVjdCBub2RlX3N1YnNjciAqbnMsICp0bnM7CisJY2hhciBhZGRyX3N0cmluZ1sxNl07CisJdTMyIGk7CisKKyAgICAgICAgLyogQ2xlYW4gdXAgYnJvYWRjYXN0IHJlY2VwdGlvbiByZW1haW5zICovCisgICAgICAgIG5fcHRyLT5iY2xpbmsuZ2FwX2FmdGVyID0gbl9wdHItPmJjbGluay5nYXBfdG8gPSAwOworICAgICAgICB3aGlsZSAobl9wdHItPmJjbGluay5kZWZlcnJlZF9oZWFkKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYqIGJ1ZiA9IG5fcHRyLT5iY2xpbmsuZGVmZXJyZWRfaGVhZDsKKyAgICAgICAgICAgICAgICBuX3B0ci0+YmNsaW5rLmRlZmVycmVkX2hlYWQgPSBidWYtPm5leHQ7CisgICAgICAgICAgICAgICAgYnVmX2Rpc2NhcmQoYnVmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobl9wdHItPmJjbGluay5kZWZyYWdtKSB7CisgICAgICAgICAgICAgICAgYnVmX2Rpc2NhcmQobl9wdHItPmJjbGluay5kZWZyYWdtKTsgIAorICAgICAgICAgICAgICAgIG5fcHRyLT5iY2xpbmsuZGVmcmFnbSA9IE5VTEw7CisgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgaWYgKGluX293bl9jbHVzdGVyKG5fcHRyLT5hZGRyKSAmJiBuX3B0ci0+YmNsaW5rLnN1cHBvcnRlZCkgeyAKKyAgICAgICAgICAgICAgICBiY2xpbmtfYWNrbm93bGVkZ2Uobl9wdHIsIG1vZChuX3B0ci0+YmNsaW5rLmFja2VkICsgMTAwMDApKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVwZGF0ZSByb3V0aW5nIHRhYmxlcyAqLworCWlmIChpc19zbGF2ZSh0aXBjX293bl9hZGRyKSkgeworCQluZXRfcmVtb3ZlX2FzX3JvdXRlcihuX3B0ci0+YWRkcik7CisJfSBlbHNlIHsKKwkJaWYgKCFpbl9vd25fY2x1c3RlcihuX3B0ci0+YWRkcikpIHsgCisJCQkvKiBDYXNlIDQgKHNlZSBhYm92ZSkgKi8KKwkJCWNfcHRyID0gY2x1c3Rlcl9maW5kKHRpcGNfb3duX2FkZHIpOworCQkJY2x1c3Rlcl9iY2FzdF9sb3N0X3JvdXRlKGNfcHRyLCBuX3B0ci0+YWRkciwgMSwKKwkJCQkJCSB0aXBjX21heF9ub2Rlcyk7CisJCX0gZWxzZSB7CisJCQkvKiBDYXNlIDUgKHNlZSBhYm92ZSkgKi8KKwkJCWNfcHRyID0gY2x1c3Rlcl9maW5kKG5fcHRyLT5hZGRyKTsKKwkJCWlmIChpc19zbGF2ZShuX3B0ci0+YWRkcikpIHsKKwkJCQljbHVzdGVyX2JjYXN0X2xvc3Rfcm91dGUoY19wdHIsIG5fcHRyLT5hZGRyLCAxLAorCQkJCQkJCSB0aXBjX21heF9ub2Rlcyk7CisJCQl9IGVsc2UgeworCQkJCWlmIChuX3B0ci0+YmNsaW5rLnN1cHBvcnRlZCkgeworCQkJCQlubWFwX3JlbW92ZSgmY2x1c3Rlcl9iY2FzdF9ub2RlcywgCisJCQkJCQkgICAgbl9wdHItPmFkZHIpOworCQkJCQlpZiAobl9wdHItPmFkZHIgPCB0aXBjX293bl9hZGRyKQorCQkJCQkJdGlwY19vd25fdGFnLS07CisJCQkJfQorCQkJCW5ldF9yZW1vdmVfYXNfcm91dGVyKG5fcHRyLT5hZGRyKTsKKwkJCQljbHVzdGVyX2JjYXN0X2xvc3Rfcm91dGUoY19wdHIsIG5fcHRyLT5hZGRyLAorCQkJCQkJCSBMT1dFU1RfU0xBVkUsCisJCQkJCQkJIGhpZ2hlc3RfYWxsb3dlZF9zbGF2ZSk7CisJCQl9CisJCX0KKwl9CisJaWYgKG5vZGVfaGFzX2FjdGl2ZV9yb3V0ZXMobl9wdHIpKQorCQlyZXR1cm47CisKKwlpbmZvKCJMb3N0IGNvbnRhY3Qgd2l0aCAlc1xuIiwgCisJICAgICBhZGRyX3N0cmluZ19maWxsKGFkZHJfc3RyaW5nLCBuX3B0ci0+YWRkcikpOworCisJLyogQWJvcnQgbGluayBjaGFuZ2VvdmVyICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKKwkJc3RydWN0IGxpbmsgKmxfcHRyID0gbl9wdHItPmxpbmtzW2ldOworCQlpZiAoIWxfcHRyKSAKKwkJCWNvbnRpbnVlOworCQlsX3B0ci0+cmVzZXRfY2hlY2twb2ludCA9IGxfcHRyLT5uZXh0X2luX25vOworCQlsX3B0ci0+ZXhwX21zZ19jb3VudCA9IDA7CisJCWxpbmtfcmVzZXRfZnJhZ21lbnRzKGxfcHRyKTsKKwl9CisKKwkvKiBOb3RpZnkgc3Vic2NyaWJlcnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobnMsIHRucywgJm5fcHRyLT5uc3ViLCBub2Rlc3ViX2xpc3QpIHsKKyAgICAgICAgICAgICAgICBucy0+bm9kZSA9IDA7CisJCWxpc3RfZGVsX2luaXQoJm5zLT5ub2Rlc3ViX2xpc3QpOworCQlrX3NpZ25hbCgoSGFuZGxlcilucy0+aGFuZGxlX25vZGVfZG93biwKKwkJCSAodW5zaWduZWQgbG9uZylucy0+dXNyX2hhbmRsZSk7CisJfQorfQorCisvKioKKyAqIG5vZGVfc2VsZWN0X25leHRfaG9wIC0gZmluZCB0aGUgbmV4dC1ob3Agbm9kZSBmb3IgYSBtZXNzYWdlCisgKiAKKyAqIENhbGxlZCBieSB3aGVuIGNsdXN0ZXIgbG9jYWwgbG9va3VwIGhhcyBmYWlsZWQuCisgKi8KKworc3RydWN0IG5vZGUgKm5vZGVfc2VsZWN0X25leHRfaG9wKHUzMiBhZGRyLCB1MzIgc2VsZWN0b3IpCit7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCXUzMiByb3V0ZXJfYWRkcjsKKworICAgICAgICBpZiAoIWFkZHJfZG9tYWluX3ZhbGlkKGFkZHIpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisJLyogTG9vayBmb3IgZGlyZWN0IGxpbmsgdG8gZGVzdGluYXRpb24gcHJvY2Vzc3NvciAqLworCW5fcHRyID0gbm9kZV9maW5kKGFkZHIpOworCWlmIChuX3B0ciAmJiBub2RlX2hhc19hY3RpdmVfbGlua3Mobl9wdHIpKQorICAgICAgICAgICAgICAgIHJldHVybiBuX3B0cjsKKworCS8qIENsdXN0ZXIgbG9jYWwgc3lzdGVtIG5vZGVzICptdXN0KiBoYXZlIGRpcmVjdCBsaW5rcyAqLworCWlmICghaXNfc2xhdmUoYWRkcikgJiYgaW5fb3duX2NsdXN0ZXIoYWRkcikpCisJCXJldHVybiAwOworCisJLyogTG9vayBmb3IgY2x1c3RlciBsb2NhbCByb3V0ZXIgd2l0aCBkaXJlY3QgbGluayB0byBub2RlICovCisJcm91dGVyX2FkZHIgPSBub2RlX3NlbGVjdF9yb3V0ZXIobl9wdHIsIHNlbGVjdG9yKTsKKwlpZiAocm91dGVyX2FkZHIpIAorICAgICAgICAgICAgICAgIHJldHVybiBub2RlX3NlbGVjdChyb3V0ZXJfYWRkciwgc2VsZWN0b3IpOworCisJLyogU2xhdmUgbm9kZXMgY2FuIG9ubHkgYmUgYWNjZXNzZWQgd2l0aGluIG93biBjbHVzdGVyIHZpYSBhIAorCSAgIGtub3duIHJvdXRlciB3aXRoIGRpcmVjdCBsaW5rIC0tIGlmIG5vIHJvdXRlciB3YXMgZm91bmQsZ2l2ZSB1cCAqLworCWlmIChpc19zbGF2ZShhZGRyKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBJbnRlciB6b25lL2NsdXN0ZXIgLS0gZmluZCBhbnkgZGlyZWN0IGxpbmsgdG8gcmVtb3RlIGNsdXN0ZXIgKi8KKwlhZGRyID0gdGlwY19hZGRyKHRpcGNfem9uZShhZGRyKSwgdGlwY19jbHVzdGVyKGFkZHIpLCAwKTsKKwluX3B0ciA9IG5ldF9zZWxlY3RfcmVtb3RlX25vZGUoYWRkciwgc2VsZWN0b3IpOworCWlmIChuX3B0ciAmJiBub2RlX2hhc19hY3RpdmVfbGlua3Mobl9wdHIpKQorICAgICAgICAgICAgICAgIHJldHVybiBuX3B0cjsKKworCS8qIExhc3QgcmVzb3J0IC0tIGxvb2sgZm9yIGFueSByb3V0ZXIgdG8gYW55d2hlcmUgaW4gcmVtb3RlIHpvbmUgKi8KKwlyb3V0ZXJfYWRkciA9ICBuZXRfc2VsZWN0X3JvdXRlcihhZGRyLCBzZWxlY3Rvcik7CisJaWYgKHJvdXRlcl9hZGRyKSAKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZV9zZWxlY3Qocm91dGVyX2FkZHIsIHNlbGVjdG9yKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBub2RlX3NlbGVjdF9yb3V0ZXIgLSBzZWxlY3Qgcm91dGVyIHRvIHJlYWNoIHNwZWNpZmllZCBub2RlCisgKiAKKyAqIFVzZXMgYSBkZXRlcm1pbmlzdGljIGFuZCBmYWlyIGFsZ29yaXRobSBmb3Igc2VsZWN0aW5nIHJvdXRlciBub2RlLiAKKyAqLworCit1MzIgbm9kZV9zZWxlY3Rfcm91dGVyKHN0cnVjdCBub2RlICpuX3B0ciwgdTMyIHJlZikKK3sKKwl1MzIgdWxpbTsKKwl1MzIgbWFzazsKKwl1MzIgc3RhcnQ7CisJdTMyIHI7CisKKyAgICAgICAgaWYgKCFuX3B0cikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworCWlmIChuX3B0ci0+bGFzdF9yb3V0ZXIgPCAwKQorCQlyZXR1cm4gMDsKKwl1bGltID0gKChuX3B0ci0+bGFzdF9yb3V0ZXIgKyAxKSAqIDMyKSAtIDE7CisKKwkvKiBTdGFydCBlbnRyeSBtdXN0IGJlIHJhbmRvbSAqLworCW1hc2sgPSB0aXBjX21heF9ub2RlczsKKwl3aGlsZSAobWFzayA+IHVsaW0pCisJCW1hc2sgPj49IDE7CisJc3RhcnQgPSByZWYgJiBtYXNrOworCXIgPSBzdGFydDsKKworCS8qIExvb2t1cCB1cHdhcmRzIHdpdGggd3JhcC1hcm91bmQgKi8KKwlkbyB7CisJCWlmICgoKG5fcHRyLT5yb3V0ZXJzW3IgLyAzMl0pID4+IChyICUgMzIpKSAmIDEpCisJCQlicmVhazsKKwl9IHdoaWxlICgrK3IgPD0gdWxpbSk7CisJaWYgKHIgPiB1bGltKSB7CisJCXIgPSAxOworCQlkbyB7CisJCQlpZiAoKChuX3B0ci0+cm91dGVyc1tyIC8gMzJdKSA+PiAociAlIDMyKSkgJiAxKQorCQkJCWJyZWFrOworCQl9IHdoaWxlICgrK3IgPCBzdGFydCk7CisJCWFzc2VydChyICE9IHN0YXJ0KTsKKwl9CisJYXNzZXJ0KHIgJiYgKHIgPD0gdWxpbSkpOworCXJldHVybiB0aXBjX2FkZHIob3duX3pvbmUoKSwgb3duX2NsdXN0ZXIoKSwgcik7Cit9CisKK3ZvaWQgbm9kZV9hZGRfcm91dGVyKHN0cnVjdCBub2RlICpuX3B0ciwgdTMyIHJvdXRlcikKK3sKKwl1MzIgcl9udW0gPSB0aXBjX25vZGUocm91dGVyKTsKKworCW5fcHRyLT5yb3V0ZXJzW3JfbnVtIC8gMzJdID0gCisJCSgoMSA8PCAocl9udW0gJSAzMikpIHwgbl9wdHItPnJvdXRlcnNbcl9udW0gLyAzMl0pOworCW5fcHRyLT5sYXN0X3JvdXRlciA9IHRpcGNfbWF4X25vZGVzIC8gMzI7CisJd2hpbGUgKCgtLW5fcHRyLT5sYXN0X3JvdXRlciA+PSAwKSAmJiAKKwkgICAgICAgIW5fcHRyLT5yb3V0ZXJzW25fcHRyLT5sYXN0X3JvdXRlcl0pOworfQorCit2b2lkIG5vZGVfcmVtb3ZlX3JvdXRlcihzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHUzMiByb3V0ZXIpCit7CisJdTMyIHJfbnVtID0gdGlwY19ub2RlKHJvdXRlcik7CisKKwlpZiAobl9wdHItPmxhc3Rfcm91dGVyIDwgMCkKKwkJcmV0dXJuOwkJLyogTm8gcm91dGVzICovCisKKwluX3B0ci0+cm91dGVyc1tyX251bSAvIDMyXSA9CisJCSgofigxIDw8IChyX251bSAlIDMyKSkpICYgKG5fcHRyLT5yb3V0ZXJzW3JfbnVtIC8gMzJdKSk7CisJbl9wdHItPmxhc3Rfcm91dGVyID0gdGlwY19tYXhfbm9kZXMgLyAzMjsKKwl3aGlsZSAoKC0tbl9wdHItPmxhc3Rfcm91dGVyID49IDApICYmIAorCSAgICAgICAhbl9wdHItPnJvdXRlcnNbbl9wdHItPmxhc3Rfcm91dGVyXSk7CisKKwlpZiAoIW5vZGVfaXNfdXAobl9wdHIpKQorCQlub2RlX2xvc3RfY29udGFjdChuX3B0cik7Cit9CisKKyNpZiAwCit2b2lkIG5vZGVfcHJpbnQoc3RydWN0IHByaW50X2J1ZiAqYnVmLCBzdHJ1Y3Qgbm9kZSAqbl9wdHIsIGNoYXIgKnN0cikKK3sKKwl1MzIgaTsKKworCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuXG4lcyIsIHN0cik7CisJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKKwkJaWYgKCFuX3B0ci0+bGlua3NbaV0pIAorCQkJY29udGludWU7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIkxpbmtzWyV1XTogJXgsICIsIGksIG5fcHRyLT5saW5rc1tpXSk7CisJfQorCXRpcGNfcHJpbnRmKGJ1ZiwgIkFjdGl2ZSBsaW5rczogWyV4LCV4XVxuIiwKKwkJICAgIG5fcHRyLT5hY3RpdmVfbGlua3NbMF0sIG5fcHRyLT5hY3RpdmVfbGlua3NbMV0pOworfQorI2VuZGlmCisKK3UzMiB0aXBjX2F2YWlsYWJsZV9ub2Rlcyhjb25zdCB1MzIgZG9tYWluKQoreworCXN0cnVjdCBub2RlICpuX3B0cjsKKwl1MzIgY250ID0gMDsKKworCWZvciAobl9wdHIgPSBub2Rlczsgbl9wdHI7IG5fcHRyID0gbl9wdHItPm5leHQpIHsKKwkJaWYgKCFpbl9zY29wZShkb21haW4sIG5fcHRyLT5hZGRyKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobm9kZV9pc191cChuX3B0cikpCisJCQljbnQrKzsKKwl9CisJcmV0dXJuIGNudDsKK30KKworc3RydWN0IHNrX2J1ZmYgKm5vZGVfZ2V0X25vZGVzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpCit7CisJdTMyIGRvbWFpbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCBub2RlICpuX3B0cjsKKyAgICAgICAgc3RydWN0IHRpcGNfbm9kZV9pbmZvIG5vZGVfaW5mbzsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfTkVUX0FERFIpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJZG9tYWluID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOworCWRvbWFpbiA9IG50b2hsKGRvbWFpbik7CisJaWYgKCFhZGRyX2RvbWFpbl92YWxpZChkb21haW4pKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCisJCQkJCSAgICAgICIgKG5ldHdvcmsgYWRkcmVzcykiKTsKKworICAgICAgICBpZiAoIW5vZGVzKQorICAgICAgICAgICAgICAgIHJldHVybiBjZmdfcmVwbHlfbm9uZSgpOworCisJLyogRm9yIG5vdywgZ2V0IHNwYWNlIGZvciBhbGwgb3RoZXIgbm9kZXMgCisJICAgKHdpbGwgbmVlZCB0byBtb2RpZnkgdGhpcyB3aGVuIHNsYXZlIG5vZGVzIGFyZSBzdXBwb3J0ZWQgKi8KKworCWJ1ZiA9IGNmZ19yZXBseV9hbGxvYyhUTFZfU1BBQ0Uoc2l6ZW9mKG5vZGVfaW5mbykpICoKKwkJCSAgICAodGlwY19tYXhfbm9kZXMgLSAxKSk7CisJaWYgKCFidWYpCisJCXJldHVybiBOVUxMOworCisJLyogQWRkIFRMVnMgZm9yIGFsbCBub2RlcyBpbiBzY29wZSAqLworCisJZm9yIChuX3B0ciA9IG5vZGVzOyBuX3B0cjsgbl9wdHIgPSBuX3B0ci0+bmV4dCkgeworCQlpZiAoIWluX3Njb3BlKGRvbWFpbiwgbl9wdHItPmFkZHIpKQorCQkJY29udGludWU7CisgICAgICAgICAgICAgICAgbm9kZV9pbmZvLmFkZHIgPSBodG9ubChuX3B0ci0+YWRkcik7CisgICAgICAgICAgICAgICAgbm9kZV9pbmZvLnVwID0gaHRvbmwobm9kZV9pc191cChuX3B0cikpOworCQljZmdfYXBwZW5kX3RsdihidWYsIFRJUENfVExWX05PREVfSU5GTywgCisJCQkgICAgICAgJm5vZGVfaW5mbywgc2l6ZW9mKG5vZGVfaW5mbykpOworCX0KKworCXJldHVybiBidWY7Cit9CisKK3N0cnVjdCBza19idWZmICpub2RlX2dldF9saW5rcyhjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKQoreworCXUzMiBkb21haW47CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CisgICAgICAgIHN0cnVjdCB0aXBjX2xpbmtfaW5mbyBsaW5rX2luZm87CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX05FVF9BRERSKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCWRvbWFpbiA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwlkb21haW4gPSBudG9obChkb21haW4pOworCWlmICghYWRkcl9kb21haW5fdmFsaWQoZG9tYWluKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQorCQkJCQkgICAgICAiIChuZXR3b3JrIGFkZHJlc3MpIik7CisKKyAgICAgICAgaWYgKCFub2RlcykKKyAgICAgICAgICAgICAgICByZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKKworCS8qIEZvciBub3csIGdldCBzcGFjZSBmb3IgMiBsaW5rcyB0byBhbGwgb3RoZXIgbm9kZXMgKyBiY2FzdCBsaW5rIAorCSAgICh3aWxsIG5lZWQgdG8gbW9kaWZ5IHRoaXMgd2hlbiBzbGF2ZSBub2RlcyBhcmUgc3VwcG9ydGVkICovCisKKwlidWYgPSBjZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKHNpemVvZihsaW5rX2luZm8pKSAqCisJCQkgICAgKDIgKiAodGlwY19tYXhfbm9kZXMgLSAxKSArIDEpKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBBZGQgVExWIGZvciBicm9hZGNhc3QgbGluayAqLworCisgICAgICAgIGxpbmtfaW5mby5kZXN0ID0gdGlwY19vd25fYWRkciAmIDB4ZmZmZmYwMDsKKwlsaW5rX2luZm8uZGVzdCA9IGh0b25sKGxpbmtfaW5mby5kZXN0KTsKKyAgICAgICAgbGlua19pbmZvLnVwID0gaHRvbmwoMSk7CisgICAgICAgIHNwcmludGYobGlua19pbmZvLnN0ciwgYmNfbGlua19uYW1lKTsKKwljZmdfYXBwZW5kX3RsdihidWYsIFRJUENfVExWX0xJTktfSU5GTywgJmxpbmtfaW5mbywgc2l6ZW9mKGxpbmtfaW5mbykpOworCisJLyogQWRkIFRMVnMgZm9yIGFueSBvdGhlciBsaW5rcyBpbiBzY29wZSAqLworCisJZm9yIChuX3B0ciA9IG5vZGVzOyBuX3B0cjsgbl9wdHIgPSBuX3B0ci0+bmV4dCkgeworICAgICAgICAgICAgICAgIHUzMiBpOworCisJCWlmICghaW5fc2NvcGUoZG9tYWluLCBuX3B0ci0+YWRkcikpCisJCQljb250aW51ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0JFQVJFUlM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuX3B0ci0+bGlua3NbaV0pIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfaW5mby5kZXN0ID0gaHRvbmwobl9wdHItPmFkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlua19pbmZvLnVwID0gaHRvbmwobGlua19pc191cChuX3B0ci0+bGlua3NbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShsaW5rX2luZm8uc3RyLCBuX3B0ci0+bGlua3NbaV0tPm5hbWUpOworCQkJY2ZnX2FwcGVuZF90bHYoYnVmLCBUSVBDX1RMVl9MSU5LX0lORk8sIAorCQkJCSAgICAgICAmbGlua19pbmZvLCBzaXplb2YobGlua19pbmZvKSk7CisgICAgICAgICAgICAgICAgfQorCX0KKworCXJldHVybiBidWY7Cit9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ub2RlLmggYi9uZXQvdGlwYy9ub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5NDQyYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL25vZGUuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIG5ldC90aXBjL25vZGUuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG5vZGUgbWFuYWdlbWVudCByb3V0aW5lcworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX05PREVfSAorI2RlZmluZSBfVElQQ19OT0RFX0gKKworI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgImNsdXN0ZXIuaCIKKyNpbmNsdWRlICJiZWFyZXIuaCIKKworLyoqCisgKiBzdHJ1Y3Qgbm9kZSAtIFRJUEMgbm9kZSBzdHJ1Y3R1cmUKKyAqIEBhZGRyOiBuZXR3b3JrIGFkZHJlc3Mgb2Ygbm9kZQorICogQGxvY2s6IHNwaW5sb2NrIGdvdmVybmluZyBhY2Nlc3MgdG8gc3RydWN0dXJlCisgKiBAb3duZXI6IHBvaW50ZXIgdG8gY2x1c3RlciB0aGF0IG5vZGUgYmVsb25ncyB0bworICogQG5leHQ6IHBvaW50ZXIgdG8gbmV4dCBub2RlIGluIHNvcnRlZCBsaXN0IG9mIGNsdXN0ZXIncyBub2RlcworICogQG5zdWI6IGxpc3Qgb2YgIm5vZGUgZG93biIgc3Vic2NyaXB0aW9ucyBtb25pdG9yaW5nIG5vZGUKKyAqIEBhY3RpdmVfbGlua3M6IHBvaW50ZXJzIHRvIGFjdGl2ZSBsaW5rcyB0byBub2RlCisgKiBAbGlua3M6IHBvaW50ZXJzIHRvIGFsbCBsaW5rcyB0byBub2RlCisgKiBAbGlua19jbnQ6IG51bWJlciBvZiBsaW5rcyB0byBub2RlCisgKiBAcGVybWl0X2NoYW5nZW92ZXI6IG5vbi16ZXJvIGlmIG5vZGUgaGFzIHJlZHVuZGFudCBsaW5rcyB0byB0aGlzIHN5c3RlbQorICogQHJvdXRlcnM6IGJpdG1hcCAodXNlZCBmb3IgbXVsdGljbHVzdGVyIGNvbW11bmljYXRpb24pCisgKiBAbGFzdF9yb3V0ZXI6ICh1c2VkIGZvciBtdWx0aWNsdXN0ZXIgY29tbXVuaWNhdGlvbikKKyAqIEBiY2xpbms6IGJyb2FkY2FzdC1yZWxhdGVkIGluZm8KKyAqICAgIEBzdXBwb3J0ZWQ6IG5vbi16ZXJvIGlmIG5vZGUgc3VwcG9ydHMgVElQQyBiJ2Nhc3QgY2FwYWJpbGl0eQorICogICAgQGFja2VkOiBzZXF1ZW5jZSAjIG9mIGxhc3Qgb3V0Ym91bmQgYidjYXN0IG1lc3NhZ2UgYWNrbm93bGVkZ2VkIGJ5IG5vZGUKKyAqICAgIEBsYXN0X2luOiBzZXF1ZW5jZSAjIG9mIGxhc3QgaW4tc2VxdWVuY2UgYidjYXN0IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBub2RlCisgKiAgICBAZ2FwX2FmdGVyOiBzZXF1ZW5jZSAjIG9mIGxhc3QgbWVzc2FnZSBub3QgcmVxdWlyaW5nIGEgTkFLIHJlcXVlc3QKKyAqICAgIEBnYXBfdG86IHNlcXVlbmNlICMgb2YgbGFzdCBtZXNzYWdlIHJlcXVpcmluZyBhIE5BSyByZXF1ZXN0CisgKiAgICBAbmFja19zeW5jOiBjb3VudGVyIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIE5BSyByZXF1ZXN0cyBzaG91bGQgYmUgc2VudAorICogICAgQGRlZmVycmVkX2hlYWQ6IG9sZGVzdCBPT1MgYidjYXN0IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBub2RlCisgKiAgICBAZGVmZXJyZWRfdGFpbDogbmV3ZXN0IE9PUyBiJ2Nhc3QgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG5vZGUKKyAqICAgIEBkZWZyYWdtOiBsaXN0IG9mIHBhcnRpYWxseSByZWFzc2VtYmxlZCBiJ2Nhc3QgbWVzc2FnZSBmcmFnbWVudHMgZnJvbSBub2RlCisgKi8KKyAKK3N0cnVjdCBub2RlIHsKKwl1MzIgYWRkcjsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGNsdXN0ZXIgKm93bmVyOworCXN0cnVjdCBub2RlICpuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgbnN1YjsKKwlzdHJ1Y3QgbGluayAqYWN0aXZlX2xpbmtzWzJdOworCXN0cnVjdCBsaW5rICpsaW5rc1tNQVhfQkVBUkVSU107CisJaW50IGxpbmtfY250OworCWludCBwZXJtaXRfY2hhbmdlb3ZlcjsKKwl1MzIgcm91dGVyc1s1MTIvMzJdOworCWludCBsYXN0X3JvdXRlcjsKKwlzdHJ1Y3QgeworCQlpbnQgc3VwcG9ydGVkOworCQl1MzIgYWNrZWQ7CisJCXUzMiBsYXN0X2luOworCQl1MzIgZ2FwX2FmdGVyOyAKKwkJdTMyIGdhcF90bzsgCisJCXUzMiBuYWNrX3N5bmM7CisJCXN0cnVjdCBza19idWZmICpkZWZlcnJlZF9oZWFkOworCQlzdHJ1Y3Qgc2tfYnVmZiAqZGVmZXJyZWRfdGFpbDsKKwkJc3RydWN0IHNrX2J1ZmYgKmRlZnJhZ207CisJfSBiY2xpbms7Cit9OworCitleHRlcm4gc3RydWN0IG5vZGUgKm5vZGVzOworZXh0ZXJuIHUzMiB0aXBjX293bl90YWc7CisKK3N0cnVjdCBub2RlICpub2RlX2NyZWF0ZSh1MzIgYWRkcik7Cit2b2lkIG5vZGVfZGVsZXRlKHN0cnVjdCBub2RlICpuX3B0cik7CitzdHJ1Y3Qgbm9kZSAqbm9kZV9hdHRhY2hfbGluayhzdHJ1Y3QgbGluayAqbF9wdHIpOwordm9pZCBub2RlX2RldGFjaF9saW5rKHN0cnVjdCBub2RlICpuX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKTsKK3ZvaWQgbm9kZV9saW5rX2Rvd24oc3RydWN0IG5vZGUgKm5fcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpOwordm9pZCBub2RlX2xpbmtfdXAoc3RydWN0IG5vZGUgKm5fcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpOworaW50IG5vZGVfaGFzX2FjdGl2ZV9saW5rcyhzdHJ1Y3Qgbm9kZSAqbl9wdHIpOworaW50IG5vZGVfaGFzX3JlZHVuZGFudF9saW5rcyhzdHJ1Y3Qgbm9kZSAqbl9wdHIpOwordTMyIG5vZGVfc2VsZWN0X3JvdXRlcihzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHUzMiByZWYpOworc3RydWN0IG5vZGUgKm5vZGVfc2VsZWN0X25leHRfaG9wKHUzMiBhZGRyLCB1MzIgc2VsZWN0b3IpOworaW50IG5vZGVfaXNfdXAoc3RydWN0IG5vZGUgKm5fcHRyKTsKK3ZvaWQgbm9kZV9hZGRfcm91dGVyKHN0cnVjdCBub2RlICpuX3B0ciwgdTMyIHJvdXRlcik7Cit2b2lkIG5vZGVfcmVtb3ZlX3JvdXRlcihzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHUzMiByb3V0ZXIpOworc3RydWN0IHNrX2J1ZmYgKm5vZGVfZ2V0X2xpbmtzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpOworc3RydWN0IHNrX2J1ZmYgKm5vZGVfZ2V0X25vZGVzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBub2RlICpub2RlX2ZpbmQodTMyIGFkZHIpCit7CisJaWYgKGxpa2VseShpbl9vd25fY2x1c3RlcihhZGRyKSkpCisJCXJldHVybiBsb2NhbF9ub2Rlc1t0aXBjX25vZGUoYWRkcildOworCWVsc2UgaWYgKGFkZHJfZG9tYWluX3ZhbGlkKGFkZHIpKSB7CisJCXN0cnVjdCBjbHVzdGVyICpjX3B0ciA9IGNsdXN0ZXJfZmluZChhZGRyKTsKKworCQlpZiAoY19wdHIpCisJCQlyZXR1cm4gY19wdHItPm5vZGVzW3RpcGNfbm9kZShhZGRyKV07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBub2RlICpub2RlX3NlbGVjdCh1MzIgYWRkciwgdTMyIHNlbGVjdG9yKQoreworCWlmIChsaWtlbHkoaW5fb3duX2NsdXN0ZXIoYWRkcikpKQorCQlyZXR1cm4gbG9jYWxfbm9kZXNbdGlwY19ub2RlKGFkZHIpXTsKKwlyZXR1cm4gbm9kZV9zZWxlY3RfbmV4dF9ob3AoYWRkciwgc2VsZWN0b3IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbm9kZV9sb2NrKHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwlzcGluX2xvY2tfYmgoJm5fcHRyLT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5vZGVfdW5sb2NrKHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwlzcGluX3VubG9ja19iaCgmbl9wdHItPmxvY2spOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGVfc3Vic2NyLmMgYi9uZXQvdGlwYy9ub2RlX3N1YnNjci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Mzc1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9ub2RlX3N1YnNjci5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBuZXQvdGlwYy9ub2RlX3N1YnNjci5jOiBUSVBDICJub2RlIGRvd24iIHN1YnNjcmlwdGlvbiBoYW5kbGluZworICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisjaW5jbHVkZSAibm9kZS5oIgorI2luY2x1ZGUgImFkZHIuaCIKKworLyoqCisgKiBub2Rlc3ViX3N1YnNjcmliZSAtIGNyZWF0ZSAibm9kZSBkb3duIiBzdWJzY3JpcHRpb24gZm9yIHNwZWNpZmllZCBub2RlCisgKi8KKwordm9pZCBub2Rlc3ViX3N1YnNjcmliZShzdHJ1Y3Qgbm9kZV9zdWJzY3IgKm5vZGVfc3ViLCB1MzIgYWRkciwgCisJCSAgICAgICB2b2lkICp1c3JfaGFuZGxlLCBuZXRfZXZfaGFuZGxlciBoYW5kbGVfZG93bikKK3sKKwlub2RlX3N1Yi0+bm9kZSA9IDA7CisJaWYgKGFkZHIgPT0gdGlwY19vd25fYWRkcikKKwkJcmV0dXJuOworCWlmICghYWRkcl9ub2RlX3ZhbGlkKGFkZHIpKSB7CisJCXdhcm4oIm5vZGVfc3Vic2NyIHdpdGggaWxsZWdhbCAleFxuIiwgYWRkcik7CisJCXJldHVybjsKKwl9CisKKwlub2RlX3N1Yi0+aGFuZGxlX25vZGVfZG93biA9IGhhbmRsZV9kb3duOworCW5vZGVfc3ViLT51c3JfaGFuZGxlID0gdXNyX2hhbmRsZTsKKwlub2RlX3N1Yi0+bm9kZSA9IG5vZGVfZmluZChhZGRyKTsKKwlhc3NlcnQobm9kZV9zdWItPm5vZGUpOworCW5vZGVfbG9jayhub2RlX3N1Yi0+bm9kZSk7CisJbGlzdF9hZGRfdGFpbCgmbm9kZV9zdWItPm5vZGVzdWJfbGlzdCwgJm5vZGVfc3ViLT5ub2RlLT5uc3ViKTsKKwlub2RlX3VubG9jayhub2RlX3N1Yi0+bm9kZSk7Cit9CisKKy8qKgorICogbm9kZXN1Yl91bnN1YnNjcmliZSAtIGNhbmNlbCAibm9kZSBkb3duIiBzdWJzY3JpcHRpb24gKGlmIGFueSkKKyAqLworCit2b2lkIG5vZGVzdWJfdW5zdWJzY3JpYmUoc3RydWN0IG5vZGVfc3Vic2NyICpub2RlX3N1YikKK3sKKwlpZiAoIW5vZGVfc3ViLT5ub2RlKQorCQlyZXR1cm47CisKKwlub2RlX2xvY2sobm9kZV9zdWItPm5vZGUpOworCWxpc3RfZGVsX2luaXQoJm5vZGVfc3ViLT5ub2Rlc3ViX2xpc3QpOworCW5vZGVfdW5sb2NrKG5vZGVfc3ViLT5ub2RlKTsKK30KZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGVfc3Vic2NyLmggYi9uZXQvdGlwYy9ub2RlX3N1YnNjci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjg3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9ub2RlX3N1YnNjci5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBuZXQvdGlwYy9ub2RlX3N1YnNjci5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgIm5vZGUgZG93biIgc3Vic2NyaXB0aW9uIGhhbmRsaW5nCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5NS0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfTk9ERV9TVUJTQ1JfSAorI2RlZmluZSBfVElQQ19OT0RFX1NVQlNDUl9ICisKKyNpbmNsdWRlICJhZGRyLmgiCisKK3R5cGVkZWYgdm9pZCAoKm5ldF9ldl9oYW5kbGVyKSAodm9pZCAqdXNyX2hhbmRsZSk7CisKKy8qKgorICogc3RydWN0IG5vZGVfc3Vic2NyIC0gIm5vZGUgZG93biIgc3Vic2NyaXB0aW9uIGVudHJ5CisgKiBAbm9kZTogcHRyIHRvIG5vZGUgc3RydWN0dXJlIG9mIGludGVyZXN0IChvciBOVUxMLCBpZiBub25lKQorICogQGhhbmRsZV9ub2RlX2Rvd246IHJvdXRpbmUgdG8gaW52b2tlIHdoZW4gbm9kZSBmYWlscworICogQHVzcl9oYW5kbGU6IGFyZ3VtZW50IHRvIHBhc3MgdG8gcm91dGluZSB3aGVuIG5vZGUgZmFpbHMKKyAqIEBub2Rlc3ViX2xpc3Q6IGFkamFjZW50IGVudHJpZXMgaW4gbGlzdCBvZiBzdWJzY3JpcHRpb25zIGZvciB0aGUgbm9kZQorICovCisKK3N0cnVjdCBub2RlX3N1YnNjciB7CisJc3RydWN0IG5vZGUgKm5vZGU7CisJbmV0X2V2X2hhbmRsZXIgaGFuZGxlX25vZGVfZG93bjsKKwl2b2lkICp1c3JfaGFuZGxlOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZXN1Yl9saXN0OworfTsKKwordm9pZCBub2Rlc3ViX3N1YnNjcmliZShzdHJ1Y3Qgbm9kZV9zdWJzY3IgKm5vZGVfc3ViLCB1MzIgYWRkciwKKwkJICAgICAgIHZvaWQgKnVzcl9oYW5kbGUsIG5ldF9ldl9oYW5kbGVyIGhhbmRsZV9kb3duKTsKK3ZvaWQgbm9kZXN1Yl91bnN1YnNjcmliZShzdHJ1Y3Qgbm9kZV9zdWJzY3IgKm5vZGVfc3ViKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9wb3J0LmMgYi9uZXQvdGlwYy9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjYWNhNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3BvcnQuYwpAQCAtMCwwICsxLDE3MDggQEAKKy8qCisgKiBuZXQvdGlwYy9wb3J0LmM6IFRJUEMgcG9ydCBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5Mi0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJub2RlLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgIm5hbWVfdGFibGUuaCIKKyNpbmNsdWRlICJ1c2VyX3JlZy5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgImJjYXN0LmgiCisKKy8qIENvbm5lY3Rpb24gbWFuYWdlbWVudDogKi8KKyNkZWZpbmUgUFJPQklOR19JTlRFUlZBTCAzNjAwMDAwCS8qIFttc10gPT4gMSBoICovCisjZGVmaW5lIENPTkZJUk1FRCAwCisjZGVmaW5lIFBST0JJTkcgMQorCisjZGVmaW5lIE1BWF9SRUpFQ1RfU0laRSAxMDI0CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbXNnX3F1ZXVlX2hlYWQgPSAwOworc3RhdGljIHN0cnVjdCBza19idWZmICptc2dfcXVldWVfdGFpbCA9IDA7CisKK3NwaW5sb2NrX3QgcG9ydF9saXN0X2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgc3BpbmxvY2tfdCBxdWV1ZV9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCitMSVNUX0hFQUQocG9ydHMpOworc3RhdGljIHZvaWQgcG9ydF9oYW5kbGVfbm9kZV9kb3duKHVuc2lnbmVkIGxvbmcgcmVmKTsKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiogcG9ydF9idWlsZF9zZWxmX2Fib3J0X21zZyhzdHJ1Y3QgcG9ydCAqLHUzMiBlcnIpOworc3RhdGljIHN0cnVjdCBza19idWZmKiBwb3J0X2J1aWxkX3BlZXJfYWJvcnRfbXNnKHN0cnVjdCBwb3J0ICosdTMyIGVycik7CitzdGF0aWMgdm9pZCBwb3J0X3RpbWVvdXQodW5zaWduZWQgbG9uZyByZWYpOworCisKK3N0YXRpYyBpbmxpbmUgdTMyIHBvcnRfcGVlcm5vZGUoc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXJldHVybiBtc2dfZGVzdG5vZGUoJnBfcHRyLT5wdWJsLnBoZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBwb3J0X3BlZXJwb3J0KHN0cnVjdCBwb3J0ICpwX3B0cikKK3sKKwlyZXR1cm4gbXNnX2Rlc3Rwb3J0KCZwX3B0ci0+cHVibC5waGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcG9ydF9vdXRfc2Vxbm8oc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXJldHVybiBtc2dfdHJhbnNwX3NlcW5vKCZwX3B0ci0+cHVibC5waGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBvcnRfc2V0X291dF9zZXFubyhzdHJ1Y3QgcG9ydCAqcF9wdHIsIHUzMiBzZXFubykgCit7CisJbXNnX3NldF90cmFuc3Bfc2Vxbm8oJnBfcHRyLT5wdWJsLnBoZHIsc2Vxbm8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG9ydF9pbmNyX291dF9zZXFubyhzdHJ1Y3QgcG9ydCAqcF9wdHIpCit7CisJc3RydWN0IHRpcGNfbXNnICptID0gJnBfcHRyLT5wdWJsLnBoZHI7CisKKwlpZiAobGlrZWx5KCFtc2dfcm91dGVkKG0pKSkKKwkJcmV0dXJuOworCW1zZ19zZXRfdHJhbnNwX3NlcW5vKG0sIChtc2dfdHJhbnNwX3NlcW5vKG0pICsgMSkpOworfQorCisvKioKKyAqIHRpcGNfbXVsdGljYXN0IC0gc2VuZCBhIG11bHRpY2FzdCBtZXNzYWdlIHRvIGxvY2FsIGFuZCByZW1vdGUgZGVzdGluYXRpb25zCisgKi8KKworaW50IHRpcGNfbXVsdGljYXN0KHUzMiByZWYsIHN0cnVjdCB0aXBjX25hbWVfc2VxIGNvbnN0ICpzZXEsIHUzMiBkb21haW4sCisJCSAgIHUzMiBudW1fc2VjdCwgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCkKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKmhkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCBza19idWZmICppYnVmID0gTlVMTDsKKwlzdHJ1Y3QgcG9ydF9saXN0IGRwb3J0cyA9IHswLCBOVUxMLCB9OworCXN0cnVjdCBwb3J0ICpvcG9ydCA9IHBvcnRfZGVyZWYocmVmKTsKKwlpbnQgZXh0X3RhcmdldHM7CisJaW50IHJlczsKKworCWlmICh1bmxpa2VseSghb3BvcnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIENyZWF0ZSBtdWx0aWNhc3QgbWVzc2FnZSAqLworCisJaGRyID0gJm9wb3J0LT5wdWJsLnBoZHI7CisJbXNnX3NldF90eXBlKGhkciwgVElQQ19NQ0FTVF9NU0cpOworCW1zZ19zZXRfbmFtZXR5cGUoaGRyLCBzZXEtPnR5cGUpOworCW1zZ19zZXRfbmFtZWxvd2VyKGhkciwgc2VxLT5sb3dlcik7CisJbXNnX3NldF9uYW1ldXBwZXIoaGRyLCBzZXEtPnVwcGVyKTsKKwltc2dfc2V0X2hkcl9zeihoZHIsIE1DQVNUX0hfU0laRSk7CisJcmVzID0gbXNnX2J1aWxkKGhkciwgbXNnX3NlY3QsIG51bV9zZWN0LCBNQVhfTVNHX1NJWkUsCisJCQkhb3BvcnQtPnVzZXJfcG9ydCwgJmJ1Zik7CisJaWYgKHVubGlrZWx5KCFidWYpKQorCQlyZXR1cm4gcmVzOworCisJLyogRmlndXJlIG91dCB3aGVyZSB0byBzZW5kIG11bHRpY2FzdCBtZXNzYWdlICovCisKKwlleHRfdGFyZ2V0cyA9IG5hbWV0YmxfbWNfdHJhbnNsYXRlKHNlcS0+dHlwZSwgc2VxLT5sb3dlciwgc2VxLT51cHBlciwKKwkJCQkJICAgVElQQ19OT0RFX1NDT1BFLCAmZHBvcnRzKTsKKwkKKwkvKiBTZW5kIG1lc3NhZ2UgdG8gZGVzdGluYXRpb25zIChkdXBsaWNhdGUgaXQgb25seSBpZiBuZWNlc3NhcnkpICovIAorCisJaWYgKGV4dF90YXJnZXRzKSB7CisJCWlmIChkcG9ydHMuY291bnQgIT0gMCkgeworCQkJaWJ1ZiA9IHNrYl9jb3B5KGJ1ZiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoaWJ1ZiA9PSBOVUxMKSB7CisJCQkJcG9ydF9saXN0X2ZyZWUoJmRwb3J0cyk7CisJCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfQorCQlyZXMgPSBiY2xpbmtfc2VuZF9tc2coYnVmKTsKKwkJaWYgKChyZXMgPCAwKSAmJiAoZHBvcnRzLmNvdW50ICE9IDApKSB7CisJCQlidWZfZGlzY2FyZChpYnVmKTsKKwkJfQorCX0gZWxzZSB7CisJCWlidWYgPSBidWY7CisJfQorCisJaWYgKHJlcyA+PSAwKSB7CisJCWlmIChpYnVmKQorCQkJcG9ydF9yZWN2X21jYXN0KGlidWYsICZkcG9ydHMpOworCX0gZWxzZSB7CisJCXBvcnRfbGlzdF9mcmVlKCZkcG9ydHMpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHBvcnRfcmVjdl9tY2FzdCAtIGRlbGl2ZXIgbXVsdGljYXN0IG1lc3NhZ2UgdG8gYWxsIGRlc3RpbmF0aW9uIHBvcnRzCisgKiAKKyAqIElmIHRoZXJlIGlzIG5vIHBvcnQgbGlzdCwgcGVyZm9ybSBhIGxvb2t1cCB0byBjcmVhdGUgb25lCisgKi8KKwordm9pZCBwb3J0X3JlY3ZfbWNhc3Qoc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IHBvcnRfbGlzdCAqZHApCit7CisJc3RydWN0IHRpcGNfbXNnKiBtc2c7CisJc3RydWN0IHBvcnRfbGlzdCBkcG9ydHMgPSB7MCwgTlVMTCwgfTsKKwlzdHJ1Y3QgcG9ydF9saXN0ICppdGVtID0gZHA7CisJaW50IGNudCA9IDA7CisKKwlhc3NlcnQoYnVmKTsKKwltc2cgPSBidWZfbXNnKGJ1Zik7CisKKwkvKiBDcmVhdGUgZGVzdGluYXRpb24gcG9ydCBsaXN0LCBpZiBvbmUgd2Fzbid0IHN1cHBsaWVkICovCisKKwlpZiAoZHAgPT0gTlVMTCkgeworCQluYW1ldGJsX21jX3RyYW5zbGF0ZShtc2dfbmFtZXR5cGUobXNnKSwKKwkJCQkgICAgIG1zZ19uYW1lbG93ZXIobXNnKSwKKwkJCQkgICAgIG1zZ19uYW1ldXBwZXIobXNnKSwKKwkJCQkgICAgIFRJUENfQ0xVU1RFUl9TQ09QRSwKKwkJCQkgICAgICZkcG9ydHMpOworCQlpdGVtID0gZHAgPSAmZHBvcnRzOworCX0KKworCS8qIERlbGl2ZXIgYSBjb3B5IG9mIG1lc3NhZ2UgdG8gZWFjaCBkZXN0aW5hdGlvbiBwb3J0ICovCisKKwlpZiAoZHAtPmNvdW50ICE9IDApIHsKKwkJaWYgKGRwLT5jb3VudCA9PSAxKSB7CisJCQltc2dfc2V0X2Rlc3Rwb3J0KG1zZywgZHAtPnBvcnRzWzBdKTsKKwkJCXBvcnRfcmVjdl9tc2coYnVmKTsKKwkJCXBvcnRfbGlzdF9mcmVlKGRwKTsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKDsgY250IDwgZHAtPmNvdW50OyBjbnQrKykgeworCQkJaW50IGluZGV4ID0gY250ICUgUExTSVpFOworCQkJc3RydWN0IHNrX2J1ZmYgKmIgPSBza2JfY2xvbmUoYnVmLCBHRlBfQVRPTUlDKTsKKworCQkJaWYgKGIgPT0gTlVMTCkgeworCQkJCXdhcm4oIkJ1ZmZlciBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworCQkJCW1zZ19kYmcobXNnLCAiTE9TVDoiKTsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisJCQlpZiAoKGluZGV4ID09IDApICYmIChjbnQgIT0gMCkpIHsKKwkJCQlpdGVtID0gaXRlbS0+bmV4dDsKKwkJCX0KKwkJCW1zZ19zZXRfZGVzdHBvcnQoYnVmX21zZyhiKSxpdGVtLT5wb3J0c1tpbmRleF0pOworCQkJcG9ydF9yZWN2X21zZyhiKTsKKwkJfQorCX0KK2V4aXQ6CisJYnVmX2Rpc2NhcmQoYnVmKTsKKwlwb3J0X2xpc3RfZnJlZShkcCk7Cit9CisKKy8qKgorICogdGlwY19jcmVhdGVwb3J0X3JhdyAtIGNyZWF0ZSBhIG5hdGl2ZSBUSVBDIHBvcnQKKyAqIAorICogUmV0dXJucyBsb2NhbCBwb3J0IHJlZmVyZW5jZQorICovCisKK3UzMiB0aXBjX2NyZWF0ZXBvcnRfcmF3KHZvaWQgKnVzcl9oYW5kbGUsCisJCQl1MzIgKCpkaXNwYXRjaGVyKShzdHJ1Y3QgdGlwY19wb3J0ICosIHN0cnVjdCBza19idWZmICopLAorCQkJdm9pZCAoKndha2V1cCkoc3RydWN0IHRpcGNfcG9ydCAqKSwKKwkJCWNvbnN0IHUzMiBpbXBvcnRhbmNlKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1MzIgcmVmOworCisJcF9wdHIgPSBrbWFsbG9jKHNpemVvZigqcF9wdHIpLCBHRlBfQVRPTUlDKTsKKwlpZiAocF9wdHIgPT0gTlVMTCkgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZmFpbGVkIHRvIGNyZWF0ZSBwb3J0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbXNldChwX3B0ciwgMCwgc2l6ZW9mKCpwX3B0cikpOworCXJlZiA9IHJlZl9hY3F1aXJlKHBfcHRyLCAmcF9wdHItPnB1YmwubG9jayk7CisJaWYgKCFyZWYpIHsKKwkJd2FybigiUmVmZXJlbmNlIFRhYmxlIEV4aGF1c3RlZFxuIik7CisJCWtmcmVlKHBfcHRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcG9ydF9sb2NrKHJlZik7CisJcF9wdHItPnB1YmwucmVmID0gcmVmOworCW1zZyA9ICZwX3B0ci0+cHVibC5waGRyOworCW1zZ19pbml0KG1zZywgREFUQV9MT1csIFRJUENfTkFNRURfTVNHLCBUSVBDX09LLCBMT05HX0hfU0laRSwgMCk7CisJbXNnX3NldF9vcmlnbm9kZShtc2csIHRpcGNfb3duX2FkZHIpOworCW1zZ19zZXRfcHJldm5vZGUobXNnLCB0aXBjX293bl9hZGRyKTsKKwltc2dfc2V0X29yaWdwb3J0KG1zZywgcmVmKTsKKwltc2dfc2V0X2ltcG9ydGFuY2UobXNnLGltcG9ydGFuY2UpOworCXBfcHRyLT5sYXN0X2luX3NlcW5vID0gNDE7CisJcF9wdHItPnNlbnQgPSAxOworCXBfcHRyLT5wdWJsLnVzcl9oYW5kbGUgPSB1c3JfaGFuZGxlOworCUlOSVRfTElTVF9IRUFEKCZwX3B0ci0+d2FpdF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcF9wdHItPnN1YnNjcmlwdGlvbi5ub2Rlc3ViX2xpc3QpOworCXBfcHRyLT5jb25nZXN0ZWRfbGluayA9IDA7CisJcF9wdHItPm1heF9wa3QgPSBNQVhfUEtUX0RFRkFVTFQ7CisJcF9wdHItPmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyOworCXBfcHRyLT53YWtldXAgPSB3YWtldXA7CisJcF9wdHItPnVzZXJfcG9ydCA9IDA7CisJa19pbml0X3RpbWVyKCZwX3B0ci0+dGltZXIsIChIYW5kbGVyKXBvcnRfdGltZW91dCwgcmVmKTsKKwlzcGluX2xvY2tfYmgoJnBvcnRfbGlzdF9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcF9wdHItPnB1YmxpY2F0aW9ucyk7CisJSU5JVF9MSVNUX0hFQUQoJnBfcHRyLT5wb3J0X2xpc3QpOworCWxpc3RfYWRkX3RhaWwoJnBfcHRyLT5wb3J0X2xpc3QsICZwb3J0cyk7CisJc3Bpbl91bmxvY2tfYmgoJnBvcnRfbGlzdF9sb2NrKTsKKwlwb3J0X3VubG9jayhwX3B0cik7CisJcmV0dXJuIHJlZjsKK30KKworaW50IHRpcGNfZGVsZXRlcG9ydCh1MzIgcmVmKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gMDsKKworCXRpcGNfd2l0aGRyYXcocmVmLCAwLCAwKTsKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpIAorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZl9kaXNjYXJkKHJlZik7CisJcG9ydF91bmxvY2socF9wdHIpOworCisJa19jYW5jZWxfdGltZXIoJnBfcHRyLT50aW1lcik7CisJaWYgKHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkgeworCQlidWYgPSBwb3J0X2J1aWxkX3BlZXJfYWJvcnRfbXNnKHBfcHRyLCBUSVBDX0VSUl9OT19QT1JUKTsKKwkJbm9kZXN1Yl91bnN1YnNjcmliZSgmcF9wdHItPnN1YnNjcmlwdGlvbik7CisJfQorCWlmIChwX3B0ci0+dXNlcl9wb3J0KSB7CisJCXJlZ19yZW1vdmVfcG9ydChwX3B0ci0+dXNlcl9wb3J0KTsKKwkJa2ZyZWUocF9wdHItPnVzZXJfcG9ydCk7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZwb3J0X2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJnBfcHRyLT5wb3J0X2xpc3QpOworCWxpc3RfZGVsKCZwX3B0ci0+d2FpdF9saXN0KTsKKwlzcGluX3VubG9ja19iaCgmcG9ydF9saXN0X2xvY2spOworCWtfdGVybV90aW1lcigmcF9wdHItPnRpbWVyKTsKKwlrZnJlZShwX3B0cik7CisJZGJnKCJEZWxldGVkIHBvcnQgJXVcbiIsIHJlZik7CisJbmV0X3JvdXRlX21zZyhidWYpOworCXJldHVybiBUSVBDX09LOworfQorCisvKioKKyAqIHRpcGNfZ2V0X3BvcnQoKSAtIHJldHVybiBwb3J0IGFzc29jaWF0ZWQgd2l0aCAncmVmJworICogCisgKiBOb3RlOiBQb3J0IGlzIG5vdCBsb2NrZWQuCisgKi8KKworc3RydWN0IHRpcGNfcG9ydCAqdGlwY19nZXRfcG9ydChjb25zdCB1MzIgcmVmKQoreworCXJldHVybiAoc3RydWN0IHRpcGNfcG9ydCAqKXJlZl9kZXJlZihyZWYpOworfQorCisvKioKKyAqIHRpcGNfZ2V0X2hhbmRsZSAtIHJldHVybiB1c2VyIGhhbmRsZSBhc3NvY2lhdGVkIHRvIHBvcnQgJ3JlZicKKyAqLworCit2b2lkICp0aXBjX2dldF9oYW5kbGUoY29uc3QgdTMyIHJlZikKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJdm9pZCAqIGhhbmRsZTsKKworCXBfcHRyID0gcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIDA7CisJaGFuZGxlID0gcF9wdHItPnB1YmwudXNyX2hhbmRsZTsKKwlwb3J0X3VubG9jayhwX3B0cik7CisJcmV0dXJuIGhhbmRsZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcG9ydF91bnJlbGlhYmxlKHN0cnVjdCBwb3J0ICpwX3B0cikKK3sKKwlyZXR1cm4gbXNnX3NyY19kcm9wcGFibGUoJnBfcHRyLT5wdWJsLnBoZHIpOworfQorCitpbnQgdGlwY19wb3J0dW5yZWxpYWJsZSh1MzIgcmVmLCB1bnNpZ25lZCBpbnQgKmlzdW5yZWxpYWJsZSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJCisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqaXN1bnJlbGlhYmxlID0gcG9ydF91bnJlbGlhYmxlKHBfcHRyKTsKKwlzcGluX3VubG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworaW50IHRpcGNfc2V0X3BvcnR1bnJlbGlhYmxlKHUzMiByZWYsIHVuc2lnbmVkIGludCBpc3VucmVsaWFibGUpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCQorCXBfcHRyID0gcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXNnX3NldF9zcmNfZHJvcHBhYmxlKCZwX3B0ci0+cHVibC5waGRyLCAoaXN1bnJlbGlhYmxlICE9IDApKTsKKwlwb3J0X3VubG9jayhwX3B0cik7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBvcnRfdW5yZXR1cm5hYmxlKHN0cnVjdCBwb3J0ICpwX3B0cikKK3sKKwlyZXR1cm4gbXNnX2Rlc3RfZHJvcHBhYmxlKCZwX3B0ci0+cHVibC5waGRyKTsKK30KKworaW50IHRpcGNfcG9ydHVucmV0dXJuYWJsZSh1MzIgcmVmLCB1bnNpZ25lZCBpbnQgKmlzdW5yZWplY3RhYmxlKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwkKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCSppc3VucmVqZWN0YWJsZSA9IHBvcnRfdW5yZXR1cm5hYmxlKHBfcHRyKTsKKwlzcGluX3VubG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworaW50IHRpcGNfc2V0X3BvcnR1bnJldHVybmFibGUodTMyIHJlZiwgdW5zaWduZWQgaW50IGlzdW5yZWplY3RhYmxlKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwkKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCW1zZ19zZXRfZGVzdF9kcm9wcGFibGUoJnBfcHRyLT5wdWJsLnBoZHIsIChpc3VucmVqZWN0YWJsZSAhPSAwKSk7CisJcG9ydF91bmxvY2socF9wdHIpOworCXJldHVybiBUSVBDX09LOworfQorCisvKiAKKyAqIHBvcnRfYnVpbGRfcHJvdG9fbXNnKCk6IGJ1aWxkIGEgcG9ydCBsZXZlbCBwcm90b2NvbCAKKyAqIG9yIGEgY29ubmVjdGlvbiBhYm9ydGlvbiBtZXNzYWdlLiBDYWxsZWQgd2l0aCAKKyAqIHRpcGNfcG9ydCBsb2NrIG9uLgorICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnBvcnRfYnVpbGRfcHJvdG9fbXNnKHUzMiBkZXN0cG9ydCwgdTMyIGRlc3Rub2RlLAorCQkJCQkgICAgdTMyIG9yaWdwb3J0LCB1MzIgb3JpZ25vZGUsCisJCQkJCSAgICB1MzIgdXNyLCB1MzIgdHlwZSwgdTMyIGVyciwgCisJCQkJCSAgICB1MzIgc2Vxbm8sIHUzMiBhY2spCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwkKKwlidWYgPSBidWZfYWNxdWlyZShMT05HX0hfU0laRSk7CisJaWYgKGJ1ZikgeworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1zZ19pbml0KG1zZywgdXNyLCB0eXBlLCBlcnIsIExPTkdfSF9TSVpFLCBkZXN0bm9kZSk7CisJCW1zZ19zZXRfZGVzdHBvcnQobXNnLCBkZXN0cG9ydCk7CisJCW1zZ19zZXRfb3JpZ3BvcnQobXNnLCBvcmlncG9ydCk7CisJCW1zZ19zZXRfZGVzdG5vZGUobXNnLCBkZXN0bm9kZSk7CisJCW1zZ19zZXRfb3JpZ25vZGUobXNnLCBvcmlnbm9kZSk7CisJCW1zZ19zZXRfdHJhbnNwX3NlcW5vKG1zZywgc2Vxbm8pOworCQltc2dfc2V0X21zZ2NudChtc2csIGFjayk7CisJCW1zZ19kYmcobXNnLCAiUE9SVD5TRU5EPjoiKTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IHRpcGNfc2V0X21zZ19vcHRpb24oc3RydWN0IHRpcGNfcG9ydCAqdHBfcHRyLCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IHUzMiBzeikKK3sKKwltc2dfZXhwYW5kKCZ0cF9wdHItPnBoZHIsIG1zZ19kZXN0bm9kZSgmdHBfcHRyLT5waGRyKSk7CisJbXNnX3NldF9vcHRpb25zKCZ0cF9wdHItPnBoZHIsIG9wdCwgc3opOworCXJldHVybiBUSVBDX09LOworfQorCitpbnQgdGlwY19yZWplY3RfbXNnKHN0cnVjdCBza19idWZmICpidWYsIHUzMiBlcnIpCit7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJc3RydWN0IHNrX2J1ZmYgKnJidWY7CisJc3RydWN0IHRpcGNfbXNnICpybXNnOworCWludCBoZHJfc3o7CisJdTMyIGltcCA9IG1zZ19pbXBvcnRhbmNlKG1zZyk7CisJdTMyIGRhdGFfc3ogPSBtc2dfZGF0YV9zeihtc2cpOworCisJaWYgKGRhdGFfc3ogPiBNQVhfUkVKRUNUX1NJWkUpCisJCWRhdGFfc3ogPSBNQVhfUkVKRUNUX1NJWkU7CisJaWYgKG1zZ19jb25uZWN0ZWQobXNnKSAmJiAoaW1wIDwgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKSkKKwkJaW1wKys7CisJbXNnX2RiZyhtc2csICJwb3J0LT5yZWo6ICIpOworCisJLyogZGlzY2FyZCByZWplY3RlZCBtZXNzYWdlIGlmIGl0IHNob3VsZG4ndCBiZSByZXR1cm5lZCB0byBzZW5kZXIgKi8KKwlpZiAobXNnX2VycmNvZGUobXNnKSB8fCBtc2dfZGVzdF9kcm9wcGFibGUobXNnKSkgeworCQlidWZfZGlzY2FyZChidWYpOworCQlyZXR1cm4gZGF0YV9zejsKKwl9CisKKwkvKiBjb25zdHJ1Y3QgcmVqZWN0ZWQgbWVzc2FnZSAqLworCWlmIChtc2dfbWNhc3QobXNnKSkKKwkJaGRyX3N6ID0gTUNBU1RfSF9TSVpFOworCWVsc2UKKwkJaGRyX3N6ID0gTE9OR19IX1NJWkU7CisJcmJ1ZiA9IGJ1Zl9hY3F1aXJlKGRhdGFfc3ogKyBoZHJfc3opOworCWlmIChyYnVmID09IE5VTEwpIHsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJcmV0dXJuIGRhdGFfc3o7CisJfQorCXJtc2cgPSBidWZfbXNnKHJidWYpOworCW1zZ19pbml0KHJtc2csIGltcCwgbXNnX3R5cGUobXNnKSwgZXJyLCBoZHJfc3osIG1zZ19vcmlnbm9kZShtc2cpKTsKKwltc2dfc2V0X2Rlc3Rwb3J0KHJtc2csIG1zZ19vcmlncG9ydChtc2cpKTsKKwltc2dfc2V0X3ByZXZub2RlKHJtc2csIHRpcGNfb3duX2FkZHIpOworCW1zZ19zZXRfb3JpZ3BvcnQocm1zZywgbXNnX2Rlc3Rwb3J0KG1zZykpOworCWlmIChtc2dfc2hvcnQobXNnKSkKKwkJbXNnX3NldF9vcmlnbm9kZShybXNnLCB0aXBjX293bl9hZGRyKTsKKwllbHNlCisJCW1zZ19zZXRfb3JpZ25vZGUocm1zZywgbXNnX2Rlc3Rub2RlKG1zZykpOworCW1zZ19zZXRfc2l6ZShybXNnLCBkYXRhX3N6ICsgaGRyX3N6KTsgCisJbXNnX3NldF9uYW1ldHlwZShybXNnLCBtc2dfbmFtZXR5cGUobXNnKSk7CisJbXNnX3NldF9uYW1laW5zdChybXNnLCBtc2dfbmFtZWluc3QobXNnKSk7CisJbWVtY3B5KHJidWYtPmRhdGEgKyBoZHJfc3osIG1zZ19kYXRhKG1zZyksIGRhdGFfc3opOworCisJLyogc2VuZCBzZWxmLWFib3J0IG1lc3NhZ2Ugd2hlbiByZWplY3Rpbmcgb24gYSBjb25uZWN0ZWQgcG9ydCAqLworCWlmIChtc2dfY29ubmVjdGVkKG1zZykpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmFidWYgPSAwOworCQlzdHJ1Y3QgcG9ydCAqcF9wdHIgPSBwb3J0X2xvY2sobXNnX2Rlc3Rwb3J0KG1zZykpOworCisJCWlmIChwX3B0cikgeworCQkJaWYgKHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJCQlhYnVmID0gcG9ydF9idWlsZF9zZWxmX2Fib3J0X21zZyhwX3B0ciwgZXJyKTsKKwkJCXBvcnRfdW5sb2NrKHBfcHRyKTsKKwkJfQorCQluZXRfcm91dGVfbXNnKGFidWYpOworCX0KKworCS8qIHNlbmQgcmVqZWN0ZWQgbWVzc2FnZSAqLworCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJbmV0X3JvdXRlX21zZyhyYnVmKTsKKwlyZXR1cm4gZGF0YV9zejsKK30KKworaW50IHBvcnRfcmVqZWN0X3NlY3Rpb25zKHN0cnVjdCBwb3J0ICpwX3B0ciwgc3RydWN0IHRpcGNfbXNnICpoZHIsCisJCQkgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCwgdTMyIG51bV9zZWN0LAorCQkJIGludCBlcnIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlpbnQgcmVzOworCisJcmVzID0gbXNnX2J1aWxkKGhkciwgbXNnX3NlY3QsIG51bV9zZWN0LCBNQVhfTVNHX1NJWkUsIAorCQkJIXBfcHRyLT51c2VyX3BvcnQsICZidWYpOworCWlmICghYnVmKQorCQlyZXR1cm4gcmVzOworCisJcmV0dXJuIHRpcGNfcmVqZWN0X21zZyhidWYsIGVycik7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfdGltZW91dCh1bnNpZ25lZCBsb25nIHJlZikKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gMDsKKworCWlmICghcF9wdHIgfHwgIXBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJcmV0dXJuOworCisJLyogTGFzdCBwcm9iZSBhbnN3ZXJlZCA/ICovCisJaWYgKHBfcHRyLT5wcm9iaW5nX3N0YXRlID09IFBST0JJTkcpIHsKKwkJYnVmID0gcG9ydF9idWlsZF9zZWxmX2Fib3J0X21zZyhwX3B0ciwgVElQQ19FUlJfTk9fUE9SVCk7CisJfSBlbHNlIHsKKwkJYnVmID0gcG9ydF9idWlsZF9wcm90b19tc2cocG9ydF9wZWVycG9ydChwX3B0ciksCisJCQkJCSAgIHBvcnRfcGVlcm5vZGUocF9wdHIpLAorCQkJCQkgICBwX3B0ci0+cHVibC5yZWYsCisJCQkJCSAgIHRpcGNfb3duX2FkZHIsCisJCQkJCSAgIENPTk5fTUFOQUdFUiwKKwkJCQkJICAgQ09OTl9QUk9CRSwKKwkJCQkJICAgVElQQ19PSywgCisJCQkJCSAgIHBvcnRfb3V0X3NlcW5vKHBfcHRyKSwKKwkJCQkJICAgMCk7CisJCXBvcnRfaW5jcl9vdXRfc2Vxbm8ocF9wdHIpOworCQlwX3B0ci0+cHJvYmluZ19zdGF0ZSA9IFBST0JJTkc7CisJCWtfc3RhcnRfdGltZXIoJnBfcHRyLT50aW1lciwgcF9wdHItPnByb2JpbmdfaW50ZXJ2YWwpOworCX0KKwlwb3J0X3VubG9jayhwX3B0cik7CisJbmV0X3JvdXRlX21zZyhidWYpOworfQorCisKK3N0YXRpYyB2b2lkIHBvcnRfaGFuZGxlX25vZGVfZG93bih1bnNpZ25lZCBsb25nIHJlZikKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlzdHJ1Y3Qgc2tfYnVmZiogYnVmID0gMDsKKworCWlmICghcF9wdHIpCisJCXJldHVybjsKKwlidWYgPSBwb3J0X2J1aWxkX3NlbGZfYWJvcnRfbXNnKHBfcHRyLCBUSVBDX0VSUl9OT19OT0RFKTsKKwlwb3J0X3VubG9jayhwX3B0cik7CisJbmV0X3JvdXRlX21zZyhidWYpOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcG9ydF9idWlsZF9zZWxmX2Fib3J0X21zZyhzdHJ1Y3QgcG9ydCAqcF9wdHIsIHUzMiBlcnIpCit7CisJdTMyIGltcCA9IG1zZ19pbXBvcnRhbmNlKCZwX3B0ci0+cHVibC5waGRyKTsKKworCWlmICghcF9wdHItPnB1YmwuY29ubmVjdGVkKQorCQlyZXR1cm4gMDsKKwlpZiAoaW1wIDwgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKQorCQlpbXArKzsKKwlyZXR1cm4gcG9ydF9idWlsZF9wcm90b19tc2cocF9wdHItPnB1YmwucmVmLAorCQkJCSAgICB0aXBjX293bl9hZGRyLAorCQkJCSAgICBwb3J0X3BlZXJwb3J0KHBfcHRyKSwKKwkJCQkgICAgcG9ydF9wZWVybm9kZShwX3B0ciksCisJCQkJICAgIGltcCwKKwkJCQkgICAgVElQQ19DT05OX01TRywKKwkJCQkgICAgZXJyLCAKKwkJCQkgICAgcF9wdHItPmxhc3RfaW5fc2Vxbm8gKyAxLAorCQkJCSAgICAwKTsKK30KKworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnBvcnRfYnVpbGRfcGVlcl9hYm9ydF9tc2coc3RydWN0IHBvcnQgKnBfcHRyLCB1MzIgZXJyKQoreworCXUzMiBpbXAgPSBtc2dfaW1wb3J0YW5jZSgmcF9wdHItPnB1YmwucGhkcik7CisKKwlpZiAoIXBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisJaWYgKGltcCA8IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkKKwkJaW1wKys7CisJcmV0dXJuIHBvcnRfYnVpbGRfcHJvdG9fbXNnKHBvcnRfcGVlcnBvcnQocF9wdHIpLAorCQkJCSAgICBwb3J0X3BlZXJub2RlKHBfcHRyKSwKKwkJCQkgICAgcF9wdHItPnB1YmwucmVmLAorCQkJCSAgICB0aXBjX293bl9hZGRyLAorCQkJCSAgICBpbXAsCisJCQkJICAgIFRJUENfQ09OTl9NU0csCisJCQkJICAgIGVyciwgCisJCQkJICAgIHBvcnRfb3V0X3NlcW5vKHBfcHRyKSwKKwkJCQkgICAgMCk7Cit9CisKK3ZvaWQgcG9ydF9yZWN2X3Byb3RvX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCXN0cnVjdCBwb3J0ICpwX3B0ciA9IHBvcnRfbG9jayhtc2dfZGVzdHBvcnQobXNnKSk7CisJdTMyIGVyciA9IFRJUENfT0s7CisJc3RydWN0IHNrX2J1ZmYgKnJfYnVmID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWJvcnRfYnVmID0gMDsKKworCW1zZ19kYmcobXNnLCAiUE9SVDxSRUNWPDoiKTsKKworCWlmICghcF9wdHIpIHsKKwkJZXJyID0gVElQQ19FUlJfTk9fUE9SVDsKKwl9IGVsc2UgaWYgKHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkgeworCQlpZiAocG9ydF9wZWVybm9kZShwX3B0cikgIT0gbXNnX29yaWdub2RlKG1zZykpCisJCQllcnIgPSBUSVBDX0VSUl9OT19QT1JUOworCQlpZiAocG9ydF9wZWVycG9ydChwX3B0cikgIT0gbXNnX29yaWdwb3J0KG1zZykpCisJCQllcnIgPSBUSVBDX0VSUl9OT19QT1JUOworCQlpZiAoIWVyciAmJiBtc2dfcm91dGVkKG1zZykpIHsKKwkJCXUzMiBzZXFubyA9IG1zZ190cmFuc3Bfc2Vxbm8obXNnKTsKKwkJCXUzMiBteW5vID0gICsrcF9wdHItPmxhc3RfaW5fc2Vxbm87CisJCQlpZiAoc2Vxbm8gIT0gbXlubykgeworCQkJCWVyciA9IFRJUENfRVJSX05PX1BPUlQ7CisJCQkJYWJvcnRfYnVmID0gcG9ydF9idWlsZF9zZWxmX2Fib3J0X21zZyhwX3B0ciwgZXJyKTsKKwkJCX0KKwkJfQorCQlpZiAobXNnX3R5cGUobXNnKSA9PSBDT05OX0FDSykgeworCQkJaW50IHdha2V1cCA9IHBvcnRfY29uZ2VzdGVkKHBfcHRyKSAmJiAKKwkJCQkgICAgIHBfcHRyLT5wdWJsLmNvbmdlc3RlZCAmJgorCQkJCSAgICAgcF9wdHItPndha2V1cDsKKwkJCXBfcHRyLT5hY2tlZCArPSBtc2dfbXNnY250KG1zZyk7CisJCQlpZiAocG9ydF9jb25nZXN0ZWQocF9wdHIpKQorCQkJCWdvdG8gZXhpdDsKKwkJCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDA7CisJCQlpZiAoIXdha2V1cCkKKwkJCQlnb3RvIGV4aXQ7CisJCQlwX3B0ci0+d2FrZXVwKCZwX3B0ci0+cHVibCk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9IGVsc2UgaWYgKHBfcHRyLT5wdWJsLnB1Ymxpc2hlZCkgeworCQllcnIgPSBUSVBDX0VSUl9OT19QT1JUOworCX0KKwlpZiAoZXJyKSB7CisJCXJfYnVmID0gcG9ydF9idWlsZF9wcm90b19tc2cobXNnX29yaWdwb3J0KG1zZyksCisJCQkJCSAgICAgbXNnX29yaWdub2RlKG1zZyksIAorCQkJCQkgICAgIG1zZ19kZXN0cG9ydChtc2cpLCAKKwkJCQkJICAgICB0aXBjX293bl9hZGRyLAorCQkJCQkgICAgIERBVEFfSElHSCwKKwkJCQkJICAgICBUSVBDX0NPTk5fTVNHLAorCQkJCQkgICAgIGVyciwKKwkJCQkJICAgICAwLAorCQkJCQkgICAgIDApOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogQWxsIGlzIGZpbmUgKi8KKwlpZiAobXNnX3R5cGUobXNnKSA9PSBDT05OX1BST0JFKSB7CisJCXJfYnVmID0gcG9ydF9idWlsZF9wcm90b19tc2cobXNnX29yaWdwb3J0KG1zZyksIAorCQkJCQkgICAgIG1zZ19vcmlnbm9kZShtc2cpLCAKKwkJCQkJICAgICBtc2dfZGVzdHBvcnQobXNnKSwgCisJCQkJCSAgICAgdGlwY19vd25fYWRkciwgCisJCQkJCSAgICAgQ09OTl9NQU5BR0VSLAorCQkJCQkgICAgIENPTk5fUFJPQkVfUkVQTFksCisJCQkJCSAgICAgVElQQ19PSywKKwkJCQkJICAgICBwb3J0X291dF9zZXFubyhwX3B0ciksCisJCQkJCSAgICAgMCk7CisJfQorCXBfcHRyLT5wcm9iaW5nX3N0YXRlID0gQ09ORklSTUVEOworCXBvcnRfaW5jcl9vdXRfc2Vxbm8ocF9wdHIpOworZXhpdDoKKwlpZiAocF9wdHIpCisJCXBvcnRfdW5sb2NrKHBfcHRyKTsKKwluZXRfcm91dGVfbXNnKHJfYnVmKTsKKwluZXRfcm91dGVfbXNnKGFib3J0X2J1Zik7CisJYnVmX2Rpc2NhcmQoYnVmKTsKK30KKworc3RhdGljIHZvaWQgcG9ydF9wcmludChzdHJ1Y3QgcG9ydCAqcF9wdHIsIHN0cnVjdCBwcmludF9idWYgKmJ1ZiwgaW50IGZ1bGxfaWQpCit7CisgICAgICAgIHN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKworCWlmIChmdWxsX2lkKQorCQl0aXBjX3ByaW50ZihidWYsICI8JXUuJXUuJXU6JXU+OiIsIAorCQkJICAgIHRpcGNfem9uZSh0aXBjX293bl9hZGRyKSwgdGlwY19jbHVzdGVyKHRpcGNfb3duX2FkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcGNfbm9kZSh0aXBjX293bl9hZGRyKSwgcF9wdHItPnB1YmwucmVmKTsKKwllbHNlCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIiUtMTB1OiIsIHBfcHRyLT5wdWJsLnJlZik7CisKKyAgICAgICAgaWYgKHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgIHUzMiBkcG9ydCA9IHBvcnRfcGVlcnBvcnQocF9wdHIpOworICAgICAgICAgICAgICAgIHUzMiBkZXN0bm9kZSA9IHBvcnRfcGVlcm5vZGUocF9wdHIpOworCisgICAgICAgICAgICAgICAgdGlwY19wcmludGYoYnVmLCAiIGNvbm5lY3RlZCB0byA8JXUuJXUuJXU6JXU+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX3pvbmUoZGVzdG5vZGUpLCB0aXBjX2NsdXN0ZXIoZGVzdG5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcGNfbm9kZShkZXN0bm9kZSksIGRwb3J0KTsKKyAgICAgICAgICAgICAgICBpZiAocF9wdHItPnB1YmwuY29ubl90eXBlICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX3ByaW50ZihidWYsICIgdmlhIHsldSwldX0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wdHItPnB1YmwuY29ubl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wdHItPnB1YmwuY29ubl9pbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocF9wdHItPnB1YmwucHVibGlzaGVkKSB7CisgICAgICAgICAgICAgICAgdGlwY19wcmludGYoYnVmLCAiIGJvdW5kIHRvIik7CisgICAgICAgICAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeShwdWJsLCAmcF9wdHItPnB1YmxpY2F0aW9ucywgcHBvcnRfbGlzdCkgeworCQkJaWYgKHB1YmwtPmxvd2VyID09IHB1YmwtPnVwcGVyKQorCQkJCXRpcGNfcHJpbnRmKGJ1ZiwgIiB7JXUsJXV9IiwgcHVibC0+dHlwZSwKKwkJCQkJICAgIHB1YmwtPmxvd2VyKTsKKwkJCWVsc2UKKwkJCQl0aXBjX3ByaW50ZihidWYsICIgeyV1LCV1LCV1fSIsIHB1YmwtPnR5cGUsIAorCQkJCQkgICAgcHVibC0+bG93ZXIsIHB1YmwtPnVwcGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGlwY19wcmludGYoYnVmLCAiXG4iKTsKK30KKworI2RlZmluZSBNQVhfUE9SVF9RVUVSWSAzMjc2OAorCitzdHJ1Y3Qgc2tfYnVmZiAqcG9ydF9nZXRfcG9ydHModm9pZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCB0bHZfZGVzYyAqcmVwX3RsdjsKKwlzdHJ1Y3QgcHJpbnRfYnVmIHBiOworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlpbnQgc3RyX2xlbjsKKworCWJ1ZiA9IGNmZ19yZXBseV9hbGxvYyhUTFZfU1BBQ0UoTUFYX1BPUlRfUVVFUlkpKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIE5VTEw7CisJcmVwX3RsdiA9IChzdHJ1Y3QgdGx2X2Rlc2MgKilidWYtPmRhdGE7CisKKwlwcmludGJ1Zl9pbml0KCZwYiwgVExWX0RBVEEocmVwX3RsdiksIE1BWF9QT1JUX1FVRVJZKTsKKwlzcGluX2xvY2tfYmgoJnBvcnRfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBfcHRyLCAmcG9ydHMsIHBvcnRfbGlzdCkgeworCQlzcGluX2xvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJCXBvcnRfcHJpbnQocF9wdHIsICZwYiwgMCk7CisJCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCX0KKwlzcGluX3VubG9ja19iaCgmcG9ydF9saXN0X2xvY2spOworCXN0cl9sZW4gPSBwcmludGJ1Zl92YWxpZGF0ZSgmcGIpOworCisJc2tiX3B1dChidWYsIFRMVl9TUEFDRShzdHJfbGVuKSk7CisJVExWX1NFVChyZXBfdGx2LCBUSVBDX1RMVl9VTFRSQV9TVFJJTkcsIE5VTEwsIHN0cl9sZW4pOworCisJcmV0dXJuIGJ1ZjsKK30KKworI2lmIDAKKworI2RlZmluZSBNQVhfUE9SVF9TVEFUUyAyMDAwCisKK3N0cnVjdCBza19idWZmICpwb3J0X3Nob3dfc3RhdHMoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSkKK3sKKwl1MzIgcmVmOworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCB0bHZfZGVzYyAqcmVwX3RsdjsKKwlzdHJ1Y3QgcHJpbnRfYnVmIHBiOworCWludCBzdHJfbGVuOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9QT1JUX1JFRikpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwlyZWYgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJcmVmID0gbnRvaGwocmVmKTsKKworCXBfcHRyID0gcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoInBvcnQgbm90IGZvdW5kIik7CisKKwlidWYgPSBjZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKE1BWF9QT1JUX1NUQVRTKSk7CisJaWYgKCFidWYpIHsKKwkJcG9ydF91bmxvY2socF9wdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmVwX3RsdiA9IChzdHJ1Y3QgdGx2X2Rlc2MgKilidWYtPmRhdGE7CisKKwlwcmludGJ1Zl9pbml0KCZwYiwgVExWX0RBVEEocmVwX3RsdiksIE1BWF9QT1JUX1NUQVRTKTsKKwlwb3J0X3ByaW50KHBfcHRyLCAmcGIsIDEpOworCS8qIE5FRUQgVE8gRklMTCBJTiBBRERJVElPTkFMIFBPUlQgU1RBVElTVElDUyBIRVJFICovCisJcG9ydF91bmxvY2socF9wdHIpOworCXN0cl9sZW4gPSBwcmludGJ1Zl92YWxpZGF0ZSgmcGIpOworCisJc2tiX3B1dChidWYsIFRMVl9TUEFDRShzdHJfbGVuKSk7CisJVExWX1NFVChyZXBfdGx2LCBUSVBDX1RMVl9VTFRSQV9TVFJJTkcsIE5VTEwsIHN0cl9sZW4pOworCisJcmV0dXJuIGJ1ZjsKK30KKworI2VuZGlmCisKK3ZvaWQgcG9ydF9yZWluaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisKKwlzcGluX2xvY2tfYmgoJnBvcnRfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBfcHRyLCAmcG9ydHMsIHBvcnRfbGlzdCkgeworCQltc2cgPSAmcF9wdHItPnB1YmwucGhkcjsKKwkJaWYgKG1zZ19vcmlnbm9kZShtc2cpID09IHRpcGNfb3duX2FkZHIpCisJCQlicmVhazsKKwkJbXNnX3NldF9vcmlnbm9kZShtc2csIHRpcGNfb3duX2FkZHIpOworCX0KKwlzcGluX3VubG9ja19iaCgmcG9ydF9saXN0X2xvY2spOworfQorCisKKy8qCisgKiAgcG9ydF9kaXNwYXRjaGVyX3NpZ2goKTogU2lnbmFsIGhhbmRsZXIgZm9yIG1lc3NhZ2VzIGRlc3RpbmF0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgdGlwY19wb3J0IGludGVyZmFjZS4KKyAqLworCitzdGF0aWMgdm9pZCBwb3J0X2Rpc3BhdGNoZXJfc2lnaCh2b2lkICpkdW1teSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCisJc3Bpbl9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlidWYgPSBtc2dfcXVldWVfaGVhZDsKKwltc2dfcXVldWVfaGVhZCA9IDA7CisJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCisJd2hpbGUgKGJ1ZikgeworCQlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJCXN0cnVjdCB1c2VyX3BvcnQgKnVwX3B0cjsKKwkJc3RydWN0IHRpcGNfcG9ydGlkIG9yaWc7CisJCXN0cnVjdCB0aXBjX25hbWVfc2VxIGRzZXE7CisJCXZvaWQgKnVzcl9oYW5kbGU7CisJCWludCBjb25uZWN0ZWQ7CisJCWludCBwdWJsaXNoZWQ7CisKKwkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBidWYtPm5leHQ7CisJCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCQl1MzIgZHJlZiA9IG1zZ19kZXN0cG9ydChtc2cpOworCQkKKwkJcF9wdHIgPSBwb3J0X2xvY2soZHJlZik7CisJCWlmICghcF9wdHIpIHsKKwkJCS8qIFBvcnQgZGVsZXRlZCB3aGlsZSBtc2cgaW4gcXVldWUgKi8KKwkJCXRpcGNfcmVqZWN0X21zZyhidWYsIFRJUENfRVJSX05PX1BPUlQpOworCQkJYnVmID0gbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCW9yaWcucmVmID0gbXNnX29yaWdwb3J0KG1zZyk7CisJCW9yaWcubm9kZSA9IG1zZ19vcmlnbm9kZShtc2cpOworCQl1cF9wdHIgPSBwX3B0ci0+dXNlcl9wb3J0OworCQl1c3JfaGFuZGxlID0gdXBfcHRyLT51c3JfaGFuZGxlOworCQljb25uZWN0ZWQgPSBwX3B0ci0+cHVibC5jb25uZWN0ZWQ7CisJCXB1Ymxpc2hlZCA9IHBfcHRyLT5wdWJsLnB1Ymxpc2hlZDsKKworCQlpZiAodW5saWtlbHkobXNnX2VycmNvZGUobXNnKSkpCisJCQlnb3RvIGVycjsKKworCQlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwkJCisJCWNhc2UgVElQQ19DT05OX01TRzp7CisJCQkJdGlwY19jb25uX21zZ19ldmVudCBjYiA9IHVwX3B0ci0+Y29ubl9tc2dfY2I7CisJCQkJdTMyIHBlZXJfcG9ydCA9IHBvcnRfcGVlcnBvcnQocF9wdHIpOworCQkJCXUzMiBwZWVyX25vZGUgPSBwb3J0X3BlZXJub2RlKHBfcHRyKTsKKworCQkJCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCQkJCWlmICh1bmxpa2VseSghY29ubmVjdGVkKSkgeworCQkJCQlpZiAodW5saWtlbHkocHVibGlzaGVkKSkKKwkJCQkJCWdvdG8gcmVqZWN0OworCQkJCQl0aXBjX2Nvbm5lY3QycG9ydChkcmVmLCZvcmlnKTsKKwkJCQl9CisJCQkJaWYgKHVubGlrZWx5KG1zZ19vcmlncG9ydChtc2cpICE9IHBlZXJfcG9ydCkpCisJCQkJCWdvdG8gcmVqZWN0OworCQkJCWlmICh1bmxpa2VseShtc2dfb3JpZ25vZGUobXNnKSAhPSBwZWVyX25vZGUpKQorCQkJCQlnb3RvIHJlamVjdDsKKwkJCQlpZiAodW5saWtlbHkoIWNiKSkKKwkJCQkJZ290byByZWplY3Q7CisJCQkJaWYgKHVubGlrZWx5KCsrcF9wdHItPnB1YmwuY29ubl91bmFja2VkID49IAorCQkJCQkgICAgIFRJUENfRkxPV19DT05UUk9MX1dJTikpCisJCQkJCXRpcGNfYWNrbm93bGVkZ2UoZHJlZiwgCisJCQkJCQkJIHBfcHRyLT5wdWJsLmNvbm5fdW5hY2tlZCk7CisJCQkJc2tiX3B1bGwoYnVmLCBtc2dfaGRyX3N6KG1zZykpOworCQkJCWNiKHVzcl9oYW5kbGUsIGRyZWYsICZidWYsIG1zZ19kYXRhKG1zZyksCisJCQkJICAgbXNnX2RhdGFfc3oobXNnKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgVElQQ19ESVJFQ1RfTVNHOnsKKwkJCQl0aXBjX21zZ19ldmVudCBjYiA9IHVwX3B0ci0+bXNnX2NiOworCisJCQkJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJCQkJaWYgKHVubGlrZWx5KGNvbm5lY3RlZCkpCisJCQkJCWdvdG8gcmVqZWN0OworCQkJCWlmICh1bmxpa2VseSghY2IpKQorCQkJCQlnb3RvIHJlamVjdDsKKwkJCQlza2JfcHVsbChidWYsIG1zZ19oZHJfc3oobXNnKSk7CisJCQkJY2IodXNyX2hhbmRsZSwgZHJlZiwgJmJ1ZiwgbXNnX2RhdGEobXNnKSwgCisJCQkJICAgbXNnX2RhdGFfc3oobXNnKSwgbXNnX2ltcG9ydGFuY2UobXNnKSwKKwkJCQkgICAmb3JpZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgVElQQ19OQU1FRF9NU0c6eworCQkJCXRpcGNfbmFtZWRfbXNnX2V2ZW50IGNiID0gdXBfcHRyLT5uYW1lZF9tc2dfY2I7CisKKwkJCQlzcGluX3VubG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwkJCQlpZiAodW5saWtlbHkoY29ubmVjdGVkKSkKKwkJCQkJZ290byByZWplY3Q7CisJCQkJaWYgKHVubGlrZWx5KCFjYikpCisJCQkJCWdvdG8gcmVqZWN0OworCQkJCWlmICh1bmxpa2VseSghcHVibGlzaGVkKSkKKwkJCQkJZ290byByZWplY3Q7CisJCQkJZHNlcS50eXBlID0gIG1zZ19uYW1ldHlwZShtc2cpOworCQkJCWRzZXEubG93ZXIgPSBtc2dfbmFtZWluc3QobXNnKTsKKwkJCQlkc2VxLnVwcGVyID0gZHNlcS5sb3dlcjsKKwkJCQlza2JfcHVsbChidWYsIG1zZ19oZHJfc3oobXNnKSk7CisJCQkJY2IodXNyX2hhbmRsZSwgZHJlZiwgJmJ1ZiwgbXNnX2RhdGEobXNnKSwgCisJCQkJICAgbXNnX2RhdGFfc3oobXNnKSwgbXNnX2ltcG9ydGFuY2UobXNnKSwKKwkJCQkgICAmb3JpZywgJmRzZXEpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChidWYpCisJCQlidWZfZGlzY2FyZChidWYpOworCQlidWYgPSBuZXh0OworCQljb250aW51ZTsKK2VycjoKKwkJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJCQorCQljYXNlIFRJUENfQ09OTl9NU0c6eworCQkJCXRpcGNfY29ubl9zaHV0ZG93bl9ldmVudCBjYiA9IAorCQkJCQl1cF9wdHItPmNvbm5fZXJyX2NiOworCQkJCXUzMiBwZWVyX3BvcnQgPSBwb3J0X3BlZXJwb3J0KHBfcHRyKTsKKwkJCQl1MzIgcGVlcl9ub2RlID0gcG9ydF9wZWVybm9kZShwX3B0cik7CisKKwkJCQlzcGluX3VubG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwkJCQlpZiAoIWNvbm5lY3RlZCB8fCAhY2IpCisJCQkJCWJyZWFrOworCQkJCWlmIChtc2dfb3JpZ3BvcnQobXNnKSAhPSBwZWVyX3BvcnQpCisJCQkJCWJyZWFrOworCQkJCWlmIChtc2dfb3JpZ25vZGUobXNnKSAhPSBwZWVyX25vZGUpCisJCQkJCWJyZWFrOworCQkJCXRpcGNfZGlzY29ubmVjdChkcmVmKTsKKwkJCQlza2JfcHVsbChidWYsIG1zZ19oZHJfc3oobXNnKSk7CisJCQkJY2IodXNyX2hhbmRsZSwgZHJlZiwgJmJ1ZiwgbXNnX2RhdGEobXNnKSwKKwkJCQkgICBtc2dfZGF0YV9zeihtc2cpLCBtc2dfZXJyY29kZShtc2cpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBUSVBDX0RJUkVDVF9NU0c6eworCQkJCXRpcGNfbXNnX2Vycl9ldmVudCBjYiA9IHVwX3B0ci0+ZXJyX2NiOworCisJCQkJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJCQkJaWYgKGNvbm5lY3RlZCB8fCAhY2IpCisJCQkJCWJyZWFrOworCQkJCXNrYl9wdWxsKGJ1ZiwgbXNnX2hkcl9zeihtc2cpKTsKKwkJCQljYih1c3JfaGFuZGxlLCBkcmVmLCAmYnVmLCBtc2dfZGF0YShtc2cpLAorCQkJCSAgIG1zZ19kYXRhX3N6KG1zZyksIG1zZ19lcnJjb2RlKG1zZyksICZvcmlnKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBUSVBDX05BTUVEX01TRzp7CisJCQkJdGlwY19uYW1lZF9tc2dfZXJyX2V2ZW50IGNiID0gCisJCQkJCXVwX3B0ci0+bmFtZWRfZXJyX2NiOworCisJCQkJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJCQkJaWYgKGNvbm5lY3RlZCB8fCAhY2IpCisJCQkJCWJyZWFrOworCQkJCWRzZXEudHlwZSA9ICBtc2dfbmFtZXR5cGUobXNnKTsKKwkJCQlkc2VxLmxvd2VyID0gbXNnX25hbWVpbnN0KG1zZyk7CisJCQkJZHNlcS51cHBlciA9IGRzZXEubG93ZXI7CisJCQkJc2tiX3B1bGwoYnVmLCBtc2dfaGRyX3N6KG1zZykpOworCQkJCWNiKHVzcl9oYW5kbGUsIGRyZWYsICZidWYsIG1zZ19kYXRhKG1zZyksIAorCQkJCSAgIG1zZ19kYXRhX3N6KG1zZyksIG1zZ19lcnJjb2RlKG1zZyksICZkc2VxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoYnVmKQorCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJYnVmID0gbmV4dDsKKwkJY29udGludWU7CityZWplY3Q6CisJCXRpcGNfcmVqZWN0X21zZyhidWYsIFRJUENfRVJSX05PX1BPUlQpOworCQlidWYgPSBuZXh0OworCX0KK30KKworLyoKKyAqICBwb3J0X2Rpc3BhdGNoZXIoKTogRGlzcGF0Y2hlciBmb3IgbWVzc2FnZXMgZGVzdGluYXRlZAorICogIHRvIHRoZSB0aXBjX3BvcnQgaW50ZXJmYWNlLiBDYWxsZWQgd2l0aCBwb3J0IGxvY2tlZC4KKyAqLworCitzdGF0aWMgdTMyIHBvcnRfZGlzcGF0Y2hlcihzdHJ1Y3QgdGlwY19wb3J0ICpkdW1teSwgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlidWYtPm5leHQgPSBOVUxMOworCXNwaW5fbG9ja19iaCgmcXVldWVfbG9jayk7CisJaWYgKG1zZ19xdWV1ZV9oZWFkKSB7CisJCW1zZ19xdWV1ZV90YWlsLT5uZXh0ID0gYnVmOworCQltc2dfcXVldWVfdGFpbCA9IGJ1ZjsKKwl9IGVsc2UgeworCQltc2dfcXVldWVfdGFpbCA9IG1zZ19xdWV1ZV9oZWFkID0gYnVmOworCQlrX3NpZ25hbCgoSGFuZGxlcilwb3J0X2Rpc3BhdGNoZXJfc2lnaCwgMCk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworLyogCisgKiBXYWtlIHVwIHBvcnQgYWZ0ZXIgY29uZ2VzdGlvbjogQ2FsbGVkIHdpdGggcG9ydCBsb2NrZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi8KKworc3RhdGljIHZvaWQgcG9ydF93YWtldXBfc2godW5zaWduZWQgbG9uZyByZWYpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCB1c2VyX3BvcnQgKnVwX3B0cjsKKwl0aXBjX2NvbnRpbnVlX2V2ZW50IGNiID0gMDsKKwl2b2lkICp1aCA9IDA7CisKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmIChwX3B0cikgeworCQl1cF9wdHIgPSBwX3B0ci0+dXNlcl9wb3J0OworCQlpZiAodXBfcHRyKSB7CisJCQljYiA9IHVwX3B0ci0+Y29udGludWVfZXZlbnRfY2I7CisJCQl1aCA9IHVwX3B0ci0+dXNyX2hhbmRsZTsKKwkJfQorCQlwb3J0X3VubG9jayhwX3B0cik7CisJfQorCWlmIChjYikKKwkJY2IodWgsIHJlZik7Cit9CisKKworc3RhdGljIHZvaWQgcG9ydF93YWtldXAoc3RydWN0IHRpcGNfcG9ydCAqcF9wdHIpCit7CisJa19zaWduYWwoKEhhbmRsZXIpcG9ydF93YWtldXBfc2gsIHBfcHRyLT5yZWYpOworfQorCit2b2lkIHRpcGNfYWNrbm93bGVkZ2UodTMyIHJlZiwgdTMyIGFjaykKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IDA7CisKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybjsKKwlpZiAocF9wdHItPnB1YmwuY29ubmVjdGVkKSB7CisJCXBfcHRyLT5wdWJsLmNvbm5fdW5hY2tlZCAtPSBhY2s7CisJCWJ1ZiA9IHBvcnRfYnVpbGRfcHJvdG9fbXNnKHBvcnRfcGVlcnBvcnQocF9wdHIpLAorCQkJCQkgICBwb3J0X3BlZXJub2RlKHBfcHRyKSwKKwkJCQkJICAgcmVmLAorCQkJCQkgICB0aXBjX293bl9hZGRyLAorCQkJCQkgICBDT05OX01BTkFHRVIsCisJCQkJCSAgIENPTk5fQUNLLAorCQkJCQkgICBUSVBDX09LLCAKKwkJCQkJICAgcG9ydF9vdXRfc2Vxbm8ocF9wdHIpLAorCQkJCQkgICBhY2spOworCX0KKwlwb3J0X3VubG9jayhwX3B0cik7CisJbmV0X3JvdXRlX21zZyhidWYpOworfQorCisvKgorICogdGlwY19jcmVhdGVwb3J0KCk6IHVzZXIgbGV2ZWwgY2FsbC4gV2lsbCBhZGQgcG9ydCB0bworICogICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5IGlmIG5vbi16ZXJvIHVzZXJfcmVmLgorICovCisKK2ludCB0aXBjX2NyZWF0ZXBvcnQodTMyIHVzZXJfcmVmLCAKKwkJICAgIHZvaWQgKnVzcl9oYW5kbGUsIAorCQkgICAgdW5zaWduZWQgaW50IGltcG9ydGFuY2UsIAorCQkgICAgdGlwY19tc2dfZXJyX2V2ZW50IGVycm9yX2NiLCAKKwkJICAgIHRpcGNfbmFtZWRfbXNnX2Vycl9ldmVudCBuYW1lZF9lcnJvcl9jYiwgCisJCSAgICB0aXBjX2Nvbm5fc2h1dGRvd25fZXZlbnQgY29ubl9lcnJvcl9jYiwgCisJCSAgICB0aXBjX21zZ19ldmVudCBtc2dfY2IsIAorCQkgICAgdGlwY19uYW1lZF9tc2dfZXZlbnQgbmFtZWRfbXNnX2NiLCAKKwkJICAgIHRpcGNfY29ubl9tc2dfZXZlbnQgY29ubl9tc2dfY2IsIAorCQkgICAgdGlwY19jb250aW51ZV9ldmVudCBjb250aW51ZV9ldmVudF9jYiwvKiBNYXkgYmUgemVybyAqLworCQkgICAgdTMyICpwb3J0cmVmKQoreworCXN0cnVjdCB1c2VyX3BvcnQgKnVwX3B0cjsKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7IAorCXUzMiByZWY7CisKKwl1cF9wdHIgPSAoc3RydWN0IHVzZXJfcG9ydCAqKWttYWxsb2Moc2l6ZW9mKCp1cF9wdHIpLCBHRlBfQVRPTUlDKTsKKwlpZiAodXBfcHRyID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJlZiA9IHRpcGNfY3JlYXRlcG9ydF9yYXcoMCwgcG9ydF9kaXNwYXRjaGVyLCBwb3J0X3dha2V1cCwgaW1wb3J0YW5jZSk7CisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKSB7CisJCWtmcmVlKHVwX3B0cik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBfcHRyLT51c2VyX3BvcnQgPSB1cF9wdHI7CisJdXBfcHRyLT51c2VyX3JlZiA9IHVzZXJfcmVmOworCXVwX3B0ci0+dXNyX2hhbmRsZSA9IHVzcl9oYW5kbGU7CisJdXBfcHRyLT5yZWYgPSBwX3B0ci0+cHVibC5yZWY7CisJdXBfcHRyLT5lcnJfY2IgPSBlcnJvcl9jYjsKKwl1cF9wdHItPm5hbWVkX2Vycl9jYiA9IG5hbWVkX2Vycm9yX2NiOworCXVwX3B0ci0+Y29ubl9lcnJfY2IgPSBjb25uX2Vycm9yX2NiOworCXVwX3B0ci0+bXNnX2NiID0gbXNnX2NiOworCXVwX3B0ci0+bmFtZWRfbXNnX2NiID0gbmFtZWRfbXNnX2NiOworCXVwX3B0ci0+Y29ubl9tc2dfY2IgPSBjb25uX21zZ19jYjsKKwl1cF9wdHItPmNvbnRpbnVlX2V2ZW50X2NiID0gY29udGludWVfZXZlbnRfY2I7CisJSU5JVF9MSVNUX0hFQUQoJnVwX3B0ci0+dXBvcnRfbGlzdCk7CisJcmVnX2FkZF9wb3J0KHVwX3B0cik7CisJKnBvcnRyZWYgPSBwX3B0ci0+cHVibC5yZWY7CisJZGJnKCIgdGlwY19jcmVhdGVwb3J0OiAleCB3aXRoIHJlZiAldVxuIiwgcF9wdHIsIHBfcHRyLT5wdWJsLnJlZik7ICAgICAgICAKKwlwb3J0X3VubG9jayhwX3B0cik7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCB0aXBjX293bmlkZW50aXR5KHUzMiByZWYsIHN0cnVjdCB0aXBjX3BvcnRpZCAqaWQpCit7CisJaWQtPnJlZiA9IHJlZjsKKwlpZC0+bm9kZSA9IHRpcGNfb3duX2FkZHI7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCB0aXBjX3BvcnRpbXBvcnRhbmNlKHUzMiByZWYsIHVuc2lnbmVkIGludCAqaW1wb3J0YW5jZSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJCisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqaW1wb3J0YW5jZSA9ICh1bnNpZ25lZCBpbnQpbXNnX2ltcG9ydGFuY2UoJnBfcHRyLT5wdWJsLnBoZHIpOworCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCXJldHVybiBUSVBDX09LOworfQorCitpbnQgdGlwY19zZXRfcG9ydGltcG9ydGFuY2UodTMyIHJlZiwgdW5zaWduZWQgaW50IGltcCkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisKKwlpZiAoaW1wID4gVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBfcHRyID0gcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXNnX3NldF9pbXBvcnRhbmNlKCZwX3B0ci0+cHVibC5waGRyLCAodTMyKWltcCk7CisJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKworaW50IHRpcGNfcHVibGlzaCh1MzIgcmVmLCB1bnNpZ25lZCBpbnQgc2NvcGUsIHN0cnVjdCB0aXBjX25hbWVfc2VxIGNvbnN0ICpzZXEpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKwl1MzIga2V5OworCWludCByZXMgPSAtRUlOVkFMOworCisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlkYmcoInRpcGNfcHVibCAldSwgcF9wdHIgPSAleCwgY29ubiA9ICV4LCBzY29wZSA9ICV4LCAiCisJICAgICJsb3dlciA9ICV1LCB1cHBlciA9ICV1XG4iLAorCSAgICByZWYsIHBfcHRyLCBwX3B0ci0+cHVibC5jb25uZWN0ZWQsIHNjb3BlLCBzZXEtPmxvd2VyLCBzZXEtPnVwcGVyKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocF9wdHItPnB1YmwuY29ubmVjdGVkKQorCQlnb3RvIGV4aXQ7CisJaWYgKHNlcS0+bG93ZXIgPiBzZXEtPnVwcGVyKQorCQlnb3RvIGV4aXQ7CisJaWYgKChzY29wZSA8IFRJUENfWk9ORV9TQ09QRSkgfHwgKHNjb3BlID4gVElQQ19OT0RFX1NDT1BFKSkKKwkJZ290byBleGl0OworCWtleSA9IHJlZiArIHBfcHRyLT5wdWJfY291bnQgKyAxOworCWlmIChrZXkgPT0gcmVmKSB7CisJCXJlcyA9IC1FQUREUklOVVNFOworCQlnb3RvIGV4aXQ7CisJfQorCXB1YmwgPSBuYW1ldGJsX3B1Ymxpc2goc2VxLT50eXBlLCBzZXEtPmxvd2VyLCBzZXEtPnVwcGVyLAorCQkJICAgICAgIHNjb3BlLCBwX3B0ci0+cHVibC5yZWYsIGtleSk7CisJaWYgKHB1YmwpIHsKKwkJbGlzdF9hZGQoJnB1YmwtPnBwb3J0X2xpc3QsICZwX3B0ci0+cHVibGljYXRpb25zKTsKKwkJcF9wdHItPnB1Yl9jb3VudCsrOworCQlwX3B0ci0+cHVibC5wdWJsaXNoZWQgPSAxOworCQlyZXMgPSBUSVBDX09LOworCX0KK2V4aXQ6CisJcG9ydF91bmxvY2socF9wdHIpOworCXJldHVybiByZXM7Cit9CisKK2ludCB0aXBjX3dpdGhkcmF3KHUzMiByZWYsIHVuc2lnbmVkIGludCBzY29wZSwgc3RydWN0IHRpcGNfbmFtZV9zZXEgY29uc3QgKnNlcSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCXN0cnVjdCBwdWJsaWNhdGlvbiAqdHB1Ymw7CisJaW50IHJlcyA9IC1FSU5WQUw7CisJCisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXBfcHRyLT5wdWJsLnB1Ymxpc2hlZCkKKwkJZ290byBleGl0OworCWlmICghc2VxKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdWJsLCB0cHVibCwgCisJCQkJCSAmcF9wdHItPnB1YmxpY2F0aW9ucywgcHBvcnRfbGlzdCkgeworCQkJbmFtZXRibF93aXRoZHJhdyhwdWJsLT50eXBlLCBwdWJsLT5sb3dlciwgCisJCQkJCSBwdWJsLT5yZWYsIHB1YmwtPmtleSk7CisJCX0KKwkJcmVzID0gVElQQ19PSzsKKwl9IGVsc2UgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHVibCwgdHB1YmwsIAorCQkJCQkgJnBfcHRyLT5wdWJsaWNhdGlvbnMsIHBwb3J0X2xpc3QpIHsKKwkJCWlmIChwdWJsLT5zY29wZSAhPSBzY29wZSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwdWJsLT50eXBlICE9IHNlcS0+dHlwZSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwdWJsLT5sb3dlciAhPSBzZXEtPmxvd2VyKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHB1YmwtPnVwcGVyICE9IHNlcS0+dXBwZXIpCisJCQkJYnJlYWs7CisJCQluYW1ldGJsX3dpdGhkcmF3KHB1YmwtPnR5cGUsIHB1YmwtPmxvd2VyLCAKKwkJCQkJIHB1YmwtPnJlZiwgcHVibC0+a2V5KTsKKwkJCXJlcyA9IFRJUENfT0s7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAobGlzdF9lbXB0eSgmcF9wdHItPnB1YmxpY2F0aW9ucykpCisJCXBfcHRyLT5wdWJsLnB1Ymxpc2hlZCA9IDA7CitleGl0OgorCXBvcnRfdW5sb2NrKHBfcHRyKTsKKwlyZXR1cm4gcmVzOworfQorCitpbnQgdGlwY19jb25uZWN0MnBvcnQodTMyIHJlZiwgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpwZWVyKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwlpbnQgcmVzID0gLUVJTlZBTDsKKworCXBfcHRyID0gcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBfcHRyLT5wdWJsLnB1Ymxpc2hlZCB8fCBwX3B0ci0+cHVibC5jb25uZWN0ZWQpCisJCWdvdG8gZXhpdDsKKwlpZiAoIXBlZXItPnJlZikKKwkJZ290byBleGl0OworCisJbXNnID0gJnBfcHRyLT5wdWJsLnBoZHI7CisJbXNnX3NldF9kZXN0bm9kZShtc2csIHBlZXItPm5vZGUpOworCW1zZ19zZXRfZGVzdHBvcnQobXNnLCBwZWVyLT5yZWYpOworCW1zZ19zZXRfb3JpZ25vZGUobXNnLCB0aXBjX293bl9hZGRyKTsKKwltc2dfc2V0X29yaWdwb3J0KG1zZywgcF9wdHItPnB1YmwucmVmKTsKKwltc2dfc2V0X3RyYW5zcF9zZXFubyhtc2csIDQyKTsKKwltc2dfc2V0X3R5cGUobXNnLCBUSVBDX0NPTk5fTVNHKTsKKwlpZiAoIW1heV9yb3V0ZShwZWVyLT5ub2RlKSkKKwkJbXNnX3NldF9oZHJfc3oobXNnLCBTSE9SVF9IX1NJWkUpOworCWVsc2UKKwkJbXNnX3NldF9oZHJfc3oobXNnLCBMT05HX0hfU0laRSk7CisKKwlwX3B0ci0+cHJvYmluZ19pbnRlcnZhbCA9IFBST0JJTkdfSU5URVJWQUw7CisJcF9wdHItPnByb2Jpbmdfc3RhdGUgPSBDT05GSVJNRUQ7CisJcF9wdHItPnB1YmwuY29ubmVjdGVkID0gMTsKKwlrX3N0YXJ0X3RpbWVyKCZwX3B0ci0+dGltZXIsIHBfcHRyLT5wcm9iaW5nX2ludGVydmFsKTsKKworCW5vZGVzdWJfc3Vic2NyaWJlKCZwX3B0ci0+c3Vic2NyaXB0aW9uLHBlZXItPm5vZGUsCisJCQkgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcmVmLAorCQkJICAobmV0X2V2X2hhbmRsZXIpcG9ydF9oYW5kbGVfbm9kZV9kb3duKTsKKwlyZXMgPSBUSVBDX09LOworZXhpdDoKKwlwb3J0X3VubG9jayhwX3B0cik7CisJcF9wdHItPm1heF9wa3QgPSBsaW5rX2dldF9tYXhfcGt0KHBlZXItPm5vZGUsIHJlZik7CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIHRpcGNfZGlzY29ubmVjdCgpOiBEaXNjb25uZWN0IHBvcnQgZm9ybSBwZWVyLgorICogICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBub2RlIGxvY2FsIG9wZXJhdGlvbi4KKyAqLworCitpbnQgdGlwY19kaXNjb25uZWN0KHUzMiByZWYpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCWludCByZXMgPSAtRU5PVENPTk47CisKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwX3B0ci0+cHVibC5jb25uZWN0ZWQpIHsKKwkJcF9wdHItPnB1YmwuY29ubmVjdGVkID0gMDsKKwkJLyogbGV0IHRpbWVyIGV4cGlyZSBvbiBpdCdzIG93biB0byBhdm9pZCBkZWFkbG9jayEgKi8KKwkJbm9kZXN1Yl91bnN1YnNjcmliZSgmcF9wdHItPnN1YnNjcmlwdGlvbik7CisJCXJlcyA9IFRJUENfT0s7CisJfQorCXBvcnRfdW5sb2NrKHBfcHRyKTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogdGlwY19zaHV0ZG93bigpOiBTZW5kIGEgU0hVVERPV04gbXNnIHRvIHBlZXIgYW5kIGRpc2Nvbm5lY3QKKyAqLworaW50IHRpcGNfc2h1dGRvd24odTMyIHJlZikKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IDA7CisKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkgeworCQl1MzIgaW1wID0gbXNnX2ltcG9ydGFuY2UoJnBfcHRyLT5wdWJsLnBoZHIpOworCQlpZiAoaW1wIDwgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKQorCQkJaW1wKys7CisJCWJ1ZiA9IHBvcnRfYnVpbGRfcHJvdG9fbXNnKHBvcnRfcGVlcnBvcnQocF9wdHIpLAorCQkJCQkgICBwb3J0X3BlZXJub2RlKHBfcHRyKSwKKwkJCQkJICAgcmVmLAorCQkJCQkgICB0aXBjX293bl9hZGRyLAorCQkJCQkgICBpbXAsCisJCQkJCSAgIFRJUENfQ09OTl9NU0csCisJCQkJCSAgIFRJUENfQ09OTl9TSFVURE9XTiwgCisJCQkJCSAgIHBvcnRfb3V0X3NlcW5vKHBfcHRyKSwKKwkJCQkJICAgMCk7CisJfQorCXBvcnRfdW5sb2NrKHBfcHRyKTsKKwluZXRfcm91dGVfbXNnKGJ1Zik7CisJcmV0dXJuIHRpcGNfZGlzY29ubmVjdChyZWYpOworfQorCitpbnQgdGlwY19pc2Nvbm5lY3RlZCh1MzIgcmVmLCBpbnQgKmlzY29ubmVjdGVkKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwkKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCSppc2Nvbm5lY3RlZCA9IHBfcHRyLT5wdWJsLmNvbm5lY3RlZDsKKwlwb3J0X3VubG9jayhwX3B0cik7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCB0aXBjX3BlZXIodTMyIHJlZiwgc3RydWN0IHRpcGNfcG9ydGlkICpwZWVyKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlpbnQgcmVzOworCSAKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwX3B0ci0+cHVibC5jb25uZWN0ZWQpIHsKKwkJcGVlci0+cmVmID0gcG9ydF9wZWVycG9ydChwX3B0cik7CisJCXBlZXItPm5vZGUgPSBwb3J0X3BlZXJub2RlKHBfcHRyKTsKKwkJcmVzID0gVElQQ19PSzsKKwl9IGVsc2UKKwkJcmVzID0gLUVOT1RDT05OOworCXBvcnRfdW5sb2NrKHBfcHRyKTsKKwlyZXR1cm4gcmVzOworfQorCitpbnQgdGlwY19yZWZfdmFsaWQodTMyIHJlZikKK3sKKwkvKiBXb3JrcyBpcnJlc3BlY3RpdmUgb2YgdHlwZSAqLworCXJldHVybiAhIXJlZl9kZXJlZihyZWYpOworfQorCisKKy8qCisgKiAgcG9ydF9yZWN2X3NlY3Rpb25zKCk6IENvbmNhdGVuYXRlIGFuZCBkZWxpdmVyIHNlY3Rpb25lZAorICogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIGZvciB0aGlzIG5vZGUuCisgKi8KKworaW50IHBvcnRfcmVjdl9zZWN0aW9ucyhzdHJ1Y3QgcG9ydCAqc2VuZGVyLCB1bnNpZ25lZCBpbnQgbnVtX3NlY3QsCisJCSAgICAgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0KQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJaW50IHJlczsKKwkgCisJcmVzID0gbXNnX2J1aWxkKCZzZW5kZXItPnB1YmwucGhkciwgbXNnX3NlY3QsIG51bV9zZWN0LAorCQkJTUFYX01TR19TSVpFLCAhc2VuZGVyLT51c2VyX3BvcnQsICZidWYpOworCWlmIChsaWtlbHkoYnVmKSkKKwkJcG9ydF9yZWN2X21zZyhidWYpOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogdGlwY19zZW5kIC0gc2VuZCBtZXNzYWdlIHNlY3Rpb25zIG9uIGNvbm5lY3Rpb24KKyAqLworCitpbnQgdGlwY19zZW5kKHUzMiByZWYsIHVuc2lnbmVkIGludCBudW1fc2VjdCwgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJdTMyIGRlc3Rub2RlOworCWludCByZXM7CisKKwlwX3B0ciA9IHBvcnRfZGVyZWYocmVmKTsKKwlpZiAoIXBfcHRyIHx8ICFwX3B0ci0+cHVibC5jb25uZWN0ZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJcF9wdHItPnB1YmwuY29uZ2VzdGVkID0gMTsKKwlpZiAoIXBvcnRfY29uZ2VzdGVkKHBfcHRyKSkgeworCQlkZXN0bm9kZSA9IHBvcnRfcGVlcm5vZGUocF9wdHIpOworCQlpZiAobGlrZWx5KGRlc3Rub2RlICE9IHRpcGNfb3duX2FkZHIpKQorCQkJcmVzID0gbGlua19zZW5kX3NlY3Rpb25zX2Zhc3QocF9wdHIsIG1zZ19zZWN0LCBudW1fc2VjdCwKKwkJCQkJCSAgICAgIGRlc3Rub2RlKTsKKwkJZWxzZQorCQkJcmVzID0gcG9ydF9yZWN2X3NlY3Rpb25zKHBfcHRyLCBudW1fc2VjdCwgbXNnX3NlY3QpOworCisJCWlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKSB7CisJCQlwb3J0X2luY3Jfb3V0X3NlcW5vKHBfcHRyKTsKKwkJCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDA7CisJCQlwX3B0ci0+c2VudCsrOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKwlpZiAocG9ydF91bnJlbGlhYmxlKHBfcHRyKSkgeworCQlwX3B0ci0+cHVibC5jb25nZXN0ZWQgPSAwOworCQkvKiBKdXN0IGNhbGN1bGF0ZSBtc2cgbGVuZ3RoIGFuZCByZXR1cm4gKi8KKwkJcmV0dXJuIG1zZ19jYWxjX2RhdGFfc2l6ZShtc2dfc2VjdCwgbnVtX3NlY3QpOworCX0KKwlyZXR1cm4gLUVMSU5LQ09ORzsKK30KKworLyoqIAorICogdGlwY19zZW5kX2J1ZiAtIHNlbmQgbWVzc2FnZSBidWZmZXIgb24gY29ubmVjdGlvbgorICovCisKK2ludCB0aXBjX3NlbmRfYnVmKHUzMiByZWYsIHN0cnVjdCBza19idWZmICpidWYsIHVuc2lnbmVkIGludCBkc3opCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCXUzMiBkZXN0bm9kZTsKKwl1MzIgaHN6OworCXUzMiBzejsKKwl1MzIgcmVzOworCSAKKwlwX3B0ciA9IHBvcnRfZGVyZWYocmVmKTsKKwlpZiAoIXBfcHRyIHx8ICFwX3B0ci0+cHVibC5jb25uZWN0ZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJbXNnID0gJnBfcHRyLT5wdWJsLnBoZHI7CisJaHN6ID0gbXNnX2hkcl9zeihtc2cpOworCXN6ID0gaHN6ICsgZHN6OworCW1zZ19zZXRfc2l6ZShtc2csIHN6KTsKKwlpZiAoc2tiX2NvdyhidWYsIGhzeikpCisJCXJldHVybiAtRU5PTUVNOworCisJc2tiX3B1c2goYnVmLCBoc3opOworCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKiltc2csIGhzeik7CisJZGVzdG5vZGUgPSBtc2dfZGVzdG5vZGUobXNnKTsKKwlwX3B0ci0+cHVibC5jb25nZXN0ZWQgPSAxOworCWlmICghcG9ydF9jb25nZXN0ZWQocF9wdHIpKSB7CisJCWlmIChsaWtlbHkoZGVzdG5vZGUgIT0gdGlwY19vd25fYWRkcikpCisJCQlyZXMgPSB0aXBjX3NlbmRfYnVmX2Zhc3QoYnVmLCBkZXN0bm9kZSk7CisJCWVsc2UgeworCQkJcG9ydF9yZWN2X21zZyhidWYpOworCQkJcmVzID0gc3o7CisJCX0KKwkJaWYgKGxpa2VseShyZXMgIT0gLUVMSU5LQ09ORykpIHsKKwkJCXBvcnRfaW5jcl9vdXRfc2Vxbm8ocF9wdHIpOworCQkJcF9wdHItPnNlbnQrKzsKKwkJCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDA7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCWlmIChwb3J0X3VucmVsaWFibGUocF9wdHIpKSB7CisJCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDA7CisJCXJldHVybiBkc3o7CisJfQorCXJldHVybiAtRUxJTktDT05HOworfQorCisvKioKKyAqIHRpcGNfZm9yd2FyZDJuYW1lIC0gZm9yd2FyZCBtZXNzYWdlIHNlY3Rpb25zIHRvIHBvcnQgbmFtZQorICovCisKK2ludCB0aXBjX2ZvcndhcmQybmFtZSh1MzIgcmVmLCAKKwkJICAgICAgc3RydWN0IHRpcGNfbmFtZSBjb25zdCAqbmFtZSwgCisJCSAgICAgIHUzMiBkb21haW4sCisJCSAgICAgIHUzMiBudW1fc2VjdCwgCisJCSAgICAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsCisJCSAgICAgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZywgCisJCSAgICAgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1MzIgZGVzdG5vZGUgPSBkb21haW47CisJdTMyIGRlc3Rwb3J0ID0gMDsKKwlpbnQgcmVzOworCisJcF9wdHIgPSBwb3J0X2RlcmVmKHJlZik7CisJaWYgKCFwX3B0ciB8fCBwX3B0ci0+cHVibC5jb25uZWN0ZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJbXNnID0gJnBfcHRyLT5wdWJsLnBoZHI7CisJbXNnX3NldF90eXBlKG1zZywgVElQQ19OQU1FRF9NU0cpOworCW1zZ19zZXRfb3JpZ25vZGUobXNnLCBvcmlnLT5ub2RlKTsKKwltc2dfc2V0X29yaWdwb3J0KG1zZywgb3JpZy0+cmVmKTsKKwltc2dfc2V0X2hkcl9zeihtc2csIExPTkdfSF9TSVpFKTsKKwltc2dfc2V0X25hbWV0eXBlKG1zZywgbmFtZS0+dHlwZSk7CisJbXNnX3NldF9uYW1laW5zdChtc2csIG5hbWUtPmluc3RhbmNlKTsKKwltc2dfc2V0X2xvb2t1cF9zY29wZShtc2csIGFkZHJfc2NvcGUoZG9tYWluKSk7CisJaWYgKGltcG9ydGFuY2UgPD0gVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKQorCQltc2dfc2V0X2ltcG9ydGFuY2UobXNnLGltcG9ydGFuY2UpOworCWRlc3Rwb3J0ID0gbmFtZXRibF90cmFuc2xhdGUobmFtZS0+dHlwZSwgbmFtZS0+aW5zdGFuY2UsICZkZXN0bm9kZSk7CisJbXNnX3NldF9kZXN0bm9kZShtc2csIGRlc3Rub2RlKTsKKwltc2dfc2V0X2Rlc3Rwb3J0KG1zZywgZGVzdHBvcnQpOworCisJaWYgKGxpa2VseShkZXN0cG9ydCB8fCBkZXN0bm9kZSkpIHsKKwkJcF9wdHItPnNlbnQrKzsKKwkJaWYgKGxpa2VseShkZXN0bm9kZSA9PSB0aXBjX293bl9hZGRyKSkKKwkJCXJldHVybiBwb3J0X3JlY3Zfc2VjdGlvbnMocF9wdHIsIG51bV9zZWN0LCBtc2dfc2VjdCk7CisJCXJlcyA9IGxpbmtfc2VuZF9zZWN0aW9uc19mYXN0KHBfcHRyLCBtc2dfc2VjdCwgbnVtX3NlY3QsIAorCQkJCQkgICAgICBkZXN0bm9kZSk7CisJCWlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKQorCQkJcmV0dXJuIHJlczsKKwkJaWYgKHBvcnRfdW5yZWxpYWJsZShwX3B0cikpIHsKKwkJCS8qIEp1c3QgY2FsY3VsYXRlIG1zZyBsZW5ndGggYW5kIHJldHVybiAqLworCQkJcmV0dXJuIG1zZ19jYWxjX2RhdGFfc2l6ZShtc2dfc2VjdCwgbnVtX3NlY3QpOworCQl9CisJCXJldHVybiAtRUxJTktDT05HOworCX0KKwlyZXR1cm4gcG9ydF9yZWplY3Rfc2VjdGlvbnMocF9wdHIsIG1zZywgbXNnX3NlY3QsIG51bV9zZWN0LCAKKwkJCQkgICAgVElQQ19FUlJfTk9fTkFNRSk7Cit9CisKKy8qKgorICogdGlwY19zZW5kMm5hbWUgLSBzZW5kIG1lc3NhZ2Ugc2VjdGlvbnMgdG8gcG9ydCBuYW1lCisgKi8KKworaW50IHRpcGNfc2VuZDJuYW1lKHUzMiByZWYsIAorCQkgICBzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpuYW1lLAorCQkgICB1bnNpZ25lZCBpbnQgZG9tYWluLCAKKwkJICAgdW5zaWduZWQgaW50IG51bV9zZWN0LCAKKwkJICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCkKK3sKKwlzdHJ1Y3QgdGlwY19wb3J0aWQgb3JpZzsKKworCW9yaWcucmVmID0gcmVmOworCW9yaWcubm9kZSA9IHRpcGNfb3duX2FkZHI7CisJcmV0dXJuIHRpcGNfZm9yd2FyZDJuYW1lKHJlZiwgbmFtZSwgZG9tYWluLCBudW1fc2VjdCwgbXNnX3NlY3QsICZvcmlnLAorCQkJCSBUSVBDX1BPUlRfSU1QT1JUQU5DRSk7Cit9CisKKy8qKiAKKyAqIHRpcGNfZm9yd2FyZF9idWYybmFtZSAtIGZvcndhcmQgbWVzc2FnZSBidWZmZXIgdG8gcG9ydCBuYW1lCisgKi8KKworaW50IHRpcGNfZm9yd2FyZF9idWYybmFtZSh1MzIgcmVmLAorCQkJICBzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpuYW1lLAorCQkJICB1MzIgZG9tYWluLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAorCQkJICB1bnNpZ25lZCBpbnQgZHN6LAorCQkJICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWcsCisJCQkgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1MzIgZGVzdG5vZGUgPSBkb21haW47CisJdTMyIGRlc3Rwb3J0ID0gMDsKKwlpbnQgcmVzOworCisJcF9wdHIgPSAoc3RydWN0IHBvcnQgKilyZWZfZGVyZWYocmVmKTsKKwlpZiAoIXBfcHRyIHx8IHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2cgPSAmcF9wdHItPnB1YmwucGhkcjsKKwlpZiAoaW1wb3J0YW5jZSA8PSBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UpCisJCW1zZ19zZXRfaW1wb3J0YW5jZShtc2csIGltcG9ydGFuY2UpOworCW1zZ19zZXRfdHlwZShtc2csIFRJUENfTkFNRURfTVNHKTsKKwltc2dfc2V0X29yaWdub2RlKG1zZywgb3JpZy0+bm9kZSk7CisJbXNnX3NldF9vcmlncG9ydChtc2csIG9yaWctPnJlZik7CisJbXNnX3NldF9uYW1ldHlwZShtc2csIG5hbWUtPnR5cGUpOworCW1zZ19zZXRfbmFtZWluc3QobXNnLCBuYW1lLT5pbnN0YW5jZSk7CisJbXNnX3NldF9sb29rdXBfc2NvcGUobXNnLCBhZGRyX3Njb3BlKGRvbWFpbikpOworCW1zZ19zZXRfaGRyX3N6KG1zZywgTE9OR19IX1NJWkUpOworCW1zZ19zZXRfc2l6ZShtc2csIExPTkdfSF9TSVpFICsgZHN6KTsKKwlkZXN0cG9ydCA9IG5hbWV0YmxfdHJhbnNsYXRlKG5hbWUtPnR5cGUsIG5hbWUtPmluc3RhbmNlLCAmZGVzdG5vZGUpOworCW1zZ19zZXRfZGVzdG5vZGUobXNnLCBkZXN0bm9kZSk7CisJbXNnX3NldF9kZXN0cG9ydChtc2csIGRlc3Rwb3J0KTsKKwltc2dfZGJnKG1zZywgImZvcncybmFtZSA9PT4gIik7CisJaWYgKHNrYl9jb3coYnVmLCBMT05HX0hfU0laRSkpCisJCXJldHVybiAtRU5PTUVNOworCXNrYl9wdXNoKGJ1ZiwgTE9OR19IX1NJWkUpOworCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKiltc2csIExPTkdfSF9TSVpFKTsKKwltc2dfZGJnKGJ1Zl9tc2coYnVmKSwiUFJFUDoiKTsKKwlpZiAobGlrZWx5KGRlc3Rwb3J0IHx8IGRlc3Rub2RlKSkgeworCQlwX3B0ci0+c2VudCsrOworCQlpZiAoZGVzdG5vZGUgPT0gdGlwY19vd25fYWRkcikKKwkJCXJldHVybiBwb3J0X3JlY3ZfbXNnKGJ1Zik7CisJCXJlcyA9IHRpcGNfc2VuZF9idWZfZmFzdChidWYsIGRlc3Rub2RlKTsKKwkJaWYgKGxpa2VseShyZXMgIT0gLUVMSU5LQ09ORykpCisJCQlyZXR1cm4gcmVzOworCQlpZiAocG9ydF91bnJlbGlhYmxlKHBfcHRyKSkKKwkJCXJldHVybiBkc3o7CisJCXJldHVybiAtRUxJTktDT05HOworCX0KKwlyZXR1cm4gdGlwY19yZWplY3RfbXNnKGJ1ZiwgVElQQ19FUlJfTk9fTkFNRSk7Cit9CisKKy8qKiAKKyAqIHRpcGNfc2VuZF9idWYybmFtZSAtIHNlbmQgbWVzc2FnZSBidWZmZXIgdG8gcG9ydCBuYW1lCisgKi8KKworaW50IHRpcGNfc2VuZF9idWYybmFtZSh1MzIgcmVmLCAKKwkJICAgICAgIHN0cnVjdCB0aXBjX25hbWUgY29uc3QgKmRlc3QsIAorCQkgICAgICAgdTMyIGRvbWFpbiwKKwkJICAgICAgIHN0cnVjdCBza19idWZmICpidWYsIAorCQkgICAgICAgdW5zaWduZWQgaW50IGRzeikKK3sKKwlzdHJ1Y3QgdGlwY19wb3J0aWQgb3JpZzsKKworCW9yaWcucmVmID0gcmVmOworCW9yaWcubm9kZSA9IHRpcGNfb3duX2FkZHI7CisJcmV0dXJuIHRpcGNfZm9yd2FyZF9idWYybmFtZShyZWYsIGRlc3QsIGRvbWFpbiwgYnVmLCBkc3osICZvcmlnLAorCQkJCSAgICAgVElQQ19QT1JUX0lNUE9SVEFOQ0UpOworfQorCisvKiogCisgKiB0aXBjX2ZvcndhcmQycG9ydCAtIGZvcndhcmQgbWVzc2FnZSBzZWN0aW9ucyB0byBwb3J0IGlkZW50aXR5CisgKi8KKworaW50IHRpcGNfZm9yd2FyZDJwb3J0KHUzMiByZWYsCisJCSAgICAgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqZGVzdCwKKwkJICAgICAgdW5zaWduZWQgaW50IG51bV9zZWN0LCAKKwkJICAgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCwKKwkJICAgICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnLCAKKwkJICAgICAgdW5zaWduZWQgaW50IGltcG9ydGFuY2UpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCWludCByZXM7CisKKwlwX3B0ciA9IHBvcnRfZGVyZWYocmVmKTsKKwlpZiAoIXBfcHRyIHx8IHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2cgPSAmcF9wdHItPnB1YmwucGhkcjsKKwltc2dfc2V0X3R5cGUobXNnLCBUSVBDX0RJUkVDVF9NU0cpOworCW1zZ19zZXRfb3JpZ25vZGUobXNnLCBvcmlnLT5ub2RlKTsKKwltc2dfc2V0X29yaWdwb3J0KG1zZywgb3JpZy0+cmVmKTsKKwltc2dfc2V0X2Rlc3Rub2RlKG1zZywgZGVzdC0+bm9kZSk7CisJbXNnX3NldF9kZXN0cG9ydChtc2csIGRlc3QtPnJlZik7CisJbXNnX3NldF9oZHJfc3oobXNnLCBESVJfTVNHX0hfU0laRSk7CisJaWYgKGltcG9ydGFuY2UgPD0gVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKQorCQltc2dfc2V0X2ltcG9ydGFuY2UobXNnLCBpbXBvcnRhbmNlKTsKKwlwX3B0ci0+c2VudCsrOworCWlmIChkZXN0LT5ub2RlID09IHRpcGNfb3duX2FkZHIpCisJCXJldHVybiBwb3J0X3JlY3Zfc2VjdGlvbnMocF9wdHIsIG51bV9zZWN0LCBtc2dfc2VjdCk7CisJcmVzID0gbGlua19zZW5kX3NlY3Rpb25zX2Zhc3QocF9wdHIsIG1zZ19zZWN0LCBudW1fc2VjdCwgZGVzdC0+bm9kZSk7CisJaWYgKGxpa2VseShyZXMgIT0gLUVMSU5LQ09ORykpCisJCXJldHVybiByZXM7CisJaWYgKHBvcnRfdW5yZWxpYWJsZShwX3B0cikpIHsKKwkJLyogSnVzdCBjYWxjdWxhdGUgbXNnIGxlbmd0aCBhbmQgcmV0dXJuICovCisJCXJldHVybiBtc2dfY2FsY19kYXRhX3NpemUobXNnX3NlY3QsIG51bV9zZWN0KTsKKwl9CisJcmV0dXJuIC1FTElOS0NPTkc7Cit9CisKKy8qKiAKKyAqIHRpcGNfc2VuZDJwb3J0IC0gc2VuZCBtZXNzYWdlIHNlY3Rpb25zIHRvIHBvcnQgaWRlbnRpdHkgCisgKi8KKworaW50IHRpcGNfc2VuZDJwb3J0KHUzMiByZWYsIAorCQkgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKmRlc3QsCisJCSAgIHVuc2lnbmVkIGludCBudW1fc2VjdCwgCisJCSAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QpCit7CisJc3RydWN0IHRpcGNfcG9ydGlkIG9yaWc7CisKKwlvcmlnLnJlZiA9IHJlZjsKKwlvcmlnLm5vZGUgPSB0aXBjX293bl9hZGRyOworCXJldHVybiB0aXBjX2ZvcndhcmQycG9ydChyZWYsIGRlc3QsIG51bV9zZWN0LCBtc2dfc2VjdCwgJm9yaWcsIAorCQkJCSBUSVBDX1BPUlRfSU1QT1JUQU5DRSk7Cit9CisKKy8qKiAKKyAqIHRpcGNfZm9yd2FyZF9idWYycG9ydCAtIGZvcndhcmQgbWVzc2FnZSBidWZmZXIgdG8gcG9ydCBpZGVudGl0eQorICovCitpbnQgdGlwY19mb3J3YXJkX2J1ZjJwb3J0KHUzMiByZWYsCisJCQkgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqZGVzdCwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKKwkJCSAgdW5zaWduZWQgaW50IGRzeiwKKwkJCSAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnLAorCQkJICB1bnNpZ25lZCBpbnQgaW1wb3J0YW5jZSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJaW50IHJlczsKKworCXBfcHRyID0gKHN0cnVjdCBwb3J0ICopcmVmX2RlcmVmKHJlZik7CisJaWYgKCFwX3B0ciB8fCBwX3B0ci0+cHVibC5jb25uZWN0ZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJbXNnID0gJnBfcHRyLT5wdWJsLnBoZHI7CisJbXNnX3NldF90eXBlKG1zZywgVElQQ19ESVJFQ1RfTVNHKTsKKwltc2dfc2V0X29yaWdub2RlKG1zZywgb3JpZy0+bm9kZSk7CisJbXNnX3NldF9vcmlncG9ydChtc2csIG9yaWctPnJlZik7CisJbXNnX3NldF9kZXN0bm9kZShtc2csIGRlc3QtPm5vZGUpOworCW1zZ19zZXRfZGVzdHBvcnQobXNnLCBkZXN0LT5yZWYpOworCW1zZ19zZXRfaGRyX3N6KG1zZywgRElSX01TR19IX1NJWkUpOworCWlmIChpbXBvcnRhbmNlIDw9IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkKKwkJbXNnX3NldF9pbXBvcnRhbmNlKG1zZywgaW1wb3J0YW5jZSk7CisJbXNnX3NldF9zaXplKG1zZywgRElSX01TR19IX1NJWkUgKyBkc3opOworCWlmIChza2JfY293KGJ1ZiwgRElSX01TR19IX1NJWkUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYl9wdXNoKGJ1ZiwgRElSX01TR19IX1NJWkUpOworCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKiltc2csIERJUl9NU0dfSF9TSVpFKTsKKwltc2dfZGJnKG1zZywgImJ1ZjJwb3J0OiAiKTsKKwlwX3B0ci0+c2VudCsrOworCWlmIChkZXN0LT5ub2RlID09IHRpcGNfb3duX2FkZHIpCisJCXJldHVybiBwb3J0X3JlY3ZfbXNnKGJ1Zik7CisJcmVzID0gdGlwY19zZW5kX2J1Zl9mYXN0KGJ1ZiwgZGVzdC0+bm9kZSk7CisJaWYgKGxpa2VseShyZXMgIT0gLUVMSU5LQ09ORykpCisJCXJldHVybiByZXM7CisJaWYgKHBvcnRfdW5yZWxpYWJsZShwX3B0cikpCisJCXJldHVybiBkc3o7CisJcmV0dXJuIC1FTElOS0NPTkc7Cit9CisKKy8qKiAKKyAqIHRpcGNfc2VuZF9idWYycG9ydCAtIHNlbmQgbWVzc2FnZSBidWZmZXIgdG8gcG9ydCBpZGVudGl0eQorICovCisKK2ludCB0aXBjX3NlbmRfYnVmMnBvcnQodTMyIHJlZiwgCisJCSAgICAgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKmRlc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCAKKwkJICAgICAgIHVuc2lnbmVkIGludCBkc3opCit7CisJc3RydWN0IHRpcGNfcG9ydGlkIG9yaWc7CisKKwlvcmlnLnJlZiA9IHJlZjsKKwlvcmlnLm5vZGUgPSB0aXBjX293bl9hZGRyOworCXJldHVybiB0aXBjX2ZvcndhcmRfYnVmMnBvcnQocmVmLCBkZXN0LCBidWYsIGRzeiwgJm9yaWcsIAorCQkJCSAgICAgVElQQ19QT1JUX0lNUE9SVEFOQ0UpOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9wb3J0LmggYi9uZXQvdGlwYy9wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyOWE5OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3BvcnQuaApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIG5ldC90aXBjL3BvcnQuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIHBvcnQgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfUE9SVF9ICisjZGVmaW5lIF9USVBDX1BPUlRfSAorCisjaW5jbHVkZSA8bmV0L3RpcGMvdGlwY19wb3J0Lmg+CisjaW5jbHVkZSAicmVmLmgiCisjaW5jbHVkZSAibmV0LmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAibm9kZV9zdWJzY3IuaCIKKworLyoqCisgKiBzdHJ1Y3QgdXNlcl9wb3J0IC0gVElQQyB1c2VyIHBvcnQgKHVzZWQgd2l0aCBuYXRpdmUgQVBJKQorICogQHVzZXJfcmVmOiBpZCBvZiB1c2VyIHdobyBjcmVhdGVkIHVzZXIgcG9ydAorICogQHVzcl9oYW5kbGU6IHVzZXItc3BlY2lmaWVkIGZpZWxkCisgKiBAcmVmOiBvYmplY3QgcmVmZXJlbmNlIHRvIGFzc29jaWF0ZWQgVElQQyBwb3J0CisgKiA8dmFyaW91cyBjYWxsYmFjayByb3V0aW5lcz4KKyAqIEB1cG9ydF9saXN0OiBhZGphY2VudCB1c2VyIHBvcnRzIGluIGxpc3Qgb2YgcG9ydHMgaGVsZCBieSB1c2VyCisgKi8KKyAKK3N0cnVjdCB1c2VyX3BvcnQgeworCXUzMiB1c2VyX3JlZjsKKwl2b2lkICp1c3JfaGFuZGxlOyAKKwl1MzIgcmVmOworCXRpcGNfbXNnX2Vycl9ldmVudCBlcnJfY2I7IAorCXRpcGNfbmFtZWRfbXNnX2Vycl9ldmVudCBuYW1lZF9lcnJfY2I7IAorCXRpcGNfY29ubl9zaHV0ZG93bl9ldmVudCBjb25uX2Vycl9jYjsgCisJdGlwY19tc2dfZXZlbnQgbXNnX2NiOyAKKwl0aXBjX25hbWVkX21zZ19ldmVudCBuYW1lZF9tc2dfY2I7IAorCXRpcGNfY29ubl9tc2dfZXZlbnQgY29ubl9tc2dfY2I7IAorCXRpcGNfY29udGludWVfZXZlbnQgY29udGludWVfZXZlbnRfY2I7CisJc3RydWN0IGxpc3RfaGVhZCB1cG9ydF9saXN0OworfTsKKworLyoqCisgKiBzdHJ1Y3QgcG9ydCAtIFRJUEMgcG9ydCBzdHJ1Y3R1cmUKKyAqIEBwdWJsOiBUSVBDIHBvcnQgaW5mbyBhdmFpbGFibGUgdG8gcHJpdmlsZWdlZCB1c2VycworICogQHBvcnRfbGlzdDogYWRqYWNlbnQgcG9ydHMgaW4gVElQQydzIGdsb2JhbCBsaXN0IG9mIHBvcnRzCisgKiBAZGlzcGF0Y2hlcjogcHRyIHRvIHJvdXRpbmUgd2hpY2ggaGFuZGxlcyByZWNlaXZlZCBtZXNzYWdlcworICogQHdha2V1cDogcHRyIHRvIHJvdXRpbmUgdG8gY2FsbCB3aGVuIHBvcnQgaXMgbm8gbG9uZ2VyIGNvbmdlc3RlZAorICogQHVzZXJfcG9ydDogcHRyIHRvIHVzZXIgcG9ydCBhc3NvY2lhdGVkIHdpdGggcG9ydCAoaWYgYW55KQorICogQHdhaXRfbGlzdDogYWRqYWNlbnQgcG9ydHMgaW4gbGlzdCBvZiBwb3J0cyB3YWl0aW5nIG9uIGxpbmsgY29uZ2VzdGlvbgorICogQGNvbmdlc3RlZF9saW5rOiBwdHIgdG8gY29uZ2VzdGVkIGxpbmsgcG9ydCBpcyB3YWl0aW5nIG9uCisgKiBAd2FpdGluZ19wa3RzOgorICogQHNlbnQ6CisgKiBAYWNrZWQ6CisgKiBAcHVibGljYXRpb25zOiBsaXN0IG9mIHB1YmxpY2F0aW9ucyBmb3IgcG9ydAorICogQHB1Yl9jb3VudDogdG90YWwgIyBvZiBwdWJsaWNhdGlvbnMgcG9ydCBoYXMgbWFkZSBkdXJpbmcgaXRzIGxpZmV0aW1lCisgKiBAbWF4X3BrdDogbWF4aW11bSBwYWNrZXQgc2l6ZSAiaGludCIgdXNlZCB3aGVuIGJ1aWxkaW5nIG1lc3NhZ2VzIHNlbnQgYnkgcG9ydAorICogQHByb2Jpbmdfc3RhdGU6CisgKiBAcHJvYmluZ19pbnRlcnZhbDoKKyAqIEBsYXN0X2luX3NlcW5vOgorICogQHRpbWVyX3JlZjoKKyAqIEBzdWJzY3JpcHRpb246ICJub2RlIGRvd24iIHN1YnNjcmlwdGlvbiB1c2VkIHRvIHRlcm1pbmF0ZSBmYWlsZWQgY29ubmVjdGlvbnMKKyAqLworCitzdHJ1Y3QgcG9ydCB7CisJc3RydWN0IHRpcGNfcG9ydCBwdWJsOworCXN0cnVjdCBsaXN0X2hlYWQgcG9ydF9saXN0OworCXUzMiAoKmRpc3BhdGNoZXIpKHN0cnVjdCB0aXBjX3BvcnQgKiwgc3RydWN0IHNrX2J1ZmYgKik7CisJdm9pZCAoKndha2V1cCkoc3RydWN0IHRpcGNfcG9ydCAqKTsKKwlzdHJ1Y3QgdXNlcl9wb3J0ICp1c2VyX3BvcnQ7CisJc3RydWN0IGxpc3RfaGVhZCB3YWl0X2xpc3Q7CisJc3RydWN0IGxpbmsgKmNvbmdlc3RlZF9saW5rOworCXUzMiB3YWl0aW5nX3BrdHM7CisJdTMyIHNlbnQ7CisJdTMyIGFja2VkOworCXN0cnVjdCBsaXN0X2hlYWQgcHVibGljYXRpb25zOworCXUzMiBwdWJfY291bnQ7CisJdTMyIG1heF9wa3Q7CisJdTMyIHByb2Jpbmdfc3RhdGU7CisJdTMyIHByb2JpbmdfaW50ZXJ2YWw7CisJdTMyIGxhc3RfaW5fc2Vxbm87CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJc3RydWN0IG5vZGVfc3Vic2NyIHN1YnNjcmlwdGlvbjsKK307CisKK2V4dGVybiBzcGlubG9ja190IHBvcnRfbGlzdF9sb2NrOworc3RydWN0IHBvcnRfbGlzdDsKKworaW50IHBvcnRfcmVjdl9zZWN0aW9ucyhzdHJ1Y3QgcG9ydCAqcF9wdHIsIHUzMiBudW1fc2VjdCwgCisJCSAgICAgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0KTsKK2ludCBwb3J0X3JlamVjdF9zZWN0aW9ucyhzdHJ1Y3QgcG9ydCAqcF9wdHIsIHN0cnVjdCB0aXBjX21zZyAqaGRyLAorCQkJIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsIHUzMiBudW1fc2VjdCwKKwkJCSBpbnQgZXJyKTsKK3N0cnVjdCBza19idWZmICpwb3J0X2dldF9wb3J0cyh2b2lkKTsKK3N0cnVjdCBza19idWZmICpwb3J0X3Nob3dfc3RhdHMoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSk7Cit2b2lkIHBvcnRfcmVjdl9wcm90b19tc2coc3RydWN0IHNrX2J1ZmYgKmJ1Zik7Cit2b2lkIHBvcnRfcmVjdl9tY2FzdChzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCBzdHJ1Y3QgcG9ydF9saXN0ICpkcCk7Cit2b2lkIHBvcnRfcmVpbml0KHZvaWQpOworCisvKioKKyAqIHBvcnRfbG9jayAtIGxvY2sgcG9ydCBpbnN0YW5jZSByZWZlcnJlZCB0byBhbmQgcmV0dXJuIGl0cyBwb2ludGVyCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG9ydCAqcG9ydF9sb2NrKHUzMiByZWYpCit7CisJcmV0dXJuIChzdHJ1Y3QgcG9ydCAqKXJlZl9sb2NrKHJlZik7Cit9CisKKy8qKiAKKyAqIHBvcnRfdW5sb2NrIC0gdW5sb2NrIGEgcG9ydCBpbnN0YW5jZQorICogCisgKiBDYW4gdXNlIHBvaW50ZXIgaW5zdGVhZCBvZiByZWZfdW5sb2NrKCkgc2luY2UgcG9ydCBpcyBhbHJlYWR5IGxvY2tlZC4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcG9ydF91bmxvY2soc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3J0KiBwb3J0X2RlcmVmKHUzMiByZWYpCit7CisJcmV0dXJuIChzdHJ1Y3QgcG9ydCAqKXJlZl9kZXJlZihyZWYpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBwZWVyX3BvcnQoc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXJldHVybiBtc2dfZGVzdHBvcnQoJnBfcHRyLT5wdWJsLnBoZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBwZWVyX25vZGUoc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXJldHVybiBtc2dfZGVzdG5vZGUoJnBfcHRyLT5wdWJsLnBoZHIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwb3J0X2Nvbmdlc3RlZChzdHJ1Y3QgcG9ydCAqcF9wdHIpCit7CisJcmV0dXJuKChwX3B0ci0+c2VudCAtIHBfcHRyLT5hY2tlZCkgPj0gKFRJUENfRkxPV19DT05UUk9MX1dJTiAqIDIpKTsKK30KKworLyoqIAorICogcG9ydF9yZWN2X21zZyAtIHJlY2VpdmUgbWVzc2FnZSBmcm9tIGxvd2VyIGxheWVyIGFuZCBkZWxpdmVyIHRvIHBvcnQgdXNlcgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHBvcnRfcmVjdl9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJdTMyIGRlc3Rwb3J0ID0gbXNnX2Rlc3Rwb3J0KG1zZyk7CisJdTMyIGRzeiA9IG1zZ19kYXRhX3N6KG1zZyk7CisJdTMyIGVycjsKKwkKKwkvKiBmb3J3YXJkIHVucmVzb2x2ZWQgbmFtZWQgbWVzc2FnZSAqLworCWlmICh1bmxpa2VseSghZGVzdHBvcnQpKSB7CisJCW5ldF9yb3V0ZV9tc2coYnVmKTsKKwkJcmV0dXJuIGRzejsKKwl9CisKKwkvKiB2YWxpZGF0ZSBkZXN0aW5hdGlvbiAmIHBhc3MgdG8gcG9ydCwgb3RoZXJ3aXNlIHJlamVjdCBtZXNzYWdlICovCisJcF9wdHIgPSBwb3J0X2xvY2soZGVzdHBvcnQpOworCWlmIChsaWtlbHkocF9wdHIpKSB7CisJCWlmIChsaWtlbHkocF9wdHItPnB1YmwuY29ubmVjdGVkKSkgeworCQkJaWYgKCh1bmxpa2VseShtc2dfb3JpZ3BvcnQobXNnKSAhPSBwZWVyX3BvcnQocF9wdHIpKSkgfHwKKwkJCSAgICAodW5saWtlbHkobXNnX29yaWdub2RlKG1zZykgIT0gcGVlcl9ub2RlKHBfcHRyKSkpIHx8CisJCQkgICAgKHVubGlrZWx5KCFtc2dfY29ubmVjdGVkKG1zZykpKSkgeworCQkJCWVyciA9IFRJUENfRVJSX05PX1BPUlQ7CisJCQkJcG9ydF91bmxvY2socF9wdHIpOworCQkJCWdvdG8gcmVqZWN0OworCQkJfQorCQl9CisJCWVyciA9IHBfcHRyLT5kaXNwYXRjaGVyKCZwX3B0ci0+cHVibCwgYnVmKTsKKwkJcG9ydF91bmxvY2socF9wdHIpOworCQlpZiAobGlrZWx5KCFlcnIpKQorCQkJcmV0dXJuIGRzejsKKwl9IGVsc2UgeworCQllcnIgPSBUSVBDX0VSUl9OT19QT1JUOworCX0KK3JlamVjdDoKKwlkYmcoInBvcnQtPnJlamVjdGluZywgZXJyID0gJXguLlxuIixlcnIpOworCXJldHVybiB0aXBjX3JlamVjdF9tc2coYnVmLCBlcnIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL3JlZi5jIGIvbmV0L3RpcGMvcmVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0MDkzZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3JlZi5jCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogbmV0L3RpcGMvcmVmLmM6IFRJUEMgb2JqZWN0IHJlZ2lzdHJ5IGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTkxLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgInJlZi5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJzdWJzY3IuaCIKKyNpbmNsdWRlICJuYW1lX2Rpc3RyLmgiCisjaW5jbHVkZSAibmFtZV90YWJsZS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImRpc2NvdmVyLmgiCisjaW5jbHVkZSAiYmVhcmVyLmgiCisjaW5jbHVkZSAibm9kZS5oIgorI2luY2x1ZGUgImJjYXN0LmgiCisKKy8qCisgKiBPYmplY3QgcmVmZXJlbmNlIHRhYmxlIGNvbnNpc3RzIG9mIDIqKk4gZW50cmllcy4KKyAqCisgKiBBIHVzZWQgZW50cnkgaGFzIG9iamVjdCBwdHIgIT0gMCwgcmVmZXJlbmNlID09IFhYWFh8b3duIGluZGV4CisgKgkJCQkgICAgIChYWFhYIGNoYW5nZXMgZWFjaCB0aW1lIGVudHJ5IGlzIGFjcXVpcmVkKSAKKyAqIEEgZnJlZSBlbnRyeSBoYXMgb2JqZWN0IHB0ciA9PSAwLCByZWZlcmVuY2UgPT0gWVlZWXxuZXh0IGZyZWUgaW5kZXgKKyAqCQkJCSAgICAgKFlZWVkgaXMgb25lIG1vcmUgdGhhbiBsYXN0IHVzZWQgWFhYWCkKKyAqCisgKiBGcmVlIGxpc3QgaXMgaW5pdGlhbGx5IGNoYWluZWQgZnJvbSBlbnRyeSAoMioqTiktMSB0byBlbnRyeSAxLiAKKyAqIEVudHJ5IDAgaXMgbm90IHVzZWQgdG8gYWxsb3cgaW5kZXggMCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBmcmVlIGxpc3QuCisgKgorICogTm90ZTogQW55IGFjY2lkZW50YWwgcmVmZXJlbmNlIG9mIHRoZSBmb3JtIFhYWFh8MC0tMCB3b24ndCBtYXRjaCBlbnRyeSAwCisgKiBiZWNhdXNlIGVudHJ5IDAncyByZWZlcmVuY2UgZmllbGQgaGFzIHRoZSBmb3JtIFhYWFh8MS0tMS4KKyAqLworCitzdHJ1Y3QgcmVmX3RhYmxlIHJlZl90YWJsZSA9IHsgMCB9OworCityd2xvY2tfdCByZWZ0YmxfbG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQ7CisKKy8qKgorICogcmVmX3RhYmxlX2luaXQgLSBjcmVhdGUgcmVmZXJlbmNlIHRhYmxlIGZvciBvYmplY3RzCisgKi8KKworaW50IHJlZl90YWJsZV9pbml0KHUzMiByZXF1ZXN0ZWRfc2l6ZSwgdTMyIHN0YXJ0KQoreworCXN0cnVjdCByZWZlcmVuY2UgKnRhYmxlOworCXUzMiBzeiA9IDEgPDwgNDsKKwl1MzIgaW5kZXhfbWFzazsKKwlpbnQgaTsKKworCXdoaWxlIChzeiA8IHJlcXVlc3RlZF9zaXplKSB7CisJCXN6IDw8PSAxOworCX0KKwl0YWJsZSA9IChzdHJ1Y3QgcmVmZXJlbmNlICopdm1hbGxvYyhzeiAqIHNpemVvZihzdHJ1Y3QgcmVmZXJlbmNlKSk7CisJaWYgKHRhYmxlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJd3JpdGVfbG9ja19iaCgmcmVmdGJsX2xvY2spOworCWluZGV4X21hc2sgPSBzeiAtIDE7CisJZm9yIChpID0gc3ogLSAxOyBpID49IDA7IGktLSkgeworCQl0YWJsZVtpXS5vYmplY3QgPSAwOworCQl0YWJsZVtpXS5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCQl0YWJsZVtpXS5kYXRhLm5leHRfcGx1c191cHBlciA9IChzdGFydCAmIH5pbmRleF9tYXNrKSArIGkgLSAxOworCX0KKwlyZWZfdGFibGUuZW50cmllcyA9IHRhYmxlOworCXJlZl90YWJsZS5pbmRleF9tYXNrID0gaW5kZXhfbWFzazsKKwlyZWZfdGFibGUuZmlyc3RfZnJlZSA9IHN6IC0gMTsKKwlyZWZfdGFibGUubGFzdF9mcmVlID0gMTsKKwl3cml0ZV91bmxvY2tfYmgoJnJlZnRibF9sb2NrKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworLyoqCisgKiByZWZfdGFibGVfc3RvcCAtIGRlc3Ryb3kgcmVmZXJlbmNlIHRhYmxlIGZvciBvYmplY3RzCisgKi8KKwordm9pZCByZWZfdGFibGVfc3RvcCh2b2lkKQoreworCWlmICghcmVmX3RhYmxlLmVudHJpZXMpCisJCXJldHVybjsKKworCXZmcmVlKHJlZl90YWJsZS5lbnRyaWVzKTsKKwlyZWZfdGFibGUuZW50cmllcyA9IDA7Cit9CisKKy8qKgorICogcmVmX2FjcXVpcmUgLSBjcmVhdGUgcmVmZXJlbmNlIHRvIGFuIG9iamVjdAorICogCisgKiBSZXR1cm4gYSB1bmlxdWUgcmVmZXJlbmNlIHZhbHVlIHdoaWNoIGNhbiBiZSB0cmFuc2xhdGVkIGJhY2sgdG8gdGhlIHBvaW50ZXIKKyAqICdvYmplY3QnIGF0IGEgbGF0ZXIgdGltZS4gIEFsc28sIHBhc3MgYmFjayBhIHBvaW50ZXIgdG8gdGhlIGxvY2sgcHJvdGVjdGluZyAKKyAqIHRoZSBvYmplY3QsIGJ1dCB3aXRob3V0IGxvY2tpbmcgaXQuCisgKi8KKwordTMyIHJlZl9hY3F1aXJlKHZvaWQgKm9iamVjdCwgc3BpbmxvY2tfdCAqKmxvY2spCit7CisJc3RydWN0IHJlZmVyZW5jZSAqZW50cnk7CisJdTMyIGluZGV4OworCXUzMiBpbmRleF9tYXNrOworCXUzMiBuZXh0X3BsdXNfdXBwZXI7CisJdTMyIHJlZmVyZW5jZSA9IDA7CisKKwlhc3NlcnQocmVmX3RhYmxlLmVudHJpZXMgJiYgb2JqZWN0KTsKKworCXdyaXRlX2xvY2tfYmgoJnJlZnRibF9sb2NrKTsKKwlpZiAocmVmX3RhYmxlLmZpcnN0X2ZyZWUpIHsKKwkJaW5kZXggPSByZWZfdGFibGUuZmlyc3RfZnJlZTsKKwkJZW50cnkgPSAmKHJlZl90YWJsZS5lbnRyaWVzW2luZGV4XSk7CisJCWluZGV4X21hc2sgPSByZWZfdGFibGUuaW5kZXhfbWFzazsKKwkJLyogdGFrZSBsb2NrIGluIGNhc2UgYSBwcmV2aW91cyB1c2VyIG9mIGVudHJ5IHN0aWxsIGhvbGRzIGl0ICovIAorCQlzcGluX2xvY2tfYmgoJmVudHJ5LT5sb2NrKTsgIAorCQluZXh0X3BsdXNfdXBwZXIgPSBlbnRyeS0+ZGF0YS5uZXh0X3BsdXNfdXBwZXI7CisJCXJlZl90YWJsZS5maXJzdF9mcmVlID0gbmV4dF9wbHVzX3VwcGVyICYgaW5kZXhfbWFzazsKKwkJcmVmZXJlbmNlID0gKG5leHRfcGx1c191cHBlciAmIH5pbmRleF9tYXNrKSArIGluZGV4OworCQllbnRyeS0+ZGF0YS5yZWZlcmVuY2UgPSByZWZlcmVuY2U7CisJCWVudHJ5LT5vYmplY3QgPSBvYmplY3Q7CisgICAgICAgICAgICAgICAgaWYgKGxvY2sgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICpsb2NrID0gJmVudHJ5LT5sb2NrOworCQlzcGluX3VubG9ja19iaCgmZW50cnktPmxvY2spOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnJlZnRibF9sb2NrKTsKKwlyZXR1cm4gcmVmZXJlbmNlOworfQorCisvKioKKyAqIHJlZl9kaXNjYXJkIC0gaW52YWxpZGF0ZSByZWZlcmVuY2VzIHRvIGFuIG9iamVjdAorICogCisgKiBEaXNhbGxvdyBmdXR1cmUgcmVmZXJlbmNlcyB0byBhbiBvYmplY3QgYW5kIGZyZWUgdXAgdGhlIGVudHJ5IGZvciByZS11c2UuCisgKiBOb3RlOiBUaGUgZW50cnkncyBzcGluX2xvY2sgbWF5IHN0aWxsIGJlIGJ1c3kgYWZ0ZXIgZGlzY2FyZAorICovCisKK3ZvaWQgcmVmX2Rpc2NhcmQodTMyIHJlZikKK3sKKwlzdHJ1Y3QgcmVmZXJlbmNlICplbnRyeTsKKwl1MzIgaW5kZXg7IAorCXUzMiBpbmRleF9tYXNrOworCisJYXNzZXJ0KHJlZl90YWJsZS5lbnRyaWVzKTsKKwlhc3NlcnQocmVmICE9IDApOworCisJd3JpdGVfbG9ja19iaCgmcmVmdGJsX2xvY2spOworCWluZGV4X21hc2sgPSByZWZfdGFibGUuaW5kZXhfbWFzazsKKwlpbmRleCA9IHJlZiAmIGluZGV4X21hc2s7CisJZW50cnkgPSAmKHJlZl90YWJsZS5lbnRyaWVzW2luZGV4XSk7CisJYXNzZXJ0KGVudHJ5LT5vYmplY3QgIT0gMCk7CisJYXNzZXJ0KGVudHJ5LT5kYXRhLnJlZmVyZW5jZSA9PSByZWYpOworCisJLyogbWFyayBlbnRyeSBhcyB1bnVzZWQgKi8KKwllbnRyeS0+b2JqZWN0ID0gMDsKKwlpZiAocmVmX3RhYmxlLmZpcnN0X2ZyZWUgPT0gMCkKKwkJcmVmX3RhYmxlLmZpcnN0X2ZyZWUgPSBpbmRleDsKKwllbHNlCisJCS8qIG5leHRfcGx1c191cHBlciBpcyBhbHdheXMgWFhYWHwwLS0wIGZvciBsYXN0IGZyZWUgZW50cnkgKi8KKwkJcmVmX3RhYmxlLmVudHJpZXNbcmVmX3RhYmxlLmxhc3RfZnJlZV0uZGF0YS5uZXh0X3BsdXNfdXBwZXIgCisJCQl8PSBpbmRleDsKKwlyZWZfdGFibGUubGFzdF9mcmVlID0gaW5kZXg7CisKKwkvKiBpbmNyZW1lbnQgdXBwZXIgYml0cyBvZiBlbnRyeSB0byBpbnZhbGlkYXRlIHN1YnNlcXVlbnQgcmVmZXJlbmNlcyAqLworCWVudHJ5LT5kYXRhLm5leHRfcGx1c191cHBlciA9IChyZWYgJiB+aW5kZXhfbWFzaykgKyAoaW5kZXhfbWFzayArIDEpOworCXdyaXRlX3VubG9ja19iaCgmcmVmdGJsX2xvY2spOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9yZWYuaCBiL25ldC90aXBjL3JlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOWNkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9yZWYuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIG5ldC90aXBjL3JlZi5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgb2JqZWN0IHJlZ2lzdHJ5IGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTkxLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19SRUZfSAorI2RlZmluZSBfVElQQ19SRUZfSAorCisvKioKKyAqIHN0cnVjdCByZWZlcmVuY2UgLSBUSVBDIG9iamVjdCByZWZlcmVuY2UgZW50cnkKKyAqIEBvYmplY3Q6IHBvaW50ZXIgdG8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCByZWZlcmVuY2UgZW50cnkKKyAqIEBsb2NrOiBzcGlubG9jayBjb250cm9sbGluZyBhY2Nlc3MgdG8gb2JqZWN0CisgKiBAZGF0YTogcmVmZXJlbmNlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBvYmplY3QgKG9yIGxpbmsgdG8gbmV4dCB1bnVzZWQgZW50cnkpCisgKi8KKyAKK3N0cnVjdCByZWZlcmVuY2UgeworCXZvaWQgKm9iamVjdDsKKwlzcGlubG9ja190IGxvY2s7CisJdW5pb24geworCQl1MzIgbmV4dF9wbHVzX3VwcGVyOworCQl1MzIgcmVmZXJlbmNlOworCX0gZGF0YTsKK307CisKKy8qKgorICogc3RydWN0IHJlZl90YWJsZSAtIHRhYmxlIG9mIFRJUEMgb2JqZWN0IHJlZmVyZW5jZSBlbnRyaWVzCisgKiBAZW50cmllczogcG9pbnRlciB0byBhcnJheSBvZiByZWZlcmVuY2UgZW50cmllcworICogQGluZGV4X21hc2s6IGJpdG1hc2sgZm9yIGFycmF5IGluZGV4IHBvcnRpb24gb2YgcmVmZXJlbmNlIHZhbHVlcworICogQGZpcnN0X2ZyZWU6IGFycmF5IGluZGV4IG9mIGZpcnN0IHVudXNlZCBvYmplY3QgcmVmZXJlbmNlIGVudHJ5CisgKiBAbGFzdF9mcmVlOiBhcnJheSBpbmRleCBvZiBsYXN0IHVudXNlZCBvYmplY3QgcmVmZXJlbmNlIGVudHJ5CisgKi8KKworc3RydWN0IHJlZl90YWJsZSB7CisJc3RydWN0IHJlZmVyZW5jZSAqZW50cmllczsKKwl1MzIgaW5kZXhfbWFzazsKKwl1MzIgZmlyc3RfZnJlZTsKKwl1MzIgbGFzdF9mcmVlOworfTsKKworZXh0ZXJuIHN0cnVjdCByZWZfdGFibGUgcmVmX3RhYmxlOworCitpbnQgcmVmX3RhYmxlX2luaXQodTMyIHJlcXVlc3RlZF9zaXplLCB1MzIgc3RhcnQpOwordm9pZCByZWZfdGFibGVfc3RvcCh2b2lkKTsKKwordTMyIHJlZl9hY3F1aXJlKHZvaWQgKm9iamVjdCwgc3BpbmxvY2tfdCAqKmxvY2spOwordm9pZCByZWZfZGlzY2FyZCh1MzIgcmVmKTsKKworCisvKioKKyAqIHJlZl9sb2NrIC0gbG9jayByZWZlcmVuY2VkIG9iamVjdCBhbmQgcmV0dXJuIHBvaW50ZXIgdG8gaXQKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgKnJlZl9sb2NrKHUzMiByZWYpCit7CisJaWYgKGxpa2VseShyZWZfdGFibGUuZW50cmllcykpIHsKKwkJc3RydWN0IHJlZmVyZW5jZSAqciA9CisJCQkmcmVmX3RhYmxlLmVudHJpZXNbcmVmICYgcmVmX3RhYmxlLmluZGV4X21hc2tdOworCisJCXNwaW5fbG9ja19iaCgmci0+bG9jayk7CisJCWlmIChsaWtlbHkoci0+ZGF0YS5yZWZlcmVuY2UgPT0gcmVmKSkKKwkJCXJldHVybiByLT5vYmplY3Q7CisJCXNwaW5fdW5sb2NrX2JoKCZyLT5sb2NrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcmVmX3VubG9jayAtIHVubG9jayByZWZlcmVuY2VkIG9iamVjdCAKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcmVmX3VubG9jayh1MzIgcmVmKQoreworCWlmIChsaWtlbHkocmVmX3RhYmxlLmVudHJpZXMpKSB7CisJCXN0cnVjdCByZWZlcmVuY2UgKnIgPQorCQkJJnJlZl90YWJsZS5lbnRyaWVzW3JlZiAmIHJlZl90YWJsZS5pbmRleF9tYXNrXTsKKworCQlpZiAobGlrZWx5KHItPmRhdGEucmVmZXJlbmNlID09IHJlZikpCisJCQlzcGluX3VubG9ja19iaCgmci0+bG9jayk7CisJCWVsc2UKKwkJCWVycigicmVmX3VubG9jaygpIGludm9rZWQgdXNpbmcgb2Jzb2xldGUgcmVmZXJlbmNlXG4iKTsKKwl9Cit9CisKKy8qKgorICogcmVmX2RlcmVmIC0gcmV0dXJuIHBvaW50ZXIgcmVmZXJlbmNlZCBvYmplY3QgKHdpdGhvdXQgbG9ja2luZyBpdCkKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgKnJlZl9kZXJlZih1MzIgcmVmKQoreworCWlmIChsaWtlbHkocmVmX3RhYmxlLmVudHJpZXMpKSB7CisJCXN0cnVjdCByZWZlcmVuY2UgKnIgPSAKKwkJCSZyZWZfdGFibGUuZW50cmllc1tyZWYgJiByZWZfdGFibGUuaW5kZXhfbWFza107CisKKwkJaWYgKGxpa2VseShyLT5kYXRhLnJlZmVyZW5jZSA9PSByZWYpKQorCQkJcmV0dXJuIHItPm9iamVjdDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvc29ja2V0LmMgYi9uZXQvdGlwYy9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjFmOGMwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvc29ja2V0LmMKQEAgLTAsMCArMSwxNzI2IEBACisvKgorICogbmV0L3RpcGMvc29ja2V0LmM6IFRJUEMgc29ja2V0IEFQSQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8bGludXgvdGlwYy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpcGNfY29uZmlnLmg+CisjaW5jbHVkZSA8bmV0L3RpcGMvdGlwY19tc2cuaD4KKyNpbmNsdWRlIDxuZXQvdGlwYy90aXBjX3BvcnQuaD4KKworI2luY2x1ZGUgImNvcmUuaCIKKworI2RlZmluZSBTU19MSVNURU5JTkcJLTEJLyogc29ja2V0IGlzIGxpc3RlbmluZyAqLworI2RlZmluZSBTU19SRUFEWQktMgkvKiBzb2NrZXQgaXMgY29ubmVjdGlvbmxlc3MgKi8KKworI2RlZmluZSBPVkVSTE9BRF9MSU1JVF9CQVNFICAgIDUwMDAKKworc3RydWN0IHRpcGNfc29jayB7CisJc3RydWN0IHNvY2sgc2s7CisJc3RydWN0IHRpcGNfcG9ydCAqcDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKK307CisKKyNkZWZpbmUgdGlwY19zayhzaykgKChzdHJ1Y3QgdGlwY19zb2NrKilzaykKKworc3RhdGljIHUzMiBkaXNwYXRjaChzdHJ1Y3QgdGlwY19wb3J0ICp0cG9ydCwgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CitzdGF0aWMgdm9pZCB3YWtldXBkaXNwYXRjaChzdHJ1Y3QgdGlwY19wb3J0ICp0cG9ydCk7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHBhY2tldF9vcHM7CitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBzdHJlYW1fb3BzOworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgbXNnX29wczsKKworc3RhdGljIHN0cnVjdCBwcm90byB0aXBjX3Byb3RvOworCitzdGF0aWMgaW50IHNvY2tldHNfZW5hYmxlZCA9IDA7CisKK3N0YXRpYyBhdG9taWNfdCB0aXBjX3F1ZXVlX3NpemUgPSBBVE9NSUNfSU5JVCgwKTsKKworCisvKiAKKyAqIHNvY2tfbG9jaygpOiBMb2NrIGEgcG9ydC9zb2NrZXQgcGFpci4gbG9ja19zb2NrKCkgY2FuIAorICogbm90IGJlIHVzZWQgaGVyZSwgc2luY2UgdGhlIHNhbWUgbG9jayBtdXN0IHByb3RlY3QgcG9ydHMgCisgKiB3aXRoIG5vbi1zb2NrZXQgaW50ZXJmYWNlcy4KKyAqIFNlZSBuZXQuYyBmb3IgZGVzY3JpcHRpb24gb2YgbG9ja2luZyBwb2xpY3kuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzb2NrX2xvY2soc3RydWN0IHRpcGNfc29jayogdHNvY2spCit7CisgICAgICAgIHNwaW5fbG9ja19iaCh0c29jay0+cC0+bG9jayk7ICAgICAgIAorfQorCisvKiAKKyAqIHNvY2tfdW5sb2NrKCk6IFVubG9jayBhIHBvcnQvc29ja2V0IHBhaXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNvY2tfdW5sb2NrKHN0cnVjdCB0aXBjX3NvY2sqIHRzb2NrKQoreworICAgICAgICBzcGluX3VubG9ja19iaCh0c29jay0+cC0+bG9jayk7Cit9CisKKy8qKgorICogcG9sbG1hc2sgLSBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2V0IG9mIHBvbGwoKSBldmVudHMgZm9yIGEgc29ja2V0CisgKiBAc29jazogc29ja2V0IHN0cnVjdHVyZQorICogCisgKiBUSVBDIHNldHMgdGhlIHJldHVybmVkIGV2ZW50cyBhcyBmb2xsb3dzOgorICogYSkgUE9MTFJETk9STSBhbmQgUE9MTElOIGFyZSBzZXQgaWYgdGhlIHNvY2tldCdzIHJlY2VpdmUgcXVldWUgaXMgbm9uLWVtcHR5CisgKiAgICBvciBpZiBhIGNvbm5lY3Rpb24tb3JpZW50ZWQgc29ja2V0IGlzIGRvZXMgbm90IGhhdmUgYW4gYWN0aXZlIGNvbm5lY3Rpb24KKyAqICAgIChpLmUuIGEgcmVhZCBvcGVyYXRpb24gd2lsbCBub3QgYmxvY2spLgorICogYikgUE9MTE9VVCBpcyBzZXQgZXhjZXB0IHdoZW4gYSBzb2NrZXQncyBjb25uZWN0aW9uIGhhcyBiZWVuIHRlcm1pbmF0ZWQKKyAqICAgIChpLmUuIGEgd3JpdGUgb3BlcmF0aW9uIHdpbGwgbm90IGJsb2NrKS4KKyAqIGMpIFBPTExIVVAgaXMgc2V0IHdoZW4gYSBzb2NrZXQncyBjb25uZWN0aW9uIGhhcyBiZWVuIHRlcm1pbmF0ZWQuCisgKgorICogSU1QT1JUQU5UOiBUaGUgZmFjdCB0aGF0IGEgcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gd2lsbCBub3QgYmxvY2sgZG9lcyBOT1QKKyAqIGltcGx5IHRoYXQgdGhlIG9wZXJhdGlvbiB3aWxsIHN1Y2NlZWQhCisgKiAKKyAqIFJldHVybnMgcG9sbG1hc2sgdmFsdWUKKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiBwb2xsbWFzayhzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXUzMiBtYXNrOworCisJaWYgKChza2JfcXVldWVfbGVuKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSkgIT0gMCkgfHwKKwkgICAgKHNvY2stPnN0YXRlID09IFNTX1VOQ09OTkVDVEVEKSB8fAorCSAgICAoc29jay0+c3RhdGUgPT0gU1NfRElTQ09OTkVDVElORykpCisJCW1hc2sgPSAoUE9MTFJETk9STSB8IFBPTExJTik7CisJZWxzZQorCQltYXNrID0gMDsKKworCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19ESVNDT05ORUNUSU5HKSAKKwkJbWFzayB8PSBQT0xMSFVQOworCWVsc2UKKwkJbWFzayB8PSBQT0xMT1VUOworCisJcmV0dXJuIG1hc2s7Cit9CisKKworLyoqCisgKiBhZHZhbmNlX3F1ZXVlIC0gZGlzY2FyZCBmaXJzdCBidWZmZXIgaW4gcXVldWUKKyAqIEB0c29jazogVElQQyBzb2NrZXQKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWR2YW5jZV9xdWV1ZShzdHJ1Y3QgdGlwY19zb2NrICp0c29jaykKK3sKKyAgICAgICAgc29ja19sb2NrKHRzb2NrKTsKKwlidWZfZGlzY2FyZChza2JfZGVxdWV1ZSgmdHNvY2stPnNrLnNrX3JlY2VpdmVfcXVldWUpKTsKKyAgICAgICAgc29ja191bmxvY2sodHNvY2spOworCWF0b21pY19kZWMoJnRpcGNfcXVldWVfc2l6ZSk7Cit9CisKKy8qKgorICogdGlwY19jcmVhdGUgLSBjcmVhdGUgYSBUSVBDIHNvY2tldAorICogQHNvY2s6IHByZS1hbGxvY2F0ZWQgc29ja2V0IHN0cnVjdHVyZQorICogQHByb3RvY29sOiBwcm90b2NvbCBpbmRpY2F0b3IgKG11c3QgYmUgMCkKKyAqIAorICogVGhpcyByb3V0aW5lIGNyZWF0ZXMgYW5kIGF0dGFjaGVzIGEgJ3N0cnVjdCBzb2NrJyB0byB0aGUgJ3N0cnVjdCBzb2NrZXQnLAorICogdGhlbiBjcmVhdGUgYW5kIGF0dGFjaGVzIGEgVElQQyBwb3J0IHRvIHRoZSAnc3RydWN0IHNvY2snIHBhcnQuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHRpcGNfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jazsKKwlzdHJ1Y3QgdGlwY19wb3J0ICpwb3J0OworCXN0cnVjdCBzb2NrICpzazsKKyAgICAgICAgdTMyIHJlZjsKKworCWlmICgoc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSkgJiYgCisJICAgIChzb2NrLT50eXBlICE9IFNPQ0tfU0VRUEFDS0VUKSAmJgorCSAgICAoc29jay0+dHlwZSAhPSBTT0NLX0RHUkFNKSAmJgorCSAgICAoc29jay0+dHlwZSAhPSBTT0NLX1JETSkpCisJCXJldHVybiAtRVBST1RPVFlQRTsKKworCWlmICh1bmxpa2VseShwcm90b2NvbCAhPSAwKSkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisKKwlyZWYgPSB0aXBjX2NyZWF0ZXBvcnRfcmF3KDAsICZkaXNwYXRjaCwgJndha2V1cGRpc3BhdGNoLCBUSVBDX0xPV19JTVBPUlRBTkNFKTsKKwlpZiAodW5saWtlbHkoIXJlZikpCisJCXJldHVybiAtRU5PTUVNOworCisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKworCXN3aXRjaCAoc29jay0+dHlwZSkgeworCWNhc2UgU09DS19TVFJFQU06CisJCXNvY2stPm9wcyA9ICZzdHJlYW1fb3BzOworCQlicmVhazsKKwljYXNlIFNPQ0tfU0VRUEFDS0VUOgorCQlzb2NrLT5vcHMgPSAmcGFja2V0X29wczsKKwkJYnJlYWs7CisJY2FzZSBTT0NLX0RHUkFNOgorCQl0aXBjX3NldF9wb3J0dW5yZWxpYWJsZShyZWYsIDEpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPQ0tfUkRNOgorCQl0aXBjX3NldF9wb3J0dW5yZXR1cm5hYmxlKHJlZiwgMSk7CisJCXNvY2stPm9wcyA9ICZtc2dfb3BzOworCQlzb2NrLT5zdGF0ZSA9IFNTX1JFQURZOworCQlicmVhazsKKwl9CisKKwlzayA9IHNrX2FsbG9jKEFGX1RJUEMsIEdGUF9LRVJORUwsICZ0aXBjX3Byb3RvLCAxKTsKKwlpZiAoIXNrKSB7CisJCXRpcGNfZGVsZXRlcG9ydChyZWYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisJaW5pdF93YWl0cXVldWVfaGVhZChzay0+c2tfc2xlZXApOworCXNrLT5za19yY3Z0aW1lbyA9IDggKiBIWjsgICAvKiBkZWZhdWx0IGNvbm5lY3QgdGltZW91dCA9IDhzICovCisKKwl0c29jayA9IHRpcGNfc2soc2spOworCXBvcnQgPSB0aXBjX2dldF9wb3J0KHJlZik7CisKKwl0c29jay0+cCA9IHBvcnQ7CisJcG9ydC0+dXNyX2hhbmRsZSA9IHRzb2NrOworCisJaW5pdF9NVVRFWCgmdHNvY2stPnNlbSk7CisKKwlkYmcoInNvY2tfY3JlYXRlOiAleFxuIix0c29jayk7CisKKwlhdG9taWNfaW5jKCZ0aXBjX3VzZXJfY291bnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcmVsZWFzZSAtIGRlc3Ryb3kgYSBUSVBDIHNvY2tldAorICogQHNvY2s6IHNvY2tldCB0byBkZXN0cm95CisgKgorICogVGhpcyByb3V0aW5lIGNsZWFucyB1cCBhbnkgbWVzc2FnZXMgdGhhdCBhcmUgc3RpbGwgcXVldWVkIG9uIHRoZSBzb2NrZXQuCisgKiBGb3IgREdSQU0gYW5kIFJETSBzb2NrZXQgdHlwZXMsIGFsbCBxdWV1ZWQgbWVzc2FnZXMgYXJlIHJlamVjdGVkLgorICogRm9yIFNFUVBBQ0tFVCBhbmQgU1RSRUFNIHNvY2tldCB0eXBlcywgdGhlIGZpcnN0IG1lc3NhZ2UgaXMgcmVqZWN0ZWQKKyAqIGFuZCBhbnkgb3RoZXJzIGFyZSBkaXNjYXJkZWQuICAoSWYgdGhlIGZpcnN0IG1lc3NhZ2Ugb24gYSBTVFJFQU0gc29ja2V0CisgKiBpcyBwYXJ0aWFsbHktcmVhZCwgaXQgaXMgZGlzY2FyZGVkIGFuZCB0aGUgbmV4dCBvbmUgaXMgcmVqZWN0ZWQgaW5zdGVhZC4pCisgKiAKKyAqIE5PVEU6IFJlamVjdGVkIG1lc3NhZ2VzIGFyZSBub3QgbmVjZXNzYXJpbHkgcmV0dXJuZWQgdG8gdGhlIHNlbmRlciEgIFRoZXkKKyAqIGFyZSByZXR1cm5lZCBvciBkaXNjYXJkZWQgYWNjb3JkaW5nIHRvIHRoZSAiZGVzdGluYXRpb24gZHJvcHBhYmxlIiBzZXR0aW5nCisgKiBzcGVjaWZpZWQgZm9yIHRoZSBtZXNzYWdlIGJ5IHRoZSBzZW5kZXIuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IHJlcyA9IFRJUENfT0s7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKworICAgICAgICBkYmcoInNvY2tfZGVsZXRlOiAleFxuIix0c29jayk7CisJaWYgKCF0c29jaykKKwkJcmV0dXJuIDA7CisJZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKTsKKwlpZiAoIXNvY2stPnNrKSB7CisJCXVwKCZ0c29jay0+c2VtKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIFJlamVjdCB1bnJlY2VpdmVkIG1lc3NhZ2VzLCB1bmxlc3Mgbm8gbG9uZ2VyIGNvbm5lY3RlZCAqLworCisJd2hpbGUgKHNvY2stPnN0YXRlICE9IFNTX0RJU0NPTk5FQ1RJTkcpIHsKKwkJc29ja19sb2NrKHRzb2NrKTsKKwkJYnVmID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwkJaWYgKCFidWYpCisJCQl0c29jay0+cC0+dXNyX2hhbmRsZSA9IDA7CisJCXNvY2tfdW5sb2NrKHRzb2NrKTsKKwkJaWYgKCFidWYpCisJCQlicmVhazsKKwkJaWYgKFRJUENfU0tCX0NCKGJ1ZiktPmhhbmRsZSAhPSBtc2dfZGF0YShidWZfbXNnKGJ1ZikpKQorCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJZWxzZQorCQkJdGlwY19yZWplY3RfbXNnKGJ1ZiwgVElQQ19FUlJfTk9fUE9SVCk7CisJCWF0b21pY19kZWMoJnRpcGNfcXVldWVfc2l6ZSk7CisJfQorCisJLyogRGVsZXRlIFRJUEMgcG9ydCAqLworCisJcmVzID0gdGlwY19kZWxldGVwb3J0KHRzb2NrLT5wLT5yZWYpOworCXNvY2stPnNrID0gTlVMTDsKKworCS8qIERpc2NhcmQgYW55IHJlbWFpbmluZyBtZXNzYWdlcyAqLworCisJd2hpbGUgKChidWYgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSkgeworCQlidWZfZGlzY2FyZChidWYpOworCQlhdG9taWNfZGVjKCZ0aXBjX3F1ZXVlX3NpemUpOworCX0KKworCXVwKCZ0c29jay0+c2VtKTsKKworCXNvY2tfcHV0KHNrKTsKKworICAgICAgICBhdG9taWNfZGVjKCZ0aXBjX3VzZXJfY291bnQpOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogYmluZCAtIGFzc29jaWF0ZSBvciBkaXNhc3NvY2F0ZSBUSVBDIG5hbWUocykgd2l0aCBhIHNvY2tldAorICogQHNvY2s6IHNvY2tldCBzdHJ1Y3R1cmUKKyAqIEB1YWRkcjogc29ja2V0IGFkZHJlc3MgZGVzY3JpYmluZyBuYW1lKHMpIGFuZCBkZXNpcmVkIG9wZXJhdGlvbgorICogQHVhZGRyX2xlbjogc2l6ZSBvZiBzb2NrZXQgYWRkcmVzcyBkYXRhIHN0cnVjdHVyZQorICogCisgKiBOYW1lIGFuZCBuYW1lIHNlcXVlbmNlIGJpbmRpbmcgaXMgaW5kaWNhdGVkIHVzaW5nIGEgcG9zaXRpdmUgc2NvcGUgdmFsdWU7CisgKiBhIG5lZ2F0aXZlIHNjb3BlIHZhbHVlIHVuYmluZHMgdGhlIHNwZWNpZmllZCBuYW1lLiAgU3BlY2lmeWluZyBubyBuYW1lCisgKiAoaS5lLiBhIHNvY2tldCBhZGRyZXNzIGxlbmd0aCBvZiAwKSB1bmJpbmRzIGFsbCBuYW1lcyBmcm9tIHRoZSBzb2NrZXQuCisgKiAKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IGJpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IHVhZGRyX2xlbikKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworCXN0cnVjdCBzb2NrYWRkcl90aXBjICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl90aXBjICopdWFkZHI7CisJaW50IHJlczsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQorCWlmICh1bmxpa2VseSghdWFkZHJfbGVuKSkgeworCQlyZXMgPSB0aXBjX3dpdGhkcmF3KHRzb2NrLT5wLT5yZWYsIDAsIDApOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKHVhZGRyX2xlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdGlwYykpIHsKKwkJcmVzID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmIChhZGRyLT5mYW1pbHkgIT0gQUZfVElQQykgeworCQlyZXMgPSAtRUFGTk9TVVBQT1JUOworCQlnb3RvIGV4aXQ7CisJfQorCWlmIChhZGRyLT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTkFNRSkKKwkJYWRkci0+YWRkci5uYW1lc2VxLnVwcGVyID0gYWRkci0+YWRkci5uYW1lc2VxLmxvd2VyOworCWVsc2UgaWYgKGFkZHItPmFkZHJ0eXBlICE9IFRJUENfQUREUl9OQU1FU0VRKSB7CisJCXJlcyA9IC1FQUZOT1NVUFBPUlQ7CisJCWdvdG8gZXhpdDsKKwl9CisgICAgICAgIAorICAgICAgIAlpZiAoYWRkci0+c2NvcGUgPiAwKQorCQlyZXMgPSB0aXBjX3B1Ymxpc2godHNvY2stPnAtPnJlZiwgYWRkci0+c2NvcGUsCisJCQkJICAgJmFkZHItPmFkZHIubmFtZXNlcSk7CisJZWxzZQorCQlyZXMgPSB0aXBjX3dpdGhkcmF3KHRzb2NrLT5wLT5yZWYsIC1hZGRyLT5zY29wZSwKKwkJCQkgICAgJmFkZHItPmFkZHIubmFtZXNlcSk7CitleGl0OgorCXVwKCZ0c29jay0+c2VtKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiogCisgKiBnZXRfbmFtZSAtIGdldCBwb3J0IElEIG9mIHNvY2tldCBvciBwZWVyIHNvY2tldAorICogQHNvY2s6IHNvY2tldCBzdHJ1Y3R1cmUKKyAqIEB1YWRkcjogYXJlYSBmb3IgcmV0dXJuZWQgc29ja2V0IGFkZHJlc3MKKyAqIEB1YWRkcl9sZW46IGFyZWEgZm9yIHJldHVybmVkIGxlbmd0aCBvZiBzb2NrZXQgYWRkcmVzcworICogQHBlZXI6IDAgdG8gb2J0YWluIHNvY2tldCBuYW1lLCAxIHRvIG9idGFpbiBwZWVyIHNvY2tldCBuYW1lCisgKiAKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IGdldF9uYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsIAorCQkgICAgaW50ICp1YWRkcl9sZW4sIGludCBwZWVyKQoreworCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CisJc3RydWN0IHNvY2thZGRyX3RpcGMgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3RpcGMgKil1YWRkcjsKKwl1MzIgcmVzOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdHNvY2stPnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkqdWFkZHJfbGVuID0gc2l6ZW9mKCphZGRyKTsKKwlhZGRyLT5hZGRydHlwZSA9IFRJUENfQUREUl9JRDsKKwlhZGRyLT5mYW1pbHkgPSBBRl9USVBDOworCWFkZHItPnNjb3BlID0gMDsKKwlpZiAocGVlcikKKwkJcmVzID0gdGlwY19wZWVyKHRzb2NrLT5wLT5yZWYsICZhZGRyLT5hZGRyLmlkKTsKKwllbHNlCisJCXJlcyA9IHRpcGNfb3duaWRlbnRpdHkodHNvY2stPnAtPnJlZiwgJmFkZHItPmFkZHIuaWQpOworCWFkZHItPmFkZHIubmFtZS5kb21haW4gPSAwOworCisJdXAoJnRzb2NrLT5zZW0pOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogcG9sbCAtIHJlYWQgYW5kIHBvc3NpYmx5IGJsb2NrIG9uIHBvbGxtYXNrCisgKiBAZmlsZTogZmlsZSBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb2NrZXQKKyAqIEBzb2NrOiBzb2NrZXQgZm9yIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgcG9sbCBiaXRzCisgKiBAd2FpdDogPz8/CisgKgorICogUmV0dXJucyB0aGUgcG9sbG1hc2sKKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IHBvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIAorCQkJIHBvbGxfdGFibGUgKndhaXQpCit7CisJcG9sbF93YWl0KGZpbGUsIHNvY2stPnNrLT5za19zbGVlcCwgd2FpdCk7CisJLyogTkVFRCBMT0NLIEhFUkU/ICovCisJcmV0dXJuIHBvbGxtYXNrKHNvY2spOworfQorCisvKiogCisgKiBkZXN0X25hbWVfY2hlY2sgLSB2ZXJpZnkgdXNlciBpcyBwZXJtaXR0ZWQgdG8gc2VuZCB0byBzcGVjaWZpZWQgcG9ydCBuYW1lCisgKiBAZGVzdDogZGVzdGluYXRpb24gYWRkcmVzcworICogQG06IGRlc2NyaXB0b3IgZm9yIG1lc3NhZ2UgdG8gYmUgc2VudAorICogCisgKiBQcmV2ZW50cyByZXN0cmljdGVkIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMgZnJvbSBiZWluZyBpc3N1ZWQgYnkKKyAqIHVuYXV0aG9yaXplZCB1c2Vycy4KKyAqIAorICogUmV0dXJucyAwIGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCwgb3RoZXJ3aXNlIGVycm5vCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgZGVzdF9uYW1lX2NoZWNrKHN0cnVjdCBzb2NrYWRkcl90aXBjICpkZXN0LCBzdHJ1Y3QgbXNnaGRyICptKQoreworCXN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyIGhkcjsKKworICAgICAgICBpZiAobGlrZWx5KGRlc3QtPmFkZHIubmFtZS5uYW1lLnR5cGUgPj0gVElQQ19SRVNFUlZFRF9UWVBFUykpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChsaWtlbHkoZGVzdC0+YWRkci5uYW1lLm5hbWUudHlwZSA9PSBUSVBDX1RPUF9TUlYpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmIChsaWtlbHkoZGVzdC0+YWRkci5uYW1lLm5hbWUudHlwZSAhPSBUSVBDX0NGR19TUlYpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUFDQ0VTOworCisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmaGRyLCBtLT5tc2dfaW92WzBdLmlvdl9iYXNlLCBzaXplb2YoaGRyKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICgobnRvaHMoaGRyLnRjbV90eXBlKSAmIDB4QzAwMCkgJiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKyAgICAgICAgCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc2VuZF9tc2cgLSBzZW5kIG1lc3NhZ2UgaW4gY29ubmVjdGlvbmxlc3MgbWFubmVyCisgKiBAaW9jYjogKHVudXNlZCkKKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAbTogbWVzc2FnZSB0byBzZW5kCisgKiBAdG90YWxfbGVuOiAodW51c2VkKQorICogCisgKiBNZXNzYWdlIG11c3QgaGF2ZSBhbiBkZXN0aW5hdGlvbiBzcGVjaWZpZWQgZXhwbGljaXRseS4KKyAqIFVzZWQgZm9yIFNPQ0tfUkRNIGFuZCBTT0NLX0RHUkFNIG1lc3NhZ2VzLCAKKyAqIGFuZCBmb3IgJ1NZTicgbWVzc2FnZXMgb24gU09DS19TRVFQQUNLRVQgYW5kIFNPQ0tfU1RSRUFNIGNvbm5lY3Rpb25zLgorICogKE5vdGU6ICdTWU4rJyBpcyBwcm9oaWJpdGVkIG9uIFNPQ0tfU1RSRUFNLikKKyAqIAorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgb24gc3VjY2Vzcywgb3IgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCBzZW5kX21zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCSAgICBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgdG90YWxfbGVuKQoreworCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl90aXBjICpkZXN0ID0gKHN0cnVjdCBzb2NrYWRkcl90aXBjICopbS0+bXNnX25hbWU7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlpbnQgbmVlZHNfY29ubjsKKwlpbnQgcmVzID0gLUVJTlZBTDsKKworCWlmICh1bmxpa2VseSghZGVzdCkpCisJCXJldHVybiAtRURFU1RBRERSUkVROworCWlmICh1bmxpa2VseShkZXN0LT5mYW1pbHkgIT0gQUZfVElQQykpCisJCXJldHVybiAtRUlOVkFMOworCisJbmVlZHNfY29ubiA9IChzb2NrLT5zdGF0ZSAhPSBTU19SRUFEWSk7CisJaWYgKHVubGlrZWx5KG5lZWRzX2Nvbm4pKSB7CisJCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19MSVNURU5JTkcpCisJCQlyZXR1cm4gLUVQSVBFOworCQlpZiAoc29jay0+c3RhdGUgIT0gU1NfVU5DT05ORUNURUQpCisJCQlyZXR1cm4gLUVJU0NPTk47CisJCWlmICgodHNvY2stPnAtPnB1Ymxpc2hlZCkgfHwKKwkJICAgICgoc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSkgJiYgKHRvdGFsX2xlbiAhPSAwKSkpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdHNvY2stPnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAobmVlZHNfY29ubikgeworCisJCS8qIEFib3J0IGFueSBwZW5kaW5nIGNvbm5lY3Rpb24gYXR0ZW1wdHMgKHZlcnkgdW5saWtlbHkpICovCisKKwkJd2hpbGUgKChidWYgPSBza2JfZGVxdWV1ZSgmc29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpKSkgeworCQkJdGlwY19yZWplY3RfbXNnKGJ1ZiwgVElQQ19FUlJfTk9fUE9SVCk7CisJCQlhdG9taWNfZGVjKCZ0aXBjX3F1ZXVlX3NpemUpOworCQl9CisKKwkJc29jay0+c3RhdGUgPSBTU19DT05ORUNUSU5HOworCX0KKworICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKGRlc3QtPmFkZHJ0eXBlID09IFRJUENfQUREUl9OQU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcyA9IGRlc3RfbmFtZV9jaGVjayhkZXN0LCBtKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHRpcGNfc2VuZDJuYW1lKHRzb2NrLT5wLT5yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdC0+YWRkci5uYW1lLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LT5hZGRyLm5hbWUuZG9tYWluLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1zZ19pb3ZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5tc2dfaW92KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVzdC0+YWRkcnR5cGUgPT0gVElQQ19BRERSX0lEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB0aXBjX3NlbmQycG9ydCh0c29jay0+cC0+cmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3QtPmFkZHIuaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5tc2dfaW92bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+bXNnX2lvdik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlc3QtPmFkZHJ0eXBlID09IFRJUENfQUREUl9NQ0FTVCkgeworCQkJaWYgKG5lZWRzX2Nvbm4pIHsKKwkJCQlyZXMgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcyA9IGRlc3RfbmFtZV9jaGVjayhkZXN0LCBtKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHRpcGNfbXVsdGljYXN0KHRzb2NrLT5wLT5yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdC0+YWRkci5uYW1lc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1zZ19pb3ZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5tc2dfaW92KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpa2VseShyZXMgIT0gLUVMSU5LQ09ORykpIHsKK2V4aXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ0c29jay0+c2VtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCQlpZiAobS0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKSB7CisJCQlyZXMgPSAtRVdPVUxEQkxPQ0s7CisJCQlnb3RvIGV4aXQ7CisJCX0KKyAgICAgICAgICAgICAgICBpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKCpzb2NrLT5zay0+c2tfc2xlZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdHNvY2stPnAtPmNvbmdlc3RlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgxKTsKK30KKworLyoqIAorICogc2VuZF9wYWNrZXQgLSBzZW5kIGEgY29ubmVjdGlvbi1vcmllbnRlZCBtZXNzYWdlCisgKiBAaW9jYjogKHVudXNlZCkKKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAbTogbWVzc2FnZSB0byBzZW5kCisgKiBAdG90YWxfbGVuOiAodW51c2VkKQorICogCisgKiBVc2VkIGZvciBTT0NLX1NFUVBBQ0tFVCBtZXNzYWdlcyBhbmQgU09DS19TVFJFQU0gZGF0YS4KKyAqIAorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgb24gc3VjY2Vzcywgb3IgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCBzZW5kX3BhY2tldChzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgdG90YWxfbGVuKQoreworCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl90aXBjICpkZXN0ID0gKHN0cnVjdCBzb2NrYWRkcl90aXBjICopbS0+bXNnX25hbWU7CisJaW50IHJlczsKKworCS8qIEhhbmRsZSBpbXBsaWVkIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCAqLworCisJaWYgKHVubGlrZWx5KGRlc3QpKQorCQlyZXR1cm4gc2VuZF9tc2coaW9jYiwgc29jaywgbSwgdG90YWxfbGVuKTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKSB7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisgICAgICAgIH0KKworICAgICAgICBpZiAodW5saWtlbHkoc29jay0+c3RhdGUgIT0gU1NfQ09OTkVDVEVEKSkgeworICAgICAgICAgICAgICAgIGlmIChzb2NrLT5zdGF0ZSA9PSBTU19ESVNDT05ORUNUSU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gLUVQSVBFOyAgIAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IC1FTk9UQ09OTjsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgcmVzID0gdGlwY19zZW5kKHRzb2NrLT5wLT5yZWYsIG0tPm1zZ19pb3ZsZW4sIG0tPm1zZ19pb3YpOworICAgICAgICAgICAgICAgIGlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKSB7CitleGl0OgorICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnRzb2NrLT5zZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisJCWlmIChtLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQpIHsKKwkJCXJlcyA9IC1FV09VTERCTE9DSzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorICAgICAgICAgICAgICAgIGlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKnNvY2stPnNrLT5za19zbGVlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0c29jay0+cC0+Y29uZ2VzdGVkKSkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSAtRVJFU1RBUlRTWVM7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKDEpOworfQorCisvKiogCisgKiBzZW5kX3N0cmVhbSAtIHNlbmQgc3RyZWFtLW9yaWVudGVkIGRhdGEKKyAqIEBpb2NiOiAodW51c2VkKQorICogQHNvY2s6IHNvY2tldCBzdHJ1Y3R1cmUKKyAqIEBtOiBkYXRhIHRvIHNlbmQKKyAqIEB0b3RhbF9sZW46IHRvdGFsIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAqIAorICogVXNlZCBmb3IgU09DS19TVFJFQU0gZGF0YS4KKyAqIAorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgb24gc3VjY2Vzcywgb3IgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworCitzdGF0aWMgaW50IHNlbmRfc3RyZWFtKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJICAgICAgIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCB0b3RhbF9sZW4pCit7CisJc3RydWN0IG1zZ2hkciBteV9tc2c7CisJc3RydWN0IGlvdmVjIG15X2lvdjsKKwlzdHJ1Y3QgaW92ZWMgKmN1cnJfaW92OworCWludCBjdXJyX2lvdmxlbjsKKwljaGFyIF9fdXNlciAqY3Vycl9zdGFydDsKKwlpbnQgY3Vycl9sZWZ0OworCWludCBieXRlc190b19zZW5kOworCWludCByZXM7CisJCisJaWYgKGxpa2VseSh0b3RhbF9sZW4gPD0gVElQQ19NQVhfVVNFUl9NU0dfU0laRSkpCisJCXJldHVybiBzZW5kX3BhY2tldChpb2NiLCBzb2NrLCBtLCB0b3RhbF9sZW4pOworCisJLyogQ2FuIG9ubHkgc2VuZCBsYXJnZSBkYXRhIHN0cmVhbXMgaWYgYWxyZWFkeSBjb25uZWN0ZWQgKi8KKworICAgICAgICBpZiAodW5saWtlbHkoc29jay0+c3RhdGUgIT0gU1NfQ09OTkVDVEVEKSkgeworICAgICAgICAgICAgICAgIGlmIChzb2NrLT5zdGF0ZSA9PSBTU19ESVNDT05ORUNUSU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FUElQRTsgICAKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT1RDT05OOworICAgICAgICB9CisKKwkvKiAKKwkgKiBTZW5kIGVhY2ggaW92ZWMgZW50cnkgdXNpbmcgb25lIG9yIG1vcmUgbWVzc2FnZXMKKwkgKgorCSAqIE5vdGU6IFRoaXMgYWxnb3JpdGhtIGlzIGdvb2QgZm9yIHRoZSBtb3N0IGxpa2VseSBjYXNlIAorCSAqIChpLmUuIG9uZSBsYXJnZSBpb3ZlYyBlbnRyeSksIGJ1dCBjb3VsZCBiZSBpbXByb3ZlZCB0byBwYXNzIHNldHMKKwkgKiBvZiBzbWFsbCBpb3ZlYyBlbnRyaWVzIGludG8gc2VuZF9wYWNrZXQoKS4KKwkgKi8KKworCW15X21zZyA9ICptOworCWN1cnJfaW92ID0gbXlfbXNnLm1zZ19pb3Y7CisJY3Vycl9pb3ZsZW4gPSBteV9tc2cubXNnX2lvdmxlbjsKKwlteV9tc2cubXNnX2lvdiA9ICZteV9pb3Y7CisJbXlfbXNnLm1zZ19pb3ZsZW4gPSAxOworCisJd2hpbGUgKGN1cnJfaW92bGVuLS0pIHsKKwkJY3Vycl9zdGFydCA9IGN1cnJfaW92LT5pb3ZfYmFzZTsKKwkJY3Vycl9sZWZ0ID0gY3Vycl9pb3YtPmlvdl9sZW47CisKKwkJd2hpbGUgKGN1cnJfbGVmdCkgeworCQkJYnl0ZXNfdG9fc2VuZCA9IChjdXJyX2xlZnQgPCBUSVBDX01BWF9VU0VSX01TR19TSVpFKQorCQkJCT8gY3Vycl9sZWZ0IDogVElQQ19NQVhfVVNFUl9NU0dfU0laRTsKKwkJCW15X2lvdi5pb3ZfYmFzZSA9IGN1cnJfc3RhcnQ7CisJCQlteV9pb3YuaW92X2xlbiA9IGJ5dGVzX3RvX3NlbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcyA9IHNlbmRfcGFja2V0KGlvY2IsIHNvY2ssICZteV9tc2csIDApKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisJCQljdXJyX2xlZnQgLT0gYnl0ZXNfdG9fc2VuZDsKKwkJCWN1cnJfc3RhcnQgKz0gYnl0ZXNfdG9fc2VuZDsKKwkJfQorCisJCWN1cnJfaW92Kys7CisJfQorCisJcmV0dXJuIHRvdGFsX2xlbjsKK30KKworLyoqCisgKiBhdXRvX2Nvbm5lY3QgLSBjb21wbGV0ZSBjb25uZWN0aW9uIHNldHVwIHRvIGEgcmVtb3RlIHBvcnQKKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAdHNvY2s6IFRJUEMtc3BlY2lmaWMgc29ja2V0IHN0cnVjdHVyZQorICogQG1zZzogcGVlcidzIHJlc3BvbnNlIG1lc3NhZ2UKKyAqIAorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgYXV0b19jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrLCAKKwkJCXN0cnVjdCB0aXBjX21zZyAqbXNnKQoreworCXN0cnVjdCB0aXBjX3BvcnRpZCBwZWVyOworCisJaWYgKG1zZ19lcnJjb2RlKG1zZykpIHsKKwkJc29jay0+c3RhdGUgPSBTU19ESVNDT05ORUNUSU5HOworCQlyZXR1cm4gLUVDT05OUkVGVVNFRDsKKwl9CisKKwlwZWVyLnJlZiA9IG1zZ19vcmlncG9ydChtc2cpOworCXBlZXIubm9kZSA9IG1zZ19vcmlnbm9kZShtc2cpOworCXRpcGNfY29ubmVjdDJwb3J0KHRzb2NrLT5wLT5yZWYsICZwZWVyKTsKKwl0aXBjX3NldF9wb3J0aW1wb3J0YW5jZSh0c29jay0+cC0+cmVmLCBtc2dfaW1wb3J0YW5jZShtc2cpKTsKKwlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzZXRfb3JpZ19hZGRyIC0gY2FwdHVyZSBzZW5kZXIncyBhZGRyZXNzIGZvciByZWNlaXZlZCBtZXNzYWdlCisgKiBAbTogZGVzY3JpcHRvciBmb3IgbWVzc2FnZSBpbmZvCisgKiBAbXNnOiByZWNlaXZlZCBtZXNzYWdlIGhlYWRlcgorICogCisgKiBOb3RlOiBBZGRyZXNzIGlzIG5vdCBjYXB0dXJlZCBpZiBub3QgcmVxdWVzdGVkIGJ5IHJlY2VpdmVyLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfb3JpZ19hZGRyKHN0cnVjdCBtc2doZHIgKm0sIHN0cnVjdCB0aXBjX21zZyAqbXNnKQoreworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqKW0tPm1zZ19uYW1lOworCisgICAgICAgIGlmIChhZGRyKSB7CisJCWFkZHItPmZhbWlseSA9IEFGX1RJUEM7CisJCWFkZHItPmFkZHJ0eXBlID0gVElQQ19BRERSX0lEOworCQlhZGRyLT5hZGRyLmlkLnJlZiA9IG1zZ19vcmlncG9ydChtc2cpOworCQlhZGRyLT5hZGRyLmlkLm5vZGUgPSBtc2dfb3JpZ25vZGUobXNnKTsKKwkJYWRkci0+YWRkci5uYW1lLmRvbWFpbiA9IDA7ICAgCS8qIGNvdWxkIGxlYXZlIHVuaW5pdGlhbGl6ZWQgKi8KKwkJYWRkci0+c2NvcGUgPSAwOyAgIAkJLyogY291bGQgbGVhdmUgdW5pbml0aWFsaXplZCAqLworCQltLT5tc2dfbmFtZWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdGlwYyk7CisJfQorfQorCisvKioKKyAqIGFuY19kYXRhX3JlY3YgLSBvcHRpb25hbGx5IGNhcHR1cmUgYW5jaWxsYXJ5IGRhdGEgZm9yIHJlY2VpdmVkIG1lc3NhZ2UgCisgKiBAbTogZGVzY3JpcHRvciBmb3IgbWVzc2FnZSBpbmZvCisgKiBAbXNnOiByZWNlaXZlZCBtZXNzYWdlIGhlYWRlcgorICogQHRwb3J0OiBUSVBDIHBvcnQgYXNzb2NpYXRlZCB3aXRoIG1lc3NhZ2UKKyAqIAorICogTm90ZTogQW5jaWxsYXJ5IGRhdGEgaXMgbm90IGNhcHR1cmVkIGlmIG5vdCByZXF1ZXN0ZWQgYnkgcmVjZWl2ZXIuCisgKiAKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJybm8KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBhbmNfZGF0YV9yZWN2KHN0cnVjdCBtc2doZHIgKm0sIHN0cnVjdCB0aXBjX21zZyAqbXNnLCAKKwkJCQlzdHJ1Y3QgdGlwY19wb3J0ICp0cG9ydCkKK3sKKwl1MzIgYW5jX2RhdGFbM107CisJdTMyIGVycjsKKwl1MzIgZGVzdF90eXBlOworCWludCByZXM7CisKKwlpZiAobGlrZWx5KG0tPm1zZ19jb250cm9sbGVuID09IDApKQorCQlyZXR1cm4gMDsKKworCS8qIE9wdGlvbmFsbHkgY2FwdHVyZSBlcnJvcmVkIG1lc3NhZ2Ugb2JqZWN0KHMpICovCisKKwllcnIgPSBtc2cgPyBtc2dfZXJyY29kZShtc2cpIDogMDsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlhbmNfZGF0YVswXSA9IGVycjsKKwkJYW5jX2RhdGFbMV0gPSBtc2dfZGF0YV9zeihtc2cpOworCQlpZiAoKHJlcyA9IHB1dF9jbXNnKG0sIFNPTF9TT0NLRVQsIFRJUENfRVJSSU5GTywgOCwgYW5jX2RhdGEpKSkKKwkJCXJldHVybiByZXM7CisJCWlmIChhbmNfZGF0YVsxXSAmJgorCQkgICAgKHJlcyA9IHB1dF9jbXNnKG0sIFNPTF9TT0NLRVQsIFRJUENfUkVUREFUQSwgYW5jX2RhdGFbMV0sIAorCQkJCSAgICBtc2dfZGF0YShtc2cpKSkpCisJCQlyZXR1cm4gcmVzOworCX0KKworCS8qIE9wdGlvbmFsbHkgY2FwdHVyZSBtZXNzYWdlIGRlc3RpbmF0aW9uIG9iamVjdCAqLworCisJZGVzdF90eXBlID0gbXNnID8gbXNnX3R5cGUobXNnKSA6IFRJUENfRElSRUNUX01TRzsKKwlzd2l0Y2ggKGRlc3RfdHlwZSkgeworCWNhc2UgVElQQ19OQU1FRF9NU0c6CisJCWFuY19kYXRhWzBdID0gbXNnX25hbWV0eXBlKG1zZyk7CisJCWFuY19kYXRhWzFdID0gbXNnX25hbWVsb3dlcihtc2cpOworCQlhbmNfZGF0YVsyXSA9IG1zZ19uYW1lbG93ZXIobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX01DQVNUX01TRzoKKwkJYW5jX2RhdGFbMF0gPSBtc2dfbmFtZXR5cGUobXNnKTsKKwkJYW5jX2RhdGFbMV0gPSBtc2dfbmFtZWxvd2VyKG1zZyk7CisJCWFuY19kYXRhWzJdID0gbXNnX25hbWV1cHBlcihtc2cpOworCQlicmVhazsKKwljYXNlIFRJUENfQ09OTl9NU0c6CisJCWFuY19kYXRhWzBdID0gdHBvcnQtPmNvbm5fdHlwZTsKKwkJYW5jX2RhdGFbMV0gPSB0cG9ydC0+Y29ubl9pbnN0YW5jZTsKKwkJYW5jX2RhdGFbMl0gPSB0cG9ydC0+Y29ubl9pbnN0YW5jZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYW5jX2RhdGFbMF0gPSAwOworCX0KKwlpZiAoYW5jX2RhdGFbMF0gJiYKKwkgICAgKHJlcyA9IHB1dF9jbXNnKG0sIFNPTF9TT0NLRVQsIFRJUENfREVTVE5BTUUsIDEyLCBhbmNfZGF0YSkpKQorCQlyZXR1cm4gcmVzOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiAKKyAqIHJlY3ZfbXNnIC0gcmVjZWl2ZSBwYWNrZXQtb3JpZW50ZWQgbWVzc2FnZQorICogQGlvY2I6ICh1bnVzZWQpCisgKiBAbTogZGVzY3JpcHRvciBmb3IgbWVzc2FnZSBpbmZvCisgKiBAYnVmX2xlbjogdG90YWwgc2l6ZSBvZiB1c2VyIGJ1ZmZlciBhcmVhCisgKiBAZmxhZ3M6IHJlY2VpdmUgZmxhZ3MKKyAqIAorICogVXNlZCBmb3IgU09DS19ER1JBTSwgU09DS19SRE0sIGFuZCBTT0NLX1NFUVBBQ0tFVCBtZXNzYWdlcy4KKyAqIElmIHRoZSBjb21wbGV0ZSBtZXNzYWdlIGRvZXNuJ3QgZml0IGluIHVzZXIgYXJlYSwgdHJ1bmNhdGUgaXQuCisgKgorICogUmV0dXJucyBzaXplIG9mIHJldHVybmVkIG1lc3NhZ2UgZGF0YSwgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCByZWN2X21zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCSAgICBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgYnVmX2xlbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1bnNpZ25lZCBpbnQgcV9sZW47CisJdW5zaWduZWQgaW50IHN6OworCXUzMiBlcnI7CisJaW50IHJlczsKKworCS8qIEN1cnJlbnRseSBkb2Vzbid0IHN1cHBvcnQgcmVjZWl2aW5nIGludG8gbXVsdGlwbGUgaW92ZWMgZW50cmllcyAqLworCisJaWYgKG0tPm1zZ19pb3ZsZW4gIT0gMSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogQ2F0Y2ggaW52YWxpZCByZWNlaXZlIGF0dGVtcHRzICovCisKKwlpZiAodW5saWtlbHkoIWJ1Zl9sZW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzb2NrLT50eXBlID09IFNPQ0tfU0VRUEFDS0VUKSB7CisJCWlmICh1bmxpa2VseShzb2NrLT5zdGF0ZSA9PSBTU19VTkNPTk5FQ1RFRCkpCisJCQlyZXR1cm4gLUVOT1RDT05OOworCQlpZiAodW5saWtlbHkoKHNvY2stPnN0YXRlID09IFNTX0RJU0NPTk5FQ1RJTkcpICYmIAorCQkJICAgICAoc2tiX3F1ZXVlX2xlbigmc29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpID09IDApKSkKKwkJICAgICAgIAlyZXR1cm4gLUVOT1RDT05OOworCX0KKworCS8qIExvb2sgZm9yIGEgbWVzc2FnZSBpbiByZWNlaXZlIHF1ZXVlOyB3YWl0IGlmIG5lY2Vzc2FyeSAqLworCisJaWYgKHVubGlrZWx5KGRvd25faW50ZXJydXB0aWJsZSgmdHNvY2stPnNlbSkpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCityZXN0YXJ0OgorCWlmICh1bmxpa2VseSgoc2tiX3F1ZXVlX2xlbigmc29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpID09IDApICYmCisJCSAgICAgKGZsYWdzICYgTVNHX0RPTlRXQUlUKSkpIHsKKwkJcmVzID0gLUVXT1VMREJMT0NLOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKChyZXMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCisJCSpzb2NrLT5zay0+c2tfc2xlZXAsIAorCQkoKHFfbGVuID0gc2tiX3F1ZXVlX2xlbigmc29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpKSB8fAorCQkgKHNvY2stPnN0YXRlID09IFNTX0RJU0NPTk5FQ1RJTkcpKSkgKSkgeworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogQ2F0Y2ggYXR0ZW1wdCB0byByZWNlaXZlIG9uIGFuIGFscmVhZHkgdGVybWluYXRlZCBjb25uZWN0aW9uICovCisJLyogW1RISVMgQ0hFQ0sgTUFZIE9WRVJMQVAgV0lUSCBBTiBFQVJMSUVSIENIRUNLXSAqLworCisJaWYgKCFxX2xlbikgeworCQlyZXMgPSAtRU5PVENPTk47CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBHZXQgYWNjZXNzIHRvIGZpcnN0IG1lc3NhZ2UgaW4gcmVjZWl2ZSBxdWV1ZSAqLworCisJYnVmID0gc2tiX3BlZWsoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwltc2cgPSBidWZfbXNnKGJ1Zik7CisJc3ogPSBtc2dfZGF0YV9zeihtc2cpOworCWVyciA9IG1zZ19lcnJjb2RlKG1zZyk7CisKKwkvKiBDb21wbGV0ZSBjb25uZWN0aW9uIHNldHVwIGZvciBhbiBpbXBsaWVkIGNvbm5lY3QgKi8KKworCWlmICh1bmxpa2VseShzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNUSU5HKSkgeworCQlpZiAoKHJlcyA9IGF1dG9fY29ubmVjdChzb2NrLCB0c29jaywgbXNnKSkpCisJCQlnb3RvIGV4aXQ7CisJfQorCisJLyogRGlzY2FyZCBhbiBlbXB0eSBub24tZXJyb3JlZCBtZXNzYWdlICYgdHJ5IGFnYWluICovCisKKwlpZiAoKCFzeikgJiYgKCFlcnIpKSB7CisJCWFkdmFuY2VfcXVldWUodHNvY2spOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogQ2FwdHVyZSBzZW5kZXIncyBhZGRyZXNzIChvcHRpb25hbCkgKi8KKworCXNldF9vcmlnX2FkZHIobSwgbXNnKTsKKworCS8qIENhcHR1cmUgYW5jaWxsYXJ5IGRhdGEgKG9wdGlvbmFsKSAqLworCisJaWYgKChyZXMgPSBhbmNfZGF0YV9yZWN2KG0sIG1zZywgdHNvY2stPnApKSkKKwkJZ290byBleGl0OworCisJLyogQ2FwdHVyZSBtZXNzYWdlIGRhdGEgKGlmIHZhbGlkKSAmIGNvbXB1dGUgcmV0dXJuIHZhbHVlIChhbHdheXMpICovCisJCisJaWYgKCFlcnIpIHsKKwkJaWYgKHVubGlrZWx5KGJ1Zl9sZW4gPCBzeikpIHsKKwkJCXN6ID0gYnVmX2xlbjsKKwkJCW0tPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisJCX0KKwkJaWYgKHVubGlrZWx5KGNvcHlfdG9fdXNlcihtLT5tc2dfaW92LT5pb3ZfYmFzZSwgbXNnX2RhdGEobXNnKSwKKwkJCQkJICBzeikpKSB7CisJCQlyZXMgPSAtRUZBVUxUOworCQkJZ290byBleGl0OworCQl9CisJCXJlcyA9IHN6OworCX0gZWxzZSB7CisJCWlmICgoc29jay0+c3RhdGUgPT0gU1NfUkVBRFkpIHx8CisJCSAgICAoKGVyciA9PSBUSVBDX0NPTk5fU0hVVERPV04pIHx8IG0tPm1zZ19jb250cm9sKSkKKwkJCXJlcyA9IDA7CisJCWVsc2UKKwkJCXJlcyA9IC1FQ09OTlJFU0VUOworCX0KKworCS8qIENvbnN1bWUgcmVjZWl2ZWQgbWVzc2FnZSAob3B0aW9uYWwpICovCisKKwlpZiAobGlrZWx5KCEoZmxhZ3MgJiBNU0dfUEVFSykpKSB7CisgICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KCsrdHNvY2stPnAtPmNvbm5fdW5hY2tlZCA+PSBUSVBDX0ZMT1dfQ09OVFJPTF9XSU4pKQorICAgICAgICAgICAgICAgICAgICAgICAgdGlwY19hY2tub3dsZWRnZSh0c29jay0+cC0+cmVmLCB0c29jay0+cC0+Y29ubl91bmFja2VkKTsKKwkJYWR2YW5jZV9xdWV1ZSh0c29jayk7CisgICAgICAgIH0KK2V4aXQ6CisJdXAoJnRzb2NrLT5zZW0pOworCXJldHVybiByZXM7Cit9CisKKy8qKiAKKyAqIHJlY3Zfc3RyZWFtIC0gcmVjZWl2ZSBzdHJlYW0tb3JpZW50ZWQgZGF0YQorICogQGlvY2I6ICh1bnVzZWQpCisgKiBAbTogZGVzY3JpcHRvciBmb3IgbWVzc2FnZSBpbmZvCisgKiBAYnVmX2xlbjogdG90YWwgc2l6ZSBvZiB1c2VyIGJ1ZmZlciBhcmVhCisgKiBAZmxhZ3M6IHJlY2VpdmUgZmxhZ3MKKyAqIAorICogVXNlZCBmb3IgU09DS19TVFJFQU0gbWVzc2FnZXMgb25seS4gIElmIG5vdCBlbm91Z2ggZGF0YSBpcyBhdmFpbGFibGUgCisgKiB3aWxsIG9wdGlvbmFsbHkgd2FpdCBmb3IgbW9yZTsgbmV2ZXIgdHJ1bmNhdGVzIGRhdGEuCisgKgorICogUmV0dXJucyBzaXplIG9mIHJldHVybmVkIG1lc3NhZ2UgZGF0YSwgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCByZWN2X3N0cmVhbShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgYnVmX2xlbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1bnNpZ25lZCBpbnQgcV9sZW47CisJdW5zaWduZWQgaW50IHN6OworCWludCBzel90b19jb3B5OworCWludCBzel9jb3BpZWQgPSAwOworCWludCBuZWVkZWQ7CisJY2hhciAqY3JzID0gbS0+bXNnX2lvdi0+aW92X2Jhc2U7CisJdW5zaWduZWQgY2hhciAqYnVmX2NyczsKKwl1MzIgZXJyOworCWludCByZXM7CisKKwkvKiBDdXJyZW50bHkgZG9lc24ndCBzdXBwb3J0IHJlY2VpdmluZyBpbnRvIG11bHRpcGxlIGlvdmVjIGVudHJpZXMgKi8KKworCWlmIChtLT5tc2dfaW92bGVuICE9IDEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIENhdGNoIGludmFsaWQgcmVjZWl2ZSBhdHRlbXB0cyAqLworCisJaWYgKHVubGlrZWx5KCFidWZfbGVuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodW5saWtlbHkoc29jay0+c3RhdGUgPT0gU1NfRElTQ09OTkVDVElORykpIHsKKwkJaWYgKHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSA9PSAwKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KHNvY2stPnN0YXRlICE9IFNTX0NPTk5FQ1RFRCkpCisJCXJldHVybiAtRU5PVENPTk47CisKKwkvKiBMb29rIGZvciBhIG1lc3NhZ2UgaW4gcmVjZWl2ZSBxdWV1ZTsgd2FpdCBpZiBuZWNlc3NhcnkgKi8KKworCWlmICh1bmxpa2VseShkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworcmVzdGFydDoKKwlpZiAodW5saWtlbHkoKHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSA9PSAwKSAmJgorCQkgICAgIChmbGFncyAmIE1TR19ET05UV0FJVCkpKSB7CisJCXJlcyA9IChzel9jb3BpZWQgPT0gMCkgPyAtRVdPVUxEQkxPQ0sgOiAwOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKChyZXMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCisJCSpzb2NrLT5zay0+c2tfc2xlZXAsIAorCQkoKHFfbGVuID0gc2tiX3F1ZXVlX2xlbigmc29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpKSB8fAorCQkgKHNvY2stPnN0YXRlID09IFNTX0RJU0NPTk5FQ1RJTkcpKSkgKSkgeworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogQ2F0Y2ggYXR0ZW1wdCB0byByZWNlaXZlIG9uIGFuIGFscmVhZHkgdGVybWluYXRlZCBjb25uZWN0aW9uICovCisJLyogW1RISVMgQ0hFQ0sgTUFZIE9WRVJMQVAgV0lUSCBBTiBFQVJMSUVSIENIRUNLXSAqLworCisJaWYgKCFxX2xlbikgeworCQlyZXMgPSAtRU5PVENPTk47CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBHZXQgYWNjZXNzIHRvIGZpcnN0IG1lc3NhZ2UgaW4gcmVjZWl2ZSBxdWV1ZSAqLworCisJYnVmID0gc2tiX3BlZWsoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwltc2cgPSBidWZfbXNnKGJ1Zik7CisJc3ogPSBtc2dfZGF0YV9zeihtc2cpOworCWVyciA9IG1zZ19lcnJjb2RlKG1zZyk7CisKKwkvKiBEaXNjYXJkIGFuIGVtcHR5IG5vbi1lcnJvcmVkIG1lc3NhZ2UgJiB0cnkgYWdhaW4gKi8KKworCWlmICgoIXN6KSAmJiAoIWVycikpIHsKKwkJYWR2YW5jZV9xdWV1ZSh0c29jayk7CisJCWdvdG8gcmVzdGFydDsKKwl9CisKKwkvKiBPcHRpb25hbGx5IGNhcHR1cmUgc2VuZGVyJ3MgYWRkcmVzcyAmIGFuY2lsbGFyeSBkYXRhIG9mIGZpcnN0IG1zZyAqLworCisJaWYgKHN6X2NvcGllZCA9PSAwKSB7CisJCXNldF9vcmlnX2FkZHIobSwgbXNnKTsKKwkJaWYgKChyZXMgPSBhbmNfZGF0YV9yZWN2KG0sIG1zZywgdHNvY2stPnApKSkKKwkJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBDYXB0dXJlIG1lc3NhZ2UgZGF0YSAoaWYgdmFsaWQpICYgY29tcHV0ZSByZXR1cm4gdmFsdWUgKGFsd2F5cykgKi8KKwkKKwlpZiAoIWVycikgeworCQlidWZfY3JzID0gKHVuc2lnbmVkIGNoYXIgKikoVElQQ19TS0JfQ0IoYnVmKS0+aGFuZGxlKTsKKwkJc3ogPSBidWYtPnRhaWwgLSBidWZfY3JzOworCisJCW5lZWRlZCA9IChidWZfbGVuIC0gc3pfY29waWVkKTsKKwkJc3pfdG9fY29weSA9IChzeiA8PSBuZWVkZWQpID8gc3ogOiBuZWVkZWQ7CisJCWlmICh1bmxpa2VseShjb3B5X3RvX3VzZXIoY3JzLCBidWZfY3JzLCBzel90b19jb3B5KSkpIHsKKwkJCXJlcyA9IC1FRkFVTFQ7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJc3pfY29waWVkICs9IHN6X3RvX2NvcHk7CisKKwkJaWYgKHN6X3RvX2NvcHkgPCBzeikgeworCQkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpCisJCQkJVElQQ19TS0JfQ0IoYnVmKS0+aGFuZGxlID0gYnVmX2NycyArIHN6X3RvX2NvcHk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQljcnMgKz0gc3pfdG9fY29weTsKKwl9IGVsc2UgeworCQlpZiAoc3pfY29waWVkICE9IDApCisJCQlnb3RvIGV4aXQ7IC8qIGNhbid0IGFkZCBlcnJvciBtc2cgdG8gdmFsaWQgZGF0YSAqLworCisJCWlmICgoZXJyID09IFRJUENfQ09OTl9TSFVURE9XTikgfHwgbS0+bXNnX2NvbnRyb2wpCisJCQlyZXMgPSAwOworCQllbHNlCisJCQlyZXMgPSAtRUNPTk5SRVNFVDsKKwl9CisKKwkvKiBDb25zdW1lIHJlY2VpdmVkIG1lc3NhZ2UgKG9wdGlvbmFsKSAqLworCisJaWYgKGxpa2VseSghKGZsYWdzICYgTVNHX1BFRUspKSkgeworICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseSgrK3Rzb2NrLT5wLT5jb25uX3VuYWNrZWQgPj0gVElQQ19GTE9XX0NPTlRST0xfV0lOKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpcGNfYWNrbm93bGVkZ2UodHNvY2stPnAtPnJlZiwgdHNvY2stPnAtPmNvbm5fdW5hY2tlZCk7CisJCWFkdmFuY2VfcXVldWUodHNvY2spOworICAgICAgICB9CisKKwkvKiBMb29wIGFyb3VuZCBpZiBtb3JlIGRhdGEgaXMgcmVxdWlyZWQgKi8KKworCWlmICgoc3pfY29waWVkIDwgYnVmX2xlbikgICAgLyogZGlkbid0IGdldCBhbGwgcmVxdWVzdGVkIGRhdGEgKi8gCisJICAgICYmIChmbGFncyAmIE1TR19XQUlUQUxMKSAvKiAuLi4gYW5kIG5lZWQgdG8gd2FpdCBmb3IgbW9yZSAqLworCSAgICAmJiAoIShmbGFncyAmIE1TR19QRUVLKSkgLyogLi4uIGFuZCBhcmVuJ3QganVzdCBwZWVraW5nIGF0IGRhdGEgKi8KKwkgICAgJiYgKCFlcnIpICAgICAgICAgICAgICAgIC8qIC4uLiBhbmQgaGF2ZW4ndCByZWFjaGVkIGEgRklOICovCisJICAgICkKKwkJZ290byByZXN0YXJ0OworCitleGl0OgorCXVwKCZ0c29jay0+c2VtKTsKKwlyZXR1cm4gcmVzID8gcmVzIDogc3pfY29waWVkOworfQorCisvKioKKyAqIHF1ZXVlX292ZXJsb2FkZWQgLSB0ZXN0IGlmIHF1ZXVlIG92ZXJsb2FkIGNvbmRpdGlvbiBleGlzdHMKKyAqIEBxdWV1ZV9zaXplOiBjdXJyZW50IHNpemUgb2YgcXVldWUKKyAqIEBiYXNlOiBub21pbmFsIG1heGltdW0gc2l6ZSBvZiBxdWV1ZQorICogQG1zZzogbWVzc2FnZSB0byBiZSBhZGRlZCB0byBxdWV1ZQorICogCisgKiBSZXR1cm5zIDEgaWYgcXVldWUgaXMgY3VycmVudGx5IG92ZXJsb2FkZWQsIDAgb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCBxdWV1ZV9vdmVybG9hZGVkKHUzMiBxdWV1ZV9zaXplLCB1MzIgYmFzZSwgc3RydWN0IHRpcGNfbXNnICptc2cpCit7CisJdTMyIHRocmVzaG9sZDsKKwl1MzIgaW1wID0gbXNnX2ltcG9ydGFuY2UobXNnKTsKKworCWlmIChpbXAgPT0gVElQQ19MT1dfSU1QT1JUQU5DRSkKKwkJdGhyZXNob2xkID0gYmFzZTsKKwllbHNlIGlmIChpbXAgPT0gVElQQ19NRURJVU1fSU1QT1JUQU5DRSkKKwkJdGhyZXNob2xkID0gYmFzZSAqIDI7CisJZWxzZSBpZiAoaW1wID09IFRJUENfSElHSF9JTVBPUlRBTkNFKQorCQl0aHJlc2hvbGQgPSBiYXNlICogMTAwOworCWVsc2UKKwkJcmV0dXJuIDA7CisKKwlpZiAobXNnX2Nvbm5lY3RlZChtc2cpKQorCQl0aHJlc2hvbGQgKj0gNDsKKworCXJldHVybiAocXVldWVfc2l6ZSA+IHRocmVzaG9sZCk7Cit9CisKKy8qKiAKKyAqIGFzeW5jX2Rpc2Nvbm5lY3QgLSB3cmFwcGVyIGZ1bmN0aW9uIHVzZWQgdG8gZGlzY29ubmVjdCBwb3J0CisgKiBAcG9ydHJlZjogVElQQyBwb3J0IHJlZmVyZW5jZSAocGFzc2VkIGFzIHBvaW50ZXItc2l6ZWQgdmFsdWUpCisgKi8KKworc3RhdGljIHZvaWQgYXN5bmNfZGlzY29ubmVjdCh1bnNpZ25lZCBsb25nIHBvcnRyZWYpCit7CisJdGlwY19kaXNjb25uZWN0KCh1MzIpcG9ydHJlZik7Cit9CisKKy8qKiAKKyAqIGRpc3BhdGNoIC0gaGFuZGxlIGFycml2aW5nIG1lc3NhZ2UKKyAqIEB0cG9ydDogVElQQyBwb3J0IHRoYXQgcmVjZWl2ZWQgbWVzc2FnZQorICogQGJ1ZjogbWVzc2FnZQorICogCisgKiBDYWxsZWQgd2l0aCBwb3J0IGxvY2tlZC4gIE11c3Qgbm90IHRha2Ugc29ja2V0IGxvY2sgdG8gYXZvaWQgZGVhZGxvY2sgcmlzay4KKyAqIAorICogUmV0dXJucyBUSVBDIGVycm9yIHN0YXR1cyBjb2RlIChUSVBDX09LIGlmIG1lc3NhZ2UgaXMgbm90IHRvIGJlIHJlamVjdGVkKQorICovCisKK3N0YXRpYyB1MzIgZGlzcGF0Y2goc3RydWN0IHRpcGNfcG9ydCAqdHBvcnQsIHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJc3RydWN0IHRpcGNfc29jayAqdHNvY2sgPSAoc3RydWN0IHRpcGNfc29jayAqKXRwb3J0LT51c3JfaGFuZGxlOworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJdTMyIHJlY3ZfcV9sZW47CisKKwkvKiBSZWplY3QgbWVzc2FnZSBpZiBzb2NrZXQgaXMgY2xvc2luZyAqLworCisJaWYgKCF0c29jaykKKwkJcmV0dXJuIFRJUENfRVJSX05PX1BPUlQ7CisKKwkvKiBSZWplY3QgbWVzc2FnZSBpZiBpdCBpcyB3cm9uZyBzb3J0IG9mIG1lc3NhZ2UgZm9yIHNvY2tldCAqLworCisJLyoKKwkgKiBXT1VMRCBJVCBCRSBCRVRURVIgVE8gSlVTVCBESVNDQVJEIFRIRVNFIE1FU1NBR0VTIElOU1RFQUQ/CisJICogIk5PIFBPUlQiIElTTidUIFJFQUxMWSBUSEUgUklHSFQgRVJST1IgQ09ERSwgQU5EIFRIRVJFIE1BWQorCSAqIEJFIFNFQ1VSSVRZIElNUExJQ0FUSU9OUyBJTkhFUkVOVCBJTiBSRUpFQ1RJTkcgSU5WQUxJRCBUUkFGRklDCisJICovCisJc29jayA9IHRzb2NrLT5zay5za19zb2NrZXQ7CisJaWYgKHNvY2stPnN0YXRlID09IFNTX1JFQURZKSB7CisJCWlmIChtc2dfY29ubmVjdGVkKG1zZykpIHsKKwkJCW1zZ19kYmcobXNnLCAiZGlzcGF0Y2ggZmlsdGVyIDFcbiIpOworCQkJcmV0dXJuIFRJUENfRVJSX05PX1BPUlQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobXNnX21jYXN0KG1zZykpIHsKKwkJCW1zZ19kYmcobXNnLCAiZGlzcGF0Y2ggZmlsdGVyIDJcbiIpOworCQkJcmV0dXJuIFRJUENfRVJSX05PX1BPUlQ7CisJCX0KKwkJaWYgKHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RFRCkgeworCQkJaWYgKCFtc2dfY29ubmVjdGVkKG1zZykpIHsKKwkJCQltc2dfZGJnKG1zZywgImRpc3BhdGNoIGZpbHRlciAzXG4iKTsKKwkJCQlyZXR1cm4gVElQQ19FUlJfTk9fUE9SVDsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNUSU5HKSB7CisJCQlpZiAoIW1zZ19jb25uZWN0ZWQobXNnKSAmJiAobXNnX2VycmNvZGUobXNnKSA9PSAwKSkgeworCQkJCW1zZ19kYmcobXNnLCAiZGlzcGF0Y2ggZmlsdGVyIDRcbiIpOworCQkJCXJldHVybiBUSVBDX0VSUl9OT19QT1JUOworCQkJfQorCQl9IAorCQllbHNlIGlmIChzb2NrLT5zdGF0ZSA9PSBTU19MSVNURU5JTkcpIHsKKwkJCWlmIChtc2dfY29ubmVjdGVkKG1zZykgfHwgbXNnX2VycmNvZGUobXNnKSkgeworCQkJCW1zZ19kYmcobXNnLCAiZGlzcGF0Y2ggZmlsdGVyIDVcbiIpOworCQkJCXJldHVybiBUSVBDX0VSUl9OT19QT1JUOworCQkJfQorCQl9IAorCQllbHNlIGlmIChzb2NrLT5zdGF0ZSA9PSBTU19ESVNDT05ORUNUSU5HKSB7CisJCQltc2dfZGJnKG1zZywgImRpc3BhdGNoIGZpbHRlciA2XG4iKTsKKwkJCXJldHVybiBUSVBDX0VSUl9OT19QT1JUOworCQl9CisJCWVsc2UgLyogKHNvY2stPnN0YXRlID09IFNTX1VOQ09OTkVDVEVEKSAqLyB7CisJCQlpZiAobXNnX2Nvbm5lY3RlZChtc2cpIHx8IG1zZ19lcnJjb2RlKG1zZykpIHsKKwkJCQltc2dfZGJnKG1zZywgImRpc3BhdGNoIGZpbHRlciA3XG4iKTsKKwkJCQlyZXR1cm4gVElQQ19FUlJfTk9fUE9SVDsKKwkJCX0KKwkJfQorCX0KKworCS8qIFJlamVjdCBtZXNzYWdlIGlmIHRoZXJlIGlzbid0IHJvb20gdG8gcXVldWUgaXQgKi8KKworCWlmICh1bmxpa2VseSgodTMyKWF0b21pY19yZWFkKCZ0aXBjX3F1ZXVlX3NpemUpID4gCisJCSAgICAgT1ZFUkxPQURfTElNSVRfQkFTRSkpIHsKKwkJaWYgKHF1ZXVlX292ZXJsb2FkZWQoYXRvbWljX3JlYWQoJnRpcGNfcXVldWVfc2l6ZSksIAorCQkJCSAgICAgT1ZFUkxPQURfTElNSVRfQkFTRSwgbXNnKSkKKwkJCXJldHVybiBUSVBDX0VSUl9PVkVSTE9BRDsKKyAgICAgICAgfQorCXJlY3ZfcV9sZW4gPSBza2JfcXVldWVfbGVuKCZ0c29jay0+c2suc2tfcmVjZWl2ZV9xdWV1ZSk7CisJaWYgKHVubGlrZWx5KHJlY3ZfcV9sZW4gPiAoT1ZFUkxPQURfTElNSVRfQkFTRSAvIDIpKSkgeworCQlpZiAocXVldWVfb3ZlcmxvYWRlZChyZWN2X3FfbGVuLCAKKwkJCQkgICAgIE9WRVJMT0FEX0xJTUlUX0JBU0UgLyAyLCBtc2cpKSAKKwkJCXJldHVybiBUSVBDX0VSUl9PVkVSTE9BRDsKKyAgICAgICAgfQorCisJLyogSW5pdGlhdGUgY29ubmVjdGlvbiB0ZXJtaW5hdGlvbiBmb3IgYW4gaW5jb21pbmcgJ0ZJTicgKi8KKworCWlmICh1bmxpa2VseShtc2dfZXJyY29kZShtc2cpICYmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNURUQpKSkgeworCQlzb2NrLT5zdGF0ZSA9IFNTX0RJU0NPTk5FQ1RJTkc7CisJCS8qIE5vdGU6IFVzZSBzaWduYWwgc2luY2UgcG9ydCBsb2NrIGlzIGFscmVhZHkgdGFrZW4hICovCisJCWtfc2lnbmFsKChIYW5kbGVyKWFzeW5jX2Rpc2Nvbm5lY3QsIHRwb3J0LT5yZWYpOworCX0KKworCS8qIEVucXVldWUgbWVzc2FnZSAoZmluYWxseSEpICovCisKKwltc2dfZGJnKG1zZywiPERJU1A8OiAiKTsKKwlUSVBDX1NLQl9DQihidWYpLT5oYW5kbGUgPSBtc2dfZGF0YShtc2cpOworCWF0b21pY19pbmMoJnRpcGNfcXVldWVfc2l6ZSk7CisJc2tiX3F1ZXVlX3RhaWwoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlLCBidWYpOworCisgICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZShzb2NrLT5zay0+c2tfc2xlZXApOworCXJldHVybiBUSVBDX09LOworfQorCisvKiogCisgKiB3YWtldXBkaXNwYXRjaCAtIHdha2UgdXAgcG9ydCBhZnRlciBjb25nZXN0aW9uCisgKiBAdHBvcnQ6IHBvcnQgdG8gd2FrZXVwCisgKiAKKyAqIENhbGxlZCB3aXRoIHBvcnQgbG9jayBvbi4KKyAqLworCitzdGF0aWMgdm9pZCB3YWtldXBkaXNwYXRjaChzdHJ1Y3QgdGlwY19wb3J0ICp0cG9ydCkKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IChzdHJ1Y3QgdGlwY19zb2NrICopdHBvcnQtPnVzcl9oYW5kbGU7CisKKyAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHRzb2NrLT5zay5za19zbGVlcCk7Cit9CisKKy8qKgorICogY29ubmVjdCAtIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gYW5vdGhlciBUSVBDIHBvcnQKKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAZGVzdDogc29ja2V0IGFkZHJlc3MgZm9yIGRlc3RpbmF0aW9uIHBvcnQKKyAqIEBkZXN0bGVuOiBzaXplIG9mIHNvY2tldCBhZGRyZXNzIGRhdGEgc3RydWN0dXJlCisgKiBAZmxhZ3M6ICh1bnVzZWQpCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmRlc3QsIGludCBkZXN0bGVuLCAKKwkJICAgaW50IGZsYWdzKQoreworICAgc3RydWN0IHRpcGNfc29jayAqdHNvY2sgPSB0aXBjX3NrKHNvY2stPnNrKTsKKyAgIHN0cnVjdCBzb2NrYWRkcl90aXBjICpkc3QgPSAoc3RydWN0IHNvY2thZGRyX3RpcGMgKilkZXN0OworICAgc3RydWN0IG1zZ2hkciBtID0gezAsfTsKKyAgIHN0cnVjdCBza19idWZmICpidWY7CisgICBzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKyAgIGludCByZXM7CisKKyAgIC8qIEZvciBub3csIFRJUEMgZG9lcyBub3QgYWxsb3cgdXNlIG9mIGNvbm5lY3QoKSB3aXRoIERHUkFNIG9yIFJETSB0eXBlcyAqLworCisgICBpZiAoc29jay0+c3RhdGUgPT0gU1NfUkVBRFkpCisJICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCisgICAvKiBNT1ZFIFRIRSBSRVNUIE9GIFRISVMgRVJST1IgQ0hFQ0tJTkcgVE8gc2VuZF9tc2coKT8gKi8KKyAgIGlmIChzb2NrLT5zdGF0ZSA9PSBTU19MSVNURU5JTkcpCisJICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgaWYgKHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RJTkcpCisJICAgcmV0dXJuIC1FQUxSRUFEWTsKKyAgIGlmIChzb2NrLT5zdGF0ZSAhPSBTU19VTkNPTk5FQ1RFRCkKKyAgICAgICAgICAgcmV0dXJuIC1FSVNDT05OOworCisgICBpZiAoKGRzdC0+ZmFtaWx5ICE9IEFGX1RJUEMpIHx8CisgICAgICAgKChkc3QtPmFkZHJ0eXBlICE9IFRJUENfQUREUl9OQU1FKSAmJiAoZHN0LT5hZGRydHlwZSAhPSBUSVBDX0FERFJfSUQpKSkKKyAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgIC8qIFNlbmQgYSAnU1lOLScgdG8gZGVzdGluYXRpb24gKi8KKworICAgbS5tc2dfbmFtZSA9IGRlc3Q7CisgICBpZiAoKHJlcyA9IHNlbmRfbXNnKDAsIHNvY2ssICZtLCAwKSkgPCAwKSB7CisJICAgc29jay0+c3RhdGUgPSBTU19ESVNDT05ORUNUSU5HOworCSAgIHJldHVybiByZXM7CisgICB9CisKKyAgIGlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKSAKKyAgICAgICAgICAgcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkKKyAgIC8qIFdhaXQgZm9yIGRlc3RpbmF0aW9uJ3MgJ0FDSycgcmVzcG9uc2UgKi8KKworICAgcmVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoKnNvY2stPnNrLT5za19zbGVlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSwKKwkJCQkJICBzb2NrLT5zay0+c2tfcmN2dGltZW8pOworICAgYnVmID0gc2tiX3BlZWsoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKyAgIGlmIChyZXMgPiAwKSB7CisJICAgbXNnID0gYnVmX21zZyhidWYpOworICAgICAgICAgICByZXMgPSBhdXRvX2Nvbm5lY3Qoc29jaywgdHNvY2ssIG1zZyk7CisgICAgICAgICAgIGlmICghcmVzKSB7CisJCSAgIGlmIChkc3QtPmFkZHJ0eXBlID09IFRJUENfQUREUl9OQU1FKSB7CisJCQkgICB0c29jay0+cC0+Y29ubl90eXBlID0gZHN0LT5hZGRyLm5hbWUubmFtZS50eXBlOworCQkJICAgdHNvY2stPnAtPmNvbm5faW5zdGFuY2UgPSBkc3QtPmFkZHIubmFtZS5uYW1lLmluc3RhbmNlOworCQkgICB9CisJCSAgIGlmICghbXNnX2RhdGFfc3oobXNnKSkKKwkJCSAgIGFkdmFuY2VfcXVldWUodHNvY2spOworCSAgIH0KKyAgIH0gZWxzZSB7CisJICAgaWYgKHJlcyA9PSAwKSB7CisJCSAgIHJlcyA9IC1FVElNRURPVVQ7CisJICAgfSBlbHNlCisJICAgICAgICAgICB7IC8qIGxlYXZlICJyZXMiIHVuY2hhbmdlZCAqLyB9CisJICAgc29jay0+c3RhdGUgPSBTU19ESVNDT05ORUNUSU5HOworICAgfQorCisgICB1cCgmdHNvY2stPnNlbSk7CisgICByZXR1cm4gcmVzOworfQorCisvKiogCisgKiBsaXN0ZW4gLSBhbGxvdyBzb2NrZXQgdG8gbGlzdGVuIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucworICogQHNvY2s6IHNvY2tldCBzdHJ1Y3R1cmUKKyAqIEBsZW46ICh1bnVzZWQpCisgKiAKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IGxpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGVuKQoreworCS8qIFJFUVVJUkVTIFNPQ0tFVCBMT0NLSU5HIE9GIFNPTUUgU09SVD8gKi8KKworCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19SRUFEWSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmIChzb2NrLT5zdGF0ZSAhPSBTU19VTkNPTk5FQ1RFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc29jay0+c3RhdGUgPSBTU19MSVNURU5JTkc7CisgICAgICAgIHJldHVybiAwOworfQorCisvKiogCisgKiBhY2NlcHQgLSB3YWl0IGZvciBjb25uZWN0aW9uIHJlcXVlc3QKKyAqIEBzb2NrOiBsaXN0ZW5pbmcgc29ja2V0CisgKiBAbmV3c29jazogbmV3IHNvY2tldCB0aGF0IGlzIHRvIGJlIGNvbm5lY3RlZAorICogQGZsYWdzOiBmaWxlLXJlbGF0ZWQgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHNvY2tldAorICogCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCBhY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKQoreworCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlpbnQgcmVzID0gLUVGQVVMVDsKKworCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19SRUFEWSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmIChzb2NrLT5zdGF0ZSAhPSBTU19MSVNURU5JTkcpCisJCXJldHVybiAtRUlOVkFMOworCQorCWlmICh1bmxpa2VseSgoc2tiX3F1ZXVlX2xlbigmc29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpID09IDApICYmIAorCQkgICAgIChmbGFncyAmIE9fTk9OQkxPQ0spKSkKKwkJcmV0dXJuIC1FV09VTERCTE9DSzsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgqc29jay0+c2stPnNrX3NsZWVwLCAKKwkJCQkgICAgIHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJcmVzID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGV4aXQ7CisJfQorCWJ1ZiA9IHNrYl9wZWVrKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisKKwlyZXMgPSB0aXBjX2NyZWF0ZShuZXdzb2NrLCAwKTsKKwlpZiAoIXJlcykgeworCQlzdHJ1Y3QgdGlwY19zb2NrICpuZXdfdHNvY2sgPSB0aXBjX3NrKG5ld3NvY2stPnNrKTsKKwkJc3RydWN0IHRpcGNfcG9ydGlkIGlkOworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJdTMyIG5ld19yZWYgPSBuZXdfdHNvY2stPnAtPnJlZjsKKworCQlpZC5yZWYgPSBtc2dfb3JpZ3BvcnQobXNnKTsKKwkJaWQubm9kZSA9IG1zZ19vcmlnbm9kZShtc2cpOworCQl0aXBjX2Nvbm5lY3QycG9ydChuZXdfcmVmLCAmaWQpOworCQluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCQl0aXBjX3NldF9wb3J0aW1wb3J0YW5jZShuZXdfcmVmLCBtc2dfaW1wb3J0YW5jZShtc2cpKTsKKwkJaWYgKG1zZ19uYW1lZChtc2cpKSB7CisJCQluZXdfdHNvY2stPnAtPmNvbm5fdHlwZSA9IG1zZ19uYW1ldHlwZShtc2cpOworCQkJbmV3X3Rzb2NrLT5wLT5jb25uX2luc3RhbmNlID0gbXNnX25hbWVpbnN0KG1zZyk7CisJCX0KKworICAgICAgICAgICAgICAgLyogCisJCSAqIFJlc3BvbmQgdG8gJ1NZTi0nIGJ5IGRpc2NhcmRpbmcgaXQgJiByZXR1cm5pbmcgJ0FDSyctLgorCQkgKiBSZXNwb25kIHRvICdTWU4rJyBieSBxdWV1aW5nIGl0IG9uIG5ldyBzb2NrZXQuCisJCSAqLworCisJCW1zZ19kYmcobXNnLCI8QUNDPDogIik7CisgICAgICAgICAgICAgICAgaWYgKCFtc2dfZGF0YV9zeihtc2cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXNnaGRyIG0gPSB7MCx9OworCisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3BhY2tldCgwLCBuZXdzb2NrLCAmbSwgMCk7ICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlX3F1ZXVlKHRzb2NrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJc29ja19sb2NrKHRzb2NrKTsKKwkJCXNrYl9kZXF1ZXVlKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCQlzb2NrX3VubG9jayh0c29jayk7CisJCQlza2JfcXVldWVfaGVhZCgmbmV3c29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUsIGJ1Zik7CisJCX0KKwl9CitleGl0OgorCXVwKCZ0c29jay0+c2VtKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHNodXRkb3duIC0gc2h1dGRvd24gc29ja2V0IGNvbm5lY3Rpb24KKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAaG93OiBkaXJlY3Rpb24gdG8gY2xvc2UgKGFsd2F5cyB0cmVhdGVkIGFzIHJlYWQgKyB3cml0ZSkKKyAqCisgKiBUZXJtaW5hdGVzIGNvbm5lY3Rpb24gKGlmIG5lY2Vzc2FyeSksIHRoZW4gcHVyZ2VzIHNvY2tldCdzIHJlY2VpdmUgcXVldWUuCisgKiAKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IHNodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3cpCit7CisJc3RydWN0IHRpcGNfc29jayogdHNvY2sgPSB0aXBjX3NrKHNvY2stPnNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCWludCByZXM7CisKKwkvKiBDb3VsZCByZXR1cm4gLUVJTlZBTCBmb3IgYW4gaW52YWxpZCAiaG93IiwgYnV0IHdoeSBib3RoZXI/ICovCisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXNvY2tfbG9jayh0c29jayk7CisKKwlzd2l0Y2ggKHNvY2stPnN0YXRlKSB7CisJY2FzZSBTU19DT05ORUNURUQ6CisKKwkJLyogU2VuZCAnRklOKycgb3IgJ0ZJTi0nIG1lc3NhZ2UgdG8gcGVlciAqLworCisJCXNvY2tfdW5sb2NrKHRzb2NrKTsKK3Jlc3RhcnQ6CisJCWlmICgoYnVmID0gc2tiX2RlcXVldWUoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJCWF0b21pY19kZWMoJnRpcGNfcXVldWVfc2l6ZSk7CisJCQlpZiAoVElQQ19TS0JfQ0IoYnVmKS0+aGFuZGxlICE9IG1zZ19kYXRhKGJ1Zl9tc2coYnVmKSkpIHsKKwkJCQlidWZfZGlzY2FyZChidWYpOworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0KKwkJCXRpcGNfcmVqZWN0X21zZyhidWYsIFRJUENfQ09OTl9TSFVURE9XTik7CisJCX0KKwkJZWxzZSB7CisJCQl0aXBjX3NodXRkb3duKHRzb2NrLT5wLT5yZWYpOworCQl9CisJCXNvY2tfbG9jayh0c29jayk7CisKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIFNTX0RJU0NPTk5FQ1RJTkc6CisKKwkJLyogRGlzY2FyZCBhbnkgdW5yZWNlaXZlZCBtZXNzYWdlcyAqLworCisJCXdoaWxlICgoYnVmID0gc2tiX2RlcXVldWUoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJCWF0b21pY19kZWMoJnRpcGNfcXVldWVfc2l6ZSk7CisJCQlidWZfZGlzY2FyZChidWYpOworCQl9CisJCXRzb2NrLT5wLT5jb25uX3VuYWNrZWQgPSAwOworCisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBTU19DT05ORUNUSU5HOgorCQlzb2NrLT5zdGF0ZSA9IFNTX0RJU0NPTk5FQ1RJTkc7CisJCXJlcyA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVzID0gLUVOT1RDT05OOworCX0KKworCXNvY2tfdW5sb2NrKHRzb2NrKTsKKworCXVwKCZ0c29jay0+c2VtKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHNldHNvY2tvcHQgLSBzZXQgc29ja2V0IG9wdGlvbgorICogQHNvY2s6IHNvY2tldCBzdHJ1Y3R1cmUKKyAqIEBsdmw6IG9wdGlvbiBsZXZlbAorICogQG9wdDogb3B0aW9uIGlkZW50aWZpZXIKKyAqIEBvdjogcG9pbnRlciB0byBuZXcgb3B0aW9uIHZhbHVlCisgKiBAb2w6IGxlbmd0aCBvZiBvcHRpb24gdmFsdWUKKyAqIAorICogRm9yIHN0cmVhbSBzb2NrZXRzIG9ubHksIGFjY2VwdHMgYW5kIGlnbm9yZXMgYWxsIElQUFJPVE9fVENQIG9wdGlvbnMgCisgKiAodG8gZWFzZSBjb21wYXRpYmlsaXR5KS4KKyAqIAorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbHZsLCBpbnQgb3B0LCBjaGFyICpvdiwgaW50IG9sKQoreworCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CisJdTMyIHZhbHVlOworCWludCByZXM7CisKKyAgICAgICAgaWYgKChsdmwgPT0gSVBQUk9UT19UQ1ApICYmIChzb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwlpZiAobHZsICE9IFNPTF9USVBDKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCWlmIChvbCA8IHNpemVvZih2YWx1ZSkpCisJCXJldHVybiAtRUlOVkFMOworICAgICAgICBpZiAoKHJlcyA9IGdldF91c2VyKHZhbHVlLCAodTMyICopb3YpKSkKKwkJcmV0dXJuIHJlczsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKSAKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkKKwlzd2l0Y2ggKG9wdCkgeworCWNhc2UgVElQQ19JTVBPUlRBTkNFOgorCQlyZXMgPSB0aXBjX3NldF9wb3J0aW1wb3J0YW5jZSh0c29jay0+cC0+cmVmLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVElQQ19TUkNfRFJPUFBBQkxFOgorCQlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSkKKwkJCXJlcyA9IHRpcGNfc2V0X3BvcnR1bnJlbGlhYmxlKHRzb2NrLT5wLT5yZWYsIHZhbHVlKTsKKwkJZWxzZSAKKwkJCXJlcyA9IC1FTk9QUk9UT09QVDsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0RFU1RfRFJPUFBBQkxFOgorCQlyZXMgPSB0aXBjX3NldF9wb3J0dW5yZXR1cm5hYmxlKHRzb2NrLT5wLT5yZWYsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NPTk5fVElNRU9VVDoKKwkJc29jay0+c2stPnNrX3JjdnRpbWVvID0gKHZhbHVlICogSFogLyAxMDAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzID0gLUVJTlZBTDsKKwl9CisKKwl1cCgmdHNvY2stPnNlbSk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBnZXRzb2Nrb3B0IC0gZ2V0IHNvY2tldCBvcHRpb24KKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAbHZsOiBvcHRpb24gbGV2ZWwKKyAqIEBvcHQ6IG9wdGlvbiBpZGVudGlmaWVyCisgKiBAb3Y6IHJlY2VwdGFjbGUgZm9yIG9wdGlvbiB2YWx1ZQorICogQG9sOiByZWNlcHRhY2xlIGZvciBsZW5ndGggb2Ygb3B0aW9uIHZhbHVlCisgKiAKKyAqIEZvciBzdHJlYW0gc29ja2V0cyBvbmx5LCByZXR1cm5zIDAgbGVuZ3RoIHJlc3VsdCBmb3IgYWxsIElQUFJPVE9fVENQIG9wdGlvbnMgCisgKiAodG8gZWFzZSBjb21wYXRpYmlsaXR5KS4KKyAqIAorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbHZsLCBpbnQgb3B0LCBjaGFyICpvdiwgaW50ICpvbCkKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworICAgICAgICBpbnQgbGVuOworCXUzMiB2YWx1ZTsKKyAgICAgICAgaW50IHJlczsKKworICAgICAgICBpZiAoKGx2bCA9PSBJUFBST1RPX1RDUCkgJiYgKHNvY2stPnR5cGUgPT0gU09DS19TVFJFQU0pKQorICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcigwLCBvbCk7CisJaWYgKGx2bCAhPSBTT0xfVElQQykKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKyAgICAgICAgaWYgKChyZXMgPSBnZXRfdXNlcihsZW4sIG9sKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKSAKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXN3aXRjaCAob3B0KSB7CisJY2FzZSBUSVBDX0lNUE9SVEFOQ0U6CisJCXJlcyA9IHRpcGNfcG9ydGltcG9ydGFuY2UodHNvY2stPnAtPnJlZiwgJnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX1NSQ19EUk9QUEFCTEU6CisJCXJlcyA9IHRpcGNfcG9ydHVucmVsaWFibGUodHNvY2stPnAtPnJlZiwgJnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0RFU1RfRFJPUFBBQkxFOgorCQlyZXMgPSB0aXBjX3BvcnR1bnJldHVybmFibGUodHNvY2stPnAtPnJlZiwgJnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NPTk5fVElNRU9VVDoKKwkJdmFsdWUgPSAoc29jay0+c2stPnNrX3JjdnRpbWVvICogMTAwMCkgLyBIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzID0gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVzKSB7CisJCS8qICJnZXQiIGZhaWxlZCAqLworCX0KKwllbHNlIGlmIChsZW4gPCBzaXplb2YodmFsdWUpKSB7CisJCXJlcyA9IC1FSU5WQUw7CisJfQorCWVsc2UgaWYgKChyZXMgPSBjb3B5X3RvX3VzZXIob3YsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpKSB7CisJCS8qIGNvdWxkbid0IHJldHVybiB2YWx1ZSAqLworCX0KKwllbHNlIHsKKwkJcmVzID0gcHV0X3VzZXIoc2l6ZW9mKHZhbHVlKSwgb2wpOworCX0KKworICAgICAgICB1cCgmdHNvY2stPnNlbSk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBQbGFjZWhvbGRlcnMgZm9yIG5vbi1pbXBsZW1lbnRlZCBmdW5jdGlvbmFsaXR5CisgKiAKKyAqIFJldHVybnMgZXJyb3IgY29kZSAoUE9TSVgtY29tcGxpYW50IHdoZXJlIGRlZmluZWQpCisgKi8KKworc3RhdGljIGludCBpb2N0bChzdHJ1Y3Qgc29ja2V0ICpzLCB1MzIgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbm9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2tldCAqc29jaywKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cit9CitzdGF0aWMgc3NpemVfdCBub19zZW5kcGFnZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IG5vX3NrcGFpcihzdHJ1Y3Qgc29ja2V0ICpzMSwgc3RydWN0IHNvY2tldCAqczIpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisvKioKKyAqIFByb3RvY29sIHN3aXRjaGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBUSVBDIHNvY2tldHMKKyAqLworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBtc2dfb3BzID0geworCS5vd25lciAJCT0gVEhJU19NT0RVTEUsCisJLmZhbWlseQkJPSBBRl9USVBDLAorCS5yZWxlYXNlCT0gcmVsZWFzZSwKKwkuYmluZAkJPSBiaW5kLAorCS5jb25uZWN0CT0gY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IG5vX3NrcGFpciwKKwkuYWNjZXB0CQk9IGFjY2VwdCwKKwkuZ2V0bmFtZQk9IGdldF9uYW1lLAorCS5wb2xsCQk9IHBvbGwsCisJLmlvY3RsCQk9IGlvY3RsLAorCS5saXN0ZW4JCT0gbGlzdGVuLAorCS5zaHV0ZG93bgk9IHNodXRkb3duLAorCS5zZXRzb2Nrb3B0CT0gc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IGdldHNvY2tvcHQsCisJLnNlbmRtc2cJPSBzZW5kX21zZywKKwkucmVjdm1zZwk9IHJlY3ZfbXNnLAorICAgICAgICAubW1hcAkJPSBub19tbWFwLAorICAgICAgICAuc2VuZHBhZ2UJPSBub19zZW5kcGFnZQorfTsKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgcGFja2V0X29wcyA9IHsKKwkub3duZXIgCQk9IFRISVNfTU9EVUxFLAorCS5mYW1pbHkJCT0gQUZfVElQQywKKwkucmVsZWFzZQk9IHJlbGVhc2UsCisJLmJpbmQJCT0gYmluZCwKKwkuY29ubmVjdAk9IGNvbm5lY3QsCisJLnNvY2tldHBhaXIJPSBub19za3BhaXIsCisJLmFjY2VwdAkJPSBhY2NlcHQsCisJLmdldG5hbWUJPSBnZXRfbmFtZSwKKwkucG9sbAkJPSBwb2xsLAorCS5pb2N0bAkJPSBpb2N0bCwKKwkubGlzdGVuCQk9IGxpc3RlbiwKKwkuc2h1dGRvd24JPSBzaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHNldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJPSBnZXRzb2Nrb3B0LAorCS5zZW5kbXNnCT0gc2VuZF9wYWNrZXQsCisJLnJlY3Ztc2cJPSByZWN2X21zZywKKyAgICAgICAgLm1tYXAJCT0gbm9fbW1hcCwKKyAgICAgICAgLnNlbmRwYWdlCT0gbm9fc2VuZHBhZ2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHN0cmVhbV9vcHMgPSB7CisJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKKwkuZmFtaWx5CQk9IEFGX1RJUEMsCisJLnJlbGVhc2UJPSByZWxlYXNlLAorCS5iaW5kCQk9IGJpbmQsCisJLmNvbm5lY3QJPSBjb25uZWN0LAorCS5zb2NrZXRwYWlyCT0gbm9fc2twYWlyLAorCS5hY2NlcHQJCT0gYWNjZXB0LAorCS5nZXRuYW1lCT0gZ2V0X25hbWUsCisJLnBvbGwJCT0gcG9sbCwKKwkuaW9jdGwJCT0gaW9jdGwsCisJLmxpc3RlbgkJPSBsaXN0ZW4sCisJLnNodXRkb3duCT0gc2h1dGRvd24sCisJLnNldHNvY2tvcHQJPSBzZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0CT0gZ2V0c29ja29wdCwKKwkuc2VuZG1zZwk9IHNlbmRfc3RyZWFtLAorCS5yZWN2bXNnCT0gcmVjdl9zdHJlYW0sCisgICAgICAgIC5tbWFwCQk9IG5vX21tYXAsCisgICAgICAgIC5zZW5kcGFnZQk9IG5vX3NlbmRwYWdlCit9OworCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgdGlwY19mYW1pbHlfb3BzID0geworCS5vd25lciAJCT0gVEhJU19NT0RVTEUsCisJLmZhbWlseQkJPSBBRl9USVBDLAorCS5jcmVhdGUJCT0gdGlwY19jcmVhdGUKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gdGlwY19wcm90byA9IHsKKwkubmFtZQkJPSAiVElQQyIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vYmpfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgdGlwY19zb2NrKQorfTsKKworLyoqCisgKiBzb2NrZXRfaW5pdCAtIGluaXRpYWxpemUgVElQQyBzb2NrZXQgaW50ZXJmYWNlCisgKiAKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworaW50IHNvY2tldF9pbml0KHZvaWQpCit7CisJaW50IHJlczsKKworICAgICAgICByZXMgPSBwcm90b19yZWdpc3RlcigmdGlwY19wcm90bywgMSk7CisJaWYgKHJlcykgeworCQllcnIoIkZhaWxlZCB0byByZWdpc3RlciBUSVBDIHByb3RvY29sIHR5cGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXMgPSBzb2NrX3JlZ2lzdGVyKCZ0aXBjX2ZhbWlseV9vcHMpOworCWlmIChyZXMpIHsKKwkJZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgVElQQyBzb2NrZXQgdHlwZVxuIik7CisJCXByb3RvX3VucmVnaXN0ZXIoJnRpcGNfcHJvdG8pOworCQlnb3RvIG91dDsKKwl9CisKKwlzb2NrZXRzX2VuYWJsZWQgPSAxOworIG91dDoKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHNvY2tfc3RvcCAtIHN0b3AgVElQQyBzb2NrZXQgaW50ZXJmYWNlCisgKi8KK3ZvaWQgc29ja2V0X3N0b3Aodm9pZCkKK3sKKwlpZiAoIXNvY2tldHNfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJc29ja2V0c19lbmFibGVkID0gMDsKKwlzb2NrX3VucmVnaXN0ZXIodGlwY19mYW1pbHlfb3BzLmZhbWlseSk7CisJcHJvdG9fdW5yZWdpc3RlcigmdGlwY19wcm90byk7Cit9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL3N1YnNjci5jIGIvbmV0L3RpcGMvc3Vic2NyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlMjE5YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3N1YnNjci5jCkBAIC0wLDAgKzEsNTI3IEBACisvKgorICogbmV0L3RpcGMvc3Vic2NyLmM6IFRJUEMgc3Vic2NyaXB0aW9uIHNlcnZpY2UKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJzdWJzY3IuaCIKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisjaW5jbHVkZSAicmVmLmgiCisKKy8qKgorICogc3RydWN0IHN1YnNjcmliZXIgLSBUSVBDIG5ldHdvcmsgdG9wb2xvZ3kgc3Vic2NyaWJlcgorICogQHJlZjogb2JqZWN0IHJlZmVyZW5jZSB0byBzdWJzY3JpYmVyIG9iamVjdCBpdHNlbGYKKyAqIEBsb2NrOiBwb2ludGVyIHRvIHNwaW5sb2NrIGNvbnRyb2xsaW5nIGFjY2VzcyB0byBzdWJzY3JpYmVyIG9iamVjdAorICogQHN1YnNjcmliZXJfbGlzdDogYWRqYWNlbnQgc3Vic2NyaWJlcnMgaW4gdG9wLiBzZXJ2ZXIncyBsaXN0IG9mIHN1YnNjcmliZXJzCisgKiBAc3Vic2NyaXB0aW9uX2xpc3Q6IGxpc3Qgb2Ygc3Vic2NyaXB0aW9uIG9iamVjdHMgZm9yIHRoaXMgc3Vic2NyaWJlcgorICogQHBvcnRfcmVmOiBvYmplY3QgcmVmZXJlbmNlIHRvIHBvcnQgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHN1YnNjcmliZXIKKyAqIEBzd2FwOiBpbmRpY2F0ZXMgaWYgc3Vic2NyaWJlciB1c2VzIG9wcG9zaXRlIGVuZGlhbm5lc3MgaW4gaXRzIG1lc3NhZ2VzCisgKi8KKyAKK3N0cnVjdCBzdWJzY3JpYmVyIHsKKwl1MzIgcmVmOworICAgICAgICBzcGlubG9ja190ICpsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgc3Vic2NyaWJlcl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgc3Vic2NyaXB0aW9uX2xpc3Q7CisJdTMyIHBvcnRfcmVmOworCWludCBzd2FwOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdG9wX3NydiAtIFRJUEMgbmV0d29yayB0b3BvbG9neSBzdWJzY3JpcHRpb24gc2VydmljZQorICogQHVzZXJfcmVmOiBUSVBDIHVzZXJpZCBvZiBzdWJzY3JpcHRpb24gc2VydmljZQorICogQHNldHVwX3BvcnQ6IHJlZmVyZW5jZSB0byBUSVBDIHBvcnQgdGhhdCBoYW5kbGVzIHN1YnNjcmlwdGlvbiByZXF1ZXN0cworICogQHN1YnNjcmlwdGlvbl9jb3VudDogbnVtYmVyIG9mIGFjdGl2ZSBzdWJzY3JpcHRpb25zIChub3Qgc3Vic2NyaWJlcnMhKQorICogQHN1YnNjcmliZXJfbGlzdDogbGlzdCBvZiBwb3J0cyBzdWJzY3JpYmluZyB0byBzZXJ2aWNlCisgKiBAbG9jazogc3BpbmxvY2sgZ292ZXJpbmcgYWNjZXNzIHRvIHN1YnNjcmliZXIgbGlzdAorICovCisKK3N0cnVjdCB0b3Bfc3J2IHsKKwl1MzIgdXNlcl9yZWY7CisJdTMyIHNldHVwX3BvcnQ7CisJYXRvbWljX3Qgc3Vic2NyaXB0aW9uX2NvdW50OworCXN0cnVjdCBsaXN0X2hlYWQgc3Vic2NyaWJlcl9saXN0OworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9wX3NydiB0b3BzcnYgPSB7IDAgfTsKKworLyoqCisgKiBodG9obCAtIGNvbnZlcnQgdmFsdWUgdG8gZW5kaWFubmVzcyB1c2VkIGJ5IGRlc3RpbmF0aW9uCisgKiBAaW46IHZhbHVlIHRvIGNvbnZlcnQKKyAqIEBzd2FwOiBub24temVybyBpZiBlbmRpYW5uZXNzIG11c3QgYmUgcmV2ZXJzZWQKKyAqIAorICogUmV0dXJucyBjb252ZXJ0ZWQgdmFsdWUKKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiBodG9obCh1MzIgaW4sIGludCBzd2FwKQoreworCWNoYXIgKmMgPSAoY2hhciAqKSZpbjsKKworCXJldHVybiBzd2FwID8gKChjWzNdIDw8IDMpICsgKGNbMl0gPDwgMikgKyAoY1sxXSA8PCAxKSArIGNbMF0pIDogaW47Cit9CisKKy8qKgorICogc3Vic2NyX3NlbmRfZXZlbnQgLSBzZW5kIGEgbWVzc2FnZSBjb250YWluaW5nIGEgdGlwY19ldmVudCB0byB0aGUgc3Vic2NyaWJlcgorICovCisKK3N0YXRpYyB2b2lkIHN1YnNjcl9zZW5kX2V2ZW50KHN0cnVjdCBzdWJzY3JpcHRpb24gKnN1YiwgCisJCQkgICAgICB1MzIgZm91bmRfbG93ZXIsIAorCQkJICAgICAgdTMyIGZvdW5kX3VwcGVyLAorCQkJICAgICAgdTMyIGV2ZW50LCAKKwkJCSAgICAgIHUzMiBwb3J0X3JlZiwgCisJCQkgICAgICB1MzIgbm9kZSkKK3sKKwlzdHJ1Y3QgaW92ZWMgbXNnX3NlY3Q7CisKKwltc2dfc2VjdC5pb3ZfYmFzZSA9ICh2b2lkICopJnN1Yi0+ZXZ0OworCW1zZ19zZWN0Lmlvdl9sZW4gPSBzaXplb2Yoc3RydWN0IHRpcGNfZXZlbnQpOworCisJc3ViLT5ldnQuZXZlbnQgPSBodG9obChldmVudCwgc3ViLT5vd25lci0+c3dhcCk7CisJc3ViLT5ldnQuZm91bmRfbG93ZXIgPSBodG9obChmb3VuZF9sb3dlciwgc3ViLT5vd25lci0+c3dhcCk7CisJc3ViLT5ldnQuZm91bmRfdXBwZXIgPSBodG9obChmb3VuZF91cHBlciwgc3ViLT5vd25lci0+c3dhcCk7CisJc3ViLT5ldnQucG9ydC5yZWYgPSBodG9obChwb3J0X3JlZiwgc3ViLT5vd25lci0+c3dhcCk7CisJc3ViLT5ldnQucG9ydC5ub2RlID0gaHRvaGwobm9kZSwgc3ViLT5vd25lci0+c3dhcCk7CisJdGlwY19zZW5kKHN1Yi0+b3duZXItPnBvcnRfcmVmLCAxLCAmbXNnX3NlY3QpOworfQorCisvKioKKyAqIHN1YnNjcl9vdmVybGFwIC0gdGVzdCBmb3Igc3Vic2NyaXB0aW9uIG92ZXJsYXAgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzCisgKgorICogUmV0dXJucyAxIGlmIHRoZXJlIGlzIG92ZXJsYXAsIG90aGVyd2lzZSAwLgorICovCisKK2ludCBzdWJzY3Jfb3ZlcmxhcChzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWIsIAorCQkgICB1MzIgZm91bmRfbG93ZXIsIAorCQkgICB1MzIgZm91bmRfdXBwZXIpCisKK3sKKwlpZiAoZm91bmRfbG93ZXIgPCBzdWItPnNlcS5sb3dlcikKKwkJZm91bmRfbG93ZXIgPSBzdWItPnNlcS5sb3dlcjsKKwlpZiAoZm91bmRfdXBwZXIgPiBzdWItPnNlcS51cHBlcikKKwkJZm91bmRfdXBwZXIgPSBzdWItPnNlcS51cHBlcjsKKwlpZiAoZm91bmRfbG93ZXIgPiBmb3VuZF91cHBlcikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogc3Vic2NyX3JlcG9ydF9vdmVybGFwIC0gaXNzdWUgZXZlbnQgaWYgdGhlcmUgaXMgc3Vic2NyaXB0aW9uIG92ZXJsYXAKKyAqIAorICogUHJvdGVjdGVkIGJ5IG5hbWVzZXEubG9jayBpbiBuYW1lX3RhYmxlLmMKKyAqLworCit2b2lkIHN1YnNjcl9yZXBvcnRfb3ZlcmxhcChzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWIsIAorCQkJICAgdTMyIGZvdW5kX2xvd2VyLCAKKwkJCSAgIHUzMiBmb3VuZF91cHBlciwKKwkJCSAgIHUzMiBldmVudCwgCisJCQkgICB1MzIgcG9ydF9yZWYsIAorCQkJICAgdTMyIG5vZGUsCisJCQkgICBpbnQgbXVzdCkKK3sKKwlkYmcoIlJlcCBvdmVybGFwICV1OiV1LCV1PC0+JXUsJXVcbiIsIHN1Yi0+c2VxLnR5cGUsIHN1Yi0+c2VxLmxvd2VyLAorCSAgICBzdWItPnNlcS51cHBlciwgZm91bmRfbG93ZXIsIGZvdW5kX3VwcGVyKTsKKwlpZiAoIXN1YnNjcl9vdmVybGFwKHN1YiwgZm91bmRfbG93ZXIsIGZvdW5kX3VwcGVyKSkKKwkJcmV0dXJuOworCWlmICghbXVzdCAmJiAoc3ViLT5maWx0ZXIgIT0gVElQQ19TVUJfUE9SVFMpKQorCQlyZXR1cm47CisJc3Vic2NyX3NlbmRfZXZlbnQoc3ViLCBmb3VuZF9sb3dlciwgZm91bmRfdXBwZXIsIGV2ZW50LCBwb3J0X3JlZiwgbm9kZSk7Cit9CisKKy8qKgorICogc3Vic2NyX3RpbWVvdXQgLSBzdWJzY3JpcHRpb24gdGltZW91dCBoYXMgb2NjdXJyZWQKKyAqLworCitzdGF0aWMgdm9pZCBzdWJzY3JfdGltZW91dChzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWIpCit7CisJc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXI7CisJdTMyIHN1YnNjcmliZXJfcmVmOworCisJLyogVmFsaWRhdGUgc3Vic2NyaWJlciByZWZlcmVuY2UgKGluIGNhc2Ugc3Vic2NyaWJlciBpcyB0ZXJtaW5hdGluZykgKi8KKworCXN1YnNjcmliZXJfcmVmID0gc3ViLT5vd25lci0+cmVmOworCXN1YnNjcmliZXIgPSAoc3RydWN0IHN1YnNjcmliZXIgKilyZWZfbG9jayhzdWJzY3JpYmVyX3JlZik7CisJaWYgKHN1YnNjcmliZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogVW5saW5rIHN1YnNjcmlwdGlvbiBmcm9tIG5hbWUgdGFibGUgKi8KKworCW5hbWV0YmxfdW5zdWJzY3JpYmUoc3ViKTsKKworCS8qIE5vdGlmeSBzdWJzY3JpYmVyIG9mIHRpbWVvdXQsIHRoZW4gdW5saW5rIHN1YnNjcmlwdGlvbiAqLworCisJc3Vic2NyX3NlbmRfZXZlbnQoc3ViLCAKKwkJCSAgc3ViLT5ldnQucy5zZXEubG93ZXIsIAorCQkJICBzdWItPmV2dC5zLnNlcS51cHBlciwKKwkJCSAgVElQQ19TVUJTQ1JfVElNRU9VVCwgCisJCQkgIDAsIAorCQkJICAwKTsKKwlsaXN0X2RlbCgmc3ViLT5zdWJzY3JpcHRpb25fbGlzdCk7CisKKwkvKiBOb3cgZGVzdHJveSBzdWJzY3JpcHRpb24gKi8KKworCXJlZl91bmxvY2soc3Vic2NyaWJlcl9yZWYpOworCWtfdGVybV90aW1lcigmc3ViLT50aW1lcik7CisJa2ZyZWUoc3ViKTsKKwlhdG9taWNfZGVjKCZ0b3BzcnYuc3Vic2NyaXB0aW9uX2NvdW50KTsKK30KKworLyoqCisgKiBzdWJzY3JfdGVybWluYXRlIC0gdGVybWluYXRlIGNvbW11bmljYXRpb24gd2l0aCBhIHN1YnNjcmliZXIKKyAqIAorICogQ2FsbGVkIHdpdGggc3Vic2NyaWJlciBsb2NrZWQuICBSb3V0aW5lIG11c3QgdGVtcG9yYXJpbHkgcmVsZWFzZSB0aGlzIGxvY2sKKyAqIHRvIGVuYWJsZSBzdWJzY3JpcHRpb24gdGltZW91dCByb3V0aW5lKHMpIHRvIGZpbmlzaCB3aXRob3V0IGRlYWRsb2NraW5nOyAKKyAqIHRoZSBsb2NrIGlzIHRoZW4gcmVjbGFpbWVkIHRvIGFsbG93IGNhbGxlciB0byByZWxlYXNlIGl0IHVwb24gcmV0dXJuLgorICogKFRoaXMgc2hvdWxkIHdvcmsgZXZlbiBpbiB0aGUgdW5saWtlbHkgZXZlbnQgc29tZSBvdGhlciB0aHJlYWQgY3JlYXRlcyAKKyAqIGEgbmV3IG9iamVjdCByZWZlcmVuY2UgaW4gdGhlIGludGVyaW0gdGhhdCB1c2VzIHRoaXMgbG9jazsgdGhpcyByb3V0aW5lIHdpbGwKKyAqIHNpbXBseSB3YWl0IGZvciBpdCB0byBiZSByZWxlYXNlZCwgdGhlbiBjbGFpbSBpdC4pCisgKi8KKworc3RhdGljIHZvaWQgc3Vic2NyX3Rlcm1pbmF0ZShzdHJ1Y3Qgc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWI7CisJc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViX3RlbXA7CisKKwkvKiBJbnZhbGlkYXRlIHN1YnNjcmliZXIgcmVmZXJlbmNlICovCisKKwlyZWZfZGlzY2FyZChzdWJzY3JpYmVyLT5yZWYpOworCXNwaW5fdW5sb2NrX2JoKHN1YnNjcmliZXItPmxvY2spOworCisJLyogRGVzdHJveSBhbnkgZXhpc3Rpbmcgc3Vic2NyaXB0aW9ucyBmb3Igc3Vic2NyaWJlciAqLworCQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdWIsIHN1Yl90ZW1wLCAmc3Vic2NyaWJlci0+c3Vic2NyaXB0aW9uX2xpc3QsCisJCQkJIHN1YnNjcmlwdGlvbl9saXN0KSB7CisJCWlmIChzdWItPnRpbWVvdXQgIT0gVElQQ19XQUlUX0ZPUkVWRVIpIHsKKwkJCWtfY2FuY2VsX3RpbWVyKCZzdWItPnRpbWVyKTsKKwkJCWtfdGVybV90aW1lcigmc3ViLT50aW1lcik7CisJCX0KKwkJbmFtZXRibF91bnN1YnNjcmliZShzdWIpOworCQlsaXN0X2RlbCgmc3ViLT5zdWJzY3JpcHRpb25fbGlzdCk7CisJCWRiZygiVGVybTogUmVtb3ZlZCBzdWIgJXUsJXUsJXUgZnJvbSBzdWJzY3JpYmVyICV4IGxpc3RcbiIsCisJCSAgICBzdWItPnNlcS50eXBlLCBzdWItPnNlcS5sb3dlciwgc3ViLT5zZXEudXBwZXIsIHN1YnNjcmliZXIpOworCQlrZnJlZShzdWIpOworCQlhdG9taWNfZGVjKCZ0b3BzcnYuc3Vic2NyaXB0aW9uX2NvdW50KTsKKwl9CisKKwkvKiBTZXZlciBjb25uZWN0aW9uIHRvIHN1YnNjcmliZXIgKi8KKworCXRpcGNfc2h1dGRvd24oc3Vic2NyaWJlci0+cG9ydF9yZWYpOworCXRpcGNfZGVsZXRlcG9ydChzdWJzY3JpYmVyLT5wb3J0X3JlZik7CisKKwkvKiBSZW1vdmUgc3Vic2NyaWJlciBmcm9tIHRvcG9sb2d5IHNlcnZlcidzIHN1YnNjcmliZXIgbGlzdCAqLworCisJc3Bpbl9sb2NrX2JoKCZ0b3BzcnYubG9jayk7CisJbGlzdF9kZWwoJnN1YnNjcmliZXItPnN1YnNjcmliZXJfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnRvcHNydi5sb2NrKTsKKworCS8qIE5vdyBkZXN0cm95IHN1YnNjcmliZXIgKi8KKworCXNwaW5fbG9ja19iaChzdWJzY3JpYmVyLT5sb2NrKTsKKwlrZnJlZShzdWJzY3JpYmVyKTsKK30KKworLyoqCisgKiBzdWJzY3Jfc3Vic2NyaWJlIC0gY3JlYXRlIHN1YnNjcmlwdGlvbiBmb3Igc3Vic2NyaWJlcgorICogCisgKiBDYWxsZWQgd2l0aCBzdWJzY3JpYmVyIGxvY2tlZAorICovCisKK3N0YXRpYyB2b2lkIHN1YnNjcl9zdWJzY3JpYmUoc3RydWN0IHRpcGNfc3Vic2NyICpzLAorCQkJICAgICBzdHJ1Y3Qgc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWI7CisKKwkvKiBSZWZ1c2Ugc3Vic2NyaXB0aW9uIGlmIGdsb2JhbCBsaW1pdCBleGNlZWRlZCAqLworCisJaWYgKGF0b21pY19yZWFkKCZ0b3BzcnYuc3Vic2NyaXB0aW9uX2NvdW50KSA+PSB0aXBjX21heF9zdWJzY3JpcHRpb25zKSB7CisJCXdhcm4oIkZhaWxlZDogbWF4ICV1IHN1YnNjcmlwdGlvbnNcbiIsIHRpcGNfbWF4X3N1YnNjcmlwdGlvbnMpOworCQlzdWJzY3JfdGVybWluYXRlKHN1YnNjcmliZXIpOworCQlyZXR1cm47CisJfQorCisJLyogQWxsb2NhdGUgc3Vic2NyaXB0aW9uIG9iamVjdCAqLworCisJc3ViID0ga21hbGxvYyhzaXplb2YoKnN1YiksIEdGUF9BVE9NSUMpOworCWlmIChzdWIgPT0gTlVMTCkgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgaWdub3Jpbmcgc3Vic2NyaXB0aW9uXG4iKTsKKwkJc3Vic2NyX3Rlcm1pbmF0ZShzdWJzY3JpYmVyKTsKKwkJcmV0dXJuOworCX0KKworCS8qIERldGVybWluZS91cGRhdGUgc3Vic2NyaWJlcidzIGVuZGlhbm5lc3MgKi8KKworCWlmICgocy0+ZmlsdGVyID09IFRJUENfU1VCX1BPUlRTKSB8fCAocy0+ZmlsdGVyID09IFRJUENfU1VCX1NFUlZJQ0UpKQorCQlzdWJzY3JpYmVyLT5zd2FwID0gMDsKKwllbHNlCisJCXN1YnNjcmliZXItPnN3YXAgPSAxOworCisJLyogSW5pdGlhbGl6ZSBzdWJzY3JpcHRpb24gb2JqZWN0ICovCisKKwltZW1zZXQoc3ViLCAwLCBzaXplb2YoKnN1YikpOworCXN1Yi0+c2VxLnR5cGUgPSBodG9obChzLT5zZXEudHlwZSwgc3Vic2NyaWJlci0+c3dhcCk7CisJc3ViLT5zZXEubG93ZXIgPSBodG9obChzLT5zZXEubG93ZXIsIHN1YnNjcmliZXItPnN3YXApOworCXN1Yi0+c2VxLnVwcGVyID0gaHRvaGwocy0+c2VxLnVwcGVyLCBzdWJzY3JpYmVyLT5zd2FwKTsKKwlzdWItPnRpbWVvdXQgPSBodG9obChzLT50aW1lb3V0LCBzdWJzY3JpYmVyLT5zd2FwKTsKKwlzdWItPmZpbHRlciA9IGh0b2hsKHMtPmZpbHRlciwgc3Vic2NyaWJlci0+c3dhcCk7CisJaWYgKCgoKHN1Yi0+ZmlsdGVyICE9IFRJUENfU1VCX1BPUlRTKSAKKwkgICAgICAmJiAoc3ViLT5maWx0ZXIgIT0gVElQQ19TVUJfU0VSVklDRSkpKQorCSAgICB8fCAoc3ViLT5zZXEubG93ZXIgPiBzdWItPnNlcS51cHBlcikpIHsKKwkJd2FybigiUmVqZWN0aW5nIGlsbGVnYWwgc3Vic2NyaXB0aW9uICV1LCV1LCV1XG4iLAorCQkgICAgIHN1Yi0+c2VxLnR5cGUsIHN1Yi0+c2VxLmxvd2VyLCBzdWItPnNlcS51cHBlcik7CisJCWtmcmVlKHN1Yik7CisJCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7CisJCXJldHVybjsKKwl9CisJbWVtY3B5KCZzdWItPmV2dC5zLCBzLCBzaXplb2Yoc3RydWN0IHRpcGNfc3Vic2NyKSk7CisJSU5JVF9MSVNUX0hFQUQoJnN1Yi0+c3Vic2NyaXB0aW9uX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzdWItPm5hbWVzZXFfbGlzdCk7CisJbGlzdF9hZGQoJnN1Yi0+c3Vic2NyaXB0aW9uX2xpc3QsICZzdWJzY3JpYmVyLT5zdWJzY3JpcHRpb25fbGlzdCk7CisJYXRvbWljX2luYygmdG9wc3J2LnN1YnNjcmlwdGlvbl9jb3VudCk7CisJaWYgKHN1Yi0+dGltZW91dCAhPSBUSVBDX1dBSVRfRk9SRVZFUikgeworCQlrX2luaXRfdGltZXIoJnN1Yi0+dGltZXIsCisJCQkgICAgIChIYW5kbGVyKXN1YnNjcl90aW1lb3V0LCAodW5zaWduZWQgbG9uZylzdWIpOworCQlrX3N0YXJ0X3RpbWVyKCZzdWItPnRpbWVyLCBzdWItPnRpbWVvdXQpOworCX0KKwlzdWItPm93bmVyID0gc3Vic2NyaWJlcjsKKwluYW1ldGJsX3N1YnNjcmliZShzdWIpOworfQorCisvKioKKyAqIHN1YnNjcl9jb25uX3NodXRkb3duX2V2ZW50IC0gaGFuZGxlIHRlcm1pbmF0aW9uIHJlcXVlc3QgZnJvbSBzdWJzY3JpYmVyCisgKi8KKworc3RhdGljIHZvaWQgc3Vic2NyX2Nvbm5fc2h1dGRvd25fZXZlbnQodm9pZCAqdXNyX2hhbmRsZSwKKwkJCQkgICAgICAgdTMyIHBvcnRyZWYsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICoqYnVmLAorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkYXRhLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkgICAgICAgaW50IHJlYXNvbikKK3sKKwlzdHJ1Y3Qgc3Vic2NyaWJlciAqc3Vic2NyaWJlcjsKKwlzcGlubG9ja190ICpzdWJzY3JpYmVyX2xvY2s7CisKKwlzdWJzY3JpYmVyID0gcmVmX2xvY2soKHUzMikodW5zaWduZWQgbG9uZyl1c3JfaGFuZGxlKTsKKwlpZiAoc3Vic2NyaWJlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzdWJzY3JpYmVyX2xvY2sgPSBzdWJzY3JpYmVyLT5sb2NrOworCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7CisJc3Bpbl91bmxvY2tfYmgoc3Vic2NyaWJlcl9sb2NrKTsKK30KKworLyoqCisgKiBzdWJzY3JfY29ubl9tc2dfZXZlbnQgLSBoYW5kbGUgbmV3IHN1YnNjcmlwdGlvbiByZXF1ZXN0IGZyb20gc3Vic2NyaWJlcgorICovCisKK3N0YXRpYyB2b2lkIHN1YnNjcl9jb25uX21zZ19ldmVudCh2b2lkICp1c3JfaGFuZGxlLAorCQkJCSAgdTMyIHBvcnRfcmVmLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKipidWYsCisJCQkJICBjb25zdCB1bmNoYXIgKmRhdGEsCisJCQkJICB1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3Vic2NyaWJlciAqc3Vic2NyaWJlcjsKKwlzcGlubG9ja190ICpzdWJzY3JpYmVyX2xvY2s7CisKKwlzdWJzY3JpYmVyID0gcmVmX2xvY2soKHUzMikodW5zaWduZWQgbG9uZyl1c3JfaGFuZGxlKTsKKwlpZiAoc3Vic2NyaWJlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzdWJzY3JpYmVyX2xvY2sgPSBzdWJzY3JpYmVyLT5sb2NrOworCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgdGlwY19zdWJzY3IpKQorCQlzdWJzY3JfdGVybWluYXRlKHN1YnNjcmliZXIpOworCWVsc2UKKwkJc3Vic2NyX3N1YnNjcmliZSgoc3RydWN0IHRpcGNfc3Vic2NyICopZGF0YSwgc3Vic2NyaWJlcik7CisJCisJc3Bpbl91bmxvY2tfYmgoc3Vic2NyaWJlcl9sb2NrKTsKK30KKworLyoqCisgKiBzdWJzY3JfbmFtZWRfbXNnX2V2ZW50IC0gaGFuZGxlIHJlcXVlc3QgdG8gZXN0YWJsaXNoIGEgbmV3IHN1YnNjcmliZXIKKyAqLworCitzdGF0aWMgdm9pZCBzdWJzY3JfbmFtZWRfbXNnX2V2ZW50KHZvaWQgKnVzcl9oYW5kbGUsCisJCQkJICAgdTMyIHBvcnRfcmVmLAorCQkJCSAgIHN0cnVjdCBza19idWZmICoqYnVmLAorCQkJCSAgIGNvbnN0IHVuY2hhciAqZGF0YSwKKwkJCQkgICB1MzIgc2l6ZSwKKwkJCQkgICB1MzIgaW1wb3J0YW5jZSwgCisJCQkJICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnLAorCQkJCSAgIHN0cnVjdCB0aXBjX25hbWVfc2VxIGNvbnN0ICpkZXN0KQoreworCXN0cnVjdCBzdWJzY3JpYmVyICpzdWJzY3JpYmVyOworCXN0cnVjdCBpb3ZlYyBtc2dfc2VjdCA9IHswLCAwfTsKKwlzcGlubG9ja190ICpzdWJzY3JpYmVyX2xvY2s7CisKKwlkYmcoInN1YnNjcl9uYW1lZF9tc2dfZXZlbnQ6IG9yaWcgPSAleCBvd24gPSAleCxcbiIsCisJICAgIG9yaWctPm5vZGUsIHRpcGNfb3duX2FkZHIpOworCWlmIChzaXplICYmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgdGlwY19zdWJzY3IpKSkgeworCQl3YXJuKCJSZWNlaXZlZCB0aXBjX3N1YnNjciBvZiBpbnZhbGlkIHNpemVcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogQ3JlYXRlIHN1YnNjcmliZXIgb2JqZWN0ICovCisKKwlzdWJzY3JpYmVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN1YnNjcmliZXIpLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3Vic2NyaWJlciA9PSBOVUxMKSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBpZ25vcmluZyBzdWJzY3JpYmVyIHNldHVwXG4iKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQoc3Vic2NyaWJlciwgMCwgc2l6ZW9mKHN0cnVjdCBzdWJzY3JpYmVyKSk7CisJSU5JVF9MSVNUX0hFQUQoJnN1YnNjcmliZXItPnN1YnNjcmlwdGlvbl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmc3Vic2NyaWJlci0+c3Vic2NyaWJlcl9saXN0KTsKKwlzdWJzY3JpYmVyLT5yZWYgPSByZWZfYWNxdWlyZShzdWJzY3JpYmVyLCAmc3Vic2NyaWJlci0+bG9jayk7CisJaWYgKHN1YnNjcmliZXItPnJlZiA9PSAwKSB7CisJCXdhcm4oIkZhaWxlZCB0byBhY3F1aXJlIHN1YnNjcmliZXIgcmVmZXJlbmNlXG4iKTsKKwkJa2ZyZWUoc3Vic2NyaWJlcik7CisJCXJldHVybjsKKwl9CisKKwkvKiBFc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIHN1YnNjcmliZXIgKi8KKworCXRpcGNfY3JlYXRlcG9ydCh0b3BzcnYudXNlcl9yZWYsCisJCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKXN1YnNjcmliZXItPnJlZiwKKwkJCWltcG9ydGFuY2UsCisJCQkwLAorCQkJMCwKKwkJCXN1YnNjcl9jb25uX3NodXRkb3duX2V2ZW50LAorCQkJMCwKKwkJCTAsCisJCQlzdWJzY3JfY29ubl9tc2dfZXZlbnQsCisJCQkwLAorCQkJJnN1YnNjcmliZXItPnBvcnRfcmVmKTsKKwlpZiAoc3Vic2NyaWJlci0+cG9ydF9yZWYgPT0gMCkgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZmFpbGVkIHRvIGNyZWF0ZSBzdWJzY3JpcHRpb24gcG9ydFxuIik7CisJCXJlZl9kaXNjYXJkKHN1YnNjcmliZXItPnJlZik7CisJCWtmcmVlKHN1YnNjcmliZXIpOworCQlyZXR1cm47CisJfQorCXRpcGNfY29ubmVjdDJwb3J0KHN1YnNjcmliZXItPnBvcnRfcmVmLCBvcmlnKTsKKworCisJLyogQWRkIHN1YnNjcmliZXIgdG8gdG9wb2xvZ3kgc2VydmVyJ3Mgc3Vic2NyaWJlciBsaXN0ICovCisKKwlyZWZfbG9jayhzdWJzY3JpYmVyLT5yZWYpOworCXNwaW5fbG9ja19iaCgmdG9wc3J2LmxvY2spOworCWxpc3RfYWRkKCZzdWJzY3JpYmVyLT5zdWJzY3JpYmVyX2xpc3QsICZ0b3BzcnYuc3Vic2NyaWJlcl9saXN0KTsKKwlzcGluX3VubG9ja19iaCgmdG9wc3J2LmxvY2spOworCisJLyoKKwkgKiBTdWJzY3JpYmUgbm93IGlmIG1lc3NhZ2UgY29udGFpbnMgYSBzdWJzY3JpcHRpb24sCisJICogb3RoZXJ3aXNlIHNlbmQgYW4gZW1wdHkgcmVzcG9uc2UgdG8gY29tcGxldGUgY29ubmVjdGlvbiBoYW5kc2hha2luZworCSAqLworCisJc3Vic2NyaWJlcl9sb2NrID0gc3Vic2NyaWJlci0+bG9jazsKKwlpZiAoc2l6ZSkKKwkJc3Vic2NyX3N1YnNjcmliZSgoc3RydWN0IHRpcGNfc3Vic2NyICopZGF0YSwgc3Vic2NyaWJlcik7CisJZWxzZQorCQl0aXBjX3NlbmQoc3Vic2NyaWJlci0+cG9ydF9yZWYsIDEsICZtc2dfc2VjdCk7CisKKwlzcGluX3VubG9ja19iaChzdWJzY3JpYmVyX2xvY2spOworfQorCitpbnQgc3Vic2NyX3N0YXJ0KHZvaWQpCit7CisJc3RydWN0IHRpcGNfbmFtZV9zZXEgc2VxID0ge1RJUENfVE9QX1NSViwgVElQQ19UT1BfU1JWLCBUSVBDX1RPUF9TUlZ9OworCWludCByZXMgPSAtMTsKKworCW1lbXNldCgmdG9wc3J2LCAwLCBzaXplb2YgKHRvcHNydikpOworCXRvcHNydi5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCUlOSVRfTElTVF9IRUFEKCZ0b3BzcnYuc3Vic2NyaWJlcl9saXN0KTsKKworCXNwaW5fbG9ja19iaCgmdG9wc3J2LmxvY2spOworCXJlcyA9IHRpcGNfYXR0YWNoKCZ0b3BzcnYudXNlcl9yZWYsIDAsIDApOworCWlmIChyZXMpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnRvcHNydi5sb2NrKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKyAJcmVzID0gdGlwY19jcmVhdGVwb3J0KHRvcHNydi51c2VyX3JlZiwKKyAJCQkgICAgICAwLAorIAkJCSAgICAgIFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSwKKyAJCQkgICAgICAwLAorIAkJCSAgICAgIDAsCisgCQkJICAgICAgMCwKKyAJCQkgICAgICAwLAorIAkJCSAgICAgIHN1YnNjcl9uYW1lZF9tc2dfZXZlbnQsCisgCQkJICAgICAgMCwKKyAJCQkgICAgICAwLAorIAkJCSAgICAgICZ0b3BzcnYuc2V0dXBfcG9ydCk7CisgCWlmIChyZXMpCisJCWdvdG8gZmFpbGVkOworCisgCXJlcyA9IG5hbWV0YmxfcHVibGlzaF9yc3YodG9wc3J2LnNldHVwX3BvcnQsIFRJUENfTk9ERV9TQ09QRSwgJnNlcSk7CisgCWlmIChyZXMpCisJCWdvdG8gZmFpbGVkOworCisJc3Bpbl91bmxvY2tfYmgoJnRvcHNydi5sb2NrKTsKKwlyZXR1cm4gMDsKKworZmFpbGVkOgorCWVycigiRmFpbGVkIHRvIGNyZWF0ZSBzdWJzY3JpcHRpb24gc2VydmljZVxuIik7CisJdGlwY19kZXRhY2godG9wc3J2LnVzZXJfcmVmKTsKKwl0b3BzcnYudXNlcl9yZWYgPSAwOworCXNwaW5fdW5sb2NrX2JoKCZ0b3BzcnYubG9jayk7CisJcmV0dXJuIHJlczsKK30KKwordm9pZCBzdWJzY3Jfc3RvcCh2b2lkKQoreworCXN0cnVjdCBzdWJzY3JpYmVyICpzdWJzY3JpYmVyOworCXN0cnVjdCBzdWJzY3JpYmVyICpzdWJzY3JpYmVyX3RlbXA7CisJc3BpbmxvY2tfdCAqc3Vic2NyaWJlcl9sb2NrOworCisJaWYgKHRvcHNydi51c2VyX3JlZikgeworCQl0aXBjX2RlbGV0ZXBvcnQodG9wc3J2LnNldHVwX3BvcnQpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3Vic2NyaWJlciwgc3Vic2NyaWJlcl90ZW1wLCAKKwkJCQkJICZ0b3BzcnYuc3Vic2NyaWJlcl9saXN0LAorCQkJCQkgc3Vic2NyaWJlcl9saXN0KSB7CisJCQlyZWZfbG9jayhzdWJzY3JpYmVyLT5yZWYpOworCQkJc3Vic2NyaWJlcl9sb2NrID0gc3Vic2NyaWJlci0+bG9jazsKKwkJCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7CisJCQlzcGluX3VubG9ja19iaChzdWJzY3JpYmVyX2xvY2spOworCQl9CisJCXRpcGNfZGV0YWNoKHRvcHNydi51c2VyX3JlZik7CisJCXRvcHNydi51c2VyX3JlZiA9IDA7CisJfQorfQorCisKK2ludCB0aXBjX2lzcHVibGlzaGVkKHN0cnVjdCB0aXBjX25hbWUgY29uc3QgKm5hbWUpCit7CisJdTMyIGRvbWFpbiA9IDA7CisKKwlyZXR1cm4obmFtZXRibF90cmFuc2xhdGUobmFtZS0+dHlwZSwgbmFtZS0+aW5zdGFuY2UsJmRvbWFpbikgIT0gMCk7Cit9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL3N1YnNjci5oIGIvbmV0L3RpcGMvc3Vic2NyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NmZjRlZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3N1YnNjci5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBuZXQvdGlwYy9zdWJzY3IuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIHN1YnNjcmlwdGlvbiBzZXJ2aWNlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfU1VCU0NSX0gKKyNkZWZpbmUgX1RJUENfU1VCU0NSX0gKKworLyoqCisgKiBzdHJ1Y3Qgc3Vic2NyaXB0aW9uIC0gVElQQyBuZXR3b3JrIHRvcG9sb2d5IHN1YnNjcmlwdGlvbiBvYmplY3QKKyAqIEBzZXE6IG5hbWUgc2VxdWVuY2UgYXNzb2NpYXRlZCB3aXRoIHN1YnNjcmlwdGlvbgorICogQHRpbWVvdXQ6IGR1cmF0aW9uIG9mIHN1YnNjcmlwdGlvbiAoaW4gbXMpCisgKiBAZmlsdGVyOiBldmVudCBmaWx0ZXJpbmcgdG8gYmUgZG9uZSBmb3Igc3Vic2NyaXB0aW9uCisgKiBAZXZ0OiB0ZW1wbGF0ZSBmb3IgZXZlbnRzIGdlbmVyYXRlZCBieSBzdWJzY3JpcHRpb24KKyAqIEBzdWJzY3JpcHRpb25fbGlzdDogYWRqYWNlbnQgc3Vic2NyaXB0aW9ucyBpbiBzdWJzY3JpYmVyJ3Mgc3Vic2NyaXB0aW9uIGxpc3QKKyAqIEBuYW1lc2VxX2xpc3Q6IGFkamFjZW50IHN1YnNjcmlwdGlvbnMgaW4gbmFtZSBzZXF1ZW5jZSdzIHN1YnNjcmlwdGlvbiBsaXN0CisgKiBAdGltZXJfcmVmOiByZWZlcmVuY2UgdG8gdGltZXIgZ292ZXJuaW5nIHN1YnNjcmlwdGlvbiBkdXJhdGlvbiAobWF5IGJlIE5VTEwpCisgKiBAb3duZXI6IHBvaW50ZXIgdG8gc3Vic2NyaWJlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic2NyaXB0aW9uCisgKi8KKyAKK3N0cnVjdCBzdWJzY3JpcHRpb24geworCXN0cnVjdCB0aXBjX25hbWVfc2VxIHNlcTsKKwl1MzIgdGltZW91dDsKKwl1MzIgZmlsdGVyOworCXN0cnVjdCB0aXBjX2V2ZW50IGV2dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1YnNjcmlwdGlvbl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgbmFtZXNlcV9saXN0OworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXN0cnVjdCBzdWJzY3JpYmVyICpvd25lcjsKK307CisKK2ludCBzdWJzY3Jfb3ZlcmxhcChzdHJ1Y3Qgc3Vic2NyaXB0aW9uICogc3ViLCAKKwkJICAgdTMyIGZvdW5kX2xvd2VyLCAKKwkJICAgdTMyIGZvdW5kX3VwcGVyKTsKKwordm9pZCBzdWJzY3JfcmVwb3J0X292ZXJsYXAoc3RydWN0IHN1YnNjcmlwdGlvbiAqIHN1YiwgCisJCQkgICB1MzIgZm91bmRfbG93ZXIsIAorCQkJICAgdTMyIGZvdW5kX3VwcGVyLAorCQkJICAgdTMyIGV2ZW50LCAKKwkJCSAgIHUzMiBwb3J0X3JlZiwgCisJCQkgICB1MzIgbm9kZSwKKwkJCSAgIGludCBtdXN0X3JlcG9ydCk7CisKK2ludCBzdWJzY3Jfc3RhcnQodm9pZCk7CisKK3ZvaWQgc3Vic2NyX3N0b3Aodm9pZCk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy91c2VyX3JlZy5jIGIvbmV0L3RpcGMvdXNlcl9yZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWVjN2RjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvdXNlcl9yZWcuYwpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIG5ldC90aXBjL3VzZXJfcmVnLmM6IFRJUEMgdXNlciByZWdpc3RyeSBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJ1c2VyX3JlZy5oIgorCisvKgorICogVElQQyB1c2VyIHJlZ2lzdHJ5IGtlZXBzIHRyYWNrIG9mIHVzZXJzIG9mIHRoZSB0aXBjX3BvcnQgaW50ZXJmYWNlLgorICoKKyAqIFRoZSByZWdpc3RyeSB1dGlsaXplcyBhbiBhcnJheSBvZiAiVElQQyB1c2VyIiBlbnRyaWVzOyAKKyAqIGEgdXNlcidzIElEIGlzIHRoZSBpbmRleCBvZiB0aGVpciBhc3NvY2lhdGVkIGFycmF5IGVudHJ5LgorICogQXJyYXkgZW50cnkgMCBpcyBub3QgdXNlZCwgc28gdXNlcmlkIDAgaXMgbm90IHZhbGlkOworICogVElQQyBzb21ldGltZXMgdXNlcyB0aGlzIHZhbHVlIHRvIGRlbm90ZSBhbiBhbm9ueW1vdXMgdXNlci4KKyAqIFRoZSBsaXN0IG9mIGZyZWUgZW50cmllcyBpcyBpbml0aWFsbHkgY2hhaW5lZCBmcm9tIGxhc3QgZW50cnkgdG8gZW50cnkgMS4KKyAqLworCisvKioKKyAqIHN0cnVjdCB0aXBjX3VzZXIgLSByZWdpc3RlcmVkIFRJUEMgdXNlciBpbmZvCisgKiBAbmV4dDogaW5kZXggb2YgbmV4dCBmcmVlIHJlZ2lzdHJ5IGVudHJ5IChvciAtMSBmb3IgYW4gYWxsb2NhdGVkIGVudHJ5KQorICogQGNhbGxiYWNrOiBwdHIgdG8gcm91dGluZSB0byBjYWxsIHdoZW4gVElQQyBtb2RlIGNoYW5nZXMgKE5VTEwgaWYgbm9uZSkKKyAqIEB1c3JfaGFuZGxlOiB1c2VyLWRlZmluZWQgdmFsdWUgcGFzc2VkIHRvIGNhbGxiYWNrIHJvdXRpbmUgCisgKiBAcG9ydHM6IGxpc3Qgb2YgdXNlciBwb3J0cyBvd25lZCBieSB0aGUgdXNlcgorICovCisKK3N0cnVjdCB0aXBjX3VzZXIgeworCWludCBuZXh0OworCXRpcGNfbW9kZV9ldmVudCBjYWxsYmFjazsKKwl2b2lkICp1c3JfaGFuZGxlOworCXN0cnVjdCBsaXN0X2hlYWQgcG9ydHM7Cit9OworCisjZGVmaW5lIE1BWF9VU0VSSUQgNjQKKyNkZWZpbmUgVVNFUl9MSVNUX1NJWkUgKChNQVhfVVNFUklEICsgMSkgKiBzaXplb2Yoc3RydWN0IHRpcGNfdXNlcikpCisKK3N0YXRpYyBzdHJ1Y3QgdGlwY191c2VyICp1c2VycyA9IDA7CitzdGF0aWMgdTMyIG5leHRfZnJlZV91c2VyID0gTUFYX1VTRVJJRCArIDE7CitzdGF0aWMgc3BpbmxvY2tfdCByZWdfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKworLyoqCisgKiByZWdfaW5pdCAtIGNyZWF0ZSBUSVBDIHVzZXIgcmVnaXN0cnkgKGJ1dCBkb24ndCBhY3RpdmF0ZSBpdCkKKyAqIAorICogSWYgcmVnaXN0cnkgaGFzIGJlZW4gcHJlLWluaXRpYWxpemVkIGl0IGlzIGxlZnQgImFzIGlzIi4KKyAqIE5PVEU6IFRoaXMgcm91dGluZSBtYXkgYmUgY2FsbGVkIHdoZW4gVElQQyBpcyBpbmFjdGl2ZS4KKyAqLworCitzdGF0aWMgaW50IHJlZ19pbml0KHZvaWQpCit7CisJdTMyIGk7CisJCisJc3Bpbl9sb2NrX2JoKCZyZWdfbG9jayk7CisJaWYgKCF1c2VycykgeworCQl1c2VycyA9IChzdHJ1Y3QgdGlwY191c2VyICopa21hbGxvYyhVU0VSX0xJU1RfU0laRSwgR0ZQX0FUT01JQyk7CisJCWlmICh1c2VycykgeworCQkJbWVtc2V0KHVzZXJzLCAwLCBVU0VSX0xJU1RfU0laRSk7CisJCQlmb3IgKGkgPSAxOyBpIDw9IE1BWF9VU0VSSUQ7IGkrKykgeworCQkJCXVzZXJzW2ldLm5leHQgPSBpIC0gMTsKKwkJCX0KKwkJCW5leHRfZnJlZV91c2VyID0gTUFYX1VTRVJJRDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmcmVnX2xvY2spOworCXJldHVybiB1c2VycyA/IFRJUENfT0sgOiAtRU5PTUVNOworfQorCisvKioKKyAqIHJlZ19jYWxsYmFjayAtIGluZm9ybSBUSVBDIHVzZXIgYWJvdXQgY3VycmVudCBvcGVyYXRpbmcgbW9kZQorICovCisKK3N0YXRpYyB2b2lkIHJlZ19jYWxsYmFjayhzdHJ1Y3QgdGlwY191c2VyICp1c2VyX3B0cikKK3sKKwl0aXBjX21vZGVfZXZlbnQgY2I7CisJdm9pZCAqYXJnOworCisJc3Bpbl9sb2NrX2JoKCZyZWdfbG9jayk7CisJY2IgPSB1c2VyX3B0ci0+Y2FsbGJhY2s7CisJYXJnID0gdXNlcl9wdHItPnVzcl9oYW5kbGU7CisJc3Bpbl91bmxvY2tfYmgoJnJlZ19sb2NrKTsKKworCWlmIChjYikKKwkJY2IoYXJnLCB0aXBjX21vZGUsIHRpcGNfb3duX2FkZHIpOworfQorCisvKioKKyAqIHJlZ19zdGFydCAtIGFjdGl2YXRlIFRJUEMgdXNlciByZWdpc3RyeQorICovCisKK2ludCByZWdfc3RhcnQodm9pZCkKK3sKKwl1MzIgdTsKKwlpbnQgcmVzOworCisJaWYgKChyZXMgPSByZWdfaW5pdCgpKSkKKwkJcmV0dXJuIHJlczsKKworCWZvciAodSA9IDE7IHUgPD0gTUFYX1VTRVJJRDsgdSsrKSB7CisJCWlmICh1c2Vyc1t1XS5jYWxsYmFjaykKKwkJCWtfc2lnbmFsKChIYW5kbGVyKXJlZ19jYWxsYmFjaywKKwkJCQkgKHVuc2lnbmVkIGxvbmcpJnVzZXJzW3VdKTsKKwl9CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qKgorICogcmVnX3N0b3AgLSBzaHV0IGRvd24gJiBkZWxldGUgVElQQyB1c2VyIHJlZ2lzdHJ5CisgKi8KKwordm9pZCByZWdfc3RvcCh2b2lkKQoreyAgICAgICAgICAgICAgIAorCWludCBpZDsKKworCWlmICghdXNlcnMpCisJCXJldHVybjsKKworCWZvciAoaWQgPSAxOyBpZCA8PSBNQVhfVVNFUklEOyBpZCsrKSB7CisJCWlmICh1c2Vyc1tpZF0uY2FsbGJhY2spCisJCQlyZWdfY2FsbGJhY2soJnVzZXJzW2lkXSk7CisJfQorCWtmcmVlKHVzZXJzKTsKKwl1c2VycyA9IDA7Cit9CisKKy8qKgorICogdGlwY19hdHRhY2ggLSByZWdpc3RlciBhIFRJUEMgdXNlcgorICoKKyAqIE5PVEU6IFRoaXMgcm91dGluZSBtYXkgYmUgY2FsbGVkIHdoZW4gVElQQyBpcyBpbmFjdGl2ZS4KKyAqLworCitpbnQgdGlwY19hdHRhY2godTMyICp1c2VyaWQsIHRpcGNfbW9kZV9ldmVudCBjYiwgdm9pZCAqdXNyX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgdGlwY191c2VyICp1c2VyX3B0cjsKKworCWlmICgodGlwY19tb2RlID09IFRJUENfTk9UX1JVTk5JTkcpICYmICFjYikKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwlpZiAoIXVzZXJzKQorCQlyZWdfaW5pdCgpOworCisJc3Bpbl9sb2NrX2JoKCZyZWdfbG9jayk7CisJaWYgKCFuZXh0X2ZyZWVfdXNlcikgeworCQlzcGluX3VubG9ja19iaCgmcmVnX2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwl1c2VyX3B0ciA9ICZ1c2Vyc1tuZXh0X2ZyZWVfdXNlcl07CisJKnVzZXJpZCA9IG5leHRfZnJlZV91c2VyOworCW5leHRfZnJlZV91c2VyID0gdXNlcl9wdHItPm5leHQ7CisJdXNlcl9wdHItPm5leHQgPSAtMTsgCisJc3Bpbl91bmxvY2tfYmgoJnJlZ19sb2NrKTsKKworCXVzZXJfcHRyLT5jYWxsYmFjayA9IGNiOworCXVzZXJfcHRyLT51c3JfaGFuZGxlID0gdXNyX2hhbmRsZTsKKwlJTklUX0xJU1RfSEVBRCgmdXNlcl9wdHItPnBvcnRzKTsKKwlhdG9taWNfaW5jKCZ0aXBjX3VzZXJfY291bnQpOworCQorCWlmIChjYiAmJiAodGlwY19tb2RlICE9IFRJUENfTk9UX1JVTk5JTkcpKQorCQlrX3NpZ25hbCgoSGFuZGxlcilyZWdfY2FsbGJhY2ssICh1bnNpZ25lZCBsb25nKXVzZXJfcHRyKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworLyoqCisgKiB0aXBjX2RldGFjaCAtIGRlcmVnaXN0ZXIgYSBUSVBDIHVzZXIKKyAqLworCit2b2lkIHRpcGNfZGV0YWNoKHUzMiB1c2VyaWQpCit7CisJc3RydWN0IHRpcGNfdXNlciAqdXNlcl9wdHI7CisJc3RydWN0IGxpc3RfaGVhZCBwb3J0c190ZW1wOworCXN0cnVjdCB1c2VyX3BvcnQgKnVwX3B0ciwgKnRlbXBfdXBfcHRyOworCisJaWYgKCh1c2VyaWQgPT0gMCkgfHwgKHVzZXJpZCA+IE1BWF9VU0VSSUQpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfYmgoJnJlZ19sb2NrKTsKKwlpZiAoKCF1c2VycykgfHwgKHVzZXJzW3VzZXJpZF0ubmV4dCA+PSAwKSkgeworCQlzcGluX3VubG9ja19iaCgmcmVnX2xvY2spOworCQlyZXR1cm47CisJfQorCisJdXNlcl9wdHIgPSAmdXNlcnNbdXNlcmlkXTsKKyAgICAgICAgdXNlcl9wdHItPmNhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgIAorCUlOSVRfTElTVF9IRUFEKCZwb3J0c190ZW1wKTsKKyAgICAgICAgbGlzdF9zcGxpY2UoJnVzZXJfcHRyLT5wb3J0cywgJnBvcnRzX3RlbXApOworCXVzZXJfcHRyLT5uZXh0ID0gbmV4dF9mcmVlX3VzZXI7CisJbmV4dF9mcmVlX3VzZXIgPSB1c2VyaWQ7CisJc3Bpbl91bmxvY2tfYmgoJnJlZ19sb2NrKTsKKworCWF0b21pY19kZWMoJnRpcGNfdXNlcl9jb3VudCk7CisKKyAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVwX3B0ciwgdGVtcF91cF9wdHIsICZwb3J0c190ZW1wLCB1cG9ydF9saXN0KSB7CisJCXRpcGNfZGVsZXRlcG9ydCh1cF9wdHItPnJlZik7CisJfQorfQorCisvKioKKyAqIHJlZ19hZGRfcG9ydCAtIHJlZ2lzdGVyIGEgdXNlcidzIGRyaXZlciBwb3J0CisgKi8KKworaW50IHJlZ19hZGRfcG9ydChzdHJ1Y3QgdXNlcl9wb3J0ICp1cF9wdHIpCit7CisJc3RydWN0IHRpcGNfdXNlciAqdXNlcl9wdHI7CisKKwlpZiAodXBfcHRyLT51c2VyX3JlZiA9PSAwKQorCQlyZXR1cm4gVElQQ19PSzsKKwlpZiAodXBfcHRyLT51c2VyX3JlZiA+IE1BWF9VU0VSSUQpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgodGlwY19tb2RlID09IFRJUENfTk9UX1JVTk5JTkcpIHx8ICF1c2VycyApCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwlzcGluX2xvY2tfYmgoJnJlZ19sb2NrKTsKKwl1c2VyX3B0ciA9ICZ1c2Vyc1t1cF9wdHItPnVzZXJfcmVmXTsKKwlsaXN0X2FkZCgmdXBfcHRyLT51cG9ydF9saXN0LCAmdXNlcl9wdHItPnBvcnRzKTsKKwlzcGluX3VubG9ja19iaCgmcmVnX2xvY2spOworCXJldHVybiBUSVBDX09LOworfQorCisvKioKKyAqIHJlZ19yZW1vdmVfcG9ydCAtIGRlcmVnaXN0ZXIgYSB1c2VyJ3MgZHJpdmVyIHBvcnQKKyAqLworCitpbnQgcmVnX3JlbW92ZV9wb3J0KHN0cnVjdCB1c2VyX3BvcnQgKnVwX3B0cikKK3sKKwlpZiAodXBfcHRyLT51c2VyX3JlZiA9PSAwKQorCQlyZXR1cm4gVElQQ19PSzsKKwlpZiAodXBfcHRyLT51c2VyX3JlZiA+IE1BWF9VU0VSSUQpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghdXNlcnMgKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJc3Bpbl9sb2NrX2JoKCZyZWdfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmdXBfcHRyLT51cG9ydF9saXN0KTsKKwlzcGluX3VubG9ja19iaCgmcmVnX2xvY2spOworCXJldHVybiBUSVBDX09LOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy91c2VyX3JlZy5oIGIvbmV0L3RpcGMvdXNlcl9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjJjYTliCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvdXNlcl9yZWcuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogbmV0L3RpcGMvdXNlcl9yZWcuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIHVzZXIgcmVnaXN0cnkgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX1VTRVJfUkVHX0gKKyNkZWZpbmUgX1RJUENfVVNFUl9SRUdfSAorCisjaW5jbHVkZSAicG9ydC5oIgorCitpbnQgcmVnX3N0YXJ0KHZvaWQpOwordm9pZCByZWdfc3RvcCh2b2lkKTsKKworaW50IHJlZ19hZGRfcG9ydChzdHJ1Y3QgdXNlcl9wb3J0ICp1cF9wdHIpOworaW50IHJlZ19yZW1vdmVfcG9ydChzdHJ1Y3QgdXNlcl9wb3J0ICp1cF9wdHIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL3pvbmUuYyBiL25ldC90aXBjL3pvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWFlZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvem9uZS5jCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogbmV0L3RpcGMvem9uZS5jOiBUSVBDIHpvbmUgbWFuYWdlbWVudCByb3V0aW5lcworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgInpvbmUuaCIKKyNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAibm9kZV9zdWJzY3IuaCIKKyNpbmNsdWRlICJjbHVzdGVyLmgiCisjaW5jbHVkZSAibm9kZS5oIgorCitzdHJ1Y3QgX3pvbmUgKnpvbmVfY3JlYXRlKHUzMiBhZGRyKQoreworCXN0cnVjdCBfem9uZSAqel9wdHIgPSAwOworCXUzMiB6X251bTsKKworCWlmICghYWRkcl9kb21haW5fdmFsaWQoYWRkcikpCisJCXJldHVybiAwOworCisJel9wdHIgPSAoc3RydWN0IF96b25lICopa21hbGxvYyhzaXplb2YoKnpfcHRyKSwgR0ZQX0FUT01JQyk7CisJaWYgKHpfcHRyICE9IE5VTEwpIHsKKwkJbWVtc2V0KHpfcHRyLCAwLCBzaXplb2YoKnpfcHRyKSk7CisJCXpfbnVtID0gdGlwY196b25lKGFkZHIpOworCQl6X3B0ci0+YWRkciA9IHRpcGNfYWRkcih6X251bSwgMCwgMCk7CisJCW5ldC56b25lc1t6X251bV0gPSB6X3B0cjsKKwl9CisJcmV0dXJuIHpfcHRyOworfQorCit2b2lkIHpvbmVfZGVsZXRlKHN0cnVjdCBfem9uZSAqel9wdHIpCit7CisJdTMyIGNfbnVtOworCisJaWYgKCF6X3B0cikKKwkJcmV0dXJuOworCWZvciAoY19udW0gPSAxOyBjX251bSA8PSB0aXBjX21heF9jbHVzdGVyczsgY19udW0rKykgeworCQljbHVzdGVyX2RlbGV0ZSh6X3B0ci0+Y2x1c3RlcnNbY19udW1dKTsKKwl9CisJa2ZyZWUoel9wdHIpOworfQorCit2b2lkIHpvbmVfYXR0YWNoX2NsdXN0ZXIoc3RydWN0IF96b25lICp6X3B0ciwgc3RydWN0IGNsdXN0ZXIgKmNfcHRyKQoreworCXUzMiBjX251bSA9IHRpcGNfY2x1c3RlcihjX3B0ci0+YWRkcik7CisKKwlhc3NlcnQoY19wdHItPmFkZHIpOworCWFzc2VydChjX251bSA8PSB0aXBjX21heF9jbHVzdGVycyk7CisJYXNzZXJ0KHpfcHRyLT5jbHVzdGVyc1tjX251bV0gPT0gMCk7CisJel9wdHItPmNsdXN0ZXJzW2NfbnVtXSA9IGNfcHRyOworfQorCit2b2lkIHpvbmVfcmVtb3ZlX2FzX3JvdXRlcihzdHJ1Y3QgX3pvbmUgKnpfcHRyLCB1MzIgcm91dGVyKQoreworCXUzMiBjX251bTsKKworCWZvciAoY19udW0gPSAxOyBjX251bSA8PSB0aXBjX21heF9jbHVzdGVyczsgY19udW0rKykgeworCQlpZiAoel9wdHItPmNsdXN0ZXJzW2NfbnVtXSkgeworCQkJY2x1c3Rlcl9yZW1vdmVfYXNfcm91dGVyKHpfcHRyLT5jbHVzdGVyc1tjX251bV0sIAorCQkJCQkJIHJvdXRlcik7CisJCX0KKwl9Cit9CisKK3ZvaWQgem9uZV9zZW5kX2V4dGVybmFsX3JvdXRlcyhzdHJ1Y3QgX3pvbmUgKnpfcHRyLCB1MzIgZGVzdCkKK3sKKwl1MzIgY19udW07CisKKwlmb3IgKGNfbnVtID0gMTsgY19udW0gPD0gdGlwY19tYXhfY2x1c3RlcnM7IGNfbnVtKyspIHsKKwkJaWYgKHpfcHRyLT5jbHVzdGVyc1tjX251bV0pIHsKKwkJCWlmIChpbl9vd25fY2x1c3Rlcih6X3B0ci0+YWRkcikpCisJCQkJY29udGludWU7CisJCQljbHVzdGVyX3NlbmRfZXh0X3JvdXRlcyh6X3B0ci0+Y2x1c3RlcnNbY19udW1dLCBkZXN0KTsKKwkJfQorCX0KK30KKworc3RydWN0IG5vZGUgKnpvbmVfc2VsZWN0X3JlbW90ZV9ub2RlKHN0cnVjdCBfem9uZSAqel9wdHIsIHUzMiBhZGRyLCB1MzIgcmVmKQoreworCXN0cnVjdCBjbHVzdGVyICpjX3B0cjsKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CisJdTMyIGNfbnVtOworCisJaWYgKCF6X3B0cikKKwkJcmV0dXJuIDA7CisJY19wdHIgPSB6X3B0ci0+Y2x1c3RlcnNbdGlwY19jbHVzdGVyKGFkZHIpXTsKKwlpZiAoIWNfcHRyKQorCQlyZXR1cm4gMDsKKwluX3B0ciA9IGNsdXN0ZXJfc2VsZWN0X25vZGUoY19wdHIsIHJlZik7CisJaWYgKG5fcHRyKQorCQlyZXR1cm4gbl9wdHI7CisKKwkvKiBMaW5rcyB0byBhbnkgb3RoZXIgY2x1c3RlcnMgd2l0aGluIHRoaXMgem9uZSA/ICovCisJZm9yIChjX251bSA9IDE7IGNfbnVtIDw9IHRpcGNfbWF4X2NsdXN0ZXJzOyBjX251bSsrKSB7CisJCWNfcHRyID0gel9wdHItPmNsdXN0ZXJzW2NfbnVtXTsKKwkJaWYgKCFjX3B0cikKKwkJCXJldHVybiAwOworCQluX3B0ciA9IGNsdXN0ZXJfc2VsZWN0X25vZGUoY19wdHIsIHJlZik7CisJCWlmIChuX3B0cikKKwkJCXJldHVybiBuX3B0cjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3UzMiB6b25lX3NlbGVjdF9yb3V0ZXIoc3RydWN0IF96b25lICp6X3B0ciwgdTMyIGFkZHIsIHUzMiByZWYpCit7CisJc3RydWN0IGNsdXN0ZXIgKmNfcHRyOworCXUzMiBjX251bTsKKwl1MzIgcm91dGVyOworCisJaWYgKCF6X3B0cikKKwkJcmV0dXJuIDA7CisJY19wdHIgPSB6X3B0ci0+Y2x1c3RlcnNbdGlwY19jbHVzdGVyKGFkZHIpXTsKKwlyb3V0ZXIgPSBjX3B0ciA/IGNsdXN0ZXJfc2VsZWN0X3JvdXRlcihjX3B0ciwgcmVmKSA6IDA7CisJaWYgKHJvdXRlcikKKwkJcmV0dXJuIHJvdXRlcjsKKworCS8qIExpbmtzIHRvIGFueSBvdGhlciBjbHVzdGVycyB3aXRoaW4gdGhlIHpvbmU/ICovCisJZm9yIChjX251bSA9IDE7IGNfbnVtIDw9IHRpcGNfbWF4X2NsdXN0ZXJzOyBjX251bSsrKSB7CisJCWNfcHRyID0gel9wdHItPmNsdXN0ZXJzW2NfbnVtXTsKKwkJcm91dGVyID0gY19wdHIgPyBjbHVzdGVyX3NlbGVjdF9yb3V0ZXIoY19wdHIsIHJlZikgOiAwOworCQlpZiAocm91dGVyKQorCQkJcmV0dXJuIHJvdXRlcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwordTMyIHpvbmVfbmV4dF9ub2RlKHUzMiBhZGRyKQoreworCXN0cnVjdCBjbHVzdGVyICpjX3B0ciA9IGNsdXN0ZXJfZmluZChhZGRyKTsKKworCWlmIChjX3B0cikKKwkJcmV0dXJuIGNsdXN0ZXJfbmV4dF9ub2RlKGNfcHRyLCBhZGRyKTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvem9uZS5oIGIvbmV0L3RpcGMvem9uZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjZmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy96b25lLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIG5ldC90aXBjL3pvbmUuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIHpvbmUgbWFuYWdlbWVudCByb3V0aW5lcworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX1pPTkVfSAorI2RlZmluZSBfVElQQ19aT05FX0gKKworI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisjaW5jbHVkZSAibmV0LmgiCisKKworLyoqCisgKiBzdHJ1Y3QgX3pvbmUgLSBUSVBDIHpvbmUgc3RydWN0dXJlCisgKiBAYWRkcjogbmV0d29yayBhZGRyZXNzIG9mIHpvbmUKKyAqIEBjbHVzdGVyczogYXJyYXkgb2YgcG9pbnRlcnMgdG8gYWxsIGNsdXN0ZXJzIHdpdGhpbiB6b25lCisgKiBAbGlua3M6ICh1c2VkIGZvciBpbnRlci16b25lIGNvbW11bmljYXRpb24pCisgKi8KKyAKK3N0cnVjdCBfem9uZSB7CisJdTMyIGFkZHI7CisJc3RydWN0IGNsdXN0ZXIgKmNsdXN0ZXJzWzJdOyAvKiBjdXJyZW50bHkgbGltaXRlZCB0byBqdXN0IDEgY2x1c3RlciAqLworCXUzMiBsaW5rczsKK307CisKK3N0cnVjdCBub2RlICp6b25lX3NlbGVjdF9yZW1vdGVfbm9kZShzdHJ1Y3QgX3pvbmUgKnpfcHRyLCB1MzIgYWRkciwgdTMyIHJlZik7Cit1MzIgem9uZV9zZWxlY3Rfcm91dGVyKHN0cnVjdCBfem9uZSAqel9wdHIsIHUzMiBhZGRyLCB1MzIgcmVmKTsKK3ZvaWQgem9uZV9yZW1vdmVfYXNfcm91dGVyKHN0cnVjdCBfem9uZSAqel9wdHIsIHUzMiByb3V0ZXIpOwordm9pZCB6b25lX3NlbmRfZXh0ZXJuYWxfcm91dGVzKHN0cnVjdCBfem9uZSAqel9wdHIsIHUzMiBkZXN0KTsKK3N0cnVjdCBfem9uZSAqem9uZV9jcmVhdGUodTMyIGFkZHIpOwordm9pZCB6b25lX2RlbGV0ZShzdHJ1Y3QgX3pvbmUgKnpfcHRyKTsKK3ZvaWQgem9uZV9hdHRhY2hfY2x1c3RlcihzdHJ1Y3QgX3pvbmUgKnpfcHRyLCBzdHJ1Y3QgY2x1c3RlciAqY19wdHIpOwordTMyIHpvbmVfbmV4dF9ub2RlKHUzMiBhZGRyKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgX3pvbmUgKnpvbmVfZmluZCh1MzIgYWRkcikKK3sKKwlyZXR1cm4gbmV0LnpvbmVzW3RpcGNfem9uZShhZGRyKV07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYyBiL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKaW5kZXggMTJlNGZiNy4uNTNkNmM3YiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCkBAIC00OTQsOCArNDk0LDcgQEAKIAkJCQkgICAgICAgY2hhciAqbmFtZTEsIGNoYXIgKm5hbWUyKQogewogCWlmICghaXB2Nl9hZGRyX2FueShhZGRyKSkKLQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiAlcz0lMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6IgotCQkJCSAiJTA0eDolMDR4OiUwNHgiLCBuYW1lMSwgTklQNigqYWRkcikpOworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiICVzPSIgTklQNl9GTVQsIG5hbWUxLCBOSVA2KCphZGRyKSk7CiAJaWYgKHBvcnQpCiAJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgJXM9JWQiLCBuYW1lMiwgbnRvaHMocG9ydCkpOwogfQpAQCAtNTA0LDcgKzUwMyw3IEBACiAJCQkJICAgICAgIF9fYmUxNiBwb3J0LCBjaGFyICpuYW1lMSwgY2hhciAqbmFtZTIpCiB7CiAJaWYgKGFkZHIpCi0JCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgJXM9JWQuJWQuJWQuJWQiLCBuYW1lMSwgTklQUVVBRChhZGRyKSk7CisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgJXM9IiBOSVBRVUFEX0ZNVCwgbmFtZTEsIE5JUFFVQUQoYWRkcikpOwogCWlmIChwb3J0KQogCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiICVzPSVkIiwgbmFtZTIsIG50b2hzKHBvcnQpKTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZC5oIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kLmgKaW5kZXggMjIyMDE0Y2FmLi5hMWIwYjkyIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmQuaAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmQuaApAQCAtMjcwLDcgKzI3MCw2IEBACiAjZGVmaW5lIFNXX0lOUFVUX1ZPTFVNRV9TQ0FMRQk0CiAjZGVmaW5lIFNXX0lOUFVUX1ZPTFVNRV9ERUZBVUxUCSgxMjggLyBTV19JTlBVVF9WT0xVTUVfU0NBTEUpCiAKLWV4dGVybiBpbnQgZXhwYW5kX2JhbDsJLyogQmFsYW5jZSBmYWN0b3IgZm9yIGV4cGFuZGluZyAobm90IHZvbHVtZSEpICovCiBleHRlcm4gaW50IGV4cGFuZF9yZWFkX2JhbDsJLyogQmFsYW5jZSBmYWN0b3IgZm9yIHJlYWRpbmcgKi8KIGV4dGVybiB1aW50IHNvZnR3YXJlX2lucHV0X3ZvbHVtZTsgLyogc29mdHdhcmUgaW1wbGVtZW50ZWQgcmVjb3JkaW5nIHZvbHVtZSEgKi8KIApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F0YXJpLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXRhcmkuYwppbmRleCA1OWViNTNmLi5kYzMxMzczIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXRhcmkuYworKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXRhcmkuYwpAQCAtNjcsNDYgKzY3LDQ2IEBACiAgKiArK2dlZXJ0OiBzcGxpdCBpbiBldmVuIG1vcmUgZnVuY3Rpb25zIChvbmUgcGVyIGZvcm1hdCkKICAqLwogCi1zdGF0aWMgc3NpemVfdCBhdGFfY3RfbGF3KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF9sYXcoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgc3NpemVfdCBmcmFtZUxlZnQpOwotc3RhdGljIHNzaXplX3QgYXRhX2N0X3M4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF9zOChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgc3NpemVfdCBmcmFtZUxlZnQpOwotc3RhdGljIHNzaXplX3QgYXRhX2N0X3U4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF91OChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgc3NpemVfdCBmcmFtZUxlZnQpOwotc3RhdGljIHNzaXplX3QgYXRhX2N0X3MxNmJlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF9zMTZiZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpOwotc3RhdGljIHNzaXplX3QgYXRhX2N0X3UxNmJlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF91MTZiZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpOwotc3RhdGljIHNzaXplX3QgYXRhX2N0X3MxNmxlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF9zMTZsZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpOwotc3RhdGljIHNzaXplX3QgYXRhX2N0X3UxNmxlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF91MTZsZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpOwotc3RhdGljIHNzaXplX3QgYXRhX2N0eF9sYXcoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0eF9sYXcoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBhdGFfY3R4X3M4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfczgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgc3NpemVfdCBmcmFtZUxlZnQpOwotc3RhdGljIHNzaXplX3QgYXRhX2N0eF91OChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3U4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KTsKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdHhfczE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0eF9zMTZiZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICAgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBhdGFfY3R4X3UxNmJlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTE2YmUoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgICAgc3NpemVfdCBmcmFtZUxlZnQpOwotc3RhdGljIHNzaXplX3QgYXRhX2N0eF9zMTZsZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3MxNmxlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTE2bGUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0eF91MTZsZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICAgICBzc2l6ZV90IGZyYW1lTGVmdCk7CiAKQEAgLTE1MSw3ICsxNTEsNyBAQAogLyoqKiBUcmFuc2xhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdF9sYXcoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0X2xhdyhjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTE3Niw3ICsxNzYsNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdF9zOChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3RfczgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtMTk0LDcgKzE5NCw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0X3U4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF91OChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC0yMTcsOCArMjE3LDkgQEAKIAkJdXNlZCA9IGNvdW50KjI7CiAJCXdoaWxlIChjb3VudCA+IDApIHsKIAkJCXVfc2hvcnQgZGF0YTsKLQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9zaG9ydCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVzZXJQdHIgKz0gMjsKIAkJCSpwKysgPSBkYXRhIF4gMHg4MDgwOwogCQkJY291bnQtLTsKIAkJfQpAQCAtMjI4LDcgKzIyOSw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0X3MxNmJlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF9zMTZiZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC0yNDAsOCArMjQxLDkgQEAKIAkJdXNlZCA9IGNvdW50KjI7CiAJCXdoaWxlIChjb3VudCA+IDApIHsKIAkJCXVfc2hvcnQgZGF0YTsKLQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9zaG9ydCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVzZXJQdHIgKz0gMjsKIAkJCSpwKysgPSBkYXRhOwogCQkJKnArKyA9IGRhdGE7CiAJCQljb3VudC0tOwpAQCAtMjU5LDcgKzI2MSw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0X3UxNmJlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF91MTZiZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC0yNzEsOCArMjczLDkgQEAKIAkJdXNlZCA9IGNvdW50KjI7CiAJCXdoaWxlIChjb3VudCA+IDApIHsKIAkJCXVfc2hvcnQgZGF0YTsKLQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9zaG9ydCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVzZXJQdHIgKz0gMjsKIAkJCWRhdGEgXj0gMHg4MDAwOwogCQkJKnArKyA9IGRhdGE7CiAJCQkqcCsrID0gZGF0YTsKQEAgLTI4NCw5ICsyODcsMTAgQEAKIAkJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk+PjI7CiAJCXVzZWQgPSBjb3VudCo0OwogCQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCQl1X2xvbmcgZGF0YTsKLQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfaW50ICopdXNlclB0cikrKykpCisJCQl1X2ludCBkYXRhOworCQkJaWYgKGdldF91c2VyKGRhdGEsICh1X2ludCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVzZXJQdHIgKz0gNDsKIAkJCSpwKysgPSBkYXRhIF4gMHg4MDAwODAwMDsKIAkJCWNvdW50LS07CiAJCX0KQEAgLTI5Niw3ICszMDAsNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdF9zMTZsZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3RfczE2bGUoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtMzA5LDggKzMxMyw5IEBACiAJCXVzZWQgPSBjb3VudCoyOwogCQl3aGlsZSAoY291bnQgPiAwKSB7CiAJCQl1X3Nob3J0IGRhdGE7Ci0JCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKHVfc2hvcnQgX191c2VyICopdXNlclB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl1c2VyUHRyICs9IDI7CiAJCQlkYXRhID0gbGUyYmUxNihkYXRhKTsKIAkJCSpwKysgPSBkYXRhOwogCQkJKnArKyA9IGRhdGE7CkBAIC0zMjMsOCArMzI4LDkgQEAKIAkJdXNlZCA9IGNvdW50KjQ7CiAJCXdoaWxlIChjb3VudCA+IDApIHsKIAkJCXVfbG9uZyBkYXRhOwotCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9pbnQgKil1c2VyUHRyKSsrKSkKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9pbnQgX191c2VyICopdXNlclB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl1c2VyUHRyICs9IDQ7CiAJCQlkYXRhID0gbGUyYmUxNmRibChkYXRhKTsKIAkJCSpwKysgPSBkYXRhOwogCQkJY291bnQtLTsKQEAgLTMzNSw3ICszNDEsNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdF91MTZsZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3RfdTE2bGUoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtMzQ4LDggKzM1NCw5IEBACiAJCXVzZWQgPSBjb3VudCoyOwogCQl3aGlsZSAoY291bnQgPiAwKSB7CiAJCQl1X3Nob3J0IGRhdGE7Ci0JCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKHVfc2hvcnQgX191c2VyICopdXNlclB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl1c2VyUHRyICs9IDI7CiAJCQlkYXRhID0gbGUyYmUxNihkYXRhKSBeIDB4ODAwMDsKIAkJCSpwKysgPSBkYXRhOwogCQkJKnArKyA9IGRhdGE7CkBAIC0zNjEsOCArMzY4LDkgQEAKIAkJdXNlZCA9IGNvdW50OwogCQl3aGlsZSAoY291bnQgPiAwKSB7CiAJCQl1X2xvbmcgZGF0YTsKLQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfaW50ICopdXNlclB0cikrKykpCisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKHVfaW50IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOworCQkJdXNlclB0ciArPSA0OwogCQkJZGF0YSA9IGxlMmJlMTZkYmwoZGF0YSkgXiAweDgwMDA4MDAwOwogCQkJKnArKyA9IGRhdGE7CiAJCQljb3VudC0tOwpAQCAtMzczLDcgKzM4MSw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0eF9sYXcoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0eF9sYXcoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTQzNSw3ICs0NDMsNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdHhfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0eF9zOChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTQ3MCw4ICs0NzgsOSBAQAogCQkJaWYgKGJhbCA8IDApIHsKIAkJCQlpZiAodXNlckNvdW50IDwgMikKIAkJCQkJYnJlYWs7Ci0JCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9zaG9ydCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJdXNlclB0ciArPSAyOwogCQkJCXVzZXJDb3VudCAtPSAyOwogCQkJCWJhbCArPSBoU3BlZWQ7CiAJCQl9CkBAIC00ODgsNyArNDk3LDcgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCBhdGFfY3R4X3U4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC01MjQsOCArNTMzLDkgQEAKIAkJCWlmIChiYWwgPCAwKSB7CiAJCQkJaWYgKHVzZXJDb3VudCA8IDIpCiAJCQkJCWJyZWFrOwotCQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKHVfc2hvcnQgX191c2VyICopdXNlclB0cikpCiAJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXVzZXJQdHIgKz0gMjsKIAkJCQlkYXRhIF49IDB4ODA4MDsKIAkJCQl1c2VyQ291bnQgLT0gMjsKIAkJCQliYWwgKz0gaFNwZWVkOwpAQCAtNTQzLDcgKzU1Myw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0eF9zMTZiZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3MxNmJlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtNTYxLDggKzU3MSw5IEBACiAJCQlpZiAoYmFsIDwgMCkgewogCQkJCWlmICh1c2VyQ291bnQgPCAyKQogCQkJCQlicmVhazsKLQkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQkJaWYgKGdldF91c2VyKGRhdGEsICh1X3Nob3J0IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyUHRyICs9IDI7CiAJCQkJdXNlckNvdW50IC09IDI7CiAJCQkJYmFsICs9IGhTcGVlZDsKIAkJCX0KQEAgLTU3OSw4ICs1OTAsOSBAQAogCQkJaWYgKGJhbCA8IDApIHsKIAkJCQlpZiAodXNlckNvdW50IDwgNCkKIAkJCQkJYnJlYWs7Ci0JCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9pbnQgKil1c2VyUHRyKSsrKSkKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKHVfaW50IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyUHRyICs9IDQ7CiAJCQkJdXNlckNvdW50IC09IDQ7CiAJCQkJYmFsICs9IGhTcGVlZDsKIAkJCX0KQEAgLTU5Nyw3ICs2MDksNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0eF91MTZiZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICAgICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTYxNSw4ICs2MjcsOSBAQAogCQkJaWYgKGJhbCA8IDApIHsKIAkJCQlpZiAodXNlckNvdW50IDwgMikKIAkJCQkJYnJlYWs7Ci0JCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9zaG9ydCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJdXNlclB0ciArPSAyOwogCQkJCWRhdGEgXj0gMHg4MDAwOwogCQkJCXVzZXJDb3VudCAtPSAyOwogCQkJCWJhbCArPSBoU3BlZWQ7CkBAIC02MzQsOCArNjQ3LDkgQEAKIAkJCWlmIChiYWwgPCAwKSB7CiAJCQkJaWYgKHVzZXJDb3VudCA8IDQpCiAJCQkJCWJyZWFrOwotCQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfaW50ICopdXNlclB0cikrKykpCisJCQkJaWYgKGdldF91c2VyKGRhdGEsICh1X2ludCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJdXNlclB0ciArPSA0OwogCQkJCWRhdGEgXj0gMHg4MDAwODAwMDsKIAkJCQl1c2VyQ291bnQgLT0gNDsKIAkJCQliYWwgKz0gaFNwZWVkOwpAQCAtNjUzLDcgKzY2Nyw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0eF9zMTZsZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3MxNmxlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtNjcxLDggKzY4NSw5IEBACiAJCQlpZiAoYmFsIDwgMCkgewogCQkJCWlmICh1c2VyQ291bnQgPCAyKQogCQkJCQlicmVhazsKLQkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQkJaWYgKGdldF91c2VyKGRhdGEsICh1X3Nob3J0IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyUHRyICs9IDI7CiAJCQkJZGF0YSA9IGxlMmJlMTYoZGF0YSk7CiAJCQkJdXNlckNvdW50IC09IDI7CiAJCQkJYmFsICs9IGhTcGVlZDsKQEAgLTY5MCw4ICs3MDUsOSBAQAogCQkJaWYgKGJhbCA8IDApIHsKIAkJCQlpZiAodXNlckNvdW50IDwgNCkKIAkJCQkJYnJlYWs7Ci0JCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9pbnQgKil1c2VyUHRyKSsrKSkKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKHVfaW50IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyUHRyICs9IDQ7CiAJCQkJZGF0YSA9IGxlMmJlMTZkYmwoZGF0YSk7CiAJCQkJdXNlckNvdW50IC09IDQ7CiAJCQkJYmFsICs9IGhTcGVlZDsKQEAgLTcwOSw3ICs3MjUsNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTE2bGUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0eF91MTZsZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICAgICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTcyNyw4ICs3NDMsOSBAQAogCQkJaWYgKGJhbCA8IDApIHsKIAkJCQlpZiAodXNlckNvdW50IDwgMikKIAkJCQkJYnJlYWs7Ci0JCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9zaG9ydCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJdXNlclB0ciArPSAyOwogCQkJCWRhdGEgPSBsZTJiZTE2KGRhdGEpIF4gMHg4MDAwOwogCQkJCXVzZXJDb3VudCAtPSAyOwogCQkJCWJhbCArPSBoU3BlZWQ7CkBAIC03NDYsOCArNzYzLDkgQEAKIAkJCWlmIChiYWwgPCAwKSB7CiAJCQkJaWYgKHVzZXJDb3VudCA8IDQpCiAJCQkJCWJyZWFrOwotCQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfaW50ICopdXNlclB0cikrKykpCisJCQkJaWYgKGdldF91c2VyKGRhdGEsICh1X2ludCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJdXNlclB0ciArPSA0OwogCQkJCWRhdGEgPSBsZTJiZTE2ZGJsKGRhdGEpIF4gMHg4MDAwODAwMDsKIAkJCQl1c2VyQ291bnQgLT0gNDsKIAkJCQliYWwgKz0gaFNwZWVkOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3BhdWxhLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcGF1bGEuYwppbmRleCBkNTlmNjBiLi40OTQwNzBhIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcGF1bGEuYworKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcGF1bGEuYwpAQCAtMzQsNiArMzQsNyBAQAogI2RlZmluZSBETUFTT1VORF9QQVVMQV9SRVZJU0lPTiAwCiAjZGVmaW5lIERNQVNPVU5EX1BBVUxBX0VESVRJT04gNAogCisjZGVmaW5lIGN1c3RvbSBhbWlnYV9jdXN0b20KICAgIC8qCiAgICAgKglUaGUgbWluaW11bSBwZXJpb2QgZm9yIGF1ZGlvIGRlcGVuZHMgb24gaHRvdGFsIChmb3IgT0NTL0VDUy9BR0EpCiAgICAgKgkoSW1wb3J0ZWQgZnJvbSBhcmNoL202OGsvYW1pZ2EvYW1pc291bmQuYykKQEAgLTE1Niw3ICsxNTcsNyBAQAogICAgICAqICBOYXRpdmUgZm9ybWF0CiAgICAgICovCiAKLXN0YXRpYyBzc2l6ZV90IGFtaV9jdF9zOChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhbWlfY3RfczgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLCBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKIAlzc2l6ZV90IGNvdW50LCB1c2VkOwpAQCAtMTg5LDcgKzE5MCw3IEBACiAgICAgICovCiAKICNkZWZpbmUgR0VORVJBVEVfQU1JX0NUOChmdW5jbmFtZSwgY29udnNhbXBsZSkJCQkJXAotc3RhdGljIHNzaXplX3QgZnVuY25hbWUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAlcCitzdGF0aWMgc3NpemVfdCBmdW5jbmFtZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAlcCiAJCQl1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAkJXAogCQkJc3NpemVfdCBmcmFtZUxlZnQpCQkJCVwKIHsJCQkJCQkJCQlcCkBAIC0yNDAsMTAgKzI0MSwxMSBAQAogICAgICAqLwogCiAjZGVmaW5lIEdFTkVSQVRFX0FNSV9DVF8xNihmdW5jbmFtZSwgY29udnNhbXBsZSkJCQlcCi1zdGF0aWMgc3NpemVfdCBmdW5jbmFtZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCVwKK3N0YXRpYyBzc2l6ZV90IGZ1bmNuYW1lKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCVwKIAkJCXVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCQlcCiAJCQlzc2l6ZV90IGZyYW1lTGVmdCkJCQkJXAogewkJCQkJCQkJCVwKKwljb25zdCB1X3Nob3J0IF9fdXNlciAqcHRyID0gKGNvbnN0IHVfc2hvcnQgX191c2VyICopdXNlclB0cjsJXAogCXNzaXplX3QgY291bnQsIHVzZWQ7CQkJCQkJXAogCXVfc2hvcnQgZGF0YTsJCQkJCQkJXAogCQkJCQkJCQkJXApAQCAtMjUzLDcgKzI1NSw3IEBACiAJCWNvdW50ID0gbWluX3Qoc2l6ZV90LCB1c2VyQ291bnQsIGZyYW1lTGVmdCk+PjEgJiB+MTsJXAogCQl1c2VkID0gY291bnQqMjsJCQkJCQlcCiAJCXdoaWxlIChjb3VudCA+IDApIHsJCQkJCVwKLQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkJXAorCQkJaWYgKGdldF91c2VyKGRhdGEsIHB0cisrKSkJCQlcCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CQkJCVwKIAkJCWRhdGEgPSBjb252c2FtcGxlKGRhdGEpOwkJCVwKIAkJCSpoaWdoKysgPSBkYXRhPj44OwkJCQlcCkBAIC0yNjgsMTIgKzI3MCwxMiBAQAogCQljb3VudCA9IG1pbl90KHNpemVfdCwgdXNlckNvdW50LCBmcmFtZUxlZnQpPj4yICYgfjE7CVwKIAkJdXNlZCA9IGNvdW50KjQ7CQkJCQkJXAogCQl3aGlsZSAoY291bnQgPiAwKSB7CQkJCQlcCi0JCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCVwKKwkJCWlmIChnZXRfdXNlcihkYXRhLCBwdHIrKykpCQkJXAogCQkJCXJldHVybiAtRUZBVUxUOwkJCQlcCiAJCQlkYXRhID0gY29udnNhbXBsZShkYXRhKTsJCQlcCiAJCQkqbGVmdGgrKyA9IGRhdGE+Pjg7CQkJCVwKIAkJCSpsZWZ0bCsrID0gKGRhdGE+PjIpICYgMHgzZjsJCQlcCi0JCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCVwKKwkJCWlmIChnZXRfdXNlcihkYXRhLCBwdHIrKykpCQkJXAogCQkJCXJldHVybiAtRUZBVUxUOwkJCQlcCiAJCQlkYXRhID0gY29udnNhbXBsZShkYXRhKTsJCQlcCiAJCQkqcmlnaHRoKysgPSBkYXRhPj44OwkJCQlcCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcTQwLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcTQwLmMKaW5kZXggMWRkYWE2Mi4uZTIwODFmMyAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3E0MC5jCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9xNDAuYwpAQCAtNTgsNyArNTgsNyBAQAogCiAKIC8qIHVzZXJDb3VudCwgZnJhbWVVc2VkLCBmcmFtZUxlZnQgPT0gYnl0ZSBjb3VudHMgKi8KLXN0YXRpYyBzc2l6ZV90IHE0MF9jdF9sYXcoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgcTQwX2N0X2xhdyhjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtNzksNyArNzksNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IHE0MF9jdF9zOChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBxNDBfY3RfczgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC05OCw3ICs5OCw3IEBACiAJcmV0dXJuIHVzZWQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHE0MF9jdF91OChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBxNDBfY3RfdTgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC0xMTQsNyArMTE0LDcgQEAKIAogCiAvKiBhIGJpdCB0b28gY29tcGxpY2F0ZWQgdG8gb3B0aW1pc2UgcmlnaHQgbm93IC4uKi8KLXN0YXRpYyBzc2l6ZV90IHE0MF9jdHhfbGF3KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IHE0MF9jdHhfbGF3KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTE1Miw3ICsxNTIsNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IHE0MF9jdHhfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgcTQwX2N0eF9zOChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtMTg5LDcgKzE4OSw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgcTQwX2N0eF91OChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBxNDBfY3R4X3U4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC0yMjQsNyArMjI0LDcgQEAKIH0KIAogLyogY29tcHJlc3NpbmcgdmVyc2lvbnMgKi8KLXN0YXRpYyBzc2l6ZV90IHE0MF9jdGNfbGF3KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IHE0MF9jdGNfbGF3KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTI2NSw3ICsyNjUsNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IHE0MF9jdGNfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgcTQwX2N0Y19zOChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtMzA0LDcgKzMwNCw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgcTQwX2N0Y191OChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBxNDBfY3RjX3U4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvdHJhbnNfMTYuYyBiL3NvdW5kL29zcy9kbWFzb3VuZC90cmFuc18xNi5jCmluZGV4IDIzNTYyZTkuLmNhOTczYWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9kbWFzb3VuZC90cmFuc18xNi5jCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC90cmFuc18xNi5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJkbWFzb3VuZC5oIgogCitleHRlcm4gaW50IGV4cGFuZF9iYWw7CS8qIEJhbGFuY2UgZmFjdG9yIGZvciBleHBhbmRpbmcgKG5vdCB2b2x1bWUhKSAqLwogc3RhdGljIHNob3J0IGRtYXNvdW5kX2FsYXcyZG1hMTZbXSA7CiBzdGF0aWMgc2hvcnQgZG1hc291bmRfdWxhdzJkbWExNltdIDsKIAo=