ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzCmluZGV4IGRkMzExY2YuLjZiZDMwZmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMKKysrIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJaHR0cDovL2tlcm5lbG5ld2JpZXMub3JnLwogCiBMaW51eCBVU0IgcHJvamVjdDoKLQlodHRwOi8vbGludXgtdXNiLnNvdXJjZWZvcmdlLm5ldC8KKwlodHRwOi8vd3d3LmxpbnV4LXVzYi5vcmcvCiAKIEhvdyB0byBOT1Qgd3JpdGUga2VybmVsIGRyaXZlciBieSBhcmphbnZAcmVkaGF0LmNvbQogCWh0dHA6Ly9wZW9wbGUucmVkaGF0LmNvbS9hcmphbnYvb2xzcGFwZXIucGRmCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwppbmRleCA2MTk4ZTVlLi5jMmM4NWJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKQEAgLTQ3OCwxMCArNDc4LDExIEBACiBKZWZmIEdhcnppaywgIkxpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGZvcm1hdC4iCiAgIDxodHRwOi8vbGludXgueXl6LnVzL3BhdGNoLWZvcm1hdC5odG1sPgogCi1HcmVnIEtyb2FoLCAiSG93IHRvIHBpc3Mgb2ZmIGEga2VybmVsIHN1YnN5c3RlbSBtYWludGFpbmVyIi4KK0dyZWcgS3JvYWgtSGFydG1hbiAiSG93IHRvIHBpc3Mgb2ZmIGEga2VybmVsIHN1YnN5c3RlbSBtYWludGFpbmVyIi4KICAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy8yMDA1LzAzLzMxLz4KICAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy8yMDA1LzA3LzA4Lz4KICAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy8yMDA1LzEwLzE5Lz4KKyAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy8yMDA2LzAxLzExLz4KIAogTk8hISEhIE5vIG1vcmUgaHVnZSBwYXRjaCBib21icyB0byBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnIHBlb3BsZSEuCiAgIDxodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWxpbnV4LWtlcm5lbCZtPTExMjExMjc0OTkxMjk0NCZ3PTI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggOTQ3NDUwMS4uYjRhMWVhNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMTIzLDYgKzEyMywxNSBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorV2hhdDoJQ09ORklHX0ZPUkNFRF9JTkxJTklORworV2hlbjoJSnVuZSAyMDA2CitXaHk6CUNvbmZpZyBvcHRpb24gaXMgdGhlcmUgdG8gc2VlIGlmIGdjYyBpcyBnb29kIGVub3VnaC4gKGluIGphbnVhcnkKKyAgICAgICAgMjAwNikuIElmIGl0IGlzLCB0aGUgYmVoYXZpb3Igc2hvdWxkIGp1c3QgYmUgdGhlIGRlZmF1bHQuIElmIGl0J3Mgbm90LAorCXRoZSBvcHRpb24gc2hvdWxkIGp1c3QgZ28gYXdheSBlbnRpcmVseS4KK1dobzogICAgQXJqYW4gdmFuIGRlIFZlbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogV2hhdDoJU1RBUlRfQVJSQVkgaW9jdGwgZm9yIG1kCiBXaGVuOglKdWx5IDIwMDYKIEZpbGVzOglkcml2ZXJzL21kL21kLmMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdG1wZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy90bXBmcy50eHQKaW5kZXggMGQ3ODNjNS4uZGJlNGQ4NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy90bXBmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy90bXBmcy50eHQKQEAgLTc4LDYgKzc4LDE4IEBACiB0aGF0IGluc3RhbmNlIGluIGEgc3lzdGVtIHdpdGggbWFueSBjcHVzIG1ha2luZyBpbnRlbnNpdmUgdXNlIG9mIGl0LgogCiAKK3RtcGZzIGhhcyBhIG1vdW50IG9wdGlvbiB0byBzZXQgdGhlIE5VTUEgbWVtb3J5IGFsbG9jYXRpb24gcG9saWN5IGZvcgorYWxsIGZpbGVzIGluIHRoYXQgaW5zdGFuY2U6CittcG9sPWludGVybGVhdmUJCXByZWZlcnMgdG8gYWxsb2NhdGUgbWVtb3J5IGZyb20gZWFjaCBub2RlIGluIHR1cm4KK21wb2w9ZGVmYXVsdAkJcHJlZmVycyB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbSB0aGUgbG9jYWwgbm9kZQorbXBvbD1iaW5kCQlwcmVmZXJzIHRvIGFsbG9jYXRlIGZyb20gbXBvbF9ub2RlbGlzdAorbXBvbD1wcmVmZXJyZWQJCXByZWZlcnMgdG8gYWxsb2NhdGUgZnJvbSBmaXJzdCBub2RlIGluIG1wb2xfbm9kZWxpc3QKKworVGhlIGZvbGxvd2luZyBtb3VudCBvcHRpb24gaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG1wb2w9aW50ZXJsZWF2ZSwKK21wb2w9YmluZCBvciBtcG9sPXByZWZlcnJlZDoKK21wb2xfbm9kZWxpc3Q6CW5vZGVsaXN0IHN1aXRhYmxlIGZvciBwYXJzaW5nIHdpdGggbm9kZWxpc3RfcGFyc2UuCisKKwogVG8gc3BlY2lmeSB0aGUgaW5pdGlhbCByb290IGRpcmVjdG9yeSB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIG1vdW50CiBvcHRpb25zOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IGZlMTFmY2MuLjFjYmNmNjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC00NzEsNyArNDcxLDcgQEAKIAkJCWFyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZWxhbmZyZXEuYy4KIAogCWVsZXZhdG9yPQlbSU9TQ0hFRF0KLQkJCUZvcm1hdDogeyJhcyIgfCAiY2ZxIiB8ICJkZWFkbGluZSIgfCAibm9vcCJ9CisJCQlGb3JtYXQ6IHsiYW50aWNpcGF0b3J5IiB8ICJjZnEiIHwgImRlYWRsaW5lIiB8ICJub29wIn0KIAkJCVNlZSBEb2N1bWVudGF0aW9uL2Jsb2NrL2FzLWlvc2NoZWQudHh0IGFuZAogCQkJRG9jdW1lbnRhdGlvbi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLnR4dCBmb3IgZGV0YWlscy4KIApAQCAtNzEyLDkgKzcxMiwxNyBAQAogCWxvYWRfcmFtZGlzaz0JW1JBTV0gTGlzdCBvZiByYW1kaXNrcyB0byBsb2FkIGZyb20gZmxvcHB5CiAJCQlTZWUgRG9jdW1lbnRhdGlvbi9yYW1kaXNrLnR4dC4KIAotCWxvY2tkLnVkcHBvcnQ9CVtORlNdCisJbG9ja2QubmxtX2dyYWNlX3BlcmlvZD1QICBbTkZTXSBBc3NpZ24gZ3JhY2UgcGVyaW9kLgorCQkJRm9ybWF0OiA8aW50ZWdlcj4KIAotCWxvY2tkLnRjcHBvcnQ9CVtORlNdCisJbG9ja2QubmxtX3RjcHBvcnQ9TglbTkZTXSBBc3NpZ24gVENQIHBvcnQuCisJCQlGb3JtYXQ6IDxpbnRlZ2VyPgorCisJbG9ja2QubmxtX3RpbWVvdXQ9VAlbTkZTXSBBc3NpZ24gdGltZW91dCB2YWx1ZS4KKwkJCUZvcm1hdDogPGludGVnZXI+CisKKwlsb2NrZC5ubG1fdWRwcG9ydD1NCVtORlNdIEFzc2lnbiBVRFAgcG9ydC4KKwkJCUZvcm1hdDogPGludGVnZXI+CiAKIAlsb2dpYm0uaXJxPQlbSFcsTU9VU0VdIExvZ2l0ZWNoIEJ1cyBNb3VzZSBEcml2ZXIKIAkJCUZvcm1hdDogPGlycT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9hYWNyYWlkLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9hYWNyYWlkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjBmZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL2FhY3JhaWQudHh0CkBAIC0wLDAgKzEsMTA4IEBACitBQUNSQUlEIERyaXZlciBmb3IgTGludXggKHRha2UgdHdvKQorCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBhYWNyYWlkIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIEFkYXB0ZWMgKGh0dHA6Ly93d3cuYWRhcHRlYy5jb20pCitSQUlEIGNvbnRyb2xsZXJzLiBUaGlzIGlzIGEgbWFqb3IgcmV3cml0ZSBmcm9tIHRoZSBvcmlnaW5hbAorQWRhcHRlYyBzdXBwbGllZCBkcml2ZXIuIEl0IGhhcyBzaWduZmljYW50bHkgY2xlYW5lZCB1cCBib3RoIHRoZSBjb2RlCithbmQgdGhlIHJ1bm5pbmcgYmluYXJ5IHNpemUgKHRoZSBtb2R1bGUgaXMgbGVzcyB0aGFuIGhhbGYgdGhlIHNpemUgb2YKK3RoZSBvcmlnaW5hbCkuCisKK1N1cHBvcnRlZCBDYXJkcy9DaGlwc2V0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBDSSBJRCAocGNpLmlkcykJT0VNCVByb2R1Y3QKKwk5MDA1OjAyODU6OTAwNTowMjhhCUFkYXB0ZWMJMjAyMFpDUiAoU2t5aGF3aykKKwk5MDA1OjAyODU6OTAwNTowMjhlCUFkYXB0ZWMJMjAyMFNBIChTa3loYXdrKQorCTkwMDU6MDI4NTo5MDA1OjAyOGIJQWRhcHRlYyAyMDI1WkNSIChUZXJtaW5hdG9yKQorCTkwMDU6MDI4NTo5MDA1OjAyOGYJQWRhcHRlYyAyMDI1U0EgKFRlcm1pbmF0b3IpCisJOTAwNTowMjg1OjkwMDU6MDI4NglBZGFwdGVjCTIxMjBTIChDcnVzYWRlcikKKwk5MDA1OjAyODY6OTAwNTowMjhkCUFkYXB0ZWMJMjEzMFMgKExhbmNlcikKKwk5MDA1OjAyODU6OTAwNTowMjg1CUFkYXB0ZWMJMjIwMFMgKFZ1bGNhbikKKwk5MDA1OjAyODU6OTAwNTowMjg3CUFkYXB0ZWMJMjIwMFMgKFZ1bGNhbi0ybSkKKwk5MDA1OjAyODY6OTAwNTowMjhjCUFkYXB0ZWMJMjIzMFMgKExhbmNlcikKKwk5MDA1OjAyODY6OTAwNTowMjhjCUFkYXB0ZWMJMjIzMFNMUCAoTGFuY2VyKQorCTkwMDU6MDI4NTo5MDA1OjAyOTYJQWRhcHRlYwkyMjQwUyAoU2FicmVFeHByZXNzKQorCTkwMDU6MDI4NTo5MDA1OjAyOTAJQWRhcHRlYwkyNDEwU0EgKEphZ3VhcikKKwk5MDA1OjAyODU6OTAwNTowMjkzCUFkYXB0ZWMgMjE2MTBTQSAoQ29yc2Fpci0xNikKKwk5MDA1OjAyODU6MTAzYzozMjI3CUFkYXB0ZWMgMjYxMFNBIChCZWFyY2F0KQorCTkwMDU6MDI4NTo5MDA1OjAyOTIJQWRhcHRlYwkyODEwU0EgKENvcnNhaXItOCkKKwk5MDA1OjAyODU6OTAwNTowMjk0CUFkYXB0ZWMJUHJvd2xlcgorCTkwMDU6MDI4Njo5MDA1OjAyOWQJQWRhcHRlYwkyNDIwU0EgKEludHJ1ZGVyKQorCTkwMDU6MDI4Njo5MDA1OjAyOWMJQWRhcHRlYwkyNjIwU0EgKEludHJ1ZGVyKQorCTkwMDU6MDI4Njo5MDA1OjAyOWIJQWRhcHRlYwkyODIwU0EgKEludHJ1ZGVyKQorCTkwMDU6MDI4Njo5MDA1OjAyYTcJQWRhcHRlYwkyODMwU0EgKFNreXJheSkKKwk5MDA1OjAyODY6OTAwNTowMmE4CUFkYXB0ZWMJMjQzMFNBIChTa3lyYXkpCisJOTAwNTowMjg1OjkwMDU6MDI4OAlBZGFwdGVjCTMyMzBTIChIYXJyaWVyKQorCTkwMDU6MDI4NTo5MDA1OjAyODkJQWRhcHRlYwkzMjQwUyAoVG9ybmFkbykKKwk5MDA1OjAyODU6OTAwNTowMjk4CUFkYXB0ZWMJNDAwMFNBUyAoQmxhY2tCaXJkKQorCTkwMDU6MDI4NTo5MDA1OjAyOTcJQWRhcHRlYwk0MDA1U0FTIChBdm9uUGFyaykKKwk5MDA1OjAyODU6OTAwNTowMjk5CUFkYXB0ZWMJNDgwMFNBUyAoTWFyYXVkZXItWCkKKwk5MDA1OjAyODU6OTAwNTowMjlhCUFkYXB0ZWMJNDgwNVNBUyAoTWFyYXVkZXItRSkKKwk5MDA1OjAyODY6OTAwNTowMmEyCUFkYXB0ZWMJNDgxMFNBUyAoSHVycmljYW5lKQorCTEwMTE6MDA0Njo5MDA1OjAzNjQJQWRhcHRlYwk1NDAwUyAoTXVzdGFuZykKKwkxMDExOjAwNDY6OTAwNTowMzY1CUFkYXB0ZWMJNTQwMFMgKE11c3RhbmcpCisJOTAwNTowMjgzOjkwMDU6MDI4MwlBZGFwdGVjCUNhdGFwdWx0ICgzMjEwUyB3aXRoIGFyYyBmaXJtd2FyZSkKKwk5MDA1OjAyODQ6OTAwNTowMjg0CUFkYXB0ZWMJVG9tY2F0ICgzNDEwUyB3aXRoIGFyYyBmaXJtd2FyZSkKKwk5MDA1OjAyODc6OTAwNTowODAwCUFkYXB0ZWMJVGhlbWlzdG8gKEp1cGl0ZXIpCisJOTAwNTowMjAwOjkwMDU6MDIwMAlBZGFwdGVjCVRoZW1pc3RvIChKdXBpdGVyKQorCTkwMDU6MDI4Njo5MDA1OjA4MDAJQWRhcHRlYwlDYWxsaXN0byAoSnVwaXRlcikKKwkxMDExOjAwNDY6OTAwNToxMzY0CURlbGwJUEVSQyAyL1FDIChRdWFkIENoYW5uZWwsIE11c3RhbmcpCisJMTAyODowMDAxOjEwMjg6MDAwMQlEZWxsCVBFUkMgMi9TaSAoSWd1YW5hKQorCTEwMjg6MDAwMzoxMDI4OjAwMDMJRGVsbAlQRVJDIDMvU2kgKFNsaW1GYXN0KQorCTEwMjg6MDAwMjoxMDI4OjAwMDIJRGVsbAlQRVJDIDMvRGkgKE9wYWwpCisJMTAyODowMDA0OjEwMjg6MDAwNAlEZWxsCVBFUkMgMy9EaUYgKElndWFuYSkKKwkxMDI4OjAwMDI6MTAyODowMGQxCURlbGwJUEVSQyAzL0RpViAoVmlwZXIpCisJMTAyODowMDAyOjEwMjg6MDBkOQlEZWxsCVBFUkMgMy9EaUwgKExleHVzKQorCTEwMjg6MDAwYToxMDI4OjAxMDYJRGVsbAlQRVJDIDMvRGlKIChKYWd1YXIpCisJMTAyODowMDBhOjEwMjg6MDExYglEZWxsCVBFUkMgMy9EaUQgKERhZ2dlcikKKwkxMDI4OjAwMGE6MTAyODowMTIxCURlbGwJUEVSQyAzL0RpQiAoQm94c3RlcikKKwk5MDA1OjAyODU6MTAyODowMjg3CURlbGwJUEVSQyAzMjAvREMgKFZ1bGNhbikKKwk5MDA1OjAyODU6MTAyODowMjkxCURlbGwJQ0VSQyAyIChEZWxsQ29yc2FpcikKKwkxMDExOjAwNDY6MTAzYzoxMGMyCUhQCU5ldFJBSUQtNE0gKE11c3RhbmcpCisJOTAwNTowMjg1OjE3YWE6MDI4NglMZWdlbmQJUzIyMCAoQ3J1c2FkZXIpCisJOTAwNTowMjg1OjE3YWE6MDI4NwlMZWdlbmQJUzIzMCAoVnVsY2FuKQorCTkwMDU6MDI4NTo5MDA1OjAyOTAJSUJNCVNlcnZlUkFJRCA3dCAoSmFndWFyKQorCTkwMDU6MDI4NToxMDE0OjAyRjIJSUJNCVNlcnZlUkFJRCA4aSAoQXZvblBhcmspCisJOTAwNTowMjg1OjEwMTQ6MDMxMglJQk0JU2VydmVSQUlEIDhpIChBdm9uUGFya0xpdGUpCisJOTAwNTowMjg2OjEwMTQ6OTU4MAlJQk0JU2VydmVSQUlEIDhrLzhrLWw4IChBdXJvcmEpCisJOTAwNTowMjg2OjEwMTQ6OTU0MAlJQk0JU2VydmVSQUlEIDhrLzhrLWw0IChBdXJvcmFMaXRlKQorCTkwMDU6MDI4Njo5MDA1OjAyOWYJSUNQCUlDUDkwMTRSMCAoTGFuY2VyKQorCTkwMDU6MDI4Njo5MDA1OjAyOWUJSUNQCUlDUDkwMjRSMCAoTGFuY2VyKQorCTkwMDU6MDI4Njo5MDA1OjAyYTAJSUNQCUlDUDkwNDdNQSAoTGFuY2VyKQorCTkwMDU6MDI4Njo5MDA1OjAyYTEJSUNQCUlDUDkwODdNQSAoTGFuY2VyKQorCTkwMDU6MDI4Njo5MDA1OjAyYTQJSUNQCUlDUDkwODVMSSAoTWFyYXVkZXItWCkKKwk5MDA1OjAyODY6OTAwNTowMmE1CUlDUAlJQ1A1MDg1QlIgKE1hcmF1ZGVyLUUpCisJOTAwNTowMjg2OjkwMDU6MDJhMwlJQ1AJSUNQNTA4NUFVIChIdXJyaWNhbmUpCisJOTAwNTowMjg2OjkwMDU6MDJhNglJQ1AJSUNQOTA2N01BIChJbnRydWRlci02KQorCTkwMDU6MDI4Njo5MDA1OjAyYTkJSUNQCUlDUDUwODdBVSAoU2t5cmF5KQorCTkwMDU6MDI4Njo5MDA1OjAyYWEJSUNQCUlDUDUwNDdBVSAoU2t5cmF5KQorCitQZW9wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CitDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CSh1cGRhdGVzIGZvciBuZXctc3R5bGUgUENJIHByb2JpbmcgYW5kIFNDU0kgaG9zdCByZWdpc3RyYXRpb24sCisJCQkJCSBzbWFsbCBjbGVhbnVwcy9maXhlcykKK01hdHQgRG9tc2NoIDxtYXR0X2RvbXNjaEBkZWxsLmNvbT4JKHJldmlzaW9uIGlvY3RsLCBhZGFwdGVyIG1lc3NhZ2VzKQorRGVhbm5hIEJvbmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub24tREFTRCBzdXBwb3J0LCBQQUUgZmlicyBhbmQgNjQgYml0LCBhZGRlZCBuZXcgYWRhcHRlYyBjb250cm9sbGVycworCQkJCQkgYWRkZWQgbmV3IGlvY3RscywgY2hhbmdlZCBzY3NpIGludGVyZmFjZSB0byB1c2UgbmV3IGVycm9yIGhhbmRsZXIsCisJCQkJCSBpbmNyZWFzZWQgdGhlIG51bWJlciBvZiBmaWJzIGFuZCBvdXRzdGFuZGluZyBjb21tYW5kcyB0byBhIGNvbnRhaW5lcikKKworCQkJCQkoZml4ZWQgNjRiaXQgYW5kIDY0RyBtZW1vcnkgbW9kZWwsIGNoYW5nZWQgY29uZnVzaW5nIG5hbWluZyBjb252ZW50aW9uCisJCQkJCSB3aGVyZSBmaWJzIHRoYXQgZ28gdG8gdGhlIGhhcmR3YXJlIGFyZSBjb25zaXN0ZW50bHkgY2FsbGVkIGh3X2ZpYnMgYW5kCisJCQkJCSBub3QganVzdCBmaWJzIGxpa2UgdGhlIG5hbWUgb2YgdGhlIGRyaXZlciB0cmFja2luZyBzdHJ1Y3R1cmUpCitNYXJrIFNhbHl6eW4gPE1hcmtfU2FseXp5bkBhZGFwdGVjLmNvbT4gRml4ZWQgcGFuaWMgaXNzdWVzIGFuZCBhZGRlZCBzb21lIG5ldyBwcm9kdWN0IGlkcyBmb3IgdXBjb21pbmcgaGJhcy4gUGVyZm9ybWFuY2UgdHVuaW5nLCBjYXJkIGZhaWxvdmVyIGFuZCBidWcgbWl0aWdhdGlvbnMuCisKK09yaWdpbmFsIERyaXZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWRhcHRlYyBVbml4IE9FTSBQcm9kdWN0IEdyb3VwCisKK01haWxpbmcgTGlzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcgKEludGVyZXN0ZWQgcGFydGllcyB0cm9sbCBoZXJlKQorQWxzbyBub3RlIHRoaXMgaXMgdmVyeSBkaWZmZXJlbnQgdG8gQnJpYW4ncyBvcmlnaW5hbCBkcml2ZXIKK3NvIGRvbid0IGV4cGVjdCBoaW0gdG8gc3VwcG9ydCBpdC4KK0FkYXB0ZWMgZG9lcyBzdXBwb3J0IHRoaXMgZHJpdmVyLiAgQ29udGFjdCBBZGFwdGVjIHRlY2ggc3VwcG9ydCBvcgorYWFjcmFpZEBhZGFwdGVjLmNvbQorCitPcmlnaW5hbCBieSBCcmlhbiBCb2VybmVyIEZlYnJ1YXJ5IDIwMDEKK1Jld3JpdHRlbiBieSBBbGFuIENveCwgTm92ZW1iZXIgMjAwMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGkvYnV0dGVyZmx5IGIvRG9jdW1lbnRhdGlvbi9zcGkvYnV0dGVyZmx5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZThjOGQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9idXR0ZXJmbHkKQEAgLTAsMCArMSw1NyBAQAorc3BpX2J1dHRlcmZseSAtIHBhcnBvcnQtdG8tYnV0dGVyZmx5IGFkYXB0ZXIgZHJpdmVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBpcyBhIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBwcm9qZWN0IHRoYXQgaW5jbHVkZXMgYnVpbGRpbmcgYW5kIHVzaW5nCithIHBhcmFsbGVsIHBvcnQgYWRhcHRlciBjYWJsZSwgdG9nZXRoZXIgd2l0aCBhbiAiQVZSIEJ1dHRlcmZseSIgdG8gcnVuCitmaXJtd2FyZSBmb3IgdXNlciBpbnRlcmZhY2luZyBhbmQvb3Igc2Vuc29ycy4gIEEgQnV0dGVyZmx5IGlzIGEgJFVTMjAKK2JhdHRlcnkgcG93ZXJlZCBjYXJkIHdpdGggYW4gQVZSIG1pY3JvY29udHJvbGxlciBhbmQgbG90cyBvZiBnb29kaWVzOgorc2Vuc29ycywgTENELCBmbGFzaCwgdG9nZ2xlIHN0aWNrLCBhbmQgbW9yZS4gIFlvdSBjYW4gdXNlIEFWUi1HQ0MgdG8KK2RldmVsb3AgZmlybXdhcmUgZm9yIHRoaXMsIGFuZCBmbGFzaCBpdCB1c2luZyB0aGlzIGFkYXB0ZXIgY2FibGUuCisKK1lvdSBjYW4gbWFrZSB0aGlzIGFkYXB0ZXIgZnJvbSBhbiBvbGQgcHJpbnRlciBjYWJsZSBhbmQgc29sZGVyIHRoaW5ncworZGlyZWN0bHkgdG8gdGhlIEJ1dHRlcmZseS4gIE9yIChpZiB5b3UgaGF2ZSB0aGUgcGFydHMgYW5kIHNraWxscykgeW91CitjYW4gY29tZSB1cCB3aXRoIHNvbWV0aGluZyBmYW5jaWVyLCBwcm92aWRpbmcgY2lydWl0IHByb3RlY3Rpb24gdG8gdGhlCitCdXR0ZXJmbHkgYW5kIHRoZSBwcmludGVyIHBvcnQsIG9yIHdpdGggYSBiZXR0ZXIgcG93ZXIgc3VwcGx5IHRoYW4gdHdvCitzaWduYWwgcGlucyBmcm9tIHRoZSBwcmludGVyIHBvcnQuCisKKworVGhlIGZpcnN0IGNhYmxlIGNvbm5lY3Rpb25zIHdpbGwgaG9vayBMaW51eCB1cCB0byBvbmUgU1BJIGJ1cywgd2l0aCB0aGUKK0FWUiBhbmQgYSBEYXRhRmxhc2ggY2hpcDsgYW5kIHRvIHRoZSBBVlIgcmVzZXQgbGluZS4gIFRoaXMgaXMgYWxsIHlvdQorbmVlZCB0byByZWZsYXNoIHRoZSBmaXJtd2FyZSwgYW5kIHRoZSBwaW5zIGFyZSB0aGUgc3RhbmRhcmQgQXRtZWwgIklTUCIKK2Nvbm5lY3RvciBwaW5zICh1c2VkIGFsc28gb24gbm9uLUJ1dHRlcmZseSBBVlIgYm9hcmRzKS4KKworCVNpZ25hbAkgIEJ1dHRlcmZseQkgIFBhcnBvcnQgKERCLTI1KQorCS0tLS0tLQkgIC0tLS0tLS0tLQkgIC0tLS0tLS0tLS0tLS0tLQorCVNDSwk9IEo0MDMuUEIxL1NDSwk9IHBpbiAyL0QwCisJUkVTRVQJPSBKNDAzLm5SU1QJPSBwaW4gMy9EMQorCVZDQwk9IEo0MDMuVkNDX0VYVAk9IHBpbiA4L0Q2CisJTU9TSQk9IEo0MDMuUEIyL01PU0kJPSBwaW4gOS9ENworCU1JU08JPSBKNDAzLlBCMy9NSVNPCT0gcGluIDExL1M3LG5CVVNZCisJR05ECT0gSjQwMy5HTkQJPSBwaW4gMjMvR05ECisKK1RoZW4gdG8gbGV0IExpbnV4IG1hc3RlciB0aGF0IGJ1cyB0byB0YWxrIHRvIHRoZSBEYXRhRmxhc2ggY2hpcCwgeW91IG11c3QKKyhhKSBmbGFzaCBuZXcgZmlybXdhcmUgdGhhdCBkaXNhYmxlcyBTUEkgKHNldCBQUlIuMiwgYW5kIGRpc2FibGUgcHVsbHVwcworYnkgY2xlYXJpbmcgUE9SVEIuWzAtM10pOyAoYikgY29uZmlndXJlIHRoZSBtdGRfZGF0YWZsYXNoIGRyaXZlcjsgYW5kCisoYykgY2FibGUgaW4gdGhlIGNoaXBzZWxlY3QuCisKKwlTaWduYWwJICBCdXR0ZXJmbHkJICBQYXJwb3J0IChEQi0yNSkKKwktLS0tLS0JICAtLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0KKwlWQ0MJPSBKNDAwLlZDQ19FWFQJPSBwaW4gNy9ENQorCVNFTEVDVAk9IEo0MDAuUEIwL25TUwk9IHBpbiAxNy9DMyxuU0VMRUNUCisJR05ECT0gSjQwMC5HTkQJPSBwaW4gMjQvR05ECisKK1RoZSAiVVNJIiBjb250cm9sbGVyLCB1c2luZyBKNDA1LCBjYW4gYmUgdXNlZCBmb3IgYSBzZWNvbmQgU1BJIGJ1cy4gIFRoYXQKK3dvdWxkIGxldCB5b3UgdGFsayB0byB0aGUgQVZSIG92ZXIgU1BJLCBydW5uaW5nIGZpcm13YXJlIHRoYXQgbWFrZXMgaXQgYWN0CithcyBhbiBTUEkgc2xhdmUsIHdoaWxlIGxldHRpbmcgZWl0aGVyIExpbnV4IG9yIHRoZSBBVlIgdXNlIHRoZSBEYXRhRmxhc2guCitUaGVyZSBhcmUgcGxlbnR5IG9mIHNwYXJlIHBhcnBvcnQgcGlucyB0byB3aXJlIHRoaXMgb25lIHVwLCBzdWNoIGFzOgorCisJU2lnbmFsCSAgQnV0dGVyZmx5CSAgUGFycG9ydCAoREItMjUpCisJLS0tLS0tCSAgLS0tLS0tLS0tCSAgLS0tLS0tLS0tLS0tLS0tCisJU0NLCT0gSjQwMy5QRTQvVVNDSwk9IHBpbiA1L0QzCisJTU9TSQk9IEo0MDMuUEU1L0RJCT0gcGluIDYvRDQKKwlNSVNPCT0gSjQwMy5QRTYvRE8JPSBwaW4gMTIvUzUsblBBUEVST1VUCisJR05ECT0gSjQwMy5HTkQJPSBwaW4gMjIvR05ECisKKwlJUlEJPSBKNDAyLlBGNAk9IHBpbiAxMC9TNixBQ0sKKwlHTkQJPSBKNDAyLkdORChQMikJPSBwaW4gMjUvR05ECisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BpL3NwaS1zdW1tYXJ5IGIvRG9jdW1lbnRhdGlvbi9zcGkvc3BpLXN1bW1hcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmZmJhMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc3BpL3NwaS1zdW1tYXJ5CkBAIC0wLDAgKzEsNDU3IEBACitPdmVydmlldyBvZiBMaW51eCBrZXJuZWwgU1BJIHN1cHBvcnQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiswMi1EZWMtMjAwNQorCitXaGF0IGlzIFNQST8KKy0tLS0tLS0tLS0tLQorVGhlICJTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UiIChTUEkpIGlzIGEgc3luY2hyb25vdXMgZm91ciB3aXJlIHNlcmlhbAorbGluayB1c2VkIHRvIGNvbm5lY3QgbWljcm9jb250cm9sbGVycyB0byBzZW5zb3JzLCBtZW1vcnksIGFuZCBwZXJpcGhlcmFscy4KKworVGhlIHRocmVlIHNpZ25hbCB3aXJlcyBob2xkIGEgY2xvY2sgKFNDTEssIG9mdGVuIG9uIHRoZSBvcmRlciBvZiAxMCBNSHopLAorYW5kIHBhcmFsbGVsIGRhdGEgbGluZXMgd2l0aCAiTWFzdGVyIE91dCwgU2xhdmUgSW4iIChNT1NJKSBvciAiTWFzdGVyIEluLAorU2xhdmUgT3V0IiAoTUlTTykgc2lnbmFscy4gIChPdGhlciBuYW1lcyBhcmUgYWxzbyB1c2VkLikgIFRoZXJlIGFyZSBmb3VyCitjbG9ja2luZyBtb2RlcyB0aHJvdWdoIHdoaWNoIGRhdGEgaXMgZXhjaGFuZ2VkOyBtb2RlLTAgYW5kIG1vZGUtMyBhcmUgbW9zdAorY29tbW9ubHkgdXNlZC4gIEVhY2ggY2xvY2sgY3ljbGUgc2hpZnRzIGRhdGEgb3V0IGFuZCBkYXRhIGluOyB0aGUgY2xvY2sKK2RvZXNuJ3QgY3ljbGUgZXhjZXB0IHdoZW4gdGhlcmUgaXMgZGF0YSB0byBzaGlmdC4KKworU1BJIG1hc3RlcnMgbWF5IHVzZSBhICJjaGlwIHNlbGVjdCIgbGluZSB0byBhY3RpdmF0ZSBhIGdpdmVuIFNQSSBzbGF2ZQorZGV2aWNlLCBzbyB0aG9zZSB0aHJlZSBzaWduYWwgd2lyZXMgbWF5IGJlIGNvbm5lY3RlZCB0byBzZXZlcmFsIGNoaXBzCitpbiBwYXJhbGxlbC4gIEFsbCBTUEkgc2xhdmVzIHN1cHBvcnQgY2hpcHNlbGVjdHMuICBTb21lIGRldmljZXMgaGF2ZQorb3RoZXIgc2lnbmFscywgb2Z0ZW4gaW5jbHVkaW5nIGFuIGludGVycnVwdCB0byB0aGUgbWFzdGVyLgorCitVbmxpa2Ugc2VyaWFsIGJ1c3NlcyBsaWtlIFVTQiBvciBTTUJVUywgZXZlbiBsb3cgbGV2ZWwgcHJvdG9jb2xzIGZvcgorU1BJIHNsYXZlIGZ1bmN0aW9ucyBhcmUgdXN1YWxseSBub3QgaW50ZXJvcGVyYWJsZSBiZXR3ZWVuIHZlbmRvcnMKKyhleGNlcHQgZm9yIGNhc2VzIGxpa2UgU1BJIG1lbW9yeSBjaGlwcykuCisKKyAgLSBTUEkgbWF5IGJlIHVzZWQgZm9yIHJlcXVlc3QvcmVzcG9uc2Ugc3R5bGUgZGV2aWNlIHByb3RvY29scywgYXMgd2l0aAorICAgIHRvdWNoc2NyZWVuIHNlbnNvcnMgYW5kIG1lbW9yeSBjaGlwcy4KKworICAtIEl0IG1heSBhbHNvIGJlIHVzZWQgdG8gc3RyZWFtIGRhdGEgaW4gZWl0aGVyIGRpcmVjdGlvbiAoaGFsZiBkdXBsZXgpLAorICAgIG9yIGJvdGggb2YgdGhlbSBhdCB0aGUgc2FtZSB0aW1lIChmdWxsIGR1cGxleCkuCisKKyAgLSBTb21lIGRldmljZXMgbWF5IHVzZSBlaWdodCBiaXQgd29yZHMuICBPdGhlcnMgbWF5IGRpZmZlcmVudCB3b3JkCisgICAgbGVuZ3Rocywgc3VjaCBhcyBzdHJlYW1zIG9mIDEyLWJpdCBvciAyMC1iaXQgZGlnaXRhbCBzYW1wbGVzLgorCitJbiB0aGUgc2FtZSB3YXksIFNQSSBzbGF2ZXMgd2lsbCBvbmx5IHJhcmVseSBzdXBwb3J0IGFueSBraW5kIG9mIGF1dG9tYXRpYworZGlzY292ZXJ5L2VudW1lcmF0aW9uIHByb3RvY29sLiAgVGhlIHRyZWUgb2Ygc2xhdmUgZGV2aWNlcyBhY2Nlc3NpYmxlIGZyb20KK2EgZ2l2ZW4gU1BJIG1hc3RlciB3aWxsIG5vcm1hbGx5IGJlIHNldCB1cCBtYW51YWxseSwgd2l0aCBjb25maWd1cmF0aW9uCit0YWJsZXMuCisKK1NQSSBpcyBvbmx5IG9uZSBvZiB0aGUgbmFtZXMgdXNlZCBieSBzdWNoIGZvdXItd2lyZSBwcm90b2NvbHMsIGFuZAorbW9zdCBjb250cm9sbGVycyBoYXZlIG5vIHByb2JsZW0gaGFuZGxpbmcgIk1pY3JvV2lyZSIgKHRoaW5rIG9mIGl0IGFzCitoYWxmLWR1cGxleCBTUEksIGZvciByZXF1ZXN0L3Jlc3BvbnNlIHByb3RvY29scyksIFNTUCAoIlN5bmNocm9ub3VzCitTZXJpYWwgUHJvdG9jb2wiKSwgUFNQICgiUHJvZ3JhbW1hYmxlIFNlcmlhbCBQcm90b2NvbCIpLCBhbmQgb3RoZXIKK3JlbGF0ZWQgcHJvdG9jb2xzLgorCitNaWNyb2NvbnRyb2xsZXJzIG9mdGVuIHN1cHBvcnQgYm90aCBtYXN0ZXIgYW5kIHNsYXZlIHNpZGVzIG9mIHRoZSBTUEkKK3Byb3RvY29sLiAgVGhpcyBkb2N1bWVudCAoYW5kIExpbnV4KSBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB0aGUgbWFzdGVyCitzaWRlIG9mIFNQSSBpbnRlcmFjdGlvbnMuCisKKworV2hvIHVzZXMgaXQ/ICBPbiB3aGF0IGtpbmRzIG9mIHN5c3RlbXM/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xpbnV4IGRldmVsb3BlcnMgdXNpbmcgU1BJIGFyZSBwcm9iYWJseSB3cml0aW5nIGRldmljZSBkcml2ZXJzIGZvciBlbWJlZGRlZAorc3lzdGVtcyBib2FyZHMuICBTUEkgaXMgdXNlZCB0byBjb250cm9sIGV4dGVybmFsIGNoaXBzLCBhbmQgaXQgaXMgYWxzbyBhCitwcm90b2NvbCBzdXBwb3J0ZWQgYnkgZXZlcnkgTU1DIG9yIFNEIG1lbW9yeSBjYXJkLiAgKFRoZSBvbGRlciAiRGF0YUZsYXNoIgorY2FyZHMsIHByZWRhdGluZyBNTUMgY2FyZHMgYnV0IHVzaW5nIHRoZSBzYW1lIGNvbm5lY3RvcnMgYW5kIGNhcmQgc2hhcGUsCitzdXBwb3J0IG9ubHkgU1BJLikgIFNvbWUgUEMgaGFyZHdhcmUgdXNlcyBTUEkgZmxhc2ggZm9yIEJJT1MgY29kZS4KKworU1BJIHNsYXZlIGNoaXBzIHJhbmdlIGZyb20gZGlnaXRhbC9hbmFsb2cgY29udmVydGVycyB1c2VkIGZvciBhbmFsb2cKK3NlbnNvcnMgYW5kIGNvZGVjcywgdG8gbWVtb3J5LCB0byBwZXJpcGhlcmFscyBsaWtlIFVTQiBjb250cm9sbGVycworb3IgRXRoZXJuZXQgYWRhcHRlcnM7IGFuZCBtb3JlLgorCitNb3N0IHN5c3RlbXMgdXNpbmcgU1BJIHdpbGwgaW50ZWdyYXRlIGEgZmV3IGRldmljZXMgb24gYSBtYWluYm9hcmQuCitTb21lIHByb3ZpZGUgU1BJIGxpbmtzIG9uIGV4cGFuc2lvbiBjb25uZWN0b3JzOyBpbiBjYXNlcyB3aGVyZSBubworZGVkaWNhdGVkIFNQSSBjb250cm9sbGVyIGV4aXN0cywgR1BJTyBwaW5zIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhCitsb3cgc3BlZWQgImJpdGJhbmdpbmciIGFkYXB0ZXIuICBWZXJ5IGZldyBzeXN0ZW1zIHdpbGwgImhvdHBsdWciIGFuIFNQSQorY29udHJvbGxlcjsgdGhlIHJlYXNvbnMgdG8gdXNlIFNQSSBmb2N1cyBvbiBsb3cgY29zdCBhbmQgc2ltcGxlIG9wZXJhdGlvbiwKK2FuZCBpZiBkeW5hbWljIHJlY29uZmlndXJhdGlvbiBpcyBpbXBvcnRhbnQsIFVTQiB3aWxsIG9mdGVuIGJlIGEgbW9yZQorYXBwcm9wcmlhdGUgbG93LXBpbmNvdW50IHBlcmlwaGVyYWwgYnVzLgorCitNYW55IG1pY3JvY29udHJvbGxlcnMgdGhhdCBjYW4gcnVuIExpbnV4IGludGVncmF0ZSBvbmUgb3IgbW9yZSBJL08KK2ludGVyZmFjZXMgd2l0aCBTUEkgbW9kZXMuICBHaXZlbiBTUEkgc3VwcG9ydCwgdGhleSBjb3VsZCB1c2UgTU1DIG9yIFNECitjYXJkcyB3aXRob3V0IG5lZWRpbmcgYSBzcGVjaWFsIHB1cnBvc2UgTU1DL1NEL1NESU8gY29udHJvbGxlci4KKworCitIb3cgZG8gdGhlc2UgZHJpdmVyIHByb2dyYW1taW5nIGludGVyZmFjZXMgd29yaz8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIDxsaW51eC9zcGkvc3BpLmg+IGhlYWRlciBmaWxlIGluY2x1ZGVzIGtlcm5lbGRvYywgYXMgZG9lcyB0aGUKK21haW4gc291cmNlIGNvZGUsIGFuZCB5b3Ugc2hvdWxkIGNlcnRhaW5seSByZWFkIHRoYXQuICBUaGlzIGlzIGp1c3QKK2FuIG92ZXJ2aWV3LCBzbyB5b3UgZ2V0IHRoZSBiaWcgcGljdHVyZSBiZWZvcmUgdGhlIGRldGFpbHMuCisKK1NQSSByZXF1ZXN0cyBhbHdheXMgZ28gaW50byBJL08gcXVldWVzLiAgUmVxdWVzdHMgZm9yIGEgZ2l2ZW4gU1BJIGRldmljZQorYXJlIGFsd2F5cyBleGVjdXRlZCBpbiBGSUZPIG9yZGVyLCBhbmQgY29tcGxldGUgYXN5bmNocm9ub3VzbHkgdGhyb3VnaAorY29tcGxldGlvbiBjYWxsYmFja3MuICBUaGVyZSBhcmUgYWxzbyBzb21lIHNpbXBsZSBzeW5jaHJvbm91cyB3cmFwcGVycworZm9yIHRob3NlIGNhbGxzLCBpbmNsdWRpbmcgb25lcyBmb3IgY29tbW9uIHRyYW5zYWN0aW9uIHR5cGVzIGxpa2Ugd3JpdGluZworYSBjb21tYW5kIGFuZCB0aGVuIHJlYWRpbmcgaXRzIHJlc3BvbnNlLgorCitUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIFNQSSBkcml2ZXIsIGhlcmUgY2FsbGVkOgorCisgIENvbnRyb2xsZXIgZHJpdmVycyAuLi4gdGhlc2UgYXJlIG9mdGVuIGJ1aWx0IGluIHRvIFN5c3RlbS1Pbi1DaGlwCisJcHJvY2Vzc29ycywgYW5kIG9mdGVuIHN1cHBvcnQgYm90aCBNYXN0ZXIgYW5kIFNsYXZlIHJvbGVzLgorCVRoZXNlIGRyaXZlcnMgdG91Y2ggaGFyZHdhcmUgcmVnaXN0ZXJzIGFuZCBtYXkgdXNlIERNQS4KKwlPciB0aGV5IGNhbiBiZSBQSU8gYml0YmFuZ2VycywgbmVlZGluZyBqdXN0IEdQSU8gcGlucy4KKworICBQcm90b2NvbCBkcml2ZXJzIC4uLiB0aGVzZSBwYXNzIG1lc3NhZ2VzIHRocm91Z2ggdGhlIGNvbnRyb2xsZXIKKwlkcml2ZXIgdG8gY29tbXVuaWNhdGUgd2l0aCBhIFNsYXZlIG9yIE1hc3RlciBkZXZpY2Ugb24gdGhlCisJb3RoZXIgc2lkZSBvZiBhbiBTUEkgbGluay4KKworU28gZm9yIGV4YW1wbGUgb25lIHByb3RvY29sIGRyaXZlciBtaWdodCB0YWxrIHRvIHRoZSBNVEQgbGF5ZXIgdG8gZXhwb3J0CitkYXRhIHRvIGZpbGVzeXN0ZW1zIHN0b3JlZCBvbiBTUEkgZmxhc2ggbGlrZSBEYXRhRmxhc2g7IGFuZCBvdGhlcnMgbWlnaHQKK2NvbnRyb2wgYXVkaW8gaW50ZXJmYWNlcywgcHJlc2VudCB0b3VjaHNjcmVlbiBzZW5zb3JzIGFzIGlucHV0IGludGVyZmFjZXMsCitvciBtb25pdG9yIHRlbXBlcmF0dXJlIGFuZCB2b2x0YWdlIGxldmVscyBkdXJpbmcgaW5kdXN0cmlhbCBwcm9jZXNzaW5nLgorQW5kIHRob3NlIG1pZ2h0IGFsbCBiZSBzaGFyaW5nIHRoZSBzYW1lIGNvbnRyb2xsZXIgZHJpdmVyLgorCitBICJzdHJ1Y3Qgc3BpX2RldmljZSIgZW5jYXBzdWxhdGVzIHRoZSBtYXN0ZXItc2lkZSBpbnRlcmZhY2UgYmV0d2VlbgordGhvc2UgdHdvIHR5cGVzIG9mIGRyaXZlci4gIEF0IHRoaXMgd3JpdGluZywgTGludXggaGFzIG5vIHNsYXZlIHNpZGUKK3Byb2dyYW1taW5nIGludGVyZmFjZS4KKworVGhlcmUgaXMgYSBtaW5pbWFsIGNvcmUgb2YgU1BJIHByb2dyYW1taW5nIGludGVyZmFjZXMsIGZvY3Vzc2luZyBvbgordXNpbmcgZHJpdmVyIG1vZGVsIHRvIGNvbm5lY3QgY29udHJvbGxlciBhbmQgcHJvdG9jb2wgZHJpdmVycyB1c2luZworZGV2aWNlIHRhYmxlcyBwcm92aWRlZCBieSBib2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBjb2RlLiAgU1BJCitzaG93cyB1cCBpbiBzeXNmcyBpbiBzZXZlcmFsIGxvY2F0aW9uczoKKworICAgL3N5cy9kZXZpY2VzLy4uLi9DVExSL3NwaUIuQyAuLi4gc3BpX2RldmljZSBmb3Igb24gYnVzICJCIiwKKwljaGlwc2VsZWN0IEMsIGFjY2Vzc2VkIHRocm91Z2ggQ1RMUi4KKworICAgL3N5cy9kZXZpY2VzLy4uLi9DVExSL3NwaUIuQy9tb2RhbGlhcyAuLi4gaWRlbnRpZmllcyB0aGUgZHJpdmVyCisJdGhhdCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoaXMgZGV2aWNlIChmb3IgaG90cGx1Zy9jb2xkcGx1ZykKKworICAgL3N5cy9idXMvc3BpL2RldmljZXMvc3BpQi5DIC4uLiBzeW1saW5rIHRvIHRoZSBwaHlzaWNhbAorICAgCXNwaUItQyBkZXZpY2UKKworICAgL3N5cy9idXMvc3BpL2RyaXZlcnMvRCAuLi4gZHJpdmVyIGZvciBvbmUgb3IgbW9yZSBzcGkqLiogZGV2aWNlcworCisgICAvc3lzL2NsYXNzL3NwaV9tYXN0ZXIvc3BpQiAuLi4gY2xhc3MgZGV2aWNlIGZvciB0aGUgY29udHJvbGxlcgorCW1hbmFnaW5nIGJ1cyAiQiIuICBBbGwgdGhlIHNwaUIuKiBkZXZpY2VzIHNoYXJlIHRoZSBzYW1lCisJcGh5c2ljYWwgU1BJIGJ1cyBzZWdtZW50LCB3aXRoIFNDTEssIE1PU0ksIGFuZCBNSVNPLgorCisKK0hvdyBkb2VzIGJvYXJkLXNwZWNpZmljIGluaXQgY29kZSBkZWNsYXJlIFNQSSBkZXZpY2VzPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMaW51eCBuZWVkcyBzZXZlcmFsIGtpbmRzIG9mIGluZm9ybWF0aW9uIHRvIHByb3Blcmx5IGNvbmZpZ3VyZSBTUEkgZGV2aWNlcy4KK1RoYXQgaW5mb3JtYXRpb24gaXMgbm9ybWFsbHkgcHJvdmlkZWQgYnkgYm9hcmQtc3BlY2lmaWMgY29kZSwgZXZlbiBmb3IKK2NoaXBzIHRoYXQgZG8gc3VwcG9ydCBzb21lIG9mIGF1dG9tYXRlZCBkaXNjb3ZlcnkvZW51bWVyYXRpb24uCisKK0RFQ0xBUkUgQ09OVFJPTExFUlMKKworVGhlIGZpcnN0IGtpbmQgb2YgaW5mb3JtYXRpb24gaXMgYSBsaXN0IG9mIHdoYXQgU1BJIGNvbnRyb2xsZXJzIGV4aXN0LgorRm9yIFN5c3RlbS1vbi1DaGlwIChTT0MpIGJhc2VkIGJvYXJkcywgdGhlc2Ugd2lsbCB1c3VhbGx5IGJlIHBsYXRmb3JtCitkZXZpY2VzLCBhbmQgdGhlIGNvbnRyb2xsZXIgbWF5IG5lZWQgc29tZSBwbGF0Zm9ybV9kYXRhIGluIG9yZGVyIHRvCitvcGVyYXRlIHByb3Blcmx5LiAgVGhlICJzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIiB3aWxsIGluY2x1ZGUgcmVzb3VyY2VzCitsaWtlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjb250cm9sbGVyJ3MgZmlyc3QgcmVnaXN0ZXIgYW5kIGl0cyBJUlEuCisKK1BsYXRmb3JtcyB3aWxsIG9mdGVuIGFic3RyYWN0IHRoZSAicmVnaXN0ZXIgU1BJIGNvbnRyb2xsZXIiIG9wZXJhdGlvbiwKK21heWJlIGNvdXBsaW5nIGl0IHdpdGggY29kZSB0byBpbml0aWFsaXplIHBpbiBjb25maWd1cmF0aW9ucywgc28gdGhhdAordGhlIGFyY2gvLi4uL21hY2gtKi9ib2FyZC0qLmMgZmlsZXMgZm9yIHNldmVyYWwgYm9hcmRzIGNhbiBhbGwgc2hhcmUgdGhlCitzYW1lIGJhc2ljIGNvbnRyb2xsZXIgc2V0dXAgY29kZS4gIFRoaXMgaXMgYmVjYXVzZSBtb3N0IFNPQ3MgaGF2ZSBzZXZlcmFsCitTUEktY2FwYWJsZSBjb250cm9sbGVycywgYW5kIG9ubHkgdGhlIG9uZXMgYWN0dWFsbHkgdXNhYmxlIG9uIGEgZ2l2ZW4KK2JvYXJkIHNob3VsZCBub3JtYWxseSBiZSBzZXQgdXAgYW5kIHJlZ2lzdGVyZWQuCisKK1NvIGZvciBleGFtcGxlIGFyY2gvLi4uL21hY2gtKi9ib2FyZC0qLmMgZmlsZXMgbWlnaHQgaGF2ZSBjb2RlIGxpa2U6CisKKwkjaW5jbHVkZSA8YXNtL2FyY2gvc3BpLmg+CS8qIGZvciBteXNvY19zcGlfZGF0YSAqLworCisJLyogaWYgeW91ciBtYWNoLSogaW5mcmFzdHJ1Y3R1cmUgZG9lc24ndCBzdXBwb3J0IGtlcm5lbHMgdGhhdCBjYW4KKwkgKiBydW4gb24gbXVsdGlwbGUgYm9hcmRzLCBwZGF0YSB3b3VsZG4ndCBiZW5lZml0IGZyb20gIl9faW5pdCIuCisJICovCisJc3RhdGljIHN0cnVjdCBteXNvY19zcGlfZGF0YSBfX2luaXQgcGRhdGEgPSB7IC4uLiB9OworCisJc3RhdGljIF9faW5pdCBib2FyZF9pbml0KHZvaWQpCisJeworCQkuLi4KKwkJLyogdGhpcyBib2FyZCBvbmx5IHVzZXMgU1BJIGNvbnRyb2xsZXIgIzIgKi8KKwkJbXlzb2NfcmVnaXN0ZXJfc3BpKDIsICZwZGF0YSk7CisJCS4uLgorCX0KKworQW5kIFNPQy1zcGVjaWZpYyB1dGlsaXR5IGNvZGUgbWlnaHQgbG9vayBzb21ldGhpbmcgbGlrZToKKworCSNpbmNsdWRlIDxhc20vYXJjaC9zcGkuaD4KKworCXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNwaTIgPSB7IC4uLiB9OworCisJdm9pZCBteXNvY19yZWdpc3Rlcl9zcGkodW5zaWduZWQgbiwgc3RydWN0IG15c29jX3NwaV9kYXRhICpwZGF0YSkKKwl7CisJCXN0cnVjdCBteXNvY19zcGlfZGF0YSAqcGRhdGEyOworCisJCXBkYXRhMiA9IGttYWxsb2Moc2l6ZW9mICpwZGF0YTIsIEdGUF9LRVJORUwpOworCQkqcGRhdGEyID0gcGRhdGE7CisJCS4uLgorCQlpZiAobiA9PSAyKSB7CisJCQlzcGkyLT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhMjsKKwkJCXJlZ2lzdGVyX3BsYXRmb3JtX2RldmljZSgmc3BpMik7CisKKwkJCS8qIGFsc286IHNldCB1cCBwaW4gbW9kZXMgc28gdGhlIHNwaTIgc2lnbmFscyBhcmUKKwkJCSAqIHZpc2libGUgb24gdGhlIHJlbGV2YW50IHBpbnMgLi4uIGJvb3Rsb2FkZXJzIG9uCisJCQkgKiBwcm9kdWN0aW9uIGJvYXJkcyBtYXkgYWxyZWFkeSBoYXZlIGRvbmUgdGhpcywgYnV0CisJCQkgKiBkZXZlbG9wZXIgYm9hcmRzIHdpbGwgb2Z0ZW4gbmVlZCBMaW51eCB0byBkbyBpdC4KKwkJCSAqLworCQl9CisJCS4uLgorCX0KKworTm90aWNlIGhvdyB0aGUgcGxhdGZvcm1fZGF0YSBmb3IgYm9hcmRzIG1heSBiZSBkaWZmZXJlbnQsIGV2ZW4gaWYgdGhlCitzYW1lIFNPQyBjb250cm9sbGVyIGlzIHVzZWQuICBGb3IgZXhhbXBsZSwgb24gb25lIGJvYXJkIFNQSSBtaWdodCB1c2UKK2FuIGV4dGVybmFsIGNsb2NrLCB3aGVyZSBhbm90aGVyIGRlcml2ZXMgdGhlIFNQSSBjbG9jayBmcm9tIGN1cnJlbnQKK3NldHRpbmdzIG9mIHNvbWUgbWFzdGVyIGNsb2NrLgorCisKK0RFQ0xBUkUgU0xBVkUgREVWSUNFUworCitUaGUgc2Vjb25kIGtpbmQgb2YgaW5mb3JtYXRpb24gaXMgYSBsaXN0IG9mIHdoYXQgU1BJIHNsYXZlIGRldmljZXMgZXhpc3QKK29uIHRoZSB0YXJnZXQgYm9hcmQsIG9mdGVuIHdpdGggc29tZSBib2FyZC1zcGVjaWZpYyBkYXRhIG5lZWRlZCBmb3IgdGhlCitkcml2ZXIgdG8gd29yayBjb3JyZWN0bHkuCisKK05vcm1hbGx5IHlvdXIgYXJjaC8uLi4vbWFjaC0qL2JvYXJkLSouYyBmaWxlcyB3b3VsZCBwcm92aWRlIGEgc21hbGwgdGFibGUKK2xpc3RpbmcgdGhlIFNQSSBkZXZpY2VzIG9uIGVhY2ggYm9hcmQuICAoVGhpcyB3b3VsZCB0eXBpY2FsbHkgYmUgb25seSBhCitzbWFsbCBoYW5kZnVsLikgIFRoYXQgbWlnaHQgbG9vayBsaWtlOgorCisJc3RhdGljIHN0cnVjdCBhZHM3ODQ2X3BsYXRmb3JtX2RhdGEgYWRzX2luZm8gPSB7CisJCS52cmVmX2RlbGF5X3VzZWNzCT0gMTAwLAorCQkueF9wbGF0ZV9vaG1zCQk9IDU4MCwKKwkJLnlfcGxhdGVfb2htcwkJPSA0MTAsCisJfTsKKworCXN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0geworCXsKKwkJLm1vZGFsaWFzCT0gImFkczc4NDYiLAorCQkucGxhdGZvcm1fZGF0YQk9ICZhZHNfaW5mbywKKwkJLm1vZGUJCT0gU1BJX01PREVfMCwKKwkJLmlycQkJPSBHUElPX0lSUSgzMSksCisJCS5tYXhfc3BlZWRfaHoJPSAxMjAwMDAgLyogbWF4IHNhbXBsZSByYXRlIGF0IDNWICovICogMTYsCisJCS5idXNfbnVtCT0gMSwKKwkJLmNoaXBfc2VsZWN0CT0gMCwKKwl9LAorCX07CisKK0FnYWluLCBub3RpY2UgaG93IGJvYXJkLXNwZWNpZmljIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkOyBlYWNoIGNoaXAgbWF5IG5lZWQKK3NldmVyYWwgdHlwZXMuICBUaGlzIGV4YW1wbGUgc2hvd3MgZ2VuZXJpYyBjb25zdHJhaW50cyBsaWtlIHRoZSBmYXN0ZXN0IFNQSQorY2xvY2sgdG8gYWxsb3cgKGEgZnVuY3Rpb24gb2YgYm9hcmQgdm9sdGFnZSBpbiB0aGlzIGNhc2UpIG9yIGhvdyBhbiBJUlEgcGluCitpcyB3aXJlZCwgcGx1cyBjaGlwLXNwZWNpZmljIGNvbnN0cmFpbnRzIGxpa2UgYW4gaW1wb3J0YW50IGRlbGF5IHRoYXQncworY2hhbmdlZCBieSB0aGUgY2FwYWNpdGFuY2UgYXQgb25lIHBpbi4KKworKFRoZXJlJ3MgYWxzbyAiY29udHJvbGxlcl9kYXRhIiwgaW5mb3JtYXRpb24gdGhhdCBtYXkgYmUgdXNlZnVsIHRvIHRoZQorY29udHJvbGxlciBkcml2ZXIuICBBbiBleGFtcGxlIHdvdWxkIGJlIHBlcmlwaGVyYWwtc3BlY2lmaWMgRE1BIHR1bmluZworZGF0YSBvciBjaGlwc2VsZWN0IGNhbGxiYWNrcy4gIFRoaXMgaXMgc3RvcmVkIGluIHNwaV9kZXZpY2UgbGF0ZXIuKQorCitUaGUgYm9hcmRfaW5mbyBzaG91bGQgcHJvdmlkZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gbGV0IHRoZSBzeXN0ZW0gd29yaword2l0aG91dCB0aGUgY2hpcCdzIGRyaXZlciBiZWluZyBsb2FkZWQuICBUaGUgbW9zdCB0cm91Ymxlc29tZSBhc3BlY3Qgb2YKK3RoYXQgaXMgbGlrZWx5IHRoZSBTUElfQ1NfSElHSCBiaXQgaW4gdGhlIHNwaV9kZXZpY2UubW9kZSBmaWVsZCwgc2luY2UKK3NoYXJpbmcgYSBidXMgd2l0aCBhIGRldmljZSB0aGF0IGludGVycHJldHMgY2hpcHNlbGVjdCAiYmFja3dhcmRzIiBpcworbm90IHBvc3NpYmxlLgorCitUaGVuIHlvdXIgYm9hcmQgaW5pdGlhbGl6YXRpb24gY29kZSB3b3VsZCByZWdpc3RlciB0aGF0IHRhYmxlIHdpdGggdGhlIFNQSQoraW5mcmFzdHJ1Y3R1cmUsIHNvIHRoYXQgaXQncyBhdmFpbGFibGUgbGF0ZXIgd2hlbiB0aGUgU1BJIG1hc3RlciBjb250cm9sbGVyCitkcml2ZXIgaXMgcmVnaXN0ZXJlZDoKKworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHNwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKHNwaV9ib2FyZF9pbmZvKSk7CisKK0xpa2Ugd2l0aCBvdGhlciBzdGF0aWMgYm9hcmQtc3BlY2lmaWMgc2V0dXAsIHlvdSB3b24ndCB1bnJlZ2lzdGVyIHRob3NlLgorCitUaGUgd2lkZWx5IHVzZWQgImNhcmQiIHN0eWxlIGNvbXB1dGVycyBidW5kbGUgbWVtb3J5LCBjcHUsIGFuZCBsaXR0bGUgZWxzZQorb250byBhIGNhcmQgdGhhdCdzIG1heWJlIGp1c3QgdGhpcnR5IHNxdWFyZSBjZW50aW1ldGVycy4gIE9uIHN1Y2ggc3lzdGVtcywKK3lvdXIgYXJjaC8uLi4vbWFjaC0uLi4vYm9hcmQtKi5jIGZpbGUgd291bGQgcHJpbWFyaWx5IHByb3ZpZGUgaW5mb3JtYXRpb24KK2Fib3V0IHRoZSBkZXZpY2VzIG9uIHRoZSBtYWluYm9hcmQgaW50byB3aGljaCBzdWNoIGEgY2FyZCBpcyBwbHVnZ2VkLiAgVGhhdAorY2VydGFpbmx5IGluY2x1ZGVzIFNQSSBkZXZpY2VzIGhvb2tlZCB1cCB0aHJvdWdoIHRoZSBjYXJkIGNvbm5lY3RvcnMhCisKKworTk9OLVNUQVRJQyBDT05GSUdVUkFUSU9OUworCitEZXZlbG9wZXIgYm9hcmRzIG9mdGVuIHBsYXkgYnkgZGlmZmVyZW50IHJ1bGVzIHRoYW4gcHJvZHVjdCBib2FyZHMsIGFuZCBvbmUKK2V4YW1wbGUgaXMgdGhlIHBvdGVudGlhbCBuZWVkIHRvIGhvdHBsdWcgU1BJIGRldmljZXMgYW5kL29yIGNvbnRyb2xsZXJzLgorCitGb3IgdGhvc2UgY2FzZXMgeW91IG1pZ2h0IG5lZWQgdG8gdXNlIHVzZSBzcGlfYnVzbnVtX3RvX21hc3RlcigpIHRvIGxvb2sKK3VwIHRoZSBzcGkgYnVzIG1hc3RlciwgYW5kIHdpbGwgbGlrZWx5IG5lZWQgc3BpX25ld19kZXZpY2UoKSB0byBwcm92aWRlIHRoZQorYm9hcmQgaW5mbyBiYXNlZCBvbiB0aGUgYm9hcmQgdGhhdCB3YXMgaG90cGx1Z2dlZC4gIE9mIGNvdXJzZSwgeW91J2QgbGF0ZXIKK2NhbGwgYXQgbGVhc3Qgc3BpX3VucmVnaXN0ZXJfZGV2aWNlKCkgd2hlbiB0aGF0IGJvYXJkIGlzIHJlbW92ZWQuCisKK1doZW4gTGludXggaW5jbHVkZXMgc3VwcG9ydCBmb3IgTU1DL1NEL1NESU8vRGF0YUZsYXNoIGNhcmRzIHRocm91Z2ggU1BJLCB0aG9zZQorY29uZmlndXJhdGlvbnMgd2lsbCBhbHNvIGJlIGR5bmFtaWMuICBGb3J0dW5hdGVseSwgdGhvc2UgZGV2aWNlcyBhbGwgc3VwcG9ydAorYmFzaWMgZGV2aWNlIGlkZW50aWZpY2F0aW9uIHByb2Jlcywgc28gdGhhdCBzdXBwb3J0IHNob3VsZCBob3RwbHVnIG5vcm1hbGx5LgorCisKK0hvdyBkbyBJIHdyaXRlIGFuICJTUEkgUHJvdG9jb2wgRHJpdmVyIj8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FsbCBTUEkgZHJpdmVycyBhcmUgY3VycmVudGx5IGtlcm5lbCBkcml2ZXJzLiAgQSB1c2Vyc3BhY2UgZHJpdmVyIEFQSQord291bGQganVzdCBiZSBhbm90aGVyIGtlcm5lbCBkcml2ZXIsIHByb2JhYmx5IG9mZmVyaW5nIHNvbWUgbG93bGV2ZWwKK2FjY2VzcyB0aHJvdWdoIGFpb19yZWFkKCksIGFpb193cml0ZSgpLCBhbmQgaW9jdGwoKSBjYWxscyBhbmQgdXNpbmcgdGhlCitzdGFuZGFyZCB1c2Vyc3BhY2Ugc3lzZnMgbWVjaGFuaXNtcyB0byBiaW5kIHRvIGEgZ2l2ZW4gU1BJIGRldmljZS4KKworU1BJIHByb3RvY29sIGRyaXZlcnMgc29tZXdoYXQgcmVzZW1ibGUgcGxhdGZvcm0gZGV2aWNlIGRyaXZlcnM6CisKKwlzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgQ0hJUF9kcml2ZXIgPSB7CisJCS5kcml2ZXIgPSB7CisJCQkubmFtZQkJPSAiQ0hJUCIsCisJCQkuYnVzCQk9ICZzcGlfYnVzX3R5cGUsCisJCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCX0sCisKKwkJLnByb2JlCQk9IENISVBfcHJvYmUsCisJCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoQ0hJUF9yZW1vdmUpLAorCQkuc3VzcGVuZAk9IENISVBfc3VzcGVuZCwKKwkJLnJlc3VtZQkJPSBDSElQX3Jlc3VtZSwKKwl9OworCitUaGUgZHJpdmVyIGNvcmUgd2lsbCBhdXRtYXRpY2FsbHkgYXR0ZW1wdCB0byBiaW5kIHRoaXMgZHJpdmVyIHRvIGFueSBTUEkKK2RldmljZSB3aG9zZSBib2FyZF9pbmZvIGdhdmUgYSBtb2RhbGlhcyBvZiAiQ0hJUCIuICBZb3VyIHByb2JlKCkgY29kZQorbWlnaHQgbG9vayBsaWtlIHRoaXMgdW5sZXNzIHlvdSdyZSBjcmVhdGluZyBhIGNsYXNzX2RldmljZToKKworCXN0YXRpYyBpbnQgX19kZXZpbml0IENISVBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKKwl7CisJCXN0cnVjdCBDSElQCQkJKmNoaXA7CisJCXN0cnVjdCBDSElQX3BsYXRmb3JtX2RhdGEJKnBkYXRhOworCisJCS8qIGFzc3VtaW5nIHRoZSBkcml2ZXIgcmVxdWlyZXMgYm9hcmQtc3BlY2lmaWMgZGF0YTogKi8KKwkJcGRhdGEgPSAmc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwkJaWYgKCFwZGF0YSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCS8qIGdldCBtZW1vcnkgZm9yIGRyaXZlcidzIHBlci1jaGlwIHN0YXRlICovCisJCWNoaXAgPSBremFsbG9jKHNpemVvZiAqY2hpcCwgR0ZQX0tFUk5FTCk7CisJCWlmICghY2hpcCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBjaGlwKTsKKworCQkuLi4gZXRjCisJCXJldHVybiAwOworCX0KKworQXMgc29vbiBhcyBpdCBlbnRlcnMgcHJvYmUoKSwgdGhlIGRyaXZlciBtYXkgaXNzdWUgSS9PIHJlcXVlc3RzIHRvCit0aGUgU1BJIGRldmljZSB1c2luZyAic3RydWN0IHNwaV9tZXNzYWdlIi4gIFdoZW4gcmVtb3ZlKCkgcmV0dXJucywKK3RoZSBkcml2ZXIgZ3VhcmFudGVlcyB0aGF0IGl0IHdvbid0IHN1Ym1pdCBhbnkgbW9yZSBzdWNoIG1lc3NhZ2VzLgorCisgIC0gQW4gc3BpX21lc3NhZ2UgaXMgYSBzZXF1ZW5jZSBvZiBvZiBwcm90b2NvbCBvcGVyYXRpb25zLCBleGVjdXRlZAorICAgIGFzIG9uZSBhdG9taWMgc2VxdWVuY2UuICBTUEkgZHJpdmVyIGNvbnRyb2xzIGluY2x1ZGU6CisKKyAgICAgICsgd2hlbiBiaWRpcmVjdGlvbmFsIHJlYWRzIGFuZCB3cml0ZXMgc3RhcnQgLi4uIGJ5IGhvdyBpdHMKKyAgICAgICAgc2VxdWVuY2Ugb2Ygc3BpX3RyYW5zZmVyIHJlcXVlc3RzIGlzIGFycmFuZ2VkOworCisgICAgICArIG9wdGlvbmFsbHkgZGVmaW5pbmcgc2hvcnQgZGVsYXlzIGFmdGVyIHRyYW5zZmVycyAuLi4gdXNpbmcKKyAgICAgICAgdGhlIHNwaV90cmFuc2Zlci5kZWxheV91c2VjcyBzZXR0aW5nOworCisgICAgICArIHdoZXRoZXIgdGhlIGNoaXBzZWxlY3QgYmVjb21lcyBpbmFjdGl2ZSBhZnRlciBhIHRyYW5zZmVyIGFuZAorICAgICAgICBhbnkgZGVsYXkgLi4uIGJ5IHVzaW5nIHRoZSBzcGlfdHJhbnNmZXIuY3NfY2hhbmdlIGZsYWc7CisKKyAgICAgICsgaGludGluZyB3aGV0aGVyIHRoZSBuZXh0IG1lc3NhZ2UgaXMgbGlrZWx5IHRvIGdvIHRvIHRoaXMgc2FtZQorICAgICAgICBkZXZpY2UgLi4uIHVzaW5nIHRoZSBzcGlfdHJhbnNmZXIuY3NfY2hhbmdlIGZsYWcgb24gdGhlIGxhc3QKKwl0cmFuc2ZlciBpbiB0aGF0IGF0b21pYyBncm91cCwgYW5kIHBvdGVudGlhbGx5IHNhdmluZyBjb3N0cworCWZvciBjaGlwIGRlc2VsZWN0IGFuZCBzZWxlY3Qgb3BlcmF0aW9ucy4KKworICAtIEZvbGxvdyBzdGFuZGFyZCBrZXJuZWwgcnVsZXMsIGFuZCBwcm92aWRlIERNQS1zYWZlIGJ1ZmZlcnMgaW4KKyAgICB5b3VyIG1lc3NhZ2VzLiAgVGhhdCB3YXkgY29udHJvbGxlciBkcml2ZXJzIHVzaW5nIERNQSBhcmVuJ3QgZm9yY2VkCisgICAgdG8gbWFrZSBleHRyYSBjb3BpZXMgdW5sZXNzIHRoZSBoYXJkd2FyZSByZXF1aXJlcyBpdCAoZS5nLiB3b3JraW5nCisgICAgYXJvdW5kIGhhcmR3YXJlIGVycmF0YSB0aGF0IGZvcmNlIHRoZSB1c2Ugb2YgYm91bmNlIGJ1ZmZlcmluZykuCisKKyAgICBJZiBzdGFuZGFyZCBkbWFfbWFwX3NpbmdsZSgpIGhhbmRsaW5nIG9mIHRoZXNlIGJ1ZmZlcnMgaXMgaW5hcHByb3ByaWF0ZSwKKyAgICB5b3UgY2FuIHVzZSBzcGlfbWVzc2FnZS5pc19kbWFfbWFwcGVkIHRvIHRlbGwgdGhlIGNvbnRyb2xsZXIgZHJpdmVyCisgICAgdGhhdCB5b3UndmUgYWxyZWFkeSBwcm92aWRlZCB0aGUgcmVsZXZhbnQgRE1BIGFkZHJlc3Nlcy4KKworICAtIFRoZSBiYXNpYyBJL08gcHJpbWl0aXZlIGlzIHNwaV9hc3luYygpLiAgQXN5bmMgcmVxdWVzdHMgbWF5IGJlCisgICAgaXNzdWVkIGluIGFueSBjb250ZXh0IChpcnEgaGFuZGxlciwgdGFzaywgZXRjKSBhbmQgY29tcGxldGlvbgorICAgIGlzIHJlcG9ydGVkIHVzaW5nIGEgY2FsbGJhY2sgcHJvdmlkZWQgd2l0aCB0aGUgbWVzc2FnZS4KKyAgICBBZnRlciBhbnkgZGV0ZWN0ZWQgZXJyb3IsIHRoZSBjaGlwIGlzIGRlc2VsZWN0ZWQgYW5kIHByb2Nlc3NpbmcKKyAgICBvZiB0aGF0IHNwaV9tZXNzYWdlIGlzIGFib3J0ZWQuCisKKyAgLSBUaGVyZSBhcmUgYWxzbyBzeW5jaHJvbm91cyB3cmFwcGVycyBsaWtlIHNwaV9zeW5jKCksIGFuZCB3cmFwcGVycworICAgIGxpa2Ugc3BpX3JlYWQoKSwgc3BpX3dyaXRlKCksIGFuZCBzcGlfd3JpdGVfdGhlbl9yZWFkKCkuICBUaGVzZQorICAgIG1heSBiZSBpc3N1ZWQgb25seSBpbiBjb250ZXh0cyB0aGF0IG1heSBzbGVlcCwgYW5kIHRoZXkncmUgYWxsCisgICAgY2xlYW4gKGFuZCBzbWFsbCwgYW5kICJvcHRpb25hbCIpIGxheWVycyBvdmVyIHNwaV9hc3luYygpLgorCisgIC0gVGhlIHNwaV93cml0ZV90aGVuX3JlYWQoKSBjYWxsLCBhbmQgY29udmVuaWVuY2Ugd3JhcHBlcnMgYXJvdW5kCisgICAgaXQsIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBzbWFsbCBhbW91bnRzIG9mIGRhdGEgd2hlcmUgdGhlCisgICAgY29zdCBvZiBhbiBleHRyYSBjb3B5IG1heSBiZSBpZ25vcmVkLiAgSXQncyBkZXNpZ25lZCB0byBzdXBwb3J0CisgICAgY29tbW9uIFJQQy1zdHlsZSByZXF1ZXN0cywgc3VjaCBhcyB3cml0aW5nIGFuIGVpZ2h0IGJpdCBjb21tYW5kCisgICAgYW5kIHJlYWRpbmcgYSBzaXh0ZWVuIGJpdCByZXNwb25zZSAtLSBzcGlfdzhyMTYoKSBiZWluZyBvbmUgaXRzCisgICAgd3JhcHBlcnMsIGRvaW5nIGV4YWN0bHkgdGhhdC4KKworU29tZSBkcml2ZXJzIG1heSBuZWVkIHRvIG1vZGlmeSBzcGlfZGV2aWNlIGNoYXJhY3RlcmlzdGljcyBsaWtlIHRoZQordHJhbnNmZXIgbW9kZSwgd29yZHNpemUsIG9yIGNsb2NrIHJhdGUuICBUaGlzIGlzIGRvbmUgd2l0aCBzcGlfc2V0dXAoKSwKK3doaWNoIHdvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCBmcm9tIHByb2JlKCkgYmVmb3JlIHRoZSBmaXJzdCBJL08gaXMKK2RvbmUgdG8gdGhlIGRldmljZS4KKworV2hpbGUgInNwaV9kZXZpY2UiIHdvdWxkIGJlIHRoZSBib3R0b20gYm91bmRhcnkgb2YgdGhlIGRyaXZlciwgdGhlCit1cHBlciBib3VuZGFyaWVzIG1pZ2h0IGluY2x1ZGUgc3lzZnMgKGVzcGVjaWFsbHkgZm9yIHNlbnNvciByZWFkaW5ncyksCit0aGUgaW5wdXQgbGF5ZXIsIEFMU0EsIG5ldHdvcmtpbmcsIE1URCwgdGhlIGNoYXJhY3RlciBkZXZpY2UgZnJhbWV3b3JrLAorb3Igb3RoZXIgTGludXggc3Vic3lzdGVtcy4KKworTm90ZSB0aGF0IHRoZXJlIGFyZSB0d28gdHlwZXMgb2YgbWVtb3J5IHlvdXIgZHJpdmVyIG11c3QgbWFuYWdlIGFzIHBhcnQKK29mIGludGVyYWN0aW5nIHdpdGggU1BJIGRldmljZXMuCisKKyAgLSBJL08gYnVmZmVycyB1c2UgdGhlIHVzdWFsIExpbnV4IHJ1bGVzLCBhbmQgbXVzdCBiZSBETUEtc2FmZS4KKyAgICBZb3UnZCBub3JtYWxseSBhbGxvY2F0ZSB0aGVtIGZyb20gdGhlIGhlYXAgb3IgZnJlZSBwYWdlIHBvb2wuCisgICAgRG9uJ3QgdXNlIHRoZSBzdGFjaywgb3IgYW55dGhpbmcgdGhhdCdzIGRlY2xhcmVkICJzdGF0aWMiLgorCisgIC0gVGhlIHNwaV9tZXNzYWdlIGFuZCBzcGlfdHJhbnNmZXIgbWV0YWRhdGEgdXNlZCB0byBnbHVlIHRob3NlCisgICAgSS9PIGJ1ZmZlcnMgaW50byBhIGdyb3VwIG9mIHByb3RvY29sIHRyYW5zYWN0aW9ucy4gIFRoZXNlIGNhbgorICAgIGJlIGFsbG9jYXRlZCBhbnl3aGVyZSBpdCdzIGNvbnZlbmllbnQsIGluY2x1ZGluZyBhcyBwYXJ0IG9mCisgICAgb3RoZXIgYWxsb2NhdGUtb25jZSBkcml2ZXIgZGF0YSBzdHJ1Y3R1cmVzLiAgWmVyby1pbml0IHRoZXNlLgorCitJZiB5b3UgbGlrZSwgc3BpX21lc3NhZ2VfYWxsb2MoKSBhbmQgc3BpX21lc3NhZ2VfZnJlZSgpIGNvbnZlbmllbmNlCityb3V0aW5lcyBhcmUgYXZhaWxhYmxlIHRvIGFsbG9jYXRlIGFuZCB6ZXJvLWluaXRpYWxpemUgYW4gc3BpX21lc3NhZ2UKK3dpdGggc2V2ZXJhbCB0cmFuc2ZlcnMuCisKKworSG93IGRvIEkgd3JpdGUgYW4gIlNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXIiPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQW4gU1BJIGNvbnRyb2xsZXIgd2lsbCBwcm9iYWJseSBiZSByZWdpc3RlcmVkIG9uIHRoZSBwbGF0Zm9ybV9idXM7IHdyaXRlCithIGRyaXZlciB0byBiaW5kIHRvIHRoZSBkZXZpY2UsIHdoaWNoZXZlciBidXMgaXMgaW52b2x2ZWQuCisKK1RoZSBtYWluIHRhc2sgb2YgdGhpcyB0eXBlIG9mIGRyaXZlciBpcyB0byBwcm92aWRlIGFuICJzcGlfbWFzdGVyIi4KK1VzZSBzcGlfYWxsb2NfbWFzdGVyKCkgdG8gYWxsb2NhdGUgdGhlIG1hc3RlciwgYW5kIGNsYXNzX2dldF9kZXZkYXRhKCkKK3RvIGdldCB0aGUgZHJpdmVyLXByaXZhdGUgZGF0YSBhbGxvY2F0ZWQgZm9yIHRoYXQgZGV2aWNlLgorCisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwlzdHJ1Y3QgQ09OVFJPTExFUgkqYzsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBzaXplb2YgKmMpOworCWlmICghbWFzdGVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWMgPSBjbGFzc19nZXRfZGV2ZGF0YSgmbWFzdGVyLT5jZGV2KTsKKworVGhlIGRyaXZlciB3aWxsIGluaXRpYWxpemUgdGhlIGZpZWxkcyBvZiB0aGF0IHNwaV9tYXN0ZXIsIGluY2x1ZGluZyB0aGUKK2J1cyBudW1iZXIgKG1heWJlIHRoZSBzYW1lIGFzIHRoZSBwbGF0Zm9ybSBkZXZpY2UgSUQpIGFuZCB0aHJlZSBtZXRob2RzCit1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIFNQSSBjb3JlIGFuZCBTUEkgcHJvdG9jb2wgZHJpdmVycy4gIEl0IHdpbGwKK2Fsc28gaW5pdGlhbGl6ZSBpdHMgb3duIGludGVybmFsIHN0YXRlLgorCisgICAgbWFzdGVyLT5zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorCVRoaXMgc2V0cyB1cCB0aGUgZGV2aWNlIGNsb2NrIHJhdGUsIFNQSSBtb2RlLCBhbmQgd29yZCBzaXplcy4KKwlEcml2ZXJzIG1heSBjaGFuZ2UgdGhlIGRlZmF1bHRzIHByb3ZpZGVkIGJ5IGJvYXJkX2luZm8sIGFuZCB0aGVuCisJY2FsbCBzcGlfc2V0dXAoc3BpKSB0byBpbnZva2UgdGhpcyByb3V0aW5lLiAgSXQgbWF5IHNsZWVwLgorCisgICAgbWFzdGVyLT50cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UpCisgICAgCVRoaXMgbXVzdCBub3Qgc2xlZXAuICBJdHMgcmVzcG9uc2liaWxpdHkgaXMgYXJyYW5nZSB0aGF0IHRoZQorCXRyYW5zZmVyIGhhcHBlbnMgYW5kIGl0cyBjb21wbGV0ZSgpIGNhbGxiYWNrIGlzIGlzc3VlZDsgdGhlIHR3bworCXdpbGwgbm9ybWFsbHkgaGFwcGVuIGxhdGVyLCBhZnRlciBvdGhlciB0cmFuc2ZlcnMgY29tcGxldGUuCisKKyAgICBtYXN0ZXItPmNsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKKwlZb3VyIGNvbnRyb2xsZXIgZHJpdmVyIG1heSB1c2Ugc3BpX2RldmljZS5jb250cm9sbGVyX3N0YXRlIHRvIGhvbGQKKwlzdGF0ZSBpdCBkeW5hbWljYWxseSBhc3NvY2lhdGVzIHdpdGggdGhhdCBkZXZpY2UuICBJZiB5b3UgZG8gdGhhdCwKKwliZSBzdXJlIHRvIHByb3ZpZGUgdGhlIGNsZWFudXAoKSBtZXRob2QgdG8gZnJlZSB0aGF0IHN0YXRlLgorCitUaGUgYnVsayBvZiB0aGUgZHJpdmVyIHdpbGwgYmUgbWFuYWdpbmcgdGhlIEkvTyBxdWV1ZSBmZWQgYnkgdHJhbnNmZXIoKS4KKworVGhhdCBxdWV1ZSBjb3VsZCBiZSBwdXJlbHkgY29uY2VwdHVhbC4gIEZvciBleGFtcGxlLCBhIGRyaXZlciB1c2VkIG9ubHkKK2ZvciBsb3ctZnJlcXVlbmN5IHNlbnNvciBhY2VzcyBtaWdodCBiZSBmaW5lIHVzaW5nIHN5bmNocm9ub3VzIFBJTy4KKworQnV0IHRoZSBxdWV1ZSB3aWxsIHByb2JhYmx5IGJlIHZlcnkgcmVhbCwgdXNpbmcgbWVzc2FnZS0+cXVldWUsIFBJTywKK29mdGVuIERNQSAoZXNwZWNpYWxseSBpZiB0aGUgcm9vdCBmaWxlc3lzdGVtIGlzIGluIFNQSSBmbGFzaCksIGFuZAorZXhlY3V0aW9uIGNvbnRleHRzIGxpa2UgSVJRIGhhbmRsZXJzLCB0YXNrbGV0cywgb3Igd29ya3F1ZXVlcyAoc3VjaAorYXMga2V2ZW50ZCkuICBZb3VyIGRyaXZlciBjYW4gYmUgYXMgZmFuY3ksIG9yIGFzIHNpbXBsZSwgYXMgeW91IG5lZWQuCisKKworVEhBTktTIFRPCistLS0tLS0tLS0KK0NvbnRyaWJ1dG9ycyB0byBMaW51eC1TUEkgZGlzY3Vzc2lvbnMgaW5jbHVkZSAoaW4gYWxwaGFiZXRpY2FsIG9yZGVyLAorYnkgbGFzdCBuYW1lKToKKworRGF2aWQgQnJvd25lbGwKK1J1c3NlbGwgS2luZworRG1pdHJ5IFBlcnZ1c2hpbgorU3RlcGhlbiBTdHJlZXQKK01hcmsgVW5kZXJ3b29kCitBbmRyZXcgVmljdG9yCitWaXRhbHkgV29vbAorCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDBkYjcyYTMuLjUxM2YzYjYgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0xMzAwLDYgKzEzMDAsMTIgQEAKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorSU5URUwgRlJBTUVCVUZGRVIgRFJJVkVSIChleGNsdWRpbmcgODEwIGFuZCA4MTUpCitQOiAgICAgIFN5bHZhaW4gTWV5ZXIKK006ICAgICAgc3lsdmFpbi5tZXllckB3b3JsZG9ubGluZS5mcgorTDogICAgICBsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1M6ICAgICAgTWFpbnRhaW5lZAorCiBJTlRFTCA4MTAvODE1IEZSQU1FQlVGRkVSIERSSVZFUgogUDogICAgICBBbnRvbmlubyBEYXBsYXMKIE06ICAgICAgYWRhcGxhc0Bwb2wubmV0CkBAIC0xODg5LDExICsxODk1LDExIEBACiBUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2FpYTIxL250ZnMtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCi1OVklESUEgKFJJVkEpIEZSQU1FQlVGRkVSIERSSVZFUgotUDoJQW5pIEpvc2hpCi1NOglham9zaGlAc2hlbGwudW5peGJveC5jb20KLUw6CWxpbnV4LW52aWRpYUBsaXN0cy5zdXJmc291dGguY29tCi1TOglNYWludGFpbmVkCitOVklESUEgKHJpdmFmYiBhbmQgbnZpZGlhZmIpIEZSQU1FQlVGRkVSIERSSVZFUgorUDogICAgICBBbnRvbmlubyBEYXBsYXMKK006ICAgICAgYWRhcGxhc0Bwb2wubmV0CitMOiAgICAgIGxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorUzogICAgICBNYWludGFpbmVkCiAKIE9SQUNMRSBDTFVTVEVSIEZJTEVTWVNURU0gMiAoT0NGUzIpCiBQOglNYXJrIEZhc2hlaApAQCAtMjE4OCw2ICsyMTk0LDEyIEBACiBXOgl3d3cucnRsaW51eC5vcmcKIFM6CU1haW50YWluZWQKIAorUzMgU0FWQUdFIEZSQU1FQlVGRkVSIERSSVZFUgorUDogICAgICBBbnRvbmlubyBEYXBsYXMKK006ICAgICAgYWRhcGxhc0Bwb2wubmV0CitMOiAgICAgIGxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorUzogICAgICBNYWludGFpbmVkCisKIFMzOTAKIFA6CU1hcnRpbiBTY2h3aWRlZnNreQogTToJc2Nod2lkZWZza3lAZGUuaWJtLmNvbQpAQCAtMjUxOSw2ICsyNTMxLDE5IEBACiBNOiAgICAgcm9tc0BscGcudGljYWxjLm9yZwogUzogICAgIE1haW50YWluZWQKIAorVElQQyBORVRXT1JLIExBWUVSCitQOglQZXIgTGlkZW4KK006CXBlci5saWRlbkBub3NwYW0uZXJpY3Nzb24uY29tCitQOglKb24gTWFsb3kKK006CWpvbi5tYWxveUBub3NwYW0uZXJpY3Nzb24uY29tCitQOglBbGxhbiBTdGVwaGVucworTToJYWxsYW4uc3RlcGhlbnNAbm9zcGFtLndpbmRyaXZlci5jb20KK0w6CXRpcGMtZGlzY3Vzc2lvbkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1c6CWh0dHA6Ly90aXBjLnNvdXJjZWZvcmdlLm5ldC8KK1c6CWh0dHA6Ly90aXBjLmNzbGFiLmVyaWNzc29uLm5ldC8KK1Q6CWdpdCB0aXBjLmNzbGFiLmVyaWNzc29uLm5ldDovcHViL2dpdC90aXBjLmdpdAorUzoJTWFpbnRhaW5lZAorCiBUTEFOIE5FVFdPUksgRFJJVkVSCiBQOglTYW11ZWwgQ2hlc3NtYW4KIE06CWNoZXNzbWFuQHR1eC5vcmcKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IDAwNmYwOTIuLjU5NTllMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtNzY0LDYgKzc2NCw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9pMmMvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3NwaS9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvaHdtb24vS2NvbmZpZyIKIAogI3NvdXJjZSAiZHJpdmVycy9sMy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jIGIvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCmluZGV4IDFiN2VhYWIuLjE1OWFkN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYworKysgYi9hcmNoL2FybS9jb21tb24vbG9jb21vLmMKQEAgLTExMDMsMTQgKzExMDMsMTQgQEAKIHN0cnVjdCBidXNfdHlwZSBsb2NvbW9fYnVzX3R5cGUgPSB7CiAJLm5hbWUJCT0gImxvY29tby1idXMiLAogCS5tYXRjaAkJPSBsb2NvbW9fbWF0Y2gsCisJLnByb2JlCQk9IGxvY29tb19idXNfcHJvYmUsCisJLnJlbW92ZQkJPSBsb2NvbW9fYnVzX3JlbW92ZSwKIAkuc3VzcGVuZAk9IGxvY29tb19idXNfc3VzcGVuZCwKIAkucmVzdW1lCQk9IGxvY29tb19idXNfcmVzdW1lLAogfTsKIAogaW50IGxvY29tb19kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGxvY29tb19kcml2ZXIgKmRyaXZlcikKIHsKLQlkcml2ZXItPmRydi5wcm9iZSA9IGxvY29tb19idXNfcHJvYmU7Ci0JZHJpdmVyLT5kcnYucmVtb3ZlID0gbG9jb21vX2J1c19yZW1vdmU7CiAJZHJpdmVyLT5kcnYuYnVzID0gJmxvY29tb19idXNfdHlwZTsKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRydik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vc2ExMTExLmMgYi9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKaW5kZXggZDBkNmU2ZC4uMTQ3NTA4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYwpAQCAtMTI0NywxNCArMTI0NywxNCBAQAogc3RydWN0IGJ1c190eXBlIHNhMTExMV9idXNfdHlwZSA9IHsKIAkubmFtZQkJPSAic2ExMTExLXJhYiIsCiAJLm1hdGNoCQk9IHNhMTExMV9tYXRjaCwKKwkucHJvYmUJCT0gc2ExMTExX2J1c19wcm9iZSwKKwkucmVtb3ZlCQk9IHNhMTExMV9idXNfcmVtb3ZlLAogCS5zdXNwZW5kCT0gc2ExMTExX2J1c19zdXNwZW5kLAogCS5yZXN1bWUJCT0gc2ExMTExX2J1c19yZXN1bWUsCiB9OwogCiBpbnQgc2ExMTExX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3Qgc2ExMTExX2RyaXZlciAqZHJpdmVyKQogewotCWRyaXZlci0+ZHJ2LnByb2JlID0gc2ExMTExX2J1c19wcm9iZTsKLQlkcml2ZXItPmRydi5yZW1vdmUgPSBzYTExMTFfYnVzX3JlbW92ZTsKIAlkcml2ZXItPmRydi5idXMgPSAmc2ExMTExX2J1c190eXBlOwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJ2KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKaW5kZXggOTZmZDkxOS4uNzRlYTI5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKQEAgLTExNDcsOSArMTE0NywxMSBAQAogCXN0cnVjdCBlY2FyZF9kcml2ZXIgKmRydiA9IEVDQVJEX0RSVihkZXYtPmRyaXZlcik7CiAJc3RydWN0IGVjYXJkX3JlcXVlc3QgcmVxOwogCi0JaWYgKGRydi0+c2h1dGRvd24pCi0JCWRydi0+c2h1dGRvd24oZWMpOwotCWVjYXJkX3JlbGVhc2UoZWMpOworCWlmIChkZXYtPmRyaXZlcikgeworCQlpZiAoZHJ2LT5zaHV0ZG93bikKKwkJCWRydi0+c2h1dGRvd24oZWMpOworCQllY2FyZF9yZWxlYXNlKGVjKTsKKwl9CiAKIAkvKgogCSAqIElmIHRoaXMgY2FyZCBoYXMgYSBsb2FkZXIsIGNhbGwgdGhlIHJlc2V0IGhhbmRsZXIuCkBAIC0xMTY0LDkgKzExNjYsNiBAQAogaW50IGVjYXJkX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZWNhcmRfZHJpdmVyICpkcnYpCiB7CiAJZHJ2LT5kcnYuYnVzID0gJmVjYXJkX2J1c190eXBlOwotCWRydi0+ZHJ2LnByb2JlID0gZWNhcmRfZHJ2X3Byb2JlOwotCWRydi0+ZHJ2LnJlbW92ZSA9IGVjYXJkX2Rydl9yZW1vdmU7Ci0JZHJ2LT5kcnYuc2h1dGRvd24gPSBlY2FyZF9kcnZfc2h1dGRvd247CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRydik7CiB9CkBAIC0xMTk1LDYgKzExOTQsOSBAQAogCS5uYW1lCQk9ICJlY2FyZCIsCiAJLmRldl9hdHRycwk9IGVjYXJkX2Rldl9hdHRycywKIAkubWF0Y2gJCT0gZWNhcmRfbWF0Y2gsCisJLnByb2JlCQk9IGVjYXJkX2Rydl9wcm9iZSwKKwkucmVtb3ZlCQk9IGVjYXJkX2Rydl9yZW1vdmUsCisJLnNodXRkb3duCT0gZWNhcmRfZHJ2X3NodXRkb3duLAogfTsKIAogc3RhdGljIGludCBlY2FyZF9idXNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2xtLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvbG0uYwppbmRleCA1YjQxZTNhLi42MjJjZGM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvbG0uYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvbG0uYwpAQCAtMjIsMjAgKzIyLDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBidXNfdHlwZSBsbV9idXN0eXBlID0gewotCS5uYW1lCQk9ICJsb2dpY21vZHVsZSIsCi0JLm1hdGNoCQk9IGxtX21hdGNoLAotLy8JLnN1c3BlbmQJPSBsbV9zdXNwZW5kLAotLy8JLnJlc3VtZQkJPSBsbV9yZXN1bWUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBsbV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGJ1c19yZWdpc3RlcigmbG1fYnVzdHlwZSk7Ci19Ci0KLXBvc3Rjb3JlX2luaXRjYWxsKGxtX2luaXQpOwotCiBzdGF0aWMgaW50IGxtX2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGxtX2RldmljZSAqbG1kZXYgPSB0b19sbV9kZXZpY2UoZGV2KTsKQEAgLTQ5LDE2ICszNSwzMCBAQAogCXN0cnVjdCBsbV9kZXZpY2UgKmxtZGV2ID0gdG9fbG1fZGV2aWNlKGRldik7CiAJc3RydWN0IGxtX2RyaXZlciAqbG1kcnYgPSB0b19sbV9kcml2ZXIoZGV2LT5kcml2ZXIpOwogCi0JbG1kcnYtPnJlbW92ZShsbWRldik7CisJaWYgKGxtZHJ2LT5yZW1vdmUpCisJCWxtZHJ2LT5yZW1vdmUobG1kZXYpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIGxtX2J1c3R5cGUgPSB7CisJLm5hbWUJCT0gImxvZ2ljbW9kdWxlIiwKKwkubWF0Y2gJCT0gbG1fbWF0Y2gsCisJLnByb2JlCQk9IGxtX2J1c19wcm9iZSwKKwkucmVtb3ZlCQk9IGxtX2J1c19yZW1vdmUsCisvLwkuc3VzcGVuZAk9IGxtX2J1c19zdXNwZW5kLAorLy8JLnJlc3VtZQkJPSBsbV9idXNfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbG1faW5pdCh2b2lkKQoreworCXJldHVybiBidXNfcmVnaXN0ZXIoJmxtX2J1c3R5cGUpOworfQorCitwb3N0Y29yZV9pbml0Y2FsbChsbV9pbml0KTsKKwogaW50IGxtX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgbG1fZHJpdmVyICpkcnYpCiB7CiAJZHJ2LT5kcnYuYnVzID0gJmxtX2J1c3R5cGU7Ci0JZHJ2LT5kcnYucHJvYmUgPSBsbV9idXNfcHJvYmU7Ci0JZHJ2LT5kcnYucmVtb3ZlID0gbG1fYnVzX3JlbW92ZTsKLQogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJ2KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L0tjb25maWcgYi9hcmNoL2kzODYvS2NvbmZpZwppbmRleCBkNWQwZGY3Li5jYmRlNjc1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvS2NvbmZpZworKysgYi9hcmNoL2kzODYvS2NvbmZpZwpAQCAtNzAyLDYgKzcwMiwxNSBAQAogCiAJICBEb24ndCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgogCitjb25maWcgSE9UUExVR19DUFUKKwlib29sICJTdXBwb3J0IGZvciBob3QtcGx1Z2dhYmxlIENQVXMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBTTVAgJiYgSE9UUExVRyAmJiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIHRvIGV4cGVyaW1lbnQgd2l0aCB0dXJuaW5nIENQVXMgb2ZmIGFuZCBvbi4gIENQVXMKKwkgIGNhbiBiZSBjb250cm9sbGVkIHRocm91Z2ggL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUuCisKKwkgIFNheSBOLgorCiBlbmRtZW51CiAKIApAQCAtOTg4LDE1ICs5OTcsNiBAQAogCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgY29tcGlsZWQgYXMgYQogCSAgbW9kdWxlLCBpdCB3aWxsIGJlIGNhbGxlZCBzY3gyMDAuCiAKLWNvbmZpZyBIT1RQTFVHX0NQVQotCWJvb2wgIlN1cHBvcnQgZm9yIGhvdC1wbHVnZ2FibGUgQ1BVcyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFNNUCAmJiBIT1RQTFVHICYmIEVYUEVSSU1FTlRBTAotCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgdG8gZXhwZXJpbWVudCB3aXRoIHR1cm5pbmcgQ1BVcyBvZmYgYW5kIG9uLiAgQ1BVcwotCSAgY2FuIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS4KLQotCSAgU2F5IE4uCi0KIHNvdXJjZSAiZHJpdmVycy9wY21jaWEvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3BjaS9ob3RwbHVnL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvTWFrZWZpbGUgYi9hcmNoL2kzODYvTWFrZWZpbGUKaW5kZXggZDNjMDQwOS4uYmQyZDUzYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9NYWtlZmlsZQpAQCAtNDIsOSArNDIsOSBAQAogY2ZsYWdzLSQoQ09ORklHX1JFR1BBUk0pICs9ICQoc2hlbGwgaWYgWyAkKGNhbGwgY2MtdmVyc2lvbikgLWdlIDAzMDAgXSA7IHRoZW4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIi1tcmVncGFybT0zIjsgZmkgOykKIAotIyBEaXNhYmxlIHVuaXQtYXQtYS10aW1lIG1vZGUsIGl0IG1ha2VzIGdjYyB1c2UgYSBsb3QgbW9yZSBzdGFjawotIyBkdWUgdG8gdGhlIGxhY2sgb2Ygc2hhcmluZyBvZiBzdGFja2xvdHMuCi1DRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZm5vLXVuaXQtYXQtYS10aW1lKQorIyBEaXNhYmxlIHVuaXQtYXQtYS10aW1lIG1vZGUgb24gcHJlLWdjYy00LjAgY29tcGlsZXJzLCBpdCBtYWtlcyBnY2MgdXNlCisjIGEgbG90IG1vcmUgc3RhY2sgZHVlIHRvIHRoZSBsYWNrIG9mIHNoYXJpbmcgb2Ygc3RhY2tsb3RzOgorQ0ZMQUdTCQkJCSs9ICQoc2hlbGwgaWYgWyAkKGNhbGwgY2MtdmVyc2lvbikgLWx0IDA0MDAgXSA7IHRoZW4gZWNobyAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tdW5pdC1hdC1hLXRpbWUpOyBmaSA7KQogCiBDRkxBR1MgKz0gJChjZmxhZ3MteSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCmluZGV4IGI5ZjAwMzAuLjBhYWViZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKQEAgLTExMiwzMyArMTEyLDM4IEBACiAJCXAgPCAodm9pZCAqKXRpbmZvICsgVEhSRUFEX1NJWkUgLSAzOwogfQogCitzdGF0aWMgdm9pZCBwcmludF9hZGRyX2FuZF9zeW1ib2wodW5zaWduZWQgbG9uZyBhZGRyLCBjaGFyICpsb2dfbHZsKQoreworCXByaW50ayhsb2dfbHZsKTsKKwlwcmludGsoIiBbPCUwOGx4Pl0gIiwgYWRkcik7CisJcHJpbnRfc3ltYm9sKCIlcyIsIGFkZHIpOworCXByaW50aygiXG4iKTsKK30KKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHByaW50X2NvbnRleHRfc3RhY2soc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbywKLQkJCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBlYnApCisJCQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgZWJwLAorCQkJCWNoYXIgKmxvZ19sdmwpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCiAjaWZkZWYJQ09ORklHX0ZSQU1FX1BPSU5URVIKIAl3aGlsZSAodmFsaWRfc3RhY2tfcHRyKHRpbmZvLCAodm9pZCAqKWVicCkpIHsKIAkJYWRkciA9ICoodW5zaWduZWQgbG9uZyAqKShlYnAgKyA0KTsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIiBbPCUwOGx4Pl0gIiwgYWRkcik7Ci0JCXByaW50X3N5bWJvbCgiJXMiLCBhZGRyKTsKLQkJcHJpbnRrKCJcbiIpOworCQlwcmludF9hZGRyX2FuZF9zeW1ib2woYWRkciwgbG9nX2x2bCk7CiAJCWVicCA9ICoodW5zaWduZWQgbG9uZyAqKWVicDsKIAl9CiAjZWxzZQogCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sIHN0YWNrKSkgewogCQlhZGRyID0gKnN0YWNrKys7Ci0JCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsKLQkJCXByaW50ayhLRVJOX0VNRVJHICIgWzwlMDhseD5dIiwgYWRkcik7Ci0JCQlwcmludF9zeW1ib2woIiAlcyIsIGFkZHIpOwotCQkJcHJpbnRrKCJcbiIpOwotCQl9CisJCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpCisJCQlwcmludF9hZGRyX2FuZF9zeW1ib2woYWRkciwgbG9nX2x2bCk7CiAJfQogI2VuZGlmCiAJcmV0dXJuIGVicDsKIH0KIAotdm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqIHN0YWNrKQorc3RhdGljIHZvaWQgc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nICpzdGFjaywgY2hhciAqbG9nX2x2bCkKIHsKIAl1bnNpZ25lZCBsb25nIGVicDsKIApAQCAtMTU3LDcgKzE2Miw3IEBACiAJCXN0cnVjdCB0aHJlYWRfaW5mbyAqY29udGV4dDsKIAkJY29udGV4dCA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikKIAkJCSgodW5zaWduZWQgbG9uZylzdGFjayAmICh+KFRIUkVBRF9TSVpFIC0gMSkpKTsKLQkJZWJwID0gcHJpbnRfY29udGV4dF9zdGFjayhjb250ZXh0LCBzdGFjaywgZWJwKTsKKwkJZWJwID0gcHJpbnRfY29udGV4dF9zdGFjayhjb250ZXh0LCBzdGFjaywgZWJwLCBsb2dfbHZsKTsKIAkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyopY29udGV4dC0+cHJldmlvdXNfZXNwOwogCQlpZiAoIXN0YWNrKQogCQkJYnJlYWs7CkBAIC0xNjUsNyArMTcwLDEzIEBACiAJfQogfQogCi12b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICplc3ApCit2b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICogc3RhY2spCit7CisJc2hvd190cmFjZV9sb2dfbHZsKHRhc2ssIHN0YWNrLCAiIik7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfc3RhY2tfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmVzcCwKKwkJCSAgICAgICBjaGFyICpsb2dfbHZsKQogewogCXVuc2lnbmVkIGxvbmcgKnN0YWNrOwogCWludCBpOwpAQCAtMTc4LDE2ICsxODksMjYgQEAKIAl9CiAKIAlzdGFjayA9IGVzcDsKLQlwcmludGsoS0VSTl9FTUVSRyk7CisJcHJpbnRrKGxvZ19sdmwpOwogCWZvcihpID0gMDsgaSA8IGtzdGFja19kZXB0aF90b19wcmludDsgaSsrKSB7CiAJCWlmIChrc3RhY2tfZW5kKHN0YWNrKSkKIAkJCWJyZWFrOwotCQlpZiAoaSAmJiAoKGkgJSA4KSA9PSAwKSkKLQkJCXByaW50aygiXG4iIEtFUk5fRU1FUkcgIiAgICAgICAiKTsKKwkJaWYgKGkgJiYgKChpICUgOCkgPT0gMCkpIHsKKwkJCXByaW50aygiXG4iKTsKKwkJCXByaW50ayhsb2dfbHZsKTsKKwkJCXByaW50aygiICAgICAgICIpOworCQl9CiAJCXByaW50aygiJTA4bHggIiwgKnN0YWNrKyspOwogCX0KLQlwcmludGsoIlxuIiBLRVJOX0VNRVJHICJDYWxsIFRyYWNlOlxuIik7Ci0Jc2hvd190cmFjZSh0YXNrLCBlc3ApOworCXByaW50aygiXG4iKTsKKwlwcmludGsobG9nX2x2bCk7CisJcHJpbnRrKCJDYWxsIFRyYWNlOlxuIik7CisJc2hvd190cmFjZV9sb2dfbHZsKHRhc2ssIGVzcCwgbG9nX2x2bCk7Cit9CisKK3ZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmVzcCkKK3sKKwlzaG93X3N0YWNrX2xvZ19sdmwodGFzaywgZXNwLCAiIik7CiB9CiAKIC8qCkBAIC0yMzgsNyArMjU5LDcgQEAKIAkJdTggX191c2VyICplaXA7CiAKIAkJcHJpbnRrKCJcbiIgS0VSTl9FTUVSRyAiU3RhY2s6ICIpOwotCQlzaG93X3N0YWNrKE5VTEwsICh1bnNpZ25lZCBsb25nKillc3ApOworCQlzaG93X3N0YWNrX2xvZ19sdmwoTlVMTCwgKHVuc2lnbmVkIGxvbmcgKillc3AsIEtFUk5fRU1FUkcpOwogCiAJCXByaW50ayhLRVJOX0VNRVJHICJDb2RlOiAiKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9maXh1cC5jIGIvYXJjaC9pMzg2L3BjaS9maXh1cC5jCmluZGV4IDY1ZjY3MDcuLjgzYzM2NDUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvZml4dXAuYworKysgYi9hcmNoL2kzODYvcGNpL2ZpeHVwLmMKQEAgLTQ0OSwzICs0NDksMTkgQEAKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0VOQUJMRShQQ0lfVkVORE9SX0lEX1RJLCAweDgwMzIsCiAJCQkgcGNpX3Bvc3RfZml4dXBfdG9zaGliYV9vaGNpMTM5NCk7CisKKworLyoKKyAqIFByZXZlbnQgdGhlIEJJT1MgdHJhcHBpbmcgYWNjZXNzZXMgdG8gdGhlIEN5cml4IENTNTUzMEEgdmlkZW8gZGV2aWNlCisgKiBjb25maWd1cmF0aW9uIHNwYWNlLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX2Vhcmx5X2ZpeHVwX2N5cml4XzU1MzAoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1OCByOworCS8qIGNsZWFyICdGNCBWaWRlbyBDb25maWd1cmF0aW9uIFRyYXAnIGJpdCAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0MiwgJnIpOworCXIgJj0gMHhmZDsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQyLCByKTsKK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUzMF9MRUdBQ1ksCisJCQlwY2lfZWFybHlfZml4dXBfY3lyaXhfNTUzMCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy9nZW5zcGFyc2VfZGVmY29uZmlnIGIvYXJjaC9pYTY0L2NvbmZpZ3MvZ2Vuc3BhcnNlX2RlZmNvbmZpZwppbmRleCA4MGY4NjYzLi4xZDA3ZDgwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy9nZW5zcGFyc2VfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbnNwYXJzZV9kZWZjb25maWcKQEAgLTcwMSw2ICs3MDEsNyBAQAogQ09ORklHX1NFUklBTF9TR0lfTDFfQ09OU09MRT15CiAjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfU0dJX0lPQzQ9eQorQ09ORklHX1NFUklBTF9TR0lfSU9DMz15CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgpAQCAtMTA0Niw2ICsxMDQ3LDcgQEAKICMgU04gRGV2aWNlcwogIwogQ09ORklHX1NHSV9JT0M0PXkKK0NPTkZJR19TR0lfSU9DMz15CiAKICMKICMgRmlsZSBzeXN0ZW1zCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy9zbjJfZGVmY29uZmlnIGIvYXJjaC9pYTY0L2NvbmZpZ3Mvc24yX2RlZmNvbmZpZwppbmRleCBmZjhiYjM3Li4zY2I1MDNiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy9zbjJfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL3NuMl9kZWZjb25maWcKQEAgLTY1OSw2ICs2NTksNyBAQAogQ09ORklHX1NFUklBTF9TR0lfTDFfQ09OU09MRT15CiAjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfU0dJX0lPQzQ9eQorQ09ORklHX1NFUklBTF9TR0lfSU9DMz15CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgpAQCAtODk5LDYgKzkwMCw3IEBACiAjIFNOIERldmljZXMKICMKIENPTkZJR19TR0lfSU9DND15CitDT05GSUdfU0dJX0lPQzM9eQogCiAjCiAjIEZpbGUgc3lzdGVtcwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKaW5kZXggYTM0NmUxOC4uNjI2Y2RjOCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYworKysgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCkBAIC0xMDgsNyArMTA4LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY29uc29sZSAqY29uc29sZTsKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgKnRtcF9idWY7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CiAKIGV4dGVybiBzdHJ1Y3QgY29uc29sZSAqY29uc29sZV9kcml2ZXJzOyAvKiBmcm9tIGtlcm5lbC9wcmludGsuYyAqLwogCkBAIC0xNjcsMTUgKzE2Niw5IEBACiAJCQl9CiAJCX0KIAkJc2Vlbl9lc2MgPSAwOwotCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIGJyZWFrOwogCi0JCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gY2g7Ci0KLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSAwOwotCi0JCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKLQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQl0dHktPmZsaXAuY291bnQrKzsKKwkJaWYgKHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIFRUWV9OT1JNQUwpID09IDApCisJCQlicmVhazsKIAl9CiAJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TIGIvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMKaW5kZXggMmRkYmFjNi4uY2U0MjM5MSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMKQEAgLTkwMyw1ICs5MDMsNiBAQAogCWRhdGE4IDAKIAlkYXRhOCAwCiAJZGF0YTggMAorCWRhdGE4IDAJCQkJCQkJLy8gMTI4MAogCiAJLm9yZyBmc3lzY2FsbF90YWJsZSArIDgqTlJfc3lzY2FsbHMJLy8gZ3VhcmQgYWdhaW5zdCBmYWlsdXJlcyB0byBpbmNyZWFzZSBOUl9zeXNjYWxscwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMgYi9hcmNoL2lhNjQva2VybmVsL2pwcm9iZXMuUwppbmRleCAyMzIzMzc3Li41Y2Q2MjI2ZiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMKQEAgLTYwLDMgKzYwLDMwIEBACiBHTE9CQUxfRU5UUlkoanByb2JlX2luc3RfcmV0dXJuKQogCWJyLmNhbGwuc3B0ay5tYW55IGIwPWpwcm9iZV9icmVhawogRU5EKGpwcm9iZV9pbnN0X3JldHVybikKKworR0xPQkFMX0VOVFJZKGludmFsaWRhdGVfc3RhY2tlZF9yZWdzKQorCW1vdmwgcjE2PWludmFsaWRhdGVfcmVzdG9yZV9jZm0KKwk7OworCW1vdiBiNj1yMTYKKwk7OworCWJyLnJldC5zcHRrLm1hbnkgYjYKKwk7OworaW52YWxpZGF0ZV9yZXN0b3JlX2NmbToKKwltb3YgcjE2PWFyLnJzYworCTs7CisJbW92IGFyLnJzYz1yMAorCTs7CisJbG9hZHJzCisJOzsKKwltb3YgYXIucnNjPXIxNgorCTs7CisJYnIuY29uZC5zcHRrLm1hbnkgcnAKK0VORChpbnZhbGlkYXRlX3N0YWNrZWRfcmVncykKKworR0xPQkFMX0VOVFJZKGZsdXNoX3JlZ2lzdGVyX3N0YWNrKQorCS8vIGZsdXNoIGRpcnR5IHJlZ3MgdG8gYmFja2luZyBzdG9yZSAobXVzdCBiZSBmaXJzdCBpbiBpbnNuIGdyb3VwKQorCWZsdXNocnMKKwk7OworCWJyLnJldC5zcHRrLm1hbnkgcnAKK0VORChmbHVzaF9yZWdpc3Rlcl9zdGFjaykKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwppbmRleCAzNDZmZWRmLi41MGFlOGM3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwpAQCAtNzY2LDExICs3NjYsNTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdHJ1Y3QgcGFyYW1fYnNwX2NmbSB7CisJdW5zaWduZWQgbG9uZyBpcDsKKwl1bnNpZ25lZCBsb25nICpic3A7CisJdW5zaWduZWQgbG9uZyBjZm07Cit9OworCitzdGF0aWMgdm9pZCBpYTY0X2dldF9ic3BfY2ZtKHN0cnVjdCB1bndfZnJhbWVfaW5mbyAqaW5mbywgdm9pZCAqYXJnKQoreworCXVuc2lnbmVkIGxvbmcgaXA7CisJc3RydWN0IHBhcmFtX2JzcF9jZm0gKmxwID0gYXJnOworCisJZG8geworCQl1bndfZ2V0X2lwKGluZm8sICZpcCk7CisJCWlmIChpcCA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChpcCA9PSBscC0+aXApIHsKKwkJCXVud19nZXRfYnNwKGluZm8sICh1bnNpZ25lZCBsb25nKikmbHAtPmJzcCk7CisJCQl1bndfZ2V0X2NmbShpbmZvLCAodW5zaWduZWQgbG9uZyopJmxwLT5jZm0pOworCQkJcmV0dXJuOworCQl9CisJfSB3aGlsZSAodW53X3Vud2luZChpbmZvKSA+PSAwKTsKKwlscC0+YnNwID0gMDsKKwlscC0+Y2ZtID0gMDsKKwlyZXR1cm47Cit9CisKIGludCBfX2twcm9iZXMgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBqcHJvYmUgKmpwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBqcHJvYmUsIGtwKTsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAoKHN0cnVjdCBmbnB0ciAqKShqcC0+ZW50cnkpKS0+aXA7CiAJc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYiA9IGdldF9rcHJvYmVfY3RsYmxrKCk7CisJc3RydWN0IHBhcmFtX2JzcF9jZm0gcGE7CisJaW50IGJ5dGVzOworCisJLyoKKwkgKiBDYWxsZWUgb3ducyB0aGUgYXJndW1lbnQgc3BhY2UgYW5kIGNvdWxkIG92ZXJ3cml0ZSBpdCwgZWcKKwkgKiB0YWlsIGNhbGwgb3B0aW1pemF0aW9uLiBTbyB0byBiZSBhYnNvbHV0ZWx5IHNhZmUKKwkgKiB3ZSBzYXZlIHRoZSBhcmd1bWVudCBzcGFjZSBiZWZvcmUgdHJhbnNmZXJpbmcgdGhlIGNvbnRyb2wKKwkgKiB0byBpbnN0cnVtZW50ZWQganByb2JlIGZ1bmN0aW9uIHdoaWNoIHJ1bnMgaW4KKwkgKiB0aGUgcHJvY2VzcyBjb250ZXh0CisJICovCisJcGEuaXAgPSByZWdzLT5jcl9paXA7CisJdW53X2luaXRfcnVubmluZyhpYTY0X2dldF9ic3BfY2ZtLCAmcGEpOworCWJ5dGVzID0gKGNoYXIgKilpYTY0X3JzZV9za2lwX3JlZ3MocGEuYnNwLCBwYS5jZm0gJiAweDNmKQorCQkJCS0gKGNoYXIgKilwYS5ic3A7CisJbWVtY3B5KCBrY2ItPmpwcm9iZXNfc2F2ZWRfc3RhY2tlZF9yZWdzLAorCQlwYS5ic3AsCisJCWJ5dGVzICk7CisJa2NiLT5ic3AgPSBwYS5ic3A7CisJa2NiLT5jZm0gPSBwYS5jZm07CiAKIAkvKiBzYXZlIGFyY2hpdGVjdHVyYWwgc3RhdGUgKi8KIAlrY2ItPmpwcm9iZV9zYXZlZF9yZWdzID0gKnJlZ3M7CkBAIC03OTIsOCArODM3LDIwIEBACiBpbnQgX19rcHJvYmVzIGxvbmdqbXBfYnJlYWtfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiID0gZ2V0X2twcm9iZV9jdGxibGsoKTsKKwlpbnQgYnl0ZXM7CiAKKwkvKiByZXN0b3JpbmcgYXJjaGl0ZWN0dXJhbCBzdGF0ZSAqLwogCSpyZWdzID0ga2NiLT5qcHJvYmVfc2F2ZWRfcmVnczsKKworCS8qIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgYXJndW1lbnQgc3BhY2UgKi8KKwlmbHVzaF9yZWdpc3Rlcl9zdGFjaygpOworCWJ5dGVzID0gKGNoYXIgKilpYTY0X3JzZV9za2lwX3JlZ3Moa2NiLT5ic3AsIGtjYi0+Y2ZtICYgMHgzZikKKwkJCQktIChjaGFyICopa2NiLT5ic3A7CisJbWVtY3B5KCBrY2ItPmJzcCwKKwkJa2NiLT5qcHJvYmVzX3NhdmVkX3N0YWNrZWRfcmVncywKKwkJYnl0ZXMgKTsKKwlpbnZhbGlkYXRlX3N0YWNrZWRfcmVncygpOworCiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9tY2FfYXNtLlMgYi9hcmNoL2lhNjQva2VybmVsL21jYV9hc20uUwppbmRleCBkYjMyZmMxLi40MDNhODBhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21jYV9hc20uUworKysgYi9hcmNoL2lhNjQva2VybmVsL21jYV9hc20uUwpAQCAtODQ3LDcgKzg0Nyw3IEBACiAJOzsKIAltb3YgY3IuaWltPXRlbXAzCiAJbW92IGNyLmloYT10ZW1wNAotCWRlcCByMjI9MCxyMjIsNjIsMgkvLyBwYWxfbWluX3N0YXRlLCBwaHlzaWNhbCwgdW5jYWNoZWQKKwlkZXAgcjIyPTAscjIyLDYyLDEJLy8gcGFsX21pbl9zdGF0ZSwgcGh5c2ljYWwsIHVuY2FjaGVkCiAJbW92IElBNjRfS1IoQ1VSUkVOVCk9cjIxCiAJbGQ4IHI4PVt0ZW1wMV0JCS8vIG9zX3N0YXR1cwogCWxkOCByMTA9W3RlbXAyXQkJLy8gY29udGV4dApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zYWxpbmZvLmMgYi9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYwppbmRleCBhODdhMTYyLi45ZDVhODIzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDcmVhdGVzIGVudHJpZXMgaW4gL3Byb2Mvc2FsIGZvciB2YXJpb3VzIHN5c3RlbSBmZWF0dXJlcy4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBDbwogICoJQmpvcm4gSGVsZ2FhcyA8Ympvcm4uaGVsZ2Fhc0BocC5jb20+CiAgKgpAQCAtMjcsOSArMjcsMTcgQEAKICAqICAgbWNhLmMgbWF5IG5vdCBwYXNzIGEgYnVmZmVyLCBhIE5VTEwgYnVmZmVyIGp1c3QgaW5kaWNhdGVzIHRoYXQgYSBuZXcKICAqICAgcmVjb3JkIGlzIGF2YWlsYWJsZSBpbiBTQUwuCiAgKiAgIFJlcGxhY2Ugc29tZSBOUl9DUFVTIGJ5IGNwdXNfb25saW5lLCBmb3IgaG90cGx1ZyBjcHUuCisgKgorICogSmFuICA1IDIwMDYgICAgICAgIGthb3NAc2dpLmNvbQorICogICBIYW5kbGUgaG90cGx1ZyBjcHVzIGNvbWluZyBvbmxpbmUuCisgKiAgIEhhbmRsZSBob3RwbHVnIGNwdXMgZ29pbmcgb2ZmbGluZSB3aGlsZSB0aGV5IHN0aWxsIGhhdmUgb3V0c3RhbmRpbmcgcmVjb3Jkcy4KKyAqICAgVXNlIHRoZSBjcHVfKiBtYWNyb3MgY29uc2lzdGVudGx5LgorICogICBSZXBsYWNlIHRoZSBjb3VudGluZyBzZW1hcGhvcmUgd2l0aCBhIG11dGV4IGFuZCBhIHRlc3QgaWYgdGhlIGNwdW1hc2sgaXMgbm9uLWVtcHR5LgorICogICBNb2RpZnkgdGhlIGxvY2tpbmcgdG8gbWFrZSB0aGUgdGVzdCBmb3IgIndvcmsgdG8gZG8iIGFuIGF0b21pYyBvcGVyYXRpb24uCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTEzMiw4ICsxNDAsOCBAQAogfTsKIAogc3RydWN0IHNhbGluZm9fZGF0YSB7Ci0Jdm9sYXRpbGUgY3B1bWFza190CWNwdV9ldmVudDsJLyogd2hpY2ggY3B1cyBoYXZlIG91dHN0YW5kaW5nIGV2ZW50cyAqLwotCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwkJLyogY291bnQgb2YgY3B1cyB3aXRoIG91dHN0YW5kaW5nIGV2ZW50cyAoYml0cyBzZXQgaW4gY3B1X2V2ZW50KSAqLworCWNwdW1hc2tfdAkJY3B1X2V2ZW50OwkvKiB3aGljaCBjcHVzIGhhdmUgb3V0c3RhbmRpbmcgZXZlbnRzICovCisJc3RydWN0IHNlbWFwaG9yZQltdXRleDsKIAl1OAkJCSpsb2dfYnVmZmVyOwogCXU2NAkJCWxvZ19zaXplOwogCXU4CQkJKm9lbWRhdGE7CS8qIGRlY29kZWQgb2VtIGRhdGEgKi8KQEAgLTE3NCw2ICsxODIsMjEgQEAKIAlpbnQgcmV0OwogfTsKIAorLyogS2ljayB0aGUgbXV0ZXggdGhhdCB0ZWxscyB1c2VyIHNwYWNlIHRoYXQgdGhlcmUgaXMgd29yayB0byBkby4gIEluc3RlYWQgb2YKKyAqIHRyeWluZyB0byB0cmFjayB0aGUgc3RhdGUgb2YgdGhlIG11dGV4IGFjcm9zcyBtdWx0aXBsZSBjcHVzLCBpbiB1c2VyCisgKiBjb250ZXh0LCBpbnRlcnJ1cHQgY29udGV4dCwgbm9uLW1hc2thYmxlIGludGVycnVwdCBjb250ZXh0IGFuZCBob3RwbHVnIGNwdSwKKyAqIGl0IGlzIGZhciBlYXNpZXIganVzdCB0byBncmFiIHRoZSBtdXRleCBpZiBpdCBpcyBmcmVlIHRoZW4gcmVsZWFzZSBpdC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgd2l0aCBkYXRhX3NhdmVkX2xvY2sgaGVsZCwgdG8gbWFrZSB0aGUgZG93bi91cAorICogb3BlcmF0aW9uIGF0b21pYy4KKyAqLworc3RhdGljIHZvaWQKK3NhbGluZm9fd29ya190b19kbyhzdHJ1Y3Qgc2FsaW5mb19kYXRhICpkYXRhKQoreworCWRvd25fdHJ5bG9jaygmZGF0YS0+bXV0ZXgpOworCXVwKCZkYXRhLT5tdXRleCk7Cit9CisKIHN0YXRpYyB2b2lkCiBzYWxpbmZvX3BsYXRmb3JtX29lbWRhdGFfY3B1KHZvaWQgKmNvbnRleHQpCiB7CkBAIC0yMTIsOSArMjM1LDkgQEAKIAogCUJVR19PTih0eXBlID49IEFSUkFZX1NJWkUoc2FsaW5mb19sb2dfbmFtZSkpOwogCisJaWYgKGlycXNhZmUpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKIAlpZiAoYnVmZmVyKSB7Ci0JCWlmIChpcnFzYWZlKQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOwogCQlmb3IgKGkgPSAwLCBkYXRhX3NhdmVkID0gZGF0YS0+ZGF0YV9zYXZlZDsgaSA8IHNhdmVkX3NpemU7ICsraSwgKytkYXRhX3NhdmVkKSB7CiAJCQlpZiAoIWRhdGFfc2F2ZWQtPmJ1ZmZlcikKIAkJCQlicmVhazsKQEAgLTIzMiwxMyArMjU1LDExIEBACiAJCQlkYXRhX3NhdmVkLT5zaXplID0gc2l6ZTsKIAkJCWRhdGFfc2F2ZWQtPmJ1ZmZlciA9IGJ1ZmZlcjsKIAkJfQotCQlpZiAoaXJxc2FmZSkKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOwogCX0KLQotCWlmICghdGVzdF9hbmRfc2V0X2JpdChzbXBfcHJvY2Vzc29yX2lkKCksICZkYXRhLT5jcHVfZXZlbnQpKSB7Ci0JCWlmIChpcnFzYWZlKQotCQkJdXAoJmRhdGEtPnNlbSk7CisJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGRhdGEtPmNwdV9ldmVudCk7CisJaWYgKGlycXNhZmUpIHsKKwkJc2FsaW5mb193b3JrX3RvX2RvKGRhdGEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKIAl9CiB9CiAKQEAgLTI0OSwyMCArMjcwLDE3IEBACiBzdGF0aWMgdm9pZAogc2FsaW5mb190aW1lb3V0X2NoZWNrKHN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGEpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpZiAoIWRhdGEtPm9wZW4pCiAJCXJldHVybjsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJaWYgKHRlc3RfYml0KGksICZkYXRhLT5jcHVfZXZlbnQpKSB7Ci0JCQkvKiBkb3VibGUgdXAoKSBpcyBub3QgYSBwcm9ibGVtLCB1c2VyIHNwYWNlIHdpbGwgc2VlIG5vCi0JCQkgKiByZWNvcmRzIGZvciB0aGUgYWRkaXRpb25hbCAiZXZlbnRzIi4KLQkJCSAqLwotCQkJdXAoJmRhdGEtPnNlbSk7Ci0JCX0KKwlpZiAoIWNwdXNfZW1wdHkoZGF0YS0+Y3B1X2V2ZW50KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CisJCXNhbGluZm9fd29ya190b19kbyhkYXRhKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCAKK3N0YXRpYyB2b2lkCiBzYWxpbmZvX3RpbWVvdXQgKHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXNhbGluZm9fdGltZW91dF9jaGVjayhzYWxpbmZvX2RhdGEgKyBTQUxfSU5GT19UWVBFX01DQSk7CkBAIC0yOTAsMTYgKzMwOCwyMCBAQAogCWludCBpLCBuLCBjcHUgPSAtMTsKIAogcmV0cnk6Ci0JaWYgKGRvd25fdHJ5bG9jaygmZGF0YS0+c2VtKSkgeworCWlmIChjcHVzX2VtcHR5KGRhdGEtPmNwdV9ldmVudCkgJiYgZG93bl90cnlsb2NrKCZkYXRhLT5tdXRleCkpIHsKIAkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQogCQkJcmV0dXJuIC1FQUdBSU47Ci0JCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRhdGEtPnNlbSkpCisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRhdGEtPm11dGV4KSkKIAkJCXJldHVybiAtRUlOVFI7CiAJfQogCiAJbiA9IGRhdGEtPmNwdV9jaGVjazsKIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmICh0ZXN0X2JpdChuLCAmZGF0YS0+Y3B1X2V2ZW50KSAmJiBjcHVfb25saW5lKG4pKSB7CisJCWlmIChjcHVfaXNzZXQobiwgZGF0YS0+Y3B1X2V2ZW50KSkgeworCQkJaWYgKCFjcHVfb25saW5lKG4pKSB7CisJCQkJY3B1X2NsZWFyKG4sIGRhdGEtPmNwdV9ldmVudCk7CisJCQkJY29udGludWU7CisJCQl9CiAJCQljcHUgPSBuOwogCQkJYnJlYWs7CiAJCX0KQEAgLTMxMCw5ICszMzIsNiBAQAogCWlmIChjcHUgPT0gLTEpCiAJCWdvdG8gcmV0cnk7CiAKLQkvKiBldmVudHMgYXJlIHN0aWNreSB1bnRpbCB0aGUgdXNlciBzYXlzICJjbGVhciIgKi8KLQl1cCgmZGF0YS0+c2VtKTsKLQogCS8qIGZvciBuZXh0IHJlYWQsIHN0YXJ0IGNoZWNraW5nIGF0IG5leHQgQ1BVICovCiAJZGF0YS0+Y3B1X2NoZWNrID0gY3B1OwogCWlmICgrK2RhdGEtPmNwdV9jaGVjayA9PSBOUl9DUFVTKQpAQCAtMzgxLDEwICs0MDAsOCBAQAogc3RhdGljIHZvaWQKIGNhbGxfb25fY3B1KGludCBjcHUsIHZvaWQgKCpmbikodm9pZCAqKSwgdm9pZCAqYXJnKQogewotCWNwdW1hc2tfdCBzYXZlX2NwdXNfYWxsb3dlZCwgbmV3X2NwdXNfYWxsb3dlZDsKLQltZW1jcHkoJnNhdmVfY3B1c19hbGxvd2VkLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkLCBzaXplb2Yoc2F2ZV9jcHVzX2FsbG93ZWQpKTsKLQltZW1zZXQoJm5ld19jcHVzX2FsbG93ZWQsIDAsIHNpemVvZihuZXdfY3B1c19hbGxvd2VkKSk7Ci0Jc2V0X2JpdChjcHUsICZuZXdfY3B1c19hbGxvd2VkKTsKKwljcHVtYXNrX3Qgc2F2ZV9jcHVzX2FsbG93ZWQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJY3B1bWFza190IG5ld19jcHVzX2FsbG93ZWQgPSBjcHVtYXNrX29mX2NwdShjcHUpOwogCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgbmV3X2NwdXNfYWxsb3dlZCk7CiAJKCpmbikoYXJnKTsKIAlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVfY3B1c19hbGxvd2VkKTsKQEAgLTQzMywxMCArNDUwLDEwIEBACiAJaWYgKCFkYXRhLT5zYXZlZF9udW0pCiAJCWNhbGxfb25fY3B1KGNwdSwgc2FsaW5mb19sb2dfcmVhZF9jcHUsIGRhdGEpOwogCWlmICghZGF0YS0+bG9nX3NpemUpIHsKLQkgICAgICAgIGRhdGEtPnN0YXRlID0gU1RBVEVfTk9fREFUQTsKLQkgICAgICAgIGNsZWFyX2JpdChjcHUsICZkYXRhLT5jcHVfZXZlbnQpOworCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX05PX0RBVEE7CisJCWNwdV9jbGVhcihjcHUsIGRhdGEtPmNwdV9ldmVudCk7CiAJfSBlbHNlIHsKLQkgICAgICAgIGRhdGEtPnN0YXRlID0gU1RBVEVfTE9HX1JFQ09SRDsKKwkJZGF0YS0+c3RhdGUgPSBTVEFURV9MT0dfUkVDT1JEOwogCX0KIH0KIApAQCAtNDczLDI3ICs0OTAsMzEgQEAKIHNhbGluZm9fbG9nX2NsZWFyKHN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGEsIGludCBjcHUpCiB7CiAJc2FsX2xvZ19yZWNvcmRfaGVhZGVyX3QgKnJoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOwogCWRhdGEtPnN0YXRlID0gU1RBVEVfTk9fREFUQTsKLQlpZiAoIXRlc3RfYml0KGNwdSwgJmRhdGEtPmNwdV9ldmVudCkpCi0JCXJldHVybiAwOwotCWRvd24oJmRhdGEtPnNlbSk7Ci0JY2xlYXJfYml0KGNwdSwgJmRhdGEtPmNwdV9ldmVudCk7Ci0JaWYgKGRhdGEtPnNhdmVkX251bSkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7Ci0JCXNoaWZ0MV9kYXRhX3NhdmVkKGRhdGEsIGRhdGEtPnNhdmVkX251bSAtIDEgKTsKLQkJZGF0YS0+c2F2ZWRfbnVtID0gMDsKKwlpZiAoIWNwdV9pc3NldChjcHUsIGRhdGEtPmNwdV9ldmVudCkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOwogCX0KKwljcHVfY2xlYXIoY3B1LCBkYXRhLT5jcHVfZXZlbnQpOworCWlmIChkYXRhLT5zYXZlZF9udW0pIHsKKwkJc2hpZnQxX2RhdGFfc2F2ZWQoZGF0YSwgZGF0YS0+c2F2ZWRfbnVtIC0gMSk7CisJCWRhdGEtPnNhdmVkX251bSA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOwogCXJoID0gKHNhbF9sb2dfcmVjb3JkX2hlYWRlcl90ICopKGRhdGEtPmxvZ19idWZmZXIpOwogCS8qIENvcnJlY3RlZCBlcnJvcnMgaGF2ZSBhbHJlYWR5IGJlZW4gY2xlYXJlZCBmcm9tIFNBTCAqLwogCWlmIChyaC0+c2V2ZXJpdHkgIT0gc2FsX2xvZ19zZXZlcml0eV9jb3JyZWN0ZWQpCiAJCWNhbGxfb25fY3B1KGNwdSwgc2FsaW5mb19sb2dfY2xlYXJfY3B1LCBkYXRhKTsKIAkvKiBjbGVhcmluZyBhIHJlY29yZCBtYXkgbWFrZSBhIG5ldyByZWNvcmQgdmlzaWJsZSAqLwogCXNhbGluZm9fbG9nX25ld19yZWFkKGNwdSwgZGF0YSk7Ci0JaWYgKGRhdGEtPnN0YXRlID09IFNUQVRFX0xPR19SRUNPUkQgJiYKLQkgICAgIXRlc3RfYW5kX3NldF9iaXQoY3B1LCAgJmRhdGEtPmNwdV9ldmVudCkpCi0JCXVwKCZkYXRhLT5zZW0pOworCWlmIChkYXRhLT5zdGF0ZSA9PSBTVEFURV9MT0dfUkVDT1JEKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJY3B1X3NldChjcHUsIGRhdGEtPmNwdV9ldmVudCk7CisJCXNhbGluZm9fd29ya190b19kbyhkYXRhKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC01NTAsNiArNTcxLDUzIEBACiAJLndyaXRlICAgPSBzYWxpbmZvX2xvZ193cml0ZSwKIH07CiAKKyNpZmRlZglDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzYWxpbmZvX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGE7CisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9PTkxJTkU6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJZm9yIChpID0gMCwgZGF0YSA9IHNhbGluZm9fZGF0YTsKKwkJICAgICBpIDwgQVJSQVlfU0laRShzYWxpbmZvX2RhdGEpOworCQkgICAgICsraSwgKytkYXRhKSB7CisJCQljcHVfc2V0KGNwdSwgZGF0YS0+Y3B1X2V2ZW50KTsKKwkJCXNhbGluZm9fd29ya190b19kbyhkYXRhKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfREVBRDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOworCQlmb3IgKGkgPSAwLCBkYXRhID0gc2FsaW5mb19kYXRhOworCQkgICAgIGkgPCBBUlJBWV9TSVpFKHNhbGluZm9fZGF0YSk7CisJCSAgICAgKytpLCArK2RhdGEpIHsKKwkJCXN0cnVjdCBzYWxpbmZvX2RhdGFfc2F2ZWQgKmRhdGFfc2F2ZWQ7CisJCQlpbnQgajsKKwkJCWZvciAoaiA9IEFSUkFZX1NJWkUoZGF0YS0+ZGF0YV9zYXZlZCkgLSAxLCBkYXRhX3NhdmVkID0gZGF0YS0+ZGF0YV9zYXZlZCArIGo7CisJCQkgICAgIGogPj0gMDsKKwkJCSAgICAgLS1qLCAtLWRhdGFfc2F2ZWQpIHsKKwkJCQlpZiAoZGF0YV9zYXZlZC0+YnVmZmVyICYmIGRhdGFfc2F2ZWQtPmNwdSA9PSBjcHUpIHsKKwkJCQkJc2hpZnQxX2RhdGFfc2F2ZWQoZGF0YSwgaik7CisJCQkJfQorCQkJfQorCQkJY3B1X2NsZWFyKGNwdSwgZGF0YS0+Y3B1X2V2ZW50KTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2FsaW5mb19jcHVfbm90aWZpZXIgPQoreworCS5ub3RpZmllcl9jYWxsID0gc2FsaW5mb19jcHVfY2FsbGJhY2ssCisJLnByaW9yaXR5ID0gMCwKK307CisjZW5kaWYJLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisKIHN0YXRpYyBpbnQgX19pbml0CiBzYWxpbmZvX2luaXQodm9pZCkKIHsKQEAgLTU1Nyw3ICs2MjUsNyBAQAogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKnNkaXIgPSBzYWxpbmZvX3Byb2NfZW50cmllczsgLyoga2VlcHMgdHJhY2sgb2YgZXZlcnkgZW50cnkgKi8KIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpciwgKmVudHJ5OwogCXN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGE7Ci0JaW50IGksIGosIG9ubGluZTsKKwlpbnQgaSwgajsKIAogCXNhbGluZm9fZGlyID0gcHJvY19ta2Rpcigic2FsIiwgTlVMTCk7CiAJaWYgKCFzYWxpbmZvX2RpcikKQEAgLTU3Miw3ICs2NDAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNhbGluZm9fbG9nX25hbWUpOyBpKyspIHsKIAkJZGF0YSA9IHNhbGluZm9fZGF0YSArIGk7CiAJCWRhdGEtPnR5cGUgPSBpOwotCQlzZW1hX2luaXQoJmRhdGEtPnNlbSwgMCk7CisJCWluaXRfTVVURVgoJmRhdGEtPm11dGV4KTsKIAkJZGlyID0gcHJvY19ta2RpcihzYWxpbmZvX2xvZ19uYW1lW2ldLCBzYWxpbmZvX2Rpcik7CiAJCWlmICghZGlyKQogCQkJY29udGludWU7CkBAIC01OTIsMTIgKzY2MCw4IEBACiAJCSpzZGlyKysgPSBlbnRyeTsKIAogCQkvKiB3ZSBtaXNzZWQgYW55IGV2ZW50cyBiZWZvcmUgbm93ICovCi0JCW9ubGluZSA9IDA7Ci0JCWZvcl9lYWNoX29ubGluZV9jcHUoaikgewotCQkJc2V0X2JpdChqLCAmZGF0YS0+Y3B1X2V2ZW50KTsKLQkJCSsrb25saW5lOwotCQl9Ci0JCXNlbWFfaW5pdCgmZGF0YS0+c2VtLCBvbmxpbmUpOworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCisJCQljcHVfc2V0KGosIGRhdGEtPmNwdV9ldmVudCk7CiAKIAkJKnNkaXIrKyA9IGRpcjsKIAl9CkBAIC02MDksNiArNjczLDEwIEBACiAJc2FsaW5mb190aW1lci5mdW5jdGlvbiA9ICZzYWxpbmZvX3RpbWVvdXQ7CiAJYWRkX3RpbWVyKCZzYWxpbmZvX3RpbWVyKTsKIAorI2lmZGVmCUNPTkZJR19IT1RQTFVHX0NQVQorCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc2FsaW5mb19jcHVfbm90aWZpZXIpOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCmluZGV4IGQzZTBlY2IuLjU1MzkxOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKQEAgLTUzMCwxMiArNTMwLDE1IEBACiAJCWlmIChmc3lzX21vZGUoY3VycmVudCwgJnJlZ3MpKSB7CiAJCQlleHRlcm4gY2hhciBfX2tlcm5lbF9zeXNjYWxsX3ZpYV9icmVha1tdOwogCQkJLyoKLQkJCSAqIEdvdCBhIHRyYXAgaW4gZnN5cy1tb2RlOiBUYWtlbiBCcmFuY2ggVHJhcCBhbmQgU2luZ2xlIFN0ZXAgdHJhcAotCQkJICogbmVlZCBzcGVjaWFsIGhhbmRsaW5nOyBEZWJ1ZyB0cmFwIGlzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW4uCisJCQkgKiBHb3QgYSB0cmFwIGluIGZzeXMtbW9kZTogVGFrZW4gQnJhbmNoIFRyYXAKKwkJCSAqIGFuZCBTaW5nbGUgU3RlcCB0cmFwIG5lZWQgc3BlY2lhbCBoYW5kbGluZzsKKwkJCSAqIERlYnVnIHRyYXAgaXMgaWdub3JlZCAod2UgZGlzYWJsZSBpdCBoZXJlCisJCQkgKiBhbmQgcmUtZW5hYmxlIGl0IGluIHRoZSBsb3dlci1wcml2aWxlZ2UgdHJhcCkuCiAJCQkgKi8KIAkJCWlmICh1bmxpa2VseSh2ZWN0b3IgPT0gMjkpKSB7Ci0JCQkJZGllKCJHb3QgZGVidWcgdHJhcCBpbiBmc3lzLW1vZGUtLS1ub3Qgc3VwcG9zZWQgdG8gaGFwcGVuISIsCi0JCQkJICAgICZyZWdzLCAwKTsKKwkJCQlzZXRfdGhyZWFkX2ZsYWcoVElGX0RCX0RJU0FCTEVEKTsKKwkJCQlpYTY0X3BzcigmcmVncyktPmRiID0gMDsKKwkJCQlpYTY0X3BzcigmcmVncyktPmxwID0gMTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQkvKiByZS1kbyB0aGUgc3lzdGVtIGNhbGwgdmlhIGJyZWFrIDB4MTAwMDAwOiAqLwpAQCAtNTg5LDEwICs1OTIsMTkgQEAKIAkgICAgICBjYXNlIDM0OgogCQlpZiAoaXNyICYgMHgyKSB7CiAJCQkvKiBMb3dlci1Qcml2aWxlZ2UgVHJhbnNmZXIgVHJhcCAqLworCisJCQkvKiBJZiB3ZSBkaXNhYmxlZCBkZWJ1ZyB0cmFwcyBkdXJpbmcgYW4gZnN5c2NhbGwsCisJCQkgKiByZS1lbmFibGUgdGhlbSBoZXJlLgorCQkJICovCisJCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfREJfRElTQUJMRUQpKSB7CisJCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX0RCX0RJU0FCTEVEKTsKKwkJCQlpYTY0X3BzcigmcmVncyktPmRiID0gMTsKKwkJCX0KKwogCQkJLyoKLQkJCSAqIEp1c3QgY2xlYXIgUFNSLmxwIGFuZCB0aGVuIHJldHVybiBpbW1lZGlhdGVseTogYWxsIHRoZQotCQkJICogaW50ZXJlc3Rpbmcgd29yayAoZS5nLiwgc2lnbmFsIGRlbGl2ZXJ5IGlzIGRvbmUgaW4gdGhlIGtlcm5lbAotCQkJICogZXhpdCBwYXRoKS4KKwkJCSAqIEp1c3QgY2xlYXIgUFNSLmxwIGFuZCB0aGVuIHJldHVybiBpbW1lZGlhdGVseToKKwkJCSAqIGFsbCB0aGUgaW50ZXJlc3Rpbmcgd29yayAoZS5nLiwgc2lnbmFsIGRlbGl2ZXJ5KQorCQkJICogaXMgZG9uZSBpbiB0aGUga2VybmVsIGV4aXQgcGF0aC4KIAkJCSAqLwogCQkJaWE2NF9wc3IoJnJlZ3MpLT5scCA9IDA7CiAJCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vdGxiLmMgYi9hcmNoL2lhNjQvbW0vdGxiLmMKaW5kZXggNDExMDVkNC4uNmE0ZWVjOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL3RsYi5jCisrKyBiL2FyY2gvaWE2NC9tbS90bGIuYwpAQCAtOTAsNyArOTAsNyBAQAogewogCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socHRjZ19sb2NrKTsKIAotCWlmIChtbSAhPSBjdXJyZW50LT5hY3RpdmVfbW0pIHsKKwlpZiAobW0gIT0gY3VycmVudC0+YWN0aXZlX21tIHx8ICFjdXJyZW50LT5tbSkgewogCQlmbHVzaF90bGJfYWxsKCk7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay9odWJkZXYuaCBiL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCmluZGV4IDcxYzJiMjcuLjRkNDE3YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCisrKyBiL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCkBAIC0yNiwxMSArMjYsMTQgQEAKICNkZWZpbmUgSUlPX05VTV9JVFRFUyAgIDcKICNkZWZpbmUgSFVCX05VTV9CSUdfV0lORE9XICAgICAgKElJT19OVU1fSVRURVMgLSAxKQogCi1zdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2xpc3QgeworLyogVGhpcyBzdHJ1Y3QgaXMgc2hhcmVkIGJldHdlZW4gdGhlIFBST00gYW5kIHRoZSBrZXJuZWwuCisgKiBDaGFuZ2VzIHRvIHRoaXMgc3RydWN0IHdpbGwgcmVxdWlyZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdG8gdGhlIGtlcm5lbC4KKyAqLworc3RydWN0IHNuX2ZsdXNoX2RldmljZV9jb21tb24gewogCWludCBzZmRsX2J1czsKIAlpbnQgc2ZkbF9zbG90OwogCWludCBzZmRsX3BpbjsKLQlzdHJ1Y3QgYmFyX2xpc3QgeworCXN0cnVjdCBjb21tb25fYmFyX2xpc3QgewogCQl1bnNpZ25lZCBsb25nIHN0YXJ0OwogCQl1bnNpZ25lZCBsb25nIGVuZDsKIAl9IHNmZGxfYmFyX2xpc3RbNl07CkBAIC00MCwxNCArNDMsMTkgQEAKIAl1aW50MzJfdCBzZmRsX3BlcnNpc3RlbnRfYnVzbnVtOwogCXVpbnQzMl90IHNmZGxfcGVyc2lzdGVudF9zZWdtZW50OwogCXN0cnVjdCBwY2lidXNfaW5mbyAqc2ZkbF9wY2lidXNfaW5mbzsKK307CisKKy8qIFRoaXMgc3RydWN0IGlzIGtlcm5lbCBvbmx5IGFuZCBpcyBub3QgdXNlZCBieSB0aGUgUFJPTSAqLworc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgewogCXNwaW5sb2NrX3Qgc2ZkbF9mbHVzaF9sb2NrOworCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfY29tbW9uICpjb21tb247CiB9OwogCiAvKgotICogKip3aWRnZXRfcCAtIFVzZWQgYXMgYW4gYXJyYXlbd2lkX251bV1bZGV2aWNlXSBvZiBzbl9mbHVzaF9kZXZpY2VfbGlzdC4KKyAqICoqd2lkZ2V0X3AgLSBVc2VkIGFzIGFuIGFycmF5W3dpZF9udW1dW2RldmljZV0gb2Ygc25fZmx1c2hfZGV2aWNlX2tlcm5lbC4KICAqLwogc3RydWN0IHNuX2ZsdXNoX25hc2lkX2VudHJ5ICB7Ci0Jc3RydWN0IHNuX2ZsdXNoX2RldmljZV9saXN0ICoqd2lkZ2V0X3A7IC8qIFVzZWQgYXMgYSBhcnJheSBvZiB3aWRfbnVtICovCisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKip3aWRnZXRfcDsgLy8gVXNlZCBhcyBhbiBhcnJheSBvZiB3aWRfbnVtCiAJdWludDY0X3QgaWlvX2l0dGVbOF07CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2J0ZV9lcnJvci5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9idGVfZXJyb3IuYwppbmRleCBmY2JjNzQ4Li5mMWVjMTM3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2J0ZV9lcnJvci5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvYnRlX2Vycm9yLmMKQEAgLTMzLDcgKzMzLDcgQEAKICAqIFdhaXQgdW50aWwgYWxsIEJURSByZWxhdGVkIENSQnMgYXJlIGNvbXBsZXRlZAogICogYW5kIHRoZW4gcmVzZXQgdGhlIGludGVyZmFjZXMuCiAgKi8KLXZvaWQgc2h1YjFfYnRlX2Vycm9yX2hhbmRsZXIodW5zaWduZWQgbG9uZyBfbm9kZXBkYSkKK2ludCBzaHViMV9idGVfZXJyb3JfaGFuZGxlcih1bnNpZ25lZCBsb25nIF9ub2RlcGRhKQogewogCXN0cnVjdCBub2RlcGRhX3MgKmVycl9ub2RlcGRhID0gKHN0cnVjdCBub2RlcGRhX3MgKilfbm9kZXBkYTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCAqcmVjb3ZlcnlfdGltZXIgPSAmZXJyX25vZGVwZGEtPmJ0ZV9yZWNvdmVyeV90aW1lcjsKQEAgLTUzLDcgKzUzLDcgQEAKIAkgICAgKGVycl9ub2RlcGRhLT5idGVfaWZbMV0uYmhfZXJyb3IgPT0gQlRFX1NVQ0NFU1MpKSB7CiAJCUJURV9QUklOVEsoKCJlaDolcDolZCBOb3RoaW5nIHRvIGRvLlxuIiwgZXJyX25vZGVwZGEsCiAJCQkgICAgc21wX3Byb2Nlc3Nvcl9pZCgpKSk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDE7CiAJfQogCiAJLyogRGV0ZXJtaW5lIGluZm9ybWF0aW9uIGFib3V0IG91ciBodWIgKi8KQEAgLTgxLDcgKzgxLDcgQEAKIAkJbW9kX3RpbWVyKHJlY292ZXJ5X3RpbWVyLCBIWiAqIDUpOwogCQlCVEVfUFJJTlRLKCgiZWg6JXA6JWQgTWFya2VkIEdpdmluZyB1cFxuIiwgZXJyX25vZGVwZGEsCiAJCQkgICAgc21wX3Byb2Nlc3Nvcl9pZCgpKSk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDE7CiAJfQogCWlmIChpY21yLmlpX2ljbXJfZmxkX3MuaV9jcmJfdmxkICE9IDApIHsKIApAQCAtOTksNyArOTksNyBAQAogCQkJCUJURV9QUklOVEsoKCJlaDolcDolZCBWYWxpZCAlZCwgR2l2aW5nIHVwXG4iLAogCQkJCQkgICAgZXJyX25vZGVwZGEsIHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkJCQkJICAgIGkpKTsKLQkJCQlyZXR1cm47CisJCQkJcmV0dXJuIDE7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMjQsNiArMTI0LDQyIEBACiAJUkVNT1RFX0hVQl9TKG5hc2lkLCBJSU9fSUJDUiwgaWJjci5paV9pYmNyX3JlZ3ZhbCk7CiAKIAlkZWxfdGltZXIocmVjb3ZlcnlfdGltZXIpOworCXJldHVybiAwOworfQorCisvKgorICogV2FpdCB1bnRpbCBhbGwgQlRFIHJlbGF0ZWQgQ1JCcyBhcmUgY29tcGxldGVkCisgKiBhbmQgdGhlbiByZXNldCB0aGUgaW50ZXJmYWNlcy4KKyAqLworaW50IHNodWIyX2J0ZV9lcnJvcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgX25vZGVwZGEpCit7CisJc3RydWN0IG5vZGVwZGFfcyAqZXJyX25vZGVwZGEgPSAoc3RydWN0IG5vZGVwZGFfcyAqKV9ub2RlcGRhOworCXN0cnVjdCB0aW1lcl9saXN0ICpyZWNvdmVyeV90aW1lciA9ICZlcnJfbm9kZXBkYS0+YnRlX3JlY292ZXJ5X3RpbWVyOworCXN0cnVjdCBidGVpbmZvX3MgKmJ0ZTsKKwluYXNpZF90IG5hc2lkOworCXU2NCBzdGF0dXM7CisJaW50IGk7CisKKwluYXNpZCA9IGNub2RlaWRfdG9fbmFzaWQoZXJyX25vZGVwZGEtPmJ0ZV9pZlswXS5idGVfY25vZGUpOworCisJLyoKKwkgKiBWZXJpZnkgdGhhdCBhbGwgdGhlIEJURXMgYXJlIGNvbXBsZXRlCisJICovCisJZm9yIChpID0gMDsgaSA8IEJURVNfUEVSX05PREU7IGkrKykgeworCQlidGUgPSAmZXJyX25vZGVwZGEtPmJ0ZV9pZltpXTsKKwkJc3RhdHVzID0gQlRFX0xOU1RBVF9MT0FEKGJ0ZSk7CisJCWlmICgoc3RhdHVzICYgSUJMU19FUlJPUikgfHwgIShzdGF0dXMgJiBJQkxTX0JVU1kpKQorCQkJY29udGludWU7CisJCW1vZF90aW1lcihyZWNvdmVyeV90aW1lciwgSFogKiA1KTsKKwkJQlRFX1BSSU5USygoImVoOiVwOiVkIE1hcmtlZCBHaXZpbmcgdXBcbiIsIGVycl9ub2RlcGRhLAorCQkJICAgIHNtcF9wcm9jZXNzb3JfaWQoKSkpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGlhNjRfc25fYnRlX3JlY292ZXJ5KG5hc2lkKSkKKwkJcGFuaWMoImJ0ZV9lcnJvcl9oYW5kbGVyKCk6IEZhdGFsIEJURSBFcnJvciIpOworCisJZGVsX3RpbWVyKHJlY292ZXJ5X3RpbWVyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTEzNSw3ICsxNzEsNiBAQAogCXN0cnVjdCBub2RlcGRhX3MgKmVycl9ub2RlcGRhID0gKHN0cnVjdCBub2RlcGRhX3MgKilfbm9kZXBkYTsKIAlzcGlubG9ja190ICpyZWNvdmVyeV9sb2NrID0gJmVycl9ub2RlcGRhLT5idGVfcmVjb3ZlcnlfbG9jazsKIAlpbnQgaTsKLQluYXNpZF90IG5hc2lkOwogCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwogCXZvbGF0aWxlIHU2NCAqbm90aWZ5OwogCWJ0ZV9yZXN1bHRfdCBiaF9lcnJvcjsKQEAgLTE2MCwxMiArMTk1LDE1IEBACiAJfQogCiAJaWYgKGlzX3NodWIxKCkpIHsKLQkJc2h1YjFfYnRlX2Vycm9yX2hhbmRsZXIoX25vZGVwZGEpOworCQlpZiAoc2h1YjFfYnRlX2Vycm9yX2hhbmRsZXIoX25vZGVwZGEpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJlY292ZXJ5X2xvY2ssIGlycV9mbGFncyk7CisJCQlyZXR1cm47CisJCX0KIAl9IGVsc2UgewotCQluYXNpZCA9IGNub2RlaWRfdG9fbmFzaWQoZXJyX25vZGVwZGEtPmJ0ZV9pZlswXS5idGVfY25vZGUpOwotCi0JCWlmIChpYTY0X3NuX2J0ZV9yZWNvdmVyeShuYXNpZCkpCi0JCQlwYW5pYygiYnRlX2Vycm9yX2hhbmRsZXIoKTogRmF0YWwgQlRFIEVycm9yIik7CisJCWlmIChzaHViMl9idGVfZXJyb3JfaGFuZGxlcihfbm9kZXBkYSkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmVjb3ZlcnlfbG9jaywgaXJxX2ZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBCVEVTX1BFUl9OT0RFOyBpKyspIHsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaHViZXJyb3IuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaHViZXJyb3IuYwppbmRleCA1YzVlYjAxLi41NmFiNmJhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2h1YmVycm9yLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9odWJlcnJvci5jCkBAIC0zMiwxMyArMzIsMTQgQEAKIAlyZXRfc3R1ZmYudjAgPSAwOwogCWh1YmRldl9pbmZvID0gKHN0cnVjdCBodWJkZXZfaW5mbyAqKWFyZzsKIAluYXNpZCA9IGh1YmRldl9pbmZvLT5oZGlfbmFzaWQ7Ci0JU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwgU05fU0FMX0hVQl9FUlJPUl9JTlRFUlJVUFQsCi0JCQkodTY0KSBuYXNpZCwgMCwgMCwgMCwgMCwgMCwgMCk7Ci0KLQlpZiAoKGludClyZXRfc3R1ZmYudjApCi0JCXBhbmljKCJodWJpaV9laW50X2hhbmRsZXIoKTogRmF0YWwgVElPIEVycm9yIik7CiAKIAlpZiAoaXNfc2h1YjEoKSkgeworCQlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLCBTTl9TQUxfSFVCX0VSUk9SX0lOVEVSUlVQVCwKKwkJCSh1NjQpIG5hc2lkLCAwLCAwLCAwLCAwLCAwLCAwKTsKKworCQlpZiAoKGludClyZXRfc3R1ZmYudjApCisJCQlwYW5pYygiaHViaWlfZWludF9oYW5kbGVyKCk6IEZhdGFsIFRJTyBFcnJvciIpOworCiAJCWlmICghKG5hc2lkICYgMSkpIC8qIE5vdCBhIFRJTywgaGFuZGxlIENSQiBlcnJvcnMgKi8KIAkJCSh2b2lkKWh1Ymlpb19jcmJfZXJyb3JfaGFuZGxlcihodWJkZXZfaW5mbyk7CiAJfSBlbHNlIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYwppbmRleCAzMTgwODdlLi4yNThkOWQ3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYwpAQCAtNzYsMTEgKzc2LDEyIEBACiB9OwogCiAvKgotICogUmV0cmlldmUgdGhlIERNQSBGbHVzaCBMaXN0IGdpdmVuIG5hc2lkLiAgVGhpcyBsaXN0IGlzIG5lZWRlZCAKLSAqIHRvIGltcGxlbWVudCB0aGUgV0FSIC0gRmx1c2ggRE1BIGRhdGEgb24gUElPIFJlYWRzLgorICogUmV0cmlldmUgdGhlIERNQSBGbHVzaCBMaXN0IGdpdmVuIG5hc2lkLCB3aWRnZXQsIGFuZCBkZXZpY2UuCisgKiBUaGlzIGxpc3QgaXMgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgV0FSIC0gRmx1c2ggRE1BIGRhdGEgb24gUElPIFJlYWRzLgogICovCi1zdGF0aWMgaW5saW5lIHVpbnQ2NF90Ci1zYWxfZ2V0X3dpZGdldF9kbWFmbHVzaF9saXN0KHU2NCBuYXNpZCwgdTY0IHdpZGdldF9udW0sIHU2NCBhZGRyZXNzKQorc3RhdGljIGlubGluZSB1NjQKK3NhbF9nZXRfZGV2aWNlX2RtYWZsdXNoX2xpc3QodTY0IG5hc2lkLCB1NjQgd2lkZ2V0X251bSwgdTY0IGRldmljZV9udW0sCisJCQkgICAgIHU2NCBhZGRyZXNzKQogewogCiAJc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7CkBAIC04OCwxNyArODksMTcgQEAKIAlyZXRfc3R1ZmYudjAgPSAwOwogCiAJU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwKLQkJCSh1NjQpIFNOX1NBTF9JT0lGX0dFVF9XSURHRVRfRE1BRkxVU0hfTElTVCwKLQkJCSh1NjQpIG5hc2lkLCAodTY0KSB3aWRnZXRfbnVtLCAodTY0KSBhZGRyZXNzLCAwLCAwLCAwLAotCQkJMCk7Ci0JcmV0dXJuIHJldF9zdHVmZi52MDsKKwkJCSh1NjQpIFNOX1NBTF9JT0lGX0dFVF9ERVZJQ0VfRE1BRkxVU0hfTElTVCwKKwkJCSh1NjQpIG5hc2lkLCAodTY0KSB3aWRnZXRfbnVtLAorCQkJKHU2NCkgZGV2aWNlX251bSwgKHU2NCkgYWRkcmVzcywgMCwgMCwgMCk7CisJcmV0dXJuIHJldF9zdHVmZi5zdGF0dXM7CiAKIH0KIAogLyoKICAqIFJldHJpZXZlIHRoZSBodWIgZGV2aWNlIGluZm8gc3RydWN0dXJlIGZvciB0aGUgZ2l2ZW4gbmFzaWQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdWludDY0X3Qgc2FsX2dldF9odWJkZXZfaW5mbyh1NjQgaGFuZGxlLCB1NjQgYWRkcmVzcykKK3N0YXRpYyBpbmxpbmUgdTY0IHNhbF9nZXRfaHViZGV2X2luZm8odTY0IGhhbmRsZSwgdTY0IGFkZHJlc3MpCiB7CiAKIAlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJldF9zdHVmZjsKQEAgLTExNCw3ICsxMTUsNyBAQAogLyoKICAqIFJldHJpZXZlIHRoZSBwY2kgYnVzIGluZm9ybWF0aW9uIGdpdmVuIHRoZSBidXMgbnVtYmVyLgogICovCi1zdGF0aWMgaW5saW5lIHVpbnQ2NF90IHNhbF9nZXRfcGNpYnVzX2luZm8odTY0IHNlZ21lbnQsIHU2NCBidXNudW0sIHU2NCBhZGRyZXNzKQorc3RhdGljIGlubGluZSB1NjQgc2FsX2dldF9wY2lidXNfaW5mbyh1NjQgc2VnbWVudCwgdTY0IGJ1c251bSwgdTY0IGFkZHJlc3MpCiB7CiAKIAlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJldF9zdHVmZjsKQEAgLTEzMCw3ICsxMzEsNyBAQAogLyoKICAqIFJldHJpZXZlIHRoZSBwY2kgZGV2aWNlIGluZm9ybWF0aW9uIGdpdmVuIHRoZSBidXMgYW5kIGRldmljZXxmdW5jdGlvbiBudW1iZXIuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdWludDY0X3QKK3N0YXRpYyBpbmxpbmUgdTY0CiBzYWxfZ2V0X3BjaWRldl9pbmZvKHU2NCBzZWdtZW50LCB1NjQgYnVzX251bWJlciwgdTY0IGRldmZuLCB1NjQgcGNpX2RldiwgCiAJCQl1NjQgc25faXJxX2luZm8pCiB7CkBAIC0xNzAsMTIgKzE3MSwxMiBAQAogICovCiBzdGF0aWMgdm9pZCBzbl9maXh1cF9pb25vZGVzKHZvaWQpCiB7Ci0KLQlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2xpc3QgKnNuX2ZsdXNoX2RldmljZV9saXN0OworCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsICpzbl9mbHVzaF9kZXZpY2Vfa2VybmVsOworCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsICpkZXZfZW50cnk7CiAJc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXY7Ci0JdWludDY0X3Qgc3RhdHVzOwotCXVpbnQ2NF90IG5hc2lkOwotCWludCBpLCB3aWRnZXQ7CisJdTY0IHN0YXR1czsKKwl1NjQgbmFzaWQ7CisJaW50IGksIHdpZGdldCwgZGV2aWNlOwogCiAJLyoKIAkgKiBHZXQgU0dJIFNwZWNpZmljIEhVQiBjaGlwc2V0IGluZm9ybWF0aW9uLgpAQCAtMTg2LDcgKzE4Nyw3IEBACiAJCW5hc2lkID0gY25vZGVpZF90b19uYXNpZChpKTsKIAkJaHViZGV2LT5tYXhfc2VnbWVudF9udW1iZXIgPSAweGZmZmZmZmZmOwogCQlodWJkZXYtPm1heF9wY2lidXNfbnVtYmVyID0gMHhmZjsKLQkJc3RhdHVzID0gc2FsX2dldF9odWJkZXZfaW5mbyhuYXNpZCwgKHVpbnQ2NF90KSBfX3BhKGh1YmRldikpOworCQlzdGF0dXMgPSBzYWxfZ2V0X2h1YmRldl9pbmZvKG5hc2lkLCAodTY0KSBfX3BhKGh1YmRldikpOwogCQlpZiAoc3RhdHVzKQogCQkJY29udGludWU7CiAKQEAgLTIxMywzOCArMjE0LDQ5IEBACiAKIAkJaHViZGV2LT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcCA9CiAJCSAgICBrbWFsbG9jKChIVUJfV0lER0VUX0lEX01BWCArIDEpICoKLQkJCSAgICBzaXplb2Yoc3RydWN0IHNuX2ZsdXNoX2RldmljZV9saXN0ICopLCBHRlBfS0VSTkVMKTsKLQorCQkJICAgIHNpemVvZihzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCAqKSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKIAkJbWVtc2V0KGh1YmRldi0+aGRpX2ZsdXNoX25hc2lkX2xpc3Qud2lkZ2V0X3AsIDB4MCwKIAkJICAgICAgIChIVUJfV0lER0VUX0lEX01BWCArIDEpICoKLQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2xpc3QgKikpOworCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsICopKTsKIAogCQlmb3IgKHdpZGdldCA9IDA7IHdpZGdldCA8PSBIVUJfV0lER0VUX0lEX01BWDsgd2lkZ2V0KyspIHsKLQkJCXNuX2ZsdXNoX2RldmljZV9saXN0ID0ga21hbGxvYyhERVZfUEVSX1dJREdFVCAqCi0JCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdAotCQkJCQkJCSAgICAgIHNuX2ZsdXNoX2RldmljZV9saXN0KSwKLQkJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQkJCW1lbXNldChzbl9mbHVzaF9kZXZpY2VfbGlzdCwgMHgwLAorCQkJc25fZmx1c2hfZGV2aWNlX2tlcm5lbCA9IGttYWxsb2MoREVWX1BFUl9XSURHRVQgKgorCQkJCQkJICAgICAgICAgc2l6ZW9mKHN0cnVjdAorCQkJCQkJICAgICAgICBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsKSwKKwkJCQkJCSAgICAgICAgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXNuX2ZsdXNoX2RldmljZV9rZXJuZWwpCisJCQkJQlVHKCk7CisJCQltZW1zZXQoc25fZmx1c2hfZGV2aWNlX2tlcm5lbCwgMHgwLAogCQkJICAgICAgIERFVl9QRVJfV0lER0VUICoKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHNuX2ZsdXNoX2RldmljZV9saXN0KSk7CisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsKSk7CiAKLQkJCXN0YXR1cyA9Ci0JCQkgICAgc2FsX2dldF93aWRnZXRfZG1hZmx1c2hfbGlzdChuYXNpZCwgd2lkZ2V0LAotCQkJCQkJCSAodWludDY0X3QpCi0JCQkJCQkJIF9fcGEKLQkJCQkJCQkgKHNuX2ZsdXNoX2RldmljZV9saXN0KSk7Ci0JCQlpZiAoc3RhdHVzKSB7Ci0JCQkJa2ZyZWUoc25fZmx1c2hfZGV2aWNlX2xpc3QpOwotCQkJCWNvbnRpbnVlOworCQkJZGV2X2VudHJ5ID0gc25fZmx1c2hfZGV2aWNlX2tlcm5lbDsKKwkJCWZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDwgREVWX1BFUl9XSURHRVQ7CisJCQkgICAgIGRldmljZSsrLGRldl9lbnRyeSsrKSB7CisJCQkJZGV2X2VudHJ5LT5jb21tb24gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QKKwkJCQkJICAgICAgCSAgICAgICAgc25fZmx1c2hfZGV2aWNlX2NvbW1vbiksCisJCQkJCSAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCFkZXZfZW50cnktPmNvbW1vbikKKwkJCQkJQlVHKCk7CisJCQkJbWVtc2V0KGRldl9lbnRyeS0+Y29tbW9uLCAweDAsIHNpemVvZihzdHJ1Y3QKKwkJCQkJICAgICAJICAgICAgIHNuX2ZsdXNoX2RldmljZV9jb21tb24pKTsKKworCQkJCXN0YXR1cyA9IHNhbF9nZXRfZGV2aWNlX2RtYWZsdXNoX2xpc3QobmFzaWQsCisJCQkJCQkJCQl3aWRnZXQsCisJCQkJCQkJCSAgICAgICAJZGV2aWNlLAorCQkJCQkJICAgICAgKHU2NCkoZGV2X2VudHJ5LT5jb21tb24pKTsKKwkJCQlpZiAoc3RhdHVzKQorCQkJCQlCVUcoKTsKKworCQkJCXNwaW5fbG9ja19pbml0KCZkZXZfZW50cnktPnNmZGxfZmx1c2hfbG9jayk7CiAJCQl9CiAKLQkJCXNwaW5fbG9ja19pbml0KCZzbl9mbHVzaF9kZXZpY2VfbGlzdC0+c2ZkbF9mbHVzaF9sb2NrKTsKLQkJCWh1YmRldi0+aGRpX2ZsdXNoX25hc2lkX2xpc3Qud2lkZ2V0X3Bbd2lkZ2V0XSA9Ci0JCQkgICAgc25fZmx1c2hfZGV2aWNlX2xpc3Q7Ci0JCX0KLQorCQkJaWYgKHNuX2ZsdXNoX2RldmljZV9rZXJuZWwpCisJCQkJaHViZGV2LT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcFt3aWRnZXRdID0KKwkJCQkJCSAgICAgICBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsOworCSAgICAgICAgfQogCX0KLQogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCmluZGV4IDQ5M2ZiM2YuLjZhNzkzOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKQEAgLTc3LDEyICs3Nyw2IEBACiAJa2ZyZWUodG9fY3hfZGV2KGRldikpOwogfQogCi1zdHJ1Y3QgYnVzX3R5cGUgdGlvY3hfYnVzX3R5cGUgPSB7Ci0JLm5hbWUgPSAidGlvY3giLAotCS5tYXRjaCA9IHRpb2N4X21hdGNoLAotCS51ZXZlbnQgPSB0aW9jeF91ZXZlbnQsCi19OwotCiAvKioKICAqIGN4X2RldmljZV9tYXRjaCAtIEZpbmQgY3hfZGV2aWNlIGluIHRoZSBpZCB0YWJsZS4KICAqIEBpZHM6IGlkIHRhYmxlIGZyb20gZHJpdmVyCkBAIC0xNDksNiArMTQzLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBidXNfdHlwZSB0aW9jeF9idXNfdHlwZSA9IHsKKwkubmFtZSA9ICJ0aW9jeCIsCisJLm1hdGNoID0gdGlvY3hfbWF0Y2gsCisJLnVldmVudCA9IHRpb2N4X3VldmVudCwKKwkucHJvYmUgPSBjeF9kZXZpY2VfcHJvYmUsCisJLnJlbW92ZSA9IGN4X2RyaXZlcl9yZW1vdmUsCit9OworCiAvKioKICAqIGN4X2RyaXZlcl9yZWdpc3RlciAtIFJlZ2lzdGVyIHRoZSBkcml2ZXIuCiAgKiBAY3hfZHJpdmVyOiBkcml2ZXIgdGFibGUgKGN4X2RydiBzdHJ1Y3QpIGZyb20gZHJpdmVyCkBAIC0xNjIsOCArMTY0LDYgQEAKIHsKIAljeF9kcml2ZXItPmRyaXZlci5uYW1lID0gY3hfZHJpdmVyLT5uYW1lOwogCWN4X2RyaXZlci0+ZHJpdmVyLmJ1cyA9ICZ0aW9jeF9idXNfdHlwZTsKLQljeF9kcml2ZXItPmRyaXZlci5wcm9iZSA9IGN4X2RldmljZV9wcm9iZTsKLQljeF9kcml2ZXItPmRyaXZlci5yZW1vdmUgPSBjeF9kcml2ZXJfcmVtb3ZlOwogCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmY3hfZHJpdmVyLT5kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfY2hhbm5lbC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfY2hhbm5lbC5jCmluZGV4IGFiZjRmYzIuLjBjMGE2ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX2NoYW5uZWwuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwY19jaGFubmVsLmMKQEAgLTMsNyArMyw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICovCiAKIApAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vc24vYnRlLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgotI2luY2x1ZGUgInhwYy5oIgorI2luY2x1ZGUgPGFzbS9zbi94cGMuaD4KIAogCiAvKgpAQCAtNzc5LDYgKzc3OSwxMiBAQAogCiAJLyogYm90aCBzaWRlcyBhcmUgZGlzY29ubmVjdGVkIG5vdyAqLwogCisJaWYgKGNoLT5mbGFncyAmIFhQQ19DX0NPTk5FQ1RDQUxMT1VUKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5sb2NrLCAqaXJxX2ZsYWdzKTsKKwkJeHBjX2Rpc2Nvbm5lY3RfY2FsbG91dChjaCwgeHBjRGlzY29ubmVjdGVkKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5sb2NrLCAqaXJxX2ZsYWdzKTsKKwl9CisKIAkvKiBpdCdzIG5vdyBzYWZlIHRvIGZyZWUgdGhlIGNoYW5uZWwncyBtZXNzYWdlIHF1ZXVlcyAqLwogCXhwY19mcmVlX21zZ3F1ZXVlcyhjaCk7CiAKQEAgLTE2NDUsNyArMTY1MSw3IEBACiAKIAogdm9pZAoteHBjX2Rpc2Nvbm5lY3RpbmdfY2FsbG91dChzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoKQoreHBjX2Rpc2Nvbm5lY3RfY2FsbG91dChzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoLCBlbnVtIHhwY19yZXR2YWwgcmVhc29uKQogewogCS8qCiAJICogTGV0IHRoZSBjaGFubmVsJ3MgcmVnaXN0ZXJlciBrbm93IHRoYXQgdGhlIGNoYW5uZWwgaXMgYmVpbmcKQEAgLTE2NTQsMTUgKzE2NjAsMTMgQEAKIAkgKi8KIAogCWlmIChjaC0+ZnVuYyAhPSBOVUxMKSB7Ci0JCWRldl9kYmcoeHBjX2NoYW4sICJjaC0+ZnVuYygpIGNhbGxlZCwgcmVhc29uPXhwY0Rpc2Nvbm5lY3RpbmcsIgotCQkJIiBwYXJ0aWQ9JWQsIGNoYW5uZWw9JWRcbiIsIGNoLT5wYXJ0aWQsIGNoLT5udW1iZXIpOworCQlkZXZfZGJnKHhwY19jaGFuLCAiY2gtPmZ1bmMoKSBjYWxsZWQsIHJlYXNvbj0lZCwgcGFydGlkPSVkLCAiCisJCQkiY2hhbm5lbD0lZFxuIiwgcmVhc29uLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyKTsKIAotCQljaC0+ZnVuYyh4cGNEaXNjb25uZWN0aW5nLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyLCBOVUxMLAotCQkJCQkJCQljaC0+a2V5KTsKKwkJY2gtPmZ1bmMocmVhc29uLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyLCBOVUxMLCBjaC0+a2V5KTsKIAotCQlkZXZfZGJnKHhwY19jaGFuLCAiY2gtPmZ1bmMoKSByZXR1cm5lZCwgcmVhc29uPSIKLQkJCSJ4cGNEaXNjb25uZWN0aW5nLCBwYXJ0aWQ9JWQsIGNoYW5uZWw9JWRcbiIsCi0JCQljaC0+cGFydGlkLCBjaC0+bnVtYmVyKTsKKwkJZGV2X2RiZyh4cGNfY2hhbiwgImNoLT5mdW5jKCkgcmV0dXJuZWQsIHJlYXNvbj0lZCwgcGFydGlkPSVkLCAiCisJCQkiY2hhbm5lbD0lZFxuIiwgcmVhc29uLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX21haW4uYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX21haW4uYwppbmRleCBiNjE3MjM2Li44OTMwNTg2ZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX21haW4uYwpAQCAtMyw3ICszLDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKi8KIAogCkBAIC01OSw3ICs1OSw3IEBACiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgInhwYy5oIgorI2luY2x1ZGUgPGFzbS9zbi94cGMuaD4KIAogCiAvKiBkZWZpbmUgdHdvIFhQQyBkZWJ1ZyBkZXZpY2Ugc3RydWN0dXJlcyB0byBiZSB1c2VkIHdpdGggZGV2X2RiZygpIGV0IGFsICovCkBAIC04Miw2ICs4Miw5IEBACiBzdHJ1Y3QgZGV2aWNlICp4cGNfY2hhbiA9ICZ4cGNfY2hhbl9kYmdfc3VibmFtZTsKIAogCitzdGF0aWMgaW50IHhwY19rZGVidWdfaWdub3JlOworCisKIC8qIHN5c3R1bmUgcmVsYXRlZCB2YXJpYWJsZXMgZm9yIC9wcm9jL3N5cyBkaXJlY3RvcmllcyAqLwogCiBzdGF0aWMgaW50IHhwY19oYl9pbnRlcnZhbCA9IFhQQ19IQl9ERUZBVUxUX0lOVEVSVkFMOwpAQCAtMTYyLDYgKzE2NSw4IEBACiB9Owogc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICp4cGNfc3lzY3RsOwogCisvKiBub24temVybyBpZiBhbnkgcmVtb3RlIHBhcnRpdGlvbiBkaXNlbmdhZ2UgcmVxdWVzdCB3YXMgdGltZWQgb3V0ICovCitpbnQgeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVkb3V0OwogCiAvKiAjb2YgSVJRcyByZWNlaXZlZCAqLwogc3RhdGljIGF0b21pY190IHhwY19hY3RfSVJRX3JjdmQ7CkBAIC03NzMsNyArNzc4LDcgQEAKIAkJCWNoLT5mbGFncyB8PSBYUENfQ19ESVNDT05ORUNUQ0FMTE9VVDsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5sb2NrLCBpcnFfZmxhZ3MpOwogCi0JCQl4cGNfZGlzY29ubmVjdGluZ19jYWxsb3V0KGNoKTsKKwkJCXhwY19kaXNjb25uZWN0X2NhbGxvdXQoY2gsIHhwY0Rpc2Nvbm5lY3RpbmcpOwogCQl9IGVsc2UgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmxvY2ssIGlycV9mbGFncyk7CiAJCX0KQEAgLTkyMSw5ICs5MjYsOSBAQAogeHBjX2RvX2V4aXQoZW51bSB4cGNfcmV0dmFsIHJlYXNvbikKIHsKIAlwYXJ0aWRfdCBwYXJ0aWQ7Ci0JaW50IGFjdGl2ZV9wYXJ0X2NvdW50OworCWludCBhY3RpdmVfcGFydF9jb3VudCwgcHJpbnRlZF93YWl0aW5nX21zZyA9IDA7CiAJc3RydWN0IHhwY19wYXJ0aXRpb24gKnBhcnQ7Ci0JdW5zaWduZWQgbG9uZyBwcmludG1zZ190aW1lOworCXVuc2lnbmVkIGxvbmcgcHJpbnRtc2dfdGltZSwgZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dCA9IDA7CiAKIAogCS8qIGEgJ3JtbW9kIFhQQycgYW5kIGEgJ3JlYm9vdCcgY2Fubm90IGJvdGggZW5kIHVwIGhlcmUgdG9nZXRoZXIgKi8KQEAgLTk1Myw3ICs5NTgsOCBAQAogCiAJLyogd2FpdCBmb3IgYWxsIHBhcnRpdGlvbnMgdG8gYmVjb21lIGluYWN0aXZlICovCiAKLQlwcmludG1zZ190aW1lID0gamlmZmllczsKKwlwcmludG1zZ190aW1lID0gamlmZmllcyArIChYUENfRElTRU5HQUdFX1BSSU5UTVNHX0lOVEVSVkFMICogSFopOworCXhwY19kaXNlbmdhZ2VfcmVxdWVzdF90aW1lZG91dCA9IDA7CiAKIAlkbyB7CiAJCWFjdGl2ZV9wYXJ0X2NvdW50ID0gMDsKQEAgLTk2OSwyMCArOTc1LDM5IEBACiAJCQlhY3RpdmVfcGFydF9jb3VudCsrOwogCiAJCQlYUENfREVBQ1RJVkFURV9QQVJUSVRJT04ocGFydCwgcmVhc29uKTsKKworCQkJaWYgKHBhcnQtPmRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQgPgorCQkJCQkJZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dCkgeworCQkJCWRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQgPQorCQkJCQkJcGFydC0+ZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dDsKKwkJCX0KIAkJfQogCi0JCWlmIChhY3RpdmVfcGFydF9jb3VudCA9PSAwKSB7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChqaWZmaWVzID49IHByaW50bXNnX3RpbWUpIHsKLQkJCWRldl9pbmZvKHhwY19wYXJ0LCAid2FpdGluZyBmb3IgcGFydGl0aW9ucyB0byAiCi0JCQkJImRlYWN0aXZhdGUvZGlzZW5nYWdlLCBhY3RpdmUgY291bnQ9JWQsIHJlbW90ZSAiCi0JCQkJImVuZ2FnZWQ9MHglbHhcbiIsIGFjdGl2ZV9wYXJ0X2NvdW50LAotCQkJCXhwY19wYXJ0aXRpb25fZW5nYWdlZCgxVUwgPDwgcGFydGlkKSk7Ci0KLQkJCXByaW50bXNnX3RpbWUgPSBqaWZmaWVzICsKKwkJaWYgKHhwY19wYXJ0aXRpb25fZW5nYWdlZCgtMVVMKSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcHJpbnRtc2dfdGltZSkpIHsKKwkJCQlkZXZfaW5mbyh4cGNfcGFydCwgIndhaXRpbmcgZm9yIHJlbW90ZSAiCisJCQkJCSJwYXJ0aXRpb25zIHRvIGRpc2VuZ2FnZSwgdGltZW91dCBpbiAiCisJCQkJCSIlbGQgc2Vjb25kc1xuIiwKKwkJCQkJKGRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQgLSBqaWZmaWVzKQorCQkJCQkJCQkJLyBIWik7CisJCQkJcHJpbnRtc2dfdGltZSA9IGppZmZpZXMgKwogCQkJCQkoWFBDX0RJU0VOR0FHRV9QUklOVE1TR19JTlRFUlZBTCAqIEhaKTsKKwkJCQlwcmludGVkX3dhaXRpbmdfbXNnID0gMTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKGFjdGl2ZV9wYXJ0X2NvdW50ID4gMCkgeworCQkJaWYgKHByaW50ZWRfd2FpdGluZ19tc2cpIHsKKwkJCQlkZXZfaW5mbyh4cGNfcGFydCwgIndhaXRpbmcgZm9yIGxvY2FsIHBhcnRpdGlvbiIKKwkJCQkJIiB0byBkaXNlbmdhZ2VcbiIpOworCQkJCXByaW50ZWRfd2FpdGluZ19tc2cgPSAwOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlpZiAoIXhwY19kaXNlbmdhZ2VfcmVxdWVzdF90aW1lZG91dCkgeworCQkJCWRldl9pbmZvKHhwY19wYXJ0LCAiYWxsIHBhcnRpdGlvbnMgaGF2ZSAiCisJCQkJCSJkaXNlbmdhZ2VkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOwogCQl9CiAKIAkJLyogc2xlZXAgZm9yIGEgMS8zIG9mIGEgc2Vjb25kIG9yIHNvICovCkBAIC0xMDAwLDExICsxMDI1LDEzIEBACiAJZGVsX3RpbWVyX3N5bmMoJnhwY19oYl90aW1lcik7CiAJREJVR19PTih4cGNfdmFycy0+aGVhcnRiZWF0aW5nX3RvX21hc2sgIT0gMCk7CiAKLQkvKiB0YWtlIG91cnNlbHZlcyBvZmYgb2YgdGhlIHJlYm9vdF9ub3RpZmllcl9saXN0ICovCi0JKHZvaWQpIHVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ4cGNfcmVib290X25vdGlmaWVyKTsKKwlpZiAocmVhc29uID09IHhwY1VubG9hZGluZykgeworCQkvKiB0YWtlIG91cnNlbHZlcyBvZmYgb2YgdGhlIHJlYm9vdF9ub3RpZmllcl9saXN0ICovCisJCSh2b2lkKSB1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmeHBjX3JlYm9vdF9ub3RpZmllcik7CiAKLQkvKiB0YWtlIG91cnNlbHZlcyBvZmYgb2YgdGhlIGRpZV9ub3RpZmllciBsaXN0ICovCi0JKHZvaWQpIHVucmVnaXN0ZXJfZGllX25vdGlmaWVyKCZ4cGNfZGllX25vdGlmaWVyKTsKKwkJLyogdGFrZSBvdXJzZWx2ZXMgb2ZmIG9mIHRoZSBkaWVfbm90aWZpZXIgbGlzdCAqLworCQkodm9pZCkgdW5yZWdpc3Rlcl9kaWVfbm90aWZpZXIoJnhwY19kaWVfbm90aWZpZXIpOworCX0KIAogCS8qIGNsb3NlIGRvd24gcHJvdGVjdGlvbnMgZm9yIElQSSBvcGVyYXRpb25zICovCiAJeHBjX3Jlc3RyaWN0X0lQSV9vcHMoKTsKQEAgLTEwMjAsNjMgKzEwNDcsNiBAQAogCiAKIC8qCi0gKiBDYWxsZWQgd2hlbiB0aGUgc3lzdGVtIGlzIGFib3V0IHRvIGJlIGVpdGhlciByZXN0YXJ0ZWQgb3IgaGFsdGVkLgotICovCi1zdGF0aWMgdm9pZAoteHBjX2RpZV9kaXNlbmdhZ2Uodm9pZCkKLXsKLQlzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqcGFydDsKLQlwYXJ0aWRfdCBwYXJ0aWQ7Ci0JdW5zaWduZWQgbG9uZyBlbmdhZ2VkOwotCWxvbmcgdGltZSwgcHJpbnRfdGltZSwgZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dDsKLQotCi0JLyoga2VlcCB4cGNfaGJfY2hlY2tlciB0aHJlYWQgZnJvbSBkb2luZyBhbnl0aGluZyAoanVzdCBpbiBjYXNlKSAqLwotCXhwY19leGl0aW5nID0gMTsKLQotCXhwY192YXJzLT5oZWFydGJlYXRpbmdfdG9fbWFzayA9IDA7ICAvKiBpbmRpY2F0ZSB3ZSdyZSBkZWFjdGl2YXRlZCAqLwotCi0JZm9yIChwYXJ0aWQgPSAxOyBwYXJ0aWQgPCBYUF9NQVhfUEFSVElUSU9OUzsgcGFydGlkKyspIHsKLQkJcGFydCA9ICZ4cGNfcGFydGl0aW9uc1twYXJ0aWRdOwotCi0JCWlmICghWFBDX1NVUFBPUlRTX0RJU0VOR0FHRV9SRVFVRVNUKHBhcnQtPgotCQkJCQkJCXJlbW90ZV92YXJzX3ZlcnNpb24pKSB7Ci0KLQkJCS8qIGp1c3QgaW4gY2FzZSBpdCB3YXMgbGVmdCBzZXQgYnkgYW4gZWFybGllciBYUEMgKi8KLQkJCXhwY19jbGVhcl9wYXJ0aXRpb25fZW5nYWdlZCgxVUwgPDwgcGFydGlkKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKHhwY19wYXJ0aXRpb25fZW5nYWdlZCgxVUwgPDwgcGFydGlkKSB8fAotCQkJCQlwYXJ0LT5hY3Rfc3RhdGUgIT0gWFBDX1BfSU5BQ1RJVkUpIHsKLQkJCXhwY19yZXF1ZXN0X3BhcnRpdGlvbl9kaXNlbmdhZ2UocGFydCk7Ci0JCQl4cGNfbWFya19wYXJ0aXRpb25fZGlzZW5nYWdlZChwYXJ0KTsKLQkJCXhwY19JUElfc2VuZF9kaXNlbmdhZ2UocGFydCk7Ci0JCX0KLQl9Ci0KLQlwcmludF90aW1lID0gcnRjX3RpbWUoKTsKLQlkaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0ID0gcHJpbnRfdGltZSArCi0JCSh4cGNfZGlzZW5nYWdlX3JlcXVlc3RfdGltZWxpbWl0ICogc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kKTsKLQotCS8qIHdhaXQgZm9yIGFsbCBvdGhlciBwYXJ0aXRpb25zIHRvIGRpc2VuZ2FnZSBmcm9tIHVzICovCi0KLQl3aGlsZSAoKGVuZ2FnZWQgPSB4cGNfcGFydGl0aW9uX2VuZ2FnZWQoLTFVTCkpICYmCi0JCQkodGltZSA9IHJ0Y190aW1lKCkpIDwgZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dCkgewotCi0JCWlmICh0aW1lID49IHByaW50X3RpbWUpIHsKLQkJCWRldl9pbmZvKHhwY19wYXJ0LCAid2FpdGluZyBmb3IgcmVtb3RlIHBhcnRpdGlvbnMgdG8gIgotCQkJCSJkaXNlbmdhZ2UsIGVuZ2FnZWQ9MHglbHhcbiIsIGVuZ2FnZWQpOwotCQkJcHJpbnRfdGltZSA9IHRpbWUgKyAoWFBDX0RJU0VOR0FHRV9QUklOVE1TR19JTlRFUlZBTCAqCi0JCQkJCQlzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQpOwotCQl9Ci0JfQotCWRldl9pbmZvKHhwY19wYXJ0LCAiZmluaXNoZWQgd2FpdGluZyBmb3IgcmVtb3RlIHBhcnRpdGlvbnMgdG8gIgotCQkJCSJkaXNlbmdhZ2UsIGVuZ2FnZWQ9MHglbHhcbiIsIGVuZ2FnZWQpOwotfQotCi0KLS8qCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBzeXN0ZW0gaXMgYmVpbmcgcmVib290ZWQuCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTExMDUsNyArMTA3NSw4OCBAQAogCiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBzeXN0ZW0gaXMgYmVpbmcgcmVib290ZWQuCisgKiBOb3RpZnkgb3RoZXIgcGFydGl0aW9ucyB0byBkaXNlbmdhZ2UgZnJvbSBhbGwgcmVmZXJlbmNlcyB0byBvdXIgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZAoreHBjX2RpZV9kaXNlbmdhZ2Uodm9pZCkKK3sKKwlzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqcGFydDsKKwlwYXJ0aWRfdCBwYXJ0aWQ7CisJdW5zaWduZWQgbG9uZyBlbmdhZ2VkOworCWxvbmcgdGltZSwgcHJpbnRtc2dfdGltZSwgZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dDsKKworCisJLyoga2VlcCB4cGNfaGJfY2hlY2tlciB0aHJlYWQgZnJvbSBkb2luZyBhbnl0aGluZyAoanVzdCBpbiBjYXNlKSAqLworCXhwY19leGl0aW5nID0gMTsKKworCXhwY192YXJzLT5oZWFydGJlYXRpbmdfdG9fbWFzayA9IDA7ICAvKiBpbmRpY2F0ZSB3ZSdyZSBkZWFjdGl2YXRlZCAqLworCisJZm9yIChwYXJ0aWQgPSAxOyBwYXJ0aWQgPCBYUF9NQVhfUEFSVElUSU9OUzsgcGFydGlkKyspIHsKKwkJcGFydCA9ICZ4cGNfcGFydGl0aW9uc1twYXJ0aWRdOworCisJCWlmICghWFBDX1NVUFBPUlRTX0RJU0VOR0FHRV9SRVFVRVNUKHBhcnQtPgorCQkJCQkJCXJlbW90ZV92YXJzX3ZlcnNpb24pKSB7CisKKwkJCS8qIGp1c3QgaW4gY2FzZSBpdCB3YXMgbGVmdCBzZXQgYnkgYW4gZWFybGllciBYUEMgKi8KKwkJCXhwY19jbGVhcl9wYXJ0aXRpb25fZW5nYWdlZCgxVUwgPDwgcGFydGlkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHhwY19wYXJ0aXRpb25fZW5nYWdlZCgxVUwgPDwgcGFydGlkKSB8fAorCQkJCQlwYXJ0LT5hY3Rfc3RhdGUgIT0gWFBDX1BfSU5BQ1RJVkUpIHsKKwkJCXhwY19yZXF1ZXN0X3BhcnRpdGlvbl9kaXNlbmdhZ2UocGFydCk7CisJCQl4cGNfbWFya19wYXJ0aXRpb25fZGlzZW5nYWdlZChwYXJ0KTsKKwkJCXhwY19JUElfc2VuZF9kaXNlbmdhZ2UocGFydCk7CisJCX0KKwl9CisKKwl0aW1lID0gcnRjX3RpbWUoKTsKKwlwcmludG1zZ190aW1lID0gdGltZSArCisJCShYUENfRElTRU5HQUdFX1BSSU5UTVNHX0lOVEVSVkFMICogc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kKTsKKwlkaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0ID0gdGltZSArCisJCSh4cGNfZGlzZW5nYWdlX3JlcXVlc3RfdGltZWxpbWl0ICogc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kKTsKKworCS8qIHdhaXQgZm9yIGFsbCBvdGhlciBwYXJ0aXRpb25zIHRvIGRpc2VuZ2FnZSBmcm9tIHVzICovCisKKwl3aGlsZSAoMSkgeworCQllbmdhZ2VkID0geHBjX3BhcnRpdGlvbl9lbmdhZ2VkKC0xVUwpOworCQlpZiAoIWVuZ2FnZWQpIHsKKwkJCWRldl9pbmZvKHhwY19wYXJ0LCAiYWxsIHBhcnRpdGlvbnMgaGF2ZSBkaXNlbmdhZ2VkXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJdGltZSA9IHJ0Y190aW1lKCk7CisJCWlmICh0aW1lID49IGRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQpIHsKKwkJCWZvciAocGFydGlkID0gMTsgcGFydGlkIDwgWFBfTUFYX1BBUlRJVElPTlM7IHBhcnRpZCsrKSB7CisJCQkJaWYgKGVuZ2FnZWQgJiAoMVVMIDw8IHBhcnRpZCkpIHsKKwkJCQkJZGV2X2luZm8oeHBjX3BhcnQsICJkaXNlbmdhZ2UgZnJvbSAiCisJCQkJCQkicmVtb3RlIHBhcnRpdGlvbiAlZCB0aW1lZCAiCisJCQkJCQkib3V0XG4iLCBwYXJ0aWQpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRpbWUgPj0gcHJpbnRtc2dfdGltZSkgeworCQkJZGV2X2luZm8oeHBjX3BhcnQsICJ3YWl0aW5nIGZvciByZW1vdGUgcGFydGl0aW9ucyB0byAiCisJCQkJImRpc2VuZ2FnZSwgdGltZW91dCBpbiAlbGQgc2Vjb25kc1xuIiwKKwkJCQkoZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dCAtIHRpbWUpIC8KKwkJCQkJCXNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCk7CisJCQlwcmludG1zZ190aW1lID0gdGltZSArCisJCQkJCShYUENfRElTRU5HQUdFX1BSSU5UTVNHX0lOVEVSVkFMICoKKwkJCQkJCXNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCk7CisJCX0KKwl9Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHN5c3RlbSBpcyBiZWluZyByZXN0YXJ0ZWQgb3IgaGFsdGVkIGR1ZQorICogdG8gc29tZSBzb3J0IG9mIHN5c3RlbSBmYWlsdXJlLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHdlIG5lZWQgdG8gbm90aWZ5IHRoZQorICogb3RoZXIgcGFydGl0aW9ucyB0byBkaXNlbmdhZ2UgZnJvbSBhbGwgcmVmZXJlbmNlcyB0byBvdXIgbWVtb3J5LgorICogVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSBjYWxsZWQgd2hlbiBvdXIgaGVhcnRiZWF0ZXIgY291bGQgYmUgb2ZmbGluZWQKKyAqIGZvciBhIHRpbWUuIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIG5vdGlmeSBvdGhlciBwYXJ0aXRpb25zIHRvIG5vdCB3b3JyeQorICogYWJvdXQgdGhlIGxhY2sgb2YgYSBoZWFydGJlYXQuCiAgKi8KIHN0YXRpYyBpbnQKIHhwY19zeXN0ZW1fZGllKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnVudXNlZCkKQEAgLTExMTUsMTEgKzExNjYsMjUgQEAKIAljYXNlIERJRV9NQUNISU5FX0hBTFQ6CiAJCXhwY19kaWVfZGlzZW5nYWdlKCk7CiAJCWJyZWFrOworCisJY2FzZSBESUVfS0RFQlVHX0VOVEVSOgorCQkvKiBTaG91bGQgbGFjayBvZiBoZWFydGJlYXQgYmUgaWdub3JlZCBieSBvdGhlciBwYXJ0aXRpb25zPyAqLworCQlpZiAoIXhwY19rZGVidWdfaWdub3JlKSB7CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIERJRV9NQ0FfTU9OQVJDSF9FTlRFUjoKIAljYXNlIERJRV9JTklUX01PTkFSQ0hfRU5URVI6CiAJCXhwY192YXJzLT5oZWFydGJlYXQrKzsKIAkJeHBjX3ZhcnMtPmhlYXJ0YmVhdF9vZmZsaW5lID0gMTsKIAkJYnJlYWs7CisKKwljYXNlIERJRV9LREVCVUdfTEVBVkU6CisJCS8qIElzIGxhY2sgb2YgaGVhcnRiZWF0IGJlaW5nIGlnbm9yZWQgYnkgb3RoZXIgcGFydGl0aW9ucz8gKi8KKwkJaWYgKCF4cGNfa2RlYnVnX2lnbm9yZSkgeworCQkJYnJlYWs7CisJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBESUVfTUNBX01PTkFSQ0hfTEVBVkU6CiAJY2FzZSBESUVfSU5JVF9NT05BUkNIX0xFQVZFOgogCQl4cGNfdmFycy0+aGVhcnRiZWF0Kys7CkBAIC0xMzQ0LDMgKzE0MDksNyBAQAogTU9EVUxFX1BBUk1fREVTQyh4cGNfZGlzZW5nYWdlX3JlcXVlc3RfdGltZWxpbWl0LCAiTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCAiCiAJCSJmb3IgZGlzZW5nYWdlIHJlcXVlc3QgdG8gY29tcGxldGUuIik7CiAKK21vZHVsZV9wYXJhbSh4cGNfa2RlYnVnX2lnbm9yZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoeHBjX2tkZWJ1Z19pZ25vcmUsICJTaG91bGQgbGFjayBvZiBoZWFydGJlYXQgYmUgaWdub3JlZCBieSAiCisJCSJvdGhlciBwYXJ0aXRpb25zIHdoZW4gZHJvcHBpbmcgaW50byBrZGVidWcuIik7CisKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX3BhcnRpdGlvbi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfcGFydGl0aW9uLmMKaW5kZXggY2RkNjQzMS4uODhhNzMwZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfcGFydGl0aW9uLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfcGFydGl0aW9uLmMKQEAgLTMsNyArMyw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICovCiAKIApAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KICNpbmNsdWRlIDxhc20vc24vbm9kZXBkYS5oPgogI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgotI2luY2x1ZGUgInhwYy5oIgorI2luY2x1ZGUgPGFzbS9zbi94cGMuaD4KIAogCiAvKiBYUEMgaXMgZXhpdGluZyBmbGFnICovCkBAIC03NzEsNyArNzcxLDggQEAKIAkJfQogCX0KIAotCWlmICgheHBjX3BhcnRpdGlvbl9kaXNlbmdhZ2VkKHBhcnQpKSB7CisJaWYgKHBhcnQtPmRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQgPiAwICYmCisJCQkJCSF4cGNfcGFydGl0aW9uX2Rpc2VuZ2FnZWQocGFydCkpIHsKIAkJLyogc3RpbGwgd2FpdGluZyBvbiBvdGhlciBzaWRlIHRvIGRpc2VuZ2FnZSBmcm9tIHVzICovCiAJCXJldHVybjsKIAl9CkBAIC04NzMsNiArODc0LDkgQEAKIAkJCSAqIHJlcXVlc3QgaW4gYSB0aW1lbHkgZmFzaGlvbiwgc28gYXNzdW1lIGl0J3MgZGVhZC4KIAkJCSAqLwogCisJCQlkZXZfaW5mbyh4cGNfcGFydCwgImRpc2VuZ2FnZSBmcm9tIHJlbW90ZSBwYXJ0aXRpb24gJWQgIgorCQkJCSJ0aW1lZCBvdXRcbiIsIHBhcnRpZCk7CisJCQl4cGNfZGlzZW5nYWdlX3JlcXVlc3RfdGltZWRvdXQgPSAxOwogCQkJeHBjX2NsZWFyX3BhcnRpdGlvbl9lbmdhZ2VkKDFVTCA8PCBwYXJ0aWQpOwogCQkJZGlzZW5nYWdlZCA9IDE7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2RtYS5jCmluZGV4IDM0MDkzNDcuLmU2ODMzMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYwpAQCAtMjE4LDcgKzIxOCw5IEBACiAJdWludDY0X3QgZmxhZ3M7CiAJdWludDY0X3QgaXR0ZTsKIAlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmluZm87Ci0Jdm9sYXRpbGUgc3RydWN0IHNuX2ZsdXNoX2RldmljZV9saXN0ICpwOworCXZvbGF0aWxlIHN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsICpwOworCXZvbGF0aWxlIHN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfY29tbW9uICpjb21tb247CisKIAlzdHJ1Y3Qgc25fZmx1c2hfbmFzaWRfZW50cnkgKmZsdXNoX25hc2lkX2xpc3Q7CiAKIAlpZiAoIXNuX2lvaWZfaW5pdGVkKQpAQCAtMjY4LDE3ICsyNzAsMTcgQEAKIAlwID0gJmZsdXNoX25hc2lkX2xpc3QtPndpZGdldF9wW3dpZF9udW1dWzBdOwogCiAJLyogZmluZCBhIG1hdGNoaW5nIEJBUiAqLwotCWZvciAoaSA9IDA7IGkgPCBERVZfUEVSX1dJREdFVDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IERFVl9QRVJfV0lER0VUOyBpKysscCsrKSB7CisJCWNvbW1vbiA9IHAtPmNvbW1vbjsKIAkJZm9yIChqID0gMDsgaiA8IFBDSV9ST01fUkVTT1VSQ0U7IGorKykgewotCQkJaWYgKHAtPnNmZGxfYmFyX2xpc3Rbal0uc3RhcnQgPT0gMCkKKwkJCWlmIChjb21tb24tPnNmZGxfYmFyX2xpc3Rbal0uc3RhcnQgPT0gMCkKIAkJCQlicmVhazsKLQkJCWlmIChhZGRyID49IHAtPnNmZGxfYmFyX2xpc3Rbal0uc3RhcnQKLQkJCSAgICAmJiBhZGRyIDw9IHAtPnNmZGxfYmFyX2xpc3Rbal0uZW5kKQorCQkJaWYgKGFkZHIgPj0gY29tbW9uLT5zZmRsX2Jhcl9saXN0W2pdLnN0YXJ0CisJCQkgICAgJiYgYWRkciA8PSBjb21tb24tPnNmZGxfYmFyX2xpc3Rbal0uZW5kKQogCQkJCWJyZWFrOwogCQl9Ci0JCWlmIChqIDwgUENJX1JPTV9SRVNPVVJDRSAmJiBwLT5zZmRsX2Jhcl9saXN0W2pdLnN0YXJ0ICE9IDApCisJCWlmIChqIDwgUENJX1JPTV9SRVNPVVJDRSAmJiBjb21tb24tPnNmZGxfYmFyX2xpc3Rbal0uc3RhcnQgIT0gMCkKIAkJCWJyZWFrOwotCQlwKys7CiAJfQogCiAJLyogaWYgbm8gbWF0Y2hpbmcgQkFSLCByZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZy4gKi8KQEAgLTMwNCwyNCArMzA2LDI0IEBACiAJCWlmICgoMSA8PCBYV0lER0VUX1BBUlRfUkVWX05VTV9SRVYocmV2bnVtKSkgJiBQVjkwNzUxNikgewogCQkJcmV0dXJuOwogCQl9IGVsc2UgewotCQkJcGNpcmVnX3dyYl9mbHVzaF9nZXQocC0+c2ZkbF9wY2lidXNfaW5mbywKLQkJCQkJICAgICAocC0+c2ZkbF9zbG90IC0gMSkpOworCQkJcGNpcmVnX3dyYl9mbHVzaF9nZXQoY29tbW9uLT5zZmRsX3BjaWJ1c19pbmZvLAorCQkJCQkgICAgIChjb21tb24tPnNmZGxfc2xvdCAtIDEpKTsKIAkJfQogCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCYoKHN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfbGlzdCAqKXApLT4KLQkJCQkgIHNmZGxfZmx1c2hfbG9jaywgZmxhZ3MpOwotCi0JCSpwLT5zZmRsX2ZsdXNoX2FkZHIgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgoc3BpbmxvY2tfdCAqKSZwLT5zZmRsX2ZsdXNoX2xvY2ssCisJCQkJICBmbGFncyk7CisJCSpjb21tb24tPnNmZGxfZmx1c2hfYWRkciA9IDA7CiAKIAkJLyogZm9yY2UgYW4gaW50ZXJydXB0LiAqLwotCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKHAtPnNmZGxfZm9yY2VfaW50X2FkZHIpID0gMTsKKwkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShjb21tb24tPnNmZGxfZm9yY2VfaW50X2FkZHIpID0gMTsKIAogCQkvKiB3YWl0IGZvciB0aGUgaW50ZXJydXB0IHRvIGNvbWUgYmFjay4gKi8KLQkJd2hpbGUgKCoocC0+c2ZkbF9mbHVzaF9hZGRyKSAhPSAweDEwZikKKwkJd2hpbGUgKCooY29tbW9uLT5zZmRsX2ZsdXNoX2FkZHIpICE9IDB4MTBmKQogCQkJY3B1X3JlbGF4KCk7CiAKIAkJLyogb2theSwgZXZlcnl0aGluZyBpcyBzeW5jaGVkIHVwLiAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKChzcGlubG9ja190ICopJnAtPnNmZGxfZmx1c2hfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKChzcGlubG9ja190ICopJnAtPnNmZGxfZmx1c2hfbG9jaywKKwkJCQkgICAgICAgZmxhZ3MpOwogCX0KIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMKaW5kZXggMWY1MDBjOC4uZTMyOGU5NCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYwpAQCAtOTIsNyArOTIsOCBAQAogCWNub2RlaWRfdCBuZWFyX2Nub2RlOwogCXN0cnVjdCBodWJkZXZfaW5mbyAqaHViZGV2X2luZm87CiAJc3RydWN0IHBjaWJ1c19pbmZvICpzb2Z0OwotCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfbGlzdCAqc25fZmx1c2hfZGV2aWNlX2xpc3Q7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKnNuX2ZsdXNoX2RldmljZV9rZXJuZWw7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9jb21tb24gKmNvbW1vbjsKIAogCWlmICghIElTX1BDSV9CUklER0VfQVNJQyhwcm9tX2J1c3NvZnQtPmJzX2FzaWNfdHlwZSkpIHsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMzcsMjAgKzEzOCwxOSBAQAogCWh1YmRldl9pbmZvID0gKHN0cnVjdCBodWJkZXZfaW5mbyAqKShOT0RFUERBKGNub2RlKS0+cGRpbmZvKTsKIAogCWlmIChodWJkZXZfaW5mby0+aGRpX2ZsdXNoX25hc2lkX2xpc3Qud2lkZ2V0X3ApIHsKLQkJc25fZmx1c2hfZGV2aWNlX2xpc3QgPSBodWJkZXZfaW5mby0+aGRpX2ZsdXNoX25hc2lkX2xpc3QuCisJCXNuX2ZsdXNoX2RldmljZV9rZXJuZWwgPSBodWJkZXZfaW5mby0+aGRpX2ZsdXNoX25hc2lkX2xpc3QuCiAJCSAgICB3aWRnZXRfcFsoaW50KXNvZnQtPnBiaV9idXNjb21tb24uYnNfeGlkXTsKLQkJaWYgKHNuX2ZsdXNoX2RldmljZV9saXN0KSB7CisJCWlmIChzbl9mbHVzaF9kZXZpY2Vfa2VybmVsKSB7CiAJCQlmb3IgKGogPSAwOyBqIDwgREVWX1BFUl9XSURHRVQ7Ci0JCQkgICAgIGorKywgc25fZmx1c2hfZGV2aWNlX2xpc3QrKykgewotCQkJCWlmIChzbl9mbHVzaF9kZXZpY2VfbGlzdC0+c2ZkbF9zbG90ID09IC0xKQorCQkJICAgICBqKyssIHNuX2ZsdXNoX2RldmljZV9rZXJuZWwrKykgeworCQkJCWNvbW1vbiA9IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwtPmNvbW1vbjsKKwkJCQlpZiAoY29tbW9uLT5zZmRsX3Nsb3QgPT0gLTEpCiAJCQkJCWNvbnRpbnVlOwotCQkJCWlmICgoc25fZmx1c2hfZGV2aWNlX2xpc3QtPgotCQkJCSAgICAgc2ZkbF9wZXJzaXN0ZW50X3NlZ21lbnQgPT0KKwkJCQlpZiAoKGNvbW1vbi0+c2ZkbF9wZXJzaXN0ZW50X3NlZ21lbnQgPT0KIAkJCQkgICAgIHNvZnQtPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9zZWdtZW50KSAmJgotCQkJCSAgICAgKHNuX2ZsdXNoX2RldmljZV9saXN0LT4KLQkJCQkgICAgIHNmZGxfcGVyc2lzdGVudF9idXNudW0gPT0KKwkJCQkgICAgIChjb21tb24tPnNmZGxfcGVyc2lzdGVudF9idXNudW0gPT0KIAkJCQkgICAgIHNvZnQtPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9idXNudW0pKQotCQkJCQlzbl9mbHVzaF9kZXZpY2VfbGlzdC0+c2ZkbF9wY2lidXNfaW5mbyA9CisJCQkJCWNvbW1vbi0+c2ZkbF9wY2lidXNfaW5mbyA9CiAJCQkJCSAgICBzb2Z0OwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvZHJpdmVycy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL2RyaXZlcnMuYwppbmRleCAxZWFhMGQzLi4yZDgwNGUyIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvZHJpdmVycy5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9kcml2ZXJzLmMKQEAgLTE3Myw4ICsxNzMsNiBAQAogCVdBUk5fT04oZHJpdmVyLT5kcnYucHJvYmUgIT0gTlVMTCk7CiAJV0FSTl9PTihkcml2ZXItPmRydi5yZW1vdmUgIT0gTlVMTCk7CiAKLQlkcml2ZXItPmRydi5wcm9iZSA9IHBhcmlzY19kcml2ZXJfcHJvYmU7Ci0JZHJpdmVyLT5kcnYucmVtb3ZlID0gcGFyaXNjX2RyaXZlcl9yZW1vdmU7CiAJZHJpdmVyLT5kcnYubmFtZSA9IGRyaXZlci0+bmFtZTsKIAogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJ2KTsKQEAgLTU3NSw2ICs1NzMsOCBAQAogCS5uYW1lID0gInBhcmlzYyIsCiAJLm1hdGNoID0gcGFyaXNjX2dlbmVyaWNfbWF0Y2gsCiAJLmRldl9hdHRycyA9IHBhcmlzY19kZXZpY2VfYXR0cnMsCisJLnByb2JlID0gcGFyaXNjX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlID0gcGFyaXNjX2RyaXZlcl9yZW1vdmUsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQppbmRleCBkMzY1NGEyLi40NGRkODJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL01ha2VmaWxlCkBAIC0xMzksMTcgKzEzOSwxNCBAQAogCiBkcml2ZXJzLSQoQ09ORklHX09QUk9GSUxFKQkrPSBhcmNoL3Bvd2VycGMvb3Byb2ZpbGUvCiAKLWRlZmF1bHRpbWFnZS0kKENPTkZJR19QUEMzMikJOj0gekltYWdlCisjIERlZmF1bHQgdG8gekltYWdlLCBvdmVycmlkZSB3aGVuIG5lZWRlZAorZGVmYXVsdGltYWdlLXkJCQk6PSB6SW1hZ2UKIGRlZmF1bHRpbWFnZS0kKENPTkZJR19QUENfSVNFUklFUykgOj0gdm1saW51eAotZGVmYXVsdGltYWdlLSQoQ09ORklHX1BQQ19QU0VSSUVTKSA6PSB6SW1hZ2UKIEtCVUlMRF9JTUFHRSA6PSAkKGRlZmF1bHRpbWFnZS15KQogYWxsOiAkKEtCVUlMRF9JTUFHRSkKIAogQ1BQRkxBR1Nfdm1saW51eC5sZHMJOj0gLVVwb3dlcnBjCiAKLSMgQWxsIHRoZSBpbnN0cnVjdGlvbnMgdGFsayBhYm91dCAibWFrZSBiekltYWdlIi4KLWJ6SW1hZ2U6IHpJbWFnZQotCiBCT09UX1RBUkdFVFMgPSB6SW1hZ2UgekltYWdlLmluaXRyZCB6bmV0Ym9vdCB6bmV0Ym9vdC5pbml0cmQgdm1saW51eC5zbSB1SW1hZ2UKIAogLlBIT05ZOiAkKEJPT1RfVEFSR0VUUykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKaW5kZXggYjUzZDY3Ny4uNzg4ZGVjNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKQEAgLTI1LDggKzI1LDggQEAKIEJPT1RDRkxBR1MJOj0gJChIT1NUQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIC1pc3lzdGVtIFwKIAkJICAgJChzaGVsbCAkKENST1NTMzJDQykgLXByaW50LWZpbGUtbmFtZT1pbmNsdWRlKSAtZlBJQwogQk9PVEFGTEFHUwk6PSAtRF9fQVNTRU1CTFlfXyAkKEJPT1RDRkxBR1MpIC10cmFkaXRpb25hbCAtbm9zdGRpbmMKLUJPT1RMRkxBR1MJOj0gLVQgJChzcmN0cmVlKS8kKHNyYykvekltYWdlLmxkcwogT0JKQ09QWUZMQUdTICAgIDo9IGNvbnRlbnRzLGFsbG9jLGxvYWQscmVhZG9ubHksZGF0YQorT0JKQ09QWV9DT0ZGX0FSR1MgOj0gLU8gYWl4Y29mZi1yczYwMDAgLS1zZXQtc3RhcnQgMHg1MDAwMDAKIAogemxpYiAgICAgICA6PSBpbmZibG9jay5jIGluZmNvZGVzLmMgaW5mZmFzdC5jIGluZmxhdGUuYyBpbmZ0cmVlcy5jIGluZnV0aWwuYwogemxpYmhlYWRlciA6PSBpbmZibG9jay5oIGluZmNvZGVzLmggaW5mZmFzdC5oIGluZnRyZWVzLmggaW5mdXRpbC5oCkBAIC0zNSw3ICszNSw3IEBACiAkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYikgbWFpbi5vKTogJChhZGRwcmVmaXggJChvYmopLywkKHpsaWJsaW51eGhlYWRlcikpICQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliaGVhZGVyKSkKICMkKGFkZHByZWZpeCAkKG9iaikvLG1haW4ubyk6ICQoYWRkcHJlZml4ICQob2JqKS8semxpYi5oKQogCi1zcmMtYm9vdCA6PSBzdHJpbmcuUyBwcm9tLmMgbWFpbi5jIGRpdjY0LlMgY3J0MC5TCitzcmMtYm9vdCA6PSBjcnQwLlMgc3RyaW5nLlMgcHJvbS5jIHN0ZGlvLmMgbWFpbi5jIGRpdjY0LlMKIHNyYy1ib290ICs9ICQoemxpYikKIHNyYy1ib290IDo9ICQoYWRkcHJlZml4ICQob2JqKS8sICQoc3JjLWJvb3QpKQogb2JqLWJvb3QgOj0gJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChzcmMtYm9vdCkpKQpAQCAtNzAsNyArNzAsNyBAQAogICAgICAgY21kX2Jvb3RhcyA9ICQoQ1JPU1MzMkNDKSAtV3AsLU1ELCQoZGVwZmlsZSkgJChCT09UQUZMQUdTKSAtYyAtbyAkQCAkPAogCiBxdWlldF9jbWRfYm9vdGxkID0gQk9PVExEICAkQAotICAgICAgY21kX2Jvb3RsZCA9ICQoQ1JPU1MzMkxEKSAkKEJPT1RMRkxBR1MpIC1vICRAICQoMikKKyAgICAgIGNtZF9ib290bGQgPSAkKENST1NTMzJMRCkgLVQgJChzcmN0cmVlKS8kKHNyYykvJCgzKSAtbyAkQCAkKDIpCiAKICQocGF0c3Vic3QgJS5jLCUubywgJChmaWx0ZXIgJS5jLCAkKHNyYy1ib290KSkpOiAlLm86ICUuYwogCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxib290Y2MpCkBAIC04NywxMiArODcsMTQgQEAKIHNyYy1zZWMgPSAkKGZvcmVhY2ggc2VjdGlvbiwgJCgxKSwgJChwYXRzdWJzdCAlLCQob2JqKS9rZXJuZWwtJS5jLCAkKHNlY3Rpb24pKSkKIGd6LXNlYyAgPSAkKGZvcmVhY2ggc2VjdGlvbiwgJCgxKSwgJChwYXRzdWJzdCAlLCQob2JqKS9rZXJuZWwtJS5neiwgJChzZWN0aW9uKSkpCiAKLWhvc3Rwcm9ncy15CQk6PSBhZGRub3RlIGFkZFJhbURpc2sKLXRhcmdldHMgCQkrPSB6SW1hZ2Uudm1vZGUgekltYWdlLmluaXRyZC52bW9kZSB6SW1hZ2UgekltYWdlLmluaXRyZCBcCi0JCQkgICAkKHBhdHN1YnN0ICQob2JqKS8lLCUsICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpKSBcCi0JCQkgICAkKHBhdHN1YnN0ICQob2JqKS8lLCUsICQoY2FsbCBzcmMtc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpKSBcCi0JCQkgICAkKHBhdHN1YnN0ICQob2JqKS8lLCUsICQoY2FsbCBnei1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkpIFwKLQkJCSAgIHZtbGludXguaW5pdHJkCitob3N0cHJvZ3MteQkJOj0gYWRkbm90ZSBhZGRSYW1EaXNrIGhhY2stY29mZgorCit0YXJnZXRzICs9IHpJbWFnZS52bW9kZSB6SW1hZ2UuaW5pdHJkLnZtb2RlIHpJbWFnZSB6SW1hZ2UuaW5pdHJkIFwKKwkgICB6SW1hZ2UuY29mZiB6SW1hZ2UuaW5pdHJkLmNvZmYgXAorCSAgICQocGF0c3Vic3QgJChvYmopLyUsJSwgJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkpIFwKKwkgICAkKHBhdHN1YnN0ICQob2JqKS8lLCUsICQoY2FsbCBzcmMtc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpKSBcCisJICAgJChwYXRzdWJzdCAkKG9iaikvJSwlLCAkKGNhbGwgZ3otc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpKSBcCisJICAgdm1saW51eC5pbml0cmQKIGV4dHJhLXkJCQk6PSBpbml0cmQubwogCiBxdWlldF9jbWRfcmFtZGlzayA9IFJBTURJU0sgJEAKQEAgLTExNCw2ICsxMTYsMTAgQEAKIHF1aWV0X2NtZF9hZGRub3RlID0gQURETk9URSAkQAogICAgICAgY21kX2FkZG5vdGUgPSAkKG9iaikvYWRkbm90ZSAkQAogCitxdWlldF9jbWRfZ2VuY29mZiA9IENPRkYgICAgJEAKKyAgICAgIGNtZF9nZW5jb2ZmID0gJChPQkpDT1BZKSAkKE9CSkNPUFlfQ09GRl9BUkdTKSAkQCAmJiBcCisJCSAgICAkKG9iaikvaGFjay1jb2ZmICRACisKICQoY2FsbCBnei1zZWMsICQocmVxdWlyZWQpKTogJChvYmopL2tlcm5lbC0lLmd6OiAlCiAJJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKIApAQCAtMTI3LDIyICsxMzMsMzUgQEAKIAkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsYm9vdGNjKQogCSQoY2FsbCBjbWQsYWRkc2VjdGlvbikKIAotJChvYmopL3pJbWFnZS52bW9kZTogb2JqLWJvb3QgKz0gJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpKQorJChvYmopL3pJbWFnZS52bW9kZSAkKG9iaikvekltYWdlLmNvZmY6IG9iai1ib290ICs9ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSkKICQob2JqKS96SW1hZ2Uudm1vZGU6ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSkgJChvYmotYm9vdCkgJChzcmN0cmVlKS8kKHNyYykvekltYWdlLmxkcwotCSQoY2FsbCBjbWQsYm9vdGxkLCQob2JqLWJvb3QpKQorCSQoY2FsbCBjbWQsYm9vdGxkLCQob2JqLWJvb3QpLHpJbWFnZS5sZHMpCiAKLSQob2JqKS96SW1hZ2UuaW5pdHJkLnZtb2RlOiBvYmotYm9vdCArPSAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKQorJChvYmopL3pJbWFnZS5pbml0cmQudm1vZGUgJChvYmopL3pJbWFnZS5pbml0cmQuY29mZjogb2JqLWJvb3QgKz0gJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkKICQob2JqKS96SW1hZ2UuaW5pdHJkLnZtb2RlOiAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSAkKG9iai1ib290KSAkKHNyY3RyZWUpLyQoc3JjKS96SW1hZ2UubGRzCi0JJChjYWxsIGNtZCxib290bGQsJChvYmotYm9vdCkpCisJJChjYWxsIGNtZCxib290bGQsJChvYmotYm9vdCksekltYWdlLmxkcykKIAotJChvYmopL3pJbWFnZTogJChvYmopL3pJbWFnZS52bW9kZSAkKG9iaikvYWRkbm90ZQorIyBGb3IgMzItYml0IHBvd2VybWFjcywgYnVpbGQgdGhlIENPRkYgaW1hZ2VzIGFzIHdlbGwgYXMgdGhlIEVMRiBpbWFnZXMuCitjb2ZmaW1hZ2UtJChDT05GSUdfUFBDX1BNQUMpLSQoQ09ORklHX1BQQzMyKSA6PSAkKG9iaikvekltYWdlLmNvZmYKK2NvZmZyZGltZy0kKENPTkZJR19QUENfUE1BQyktJChDT05GSUdfUFBDMzIpIDo9ICQob2JqKS96SW1hZ2UuaW5pdHJkLmNvZmYKKworJChvYmopL3pJbWFnZTogJChvYmopL3pJbWFnZS52bW9kZSAkKG9iaikvYWRkbm90ZSAkKGNvZmZpbWFnZS15LXkpCiAJQGNwIC1mICQ8ICRACiAJJChjYWxsIGlmX2NoYW5nZWQsYWRkbm90ZSkKIAotJChvYmopL3pJbWFnZS5pbml0cmQ6ICQob2JqKS96SW1hZ2UuaW5pdHJkLnZtb2RlICQob2JqKS9hZGRub3RlCiskKG9iaikvekltYWdlLmluaXRyZDogJChvYmopL3pJbWFnZS5pbml0cmQudm1vZGUgJChvYmopL2FkZG5vdGUgJChjb2ZmcmRpbWcteS15KQogCUBjcCAtZiAkPCAkQAogCSQoY2FsbCBpZl9jaGFuZ2VkLGFkZG5vdGUpCiAKKyQob2JqKS96SW1hZ2UuY29mZjogJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpKSAkKG9iai1ib290KSAkKHNyY3RyZWUpLyQoc3JjKS96SW1hZ2UuY29mZi5sZHMgJChvYmopL2hhY2stY29mZgorCSQoY2FsbCBjbWQsYm9vdGxkLCQob2JqLWJvb3QpLHpJbWFnZS5jb2ZmLmxkcykKKwkkKGNhbGwgY21kLGdlbmNvZmYpCisKKyQob2JqKS96SW1hZ2UuaW5pdHJkLmNvZmY6ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpICQob2JqLWJvb3QpIFwKKwkJCSAgICQoc3JjdHJlZSkvJChzcmMpL3pJbWFnZS5jb2ZmLmxkcyAkKG9iaikvaGFjay1jb2ZmCisJJChjYWxsIGNtZCxib290bGQsJChvYmotYm9vdCksekltYWdlLmNvZmYubGRzKQorCSQoY2FsbCBjbWQsZ2VuY29mZikKKwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIGJ1aWxkIHUtYm9vdCBpbWFnZXMKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3J0MC5TIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3J0MC5TCmluZGV4IGQyZjJhY2UuLmUwMTkyYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2NydDAuUworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9jcnQwLlMKQEAgLTEyLDE3ICsxMiwyMyBAQAogI2luY2x1ZGUgInBwY19hc20uaCIKIAogCS50ZXh0CisJLyogYSBwcm9jZWR1cmUgZGVzY3JpcHRvciB1c2VkIHdoZW4gYm9vdGluZyB0aGlzIGFzIGEgQ09GRiBmaWxlICovCitfemltYWdlX3N0YXJ0X29wZDoKKwkubG9uZwlfemltYWdlX3N0YXJ0LCAwLCAwLCAwCisKIAkuZ2xvYmwJX3ppbWFnZV9zdGFydAogX3ppbWFnZV9zdGFydDoKKwkvKiBXb3JrIG91dCB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGFkZHJlc3Mgd2Ugd2VyZSBsaW5rZWQgYXQKKwkgICBhbmQgdGhlIGFkZHJlc3Mgd2hlcmUgd2UncmUgcnVubmluZy4gKi8KIAlibAkxZgotCi0xOgotCW1mbHIJcjAKKzE6CW1mbHIJcjAKIAlsaXMJcjksMWJAaGEKIAlhZGRpCXI5LHI5LDFiQGwKIAlzdWJmLglyMCxyOSxyMAotCWJlcQkzZgorCWJlcQkzZgkJLyogaWYgcnVubmluZyBhdCBzYW1lIGFkZHJlc3MgYXMgbGlua2VkICovCiAKKwkvKiBUaGUgLmdvdDIgc2VjdGlvbiBjb250YWlucyBhIGxpc3Qgb2YgYWRkcmVzc2VzLCBzbyBhZGQKKwkgICB0aGUgYWRkcmVzcyBvZmZzZXQgb250byBlYWNoIGVudHJ5LiAqLwogCWxpcwlyOSxfX2dvdDJfc3RhcnRAaGEKIAlhZGRpCXI5LHI5LF9fZ290Ml9zdGFydEBsCiAJbGlzCXI4LF9fZ290Ml9lbmRAaGEKQEAgLTMyLDE1ICszOCwxNCBAQAogCXNyd2kuCXI4LHI4LDIKIAltdGN0cglyOAogCWFkZAlyOSxyMCxyOQotMjoKLQlsd3oJcjgsMChyOSkKKzI6CWx3eglyOCwwKHI5KQogCWFkZAlyOCxyOCxyMAogCXN0dwlyOCwwKHI5KQogCWFkZGkJcjkscjksNAogCWJkbnoJMmIKIAotMzoKLQlsaXMJcjksX3N0YXJ0QGgKKwkvKiBEbyBhIGNhY2hlIGZsdXNoIGZvciBvdXIgdGV4dCwgaW4gY2FzZSBPRiBkaWRuJ3QgKi8KKzM6CWxpcwlyOSxfc3RhcnRAaAogCWFkZAlyOSxyMCxyOQogCWxpcwlyOCxfZXRleHRAaGEKIAlhZGRpCXI4LHI4LF9ldGV4dEBsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9oYWNrLWNvZmYuYyBiL2FyY2gvcG93ZXJwYy9ib290L2hhY2stY29mZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNWE2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9oYWNrLWNvZmYuYwpAQCAtMCwwICsxLDg0IEBACisvKgorICogaGFjay1jb2ZmLmMgLSBoYWNrIHRoZSBoZWFkZXIgb2YgYW4geGNvZmYgZmlsZSB0byBmaWxsIGluCisgKiBhIGZldyBmaWVsZHMgbmVlZGVkIGJ5IHRoZSBPcGVuIEZpcm13YXJlIHhjb2ZmIGxvYWRlciBvbgorICogUG93ZXIgTWFjcyBidXQgbm90IGluaXRpYWxpemVkIGJ5IG9iamNvcHkuCisgKgorICogQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAxOTk3LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAicnM2MDAwLmgiCisKKyNkZWZpbmUgQU9VVF9NQUdJQwkweDAxMGIKKworI2RlZmluZSBnZXRfMTZiZSh4KQkoKCgodW5zaWduZWQgY2hhciAqKSh4KSlbMF0gPDwgOCkgXAorCQkJICsgKCh1bnNpZ25lZCBjaGFyICopKHgpKVsxXSkKKyNkZWZpbmUgcHV0XzE2YmUoeCwgdikJKCgodW5zaWduZWQgY2hhciAqKSh4KSlbMF0gPSAodikgPj4gOCwgXAorCQkJICgodW5zaWduZWQgY2hhciAqKSh4KSlbMV0gPSAodikgJiAweGZmKQorI2RlZmluZSBnZXRfMzJiZSh4KQkoKCgodW5zaWduZWQgY2hhciAqKSh4KSlbMF0gPDwgMjQpIFwKKwkJCSArICgoKHVuc2lnbmVkIGNoYXIgKikoeCkpWzFdIDw8IDE2KSBcCisJCQkgKyAoKCh1bnNpZ25lZCBjaGFyICopKHgpKVsyXSA8PCA4KSBcCisJCQkgKyAoKHVuc2lnbmVkIGNoYXIgKikoeCkpWzNdKQorCitpbnQKK21haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisgICAgaW50IGZkOworICAgIGludCBpLCBuc2VjdDsKKyAgICBpbnQgYW91dHN6OworICAgIHN0cnVjdCBleHRlcm5hbF9maWxlaGRyIGZoZHI7CisgICAgQU9VVEhEUiBhb3V0OworICAgIHN0cnVjdCBleHRlcm5hbF9zY25oZHIgc2hkcjsKKworICAgIGlmIChhYyAhPSAyKSB7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaGFjay1jb2ZmIGNvZmYtZmlsZVxuIik7CisJZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKChmZCA9IG9wZW4oYXZbMV0sIDIpKSA9PSAtMSkgeworCXBlcnJvcihhdlsyXSk7CisJZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKHJlYWQoZmQsICZmaGRyLCBzaXplb2YoZmhkcikpICE9IHNpemVvZihmaGRyKSkKKwlnb3RvIHJlYWRlcnI7CisgICAgaSA9IGdldF8xNmJlKGZoZHIuZl9tYWdpYyk7CisgICAgaWYgKGkgIT0gVTgwMlRPQ01BR0lDICYmIGkgIT0gVTgwMldSTUFHSUMgJiYgaSAhPSBVODAyUk9NQUdJQykgeworCWZwcmludGYoc3RkZXJyLCAiJXM6IG5vdCBhbiB4Y29mZiBmaWxlXG4iLCBhdlsxXSk7CisJZXhpdCgxKTsKKyAgICB9CisgICAgYW91dHN6ID0gZ2V0XzE2YmUoZmhkci5mX29wdGhkcik7CisgICAgaWYgKHJlYWQoZmQsICZhb3V0LCBhb3V0c3opICE9IGFvdXRzeikKKwlnb3RvIHJlYWRlcnI7CisgICAgbnNlY3QgPSBnZXRfMTZiZShmaGRyLmZfbnNjbnMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuc2VjdDsgKytpKSB7CisJaWYgKHJlYWQoZmQsICZzaGRyLCBzaXplb2Yoc2hkcikpICE9IHNpemVvZihzaGRyKSkKKwkgICAgZ290byByZWFkZXJyOworCWlmIChzdHJjbXAoc2hkci5zX25hbWUsICIudGV4dCIpID09IDApIHsKKwkgICAgcHV0XzE2YmUoYW91dC5vX3NuZW50cnksIGkrMSk7CisJICAgIHB1dF8xNmJlKGFvdXQub19zbnRleHQsIGkrMSk7CisJfSBlbHNlIGlmIChzdHJjbXAoc2hkci5zX25hbWUsICIuZGF0YSIpID09IDApIHsKKwkgICAgcHV0XzE2YmUoYW91dC5vX3NuZGF0YSwgaSsxKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChzaGRyLnNfbmFtZSwgIi5ic3MiKSA9PSAwKSB7CisJICAgIHB1dF8xNmJlKGFvdXQub19zbmJzcywgaSsxKTsKKwl9CisgICAgfQorICAgIHB1dF8xNmJlKGFvdXQubWFnaWMsIEFPVVRfTUFHSUMpOworICAgIGlmIChsc2VlayhmZCwgKGxvbmcpIHNpemVvZihzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciksIDApID09IC0xCisJfHwgd3JpdGUoZmQsICZhb3V0LCBhb3V0c3opICE9IGFvdXRzeikgeworCWZwcmludGYoc3RkZXJyLCAiJXM6IHdyaXRlIGVycm9yXG4iLCBhdlsxXSk7CisJZXhpdCgxKTsKKyAgICB9CisgICAgY2xvc2UoZmQpOworICAgIGV4aXQoMCk7CisKK3JlYWRlcnI6CisgICAgZnByaW50ZihzdGRlcnIsICIlczogcmVhZCBlcnJvciBvciBmaWxlIHRvbyBzaG9ydFxuIiwgYXZbMV0pOworICAgIGV4aXQoMSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMKaW5kZXggNjRlYzkzMS4uNTVlYzU5OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L21haW4uYwpAQCAtMjEsOCArMjEsOCBAQAogCiAKIC8qIFZhbHVlIHBpY2tlZCB0byBtYXRjaCB0aGF0IHVzZWQgYnkgeWFib290ICovCi0jZGVmaW5lIFBST0dfU1RBUlQJMHgwMTQwMDAwMAotI2RlZmluZSBSQU1fRU5ECQkoNTEyPDwyMCkgLy8gRml4bWU6IHVzZSBPRiAqLworI2RlZmluZSBQUk9HX1NUQVJUCTB4MDE0MDAwMDAJLyogb25seSB1c2VkIG9uIDY0LWJpdCBzeXN0ZW1zICovCisjZGVmaW5lIFJBTV9FTkQJCSg1MTI8PDIwKQkvKiBGaXhtZTogdXNlIE9GICovCiAjZGVmaW5lCU9ORV9NQgkJMHgxMDAwMDAKIAogZXh0ZXJuIGNoYXIgX3N0YXJ0W107CkBAIC0xNjAsNiArMTYwLDE3IEBACiAJZWxmb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpZWxmNjRwaC0+cF9vZmZzZXQ7CiAJdm1saW51eC5zaXplID0gKHVuc2lnbmVkIGxvbmcpZWxmNjRwaC0+cF9maWxlc3ogKyBlbGZvZmZzZXQ7CiAJdm1saW51eC5tZW1zaXplID0gKHVuc2lnbmVkIGxvbmcpZWxmNjRwaC0+cF9tZW1zeiArIGVsZm9mZnNldDsKKworI2lmIGRlZmluZWQoUFJPR19TVEFSVCkKKwkvKgorCSAqIE1haW50YWluIGEgIm1hZ2ljIiBtaW5pbXVtIGFkZHJlc3MuIFRoaXMga2VlcHMgc29tZSBvbGRlcgorCSAqIGZpcm13YXJlIHBsYXRmb3JtcyBydW5uaW5nLgorCSAqLworCisJaWYgKGNsYWltX2Jhc2UgPCBQUk9HX1NUQVJUKQorCQljbGFpbV9iYXNlID0gUFJPR19TVEFSVDsKKyNlbmRpZgorCiAJcmV0dXJuIDE7CiB9CiAKQEAgLTIwNiwxMiArMjE3LDE4IEBACiAJCWV4aXQoKTsKIAlpZiAoZ2V0cHJvcChjaG9zZW5faGFuZGxlLCAic3Rkb3V0IiwgJnN0ZG91dCwgc2l6ZW9mKHN0ZG91dCkpICE9IDQpCiAJCWV4aXQoKTsKLQlzdGRlcnIgPSBzdGRvdXQ7Ci0JaWYgKGdldHByb3AoY2hvc2VuX2hhbmRsZSwgInN0ZGluIiwgJnN0ZGluLCBzaXplb2Yoc3RkaW4pKSAhPSA0KQotCQlleGl0KCk7CiAKIAlwcmludGYoIlxuXHJ6SW1hZ2Ugc3RhcnRpbmc6IGxvYWRlZCBhdCAweCVwIChzcDogMHglcClcblxyIiwgX3N0YXJ0LCBzcCk7CiAKKwkvKgorCSAqIFRoZSBmaXJzdCBhdmFpbGFibGUgY2xhaW1fYmFzZSBtdXN0IGJlIGFib3ZlIHRoZSBlbmQgb2YgdGhlCisJICogdGhlIGxvYWRlZCBrZXJuZWwgd3JhcHBlciBmaWxlIChfc3RhcnQgdG8gX2VuZCBpbmNsdWRlcyB0aGUKKwkgKiBpbml0cmQgaW1hZ2UgaWYgaXQgaXMgcHJlc2VudCkgYW5kIHJvdW5kZWQgdXAgdG8gYSBuaWNlCisJICogMSBNQiBib3VuZGFyeSBmb3IgZ29vZCBtZWFzdXJlLgorCSAqLworCisJY2xhaW1fYmFzZSA9IF9BTElHTl9VUCgodW5zaWduZWQgbG9uZylfZW5kLCBPTkVfTUIpOworCiAJdm1saW51ei5hZGRyID0gKHVuc2lnbmVkIGxvbmcpX3ZtbGludXhfc3RhcnQ7CiAJdm1saW51ei5zaXplID0gKHVuc2lnbmVkIGxvbmcpKF92bWxpbnV4X2VuZCAtIF92bWxpbnV4X3N0YXJ0KTsKIApAQCAtMjI4LDI1ICsyNDUsNiBAQAogCQlleGl0KCk7CiAJfQogCi0JLyoKLQkgKiBUaGUgZmlyc3QgYXZhaWxhYmxlIGNsYWltX2Jhc2UgbXVzdCBiZSBhYm92ZSB0aGUgZW5kIG9mIHRoZQotCSAqIHRoZSBsb2FkZWQga2VybmVsIHdyYXBwZXIgZmlsZSAoX3N0YXJ0IHRvIF9lbmQgaW5jbHVkZXMgdGhlCi0JICogaW5pdHJkIGltYWdlIGlmIGl0IGlzIHByZXNlbnQpIGFuZCByb3VuZGVkIHVwIHRvIGEgbmljZQotCSAqIDEgTUIgYm91bmRhcnkgZm9yIGdvb2QgbWVhc3VyZS4KLQkgKi8KLQotCWNsYWltX2Jhc2UgPSBfQUxJR05fVVAoKHVuc2lnbmVkIGxvbmcpX2VuZCwgT05FX01CKTsKLQotI2lmIGRlZmluZWQoUFJPR19TVEFSVCkKLQkvKgotCSAqIE1haW50YWluIGEgIm1hZ2ljIiBtaW5pbXVtIGFkZHJlc3MuIFRoaXMga2VlcHMgc29tZSBvbGRlcgotCSAqIGZpcm13YXJlIHBsYXRmb3JtcyBydW5uaW5nLgotCSAqLwotCi0JaWYgKGNsYWltX2Jhc2UgPCBQUk9HX1NUQVJUKQotCQljbGFpbV9iYXNlID0gUFJPR19TVEFSVDsKLSNlbmRpZgotCiAJLyogV2UgbmVlZCB0byBjbGFpbSB0aGUgbWVtc2l6ZSBwbHVzIHRoZSBmaWxlIG9mZnNldCBzaW5jZSBnemlwCiAJICogd2lsbCBleHBhbmQgdGhlIGhlYWRlciAoZmlsZSBvZmZzZXQpLCB0aGVuIHRoZSBrZXJuZWwsIHRoZW4KIAkgKiBwb3NzaWJsZSBydWJiaXNoIHdlIGRvbid0IGNhcmUgYWJvdXQuIEJ1dCB0aGUga2VybmVsIGJzcyBtdXN0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wcm9tLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9wcm9tLmMKaW5kZXggNGJlYTJmNC4uZmEwMDU3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3Byb20uYwpAQCAtMTMsNDg3ICsxMywxNTMgQEAKICNpbmNsdWRlICJwcm9tLmgiCiAKIGludCAoKnByb20pKHZvaWQgKik7CitwaGFuZGxlIGNob3Nlbl9oYW5kbGU7CitpaGFuZGxlIHN0ZG91dDsKIAotdm9pZCAqY2hvc2VuX2hhbmRsZTsKLQotdm9pZCAqc3RkaW47Ci12b2lkICpzdGRvdXQ7Ci12b2lkICpzdGRlcnI7Ci0KLQotaW50Ci13cml0ZSh2b2lkICpoYW5kbGUsIHZvaWQgKnB0ciwgaW50IG5iKQoraW50IGNhbGxfcHJvbShjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LCAuLi4pCiB7CisJaW50IGk7CiAJc3RydWN0IHByb21fYXJncyB7Ci0JCWNoYXIgKnNlcnZpY2U7CisJCWNvbnN0IGNoYXIgKnNlcnZpY2U7CiAJCWludCBuYXJnczsKIAkJaW50IG5yZXQ7Ci0JCXZvaWQgKmloYW5kbGU7Ci0JCXZvaWQgKmFkZHI7Ci0JCWludCBsZW47Ci0JCWludCBhY3R1YWw7CisJCXVuc2lnbmVkIGludCBhcmdzWzEyXTsKIAl9IGFyZ3M7CisJdmFfbGlzdCBsaXN0OwogCi0JYXJncy5zZXJ2aWNlID0gIndyaXRlIjsKLQlhcmdzLm5hcmdzID0gMzsKLQlhcmdzLm5yZXQgPSAxOwotCWFyZ3MuaWhhbmRsZSA9IGhhbmRsZTsKLQlhcmdzLmFkZHIgPSBwdHI7Ci0JYXJncy5sZW4gPSBuYjsKLQlhcmdzLmFjdHVhbCA9IC0xOwotCSgqcHJvbSkoJmFyZ3MpOwotCXJldHVybiBhcmdzLmFjdHVhbDsKKwlhcmdzLnNlcnZpY2UgPSBzZXJ2aWNlOworCWFyZ3MubmFyZ3MgPSBuYXJnczsKKwlhcmdzLm5yZXQgPSBucmV0OworCisJdmFfc3RhcnQobGlzdCwgbnJldCk7CisJZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCisJCWFyZ3MuYXJnc1tpXSA9IHZhX2FyZyhsaXN0LCB1bnNpZ25lZCBpbnQpOworCXZhX2VuZChsaXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBucmV0OyBpKyspCisJCWFyZ3MuYXJnc1tuYXJncytpXSA9IDA7CisKKwlpZiAocHJvbSgmYXJncykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gKG5yZXQgPiAwKT8gYXJncy5hcmdzW25hcmdzXTogMDsKIH0KIAotaW50Ci1yZWFkKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBpbnQgbmIpCitpbnQgY2FsbF9wcm9tX3JldChjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LAorCQkgIHVuc2lnbmVkIGludCAqcmV0cywgLi4uKQogeworCWludCBpOwogCXN0cnVjdCBwcm9tX2FyZ3MgewotCQljaGFyICpzZXJ2aWNlOworCQljb25zdCBjaGFyICpzZXJ2aWNlOwogCQlpbnQgbmFyZ3M7CiAJCWludCBucmV0OwotCQl2b2lkICppaGFuZGxlOwotCQl2b2lkICphZGRyOwotCQlpbnQgbGVuOwotCQlpbnQgYWN0dWFsOworCQl1bnNpZ25lZCBpbnQgYXJnc1sxMl07CiAJfSBhcmdzOworCXZhX2xpc3QgbGlzdDsKIAotCWFyZ3Muc2VydmljZSA9ICJyZWFkIjsKLQlhcmdzLm5hcmdzID0gMzsKLQlhcmdzLm5yZXQgPSAxOwotCWFyZ3MuaWhhbmRsZSA9IGhhbmRsZTsKLQlhcmdzLmFkZHIgPSBwdHI7Ci0JYXJncy5sZW4gPSBuYjsKLQlhcmdzLmFjdHVhbCA9IC0xOwotCSgqcHJvbSkoJmFyZ3MpOwotCXJldHVybiBhcmdzLmFjdHVhbDsKKwlhcmdzLnNlcnZpY2UgPSBzZXJ2aWNlOworCWFyZ3MubmFyZ3MgPSBuYXJnczsKKwlhcmdzLm5yZXQgPSBucmV0OworCisJdmFfc3RhcnQobGlzdCwgcmV0cyk7CisJZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCisJCWFyZ3MuYXJnc1tpXSA9IHZhX2FyZyhsaXN0LCB1bnNpZ25lZCBpbnQpOworCXZhX2VuZChsaXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBucmV0OyBpKyspCisJCWFyZ3MuYXJnc1tuYXJncytpXSA9IDA7CisKKwlpZiAocHJvbSgmYXJncykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocmV0cyAhPSAodm9pZCAqKSAwKQorCQlmb3IgKGkgPSAxOyBpIDwgbnJldDsgKytpKQorCQkJcmV0c1tpLTFdID0gYXJncy5hcmdzW25hcmdzK2ldOworCisJcmV0dXJuIChucmV0ID4gMCk/IGFyZ3MuYXJnc1tuYXJnc106IDA7CiB9CiAKLXZvaWQKLWV4aXQoKQoraW50IHdyaXRlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBpbnQgbmIpCiB7Ci0Jc3RydWN0IHByb21fYXJncyB7Ci0JCWNoYXIgKnNlcnZpY2U7Ci0JfSBhcmdzOwotCi0JZm9yICg7OykgewotCQlhcmdzLnNlcnZpY2UgPSAiZXhpdCI7Ci0JCSgqcHJvbSkoJmFyZ3MpOwotCX0KKwlyZXR1cm4gY2FsbF9wcm9tKCJ3cml0ZSIsIDMsIDEsIGhhbmRsZSwgcHRyLCBuYik7CiB9CiAKLXZvaWQKLXBhdXNlKHZvaWQpCi17Ci0Jc3RydWN0IHByb21fYXJncyB7Ci0JCWNoYXIgKnNlcnZpY2U7Ci0JfSBhcmdzOwotCi0JYXJncy5zZXJ2aWNlID0gImVudGVyIjsKLQkoKnByb20pKCZhcmdzKTsKLX0KLQotdm9pZCAqCi1maW5kZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHByb21fYXJncyB7Ci0JCWNoYXIgKnNlcnZpY2U7Ci0JCWludCBuYXJnczsKLQkJaW50IG5yZXQ7Ci0JCWNvbnN0IGNoYXIgKmRldnNwZWM7Ci0JCXZvaWQgKnBoYW5kbGU7Ci0JfSBhcmdzOwotCi0JYXJncy5zZXJ2aWNlID0gImZpbmRkZXZpY2UiOwotCWFyZ3MubmFyZ3MgPSAxOwotCWFyZ3MubnJldCA9IDE7Ci0JYXJncy5kZXZzcGVjID0gbmFtZTsKLQlhcmdzLnBoYW5kbGUgPSAodm9pZCAqKSAtMTsKLQkoKnByb20pKCZhcmdzKTsKLQlyZXR1cm4gYXJncy5waGFuZGxlOwotfQotCi12b2lkICoKLWNsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKQotewotCXN0cnVjdCBwcm9tX2FyZ3MgewotCQljaGFyICpzZXJ2aWNlOwotCQlpbnQgbmFyZ3M7Ci0JCWludCBucmV0OwotCQl1bnNpZ25lZCBpbnQgdmlydDsKLQkJdW5zaWduZWQgaW50IHNpemU7Ci0JCXVuc2lnbmVkIGludCBhbGlnbjsKLQkJdm9pZCAqcmV0OwotCX0gYXJnczsKLQotCWFyZ3Muc2VydmljZSA9ICJjbGFpbSI7Ci0JYXJncy5uYXJncyA9IDM7Ci0JYXJncy5ucmV0ID0gMTsKLQlhcmdzLnZpcnQgPSB2aXJ0OwotCWFyZ3Muc2l6ZSA9IHNpemU7Ci0JYXJncy5hbGlnbiA9IGFsaWduOwotCSgqcHJvbSkoJmFyZ3MpOwotCXJldHVybiBhcmdzLnJldDsKLX0KLQotaW50Ci1nZXRwcm9wKHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZiwgaW50IGJ1ZmxlbikKLXsKLQlzdHJ1Y3QgcHJvbV9hcmdzIHsKLQkJY2hhciAqc2VydmljZTsKLQkJaW50IG5hcmdzOwotCQlpbnQgbnJldDsKLQkJdm9pZCAqcGhhbmRsZTsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQkJdm9pZCAqYnVmOwotCQlpbnQgYnVmbGVuOwotCQlpbnQgc2l6ZTsKLQl9IGFyZ3M7Ci0KLQlhcmdzLnNlcnZpY2UgPSAiZ2V0cHJvcCI7Ci0JYXJncy5uYXJncyA9IDQ7Ci0JYXJncy5ucmV0ID0gMTsKLQlhcmdzLnBoYW5kbGUgPSBwaGFuZGxlOwotCWFyZ3MubmFtZSA9IG5hbWU7Ci0JYXJncy5idWYgPSBidWY7Ci0JYXJncy5idWZsZW4gPSBidWZsZW47Ci0JYXJncy5zaXplID0gLTE7Ci0JKCpwcm9tKSgmYXJncyk7Ci0JcmV0dXJuIGFyZ3Muc2l6ZTsKLX0KLQotaW50Ci1wdXRjKGludCBjLCB2b2lkICpmKQotewotCWNoYXIgY2ggPSBjOwotCi0JaWYgKGMgPT0gJ1xuJykKLQkJcHV0YygnXHInLCBmKTsKLQlyZXR1cm4gd3JpdGUoZiwgJmNoLCAxKSA9PSAxPyBjOiAtMTsKLX0KLQotaW50Ci1wdXRjaGFyKGludCBjKQotewotCXJldHVybiBwdXRjKGMsIHN0ZG91dCk7Ci19Ci0KLWludAotZnB1dHMoY2hhciAqc3RyLCB2b2lkICpmKQotewotCWludCBuID0gc3RybGVuKHN0cik7Ci0KLQlyZXR1cm4gd3JpdGUoZiwgc3RyLCBuKSA9PSBuPyAwOiAtMTsKLX0KLQotc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqIHMsIHNpemVfdCBjb3VudCkKLXsKLQljb25zdCBjaGFyICpzYzsKLQotCWZvciAoc2MgPSBzOyBjb3VudC0tICYmICpzYyAhPSAnXDAnOyArK3NjKQotCQkvKiBub3RoaW5nICovOwotCXJldHVybiBzYyAtIHM7Ci19Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgX19kaXY2NF8zMih1bnNpZ25lZCBsb25nIGxvbmcgKmRpdmlkZW5kLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBkaXZpc29yKTsKLQotLyogVGhlIHVubmVjZXNzYXJ5IHBvaW50ZXIgY29tcGFyZSBpcyB0aGVyZQotICogdG8gY2hlY2sgZm9yIHR5cGUgc2FmZXR5IChuIG11c3QgYmUgNjRiaXQpCisvKgorICogT2xkZXIgT0YncyByZXF1aXJlIHRoYXQgd2hlbiBjbGFpbWluZyBhIHNwZWNpZmljIHJhbmdlIG9mIGFkZHJlc3NlcywKKyAqIHdlIGNsYWltIHRoZSBwaHlzaWNhbCBzcGFjZSBpbiB0aGUgL21lbW9yeSBub2RlIGFuZCB0aGUgdmlydHVhbAorICogc3BhY2UgaW4gdGhlIGNob3NlbiBtbXUgbm9kZSwgYW5kIHRoZW4gZG8gYSBtYXAgb3BlcmF0aW9uIHRvCisgKiBtYXAgdmlydHVhbCB0byBwaHlzaWNhbC4KICAqLwotIyBkZWZpbmUgZG9fZGl2KG4sYmFzZSkgKHsJCQkJCQlcCi0JdW5zaWduZWQgaW50IF9fYmFzZSA9IChiYXNlKTsJCQkJCVwKLQl1bnNpZ25lZCBpbnQgX19yZW07CQkJCQkJXAotCSh2b2lkKSgoKHR5cGVvZigobikpICopMCkgPT0gKCh1bnNpZ25lZCBsb25nIGxvbmcgKikwKSk7CVwKLQlpZiAoKChuKSA+PiAzMikgPT0gMCkgewkJCQkJCVwKLQkJX19yZW0gPSAodW5zaWduZWQgaW50KShuKSAlIF9fYmFzZTsJCQlcCi0JCShuKSA9ICh1bnNpZ25lZCBpbnQpKG4pIC8gX19iYXNlOwkJCVwKLQl9IGVsc2UJCQkJCQkJCVwKLQkJX19yZW0gPSBfX2RpdjY0XzMyKCYobiksIF9fYmFzZSk7CQkJXAotCV9fcmVtOwkJCQkJCQkJXAotIH0pCitzdGF0aWMgaW50IG5lZWRfbWFwID0gLTE7CitzdGF0aWMgaWhhbmRsZSBjaG9zZW5fbW11Oworc3RhdGljIHBoYW5kbGUgbWVtb3J5OwogCi1zdGF0aWMgaW50IHNraXBfYXRvaShjb25zdCBjaGFyICoqcykKKy8qIHJldHVybnMgdHJ1ZSBpZiBzMiBpcyBhIHByZWZpeCBvZiBzMSAqLworc3RhdGljIGludCBzdHJpbmdfbWF0Y2goY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQogewotCWludCBpLCBjOwotCi0JZm9yIChpID0gMDsgJzAnIDw9IChjID0gKipzKSAmJiBjIDw9ICc5JzsgKysqcykKLQkJaSA9IGkqMTAgKyBjIC0gJzAnOwotCXJldHVybiBpOworCWZvciAoOyAqczI7ICsrczIpCisJCWlmICgqczErKyAhPSAqczIpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAotI2RlZmluZSBaRVJPUEFECTEJCS8qIHBhZCB3aXRoIHplcm8gKi8KLSNkZWZpbmUgU0lHTgkyCQkvKiB1bnNpZ25lZC9zaWduZWQgbG9uZyAqLwotI2RlZmluZSBQTFVTCTQJCS8qIHNob3cgcGx1cyAqLwotI2RlZmluZSBTUEFDRQk4CQkvKiBzcGFjZSBpZiBwbHVzICovCi0jZGVmaW5lIExFRlQJMTYJCS8qIGxlZnQganVzdGlmaWVkICovCi0jZGVmaW5lIFNQRUNJQUwJMzIJCS8qIDB4ICovCi0jZGVmaW5lIExBUkdFCTY0CQkvKiB1c2UgJ0FCQ0RFRicgaW5zdGVhZCBvZiAnYWJjZGVmJyAqLwotCi1zdGF0aWMgY2hhciAqIG51bWJlcihjaGFyICogc3RyLCB1bnNpZ25lZCBsb25nIGxvbmcgbnVtLCBpbnQgYmFzZSwgaW50IHNpemUsIGludCBwcmVjaXNpb24sIGludCB0eXBlKQorc3RhdGljIGludCBjaGVja19vZl92ZXJzaW9uKHZvaWQpCiB7Ci0JY2hhciBjLHNpZ24sdG1wWzY2XTsKLQljb25zdCBjaGFyICpkaWdpdHM9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7Ci0JaW50IGk7CisJcGhhbmRsZSBvcHJvbSwgY2hvc2VuOworCWNoYXIgdmVyc2lvbls2NF07CiAKLQlpZiAodHlwZSAmIExBUkdFKQotCQlkaWdpdHMgPSAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKLQlpZiAodHlwZSAmIExFRlQpCi0JCXR5cGUgJj0gflpFUk9QQUQ7Ci0JaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikKKwlvcHJvbSA9IGZpbmRkZXZpY2UoIi9vcGVucHJvbSIpOworCWlmIChvcHJvbSA9PSAocGhhbmRsZSkgLTEpCiAJCXJldHVybiAwOwotCWMgPSAodHlwZSAmIFpFUk9QQUQpID8gJzAnIDogJyAnOwotCXNpZ24gPSAwOwotCWlmICh0eXBlICYgU0lHTikgewotCQlpZiAoKHNpZ25lZCBsb25nIGxvbmcpbnVtIDwgMCkgewotCQkJc2lnbiA9ICctJzsKLQkJCW51bSA9IC0gKHNpZ25lZCBsb25nIGxvbmcpbnVtOwotCQkJc2l6ZS0tOwotCQl9IGVsc2UgaWYgKHR5cGUgJiBQTFVTKSB7Ci0JCQlzaWduID0gJysnOwotCQkJc2l6ZS0tOwotCQl9IGVsc2UgaWYgKHR5cGUgJiBTUEFDRSkgewotCQkJc2lnbiA9ICcgJzsKLQkJCXNpemUtLTsKKwlpZiAoZ2V0cHJvcChvcHJvbSwgIm1vZGVsIiwgdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKSA8PSAwKQorCQlyZXR1cm4gMDsKKwl2ZXJzaW9uW3NpemVvZih2ZXJzaW9uKS0xXSA9IDA7CisJcHJpbnRmKCJPRiB2ZXJzaW9uID0gJyVzJ1xyXG4iLCB2ZXJzaW9uKTsKKwlpZiAoIXN0cmluZ19tYXRjaCh2ZXJzaW9uLCAiT3BlbiBGaXJtd2FyZSwgMS4iKQorCSAgICAmJiAhc3RyaW5nX21hdGNoKHZlcnNpb24sICJGaXJtV29ya3MsMy4iKSkKKwkJcmV0dXJuIDA7CisJY2hvc2VuID0gZmluZGRldmljZSgiL2Nob3NlbiIpOworCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7CisJCWNob3NlbiA9IGZpbmRkZXZpY2UoIi9jaG9zZW5AMCIpOworCQlpZiAoY2hvc2VuID09IChwaGFuZGxlKSAtMSkgeworCQkJcHJpbnRmKCJubyBjaG9zZW5cbiIpOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0JaWYgKHR5cGUgJiBTUEVDSUFMKSB7Ci0JCWlmIChiYXNlID09IDE2KQotCQkJc2l6ZSAtPSAyOwotCQllbHNlIGlmIChiYXNlID09IDgpCi0JCQlzaXplLS07CisJaWYgKGdldHByb3AoY2hvc2VuLCAibW11IiwgJmNob3Nlbl9tbXUsIHNpemVvZihjaG9zZW5fbW11KSkgPD0gMCkgeworCQlwcmludGYoIm5vIG1tdVxuIik7CisJCXJldHVybiAwOwogCX0KLQlpID0gMDsKLQlpZiAobnVtID09IDApCi0JCXRtcFtpKytdPScwJzsKLQllbHNlIHdoaWxlIChudW0gIT0gMCkgewotCQl0bXBbaSsrXSA9IGRpZ2l0c1tkb19kaXYobnVtLCBiYXNlKV07Ci0JfQotCWlmIChpID4gcHJlY2lzaW9uKQotCQlwcmVjaXNpb24gPSBpOwotCXNpemUgLT0gcHJlY2lzaW9uOwotCWlmICghKHR5cGUmKFpFUk9QQUQrTEVGVCkpKQotCQl3aGlsZShzaXplLS0+MCkKLQkJCSpzdHIrKyA9ICcgJzsKLQlpZiAoc2lnbikKLQkJKnN0cisrID0gc2lnbjsKLQlpZiAodHlwZSAmIFNQRUNJQUwpIHsKLQkJaWYgKGJhc2U9PTgpCi0JCQkqc3RyKysgPSAnMCc7Ci0JCWVsc2UgaWYgKGJhc2U9PTE2KSB7Ci0JCQkqc3RyKysgPSAnMCc7Ci0JCQkqc3RyKysgPSBkaWdpdHNbMzNdOworCW1lbW9yeSA9IChpaGFuZGxlKSBjYWxsX3Byb20oIm9wZW4iLCAxLCAxLCAiL21lbW9yeSIpOworCWlmIChtZW1vcnkgPT0gKGloYW5kbGUpIC0xKSB7CisJCW1lbW9yeSA9IChpaGFuZGxlKSBjYWxsX3Byb20oIm9wZW4iLCAxLCAxLCAiL21lbW9yeUAwIik7CisJCWlmIChtZW1vcnkgPT0gKGloYW5kbGUpIC0xKSB7CisJCQlwcmludGYoIm5vIG1lbW9yeSBub2RlXG4iKTsKKwkJCXJldHVybiAwOwogCQl9CiAJfQotCWlmICghKHR5cGUgJiBMRUZUKSkKLQkJd2hpbGUgKHNpemUtLSA+IDApCi0JCQkqc3RyKysgPSBjOwotCXdoaWxlIChpIDwgcHJlY2lzaW9uLS0pCi0JCSpzdHIrKyA9ICcwJzsKLQl3aGlsZSAoaS0tID4gMCkKLQkJKnN0cisrID0gdG1wW2ldOwotCXdoaWxlIChzaXplLS0gPiAwKQotCQkqc3RyKysgPSAnICc7Ci0JcmV0dXJuIHN0cjsKKwlwcmludGYoIm9sZCBPRiBkZXRlY3RlZFxyXG4iKTsKKwlyZXR1cm4gMTsKIH0KIAotaW50IHZzcHJpbnRmKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit2b2lkICpjbGFpbSh1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbikKIHsKLQlpbnQgbGVuOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBudW07Ci0JaW50IGksIGJhc2U7Ci0JY2hhciAqIHN0cjsKLQljb25zdCBjaGFyICpzOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKIAotCWludCBmbGFnczsJCS8qIGZsYWdzIHRvIG51bWJlcigpICovCi0KLQlpbnQgZmllbGRfd2lkdGg7CS8qIHdpZHRoIG9mIG91dHB1dCBmaWVsZCAqLwotCWludCBwcmVjaXNpb247CQkvKiBtaW4uICMgb2YgZGlnaXRzIGZvciBpbnRlZ2VyczsgbWF4Ci0JCQkJICAgbnVtYmVyIG9mIGNoYXJzIGZvciBmcm9tIHN0cmluZyAqLwotCWludCBxdWFsaWZpZXI7CQkvKiAnaCcsICdsJywgb3IgJ0wnIGZvciBpbnRlZ2VyIGZpZWxkcyAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgIC8qICd6JyBzdXBwb3J0IGFkZGVkIDIzLzcvMTk5OSBTLkguICAgICovCi0JCQkJLyogJ3onIGNoYW5nZWQgdG8gJ1onIC0tZGF2aWRtIDEvMjUvOTkgKi8KLQorCWlmIChuZWVkX21hcCA8IDApCisJCW5lZWRfbWFwID0gY2hlY2tfb2ZfdmVyc2lvbigpOworCWlmIChhbGlnbiB8fCAhbmVlZF9tYXApCisJCXJldHVybiAodm9pZCAqKSBjYWxsX3Byb20oImNsYWltIiwgMywgMSwgdmlydCwgc2l6ZSwgYWxpZ24pOwogCQotCWZvciAoc3RyPWJ1ZiA7ICpmbXQgOyArK2ZtdCkgewotCQlpZiAoKmZtdCAhPSAnJScpIHsKLQkJCSpzdHIrKyA9ICpmbXQ7Ci0JCQljb250aW51ZTsKLQkJfQotCQkJCi0JCS8qIHByb2Nlc3MgZmxhZ3MgKi8KLQkJZmxhZ3MgPSAwOwotCQlyZXBlYXQ6Ci0JCQkrK2ZtdDsJCS8qIHRoaXMgYWxzbyBza2lwcyBmaXJzdCAnJScgKi8KLQkJCXN3aXRjaCAoKmZtdCkgewotCQkJCWNhc2UgJy0nOiBmbGFncyB8PSBMRUZUOyBnb3RvIHJlcGVhdDsKLQkJCQljYXNlICcrJzogZmxhZ3MgfD0gUExVUzsgZ290byByZXBlYXQ7Ci0JCQkJY2FzZSAnICc6IGZsYWdzIHw9IFNQQUNFOyBnb3RvIHJlcGVhdDsKLQkJCQljYXNlICcjJzogZmxhZ3MgfD0gU1BFQ0lBTDsgZ290byByZXBlYXQ7Ci0JCQkJY2FzZSAnMCc6IGZsYWdzIHw9IFpFUk9QQUQ7IGdvdG8gcmVwZWF0OwotCQkJCX0KLQkJCi0JCS8qIGdldCBmaWVsZCB3aWR0aCAqLwotCQlmaWVsZF93aWR0aCA9IC0xOwotCQlpZiAoJzAnIDw9ICpmbXQgJiYgKmZtdCA8PSAnOScpCi0JCQlmaWVsZF93aWR0aCA9IHNraXBfYXRvaSgmZm10KTsKLQkJZWxzZSBpZiAoKmZtdCA9PSAnKicpIHsKLQkJCSsrZm10OwotCQkJLyogaXQncyB0aGUgbmV4dCBhcmd1bWVudCAqLwotCQkJZmllbGRfd2lkdGggPSB2YV9hcmcoYXJncywgaW50KTsKLQkJCWlmIChmaWVsZF93aWR0aCA8IDApIHsKLQkJCQlmaWVsZF93aWR0aCA9IC1maWVsZF93aWR0aDsKLQkJCQlmbGFncyB8PSBMRUZUOwotCQkJfQotCQl9Ci0KLQkJLyogZ2V0IHRoZSBwcmVjaXNpb24gKi8KLQkJcHJlY2lzaW9uID0gLTE7Ci0JCWlmICgqZm10ID09ICcuJykgewotCQkJKytmbXQ7CQotCQkJaWYgKCcwJyA8PSAqZm10ICYmICpmbXQgPD0gJzknKQotCQkJCXByZWNpc2lvbiA9IHNraXBfYXRvaSgmZm10KTsKLQkJCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7Ci0JCQkJKytmbXQ7Ci0JCQkJLyogaXQncyB0aGUgbmV4dCBhcmd1bWVudCAqLwotCQkJCXByZWNpc2lvbiA9IHZhX2FyZyhhcmdzLCBpbnQpOwotCQkJfQotCQkJaWYgKHByZWNpc2lvbiA8IDApCi0JCQkJcHJlY2lzaW9uID0gMDsKLQkJfQotCi0JCS8qIGdldCB0aGUgY29udmVyc2lvbiBxdWFsaWZpZXIgKi8KLQkJcXVhbGlmaWVyID0gLTE7Ci0JCWlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJyB8fCAqZm10ID09J1onKSB7Ci0JCQlxdWFsaWZpZXIgPSAqZm10OwotCQkJKytmbXQ7Ci0JCX0KLQotCQkvKiBkZWZhdWx0IGJhc2UgKi8KLQkJYmFzZSA9IDEwOwotCi0JCXN3aXRjaCAoKmZtdCkgewotCQljYXNlICdjJzoKLQkJCWlmICghKGZsYWdzICYgTEVGVCkpCi0JCQkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQotCQkJCQkqc3RyKysgPSAnICc7Ci0JCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikgdmFfYXJnKGFyZ3MsIGludCk7Ci0JCQl3aGlsZSAoLS1maWVsZF93aWR0aCA+IDApCi0JCQkJKnN0cisrID0gJyAnOwotCQkJY29udGludWU7Ci0KLQkJY2FzZSAncyc6Ci0JCQlzID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7Ci0JCQlpZiAoIXMpCi0JCQkJcyA9ICI8TlVMTD4iOwotCi0JCQlsZW4gPSBzdHJubGVuKHMsIHByZWNpc2lvbik7Ci0KLQkJCWlmICghKGZsYWdzICYgTEVGVCkpCi0JCQkJd2hpbGUgKGxlbiA8IGZpZWxkX3dpZHRoLS0pCi0JCQkJCSpzdHIrKyA9ICcgJzsKLQkJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKLQkJCQkqc3RyKysgPSAqcysrOwotCQkJd2hpbGUgKGxlbiA8IGZpZWxkX3dpZHRoLS0pCi0JCQkJKnN0cisrID0gJyAnOwotCQkJY29udGludWU7Ci0KLQkJY2FzZSAncCc6Ci0JCQlpZiAoZmllbGRfd2lkdGggPT0gLTEpIHsKLQkJCQlmaWVsZF93aWR0aCA9IDIqc2l6ZW9mKHZvaWQgKik7Ci0JCQkJZmxhZ3MgfD0gWkVST1BBRDsKLQkJCX0KLQkJCXN0ciA9IG51bWJlcihzdHIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpIHZhX2FyZyhhcmdzLCB2b2lkICopLCAxNiwKLQkJCQlmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7Ci0JCQljb250aW51ZTsKLQotCi0JCWNhc2UgJ24nOgotCQkJaWYgKHF1YWxpZmllciA9PSAnbCcpIHsKLQkJCQlsb25nICogaXAgPSB2YV9hcmcoYXJncywgbG9uZyAqKTsKLQkJCQkqaXAgPSAoc3RyIC0gYnVmKTsKLQkJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdaJykgewotCQkJCXNpemVfdCAqIGlwID0gdmFfYXJnKGFyZ3MsIHNpemVfdCAqKTsKLQkJCQkqaXAgPSAoc3RyIC0gYnVmKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50ICogaXAgPSB2YV9hcmcoYXJncywgaW50ICopOwotCQkJCSppcCA9IChzdHIgLSBidWYpOwotCQkJfQotCQkJY29udGludWU7Ci0KLQkJY2FzZSAnJSc6Ci0JCQkqc3RyKysgPSAnJSc7Ci0JCQljb250aW51ZTsKLQotCQkvKiBpbnRlZ2VyIG51bWJlciBmb3JtYXRzIC0gc2V0IHVwIHRoZSBmbGFncyBhbmQgImJyZWFrIiAqLwotCQljYXNlICdvJzoKLQkJCWJhc2UgPSA4OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnWCc6Ci0JCQlmbGFncyB8PSBMQVJHRTsKLQkJY2FzZSAneCc6Ci0JCQliYXNlID0gMTY7Ci0JCQlicmVhazsKLQotCQljYXNlICdkJzoKLQkJY2FzZSAnaSc6Ci0JCQlmbGFncyB8PSBTSUdOOwotCQljYXNlICd1JzoKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQkqc3RyKysgPSAnJSc7Ci0JCQlpZiAoKmZtdCkKLQkJCQkqc3RyKysgPSAqZm10OwotCQkJZWxzZQotCQkJCS0tZm10OwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHF1YWxpZmllciA9PSAnbCcpIHsKLQkJCW51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKLQkJCWlmIChmbGFncyAmIFNJR04pCi0JCQkJbnVtID0gKHNpZ25lZCBsb25nKSBudW07Ci0JCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdaJykgewotCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHNpemVfdCk7Ci0JCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdoJykgewotCQkJbnVtID0gKHVuc2lnbmVkIHNob3J0KSB2YV9hcmcoYXJncywgaW50KTsKLQkJCWlmIChmbGFncyAmIFNJR04pCi0JCQkJbnVtID0gKHNpZ25lZCBzaG9ydCkgbnVtOwotCQl9IGVsc2UgewotCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7Ci0JCQlpZiAoZmxhZ3MgJiBTSUdOKQotCQkJCW51bSA9IChzaWduZWQgaW50KSBudW07Ci0JCX0KLQkJc3RyID0gbnVtYmVyKHN0ciwgbnVtLCBiYXNlLCBmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7Ci0JfQotCSpzdHIgPSAnXDAnOwotCXJldHVybiBzdHItYnVmOwotfQotCi1pbnQgc3ByaW50ZihjaGFyICogYnVmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IGFyZ3M7Ci0JaW50IGk7Ci0KLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCWk9dnNwcmludGYoYnVmLGZtdCxhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0JcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyBjaGFyIHNwcmludF9idWZbMTAyNF07Ci0KLWludAotcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQlpbnQgbjsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JbiA9IHZzcHJpbnRmKHNwcmludF9idWYsIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCXdyaXRlKHN0ZG91dCwgc3ByaW50X2J1Ziwgbik7Ci0JcmV0dXJuIG47CisJcmV0ID0gY2FsbF9wcm9tX3JldCgiY2FsbC1tZXRob2QiLCA1LCAyLCAmcmVzdWx0LCAiY2xhaW0iLCBtZW1vcnksCisJCQkgICAgYWxpZ24sIHNpemUsIHZpcnQpOworCWlmIChyZXQgIT0gMCB8fCByZXN1bHQgPT0gLTEpCisJCXJldHVybiAodm9pZCAqKSAtMTsKKwlyZXQgPSBjYWxsX3Byb21fcmV0KCJjYWxsLW1ldGhvZCIsIDUsIDIsICZyZXN1bHQsICJjbGFpbSIsIGNob3Nlbl9tbXUsCisJCQkgICAgYWxpZ24sIHNpemUsIHZpcnQpOworCS8qIDB4MTIgPT0gY29oZXJlbnQgKyByZWFkL3dyaXRlICovCisJcmV0ID0gY2FsbF9wcm9tKCJjYWxsLW1ldGhvZCIsIDYsIDEsICJtYXAiLCBjaG9zZW5fbW11LAorCQkJMHgxMiwgc2l6ZSwgdmlydCwgdmlydCk7CisJcmV0dXJuICh2b2lkICopIHZpcnQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wcm9tLmggYi9hcmNoL3Bvd2VycGMvYm9vdC9wcm9tLmgKaW5kZXggOTZhYjVhZS4uM2UyZGRkNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvcHJvbS5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3Byb20uaApAQCAtMSwxOCArMSwzNCBAQAogI2lmbmRlZiBfUFBDX0JPT1RfUFJPTV9IXwogI2RlZmluZSBfUFBDX0JPT1RfUFJPTV9IXwogCi1leHRlcm4gaW50ICgqcHJvbSkgKHZvaWQgKik7Ci1leHRlcm4gdm9pZCAqY2hvc2VuX2hhbmRsZTsKK3R5cGVkZWYgdm9pZCAqcGhhbmRsZTsKK3R5cGVkZWYgdm9pZCAqaWhhbmRsZTsKIAotZXh0ZXJuIHZvaWQgKnN0ZGluOwotZXh0ZXJuIHZvaWQgKnN0ZG91dDsKLWV4dGVybiB2b2lkICpzdGRlcnI7CitleHRlcm4gaW50ICgqcHJvbSkgKHZvaWQgKik7CitleHRlcm4gcGhhbmRsZSBjaG9zZW5faGFuZGxlOworZXh0ZXJuIGloYW5kbGUgc3Rkb3V0OworCitpbnQJY2FsbF9wcm9tKGNvbnN0IGNoYXIgKnNlcnZpY2UsIGludCBuYXJncywgaW50IG5yZXQsIC4uLik7CitpbnQJY2FsbF9wcm9tX3JldChjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LAorCQkgICAgICB1bnNpZ25lZCBpbnQgKnJldHMsIC4uLik7CiAKIGV4dGVybiBpbnQgd3JpdGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIGludCBuYik7Ci1leHRlcm4gaW50IHJlYWQodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIGludCBuYik7Ci1leHRlcm4gdm9pZCBleGl0KHZvaWQpOwotZXh0ZXJuIHZvaWQgcGF1c2Uodm9pZCk7Ci1leHRlcm4gdm9pZCAqZmluZGRldmljZShjb25zdCBjaGFyICopOwotZXh0ZXJuIHZvaWQgKmNsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKTsKLWV4dGVybiBpbnQgZ2V0cHJvcCh2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWYsIGludCBidWZsZW4pOworZXh0ZXJuIHZvaWQgKmNsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsbik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleGl0KHZvaWQpCit7CisJY2FsbF9wcm9tKCJleGl0IiwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgcGhhbmRsZSBmaW5kZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIChwaGFuZGxlKSBjYWxsX3Byb20oImZpbmRkZXZpY2UiLCAxLCAxLCBuYW1lKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0cHJvcCh2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICB2b2lkICpidWYsIGludCBidWZsZW4pCit7CisJcmV0dXJuIGNhbGxfcHJvbSgiZ2V0cHJvcCIsIDQsIDEsIHBoYW5kbGUsIG5hbWUsIGJ1ZiwgYnVmbGVuKTsKK30KKwogI2VuZGlmCQkJCS8qIF9QUENfQk9PVF9QUk9NX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9yczYwMDAuaCBiL2FyY2gvcG93ZXJwYy9ib290L3JzNjAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2Y0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9yczYwMDAuaApAQCAtMCwwICsxLDI0MyBAQAorLyogSUJNIFJTLzYwMDAgIlhDT0ZGIiBmaWxlIGRlZmluaXRpb25zIGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KKyAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCisgICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKKyAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCisgICBXcml0dGVuIGJ5IE1pbWkgUGhcMzczXDM2NG5nLVRoXDM0NW8gVlwzNjUgb2YgSUJNCisgICBhbmQgSm9obiBHaWxtb3JlIG9mIEN5Z251cyBTdXBwb3J0LiAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgeworCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKwljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KKwljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKwljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisJY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KKwljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKwljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KK307CisKKyAgICAgICAgLyogSUJNIFJTLzYwMDAgKi8KKyNkZWZpbmUgVTgwMldSTUFHSUMgICAgIDA3MzAgICAgLyogd3JpdGVhYmxlIHRleHQgc2VnbWVudHMgKipjaGgqKiAgICAgICovCisjZGVmaW5lIFU4MDJST01BR0lDICAgICAwNzM1ICAgIC8qIHJlYWRvbmx5IHNoYXJhYmxlIHRleHQgc2VnbWVudHMgICAgICAqLworI2RlZmluZSBVODAyVE9DTUFHSUMgICAgMDczNyAgICAvKiByZWFkb25seSB0ZXh0IHNlZ21lbnRzIGFuZCBUT0MgICAgICAgKi8KKworI2RlZmluZSBCQURNQUcoeCkJXAorCSgoeCkuZl9tYWdpYyAhPSBVODAyUk9NQUdJQyAmJiAoeCkuZl9tYWdpYyAhPSBVODAyV1JNQUdJQyAmJiBcCisJICh4KS5mX21hZ2ljICE9IFU4MDJUT0NNQUdJQykKKworI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKKyNkZWZpbmUJRklMSFNaCTIwCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIJbWFnaWNbMl07CS8qIHR5cGUgb2YgZmlsZQkJCSovCisgIHVuc2lnbmVkIGNoYXIJdnN0YW1wWzJdOwkvKiB2ZXJzaW9uIHN0YW1wCQkqLworICB1bnNpZ25lZCBjaGFyCXRzaXplWzRdOwkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5ICovCisgIHVuc2lnbmVkIGNoYXIJZHNpemVbNF07CS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkqLworICB1bnNpZ25lZCBjaGFyCWJzaXplWzRdOwkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJKi8KKyAgdW5zaWduZWQgY2hhcgllbnRyeVs0XTsJLyogZW50cnkgcHQuCQkJKi8KKyAgdW5zaWduZWQgY2hhcgl0ZXh0X3N0YXJ0WzRdOwkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIHVuc2lnbmVkIGNoYXIJZGF0YV9zdGFydFs0XTsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICB1bnNpZ25lZCBjaGFyCW9fdG9jWzRdOwkvKiBhZGRyZXNzIG9mIFRPQyAqLworICB1bnNpZ25lZCBjaGFyCW9fc25lbnRyeVsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgZW50cnkgcG9pbnQgKi8KKyAgdW5zaWduZWQgY2hhcglvX3NudGV4dFsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLnRleHQgc2VjdGlvbiAqLworICB1bnNpZ25lZCBjaGFyCW9fc25kYXRhWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAuZGF0YSBzZWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJb19zbnRvY1syXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgVE9DICovCisgIHVuc2lnbmVkIGNoYXIJb19zbmxvYWRlclsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLmxvYWRlciBzZWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJb19zbmJzc1syXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLmJzcyBzZWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJb19hbGdudGV4dFsyXTsJLyogLnRleHQgYWxpZ25tZW50ICovCisgIHVuc2lnbmVkIGNoYXIJb19hbGduZGF0YVsyXTsJLyogLmRhdGEgYWxpZ25tZW50ICovCisgIHVuc2lnbmVkIGNoYXIJb19tb2R0eXBlWzJdOwkvKiBtb2R1bGUgdHlwZSAoPz8pICovCisgIHVuc2lnbmVkIGNoYXIgb19jcHV0eXBlWzJdOwkvKiBjcHUgdHlwZSAqLworICB1bnNpZ25lZCBjaGFyCW9fbWF4c3RhY2tbNF07CS8qIG1heCBzdGFjayBzaXplICg/PykgKi8KKyAgdW5zaWduZWQgY2hhciBvX21heGRhdGFbNF07CS8qIG1heCBkYXRhIHNpemUgKD8/KSAqLworICB1bnNpZ25lZCBjaGFyCW9fcmVzdjJbMTJdOwkvKiByZXNlcnZlZCAqLworfQorQU9VVEhEUjsKKworI2RlZmluZSBBT1VUU1ogNzIKKyNkZWZpbmUgU01BTExfQU9VVFNaICgyOCkKKyNkZWZpbmUgQU9VVEhEUlNaIDcyCisKKyNkZWZpbmUJUlM2S19BT1VUSERSX09NQUdJQwkweDAxMDcJLyogb2xkOiB0ZXh0ICYgZGF0YSB3cml0ZWFibGUgKi8KKyNkZWZpbmUJUlM2S19BT1VUSERSX05NQUdJQwkweDAxMDgJLyogbmV3OiB0ZXh0IHIvbywgZGF0YSByL3cgKi8KKyNkZWZpbmUJUlM2S19BT1VUSERSX1pNQUdJQwkweDAxMEIJLyogcGFnZWQ6IHRleHQgci9vLCBib3RoIHBhZ2UtYWxpZ25lZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RydWN0IGV4dGVybmFsX3NjbmhkciB7CisJY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLworCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCisJY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLworCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KKwljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKwljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLworCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCisJY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KKwljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCisJY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLworfTsKKworLyoKKyAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucworICovCisjZGVmaW5lIF9URVhUCSIudGV4dCIKKyNkZWZpbmUgX0RBVEEJIi5kYXRhIgorI2RlZmluZSBfQlNTCSIuYnNzIgorI2RlZmluZSBfUEFECSIucGFkIgorI2RlZmluZSBfTE9BREVSCSIubG9hZGVyIgorCisjZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCisjZGVmaW5lCVNDTkhTWgk0MAorCisvKiBYQ09GRiB1c2VzIGEgc3BlY2lhbCAubG9hZGVyIHNlY3Rpb24gd2l0aCB0eXBlIFNUWVBfTE9BREVSLiAgKi8KKyNkZWZpbmUgU1RZUF9MT0FERVIgMHgxMDAwCisKKy8qIFhDT0ZGIHVzZXMgYSBzcGVjaWFsIC5kZWJ1ZyBzZWN0aW9uIHdpdGggdHlwZSBTVFlQX0RFQlVHLiAgKi8KKyNkZWZpbmUgU1RZUF9ERUJVRyAweDIwMDAKKworLyogWENPRkYgaGFuZGxlcyBsaW5lIG51bWJlciBvciByZWxvY2F0aW9uIG92ZXJmbG93IGJ5IGNyZWF0aW5nCisgICBhbm90aGVyIHNlY3Rpb24gaGVhZGVyIHdpdGggU1RZUF9PVlJGTE8gc2V0LiAgKi8KKyNkZWZpbmUgU1RZUF9PVlJGTE8gMHg4MDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KKyAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgorICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKKyAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAqLworc3RydWN0IGV4dGVybmFsX2xpbmVubyB7CisJdW5pb24geworCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KKwkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KKwl9IGxfYWRkcjsKKwljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCit9OworCisKKyNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KKyNkZWZpbmUJTElORVNaCTYKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCisjZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLworI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KKworc3RydWN0IGV4dGVybmFsX3N5bWVudAoreworICB1bmlvbiB7CisgICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07CisgICAgc3RydWN0IHsKKyAgICAgIGNoYXIgZV96ZXJvZXNbNF07CisgICAgICBjaGFyIGVfb2Zmc2V0WzRdOworICAgIH0gZTsKKyAgfSBlOworICBjaGFyIGVfdmFsdWVbNF07CisgIGNoYXIgZV9zY251bVsyXTsKKyAgY2hhciBlX3R5cGVbMl07CisgIGNoYXIgZV9zY2xhc3NbMV07CisgIGNoYXIgZV9udW1hdXhbMV07Cit9OworCisKKworI2RlZmluZSBOX0JUTUFTSwkoMDE3KQorI2RlZmluZSBOX1RNQVNLCQkoMDYwKQorI2RlZmluZSBOX0JUU0hGVAkoNCkKKyNkZWZpbmUgTl9UU0hJRlQJKDIpCisKKwordW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKKwlzdHJ1Y3QgeworCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCisJCXVuaW9uIHsKKwkJCXN0cnVjdCB7CisJCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLworCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KKwkJCX0geF9sbnN6OworCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCisJCX0geF9taXNjOworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCisJCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCisJCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCisJCQl9IHhfZmNuOworCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLworCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07CisJCQl9IHhfYXJ5OworCQl9IHhfZmNuYXJ5OworCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLworCX0geF9zeW07CisKKwl1bmlvbiB7CisJCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKKwkJc3RydWN0IHsKKwkJCWNoYXIgeF96ZXJvZXNbNF07CisJCQljaGFyIHhfb2Zmc2V0WzRdOworCQl9IHhfbjsKKwl9IHhfZmlsZTsKKworCXN0cnVjdCB7CisJCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KKwkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KKwkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KKwl9IHhfc2NuOworCisgICAgICAgIHN0cnVjdCB7CisJCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KKwkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCisJCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KKwl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCisKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIHhfc2NubGVuWzRdOworCQl1bnNpZ25lZCBjaGFyIHhfcGFybWhhc2hbNF07CisJCXVuc2lnbmVkIGNoYXIgeF9zbmhhc2hbMl07CisJCXVuc2lnbmVkIGNoYXIgeF9zbXR5cFsxXTsKKwkJdW5zaWduZWQgY2hhciB4X3NtY2xhc1sxXTsKKwkJdW5zaWduZWQgY2hhciB4X3N0YWJbNF07CisJCXVuc2lnbmVkIGNoYXIgeF9zbnN0YWJbMl07CisJfSB4X2NzZWN0OworCit9OworCisjZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50CisjZGVmaW5lCVNZTUVTWgkxOAorI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50CisjZGVmaW5lCUFVWEVTWgkxOAorI2RlZmluZSBEQlhNQVNLIDB4ODAJCS8qIGZvciBkYnggc3RvcmFnZSBtYXNrICovCisjZGVmaW5lIFNZTU5BTUVfSU5fREVCVUcoc3ltcHRyKSAoKHN5bXB0ciktPm5fc2NsYXNzICYgREJYTUFTSykKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0cnVjdCBleHRlcm5hbF9yZWxvYyB7CisgIGNoYXIgcl92YWRkcls0XTsKKyAgY2hhciByX3N5bW5keFs0XTsKKyAgY2hhciByX3NpemVbMV07CisgIGNoYXIgcl90eXBlWzFdOworfTsKKworCisjZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYworI2RlZmluZSBSRUxTWiAxMAorCisjZGVmaW5lIERFRkFVTFRfREFUQV9TRUNUSU9OX0FMSUdOTUVOVCA0CisjZGVmaW5lIERFRkFVTFRfQlNTX1NFQ1RJT05fQUxJR05NRU5UIDQKKyNkZWZpbmUgREVGQVVMVF9URVhUX1NFQ1RJT05fQUxJR05NRU5UIDQKKy8qIEZvciBuZXcgc2VjdGlvbnMgd2UgaGF2bid0IGhlYXJkIG9mIGJlZm9yZSAqLworI2RlZmluZSBERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UIDQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YWE1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5jCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAxOTk3LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgInByb20uaCIKKworc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqIHMsIHNpemVfdCBjb3VudCkKK3sKKwljb25zdCBjaGFyICpzYzsKKworCWZvciAoc2MgPSBzOyBjb3VudC0tICYmICpzYyAhPSAnXDAnOyArK3NjKQorCQkvKiBub3RoaW5nICovOworCXJldHVybiBzYyAtIHM7Cit9CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgX19kaXY2NF8zMih1bnNpZ25lZCBsb25nIGxvbmcgKmRpdmlkZW5kLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBkaXZpc29yKTsKKworLyogVGhlIHVubmVjZXNzYXJ5IHBvaW50ZXIgY29tcGFyZSBpcyB0aGVyZQorICogdG8gY2hlY2sgZm9yIHR5cGUgc2FmZXR5IChuIG11c3QgYmUgNjRiaXQpCisgKi8KKyMgZGVmaW5lIGRvX2RpdihuLGJhc2UpICh7CQkJCQkJXAorCXVuc2lnbmVkIGludCBfX2Jhc2UgPSAoYmFzZSk7CQkJCQlcCisJdW5zaWduZWQgaW50IF9fcmVtOwkJCQkJCVwKKwkodm9pZCkoKCh0eXBlb2YoKG4pKSAqKTApID09ICgodW5zaWduZWQgbG9uZyBsb25nICopMCkpOwlcCisJaWYgKCgobikgPj4gMzIpID09IDApIHsJCQkJCQlcCisJCV9fcmVtID0gKHVuc2lnbmVkIGludCkobikgJSBfX2Jhc2U7CQkJXAorCQkobikgPSAodW5zaWduZWQgaW50KShuKSAvIF9fYmFzZTsJCQlcCisJfSBlbHNlCQkJCQkJCQlcCisJCV9fcmVtID0gX19kaXY2NF8zMigmKG4pLCBfX2Jhc2UpOwkJCVwKKwlfX3JlbTsJCQkJCQkJCVwKKyB9KQorCitzdGF0aWMgaW50IHNraXBfYXRvaShjb25zdCBjaGFyICoqcykKK3sKKwlpbnQgaSwgYzsKKworCWZvciAoaSA9IDA7ICcwJyA8PSAoYyA9ICoqcykgJiYgYyA8PSAnOSc7ICsrKnMpCisJCWkgPSBpKjEwICsgYyAtICcwJzsKKwlyZXR1cm4gaTsKK30KKworI2RlZmluZSBaRVJPUEFECTEJCS8qIHBhZCB3aXRoIHplcm8gKi8KKyNkZWZpbmUgU0lHTgkyCQkvKiB1bnNpZ25lZC9zaWduZWQgbG9uZyAqLworI2RlZmluZSBQTFVTCTQJCS8qIHNob3cgcGx1cyAqLworI2RlZmluZSBTUEFDRQk4CQkvKiBzcGFjZSBpZiBwbHVzICovCisjZGVmaW5lIExFRlQJMTYJCS8qIGxlZnQganVzdGlmaWVkICovCisjZGVmaW5lIFNQRUNJQUwJMzIJCS8qIDB4ICovCisjZGVmaW5lIExBUkdFCTY0CQkvKiB1c2UgJ0FCQ0RFRicgaW5zdGVhZCBvZiAnYWJjZGVmJyAqLworCitzdGF0aWMgY2hhciAqIG51bWJlcihjaGFyICogc3RyLCB1bnNpZ25lZCBsb25nIGxvbmcgbnVtLCBpbnQgYmFzZSwgaW50IHNpemUsIGludCBwcmVjaXNpb24sIGludCB0eXBlKQoreworCWNoYXIgYyxzaWduLHRtcFs2Nl07CisJY29uc3QgY2hhciAqZGlnaXRzPSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCWludCBpOworCisJaWYgKHR5cGUgJiBMQVJHRSkKKwkJZGlnaXRzID0gIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7CisJaWYgKHR5cGUgJiBMRUZUKQorCQl0eXBlICY9IH5aRVJPUEFEOworCWlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpCisJCXJldHVybiAwOworCWMgPSAodHlwZSAmIFpFUk9QQUQpID8gJzAnIDogJyAnOworCXNpZ24gPSAwOworCWlmICh0eXBlICYgU0lHTikgeworCQlpZiAoKHNpZ25lZCBsb25nIGxvbmcpbnVtIDwgMCkgeworCQkJc2lnbiA9ICctJzsKKwkJCW51bSA9IC0gKHNpZ25lZCBsb25nIGxvbmcpbnVtOworCQkJc2l6ZS0tOworCQl9IGVsc2UgaWYgKHR5cGUgJiBQTFVTKSB7CisJCQlzaWduID0gJysnOworCQkJc2l6ZS0tOworCQl9IGVsc2UgaWYgKHR5cGUgJiBTUEFDRSkgeworCQkJc2lnbiA9ICcgJzsKKwkJCXNpemUtLTsKKwkJfQorCX0KKwlpZiAodHlwZSAmIFNQRUNJQUwpIHsKKwkJaWYgKGJhc2UgPT0gMTYpCisJCQlzaXplIC09IDI7CisJCWVsc2UgaWYgKGJhc2UgPT0gOCkKKwkJCXNpemUtLTsKKwl9CisJaSA9IDA7CisJaWYgKG51bSA9PSAwKQorCQl0bXBbaSsrXT0nMCc7CisJZWxzZSB3aGlsZSAobnVtICE9IDApIHsKKwkJdG1wW2krK10gPSBkaWdpdHNbZG9fZGl2KG51bSwgYmFzZSldOworCX0KKwlpZiAoaSA+IHByZWNpc2lvbikKKwkJcHJlY2lzaW9uID0gaTsKKwlzaXplIC09IHByZWNpc2lvbjsKKwlpZiAoISh0eXBlJihaRVJPUEFEK0xFRlQpKSkKKwkJd2hpbGUoc2l6ZS0tPjApCisJCQkqc3RyKysgPSAnICc7CisJaWYgKHNpZ24pCisJCSpzdHIrKyA9IHNpZ247CisJaWYgKHR5cGUgJiBTUEVDSUFMKSB7CisJCWlmIChiYXNlPT04KQorCQkJKnN0cisrID0gJzAnOworCQllbHNlIGlmIChiYXNlPT0xNikgeworCQkJKnN0cisrID0gJzAnOworCQkJKnN0cisrID0gZGlnaXRzWzMzXTsKKwkJfQorCX0KKwlpZiAoISh0eXBlICYgTEVGVCkpCisJCXdoaWxlIChzaXplLS0gPiAwKQorCQkJKnN0cisrID0gYzsKKwl3aGlsZSAoaSA8IHByZWNpc2lvbi0tKQorCQkqc3RyKysgPSAnMCc7CisJd2hpbGUgKGktLSA+IDApCisJCSpzdHIrKyA9IHRtcFtpXTsKKwl3aGlsZSAoc2l6ZS0tID4gMCkKKwkJKnN0cisrID0gJyAnOworCXJldHVybiBzdHI7Cit9CisKK2ludCB2c3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQoreworCWludCBsZW47CisJdW5zaWduZWQgbG9uZyBsb25nIG51bTsKKwlpbnQgaSwgYmFzZTsKKwljaGFyICogc3RyOworCWNvbnN0IGNoYXIgKnM7CisKKwlpbnQgZmxhZ3M7CQkvKiBmbGFncyB0byBudW1iZXIoKSAqLworCisJaW50IGZpZWxkX3dpZHRoOwkvKiB3aWR0aCBvZiBvdXRwdXQgZmllbGQgKi8KKwlpbnQgcHJlY2lzaW9uOwkJLyogbWluLiAjIG9mIGRpZ2l0cyBmb3IgaW50ZWdlcnM7IG1heAorCQkJCSAgIG51bWJlciBvZiBjaGFycyBmb3IgZnJvbSBzdHJpbmcgKi8KKwlpbnQgcXVhbGlmaWVyOwkJLyogJ2gnLCAnbCcsIG9yICdMJyBmb3IgaW50ZWdlciBmaWVsZHMgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAvKiAneicgc3VwcG9ydCBhZGRlZCAyMy83LzE5OTkgUy5ILiAgICAqLworCQkJCS8qICd6JyBjaGFuZ2VkIHRvICdaJyAtLWRhdmlkbSAxLzI1Lzk5ICovCisKKwkKKwlmb3IgKHN0cj1idWYgOyAqZm10IDsgKytmbXQpIHsKKwkJaWYgKCpmbXQgIT0gJyUnKSB7CisJCQkqc3RyKysgPSAqZm10OworCQkJY29udGludWU7CisJCX0KKwkJCQorCQkvKiBwcm9jZXNzIGZsYWdzICovCisJCWZsYWdzID0gMDsKKwkJcmVwZWF0OgorCQkJKytmbXQ7CQkvKiB0aGlzIGFsc28gc2tpcHMgZmlyc3QgJyUnICovCisJCQlzd2l0Y2ggKCpmbXQpIHsKKwkJCQljYXNlICctJzogZmxhZ3MgfD0gTEVGVDsgZ290byByZXBlYXQ7CisJCQkJY2FzZSAnKyc6IGZsYWdzIHw9IFBMVVM7IGdvdG8gcmVwZWF0OworCQkJCWNhc2UgJyAnOiBmbGFncyB8PSBTUEFDRTsgZ290byByZXBlYXQ7CisJCQkJY2FzZSAnIyc6IGZsYWdzIHw9IFNQRUNJQUw7IGdvdG8gcmVwZWF0OworCQkJCWNhc2UgJzAnOiBmbGFncyB8PSBaRVJPUEFEOyBnb3RvIHJlcGVhdDsKKwkJCQl9CisJCQorCQkvKiBnZXQgZmllbGQgd2lkdGggKi8KKwkJZmllbGRfd2lkdGggPSAtMTsKKwkJaWYgKCcwJyA8PSAqZm10ICYmICpmbXQgPD0gJzknKQorCQkJZmllbGRfd2lkdGggPSBza2lwX2F0b2koJmZtdCk7CisJCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7CisJCQkrK2ZtdDsKKwkJCS8qIGl0J3MgdGhlIG5leHQgYXJndW1lbnQgKi8KKwkJCWZpZWxkX3dpZHRoID0gdmFfYXJnKGFyZ3MsIGludCk7CisJCQlpZiAoZmllbGRfd2lkdGggPCAwKSB7CisJCQkJZmllbGRfd2lkdGggPSAtZmllbGRfd2lkdGg7CisJCQkJZmxhZ3MgfD0gTEVGVDsKKwkJCX0KKwkJfQorCisJCS8qIGdldCB0aGUgcHJlY2lzaW9uICovCisJCXByZWNpc2lvbiA9IC0xOworCQlpZiAoKmZtdCA9PSAnLicpIHsKKwkJCSsrZm10OwkKKwkJCWlmICgnMCcgPD0gKmZtdCAmJiAqZm10IDw9ICc5JykKKwkJCQlwcmVjaXNpb24gPSBza2lwX2F0b2koJmZtdCk7CisJCQllbHNlIGlmICgqZm10ID09ICcqJykgeworCQkJCSsrZm10OworCQkJCS8qIGl0J3MgdGhlIG5leHQgYXJndW1lbnQgKi8KKwkJCQlwcmVjaXNpb24gPSB2YV9hcmcoYXJncywgaW50KTsKKwkJCX0KKwkJCWlmIChwcmVjaXNpb24gPCAwKQorCQkJCXByZWNpc2lvbiA9IDA7CisJCX0KKworCQkvKiBnZXQgdGhlIGNvbnZlcnNpb24gcXVhbGlmaWVyICovCisJCXF1YWxpZmllciA9IC0xOworCQlpZiAoKmZtdCA9PSAnaCcgfHwgKmZtdCA9PSAnbCcgfHwgKmZtdCA9PSAnTCcgfHwgKmZtdCA9PSdaJykgeworCQkJcXVhbGlmaWVyID0gKmZtdDsKKwkJCSsrZm10OworCQl9CisKKwkJLyogZGVmYXVsdCBiYXNlICovCisJCWJhc2UgPSAxMDsKKworCQlzd2l0Y2ggKCpmbXQpIHsKKwkJY2FzZSAnYyc6CisJCQlpZiAoIShmbGFncyAmIExFRlQpKQorCQkJCXdoaWxlICgtLWZpZWxkX3dpZHRoID4gMCkKKwkJCQkJKnN0cisrID0gJyAnOworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpIHZhX2FyZyhhcmdzLCBpbnQpOworCQkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQorCQkJCSpzdHIrKyA9ICcgJzsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgJ3MnOgorCQkJcyA9IHZhX2FyZyhhcmdzLCBjaGFyICopOworCQkJaWYgKCFzKQorCQkJCXMgPSAiPE5VTEw+IjsKKworCQkJbGVuID0gc3RybmxlbihzLCBwcmVjaXNpb24pOworCisJCQlpZiAoIShmbGFncyAmIExFRlQpKQorCQkJCXdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKQorCQkJCQkqc3RyKysgPSAnICc7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCQkJKnN0cisrID0gKnMrKzsKKwkJCXdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKQorCQkJCSpzdHIrKyA9ICcgJzsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgJ3AnOgorCQkJaWYgKGZpZWxkX3dpZHRoID09IC0xKSB7CisJCQkJZmllbGRfd2lkdGggPSAyKnNpemVvZih2b2lkICopOworCQkJCWZsYWdzIHw9IFpFUk9QQUQ7CisJCQl9CisJCQlzdHIgPSBudW1iZXIoc3RyLAorCQkJCSh1bnNpZ25lZCBsb25nKSB2YV9hcmcoYXJncywgdm9pZCAqKSwgMTYsCisJCQkJZmllbGRfd2lkdGgsIHByZWNpc2lvbiwgZmxhZ3MpOworCQkJY29udGludWU7CisKKworCQljYXNlICduJzoKKwkJCWlmIChxdWFsaWZpZXIgPT0gJ2wnKSB7CisJCQkJbG9uZyAqIGlwID0gdmFfYXJnKGFyZ3MsIGxvbmcgKik7CisJCQkJKmlwID0gKHN0ciAtIGJ1Zik7CisJCQl9IGVsc2UgaWYgKHF1YWxpZmllciA9PSAnWicpIHsKKwkJCQlzaXplX3QgKiBpcCA9IHZhX2FyZyhhcmdzLCBzaXplX3QgKik7CisJCQkJKmlwID0gKHN0ciAtIGJ1Zik7CisJCQl9IGVsc2UgeworCQkJCWludCAqIGlwID0gdmFfYXJnKGFyZ3MsIGludCAqKTsKKwkJCQkqaXAgPSAoc3RyIC0gYnVmKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCisJCWNhc2UgJyUnOgorCQkJKnN0cisrID0gJyUnOworCQkJY29udGludWU7CisKKwkJLyogaW50ZWdlciBudW1iZXIgZm9ybWF0cyAtIHNldCB1cCB0aGUgZmxhZ3MgYW5kICJicmVhayIgKi8KKwkJY2FzZSAnbyc6CisJCQliYXNlID0gODsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1gnOgorCQkJZmxhZ3MgfD0gTEFSR0U7CisJCWNhc2UgJ3gnOgorCQkJYmFzZSA9IDE2OworCQkJYnJlYWs7CisKKwkJY2FzZSAnZCc6CisJCWNhc2UgJ2knOgorCQkJZmxhZ3MgfD0gU0lHTjsKKwkJY2FzZSAndSc6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKnN0cisrID0gJyUnOworCQkJaWYgKCpmbXQpCisJCQkJKnN0cisrID0gKmZtdDsKKwkJCWVsc2UKKwkJCQktLWZtdDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChxdWFsaWZpZXIgPT0gJ2wnKSB7CisJCQludW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgbG9uZyk7CisJCQlpZiAoZmxhZ3MgJiBTSUdOKQorCQkJCW51bSA9IChzaWduZWQgbG9uZykgbnVtOworCQl9IGVsc2UgaWYgKHF1YWxpZmllciA9PSAnWicpIHsKKwkJCW51bSA9IHZhX2FyZyhhcmdzLCBzaXplX3QpOworCQl9IGVsc2UgaWYgKHF1YWxpZmllciA9PSAnaCcpIHsKKwkJCW51bSA9ICh1bnNpZ25lZCBzaG9ydCkgdmFfYXJnKGFyZ3MsIGludCk7CisJCQlpZiAoZmxhZ3MgJiBTSUdOKQorCQkJCW51bSA9IChzaWduZWQgc2hvcnQpIG51bTsKKwkJfSBlbHNlIHsKKwkJCW51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQpOworCQkJaWYgKGZsYWdzICYgU0lHTikKKwkJCQludW0gPSAoc2lnbmVkIGludCkgbnVtOworCQl9CisJCXN0ciA9IG51bWJlcihzdHIsIG51bSwgYmFzZSwgZmllbGRfd2lkdGgsIHByZWNpc2lvbiwgZmxhZ3MpOworCX0KKwkqc3RyID0gJ1wwJzsKKwlyZXR1cm4gc3RyLWJ1ZjsKK30KKworaW50IHNwcmludGYoY2hhciAqIGJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBpOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlpPXZzcHJpbnRmKGJ1ZixmbXQsYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiBpOworfQorCitzdGF0aWMgY2hhciBzcHJpbnRfYnVmWzEwMjRdOworCitpbnQKK3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IG47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCW4gPSB2c3ByaW50ZihzcHJpbnRfYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwl3cml0ZShzdGRvdXQsIHNwcmludF9idWYsIG4pOworCXJldHVybiBuOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uaCBiL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmgKaW5kZXggMjRiZDNhOC4uZWI5ZTE2YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5oCkBAIC03LDEwICs3LDQgQEAKIAogZXh0ZXJuIGludCB2c3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKIAotZXh0ZXJuIGludCBwdXRjKGludCBjLCB2b2lkICpmKTsKLWV4dGVybiBpbnQgcHV0Y2hhcihpbnQgYyk7Ci1leHRlcm4gaW50IGdldGNoYXIodm9pZCk7Ci0KLWV4dGVybiBpbnQgZnB1dHMoY2hhciAqc3RyLCB2b2lkICpmKTsKLQogI2VuZGlmCQkJCS8qIF9QUENfQk9PVF9TVERJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RyaW5nLlMgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdHJpbmcuUwppbmRleCBiMWVlYWVkLi5hYzNkNDNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9zdHJpbmcuUworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdHJpbmcuUwpAQCAtMTA3LDEwICsxMDcsMTIgQEAKIAlybHdpbm0uCXI3LHI1LDMyLTMsMywzMQkJLyogcjcgPSByNSA+PiAzICovCiAJYWRkaQlyNixyMywtNAogCWFkZGkJcjQscjQsLTQKLQliZXEJMmYJCQkvKiBpZiBsZXNzIHRoYW4gOCBieXRlcyB0byBkbyAqLworCWJlcQkzZgkJCS8qIGlmIGxlc3MgdGhhbiA4IGJ5dGVzIHRvIGRvICovCiAJYW5kaS4JcjAscjYsMwkJCS8qIGdldCBkZXN0IHdvcmQgYWxpZ25lZCAqLwogCW10Y3RyCXI3CiAJYm5lCTVmCisJYW5kaS4JcjAscjQsMwkJCS8qIGNoZWNrIHNyYyB3b3JkIGFsaWduZWQgdG9vICovCisJYm5lCTNmCiAxOglsd3oJcjcsNChyNCkKIAlsd3p1CXI4LDgocjQpCiAJc3R3CXI3LDQocjYpCkBAIC0xMzIsNiArMTM0LDExIEBACiAJYmRuegk0YgogCWJscgogNToJc3ViZmljCXIwLHIwLDQKKwljbXB3CWNyMSxyMCxyNQorCWFkZAlyNyxyMCxyNAorCWFuZGkuCXI3LHI3LDMJCQkvKiB3aWxsIHNvdXJjZSBiZSB3b3JkLWFsaWduZWQgdG9vPyAqLworCWJsZQljcjEsM2IKKwlibmUJM2IJCQkvKiBkbyBieXRlLWJ5LWJ5dGUgaWYgbm90ICovCiAJbXRjdHIJcjAKIDY6CWxieglyNyw0KHI0KQogCWFkZGkJcjQscjQsMQpAQCAtMTQ5LDEwICsxNTYsMTIgQEAKIAlybHdpbm0uCXI3LHI1LDMyLTMsMywzMQkJLyogcjcgPSByNSA+PiAzICovCiAJYWRkCXI2LHIzLHI1CiAJYWRkCXI0LHI0LHI1Ci0JYmVxCTJmCisJYmVxCTNmCiAJYW5kaS4JcjAscjYsMwogCW10Y3RyCXI3CiAJYm5lCTVmCisJYW5kaS4JcjAscjQsMworCWJuZQkzZgogMToJbHd6CXI3LC00KHI0KQogCWx3enUJcjgsLTgocjQpCiAJc3R3CXI3LC00KHI2KQpAQCAtMTcxLDcgKzE4MCwxMiBAQAogCXN0YnUJcjAsLTEocjYpCiAJYmRuegk0YgogCWJscgotNToJbXRjdHIJcjAKKzU6CWNtcHcJY3IxLHIwLHI1CisJc3ViZglyNyxyMCxyNAorCWFuZGkuCXI3LHI3LDMKKwlibGUJY3IxLDNiCisJYm5lCTNiCisJbXRjdHIJcjAKIDY6CWxienUJcjcsLTEocjQpCiAJc3RidQlyNywtMShyNikKIAliZG56CTZiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC96SW1hZ2UuY29mZi5sZHMgYi9hcmNoL3Bvd2VycGMvYm9vdC96SW1hZ2UuY29mZi5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxNjI1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5jb2ZmLmxkcwpAQCAtMCwwICsxLDQ2IEBACitPVVRQVVRfQVJDSChwb3dlcnBjOmNvbW1vbikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC4gPSAoNSoxMDI0KjEwMjQpOworICBfc3RhcnQgPSAuOworICAudGV4dCAgICAgIDoKKyAgeworICAgICooLnRleHQpCisgICAgKiguZml4dXApCisgIH0KKyAgX2V0ZXh0ID0gLjsKKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5yb2RhdGEqKQorICAgICooLmRhdGEqKQorICAgICooLnNkYXRhKikKKyAgICBfX2dvdDJfc3RhcnQgPSAuOworICAgICooLmdvdDIpCisgICAgX19nb3QyX2VuZCA9IC47CisKKyAgICBfdm1saW51eF9zdGFydCA9ICAuOworICAgICooLmtlcm5lbDp2bWxpbnV4LnN0cmlwKQorICAgIF92bWxpbnV4X2VuZCA9ICAuOworCisgICAgX2luaXRyZF9zdGFydCA9ICAuOworICAgICooLmtlcm5lbDppbml0cmQpCisgICAgX2luaXRyZF9lbmQgPSAgLjsKKyAgfQorCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX2VkYXRhICA9ICAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKQorICAgKiguYnNzKQorICB9CisgIF9lbmQgPSAuIDsKKworICAvRElTQ0FSRC8gOgorICB7CisgICAgKiguY29tbWVudCkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODM0eF9zeXNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODM0eF9zeXNfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZmY3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4MzR4X3N5c19kZWZjb25maWcKQEAgLTAsMCArMSw5MTEgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNS1nNDYxZDRlZGYtZGlydHkKKyMgRnJpIEphbiAxMyAxMTowMTo0NyAyMDA2CisjCisjIENPTkZJR19QUEM2NCBpcyBub3Qgc2V0CitDT05GSUdfUFBDMzI9eQorQ09ORklHX1BQQ19NRVJHRT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX1BQQz15CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19HRU5FUklDX05WUkFNPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKK0NPTkZJR19QUENfT0Y9eQorQ09ORklHX1BQQ19VREJHXzE2NTUwPXkKKyMgQ09ORklHX0dFTkVSSUNfVEJTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX1VJTUFHRT15CisKKyMKKyMgUHJvY2Vzc29yIHN1cHBvcnQKKyMKKyMgQ09ORklHX0NMQVNTSUMzMiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfNTJ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0CitDT05GSUdfUFBDXzgzeHg9eQorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR184eHggaXMgbm90IHNldAorIyBDT05GSUdfRTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FNTAwIGlzIG5vdCBzZXQKK0NPTkZJR182eHg9eQorQ09ORklHXzgzeHg9eQorQ09ORklHX1BQQ19GUFU9eQorQ09ORklHX1BQQ19TVERfTU1VPXkKK0NPTkZJR19QUENfU1REX01NVV8zMj15CisjIENPTkZJR19TTVAgaXMgbm90IHNldAorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKKyMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCitDT05GSUdfU0xBQj15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBsYXllcgorIworIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfUFBDX0dFTjU1MD15CisjIENPTkZJR19XQU5UX0VBUkxZX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgUGxhdGZvcm0gc3VwcG9ydAorIworQ09ORklHX01QQzgzNHhfU1lTPXkKK0NPTkZJR19NUEM4MzR4PXkKKworIworIyBLZXJuZWwgb3B0aW9ucworIworIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisjIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19HRU5FUklDX0lTQV9ETUE9eQorIyBDT05GSUdfUFBDX0k4MjU5IGlzIG5vdCBzZXQKK0NPTkZJR19QUENfSU5ESVJFQ1RfUENJPXkKK0NPTkZJR19GU0xfU09DPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9ET01BSU5TPXkKKyMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAorQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAorQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCitDT05GSUdfQk9PVF9MT0FEPTB4MDA4MDAwMDAKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzI3NjgKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfV0lOREZBUk0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfTUFSVkVMTF9QSFk9eQorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CisjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19ER1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19FMTAwPXkKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKK0NPTkZJR19HSUFORkFSPXkKKyMgQ09ORklHX0dGQVJfTkFQSSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR184M3h4X1dEVD15CisKKyMKKyMgUENJLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19QQ0lQQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dEVFBDSSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CitDT05GSUdfR0VOX1JUQz15CisjIENPTkZJR19HRU5fUlRDX1ggaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCisjIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CitDT05GSUdfSTJDX01QQz15CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUFJPU0FWQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TQVZBR0U0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDeDIwMF9BQ0IgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NNDFUMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19YMTIwNV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBTTiBEZXZpY2VzCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfUkVMQVlGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01TRE9TX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKKworIworIyBJbnN0cnVtZW50YXRpb24gU3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19CT09UWF9URVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9URVhUX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19MUEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19HNSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfTUFQTEUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0lTRVJJRVMgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworQ09ORklHX0NSWVBUTz15CisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIFNFQzIueCBPcHRpb25zCisjCitDT05GSUdfTVBDODM0OUVfU0VDMng9eQorCisjCisjIFNFQzIueCBUZXN0IE9wdGlvbnMKKyMKK0NPTkZJR19NUEM4MzQ5RV9TRUMyeFRFU1Q9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDU2Mzk5YzUuLjg0MGFhZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCURFRklORShQQUNBX0VYTUMsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgZXhtYykpOwogCURFRklORShQQUNBX0VYU0xCLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGV4c2xiKSk7CiAJREVGSU5FKFBBQ0FFTUVSR1NQLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGVtZXJnZW5jeV9zcCkpOwotCURFRklORShQQUNBTFBQQUNBLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGxwcGFjYSkpOworCURFRklORShQQUNBTFBQQUNBUFRSLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGxwcGFjYV9wdHIpKTsKIAlERUZJTkUoUEFDQUhXQ1BVSUQsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgaHdfY3B1X2lkKSk7CiAKIAlERUZJTkUoTFBQQUNBU1JSMCwgb2Zmc2V0b2Yoc3RydWN0IGxwcGFjYSwgc2F2ZWRfc3JyMCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUwppbmRleCBjY2E5NDJmLi5iNjFkODZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJbWZjcglyNwogCiAJLyogR2V0IHN0b3JhZ2UgcHRyICovCi0JTE9BREFERFIocjUsY3B1X3N0YXRlX3N0b3JhZ2UpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI1LGNwdV9zdGF0ZV9zdG9yYWdlKQogCiAJLyogV2Ugb25seSBkZWFsIHdpdGggOTcwIGZvciBub3cgKi8KIAltZnNwcglyMCxTUFJOX1BWUgpAQCAtMTY0LDcgKzE2NCw3IEBACiAJLyogR2V0IHN0b3JhZ2UgcHRyIChGSVhNRSB3aGVuIHVzaW5nIGFudG9uIHJlbG9jIGFzIHdlCiAJICogYXJlIHJ1bm5pbmcgd2l0aCB0cmFuc2xhdGlvbiBkaXNhYmxlZCBoZXJlCiAJICovCi0JTE9BREFERFIocjUsY3B1X3N0YXRlX3N0b3JhZ2UpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI1LGNwdV9zdGF0ZV9zdG9yYWdlKQogCiAJLyogV2Ugb25seSBkZWFsIHdpdGggOTcwIGZvciBub3cgKi8KIAltZnNwcglyMCxTUFJOX1BWUgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IDQzYzc0YTYuLjEwNjk2NDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKQEAgLTU1LDcgKzU1LDggQEAKICNkZWZpbmUgQ09NTU9OX1VTRVJfUE9XRVI0CShDT01NT05fVVNFUl9QUEM2NCB8IFBQQ19GRUFUVVJFX1BPV0VSNCkKICNkZWZpbmUgQ09NTU9OX1VTRVJfUE9XRVI1CShDT01NT05fVVNFUl9QUEM2NCB8IFBQQ19GRUFUVVJFX1BPV0VSNSkKICNkZWZpbmUgQ09NTU9OX1VTRVJfUE9XRVI1X1BMVVMJKENPTU1PTl9VU0VSX1BQQzY0IHwgUFBDX0ZFQVRVUkVfUE9XRVI1X1BMVVMpCi0KKyNkZWZpbmUgQ09NTU9OX1VTRVJfQk9PS0UJKFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFwKKwkJCQkgUFBDX0ZFQVRVUkVfQk9PS0UpCiAKIC8qIFdlIG9ubHkgc2V0IHRoZSBzcGUgZmVhdHVyZXMgaWYgdGhlIGtlcm5lbCB3YXMgY29tcGlsZWQgd2l0aAogICogc3BlIHN1cHBvcnQKQEAgLTc5LDcgKzgwLDggQEAKIAkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcG93ZXIzIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gUlM2NCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1JTNjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXIzIiwKIAl9LAogCXsJLyogUG93ZXIzKyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTkyLDcgKzk0LDggQEAKIAkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcG93ZXIzIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gUlM2NCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1JTNjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXIzIiwKIAl9LAogCXsJLyogTm9ydGhzdGFyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTA1LDcgKzEwOCw4IEBACiAJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3JzNjQiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBSUzY0LAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKKwkJLnBsYXRmb3JtCQk9ICJyczY0IiwKIAl9LAogCXsJLyogUHVsc2FyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTE4LDcgKzEyMiw4IEBACiAJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3JzNjQiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBSUzY0LAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKKwkJLnBsYXRmb3JtCQk9ICJyczY0IiwKIAl9LAogCXsJLyogSS1zdGFyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTMxLDcgKzEzNiw4IEBACiAJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3JzNjQiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBSUzY0LAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKKwkJLnBsYXRmb3JtCQk9ICJyczY0IiwKIAl9LAogCXsJLyogUy1zdGFyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTQ0LDcgKzE1MCw4IEBACiAJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3JzNjQiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBSUzY0LAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKKwkJLnBsYXRmb3JtCQk9ICJyczY0IiwKIAl9LAogCXsJLyogUG93ZXI0ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTU3LDcgKzE2NCw4IEBACiAJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNCIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IFBPV0VSNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKKwkJLnBsYXRmb3JtCQk9ICJwb3dlcjQiLAogCX0sCiAJewkvKiBQb3dlcjQrICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTcwLDcgKzE3OCw4IEBACiAJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNCIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IFBPV0VSNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKKwkJLnBsYXRmb3JtCQk9ICJwb3dlcjQiLAogCX0sCiAJewkvKiBQUEM5NzAgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0xODQsNyArMTkzLDggQEAKIAkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcHBjOTcwLAogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvOTcwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gUE9XRVI0LAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUE9XRVI0LAorCQkucGxhdGZvcm0JCT0gInBwYzk3MCIsCiAJfSwKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KICNpZiBkZWZpbmVkKENPTkZJR19QUEM2NCkgfHwgZGVmaW5lZChDT05GSUdfUE9XRVI0KQpAQCAtMjA0LDcgKzIxNCw4IEBACiAJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3BwYzk3MCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0Lzk3MCIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IFBPV0VSNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM5NzAiLAogCX0sCiAjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUFBDNjQpIHx8IGRlZmluZWQoQ09ORklHX1BPV0VSNCkgKi8KICNpZmRlZiBDT05GSUdfUFBDNjQKQEAgLTIxOSw3ICsyMzAsOCBAQAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wcGM5NzAsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC85NzAiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBQT1dFUjQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5wbGF0Zm9ybQkJPSAicHBjOTcwIiwKIAl9LAogCXsJLyogUG93ZXI1IEdSICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMjMyLDcgKzI0NCw4IEBACiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNSIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IFBPV0VSNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKKwkJLnBsYXRmb3JtCQk9ICJwb3dlcjUiLAogCX0sCiAJewkvKiBQb3dlcjUgR1MgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0yNDUsNyArMjU4LDggQEAKIAkJLm51bV9wbWNzCQk9IDYsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcG93ZXI1KyIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IFBPV0VSNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKKwkJLnBsYXRmb3JtCQk9ICJwb3dlcjUrIiwKIAl9LAogCXsJLyogQ2VsbCBCcm9hZGJhbmQgRW5naW5lICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMjU3LDYgKzI3MSw3IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9iZSwKKwkJLnBsYXRmb3JtCQk9ICJwcGMtY2VsbC1iZSIsCiAJfSwKIAl7CS8qIGRlZmF1bHQgbWF0Y2ggKi8KIAkJLnB2cl9tYXNrCQk9IDB4MDAwMDAwMDAsCkBAIC0yNjgsNiArMjgzLDcgQEAKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNCwKKwkJLnBsYXRmb3JtCQk9ICJwb3dlcjQiLAogCX0KICNlbmRpZgkvKiBDT05GSUdfUFBDNjQgKi8KICNpZmRlZiBDT05GSUdfUFBDMzIKQEAgLTI4MSw2ICsyOTcsNyBAQAogCQkJUFBDX0ZFQVRVUkVfVU5JRklFRF9DQUNIRSB8IFBQQ19GRUFUVVJFX05PX1RCLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzYwMSIsCiAJfSwKIAl7CS8qIDYwMyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTI5MCw3ICszMDcsOCBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDMKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDMsCisJCS5wbGF0Zm9ybQkJPSAicHBjNjAzIiwKIAl9LAogCXsJLyogNjAzZSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTMwMCw3ICszMTgsOCBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDMKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDMsCisJCS5wbGF0Zm9ybQkJPSAicHBjNjAzIiwKIAl9LAogCXsJLyogNjAzZXYgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0zMTAsNyArMzI5LDggQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzLAorCQkucGxhdGZvcm0JCT0gInBwYzYwMyIsCiAJfSwKIAl7CS8qIDYwNCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTMyMSw3ICszNDEsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gMiwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDQKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDQsCisJCS5wbGF0Zm9ybQkJPSAicHBjNjA0IiwKIAl9LAogCXsJLyogNjA0ZSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZjAwMCwKQEAgLTMzMiw3ICszNTMsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDQKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDQsCisJCS5wbGF0Zm9ybQkJPSAicHBjNjA0IiwKIAl9LAogCXsJLyogNjA0ciAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTM0Myw3ICszNjUsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDQKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV82MDQsCisJCS5wbGF0Zm9ybQkJPSAicHBjNjA0IiwKIAl9LAogCXsJLyogNjA0ZXYgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0zNTQsNyArMzc3LDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0LAorCQkucGxhdGZvcm0JCT0gInBwYzYwNCIsCiAJfSwKIAl7CS8qIDc0MC83NTAgKDB4NDIwMiwgZG9uJ3Qgc3VwcG9ydCBUQVUgPykgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmZmYsCkBAIC0zNjUsNyArMzg5LDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwLAorCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCiAJfSwKIAl7CS8qIDc1MENYICg4MDEwMCBhbmQgODAxMHg/KSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmMCwKQEAgLTM3Niw3ICs0MDEsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGN4LAorCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCiAJfSwKIAl7CS8qIDc1MENYICg4MjIwMSBhbmQgODIyMDIpICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmYwLApAQCAtMzg3LDcgKzQxMyw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGN4CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwY3gsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKIAl9LAogCXsJLyogNzUwQ1hlICg4MjIxNCkgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmZjAsCkBAIC0zOTgsNyArNDI1LDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwY3gKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAogCX0sCiAJewkvKiA3NTBDWGUgIkdla2tvIiAoODMyMTQpICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmZmLApAQCAtNDA5LDcgKzQzNyw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGN4CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwY3gsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKIAl9LAogCXsJLyogNzQ1Lzc1NSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZjAwMCwKQEAgLTQyMCw3ICs0NDksOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTAKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTAsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKIAl9LAogCXsJLyogNzUwRlggcmV2IDEueCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmYwMCwKQEAgLTQzMSw3ICs0NjEsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTAKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTAsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKIAl9LAogCXsJLyogNzUwRlggcmV2IDIuMCBtdXN0IGRpc2FibGUgSElEMFtEUE1dICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmZmLApAQCAtNDQyLDcgKzQ3Myw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAogCX0sCiAJewkvKiA3NTBGWCAoQWxsIHJldnMgZXhjZXB0IDIuMCkgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC00NTMsNyArNDg1LDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwZngKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBmeCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAogCX0sCiAJewkvKiA3NTBHWCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTQ2NCw3ICs0OTcsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBmeAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGZ4LAorCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCiAJfSwKIAl7CS8qIDc0MC83NTAgKEwyQ1IgYml0IG5lZWQgZml4dXAgZm9yIDc0MCkgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC00NzUsNyArNTA5LDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwLAorCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCiAJfSwKIAl7CS8qIDc0MDAgcmV2IDEuMSA/IChubyBUQVUpICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmZmLApAQCAtNDg2LDcgKzUyMSw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0MDAKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDAwLAorCQkucGxhdGZvcm0JCT0gInBwYzc0MDAiLAogCX0sCiAJewkvKiA3NDAwICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNDk3LDcgKzUzMyw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0MDAKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDAwLAorCQkucGxhdGZvcm0JCT0gInBwYzc0MDAiLAogCX0sCiAJewkvKiA3NDEwICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNTA4LDcgKzU0NSw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0MTAKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDEwLAorCQkucGxhdGZvcm0JCT0gInBwYzc0MDAiLAogCX0sCiAJewkvKiA3NDUwIDIuMCAtIG5vIGRvemUvbmFwICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmZmLApAQCAtNTIxLDcgKzU1OSw4IEBACiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gRzQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDUwIiwKIAl9LAogCXsJLyogNzQ1MCAyLjEgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmZmYsCkBAIC01MzQsNyArNTczLDggQEAKIAkJLm51bV9wbWNzCQk9IDYsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBHNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDUwIDIuMyBhbmQgbmV3ZXIgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC01NDcsNyArNTg3LDggQEAKIAkJLm51bV9wbWNzCQk9IDYsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBHNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDU1IHJldiAxLnggKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmMDAsCkBAIC01NjAsNyArNjAxLDggQEAKIAkJLm51bV9wbWNzCQk9IDYsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBHNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDU1IHJldiAyLjAgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmZmYsCkBAIC01NzMsNyArNjE1LDggQEAKIAkJLm51bV9wbWNzCQk9IDYsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBHNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDU1IG90aGVycyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTU4Niw3ICs2MjksOCBAQAogCQkubnVtX3BtY3MJCT0gNiwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDV4LAogCQkub3Byb2ZpbGVfY3B1X3R5cGUgICAgICA9ICJwcGMvNzQ1MCIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IEc0LAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRzQsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzQ1MCIsCiAJfSwKIAl7CS8qIDc0NDcvNzQ1NyBSZXYgMS4wICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmZmLApAQCAtNTk5LDcgKzY0Myw4IEBACiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gRzQsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDUwIiwKIAl9LAogCXsJLyogNzQ0Ny83NDU3IFJldiAxLjEgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmZmYsCkBAIC02MTIsNyArNjU3LDggQEAKIAkJLm51bV9wbWNzCQk9IDYsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBHNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDQ3Lzc0NTcgUmV2IDEuMiBhbmQgbGF0ZXIgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC02MjUsNyArNjcxLDggQEAKIAkJLm51bV9wbWNzCQk9IDYsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBHNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDQ3QSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTYzOCw3ICs2ODUsOCBAQAogCQkubnVtX3BtY3MJCT0gNiwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDV4LAogCQkub3Byb2ZpbGVfY3B1X3R5cGUgICAgICA9ICJwcGMvNzQ1MCIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IEc0LAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRzQsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzQ1MCIsCiAJfSwKIAl7CS8qIDc0NDggKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC02NTEsNyArNjk5LDggQEAKIAkJLm51bV9wbWNzCQk9IDYsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAotCQkub3Byb2ZpbGVfdHlwZQkJPSBHNCwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA4Mnh4ICg4MjQwLCA4MjQ1LCA4MjYwIGFyZSBhbGwgNjAzZSBjb3JlcykgKi8KIAkJLnB2cl9tYXNrCQk9IDB4N2ZmZjAwMDAsCkBAIC02NjEsNyArNzEwLDggQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzLAorCQkucGxhdGZvcm0JCT0gInBwYzYwMyIsCiAJfSwKIAl7CS8qIEFsbCBHMl9MRSAoNjAzZSBjb3JlLCBwbHVzIHNvbWUpIGhhdmUgdGhlIHNhbWUgcHZyICovCiAJCS5wdnJfbWFzawkJPSAweDdmZmYwMDAwLApAQCAtNjcxLDcgKzcyMSw4IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMworCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMywKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAogCX0sCiAJewkvKiBlMzAwIChhIDYwM2UgY29yZSwgcGx1cyBzb21lKSBvbiA4M3h4ICovCiAJCS5wdnJfbWFzawkJPSAweDdmZmYwMDAwLApAQCAtNjgxLDcgKzczMiw4IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMworCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMywKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAogCX0sCiAJewkvKiBkZWZhdWx0IG1hdGNoLCB3ZSBhc3N1bWUgc3BsaXQgSS9EIGNhY2hlICYgVEIgKG5vbi02MDEpLi4uICovCiAJCS5wdnJfbWFzawkJPSAweDAwMDAwMDAwLApAQCAtNjkxLDYgKzc0Myw3IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzYwMyIsCiAJfSwKICNlbmRpZiAvKiBDTEFTU0lDX1BQQyAqLwogI2lmZGVmIENPTkZJR184eHgKQEAgLTcwNCw2ICs3NTcsNyBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8IFBQQ19GRUFUVVJFX0hBU19NTVUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTYsCiAJCS5kY2FjaGVfYnNpemUJCT0gMTYsCisJCS5wbGF0Zm9ybQkJPSAicHBjODIzIiwKIAl9LAogI2VuZGlmIC8qIENPTkZJR184eHggKi8KICNpZmRlZiBDT05GSUdfNDB4CkBAIC03MTUsNiArNzY5LDcgQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAogCQkuaWNhY2hlX2JzaXplCQk9IDE2LAogCQkuZGNhY2hlX2JzaXplCQk9IDE2LAorCQkucGxhdGZvcm0JCT0gInBwYzQwMyIsCiAJfSwKIAl7CS8qIDQwM0dDWCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmYwMCwKQEAgLTcyNSw2ICs3ODAsNyBAQAogCQkgCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9OT19UQiwKIAkJLmljYWNoZV9ic2l6ZQkJPSAxNiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxNiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDMiLAogCX0sCiAJewkvKiA0MDNHID8/ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNzM0LDYgKzc5MCw3IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAxNiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxNiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDMiLAogCX0sCiAJewkvKiA0MDVHUCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTc0NCw2ICs4MDEsNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsJLyogU1RCIDAzeHh4ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNzU0LDYgKzgxMiw3IEBACiAJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAogCX0sCiAJewkvKiBTVEIgMDR4eHggKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC03NjQsNiArODIzLDcgQEAKIAkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9IQVNfNHh4TUFDLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQwNSIsCiAJfSwKIAl7CS8qIE5QNDA1TCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTc3NCw2ICs4MzQsNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsJLyogTlA0R1MzICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNzg0LDYgKzg0NSw3IEBACiAJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAogCX0sCiAJeyAgIC8qIE5QNDA1SCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTc5NCw2ICs4NTYsNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsJLyogNDA1R1ByICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtODA0LDYgKzg2Nyw3IEBACiAJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAogCX0sCiAJeyAgIC8qIFNUQngyNXh4ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtODE0LDYgKzg3OCw3IEBACiAJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAogCX0sCiAJewkvKiA0MDVMUCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTgyMyw2ICs4ODgsNyBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8IFBQQ19GRUFUVVJFX0hBU19NTVUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsJLyogWGlsaW54IFZpcnRleC1JSSBQcm8gICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtODMzLDYgKzg5OSw3IEBACiAJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAogCX0sCiAJewkvKiA0MDVFUCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTg0Myw2ICs5MTAsNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCiAjZW5kaWYgLyogQ09ORklHXzQweCAqLwpAQCAtODUyLDgxICs5MjAsOTAgQEAKIAkJLnB2cl92YWx1ZQkJPSAweDQwMDAwODUwLAogCQkuY3B1X25hbWUJCT0gIjQ0MEVQIFJldi4gQSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDRYLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiwgLyogNDQwRVAgaGFzIGFuIEZQVSAqLworCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSB8IFBQQ19GRUFUVVJFX0hBU19GUFUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsKIAkJLnB2cl9tYXNrCQk9IDB4ZjAwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg0MDAwMDhkMywKIAkJLmNwdV9uYW1lCQk9ICI0NDBFUCBSZXYuIEIiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsIC8qIDQ0MEVQIGhhcyBhbiBGUFUgKi8KKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UgfCBQUENfRkVBVFVSRV9IQVNfRlBVLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQ0MCIsCiAJfSwKIAl7CS8qIDQ0MEdQIFJldi4gQiAqLwogCQkucHZyX21hc2sJCT0gMHhmMDAwMGZmZiwKIAkJLnB2cl92YWx1ZQkJPSAweDQwMDAwNDQwLAogCQkuY3B1X25hbWUJCT0gIjQ0MEdQIFJldi4gQiIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDRYLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8IFBQQ19GRUFUVVJFX0hBU19NTVUsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQ0MGdwIiwKIAl9LAogCXsJLyogNDQwR1AgUmV2LiBDICovCiAJCS5wdnJfbWFzawkJPSAweGYwMDAwZmZmLAogCQkucHZyX3ZhbHVlCQk9IDB4NDAwMDA0ODEsCiAJCS5jcHVfbmFtZQkJPSAiNDQwR1AgUmV2LiBDIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDQwZ3AiLAogCX0sCiAJeyAvKiA0NDBHWCBSZXYuIEEgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZjAwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg1MDAwMDg1MCwKIAkJLmNwdV9uYW1lCQk9ICI0NDBHWCBSZXYuIEEiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJeyAvKiA0NDBHWCBSZXYuIEIgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZjAwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg1MDAwMDg1MSwKIAkJLmNwdV9uYW1lCQk9ICI0NDBHWCBSZXYuIEIiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJeyAvKiA0NDBHWCBSZXYuIEMgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZjAwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg1MDAwMDg5MiwKIAkJLmNwdV9uYW1lCQk9ICI0NDBHWCBSZXYuIEMiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJeyAvKiA0NDBHWCBSZXYuIEYgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZjAwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg1MDAwMDg5NCwKIAkJLmNwdV9uYW1lCQk9ICI0NDBHWCBSZXYuIEYiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJeyAvKiA0NDBTUCBSZXYuIEEgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmYwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg1MzAwMDg5MSwKIAkJLmNwdV9uYW1lCQk9ICI0NDBTUCBSZXYuIEEiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJeyAvKiA0NDBTUGUgUmV2LiBBICovCiAJCS5wdnJfbWFzawkJPSAweGZmMDAwZmZmLApAQCAtOTM0LDkgKzEwMTEsMTAgQEAKIAkJLmNwdV9uYW1lCQk9ICI0NDBTUGUgUmV2LiBBIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKIAkJCUNQVV9GVFJfVVNFX1RCLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8IFBQQ19GRUFUVVJFX0hBU19NTVUsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQ0MCIsCiAJfSwKICNlbmRpZiAvKiBDT05GSUdfNDR4ICovCiAjaWZkZWYgQ09ORklHX0ZTTF9CT09LRQpAQCAtOTQ2LDEwICsxMDI0LDExIEBACiAJCS5jcHVfbmFtZQkJPSAiZTIwMHo1IiwKIAkJLyogeHh4IC0gZ2FsYWs6IGFkZCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFICovCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfRTIwMCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfAotCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU19FRlBfU0lOR0xFIHwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0VGUF9TSU5HTEUgfAogCQkJUFBDX0ZFQVRVUkVfVU5JRklFRF9DQUNIRSwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM1NTU0IiwKIAl9LAogCXsJLyogZTIwMHo2ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZjAwMDAwLApAQCAtOTU3LDExICsxMDM2LDEyIEBACiAJCS5jcHVfbmFtZQkJPSAiZTIwMHo2IiwKIAkJLyogeHh4IC0gZ2FsYWs6IGFkZCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFICovCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfRTIwMCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfAotCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX1NQRV9DT01QIHwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UgfAorCQkJUFBDX0ZFQVRVUkVfU1BFX0NPTVAgfAogCQkJUFBDX0ZFQVRVUkVfSEFTX0VGUF9TSU5HTEUgfAogCQkJUFBDX0ZFQVRVUkVfVU5JRklFRF9DQUNIRSwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM1NTU0IiwKIAl9LAogCXsJLyogZTUwMCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTk2OSwxNCArMTA0OSwxNSBAQAogCQkuY3B1X25hbWUJCT0gImU1MDAiLAogCQkvKiB4eHggLSBnYWxhazogYWRkIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgKi8KIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU19FNTAwLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8Ci0JCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfU1BFX0NPTVAgfAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSB8CisJCQlQUENfRkVBVFVSRV9TUEVfQ09NUCB8CiAJCQlQUENfRkVBVFVSRV9IQVNfRUZQX1NJTkdMRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGMvZTUwMCIsCi0JCS5vcHJvZmlsZV90eXBlCQk9IEJPT0tFLAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfQk9PS0UsCisJCS5wbGF0Zm9ybQkJPSAicHBjODU0MCIsCiAJfSwKIAl7CS8qIGU1MDB2MiAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTk4NCwxNCArMTA2NSwxNiBAQAogCQkuY3B1X25hbWUJCT0gImU1MDB2MiIsCiAJCS8qIHh4eCAtIGdhbGFrOiBhZGQgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSAqLwogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX0U1MDBfMiwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfAotCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX1NQRV9DT01QIHwKLQkJCVBQQ19GRUFUVVJFX0hBU19FRlBfU0lOR0xFIHwgUFBDX0ZFQVRVUkVfSEFTX0VGUF9ET1VCTEUsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFIHwKKwkJCVBQQ19GRUFUVVJFX1NQRV9DT01QIHwKKwkJCVBQQ19GRUFUVVJFX0hBU19FRlBfU0lOR0xFIHwKKwkJCVBQQ19GRUFUVVJFX0hBU19FRlBfRE9VQkxFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYy9lNTAwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gQk9PS0UsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9CT09LRSwKKwkJLnBsYXRmb3JtCQk9ICJwcGM4NTQ4IiwKIAl9LAogI2VuZGlmCiAjaWYgIUNMQVNTSUNfUFBDCkBAIC0xMDAzLDYgKzEwODYsNyBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwb3dlcnBjIiwKIAl9CiAjZW5kaWYgLyogIUNMQVNTSUNfUFBDICovCiAjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzMyLlMKaW5kZXggMDM2YjcxZC4uZDhkYTJhMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV8zMi5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfMzIuUwpAQCAtOTg4LDcgKzk4OCw3IEBACiAJc3R3dQlyMSwtSU5UX0ZSQU1FX1NJWkUocjEpCiAJbWZscglyMAogCXN0dwlyMCxJTlRfRlJBTUVfU0laRSs0KHIxKQotCUxPQURBRERSKHI0LCBydGFzKQorCUxPQURfUkVHX0FERFIocjQsIHJ0YXMpCiAJbGlzCXI2LDFmQGhhCS8qIHBoeXNpY2FsIHJldHVybiBhZGRyZXNzIGZvciBydGFzICovCiAJYWRkaQlyNixyNiwxZkBsCiAJdG9waHlzKHI2LHI2KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCmluZGV4IGFhY2ViYjMuLjU0MjAzNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKQEAgLTUxMSw3ICs1MTEsOCBAQAogCWNtcGRpCTAscjUsMAogCWJlcQk0ZgogCS8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdHMgKGlTZXJpZXMpICovCi0JbGQJcjMsUEFDQUxQUEFDQStMUFBBQ0FBTllJTlQocjEzKQorCWxkCXIzLFBBQ0FMUFBBQ0FQVFIocjEzKQorCWxkCXIzLExQUEFDQUFOWUlOVChyMykKIAljbXBkaQlyMywwCiAJYmVxKwk0ZgkJCS8qIHNraXAgZG9fSVJRIGlmIG5vIGludGVycnVwdHMgKi8KIApAQCAtNjg5LDkgKzY5MCw4IEBACiAgICAgICAgIHN0ZAlyNixQQUNBU0FWRURNU1IocjEzKQogCiAJLyogU2V0dXAgb3VyIHJlYWwgcmV0dXJuIGFkZHIgKi8JCi0JU0VUX1JFR19UT19MQUJFTChyNCwucnRhc19yZXR1cm5fbG9jKQotCVNFVF9SRUdfVE9fQ09OU1QocjksUEFHRV9PRkZTRVQpCi0Jc3ViCXI0LHI0LHI5CisJTE9BRF9SRUdfQUREUihyNCwucnRhc19yZXR1cm5fbG9jKQorCWNscmxkaQlyNCxyNCwyCQkJLyogY29udmVydCB0byByZWFsbW9kZSBhZGRyZXNzICovCiAgICAgICAgCW10bHIJcjQKIAogCWxpCXIwLDAKQEAgLTcwNiw3ICs3MDYsNyBAQAogCXN5bmMJCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIHNvIFNSUjAvMSAqLwogCW10bXNyZAlyMAkJCS8qIGRvbid0IGdldCB0cmFzaGVkICovCiAKLQlTRVRfUkVHX1RPX0xBQkVMKHI0LHJ0YXMpCisJTE9BRF9SRUdfQUREUihyNCwgcnRhcykKIAlsZAlyNSxSVEFTRU5UUlkocjQpCS8qIGdldCB0aGUgcnRhcy0+ZW50cnkgdmFsdWUgKi8KIAlsZAlyNCxSVEFTQkFTRShyNCkJCS8qIGdldCB0aGUgcnRhcy0+YmFzZSB2YWx1ZSAqLwogCQpAQCAtNzE4LDggKzcxOCw3IEBACiBfU1RBVElDKHJ0YXNfcmV0dXJuX2xvYykKIAkvKiByZWxvY2F0aW9uIGlzIG9mZiBhdCB0aGlzIHBvaW50ICovCiAJbWZzcHIJcjQsU1BSTl9TUFJHMwkgICAgICAgIC8qIEdldCBQQUNBICovCi0JU0VUX1JFR19UT19DT05TVChyNSwgUEFHRV9PRkZTRVQpCi0gICAgICAgIHN1YiAgICAgcjQscjQscjUgICAgICAgICAgICAgICAgLyogUkVMT0MgdGhlIFBBQ0EgYmFzZSBwb2ludGVyICovCisJY2xybGRpCXI0LHI0LDIJCQkvKiBjb252ZXJ0IHRvIHJlYWxtb2RlIGFkZHJlc3MgKi8KIAogCW1mbXNyICAgcjYKIAlsaQlyMCxNU1JfUkkKQEAgLTcyOCw3ICs3MjcsNyBAQAogCW10bXNyZCAgcjYKICAgICAgICAgCiAgICAgICAgIGxkCXIxLFBBQ0FSMShyNCkgICAgICAgICAgIC8qIFJlc3RvcmUgb3VyIFNQICovCi0JTE9BREFERFIocjMsLnJ0YXNfcmVzdG9yZV9yZWdzKQorCUxPQURfUkVHX0lNTUVESUFURShyMywucnRhc19yZXN0b3JlX3JlZ3MpCiAgICAgICAgIGxkCXI0LFBBQ0FTQVZFRE1TUihyNCkgICAgIC8qIFJlc3RvcmUgb3VyIE1TUiAqLwogCiAJbXRzcHIJU1BSTl9TUlIwLHIzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2ZwdS5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9mcHUuUwppbmRleCBiNzgwYjQyLi5lNDM2MmRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2ZwdS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnB1LlMKQEAgLTM5LDkgKzM5LDkgQEAKICAqIHRvIGFub3RoZXIuICBJbnN0ZWFkIHdlIGNhbGwgZ2l2ZXVwX2ZwdSBpbiBzd2l0Y2hfdG8uCiAgKi8KICNpZm5kZWYgQ09ORklHX1NNUAotCUxPQURCQVNFKHIzLCBsYXN0X3Rhc2tfdXNlZF9tYXRoKQorCUxPQURfUkVHX0FERFJCQVNFKHIzLCBsYXN0X3Rhc2tfdXNlZF9tYXRoKQogCXRvcmVhbChyMykKLQlQUENfTEwJcjQsT0ZGKGxhc3RfdGFza191c2VkX21hdGgpKHIzKQorCVBQQ19MTAlyNCxBRERST0ZGKGxhc3RfdGFza191c2VkX21hdGgpKHIzKQogCVBQQ19MQ01QSQkwLHI0LDAKIAliZXEJMWYKIAl0b3JlYWwocjQpCkBAIC03Nyw3ICs3Nyw3IEBACiAjaWZuZGVmIENPTkZJR19TTVAKIAlzdWJpCXI0LHI1LFRIUkVBRAogCWZyb21yZWFsKHI0KQotCVBQQ19TVEwJcjQsT0ZGKGxhc3RfdGFza191c2VkX21hdGgpKHIzKQorCVBQQ19TVEwJcjQsQUREUk9GRihsYXN0X3Rhc2tfdXNlZF9tYXRoKShyMykKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAJLyogcmVzdG9yZSByZWdpc3RlcnMgYW5kIHJldHVybiAqLwogCS8qIHdlIGhhdmVuJ3QgdXNlZCBjdHIgb3IgeGVyIG9yIGxyICovCkBAIC0xMTMsOCArMTEzLDggQEAKIDE6CiAjaWZuZGVmIENPTkZJR19TTVAKIAlsaQlyNSwwCi0JTE9BREJBU0UocjQsbGFzdF90YXNrX3VzZWRfbWF0aCkKLQlQUENfU1RMCXI1LE9GRihsYXN0X3Rhc2tfdXNlZF9tYXRoKShyNCkKKwlMT0FEX1JFR19BRERSQkFTRShyNCxsYXN0X3Rhc2tfdXNlZF9tYXRoKQorCVBQQ19TVEwJcjUsQUREUk9GRihsYXN0X3Rhc2tfdXNlZF9tYXRoKShyNCkKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAJYmxyCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKaW5kZXggMWMwNjZkMS4uMzA4MjY4NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKQEAgLTE1NCwxMiArMTU0LDEyIEBACiAJYm5lCTEwMGIKIAogI2lmZGVmIENPTkZJR19ITVQKLQlMT0FEQUREUihyNCwgLmhtdF9pbml0KQorCVNFVF9SRUdfSU1NRURJQVRFKHI0LCAuaG10X2luaXQpCiAJbXRjdHIJcjQKIAliY3RyCiAjZWxzZQogI2lmZGVmIENPTkZJR19TTVAKLQlMT0FEQUREUihyNCwgLnBTZXJpZXNfc2Vjb25kYXJ5X3NtcF9pbml0KQorCUxPQURfUkVHX0lNTUVESUFURShyNCwgLnBTZXJpZXNfc2Vjb25kYXJ5X3NtcF9pbml0KQogCW10Y3RyCXI0CiAJbXIJcjMscjI0CiAJYmN0cgpAQCAtMjA1LDkgKzIwNSwxMCBAQAogI2RlZmluZSBFWF9MUgkJNzIKIAogLyoKLSAqIFdlJ3JlIHNob3J0IG9uIHNwYWNlIGFuZCB0aW1lIGluIHRoZSBleGNlcHRpb24gcHJvbG9nLCBzbyB3ZSBjYW4ndCB1c2UKLSAqIHRoZSBub3JtYWwgTE9BREFERFIgbWFjcm8uIE5vcm1hbGx5IHdlIGp1c3QgbmVlZCB0aGUgbG93IGhhbGZ3b3JkIG9mIHRoZQotICogYWRkcmVzcywgYnV0IGZvciBLZHVtcCB3ZSBuZWVkIHRoZSB3aG9sZSBsb3cgd29yZC4KKyAqIFdlJ3JlIHNob3J0IG9uIHNwYWNlIGFuZCB0aW1lIGluIHRoZSBleGNlcHRpb24gcHJvbG9nLCBzbyB3ZSBjYW4ndAorICogdXNlIHRoZSBub3JtYWwgU0VUX1JFR19JTU1FRElBVEUgbWFjcm8uIE5vcm1hbGx5IHdlIGp1c3QgbmVlZCB0aGUKKyAqIGxvdyBoYWxmd29yZCBvZiB0aGUgYWRkcmVzcywgYnV0IGZvciBLZHVtcCB3ZSBuZWVkIHRoZSB3aG9sZSBsb3cKKyAqIHdvcmQuCiAgKi8KICNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAogI2RlZmluZSBMT0FEX0hBTkRMRVIocmVnLCBsYWJlbCkJCQkJCVwKQEAgLTI1NCw4ICsyNTUsOSBAQAogCiAjZGVmaW5lIEVYQ0VQVElPTl9QUk9MT0dfSVNFUklFU18yCQkJCQlcCiAJbWZtc3IJcjEwOwkJCQkJCQlcCi0JbGQJcjExLFBBQ0FMUFBBQ0ErTFBQQUNBU1JSMChyMTMpOwkJCQlcCi0JbGQJcjEyLFBBQ0FMUFBBQ0ErTFBQQUNBU1JSMShyMTMpOwkJCQlcCisJbGQJcjEyLFBBQ0FMUFBBQ0FQVFIocjEzKTsJCQkJCVwKKwlsZAlyMTEsTFBQQUNBU1JSMChyMTIpOwkJCQkJXAorCWxkCXIxMixMUFBBQ0FTUlIxKHIxMik7CQkJCQlcCiAJb3JpCXIxMCxyMTAsTVNSX1JJOwkJCQkJCVwKIAltdG1zcmQJcjEwLDEKIApAQCAtNjM0LDcgKzYzNiw4IEBACiAJc3RkCXIxMixQQUNBX0VYU0xCK0VYX1IxMihyMTMpCiAJbWZzcHIJcjEwLFNQUk5fU1BSRzEKIAlzdGQJcjEwLFBBQ0FfRVhTTEIrRVhfUjEzKHIxMykKLQlsZAlyMTIsUEFDQUxQUEFDQStMUFBBQ0FTUlIxKHIxMyk7CisJbGQJcjEyLFBBQ0FMUFBBQ0FQVFIocjEzKQorCWxkCXIxMixMUFBBQ0FTUlIxKHIxMikKIAliCS5zbGJfbWlzc19yZWFsbW9kZQogCiAJU1REX0VYQ0VQVElPTl9JU0VSSUVTKDB4NDAwLCBpbnN0cnVjdGlvbl9hY2Nlc3MsIFBBQ0FfRVhHRU4pCkBAIC02NDQsNyArNjQ3LDggQEAKIAltdHNwcglTUFJOX1NQUkcxLHIxMwkJLyogc2F2ZSByMTMgKi8KIAltZnNwcglyMTMsU1BSTl9TUFJHMwkJLyogZ2V0IHBhY2EgYWRkcmVzcyBpbnRvIHIxMyAqLwogCXN0ZAlyMyxQQUNBX0VYU0xCK0VYX1IzKHIxMykKLQlsZAlyMyxQQUNBTFBQQUNBK0xQUEFDQVNSUjAocjEzKQkvKiBnZXQgU1JSMCB2YWx1ZSAqLworCWxkCXIzLFBBQ0FMUFBBQ0FQVFIocjEzKQorCWxkCXIzLExQUEFDQVNSUjAocjMpCS8qIGdldCBTUlIwIHZhbHVlICovCiAJc3RkCXI5LFBBQ0FfRVhTTEIrRVhfUjkocjEzKQogCW1mY3IJcjkKICNpZmRlZiBfX0RJU0FCTEVEX18KQEAgLTY1Niw3ICs2NjAsOCBAQAogCXN0ZAlyMTIsUEFDQV9FWFNMQitFWF9SMTIocjEzKQogCW1mc3ByCXIxMCxTUFJOX1NQUkcxCiAJc3RkCXIxMCxQQUNBX0VYU0xCK0VYX1IxMyhyMTMpCi0JbGQJcjEyLFBBQ0FMUFBBQ0ErTFBQQUNBU1JSMShyMTMpOworCWxkCXIxMixQQUNBTFBQQUNBUFRSKHIxMykKKwlsZAlyMTIsTFBQQUNBU1JSMShyMTIpCiAJYgkuc2xiX21pc3NfcmVhbG1vZGUKIAogI2lmZGVmIF9fRElTQUJMRURfXwpAQCAtNzEzLDcgKzcxOCw3IEBACiAJbGJ6CXIyMyxQQUNBUFJPQ1NUQVJUKHIxMykJLyogVGVzdCBpZiB0aGlzIHByb2Nlc3NvcgogCQkJCQkgKiBzaG91bGQgc3RhcnQgKi8KIAlzeW5jCi0JTE9BREFERFIocjMsY3VycmVudF9zZXQpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIzLGN1cnJlbnRfc2V0KQogCXNsZGkJcjI4LHIyNCwzCQkvKiBnZXQgY3VycmVudF9zZXRbY3B1I10gKi8KIAlsZHgJcjMscjMscjI4CiAJYWRkaQlyMSxyMyxUSFJFQURfU0laRQpAQCAtNzQ1LDE3ICs3NTAsMTkgQEAKIAkuZ2xvYmwgZGVjcmVtZW50ZXJfaVNlcmllc19tYXNrZWQKIGRlY3JlbWVudGVyX2lTZXJpZXNfbWFza2VkOgogCWxpCXIxMSwxCi0Jc3RiCXIxMSxQQUNBTFBQQUNBK0xQUEFDQURFQ1JJTlQocjEzKQotCUxPQURCQVNFKHIxMix0Yl90aWNrc19wZXJfamlmZnkpCi0JbHd6CXIxMixPRkYodGJfdGlja3NfcGVyX2ppZmZ5KShyMTIpCisJbGQJcjEyLFBBQ0FMUFBBQ0FQVFIocjEzKQorCXN0YglyMTEsTFBQQUNBREVDUklOVChyMTIpCisJTE9BRF9SRUdfQUREUkJBU0UocjEyLHRiX3RpY2tzX3Blcl9qaWZmeSkKKwlsd3oJcjEyLEFERFJPRkYodGJfdGlja3NfcGVyX2ppZmZ5KShyMTIpCiAJbXRzcHIJU1BSTl9ERUMscjEyCiAJLyogZmFsbCB0aHJvdWdoICovCiAKIAkuZ2xvYmwgaGFyZHdhcmVfaW50ZXJydXB0X2lTZXJpZXNfbWFza2VkCiBoYXJkd2FyZV9pbnRlcnJ1cHRfaVNlcmllc19tYXNrZWQ6CiAJbXRjcmYJMHg4MCxyOQkJLyogUmVzdG9yZSByZWdzICovCi0JbGQJcjExLFBBQ0FMUFBBQ0ErTFBQQUNBU1JSMChyMTMpCi0JbGQJcjEyLFBBQ0FMUFBBQ0ErTFBQQUNBU1JSMShyMTMpCisJbGQJcjEyLFBBQ0FMUFBBQ0FQVFIocjEzKQorCWxkCXIxMSxMUFBBQ0FTUlIwKHIxMikKKwlsZAlyMTIsTFBQQUNBU1JSMShyMTIpCiAJbXRzcHIJU1BSTl9TUlIwLHIxMQogCW10c3ByCVNQUk5fU1JSMSxyMTIKIAlsZAlyOSxQQUNBX0VYR0VOK0VYX1I5KHIxMykKQEAgLTk5NCw3ICsxMDAxLDggQEAKIAlsZAlyMyxQQUNBX0VYU0xCK0VYX1IzKHIxMykKIAlsd3oJcjksUEFDQV9FWFNMQitFWF9DQ1IocjEzKQkvKiBnZXQgc2F2ZWQgQ1IgKi8KICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQlsZAlyMTEsUEFDQUxQUEFDQStMUFBBQ0FTUlIwKHIxMykJLyogZ2V0IFNSUjAgdmFsdWUgKi8KKwlsZAlyMTEsUEFDQUxQUEFDQVBUUihyMTMpCisJbGQJcjExLExQUEFDQVNSUjAocjExKQkJLyogZ2V0IFNSUjAgdmFsdWUgKi8KICNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KIAogCW10bHIJcjEwCkBAIC0xNDEyLDcgKzE0MjAsNyBAQAogCSAqIHBoeXNpY2FsIGNwdSBpZCBpbiByMjQsIHdlIG5lZWQgdG8gc2VhcmNoIHRoZSBwYWNhcyB0byBmaW5kCiAJICogd2hpY2ggbG9naWNhbCBpZCBtYXBzIHRvIG91ciBwaHlzaWNhbCBvbmUuCiAJICovCi0JTE9BREFERFIocjEzLCBwYWNhKSAJCS8qIEdldCBiYXNlIHZhZGRyIG9mIHBhY2EgYXJyYXkJICovCisJTE9BRF9SRUdfSU1NRURJQVRFKHIxMywgcGFjYSkJLyogR2V0IGJhc2UgdmFkZHIgb2YgcGFjYSBhcnJheQkgKi8KIAlsaQlyNSwwCQkJLyogbG9naWNhbCBjcHUgaWQgICAgICAgICAgICAgICAgKi8KIDE6CWxoeglyNixQQUNBSFdDUFVJRChyMTMpCS8qIExvYWQgSFcgcHJvY2lkIGZyb20gcGFjYSAgICAgICovCiAJY21wdwlyNixyMjQJCQkvKiBDb21wYXJlIHRvIG91ciBpZCAgICAgICAgICAgICAqLwpAQCAtMTQ0Niw4ICsxNDU0LDggQEAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKIF9TVEFUSUMoX19zdGFydF9pbml0aWFsaXphdGlvbl9pU2VyaWVzKQogCS8qIENsZWFyIG91dCB0aGUgQlNTICovCi0JTE9BREFERFIocjExLF9fYnNzX3N0b3ApCi0JTE9BREFERFIocjgsX19ic3Nfc3RhcnQpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIxMSxfX2Jzc19zdG9wKQorCUxPQURfUkVHX0lNTUVESUFURShyOCxfX2Jzc19zdGFydCkKIAlzdWIJcjExLHIxMSxyOAkJLyogYnNzIHNpemUJCQkqLwogCWFkZGkJcjExLHIxMSw3CQkvKiByb3VuZCB1cCB0byBhbiBldmVuIGRvdWJsZSB3b3JkICovCiAJcmxkaWNsLiByMTEscjExLDYxLDMJCS8qIHNoaWZ0IHJpZ2h0IGJ5IDMJCSovCkBAIC0xNDU4LDE3ICsxNDY2LDE3IEBACiAzOglzdGR1CXIwLDgocjgpCiAJYmRuegkzYgogNDoKLQlMT0FEQUREUihyMSxpbml0X3RocmVhZF91bmlvbikKKwlMT0FEX1JFR19JTU1FRElBVEUocjEsaW5pdF90aHJlYWRfdW5pb24pCiAJYWRkaQlyMSxyMSxUSFJFQURfU0laRQogCWxpCXIwLDAKIAlzdGR1CXIwLC1TVEFDS19GUkFNRV9PVkVSSEVBRChyMSkKIAotCUxPQURBRERSKHIzLGNwdV9zcGVjcykKLQlMT0FEQUREUihyNCxjdXJfY3B1X3NwZWMpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIzLGNwdV9zcGVjcykKKwlMT0FEX1JFR19JTU1FRElBVEUocjQsY3VyX2NwdV9zcGVjKQogCWxpCXI1LDAKIAlibAkuaWRlbnRpZnlfY3B1CiAKLQlMT0FEQUREUihyMixfX3RvY19zdGFydCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjIsX190b2Nfc3RhcnQpCiAJYWRkaQlyMixyMiwweDQwMDAKIAlhZGRpCXIyLHIyLDB4NDAwMAogCkBAIC0xNTI4LDcgKzE1MzYsNyBAQAogCWxpCXIyNCwwCiAKIAkvKiBTd2l0Y2ggb2ZmIE1NVSBpZiBub3QgYWxyZWFkeSAqLwotCUxPQURBRERSKHI0LCAuX19hZnRlcl9wcm9tX3N0YXJ0IC0gS0VSTkVMQkFTRSkKKwlMT0FEX1JFR19JTU1FRElBVEUocjQsIC5fX2FmdGVyX3Byb21fc3RhcnQgLSBLRVJORUxCQVNFKQogCWFkZAlyNCxyNCxyMzAKIAlibAkuX19tbXVfb2ZmCiAJYgkuX19hZnRlcl9wcm9tX3N0YXJ0CkBAIC0xNTQ4LDcgKzE1NTYsNyBAQAogCS8qIHB1dCBhIHJlbG9jYXRpb24gb2Zmc2V0IGludG8gcjMgKi8KIAlibAkucmVsb2Nfb2Zmc2V0CiAKLQlMT0FEQUREUihyMixfX3RvY19zdGFydCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjIsX190b2Nfc3RhcnQpCiAJYWRkaQlyMixyMiwweDQwMDAKIAlhZGRpCXIyLHIyLDB4NDAwMAogCkBAIC0xNTg4LDkgKzE1OTYsOSBAQAogICovCiAJYmwJLnJlbG9jX29mZnNldAogCW1yCXIyNixyMwotCVNFVF9SRUdfVE9fQ09OU1QocjI3LEtFUk5FTEJBU0UpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIyNywgS0VSTkVMQkFTRSkKIAotCUxPQURBRERSKHIzLCBQSFlTSUNBTF9TVEFSVCkJLyogdGFyZ2V0IGFkZHIgKi8KKwlMT0FEX1JFR19JTU1FRElBVEUocjMsIFBIWVNJQ0FMX1NUQVJUKQkvKiB0YXJnZXQgYWRkciAqLwogCiAJLy8gWFhYIEZJWE1FOiBVc2UgcGh5cyByZXR1cm5lZCBieSBPRiAocjMwKQogCWFkZAlyNCxyMjcscjI2IAkJLyogc291cmNlIGFkZHIJCQkgKi8KQEAgLTE1OTgsNyArMTYwNiw3IEBACiAJCQkJCS8qICAgaS5lLiB3aGVyZSB3ZSBhcmUgcnVubmluZwkgKi8KIAkJCQkJLyoJdGhlIHNvdXJjZSBhZGRyCQkgKi8KIAotCUxPQURBRERSKHI1LGNvcHlfdG9faGVyZSkJLyogIyBieXRlcyBvZiBtZW1vcnkgdG8gY29weQkgKi8KKwlMT0FEX1JFR19JTU1FRElBVEUocjUsY29weV90b19oZXJlKSAvKiAjIGJ5dGVzIG9mIG1lbW9yeSB0byBjb3B5ICovCiAJc3ViCXI1LHI1LHIyNwogCiAJbGkJcjYsMHgxMDAJCS8qIFN0YXJ0IG9mZnNldCwgdGhlIGZpcnN0IDB4MTAwICovCkBAIC0xNjA4LDExICsxNjE2LDExIEBACiAJCQkJCS8qIHRoaXMgaW5jbHVkZXMgdGhlIGNvZGUgYmVpbmcJICovCiAJCQkJCS8qIGV4ZWN1dGVkIGhlcmUuCQkgKi8KIAotCUxPQURBRERSKHIwLCA0ZikJCS8qIEp1bXAgdG8gdGhlIGNvcHkgb2YgdGhpcyBjb2RlICovCisJTE9BRF9SRUdfSU1NRURJQVRFKHIwLCA0ZikJLyogSnVtcCB0byB0aGUgY29weSBvZiB0aGlzIGNvZGUgKi8KIAltdGN0cglyMAkJCS8qIHRoYXQgd2UganVzdCBtYWRlL3JlbG9jYXRlZAkgKi8KIAliY3RyCiAKLTQ6CUxPQURBRERSKHI1LGtsaW1pdCkKKzQ6CUxPQURfUkVHX0lNTUVESUFURShyNSxrbGltaXQpCiAJYWRkCXI1LHI1LHIyNgogCWxkCXI1LDAocjUpCQkvKiBnZXQgdGhlIHZhbHVlIG9mIGtsaW1pdCAqLwogCXN1YglyNSxyNSxyMjcKQEAgLTE2OTQsNyArMTcwMiw3IEBACiAJbXRtc3JkCXIzCQkJLyogUkkgb24gKi8KIAogCS8qIFNldCB1cCBhIHBhY2EgdmFsdWUgZm9yIHRoaXMgcHJvY2Vzc29yLiAqLwotCUxPQURBRERSKHI0LCBwYWNhKSAJCSAvKiBHZXQgYmFzZSB2YWRkciBvZiBwYWNhIGFycmF5CSovCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LCBwYWNhKQkvKiBHZXQgYmFzZSB2YWRkciBvZiBwYWNhIGFycmF5CSovCiAJbXVsbGkJcjEzLHIyNCxQQUNBX1NJWkUJIC8qIENhbGN1bGF0ZSB2YWRkciBvZiByaWdodCBwYWNhICovCiAJYWRkCXIxMyxyMTMscjQJCS8qIGZvciB0aGlzIHByb2Nlc3Nvci4JCSovCiAJbXRzcHIJU1BSTl9TUFJHMyxyMTMJCSAvKiBTYXZlIHZhZGRyIG9mIHBhY2EgaW4gU1BSRzMJKi8KQEAgLTE3MzEsNyArMTczOSw3IEBACiAJYmwJLmVhcmx5X3NldHVwX3NlY29uZGFyeQogCiAJLyogSW5pdGlhbGl6ZSB0aGUga2VybmVsIHN0YWNrLiAgSnVzdCBhIHJlcGVhdCBmb3IgaVNlcmllcy4JICovCi0JTE9BREFERFIocjMsY3VycmVudF9zZXQpCisJTE9BRF9SRUdfQUREUihyMywgY3VycmVudF9zZXQpCiAJc2xkaQlyMjgscjI0LDMJCS8qIGdldCBjdXJyZW50X3NldFtjcHUjXQkgKi8KIAlsZHgJcjEscjMscjI4CiAJYWRkaQlyMSxyMSxUSFJFQURfU0laRS1TVEFDS19GUkFNRV9PVkVSSEVBRApAQCAtMTc0Miw4ICsxNzUwLDggQEAKIAltdGxyCXI3CiAKIAkvKiBlbmFibGUgTU1VIGFuZCBqdW1wIHRvIHN0YXJ0X3NlY29uZGFyeSAqLwotCUxPQURBRERSKHIzLC5zdGFydF9zZWNvbmRhcnlfcHJvbG9nKQotCVNFVF9SRUdfVE9fQ09OU1QocjQsIE1TUl9LRVJORUwpCisJTE9BRF9SRUdfQUREUihyMywgLnN0YXJ0X3NlY29uZGFyeV9wcm9sb2cpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LCBNU1JfS0VSTkVMKQogI2lmZGVmIERPX1NPRlRfRElTQUJMRQogCW9yaQlyNCxyNCxNU1JfRUUKICNlbmRpZgpAQCAtMTc5Miw4ICsxODAwLDggQEAKIAkgKiBiZSBkZXRhY2hlZCBmcm9tIHRoZSBrZXJuZWwgY29tcGxldGVseS4gQmVzaWRlcywgd2UgbmVlZAogCSAqIHRvIGNsZWFyIGl0IG5vdyBmb3Iga2V4ZWMtc3R5bGUgZW50cnkuCiAJICovCi0JTE9BREFERFIocjExLF9fYnNzX3N0b3ApCi0JTE9BREFERFIocjgsX19ic3Nfc3RhcnQpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIxMSxfX2Jzc19zdG9wKQorCUxPQURfUkVHX0lNTUVESUFURShyOCxfX2Jzc19zdGFydCkKIAlzdWIJcjExLHIxMSxyOAkJLyogYnNzIHNpemUJCQkqLwogCWFkZGkJcjExLHIxMSw3CQkvKiByb3VuZCB1cCB0byBhbiBldmVuIGRvdWJsZSB3b3JkICovCiAJcmxkaWNsLiByMTEscjExLDYxLDMJCS8qIHNoaWZ0IHJpZ2h0IGJ5IDMJCSovCkBAIC0xODMxLDcgKzE4MzksNyBAQAogCS8qIHVwIHRoZSBodGFiLiAgVGhpcyBpcyBkb25lIGJlY2F1c2Ugd2UgaGF2ZSByZWxvY2F0ZWQgdGhlICAqLwogCS8qIGtlcm5lbCBidXQgYXJlIHN0aWxsIHJ1bm5pbmcgaW4gcmVhbCBtb2RlLiAqLwogCi0JTE9BREFERFIocjMsaW5pdF90aHJlYWRfdW5pb24pCisJTE9BRF9SRUdfSU1NRURJQVRFKHIzLGluaXRfdGhyZWFkX3VuaW9uKQogCWFkZAlyMyxyMyxyMjYKIAogCS8qIHNldCB1cCBhIHN0YWNrIHBvaW50ZXIgKHBoeXNpY2FsIGFkZHJlc3MpICovCkBAIC0xODQwLDE0ICsxODQ4LDE0IEBACiAJc3RkdQlyMCwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQocjEpCiAKIAkvKiBzZXQgdXAgdGhlIFRPQyAocGh5c2ljYWwgYWRkcmVzcykgKi8KLQlMT0FEQUREUihyMixfX3RvY19zdGFydCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjIsX190b2Nfc3RhcnQpCiAJYWRkaQlyMixyMiwweDQwMDAKIAlhZGRpCXIyLHIyLDB4NDAwMAogCWFkZAlyMixyMixyMjYKIAotCUxPQURBRERSKHIzLGNwdV9zcGVjcykKKwlMT0FEX1JFR19JTU1FRElBVEUocjMsIGNwdV9zcGVjcykKIAlhZGQJcjMscjMscjI2Ci0JTE9BREFERFIocjQsY3VyX2NwdV9zcGVjKQorCUxPQURfUkVHX0lNTUVESUFURShyNCxjdXJfY3B1X3NwZWMpCiAJYWRkCXI0LHI0LHIyNgogCW1yCXI1LHIyNgogCWJsCS5pZGVudGlmeV9jcHUKQEAgLTE4NjMsMTEgKzE4NzEsMTEgQEAKIAkgKiBub3doZXJlIGl0IGNhbiBiZSBpbml0aWFsaXplZCBkaWZmZXJlbnRseSBiZWZvcmUgd2UgcmVhY2ggdGhpcwogCSAqIGNvZGUKIAkgKi8KLQlMT0FEQUREUihyMjcsIGJvb3RfY3B1aWQpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIyNywgYm9vdF9jcHVpZCkKIAlhZGQJcjI3LHIyNyxyMjYKIAlsd3oJcjI3LDAocjI3KQogCi0JTE9BREFERFIocjI0LCBwYWNhKSAJCS8qIEdldCBiYXNlIHZhZGRyIG9mIHBhY2EgYXJyYXkJICovCisJTE9BRF9SRUdfSU1NRURJQVRFKHIyNCwgcGFjYSkgCS8qIEdldCBiYXNlIHZhZGRyIG9mIHBhY2EgYXJyYXkJICovCiAJbXVsbGkJcjEzLHIyNyxQQUNBX1NJWkUJLyogQ2FsY3VsYXRlIHZhZGRyIG9mIHJpZ2h0IHBhY2EgKi8KIAlhZGQJcjEzLHIxMyxyMjQJCS8qIGZvciB0aGlzIHByb2Nlc3Nvci4JCSAqLwogCWFkZAlyMTMscjEzLHIyNgkJLyogY29udmVydCB0byBwaHlzaWNhbCBhZGRyCSAqLwpAQCAtMTg4MCw4ICsxODg4LDggQEAKIAltcglyMyxyMzEKICAJYmwJLmVhcmx5X3NldHVwCiAKLQlMT0FEQUREUihyMywuc3RhcnRfaGVyZV9jb21tb24pCi0JU0VUX1JFR19UT19DT05TVChyNCwgTVNSX0tFUk5FTCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjMsIC5zdGFydF9oZXJlX2NvbW1vbikKKwlMT0FEX1JFR19JTU1FRElBVEUocjQsIE1TUl9LRVJORUwpCiAJbXRzcHIJU1BSTl9TUlIwLHIzCiAJbXRzcHIJU1BSTl9TUlIxLHI0CiAJcmZpZApAQCAtMTg5NSw3ICsxOTAzLDcgQEAKIAkvKiBUaGUgZm9sbG93aW5nIGNvZGUgc2V0cyB1cCB0aGUgU1AgYW5kIFRPQyBub3cgdGhhdCB3ZSBhcmUgKi8KIAkvKiBydW5uaW5nIHdpdGggdHJhbnNsYXRpb24gZW5hYmxlZC4gKi8KIAotCUxPQURBRERSKHIzLGluaXRfdGhyZWFkX3VuaW9uKQorCUxPQURfUkVHX0lNTUVESUFURShyMyxpbml0X3RocmVhZF91bmlvbikKIAogCS8qIHNldCB1cCB0aGUgc3RhY2sgKi8KIAlhZGRpCXIxLHIzLFRIUkVBRF9TSVpFCkBAIC0xOTA4LDE2ICsxOTE2LDE2IEBACiAJbGkJcjMsMAogCWJsCS5kb19jcHVfZnRyX2ZpeHVwcwogCi0JTE9BREFERFIocjI2LCBib290X2NwdWlkKQorCUxPQURfUkVHX0lNTUVESUFURShyMjYsIGJvb3RfY3B1aWQpCiAJbHd6CXIyNiwwKHIyNikKIAotCUxPQURBRERSKHIyNCwgcGFjYSkgCQkvKiBHZXQgYmFzZSB2YWRkciBvZiBwYWNhIGFycmF5ICAqLworCUxPQURfUkVHX0lNTUVESUFURShyMjQsIHBhY2EpCS8qIEdldCBiYXNlIHZhZGRyIG9mIHBhY2EgYXJyYXkgICovCiAJbXVsbGkJcjEzLHIyNixQQUNBX1NJWkUJLyogQ2FsY3VsYXRlIHZhZGRyIG9mIHJpZ2h0IHBhY2EgKi8KIAlhZGQJcjEzLHIxMyxyMjQJCS8qIGZvciB0aGlzIHByb2Nlc3Nvci4JCSAqLwogCW10c3ByCVNQUk5fU1BSRzMscjEzCiAKIAkvKiBwdHIgdG8gY3VycmVudCAqLwotCUxPQURBRERSKHI0LGluaXRfdGFzaykKKwlMT0FEX1JFR19JTU1FRElBVEUocjQsIGluaXRfdGFzaykKIAlzdGQJcjQsUEFDQUNVUlJFTlQocjEzKQogCiAJLyogTG9hZCB0aGUgVE9DICovCkBAIC0xOTQwLDcgKzE5NDgsNyBAQAogCiBfR0xPQkFMKGhtdF9pbml0KQogI2lmZGVmIENPTkZJR19ITVQKLQlMT0FEQUREUihyNSwgaG10X3RocmVhZF9kYXRhKQorCUxPQURfUkVHX0lNTUVESUFURShyNSwgaG10X3RocmVhZF9kYXRhKQogCW1mc3ByCXI3LFNQUk5fUFZSCiAJc3J3aQlyNyxyNywxNgogCWNtcHdpCXI3LDB4MzQJCQkvKiBQdWxzYXIgICovCkBAIC0xOTYxLDcgKzE5NjksNyBAQAogCWIJMTAxZgogCiBfX2htdF9zZWNvbmRhcnlfaG9sZDoKLQlMT0FEQUREUihyNSwgaG10X3RocmVhZF9kYXRhKQorCUxPQURfUkVHX0lNTUVESUFURShyNSwgaG10X3RocmVhZF9kYXRhKQogCWNscmxkaQlyNSxyNSw0CiAJbGkJcjcsMAogCW1mc3ByCXI2LFNQUk5fUElSCkBAIC0xOTg5LDcgKzE5OTcsNyBAQAogCiAjaWZkZWYgQ09ORklHX0hNVAogX0dMT0JBTChobXRfc3RhcnRfc2Vjb25kYXJ5KQotCUxPQURBRERSKHI0LF9faG10X3NlY29uZGFyeV9ob2xkKQorCUxPQURfUkVHX0lNTUVESUFURShyNCxfX2htdF9zZWNvbmRhcnlfaG9sZCkKIAljbHJsZGkJcjQscjQsNAogCW10c3ByCVNQUk5fTklBRE9STSwgcjQKIAltZnNwcglyNCwgU1BSTl9NU1JET1JNCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI0LlMKaW5kZXggMTQ5NGUyZi4uYzE2YjRhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9wb3dlcjQuUwpAQCAtMzgsMTQgKzM4LDE0IEBACiAJLyogV2UgbXVzdCBkeW5hbWljYWxseSBjaGVjayBmb3IgdGhlIE5BUCBmZWF0dXJlIGFzIGl0CiAJICogY2FuIGJlIGNsZWFyZWQgYnkgQ1BVIGluaXQgYWZ0ZXIgdGhlIGZpeHVwcyBhcmUgZG9uZQogCSAqLwotCUxPQURCQVNFKHIzLGN1cl9jcHVfc3BlYykKLQlsZAlyNCxPRkYoY3VyX2NwdV9zcGVjKShyMykKKwlMT0FEX1JFR19BRERSQkFTRShyMyxjdXJfY3B1X3NwZWMpCisJbGQJcjQsQUREUk9GRihjdXJfY3B1X3NwZWMpKHIzKQogCWxkCXI0LENQVV9TUEVDX0ZFQVRVUkVTKHI0KQogCWFuZGkuCXIwLHI0LENQVV9GVFJfQ0FOX05BUAogCWJlcWxyCiAJLyogTm93IGNoZWNrIGlmIHVzZXIgb3IgYXJjaCBlbmFibGVkIE5BUCBtb2RlICovCi0JTE9BREJBU0UocjMscG93ZXJzYXZlX25hcCkKLQlsd3oJcjQsT0ZGKHBvd2Vyc2F2ZV9uYXApKHIzKQorCUxPQURfUkVHX0FERFJCQVNFKHIzLHBvd2Vyc2F2ZV9uYXApCisJbHd6CXI0LEFERFJPRkYocG93ZXJzYXZlX25hcCkocjMpCiAJY21wd2kJMCxyNCwwCiAJYmVxbHIKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKaW5kZXggNTY1MTAzMi4uZDFmZmZjZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCkBAIC0yMzgsMTQgKzIzOCwxMCBAQAogICAgICAgICBpcnFfZXhpdCgpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JewotCQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhID0gZ2V0X3BhY2EoKTsKLQotCQlpZiAobHBhY2EtPmxwcGFjYS5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50KSB7Ci0JCQlscGFjYS0+bHBwYWNhLmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQgPSAwOwotCQkJLyogU2lnbmFsIGEgZmFrZSBkZWNyZW1lbnRlciBpbnRlcnJ1cHQgKi8KLQkJCXRpbWVyX2ludGVycnVwdChyZWdzKTsKLQkJfQorCWlmIChnZXRfbHBwYWNhKCktPmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQpIHsKKwkJZ2V0X2xwcGFjYSgpLT5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50ID0gMDsKKwkJLyogU2lnbmFsIGEgZmFrZSBkZWNyZW1lbnRlciBpbnRlcnJ1cHQgKi8KKwkJdGltZXJfaW50ZXJydXB0KHJlZ3MpOwogCX0KICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xwYXJjZmcuYwppbmRleCA5ZGRhMTZjLi4xYWU5NmE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2xwYXJjZmcuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xwYXJjZmcuYwpAQCAtNTUsMTUgKzU1LDEzIEBACiB7CiAJdW5zaWduZWQgbG9uZyBzdW1fcHVyciA9IDA7CiAJaW50IGNwdTsKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhOwogCiAJZm9yX2VhY2hfY3B1KGNwdSkgewotCQlscGFjYSA9IHBhY2EgKyBjcHU7Ci0JCXN1bV9wdXJyICs9IGxwYWNhLT5scHBhY2EuZW11bGF0ZWRfdGltZV9iYXNlOworCQlzdW1fcHVyciArPSBscHBhY2FbY3B1XS5lbXVsYXRlZF90aW1lX2Jhc2U7CiAKICNpZmRlZiBQVVJSX0RFQlVHCiAJCXByaW50ayhLRVJOX0lORk8gImdldF9wdXJyIGZvciBjcHUgKCVkKSBoYXMgdmFsdWUgKCVsZCkgXG4iLAotCQkJY3B1LCBscGFjYS0+bHBwYWNhLmVtdWxhdGVkX3RpbWVfYmFzZSk7CisJCQljcHUsIGxwcGFjYVtjcHVdLmVtdWxhdGVkX3RpbWVfYmFzZSk7CiAjZW5kaWYKIAl9CiAJcmV0dXJuIHN1bV9wdXJyOwpAQCAtNzksMTIgKzc3LDExIEBACiAJdW5zaWduZWQgbG9uZyBwb29sX2lkLCBscF9pbmRleDsKIAlpbnQgc2hhcmVkLCBlbnRpdGxlZF9jYXBhY2l0eSwgbWF4X2VudGl0bGVkX2NhcGFjaXR5OwogCWludCBwcm9jZXNzb3JzLCBtYXhfcHJvY2Vzc29yczsKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhID0gZ2V0X3BhY2EoKTsKIAl1bnNpZ25lZCBsb25nIHB1cnIgPSBnZXRfcHVycigpOwogCiAJc2VxX3ByaW50ZihtLCAiJXMgJXMgXG4iLCBNT0RVTEVfTkFNRSwgTU9EVUxFX1ZFUlMpOwogCi0Jc2hhcmVkID0gKGludCkobHBhY2EtPmxwcGFjYV9wdHItPnNoYXJlZF9wcm9jKTsKKwlzaGFyZWQgPSAoaW50KShnZXRfbHBwYWNhKCktPnNoYXJlZF9wcm9jKTsKIAlzZXFfcHJpbnRmKG0sICJzZXJpYWxfbnVtYmVyPSVjJWMlYyVjJWMlYyVjXG4iLAogCQkgICBlMmEoeEl0RXh0VnBkUGFuZWwubWZnSURbMl0pLAogCQkgICBlMmEoeEl0RXh0VnBkUGFuZWwubWZnSURbM10pLApAQCAtNDAyLDcgKzM5OSw3IEBACiAJCQkgICAoaF9yZXNvdXJjZSA+PiAwICogOCkgJiAweGZmZmYpOwogCiAJCS8qIHBvb2wgcmVsYXRlZCBlbnRyaWVzIGFyZSBhcHJvcHJpYXRlIGZvciBzaGFyZWQgY29uZmlncyAqLwotCQlpZiAocGFjYVswXS5scHBhY2Euc2hhcmVkX3Byb2MpIHsKKwkJaWYgKGxwcGFjYVswXS5zaGFyZWRfcHJvYykgewogCiAJCQloX3BpYygmcG9vbF9pZGxlX3RpbWUsICZwb29sX3Byb2NzKTsKIApAQCAtNDUxLDcgKzQ0OCw3IEBACiAJc2VxX3ByaW50ZihtLCAicGFydGl0aW9uX3BvdGVudGlhbF9wcm9jZXNzb3JzPSVkXG4iLAogCQkgICBwYXJ0aXRpb25fcG90ZW50aWFsX3Byb2Nlc3NvcnMpOwogCi0Jc2VxX3ByaW50ZihtLCAic2hhcmVkX3Byb2Nlc3Nvcl9tb2RlPSVkXG4iLCBwYWNhWzBdLmxwcGFjYS5zaGFyZWRfcHJvYyk7CisJc2VxX3ByaW50ZihtLCAic2hhcmVkX3Byb2Nlc3Nvcl9tb2RlPSVkXG4iLCBscHBhY2FbMF0uc2hhcmVkX3Byb2MpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCmluZGV4IDAxZDBkOTcuLmJlOTgyMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCkBAIC02OCw3ICs2OCw3IEBACiAJbWZscglyMAogCWJsCTFmCiAxOgltZmxyCXIzCi0JTE9BREFERFIocjQsMWIpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LDFiKQogCXN1YmYJcjMscjQscjMKIAltdGxyCXIwCiAJYmxyCkBAIC04MCw3ICs4MCw3IEBACiAJbWZscglyMAogCWJsCTFmCiAxOgltZmxyCXI1Ci0JTE9BREFERFIocjQsMWIpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LDFiKQogCXN1YmYJcjUscjQscjUKIAlhZGQJcjMscjMscjUKIAltdGxyCXIwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TCmluZGV4IGFlNDhhMDAuLjI3NzhjY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TCkBAIC0zOSw3ICszOSw3IEBACiAJbWZscglyMAogCWJsCTFmCiAxOgltZmxyCXIzCi0JTE9BREFERFIocjQsMWIpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LDFiKQogCXN1YmYJcjMscjQscjMKIAltdGxyCXIwCiAJYmxyCkBAIC01MSw3ICs1MSw3IEBACiAJbWZscglyMAogCWJsCTFmCiAxOgltZmxyCXI1Ci0JTE9BREFERFIocjQsMWIpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LDFiKQogCXN1YmYJcjUscjQscjUKIAlhZGQJcjMscjMscjUKIAltdGxyCXIwCkBAIC00OTgsMTUgKzQ5OCwxNSBAQAogICovCiBfR0xPQkFMKGRvX2NwdV9mdHJfZml4dXBzKQogCS8qIEdldCBDUFUgMCBmZWF0dXJlcyAqLwotCUxPQURBRERSKHI2LGN1cl9jcHVfc3BlYykKKwlMT0FEX1JFR19JTU1FRElBVEUocjYsY3VyX2NwdV9zcGVjKQogCXN1YglyNixyNixyMwogCWxkCXI0LDAocjYpCiAJc3ViCXI0LHI0LHIzCiAJbGQJcjQsQ1BVX1NQRUNfRkVBVFVSRVMocjQpCiAJLyogR2V0IHRoZSBmaXh1cCB0YWJsZSAqLwotCUxPQURBRERSKHI2LF9fc3RhcnRfX19mdHJfZml4dXApCisJTE9BRF9SRUdfSU1NRURJQVRFKHI2LF9fc3RhcnRfX19mdHJfZml4dXApCiAJc3ViCXI2LHI2LHIzCi0JTE9BREFERFIocjcsX19zdG9wX19fZnRyX2ZpeHVwKQorCUxPQURfUkVHX0lNTUVESUFURShyNyxfX3N0b3BfX19mdHJfZml4dXApCiAJc3ViCXI3LHI3LHIzCiAJLyogRG8gdGhlIGZpeHVwICovCiAxOgljbXBsZAlyNixyNwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9kZXZpY2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMKaW5kZXggNzA2NWU0MC4uMjJkODNkNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9kZXZpY2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX2RldmljZS5jCkBAIC0xMzIsNiArMTMyLDggQEAKIHN0cnVjdCBidXNfdHlwZSBvZl9wbGF0Zm9ybV9idXNfdHlwZSA9IHsKICAgICAgICAubmFtZQk9ICJvZl9wbGF0Zm9ybSIsCiAgICAgICAgLm1hdGNoCT0gb2ZfcGxhdGZvcm1fYnVzX21hdGNoLAorICAgICAgIC5wcm9iZQk9IG9mX2RldmljZV9wcm9iZSwKKyAgICAgICAucmVtb3ZlCT0gb2ZfZGV2aWNlX3JlbW92ZSwKICAgICAgICAuc3VzcGVuZAk9IG9mX2RldmljZV9zdXNwZW5kLAogICAgICAgIC5yZXN1bWUJPSBvZl9kZXZpY2VfcmVzdW1lLAogfTsKQEAgLTE1MCw4ICsxNTIsNiBAQAogCS8qIGluaXRpYWxpemUgY29tbW9uIGRyaXZlciBmaWVsZHMgKi8KIAlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZvZl9wbGF0Zm9ybV9idXNfdHlwZTsKLQlkcnYtPmRyaXZlci5wcm9iZSA9IG9mX2RldmljZV9wcm9iZTsKLQlkcnYtPmRyaXZlci5yZW1vdmUgPSBvZl9kZXZpY2VfcmVtb3ZlOwogCiAJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJY291bnQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMKaW5kZXggOTk5YmRkOC4uNWQxYjcwOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMKQEAgLTI1LDYgKzI1LDI4IEBACiAgKiBmaWVsZCBjb3JyZWN0bHkgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fdG9jX3N0YXJ0OwogCisvKgorICogaVNlcmllcyBzdHJ1Y3R1cmUgd2hpY2ggdGhlIGh5cGVydmlzb3Iga25vd3MgYWJvdXQgLSB0aGlzIHN0cnVjdHVyZQorICogc2hvdWxkIG5vdCBjcm9zcyBhIHBhZ2UgYm91bmRhcnkuICBUaGUgdnBhX2luaXQvcmVnaXN0ZXJfdnBhIGNhbGwKKyAqIGlzIG5vdyBrbm93biB0byBmYWlsIGlmIHRoZSBscHBhY2Egc3RydWN0dXJlIGNyb3NzZXMgYSBwYWdlCisgKiBib3VuZGFyeS4gIFRoZSBscHBhY2EgaXMgYWxzbyB1c2VkIG9uIFBPV0VSNSBwU2VyaWVzIGJveGVzLiAgVGhlCisgKiBscHBhY2EgaXMgNjQwIGJ5dGVzIGxvbmcsIGFuZCBjYW5ub3QgcmVhZGlseSBjaGFuZ2Ugc2luY2UgdGhlCisgKiBoeXBlcnZpc29yIGtub3dzIGl0cyBsYXlvdXQsIHNvIGEgMWtCIGFsaWdubWVudCB3aWxsIHN1ZmZpY2UgdG8KKyAqIGVuc3VyZSB0aGF0IGl0IGRvZXNuJ3QgY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LgorICovCitzdHJ1Y3QgbHBwYWNhIGxwcGFjYVtdID0geworCVswIC4uLiAoTlJfQ1BVUy0xKV0gPSB7CisJCS5kZXNjID0gMHhkMzk3ZDc4MSwJLyogIkxwUGEiICovCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBscHBhY2EpLAorCQkuZHluX3Byb2Nfc3RhdHVzID0gMiwKKwkJLmRlY3JfdmFsID0gMHgwMGZmMDAwMCwKKwkJLmZwcmVnc19pbl91c2UgPSAxLAorCQkuZW5kX29mX3F1YW50dW0gPSAweGZmZmZmZmZmZmZmZmZmZmZ1bCwKKwkJLnNsYl9jb3VudCA9IDY0LAorCQkudm14cmVnc19pbl91c2UgPSAwLAorCX0sCit9OworCiAvKiBUaGUgUGFjYSBpcyBhbiBhcnJheSB3aXRoIG9uZSBlbnRyeSBwZXIgcHJvY2Vzc29yLiAgRWFjaCBjb250YWlucyBhbgogICogbHBwYWNhLCB3aGljaCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gc2hhcmVkIGJldHdlZW4gdGhlCiAgKiBoeXBlcnZpc29yIGFuZCBMaW51eC4KQEAgLTM1LDI3ICs1NywxNyBAQAogICogcHJvY2Vzc29yIChub3QgdGhyZWFkKS4KICAqLwogI2RlZmluZSBQQUNBX0lOSVRfQ09NTU9OKG51bWJlciwgc3RhcnQsIGFzcnIsIGFzcnYpCQkJICAgIFwKKwkubHBwYWNhX3B0ciA9ICZscHBhY2FbbnVtYmVyXSwJCQkJCSAgICBcCiAJLmxvY2tfdG9rZW4gPSAweDgwMDAsCQkJCQkJICAgIFwKIAkucGFjYV9pbmRleCA9IChudW1iZXIpLAkJLyogUGFjYSBJbmRleCAqLwkJICAgIFwKIAkua2VybmVsX3RvYyA9ICh1bnNpZ25lZCBsb25nKSgmX190b2Nfc3RhcnQpICsgMHg4MDAwVUwsCQkgICAgXAogCS5zdGFiX3JlYWwgPSAoYXNyciksIAkJLyogUmVhbCBwb2ludGVyIHRvIHNlZ21lbnQgdGFibGUgKi8gXAogCS5zdGFiX2FkZHIgPSAoYXNydiksCQkvKiBWaXJ0IHBvaW50ZXIgdG8gc2VnbWVudCB0YWJsZSAqLyBcCiAJLmNwdV9zdGFydCA9IChzdGFydCksCQkvKiBQcm9jZXNzb3Igc3RhcnQgKi8JCSAgICBcCi0JLmh3X2NwdV9pZCA9IDB4ZmZmZiwJCQkJCQkgICAgXAotCS5scHBhY2EgPSB7CQkJCQkJCSAgICBcCi0JCS5kZXNjID0gMHhkMzk3ZDc4MSwJLyogIkxwUGEiICovCQkJICAgIFwKLQkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGxwcGFjYSksCQkJCSAgICBcCi0JCS5keW5fcHJvY19zdGF0dXMgPSAyLAkJCQkJICAgIFwKLQkJLmRlY3JfdmFsID0gMHgwMGZmMDAwMCwJCQkJCSAgICBcCi0JCS5mcHJlZ3NfaW5fdXNlID0gMSwJCQkJCSAgICBcCi0JCS5lbmRfb2ZfcXVhbnR1bSA9IDB4ZmZmZmZmZmZmZmZmZmZmZnVsLAkJCSAgICBcCi0JCS5zbGJfY291bnQgPSA2NCwJCQkJCSAgICBcCi0JCS52bXhyZWdzX2luX3VzZSA9IDAsCQkJCQkgICAgXAotCX0sCQkJCQkJCQkgICAgXAorCS5od19jcHVfaWQgPSAweGZmZmYsCiAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKICNkZWZpbmUgUEFDQV9JTklUX0lTRVJJRVMobnVtYmVyKQkJCQkJICAgIFwKLQkubHBwYWNhX3B0ciA9ICZwYWNhW251bWJlcl0ubHBwYWNhLAkJCQkgICAgXAogCS5yZWdfc2F2ZV9wdHIgPSAmaXNlcmllc19yZWdfc2F2ZVtudW1iZXJdLAogCiAjZGVmaW5lIFBBQ0FfSU5JVChudW1iZXIpCQkJCQkJICAgIFwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCmluZGV4IDE2ZDlhOTAuLmQ5YTQ1OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwpAQCAtMjMwLDggKzIzMCw3IEBACiBFWFBPUlRfU1lNQk9MKGNwbV9pbnN0YWxsX2hhbmRsZXIpOwogRVhQT1JUX1NZTUJPTChjcG1fZnJlZV9oYW5kbGVyKTsKICNlbmRpZiAvKiBDT05GSUdfOHh4ICovCi0jaWYgZGVmaW5lZChDT05GSUdfOHh4KSB8fCBkZWZpbmVkKENPTkZJR180MHgpIHx8IGRlZmluZWQoQ09ORklHXzg1eHgpIHx8XAotCWRlZmluZWQoQ09ORklHXzgzeHgpCisjaWYgZGVmaW5lZChDT05GSUdfOHh4KSB8fCBkZWZpbmVkKENPTkZJR180MHgpCiBFWFBPUlRfU1lNQk9MKF9fcmVzKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCmluZGV4IDAyZTIxMTUuLmQ1MGM4ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCkBAIC0xNjI3LDYgKzE2MjcsMTEgQEAKIAkJa2ZyZWUocHJvcC0+dmFsdWUpOwogCQlrZnJlZShwcm9wKTsKIAkJcHJvcCA9IG5leHQ7CisKKwkJaWYgKCFwcm9wKSB7CisJCQlwcm9wID0gbm9kZS0+ZGVhZHByb3BzOworCQkJbm9kZS0+ZGVhZHByb3BzID0gTlVMTDsKKwkJfQogCX0KIAlrZnJlZShub2RlLT5pbnRycyk7CiAJa2ZyZWUobm9kZS0+ZnVsbF9uYW1lKTsKQEAgLTE3NzQsNiArMTc3OSwyMyBAQAogX19pbml0Y2FsbChwcm9tX3JlY29uZmlnX3NldHVwKTsKICNlbmRpZgogCitzdHJ1Y3QgcHJvcGVydHkgKm9mX2ZpbmRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgIGludCAqbGVucCkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnBwOworCisJcmVhZF9sb2NrKCZkZXZ0cmVlX2xvY2spOworCWZvciAocHAgPSBucC0+cHJvcGVydGllczsgcHAgIT0gMDsgcHAgPSBwcC0+bmV4dCkKKwkJaWYgKHN0cmNtcChwcC0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaWYgKGxlbnAgIT0gMCkKKwkJCQkqbGVucCA9IHBwLT5sZW5ndGg7CisJCQlicmVhazsKKwkJfQorCXJlYWRfdW5sb2NrKCZkZXZ0cmVlX2xvY2spOworCisJcmV0dXJuIHBwOworfQorCiAvKgogICogRmluZCBhIHByb3BlcnR5IHdpdGggYSBnaXZlbiBuYW1lIGZvciBhIGdpdmVuIG5vZGUKICAqIGFuZCByZXR1cm4gdGhlIHZhbHVlLgpAQCAtMTc4MSwxNSArMTgwMyw4IEBACiB1bnNpZ25lZCBjaGFyICpnZXRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgICBpbnQgKmxlbnApCiB7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcDsKLQotCWZvciAocHAgPSBucC0+cHJvcGVydGllczsgcHAgIT0gMDsgcHAgPSBwcC0+bmV4dCkKLQkJaWYgKHN0cmNtcChwcC0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJaWYgKGxlbnAgIT0gMCkKLQkJCQkqbGVucCA9IHBwLT5sZW5ndGg7Ci0JCQlyZXR1cm4gcHAtPnZhbHVlOwotCQl9Ci0JcmV0dXJuIE5VTEw7CisJc3RydWN0IHByb3BlcnR5ICpwcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsbmFtZSxsZW5wKTsKKwlyZXR1cm4gcHAgPyBwcC0+dmFsdWUgOiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTChnZXRfcHJvcGVydHkpOwogCkBAIC0xODIzLDQgKzE4MzgsODIgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFJlbW92ZSBhIHByb3BlcnR5IGZyb20gYSBub2RlLiAgTm90ZSB0aGF0IHdlIGRvbid0IGFjdHVhbGx5CisgKiByZW1vdmUgaXQsIHNpbmNlIHdlIGhhdmUgZ2l2ZW4gb3V0IHdoby1rbm93cy1ob3ctbWFueSBwb2ludGVycworICogdG8gdGhlIGRhdGEgdXNpbmcgZ2V0LXByb3BlcnR5LiAgSW5zdGVhZCB3ZSBqdXN0IG1vdmUgdGhlIHByb3BlcnR5CisgKiB0byB0aGUgImRlYWQgcHJvcGVydGllcyIgbGlzdCwgc28gaXQgd29uJ3QgYmUgZm91bmQgYW55IG1vcmUuCisgKi8KK2ludCBwcm9tX3JlbW92ZV9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApCit7CisJc3RydWN0IHByb3BlcnR5ICoqbmV4dDsKKwlpbnQgZm91bmQgPSAwOwogCisJd3JpdGVfbG9jaygmZGV2dHJlZV9sb2NrKTsKKwluZXh0ID0gJm5wLT5wcm9wZXJ0aWVzOworCXdoaWxlICgqbmV4dCkgeworCQlpZiAoKm5leHQgPT0gcHJvcCkgeworCQkJLyogZm91bmQgdGhlIG5vZGUgKi8KKwkJCSpuZXh0ID0gcHJvcC0+bmV4dDsKKwkJCXByb3AtPm5leHQgPSBucC0+ZGVhZHByb3BzOworCQkJbnAtPmRlYWRwcm9wcyA9IHByb3A7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCQluZXh0ID0gJigqbmV4dCktPm5leHQ7CisJfQorCXdyaXRlX3VubG9jaygmZGV2dHJlZV9sb2NrKTsKKworCWlmICghZm91bmQpCisJCXJldHVybiAtRU5PREVWOworCisjaWZkZWYgQ09ORklHX1BST0NfREVWSUNFVFJFRQorCS8qIHRyeSB0byByZW1vdmUgdGhlIHByb2Mgbm9kZSBhcyB3ZWxsICovCisJaWYgKG5wLT5wZGUpCisJCXByb2NfZGV2aWNlX3RyZWVfcmVtb3ZlX3Byb3AobnAtPnBkZSwgcHJvcCk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfREVWSUNFVFJFRSAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVcGRhdGUgYSBwcm9wZXJ0eSBpbiBhIG5vZGUuICBOb3RlIHRoYXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAqIHJlbW92ZSBpdCwgc2luY2Ugd2UgaGF2ZSBnaXZlbiBvdXQgd2hvLWtub3dzLWhvdy1tYW55IHBvaW50ZXJzCisgKiB0byB0aGUgZGF0YSB1c2luZyBnZXQtcHJvcGVydHkuICBJbnN0ZWFkIHdlIGp1c3QgbW92ZSB0aGUgcHJvcGVydHkKKyAqIHRvIHRoZSAiZGVhZCBwcm9wZXJ0aWVzIiBsaXN0LCBhbmQgYWRkIHRoZSBuZXcgcHJvcGVydHkgdG8gdGhlCisgKiBwcm9wZXJ0eSBsaXN0CisgKi8KK2ludCBwcm9tX3VwZGF0ZV9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJIHN0cnVjdCBwcm9wZXJ0eSAqbmV3cHJvcCwKKwkJCSBzdHJ1Y3QgcHJvcGVydHkgKm9sZHByb3ApCit7CisJc3RydWN0IHByb3BlcnR5ICoqbmV4dDsKKwlpbnQgZm91bmQgPSAwOworCisJd3JpdGVfbG9jaygmZGV2dHJlZV9sb2NrKTsKKwluZXh0ID0gJm5wLT5wcm9wZXJ0aWVzOworCXdoaWxlICgqbmV4dCkgeworCQlpZiAoKm5leHQgPT0gb2xkcHJvcCkgeworCQkJLyogZm91bmQgdGhlIG5vZGUgKi8KKwkJCW5ld3Byb3AtPm5leHQgPSBvbGRwcm9wLT5uZXh0OworCQkJKm5leHQgPSBuZXdwcm9wOworCQkJb2xkcHJvcC0+bmV4dCA9IG5wLT5kZWFkcHJvcHM7CisJCQlucC0+ZGVhZHByb3BzID0gb2xkcHJvcDsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJCW5leHQgPSAmKCpuZXh0KS0+bmV4dDsKKwl9CisJd3JpdGVfdW5sb2NrKCZkZXZ0cmVlX2xvY2spOworCisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFCisJLyogdHJ5IHRvIGFkZCB0byBwcm9jIGFzIHdlbGwgaWYgaXQgd2FzIGluaXRpYWxpemVkICovCisJaWYgKG5wLT5wZGUpCisJCXByb2NfZGV2aWNlX3RyZWVfdXBkYXRlX3Byb3AobnAtPnBkZSwgbmV3cHJvcCwgb2xkcHJvcCk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfREVWSUNFVFJFRSAqLworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCmluZGV4IDMwOWFlMWQuLmE4MDk5YzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCkBAIC0xMTMsNyArMTEzLDggQEAKIAogc3RhdGljIGludCBvZl9idXNfcGNpX21hdGNoKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0JcmV0dXJuICFzdHJjbXAobnAtPnR5cGUsICJwY2kiKTsKKwkvKiAidmNpIiBpcyBmb3IgdGhlIC9jaGFvcyBicmlkZ2Ugb24gMXN0LWdlbiBQQ0kgcG93ZXJtYWNzICovCisJcmV0dXJuICFzdHJjbXAobnAtPnR5cGUsICJwY2kiKSB8fCAhc3RyY21wKG5wLT50eXBlLCAidmNpIik7CiB9CiAKIHN0YXRpYyB2b2lkIG9mX2J1c19wY2lfY291bnRfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlICpucCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKaW5kZXggNGI5Y2ZlNC4uN2ZlNGE1YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKQEAgLTM2LDYgKzM2LDExIEBACiAJLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQKIH07CiAKK3N0cnVjdCBydGFzX3N1c3BlbmRfbWVfZGF0YSB7CisJbG9uZyB3YWl0aW5nOworCXN0cnVjdCBydGFzX2FyZ3MgKmFyZ3M7Cit9OworCiBFWFBPUlRfU1lNQk9MKHJ0YXMpOwogCiBERUZJTkVfU1BJTkxPQ0socnRhc19kYXRhX2J1Zl9sb2NrKTsKQEAgLTU1Niw2ICs1NjEsODAgQEAKIAl9IHdoaWxlIChzdGF0dXMgPT0gUlRBU19CVVNZKTsKIH0KIAorc3RhdGljIGludCBpYm1fc3VzcGVuZF9tZV90b2tlbiA9IFJUQVNfVU5LTk9XTl9TRVJWSUNFOworI2lmZGVmIENPTkZJR19QUENfUFNFUklFUworc3RhdGljIHZvaWQgcnRhc19wZXJjcHVfc3VzcGVuZF9tZSh2b2lkICppbmZvKQoreworCWxvbmcgcmM7CisJbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnRhc19zdXNwZW5kX21lX2RhdGEgKmRhdGEgPQorCQkoc3RydWN0IHJ0YXNfc3VzcGVuZF9tZV9kYXRhICopaW5mbzsKKworCS8qCisJICogV2UgdXNlICJ3YWl0aW5nIiB0byBpbmRpY2F0ZSBvdXIgc3RhdGUuICBBcyBsb25nCisJICogYXMgaXQgaXMgPjAsIHdlIGFyZSBzdGlsbCB0cnlpbmcgdG8gYWxsIGpvaW4gdXAuCisJICogSWYgaXQgZ29lcyB0byAwLCB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBqb2luZWQgdXAgYW5kCisJICogb25lIHRocmVhZCBnb3QgSF9Db250aW51ZS4gIElmIGFueSBlcnJvciBoYXBwZW5zLAorCSAqIHdlIHNldCBpdCB0byA8MC4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZG8geworCQlyYyA9IHBscGFyX2hjYWxsX25vcmV0cyhIX0pPSU4pOworCQlzbXBfcm1iKCk7CisJfSB3aGlsZSAocmMgPT0gSF9TdWNjZXNzICYmIGRhdGEtPndhaXRpbmcgPiAwKTsKKwlpZiAocmMgPT0gSF9TdWNjZXNzKQorCQlnb3RvIG91dDsKKworCWlmIChyYyA9PSBIX0NvbnRpbnVlKSB7CisJCWRhdGEtPndhaXRpbmcgPSAwOworCQlydGFzX2NhbGwoaWJtX3N1c3BlbmRfbWVfdG9rZW4sIDAsIDEsCisJCQkgIGRhdGEtPmFyZ3MtPmFyZ3MpOworCX0gZWxzZSB7CisJCWRhdGEtPndhaXRpbmcgPSAtRUJVU1k7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3Igb24gSF9Kb2luIGh5cGVydmlzb3IgY2FsbFxuIik7CisJfQorCitvdXQ6CisJLyogYmVmb3JlIHdlIHJlc3RvcmUgaW50ZXJydXB0cywgbWFrZSBzdXJlIHdlIGRvbid0CisJICogZ2VuZXJhdGUgYSBzcHVyaW91cyBzb2Z0IGxvY2t1cCBlcnJvcnMKKwkgKi8KKwl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBydGFzX2libV9zdXNwZW5kX21lKHN0cnVjdCBydGFzX2FyZ3MgKmFyZ3MpCit7CisJaW50IGk7CisKKwlzdHJ1Y3QgcnRhc19zdXNwZW5kX21lX2RhdGEgZGF0YTsKKworCWRhdGEud2FpdGluZyA9IDE7CisJZGF0YS5hcmdzID0gYXJnczsKKworCS8qIENhbGwgZnVuY3Rpb24gb24gYWxsIENQVXMuICBPbmUgb2YgdXMgd2lsbCBtYWtlIHRoZQorCSAqIHJ0YXMgY2FsbAorCSAqLworCWlmIChvbl9lYWNoX2NwdShydGFzX3BlcmNwdV9zdXNwZW5kX21lLCAmZGF0YSwgMSwgMCkpCisJCWRhdGEud2FpdGluZyA9IC1FSU5WQUw7CisKKwlpZiAoZGF0YS53YWl0aW5nICE9IDApCisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgZG9pbmcgZ2xvYmFsIGpvaW5cbiIpOworCisJLyogUHJvZCBlYWNoIENQVS4gIFRoaXMgd29uJ3QgaHVydCwgYW5kIHdpbGwgd2FrZQorCSAqIGFueW9uZSB3ZSBzdWNjZXNzZnVsbHkgcHV0IHRvIHNsZWVwIHdpdGggSF9Kb2luCisJICovCisJZm9yX2VhY2hfY3B1KGkpCisJCXBscGFyX2hjYWxsX25vcmV0cyhIX1BST0QsIGkpOworCisJcmV0dXJuIGRhdGEud2FpdGluZzsKK30KKyNlbHNlIC8qIENPTkZJR19QUENfUFNFUklFUyAqLworc3RhdGljIGludCBydGFzX2libV9zdXNwZW5kX21lKHN0cnVjdCBydGFzX2FyZ3MgKmFyZ3MpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisjZW5kaWYKIAogYXNtbGlua2FnZSBpbnQgcHBjX3J0YXMoc3RydWN0IHJ0YXNfYXJncyBfX3VzZXIgKnVhcmdzKQogewpAQCAtNTYzLDYgKzY0Miw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAljaGFyICpidWZmX2NvcHksICplcnJidWYgPSBOVUxMOwogCWludCBuYXJnczsKKwlpbnQgcmM7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CkBAIC01ODEsNiArNjYxLDE3IEBACiAJCQkgICBuYXJncyAqIHNpemVvZihydGFzX2FyZ190KSkgIT0gMCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKKwlpZiAoYXJncy50b2tlbiA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBOZWVkIHRvIGhhbmRsZSBpYm0sc3VzcGVuZF9tZSBjYWxsIHNwZWNpYWxseSAqLworCWlmIChhcmdzLnRva2VuID09IGlibV9zdXNwZW5kX21lX3Rva2VuKSB7CisJCXJjID0gcnRhc19pYm1fc3VzcGVuZF9tZSgmYXJncyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwkJZ290byBjb3B5X3JldHVybjsKKwl9CisKIAlidWZmX2NvcHkgPSBnZXRfZXJyb3Jsb2dfYnVmZmVyKCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnRhcy5sb2NrLCBmbGFncyk7CkBAIC02MDQsNiArNjk1LDcgQEAKIAkJa2ZyZWUoYnVmZl9jb3B5KTsKIAl9CiAKKyBjb3B5X3JldHVybjoKIAkvKiBDb3B5IG91dCBhcmdzLiAqLwogCWlmIChjb3B5X3RvX3VzZXIodWFyZ3MtPmFyZ3MgKyBuYXJncywKIAkJCSBhcmdzLmFyZ3MgKyBuYXJncywKQEAgLTY3NSw4ICs3NjcsMTAgQEAKIAkgKiB0aGUgc3RvcC1zZWxmIHRva2VuIGlmIGFueQogCSAqLwogI2lmZGVmIENPTkZJR19QUEM2NAotCWlmIChfbWFjaGluZSA9PSBQTEFURk9STV9QU0VSSUVTX0xQQVIpCisJaWYgKF9tYWNoaW5lID09IFBMQVRGT1JNX1BTRVJJRVNfTFBBUikgewogCQlydGFzX3JlZ2lvbiA9IG1pbihsbWIucm1vX3NpemUsIFJUQVNfSU5TVEFOVElBVEVfTUFYKTsKKwkJaWJtX3N1c3BlbmRfbWVfdG9rZW4gPSBydGFzX3Rva2VuKCJpYm0sc3VzcGVuZC1tZSIpOworCX0KICNlbmRpZgogCXJ0YXNfcm1vX2J1ZiA9IGxtYl9hbGxvY19iYXNlKFJUQVNfUk1PQlVGX01BWCwgUEFHRV9TSVpFLCBydGFzX3JlZ2lvbik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCmluZGV4IGQ1YzUyZmEuLmJlMTIwNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwpAQCAtMTAwLDcgKzEwMCw4IEBACiB2b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICpjbWQpCiB7CiAJbWFjaGluZV9zaHV0ZG93bigpOwotCXBwY19tZC5yZXN0YXJ0KGNtZCk7CisJaWYgKHBwY19tZC5yZXN0YXJ0KQorCQlwcGNfbWQucmVzdGFydChjbWQpOwogI2lmZGVmIENPTkZJR19TTVAKIAlzbXBfc2VuZF9zdG9wKCk7CiAjZW5kaWYKQEAgLTExMiw3ICsxMTMsOCBAQAogdm9pZCBtYWNoaW5lX3Bvd2VyX29mZih2b2lkKQogewogCW1hY2hpbmVfc2h1dGRvd24oKTsKLQlwcGNfbWQucG93ZXJfb2ZmKCk7CisJaWYgKHBwY19tZC5wb3dlcl9vZmYpCisJCXBwY19tZC5wb3dlcl9vZmYoKTsKICNpZmRlZiBDT05GSUdfU01QCiAJc21wX3NlbmRfc3RvcCgpOwogI2VuZGlmCkBAIC0xMjksNyArMTMxLDggQEAKIHZvaWQgbWFjaGluZV9oYWx0KHZvaWQpCiB7CiAJbWFjaGluZV9zaHV0ZG93bigpOwotCXBwY19tZC5oYWx0KCk7CisJaWYgKHBwY19tZC5oYWx0KQorCQlwcGNfbWQuaGFsdCgpOwogI2lmZGVmIENPTkZJR19TTVAKIAlzbXBfc2VuZF9zdG9wKCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKaW5kZXggNTZmNTBlOS4uYzRhMjk0ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKQEAgLTQzMSw3ICs0MzEsNyBAQAogCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HLCByZWdzKTsKIAogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCWdldF9wYWNhKCktPmxwcGFjYS5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50ID0gMDsKKwlnZXRfbHBwYWNhKCktPmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQgPSAwOwogI2VuZGlmCiAKIAl3aGlsZSAoKHRpY2tzID0gdGJfdGlja3Nfc2luY2UocGVyX2NwdShsYXN0X2ppZmZ5LCBjcHUpKSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCmluZGV4IDEzYzQxNDkuLjEzYzY1NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwpAQCAtNzYsNyArNzYsNyBAQAogCXN0cnVjdCB2aW9fZGV2ICp2aW9kZXYgPSB0b192aW9fZGV2KGRldik7CiAJc3RydWN0IHZpb19kcml2ZXIgKnZpb2RydiA9IHRvX3Zpb19kcml2ZXIoZGV2LT5kcml2ZXIpOwogCi0JaWYgKHZpb2Rydi0+c2h1dGRvd24pCisJaWYgKGRldi0+ZHJpdmVyICYmIHZpb2Rydi0+c2h1dGRvd24pCiAJCXZpb2Rydi0+c2h1dGRvd24odmlvZGV2KTsKIH0KIApAQCAtOTEsOSArOTEsNiBAQAogCiAJLyogZmlsbCBpbiAnc3RydWN0IGRyaXZlcicgZmllbGRzICovCiAJdmlvZHJ2LT5kcml2ZXIuYnVzID0gJnZpb19idXNfdHlwZTsKLQl2aW9kcnYtPmRyaXZlci5wcm9iZSA9IHZpb19idXNfcHJvYmU7Ci0JdmlvZHJ2LT5kcml2ZXIucmVtb3ZlID0gdmlvX2J1c19yZW1vdmU7Ci0JdmlvZHJ2LT5kcml2ZXIuc2h1dGRvd24gPSB2aW9fYnVzX3NodXRkb3duOwogCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmdmlvZHJ2LT5kcml2ZXIpOwogfQpAQCAtMjk1LDQgKzI5Miw3IEBACiAJLm5hbWUgPSAidmlvIiwKIAkudWV2ZW50ID0gdmlvX2hvdHBsdWcsCiAJLm1hdGNoID0gdmlvX2J1c19tYXRjaCwKKwkucHJvYmUgPSB2aW9fYnVzX3Byb2JlLAorCS5yZW1vdmUgPSB2aW9fYnVzX3JlbW92ZSwKKwkuc2h1dGRvd24gPSB2aW9fYnVzX3NodXRkb3duLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvbG9ja3MuYyBiL2FyY2gvcG93ZXJwYy9saWIvbG9ja3MuYwppbmRleCAzNWJkMDNjLi44MzYyZmEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL2xvY2tzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9sb2Nrcy5jCkBAIC0yOCwxNSArMjgsMTMgQEAKIHZvaWQgX19zcGluX3lpZWxkKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCXVuc2lnbmVkIGludCBsb2NrX3ZhbHVlLCBob2xkZXJfY3B1LCB5aWVsZF9jb3VudDsKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmhvbGRlcl9wYWNhOwogCiAJbG9ja192YWx1ZSA9IGxvY2stPnNsb2NrOwogCWlmIChsb2NrX3ZhbHVlID09IDApCiAJCXJldHVybjsKIAlob2xkZXJfY3B1ID0gbG9ja192YWx1ZSAmIDB4ZmZmZjsKIAlCVUdfT04oaG9sZGVyX2NwdSA+PSBOUl9DUFVTKTsKLQlob2xkZXJfcGFjYSA9ICZwYWNhW2hvbGRlcl9jcHVdOwotCXlpZWxkX2NvdW50ID0gaG9sZGVyX3BhY2EtPmxwcGFjYS55aWVsZF9jb3VudDsKKwl5aWVsZF9jb3VudCA9IGxwcGFjYVtob2xkZXJfY3B1XS55aWVsZF9jb3VudDsKIAlpZiAoKHlpZWxkX2NvdW50ICYgMSkgPT0gMCkKIAkJcmV0dXJuOwkJLyogdmlydHVhbCBjcHUgaXMgY3VycmVudGx5IHJ1bm5pbmcgKi8KIAlybWIoKTsKQEAgLTYwLDE1ICs1OCwxMyBAQAogewogCWludCBsb2NrX3ZhbHVlOwogCXVuc2lnbmVkIGludCBob2xkZXJfY3B1LCB5aWVsZF9jb3VudDsKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmhvbGRlcl9wYWNhOwogCiAJbG9ja192YWx1ZSA9IHJ3LT5sb2NrOwogCWlmIChsb2NrX3ZhbHVlID49IDApCiAJCXJldHVybjsJCS8qIG5vIHdyaXRlIGxvY2sgYXQgcHJlc2VudCAqLwogCWhvbGRlcl9jcHUgPSBsb2NrX3ZhbHVlICYgMHhmZmZmOwogCUJVR19PTihob2xkZXJfY3B1ID49IE5SX0NQVVMpOwotCWhvbGRlcl9wYWNhID0gJnBhY2FbaG9sZGVyX2NwdV07Ci0JeWllbGRfY291bnQgPSBob2xkZXJfcGFjYS0+bHBwYWNhLnlpZWxkX2NvdW50OworCXlpZWxkX2NvdW50ID0gbHBwYWNhW2hvbGRlcl9jcHVdLnlpZWxkX2NvdW50OwogCWlmICgoeWllbGRfY291bnQgJiAxKSA9PSAwKQogCQlyZXR1cm47CQkvKiB2aXJ0dWFsIGNwdSBpcyBjdXJyZW50bHkgcnVubmluZyAqLwogCXJtYigpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jCmluZGV4IDcxNjE1ZWIuLmNjMjUzNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMKQEAgLTE0MCwxOSArMTQwLDE5IEBACiAKIAlzd2l0Y2ggKGN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfdHlwZSkgewogI2lmZGVmIENPTkZJR19QUEM2NAotCQljYXNlIFJTNjQ6CisJCWNhc2UgUFBDX09QUk9GSUxFX1JTNjQ6CiAJCQltb2RlbCA9ICZvcF9tb2RlbF9yczY0OwogCQkJYnJlYWs7Ci0JCWNhc2UgUE9XRVI0OgorCQljYXNlIFBQQ19PUFJPRklMRV9QT1dFUjQ6CiAJCQltb2RlbCA9ICZvcF9tb2RlbF9wb3dlcjQ7CiAJCQlicmVhazsKICNlbHNlCi0JCWNhc2UgRzQ6CisJCWNhc2UgUFBDX09QUk9GSUxFX0c0OgogCQkJbW9kZWwgPSAmb3BfbW9kZWxfNzQ1MDsKIAkJCWJyZWFrOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ZTTF9CT09LRQotCQljYXNlIEJPT0tFOgorCQljYXNlIFBQQ19PUFJPRklMRV9CT09LRToKIAkJCW1vZGVsID0gJm9wX21vZGVsX2ZzbF9ib29rZTsKIAkJCWJyZWFrOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCmluZGV4IGIyMDgxMmQuLjc2NzVlNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCkBAIC03LDYgKzcsNyBAQAogCiBjb25maWcgTVBDODM0eF9TWVMKIAlib29sICJGcmVlc2NhbGUgTVBDODM0eCBTWVMiCisJc2VsZWN0IERFRkFVTFRfVUlNQUdFCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTVBDIDgzNHggU1lTIGV2YWx1YXRpb24gYm9hcmQuCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5OGRkMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmMKKyAqCisgKiBNUEM4MzR4IFNZUyBib2FyZCBzcGVjaWZpYyByb3V0aW5lcworICoKKyAqIE1haW50YWluZXI6IEt1bWFyIEdhbGEgPGdhbGFrQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vaXBpYy5oPgorI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL21wYzgzeHguaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bW0vbW11X2RlY2wuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KKworI2luY2x1ZGUgIm1wYzgzeHguaCIKKworI2lmbmRlZiBDT05GSUdfUENJCit1bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKK3Vuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSQorZXh0ZXJuIGludCBtcGM4M3h4X3BjaTJfYnVzbm87CisKK3N0YXRpYyBpbnQKK21wYzgzeHhfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyIGlkc2VsLCB1bnNpZ25lZCBjaGFyIHBpbikKK3sKKwlzdGF0aWMgY2hhciBwY2lfaXJxX3RhYmxlW11bNF0gPQorCSAgICAvKgorCSAgICAgKiAgICAgIFBDSSBJRFNFTC9JTlRQSU4tPklOVExJTkUKKwkgICAgICogICAgICAgQSAgICAgIEIgICAgICBDICAgICAgRAorCSAgICAgKi8KKwl7CisJCXtQSVJRQSwgUElSUUIsIFBJUlFDLCBQSVJRRH0sCS8qIGlkc2VsIDB4MTEgKi8KKwkJe1BJUlFDLCBQSVJRRCwgUElSUUEsIFBJUlFCfSwJLyogaWRzZWwgMHgxMiAqLworCQl7UElSUUQsIFBJUlFBLCBQSVJRQiwgUElSUUN9LAkvKiBpZHNlbCAweDEzICovCisJCXswLCAwLCAwLCAwfSwKKwkJe1BJUlFBLCBQSVJRQiwgUElSUUMsIFBJUlFEfSwJLyogaWRzZWwgMHgxNSAqLworCQl7UElSUUQsIFBJUlFBLCBQSVJRQiwgUElSUUN9LAkvKiBpZHNlbCAweDE2ICovCisJCXtQSVJRQywgUElSUUQsIFBJUlFBLCBQSVJRQn0sCS8qIGlkc2VsIDB4MTcgKi8KKwkJe1BJUlFCLCBQSVJRQywgUElSUUQsIFBJUlFBfSwJLyogaWRzZWwgMHgxOCAqLworCQl7MCwgMCwgMCwgMH0sCQkJLyogaWRzZWwgMHgxOSAqLworCQl7MCwgMCwgMCwgMH0sCQkJLyogaWRzZWwgMHgyMCAqLworCX07CisKKwljb25zdCBsb25nIG1pbl9pZHNlbCA9IDB4MTEsIG1heF9pZHNlbCA9IDB4MjAsIGlycXNfcGVyX3Nsb3QgPSA0OworCXJldHVybiBQQ0lfSVJRX1RBQkxFX0xPT0tVUDsKK30KKworc3RhdGljIGludAorbXBjODN4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCit7CisJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQorCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCWlmIChtcGM4M3h4X3BjaTJfYnVzbm8pCisJCWlmIChidXMgPT0gKG1wYzgzeHhfcGNpMl9idXNubykgJiYgUENJX1NMT1QoZGV2Zm4pID09IDApCisJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCisgKgorICovCitzdGF0aWMgdm9pZCBfX2luaXQKK21wYzgzNHhfc3lzX3NldHVwX2FyY2godm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJaWYgKHBwY19tZC5wcm9ncmVzcykKKwkJcHBjX21kLnByb2dyZXNzKCJtcGM4MzR4X3N5c19zZXR1cF9hcmNoKCkiLCAwKTsKKworCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImNwdSIpOworCWlmIChucCAhPSAwKSB7CisJCXVuc2lnbmVkIGludCAqZnAgPSAoaW50ICopIGdldF9wcm9wZXJ0eShucCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCQlpZiAoZnAgIT0gMCkKKwkJCWxvb3BzX3Blcl9qaWZmeSA9ICpmcCAvIEhaOworCQllbHNlCisJCQlsb29wc19wZXJfamlmZnkgPSA1MDAwMDAwMCAvIEhaOworCQlvZl9ub2RlX3B1dChucCk7CisJfQorCisjaWZkZWYgQ09ORklHX1BDSQorCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKKwkJYWRkX2JyaWRnZShucCk7CisKKwlwcGNfbWQucGNpX3N3aXp6bGUgPSBjb21tb25fc3dpenpsZTsKKwlwcGNfbWQucGNpX21hcF9pcnEgPSBtcGM4M3h4X21hcF9pcnE7CisJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2U7CisjZW5kaWYKKworI2lmZGVmICBDT05GSUdfUk9PVF9ORlMKKwkJUk9PVF9ERVYgPSBSb290X05GUzsKKyNlbHNlCisJCVJPT1RfREVWID0gUm9vdF9IREExOworI2VuZGlmCit9CisKK3ZvaWQgX19pbml0CittcGM4MzR4X3N5c19pbml0X0lSUSh2b2lkKQoreworCXU4IHNlbnNlc1s4XSA9IHsKKwkJMCwJCQkvKiBFWFQgMCAqLworCQlJUlFfU0VOU0VfTEVWRUwsCS8qIEVYVCAxICovCisJCUlSUV9TRU5TRV9MRVZFTCwJLyogRVhUIDIgKi8KKwkJMCwJCQkvKiBFWFQgMyAqLworI2lmZGVmIENPTkZJR19QQ0kKKwkJSVJRX1NFTlNFX0xFVkVMLAkvKiBFWFQgNCAqLworCQlJUlFfU0VOU0VfTEVWRUwsCS8qIEVYVCA1ICovCisJCUlSUV9TRU5TRV9MRVZFTCwJLyogRVhUIDYgKi8KKwkJSVJRX1NFTlNFX0xFVkVMLAkvKiBFWFQgNyAqLworI2Vsc2UKKwkJMCwJCQkvKiBFWFQgNCAqLworCQkwLAkJCS8qIEVYVCA1ICovCisJCTAsCQkJLyogRVhUIDYgKi8KKwkJMCwJCQkvKiBFWFQgNyAqLworI2VuZGlmCisJfTsKKworCWlwaWNfaW5pdChnZXRfaW1tcmJhc2UoKSArIDB4MDA3MDAsIDAsIDAsIHNlbnNlcywgOCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IGludGVycnVwdCBtYXBwaW5nIHByaW9yaXRpZXMsCisJICogaW4gY2FzZSB0aGUgYm9vdCByb20gY2hhbmdlZCBzb21ldGhpbmcgb24gdXMuCisJICovCisJaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfSTJDX01QQykgJiYgZGVmaW5lZChDT05GSUdfU0VOU09SU19EUzEzNzQpCitleHRlcm4gdWxvbmcJZHMxMzc0X2dldF9ydGNfdGltZSh2b2lkKTsKK2V4dGVybiBpbnQJZHMxMzc0X3NldF9ydGNfdGltZSh1bG9uZyk7CisKK3N0YXRpYyBpbnQgX19pbml0CittcGM4MzR4X3J0Y19ob29rdXAodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMJdHY7CisKKwlwcGNfbWQuZ2V0X3J0Y190aW1lID0gZHMxMzc0X2dldF9ydGNfdGltZTsKKwlwcGNfbWQuc2V0X3J0Y190aW1lID0gZHMxMzc0X3NldF9ydGNfdGltZTsKKworCXR2LnR2X25zZWMgPSAwOworCXR2LnR2X3NlYyA9IChwcGNfbWQuZ2V0X3J0Y190aW1lKSgpOworCWRvX3NldHRpbWVvZmRheSgmdHYpOworCisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKG1wYzgzNHhfcnRjX2hvb2t1cCk7CisjZW5kaWYKKworc3RhdGljIHZvaWQKK21wYzgzeHhfcmVzdGFydChjaGFyICpjbWQpCit7CisjZGVmaW5lIFJTVF9PRkZTRVQJMHgwMDAwMDkwMAorI2RlZmluZSBSU1RfUFJPVF9SRUcJMHgwMDAwMDAxOAorI2RlZmluZSBSU1RfQ1RSTF9SRUcJMHgwMDAwMDAxYworCV9fYmUzMiBfX2lvbWVtICpyZWc7CisKKwkvLyBtYXAgcmVzZXQgcmVnaXN0ZXIgc3BhY2UKKwlyZWcgPSBpb3JlbWFwKGdldF9pbW1yYmFzZSgpICsgMHg5MDAsIDB4ZmYpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCS8qIGVuYWJsZSBzb2Z0d2FyZSByZXNldCAiUlNURSIgKi8KKwlvdXRfYmUzMihyZWcgKyAoUlNUX1BST1RfUkVHID4+IDIpLCAweDUyNTM1NDQ1KTsKKworCS8qIHNldCBzb2Z0d2FyZSBoYXJkIHJlc2V0ICovCisJb3V0X2JlMzIocmVnICsgKFJTVF9DVFJMX1JFRyA+PiAyKSwgMHg1MjUzNTQ0NSk7CisJZm9yKDs7KTsKK30KKworc3RhdGljIGxvbmcgX19pbml0CittcGM4M3h4X3RpbWVfaW5pdCh2b2lkKQoreworI2RlZmluZSBTUENSX09GRlNFVAkweDAwMDAwMTEwCisjZGVmaW5lIFNQQ1JfVEJFTgkweDAwNDAwMDAwCisJX19iZTMyIF9faW9tZW0gKnNwY3IgPSBpb3JlbWFwKGdldF9pbW1yYmFzZSgpICsgU1BDUl9PRkZTRVQsIDQpOworCV9fYmUzMiB0bXA7CisKKwl0bXAgPSBpbl9iZTMyKHNwY3IpOworCW91dF9iZTMyKHNwY3IsIHRtcHxTUENSX1RCRU4pOworCisJaW91bm1hcChzcGNyKTsKKworCXJldHVybiAwOworfQordm9pZCBfX2luaXQKK3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwkvKiBzZXR1cCB0aGUgUG93ZXJQQyBtb2R1bGUgc3RydWN0ICovCisJcHBjX21kLnNldHVwX2FyY2ggPSBtcGM4MzR4X3N5c19zZXR1cF9hcmNoOworCisJcHBjX21kLmluaXRfSVJRID0gbXBjODM0eF9zeXNfaW5pdF9JUlE7CisJcHBjX21kLmdldF9pcnEgPSBpcGljX2dldF9pcnE7CisKKwlwcGNfbWQucmVzdGFydCA9IG1wYzgzeHhfcmVzdGFydDsKKworCXBwY19tZC50aW1lX2luaXQgPSBtcGM4M3h4X3RpbWVfaW5pdDsKKwlwcGNfbWQuc2V0X3J0Y190aW1lID0gTlVMTDsKKwlwcGNfbWQuZ2V0X3J0Y190aW1lID0gTlVMTDsKKwlwcGNfbWQuY2FsaWJyYXRlX2RlY3IgPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyOworCisJcHBjX21kLnByb2dyZXNzID0gdWRiZ19wcm9ncmVzczsKKworCWlmIChwcGNfbWQucHJvZ3Jlc3MpCisJCXBwY19tZC5wcm9ncmVzcygibXBjODM0eF9zeXNfaW5pdCgpOiBleGl0IiwgMCk7CisKKwlyZXR1cm47Cit9CisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGNhMzlmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGFyY2gvcG93ZXJwcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuaAorICoKKyAqIE1QQzgzNFggU1lTIGNvbW1vbiBib2FyZCBkZWZpbml0aW9ucworICoKKyAqIE1haW50YWluZXI6IEt1bWFyIEdhbGEgPGdhbGFrQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX01BQ0hfTVBDODNYWF9TWVNfSF9fCisjZGVmaW5lIF9fTUFDSF9NUEM4M1hYX1NZU19IX18KKworI2RlZmluZSBQSVJRQQlNUEM4M3h4X0lSUV9FWFQ0CisjZGVmaW5lIFBJUlFCCU1QQzgzeHhfSVJRX0VYVDUKKyNkZWZpbmUgUElSUUMJTVBDODN4eF9JUlFfRVhUNgorI2RlZmluZSBQSVJRRAlNUEM4M3h4X0lSUV9FWFQ3CisKKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBfX01BQ0hfTVBDODNYWF9TWVNfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTllNjZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9fTVBDODNYWF9IX18KKyNkZWZpbmUgX19NUEM4M1hYX0hfXworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisvKgorICogRGVjbGFyYXRpb24gZm9yIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBleHBvcnRlZCBieSB0aGUKKyAqIG1wYzgzeHhfKiBmaWxlcy4gTW9zdGx5IGZvciB1c2UgYnkgbXBjODN4eF9zZXR1cAorICovCisKK2V4dGVybiBpbnQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CisKKyNlbmRpZiAvKiBfX01QQzgzWFhfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5Y2RhYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogRlNMIFNvQyBzZXR1cCBjb2RlCisgKgorICogTWFpbnRhaW5lZCBieSBLdW1hciBHYWxhIChzZWUgTUFJTlRBSU5FUlMgZm9yIGNvbnRhY3QgaW5mb3JtYXRpb24pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisKKyN1bmRlZiBERUJVRworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKHguLi4pIHByaW50ayh4KQorI2Vsc2UKKyNkZWZpbmUgREJHKHguLi4pCisjZW5kaWYKKworaW50IG1wYzgzeHhfcGNpMl9idXNubzsKKworI2lmZGVmIENPTkZJR19QQ0kKK2ludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcnNyYzsKKwlpbnQgKmJ1c19yYW5nZTsKKwlpbnQgcHJpbWFyeSA9IDEsIGhhc19hZGRyZXNzID0gMDsKKwlwaHlzX2FkZHJfdCBpbW1yID0gZ2V0X2ltbXJiYXNlKCk7CisKKwlEQkcoIkFkZGluZyBQQ0kgaG9zdCBicmlkZ2UgJXNcbiIsIGRldi0+ZnVsbF9uYW1lKTsKKworCS8qIEZldGNoIGhvc3QgYnJpZGdlIHJlZ2lzdGVycyBhZGRyZXNzICovCisJaGFzX2FkZHJlc3MgPSAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkZXYsIDAsICZyc3JjKSA9PSAwKTsKKworCS8qIEdldCBidXMgcmFuZ2UgaWYgYW55ICovCisJYnVzX3JhbmdlID0gKGludCAqKSBnZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7CisJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgorCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOworCX0KKworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlpZiAoIWhvc2UpCisJCXJldHVybiAtRU5PTUVNOworCWhvc2UtPmFyY2hfZGF0YSA9IGRldjsKKwlob3NlLT5zZXRfY2ZnX3R5cGUgPSAxOworCisJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMF0gOiAwOworCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZmOworCisJLyogTVBDODN4eCBzdXBwb3J0cyB1cCB0byB0d28gaG9zdCBjb250cm9sbGVycyBvbmUgYXQgMHg4NTAwIGZyb20gaW1tcmJhcgorCSAqIHRoZSBvdGhlciBhdCAweDg2MDAsIHdlIGNvbnNpZGVyIHRoZSAweDg1MDAgdGhlIHByaW1hcnkgY29udHJvbGxlcgorCSAqLworCS8qIFBDSSAxICovCisJaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gMHg4NTAwKSB7CisJCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCBpbW1yICsgMHg4MzAwLCBpbW1yICsgMHg4MzA0KTsKKwl9CisJLyogUENJIDIqLworCWlmICgocnNyYy5zdGFydCAmIDB4ZmZmZmYpID09IDB4ODYwMCkgeworCQlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgaW1tciArIDB4ODM4MCwgaW1tciArIDB4ODM4NCk7CisJCXByaW1hcnkgPSAwOworCQlob3NlLT5idXNfb2Zmc2V0ID0gaG9zZS0+Zmlyc3RfYnVzbm87CisJCW1wYzgzeHhfcGNpMl9idXNubyA9IGhvc2UtPmZpcnN0X2J1c25vOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1QQzgzeHggUENJIGhvc3QgYnJpZGdlIGF0IDB4JTA4bHguICIKKwkgICAgICAgIkZpcm13YXJlIGJ1cyBudW1iZXI6ICVkLT4lZFxuIiwKKwkJcnNyYy5zdGFydCwgaG9zZS0+Zmlyc3RfYnVzbm8sIGhvc2UtPmxhc3RfYnVzbm8pOworCisJREJHKCIgLT5Ib3NlIGF0IDB4JXAsIGNmZ19hZGRyPTB4JXAsY2ZnX2RhdGE9MHglcFxuIiwKKwkJaG9zZSwgaG9zZS0+Y2ZnX2FkZHIsIGhvc2UtPmNmZ19kYXRhKTsKKworCS8qIEludGVycHJldCB0aGUgInJhbmdlcyIgcHJvcGVydHkgKi8KKwkvKiBUaGlzIGFsc28gbWFwcyB0aGUgSS9PIHJlZ2lvbiBhbmQgc2V0cyBpc2FfaW8vbWVtX2Jhc2UgKi8KKwlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKGhvc2UsIGRldiwgcHJpbWFyeSk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKaW5kZXggODJjNDI5ZC4uMDBjNTJmMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYwpAQCAtMTM1LDEyICsxMzUsMTMgQEAKIGh5ZHJhX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXN0cnVjdCByZXNvdXJjZSByOwogCiAJbnAgPSBmaW5kX2RldmljZXMoIm1hYy1pbyIpOwotCWlmIChucCA9PSBOVUxMIHx8IG5wLT5uX2FkZHJzID09IDApCisJaWYgKG5wID09IE5VTEwgfHwgb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnIpKQogCQlyZXR1cm4gMDsKLQlIeWRyYSA9IGlvcmVtYXAobnAtPmFkZHJzWzBdLmFkZHJlc3MsIG5wLT5hZGRyc1swXS5zaXplKTsKLQlwcmludGsoIkh5ZHJhIE1hYyBJL08gYXQgJWx4XG4iLCBucC0+YWRkcnNbMF0uYWRkcmVzcyk7CisJSHlkcmEgPSBpb3JlbWFwKHIuc3RhcnQsIHIuZW5kLXIuc3RhcnQpOworCXByaW50aygiSHlkcmEgTWFjIEkvTyBhdCAlbHhcbiIsIHIuc3RhcnQpOwogCXByaW50aygiSHlkcmEgRmVhdHVyZV9Db250cm9sIHdhcyAleCIsCiAJICAgICAgIGluX2xlMzIoJkh5ZHJhLT5GZWF0dXJlX0NvbnRyb2wpKTsKIAlvdXRfbGUzMigmSHlkcmEtPkZlYXR1cmVfQ29udHJvbCwgKEhZRFJBX0ZDX1NDQ19DRUxMX0VOIHwKQEAgLTE3NywxOCArMTc4LDI0IEBACiB7CiAJdTMyIF9faW9tZW0gKnJlZzsKIAl1MzIgdmFsOwotCXVuc2lnbmVkIGxvbmcgYWRkciA9IGRldi0+YWRkcnNbMF0uYWRkcmVzczsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAotCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCBhZGRyICsgMHhmODAwMCwgYWRkciArIDB4ZjgwMTApOworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRldiwgMCwgJnIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm8gYWRkcmVzcyBmb3IgUHl0aG9uIFBDSSBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuOworCX0KIAogCS8qIENsZWFyIHRoZSBtYWdpYyBnby1zbG93IGJpdCAqLwotCXJlZyA9IGlvcmVtYXAoZGV2LT5hZGRyc1swXS5hZGRyZXNzICsgMHhmNjAwMCwgMHg0MCk7CisJcmVnID0gaW9yZW1hcChyLnN0YXJ0ICsgMHhmNjAwMCwgMHg0MCk7CisJQlVHX09OKCFyZWcpOyAKIAl2YWwgPSBpbl9iZTMyKCZyZWdbMTJdKTsKIAlpZiAodmFsICYgUFJHX0NMX1JFU0VUX1ZBTElEKSB7CiAJCW91dF9iZTMyKCZyZWdbMTJdLCB2YWwgJiB+UFJHX0NMX1JFU0VUX1ZBTElEKTsKIAkJaW5fYmUzMigmcmVnWzEyXSk7CiAJfQogCWlvdW5tYXAocmVnKTsKKworCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCByLnN0YXJ0ICsgMHhmODAwMCwgci5zdGFydCArIDB4ZjgwMTApOwogfQogCiAvKiBNYXJ2ZWxsIERpc2NvdmVyeSBJSSBiYXNlZCBQZWdhc29zIDIgKi8KQEAgLTIxOCw3ICsyMjUsNyBAQAogCWNoYXIgKm1vZGVsLCAqbWFjaGluZTsKIAlpbnQgaXNfbG9uZ3RyYWlsID0gMCwgaXNfbW90ID0gMCwgaXNfcGVnYXNvcyA9IDA7CiAJc3RydWN0IGRldmljZV9ub2RlICpyb290ID0gZmluZF9wYXRoX2RldmljZSgiLyIpOwotCisJc3RydWN0IHJlc291cmNlIHI7CiAJLyoKIAkgKiBUaGUgUENJIGhvc3QgYnJpZGdlIG5vZGVzIG9uIHNvbWUgbWFjaGluZXMgZG9uJ3QgaGF2ZQogCSAqIHByb3BlcnRpZXMgdG8gYWRlcXVhdGVseSBpZGVudGlmeSB0aGVtLCBzbyB3ZSBoYXZlIHRvCkBAIC0yMzgsNyArMjQ1LDcgQEAKIAkJCWNvbnRpbnVlOwogCQkrK2luZGV4OwogCQkvKiBUaGUgR0cyIGJyaWRnZSBvbiB0aGUgTG9uZ1RyYWlsIGRvZXNuJ3QgaGF2ZSBhbiBhZGRyZXNzICovCi0JCWlmIChkZXYtPm5fYWRkcnMgPCAxICYmICFpc19sb25ndHJhaWwpIHsKKwkJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCAwLCAmcikgJiYgIWlzX2xvbmd0cmFpbCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgdXNlICVzOiBubyBhZGRyZXNzXG4iLAogCQkJICAgICAgIGRldi0+ZnVsbF9uYW1lKTsKIAkJCWNvbnRpbnVlOwpAQCAtMjU1LDggKzI2Miw4IEBACiAJCQlwcmludGsoS0VSTl9JTkZPICJQQ0kgYnVzZXMgJWQuLiVkIiwKIAkJCSAgICAgICBidXNfcmFuZ2VbMF0sIGJ1c19yYW5nZVsxXSk7CiAJCXByaW50aygiIGNvbnRyb2xsZWQgYnkgJXMiLCBkZXYtPnR5cGUpOwotCQlpZiAoZGV2LT5uX2FkZHJzID4gMCkKLQkJCXByaW50aygiIGF0ICVseCIsIGRldi0+YWRkcnNbMF0uYWRkcmVzcyk7CisJCWlmICghaXNfbG9uZ3RyYWlsKQorCQkJcHJpbnRrKCIgYXQgJWx4Iiwgci5zdGFydCk7CiAJCXByaW50aygiXG4iKTsKIAogCQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jCmluZGV4IDRlYzhiYTcuLjJkYzg3YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jCkBAIC0zNTIsOSArMzUyLDEwIEBACiAJCW9wYWRkciA9IG9wcHJvcFtuYS0xXTsJLyogYXNzdW1lIDMyLWJpdCAqLwogCQlvcGxlbiAvPSBuYSAqIHNpemVvZih1bnNpZ25lZCBpbnQpOwogCX0gZWxzZSB7Ci0JCWlmIChucC0+bl9hZGRycyA9PSAwKQorCQlzdHJ1Y3QgcmVzb3VyY2UgcjsKKwkJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKSkKIAkJCXJldHVybjsKLQkJb3BhZGRyID0gbnAtPmFkZHJzWzBdLmFkZHJlc3M7CisJCW9wYWRkciA9IHIuc3RhcnQ7CiAJCW9wbGVuID0gMDsKIAl9CiAKQEAgLTM3Nyw3ICszNzgsNyBAQAogCSAqLwogCWlmIChvcGxlbiA8IGxlbikgewogCQlwcmludGsoS0VSTl9FUlIgIkluc3VmZmljaWVudCBhZGRyZXNzZXMgZm9yIGRpc3RyaWJ1dGVkIgotCQkgICAgICAgIiBPcGVuUElDICglZCA8ICVkKVxuIiwgbnAtPm5fYWRkcnMsIGxlbik7CisJCSAgICAgICAiIE9wZW5QSUMgKCVkIDwgJWQpXG4iLCBvcGxlbiwgbGVuKTsKIAkJbGVuID0gb3BsZW47CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvdGltZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3RpbWUuYwppbmRleCA3MzdlZTVkLi4zNmEwZjk3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC90aW1lLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9udnJhbS5oPgpAQCAtMzcsMTQgKzM4LDE2IEBACiBsb25nIF9faW5pdCBjaHJwX3RpbWVfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcnRjczsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAlpbnQgYmFzZTsKIAogCXJ0Y3MgPSBmaW5kX2NvbXBhdGlibGVfZGV2aWNlcygicnRjIiwgInBucFBOUCxiMDAiKTsKIAlpZiAocnRjcyA9PSBOVUxMKQogCQlydGNzID0gZmluZF9jb21wYXRpYmxlX2RldmljZXMoInJ0YyIsICJkczEzODUtcnRjIik7Ci0JaWYgKHJ0Y3MgPT0gTlVMTCB8fCBydGNzLT5hZGRycyA9PSBOVUxMKQorCWlmIChydGNzID09IE5VTEwgfHwgb2ZfYWRkcmVzc190b19yZXNvdXJjZShydGNzLCAwLCAmcikpCiAJCXJldHVybiAwOwotCWJhc2UgPSBydGNzLT5hZGRyc1swXS5hZGRyZXNzOworCQorCWJhc2UgPSByLnN0YXJ0OwogCW52cmFtX2FzMSA9IDA7CiAJbnZyYW1fYXMwID0gYmFzZTsKIAludnJhbV9kYXRhID0gYmFzZSArIDE7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaXJxLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaXJxLmMKaW5kZXggODM0NDJlYS4uYmUzZmJmYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pcnEuYwpAQCAtMzM0LDE0ICszMzQsMTIgQEAKICAqLwogaW50IGlTZXJpZXNfZ2V0X2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhOwogCS8qIC0yIG1lYW5zIGlnbm9yZSB0aGlzIGludGVycnVwdCAqLwogCWludCBpcnEgPSAtMjsKIAotCWxwYWNhID0gZ2V0X3BhY2EoKTsKICNpZmRlZiBDT05GSUdfU01QCi0JaWYgKGxwYWNhLT5scHBhY2EuaW50X2R3b3JkLmZpZWxkcy5pcGlfY250KSB7Ci0JCWxwYWNhLT5scHBhY2EuaW50X2R3b3JkLmZpZWxkcy5pcGlfY250ID0gMDsKKwlpZiAoZ2V0X2xwcGFjYSgpLT5pbnRfZHdvcmQuZmllbGRzLmlwaV9jbnQpIHsKKwkJZ2V0X2xwcGFjYSgpLT5pbnRfZHdvcmQuZmllbGRzLmlwaV9jbnQgPSAwOwogCQlpU2VyaWVzX3NtcF9tZXNzYWdlX3JlY3YocmVncyk7CiAJfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9taXNjLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWlzYy5TCmluZGV4IGRmZTdhYTEuLjc2NDFmYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9taXNjLlMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21pc2MuUwpAQCAtNDQsNyArNDQsOCBAQAogCS8qIENoZWNrIHBlbmRpbmcgaW50ZXJydXB0cyAqLwogCS8qICAgQSBkZWNyZW1lbnRlciwgSVBJIG9yIFBNQyBpbnRlcnJ1cHQgbWF5IGhhdmUgb2NjdXJyZWQKIAkgKiAgIHdoaWxlIHdlIHdlcmUgaW4gdGhlIGh5cGVydmlzb3IgKHdoaWNoIGVuYWJsZXMpICovCi0JbGQJcjQsUEFDQUxQUEFDQStMUFBBQ0FBTllJTlQocjEzKQorCWxkCXI0LFBBQ0FMUFBBQ0FQVFIocjEzKQorCWxkCXI0LExQUEFDQUFOWUlOVChyNCkKIAljbXBkaQlyNCwwCiAJYmVxbHIKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwppbmRleCBjNmJiZTVjLi4zZjg3OTAxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwpAQCAtNTM4LDcgKzUzOCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBpU2VyaWVzX3NldHVwX2FyY2godm9pZCkKIHsKLQlpZiAoZ2V0X3BhY2EoKS0+bHBwYWNhLnNoYXJlZF9wcm9jKSB7CisJaWYgKGdldF9scHBhY2EoKS0+c2hhcmVkX3Byb2MpIHsKIAkJcHBjX21kLmlkbGVfbG9vcCA9IGlzZXJpZXNfc2hhcmVkX2lkbGU7CiAJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIHNoYXJlZCBwcm9jZXNzb3IgaWRsZSBsb29wXG4iKTsKIAl9IGVsc2UgewpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAJICogVGhlIGRlY3JlbWVudGVyIHN0b3BzIGR1cmluZyB0aGUgeWllbGQuICBGb3JjZSBhIGZha2UgZGVjcmVtZW50ZXIKIAkgKiBoZXJlIGFuZCBsZXQgdGhlIHRpbWVyX2ludGVycnVwdCBjb2RlIHNvcnQgb3V0IHRoZSBhY3R1YWwgdGltZS4KIAkgKi8KLQlnZXRfcGFjYSgpLT5scHBhY2EuaW50X2R3b3JkLmZpZWxkcy5kZWNyX2ludCA9IDE7CisJZ2V0X2xwcGFjYSgpLT5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50ID0gMTsKIAlwcm9jZXNzX2lTZXJpZXNfZXZlbnRzKCk7CiB9CiAKQEAgLTg4Myw3ICs4ODMsNyBAQAogCXBmdF9zaXplWzFdID0gX19pbG9nMihIdkNhbGxIcHRfZ2V0SHB0UGFnZXMoKSAqIEhXX1BBR0VfU0laRSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmIChwYWNhW2ldLmxwcGFjYS5keW5fcHJvY19zdGF0dXMgPj0gMikKKwkJaWYgKGxwcGFjYVtpXS5keW5fcHJvY19zdGF0dXMgPj0gMikKIAkJCWNvbnRpbnVlOwogCiAJCXNucHJpbnRmKHAsIDMyIC0gKHAgLSBidWYpLCAiQCVkIiwgaSk7CkBAIC04OTEsNyArODkxLDcgQEAKIAogCQlkdF9wcm9wX3N0cihkdCwgImRldmljZV90eXBlIiwgImNwdSIpOwogCi0JCWluZGV4ID0gcGFjYVtpXS5scHBhY2EuZHluX2h2X3BoeXNfcHJvY19pbmRleDsKKwkJaW5kZXggPSBscHBhY2FbaV0uZHluX2h2X3BoeXNfcHJvY19pbmRleDsKIAkJZCA9ICZ4SW9IcmlQcm9jZXNzb3JWcGRbaW5kZXhdOwogCiAJCWR0X3Byb3BfdTMyKGR0LCAiaS1jYWNoZS1zaXplIiwgZC0+eEluc3RDYWNoZVNpemUgKiAxMDI0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zbXAuYwppbmRleCBmY2IwOTRlLi42ZjlkNDA3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NtcC5jCkBAIC05MSw3ICs5MSw3IEBACiAJQlVHX09OKChuciA8IDApIHx8IChuciA+PSBOUl9DUFVTKSk7CiAKIAkvKiBWZXJpZnkgdGhhdCBvdXIgcGFydGl0aW9uIGhhcyBhIHByb2Nlc3NvciBuciAqLwotCWlmIChwYWNhW25yXS5scHBhY2EuZHluX3Byb2Nfc3RhdHVzID49IDIpCisJaWYgKGxwcGFjYVtucl0uZHluX3Byb2Nfc3RhdHVzID49IDIpCiAJCXJldHVybjsKIAogCS8qIFRoZSBwcm9jZXNzb3IgaXMgY3VycmVudGx5IHNwaW5uaW5nLCB3YWl0aW5nCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwppbmRleCAxZmU0NDVhLi44OTUyNTI4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKQEAgLTI1NCwxMSArMjU0LDExIEBACiB2b2lkIHZwYV9pbml0KGludCBjcHUpCiB7CiAJaW50IGh3Y3B1ID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpOwotCXVuc2lnbmVkIGxvbmcgdnBhID0gX19wYSgmcGFjYVtjcHVdLmxwcGFjYSk7CisJdW5zaWduZWQgbG9uZyB2cGEgPSBfX3BhKCZscHBhY2FbY3B1XSk7CiAJbG9uZyByZXQ7CiAKIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQUxUSVZFQykpCi0JCXBhY2FbY3B1XS5scHBhY2Eudm14cmVnc19pbl91c2UgPSAxOworCQlscHBhY2FbY3B1XS52bXhyZWdzX2luX3VzZSA9IDE7CiAKIAlyZXQgPSByZWdpc3Rlcl92cGEoaHdjcHUsIHZwYSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yZWNvbmZpZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKaW5kZXggZDg4NjQxNi4uODZjZmE2ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKQEAgLTM1MCw2ICszNTAsMTAwIEBACiAJcmV0dXJuIHJ2OwogfQogCitzdGF0aWMgY2hhciAqcGFyc2Vfbm9kZShjaGFyICpidWYsIHNpemVfdCBidWZzaXplLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKipucHApCit7CisJY2hhciAqaGFuZGxlX3N0cjsKKwlwaGFuZGxlIGhhbmRsZTsKKwkqbnBwID0gTlVMTDsKKworCWhhbmRsZV9zdHIgPSBidWY7CisKKwlidWYgPSBzdHJjaHIoYnVmLCAnICcpOworCWlmICghYnVmKQorCQlyZXR1cm4gTlVMTDsKKwkqYnVmID0gJ1wwJzsKKwlidWYrKzsKKworCWhhbmRsZSA9IHNpbXBsZV9zdHJ0b3VsKGhhbmRsZV9zdHIsIE5VTEwsIDEwKTsKKworCSpucHAgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZShoYW5kbGUpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbnQgZG9fYWRkX3Byb3BlcnR5KGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXVuc2lnbmVkIGNoYXIgKnZhbHVlOworCWNoYXIgKm5hbWUsICplbmQ7CisJaW50IGxlbmd0aDsKKwllbmQgPSBidWYgKyBidWZzaXplOworCWJ1ZiA9IHBhcnNlX25vZGUoYnVmLCBidWZzaXplLCAmbnApOworCisJaWYgKCFucCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocGFyc2VfbmV4dF9wcm9wZXJ0eShidWYsIGVuZCwgJm5hbWUsICZsZW5ndGgsICZ2YWx1ZSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcm9wID0gbmV3X3Byb3BlcnR5KG5hbWUsIGxlbmd0aCwgdmFsdWUsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcm9tX2FkZF9wcm9wZXJ0eShucCwgcHJvcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19yZW1vdmVfcHJvcGVydHkoY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWNoYXIgKnRtcDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJYnVmID0gcGFyc2Vfbm9kZShidWYsIGJ1ZnNpemUsICZucCk7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXRtcCA9IHN0cmNocihidWYsJyAnKTsKKwlpZiAodG1wKQorCQkqdG1wID0gJ1wwJzsKKworCWlmIChzdHJsZW4oYnVmKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBidWYsIE5VTEwpOworCisJcmV0dXJuIHByb21fcmVtb3ZlX3Byb3BlcnR5KG5wLCBwcm9wKTsKK30KKworc3RhdGljIGludCBkb191cGRhdGVfcHJvcGVydHkoY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXVuc2lnbmVkIGNoYXIgKnZhbHVlOworCWNoYXIgKm5hbWUsICplbmQ7CisJaW50IGxlbmd0aDsKKwlzdHJ1Y3QgcHJvcGVydHkgKm5ld3Byb3AsICpvbGRwcm9wOworCWJ1ZiA9IHBhcnNlX25vZGUoYnVmLCBidWZzaXplLCAmbnApOworCWVuZCA9IGJ1ZiArIGJ1ZnNpemU7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChwYXJzZV9uZXh0X3Byb3BlcnR5KGJ1ZiwgZW5kLCAmbmFtZSwgJmxlbmd0aCwgJnZhbHVlKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5ld3Byb3AgPSBuZXdfcHJvcGVydHkobmFtZSwgbGVuZ3RoLCB2YWx1ZSwgTlVMTCk7CisJaWYgKCFuZXdwcm9wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW9sZHByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBuYW1lLE5VTEwpOworCWlmICghb2xkcHJvcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcHJvbV91cGRhdGVfcHJvcGVydHkobnAsIG5ld3Byb3AsIG9sZHByb3ApOworfQorCiAvKioKICAqIG9mZHRfd3JpdGUgLSBwZXJmb3JtIG9wZXJhdGlvbnMgb24gdGhlIE9wZW4gRmlybXdhcmUgZGV2aWNlIHRyZWUKICAqCkBAIC0zOTIsNiArNDg2LDEyIEBACiAJCXJ2ID0gZG9fYWRkX25vZGUodG1wLCBjb3VudCAtICh0bXAgLSBrYnVmKSk7CiAJZWxzZSBpZiAoIXN0cmNtcChrYnVmLCAicmVtb3ZlX25vZGUiKSkKIAkJcnYgPSBkb19yZW1vdmVfbm9kZSh0bXApOworCWVsc2UgaWYgKCFzdHJjbXAoa2J1ZiwgImFkZF9wcm9wZXJ0eSIpKQorCQlydiA9IGRvX2FkZF9wcm9wZXJ0eSh0bXAsIGNvdW50IC0gKHRtcCAtIGtidWYpKTsKKwllbHNlIGlmICghc3RyY21wKGtidWYsICJyZW1vdmVfcHJvcGVydHkiKSkKKwkJcnYgPSBkb19yZW1vdmVfcHJvcGVydHkodG1wLCBjb3VudCAtICh0bXAgLSBrYnVmKSk7CisJZWxzZSBpZiAoIXN0cmNtcChrYnVmLCAidXBkYXRlX3Byb3BlcnR5IikpCisJCXJ2ID0gZG9fdXBkYXRlX3Byb3BlcnR5KHRtcCwgY291bnQgLSAodG1wIC0ga2J1ZikpOwogCWVsc2UKIAkJcnYgPSAtRUlOVkFMOwogb3V0OgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwppbmRleCA2OGI3ZjA4Li5kYTZjZWJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAKIAkvKiBpbnN0cnVjdCBoeXBlcnZpc29yIHRvIG1haW50YWluIFBNQ3MgKi8KIAlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9TUExQQVIpKQotCQlnZXRfcGFjYSgpLT5scHBhY2EucG1jcmVnc19pbl91c2UgPSAxOworCQlnZXRfbHBwYWNhKCktPnBtY3JlZ3NfaW5fdXNlID0gMTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHBTZXJpZXNfc2V0dXBfYXJjaCh2b2lkKQpAQCAtMjM0LDcgKzIzNCw3IEBACiAJLyogQ2hvb3NlIGFuIGlkbGUgbG9vcCAqLwogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1NQTFBBUikpIHsKIAkJdnBhX2luaXQoYm9vdF9jcHVpZCk7Ci0JCWlmIChnZXRfcGFjYSgpLT5scHBhY2Euc2hhcmVkX3Byb2MpIHsKKwkJaWYgKGdldF9scHBhY2EoKS0+c2hhcmVkX3Byb2MpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIHNoYXJlZCBwcm9jZXNzb3IgaWRsZSBsb29wXG4iKTsKIAkJCXBwY19tZC5pZGxlX2xvb3AgPSBwc2VyaWVzX3NoYXJlZF9pZGxlOwogCQl9IGVsc2UgewpAQCAtNDQ0LDEwICs0NDQsMTAgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGRlZGljYXRlZF9pZGxlX3NsZWVwKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0Jc3RydWN0IHBhY2Ffc3RydWN0ICpwcGFjYSA9ICZwYWNhW2NwdSBeIDFdOworCXN0cnVjdCBscHBhY2EgKnBscHBhY2EgPSAmbHBwYWNhW2NwdSBeIDFdOwogCiAJLyogT25seSBzbGVlcCBpZiB0aGUgb3RoZXIgdGhyZWFkIGlzIG5vdCBpZGxlICovCi0JaWYgKCEocHBhY2EtPmxwcGFjYS5pZGxlKSkgeworCWlmICghKHBscHBhY2EtPmlkbGUpKSB7CiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKIAkJLyoKQEAgLTQ4MCw3ICs0ODAsNiBAQAogCiBzdGF0aWMgdm9pZCBwc2VyaWVzX2RlZGljYXRlZF9pZGxlKHZvaWQpCiB7IAotCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2EgPSBnZXRfcGFjYSgpOwogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9zbm9vemU7CiAJdW5zaWduZWQgbG9uZyAqc210X3Nub296ZV9kZWxheSA9ICZfX2dldF9jcHVfdmFyKHNtdF9zbm9vemVfZGVsYXkpOwpAQCAtNDkxLDcgKzQ5MCw3IEBACiAJCSAqIEluZGljYXRlIHRvIHRoZSBIViB0aGF0IHdlIGFyZSBpZGxlLiBOb3cgd291bGQgYmUKIAkJICogYSBnb29kIHRpbWUgdG8gZmluZCBvdGhlciB3b3JrIHRvIGRpc3BhdGNoLgogCQkgKi8KLQkJbHBhY2EtPmxwcGFjYS5pZGxlID0gMTsKKwkJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMTsKIAogCQlpZiAoIW5lZWRfcmVzY2hlZCgpKSB7CiAJCQlzdGFydF9zbm9vemUgPSBnZXRfdGIoKSArCkBAIC01MTgsNyArNTE3LDcgQEAKIAkJCUhNVF9tZWRpdW0oKTsKIAkJfQogCi0JCWxwYWNhLT5scHBhY2EuaWRsZSA9IDA7CisJCWdldF9scHBhY2EoKS0+aWRsZSA9IDA7CiAJCXBwYzY0X3J1bmxhdGNoX29uKCk7CiAKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwpAQCAtNTMyLDcgKzUzMSw2IEBACiAKIHN0YXRpYyB2b2lkIHBzZXJpZXNfc2hhcmVkX2lkbGUodm9pZCkKIHsKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhID0gZ2V0X3BhY2EoKTsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJd2hpbGUgKDEpIHsKQEAgLTU0MCw3ICs1MzgsNyBAQAogCQkgKiBJbmRpY2F0ZSB0byB0aGUgSFYgdGhhdCB3ZSBhcmUgaWRsZS4gTm93IHdvdWxkIGJlCiAJCSAqIGEgZ29vZCB0aW1lIHRvIGZpbmQgb3RoZXIgd29yayB0byBkaXNwYXRjaC4KIAkJICovCi0JCWxwYWNhLT5scHBhY2EuaWRsZSA9IDE7CisJCWdldF9scHBhY2EoKS0+aWRsZSA9IDE7CiAKIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhY3B1X2lzX29mZmxpbmUoY3B1KSkgewogCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKQEAgLTU2NCw3ICs1NjIsNyBAQAogCQkJSE1UX21lZGl1bSgpOwogCQl9CiAKLQkJbHBhY2EtPmxwcGFjYS5pZGxlID0gMDsKKwkJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMDsKIAkJcHBjNjRfcnVubGF0Y2hfb24oKTsKIAogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CkBAIC01ODgsNyArNTg2LDcgQEAKIHsKIAkvKiBEb24ndCByaXNrIGEgaHlwZXJ2aXNvciBjYWxsIGlmIHdlJ3JlIGNyYXNoaW5nICovCiAJaWYgKCFjcmFzaF9zaHV0ZG93bikgewotCQl1bnNpZ25lZCBsb25nIHZwYSA9IF9fcGEoJmdldF9wYWNhKCktPmxwcGFjYSk7CisJCXVuc2lnbmVkIGxvbmcgdnBhID0gX19wYShnZXRfbHBwYWNhKCkpOwogCiAJCWlmICh1bnJlZ2lzdGVyX3ZwYShoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSwgdnBhKSkgewogCQkJcHJpbnRrKCJWUEEgZGVyZWdpc3RyYXRpb24gb2YgY3B1ICV1IChod19jcHVfaWQgJWQpICIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCmluZGV4IDBhZTg0MTMuLjRjMmIzNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQpAQCAtNywzICs3LDQgQEAKIG9iai0kKENPTkZJR19VM19EQVJUKQkJKz0gZGFydF9pb21tdS5vCiBvYmotJChDT05GSUdfTU1JT19OVlJBTSkJKz0gbW1pb19udnJhbS5vCiBvYmotJChDT05GSUdfUFBDXzgzeHgpCQkrPSBpcGljLm8KK29iai0kKENPTkZJR19GU0xfU09DKQkJKz0gZnNsX3NvYy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NGM5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIEZTTCBTb0Mgc2V0dXAgY29kZQorICoKKyAqIE1haW50YWluZWQgYnkgS3VtYXIgR2FsYSAoc2VlIE1BSU5UQUlORVJTIGZvciBjb250YWN0IGluZm9ybWF0aW9uKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+CisKK3N0YXRpYyBwaHlzX2FkZHJfdCBpbW1yYmFzZSA9IC0xOworCitwaHlzX2FkZHJfdCBnZXRfaW1tcmJhc2Uodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnNvYzsKKworCWlmIChpbW1yYmFzZSAhPSAtMSkKKwkJcmV0dXJuIGltbXJiYXNlOworCisJc29jID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInNvYyIpOworCWlmIChzb2MgIT0gMCkgeworCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwkJdm9pZCAqcHJvcCA9IGdldF9wcm9wZXJ0eShzb2MsICJyZWciLCAmc2l6ZSk7CisJCWltbXJiYXNlID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3Moc29jLCBwcm9wKTsKKwkJb2Zfbm9kZV9wdXQoc29jKTsKKwl9OworCisJcmV0dXJuIGltbXJiYXNlOworfQorRVhQT1JUX1NZTUJPTChnZXRfaW1tcmJhc2UpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGdmYXJfdHhfaW50ciA9ICJ0eCI7CitzdGF0aWMgY29uc3QgY2hhciAqIGdmYXJfcnhfaW50ciA9ICJyeCI7CitzdGF0aWMgY29uc3QgY2hhciAqIGdmYXJfZXJyX2ludHIgPSAiZXJyb3IiOworCitzdGF0aWMgaW50IF9faW5pdCBnZmFyX29mX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm1kaW9fZGV2LCAqZ2Zhcl9kZXY7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgcmV0OworCisJZm9yIChucCA9IE5VTEwsIGkgPSAwOyAobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwgIm1kaW8iLCAiZ2lhbmZhciIpKSAhPSBOVUxMOyBpKyspIHsKKwkJaW50IGs7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQgPSBOVUxMOworCQlzdHJ1Y3QgZ2lhbmZhcl9tZGlvX2RhdGEgbWRpb19kYXRhOworCisJCW1lbXNldCgmcmVzLCAwLCBzaXplb2YocmVzKSk7CisJCW1lbXNldCgmbWRpb19kYXRhLCAwLCBzaXplb2YobWRpb19kYXRhKSk7CisKKwkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG1kaW9fZXJyOworCisJCW1kaW9fZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiZnNsLWdpYW5mYXJfbWRpbyIsIHJlcy5zdGFydCwgJnJlcywgMSk7CisJCWlmIChJU19FUlIobWRpb19kZXYpKSB7CisJCQlyZXQgPSBQVFJfRVJSKG1kaW9fZGV2KTsKKwkJCWdvdG8gbWRpb19lcnI7CisJCX0KKworCQlmb3IgKGsgPSAwOyBrIDwgMzI7IGsrKykKKwkJCW1kaW9fZGF0YS5pcnFba10gPSAtMTsKKworCQl3aGlsZSAoKGNoaWxkID0gb2ZfZ2V0X25leHRfY2hpbGQobnAsIGNoaWxkKSkgIT0gTlVMTCkgeworCQkJaWYgKGNoaWxkLT5uX2ludHJzKSB7CisJCQkJdTMyICppZCA9ICh1MzIgKikgZ2V0X3Byb3BlcnR5KGNoaWxkLCAicmVnIiwgTlVMTCk7CisJCQkJbWRpb19kYXRhLmlycVsqaWRdID0gY2hpbGQtPmludHJzWzBdLmxpbmU7CisJCQl9CisJCX0KKworCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEobWRpb19kZXYsICZtZGlvX2RhdGEsIHNpemVvZihzdHJ1Y3QgZ2lhbmZhcl9tZGlvX2RhdGEpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gbWRpb191bnJlZzsKKwl9CisKKwlmb3IgKG5wID0gTlVMTCwgaSA9IDA7IChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAibmV0d29yayIsICJnaWFuZmFyIikpICE9IE5VTEw7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2Ugcls0XTsKKwkJc3RydWN0IGRldmljZV9ub2RlICpwaHksICptZGlvOworCQlzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhIGdmYXJfZGF0YTsKKwkJdW5zaWduZWQgaW50ICppZDsKKwkJY2hhciAqbW9kZWw7CisJCXZvaWQgKm1hY19hZGRyOworCQlwaGFuZGxlICpwaDsKKworCQltZW1zZXQociwgMCwgc2l6ZW9mKHIpKTsKKwkJbWVtc2V0KCZnZmFyX2RhdGEsIDAsIHNpemVvZihnZmFyX2RhdGEpKTsKKworCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmclswXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGdmYXJfZXJyOworCisJCXJbMV0uc3RhcnQgPSBucC0+aW50cnNbMF0ubGluZTsKKwkJclsxXS5lbmQgPSBucC0+aW50cnNbMF0ubGluZTsKKwkJclsxXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCisJCW1vZGVsID0gZ2V0X3Byb3BlcnR5KG5wLCAibW9kZWwiLCBOVUxMKTsKKworCQkvKiBJZiB3ZSBhcmVuJ3QgdGhlIEZFQyB3ZSBoYXZlIG11bHRpcGxlIGludGVycnVwdHMgKi8KKwkJaWYgKG1vZGVsICYmIHN0cmNhc2VjbXAobW9kZWwsICJGRUMiKSkgeworCQkJclsxXS5uYW1lID0gZ2Zhcl90eF9pbnRyOworCisJCQlyWzJdLm5hbWUgPSBnZmFyX3J4X2ludHI7CisJCQlyWzJdLnN0YXJ0ID0gbnAtPmludHJzWzFdLmxpbmU7CisJCQlyWzJdLmVuZCA9IG5wLT5pbnRyc1sxXS5saW5lOworCQkJclsyXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCisJCQlyWzNdLm5hbWUgPSBnZmFyX2Vycl9pbnRyOworCQkJclszXS5zdGFydCA9IG5wLT5pbnRyc1syXS5saW5lOworCQkJclszXS5lbmQgPSBucC0+aW50cnNbMl0ubGluZTsKKwkJCXJbM10uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKwkJfQorCisJCWdmYXJfZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiZnNsLWdpYW5mYXIiLCBpLCAmclswXSwgbnAtPm5faW50cnMgKyAxKTsKKworCQlpZiAoSVNfRVJSKGdmYXJfZGV2KSkgeworCQkJcmV0ID0gUFRSX0VSUihnZmFyX2Rldik7CisJCQlnb3RvIGdmYXJfZXJyOworCQl9CisKKwkJbWFjX2FkZHIgPSBnZXRfcHJvcGVydHkobnAsICJhZGRyZXNzIiwgTlVMTCk7CisJCW1lbWNweShnZmFyX2RhdGEubWFjX2FkZHIsIG1hY19hZGRyLCA2KTsKKworCQlpZiAobW9kZWwgJiYgIXN0cmNhc2VjbXAobW9kZWwsICJUU0VDIikpCisJCQlnZmFyX2RhdGEuZGV2aWNlX2ZsYWdzID0KKwkJCQlGU0xfR0lBTkZBUl9ERVZfSEFTX0dJR0FCSVQgfAorCQkJCUZTTF9HSUFORkFSX0RFVl9IQVNfQ09BTEVTQ0UgfAorCQkJCUZTTF9HSUFORkFSX0RFVl9IQVNfUk1PTiB8CisJCQkJRlNMX0dJQU5GQVJfREVWX0hBU19NVUxUSV9JTlRSOworCQlpZiAobW9kZWwgJiYgIXN0cmNhc2VjbXAobW9kZWwsICJlVFNFQyIpKQorCQkJZ2Zhcl9kYXRhLmRldmljZV9mbGFncyA9CisJCQkJRlNMX0dJQU5GQVJfREVWX0hBU19HSUdBQklUIHwKKwkJCQlGU0xfR0lBTkZBUl9ERVZfSEFTX0NPQUxFU0NFIHwKKwkJCQlGU0xfR0lBTkZBUl9ERVZfSEFTX1JNT04gfAorCQkJCUZTTF9HSUFORkFSX0RFVl9IQVNfTVVMVElfSU5UUiB8CisJCQkJRlNMX0dJQU5GQVJfREVWX0hBU19DU1VNIHwKKwkJCQlGU0xfR0lBTkZBUl9ERVZfSEFTX1ZMQU4gfAorCQkJCUZTTF9HSUFORkFSX0RFVl9IQVNfRVhURU5ERURfSEFTSDsKKworCQlwaCA9IChwaGFuZGxlICopIGdldF9wcm9wZXJ0eShucCwgInBoeS1oYW5kbGUiLCBOVUxMKTsKKwkJcGh5ID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoKnBoKTsKKworCQlpZiAocGh5ID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGdmYXJfdW5yZWc7CisJCX0KKworCQltZGlvID0gb2ZfZ2V0X3BhcmVudChwaHkpOworCisJCWlkID0gKHUzMiAqKSBnZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7CisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobWRpbywgMCwgJnJlcyk7CisJCWlmIChyZXQpIHsKKwkJCW9mX25vZGVfcHV0KHBoeSk7CisJCQlvZl9ub2RlX3B1dChtZGlvKTsKKwkJCWdvdG8gZ2Zhcl91bnJlZzsKKwkJfQorCisJCWdmYXJfZGF0YS5waHlfaWQgPSAqaWQ7CisJCWdmYXJfZGF0YS5idXNfaWQgPSByZXMuc3RhcnQ7CisKKwkJb2Zfbm9kZV9wdXQocGh5KTsKKwkJb2Zfbm9kZV9wdXQobWRpbyk7CisKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGdmYXJfZGV2LCAmZ2Zhcl9kYXRhLCBzaXplb2Yoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSkpOworCQlpZiAocmV0KQorCQkJZ290byBnZmFyX3VucmVnOworCX0KKworCXJldHVybiAwOworCittZGlvX3VucmVnOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG1kaW9fZGV2KTsKK21kaW9fZXJyOgorCXJldHVybiByZXQ7CisKK2dmYXJfdW5yZWc6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZ2Zhcl9kZXYpOworZ2Zhcl9lcnI6CisJcmV0dXJuIHJldDsKK30KK2FyY2hfaW5pdGNhbGwoZ2Zhcl9vZl9pbml0KTsKKworc3RhdGljIGludCBfX2luaXQgZnNsX2kyY19vZl9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppMmNfZGV2OworCWludCByZXQ7CisKKwlmb3IgKG5wID0gTlVMTCwgaSA9IDA7IChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAiaTJjIiwgImZzbC1pMmMiKSkgIT0gTlVMTDsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSByWzJdOworCQlzdHJ1Y3QgZnNsX2kyY19wbGF0Zm9ybV9kYXRhIGkyY19kYXRhOworCQl1bnNpZ25lZCBjaGFyICogZmxhZ3MgPSBOVUxMOworCisJCW1lbXNldCgmciwgMCwgc2l6ZW9mKHIpKTsKKwkJbWVtc2V0KCZpMmNfZGF0YSwgMCwgc2l6ZW9mKGkyY19kYXRhKSk7CisKKwkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJbMF0pOworCQlpZiAocmV0KQorCQkJZ290byBpMmNfZXJyOworCisJCXJbMV0uc3RhcnQgPSBucC0+aW50cnNbMF0ubGluZTsKKwkJclsxXS5lbmQgPSBucC0+aW50cnNbMF0ubGluZTsKKwkJclsxXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCisJCWkyY19kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJmc2wtaTJjIiwgaSwgciwgMik7CisJCWlmIChJU19FUlIoaTJjX2RldikpIHsKKwkJCXJldCA9IFBUUl9FUlIoaTJjX2Rldik7CisJCQlnb3RvIGkyY19lcnI7CisJCX0KKworCQlpMmNfZGF0YS5kZXZpY2VfZmxhZ3MgPSAwOworCQlmbGFncyA9IGdldF9wcm9wZXJ0eShucCwgImRmc3JyIiwgTlVMTCk7CisJCWlmIChmbGFncykKKwkJCWkyY19kYXRhLmRldmljZV9mbGFncyB8PSBGU0xfSTJDX0RFVl9TRVBBUkFURV9ERlNSUjsKKworCQlmbGFncyA9IGdldF9wcm9wZXJ0eShucCwgImZzbDUyMDAtY2xvY2tpbmciLCBOVUxMKTsKKwkJaWYgKGZsYWdzKQorCQkJaTJjX2RhdGEuZGV2aWNlX2ZsYWdzIHw9IEZTTF9JMkNfREVWX0NMT0NLXzUyMDA7CisKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGkyY19kZXYsICZpMmNfZGF0YSwgc2l6ZW9mKHN0cnVjdCBmc2xfaTJjX3BsYXRmb3JtX2RhdGEpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gaTJjX3VucmVnOworCX0KKworCXJldHVybiAwOworCitpMmNfdW5yZWc6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoaTJjX2Rldik7CitpMmNfZXJyOgorCXJldHVybiByZXQ7Cit9CithcmNoX2luaXRjYWxsKGZzbF9pMmNfb2ZfaW5pdCk7CisKKyNpZmRlZiBDT05GSUdfUFBDXzgzeHgKK3N0YXRpYyBpbnQgX19pbml0IG1wYzgzeHhfd2R0X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnNvYywgKm5wOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBpbnQgKmZyZXE7CisJaW50IHJldDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgIndhdGNoZG9nIiwgIm1wYzgzeHhfd2R0Iik7CisKKwlpZiAoIW5wKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gbXBjODN4eF93ZHRfbm9kZXY7CisJfQorCisJc29jID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInNvYyIpOworCisJaWYgKCFzb2MpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBtcGM4M3h4X3dkdF9ub3NvYzsKKwl9CisKKwlmcmVxID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShzb2MsICJidXMtZnJlcXVlbmN5IiwgTlVMTCk7CisJaWYgKCFmcmVxKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gbXBjODN4eF93ZHRfZXJyOworCX0KKworCW1lbXNldCgmciwgMCwgc2l6ZW9mKHIpKTsKKworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKTsKKwlpZiAocmV0KQorCQlnb3RvIG1wYzgzeHhfd2R0X2VycjsKKworCWRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoIm1wYzgzeHhfd2R0IiwgMCwgJnIsIDEpOworCWlmIChJU19FUlIoZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKGRldik7CisJCWdvdG8gbXBjODN4eF93ZHRfZXJyOworCX0KKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShkZXYsIGZyZXEsIHNpemVvZihpbnQpKTsKKwlpZiAocmV0KQorCQlnb3RvIG1wYzgzeHhfd2R0X3VucmVnOworCisJb2Zfbm9kZV9wdXQoc29jKTsKKwlvZl9ub2RlX3B1dChucCk7CisKKwlyZXR1cm4gMDsKKworbXBjODN4eF93ZHRfdW5yZWc6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKK21wYzgzeHhfd2R0X2VycjoKKwlvZl9ub2RlX3B1dChzb2MpOworbXBjODN4eF93ZHRfbm9zb2M6CisJb2Zfbm9kZV9wdXQobnApOworbXBjODN4eF93ZHRfbm9kZXY6CisJcmV0dXJuIHJldDsKK30KK2FyY2hfaW5pdGNhbGwobXBjODN4eF93ZHRfaW5pdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzM2QzZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfX1BQQ19GU0xfU09DX0gKKyNkZWZpbmUgX19QUENfRlNMX1NPQ19ICisjaWZkZWYgX19LRVJORUxfXworCitleHRlcm4gcGh5c19hZGRyX3QgZ2V0X2ltbXJiYXNlKHZvaWQpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvNHh4X2lvL3NlcmlhbF9zaWNjLmMgYi9hcmNoL3BwYy80eHhfaW8vc2VyaWFsX3NpY2MuYwppbmRleCBlYmM0ZGI4Li44YWNlMmExIDEwMDY0NAotLS0gYS9hcmNoL3BwYy80eHhfaW8vc2VyaWFsX3NpY2MuYworKysgYi9hcmNoL3BwYy80eHhfaW8vc2VyaWFsX3NpY2MuYwpAQCAtMjE1LDcgKzIxNSw2IEBACiAgKiBtZW1vcnkgaWYgbGFyZ2UgbnVtYmVycyBvZiBzZXJpYWwgcG9ydHMgYXJlIG9wZW4uCiAgKi8KIHN0YXRpYyB1X2NoYXIgKnRtcF9idWY7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CiAKICNkZWZpbmUgSElHSF9CSVRTX09GRlNFVCAgICAoKHNpemVvZihsb25nKS1zaXplb2YoaW50KSkqOCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2hlYWRfOHh4LlMgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUwppbmRleCBkZTA5Nzg3Li4zZTZjYTdmIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUworKysgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUwpAQCAtMzc1LDYgKzM3NSw4IEBACiAJbGlzCXIxMSwgc3dhcHBlcl9wZ19kaXJAaAogCW9yaQlyMTEsIHIxMSwgc3dhcHBlcl9wZ19kaXJAbAogCXJsd2ltaQlyMTAsIHIxMSwgMCwgMiwgMTkKKwlzdHcJcjEyLCAxNihyMCkKKwliIExvYWRMYXJnZURUTEIKIDM6CiAJbHd6CXIxMSwgMChyMTApCS8qIEdldCB0aGUgbGV2ZWwgMSBlbnRyeSAqLwogCXJsd2lubS4JcjEwLCByMTEsMCwwLDE5CS8qIEV4dHJhY3QgcGFnZSBkZXNjcmlwdG9yIHBhZ2UgYWRkcmVzcyAqLwpAQCAtNDMwLDYgKzQzMiw4MSBAQAogSW5zdHJ1Y3Rpb25UTEJFcnJvcjoKIAliCUluc3RydWN0aW9uQWNjZXNzCiAKK0xvYWRMYXJnZURUTEI6CisJbGkJcjEyLCAwCisJbHd6CXIxMSwgMChyMTApCS8qIEdldCB0aGUgbGV2ZWwgMSBlbnRyeSAqLworCXJsd2lubS4JcjEwLCByMTEsMCwwLDE5CS8qIEV4dHJhY3QgcGFnZSBkZXNjcmlwdG9yIHBhZ2UgYWRkcmVzcyAqLworCWJlcQkzZgkJLyogSWYgemVybywgZG9uJ3QgdHJ5IHRvIGZpbmQgYSBwdGUgKi8KKworCS8qIFdlIGhhdmUgYSBwdGUgdGFibGUsIHNvIGxvYWQgZmV0Y2ggdGhlIHB0ZSBmcm9tIHRoZSB0YWJsZS4KKwkgKi8KKwlvcmkJcjExLCByMTEsIDEJLyogU2V0IHZhbGlkIGJpdCBpbiBwaHlzaWNhbCBMMiBwYWdlICovCisJRE9fOHh4X0NQVTYoMHgzYjgwLCByMykKKwltdHNwcglTUFJOX01EX1RXQywgcjExCS8qIExvYWQgcHRlIHRhYmxlIGJhc2UgYWRkcmVzcyAqLworCW1mc3ByCXIxMCwgU1BSTl9NRF9UV0MJLyogLi4uLmFuZCBnZXQgdGhlIHB0ZSBhZGRyZXNzICovCisJbHd6CXIxMCwgMChyMTApCS8qIEdldCB0aGUgcHRlICovCisKKwkvKiBJbnNlcnQgdGhlIEd1YXJkZWQgZmxhZyBpbnRvIHRoZSBUV0MgZnJvbSB0aGUgTGludXggUFRFLgorCSAqIEl0IGlzIGJpdCAyNyBvZiBib3RoIHRoZSBMaW51eCBQVEUgYW5kIHRoZSBUV0MgKGF0IGxlYXN0CisJICogSSBnb3QgdGhhdCByaWdodCA6LSkuICBJdCB3aWxsIGJlIGJldHRlciB3aGVuIHdlIGNhbiBwdXQKKwkgKiB0aGlzIGludG8gdGhlIExpbnV4IHBnZC9wbWQgYW5kIGxvYWQgaXQgaW4gdGhlIG9wZXJhdGlvbgorCSAqIGFib3ZlLgorCSAqLworCXJsd2ltaQlyMTEsIHIxMCwgMCwgMjcsIDI3CisKKwlybHdpbWkgIHIxMiwgcjEwLCAwLCAwLCA5CS8qIGV4dHJhY3QgcGh5cy4gYWRkciAqLworCW1mc3ByCXIzLCBTUFJOX01EX0VQTgorCXJsd2lubQlyMywgcjMsIDAsIDAsIDkJCS8qIGV4dHJhY3QgdmlydHVhbCBhZGRyZXNzICovCisJdG9waHlzKHIzLCByMykKKwljbXB3CXIzLCByMTIJCQkvKiBvbmx5IHVzZSA4TSBwYWdlIGlmIGl0IGlzIGEgZGlyZWN0IAorCQkJCQkgICBrZXJuZWwgbWFwcGluZyAqLworCWJuZQkxZgorCW9yaSAgICAgcjExLCByMTEsIE1EX1BTOE1FRworCWxpCXIxMiwgMQorCWIJMmYKKzE6CisJbGkJcjEyLCAwCQkvKiBjYW4ndCB1c2UgOE1CIFRMQiwgc28gemVybyByMTIuICovCisyOgorCURPXzh4eF9DUFU2KDB4M2I4MCwgcjMpCisJbXRzcHIJU1BSTl9NRF9UV0MsIHIxMQorCisJLyogVGhlIExpbnV4IFBURSB3b24ndCBnbyBleGFjdGx5IGludG8gdGhlIE1NVSBUTEIuCisJICogU29mdHdhcmUgaW5kaWNhdG9yIGJpdHMgMjEsIDIyIGFuZCAyOCBtdXN0IGJlIGNsZWFyLgorCSAqIFNvZnR3YXJlIGluZGljYXRvciBiaXRzIDI0LCAyNSwgMjYsIGFuZCAyNyBtdXN0IGJlCisJICogc2V0LiAgQWxsIG90aGVyIExpbnV4IFBURSBiaXRzIGNvbnRyb2wgdGhlIGJlaGF2aW9yCisJICogb2YgdGhlIE1NVS4KKwkgKi8KKzM6CWxpCXIxMSwgMHgwMGYwCisJcmx3aW1pCXIxMCwgcjExLCAwLCAyNCwgMjgJLyogU2V0IDI0LTI3LCBjbGVhciAyOCAqLworCWNtcHdpICAgcjEyLCAxCisJYm5lIDRmCisJb3JpICAgICByMTAsIHIxMCwgMHg4CisKKwltZnNwcglyMTIsIFNQUk5fTURfRVBOCisJbGlzCXIzLCAweGZmODAJCS8qIDEwLTE5IG11c3QgYmUgY2xlYXIgZm9yIDhNQiBUTEIgKi8KKwlvcmkJcjMsIHIzLCAweDBmZmYKKwlhbmQJcjEyLCByMywgcjEyCisJRE9fOHh4X0NQVTYoMHgzNzgwLCByMykKKwltdHNwcglTUFJOX01EX0VQTiwgcjEyCisKKwlsaXMJcjMsIDB4ZmY4MAkJLyogMTAtMTkgbXVzdCBiZSBjbGVhciBmb3IgOE1CIFRMQiAqLworCW9yaQlyMywgcjMsIDB4MGZmZgorCWFuZAlyMTAsIHIzLCByMTAKKzQ6CisJRE9fOHh4X0NQVTYoMHgzZDgwLCByMykKKwltdHNwcglTUFJOX01EX1JQTiwgcjEwCS8qIFVwZGF0ZSBUTEIgZW50cnkgKi8KKworCW1mc3ByCXIxMCwgU1BSTl9NX1RXCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCisJbHd6CXIxMSwgMChyMCkKKwltdGNyCXIxMQorCWx3eglyMTEsIDQocjApCisKKwlsd3oJcjEyLCAxNihyMCkKKyNpZmRlZiBDT05GSUdfOHh4X0NQVTYKKwlsd3oJcjMsIDgocjApCisjZW5kaWYKKwlyZmkKKwogLyogVGhpcyBpcyB0aGUgZGF0YSBUTEIgZXJyb3Igb24gdGhlIE1QQzh4eC4gIFRoaXMgY291bGQgYmUgZHVlIHRvCiAgKiBtYW55IHJlYXNvbnMsIGluY2x1ZGluZyBhIGRpcnR5IHVwZGF0ZSB0byBhIHB0ZS4gIFdlIGNhbiBjYXRjaCB0aGF0CiAgKiBvbmUgaGVyZSwgYnV0IGFueXRoaW5nIGVsc2UgaXMgYW4gZXJyb3IuICBGaXJzdCwgd2UgdHJhY2sgZG93biB0aGUKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYyBiL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCA5NTA3NWY5Li5mYjBkYTdjIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3BwY19rc3ltcy5jCkBAIC0yNzAsNyArMjcwLDYgQEAKIEVYUE9SVF9TWU1CT0wodGltZXJfaW50ZXJydXB0KTsKIEVYUE9SVF9TWU1CT0woaXJxX2Rlc2MpOwogRVhQT1JUX1NZTUJPTCh0Yl90aWNrc19wZXJfamlmZnkpOwotRVhQT1JUX1NZTUJPTChnZXRfd2NoYW4pOwogRVhQT1JUX1NZTUJPTChjb25zb2xlX2RyaXZlcnMpOwogI2lmZGVmIENPTkZJR19YTU9OCiBFWFBPUlRfU1lNQk9MKHhtb24pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmMKaW5kZXggMDRiZGMzOS4uMDEyZTFlNiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCkBAIC01MSw5ICs1MSw2IEBACiAKICNpbmNsdWRlIDxzeXNsaWIvcHBjODN4eF9zZXR1cC5oPgogCi1zdGF0aWMgY29uc3QgY2hhciAqR0ZBUl9QSFlfMCA9ICJwaHkwOjAiOwotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzEgPSAicGh5MDoxIjsKLQogI2lmbmRlZiBDT05GSUdfUENJCiB1bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKIHVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKQEAgLTEyOSwyMCArMTI2LDIxIEBACiAJbWRhdGEtPmlycVsxXSA9IE1QQzgzeHhfSVJRX0VYVDI7CiAJbWRhdGEtPmlycVsyXSA9IC0xOwogCW1kYXRhLT5pcnFbMzFdID0gLTE7Ci0JbWRhdGEtPnBhZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzgzeHhfVFNFQzEpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+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+YmlfZW5ldDJhZGRyLCA2KTsKIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9tcGM4M3h4X2RldmljZXMuYyBiL2FyY2gvcHBjL3N5c2xpYi9tcGM4M3h4X2RldmljZXMuYwppbmRleCA4NDdkZjQ0Li5mOWI5NWRlIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvbXBjODN4eF9kZXZpY2VzLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL21wYzgzeHhfZGV2aWNlcy5jCkBAIC0yOCw3ICsyOCw2IEBACiAgKi8KIAogc3RydWN0IGdpYW5mYXJfbWRpb19kYXRhIG1wYzgzeHhfbWRpb19wZGF0YSA9IHsKLQkucGFkZHIgPSAweDI0NTIwLAogfTsKIAogc3RhdGljIHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgbXBjODN4eF90c2VjMV9wZGF0YSA9IHsKQEAgLTIyNiw3ICsyMjUsMTQgQEAKIAkJLm5hbWUgPSAiZnNsLWdpYW5mYXJfbWRpbyIsCiAJCS5pZCA9IDAsCiAJCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZtcGM4M3h4X21kaW9fcGRhdGEsCi0JCS5udW1fcmVzb3VyY2VzID0gMCwKKwkJLm51bV9yZXNvdXJjZXMgPSAxLAorCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkuc3RhcnQJPSAweDI0NTIwLAorCQkJCS5lbmQJPSAweDI0NTNmLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJfSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL21wYzg1eHhfZGV2aWNlcy5jIGIvYXJjaC9wcGMvc3lzbGliL21wYzg1eHhfZGV2aWNlcy5jCmluZGV4IDY5OTQ5ZDIuLjAwZTliNmZmIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvbXBjODV4eF9kZXZpY2VzLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL21wYzg1eHhfZGV2aWNlcy5jCkBAIC0yNiw3ICsyNiw2IEBACiAgKiB3aGF0IENDU1JCQVIgaXMsIHdpbGwgZ2V0IGZpeGVkIHVwIGJ5IG1hY2hfbXBjODV4eF9maXh1cAogICovCiBzdHJ1Y3QgZ2lhbmZhcl9tZGlvX2RhdGEgbXBjODV4eF9tZGlvX3BkYXRhID0gewotCS5wYWRkciA9IE1QQzg1eHhfTUlJTV9PRkZTRVQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSBtcGM4NXh4X3RzZWMxX3BkYXRhID0gewpAQCAtNzIwLDcgKzcxOSwxNCBAQAogCQkubmFtZSA9ICJmc2wtZ2lhbmZhcl9tZGlvIiwKIAkJLmlkID0gMCwKIAkJLmRldi5wbGF0Zm9ybV9kYXRhID0gJm1wYzg1eHhfbWRpb19wZGF0YSwKLQkJLm51bV9yZXNvdXJjZXMgPSAwLAorCQkubnVtX3Jlc291cmNlcyA9IDEsCisJCS5yZXNvdXJjZSA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeworCQkJeworCQkJCS5zdGFydAk9IDB4MjQ1MjAsCisJCQkJLmVuZAk9IDB4MjQ1M2YsCisJCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJCQl9LAorCQl9LAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvb2NwLmMgYi9hcmNoL3BwYy9zeXNsaWIvb2NwLmMKaW5kZXggOWNjY2U0My4uYWIzNGIxZCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL29jcC5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9vY3AuYwpAQCAtMTg5LDYgKzE4OSw4IEBACiBzdHJ1Y3QgYnVzX3R5cGUgb2NwX2J1c190eXBlID0gewogCS5uYW1lID0gIm9jcCIsCiAJLm1hdGNoID0gb2NwX2RldmljZV9tYXRjaCwKKwkucHJvYmUgPSBvY3BfZHJpdmVyX3Byb2JlLAorCS5yZW1vdmUgPSBvY3BfZHJpdmVyX3JlbW92ZSwKIAkuc3VzcGVuZCA9IG9jcF9kZXZpY2Vfc3VzcGVuZCwKIAkucmVzdW1lID0gb2NwX2RldmljZV9yZXN1bWUsCiB9OwpAQCAtMjEwLDggKzIxMiw2IEBACiAJLyogaW5pdGlhbGl6ZSBjb21tb24gZHJpdmVyIGZpZWxkcyAqLwogCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7CiAJZHJ2LT5kcml2ZXIuYnVzID0gJm9jcF9idXNfdHlwZTsKLQlkcnYtPmRyaXZlci5wcm9iZSA9IG9jcF9kZXZpY2VfcHJvYmU7Ci0JZHJ2LT5kcml2ZXIucmVtb3ZlID0gb2NwX2RldmljZV9yZW1vdmU7CiAKIAkvKiByZWdpc3RlciB3aXRoIGNvcmUgKi8KIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL2Flc19zMzkwLmMgYi9hcmNoL3MzOTAvY3J5cHRvL2Flc19zMzkwLmMKaW5kZXggN2ExMDMzZC4uYzVjYTJkYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9hZXNfczM5MC5jCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vYWVzX3MzOTAuYwpAQCAtMTE0LDgwICsxMTQsMTA4IEBACiAJCQkJICAgIGNvbnN0IHU4ICppbiwgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKIAlzdHJ1Y3QgczM5MF9hZXNfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKTsKKwlpbnQgcmV0OworCisJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCisJbmJ5dGVzICY9IH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKIAogCXN3aXRjaCAoc2N0eC0+a2V5X2xlbikgewogCWNhc2UgMTY6Ci0JCWNyeXB0X3MzOTBfa20oS01fQUVTXzEyOF9FTkNSWVBULCAmc2N0eC0+a2V5LCBvdXQsIGluLCBuYnl0ZXMpOworCQlyZXQgPSBjcnlwdF9zMzkwX2ttKEtNX0FFU18xMjhfRU5DUllQVCwgJnNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOwogCQlicmVhazsKIAljYXNlIDI0OgotCQljcnlwdF9zMzkwX2ttKEtNX0FFU18xOTJfRU5DUllQVCwgJnNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJcmV0ID0gY3J5cHRfczM5MF9rbShLTV9BRVNfMTkyX0VOQ1JZUFQsICZzY3R4LT5rZXksIG91dCwgaW4sIG5ieXRlcyk7CisJCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKIAkJYnJlYWs7CiAJY2FzZSAzMjoKLQkJY3J5cHRfczM5MF9rbShLTV9BRVNfMjU2X0VOQ1JZUFQsICZzY3R4LT5rZXksIG91dCwgaW4sIG5ieXRlcyk7CisJCXJldCA9IGNyeXB0X3MzOTBfa20oS01fQUVTXzI1Nl9FTkNSWVBULCAmc2N0eC0+a2V5LCBvdXQsIGluLCBuYnl0ZXMpOworCQlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOworCXJldHVybiBuYnl0ZXM7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWVzX2RlY3J5cHRfZWNiKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKm91dCwKIAkJCQkgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pOworCWludCByZXQ7CisKKwkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KKwluYnl0ZXMgJj0gfihBRVNfQkxPQ0tfU0laRSAtIDEpOwogCiAJc3dpdGNoIChzY3R4LT5rZXlfbGVuKSB7CiAJY2FzZSAxNjoKLQkJY3J5cHRfczM5MF9rbShLTV9BRVNfMTI4X0RFQ1JZUFQsICZzY3R4LT5rZXksIG91dCwgaW4sIG5ieXRlcyk7CisJCXJldCA9IGNyeXB0X3MzOTBfa20oS01fQUVTXzEyOF9ERUNSWVBULCAmc2N0eC0+a2V5LCBvdXQsIGluLCBuYnl0ZXMpOworCQlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CiAJCWJyZWFrOwogCWNhc2UgMjQ6Ci0JCWNyeXB0X3MzOTBfa20oS01fQUVTXzE5Ml9ERUNSWVBULCAmc2N0eC0+a2V5LCBvdXQsIGluLCBuYnl0ZXMpOworCQlyZXQgPSBjcnlwdF9zMzkwX2ttKEtNX0FFU18xOTJfREVDUllQVCwgJnNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOwogCQlicmVhazsKIAljYXNlIDMyOgotCQljcnlwdF9zMzkwX2ttKEtNX0FFU18yNTZfREVDUllQVCwgJnNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJcmV0ID0gY3J5cHRfczM5MF9rbShLTV9BRVNfMjU2X0RFQ1JZUFQsICZzY3R4LT5rZXksIG91dCwgaW4sIG5ieXRlcyk7CisJCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKIAkJYnJlYWs7CiAJfQotCXJldHVybiBuYnl0ZXMgJiB+KEFFU19CTE9DS19TSVpFIC0gMSk7CisJcmV0dXJuIG5ieXRlczsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBhZXNfZW5jcnlwdF9jYmMoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqb3V0LAogCQkJCSAgICBjb25zdCB1OCAqaW4sIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSk7CisJaW50IHJldDsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCW5ieXRlcyAmPSB+KEFFU19CTE9DS19TSVpFIC0gMSk7CiAKIAltZW1jcHkoJnNjdHgtPml2LCBkZXNjLT5pbmZvLCBBRVNfQkxPQ0tfU0laRSk7CiAJc3dpdGNoIChzY3R4LT5rZXlfbGVuKSB7CiAJY2FzZSAxNjoKLQkJY3J5cHRfczM5MF9rbWMoS01DX0FFU18xMjhfRU5DUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCQlyZXQgPSBjcnlwdF9zMzkwX2ttYyhLTUNfQUVTXzEyOF9FTkNSWVBULCAmc2N0eC0+aXYsIG91dCwgaW4sIG5ieXRlcyk7CisJCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKIAkJYnJlYWs7CiAJY2FzZSAyNDoKLQkJY3J5cHRfczM5MF9rbWMoS01DX0FFU18xOTJfRU5DUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCQlyZXQgPSBjcnlwdF9zMzkwX2ttYyhLTUNfQUVTXzE5Ml9FTkNSWVBULCAmc2N0eC0+aXYsIG91dCwgaW4sIG5ieXRlcyk7CisJCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKIAkJYnJlYWs7CiAJY2FzZSAzMjoKLQkJY3J5cHRfczM5MF9rbWMoS01DX0FFU18yNTZfRU5DUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCQlyZXQgPSBjcnlwdF9zMzkwX2ttYyhLTUNfQUVTXzI1Nl9FTkNSWVBULCAmc2N0eC0+aXYsIG91dCwgaW4sIG5ieXRlcyk7CisJCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKIAkJYnJlYWs7CiAJfQogCW1lbWNweShkZXNjLT5pbmZvLCAmc2N0eC0+aXYsIEFFU19CTE9DS19TSVpFKTsKIAotCXJldHVybiBuYnl0ZXMgJiB+KEFFU19CTE9DS19TSVpFIC0gMSk7CisJcmV0dXJuIG5ieXRlczsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBhZXNfZGVjcnlwdF9jYmMoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqb3V0LAogCQkJCSAgICBjb25zdCB1OCAqaW4sIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSk7CisJaW50IHJldDsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCW5ieXRlcyAmPSB+KEFFU19CTE9DS19TSVpFIC0gMSk7CiAKIAltZW1jcHkoJnNjdHgtPml2LCBkZXNjLT5pbmZvLCBBRVNfQkxPQ0tfU0laRSk7CiAJc3dpdGNoIChzY3R4LT5rZXlfbGVuKSB7CiAJY2FzZSAxNjoKLQkJY3J5cHRfczM5MF9rbWMoS01DX0FFU18xMjhfREVDUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCQlyZXQgPSBjcnlwdF9zMzkwX2ttYyhLTUNfQUVTXzEyOF9ERUNSWVBULCAmc2N0eC0+aXYsIG91dCwgaW4sIG5ieXRlcyk7CisJCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKIAkJYnJlYWs7CiAJY2FzZSAyNDoKLQkJY3J5cHRfczM5MF9rbWMoS01DX0FFU18xOTJfREVDUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCQlyZXQgPSBjcnlwdF9zMzkwX2ttYyhLTUNfQUVTXzE5Ml9ERUNSWVBULCAmc2N0eC0+aXYsIG91dCwgaW4sIG5ieXRlcyk7CisJCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKIAkJYnJlYWs7CiAJY2FzZSAzMjoKLQkJY3J5cHRfczM5MF9rbWMoS01DX0FFU18yNTZfREVDUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCQlyZXQgPSBjcnlwdF9zMzkwX2ttYyhLTUNfQUVTXzI1Nl9ERUNSWVBULCAmc2N0eC0+aXYsIG91dCwgaW4sIG5ieXRlcyk7CisJCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKIAkJYnJlYWs7CiAJfQotCXJldHVybiBuYnl0ZXMgJiB+KEFFU19CTE9DS19TSVpFIC0gMSk7CisJcmV0dXJuIG5ieXRlczsKIH0KIAogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL2Rlc19zMzkwLmMgYi9hcmNoL3MzOTAvY3J5cHRvL2Rlc19zMzkwLmMKaW5kZXggYTM4YmIyYS4uZTNjMzdhYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9kZXNfczM5MC5jCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vZGVzX3MzOTAuYwpAQCAtMTUsMTAgKzE1LDggQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisKICNpbmNsdWRlICJjcnlwdF9zMzkwLmgiCiAjaW5jbHVkZSAiY3J5cHRvX2Rlcy5oIgogCkBAIC00NiwzOCArNDQsOTIgQEAKIAl1OCBrZXlbREVTM18xOTJfS0VZX1NJWkVdOwogfTsKIAotc3RhdGljIGludAotZGVzX3NldGtleSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCitzdGF0aWMgaW50IGRlc19zZXRrZXkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuLAorCQkgICAgICB1MzIgKmZsYWdzKQogewotCXN0cnVjdCBjcnlwdF9zMzkwX2Rlc19jdHggKmRjdHg7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzX2N0eCAqZGN0eCA9IGN0eDsKIAlpbnQgcmV0OwogCi0JZGN0eCA9IGN0eDsKLQkvL3Rlc3QgaWYga2V5IGlzIHZhbGlkIChub3QgYSB3ZWFrIGtleSkKKwkvKiB0ZXN0IGlmIGtleSBpcyB2YWxpZCAobm90IGEgd2VhayBrZXkpICovCiAJcmV0ID0gY3J5cHRvX2Rlc19jaGVja19rZXkoa2V5LCBrZXlsZW4sIGZsYWdzKTsKLQlpZiAocmV0ID09IDApeworCWlmIChyZXQgPT0gMCkKIAkJbWVtY3B5KGRjdHgtPmtleSwga2V5LCBrZXlsZW4pOwotCX0KIAlyZXR1cm4gcmV0OwogfQogCi0KLXN0YXRpYyB2b2lkCi1kZXNfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCitzdGF0aWMgdm9pZCBkZXNfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKIHsKLQlzdHJ1Y3QgY3J5cHRfczM5MF9kZXNfY3R4ICpkY3R4OworCXN0cnVjdCBjcnlwdF9zMzkwX2Rlc19jdHggKmRjdHggPSBjdHg7CiAKLQlkY3R4ID0gY3R4OwotCWNyeXB0X3MzOTBfa20oS01fREVBX0VOQ1JZUFQsIGRjdHgtPmtleSwgZHN0LCBzcmMsIERFU19CTE9DS19TSVpFKTsKKwljcnlwdF9zMzkwX2ttKEtNX0RFQV9FTkNSWVBULCBkY3R4LT5rZXksIG91dCwgaW4sIERFU19CTE9DS19TSVpFKTsKIH0KIAotc3RhdGljIHZvaWQKLWRlc19kZWNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyB2b2lkIGRlc19kZWNyeXB0KHZvaWQgKmN0eCwgdTggKm91dCwgY29uc3QgdTggKmluKQogewotCXN0cnVjdCBjcnlwdF9zMzkwX2Rlc19jdHggKmRjdHg7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzX2N0eCAqZGN0eCA9IGN0eDsKIAotCWRjdHggPSBjdHg7Ci0JY3J5cHRfczM5MF9rbShLTV9ERUFfREVDUllQVCwgZGN0eC0+a2V5LCBkc3QsIHNyYywgREVTX0JMT0NLX1NJWkUpOworCWNyeXB0X3MzOTBfa20oS01fREVBX0RFQ1JZUFQsIGRjdHgtPmtleSwgb3V0LCBpbiwgREVTX0JMT0NLX1NJWkUpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRlc19lbmNyeXB0X2VjYihjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpvdXQsCisJCQkJICAgIGNvbnN0IHU4ICppbiwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXNfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKTsKKwlpbnQgcmV0OworCisJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCisJbmJ5dGVzICY9IH4oREVTX0JMT0NLX1NJWkUgLSAxKTsKKwlyZXQgPSBjcnlwdF9zMzkwX2ttKEtNX0RFQV9FTkNSWVBULCBzY3R4LT5rZXksIG91dCwgaW4sIG5ieXRlcyk7CisJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOworCisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkZXNfZGVjcnlwdF9lY2IoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqb3V0LAorCQkJCSAgICBjb25zdCB1OCAqaW4sIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSk7CisJaW50IHJldDsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCW5ieXRlcyAmPSB+KERFU19CTE9DS19TSVpFIC0gMSk7CisJcmV0ID0gY3J5cHRfczM5MF9rbShLTV9ERUFfREVDUllQVCwgc2N0eC0+a2V5LCBvdXQsIGluLCBuYnl0ZXMpOworCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKKworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVzX2VuY3J5cHRfY2JjKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKm91dCwKKwkJCQkgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdF9zMzkwX2Rlc19jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pOworCWludCByZXQ7CisKKwkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KKwluYnl0ZXMgJj0gfihERVNfQkxPQ0tfU0laRSAtIDEpOworCisJbWVtY3B5KHNjdHgtPml2LCBkZXNjLT5pbmZvLCBERVNfQkxPQ0tfU0laRSk7CisJcmV0ID0gY3J5cHRfczM5MF9rbWMoS01DX0RFQV9FTkNSWVBULCAmc2N0eC0+aXYsIG91dCwgaW4sIG5ieXRlcyk7CisJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOworCisJbWVtY3B5KGRlc2MtPmluZm8sIHNjdHgtPml2LCBERVNfQkxPQ0tfU0laRSk7CisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkZXNfZGVjcnlwdF9jYmMoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqb3V0LAorCQkJCSAgICBjb25zdCB1OCAqaW4sIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSk7CisJaW50IHJldDsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCW5ieXRlcyAmPSB+KERFU19CTE9DS19TSVpFIC0gMSk7CisKKwltZW1jcHkoJnNjdHgtPml2LCBkZXNjLT5pbmZvLCBERVNfQkxPQ0tfU0laRSk7CisJcmV0ID0gY3J5cHRfczM5MF9rbWMoS01DX0RFQV9ERUNSWVBULCAmc2N0eC0+aXYsIG91dCwgaW4sIG5ieXRlcyk7CisJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOworCisJcmV0dXJuIG5ieXRlczsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGRlc19hbGcgPSB7CkBAIC04NywxMiArMTM5LDE5IEBACiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgY3J5cHRfczM5MF9kZXNfY3R4KSwKIAkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKIAkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoZGVzX2FsZy5jcmFfbGlzdCksCi0JLmNyYV91CQkJPQl7IC5jaXBoZXIgPSB7Ci0JLmNpYV9taW5fa2V5c2l6ZQk9CURFU19LRVlfU0laRSwKLQkuY2lhX21heF9rZXlzaXplCT0JREVTX0tFWV9TSVpFLAotCS5jaWFfc2V0a2V5CQk9IAlkZXNfc2V0a2V5LAotCS5jaWFfZW5jcnlwdAkJPQlkZXNfZW5jcnlwdCwKLQkuY2lhX2RlY3J5cHQJCT0JZGVzX2RlY3J5cHQgfSB9CisJLmNyYV91CQkJPQl7CisJCS5jaXBoZXIgPSB7CisJCQkuY2lhX21pbl9rZXlzaXplCT0JREVTX0tFWV9TSVpFLAorCQkJLmNpYV9tYXhfa2V5c2l6ZQk9CURFU19LRVlfU0laRSwKKwkJCS5jaWFfc2V0a2V5CQk9CWRlc19zZXRrZXksCisJCQkuY2lhX2VuY3J5cHQJCT0JZGVzX2VuY3J5cHQsCisJCQkuY2lhX2RlY3J5cHQJCT0JZGVzX2RlY3J5cHQsCisJCQkuY2lhX2VuY3J5cHRfZWNiCT0JZGVzX2VuY3J5cHRfZWNiLAorCQkJLmNpYV9kZWNyeXB0X2VjYgk9CWRlc19kZWNyeXB0X2VjYiwKKwkJCS5jaWFfZW5jcnlwdF9jYmMJPQlkZXNfZW5jcnlwdF9jYmMsCisJCQkuY2lhX2RlY3J5cHRfY2JjCT0JZGVzX2RlY3J5cHRfY2JjLAorCQl9CisJfQogfTsKIAogLyoKQEAgLTEwNywyMCArMTY2LDE4IEBACiAgKiAgIEltcGxlbWVudGVycyBNVVNUIHJlamVjdCBrZXlzIHRoYXQgZXhoaWJpdCB0aGlzIHByb3BlcnR5LgogICoKICAqLwotc3RhdGljIGludAotZGVzM18xMjhfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncykKK3N0YXRpYyBpbnQgZGVzM18xMjhfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwKKwkJCSAgIHUzMiAqZmxhZ3MpCiB7CiAJaW50IGksIHJldDsKLQlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzEyOF9jdHggKmRjdHg7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xMjhfY3R4ICpkY3R4ID0gY3R4OwogCWNvbnN0IHU4KiB0ZW1wX2tleSA9IGtleTsKIAotCWRjdHggPSBjdHg7CiAJaWYgKCEobWVtY21wKGtleSwgJmtleVtERVNfS0VZX1NJWkVdLCBERVNfS0VZX1NJWkUpKSkgewotCiAJCSpmbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfS0VZX1NDSEVEOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IDI7IGkrKywJdGVtcF9rZXkgKz0gREVTX0tFWV9TSVpFKSB7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKywgdGVtcF9rZXkgKz0gREVTX0tFWV9TSVpFKSB7CiAJCXJldCA9IGNyeXB0b19kZXNfY2hlY2tfa2V5KHRlbXBfa2V5LCBERVNfS0VZX1NJWkUsIGZsYWdzKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwpAQCAtMTI5LDI0ICsxODYsODUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQKLWRlczNfMTI4X2VuY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQorc3RhdGljIHZvaWQgZGVzM18xMjhfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xMjhfY3R4ICpkY3R4OworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqZGN0eCA9IGN0eDsKIAotCWRjdHggPSBjdHg7CiAJY3J5cHRfczM5MF9rbShLTV9UREVBXzEyOF9FTkNSWVBULCBkY3R4LT5rZXksIGRzdCwgKHZvaWQqKXNyYywKLQkJCURFUzNfMTI4X0JMT0NLX1NJWkUpOworCQkgICAgICBERVMzXzEyOF9CTE9DS19TSVpFKTsKIH0KIAotc3RhdGljIHZvaWQKLWRlczNfMTI4X2RlY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQorc3RhdGljIHZvaWQgZGVzM18xMjhfZGVjcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xMjhfY3R4ICpkY3R4OworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqZGN0eCA9IGN0eDsKIAotCWRjdHggPSBjdHg7CiAJY3J5cHRfczM5MF9rbShLTV9UREVBXzEyOF9ERUNSWVBULCBkY3R4LT5rZXksIGRzdCwgKHZvaWQqKXNyYywKLQkJCURFUzNfMTI4X0JMT0NLX1NJWkUpOworCQkgICAgICBERVMzXzEyOF9CTE9DS19TSVpFKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkZXMzXzEyOF9lbmNyeXB0X2VjYihjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCSB1OCAqb3V0LCBjb25zdCB1OCAqaW4sCisJCQkJCSB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSk7CisJaW50IHJldDsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCW5ieXRlcyAmPSB+KERFUzNfMTI4X0JMT0NLX1NJWkUgLSAxKTsKKwlyZXQgPSBjcnlwdF9zMzkwX2ttKEtNX1RERUFfMTI4X0VOQ1JZUFQsIHNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRlczNfMTI4X2RlY3J5cHRfZWNiKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkJIHU4ICpvdXQsIGNvbnN0IHU4ICppbiwKKwkJCQkJIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xMjhfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKTsKKwlpbnQgcmV0OworCisJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCisJbmJ5dGVzICY9IH4oREVTM18xMjhfQkxPQ0tfU0laRSAtIDEpOworCXJldCA9IGNyeXB0X3MzOTBfa20oS01fVERFQV8xMjhfREVDUllQVCwgc2N0eC0+a2V5LCBvdXQsIGluLCBuYnl0ZXMpOworCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKKworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVzM18xMjhfZW5jcnlwdF9jYmMoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJCQkgdTggKm91dCwgY29uc3QgdTggKmluLAorCQkJCQkgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzEyOF9jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pOworCWludCByZXQ7CisKKwkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KKwluYnl0ZXMgJj0gfihERVMzXzEyOF9CTE9DS19TSVpFIC0gMSk7CisKKwltZW1jcHkoc2N0eC0+aXYsIGRlc2MtPmluZm8sIERFUzNfMTI4X0JMT0NLX1NJWkUpOworCXJldCA9IGNyeXB0X3MzOTBfa21jKEtNQ19UREVBXzEyOF9FTkNSWVBULCAmc2N0eC0+aXYsIG91dCwgaW4sIG5ieXRlcyk7CisJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOworCisJbWVtY3B5KGRlc2MtPmluZm8sIHNjdHgtPml2LCBERVMzXzEyOF9CTE9DS19TSVpFKTsKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRlczNfMTI4X2RlY3J5cHRfY2JjKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkJIHU4ICpvdXQsIGNvbnN0IHU4ICppbiwKKwkJCQkJIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xMjhfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKTsKKwlpbnQgcmV0OworCisJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCisJbmJ5dGVzICY9IH4oREVTM18xMjhfQkxPQ0tfU0laRSAtIDEpOworCisJbWVtY3B5KCZzY3R4LT5pdiwgZGVzYy0+aW5mbywgREVTM18xMjhfQkxPQ0tfU0laRSk7CisJcmV0ID0gY3J5cHRfczM5MF9rbWMoS01DX1RERUFfMTI4X0RFQ1JZUFQsICZzY3R4LT5pdiwgb3V0LCBpbiwgbmJ5dGVzKTsKKwlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CisKKwlyZXR1cm4gbmJ5dGVzOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgZGVzM18xMjhfYWxnID0gewpAQCAtMTU2LDEyICsyNzQsMTkgQEAKIAkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCksCiAJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGRlczNfMTI4X2FsZy5jcmFfbGlzdCksCi0JLmNyYV91CQkJPQl7IC5jaXBoZXIgPSB7Ci0JLmNpYV9taW5fa2V5c2l6ZQk9CURFUzNfMTI4X0tFWV9TSVpFLAotCS5jaWFfbWF4X2tleXNpemUJPQlERVMzXzEyOF9LRVlfU0laRSwKLQkuY2lhX3NldGtleQkJPSAJZGVzM18xMjhfc2V0a2V5LAotCS5jaWFfZW5jcnlwdAkJPQlkZXMzXzEyOF9lbmNyeXB0LAotCS5jaWFfZGVjcnlwdAkJPQlkZXMzXzEyOF9kZWNyeXB0IH0gfQorCS5jcmFfdQkJCT0JeworCQkuY2lwaGVyID0geworCQkJLmNpYV9taW5fa2V5c2l6ZQk9CURFUzNfMTI4X0tFWV9TSVpFLAorCQkJLmNpYV9tYXhfa2V5c2l6ZQk9CURFUzNfMTI4X0tFWV9TSVpFLAorCQkJLmNpYV9zZXRrZXkJCT0JZGVzM18xMjhfc2V0a2V5LAorCQkJLmNpYV9lbmNyeXB0CQk9CWRlczNfMTI4X2VuY3J5cHQsCisJCQkuY2lhX2RlY3J5cHQJCT0JZGVzM18xMjhfZGVjcnlwdCwKKwkJCS5jaWFfZW5jcnlwdF9lY2IJPQlkZXMzXzEyOF9lbmNyeXB0X2VjYiwKKwkJCS5jaWFfZGVjcnlwdF9lY2IJPQlkZXMzXzEyOF9kZWNyeXB0X2VjYiwKKwkJCS5jaWFfZW5jcnlwdF9jYmMJPQlkZXMzXzEyOF9lbmNyeXB0X2NiYywKKwkJCS5jaWFfZGVjcnlwdF9jYmMJPQlkZXMzXzEyOF9kZWNyeXB0X2NiYywKKwkJfQorCX0KIH07CiAKIC8qCkBAIC0xNzcsNTAgKzMwMiwxMDggQEAKICAqICAgcHJvcGVydHkuCiAgKgogICovCi1zdGF0aWMgaW50Ci1kZXMzXzE5Ml9zZXRrZXkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKQorc3RhdGljIGludCBkZXMzXzE5Ml9zZXRrZXkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuLAorCQkJICAgdTMyICpmbGFncykKIHsKIAlpbnQgaSwgcmV0OwotCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqZGN0eDsKLQljb25zdCB1OCogdGVtcF9rZXk7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xOTJfY3R4ICpkY3R4ID0gY3R4OworCWNvbnN0IHU4KiB0ZW1wX2tleSA9IGtleTsKIAotCWRjdHggPSBjdHg7Ci0JdGVtcF9rZXkgPSBrZXk7CiAJaWYgKCEobWVtY21wKGtleSwgJmtleVtERVNfS0VZX1NJWkVdLCBERVNfS0VZX1NJWkUpICYmCiAJICAgIG1lbWNtcCgma2V5W0RFU19LRVlfU0laRV0sICZrZXlbREVTX0tFWV9TSVpFICogMl0sCi0JICAgIAkJCQkJREVTX0tFWV9TSVpFKSkpIHsKKwkJICAgREVTX0tFWV9TSVpFKSkpIHsKIAogCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9TQ0hFRDsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyssIHRlbXBfa2V5ICs9IERFU19LRVlfU0laRSkgewogCQlyZXQgPSBjcnlwdG9fZGVzX2NoZWNrX2tleSh0ZW1wX2tleSwgREVTX0tFWV9TSVpFLCBmbGFncyk7Ci0JCWlmIChyZXQgPCAwKXsKKwkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwotCQl9CiAJfQogCW1lbWNweShkY3R4LT5rZXksIGtleSwga2V5bGVuKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQKLWRlczNfMTkyX2VuY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQorc3RhdGljIHZvaWQgZGVzM18xOTJfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xOTJfY3R4ICpkY3R4OworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqZGN0eCA9IGN0eDsKIAotCWRjdHggPSBjdHg7CiAJY3J5cHRfczM5MF9rbShLTV9UREVBXzE5Ml9FTkNSWVBULCBkY3R4LT5rZXksIGRzdCwgKHZvaWQqKXNyYywKLQkJCURFUzNfMTkyX0JMT0NLX1NJWkUpOworCQkgICAgICBERVMzXzE5Ml9CTE9DS19TSVpFKTsKIH0KIAotc3RhdGljIHZvaWQKLWRlczNfMTkyX2RlY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQorc3RhdGljIHZvaWQgZGVzM18xOTJfZGVjcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xOTJfY3R4ICpkY3R4OworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqZGN0eCA9IGN0eDsKIAotCWRjdHggPSBjdHg7CiAJY3J5cHRfczM5MF9rbShLTV9UREVBXzE5Ml9ERUNSWVBULCBkY3R4LT5rZXksIGRzdCwgKHZvaWQqKXNyYywKLQkJCURFUzNfMTkyX0JMT0NLX1NJWkUpOworCQkgICAgICBERVMzXzE5Ml9CTE9DS19TSVpFKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkZXMzXzE5Ml9lbmNyeXB0X2VjYihjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCSB1OCAqb3V0LCBjb25zdCB1OCAqaW4sCisJCQkJCSB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSk7CisJaW50IHJldDsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCW5ieXRlcyAmPSB+KERFUzNfMTkyX0JMT0NLX1NJWkUgLSAxKTsKKwlyZXQgPSBjcnlwdF9zMzkwX2ttKEtNX1RERUFfMTkyX0VOQ1JZUFQsIHNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRlczNfMTkyX2RlY3J5cHRfZWNiKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkJIHU4ICpvdXQsIGNvbnN0IHU4ICppbiwKKwkJCQkJIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xOTJfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKTsKKwlpbnQgcmV0OworCisJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCisJbmJ5dGVzICY9IH4oREVTM18xOTJfQkxPQ0tfU0laRSAtIDEpOworCXJldCA9IGNyeXB0X3MzOTBfa20oS01fVERFQV8xOTJfREVDUllQVCwgc2N0eC0+a2V5LCBvdXQsIGluLCBuYnl0ZXMpOworCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKKworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVzM18xOTJfZW5jcnlwdF9jYmMoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJCQkgdTggKm91dCwgY29uc3QgdTggKmluLAorCQkJCQkgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzE5Ml9jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pOworCWludCByZXQ7CisKKwkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KKwluYnl0ZXMgJj0gfihERVMzXzE5Ml9CTE9DS19TSVpFIC0gMSk7CisKKwltZW1jcHkoc2N0eC0+aXYsIGRlc2MtPmluZm8sIERFUzNfMTkyX0JMT0NLX1NJWkUpOworCXJldCA9IGNyeXB0X3MzOTBfa21jKEtNQ19UREVBXzE5Ml9FTkNSWVBULCAmc2N0eC0+aXYsIG91dCwgaW4sIG5ieXRlcyk7CisJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOworCisJbWVtY3B5KGRlc2MtPmluZm8sIHNjdHgtPml2LCBERVMzXzE5Ml9CTE9DS19TSVpFKTsKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRlczNfMTkyX2RlY3J5cHRfY2JjKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkJIHU4ICpvdXQsIGNvbnN0IHU4ICppbiwKKwkJCQkJIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xOTJfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKTsKKwlpbnQgcmV0OworCisJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCisJbmJ5dGVzICY9IH4oREVTM18xOTJfQkxPQ0tfU0laRSAtIDEpOworCisJbWVtY3B5KCZzY3R4LT5pdiwgZGVzYy0+aW5mbywgREVTM18xOTJfQkxPQ0tfU0laRSk7CisJcmV0ID0gY3J5cHRfczM5MF9rbWMoS01DX1RERUFfMTkyX0RFQ1JZUFQsICZzY3R4LT5pdiwgb3V0LCBpbiwgbmJ5dGVzKTsKKwlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CisKKwlyZXR1cm4gbmJ5dGVzOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgZGVzM18xOTJfYWxnID0gewpAQCAtMjMwLDQ0ICs0MTMsNDMgQEAKIAkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCksCiAJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGRlczNfMTkyX2FsZy5jcmFfbGlzdCksCi0JLmNyYV91CQkJPQl7IC5jaXBoZXIgPSB7Ci0JLmNpYV9taW5fa2V5c2l6ZQk9CURFUzNfMTkyX0tFWV9TSVpFLAotCS5jaWFfbWF4X2tleXNpemUJPQlERVMzXzE5Ml9LRVlfU0laRSwKLQkuY2lhX3NldGtleQkJPSAJZGVzM18xOTJfc2V0a2V5LAotCS5jaWFfZW5jcnlwdAkJPQlkZXMzXzE5Ml9lbmNyeXB0LAotCS5jaWFfZGVjcnlwdAkJPQlkZXMzXzE5Ml9kZWNyeXB0IH0gfQorCS5jcmFfdQkJCT0JeworCQkuY2lwaGVyID0geworCQkJLmNpYV9taW5fa2V5c2l6ZQk9CURFUzNfMTkyX0tFWV9TSVpFLAorCQkJLmNpYV9tYXhfa2V5c2l6ZQk9CURFUzNfMTkyX0tFWV9TSVpFLAorCQkJLmNpYV9zZXRrZXkJCT0JZGVzM18xOTJfc2V0a2V5LAorCQkJLmNpYV9lbmNyeXB0CQk9CWRlczNfMTkyX2VuY3J5cHQsCisJCQkuY2lhX2RlY3J5cHQJCT0JZGVzM18xOTJfZGVjcnlwdCwKKwkJCS5jaWFfZW5jcnlwdF9lY2IJPQlkZXMzXzE5Ml9lbmNyeXB0X2VjYiwKKwkJCS5jaWFfZGVjcnlwdF9lY2IJPQlkZXMzXzE5Ml9kZWNyeXB0X2VjYiwKKwkJCS5jaWFfZW5jcnlwdF9jYmMJPQlkZXMzXzE5Ml9lbmNyeXB0X2NiYywKKwkJCS5jaWFfZGVjcnlwdF9jYmMJPQlkZXMzXzE5Ml9kZWNyeXB0X2NiYywKKwkJfQorCX0KIH07CiAKLQotCi1zdGF0aWMgaW50Ci1pbml0KHZvaWQpCitzdGF0aWMgaW50IGluaXQodm9pZCkKIHsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCiAJaWYgKCFjcnlwdF9zMzkwX2Z1bmNfYXZhaWxhYmxlKEtNX0RFQV9FTkNSWVBUKSB8fAogCSAgICAhY3J5cHRfczM5MF9mdW5jX2F2YWlsYWJsZShLTV9UREVBXzEyOF9FTkNSWVBUKSB8fAotCSAgICAhY3J5cHRfczM5MF9mdW5jX2F2YWlsYWJsZShLTV9UREVBXzE5Ml9FTkNSWVBUKSl7CisJICAgICFjcnlwdF9zMzkwX2Z1bmNfYXZhaWxhYmxlKEtNX1RERUFfMTkyX0VOQ1JZUFQpKQogCQlyZXR1cm4gLUVOT1NZUzsKLQl9CiAKLQlyZXQgPSAwOwotCXJldCB8PSAoY3J5cHRvX3JlZ2lzdGVyX2FsZygmZGVzX2FsZykgPT0gMCk/IDA6MTsKLQlyZXQgfD0gKGNyeXB0b19yZWdpc3Rlcl9hbGcoJmRlczNfMTI4X2FsZykgPT0gMCk/IDA6MjsKLQlyZXQgfD0gKGNyeXB0b19yZWdpc3Rlcl9hbGcoJmRlczNfMTkyX2FsZykgPT0gMCk/IDA6NDsKLQlpZiAocmV0KXsKKwlyZXQgfD0gKGNyeXB0b19yZWdpc3Rlcl9hbGcoJmRlc19hbGcpID09IDApID8gMDoxOworCXJldCB8PSAoY3J5cHRvX3JlZ2lzdGVyX2FsZygmZGVzM18xMjhfYWxnKSA9PSAwKSA/IDA6MjsKKwlyZXQgfD0gKGNyeXB0b19yZWdpc3Rlcl9hbGcoJmRlczNfMTkyX2FsZykgPT0gMCkgPyAwOjQ7CisJaWYgKHJldCkgewogCQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlczNfMTkyX2FsZyk7CiAJCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZGVzM18xMjhfYWxnKTsKIAkJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZkZXNfYWxnKTsKIAkJcmV0dXJuIC1FRVhJU1Q7CiAJfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiY3J5cHRfczM5MDogZGVzX3MzOTAgbG9hZGVkLlxuIik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAotZmluaSh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKIAljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlczNfMTkyX2FsZyk7CiAJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZkZXMzXzEyOF9hbGcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jCmluZGV4IGI3NWJkYmQuLjFlYzVlOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYTI1Nl9zMzkwLmMKQEAgLTUxLDYgKzUxLDcgQEAKIHsKIAlzdHJ1Y3QgczM5MF9zaGEyNTZfY3R4ICpzY3R4ID0gY3R4OwogCXVuc2lnbmVkIGludCBpbmRleDsKKwlpbnQgcmV0OwogCiAJLyogaG93IG11Y2ggaXMgYWxyZWFkeSBpbiB0aGUgYnVmZmVyPyAqLwogCWluZGV4ID0gc2N0eC0+Y291bnQgLyA4ICYgMHgzZjsKQEAgLTU4LDE1ICs1OSwyOSBAQAogCS8qIHVwZGF0ZSBtZXNzYWdlIGJpdCBsZW5ndGggKi8KIAlzY3R4LT5jb3VudCArPSBsZW4gKiA4OwogCi0JLyogcHJvY2VzcyBvbmUgYmxvY2sgKi8KLQlpZiAoKGluZGV4ICsgbGVuKSA+PSBTSEEyNTZfQkxPQ0tfU0laRSkgeworCWlmICgoaW5kZXggKyBsZW4pIDwgU0hBMjU2X0JMT0NLX1NJWkUpCisJCWdvdG8gc3RvcmU7CisKKwkvKiBwcm9jZXNzIG9uZSBzdG9yZWQgYmxvY2sgKi8KKwlpZiAoaW5kZXgpIHsKIAkJbWVtY3B5KHNjdHgtPmJ1ZiArIGluZGV4LCBkYXRhLCBTSEEyNTZfQkxPQ0tfU0laRSAtIGluZGV4KTsKLQkJY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzI1Niwgc2N0eC0+c3RhdGUsIHNjdHgtPmJ1ZiwKLQkJCQlTSEEyNTZfQkxPQ0tfU0laRSk7CisJCXJldCA9IGNyeXB0X3MzOTBfa2ltZChLSU1EX1NIQV8yNTYsIHNjdHgtPnN0YXRlLCBzY3R4LT5idWYsCisJCQkJICAgICAgU0hBMjU2X0JMT0NLX1NJWkUpOworCQlCVUdfT04ocmV0ICE9IFNIQTI1Nl9CTE9DS19TSVpFKTsKIAkJZGF0YSArPSBTSEEyNTZfQkxPQ0tfU0laRSAtIGluZGV4OwogCQlsZW4gLT0gU0hBMjU2X0JMT0NLX1NJWkUgLSBpbmRleDsKIAl9CiAKKwkvKiBwcm9jZXNzIGFzIG1hbnkgYmxvY2tzIGFzIHBvc3NpYmxlICovCisJaWYgKGxlbiA+PSBTSEEyNTZfQkxPQ0tfU0laRSkgeworCQlyZXQgPSBjcnlwdF9zMzkwX2tpbWQoS0lNRF9TSEFfMjU2LCBzY3R4LT5zdGF0ZSwgZGF0YSwKKwkJCQkgICAgICBsZW4gJiB+KFNIQTI1Nl9CTE9DS19TSVpFIC0gMSkpOworCQlCVUdfT04ocmV0ICE9IChsZW4gJiB+KFNIQTI1Nl9CTE9DS19TSVpFIC0gMSkpKTsKKwkJZGF0YSArPSByZXQ7CisJCWxlbiAtPSByZXQ7CisJfQorCitzdG9yZToKIAkvKiBhbnl0aGluZyBsZWZ0PyAqLwogCWlmIChsZW4pCiAJCW1lbWNweShzY3R4LT5idWYgKyBpbmRleCAsIGRhdGEsIGxlbik7CkBAIC0xMTksOSArMTM0LDkgQEAKIAkuY3JhX2xpc3QJPQlMSVNUX0hFQURfSU5JVChhbGcuY3JhX2xpc3QpLAogCS5jcmFfdQkJPQl7IC5kaWdlc3QgPSB7CiAJLmRpYV9kaWdlc3RzaXplCT0JU0hBMjU2X0RJR0VTVF9TSVpFLAotCS5kaWFfaW5pdCAgIAk9IAlzaGEyNTZfaW5pdCwKLQkuZGlhX3VwZGF0ZSAJPQlzaGEyNTZfdXBkYXRlLAotCS5kaWFfZmluYWwgIAk9CXNoYTI1Nl9maW5hbCB9IH0KKwkuZGlhX2luaXQJPQlzaGEyNTZfaW5pdCwKKwkuZGlhX3VwZGF0ZQk9CXNoYTI1Nl91cGRhdGUsCisJLmRpYV9maW5hbAk9CXNoYTI1Nl9maW5hbCB9IH0KIH07CiAKIHN0YXRpYyBpbnQgaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYwppbmRleCAyZmY5MGExLi4wMDhjNzQ1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYwpAQCAtNTgsMTAgKzU4LDE4IEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCXN0cnVjdCBzdGFja19mcmFtZSAqc2Y7CisJc3RydWN0IHN0YWNrX2ZyYW1lICpzZiwgKmxvdywgKmhpZ2g7CiAKLQlzZiA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKikgdHNrLT50aHJlYWQua3NwOwotCXNmID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKSBzZi0+YmFja19jaGFpbjsKKwlpZiAoIXRzayB8fCAhdGFza19zdGFja19wYWdlKHRzaykpCisJCXJldHVybiAwOworCWxvdyA9IHRhc2tfc3RhY2tfcGFnZSh0c2spOworCWhpZ2ggPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopIHRhc2tfcHRfcmVncyh0c2spOworCXNmID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKSAodHNrLT50aHJlYWQua3NwICYgUFNXX0FERFJfSU5TTik7CisJaWYgKHNmIDw9IGxvdyB8fCBzZiA+IGhpZ2gpCisJCXJldHVybiAwOworCXNmID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKSAoc2YtPmJhY2tfY2hhaW4gJiBQU1dfQUREUl9JTlNOKTsKKwlpZiAoc2YgPD0gbG93IHx8IHNmID4gaGlnaCkKKwkJcmV0dXJuIDA7CiAJcmV0dXJuIHNmLT5ncHJzWzhdOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKaW5kZXggYjAzODQ3ZC4uZGU4Nzg0MiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJcmVpcGxfZGlhZygpOwogCiAJaWYgKE1BQ0hJTkVfSVNfVk0pCi0JCWNwY21kICgiSVBMIiwgTlVMTCwgMCk7CisJCWNwY21kICgiSVBMIiwgTlVMTCwgMCwgTlVMTCk7CiAJZWxzZQogCQlyZWlwbCAoMHgxMDAwMCB8IFMzOTBfbG93Y29yZS5pcGxfZGV2aWNlKTsKIH0KQEAgLTI3NiwxNCArMjc2LDE0IEBACiBzdGF0aWMgdm9pZCBkb19tYWNoaW5lX2hhbHRfbm9uc21wKHZvaWQpCiB7CiAgICAgICAgIGlmIChNQUNISU5FX0lTX1ZNICYmIHN0cmxlbih2bWhhbHRfY21kKSA+IDApCi0gICAgICAgICAgICAgICAgY3BjbWQodm1oYWx0X2NtZCwgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgY3BjbWQodm1oYWx0X2NtZCwgTlVMTCwgMCwgTlVMTCk7CiAgICAgICAgIHNpZ25hbF9wcm9jZXNzb3Ioc21wX3Byb2Nlc3Nvcl9pZCgpLCBzaWdwX3N0b3BfYW5kX3N0b3JlX3N0YXR1cyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRvX21hY2hpbmVfcG93ZXJfb2ZmX25vbnNtcCh2b2lkKQogewogICAgICAgICBpZiAoTUFDSElORV9JU19WTSAmJiBzdHJsZW4odm1wb2ZmX2NtZCkgPiAwKQotICAgICAgICAgICAgICAgIGNwY21kKHZtcG9mZl9jbWQsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIGNwY21kKHZtcG9mZl9jbWQsIE5VTEwsIDAsIE5VTEwpOwogICAgICAgICBzaWduYWxfcHJvY2Vzc29yKHNtcF9wcm9jZXNzb3JfaWQoKSwgc2lncF9zdG9wX2FuZF9zdG9yZV9zdGF0dXMpOwogfQogCkBAIC0zMTUsNiArMzE1LDExIEBACiAJX21hY2hpbmVfcG93ZXJfb2ZmKCk7CiB9CiAKKy8qCisgKiBEdW1teSBwb3dlciBvZmYgZnVuY3Rpb24uCisgKi8KK3ZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpID0gbWFjaGluZV9wb3dlcl9vZmY7CisKIHN0YXRpYyB2b2lkIF9faW5pdAogYWRkX21lbW9yeV9ob2xlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwppbmRleCBiMGQ4Y2E4Li43YzBmZTE1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCi0JYWNjb3VudF91c2VyX3Z0aW1lKGN1cnJlbnQpOworCWFjY291bnRfdGlja192dGltZShjdXJyZW50KTsKICNlbHNlCiAJd2hpbGUgKHRpY2tzLS0pCiAJCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMKaW5kZXggMjJhODk1ZS4uZGZlNmYwOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92dGltZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdnRpbWUuYwpAQCAtMzIsNyArMzIsNyBAQAogICogVXBkYXRlIHByb2Nlc3MgdGltZXMgYmFzZWQgb24gdmlydHVhbCBjcHUgdGltZXMgc3RvcmVkIGJ5IGVudHJ5LlMKICAqIHRvIHRoZSBsb3djb3JlIGZpZWxkcyB1c2VyX3RpbWVyLCBzeXN0ZW1fdGltZXIgJiBzdGVhbF9jbG9jay4KICAqLwotdm9pZCBhY2NvdW50X3VzZXJfdnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit2b2lkIGFjY291bnRfdGlja192dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAljcHV0aW1lX3QgY3B1dGltZTsKIAlfX3U2NCB0aW1lciwgY2xvY2s7CkBAIC03Niw2ICs3NiwzMSBAQAogICogVXBkYXRlIHByb2Nlc3MgdGltZXMgYmFzZWQgb24gdmlydHVhbCBjcHUgdGltZXMgc3RvcmVkIGJ5IGVudHJ5LlMKICAqIHRvIHRoZSBsb3djb3JlIGZpZWxkcyB1c2VyX3RpbWVyLCBzeXN0ZW1fdGltZXIgJiBzdGVhbF9jbG9jay4KICAqLwordm9pZCBhY2NvdW50X3Z0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCWNwdXRpbWVfdCBjcHV0aW1lOworCV9fdTY0IHRpbWVyOworCisJdGltZXIgPSBTMzkwX2xvd2NvcmUubGFzdF91cGRhdGVfdGltZXI7CisJYXNtIHZvbGF0aWxlICgiICBTVFBUICUwIiAgICAvKiBTdG9yZSBjdXJyZW50IGNwdSB0aW1lciB2YWx1ZSAqLworCQkgICAgICA6ICI9bSIgKFMzOTBfbG93Y29yZS5sYXN0X3VwZGF0ZV90aW1lcikgKTsKKwlTMzkwX2xvd2NvcmUuc3lzdGVtX3RpbWVyICs9IHRpbWVyIC0gUzM5MF9sb3djb3JlLmxhc3RfdXBkYXRlX3RpbWVyOworCisJY3B1dGltZSA9IFMzOTBfbG93Y29yZS51c2VyX3RpbWVyID4+IDEyOworCVMzOTBfbG93Y29yZS51c2VyX3RpbWVyIC09IGNwdXRpbWUgPDwgMTI7CisJUzM5MF9sb3djb3JlLnN0ZWFsX2Nsb2NrIC09IGNwdXRpbWUgPDwgMTI7CisJYWNjb3VudF91c2VyX3RpbWUodHNrLCBjcHV0aW1lKTsKKworCWNwdXRpbWUgPSAgUzM5MF9sb3djb3JlLnN5c3RlbV90aW1lciA+PiAxMjsKKwlTMzkwX2xvd2NvcmUuc3lzdGVtX3RpbWVyIC09IGNwdXRpbWUgPDwgMTI7CisJUzM5MF9sb3djb3JlLnN0ZWFsX2Nsb2NrIC09IGNwdXRpbWUgPDwgMTI7CisJYWNjb3VudF9zeXN0ZW1fdGltZSh0c2ssIDAsIGNwdXRpbWUpOworfQorCisvKgorICogVXBkYXRlIHByb2Nlc3MgdGltZXMgYmFzZWQgb24gdmlydHVhbCBjcHUgdGltZXMgc3RvcmVkIGJ5IGVudHJ5LlMKKyAqIHRvIHRoZSBsb3djb3JlIGZpZWxkcyB1c2VyX3RpbWVyLCBzeXN0ZW1fdGltZXIgJiBzdGVhbF9jbG9jay4KKyAqLwogdm9pZCBhY2NvdW50X3N5c3RlbV92dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAljcHV0aW1lX3QgY3B1dGltZTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvTWFrZWZpbGUgYi9hcmNoL3MzOTAvbGliL01ha2VmaWxlCmluZGV4IGQ5Yjk3YjMuLmYyMGI1MWZmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9saWIvTWFrZWZpbGUKQEAgLTQsNSArNCw2IEBACiAKIEVYVFJBX0FGTEFHUyA6PSAtdHJhZGl0aW9uYWwKIAotbGliLXkgKz0gZGVsYXkubyBzdHJpbmcubyBzcGlubG9jay5vCitsaWIteSArPSBkZWxheS5vIHN0cmluZy5vCiBsaWIteSArPSAkKGlmICQoQ09ORklHXzY0QklUKSx1YWNjZXNzNjQubyx1YWNjZXNzLm8pCitsaWItJChDT05GSUdfU01QKSArPSBzcGlubG9jay5vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi9zcGlubG9jay5jIGIvYXJjaC9zMzkwL2xpYi9zcGlubG9jay5jCmluZGV4IDY4ZDc5YzUuLjYwZjgwYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9saWIvc3BpbmxvY2suYworKysgYi9hcmNoL3MzOTAvbGliL3NwaW5sb2NrLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLWF0b21pY190IHNwaW5fcmV0cnlfY291bnRlcjsKIGludCBzcGluX3JldHJ5ID0gMTAwMDsKIAogLyoqCkBAIC00NSw3ICs0NCw2IEBACiAJCQlfZGlhZzQ0KCk7CiAJCQljb3VudCA9IHNwaW5fcmV0cnk7CiAJCX0KLQkJYXRvbWljX2luYygmc3Bpbl9yZXRyeV9jb3VudGVyKTsKIAkJaWYgKF9yYXdfY29tcGFyZV9hbmRfc3dhcCgmbHAtPmxvY2ssIDAsIHBjKSA9PSAwKQogCQkJcmV0dXJuOwogCX0KQEAgLTU4LDcgKzU2LDYgQEAKIAlpbnQgY291bnQgPSBzcGluX3JldHJ5OwogCiAJd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0JCWF0b21pY19pbmMoJnNwaW5fcmV0cnlfY291bnRlcik7CiAJCWlmIChfcmF3X2NvbXBhcmVfYW5kX3N3YXAoJmxwLT5sb2NrLCAwLCBwYykgPT0gMCkKIAkJCXJldHVybiAxOwogCX0KQEAgLTc3LDcgKzc0LDYgQEAKIAkJCV9kaWFnNDQoKTsKIAkJCWNvdW50ID0gc3Bpbl9yZXRyeTsKIAkJfQotCQlhdG9taWNfaW5jKCZzcGluX3JldHJ5X2NvdW50ZXIpOwogCQlvbGQgPSBydy0+bG9jayAmIDB4N2ZmZmZmZmZVOwogCQlpZiAoX3Jhd19jb21wYXJlX2FuZF9zd2FwKCZydy0+bG9jaywgb2xkLCBvbGQgKyAxKSA9PSBvbGQpCiAJCQlyZXR1cm47CkBAIC05Miw3ICs4OCw2IEBACiAJaW50IGNvdW50ID0gc3Bpbl9yZXRyeTsKIAogCXdoaWxlIChjb3VudC0tID4gMCkgewotCQlhdG9taWNfaW5jKCZzcGluX3JldHJ5X2NvdW50ZXIpOwogCQlvbGQgPSBydy0+bG9jayAmIDB4N2ZmZmZmZmZVOwogCQlpZiAoX3Jhd19jb21wYXJlX2FuZF9zd2FwKCZydy0+bG9jaywgb2xkLCBvbGQgKyAxKSA9PSBvbGQpCiAJCQlyZXR1cm4gMTsKQEAgLTExMSw3ICsxMDYsNiBAQAogCQkJX2RpYWc0NCgpOwogCQkJY291bnQgPSBzcGluX3JldHJ5OwogCQl9Ci0JCWF0b21pY19pbmMoJnNwaW5fcmV0cnlfY291bnRlcik7CiAJCWlmIChfcmF3X2NvbXBhcmVfYW5kX3N3YXAoJnJ3LT5sb2NrLCAwLCAweDgwMDAwMDAwKSA9PSAwKQogCQkJcmV0dXJuOwogCX0KQEAgLTEyNCw3ICsxMTgsNiBAQAogCWludCBjb3VudCA9IHNwaW5fcmV0cnk7CiAKIAl3aGlsZSAoY291bnQtLSA+IDApIHsKLQkJYXRvbWljX2luYygmc3Bpbl9yZXRyeV9jb3VudGVyKTsKIAkJaWYgKF9yYXdfY29tcGFyZV9hbmRfc3dhcCgmcnctPmxvY2ssIDAsIDB4ODAwMDAwMDApID09IDApCiAJCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvYnVzLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvYnVzLmMKaW5kZXggZDRmZWUyYTcuLjMyNzhkMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9idXMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvYnVzLmMKQEAgLTUzLDIxICs1Myw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlIHNoX2J1c19kZXZpY2VzW1NIX05SX0JVU0VTXSA9IHsKLQl7Ci0JCS5idXNfaWQJCT0gU0hfQlVTX05BTUVfVklSVCwKLQl9LAotfTsKLQotc3RydWN0IGJ1c190eXBlIHNoX2J1c190eXBlc1tTSF9OUl9CVVNFU10gPSB7Ci0JewotCQkubmFtZQkJPSBTSF9CVVNfTkFNRV9WSVJULAotCQkubWF0Y2gJCT0gc2hfYnVzX21hdGNoLAotCQkuc3VzcGVuZAk9IHNoX2J1c19zdXNwZW5kLAotCQkucmVzdW1lCQk9IHNoX2J1c19yZXN1bWUsCi0JfSwKLX07Ci0KIHN0YXRpYyBpbnQgc2hfZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc2hfZGV2ICpzaGRldiA9IHRvX3NoX2RldihkZXYpOwpAQCAtOTAsNiArNzUsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBkZXZpY2Ugc2hfYnVzX2RldmljZXNbU0hfTlJfQlVTRVNdID0geworCXsKKwkJLmJ1c19pZAkJPSBTSF9CVVNfTkFNRV9WSVJULAorCX0sCit9OworCitzdHJ1Y3QgYnVzX3R5cGUgc2hfYnVzX3R5cGVzW1NIX05SX0JVU0VTXSA9IHsKKwl7CisJCS5uYW1lCQk9IFNIX0JVU19OQU1FX1ZJUlQsCisJCS5tYXRjaAkJPSBzaF9idXNfbWF0Y2gsCisJCS5wcm9iZQkJPSBzaF9idXNfcHJvYmUsCisJCS5yZW1vdmUJCT0gc2hfYnVzX3JlbW92ZSwKKwkJLnN1c3BlbmQJPSBzaF9idXNfc3VzcGVuZCwKKwkJLnJlc3VtZQkJPSBzaF9idXNfcmVzdW1lLAorCX0sCit9OworCiBpbnQgc2hfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBzaF9kZXYgKmRldikKIHsKIAlpZiAoIWRldikKQEAgLTEzMyw4ICsxMzUsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlkcnYtPmRydi5wcm9iZSAgPSBzaF9kZXZpY2VfcHJvYmU7Ci0JZHJ2LT5kcnYucmVtb3ZlID0gc2hfZGV2aWNlX3JlbW92ZTsKIAlkcnYtPmRydi5idXMgICAgPSAmc2hfYnVzX3R5cGVzW2Rydi0+YnVzX2lkXTsKIAogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJ2KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vTWFrZWZpbGUgYi9hcmNoL3VtL01ha2VmaWxlCmluZGV4IDMyMjk3MmZkLi40NTQzNWZmIDEwMDY0NAotLS0gYS9hcmNoL3VtL01ha2VmaWxlCisrKyBiL2FyY2gvdW0vTWFrZWZpbGUKQEAgLTY3LDcgKzY3LDggQEAKICMgaW4gQ0ZMQUdTLiAgT3RoZXJ3aXNlLCBpdCB3b3VsZCBjYXVzZSBsZCB0byBjb21wbGFpbiBhYm91dCB0aGUgdHdvIGRpZmZlcmVudAogIyBlcnJub3MuCiAKLUNGTEFHUyArPSAtRGVycm5vPWtlcm5lbF9lcnJubyAtRHNpZ3Byb2NtYXNrPWtlcm5lbF9zaWdwcm9jbWFzaworQ0ZMQUdTICs9IC1EZXJybm89a2VybmVsX2Vycm5vIC1Ec2lncHJvY21hc2s9a2VybmVsX3NpZ3Byb2NtYXNrIFwKKwktRG1rdGltZT1rZXJuZWxfbWt0aW1lCiBDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZm5vLXVuaXQtYXQtYS10aW1lLCkKIAogaW5jbHVkZSAkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL01ha2VmaWxlLSQoU1VCQVJDSCkKZGlmZiAtLWdpdCBhL2Jsb2NrL2dlbmhkLmMgYi9ibG9jay9nZW5oZC5jCmluZGV4IGYxZWQ4M2YuLmRiNTc1NDYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2dlbmhkLmMKKysrIGIvYmxvY2svZ2VuaGQuYwpAQCAtMzgsMzQgKzM4LDEwMCBAQAogCXJldHVybiBtYWpvciAlIE1BWF9QUk9CRV9IQVNIOwogfQogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLS8qIGdldCBibG9jayBkZXZpY2UgbmFtZXMgaW4gc29tZXdoYXQgcmFuZG9tIG9yZGVyICovCi1pbnQgZ2V0X2Jsa2Rldl9saXN0KGNoYXIgKnAsIGludCB1c2VkKQorc3RydWN0IGJsa2Rldl9pbmZvIHsKKyAgICAgICAgaW50IGluZGV4OworICAgICAgICBzdHJ1Y3QgYmxrX21ham9yX25hbWUgKmJkOworfTsKKworLyoKKyAqIGl0ZXJhdGUgb3ZlciBhIGxpc3Qgb2YgYmxrZGV2X2luZm8gc3RydWN0dXJlcy4gIGFsbG93cworICogdGhlIG1ham9yX25hbWVzIGFycmF5IHRvIGJlIGl0ZXJhdGVkIG92ZXIgZnJvbSBvdXRzaWRlIHRoaXMgZmlsZQorICogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgYmxvY2tfc3Vic3lzX3NlbSBoZWxkCisgKi8KK3ZvaWQgKmdldF9uZXh0X2Jsa2Rldih2b2lkICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBibGtkZXZfaW5mbyAqaW5mbzsKKworICAgICAgICBpZiAoZGV2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgICAgICAgICBpZiAoIWluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICBpbmZvLT5pbmRleD0wOworICAgICAgICAgICAgICAgIGluZm8tPmJkID0gbWFqb3JfbmFtZXNbaW5mby0+aW5kZXhdOworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5iZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZm8gPSBkZXY7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoaW5mby0+aW5kZXggPCBBUlJBWV9TSVpFKG1ham9yX25hbWVzKSkgeworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5iZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJkID0gaW5mby0+YmQtPm5leHQ7CisgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJkKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBObyBkZXZpY2VzIG9uIHRoaXMgY2hhaW4sIG1vdmUgdG8gdGhlIG5leHQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbmZvLT5pbmRleCsrOworICAgICAgICAgICAgICAgIGluZm8tPmJkID0gKGluZm8tPmluZGV4IDwgQVJSQVlfU0laRShtYWpvcl9uYW1lcykpID8KKwkJCW1ham9yX25hbWVzW2luZm8tPmluZGV4XSA6IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJkKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworb3V0OgorICAgICAgICByZXR1cm4gaW5mbzsKK30KKwordm9pZCAqYWNxdWlyZV9ibGtkZXZfbGlzdCh2b2lkKQoreworICAgICAgICBkb3duKCZibG9ja19zdWJzeXNfc2VtKTsKKyAgICAgICAgcmV0dXJuIGdldF9uZXh0X2Jsa2RldihOVUxMKTsKK30KKwordm9pZCByZWxlYXNlX2Jsa2Rldl9saXN0KHZvaWQgKmRldikKK3sKKyAgICAgICAgdXAoJmJsb2NrX3N1YnN5c19zZW0pOworICAgICAgICBrZnJlZShkZXYpOworfQorCisKKy8qCisgKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGJsa2Rldl9saXN0LgorICogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgYmxvY2tfc3Vic3lzX3NlbSBoZWxkCisgKi8KK2ludCBjb3VudF9ibGtkZXZfbGlzdCh2b2lkKQogewogCXN0cnVjdCBibGtfbWFqb3JfbmFtZSAqbjsKLQlpbnQgaSwgbGVuOworCWludCBpLCBjb3VudDsKIAotCWxlbiA9IHNucHJpbnRmKHAsIChQQUdFX1NJWkUtdXNlZCksICJcbkJsb2NrIGRldmljZXM6XG4iKTsKKwljb3VudCA9IDA7CiAKLQlkb3duKCZibG9ja19zdWJzeXNfc2VtKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYWpvcl9uYW1lcyk7IGkrKykgewotCQlmb3IgKG4gPSBtYWpvcl9uYW1lc1tpXTsgbjsgbiA9IG4tPm5leHQpIHsKLQkJCS8qCi0JCQkgKiBJZiB0aGUgY3VyZW50IHN0cmluZyBwbHVzIHRoZSA1IGV4dHJhIGNoYXJhY3RlcnMKLQkJCSAqIGluIHRoZSBsaW5lIHdvdWxkIHJ1biB1cyBvZmYgdGhlIHBhZ2UsIHRoZW4gd2UncmUgZG9uZQotCQkJICovCi0JCQlpZiAoKGxlbiArIHVzZWQgKyBzdHJsZW4obi0+bmFtZSkgKyA1KSA+PSBQQUdFX1NJWkUpCi0JCQkJZ290byBwYWdlX2Z1bGw7Ci0JCQlsZW4gKz0gc3ByaW50ZihwK2xlbiwgIiUzZCAlc1xuIiwKLQkJCQkgICAgICAgbi0+bWFqb3IsIG4tPm5hbWUpOwotCQl9CisJCWZvciAobiA9IG1ham9yX25hbWVzW2ldOyBuOyBuID0gbi0+bmV4dCkKKwkJCQljb3VudCsrOwogCX0KLXBhZ2VfZnVsbDoKLQl1cCgmYmxvY2tfc3Vic3lzX3NlbSk7CiAKLQlyZXR1cm4gbGVuOworCXJldHVybiBjb3VudDsKIH0KLSNlbmRpZgorCisvKgorICogZXh0cmFjdCB0aGUgbWFqb3IgYW5kIG5hbWUgdmFsdWVzIGZyb20gYSBibGtkZXZfaW5mbyBzdHJ1Y3QKKyAqIHBhc3NlZCBpbiBhcyBhIHZvaWQgdG8gKmRldi4gIE11c3QgYmUgY2FsbGVkIHdpdGgKKyAqIGJsb2NrX3N1YnN5c19zZW0gaGVsZAorICovCitpbnQgZ2V0X2Jsa2Rldl9pbmZvKHZvaWQgKmRldiwgaW50ICptYWpvciwgY2hhciAqKm5hbWUpCit7CisgICAgICAgIHN0cnVjdCBibGtkZXZfaW5mbyAqaW5mbyA9IGRldjsKKworICAgICAgICBpZiAoaW5mby0+YmQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAqbWFqb3IgPSBpbmZvLT5iZC0+bWFqb3I7CisgICAgICAgICpuYW1lID0gaW5mby0+YmQtPm5hbWU7CisgICAgICAgIHJldHVybiAwOworfQorCiAKIGludCByZWdpc3Rlcl9ibGtkZXYodW5zaWduZWQgaW50IG1ham9yLCBjb25zdCBjaGFyICpuYW1lKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9LY29uZmlnIGIvZHJpdmVycy9LY29uZmlnCmluZGV4IDQ4ZjQ0NmQuLjI4M2MwODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL0tjb25maWcKQEAgLTQ0LDYgKzQ0LDggQEAKIAogc291cmNlICJkcml2ZXJzL2kyYy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3BpL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy93MS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaHdtb24vS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDdmYzNmMGYuLjdjNDUwNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtNDEsNiArNDEsNyBAQAogb2JqLSQoQ09ORklHX0lFRUUxMzk0KQkJKz0gaWVlZTEzOTQvCiBvYmoteQkJCQkrPSBjZHJvbS8KIG9iai0kKENPTkZJR19NVEQpCQkrPSBtdGQvCitvYmotJChDT05GSUdfU1BJKQkJKz0gc3BpLwogb2JqLSQoQ09ORklHX1BDQ0FSRCkJCSs9IHBjbWNpYS8KIG9iai0kKENPTkZJR19ESU8pCQkrPSBkaW8vCiBvYmotJChDT05GSUdfU0JVUykJCSs9IHNidXMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZWMuYyBiL2RyaXZlcnMvYWNwaS9lYy5jCmluZGV4IDdlMWE0NDUuLjM3NThiNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9lYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9lYy5jCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb24gTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGlubGluZSB1MzIgYWNwaV9lY19yZWFkX3N0YXR1cyh1bmlvbiBhY3BpX2VjICplYykKK3N0YXRpYyB1MzIgYWNwaV9lY19yZWFkX3N0YXR1cyh1bmlvbiBhY3BpX2VjICplYykKIHsKIAl1MzIgc3RhdHVzID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RkLmMgYi9kcml2ZXJzL2Jhc2UvZGQuYwppbmRleCAyYjkwNTAxLi43MzBhOWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZGQuYworKysgYi9kcml2ZXJzL2Jhc2UvZGQuYwpAQCAtNzgsNyArNzgsMTMgQEAKIAlwcl9kZWJ1ZygiJXM6IE1hdGNoZWQgRGV2aWNlICVzIHdpdGggRHJpdmVyICVzXG4iLAogCQkgZHJ2LT5idXMtPm5hbWUsIGRldi0+YnVzX2lkLCBkcnYtPm5hbWUpOwogCWRldi0+ZHJpdmVyID0gZHJ2OwotCWlmIChkcnYtPnByb2JlKSB7CisJaWYgKGRldi0+YnVzLT5wcm9iZSkgeworCQlyZXQgPSBkZXYtPmJ1cy0+cHJvYmUoZGV2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2LT5kcml2ZXIgPSBOVUxMOworCQkJZ290byBQcm9iZUZhaWxlZDsKKwkJfQorCX0gZWxzZSBpZiAoZHJ2LT5wcm9iZSkgewogCQlyZXQgPSBkcnYtPnByb2JlKGRldik7CiAJCWlmIChyZXQpIHsKIAkJCWRldi0+ZHJpdmVyID0gTlVMTDsKQEAgLTIwMyw3ICsyMDksOSBAQAogCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiZHJpdmVyIik7CiAJCWtsaXN0X3JlbW92ZSgmZGV2LT5rbm9kZV9kcml2ZXIpOwogCi0JCWlmIChkcnYtPnJlbW92ZSkKKwkJaWYgKGRldi0+YnVzLT5yZW1vdmUpCisJCQlkZXYtPmJ1cy0+cmVtb3ZlKGRldik7CisJCWVsc2UgaWYgKGRydi0+cmVtb3ZlKQogCQkJZHJ2LT5yZW1vdmUoZGV2KTsKIAkJZGV2LT5kcml2ZXIgPSBOVUxMOwogCQlwdXRfZHJpdmVyKGRydik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMgYi9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKaW5kZXggMTYxZjNhMy4uYjQwMDMxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwpAQCAtMTcxLDYgKzE3MSwxMSBAQAogICovCiBpbnQgZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2KQogeworCWlmICgoZHJ2LT5idXMtPnByb2JlICYmIGRydi0+cHJvYmUpIHx8CisJICAgIChkcnYtPmJ1cy0+cmVtb3ZlICYmIGRydi0+cmVtb3ZlKSB8fAorCSAgICAoZHJ2LT5idXMtPnNodXRkb3duICYmIGRydi0+c2h1dGRvd24pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRyaXZlciAnJXMnIG5lZWRzIHVwZGF0aW5nIC0gcGxlYXNlIHVzZSBidXNfdHlwZSBtZXRob2RzXG4iLCBkcnYtPm5hbWUpOworCX0KIAlrbGlzdF9pbml0KCZkcnYtPmtsaXN0X2RldmljZXMsIGtsaXN0X2RldmljZXNfZ2V0LCBrbGlzdF9kZXZpY2VzX3B1dCk7CiAJaW5pdF9jb21wbGV0aW9uKCZkcnYtPnVubG9hZGVkKTsKIAlyZXR1cm4gYnVzX2FkZF9kcml2ZXIoZHJ2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKaW5kZXggM2QzODRlMy4uZTk3ZTkxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKKysrIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lb3V0OwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogZndfbG9hZF9hYm9ydChzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdikKIHsKIAlzZXRfYml0KEZXX1NUQVRVU19BQk9SVCwgJmZ3X3ByaXYtPnN0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCmluZGV4IDBmODE3MzEuLjQ2MTU1NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCkBAIC0zMjcsNyArMzI3LDcgQEAKICAqCUBwZGV2OglwbGF0Zm9ybSBkZXZpY2Ugd2UncmUgdW5yZWdpc3RlcmluZwogICoKICAqCVVucmVnaXN0cmF0aW9uIGlzIGRvbmUgaW4gMiBzdGVwcy4gRmlzcnQgd2UgcmVsZWFzZSBhbGwgcmVzb3VyY2VzCi0gKglhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHN5YnN5c3RlbSwgdGhlbiB3ZSBkcm9wIHJlZmVyZW5jZSBjb3VudCBieQorICoJYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBzdWJzeXN0ZW0sIHRoZW4gd2UgZHJvcCByZWZlcmVuY2UgY291bnQgYnkKICAqCWNhbGxpbmcgcGxhdGZvcm1fZGV2aWNlX3B1dCgpLgogICovCiB2b2lkIHBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiBwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3NodXRkb3duLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYwppbmRleCBmNTBhMDhiLi5jMjQ3NWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYwpAQCAtMzUsMTIgKzM1LDE1IEBACiAgKi8KIHZvaWQgZGV2aWNlX3NodXRkb3duKHZvaWQpCiB7Ci0Jc3RydWN0IGRldmljZSAqIGRldjsKKwlzdHJ1Y3QgZGV2aWNlICogZGV2LCAqZGV2bjsKIAogCWRvd25fd3JpdGUoJmRldmljZXNfc3Vic3lzLnJ3c2VtKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoZGV2LCAmZGV2aWNlc19zdWJzeXMua3NldC5saXN0LAorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKGRldiwgZGV2biwgJmRldmljZXNfc3Vic3lzLmtzZXQubGlzdCwKIAkJCQlrb2JqLmVudHJ5KSB7Ci0JCWlmIChkZXYtPmRyaXZlciAmJiBkZXYtPmRyaXZlci0+c2h1dGRvd24pIHsKKwkJaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5zaHV0ZG93bikgeworCQkJZGV2X2RiZyhkZXYsICJzaHV0ZG93blxuIik7CisJCQlkZXYtPmJ1cy0+c2h1dGRvd24oZGV2KTsKKwkJfSBlbHNlIGlmIChkZXYtPmRyaXZlciAmJiBkZXYtPmRyaXZlci0+c2h1dGRvd24pIHsKIAkJCWRldl9kYmcoZGV2LCAic2h1dGRvd25cbiIpOwogCQkJZGV2LT5kcml2ZXItPnNodXRkb3duKGRldik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbG9vcC5jIGIvZHJpdmVycy9ibG9jay9sb29wLmMKaW5kZXggODY0NzI5MC4uNWY2ZDFhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9sb29wLmMKKysrIGIvZHJpdmVycy9ibG9jay9sb29wLmMKQEAgLTI5NCw3ICsyOTQsNyBAQAogICogVGhpcyBoZWxwZXIganVzdCBmYWN0b3JzIG91dCBjb21tb24gY29kZSBiZXR3ZWVuIGRvX2xvX3NlbmRfZGlyZWN0X3dyaXRlKCkKICAqIGFuZCBkb19sb19zZW5kX3dyaXRlKCkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZG9fbG9fc2VuZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBpbnQgX19kb19sb19zZW5kX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAogCQl1OCBfX3VzZXIgKmJ1ZiwgY29uc3QgaW50IGxlbiwgbG9mZl90IHBvcykKIHsKIAlzc2l6ZV90IGJ3OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMgYi9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYwppbmRleCA1MWI3YTVjLi45M2FmZmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJcmV0dXJuIHJiX2VudHJ5KG4sIHN0cnVjdCBwa3RfcmJfbm9kZSwgcmJfbm9kZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwa3RfcmJ0cmVlX2VyYXNlKHN0cnVjdCBwa3RjZHZkX2RldmljZSAqcGQsIHN0cnVjdCBwa3RfcmJfbm9kZSAqbm9kZSkKK3N0YXRpYyB2b2lkIHBrdF9yYnRyZWVfZXJhc2Uoc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwZCwgc3RydWN0IHBrdF9yYl9ub2RlICpub2RlKQogewogCXJiX2VyYXNlKCZub2RlLT5yYl9ub2RlLCAmcGQtPmJpb19xdWV1ZSk7CiAJbWVtcG9vbF9mcmVlKG5vZGUsIHBkLT5yYl9wb29sKTsKQEAgLTMxNSw3ICszMTUsNyBAQAogLyoKICAqIEFkZCBhIGJpbyB0byBhIHNpbmdsZSBsaW5rZWQgbGlzdCBkZWZpbmVkIGJ5IGl0cyBoZWFkIGFuZCB0YWlsIHBvaW50ZXJzLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcGt0X2FkZF9saXN0X2xhc3Qoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgYmlvICoqbGlzdF9oZWFkLCBzdHJ1Y3QgYmlvICoqbGlzdF90YWlsKQorc3RhdGljIHZvaWQgcGt0X2FkZF9saXN0X2xhc3Qoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgYmlvICoqbGlzdF9oZWFkLCBzdHJ1Y3QgYmlvICoqbGlzdF90YWlsKQogewogCWJpby0+YmlfbmV4dCA9IE5VTEw7CiAJaWYgKCpsaXN0X3RhaWwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY3NwLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jCmluZGV4IDhmZGRmZGYuLjdiZDRlZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY3NwLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2Jjc3AuYwpAQCAtNDk0LDcgKzQ5NCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYmNzcF9jb21wbGV0ZV9yeF9wa3Qoc3RydWN0IGhjaV91YXJ0ICpodSkKK3N0YXRpYyB2b2lkIGJjc3BfY29tcGxldGVfcnhfcGt0KHN0cnVjdCBoY2lfdWFydCAqaHUpCiB7CiAJc3RydWN0IGJjc3Bfc3RydWN0ICpiY3NwID0gaHUtPnByaXY7CiAJaW50IHBhc3NfdXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMgYi9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKaW5kZXggNjY3YTIxYy4uN2FjMzY1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCisrKyBiL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYwpAQCAtMTI5LDcgKzEyOSw2IEBACiAgKiBtZW1vcnkgaWYgbGFyZ2UgbnVtYmVycyBvZiBzZXJpYWwgcG9ydHMgYXJlIG9wZW4uCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmOwotc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOwogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwppbmRleCBjYWVlY2MyLi5hMDgwY2RkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwpAQCAtMjIwLDcgKzIyMCw3IEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X3N0YXRlKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIHZvaWQgcjEyOF9lbWl0X3N0YXRlKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQogewogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAl1bnNpZ25lZCBpbnQgZGlydHkgPSBzYXJlYV9wcml2LT5kaXJ0eTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lc3AuYyBiL2RyaXZlcnMvY2hhci9lc3AuYwppbmRleCBlNDY5ZjY0Li5kZDVkYzhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZXNwLmMKKysrIGIvZHJpdmVycy9jaGFyL2VzcC5jCkBAIC0xNjAsNyArMTYwLDYgQEAKICAqIG1lbW9yeSBpZiBsYXJnZSBudW1iZXJzIG9mIHNlcmlhbCBwb3J0cyBhcmUgb3Blbi4KICAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKnRtcF9idWY7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKIAkJCQkJY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcm91dGluZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9nZW5lcmljX3NlcmlhbC5jIGIvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKaW5kZXggMjA0YTczMC4uZTM4YTVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKQEAgLTM0LDcgKzM0LDYgQEAKICNkZWZpbmUgREVCVUcgCiAKIHN0YXRpYyBjaGFyICogICAgICAgICAgICAgICAgICB0bXBfYnVmOyAKLXN0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogc3RhdGljIGludCBnc19kZWJ1ZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYyBiL2RyaXZlcnMvY2hhci9yaXNjb204LmMKaW5kZXggMDUwZTcwZS4uMTE5ZTYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYworKysgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCkBAIC04Miw3ICs4Miw2IEBACiBzdGF0aWMgc3RydWN0IHJpc2NvbV9ib2FyZCAqIElSUV90b19ib2FyZFsxNl07CiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnJpc2NvbV9kcml2ZXI7CiBzdGF0aWMgdW5zaWduZWQgY2hhciAqIHRtcF9idWY7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGJhdWRfdGFibGVbXSA9ICB7CiAJMCwgNTAsIDc1LCAxMTAsIDEzNCwgMTUwLCAyMDAsIDMwMCwgNjAwLCAxMjAwLCAxODAwLCAyNDAwLCA0ODAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jIGIvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jCmluZGV4IGYzNjM0MmEuLjAzN2M5NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYworKysgYi9kcml2ZXJzL2NoYXIvc2VyaWFsMTY3LmMKQEAgLTEyOSw3ICsxMjksNiBAQAogICogbWVtb3J5IGlmIGxhcmdlIG51bWJlcnMgb2Ygc2VyaWFsIHBvcnRzIGFyZSBvcGVuLgogICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciAqdG1wX2J1ZiA9IDA7Ci1ERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogLyoKICAqIFRoaXMgaXMgdXNlZCB0byBsb29rIHVwIHRoZSBkaXZpc29yIHNwZWVkcyBhbmQgdGhlIHRpbWVvdXRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMgYi9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKaW5kZXggMGE1NzRiZC4uNTM0M2U5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCisrKyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYwpAQCAtMTg0LDcgKzE4NCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc3BlY2lhbGl4X2RyaXZlcjsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICogdG1wX2J1ZjsKLXN0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYmF1ZF90YWJsZVtdID0gIHsKIAkwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCkBAIC0yNTU2LDggKzI1NTUsNiBAQAogCiAJZnVuY19lbnRlcigpOwogCi0JaW5pdF9NVVRFWCgmdG1wX2J1Zl9zZW0pOyAvKiBJbml0IGRlIHRoZSBzZW1hcGhvcmUgLSBwdmRsICovCi0KIAlpZiAoaW9iYXNlWzBdIHx8IGlvYmFzZVsxXSB8fCBpb2Jhc2VbMl0gfHwgaW9iYXNlWzNdKSB7CiAJCWZvcihpID0gMDsgaSA8IFNYX05CT0FSRDsgaSsrKSB7CiAJCQlzeF9ib2FyZFtpXS5iYXNlID0gaW9iYXNlW2ldOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwppbmRleCA5ZjFiNDY2Li5lZGU2ODhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwpAQCAtOTUxLDcgKzk1MSw2IEBACiAgKiBtZW1vcnkgaWYgbGFyZ2UgbnVtYmVycyBvZiBzZXJpYWwgcG9ydHMgYXJlIG9wZW4uCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmOwotc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOwogCiBzdGF0aWMgaW5saW5lIGludCBtZ3NsX3BhcmFub2lhX2NoZWNrKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywKIAkJCQkJY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcm91dGluZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKaW5kZXggYTY1NDQ3OS4uYzBkZmNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKQEAgLTM5NSwxMiArMzk1LDM4IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtYWNoendkLgogCitjb25maWcgU0JDX0VQWF9DM19XQVRDSERPRworCXRyaXN0YXRlICJXaW5zeXN0ZW1zIFNCQyBFUFgtQzMgd2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBidWlsdC1pbiB3YXRjaGRvZyB0aW1lciBvbiB0aGUgRVBYLUMzCisJICBTaW5nbGUtYm9hcmQgY29tcHV0ZXIgbWFkZSBieSBXaW5zeXN0ZW1zLCBJbmMuCisKKwkgICpOb3RlKjogVGhpcyBoYXJkd2FyZSB3YXRjaGRvZyBpcyBub3QgcHJvYmVhYmxlIGFuZCB0aHVzIHRoZXJlCisJICBpcyBubyB3YXkgdG8ga25vdyBpZiB3cml0aW5nIHRvIGl0cyBJTyBhZGRyZXNzIHdpbGwgY29ycnVwdAorCSAgeW91ciBzeXN0ZW0gb3IgaGF2ZSBhbnkgcmVhbCBlZmZlY3QuICBUaGUgb25seSB3YXkgdG8gYmUgc3VyZQorCSAgdGhhdCB0aGlzIGRyaXZlciBkb2VzIHdoYXQgeW91IHdhbnQgaXMgdG8gbWFrZSBzdXJlIHlvdQorCSAgYXJlIHJ1bm5uaW5nIGl0IG9uIGFuIEVQWC1DMyBmcm9tIFdpbnN5c3RlbXMgd2l0aCB0aGUgd2F0Y2hkb2cKKwkgIHRpbWVyIGF0IElPIGFkZHJlc3MgMHgxZWUgYW5kIDB4MWVmLiAgSXQgd2lsbCB3cml0ZSB0byBib3RoIHRob3NlCisJICBJTyBwb3J0cy4gIEJhc2ljYWxseSwgdGhlIGFzc3VtcHRpb24gaXMgbWFkZSB0aGF0IGlmIHlvdSBjb21waWxlCisJICB0aGlzIGRyaXZlciBpbnRvIHlvdXIga2VybmVsIGFuZC9vciBsb2FkIGl0IGFzIGEgbW9kdWxlLCB0aGF0IHlvdQorCSAga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgYW5kIHRoYXQgeW91IGFyZSBpbiBmYWN0IHJ1bm5pbmcgb24gYW4KKwkgIEVQWC1DMyBib2FyZCEKKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2JjX2VweF9jMy4KKworCiAjIFBvd2VyUEMgQXJjaGl0ZWN0dXJlCiAKIGNvbmZpZyA4eHhfV0RUCiAJdHJpc3RhdGUgIk1QQzh4eCBXYXRjaGRvZyBUaW1lciIKIAlkZXBlbmRzIG9uIFdBVENIRE9HICYmIDh4eAogCitjb25maWcgODN4eF9XRFQKKwl0cmlzdGF0ZSAiTVBDODN4eCBXYXRjaGRvZyBUaW1lciIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFBQQ184M3h4CisKIGNvbmZpZyBNVjY0WDYwX1dEVAogCXRyaXN0YXRlICJNVjY0WDYwIChNYXJ2ZWxsIERpc2NvdmVyeSkgV2F0Y2hkb2cgVGltZXIiCiAJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBNVjY0WDYwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUKaW5kZXggY2ZkMGEzOS4uMzZjMGIyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9NYWtlZmlsZQpAQCAtNTIsOSArNTIsMTEgQEAKIG9iai0kKENPTkZJR19XODM4NzdGX1dEVCkgKz0gdzgzODc3Zl93ZHQubwogb2JqLSQoQ09ORklHX1c4Mzk3N0ZfV0RUKSArPSB3ODM5NzdmX3dkdC5vCiBvYmotJChDT05GSUdfTUFDSFpfV0RUKSArPSBtYWNoendkLm8KK29iai0kKENPTkZJR19TQkNfRVBYX0MzX1dBVENIRE9HKSArPSBzYmNfZXB4X2MzLm8KIAogIyBQb3dlclBDIEFyY2hpdGVjdHVyZQogb2JqLSQoQ09ORklHXzh4eF9XRFQpICs9IG1wYzh4eF93ZHQubworb2JqLSQoQ09ORklHXzgzeHhfV0RUKSArPSBtcGM4M3h4X3dkdC5vCiBvYmotJChDT05GSUdfTVY2NFg2MF9XRFQpICs9IG12NjR4NjBfd2R0Lm8KIG9iai0kKENPTkZJR19CT09LRV9XRFQpICs9IGJvb2tlX3dkdC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9tcGM4M3h4X3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL21wYzgzeHhfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2ZjUwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9tcGM4M3h4X3dkdC5jCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogbXBjODN4eF93ZHQuYyAtIE1QQzgzeHggd2F0Y2hkb2cgdXNlcnNwYWNlIGludGVyZmFjZQorICoKKyAqIEF1dGhvcnM6IERhdmUgVXBkZWdyYWZmIDxkYXZlQGNyYXkub3JnPgorICogCSAgICBLdW1hciBHYWxhIDxnYWxha0BrZXJuZWwuY3Jhc2hpbmcub3JnPgorICogCQlBdHRyaWJ1dGlvbjogZnJvbSA4M3h4X3dzdDogRmxvcmlhbiBTY2hpcm1lciA8am9sdEB0dXhib3gub3JnPgorICogCQkJCS4uYW5kIGZyb20gc2M1MjBfd2R0CisgKgorICogTm90ZTogaXQgYXBwZWFycyB0aGF0IHlvdSBjYW4gb25seSBhY3R1YWxseSBFTkFCTEUgb3IgRElTQUJMRSB0aGUgdGhpbmcKKyAqIG9uY2UgYWZ0ZXIgUE9SLiBPbmNlIGVuYWJsZWQsIHlvdSBjYW5ub3QgZGlzYWJsZSwgYW5kIHZpY2UgdmVyc2EuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RydWN0IG1wYzgzeHhfd2R0IHsKKwlfX2JlMzIgcmVzMDsKKwlfX2JlMzIgc3djcnI7IC8qIFN5c3RlbSB3YXRjaGRvZyBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFNXQ1JSX1NXVEMgMHhGRkZGMDAwMCAvKiBTb2Z0d2FyZSBXYXRjaGRvZyBUaW1lIENvdW50LiAqLworI2RlZmluZSBTV0NSUl9TV0VOIDB4MDAwMDAwMDQgLyogV2F0Y2hkb2cgRW5hYmxlIGJpdC4gKi8KKyNkZWZpbmUgU1dDUlJfU1dSSSAweDAwMDAwMDAyIC8qIFNvZnR3YXJlIFdhdGNoZG9nIFJlc2V0L0ludGVycnVwdCBTZWxlY3QgYml0LiovCisjZGVmaW5lIFNXQ1JSX1NXUFIgMHgwMDAwMDAwMSAvKiBTb2Z0d2FyZSBXYXRjaGRvZyBDb3VudGVyIFByZXNjYWxlIGJpdC4gKi8KKwlfX2JlMzIgc3djbnI7IC8qIFN5c3RlbSB3YXRjaGRvZyBjb3VudCByZWdpc3RlciAqLworCXU4IHJlczFbMl07CisJX19iZTE2IHN3c3JyOyAvKiBTeXN0ZW0gd2F0Y2hkb2cgc2VydmljZSByZWdpc3RlciAqLworCXU4IHJlczJbMHhGMF07Cit9OworCitzdGF0aWMgc3RydWN0IG1wYzgzeHhfd2R0IF9faW9tZW0gKndkX2Jhc2U7CisKK3N0YXRpYyB1MTYgdGltZW91dCA9IDB4ZmZmZjsKK21vZHVsZV9wYXJhbSh0aW1lb3V0LCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiV2F0Y2hkb2cgdGltZW91dCBpbiB0aWNrcy4gKDA8dGltZW91dDw2NTUzNiwgZGVmYXVsdD02NTUzNSIpOworCitzdGF0aWMgaW50IHJlc2V0ID0gMTsKK21vZHVsZV9wYXJhbShyZXNldCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlc2V0LCAiV2F0Y2hkb2cgSW50ZXJydXB0L1Jlc2V0IE1vZGUuIDAgPSBpbnRlcnJ1cHQsIDEgPSByZXNldCIpOworCisvKgorICogV2UgYWx3YXlzIHByZXNjYWxlLCBidXQgaWYgc29tZW9uZSByZWFsbHkgZG9lc24ndCB3YW50IHRvIHRoZXkgY2FuIHNldCB0aGlzCisgKiB0byAwCisgKi8KK3N0YXRpYyBpbnQgcHJlc2NhbGUgPSAxOworc3RhdGljIHVuc2lnbmVkIGludCB0aW1lb3V0X3NlYzsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CitzdGF0aWMgc3BpbmxvY2tfdCB3ZHRfc3BpbmxvY2s7CisKK3N0YXRpYyB2b2lkIG1wYzgzeHhfd2R0X2tlZXBhbGl2ZSh2b2lkKQoreworCS8qIFBpbmcgdGhlIFdEVCAqLworCXNwaW5fbG9jaygmd2R0X3NwaW5sb2NrKTsKKwlvdXRfYmUxNigmd2RfYmFzZS0+c3dzcnIsIDB4NTU2Yyk7CisJb3V0X2JlMTYoJndkX2Jhc2UtPnN3c3JyLCAweGFhMzkpOworCXNwaW5fdW5sb2NrKCZ3ZHRfc3BpbmxvY2spOworfQorCitzdGF0aWMgc3NpemVfdCBtcGM4M3h4X3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGNvdW50KQorCQltcGM4M3h4X3dkdF9rZWVwYWxpdmUoKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgbXBjODN4eF93ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1MzIgdG1wID0gU1dDUlJfU1dFTjsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2R0X2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogT25jZSB3ZSBzdGFydCB0aGUgd2F0Y2hkb2cgd2UgY2FuJ3Qgc3RvcCBpdCAqLworCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwkvKiBHb29kLCBmaXJlIHVwIHRoZSBzaG93ICovCisJaWYgKHByZXNjYWxlKQorCQl0bXAgfD0gU1dDUlJfU1dQUjsKKwlpZiAocmVzZXQpCisJCXRtcCB8PSBTV0NSUl9TV1JJOworCisJdG1wIHw9IHRpbWVvdXQgPDwgMTY7CisKKwlvdXRfYmUzMigmd2RfYmFzZS0+c3djcnIsIHRtcCk7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgbXBjODN4eF93ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlwcmludGsoS0VSTl9DUklUICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwltcGM4M3h4X3dkdF9rZWVwYWxpdmUoKTsKKwljbGVhcl9iaXQoMCwgJndkdF9pc19vcGVuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGM4M3h4X3dkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0gV0RJT0ZfS0VFUEFMSVZFUElORywKKwkJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAorCQkuaWRlbnRpdHkgPSAiTVBDODN4eCIsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJbXBjODN4eF93ZHRfa2VlcGFsaXZlKCk7CisJCXJldHVybiAwOworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJcmV0dXJuIHB1dF91c2VyKHRpbWVvdXRfc2VjLCBwKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbXBjODN4eF93ZHRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IG1wYzgzeHhfd2R0X3dyaXRlLAorCS5pb2N0bAkJPSBtcGM4M3h4X3dkdF9pb2N0bCwKKwkub3BlbgkJPSBtcGM4M3h4X3dkdF9vcGVuLAorCS5yZWxlYXNlCT0gbXBjODN4eF93ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtcGM4M3h4X3dkdF9taXNjZGV2ID0geworCS5taW5vcgk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCT0gIndhdGNoZG9nIiwKKwkuZm9wcwk9ICZtcGM4M3h4X3dkdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgbXBjODN4eF93ZHRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCAqZnJlcSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwkvKiBnZXQgYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBtZW1vcnkgKi8KKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJaWYgKCFyKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwl3ZF9iYXNlID0gaW9yZW1hcChyLT5zdGFydCwgc2l6ZW9mIChzdHJ1Y3QgbXBjODN4eF93ZHQpKTsKKworCWlmICh3ZF9iYXNlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJm1wYzgzeHhfd2R0X21pc2NkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAiCisJCQkJIihlcnI9JWQpXG4iLAorCQkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQlnb3RvIGVycl91bm1hcDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdGhlIHRpbWVvdXQgaW4gc2Vjb25kcyAqLworCWlmIChwcmVzY2FsZSkKKwkJdGltZW91dF9zZWMgPSAodGltZW91dCAqIDB4MTAwMDApIC8gKCpmcmVxKTsKKwllbHNlCisJCXRpbWVvdXRfc2VjID0gdGltZW91dCAvICgqZnJlcSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJXRFQgZHJpdmVyIGZvciBNUEM4M3h4IGluaXRpYWxpemVkLiAiCisJCSJtb2RlOiVzIHRpbWVvdXQ9JWQgKCVkIHNlY29uZHMpXG4iLAorCQlyZXNldCA/ICJyZXNldCI6ImludGVycnVwdCIsIHRpbWVvdXQsIHRpbWVvdXRfc2VjKTsKKworCXNwaW5fbG9ja19pbml0KCZ3ZHRfc3BpbmxvY2spOworCisJcmV0dXJuIDA7CisKK2Vycl91bm1hcDoKKwlpb3VubWFwKHdkX2Jhc2UpOworZXJyX291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBtcGM4M3h4X3dkdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCW1pc2NfZGVyZWdpc3RlcigmbXBjODN4eF93ZHRfbWlzY2Rldik7CisJaW91bm1hcCh3ZF9iYXNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtcGM4M3h4X3dkdF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG1wYzgzeHhfd2R0X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobXBjODN4eF93ZHRfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibXBjODN4eF93ZHQiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtcGM4M3h4X3dkdF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXBjODN4eF93ZHRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1wYzgzeHhfd2R0X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXBjODN4eF93ZHRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXBjODN4eF93ZHRfaW5pdCk7Cittb2R1bGVfZXhpdChtcGM4M3h4X3dkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRGF2ZSBVcGRlZ3JhZmYsIEt1bWFyIEdhbGEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB3YXRjaGRvZyB0aW1lciBpbiBNUEM4M3h4IHVQcm9jZXNzb3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYmNfZXB4X2MzLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2JjX2VweF9jMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTc2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2JjX2VweF9jMy5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICoJU0JDIEVQWCBDMyAwLjEJQSBIYXJkd2FyZSBXYXRjaGRvZyBEZXZpY2UgZm9yIHRoZSBXaW5zeXN0ZW1zIEVQWC1DMworICoJc2luZ2xlIGJvYXJkIGNvbXB1dGVyCisgKgorICoJKGMpIENvcHlyaWdodCAyMDA2IENhbGluIEEuIEN1bGlhbnUgPGNhbGluQGFqdmFyLm9yZz4sIEFsbCBSaWdodHMKKyAqCVJlc2VydmVkLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJYmFzZWQgb24gc29mdGRvZy5jIGJ5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBQRlggImVweF9jMzogIgorc3RhdGljIGludCBlcHhfYzNfYWxpdmU7CisKKyNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCAxCQkvKiAxIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KKworc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKyNkZWZpbmUgRVBYQzNfV0FUQ0hET0dfQ1RMX1JFRyAweDFlZSAvKiB3cml0ZSAxIHRvIGVuYWJsZSwgMCB0byBkaXNhYmxlICovCisjZGVmaW5lIEVQWEMzX1dBVENIRE9HX1BFVF9SRUcgMHgxZWYgLyogd3JpdGUgYW55dGhpbmcgdG8gcGV0IG9uY2UgZW5hYmxlZCAqLworCitzdGF0aWMgdm9pZCBlcHhfYzNfc3RhcnQodm9pZCkKK3sKKwlvdXRiKDEsIEVQWEMzX1dBVENIRE9HX0NUTF9SRUcpOworfQorCitzdGF0aWMgdm9pZCBlcHhfYzNfc3RvcCh2b2lkKQoreworCisJb3V0YigwLCBFUFhDM19XQVRDSERPR19DVExfUkVHKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJTdG9wcGVkIHdhdGNoZG9nIHRpbWVyLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGVweF9jM19wZXQodm9pZCkKK3sKKwlvdXRiKDEsIEVQWEMzX1dBVENIRE9HX1BFVF9SRUcpOworfQorCisvKgorICoJQWxsb3cgb25seSBvbmUgcGVyc29uIHRvIGhvbGQgaXQgb3BlbgorICovCitzdGF0aWMgaW50IGVweF9jM19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChlcHhfYzNfYWxpdmUpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAobm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwkvKiBBY3RpdmF0ZSB0aW1lciAqLworCWVweF9jM19zdGFydCgpOworCWVweF9jM19wZXQoKTsKKworCWVweF9jM19hbGl2ZSA9IDE7CisJcHJpbnRrKEtFUk5fSU5GTyAiU3RhcnRlZCB3YXRjaGRvZyB0aW1lci5cbiIpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGVweF9jM19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIFNodXQgb2ZmIHRoZSB0aW1lci4KKwkgKiBMb2NrIGl0IGluIGlmIGl0J3MgYSBtb2R1bGUgYW5kIHdlIGRlZmluZWQgLi4uTk9XQVlPVVQgKi8KKwlpZiAoIW5vd2F5b3V0KQorCQllcHhfYzNfc3RvcCgpOwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCisJZXB4X2MzX2FsaXZlID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBlcHhfYzNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmRhdGEsCisJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJLyogUmVmcmVzaCB0aGUgdGltZXIuICovCisJaWYgKGxlbikKKwkJZXB4X2MzX3BldCgpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgZXB4X2MzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucwkJPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCQkJICBXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbgk9IDAsCisJCS5pZGVudGl0eQkJPSAiV2luc3lzdGVtcyBFUFgtQzMgSC9XIFdhdGNoZG9nIiwKKwl9OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCB3YXRjaGRvZ19pbmZvICopYXJnLAorCQkJCSAmaWRlbnQsIHNpemVvZihpZGVudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsKGludCAqKWFyZyk7CisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCWVweF9jM19wZXQoKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXR1cm4gcHV0X3VzZXIoV0FUQ0hET0dfVElNRU9VVCwoaW50ICopYXJnKTsKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6IHsKKwkJaWYgKGdldF91c2VyKG9wdGlvbnMsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKG9wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJZXB4X2MzX3N0b3AoKTsKKwkJCXJldHZhbCA9IDA7CisJCX0KKworCQlpZiAob3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCWVweF9jM19zdGFydCgpOworCQkJcmV0dmFsID0gMDsKKwkJfQorCisJCXJldHVybiByZXR2YWw7CisJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorfQorCitzdGF0aWMgaW50IGVweF9jM19ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCQkJCXZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKQorCQllcHhfYzNfc3RvcCgpOwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlcHhfYzNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IGVweF9jM193cml0ZSwKKwkuaW9jdGwJCT0gZXB4X2MzX2lvY3RsLAorCS5vcGVuCQk9IGVweF9jM19vcGVuLAorCS5yZWxlYXNlCT0gZXB4X2MzX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZXB4X2MzX21pc2NkZXYgPSB7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJCT0gJmVweF9jM19mb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBlcHhfYzNfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBlcHhfYzNfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPQorICAgIEtFUk5fSU5GTyBQRlggIkhhcmR3YXJlIFdhdGNoZG9nIFRpbWVyIGZvciBXaW5zeXN0ZW1zIEVQWC1DMyBTQkM6IDAuMVxuIjsKKworc3RhdGljIGludCBfX2luaXQgd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmVweF9jM19ub3RpZmllcik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyICIKKwkJCSIoZXJyPSVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZlcHhfYzNfbWlzY2Rldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAiCisJCQkiKGVycj0lZClcbiIsIFdBVENIRE9HX01JTk9SLCByZXQpOworCQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZXB4X2MzX25vdGlmaWVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoYmFubmVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd2F0Y2hkb2dfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmZXB4X2MzX21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZlcHhfYzNfbm90aWZpZXIpOworfQorCittb2R1bGVfaW5pdCh3YXRjaGRvZ19pbml0KTsKK21vZHVsZV9leGl0KHdhdGNoZG9nX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJDYWxpbiBBLiBDdWxpYW51IDxjYWxpbkBhanZhci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhcmR3YXJlIFdhdGNoZG9nIERldmljZSBmb3IgV2luc3lzdGVtcyBFUFgtQzMgU0JDLiAgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHdheSB0byBwcm9iZSBmb3IgdGhpcyBkZXZpY2UgLS0gc28gb25seSB1c2UgaXQgaWYgeW91IGFyZSAqc3VyZSogeW91IGFyZSBydW5ubmluZyBvbiB0aGlzIHNwZWNpZmljIFNCQyBzeXN0ZW0gZnJvbSBXaW5zeXN0ZW1zISAgSXQgd3JpdGVzIHRvIElPIHBvcnRzIDB4MWVlIGFuZCAweDFlZiEiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCmluZGV4IGE5MTYzZDAuLjI3N2E4NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwpAQCAtNDEsNyArNDEsNiBAQAogLyogaW50ZXJuYWwgcHJvdG90eXBlcyAqLwogc3RhdGljIGludCBfX2NwdWZyZXFfZ292ZXJub3Ioc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHVuc2lnbmVkIGludCBldmVudCk7CiBzdGF0aWMgdm9pZCBoYW5kbGVfdXBkYXRlKHZvaWQgKmRhdGEpOwotc3RhdGljIGlubGluZSB2b2lkIGFkanVzdF9qaWZmaWVzKHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqY2kpOwogCiAvKioKICAqIFR3byBub3RpZmllciBsaXN0czogdGhlICJwb2xpY3kiIGxpc3QgaXMgaW52b2x2ZWQgaW4gdGhlIApAQCAtMTI3LDcgKzEyNiw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGRpc2FibGVfcmF0ZWxpbWl0ID0gMTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGlzYWJsZV9yYXRlbGltaXRfbG9jayk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlYnVnX2VuYWJsZV9yYXRlbGltaXQodm9pZCkKK3N0YXRpYyB2b2lkIGNwdWZyZXFfZGVidWdfZW5hYmxlX3JhdGVsaW1pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEzNyw3ICsxMzYsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpc2FibGVfcmF0ZWxpbWl0X2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNwdWZyZXFfZGVidWdfZGlzYWJsZV9yYXRlbGltaXQodm9pZCkKK3N0YXRpYyB2b2lkIGNwdWZyZXFfZGVidWdfZGlzYWJsZV9yYXRlbGltaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yMDYsNyArMjA1LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxfcF9qX3JlZjsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgIGxfcF9qX3JlZl9mcmVxOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRqdXN0X2ppZmZpZXModW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBjcHVmcmVxX2ZyZXFzICpjaSkKK3N0YXRpYyB2b2lkIGFkanVzdF9qaWZmaWVzKHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqY2kpCiB7CiAJaWYgKGNpLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGlvL2Rpby1kcml2ZXIuYyBiL2RyaXZlcnMvZGlvL2Rpby1kcml2ZXIuYwppbmRleCBmZmU2ZjQ0Li5jYThlNjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Rpby9kaW8tZHJpdmVyLmMKKysrIGIvZHJpdmVycy9kaW8vZGlvLWRyaXZlci5jCkBAIC04Myw3ICs4Myw2IEBACiAJLyogaW5pdGlhbGl6ZSBjb21tb24gZHJpdmVyIGZpZWxkcyAqLwogCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7CiAJZHJ2LT5kcml2ZXIuYnVzID0gJmRpb19idXNfdHlwZTsKLQlkcnYtPmRyaXZlci5wcm9iZSA9IGRpb19kZXZpY2VfcHJvYmU7CiAKIAkvKiByZWdpc3RlciB3aXRoIGNvcmUgKi8KIAljb3VudCA9IGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwpAQCAtMTQ1LDcgKzE0NCw4IEBACiAKIHN0cnVjdCBidXNfdHlwZSBkaW9fYnVzX3R5cGUgPSB7CiAJLm5hbWUJPSAiZGlvIiwKLQkubWF0Y2gJPSBkaW9fYnVzX21hdGNoCisJLm1hdGNoCT0gZGlvX2J1c19tYXRjaCwKKwkucHJvYmUJPSBkaW9fZGV2aWNlX3Byb2JlLAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RlbGxfcmJ1LmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RlbGxfcmJ1LmMKaW5kZXggZGZlZGI3Ny4uZmRiOGIwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kZWxsX3JidS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZGVsbF9yYnUuYwpAQCAtNDksNyArNDksNyBAQAogTU9EVUxFX0FVVEhPUigiQWJoYXkgU2FsdW5rZSA8YWJoYXlfc2FsdW5rZUBkZWxsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB1cGRhdGluZyBCSU9TIGltYWdlIG9uIERFTEwgc3lzdGVtcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX1ZFUlNJT04oIjMuMSIpOworTU9EVUxFX1ZFUlNJT04oIjMuMiIpOwogCiAjZGVmaW5lIEJJT1NfU0NBTl9MSU1JVCAweGZmZmZmZmZmCiAjZGVmaW5lIE1BWF9JTUFHRV9MRU5HVEggMTYKQEAgLTU2NCwxMiArNTY0LDEwIEBACiAKIHN0YXRpYyB2b2lkIGNhbGxiYWNrZm5fcmJ1KGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKmNvbnRleHQpCiB7Ci0JaW50IHJjID0gMDsKKwlyYnVfZGF0YS5lbnRyeV9jcmVhdGVkID0gMDsKIAotCWlmICghZncgfHwgIWZ3LT5zaXplKSB7Ci0JCXJidV9kYXRhLmVudHJ5X2NyZWF0ZWQgPSAwOworCWlmICghZncgfHwgIWZ3LT5zaXplKQogCQlyZXR1cm47Ci0JfQogCiAJc3Bpbl9sb2NrKCZyYnVfZGF0YS5sb2NrKTsKIAlpZiAoIXN0cmNtcChpbWFnZV90eXBlLCAibW9ubyIpKSB7CkBAIC01OTIsMTUgKzU5MCw2IEBACiAJfSBlbHNlCiAJCXByX2RlYnVnKCJpbnZhbGlkIGltYWdlIHR5cGUgc3BlY2lmaWVkLlxuIik7CiAJc3Bpbl91bmxvY2soJnJidV9kYXRhLmxvY2spOwotCi0JcmMgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgRldfQUNUSU9OX05PSE9UUExVRywKLQkJImRlbGxfcmJ1IiwgJnJidV9kZXZpY2UtPmRldiwgJmNvbnRleHQsIGNhbGxiYWNrZm5fcmJ1KTsKLQlpZiAocmMpCi0JCXByaW50ayhLRVJOX0VSUgotCQkJImRlbGxfcmJ1OiVzIHJlcXVlc3RfZmlybXdhcmVfbm93YWl0IGZhaWxlZCIKLQkJCSIgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmMpOwotCWVsc2UKLQkJcmJ1X2RhdGEuZW50cnlfY3JlYXRlZCA9IDE7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHJlYWRfcmJ1X2ltYWdlX3R5cGUoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZmZlciwKQEAgLTczNSwxNCArNzI0LDcgQEAKIAlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnJidV9kZXZpY2UtPmRldi5rb2JqLAogCQkmcmJ1X3BhY2tldF9zaXplX2F0dHIpOwogCi0JcmMgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgRldfQUNUSU9OX05PSE9UUExVRywKLQkJImRlbGxfcmJ1IiwgJnJidV9kZXZpY2UtPmRldiwgJmNvbnRleHQsIGNhbGxiYWNrZm5fcmJ1KTsKLQlpZiAocmMpCi0JCXByaW50ayhLRVJOX0VSUiAiZGVsbF9yYnU6JXM6cmVxdWVzdF9maXJtd2FyZV9ub3dhaXQiCi0JCQkiIGZhaWxlZCAlZFxuIiwgX19GVU5DVElPTl9fLCByYyk7Ci0JZWxzZQotCQlyYnVfZGF0YS5lbnRyeV9jcmVhdGVkID0gMTsKLQorCXJidV9kYXRhLmVudHJ5X2NyZWF0ZWQgPSAwOwogCXJldHVybiByYzsKIAogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKaW5kZXggNTJiNzc0Ny4uMGNlNThiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCkBAIC02MywxMyArNjMsNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RydWN0IGJ1c190eXBlIGkyY19idXNfdHlwZSA9IHsKLQkubmFtZSA9CQkiaTJjIiwKLQkubWF0Y2ggPQlpMmNfZGV2aWNlX21hdGNoLAotCS5zdXNwZW5kID0gICAgICBpMmNfYnVzX3N1c3BlbmQsCi0JLnJlc3VtZSA9ICAgICAgIGkyY19idXNfcmVzdW1lLAotfTsKLQogc3RhdGljIGludCBpMmNfZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTgwLDYgKzczLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBidXNfdHlwZSBpMmNfYnVzX3R5cGUgPSB7CisJLm5hbWUgPQkJImkyYyIsCisJLm1hdGNoID0JaTJjX2RldmljZV9tYXRjaCwKKwkucHJvYmUgPQlpMmNfZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUgPQlpMmNfZGV2aWNlX3JlbW92ZSwKKwkuc3VzcGVuZCA9ICAgICAgaTJjX2J1c19zdXNwZW5kLAorCS5yZXN1bWUgPSAgICAgICBpMmNfYnVzX3Jlc3VtZSwKK307CisKIHZvaWQgaTJjX2FkYXB0ZXJfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9IGRldl90b19pMmNfYWRhcHRlcihkZXYpOwpAQCAtOTAsOCArOTIsNiBAQAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5uYW1lID0JImkyY19hZGFwdGVyIiwKIAkuYnVzID0gJmkyY19idXNfdHlwZSwKLQkucHJvYmUgPSBpMmNfZGV2aWNlX3Byb2JlLAotCS5yZW1vdmUgPSBpMmNfZGV2aWNlX3JlbW92ZSwKIH07CiAKIHN0YXRpYyB2b2lkIGkyY19hZGFwdGVyX2NsYXNzX2Rldl9yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldikKQEAgLTI5NCw4ICsyOTQsNiBAQAogCS8qIGFkZCB0aGUgZHJpdmVyIHRvIHRoZSBsaXN0IG9mIGkyYyBkcml2ZXJzIGluIHRoZSBkcml2ZXIgY29yZSAqLwogCWRyaXZlci0+ZHJpdmVyLm93bmVyID0gb3duZXI7CiAJZHJpdmVyLT5kcml2ZXIuYnVzID0gJmkyY19idXNfdHlwZTsKLQlkcml2ZXItPmRyaXZlci5wcm9iZSA9IGkyY19kZXZpY2VfcHJvYmU7Ci0JZHJpdmVyLT5kcml2ZXIucmVtb3ZlID0gaTJjX2RldmljZV9yZW1vdmU7CiAKIAlyZXMgPSBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJpdmVyKTsKIAlpZiAocmVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmMgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwppbmRleCA5YjJlYmQyLi4zMzI1NjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2QuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwpAQCAtOTgwLDcgKzk4MCw3IEBACiAgKiBhbmQgYXR0ZW1wdCB0byByZWNvdmVyIGlmIHRoZXJlIGFyZSBwcm9ibGVtcy4gIFJldHVybnMgIDAgaWYgZXZlcnl0aGluZydzCiAgKiBvazsgbm9uemVybyBpZiB0aGUgcmVxdWVzdCBoYXMgYmVlbiB0ZXJtaW5hdGVkLgogICovCi1zdGF0aWMgaW5saW5lCitzdGF0aWMKIGludCBjZHJvbV9yZWFkX2NoZWNrX2lyZWFzb24gKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGxlbiwgaW50IGlyZWFzb24pCiB7CiAJaWYgKGlyZWFzb24gPT0gMikKQEAgLTE1MzksNyArMTUzOSw3IEBACiAvKgogICogV3JpdGUgaGFuZGxpbmcKICAqLwotc3RhdGljIGlubGluZSBpbnQgY2Ryb21fd3JpdGVfY2hlY2tfaXJlYXNvbihpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBsZW4sIGludCBpcmVhc29uKQorc3RhdGljIGludCBjZHJvbV93cml0ZV9jaGVja19pcmVhc29uKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGxlbiwgaW50IGlyZWFzb24pCiB7CiAJLyogVHdvIG5vdGVzIGFib3V0IElERSBpbnRlcnJ1cHQgcmVhc29uIGhlcmUgLSAwIG1lYW5zIHRoYXQKIAkgKiB0aGUgZHJpdmUgd2FudHMgdG8gcmVjZWl2ZSBkYXRhIGZyb20gdXMsIDIgbWVhbnMgdGhhdApAQCAtMzI1Niw5ICszMjU2LDggQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IGlkZV9jZF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaWRlX2NkX3JlbW92ZShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOwogCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCiAJaWRlX3VucmVnaXN0ZXJfc3ViZHJpdmVyKGRyaXZlLCBpbmZvLT5kcml2ZXIpOwpAQCAtMzI2Niw4ICszMjY1LDYgQEAKIAlkZWxfZ2VuZGlzayhpbmZvLT5kaXNrKTsKIAogCWlkZV9jZF9wdXQoaW5mbyk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgaWRlX2NkX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCkBAIC0zMjkxLDcgKzMyODgsNyBAQAogCWtmcmVlKGluZm8pOwogfQogCi1zdGF0aWMgaW50IGlkZV9jZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIGludCBpZGVfY2RfcHJvYmUoaWRlX2RyaXZlX3QgKik7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIGludCBwcm9jX2lkZWNkX3JlYWRfY2FwYWNpdHkKQEAgLTMzMTcsOSArMzMxNCw5IEBACiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJCT0gImlkZS1jZHJvbSIsCiAJCS5idXMJCT0gJmlkZV9idXNfdHlwZSwKLQkJLnByb2JlCQk9IGlkZV9jZF9wcm9iZSwKLQkJLnJlbW92ZQkJPSBpZGVfY2RfcmVtb3ZlLAogCX0sCisJLnByb2JlCQkJPSBpZGVfY2RfcHJvYmUsCisJLnJlbW92ZQkJCT0gaWRlX2NkX3JlbW92ZSwKIAkudmVyc2lvbgkJPSBJREVDRF9WRVJTSU9OLAogCS5tZWRpYQkJCT0gaWRlX2Nkcm9tLAogCS5zdXBwb3J0c19kc2Nfb3ZlcmxhcAk9IDEsCkBAIC0zNDEzLDkgKzM0MTAsOCBAQAogbW9kdWxlX3BhcmFtKGlnbm9yZSwgY2hhcnAsIDA0MDApOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBVEFQSSBDRC1ST00gRHJpdmVyIik7CiAKLXN0YXRpYyBpbnQgaWRlX2NkX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaWRlX2NkX3Byb2JlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7CiAJc3RydWN0IGNkcm9tX2luZm8gKmluZm87CiAJc3RydWN0IGdlbmRpc2sgKmc7CiAJc3RydWN0IHJlcXVlc3Rfc2Vuc2Ugc2Vuc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZGlzay5jIGIvZHJpdmVycy9pZGUvaWRlLWRpc2suYwppbmRleCBjYWIzNjJlLi5jYTI1ZjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCSAgICAgICAmJiBpZC0+bGJhX2NhcGFjaXR5XzI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVkaXNrX2NoZWNrX2hwYShpZGVfZHJpdmVfdCAqZHJpdmUpCitzdGF0aWMgdm9pZCBpZGVkaXNrX2NoZWNrX2hwYShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIGNhcGFjaXR5LCBzZXRfbWF4OwogCWludCBsYmE0OCA9IGlkZWRpc2tfc3VwcG9ydHNfbGJhNDgoZHJpdmUtPmlkKTsKQEAgLTk5Nyw5ICs5OTcsOCBAQAogCQlwcmludGsoS0VSTl9JTkZPICIlczogd2NhY2hlIGZsdXNoIGZhaWxlZCFcbiIsIGRyaXZlLT5uYW1lKTsKIH0KIAotc3RhdGljIGludCBpZGVfZGlza19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaWRlX2Rpc2tfcmVtb3ZlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7CiAJc3RydWN0IGlkZV9kaXNrX29iaiAqaWRrcCA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgZ2VuZGlzayAqZyA9IGlka3AtPmRpc2s7CiAKQEAgLTEwMTAsOCArMTAwOSw2IEBACiAJaWRlX2NhY2hlZmx1c2hfcChkcml2ZSk7CiAKIAlpZGVfZGlza19wdXQoaWRrcCk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgaWRlX2Rpc2tfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKQEAgLTEwMjcsMTIgKzEwMjQsMTAgQEAKIAlrZnJlZShpZGtwKTsKIH0KIAotc3RhdGljIGludCBpZGVfZGlza19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpZGVfZGlza19wcm9iZShpZGVfZHJpdmVfdCAqZHJpdmUpOwogCi1zdGF0aWMgdm9pZCBpZGVfZGV2aWNlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlkZV9kZXZpY2Vfc2h1dGRvd24oaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9kcml2ZV90ICpkcml2ZSA9IGNvbnRhaW5lcl9vZihkZXYsIGlkZV9kcml2ZV90LCBnZW5kZXYpOwotCiAjaWZkZWYJQ09ORklHX0FMUEhBCiAJLyogT24gQWxwaGEsIGhhbHQoOCkgZG9lc24ndCBhY3R1YWxseSB0dXJuIHRoZSBtYWNoaW5lIG9mZiwKIAkgICBpdCBwdXRzIHlvdSBpbnRvIHRoZSBzb3J0IG9mIGZpcm13YXJlIG1vbml0b3IuIFR5cGljYWxseSwKQEAgLTEwNTQsNyArMTA0OSw3IEBACiAJfQogCiAJcHJpbnRrKCJTaHV0ZG93bjogJXNcbiIsIGRyaXZlLT5uYW1lKTsKLQlkZXYtPmJ1cy0+c3VzcGVuZChkZXYsIFBNU0dfU1VTUEVORCk7CisJZHJpdmUtPmdlbmRldi5idXMtPnN1c3BlbmQoJmRyaXZlLT5nZW5kZXYsIFBNU0dfU1VTUEVORCk7CiB9CiAKIHN0YXRpYyBpZGVfZHJpdmVyX3QgaWRlZGlza19kcml2ZXIgPSB7CkBAIC0xMDYyLDEwICsxMDU3LDEwIEBACiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJCT0gImlkZS1kaXNrIiwKIAkJLmJ1cwkJPSAmaWRlX2J1c190eXBlLAotCQkucHJvYmUJCT0gaWRlX2Rpc2tfcHJvYmUsCi0JCS5yZW1vdmUJCT0gaWRlX2Rpc2tfcmVtb3ZlLAotCQkuc2h1dGRvd24JPSBpZGVfZGV2aWNlX3NodXRkb3duLAogCX0sCisJLnByb2JlCQkJPSBpZGVfZGlza19wcm9iZSwKKwkucmVtb3ZlCQkJPSBpZGVfZGlza19yZW1vdmUsCisJLnNodXRkb3duCQk9IGlkZV9kZXZpY2Vfc2h1dGRvd24sCiAJLnZlcnNpb24JCT0gSURFRElTS19WRVJTSU9OLAogCS5tZWRpYQkJCT0gaWRlX2Rpc2ssCiAJLnN1cHBvcnRzX2RzY19vdmVybGFwCT0gMCwKQEAgLTExODIsOSArMTE3Nyw4IEBACiAKIE1PRFVMRV9ERVNDUklQVElPTigiQVRBIERJU0sgRHJpdmVyIik7CiAKLXN0YXRpYyBpbnQgaWRlX2Rpc2tfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBpZGVfZGlza19wcm9iZShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOwogCXN0cnVjdCBpZGVfZGlza19vYmogKmlka3A7CiAJc3RydWN0IGdlbmRpc2sgKmc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwppbmRleCA1OTQ1ZjU1Li4xZjhkYjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCkBAIC0xODcxLDkgKzE4NzEsOCBAQAogCWlkZWZsb3BweV9hZGRfc2V0dGluZ3MoZHJpdmUpOwogfQogCi1zdGF0aWMgaW50IGlkZV9mbG9wcHlfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlkZV9mbG9wcHlfcmVtb3ZlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7CiAJaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IGdlbmRpc2sgKmcgPSBmbG9wcHktPmRpc2s7CiAKQEAgLTE4ODIsOCArMTg4MSw2IEBACiAJZGVsX2dlbmRpc2soZyk7CiAKIAlpZGVfZmxvcHB5X3B1dChmbG9wcHkpOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGlkZV9mbG9wcHlfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKQEAgLTE5MjIsMTYgKzE5MTksMTYgQEAKIAogI2VuZGlmCS8qIENPTkZJR19QUk9DX0ZTICovCiAKLXN0YXRpYyBpbnQgaWRlX2Zsb3BweV9wcm9iZShzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIGludCBpZGVfZmxvcHB5X3Byb2JlKGlkZV9kcml2ZV90ICopOwogCiBzdGF0aWMgaWRlX2RyaXZlcl90IGlkZWZsb3BweV9kcml2ZXIgPSB7CiAJLmdlbl9kcml2ZXIgPSB7CiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJCT0gImlkZS1mbG9wcHkiLAogCQkuYnVzCQk9ICZpZGVfYnVzX3R5cGUsCi0JCS5wcm9iZQkJPSBpZGVfZmxvcHB5X3Byb2JlLAotCQkucmVtb3ZlCQk9IGlkZV9mbG9wcHlfcmVtb3ZlLAogCX0sCisJLnByb2JlCQkJPSBpZGVfZmxvcHB5X3Byb2JlLAorCS5yZW1vdmUJCQk9IGlkZV9mbG9wcHlfcmVtb3ZlLAogCS52ZXJzaW9uCQk9IElERUZMT1BQWV9WRVJTSU9OLAogCS5tZWRpYQkJCT0gaWRlX2Zsb3BweSwKIAkuc3VwcG9ydHNfZHNjX292ZXJsYXAJPSAwLApAQCAtMjEzNiw5ICsyMTMzLDggQEAKIAkucmV2YWxpZGF0ZV9kaXNrPSBpZGVmbG9wcHlfcmV2YWxpZGF0ZV9kaXNrCiB9OwogCi1zdGF0aWMgaW50IGlkZV9mbG9wcHlfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBpZGVfZmxvcHB5X3Byb2JlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7CiAJaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHk7CiAJc3RydWN0IGdlbmRpc2sgKmc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMgYi9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCmluZGV4IGZhYjliMmIuLjAxMDFkMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwpAQCAtNDY4Miw5ICs0NjgyLDggQEAKIAlpZGV0YXBlX2FkZF9zZXR0aW5ncyhkcml2ZSk7CiB9CiAKLXN0YXRpYyBpbnQgaWRlX3RhcGVfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlkZV90YXBlX3JlbW92ZShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOwogCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCiAJaWRlX3VucmVnaXN0ZXJfc3ViZHJpdmVyKGRyaXZlLCB0YXBlLT5kcml2ZXIpOwpAQCAtNDY5Miw4ICs0NjkxLDYgQEAKIAlpZGVfdW5yZWdpc3Rlcl9yZWdpb24odGFwZS0+ZGlzayk7CiAKIAlpZGVfdGFwZV9wdXQodGFwZSk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgaWRlX3RhcGVfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKQEAgLTQ3NDUsMTYgKzQ3NDIsMTYgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyBpbnQgaWRlX3RhcGVfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyBpbnQgaWRlX3RhcGVfcHJvYmUoaWRlX2RyaXZlX3QgKik7CiAKIHN0YXRpYyBpZGVfZHJpdmVyX3QgaWRldGFwZV9kcml2ZXIgPSB7CiAJLmdlbl9kcml2ZXIgPSB7CiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJCT0gImlkZS10YXBlIiwKIAkJLmJ1cwkJPSAmaWRlX2J1c190eXBlLAotCQkucHJvYmUJCT0gaWRlX3RhcGVfcHJvYmUsCi0JCS5yZW1vdmUJCT0gaWRlX3RhcGVfcmVtb3ZlLAogCX0sCisJLnByb2JlCQkJPSBpZGVfdGFwZV9wcm9iZSwKKwkucmVtb3ZlCQkJPSBpZGVfdGFwZV9yZW1vdmUsCiAJLnZlcnNpb24JCT0gSURFVEFQRV9WRVJTSU9OLAogCS5tZWRpYQkJCT0gaWRlX3RhcGUsCiAJLnN1cHBvcnRzX2RzY19vdmVybGFwIAk9IDEsCkBAIC00ODI1LDkgKzQ4MjIsOCBAQAogCS5pb2N0bAkJPSBpZGV0YXBlX2lvY3RsLAogfTsKIAotc3RhdGljIGludCBpZGVfdGFwZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGlkZV90YXBlX3Byb2JlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7CiAJaWRldGFwZV90YXBlX3QgKnRhcGU7CiAJc3RydWN0IGdlbmRpc2sgKmc7CiAJaW50IG1pbm9yOwpAQCAtNDg4Myw5ICs0ODc5LDkgQEAKIAlpZGV0YXBlX3NldHVwKGRyaXZlLCB0YXBlLCBtaW5vcik7CiAKIAljbGFzc19kZXZpY2VfY3JlYXRlKGlkZXRhcGVfc3lzZnNfY2xhc3MsIE5VTEwsCi0JCQlNS0RFVihJREVUQVBFX01BSk9SLCBtaW5vciksIGRldiwgIiVzIiwgdGFwZS0+bmFtZSk7CisJCQlNS0RFVihJREVUQVBFX01BSk9SLCBtaW5vciksICZkcml2ZS0+Z2VuZGV2LCAiJXMiLCB0YXBlLT5uYW1lKTsKIAljbGFzc19kZXZpY2VfY3JlYXRlKGlkZXRhcGVfc3lzZnNfY2xhc3MsIE5VTEwsCi0JCQlNS0RFVihJREVUQVBFX01BSk9SLCBtaW5vciArIDEyOCksIGRldiwgIm4lcyIsIHRhcGUtPm5hbWUpOworCQkJTUtERVYoSURFVEFQRV9NQUpPUiwgbWlub3IgKyAxMjgpLCAmZHJpdmUtPmdlbmRldiwgIm4lcyIsIHRhcGUtPm5hbWUpOwogCiAJZGV2ZnNfbWtfY2RldihNS0RFVihIV0lGKGRyaXZlKS0+bWFqb3IsIG1pbm9yKSwKIAkJCVNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKaW5kZXggNjJlYmVmZC4uOTgzNGRjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKQEAgLTMwOCw3ICszMDgsNyBAQAogCQlpZGVfcGlvX3NlY3Rvcihkcml2ZSwgd3JpdGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaWRlX3Bpb19kYXRhYmxvY2soaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCitzdGF0aWMgdm9pZCBpZGVfcGlvX2RhdGFibG9jayhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwKIAkJCQkgICAgIHVuc2lnbmVkIGludCB3cml0ZSkKIHsKIAlpZiAocnEtPmJpbykJLyogZnMgcmVxdWVzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLmMgYi9kcml2ZXJzL2lkZS9pZGUuYwppbmRleCBlYzVhNGNiLi5hZmViMDJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLmMKQEAgLTE5NDksMTAgKzE5NDksNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBnZW5lcmljX2lkZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOworCWlkZV9kcml2ZXJfdCAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlyZXR1cm4gZHJ2LT5wcm9iZSA/IGRydi0+cHJvYmUoZHJpdmUpIDogLUVOT0RFVjsKK30KKworc3RhdGljIGludCBnZW5lcmljX2lkZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKKwlpZGVfZHJpdmVyX3QgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKGRydi0+cmVtb3ZlKQorCQlkcnYtPnJlbW92ZShkcml2ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJpY19pZGVfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKKwlpZGVfZHJpdmVyX3QgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c2h1dGRvd24pCisJCWRydi0+c2h1dGRvd24oZHJpdmUpOworfQorCiBzdHJ1Y3QgYnVzX3R5cGUgaWRlX2J1c190eXBlID0gewogCS5uYW1lCQk9ICJpZGUiLAogCS5tYXRjaAkJPSBpZGVfYnVzX21hdGNoLAogCS51ZXZlbnQJCT0gaWRlX3VldmVudCwKKwkucHJvYmUJCT0gZ2VuZXJpY19pZGVfcHJvYmUsCisJLnJlbW92ZQkJPSBnZW5lcmljX2lkZV9yZW1vdmUsCisJLnNodXRkb3duCT0gZ2VuZXJpY19pZGVfc2h1dGRvd24sCiAJLmRldl9hdHRycwk9IGlkZV9kZXZfYXR0cnMsCiAJLnN1c3BlbmQJPSBnZW5lcmljX2lkZV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gZ2VuZXJpY19pZGVfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtLmMKaW5kZXggM2E2MTFmZS4uMjUxNGRlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbS5jCkBAIC04NTYsNyArODU2LDcgQEAKIAkJICAgICAgIHBhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY21fdmFsaWRhdGVfcmVxX3BhcmFtKHN0cnVjdCBpYl9jbV9yZXFfcGFyYW0gKnBhcmFtKQorc3RhdGljIGludCBjbV92YWxpZGF0ZV9yZXFfcGFyYW0oc3RydWN0IGliX2NtX3JlcV9wYXJhbSAqcGFyYW0pCiB7CiAJLyogcGVlci10by1wZWVyIG5vdCBzdXBwb3J0ZWQgKi8KIAlpZiAocGFyYW0tPnBlZXJfdG9fcGVlcikKQEAgLTEwMDUsNyArMTAwNSw3IEBACiAJCSAoYmUzMl90b19jcHUobG9jYWxfcXBuKSA+IGJlMzJfdG9fY3B1KHJlbW90ZV9xcG4pKSkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY21fZm9ybWF0X3BhdGhzX2Zyb21fcmVxKHN0cnVjdCBjbV9yZXFfbXNnICpyZXFfbXNnLAorc3RhdGljIHZvaWQgY21fZm9ybWF0X3BhdGhzX2Zyb21fcmVxKHN0cnVjdCBjbV9yZXFfbXNnICpyZXFfbXNnLAogCQkJCQkgICAgc3RydWN0IGliX3NhX3BhdGhfcmVjICpwcmltYXJ5X3BhdGgsCiAJCQkJCSAgICBzdHJ1Y3QgaWJfc2FfcGF0aF9yZWMgKmFsdF9wYXRoKQogewpAQCAtMzE2MywyMiArMzE2Myw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGliX2NtX2luaXRfcXBfYXR0cik7CiAKLXN0YXRpYyBfX2JlNjQgY21fZ2V0X2NhX2d1aWQoc3RydWN0IGliX2RldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBpYl9kZXZpY2VfYXR0ciAqZGV2aWNlX2F0dHI7Ci0JX19iZTY0IGd1aWQ7Ci0JaW50IHJldDsKLQotCWRldmljZV9hdHRyID0ga21hbGxvYyhzaXplb2YgKmRldmljZV9hdHRyLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldmljZV9hdHRyKQotCQlyZXR1cm4gMDsKLQotCXJldCA9IGliX3F1ZXJ5X2RldmljZShkZXZpY2UsIGRldmljZV9hdHRyKTsKLQlndWlkID0gcmV0ID8gMCA6IGRldmljZV9hdHRyLT5ub2RlX2d1aWQ7Ci0Ja2ZyZWUoZGV2aWNlX2F0dHIpOwotCXJldHVybiBndWlkOwotfQotCiBzdGF0aWMgdm9pZCBjbV9hZGRfb25lKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgY21fZGV2aWNlICpjbV9kZXY7CkBAIC0zMjAwLDkgKzMxODQsNyBAQAogCQlyZXR1cm47CiAKIAljbV9kZXYtPmRldmljZSA9IGRldmljZTsKLQljbV9kZXYtPmNhX2d1aWQgPSBjbV9nZXRfY2FfZ3VpZChkZXZpY2UpOwotCWlmICghY21fZGV2LT5jYV9ndWlkKQotCQlnb3RvIGVycm9yMTsKKwljbV9kZXYtPmNhX2d1aWQgPSBkZXZpY2UtPm5vZGVfZ3VpZDsKIAogCXNldF9iaXQoSUJfTUdNVF9NRVRIT0RfU0VORCwgcmVnX3JlcS5tZXRob2RfbWFzayk7CiAJZm9yIChpID0gMTsgaSA8PSBkZXZpY2UtPnBoeXNfcG9ydF9jbnQ7IGkrKykgewpAQCAtMzIxNywxMSArMzE5OSwxMSBAQAogCQkJCQkJCWNtX3JlY3ZfaGFuZGxlciwKIAkJCQkJCQlwb3J0KTsKIAkJaWYgKElTX0VSUihwb3J0LT5tYWRfYWdlbnQpKQotCQkJZ290byBlcnJvcjI7CisJCQlnb3RvIGVycm9yMTsKIAogCQlyZXQgPSBpYl9tb2RpZnlfcG9ydChkZXZpY2UsIGksIDAsICZwb3J0X21vZGlmeSk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yMzsKKwkJCWdvdG8gZXJyb3IyOwogCX0KIAlpYl9zZXRfY2xpZW50X2RhdGEoZGV2aWNlLCAmY21fY2xpZW50LCBjbV9kZXYpOwogCkBAIC0zMjMwLDkgKzMyMTIsOSBAQAogCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZjbS5kZXZpY2VfbG9jaywgZmxhZ3MpOwogCXJldHVybjsKIAotZXJyb3IzOgotCWliX3VucmVnaXN0ZXJfbWFkX2FnZW50KHBvcnQtPm1hZF9hZ2VudCk7CiBlcnJvcjI6CisJaWJfdW5yZWdpc3Rlcl9tYWRfYWdlbnQocG9ydC0+bWFkX2FnZW50KTsKK2Vycm9yMToKIAlwb3J0X21vZGlmeS5zZXRfcG9ydF9jYXBfbWFzayA9IDA7CiAJcG9ydF9tb2RpZnkuY2xyX3BvcnRfY2FwX21hc2sgPSBJQl9QT1JUX0NNX1NVUDsKIAl3aGlsZSAoLS1pKSB7CkBAIC0zMjQwLDcgKzMyMjIsNiBAQAogCQlpYl9tb2RpZnlfcG9ydChkZXZpY2UsIHBvcnQtPnBvcnRfbnVtLCAwLCAmcG9ydF9tb2RpZnkpOwogCQlpYl91bnJlZ2lzdGVyX21hZF9hZ2VudChwb3J0LT5tYWRfYWdlbnQpOwogCX0KLWVycm9yMToKIAlrZnJlZShjbV9kZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9kZXZpY2UuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2RldmljZS5jCmluZGV4IGUxNjllNzkuLmIyZjNjYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2RldmljZS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2RldmljZS5jCkBAIC0zOCw4ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlICJjb3JlX3ByaXYuaCIKIApAQCAtNTcsMTMgKzU2LDEzIEBACiBzdGF0aWMgTElTVF9IRUFEKGNsaWVudF9saXN0KTsKIAogLyoKLSAqIGRldmljZV9zZW0gcHJvdGVjdHMgYWNjZXNzIHRvIGJvdGggZGV2aWNlX2xpc3QgYW5kIGNsaWVudF9saXN0LgorICogZGV2aWNlX211dGV4IHByb3RlY3RzIGFjY2VzcyB0byBib3RoIGRldmljZV9saXN0IGFuZCBjbGllbnRfbGlzdC4KICAqIFRoZXJlJ3Mgbm8gcmVhbCBwb2ludCB0byB1c2luZyBtdWx0aXBsZSBsb2NrcyBvciBzb21ldGhpbmcgZmFuY2llcgogICogbGlrZSBhbiByd3NlbTogd2UgYWx3YXlzIGFjY2VzcyBib3RoIGxpc3RzLCBhbmQgd2UncmUgYWx3YXlzCiAgKiBtb2RpZnlpbmcgb25lIGxpc3Qgb3IgdGhlIG90aGVyIGxpc3QuICBJbiBhbnkgY2FzZSB0aGlzIGlzIG5vdCBhCiAgKiBob3QgcGF0aCBzbyB0aGVyZSdzIG5vIHBvaW50IGluIHRyeWluZyB0byBvcHRpbWl6ZS4KICAqLwotc3RhdGljIERFQ0xBUkVfTVVURVgoZGV2aWNlX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKGRldmljZV9tdXRleCk7CiAKIHN0YXRpYyBpbnQgaWJfZGV2aWNlX2NoZWNrX21hbmRhdG9yeShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpCiB7CkBAIC0yMjEsNyArMjIwLDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JZG93bigmZGV2aWNlX3NlbSk7CisJbXV0ZXhfbG9jaygmZGV2aWNlX211dGV4KTsKIAogCWlmIChzdHJjaHIoZGV2aWNlLT5uYW1lLCAnJScpKSB7CiAJCXJldCA9IGFsbG9jX25hbWUoZGV2aWNlLT5uYW1lKTsKQEAgLTI1OSw3ICsyNTgsNyBAQAogCX0KIAogIG91dDoKLQl1cCgmZGV2aWNlX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZpY2VfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGliX3JlZ2lzdGVyX2RldmljZSk7CkBAIC0yNzYsNyArMjc1LDcgQEAKIAlzdHJ1Y3QgaWJfY2xpZW50X2RhdGEgKmNvbnRleHQsICp0bXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRvd24oJmRldmljZV9zZW0pOworCW11dGV4X2xvY2soJmRldmljZV9tdXRleCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoY2xpZW50LCAmY2xpZW50X2xpc3QsIGxpc3QpCiAJCWlmIChjbGllbnQtPnJlbW92ZSkKQEAgLTI4NCw3ICsyODMsNyBAQAogCiAJbGlzdF9kZWwoJmRldmljZS0+Y29yZV9saXN0KTsKIAotCXVwKCZkZXZpY2Vfc2VtKTsKKwltdXRleF91bmxvY2soJmRldmljZV9tdXRleCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5jbGllbnRfZGF0YV9sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbnRleHQsIHRtcCwgJmRldmljZS0+Y2xpZW50X2RhdGFfbGlzdCwgbGlzdCkKQEAgLTMxMiwxNCArMzExLDE0IEBACiB7CiAJc3RydWN0IGliX2RldmljZSAqZGV2aWNlOwogCi0JZG93bigmZGV2aWNlX3NlbSk7CisJbXV0ZXhfbG9jaygmZGV2aWNlX211dGV4KTsKIAogCWxpc3RfYWRkX3RhaWwoJmNsaWVudC0+bGlzdCwgJmNsaWVudF9saXN0KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmRldmljZV9saXN0LCBjb3JlX2xpc3QpCiAJCWlmIChjbGllbnQtPmFkZCAmJiAhYWRkX2NsaWVudF9jb250ZXh0KGRldmljZSwgY2xpZW50KSkKIAkJCWNsaWVudC0+YWRkKGRldmljZSk7CiAKLQl1cCgmZGV2aWNlX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZpY2VfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMzksNyArMzM4LDcgQEAKIAlzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRvd24oJmRldmljZV9zZW0pOworCW11dGV4X2xvY2soJmRldmljZV9tdXRleCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmRldmljZV9saXN0LCBjb3JlX2xpc3QpIHsKIAkJaWYgKGNsaWVudC0+cmVtb3ZlKQpAQCAtMzU1LDcgKzM1NCw3IEBACiAJfQogCWxpc3RfZGVsKCZjbGllbnQtPmxpc3QpOwogCi0JdXAoJmRldmljZV9zZW0pOworCW11dGV4X3VubG9jaygmZGV2aWNlX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0woaWJfdW5yZWdpc3Rlcl9jbGllbnQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYwppbmRleCAxZjE3NDNjLi41OTgyZDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMKQEAgLTQ0NSwxMyArNDQ1LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKgotCSAqIEl0IG1pZ2h0IGJlIG5pY2UgdG8gcGFzcyB0aGUgbm9kZSBHVUlEIHdpdGggdGhlIGV2ZW50LCBidXQKLQkgKiByaWdodCBub3cgdGhlIG9ubHkgd2F5IHRvIGdldCBpdCBpcyB0byBxdWVyeSB0aGUgZGV2aWNlCi0JICogcHJvdmlkZXIsIGFuZCB0aGlzIGNhbiBjcmFzaCBkdXJpbmcgZGV2aWNlIHJlbW92YWwgYmVjYXVzZQotCSAqIHdlIGFyZSB3aWxsIGJlIHJ1bm5pbmcgYWZ0ZXIgZHJpdmVyIHJlbW92YWwgaGFzIHN0YXJ0ZWQuCi0JICogV2UgY291bGQgYWRkIGEgbm9kZV9ndWlkIGZpZWxkIHRvIHN0cnVjdCBpYl9kZXZpY2UsIG9yIHdlCi0JICogY291bGQganVzdCBsZXQgdXNlcnNwYWNlIHJlYWQgdGhlIG5vZGUgR1VJRCBmcm9tIHN5c2ZzIHdoZW4KLQkgKiBkZXZpY2VzIGFyZSBhZGRlZC4KKwkgKiBJdCB3b3VsZCBiZSBuaWNlIHRvIHBhc3MgdGhlIG5vZGUgR1VJRCB3aXRoIHRoZSBldmVudC4uLgogCSAqLwogCiAJZW52cFtpXSA9IE5VTEw7CkBAIC02MjMsMjEgKzYxNywxNSBAQAogc3RhdGljIHNzaXplX3Qgc2hvd19ub2RlX2d1aWQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQogewogCXN0cnVjdCBpYl9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3QgaWJfZGV2aWNlLCBjbGFzc19kZXYpOwotCXN0cnVjdCBpYl9kZXZpY2VfYXR0ciBhdHRyOwotCXNzaXplX3QgcmV0OwogCiAJaWYgKCFpYmRldl9pc19hbGl2ZShkZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldCA9IGliX3F1ZXJ5X2RldmljZShkZXYsICZhdHRyKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKLQkJICAgICAgIGJlMTZfdG9fY3B1KCgoX19iZTE2ICopICZhdHRyLm5vZGVfZ3VpZClbMF0pLAotCQkgICAgICAgYmUxNl90b19jcHUoKChfX2JlMTYgKikgJmF0dHIubm9kZV9ndWlkKVsxXSksCi0JCSAgICAgICBiZTE2X3RvX2NwdSgoKF9fYmUxNiAqKSAmYXR0ci5ub2RlX2d1aWQpWzJdKSwKLQkJICAgICAgIGJlMTZfdG9fY3B1KCgoX19iZTE2ICopICZhdHRyLm5vZGVfZ3VpZClbM10pKTsKKwkJICAgICAgIGJlMTZfdG9fY3B1KCgoX19iZTE2ICopICZkZXYtPm5vZGVfZ3VpZClbMF0pLAorCQkgICAgICAgYmUxNl90b19jcHUoKChfX2JlMTYgKikgJmRldi0+bm9kZV9ndWlkKVsxXSksCisJCSAgICAgICBiZTE2X3RvX2NwdSgoKF9fYmUxNiAqKSAmZGV2LT5ub2RlX2d1aWQpWzJdKSwKKwkJICAgICAgIGJlMTZfdG9fY3B1KCgoX19iZTE2ICopICZkZXYtPm5vZGVfZ3VpZClbM10pKTsKIH0KIAogc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5vZGVfdHlwZSwgU19JUlVHTywgc2hvd19ub2RlX3R5cGUsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYwppbmRleCA2ZTE1Nzg3Li5lOTVjNDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC0xMTMsNyArMTE0LDcgQEAKIAkucmVtb3ZlID0gaWJfdWNtX3JlbW92ZV9vbmUKIH07CiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKGN0eF9pZF9tdXRleCk7CitzdGF0aWMgREVGSU5FX01VVEVYKGN0eF9pZF9tdXRleCk7CiBzdGF0aWMgREVGSU5FX0lEUihjdHhfaWRfdGFibGUpOwogc3RhdGljIERFQ0xBUkVfQklUTUFQKGRldl9tYXAsIElCX1VDTV9NQVhfREVWSUNFUyk7CiAKQEAgLTEyMSw3ICsxMjIsNyBAQAogewogCXN0cnVjdCBpYl91Y21fY29udGV4dCAqY3R4OwogCi0JZG93bigmY3R4X2lkX211dGV4KTsKKwltdXRleF9sb2NrKCZjdHhfaWRfbXV0ZXgpOwogCWN0eCA9IGlkcl9maW5kKCZjdHhfaWRfdGFibGUsIGlkKTsKIAlpZiAoIWN0eCkKIAkJY3R4ID0gRVJSX1BUUigtRU5PRU5UKTsKQEAgLTEyOSw3ICsxMzAsNyBAQAogCQljdHggPSBFUlJfUFRSKC1FSU5WQUwpOwogCWVsc2UKIAkJYXRvbWljX2luYygmY3R4LT5yZWYpOwotCXVwKCZjdHhfaWRfbXV0ZXgpOworCW11dGV4X3VubG9jaygmY3R4X2lkX211dGV4KTsKIAogCXJldHVybiBjdHg7CiB9CkBAIC0xODYsOSArMTg3LDkgQEAKIAkJaWYgKCFyZXN1bHQpCiAJCQlnb3RvIGVycm9yOwogCi0JCWRvd24oJmN0eF9pZF9tdXRleCk7CisJCW11dGV4X2xvY2soJmN0eF9pZF9tdXRleCk7CiAJCXJlc3VsdCA9IGlkcl9nZXRfbmV3KCZjdHhfaWRfdGFibGUsIGN0eCwgJmN0eC0+aWQpOwotCQl1cCgmY3R4X2lkX211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjdHhfaWRfbXV0ZXgpOwogCX0gd2hpbGUgKHJlc3VsdCA9PSAtRUFHQUlOKTsKIAogCWlmIChyZXN1bHQpCkBAIC01NTAsOSArNTUxLDkgQEAKIGVycjI6CiAJaWJfZGVzdHJveV9jbV9pZChjdHgtPmNtX2lkKTsKIGVycjE6Ci0JZG93bigmY3R4X2lkX211dGV4KTsKKwltdXRleF9sb2NrKCZjdHhfaWRfbXV0ZXgpOwogCWlkcl9yZW1vdmUoJmN0eF9pZF90YWJsZSwgY3R4LT5pZCk7Ci0JdXAoJmN0eF9pZF9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjdHhfaWRfbXV0ZXgpOwogCWtmcmVlKGN0eCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTU3Miw3ICs1NzMsNyBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBpbmJ1Ziwgc2l6ZW9mKGNtZCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWRvd24oJmN0eF9pZF9tdXRleCk7CisJbXV0ZXhfbG9jaygmY3R4X2lkX211dGV4KTsKIAljdHggPSBpZHJfZmluZCgmY3R4X2lkX3RhYmxlLCBjbWQuaWQpOwogCWlmICghY3R4KQogCQljdHggPSBFUlJfUFRSKC1FTk9FTlQpOwpAQCAtNTgwLDcgKzU4MSw3IEBACiAJCWN0eCA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJZWxzZQogCQlpZHJfcmVtb3ZlKCZjdHhfaWRfdGFibGUsIGN0eC0+aWQpOwotCXVwKCZjdHhfaWRfbXV0ZXgpOworCW11dGV4X3VubG9jaygmY3R4X2lkX211dGV4KTsKIAogCWlmIChJU19FUlIoY3R4KSkKIAkJcmV0dXJuIFBUUl9FUlIoY3R4KTsKQEAgLTEyODAsOSArMTI4MSw5IEBACiAJCQkJIHN0cnVjdCBpYl91Y21fY29udGV4dCwgZmlsZV9saXN0KTsKIAkJdXAoJmZpbGUtPm11dGV4KTsKIAotCQlkb3duKCZjdHhfaWRfbXV0ZXgpOworCQltdXRleF9sb2NrKCZjdHhfaWRfbXV0ZXgpOwogCQlpZHJfcmVtb3ZlKCZjdHhfaWRfdGFibGUsIGN0eC0+aWQpOwotCQl1cCgmY3R4X2lkX211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjdHhfaWRfbXV0ZXgpOwogCiAJCWliX2Rlc3Ryb3lfY21faWQoY3R4LT5jbV9pZCk7CiAJCWliX3VjbV9jbGVhbnVwX2V2ZW50cyhjdHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnMuaAppbmRleCA3MTE0ZTNmLi5mN2VlY2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnMuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnMuaApAQCAtNDEsNiArNDEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CiAjaW5jbHVkZSA8cmRtYS9pYl91c2VyX3ZlcmJzLmg+CkBAIC04OCw3ICs4OSw3IEBACiAKIHN0cnVjdCBpYl91dmVyYnNfZmlsZSB7CiAJc3RydWN0IGtyZWYJCQkJcmVmOwotCXN0cnVjdCBzZW1hcGhvcmUJCQltdXRleDsKKwlzdHJ1Y3QgbXV0ZXgJCQkJbXV0ZXg7CiAJc3RydWN0IGliX3V2ZXJic19kZXZpY2UJCSAgICAgICAqZGV2aWNlOwogCXN0cnVjdCBpYl91Y29udGV4dAkJICAgICAgICp1Y29udGV4dDsKIAlzdHJ1Y3QgaWJfZXZlbnRfaGFuZGxlcgkJCWV2ZW50X2hhbmRsZXI7CkBAIC0xMzEsNyArMTMyLDcgQEAKIAl1MzIJCQlhc3luY19ldmVudHNfcmVwb3J0ZWQ7CiB9OwogCi1leHRlcm4gc3RydWN0IHNlbWFwaG9yZSBpYl91dmVyYnNfaWRyX211dGV4OworZXh0ZXJuIHN0cnVjdCBtdXRleCBpYl91dmVyYnNfaWRyX211dGV4OwogZXh0ZXJuIHN0cnVjdCBpZHIgaWJfdXZlcmJzX3BkX2lkcjsKIGV4dGVybiBzdHJ1Y3QgaWRyIGliX3V2ZXJic19tcl9pZHI7CiBleHRlcm4gc3RydWN0IGlkciBpYl91dmVyYnNfbXdfaWRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jCmluZGV4IGEwMmM1YTAuLjQwN2I2MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCiAJaWYgKGZpbGUtPnVjb250ZXh0KSB7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC0xMTksNyArMTE5LDcgQEAKIAogCWZkX2luc3RhbGwocmVzcC5hc3luY19mZCwgZmlscCk7CiAKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCiAJcmV0dXJuIGluX2xlbjsKIApAQCAtMTMxLDcgKzEzMSw3IEBACiAJaWJkZXYtPmRlYWxsb2NfdWNvbnRleHQodWNvbnRleHQpOwogCiBlcnI6Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTcsNyArMTU3LDcgQEAKIAltZW1zZXQoJnJlc3AsIDAsIHNpemVvZiByZXNwKTsKIAogCXJlc3AuZndfdmVyIAkJICAgICAgID0gYXR0ci5md192ZXI7Ci0JcmVzcC5ub2RlX2d1aWQgCQkgICAgICAgPSBhdHRyLm5vZGVfZ3VpZDsKKwlyZXNwLm5vZGVfZ3VpZCAJCSAgICAgICA9IGZpbGUtPmRldmljZS0+aWJfZGV2LT5ub2RlX2d1aWQ7CiAJcmVzcC5zeXNfaW1hZ2VfZ3VpZCAJICAgICAgID0gYXR0ci5zeXNfaW1hZ2VfZ3VpZDsKIAlyZXNwLm1heF9tcl9zaXplIAkgICAgICAgPSBhdHRyLm1heF9tcl9zaXplOwogCXJlc3AucGFnZV9zaXplX2NhcCAJICAgICAgID0gYXR0ci5wYWdlX3NpemVfY2FwOwpAQCAtMjkwLDcgKzI5MCw3IEBACiAJcGQtPnVvYmplY3QgPSB1b2JqOwogCWF0b21pY19zZXQoJnBkLT51c2VjbnQsIDApOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIHJldHJ5OgogCWlmICghaWRyX3ByZV9nZXQoJmliX3V2ZXJic19wZF9pZHIsIEdGUF9LRVJORUwpKSB7CkBAIC0zMTQsMTEgKzMxNCwxMSBAQAogCQlnb3RvIGVycl9pZHI7CiAJfQogCi0JZG93bigmZmlsZS0+bXV0ZXgpOworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKIAlsaXN0X2FkZF90YWlsKCZ1b2JqLT5saXN0LCAmZmlsZS0+dWNvbnRleHQtPnBkX2xpc3QpOwotCXVwKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CiAKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiBpbl9sZW47CiAKQEAgLTMyNiw3ICszMjYsNyBAQAogCWlkcl9yZW1vdmUoJmliX3V2ZXJic19wZF9pZHIsIHVvYmotPmlkKTsKIAogZXJyX3VwOgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCWliX2RlYWxsb2NfcGQocGQpOwogCiBlcnI6CkBAIC0zNDYsNyArMzQ2LDcgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXBkID0gaWRyX2ZpbmQoJmliX3V2ZXJic19wZF9pZHIsIGNtZC5wZF9oYW5kbGUpOwogCWlmICghcGQgfHwgcGQtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCkBAIC0zNjAsMTQgKzM2MCwxNCBAQAogCiAJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX3BkX2lkciwgY21kLnBkX2hhbmRsZSk7CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCiAJa2ZyZWUodW9iaik7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47CiB9CkBAIC00MjYsNyArNDI2LDcgQEAKIAogCW9iai0+dW1lbS52aXJ0X2Jhc2UgPSBjbWQuaGNhX3ZhOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlwZCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcGRfaWRyLCBjbWQucGRfaGFuZGxlKTsKIAlpZiAoIXBkIHx8IHBkLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KSB7CkBAIC00NzYsMTEgKzQ3NiwxMSBAQAogCQlnb3RvIGVycl9pZHI7CiAJfQogCi0JZG93bigmZmlsZS0+bXV0ZXgpOworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKIAlsaXN0X2FkZF90YWlsKCZvYmotPnVvYmplY3QubGlzdCwgJmZpbGUtPnVjb250ZXh0LT5tcl9saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCi0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gaW5fbGVuOwogCkBAIC00OTIsNyArNDkyLDcgQEAKIAlhdG9taWNfZGVjKCZwZC0+dXNlY250KTsKIAogZXJyX3VwOgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJaWJfdW1lbV9yZWxlYXNlKGZpbGUtPmRldmljZS0+aWJfZGV2LCAmb2JqLT51bWVtKTsKIApAQCAtNTEzLDcgKzUxMyw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAltciA9IGlkcl9maW5kKCZpYl91dmVyYnNfbXJfaWRyLCBjbWQubXJfaGFuZGxlKTsKIAlpZiAoIW1yIHx8IG1yLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQpAQCAtNTI3LDE1ICs1MjcsMTUgQEAKIAogCWlkcl9yZW1vdmUoJmliX3V2ZXJic19tcl9pZHIsIGNtZC5tcl9oYW5kbGUpOwogCi0JZG93bigmZmlsZS0+bXV0ZXgpOworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKIAlsaXN0X2RlbCgmbWVtb2JqLT51b2JqZWN0Lmxpc3QpOwotCXVwKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CiAKIAlpYl91bWVtX3JlbGVhc2UoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsICZtZW1vYmotPnVtZW0pOwogCWtmcmVlKG1lbW9iaik7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47CiB9CkBAIC02MjgsNyArNjI4LDcgQEAKIAljcS0+Y3FfY29udGV4dCAgICA9IGV2X2ZpbGU7CiAJYXRvbWljX3NldCgmY3EtPnVzZWNudCwgMCk7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogcmV0cnk6CiAJaWYgKCFpZHJfcHJlX2dldCgmaWJfdXZlcmJzX2NxX2lkciwgR0ZQX0tFUk5FTCkpIHsKQEAgLTY1MywxMSArNjUzLDExIEBACiAJCWdvdG8gZXJyX2lkcjsKIAl9CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJnVvYmotPnVvYmplY3QubGlzdCwgJmZpbGUtPnVjb250ZXh0LT5jcV9saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCi0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gaW5fbGVuOwogCkBAIC02NjUsNyArNjY1LDcgQEAKIAlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfY3FfaWRyLCB1b2JqLT51b2JqZWN0LmlkKTsKIAogZXJyX3VwOgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCWliX2Rlc3Ryb3lfY3EoY3EpOwogCiBlcnI6CkBAIC03MDEsNyArNzAxLDcgQEAKIAkJZ290byBvdXRfd2M7CiAJfQogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAJY3EgPSBpZHJfZmluZCgmaWJfdXZlcmJzX2NxX2lkciwgY21kLmNxX2hhbmRsZSk7CiAJaWYgKCFjcSB8fCBjcS0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkgewogCQlyZXQgPSAtRUlOVkFMOwpAQCAtNzMxLDcgKzczMSw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAlrZnJlZShyZXNwKTsKIAogb3V0X3djOgpAQCAtNzUwLDE0ICs3NTAsMTQgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAljcSA9IGlkcl9maW5kKCZpYl91dmVyYnNfY3FfaWRyLCBjbWQuY3FfaGFuZGxlKTsKIAlpZiAoY3EgJiYgY3EtPnVvYmplY3QtPmNvbnRleHQgPT0gZmlsZS0+dWNvbnRleHQpIHsKIAkJaWJfcmVxX25vdGlmeV9jcShjcSwgY21kLnNvbGljaXRlZF9vbmx5ID8KIAkJCQkJSUJfQ1FfU09MSUNJVEVEIDogSUJfQ1FfTkVYVF9DT01QKTsKIAkJcmV0ID0gaW5fbGVuOwogCX0KLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC03NzksNyArNzc5LDcgQEAKIAogCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAljcSA9IGlkcl9maW5kKCZpYl91dmVyYnNfY3FfaWRyLCBjbWQuY3FfaGFuZGxlKTsKIAlpZiAoIWNxIHx8IGNxLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQpAQCAtNzk1LDkgKzc5NSw5IEBACiAKIAlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfY3FfaWRyLCBjbWQuY3FfaGFuZGxlKTsKIAotCWRvd24oJmZpbGUtPm11dGV4KTsKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAJbGlzdF9kZWwoJnVvYmotPnVvYmplY3QubGlzdCk7Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAogCWliX3V2ZXJic19yZWxlYXNlX3VjcShmaWxlLCBldl9maWxlLCB1b2JqKTsKIApAQCAtODExLDcgKzgxMSw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47CiB9CkBAIC04NDUsNyArODQ1LDcgQEAKIAlpZiAoIXVvYmopCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlwZCAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3BkX2lkciwgY21kLnBkX2hhbmRsZSk7CiAJc2NxID0gaWRyX2ZpbmQoJmliX3V2ZXJic19jcV9pZHIsIGNtZC5zZW5kX2NxX2hhbmRsZSk7CkBAIC05MzAsMTEgKzkzMCwxMSBAQAogCQlnb3RvIGVycl9pZHI7CiAJfQogCi0JZG93bigmZmlsZS0+bXV0ZXgpOworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKIAlsaXN0X2FkZF90YWlsKCZ1b2JqLT51ZXZlbnQudW9iamVjdC5saXN0LCAmZmlsZS0+dWNvbnRleHQtPnFwX2xpc3QpOwotCXVwKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CiAKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiBpbl9sZW47CiAKQEAgLTk1MCw3ICs5NTAsNyBAQAogCQlhdG9taWNfZGVjKCZhdHRyLnNycS0+dXNlY250KTsKIAogZXJyX3VwOgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJa2ZyZWUodW9iaik7CiAJcmV0dXJuIHJldDsKQEAgLTk3Miw3ICs5NzIsNyBAQAogCWlmICghYXR0cikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXFwID0gaWRyX2ZpbmQoJmliX3V2ZXJic19xcF9pZHIsIGNtZC5xcF9oYW5kbGUpOwogCWlmICghcXAgfHwgcXAtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpIHsKQEAgLTEwMzMsNyArMTAzMyw3IEBACiAJcmV0ID0gaW5fbGVuOwogCiBvdXQ6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAJa2ZyZWUoYXR0cik7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTA1NCw3ICsxMDU0LDcgQEAKIAogCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlxcCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcXBfaWRyLCBjbWQucXBfaGFuZGxlKTsKIAlpZiAoIXFwIHx8IHFwLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQpAQCAtMTA3Myw5ICsxMDczLDkgQEAKIAogCWlkcl9yZW1vdmUoJmliX3V2ZXJic19xcF9pZHIsIGNtZC5xcF9oYW5kbGUpOwogCi0JZG93bigmZmlsZS0+bXV0ZXgpOworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKIAlsaXN0X2RlbCgmdW9iai0+dWV2ZW50LnVvYmplY3QubGlzdCk7Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAogCWliX3V2ZXJic19yZWxlYXNlX3VldmVudChmaWxlLCAmdW9iai0+dWV2ZW50KTsKIApAQCAtMTA4OCw3ICsxMDg4LDcgQEAKIAkJcmV0ID0gLUVGQVVMVDsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKIH0KQEAgLTExMTksNyArMTExOSw3IEBACiAJaWYgKCF1c2VyX3dyKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CiAJaWYgKCFxcCB8fCBxcC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKQEAgLTEyMjQsNyArMTIyNCw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXdoaWxlICh3cikgewogCQluZXh0ID0gd3ItPm5leHQ7CkBAIC0xMzQxLDcgKzEzNDEsNyBAQAogCWlmIChJU19FUlIod3IpKQogCQlyZXR1cm4gUFRSX0VSUih3cik7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXFwID0gaWRyX2ZpbmQoJmliX3V2ZXJic19xcF9pZHIsIGNtZC5xcF9oYW5kbGUpOwogCWlmICghcXAgfHwgcXAtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCkBAIC0xMzYyLDcgKzEzNjIsNyBAQAogCQlyZXQgPSAtRUZBVUxUOwogCiBvdXQ6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAl3aGlsZSAod3IpIHsKIAkJbmV4dCA9IHdyLT5uZXh0OwpAQCAtMTM5Miw3ICsxMzkyLDcgQEAKIAlpZiAoSVNfRVJSKHdyKSkKIAkJcmV0dXJuIFBUUl9FUlIod3IpOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlzcnEgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3NycV9pZHIsIGNtZC5zcnFfaGFuZGxlKTsKIAlpZiAoIXNycSB8fCBzcnEtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCkBAIC0xNDEzLDcgKzE0MTMsNyBAQAogCQlyZXQgPSAtRUZBVUxUOwogCiBvdXQ6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAl3aGlsZSAod3IpIHsKIAkJbmV4dCA9IHdyLT5uZXh0OwpAQCAtMTQ0Niw3ICsxNDQ2LDcgQEAKIAlpZiAoIXVvYmopCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlwZCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcGRfaWRyLCBjbWQucGRfaGFuZGxlKTsKIAlpZiAoIXBkIHx8IHBkLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KSB7CkBAIC0xNDk4LDExICsxNDk4LDExIEBACiAJCWdvdG8gZXJyX2lkcjsKIAl9CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJnVvYmotPmxpc3QsICZmaWxlLT51Y29udGV4dC0+YWhfbGlzdCk7Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIGluX2xlbjsKIApAQCAtMTUxMyw3ICsxNTEzLDcgQEAKIAlpYl9kZXN0cm95X2FoKGFoKTsKIAogZXJyX3VwOgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJa2ZyZWUodW9iaik7CiAJcmV0dXJuIHJldDsKQEAgLTE1MzAsNyArMTUzMCw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlhaCA9IGlkcl9maW5kKCZpYl91dmVyYnNfYWhfaWRyLCBjbWQuYWhfaGFuZGxlKTsKIAlpZiAoIWFoIHx8IGFoLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQpAQCAtMTU0NCwxNCArMTU0NCwxNCBAQAogCiAJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX2FoX2lkciwgY21kLmFoX2hhbmRsZSk7CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCiAJa2ZyZWUodW9iaik7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47CiB9CkBAIC0xNTY5LDcgKzE1NjksNyBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CiAJaWYgKCFxcCB8fCBxcC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKQEAgLTE2MDIsNyArMTYwMiw3IEBACiAJCWtmcmVlKG1jYXN0KTsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKIH0KQEAgLTE2MjAsNyArMTYyMCw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlxcCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcXBfaWRyLCBjbWQucXBfaGFuZGxlKTsKIAlpZiAoIXFwIHx8IHFwLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQpAQCAtMTY0MSw3ICsxNjQxLDcgQEAKIAkJfQogCiBvdXQ6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOwogfQpAQCAtMTY3Myw3ICsxNjczLDcgQEAKIAlpZiAoIXVvYmopCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlwZCAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3BkX2lkciwgY21kLnBkX2hhbmRsZSk7CiAKQEAgLTE3MzAsMTEgKzE3MzAsMTEgQEAKIAkJZ290byBlcnJfaWRyOwogCX0KIAotCWRvd24oJmZpbGUtPm11dGV4KTsKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmdW9iai0+dW9iamVjdC5saXN0LCAmZmlsZS0+dWNvbnRleHQtPnNycV9saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCi0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gaW5fbGVuOwogCkBAIC0xNzQ2LDcgKzE3NDYsNyBAQAogCWF0b21pY19kZWMoJnBkLT51c2VjbnQpOwogCiBlcnJfdXA6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlrZnJlZSh1b2JqKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTc2NCw3ICsxNzY0LDcgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXNycSA9IGlkcl9maW5kKCZpYl91dmVyYnNfc3JxX2lkciwgY21kLnNycV9oYW5kbGUpOwogCWlmICghc3JxIHx8IHNycS0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkgewpAQCAtMTc3OCw3ICsxNzc4LDcgQEAKIAlyZXQgPSBpYl9tb2RpZnlfc3JxKHNycSwgJmF0dHIsIGNtZC5hdHRyX21hc2spOwogCiBvdXQ6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOwogfQpAQCAtMTc5Niw3ICsxNzk2LDcgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOwogCkBAIC0xODEyLDkgKzE4MTIsOSBAQAogCiAJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX3NycV9pZHIsIGNtZC5zcnFfaGFuZGxlKTsKIAotCWRvd24oJmZpbGUtPm11dGV4KTsKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAJbGlzdF9kZWwoJnVvYmotPnVvYmplY3QubGlzdCk7Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAogCWliX3V2ZXJic19yZWxlYXNlX3VldmVudChmaWxlLCB1b2JqKTsKIApAQCAtMTgyNyw3ICsxODI3LDcgQEAKIAkJcmV0ID0gLUVGQVVMVDsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCmluZGV4IDgxNzM3YmQuLjk2ZWE3OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYwpAQCAtNjYsNyArNjYsNyBAQAogCiBzdGF0aWMgc3RydWN0IGNsYXNzICp1dmVyYnNfY2xhc3M7CiAKLURFQ0xBUkVfTVVURVgoaWJfdXZlcmJzX2lkcl9tdXRleCk7CitERUZJTkVfTVVURVgoaWJfdXZlcmJzX2lkcl9tdXRleCk7CiBERUZJTkVfSURSKGliX3V2ZXJic19wZF9pZHIpOwogREVGSU5FX0lEUihpYl91dmVyYnNfbXJfaWRyKTsKIERFRklORV9JRFIoaWJfdXZlcmJzX213X2lkcik7CkBAIC0xODAsNyArMTgwLDcgQEAKIAlpZiAoIWNvbnRleHQpCiAJCXJldHVybiAwOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW9iaiwgdG1wLCAmY29udGV4dC0+YWhfbGlzdCwgbGlzdCkgewogCQlzdHJ1Y3QgaWJfYWggKmFoID0gaWRyX2ZpbmQoJmliX3V2ZXJic19haF9pZHIsIHVvYmotPmlkKTsKQEAgLTI1MCw3ICsyNTAsNyBAQAogCQlrZnJlZSh1b2JqKTsKIAl9CiAKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiBjb250ZXh0LT5kZXZpY2UtPmRlYWxsb2NfdWNvbnRleHQoY29udGV4dCk7CiB9CkBAIC02NTMsNyArNjUzLDcgQEAKIAlmaWxlLT51Y29udGV4dAkgPSBOVUxMOwogCWZpbGUtPmFzeW5jX2ZpbGUgPSBOVUxMOwogCWtyZWZfaW5pdCgmZmlsZS0+cmVmKTsKLQlpbml0X01VVEVYKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfaW5pdCgmZmlsZS0+bXV0ZXgpOwogCiAJZmlscC0+cHJpdmF0ZV9kYXRhID0gZmlsZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2F2LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYwppbmRleCAyMmZkYzQ0Li5hMTRlZWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYwpAQCAtMTYzLDYgKzE2MywxMSBAQAogCXJldHVybiAwOwogfQogCitpbnQgbXRoY2FfYWhfZ3JoX3ByZXNlbnQoc3RydWN0IG10aGNhX2FoICphaCkKK3sKKwlyZXR1cm4gISEoYWgtPmF2LT5nX3NsaWQgJiAweDgwKTsKK30KKwogaW50IG10aGNhX3JlYWRfYWgoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfYWggKmFoLAogCQkgIHN0cnVjdCBpYl91ZF9oZWFkZXIgKmhlYWRlcikKIHsKQEAgLTE3Miw4ICsxNzcsNyBAQAogCWhlYWRlci0+bHJoLnNlcnZpY2VfbGV2ZWwgICA9IGJlMzJfdG9fY3B1KGFoLT5hdi0+c2xfdGNsYXNzX2Zsb3dsYWJlbCkgPj4gMjg7CiAJaGVhZGVyLT5scmguZGVzdGluYXRpb25fbGlkID0gYWgtPmF2LT5kbGlkOwogCWhlYWRlci0+bHJoLnNvdXJjZV9saWQgICAgICA9IGNwdV90b19iZTE2KGFoLT5hdi0+Z19zbGlkICYgMHg3Zik7Ci0JaWYgKGFoLT5hdi0+Z19zbGlkICYgMHg4MCkgewotCQloZWFkZXItPmdyaF9wcmVzZW50ID0gMTsKKwlpZiAobXRoY2FfYWhfZ3JoX3ByZXNlbnQoYWgpKSB7CiAJCWhlYWRlci0+Z3JoLnRyYWZmaWNfY2xhc3MgPQogCQkJKGJlMzJfdG9fY3B1KGFoLT5hdi0+c2xfdGNsYXNzX2Zsb3dsYWJlbCkgPj4gMjApICYgMHhmZjsKIAkJaGVhZGVyLT5ncmguZmxvd19sYWJlbCAgICA9CkBAIC0xODQsOCArMTg4LDYgQEAKIAkJCQkgICZoZWFkZXItPmdyaC5zb3VyY2VfZ2lkKTsKIAkJbWVtY3B5KGhlYWRlci0+Z3JoLmRlc3RpbmF0aW9uX2dpZC5yYXcsCiAJCSAgICAgICBhaC0+YXYtPmRnaWQsIDE2KTsKLQl9IGVsc2UgewotCQloZWFkZXItPmdyaF9wcmVzZW50ID0gMDsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuYwppbmRleCAyMmFjNzJiLi5iZTE3OTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jCkBAIC02MDYsNyArNjA2LDcgQEAKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbXRoY2FfaWNtX3NpemUoJml0ZXIpIC8gKDEgPDwgbGcpOyArK2kpIHsKKwkJZm9yIChpID0gMDsgaSA8IG10aGNhX2ljbV9zaXplKCZpdGVyKSA+PiBsZzsgKytpKSB7CiAJCQlpZiAodmlydCAhPSAtMSkgewogCQkJCXBhZ2VzW25lbnQgKiAyXSA9IGNwdV90b19iZTY0KHZpcnQpOwogCQkJCXZpcnQgKz0gMSA8PCBsZzsKQEAgLTcyNyw4ICs3MjcsOCBAQAogCQkgKiBzeXN0ZW0gcGFnZXMgbmVlZGVkLgogCQkgKi8KIAkJZGV2LT5mdy5hcmJlbC5md19wYWdlcyA9Ci0JCQkoZGV2LT5mdy5hcmJlbC5md19wYWdlcyArICgxIDw8IChQQUdFX1NISUZUIC0gMTIpKSAtIDEpID4+Ci0JCQkoUEFHRV9TSElGVCAtIDEyKTsKKwkJCUFMSUdOKGRldi0+ZncuYXJiZWwuZndfcGFnZXMsIFBBR0VfU0laRSA+PiAxMikgPj4KKwkJCQkoUEFHRV9TSElGVCAtIDEyKTsKIAogCQltdGhjYV9kYmcoZGV2LCAiQ2xlYXIgaW50IEAgJWxseCwgRVEgYXJtIEAgJWxseCwgRVEgc2V0IENJIEAgJWxseFxuIiwKIAkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZGV2LT5mdy5hcmJlbC5jbHJfaW50X2Jhc2UsCkBAIC0xNDQ1LDYgKzE0NDUsNyBAQAogCSAqIHBhZ2VzIG5lZWRlZC4KIAkgKi8KIAkqYXV4X3BhZ2VzID0gKCphdXhfcGFnZXMgKyAoMSA8PCAoUEFHRV9TSElGVCAtIDEyKSkgLSAxKSA+PiAoUEFHRV9TSElGVCAtIDEyKTsKKwkqYXV4X3BhZ2VzID0gQUxJR04oKmF1eF9wYWdlcywgUEFHRV9TSVpFID4+IDEyKSA+PiAoUEFHRV9TSElGVCAtIDEyKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2Rldi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2Rldi5oCmluZGV4IDc5NWIzNzkuLmExMDRhYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9kZXYuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZGV2LmgKQEAgLTUyMCw2ICs1MjAsNyBAQAogaW50IG10aGNhX2Rlc3Ryb3lfYWgoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfYWggKmFoKTsKIGludCBtdGhjYV9yZWFkX2FoKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX2FoICphaCwKIAkJICBzdHJ1Y3QgaWJfdWRfaGVhZGVyICpoZWFkZXIpOworaW50IG10aGNhX2FoX2dyaF9wcmVzZW50KHN0cnVjdCBtdGhjYV9haCAqYWgpOwogCiBpbnQgbXRoY2FfbXVsdGljYXN0X2F0dGFjaChzdHJ1Y3QgaWJfcXAgKmlicXAsIHVuaW9uIGliX2dpZCAqZ2lkLCB1MTYgbGlkKTsKIGludCBtdGhjYV9tdWx0aWNhc3RfZGV0YWNoKHN0cnVjdCBpYl9xcCAqaWJxcCwgdW5pb24gaWJfZ2lkICpnaWQsIHUxNiBsaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2VxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYwppbmRleCBlOGE5NDhmLi4yZWFiYjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYwpAQCAtNDUsNiArNDUsNyBAQAogZW51bSB7CiAJTVRIQ0FfTlVNX0FTWU5DX0VRRSA9IDB4ODAsCiAJTVRIQ0FfTlVNX0NNRF9FUUUgICA9IDB4ODAsCisJTVRIQ0FfTlVNX1NQQVJFX0VRRSA9IDB4ODAsCiAJTVRIQ0FfRVFfRU5UUllfU0laRSA9IDB4MjAKIH07CiAKQEAgLTI3NywxMSArMjc4LDEwIEBACiB7CiAJc3RydWN0IG10aGNhX2VxZSAqZXFlOwogCWludCBkaXNhcm1fY3FuOwotCWludCAgZXFlc19mb3VuZCA9IDA7CisJaW50IGVxZXNfZm91bmQgPSAwOworCWludCBzZXRfY2kgPSAwOwogCiAJd2hpbGUgKChlcWUgPSBuZXh0X2VxZV9zdyhlcSkpKSB7Ci0JCWludCBzZXRfY2kgPSAwOwotCiAJCS8qCiAJCSAqIE1ha2Ugc3VyZSB3ZSByZWFkIEVRIGVudHJ5IGNvbnRlbnRzIGFmdGVyIHdlJ3ZlCiAJCSAqIGNoZWNrZWQgdGhlIG93bmVyc2hpcCBiaXQuCkBAIC0zNDUsMTIgKzM0NSw2IEBACiAJCQkJCWJlMTZfdG9fY3B1KGVxZS0+ZXZlbnQuY21kLnRva2VuKSwKIAkJCQkJZXFlLT5ldmVudC5jbWQuc3RhdHVzLAogCQkJCQliZTY0X3RvX2NwdShlcWUtPmV2ZW50LmNtZC5vdXRfcGFyYW0pKTsKLQkJCS8qCi0JCQkgKiBjbWRfZXZlbnQoKSBtYXkgYWRkIG1vcmUgY29tbWFuZHMuCi0JCQkgKiBUaGUgY2FyZCB3aWxsIHRoaW5rIHRoZSBxdWV1ZSBoYXMgb3ZlcmZsb3dlZCBpZgotCQkJICogd2UgZG9uJ3QgdGVsbCBpdCB3ZSd2ZSBiZWVuIHByb2Nlc3NpbmcgZXZlbnRzLgotCQkJICovCi0JCQlzZXRfY2kgPSAxOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBNVEhDQV9FVkVOVF9UWVBFX1BPUlRfQ0hBTkdFOgpAQCAtMzg1LDggKzM3OSwxNiBAQAogCQlzZXRfZXFlX2h3KGVxZSk7CiAJCSsrZXEtPmNvbnNfaW5kZXg7CiAJCWVxZXNfZm91bmQgPSAxOworCQkrK3NldF9jaTsKIAotCQlpZiAodW5saWtlbHkoc2V0X2NpKSkgeworCQkvKgorCQkgKiBUaGUgSENBIHdpbGwgdGhpbmsgdGhlIHF1ZXVlIGhhcyBvdmVyZmxvd2VkIGlmIHdlCisJCSAqIGRvbid0IHRlbGwgaXQgd2UndmUgYmVlbiBwcm9jZXNzaW5nIGV2ZW50cy4gIFdlCisJCSAqIGNyZWF0ZSBvdXIgRVFzIHdpdGggTVRIQ0FfTlVNX1NQQVJFX0VRRSBleHRyYQorCQkgKiBlbnRyaWVzLCBzbyB3ZSBtdXN0IHVwZGF0ZSBvdXIgY29uc3VtZXIgaW5kZXggYXQKKwkJICogbGVhc3QgdGhhdCBvZnRlbi4KKwkJICovCisJCWlmICh1bmxpa2VseShzZXRfY2kgPj0gTVRIQ0FfTlVNX1NQQVJFX0VRRSkpIHsKIAkJCS8qCiAJCQkgKiBDb25kaXRpb25hbCBvbiBoY2FfdHlwZSBpcyBPSyBoZXJlIGJlY2F1c2UKIAkJCSAqIHRoaXMgaXMgYSByYXJlIGNhc2UsIG5vdCB0aGUgZmFzdCBwYXRoLgpAQCAtODYyLDE5ICs4NjQsMTkgQEAKIAlpbnRyID0gKGRldi0+bXRoY2FfZmxhZ3MgJiBNVEhDQV9GTEFHX01TSSkgPwogCQkxMjggOiBkZXYtPmVxX3RhYmxlLmludGFfcGluOwogCi0JZXJyID0gbXRoY2FfY3JlYXRlX2VxKGRldiwgZGV2LT5saW1pdHMubnVtX2NxcywKKwllcnIgPSBtdGhjYV9jcmVhdGVfZXEoZGV2LCBkZXYtPmxpbWl0cy5udW1fY3FzICsgTVRIQ0FfTlVNX1NQQVJFX0VRRSwKIAkJCSAgICAgIChkZXYtPm10aGNhX2ZsYWdzICYgTVRIQ0FfRkxBR19NU0lfWCkgPyAxMjggOiBpbnRyLAogCQkJICAgICAgJmRldi0+ZXFfdGFibGUuZXFbTVRIQ0FfRVFfQ09NUF0pOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX291dF91bm1hcDsKIAotCWVyciA9IG10aGNhX2NyZWF0ZV9lcShkZXYsIE1USENBX05VTV9BU1lOQ19FUUUsCisJZXJyID0gbXRoY2FfY3JlYXRlX2VxKGRldiwgTVRIQ0FfTlVNX0FTWU5DX0VRRSArIE1USENBX05VTV9TUEFSRV9FUUUsCiAJCQkgICAgICAoZGV2LT5tdGhjYV9mbGFncyAmIE1USENBX0ZMQUdfTVNJX1gpID8gMTI5IDogaW50ciwKIAkJCSAgICAgICZkZXYtPmVxX3RhYmxlLmVxW01USENBX0VRX0FTWU5DXSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfb3V0X2NvbXA7CiAKLQllcnIgPSBtdGhjYV9jcmVhdGVfZXEoZGV2LCBNVEhDQV9OVU1fQ01EX0VRRSwKKwllcnIgPSBtdGhjYV9jcmVhdGVfZXEoZGV2LCBNVEhDQV9OVU1fQ01EX0VRRSArIE1USENBX05VTV9TUEFSRV9FUUUsCiAJCQkgICAgICAoZGV2LT5tdGhjYV9mbGFncyAmIE1USENBX0ZMQUdfTVNJX1gpID8gMTMwIDogaW50ciwKIAkJCSAgICAgICZkZXYtPmVxX3RhYmxlLmVxW01USENBX0VRX0NNRF0pOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jCmluZGV4IDRjYzdlMjguLjQ4NGE3ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jCkBAIC0zMyw3ICszMyw3IEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAgKiBTT0ZUV0FSRS4KICAqCi0gKiAkSWQ6IG10aGNhX3Byb3ZpZGVyLmMgMTM5NyAyMDA0LTEyLTI4IDA1OjA5OjAwWiByb2xhbmQgJAorICogJElkOiBtdGhjYV9wcm92aWRlci5jIDQ4NTkgMjAwNi0wMS0wOSAyMTo1NToxMFogcm9sYW5kICQKICAqLwogCiAjaW5jbHVkZSA8cmRtYS9pYl9zbWkuaD4KQEAgLTQ1LDYgKzQ1LDE0IEBACiAjaW5jbHVkZSAibXRoY2FfdXNlci5oIgogI2luY2x1ZGUgIm10aGNhX21lbWZyZWUuaCIKIAorc3RhdGljIHZvaWQgaW5pdF9xdWVyeV9tYWQoc3RydWN0IGliX3NtcCAqbWFkKQoreworCW1hZC0+YmFzZV92ZXJzaW9uICA9IDE7CisJbWFkLT5tZ210X2NsYXNzICAgID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQ7CisJbWFkLT5jbGFzc192ZXJzaW9uID0gMTsKKwltYWQtPm1ldGhvZCAgICAJICAgPSBJQl9NR01UX01FVEhPRF9HRVQ7Cit9CisKIHN0YXRpYyBpbnQgbXRoY2FfcXVlcnlfZGV2aWNlKHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAogCQkJICAgICAgc3RydWN0IGliX2RldmljZV9hdHRyICpwcm9wcykKIHsKQEAgLTU1LDcgKzYzLDcgQEAKIAogCXU4IHN0YXR1czsKIAotCWluX21hZCAgPSBrbWFsbG9jKHNpemVvZiAqaW5fbWFkLCBHRlBfS0VSTkVMKTsKKwlpbl9tYWQgID0ga3phbGxvYyhzaXplb2YgKmluX21hZCwgR0ZQX0tFUk5FTCk7CiAJb3V0X21hZCA9IGttYWxsb2Moc2l6ZW9mICpvdXRfbWFkLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluX21hZCB8fCAhb3V0X21hZCkKIAkJZ290byBvdXQ7CkBAIC02NCwxMiArNzIsOCBAQAogCiAJcHJvcHMtPmZ3X3ZlciAgICAgICAgICAgICAgPSBtZGV2LT5md192ZXI7CiAKLQltZW1zZXQoaW5fbWFkLCAwLCBzaXplb2YgKmluX21hZCk7Ci0JaW5fbWFkLT5iYXNlX3ZlcnNpb24gICAgICAgPSAxOwotCWluX21hZC0+bWdtdF9jbGFzcyAgICAgCSAgID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQ7Ci0JaW5fbWFkLT5jbGFzc192ZXJzaW9uICAJICAgPSAxOwotCWluX21hZC0+bWV0aG9kICAgICAgICAgCSAgID0gSUJfTUdNVF9NRVRIT0RfR0VUOwotCWluX21hZC0+YXR0cl9pZCAgIAkgICA9IElCX1NNUF9BVFRSX05PREVfSU5GTzsKKwlpbml0X3F1ZXJ5X21hZChpbl9tYWQpOworCWluX21hZC0+YXR0cl9pZCA9IElCX1NNUF9BVFRSX05PREVfSU5GTzsKIAogCWVyciA9IG10aGNhX01BRF9JRkMobWRldiwgMSwgMSwKIAkJCSAgICAxLCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQsCkBAIC04Nyw3ICs5MSw2IEBACiAJcHJvcHMtPnZlbmRvcl9wYXJ0X2lkICAgICAgPSBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSAob3V0X21hZC0+ZGF0YSArIDMwKSk7CiAJcHJvcHMtPmh3X3ZlciAgICAgICAgICAgICAgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSAob3V0X21hZC0+ZGF0YSArIDMyKSk7CiAJbWVtY3B5KCZwcm9wcy0+c3lzX2ltYWdlX2d1aWQsIG91dF9tYWQtPmRhdGEgKyAgNCwgOCk7Ci0JbWVtY3B5KCZwcm9wcy0+bm9kZV9ndWlkLCAgICAgIG91dF9tYWQtPmRhdGEgKyAxMiwgOCk7CiAKIAlwcm9wcy0+bWF4X21yX3NpemUgICAgICAgICA9IH4wdWxsOwogCXByb3BzLT5wYWdlX3NpemVfY2FwICAgICAgID0gbWRldi0+bGltaXRzLnBhZ2Vfc2l6ZV9jYXA7CkBAIC0xMjgsMjAgKzEzMSwxNiBAQAogCWludCBlcnIgPSAtRU5PTUVNOwogCXU4IHN0YXR1czsKIAotCWluX21hZCAgPSBrbWFsbG9jKHNpemVvZiAqaW5fbWFkLCBHRlBfS0VSTkVMKTsKKwlpbl9tYWQgID0ga3phbGxvYyhzaXplb2YgKmluX21hZCwgR0ZQX0tFUk5FTCk7CiAJb3V0X21hZCA9IGttYWxsb2Moc2l6ZW9mICpvdXRfbWFkLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluX21hZCB8fCAhb3V0X21hZCkKIAkJZ290byBvdXQ7CiAKIAltZW1zZXQocHJvcHMsIDAsIHNpemVvZiAqcHJvcHMpOwogCi0JbWVtc2V0KGluX21hZCwgMCwgc2l6ZW9mICppbl9tYWQpOwotCWluX21hZC0+YmFzZV92ZXJzaW9uICAgICAgID0gMTsKLQlpbl9tYWQtPm1nbXRfY2xhc3MgICAgIAkgICA9IElCX01HTVRfQ0xBU1NfU1VCTl9MSURfUk9VVEVEOwotCWluX21hZC0+Y2xhc3NfdmVyc2lvbiAgCSAgID0gMTsKLQlpbl9tYWQtPm1ldGhvZCAgICAgICAgIAkgICA9IElCX01HTVRfTUVUSE9EX0dFVDsKLQlpbl9tYWQtPmF0dHJfaWQgICAJICAgPSBJQl9TTVBfQVRUUl9QT1JUX0lORk87Ci0JaW5fbWFkLT5hdHRyX21vZCAgICAgICAgICAgPSBjcHVfdG9fYmUzMihwb3J0KTsKKwlpbml0X3F1ZXJ5X21hZChpbl9tYWQpOworCWluX21hZC0+YXR0cl9pZCAgPSBJQl9TTVBfQVRUUl9QT1JUX0lORk87CisJaW5fbWFkLT5hdHRyX21vZCA9IGNwdV90b19iZTMyKHBvcnQpOwogCiAJZXJyID0gbXRoY2FfTUFEX0lGQyh0b19tZGV2KGliZGV2KSwgMSwgMSwKIAkJCSAgICBwb3J0LCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQsCkBAIC0yMjAsMTggKzIxOSwxNCBAQAogCWludCBlcnIgPSAtRU5PTUVNOwogCXU4IHN0YXR1czsKIAotCWluX21hZCAgPSBrbWFsbG9jKHNpemVvZiAqaW5fbWFkLCBHRlBfS0VSTkVMKTsKKwlpbl9tYWQgID0ga3phbGxvYyhzaXplb2YgKmluX21hZCwgR0ZQX0tFUk5FTCk7CiAJb3V0X21hZCA9IGttYWxsb2Moc2l6ZW9mICpvdXRfbWFkLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluX21hZCB8fCAhb3V0X21hZCkKIAkJZ290byBvdXQ7CiAKLQltZW1zZXQoaW5fbWFkLCAwLCBzaXplb2YgKmluX21hZCk7Ci0JaW5fbWFkLT5iYXNlX3ZlcnNpb24gICAgICAgPSAxOwotCWluX21hZC0+bWdtdF9jbGFzcyAgICAgCSAgID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQ7Ci0JaW5fbWFkLT5jbGFzc192ZXJzaW9uICAJICAgPSAxOwotCWluX21hZC0+bWV0aG9kICAgICAgICAgCSAgID0gSUJfTUdNVF9NRVRIT0RfR0VUOwotCWluX21hZC0+YXR0cl9pZCAgIAkgICA9IElCX1NNUF9BVFRSX1BLRVlfVEFCTEU7Ci0JaW5fbWFkLT5hdHRyX21vZCAgICAgICAgICAgPSBjcHVfdG9fYmUzMihpbmRleCAvIDMyKTsKKwlpbml0X3F1ZXJ5X21hZChpbl9tYWQpOworCWluX21hZC0+YXR0cl9pZCAgPSBJQl9TTVBfQVRUUl9QS0VZX1RBQkxFOworCWluX21hZC0+YXR0cl9tb2QgPSBjcHVfdG9fYmUzMihpbmRleCAvIDMyKTsKIAogCWVyciA9IG10aGNhX01BRF9JRkModG9fbWRldihpYmRldiksIDEsIDEsCiAJCQkgICAgcG9ydCwgTlVMTCwgTlVMTCwgaW5fbWFkLCBvdXRfbWFkLApAQCAtMjU5LDE4ICsyNTQsMTQgQEAKIAlpbnQgZXJyID0gLUVOT01FTTsKIAl1OCBzdGF0dXM7CiAKLQlpbl9tYWQgID0ga21hbGxvYyhzaXplb2YgKmluX21hZCwgR0ZQX0tFUk5FTCk7CisJaW5fbWFkICA9IGt6YWxsb2Moc2l6ZW9mICppbl9tYWQsIEdGUF9LRVJORUwpOwogCW91dF9tYWQgPSBrbWFsbG9jKHNpemVvZiAqb3V0X21hZCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbl9tYWQgfHwgIW91dF9tYWQpCiAJCWdvdG8gb3V0OwogCi0JbWVtc2V0KGluX21hZCwgMCwgc2l6ZW9mICppbl9tYWQpOwotCWluX21hZC0+YmFzZV92ZXJzaW9uICAgICAgID0gMTsKLQlpbl9tYWQtPm1nbXRfY2xhc3MgICAgIAkgICA9IElCX01HTVRfQ0xBU1NfU1VCTl9MSURfUk9VVEVEOwotCWluX21hZC0+Y2xhc3NfdmVyc2lvbiAgCSAgID0gMTsKLQlpbl9tYWQtPm1ldGhvZCAgICAgICAgIAkgICA9IElCX01HTVRfTUVUSE9EX0dFVDsKLQlpbl9tYWQtPmF0dHJfaWQgICAJICAgPSBJQl9TTVBfQVRUUl9QT1JUX0lORk87Ci0JaW5fbWFkLT5hdHRyX21vZCAgICAgICAgICAgPSBjcHVfdG9fYmUzMihwb3J0KTsKKwlpbml0X3F1ZXJ5X21hZChpbl9tYWQpOworCWluX21hZC0+YXR0cl9pZCAgPSBJQl9TTVBfQVRUUl9QT1JUX0lORk87CisJaW5fbWFkLT5hdHRyX21vZCA9IGNwdV90b19iZTMyKHBvcnQpOwogCiAJZXJyID0gbXRoY2FfTUFEX0lGQyh0b19tZGV2KGliZGV2KSwgMSwgMSwKIAkJCSAgICBwb3J0LCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQsCkBAIC0yODQsMTMgKzI3NSw5IEBACiAKIAltZW1jcHkoZ2lkLT5yYXcsIG91dF9tYWQtPmRhdGEgKyA4LCA4KTsKIAotCW1lbXNldChpbl9tYWQsIDAsIHNpemVvZiAqaW5fbWFkKTsKLQlpbl9tYWQtPmJhc2VfdmVyc2lvbiAgICAgICA9IDE7Ci0JaW5fbWFkLT5tZ210X2NsYXNzICAgICAJICAgPSBJQl9NR01UX0NMQVNTX1NVQk5fTElEX1JPVVRFRDsKLQlpbl9tYWQtPmNsYXNzX3ZlcnNpb24gIAkgICA9IDE7Ci0JaW5fbWFkLT5tZXRob2QgICAgICAgICAJICAgPSBJQl9NR01UX01FVEhPRF9HRVQ7Ci0JaW5fbWFkLT5hdHRyX2lkICAgCSAgID0gSUJfU01QX0FUVFJfR1VJRF9JTkZPOwotCWluX21hZC0+YXR0cl9tb2QgICAgICAgICAgID0gY3B1X3RvX2JlMzIoaW5kZXggLyA4KTsKKwlpbml0X3F1ZXJ5X21hZChpbl9tYWQpOworCWluX21hZC0+YXR0cl9pZCAgPSBJQl9TTVBfQVRUUl9HVUlEX0lORk87CisJaW5fbWFkLT5hdHRyX21vZCA9IGNwdV90b19iZTMyKGluZGV4IC8gOCk7CiAKIAllcnIgPSBtdGhjYV9NQURfSUZDKHRvX21kZXYoaWJkZXYpLCAxLCAxLAogCQkJICAgIHBvcnQsIE5VTEwsIE5VTEwsIGluX21hZCwgb3V0X21hZCwKQEAgLTQ1OCw4ICs0NDUsMTAgQEAKIAlpZiAocGQtPnVvYmplY3QpIHsKIAkJY29udGV4dCA9IHRvX211Y29udGV4dChwZC0+dW9iamVjdC0+Y29udGV4dCk7CiAKLQkJaWYgKGliX2NvcHlfZnJvbV91ZGF0YSgmdWNtZCwgdWRhdGEsIHNpemVvZiB1Y21kKSkKLQkJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCQlpZiAoaWJfY29weV9mcm9tX3VkYXRhKCZ1Y21kLCB1ZGF0YSwgc2l6ZW9mIHVjbWQpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBlcnJfZnJlZTsKKwkJfQogCiAJCWVyciA9IG10aGNhX21hcF91c2VyX2RiKHRvX21kZXYocGQtPmRldmljZSksICZjb250ZXh0LT51YXIsCiAJCQkJCWNvbnRleHQtPmRiX3RhYiwgdWNtZC5kYl9pbmRleCwKQEAgLTUzNSw4ICs1MjQsMTAgQEAKIAkJaWYgKHBkLT51b2JqZWN0KSB7CiAJCQljb250ZXh0ID0gdG9fbXVjb250ZXh0KHBkLT51b2JqZWN0LT5jb250ZXh0KTsKIAotCQkJaWYgKGliX2NvcHlfZnJvbV91ZGF0YSgmdWNtZCwgdWRhdGEsIHNpemVvZiB1Y21kKSkKKwkJCWlmIChpYl9jb3B5X2Zyb21fdWRhdGEoJnVjbWQsIHVkYXRhLCBzaXplb2YgdWNtZCkpIHsKKwkJCQlrZnJlZShxcCk7CiAJCQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisJCQl9CiAKIAkJCWVyciA9IG10aGNhX21hcF91c2VyX2RiKHRvX21kZXYocGQtPmRldmljZSksICZjb250ZXh0LT51YXIsCiAJCQkJCQljb250ZXh0LT5kYl90YWIsCkBAIC03ODMsMjQgKzc3NCwyMCBAQAogCWlmICgoKmlvdmFfc3RhcnQgJiB+UEFHRV9NQVNLKSAhPSAoYnVmZmVyX2xpc3RbMF0uYWRkciAmIH5QQUdFX01BU0spKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotCWlmIChudW1fcGh5c19idWYgPiAxICYmCi0JICAgICgoYnVmZmVyX2xpc3RbMF0uYWRkciArIGJ1ZmZlcl9saXN0WzBdLnNpemUpICYgflBBR0VfTUFTSykpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCiAJbWFzayA9IDA7CiAJdG90YWxfc2l6ZSA9IDA7CiAJZm9yIChpID0gMDsgaSA8IG51bV9waHlzX2J1ZjsgKytpKSB7Ci0JCWlmIChpICE9IDAgJiYgYnVmZmVyX2xpc3RbaV0uYWRkciAmIH5QQUdFX01BU0spCi0JCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQkJaWYgKGkgIT0gMCAmJiBpICE9IG51bV9waHlzX2J1ZiAtIDEgJiYKLQkJICAgIChidWZmZXJfbGlzdFtpXS5zaXplICYgflBBR0VfTUFTSykpCi0JCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwkJaWYgKGkgIT0gMCkKKwkJCW1hc2sgfD0gYnVmZmVyX2xpc3RbaV0uYWRkcjsKKwkJaWYgKGkgIT0gbnVtX3BoeXNfYnVmIC0gMSkKKwkJCW1hc2sgfD0gYnVmZmVyX2xpc3RbaV0uYWRkciArIGJ1ZmZlcl9saXN0W2ldLnNpemU7CiAKIAkJdG90YWxfc2l6ZSArPSBidWZmZXJfbGlzdFtpXS5zaXplOwotCQlpZiAoaSA+IDApCi0JCQltYXNrIHw9IGJ1ZmZlcl9saXN0W2ldLmFkZHI7CiAJfQogCisJaWYgKG1hc2sgJiB+UEFHRV9NQVNLKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwogCS8qIEZpbmQgbGFyZ2VzdCBwYWdlIHNoaWZ0IHdlIGNhbiB1c2UgdG8gY292ZXIgYnVmZmVycyAqLwogCWZvciAoc2hpZnQgPSBQQUdFX1NISUZUOyBzaGlmdCA8IDMxOyArK3NoaWZ0KQogCQlpZiAobnVtX3BoeXNfYnVmID4gMSkgewpAQCAtMTA3MCwxMSArMTA1Nyw0OCBAQAogCSZjbGFzc19kZXZpY2VfYXR0cl9ib2FyZF9pZAogfTsKIAorc3RhdGljIGludCBtdGhjYV9pbml0X25vZGVfZGF0YShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCit7CisJc3RydWN0IGliX3NtcCAqaW5fbWFkICA9IE5VTEw7CisJc3RydWN0IGliX3NtcCAqb3V0X21hZCA9IE5VTEw7CisJaW50IGVyciA9IC1FTk9NRU07CisJdTggc3RhdHVzOworCisJaW5fbWFkICA9IGt6YWxsb2Moc2l6ZW9mICppbl9tYWQsIEdGUF9LRVJORUwpOworCW91dF9tYWQgPSBrbWFsbG9jKHNpemVvZiAqb3V0X21hZCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbl9tYWQgfHwgIW91dF9tYWQpCisJCWdvdG8gb3V0OworCisJaW5pdF9xdWVyeV9tYWQoaW5fbWFkKTsKKwlpbl9tYWQtPmF0dHJfaWQgPSBJQl9TTVBfQVRUUl9OT0RFX0lORk87CisKKwllcnIgPSBtdGhjYV9NQURfSUZDKGRldiwgMSwgMSwKKwkJCSAgICAxLCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQsCisJCQkgICAgJnN0YXR1cyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cykgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkoJmRldi0+aWJfZGV2Lm5vZGVfZ3VpZCwgb3V0X21hZC0+ZGF0YSArIDEyLCA4KTsKKworb3V0OgorCWtmcmVlKGluX21hZCk7CisJa2ZyZWUob3V0X21hZCk7CisJcmV0dXJuIGVycjsKK30KKwogaW50IG10aGNhX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJaW50IHJldDsKIAlpbnQgaTsKIAorCXJldCA9IG10aGNhX2luaXRfbm9kZV9kYXRhKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCXN0cmxjcHkoZGV2LT5pYl9kZXYubmFtZSwgIm10aGNhJWQiLCBJQl9ERVZJQ0VfTkFNRV9NQVgpOwogCWRldi0+aWJfZGV2Lm93bmVyICAgICAgICAgICAgICAgID0gVEhJU19NT0RVTEU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKaW5kZXggNTY0YjZkNS4uZmJhNjA4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKQEAgLTE0MzQsNyArMTQzNCw3IEBACiAJdTE2IHBrZXk7CiAKIAlpYl91ZF9oZWFkZXJfaW5pdCgyNTYsIC8qIGFzc3VtZSBhIE1BRCAqLwotCQkJICBzcXAtPnVkX2hlYWRlci5ncmhfcHJlc2VudCwKKwkJCSAgbXRoY2FfYWhfZ3JoX3ByZXNlbnQodG9fbWFoKHdyLT53ci51ZC5haCkpLAogCQkJICAmc3FwLT51ZF9oZWFkZXIpOwogCiAJZXJyID0gbXRoY2FfcmVhZF9haChkZXYsIHRvX21haCh3ci0+d3IudWQuYWgpLCAmc3FwLT51ZF9oZWFkZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oCmluZGV4IDk5MjNhMTUuLmUwYTU0MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmgKQEAgLTQ1LDExICs0NSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9pbmZpbmliYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKICNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CiAjaW5jbHVkZSA8cmRtYS9pYl9wYWNrLmg+CkBAIC0xMjMsOCArMTIzLDggQEAKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzdHJ1Y3Qgc2VtYXBob3JlIG1jYXN0X211dGV4OwotCXN0cnVjdCBzZW1hcGhvcmUgdmxhbl9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggbWNhc3RfbXV0ZXg7CisJc3RydWN0IG11dGV4IHZsYW5fbXV0ZXg7CiAKIAlzdHJ1Y3QgcmJfcm9vdCAgcGF0aF90cmVlOwogCXN0cnVjdCBsaXN0X2hlYWQgcGF0aF9saXN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCmluZGV4IDIzODg1ODAuLjg2YmNkZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAogI2RlZmluZQlJUE9JQl9PUF9SRUNWCSgxdWwgPDwgMzEpCiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKHBrZXlfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgocGtleV9tdXRleCk7CiAKIHN0cnVjdCBpcG9pYl9haCAqaXBvaWJfY3JlYXRlX2FoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBpYl9wZCAqcGQsIHN0cnVjdCBpYl9haF9hdHRyICphdHRyKQpAQCAtNDQ1LDI1ICs0NDUsMTYgQEAKIAogCS8qIFNodXRkb3duIHRoZSBQX0tleSB0aHJlYWQgaWYgc3RpbGwgYWN0aXZlICovCiAJaWYgKCF0ZXN0X2JpdChJUE9JQl9QS0VZX0FTU0lHTkVELCAmcHJpdi0+ZmxhZ3MpKSB7Ci0JCWRvd24oJnBrZXlfc2VtKTsKKwkJbXV0ZXhfbG9jaygmcGtleV9tdXRleCk7CiAJCXNldF9iaXQoSVBPSUJfUEtFWV9TVE9QLCAmcHJpdi0+ZmxhZ3MpOwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5wa2V5X3Rhc2spOwotCQl1cCgmcGtleV9zZW0pOworCQltdXRleF91bmxvY2soJnBrZXlfbXV0ZXgpOwogCQlmbHVzaF93b3JrcXVldWUoaXBvaWJfd29ya3F1ZXVlKTsKIAl9CiAKIAlpcG9pYl9tY2FzdF9zdG9wX3RocmVhZChkZXYsIDEpOwotCi0JLyoKLQkgKiBGbHVzaCB0aGUgbXVsdGljYXN0IGdyb3VwcyBmaXJzdCBzbyB3ZSBzdG9wIGFueSBtdWx0aWNhc3Qgam9pbnMuIFRoZQotCSAqIGNvbXBsZXRpb24gdGhyZWFkIG1heSBoYXZlIGFscmVhZHkgZGllZCBhbmQgd2UgbWF5IGRlYWRsb2NrIHdhaXRpbmcKLQkgKiBmb3IgdGhlIGNvbXBsZXRpb24gdGhyZWFkIHRvIGZpbmlzaCBzb21lIG11bHRpY2FzdCBqb2lucy4KLQkgKi8KIAlpcG9pYl9tY2FzdF9kZXZfZmx1c2goZGV2KTsKIAotCS8qIERlbGV0ZSBicm9hZGNhc3QgYW5kIGxvY2FsIGFkZHJlc3NlcyBzaW5jZSB0aGV5IHdpbGwgYmUgcmVjcmVhdGVkICovCi0JaXBvaWJfbWNhc3RfZGV2X2Rvd24oZGV2KTsKLQogCWlwb2liX2ZsdXNoX3BhdGhzKGRldik7CiAKIAlyZXR1cm4gMDsKQEAgLTYwOCwxMyArNTk5LDEzIEBACiAJaWYgKHRlc3RfYml0KElQT0lCX0ZMQUdfQURNSU5fVVAsICZwcml2LT5mbGFncykpCiAJCWlwb2liX2liX2Rldl91cChkZXYpOwogCi0JZG93bigmcHJpdi0+dmxhbl9tdXRleCk7CisJbXV0ZXhfbG9jaygmcHJpdi0+dmxhbl9tdXRleCk7CiAKIAkvKiBGbHVzaCBhbnkgY2hpbGQgaW50ZXJmYWNlcyB0b28gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwcml2LCAmcHJpdi0+Y2hpbGRfaW50ZnMsIGxpc3QpCiAJCWlwb2liX2liX2Rldl9mbHVzaCgmY3ByaXYtPmRldik7CiAKLQl1cCgmcHJpdi0+dmxhbl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT52bGFuX211dGV4KTsKIH0KIAogdm9pZCBpcG9pYl9pYl9kZXZfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNjI0LDkgKzYxNSw3IEBACiAJaXBvaWJfZGJnKHByaXYsICJjbGVhbmluZyB1cCBpYl9kZXZcbiIpOwogCiAJaXBvaWJfbWNhc3Rfc3RvcF90aHJlYWQoZGV2LCAxKTsKLQotCS8qIERlbGV0ZSB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgYW5kIHRoZSBsb2NhbCBhZGRyZXNzICovCi0JaXBvaWJfbWNhc3RfZGV2X2Rvd24oZGV2KTsKKwlpcG9pYl9tY2FzdF9kZXZfZmx1c2goZGV2KTsKIAogCWlwb2liX3RyYW5zcG9ydF9kZXZfY2xlYW51cChkZXYpOwogfQpAQCAtNjYyLDEyICs2NTEsMTIgQEAKIAlpZiAodGVzdF9iaXQoSVBPSUJfUEtFWV9BU1NJR05FRCwgJnByaXYtPmZsYWdzKSkKIAkJaXBvaWJfb3BlbihkZXYpOwogCWVsc2UgewotCQlkb3duKCZwa2V5X3NlbSk7CisJCW11dGV4X2xvY2soJnBrZXlfbXV0ZXgpOwogCQlpZiAoIXRlc3RfYml0KElQT0lCX1BLRVlfU1RPUCwgJnByaXYtPmZsYWdzKSkKIAkJCXF1ZXVlX2RlbGF5ZWRfd29yayhpcG9pYl93b3JrcXVldWUsCiAJCQkJCSAgICZwcml2LT5wa2V5X3Rhc2ssCiAJCQkJCSAgIEhaKTsKLQkJdXAoJnBrZXlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZwa2V5X211dGV4KTsKIAl9CiB9CiAKQEAgLTY4MSwxMiArNjcwLDEyIEBACiAKIAkvKiBQX0tleSB2YWx1ZSBub3QgYXNzaWduZWQgeWV0IC0gc3RhcnQgcG9sbGluZyAqLwogCWlmICghdGVzdF9iaXQoSVBPSUJfUEtFWV9BU1NJR05FRCwgJnByaXYtPmZsYWdzKSkgewotCQlkb3duKCZwa2V5X3NlbSk7CisJCW11dGV4X2xvY2soJnBrZXlfbXV0ZXgpOwogCQljbGVhcl9iaXQoSVBPSUJfUEtFWV9TVE9QLCAmcHJpdi0+ZmxhZ3MpOwogCQlxdWV1ZV9kZWxheWVkX3dvcmsoaXBvaWJfd29ya3F1ZXVlLAogCQkJCSAgICZwcml2LT5wa2V5X3Rhc2ssCiAJCQkJICAgSFopOwotCQl1cCgmcGtleV9zZW0pOworCQltdXRleF91bmxvY2soJnBrZXlfbXV0ZXgpOwogCQlyZXR1cm4gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKaW5kZXggNzgwMDA5Yy4uZmQzZjVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCQlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKmNwcml2OwogCiAJCS8qIEJyaW5nIHVwIGFueSBjaGlsZCBpbnRlcmZhY2VzIHRvbyAqLwotCQlkb3duKCZwcml2LT52bGFuX211dGV4KTsKKwkJbXV0ZXhfbG9jaygmcHJpdi0+dmxhbl9tdXRleCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3ByaXYsICZwcml2LT5jaGlsZF9pbnRmcywgbGlzdCkgewogCQkJaW50IGZsYWdzOwogCkBAIC0xMTUsNyArMTE1LDcgQEAKIAogCQkJZGV2X2NoYW5nZV9mbGFncyhjcHJpdi0+ZGV2LCBmbGFncyB8IElGRl9VUCk7CiAJCX0KLQkJdXAoJnByaXYtPnZsYW5fbXV0ZXgpOworCQltdXRleF91bmxvY2soJnByaXYtPnZsYW5fbXV0ZXgpOwogCX0KIAogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CkBAIC0xNDAsNyArMTQwLDcgQEAKIAkJc3RydWN0IGlwb2liX2Rldl9wcml2ICpjcHJpdjsKIAogCQkvKiBCcmluZyBkb3duIGFueSBjaGlsZCBpbnRlcmZhY2VzIHRvbyAqLwotCQlkb3duKCZwcml2LT52bGFuX211dGV4KTsKKwkJbXV0ZXhfbG9jaygmcHJpdi0+dmxhbl9tdXRleCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3ByaXYsICZwcml2LT5jaGlsZF9pbnRmcywgbGlzdCkgewogCQkJaW50IGZsYWdzOwogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAogCQkJZGV2X2NoYW5nZV9mbGFncyhjcHJpdi0+ZGV2LCBmbGFncyAmIH5JRkZfVVApOwogCQl9Ci0JCXVwKCZwcml2LT52bGFuX211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZwcml2LT52bGFuX211dGV4KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTg5Miw4ICs4OTIsOCBAQAogCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+dHhfbG9jayk7CiAKLQlpbml0X01VVEVYKCZwcml2LT5tY2FzdF9tdXRleCk7Ci0JaW5pdF9NVVRFWCgmcHJpdi0+dmxhbl9tdXRleCk7CisJbXV0ZXhfaW5pdCgmcHJpdi0+bWNhc3RfbXV0ZXgpOworCW11dGV4X2luaXQoJnByaXYtPnZsYW5fbXV0ZXgpOwogCiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnBhdGhfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmNoaWxkX2ludGZzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCmluZGV4IGVkMGMyZWEuLjk4MDM5ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYwpAQCAtNTUsNyArNTUsNyBAQAogCQkgIkVuYWJsZSBtdWx0aWNhc3QgZGVidWcgdHJhY2luZyBpZiA+IDAiKTsKICNlbmRpZgogCi1zdGF0aWMgREVDTEFSRV9NVVRFWChtY2FzdF9tdXRleCk7CitzdGF0aWMgREVGSU5FX01VVEVYKG1jYXN0X211dGV4KTsKIAogLyogVXNlZCBmb3IgYWxsIG11bHRpY2FzdCBqb2lucyAoYnJvYWRjYXN0LCBJUHY0IG1jYXN0IGFuZCBJUHY2IG1jYXN0KSAqLwogc3RydWN0IGlwb2liX21jYXN0IHsKQEAgLTk3LDggKzk3LDYgQEAKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpcG9pYl9uZWlnaCAqbmVpZ2gsICp0bXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlMSVNUX0hFQUQoYWhfbGlzdCk7Ci0Jc3RydWN0IGlwb2liX2FoICphaCwgKnRhaDsKIAogCWlwb2liX2RiZ19tY2FzdChuZXRkZXZfcHJpdihkZXYpLAogCQkJImRlbGV0aW5nIG11bHRpY2FzdCBncm91cCAiIElQT0lCX0dJRF9GTVQgIlxuIiwKQEAgLTEwNyw4ICsxMDUsMTQgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5laWdoLCB0bXAsICZtY2FzdC0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCQkvKgorCQkgKiBJdCdzIHNhZmUgdG8gY2FsbCBpcG9pYl9wdXRfYWgoKSBpbnNpZGUgcHJpdi0+bG9jaworCQkgKiBoZXJlLCBiZWNhdXNlIHdlIGtub3cgdGhhdCBtY2FzdC0+YWggd2lsbCBhbHdheXMKKwkJICogaG9sZCBvbmUgbW9yZSByZWZlcmVuY2UsIHNvIGlwb2liX3B1dF9haCgpIHdpbGwKKwkJICogbmV2ZXIgZG8gbW9yZSB0aGFuIGRlY3JlbWVudCB0aGUgcmVmIGNvdW50LgorCQkgKi8KIAkJaWYgKG5laWdoLT5haCkKLQkJCWxpc3RfYWRkX3RhaWwoJm5laWdoLT5haC0+bGlzdCwgJmFoX2xpc3QpOworCQkJaXBvaWJfcHV0X2FoKG5laWdoLT5haCk7CiAJCSp0b19pcG9pYl9uZWlnaChuZWlnaC0+bmVpZ2hib3VyKSA9IE5VTEw7CiAJCW5laWdoLT5uZWlnaGJvdXItPm9wcy0+ZGVzdHJ1Y3RvciA9IE5VTEw7CiAJCWtmcmVlKG5laWdoKTsKQEAgLTExNiw5ICsxMjAsNiBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFoLCB0YWgsICZhaF9saXN0LCBsaXN0KQotCQlpcG9pYl9wdXRfYWgoYWgpOwotCiAJaWYgKG1jYXN0LT5haCkKIAkJaXBvaWJfcHV0X2FoKG1jYXN0LT5haCk7CiAKQEAgLTM4NCwxMCArMzg1LDEwIEBACiAKIAlpZiAoIXN0YXR1cyAmJiAhaXBvaWJfbWNhc3Rfam9pbl9maW5pc2gobWNhc3QsIG1jbWVtYmVyKSkgewogCQltY2FzdC0+YmFja29mZiA9IDE7Ci0JCWRvd24oJm1jYXN0X211dGV4KTsKKwkJbXV0ZXhfbG9jaygmbWNhc3RfbXV0ZXgpOwogCQlpZiAodGVzdF9iaXQoSVBPSUJfTUNBU1RfUlVOLCAmcHJpdi0+ZmxhZ3MpKQogCQkJcXVldWVfd29yayhpcG9pYl93b3JrcXVldWUsICZwcml2LT5tY2FzdF90YXNrKTsKLQkJdXAoJm1jYXN0X211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZtY2FzdF9tdXRleCk7CiAJCWNvbXBsZXRlKCZtY2FzdC0+ZG9uZSk7CiAJCXJldHVybjsKIAl9CkBAIC00MTcsNyArNDE4LDcgQEAKIAogCW1jYXN0LT5xdWVyeSA9IE5VTEw7CiAKLQlkb3duKCZtY2FzdF9tdXRleCk7CisJbXV0ZXhfbG9jaygmbWNhc3RfbXV0ZXgpOwogCWlmICh0ZXN0X2JpdChJUE9JQl9NQ0FTVF9SVU4sICZwcml2LT5mbGFncykpIHsKIAkJaWYgKHN0YXR1cyA9PSAtRVRJTUVET1VUKQogCQkJcXVldWVfd29yayhpcG9pYl93b3JrcXVldWUsICZwcml2LT5tY2FzdF90YXNrKTsKQEAgLTQyNiw3ICs0MjcsNyBAQAogCQkJCQkgICBtY2FzdC0+YmFja29mZiAqIEhaKTsKIAl9IGVsc2UKIAkJY29tcGxldGUoJm1jYXN0LT5kb25lKTsKLQl1cCgmbWNhc3RfbXV0ZXgpOworCW11dGV4X3VubG9jaygmbWNhc3RfbXV0ZXgpOwogCiAJcmV0dXJuOwogfQpAQCAtNDgxLDEyICs0ODIsMTIgQEAKIAkJaWYgKG1jYXN0LT5iYWNrb2ZmID4gSVBPSUJfTUFYX0JBQ0tPRkZfU0VDT05EUykKIAkJCW1jYXN0LT5iYWNrb2ZmID0gSVBPSUJfTUFYX0JBQ0tPRkZfU0VDT05EUzsKIAotCQlkb3duKCZtY2FzdF9tdXRleCk7CisJCW11dGV4X2xvY2soJm1jYXN0X211dGV4KTsKIAkJaWYgKHRlc3RfYml0KElQT0lCX01DQVNUX1JVTiwgJnByaXYtPmZsYWdzKSkKIAkJCXF1ZXVlX2RlbGF5ZWRfd29yayhpcG9pYl93b3JrcXVldWUsCiAJCQkJCSAgICZwcml2LT5tY2FzdF90YXNrLAogCQkJCQkgICBtY2FzdC0+YmFja29mZiAqIEhaKTsKLQkJdXAoJm1jYXN0X211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZtY2FzdF9tdXRleCk7CiAJfSBlbHNlCiAJCW1jYXN0LT5xdWVyeV9pZCA9IHJldDsKIH0KQEAgLTUxOSwxMSArNTIwLDExIEBACiAJCXByaXYtPmJyb2FkY2FzdCA9IGlwb2liX21jYXN0X2FsbG9jKGRldiwgMSk7CiAJCWlmICghcHJpdi0+YnJvYWRjYXN0KSB7CiAJCQlpcG9pYl93YXJuKHByaXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgYnJvYWRjYXN0IGdyb3VwXG4iKTsKLQkJCWRvd24oJm1jYXN0X211dGV4KTsKKwkJCW11dGV4X2xvY2soJm1jYXN0X211dGV4KTsKIAkJCWlmICh0ZXN0X2JpdChJUE9JQl9NQ0FTVF9SVU4sICZwcml2LT5mbGFncykpCiAJCQkJcXVldWVfZGVsYXllZF93b3JrKGlwb2liX3dvcmtxdWV1ZSwKIAkJCQkJCSAgICZwcml2LT5tY2FzdF90YXNrLCBIWik7Ci0JCQl1cCgmbWNhc3RfbXV0ZXgpOworCQkJbXV0ZXhfdW5sb2NrKCZtY2FzdF9tdXRleCk7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtNTc5LDEwICs1ODAsMTAgQEAKIAogCWlwb2liX2RiZ19tY2FzdChwcml2LCAic3RhcnRpbmcgbXVsdGljYXN0IHRocmVhZFxuIik7CiAKLQlkb3duKCZtY2FzdF9tdXRleCk7CisJbXV0ZXhfbG9jaygmbWNhc3RfbXV0ZXgpOwogCWlmICghdGVzdF9hbmRfc2V0X2JpdChJUE9JQl9NQ0FTVF9SVU4sICZwcml2LT5mbGFncykpCiAJCXF1ZXVlX3dvcmsoaXBvaWJfd29ya3F1ZXVlLCAmcHJpdi0+bWNhc3RfdGFzayk7Ci0JdXAoJm1jYXN0X211dGV4KTsKKwltdXRleF91bmxvY2soJm1jYXN0X211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtNTk0LDEwICs1OTUsMTAgQEAKIAogCWlwb2liX2RiZ19tY2FzdChwcml2LCAic3RvcHBpbmcgbXVsdGljYXN0IHRocmVhZFxuIik7CiAKLQlkb3duKCZtY2FzdF9tdXRleCk7CisJbXV0ZXhfbG9jaygmbWNhc3RfbXV0ZXgpOwogCWNsZWFyX2JpdChJUE9JQl9NQ0FTVF9SVU4sICZwcml2LT5mbGFncyk7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+bWNhc3RfdGFzayk7Ci0JdXAoJm1jYXN0X211dGV4KTsKKwltdXRleF91bmxvY2soJm1jYXN0X211dGV4KTsKIAogCWlmIChmbHVzaCkKIAkJZmx1c2hfd29ya3F1ZXVlKGlwb2liX3dvcmtxdWV1ZSk7CkBAIC03NDEsNDggKzc0MiwyMyBAQAogewogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJTElTVF9IRUFEKHJlbW92ZV9saXN0KTsKLQlzdHJ1Y3QgaXBvaWJfbWNhc3QgKm1jYXN0LCAqdG1jYXN0LCAqbm1jYXN0OworCXN0cnVjdCBpcG9pYl9tY2FzdCAqbWNhc3QsICp0bWNhc3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlwb2liX2RiZ19tY2FzdChwcml2LCAiZmx1c2hpbmcgbXVsdGljYXN0IGxpc3RcbiIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtY2FzdCwgdG1jYXN0LCAmcHJpdi0+bXVsdGljYXN0X2xpc3QsIGxpc3QpIHsKLQkJbm1jYXN0ID0gaXBvaWJfbWNhc3RfYWxsb2MoZGV2LCAwKTsKLQkJaWYgKG5tY2FzdCkgewotCQkJbm1jYXN0LT5mbGFncyA9Ci0JCQkJbWNhc3QtPmZsYWdzICYgKDEgPDwgSVBPSUJfTUNBU1RfRkxBR19TRU5ET05MWSk7Ci0KLQkJCW5tY2FzdC0+bWNtZW1iZXIubWdpZCA9IG1jYXN0LT5tY21lbWJlci5tZ2lkOwotCi0JCQkvKiBBZGQgdGhlIG5ldyBncm91cCBpbiBiZWZvcmUgdGhlIHRvLWJlLWRlc3Ryb3llZCBncm91cCAqLwotCQkJbGlzdF9hZGRfdGFpbCgmbm1jYXN0LT5saXN0LCAmbWNhc3QtPmxpc3QpOwotCQkJbGlzdF9kZWxfaW5pdCgmbWNhc3QtPmxpc3QpOwotCi0JCQlyYl9yZXBsYWNlX25vZGUoJm1jYXN0LT5yYl9ub2RlLCAmbm1jYXN0LT5yYl9ub2RlLAotCQkJCQkmcHJpdi0+bXVsdGljYXN0X3RyZWUpOwotCi0JCQlsaXN0X2FkZF90YWlsKCZtY2FzdC0+bGlzdCwgJnJlbW92ZV9saXN0KTsKLQkJfSBlbHNlIHsKLQkJCWlwb2liX3dhcm4ocHJpdiwgImNvdWxkIG5vdCByZWFsbG9jYXRlIG11bHRpY2FzdCBncm91cCAiCi0JCQkJICAgSVBPSUJfR0lEX0ZNVCAiXG4iLAotCQkJCSAgIElQT0lCX0dJRF9BUkcobWNhc3QtPm1jbWVtYmVyLm1naWQpKTsKLQkJfQorCQlsaXN0X2RlbCgmbWNhc3QtPmxpc3QpOworCQlyYl9lcmFzZSgmbWNhc3QtPnJiX25vZGUsICZwcml2LT5tdWx0aWNhc3RfdHJlZSk7CisJCWxpc3RfYWRkX3RhaWwoJm1jYXN0LT5saXN0LCAmcmVtb3ZlX2xpc3QpOwogCX0KIAogCWlmIChwcml2LT5icm9hZGNhc3QpIHsKLQkJbm1jYXN0ID0gaXBvaWJfbWNhc3RfYWxsb2MoZGV2LCAwKTsKLQkJaWYgKG5tY2FzdCkgewotCQkJbm1jYXN0LT5tY21lbWJlci5tZ2lkID0gcHJpdi0+YnJvYWRjYXN0LT5tY21lbWJlci5tZ2lkOwotCi0JCQlyYl9yZXBsYWNlX25vZGUoJnByaXYtPmJyb2FkY2FzdC0+cmJfbm9kZSwKLQkJCQkJJm5tY2FzdC0+cmJfbm9kZSwKLQkJCQkJJnByaXYtPm11bHRpY2FzdF90cmVlKTsKLQotCQkJbGlzdF9hZGRfdGFpbCgmcHJpdi0+YnJvYWRjYXN0LT5saXN0LCAmcmVtb3ZlX2xpc3QpOwotCQl9Ci0KLQkJcHJpdi0+YnJvYWRjYXN0ID0gbm1jYXN0OworIAkJcmJfZXJhc2UoJnByaXYtPmJyb2FkY2FzdC0+cmJfbm9kZSwgJnByaXYtPm11bHRpY2FzdF90cmVlKTsKKwkJbGlzdF9hZGRfdGFpbCgmcHJpdi0+YnJvYWRjYXN0LT5saXN0LCAmcmVtb3ZlX2xpc3QpOworCQlwcml2LT5icm9hZGNhc3QgPSBOVUxMOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKQEAgLTc5MywyNCArNzY5LDYgQEAKIAl9CiB9CiAKLXZvaWQgaXBvaWJfbWNhc3RfZGV2X2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBEZWxldGUgYnJvYWRjYXN0IHNpbmNlIGl0IHdpbGwgYmUgcmVjcmVhdGVkICovCi0JaWYgKHByaXYtPmJyb2FkY2FzdCkgewotCQlpcG9pYl9kYmdfbWNhc3QocHJpdiwgImRlbGV0aW5nIGJyb2FkY2FzdCBncm91cFxuIik7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJcmJfZXJhc2UoJnByaXYtPmJyb2FkY2FzdC0+cmJfbm9kZSwgJnByaXYtPm11bHRpY2FzdF90cmVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlpcG9pYl9tY2FzdF9sZWF2ZShkZXYsIHByaXYtPmJyb2FkY2FzdCk7Ci0JCWlwb2liX21jYXN0X2ZyZWUocHJpdi0+YnJvYWRjYXN0KTsKLQkJcHJpdi0+YnJvYWRjYXN0ID0gTlVMTDsKLQl9Ci19Ci0KIHZvaWQgaXBvaWJfbWNhc3RfcmVzdGFydF90YXNrKHZvaWQgKmRldl9wdHIpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9wdHI7CkBAIC04MjQsNyArNzgyLDggQEAKIAogCWlwb2liX21jYXN0X3N0b3BfdGhyZWFkKGRldiwgMCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnhtaXRfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CiAKIAkvKgogCSAqIFVuZm9ydHVuYXRlbHksIHRoZSBuZXR3b3JraW5nIGNvcmUgb25seSBnaXZlcyB1cyBhIGxpc3Qgb2YgYWxsIG9mCkBAIC04OTYsNyArODU1LDkgQEAKIAkJCWxpc3RfYWRkX3RhaWwoJm1jYXN0LT5saXN0LCAmcmVtb3ZlX2xpc3QpOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnhtaXRfbG9jaywgZmxhZ3MpOwogCiAJLyogV2UgaGF2ZSB0byBjYW5jZWwgb3V0c2lkZSBvZiB0aGUgc3BpbmxvY2sgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWNhc3QsIHRtY2FzdCwgJnJlbW92ZV9saXN0LCBsaXN0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZlcmJzLmMKaW5kZXggZTgyOWUxMC4uZmFhZjEwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl92ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmVyYnMuYwpAQCAtNjUsOSArNjUsOSBAQAogCX0KIAogCS8qIGF0dGFjaCBRUCB0byBtdWx0aWNhc3QgZ3JvdXAgKi8KLQlkb3duKCZwcml2LT5tY2FzdF9tdXRleCk7CisJbXV0ZXhfbG9jaygmcHJpdi0+bWNhc3RfbXV0ZXgpOwogCXJldCA9IGliX2F0dGFjaF9tY2FzdChwcml2LT5xcCwgbWdpZCwgbWxpZCk7Ci0JdXAoJnByaXYtPm1jYXN0X211dGV4KTsKKwltdXRleF91bmxvY2soJnByaXYtPm1jYXN0X211dGV4KTsKIAlpZiAocmV0KQogCQlpcG9pYl93YXJuKHByaXYsICJmYWlsZWQgdG8gYXR0YWNoIHRvIG11bHRpY2FzdCBncm91cCwgcmV0ID0gJWRcbiIsIHJldCk7CiAKQEAgLTgxLDkgKzgxLDkgQEAKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByZXQ7CiAKLQlkb3duKCZwcml2LT5tY2FzdF9tdXRleCk7CisJbXV0ZXhfbG9jaygmcHJpdi0+bWNhc3RfbXV0ZXgpOwogCXJldCA9IGliX2RldGFjaF9tY2FzdChwcml2LT5xcCwgbWdpZCwgbWxpZCk7Ci0JdXAoJnByaXYtPm1jYXN0X211dGV4KTsKKwltdXRleF91bmxvY2soJnByaXYtPm1jYXN0X211dGV4KTsKIAlpZiAocmV0KQogCQlpcG9pYl93YXJuKHByaXYsICJpYl9kZXRhY2hfbWNhc3QgZmFpbGVkIChyZXN1bHQgPSAlZClcbiIsIHJldCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmxhbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl92bGFuLmMKaW5kZXggZDI4MGIzNC4uNGNhMTc1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl92bGFuLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl92bGFuLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAogCXBwcml2ID0gbmV0ZGV2X3ByaXYocGRldik7CiAKLQlkb3duKCZwcHJpdi0+dmxhbl9tdXRleCk7CisJbXV0ZXhfbG9jaygmcHByaXYtPnZsYW5fbXV0ZXgpOwogCiAJLyoKIAkgKiBGaXJzdCBlbnN1cmUgdGhpcyBpc24ndCBhIGR1cGxpY2F0ZS4gV2UgY2hlY2sgdGhlIHBhcmVudCBkZXZpY2UgYW5kCkBAIC0xMjQsNyArMTI0LDcgQEAKIAogCWxpc3RfYWRkX3RhaWwoJnByaXYtPmxpc3QsICZwcHJpdi0+Y2hpbGRfaW50ZnMpOwogCi0JdXAoJnBwcml2LT52bGFuX211dGV4KTsKKwltdXRleF91bmxvY2soJnBwcml2LT52bGFuX211dGV4KTsKIAogCXJldHVybiAwOwogCkBAIC0xMzksNyArMTM5LDcgQEAKIAlmcmVlX25ldGRldihwcml2LT5kZXYpOwogCiBlcnI6Ci0JdXAoJnBwcml2LT52bGFuX211dGV4KTsKKwltdXRleF91bmxvY2soJnBwcml2LT52bGFuX211dGV4KTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xNTMsNyArMTUzLDcgQEAKIAogCXBwcml2ID0gbmV0ZGV2X3ByaXYocGRldik7CiAKLQlkb3duKCZwcHJpdi0+dmxhbl9tdXRleCk7CisJbXV0ZXhfbG9jaygmcHByaXYtPnZsYW5fbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwcml2LCB0cHJpdiwgJnBwcml2LT5jaGlsZF9pbnRmcywgbGlzdCkgewogCQlpZiAocHJpdi0+cGtleSA9PSBwa2V5KSB7CiAJCQl1bnJlZ2lzdGVyX25ldGRldihwcml2LT5kZXYpOwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQl1cCgmcHByaXYtPnZsYW5fbXV0ZXgpOworCW11dGV4X3VubG9jaygmcHByaXYtPnZsYW5fbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKaW5kZXggZGQ0ODhkMy4uMzEyMDdlNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5jCkBAIC0xNTE2LDggKzE1MTYsNyBAQAogCiBzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocG9ydCwgU19JUlVHTywgc2hvd19wb3J0LCBOVUxMKTsKIAotc3RhdGljIHN0cnVjdCBzcnBfaG9zdCAqc3JwX2FkZF9wb3J0KHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSwKLQkJCQkgICAgIF9fYmU2NCBub2RlX2d1aWQsIHU4IHBvcnQpCitzdGF0aWMgc3RydWN0IHNycF9ob3N0ICpzcnBfYWRkX3BvcnQoc3RydWN0IGliX2RldmljZSAqZGV2aWNlLCB1OCBwb3J0KQogewogCXN0cnVjdCBzcnBfaG9zdCAqaG9zdDsKIApAQCAtMTUzMiw3ICsxNTMxLDcgQEAKIAlob3N0LT5wb3J0ID0gcG9ydDsKIAogCWhvc3QtPmluaXRpYXRvcl9wb3J0X2lkWzddID0gcG9ydDsKLQltZW1jcHkoaG9zdC0+aW5pdGlhdG9yX3BvcnRfaWQgKyA4LCAmbm9kZV9ndWlkLCA4KTsKKwltZW1jcHkoaG9zdC0+aW5pdGlhdG9yX3BvcnRfaWQgKyA4LCAmZGV2aWNlLT5ub2RlX2d1aWQsIDgpOwogCiAJaG9zdC0+cGQgICA9IGliX2FsbG9jX3BkKGRldmljZSk7CiAJaWYgKElTX0VSUihob3N0LT5wZCkpCkBAIC0xNTgwLDIyICsxNTc5LDExIEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqZGV2X2xpc3Q7CiAJc3RydWN0IHNycF9ob3N0ICpob3N0OwotCXN0cnVjdCBpYl9kZXZpY2VfYXR0ciAqZGV2X2F0dHI7CiAJaW50IHMsIGUsIHA7CiAKLQlkZXZfYXR0ciA9IGttYWxsb2Moc2l6ZW9mICpkZXZfYXR0ciwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXZfYXR0cikKLQkJcmV0dXJuOwotCi0JaWYgKGliX3F1ZXJ5X2RldmljZShkZXZpY2UsIGRldl9hdHRyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiQ291bGRuJ3QgcXVlcnkgbm9kZSBHVUlEIGZvciAlcy5cbiIsCi0JCSAgICAgICBkZXZpY2UtPm5hbWUpOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlkZXZfbGlzdCA9IGttYWxsb2Moc2l6ZW9mICpkZXZfbGlzdCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXZfbGlzdCkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAogCUlOSVRfTElTVF9IRUFEKGRldl9saXN0KTsKIApAQCAtMTYwOCwxNSArMTU5NiwxMiBAQAogCX0KIAogCWZvciAocCA9IHM7IHAgPD0gZTsgKytwKSB7Ci0JCWhvc3QgPSBzcnBfYWRkX3BvcnQoZGV2aWNlLCBkZXZfYXR0ci0+bm9kZV9ndWlkLCBwKTsKKwkJaG9zdCA9IHNycF9hZGRfcG9ydChkZXZpY2UsIHApOwogCQlpZiAoaG9zdCkKIAkJCWxpc3RfYWRkX3RhaWwoJmhvc3QtPmxpc3QsIGRldl9saXN0KTsKIAl9CiAKIAlpYl9zZXRfY2xpZW50X2RhdGEoZGV2aWNlLCAmc3JwX2NsaWVudCwgZGV2X2xpc3QpOwotCi1vdXQ6Ci0Ja2ZyZWUoZGV2X2F0dHIpOwogfQogCiBzdGF0aWMgdm9pZCBzcnBfcmVtb3ZlX29uZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKaW5kZXggY2FhYzZkNi4uYjc2NWExNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKQEAgLTUwLDkgKzUwLDcgQEAKIAogc3RhdGljIExJU1RfSEVBRChnYW1lcG9ydF9saXN0KTsKIAotc3RhdGljIHN0cnVjdCBidXNfdHlwZSBnYW1lcG9ydF9idXMgPSB7Ci0JLm5hbWUgPQkiZ2FtZXBvcnQiLAotfTsKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgZ2FtZXBvcnRfYnVzOwogCiBzdGF0aWMgdm9pZCBnYW1lcG9ydF9hZGRfcG9ydChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KTsKIHN0YXRpYyB2b2lkIGdhbWVwb3J0X2Rlc3Ryb3lfcG9ydChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KTsKQEAgLTcwMywxMSArNzAxLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgZ2FtZXBvcnRfYnVzID0geworCS5uYW1lID0JImdhbWVwb3J0IiwKKwkucHJvYmUgPSBnYW1lcG9ydF9kcml2ZXJfcHJvYmUsCisJLnJlbW92ZSA9IGdhbWVwb3J0X2RyaXZlcl9yZW1vdmUsCit9OworCiB2b2lkIF9fZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBnYW1lcG9ydF9kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIpCiB7CiAJZHJ2LT5kcml2ZXIuYnVzID0gJmdhbWVwb3J0X2J1czsKLQlkcnYtPmRyaXZlci5wcm9iZSA9IGdhbWVwb3J0X2RyaXZlcl9wcm9iZTsKLQlkcnYtPmRyaXZlci5yZW1vdmUgPSBnYW1lcG9ydF9kcml2ZXJfcmVtb3ZlOwogCWdhbWVwb3J0X3F1ZXVlX2V2ZW50KGRydiwgb3duZXIsIEdBTUVQT1JUX1JFR0lTVEVSX0RSSVZFUik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQuYwppbmRleCBmZTMzZmYzLi40ZmUzZGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2lucHV0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCkBAIC01MjgsNDAgKzUyOCw1NiBAQAogSU5QVVRfREVWX1NUUklOR19BVFRSX1NIT1cocGh5cyk7CiBJTlBVVF9ERVZfU1RSSU5HX0FUVFJfU0hPVyh1bmlxKTsKIAotc3RhdGljIGludCBwcmludF9tb2RhbGlhc19iaXRzKGNoYXIgKmJ1ZiwgY2hhciBwcmVmaXgsIHVuc2lnbmVkIGxvbmcgKmFyciwKK3N0YXRpYyBpbnQgcHJpbnRfbW9kYWxpYXNfYml0cyhjaGFyICpidWYsIGludCBzaXplLCBjaGFyIHByZWZpeCwgdW5zaWduZWQgbG9uZyAqYXJyLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBtaW4sIHVuc2lnbmVkIGludCBtYXgpCiB7CiAJaW50IGxlbiwgaTsKIAotCWxlbiA9IHNwcmludGYoYnVmLCAiJWMiLCBwcmVmaXgpOworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZSwgIiVjIiwgcHJlZml4KTsKIAlmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykKIAkJaWYgKGFycltMT05HKGkpXSAmIEJJVChpKSkKLQkJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIlWCwiLCBpKTsKKwkJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sICIlWCwiLCBpKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHByaW50X21vZGFsaWFzKGNoYXIgKmJ1ZiwgaW50IHNpemUsIHN0cnVjdCBpbnB1dF9kZXYgKmlkKQoreworCWludCBsZW47CisKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemUsICJpbnB1dDpiJTA0WHYlMDRYcCUwNFhlJTA0WC0iLAorCQkgICAgICAgaWQtPmlkLmJ1c3R5cGUsCisJCSAgICAgICBpZC0+aWQudmVuZG9yLAorCQkgICAgICAgaWQtPmlkLnByb2R1Y3QsCisJCSAgICAgICBpZC0+aWQudmVyc2lvbik7CisKKwlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYgKyBsZW4sIHNpemUgLSBsZW4sICdlJywgaWQtPmV2Yml0LAorCQkJCSAgIDAsIEVWX01BWCk7CisJbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAnaycsIGlkLT5rZXliaXQsCisJCQkJICAgS0VZX01JTl9JTlRFUkVTVElORywgS0VZX01BWCk7CisJbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAncicsIGlkLT5yZWxiaXQsCisJCQkJICAgMCwgUkVMX01BWCk7CisJbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAnYScsIGlkLT5hYnNiaXQsCisJCQkJICAgMCwgQUJTX01BWCk7CisJbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAnbScsIGlkLT5tc2NiaXQsCisJCQkJICAgMCwgTVNDX01BWCk7CisJbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAnbCcsIGlkLT5sZWRiaXQsCisJCQkJICAgMCwgTEVEX01BWCk7CisJbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAncycsIGlkLT5zbmRiaXQsCisJCQkJICAgMCwgU05EX01BWCk7CisJbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAnZicsIGlkLT5mZmJpdCwKKwkJCQkgICAwLCBGRl9NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ3cnLCBpZC0+c3diaXQsCisJCQkJICAgMCwgU1dfTUFYKTsKIAlyZXR1cm4gbGVuOwogfQogCiBzdGF0aWMgc3NpemVfdCBpbnB1dF9kZXZfc2hvd19tb2RhbGlhcyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppZCA9IHRvX2lucHV0X2RldihkZXYpOwotCXNzaXplX3QgbGVuID0gMDsKKwlzc2l6ZV90IGxlbjsKIAotCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJpbnB1dDpiJTA0WHYlMDRYcCUwNFhlJTA0WC0iLAotCQkgICAgICAgaWQtPmlkLmJ1c3R5cGUsCi0JCSAgICAgICBpZC0+aWQudmVuZG9yLAotCQkgICAgICAgaWQtPmlkLnByb2R1Y3QsCi0JCSAgICAgICBpZC0+aWQudmVyc2lvbik7Ci0KLQlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYrbGVuLCAnZScsIGlkLT5ldmJpdCwgMCwgRVZfTUFYKTsKLQlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYrbGVuLCAnaycsIGlkLT5rZXliaXQsCi0JCQkJICAgS0VZX01JTl9JTlRFUkVTVElORywgS0VZX01BWCk7Ci0JbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmK2xlbiwgJ3InLCBpZC0+cmVsYml0LCAwLCBSRUxfTUFYKTsKLQlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYrbGVuLCAnYScsIGlkLT5hYnNiaXQsIDAsIEFCU19NQVgpOwotCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZitsZW4sICdtJywgaWQtPm1zY2JpdCwgMCwgTVNDX01BWCk7Ci0JbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmK2xlbiwgJ2wnLCBpZC0+bGVkYml0LCAwLCBMRURfTUFYKTsKLQlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYrbGVuLCAncycsIGlkLT5zbmRiaXQsIDAsIFNORF9NQVgpOwotCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZitsZW4sICdmJywgaWQtPmZmYml0LCAwLCBGRl9NQVgpOwotCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZitsZW4sICd3JywgaWQtPnN3Yml0LCAwLCBTV19NQVgpOwotCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJcbiIpOworCWxlbiA9IHByaW50X21vZGFsaWFzKGJ1ZiwgUEFHRV9TSVpFLCBpZCk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFLWxlbiwgIlxuIik7CiAJcmV0dXJuIGxlbjsKIH0KIHN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihtb2RhbGlhcywgU19JUlVHTywgaW5wdXRfZGV2X3Nob3dfbW9kYWxpYXMsIE5VTEwpOwpAQCAtNzI4LDggKzc0NCwxMSBAQAogCWlmICh0ZXN0X2JpdChFVl9TVywgZGV2LT5ldmJpdCkpCiAJCUlOUFVUX0FERF9IT1RQTFVHX0JNX1ZBUigiU1c9IiwgZGV2LT5zd2JpdCwgU1dfTUFYKTsKIAotCWVudnBbaV0gPSBOVUxMOworCWVudnBbaSsrXSA9IGJ1ZmZlciArIGxlbjsKKwlsZW4gKz0gc25wcmludGYoYnVmZmVyICsgbGVuLCBidWZmZXJfc2l6ZSAtIGxlbiwgIk1PREFMSUFTPSIpOworCWxlbiArPSBwcmludF9tb2RhbGlhcyhidWZmZXIgKyBsZW4sIGJ1ZmZlcl9zaXplIC0gbGVuLCBkZXYpICsgMTsKIAorCWVudnBbaV0gPSBOVUxMOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCmluZGV4IDI0NDc0MzMuLjIxNDE1MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCkBAIC0zNDgsNiArMzQ4LDQwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBhbHBzX3BvbGwoKSAtIHBvbGwgdGhlIHRvdWNocGFkIGZvciBjdXJyZW50IG1vdGlvbiBwYWNrZXQuCisgKiBVc2VkIGluIHJlc3luYy4KKyAqLworc3RhdGljIGludCBhbHBzX3BvbGwoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJc3RydWN0IGFscHNfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CisJdW5zaWduZWQgY2hhciBidWZbNl07CisJaW50IHBvbGxfZmFpbGVkOworCisJaWYgKHByaXYtPmktPmZsYWdzICYgQUxQU19QQVNTKQorCQlhbHBzX3Bhc3N0aHJvdWdoX21vZGUocHNtb3VzZSwgMSk7CisKKwlwb2xsX2ZhaWxlZCA9IHBzMl9jb21tYW5kKCZwc21vdXNlLT5wczJkZXYsIGJ1ZiwKKwkJCQkgIFBTTU9VU0VfQ01EX1BPTEwgfCAocHNtb3VzZS0+cGt0c2l6ZSA8PCA4KSkgPCAwOworCisJaWYgKHByaXYtPmktPmZsYWdzICYgQUxQU19QQVNTKQorCQlhbHBzX3Bhc3N0aHJvdWdoX21vZGUocHNtb3VzZSwgMCk7CisKKwlpZiAocG9sbF9mYWlsZWQgfHwgKGJ1ZlswXSAmIHByaXYtPmktPm1hc2swKSAhPSBwcml2LT5pLT5ieXRlMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKChwc21vdXNlLT5iYWRieXRlICYgMHhjOCkgPT0gMHgwOCkgeworLyoKKyAqIFBvbGwgdGhlIHRyYWNrIHN0aWNrIC4uLgorICovCisJCWlmIChwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBidWYsIFBTTU9VU0VfQ01EX1BPTEwgfCAoMyA8PCA4KSkpCisJCQlyZXR1cm4gLTE7CisJfQorCisJbWVtY3B5KHBzbW91c2UtPnBhY2tldCwgYnVmLCBzaXplb2YoYnVmKSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYWxwc19yZWNvbm5lY3Qoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CiAJc3RydWN0IGFscHNfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CkBAIC00NTEsMTAgKzQ4NSwxNCBAQAogCWlucHV0X3JlZ2lzdGVyX2RldmljZShwcml2LT5kZXYyKTsKIAogCXBzbW91c2UtPnByb3RvY29sX2hhbmRsZXIgPSBhbHBzX3Byb2Nlc3NfYnl0ZTsKKwlwc21vdXNlLT5wb2xsID0gYWxwc19wb2xsOwogCXBzbW91c2UtPmRpc2Nvbm5lY3QgPSBhbHBzX2Rpc2Nvbm5lY3Q7CiAJcHNtb3VzZS0+cmVjb25uZWN0ID0gYWxwc19yZWNvbm5lY3Q7CiAJcHNtb3VzZS0+cGt0c2l6ZSA9IDY7CiAKKwkvKiBXZSBhcmUgaGF2aW5nIHRyb3VibGUgcmVzeW5jaW5nIEFMUFMgdG91Y2hwYWRzIHNvIGRpc2FibGUgaXQgZm9yIG5vdyAqLworCXBzbW91c2UtPnJlc3luY190aW1lID0gMDsKKwogCXJldHVybiAwOwogCiBpbml0X2ZhaWw6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYwppbmRleCAwMjVhNzFkLi5jODg1MjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMKQEAgLTExNyw3ICsxMTcsNyBAQAogCWlmIChwc21vdXNlX3NsaWNlZF9jb21tYW5kKHBzbW91c2UsIGNvbW1hbmQpKQogCQlyZXR1cm4gLTE7CiAKLQlpZiAocHMyX2NvbW1hbmQoJnBzbW91c2UtPnBzMmRldiwgcGFyYW0sIFBTTU9VU0VfQ01EX1BPTEwpKQorCWlmIChwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBwYXJhbSwgUFNNT1VTRV9DTURfUE9MTCB8IDB4MDMwMCkpCiAJCXJldHVybiAtMTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKaW5kZXggNGQ1ZWNjMC4uNzY2NWZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCkBAIC01NCwxMCArNTQsMTQgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChzbWFydHNjcm9sbCwgcHNtb3VzZV9zbWFydHNjcm9sbCwgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNtYXJ0c2Nyb2xsLCAiTG9naXRlY2ggU21hcnRzY3JvbGwgYXV0b3JlcGVhdCwgMSA9IGVuYWJsZWQgKGRlZmF1bHQpLCAwID0gZGlzYWJsZWQuIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcHNtb3VzZV9yZXNldGFmdGVyOworc3RhdGljIHVuc2lnbmVkIGludCBwc21vdXNlX3Jlc2V0YWZ0ZXIgPSA1OwogbW9kdWxlX3BhcmFtX25hbWVkKHJlc2V0YWZ0ZXIsIHBzbW91c2VfcmVzZXRhZnRlciwgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJlc2V0YWZ0ZXIsICJSZXNldCBkZXZpY2UgYWZ0ZXIgc28gbWFueSBiYWQgcGFja2V0cyAoMCA9IG5ldmVyKS4iKTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBwc21vdXNlX3Jlc3luY190aW1lID0gNTsKK21vZHVsZV9wYXJhbV9uYW1lZChyZXN5bmNfdGltZSwgcHNtb3VzZV9yZXN5bmNfdGltZSwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlc3luY190aW1lLCAiSG93IGxvbmcgY2FuIG1vdXNlIHN0YXkgaWRsZSBiZWZvcmUgZm9yY2luZyByZXN5bmMgKGluIHNlY29uZHMsIDAgPSBuZXZlcikuIik7CisKIFBTTU9VU0VfREVGSU5FX0FUVFIocHJvdG9jb2wsIFNfSVdVU1IgfCBTX0lSVUdPLAogCQkJTlVMTCwKIAkJCXBzbW91c2VfYXR0cl9zaG93X3Byb3RvY29sLCBwc21vdXNlX2F0dHJfc2V0X3Byb3RvY29sKTsKQEAgLTcwLDEyICs3NCwxNiBAQAogUFNNT1VTRV9ERUZJTkVfQVRUUihyZXNldGFmdGVyLCBTX0lXVVNSIHwgU19JUlVHTywKIAkJCSh2b2lkICopIG9mZnNldG9mKHN0cnVjdCBwc21vdXNlLCByZXNldGFmdGVyKSwKIAkJCXBzbW91c2Vfc2hvd19pbnRfYXR0ciwgcHNtb3VzZV9zZXRfaW50X2F0dHIpOworUFNNT1VTRV9ERUZJTkVfQVRUUihyZXN5bmNfdGltZSwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkodm9pZCAqKSBvZmZzZXRvZihzdHJ1Y3QgcHNtb3VzZSwgcmVzeW5jX3RpbWUpLAorCQkJcHNtb3VzZV9zaG93X2ludF9hdHRyLCBwc21vdXNlX3NldF9pbnRfYXR0cik7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpwc21vdXNlX2F0dHJpYnV0ZXNbXSA9IHsKIAkmcHNtb3VzZV9hdHRyX3Byb3RvY29sLmRhdHRyLmF0dHIsCiAJJnBzbW91c2VfYXR0cl9yYXRlLmRhdHRyLmF0dHIsCiAJJnBzbW91c2VfYXR0cl9yZXNvbHV0aW9uLmRhdHRyLmF0dHIsCiAJJnBzbW91c2VfYXR0cl9yZXNldGFmdGVyLmRhdHRyLmF0dHIsCisJJnBzbW91c2VfYXR0cl9yZXN5bmNfdGltZS5kYXR0ci5hdHRyLAogCU5VTEwKIH07CiAKQEAgLTk4LDYgKzEwNiw4IEBACiAgKi8KIHN0YXRpYyBERUNMQVJFX01VVEVYKHBzbW91c2Vfc2VtKTsKIAorc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprcHNtb3VzZWRfd3E7CisKIHN0cnVjdCBwc21vdXNlX3Byb3RvY29sIHsKIAllbnVtIHBzbW91c2VfdHlwZSB0eXBlOwogCWNoYXIgKm5hbWU7CkBAIC0xNzgsMTUgKzE4OCw3OSBAQAogfQogCiAvKgotICogcHNtb3VzZV9pbnRlcnJ1cHQoKSBoYW5kbGVzIGluY29taW5nIGNoYXJhY3RlcnMsIGVpdGhlciBnYXRoZXJpbmcgdGhlbSBpbnRvCi0gKiBwYWNrZXRzIG9yIHBhc3NpbmcgdGhlbSB0byB0aGUgY29tbWFuZCByb3V0aW5lIGFzIGNvbW1hbmQgb3V0cHV0LgorICogX19wc21vdXNlX3NldF9zdGF0ZSgpIHNldHMgbmV3IHBzbW91c2Ugc3RhdGUgYW5kIHJlc2V0cyBhbGwgZmxhZ3MuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIF9fcHNtb3VzZV9zZXRfc3RhdGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGVudW0gcHNtb3VzZV9zdGF0ZSBuZXdfc3RhdGUpCit7CisJcHNtb3VzZS0+c3RhdGUgPSBuZXdfc3RhdGU7CisJcHNtb3VzZS0+cGt0Y250ID0gcHNtb3VzZS0+b3V0X29mX3N5bmMgPSAwOworCXBzbW91c2UtPnBzMmRldi5mbGFncyA9IDA7CisJcHNtb3VzZS0+bGFzdCA9IGppZmZpZXM7Cit9CisKKworLyoKKyAqIHBzbW91c2Vfc2V0X3N0YXRlKCkgc2V0cyBuZXcgcHNtb3VzZSBzdGF0ZSBhbmQgcmVzZXRzIGFsbCBmbGFncyBhbmQKKyAqIGNvdW50ZXJzIHdoaWxlIGhvbGRpbmcgc2VyaW8gbG9jayBzbyBmaWdodGluZyB3aXRoIGludGVycnVwdCBoYW5kbGVyCisgKiBpcyBub3QgYSBjb25jZXJuLgorICovCisKK3N0YXRpYyB2b2lkIHBzbW91c2Vfc2V0X3N0YXRlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBlbnVtIHBzbW91c2Vfc3RhdGUgbmV3X3N0YXRlKQoreworCXNlcmlvX3BhdXNlX3J4KHBzbW91c2UtPnBzMmRldi5zZXJpbyk7CisJX19wc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBuZXdfc3RhdGUpOworCXNlcmlvX2NvbnRpbnVlX3J4KHBzbW91c2UtPnBzMmRldi5zZXJpbyk7Cit9CisKKy8qCisgKiBwc21vdXNlX2hhbmRsZV9ieXRlKCkgcHJvY2Vzc2VzIG9uZSBieXRlIG9mIHRoZSBpbnB1dCBkYXRhIHN0cmVhbQorICogYnkgY2FsbGluZyBjb3JyZXNwb25kaW5nIHByb3RvY29sIGhhbmRsZXIuCisgKi8KKworc3RhdGljIGludCBwc21vdXNlX2hhbmRsZV9ieXRlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwc21vdXNlX3JldF90IHJjID0gcHNtb3VzZS0+cHJvdG9jb2xfaGFuZGxlcihwc21vdXNlLCByZWdzKTsKKworCXN3aXRjaCAocmMpIHsKKwkJY2FzZSBQU01PVVNFX0JBRF9EQVRBOgorCQkJaWYgKHBzbW91c2UtPnN0YXRlID09IFBTTU9VU0VfQUNUSVZBVEVEKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiAlcyBhdCAlcyBsb3N0IHN5bmMgYXQgYnl0ZSAlZFxuIiwKKwkJCQkJcHNtb3VzZS0+bmFtZSwgcHNtb3VzZS0+cGh5cywgcHNtb3VzZS0+cGt0Y250KTsKKwkJCQlpZiAoKytwc21vdXNlLT5vdXRfb2Zfc3luYyA9PSBwc21vdXNlLT5yZXNldGFmdGVyKSB7CisJCQkJCV9fcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9JR05PUkUpOworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgInBzbW91c2UuYzogaXNzdWluZyByZWNvbm5lY3QgcmVxdWVzdFxuIik7CisJCQkJCXNlcmlvX3JlY29ubmVjdChwc21vdXNlLT5wczJkZXYuc2VyaW8pOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfQorCQkJcHNtb3VzZS0+cGt0Y250ID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUFNNT1VTRV9GVUxMX1BBQ0tFVDoKKwkJCXBzbW91c2UtPnBrdGNudCA9IDA7CisJCQlpZiAocHNtb3VzZS0+b3V0X29mX3N5bmMpIHsKKwkJCQlwc21vdXNlLT5vdXRfb2Zfc3luYyA9IDA7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJwc21vdXNlLmM6ICVzIGF0ICVzIC0gZHJpdmVyIHJlc3luY2hlZC5cbiIsCisJCQkJCXBzbW91c2UtPm5hbWUsIHBzbW91c2UtPnBoeXMpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQU01PVVNFX0dPT0RfREFUQToKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHBzbW91c2VfaW50ZXJydXB0KCkgaGFuZGxlcyBpbmNvbWluZyBjaGFyYWN0ZXJzLCBlaXRoZXIgcGFzc2luZyB0aGVtCisgKiBmb3Igbm9ybWFsIHByb2Nlc3Npbmcgb3IgZ2F0aGVyaW5nIHRoZW0gYXMgY29tbWFuZCByZXNwb25zZS4KICAqLwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgcHNtb3VzZV9pbnRlcnJ1cHQoc3RydWN0IHNlcmlvICpzZXJpbywKIAkJdW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBwc21vdXNlICpwc21vdXNlID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOwotCXBzbW91c2VfcmV0X3QgcmM7CiAKIAlpZiAocHNtb3VzZS0+c3RhdGUgPT0gUFNNT1VTRV9JR05PUkUpCiAJCWdvdG8gb3V0OwpAQCAtMjA4LDY3ICsyODIsNTggQEAKIAkJaWYgIChwczJfaGFuZGxlX3Jlc3BvbnNlKCZwc21vdXNlLT5wczJkZXYsIGRhdGEpKQogCQkJZ290byBvdXQ7CiAKLQlpZiAocHNtb3VzZS0+c3RhdGUgPT0gUFNNT1VTRV9JTklUSUFMSVpJTkcpCisJaWYgKHBzbW91c2UtPnN0YXRlIDw9IFBTTU9VU0VfUkVTWU5DSU5HKQogCQlnb3RvIG91dDsKIAogCWlmIChwc21vdXNlLT5zdGF0ZSA9PSBQU01PVVNFX0FDVElWQVRFRCAmJgogCSAgICBwc21vdXNlLT5wa3RjbnQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBwc21vdXNlLT5sYXN0ICsgSFovMikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiAlcyBhdCAlcyBsb3N0IHN5bmNocm9uaXphdGlvbiwgdGhyb3dpbmcgJWQgYnl0ZXMgYXdheS5cbiIsCisJCXByaW50ayhLRVJOX0lORk8gInBzbW91c2UuYzogJXMgYXQgJXMgbG9zdCBzeW5jaHJvbml6YXRpb24sIHRocm93aW5nICVkIGJ5dGVzIGF3YXkuXG4iLAogCQkgICAgICAgcHNtb3VzZS0+bmFtZSwgcHNtb3VzZS0+cGh5cywgcHNtb3VzZS0+cGt0Y250KTsKLQkJcHNtb3VzZS0+cGt0Y250ID0gMDsKKwkJcHNtb3VzZS0+YmFkYnl0ZSA9IHBzbW91c2UtPnBhY2tldFswXTsKKwkJX19wc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX1JFU1lOQ0lORyk7CisJCXF1ZXVlX3dvcmsoa3BzbW91c2VkX3dxLCAmcHNtb3VzZS0+cmVzeW5jX3dvcmspOworCQlnb3RvIG91dDsKIAl9CiAKLQlwc21vdXNlLT5sYXN0ID0gamlmZmllczsKIAlwc21vdXNlLT5wYWNrZXRbcHNtb3VzZS0+cGt0Y250KytdID0gZGF0YTsKLQotCWlmIChwc21vdXNlLT5wYWNrZXRbMF0gPT0gUFNNT1VTRV9SRVRfQkFUKSB7CisvKgorICogQ2hlY2sgaWYgdGhpcyBpcyBhIG5ldyBkZXZpY2UgYW5ub3VuY2VtZW50ICgweEFBIDB4MDApCisgKi8KKwlpZiAodW5saWtlbHkocHNtb3VzZS0+cGFja2V0WzBdID09IFBTTU9VU0VfUkVUX0JBVCAmJiBwc21vdXNlLT5wa3RjbnQgPD0gMikpIHsKIAkJaWYgKHBzbW91c2UtPnBrdGNudCA9PSAxKQogCQkJZ290byBvdXQ7CiAKLQkJaWYgKHBzbW91c2UtPnBrdGNudCA9PSAyKSB7Ci0JCQlpZiAocHNtb3VzZS0+cGFja2V0WzFdID09IFBTTU9VU0VfUkVUX0lEKSB7Ci0JCQkJcHNtb3VzZS0+c3RhdGUgPSBQU01PVVNFX0lHTk9SRTsKLQkJCQlzZXJpb19yZWNvbm5lY3Qoc2VyaW8pOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJaWYgKHBzbW91c2UtPnR5cGUgPT0gUFNNT1VTRV9TWU5BUFRJQ1MpIHsKLQkJCQkvKiBuZWl0aGVyIDB4QUEgbm9yIDB4MDAgYXJlIHZhbGlkIGZpcnN0IGJ5dGVzCi0JCQkJICogZm9yIGEgcGFja2V0IGluIGFic29sdXRlIG1vZGUKLQkJCQkgKi8KLQkJCQlwc21vdXNlLT5wa3RjbnQgPSAwOwotCQkJCWdvdG8gb3V0OwotCQkJfQorCQlpZiAocHNtb3VzZS0+cGFja2V0WzFdID09IFBTTU9VU0VfUkVUX0lEKSB7CisJCQlfX3BzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfSUdOT1JFKTsKKwkJCXNlcmlvX3JlY29ubmVjdChzZXJpbyk7CisJCQlnb3RvIG91dDsKIAkJfQorLyoKKyAqIE5vdCBhIG5ldyBkZXZpY2UsIHRyeSBwcm9jZXNzaW5nIGZpcnN0IGJ5dGUgbm9ybWFsbHkKKyAqLworCQlwc21vdXNlLT5wa3RjbnQgPSAxOworCQlpZiAocHNtb3VzZV9oYW5kbGVfYnl0ZShwc21vdXNlLCByZWdzKSkKKwkJCWdvdG8gb3V0OworCisJCXBzbW91c2UtPnBhY2tldFtwc21vdXNlLT5wa3RjbnQrK10gPSBkYXRhOwogCX0KIAotCXJjID0gcHNtb3VzZS0+cHJvdG9jb2xfaGFuZGxlcihwc21vdXNlLCByZWdzKTsKLQotCXN3aXRjaCAocmMpIHsKLQkJY2FzZSBQU01PVVNFX0JBRF9EQVRBOgotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiAlcyBhdCAlcyBsb3N0IHN5bmMgYXQgYnl0ZSAlZFxuIiwKLQkJCQlwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzLCBwc21vdXNlLT5wa3RjbnQpOwotCQkJcHNtb3VzZS0+cGt0Y250ID0gMDsKLQotCQkJaWYgKCsrcHNtb3VzZS0+b3V0X29mX3N5bmMgPT0gcHNtb3VzZS0+cmVzZXRhZnRlcikgewotCQkJCXBzbW91c2UtPnN0YXRlID0gUFNNT1VTRV9JR05PUkU7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFICJwc21vdXNlLmM6IGlzc3VpbmcgcmVjb25uZWN0IHJlcXVlc3RcbiIpOwotCQkJCXNlcmlvX3JlY29ubmVjdChwc21vdXNlLT5wczJkZXYuc2VyaW8pOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQU01PVVNFX0ZVTExfUEFDS0VUOgotCQkJcHNtb3VzZS0+cGt0Y250ID0gMDsKLQkJCWlmIChwc21vdXNlLT5vdXRfb2Zfc3luYykgewotCQkJCXBzbW91c2UtPm91dF9vZl9zeW5jID0gMDsKLQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgInBzbW91c2UuYzogJXMgYXQgJXMgLSBkcml2ZXIgcmVzeW5jaGVkLlxuIiwKLQkJCQkJcHNtb3VzZS0+bmFtZSwgcHNtb3VzZS0+cGh5cyk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFBTTU9VU0VfR09PRF9EQVRBOgotCQkJYnJlYWs7CisvKgorICogU2VlIGlmIHdlIG5lZWQgdG8gZm9yY2UgcmVzeW5jIGJlY2F1c2UgbW91c2Ugd2FzIGlkbGUgZm9yIHRvbyBsb25nCisgKi8KKwlpZiAocHNtb3VzZS0+c3RhdGUgPT0gUFNNT1VTRV9BQ1RJVkFURUQgJiYKKwkgICAgcHNtb3VzZS0+cGt0Y250ID09IDEgJiYgcHNtb3VzZS0+cmVzeW5jX3RpbWUgJiYKKwkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBwc21vdXNlLT5sYXN0ICsgcHNtb3VzZS0+cmVzeW5jX3RpbWUgKiBIWikpIHsKKwkJcHNtb3VzZS0+YmFkYnl0ZSA9IHBzbW91c2UtPnBhY2tldFswXTsKKwkJX19wc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX1JFU1lOQ0lORyk7CisJCXF1ZXVlX3dvcmsoa3BzbW91c2VkX3dxLCAmcHNtb3VzZS0+cmVzeW5jX3dvcmspOworCQlnb3RvIG91dDsKIAl9Ci1vdXQ6CisKKwlwc21vdXNlLT5sYXN0ID0gamlmZmllczsKKwlwc21vdXNlX2hhbmRsZV9ieXRlKHBzbW91c2UsIHJlZ3MpOworCisgb3V0OgogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNzUyLDIxICs4MTcsNiBAQAogfQogCiAvKgotICogcHNtb3VzZV9zZXRfc3RhdGUoKSBzZXRzIG5ldyBwc21vdXNlIHN0YXRlIGFuZCByZXNldHMgYWxsIGZsYWdzIGFuZAotICogY291bnRlcnMgd2hpbGUgaG9sZGluZyBzZXJpbyBsb2NrIHNvIGZpZ2h0aW5nIHdpdGggaW50ZXJydXB0IGhhbmRsZXIKLSAqIGlzIG5vdCBhIGNvbmNlcm4uCi0gKi8KLQotc3RhdGljIHZvaWQgcHNtb3VzZV9zZXRfc3RhdGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGVudW0gcHNtb3VzZV9zdGF0ZSBuZXdfc3RhdGUpCi17Ci0Jc2VyaW9fcGF1c2VfcngocHNtb3VzZS0+cHMyZGV2LnNlcmlvKTsKLQlwc21vdXNlLT5zdGF0ZSA9IG5ld19zdGF0ZTsKLQlwc21vdXNlLT5wa3RjbnQgPSBwc21vdXNlLT5vdXRfb2Zfc3luYyA9IDA7Ci0JcHNtb3VzZS0+cHMyZGV2LmZsYWdzID0gMDsKLQlzZXJpb19jb250aW51ZV9yeChwc21vdXNlLT5wczJkZXYuc2VyaW8pOwotfQotCi0vKgogICogcHNtb3VzZV9hY3RpdmF0ZSgpIGVuYWJsZXMgdGhlIG1vdXNlIHNvIHRoYXQgd2UgZ2V0IG1vdGlvbiByZXBvcnRzIGZyb20gaXQuCiAgKi8KIApAQCAtNzk0LDYgKzg0NCwxMTEgQEAKIAlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0NNRF9NT0RFKTsKIH0KIAorLyoKKyAqIHBzbW91c2VfcG9sbCgpIC0gZGVmYXVsdCBwb2xsIGhhbmxkZXIuIEV2ZXJ5b25lIGV4Y2VwdCBmb3IgQUxQUyB1c2VzIGl0LgorICovCisKK3N0YXRpYyBpbnQgcHNtb3VzZV9wb2xsKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXJldHVybiBwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBwc21vdXNlLT5wYWNrZXQsCisJCQkgICBQU01PVVNFX0NNRF9QT0xMIHwgKHBzbW91c2UtPnBrdHNpemUgPDwgOCkpOworfQorCisKKy8qCisgKiBwc21vdXNlX3Jlc3luYygpIGF0dGVtcHRzIHRvIHJlLXZhbGlkYXRlIGN1cnJlbnQgcHJvdG9jb2wuCisgKi8KKworc3RhdGljIHZvaWQgcHNtb3VzZV9yZXN5bmModm9pZCAqcCkKK3sKKwlzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSA9IHAsICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBzZXJpbyAqc2VyaW8gPSBwc21vdXNlLT5wczJkZXYuc2VyaW87CisJcHNtb3VzZV9yZXRfdCByYyA9IFBTTU9VU0VfR09PRF9EQVRBOworCWludCBmYWlsZWQgPSAwLCBlbmFibGVkID0gMDsKKwlpbnQgaTsKKworCWRvd24oJnBzbW91c2Vfc2VtKTsKKworCWlmIChwc21vdXNlLT5zdGF0ZSAhPSBQU01PVVNFX1JFU1lOQ0lORykKKwkJZ290byBvdXQ7CisKKwlpZiAoc2VyaW8tPnBhcmVudCAmJiBzZXJpby0+aWQudHlwZSA9PSBTRVJJT19QU19QU1RIUlUpIHsKKwkJcGFyZW50ID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8tPnBhcmVudCk7CisJCXBzbW91c2VfZGVhY3RpdmF0ZShwYXJlbnQpOworCX0KKworLyoKKyAqIFNvbWUgbWljZSBkb24ndCBBQ0sgY29tbWFuZHMgc2VudCB3aGlsZSB0aGV5IGFyZSBpbiB0aGUgbWlkZGxlIG9mCisgKiB0cmFuc21pdHRpbmcgbW90aW9uIHBhY2tldC4gVG8gYXZvaWQgZGVsYXkgd2UgdXNlIHBzMl9zZW5kYnl0ZSgpCisgKiBpbnN0ZWFkIG9mIHBzMl9jb21tYW5kKCkgd2hpY2ggd291bGQgd2FpdCBmb3IgMjAwbXMgZm9yIGFuIEFDSworICogdGhhdCBtYXkgbmV2ZXIgY29tZS4KKyAqIEFzIGFuIGFkZGl0aW9uYWwgcXVpcmsgQUxQUyB0b3VjaHBhZHMgbWF5IG5vdCBvbmx5IGZvcmdldCB0byBBQ0sKKyAqIGRpc2FibGUgY29tbWFuZCBidXQgd2lsbCBzdG9wIHJlcG9ydGluZyB0YXBzLCBzbyBpZiB3ZSBzZWUgdGhhdAorICogbW91c2UgYXQgbGVhc3Qgb25jZSBBQ0tzIGRpc2FibGUgd2Ugd2lsbCBkbyBmdWxsIHJlY29ubmVjdCBpZiBBQ0sKKyAqIGlzIG1pc3NpbmcuCisgKi8KKwlwc21vdXNlLT5udW1fcmVzeW5jcysrOworCisJaWYgKHBzMl9zZW5kYnl0ZSgmcHNtb3VzZS0+cHMyZGV2LCBQU01PVVNFX0NNRF9ESVNBQkxFLCAyMCkpIHsKKwkJaWYgKHBzbW91c2UtPm51bV9yZXN5bmNzIDwgMyB8fCBwc21vdXNlLT5hY2tzX2Rpc2FibGVfY29tbWFuZCkKKwkJCWZhaWxlZCA9IDE7CisJfSBlbHNlCisJCXBzbW91c2UtPmFja3NfZGlzYWJsZV9jb21tYW5kID0gMTsKKworLyoKKyAqIFBvbGwgdGhlIG1vdXNlLiBJZiBpdCB3YXMgcmVzZXQgdGhlIHBhY2tldCB3aWxsIGJlIHNob3J0ZXIgdGhhbgorICogcHNtb3VzZS0+cGt0c2l6ZSBhbmQgcHMyX2NvbW1hbmQgd2lsbCBmYWlsLiBXZSBkbyBub3QgZXhwZWN0IGFuZAorICogZG8gbm90IGhhbmRsZSBzY2VuYXJpbyB3aGVuIG1vdXNlICJ1cGdyYWRlcyIgaXRzIHByb3RvY29sIHdoaWxlCisgKiBkaXNjb25uZWN0ZWQgc2luY2UgaXQgd291bGQgcmVxdWlyZSBhZGRpdGlvbmFsIGRlbGF5LiBJZiB3ZSBldmVyCisgKiBzZWUgYSBtb3VzZSB0aGF0IGRvZXMgaXQgd2UnbGwgYWRqdXN0IHRoZSBjb2RlLgorICovCisJaWYgKCFmYWlsZWQpIHsKKwkJaWYgKHBzbW91c2UtPnBvbGwocHNtb3VzZSkpCisJCQlmYWlsZWQgPSAxOworCQllbHNlIHsKKwkJCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQ01EX01PREUpOworCQkJZm9yIChpID0gMDsgaSA8IHBzbW91c2UtPnBrdHNpemU7IGkrKykgeworCQkJCXBzbW91c2UtPnBrdGNudCsrOworCQkJCXJjID0gcHNtb3VzZS0+cHJvdG9jb2xfaGFuZGxlcihwc21vdXNlLCBOVUxMKTsKKwkJCQlpZiAocmMgIT0gUFNNT1VTRV9HT09EX0RBVEEpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHJjICE9IFBTTU9VU0VfRlVMTF9QQUNLRVQpCisJCQkJZmFpbGVkID0gMTsKKwkJCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfUkVTWU5DSU5HKTsKKwkJfQorCX0KKy8qCisgKiBOb3cgdHJ5IHRvIGVuYWJsZSBtb3VzZS4gV2UgdHJ5IHRvIGRvIHRoYXQgZXZlbiBpZiBwb2xsIGZhaWxlZCBhbmQgYWxzbworICogcmVwZWF0IG91ciBhdHRlbXB0cyA1IHRpbWVzLCBvdGhlcndpc2Ugd2UgbWF5IGJlIGxlZnQgb3V0IHdpdGggZGlzYWJsZWQKKyAqIG1vdXNlLgorICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlpZiAoIXBzMl9jb21tYW5kKCZwc21vdXNlLT5wczJkZXYsIE5VTEwsIFBTTU9VU0VfQ01EX0VOQUJMRSkpIHsKKwkJCWVuYWJsZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDIwMCk7CisJfQorCisJaWYgKCFlbmFibGVkKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBzbW91c2UuYzogZmFpbGVkIHRvIHJlLWVuYWJsZSBtb3VzZSBvbiAlc1xuIiwKKwkJCXBzbW91c2UtPnBzMmRldi5zZXJpby0+cGh5cyk7CisJCWZhaWxlZCA9IDE7CisJfQorCisJaWYgKGZhaWxlZCkgeworCQlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0lHTk9SRSk7CisJCXByaW50ayhLRVJOX0lORk8gInBzbW91c2UuYzogcmVzeW5jIGZhaWxlZCwgaXNzdWluZyByZWNvbm5lY3QgcmVxdWVzdFxuIik7CisJCXNlcmlvX3JlY29ubmVjdChzZXJpbyk7CisJfSBlbHNlCisJCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQUNUSVZBVEVEKTsKKworCWlmIChwYXJlbnQpCisJCXBzbW91c2VfYWN0aXZhdGUocGFyZW50KTsKKyBvdXQ6CisJdXAoJnBzbW91c2Vfc2VtKTsKK30KIAogLyoKICAqIHBzbW91c2VfY2xlYW51cCgpIHJlc2V0cyB0aGUgbW91c2UgaW50byBwb3dlci1vbiBzdGF0ZS4KQEAgLTgyMiw2ICs5NzcsMTEgQEAKIAogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQ01EX01PREUpOwogCisJLyogbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYSByZXN5bmMgaW4gcHJvZ3Jlc3MgKi8KKwl1cCgmcHNtb3VzZV9zZW0pOworCWZsdXNoX3dvcmtxdWV1ZShrcHNtb3VzZWRfd3EpOworCWRvd24oJnBzbW91c2Vfc2VtKTsKKwogCWlmIChzZXJpby0+cGFyZW50ICYmIHNlcmlvLT5pZC50eXBlID09IFNFUklPX1BTX1BTVEhSVSkgewogCQlwYXJlbnQgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpby0+cGFyZW50KTsKIAkJcHNtb3VzZV9kZWFjdGl2YXRlKHBhcmVudCk7CkBAIC04NTksNiArMTAxOSw3IEBACiAKIAlwc21vdXNlLT5zZXRfcmF0ZSA9IHBzbW91c2Vfc2V0X3JhdGU7CiAJcHNtb3VzZS0+c2V0X3Jlc29sdXRpb24gPSBwc21vdXNlX3NldF9yZXNvbHV0aW9uOworCXBzbW91c2UtPnBvbGwgPSBwc21vdXNlX3BvbGw7CiAJcHNtb3VzZS0+cHJvdG9jb2xfaGFuZGxlciA9IHBzbW91c2VfcHJvY2Vzc19ieXRlOwogCXBzbW91c2UtPnBrdHNpemUgPSAzOwogCkBAIC04NzQsNiArMTAzNSwyMyBAQAogCWVsc2UKIAkJcHNtb3VzZS0+dHlwZSA9IHBzbW91c2VfZXh0ZW5zaW9ucyhwc21vdXNlLCBwc21vdXNlX21heF9wcm90bywgMSk7CiAKKwkvKgorCSAqIElmIG1vdXNlJ3MgcGFja2V0IHNpemUgaXMgMyB0aGVyZSBpcyBubyBwb2ludCBpbiBwb2xsaW5nIHRoZQorCSAqIGRldmljZSBpbiBob3BlcyB0byBkZXRlY3QgcHJvdG9jb2wgcmVzZXQgLSB3ZSB3b24ndCBnZXQgbGVzcworCSAqIHRoYW4gMyBieXRlcyByZXNwb25zZSBhbnlob3cuCisJICovCisJaWYgKHBzbW91c2UtPnBrdHNpemUgPT0gMykKKwkJcHNtb3VzZS0+cmVzeW5jX3RpbWUgPSAwOworCisJLyoKKwkgKiBTb21lIHNtYXJ0IEtWTXMgZmFrZSByZXNwb25zZSB0byBQT0xMIGNvbW1hbmQgcmV0dXJuaW5nIGp1c3QKKwkgKiAzIGJ5dGVzIGFuZCBtZXNzaW5nIHVwIG91ciByZXN5bmMgbG9naWMsIHNvIGlmIGluaXRpYWwgcG9sbAorCSAqIGZhaWxzIHdlIHdvbid0IHRyeSBwb2xsaW5nIHRoZSBkZXZpY2UgYW55bW9yZS4gSG9wZWZ1bGx5CisJICogc3VjaCBLVk0gd2lsbCBtYWludGFpbiBpbml0aWFsbHkgc2VsZWN0ZWQgcHJvdG9jb2wuCisJICovCisJaWYgKHBzbW91c2UtPnJlc3luY190aW1lICYmIHBzbW91c2UtPnBvbGwocHNtb3VzZSkpCisJCXBzbW91c2UtPnJlc3luY190aW1lID0gMDsKKwogCXNwcmludGYocHNtb3VzZS0+ZGV2bmFtZSwgIiVzICVzICVzIiwKIAkJcHNtb3VzZV9wcm90b2NvbF9ieV90eXBlKHBzbW91c2UtPnR5cGUpLT5uYW1lLCBwc21vdXNlLT52ZW5kb3IsIHBzbW91c2UtPm5hbWUpOwogCkBAIC05MTQsNiArMTA5Miw3IEBACiAJCWdvdG8gb3V0OwogCiAJcHMyX2luaXQoJnBzbW91c2UtPnBzMmRldiwgc2VyaW8pOworCUlOSVRfV09SSygmcHNtb3VzZS0+cmVzeW5jX3dvcmssIHBzbW91c2VfcmVzeW5jLCBwc21vdXNlKTsKIAlwc21vdXNlLT5kZXYgPSBpbnB1dF9kZXY7CiAJc3ByaW50Zihwc21vdXNlLT5waHlzLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOwogCkBAIC05MzQsNiArMTExMyw3IEBACiAJcHNtb3VzZS0+cmF0ZSA9IHBzbW91c2VfcmF0ZTsKIAlwc21vdXNlLT5yZXNvbHV0aW9uID0gcHNtb3VzZV9yZXNvbHV0aW9uOwogCXBzbW91c2UtPnJlc2V0YWZ0ZXIgPSBwc21vdXNlX3Jlc2V0YWZ0ZXI7CisJcHNtb3VzZS0+cmVzeW5jX3RpbWUgPSBwYXJlbnQgPyAwIDogcHNtb3VzZV9yZXN5bmNfdGltZTsKIAlwc21vdXNlLT5zbWFydHNjcm9sbCA9IHBzbW91c2Vfc21hcnRzY3JvbGw7CiAKIAlwc21vdXNlX3N3aXRjaF9wcm90b2NvbChwc21vdXNlLCBOVUxMKTsKQEAgLTEyNzgsMTMgKzE0NTgsMjEgQEAKIAogc3RhdGljIGludCBfX2luaXQgcHNtb3VzZV9pbml0KHZvaWQpCiB7CisJa3BzbW91c2VkX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImtwc21vdXNlZCIpOworCWlmICgha3BzbW91c2VkX3dxKSB7CisJCXByaW50ayhLRVJOX0VSUiAicHNtb3VzZTogZmFpbGVkIHRvIGNyZWF0ZSBrcHNtb3VzZWQgd29ya3F1ZXVlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZwc21vdXNlX2Rydik7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHBzbW91c2VfZXhpdCh2b2lkKQogewogCXNlcmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZwc21vdXNlX2Rydik7CisJZGVzdHJveV93b3JrcXVldWUoa3BzbW91c2VkX3dxKTsKIH0KIAogbW9kdWxlX2luaXQocHNtb3VzZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS5oIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKaW5kZXggN2M0MTkyYi4uNGQ5MTA3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKQEAgLTcsNyArNyw3IEBACiAjZGVmaW5lIFBTTU9VU0VfQ01EX0dFVElORk8JMHgwM2U5CiAjZGVmaW5lIFBTTU9VU0VfQ01EX1NFVFNUUkVBTQkweDAwZWEKICNkZWZpbmUgUFNNT1VTRV9DTURfU0VUUE9MTAkweDAwZjAKLSNkZWZpbmUgUFNNT1VTRV9DTURfUE9MTAkweDAzZWIKKyNkZWZpbmUgUFNNT1VTRV9DTURfUE9MTAkweDAwZWIJLyogY2FsbGVyIHNldHMgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlY2VpdmUgKi8KICNkZWZpbmUgUFNNT1VTRV9DTURfR0VUSUQJMHgwMmYyCiAjZGVmaW5lIFBTTU9VU0VfQ01EX1NFVFJBVEUJMHgxMGYzCiAjZGVmaW5lIFBTTU9VU0VfQ01EX0VOQUJMRQkweDAwZjQKQEAgLTIzLDYgKzIzLDcgQEAKIGVudW0gcHNtb3VzZV9zdGF0ZSB7CiAJUFNNT1VTRV9JR05PUkUsCiAJUFNNT1VTRV9JTklUSUFMSVpJTkcsCisJUFNNT1VTRV9SRVNZTkNJTkcsCiAJUFNNT1VTRV9DTURfTU9ERSwKIAlQU01PVVNFX0FDVElWQVRFRCwKIH07CkBAIC0zOCwxNSArMzksMTkgQEAKIAl2b2lkICpwcml2YXRlOwogCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsKIAlzdHJ1Y3QgcHMyZGV2IHBzMmRldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzeW5jX3dvcms7CiAJY2hhciAqdmVuZG9yOwogCWNoYXIgKm5hbWU7CiAJdW5zaWduZWQgY2hhciBwYWNrZXRbOF07CisJdW5zaWduZWQgY2hhciBiYWRieXRlOwogCXVuc2lnbmVkIGNoYXIgcGt0Y250OwogCXVuc2lnbmVkIGNoYXIgcGt0c2l6ZTsKIAl1bnNpZ25lZCBjaGFyIHR5cGU7CisJdW5zaWduZWQgY2hhciBhY2tzX2Rpc2FibGVfY29tbWFuZDsKIAl1bnNpZ25lZCBpbnQgbW9kZWw7CiAJdW5zaWduZWQgbG9uZyBsYXN0OwogCXVuc2lnbmVkIGxvbmcgb3V0X29mX3N5bmM7CisJdW5zaWduZWQgbG9uZyBudW1fcmVzeW5jczsKIAllbnVtIHBzbW91c2Vfc3RhdGUgc3RhdGU7CiAJY2hhciBkZXZuYW1lWzY0XTsKIAljaGFyIHBoeXNbMzJdOwpAQCAtNTQsNiArNTksNyBAQAogCXVuc2lnbmVkIGludCByYXRlOwogCXVuc2lnbmVkIGludCByZXNvbHV0aW9uOwogCXVuc2lnbmVkIGludCByZXNldGFmdGVyOworCXVuc2lnbmVkIGludCByZXN5bmNfdGltZTsKIAl1bnNpZ25lZCBpbnQgc21hcnRzY3JvbGw7CS8qIExvZ2l0ZWNoIG9ubHkgKi8KIAogCXBzbW91c2VfcmV0X3QgKCpwcm90b2NvbF9oYW5kbGVyKShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwpAQCAtNjIsNiArNjgsNyBAQAogCiAJaW50ICgqcmVjb25uZWN0KShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSk7CiAJdm9pZCAoKmRpc2Nvbm5lY3QpKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKTsKKwlpbnQgKCpwb2xsKShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSk7CiAKIAl2b2lkICgqcHRfYWN0aXZhdGUpKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKTsKIAl2b2lkICgqcHRfZGVhY3RpdmF0ZSkoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKaW5kZXggOTdjZGZkNi4uMjA1MWJlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCkBAIC02NTIsNiArNjUyLDggQEAKIAlwc21vdXNlLT5kaXNjb25uZWN0ID0gc3luYXB0aWNzX2Rpc2Nvbm5lY3Q7CiAJcHNtb3VzZS0+cmVjb25uZWN0ID0gc3luYXB0aWNzX3JlY29ubmVjdDsKIAlwc21vdXNlLT5wa3RzaXplID0gNjsKKwkvKiBTeW5hcHRpY3MgY2FuIHVzdWFsbHkgc3RheSBpbiBzeW5jIHdpdGhvdXQgZXh0cmEgaGVscCAqLworCXBzbW91c2UtPnJlc3luY190aW1lID0gMDsKIAogCWlmIChTWU5fQ0FQX1BBU1NfVEhST1VHSChwcml2LT5jYXBhYmlsaXRpZXMpKQogCQlzeW5hcHRpY3NfcHRfY3JlYXRlKHBzbW91c2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaCBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKaW5kZXggMmQyZjlmYi4uYTRjNmYzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaAorKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCkBAIC0xNzMsNiArMTczLDEzIEBACiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBDLU1NMjAgU2VyaWVzIiksCiAJCX0sCiAJfSwKKwl7CisJCS5pZGVudCA9ICJTb255IFZhaW8gRlMtMTE1YiIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWR04tRlMxMTVCIiksCisJCX0sCisJfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYwppbmRleCA4ZTUzMGNjLi4yZjc2ODEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCkBAIC01OSw5ICs1OSw3IEBACiAKIHN0YXRpYyBMSVNUX0hFQUQoc2VyaW9fbGlzdCk7CiAKLXN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgc2VyaW9fYnVzID0gewotCS5uYW1lID0JInNlcmlvIiwKLX07CitzdGF0aWMgc3RydWN0IGJ1c190eXBlIHNlcmlvX2J1czsKIAogc3RhdGljIHZvaWQgc2VyaW9fYWRkX3BvcnQoc3RydWN0IHNlcmlvICpzZXJpbyk7CiBzdGF0aWMgdm9pZCBzZXJpb19kZXN0cm95X3BvcnQoc3RydWN0IHNlcmlvICpzZXJpbyk7CkBAIC03NTAsMTEgKzc0OCwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIHNlcmlvX2J1cyA9IHsKKwkubmFtZSA9CSJzZXJpbyIsCisJLnByb2JlID0gc2VyaW9fZHJpdmVyX3Byb2JlLAorCS5yZW1vdmUgPSBzZXJpb19kcml2ZXJfcmVtb3ZlLAorfTsKKwogdm9pZCBfX3NlcmlvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQogewogCWRydi0+ZHJpdmVyLmJ1cyA9ICZzZXJpb19idXM7Ci0JZHJ2LT5kcml2ZXIucHJvYmUgPSBzZXJpb19kcml2ZXJfcHJvYmU7Ci0JZHJ2LT5kcml2ZXIucmVtb3ZlID0gc2VyaW9fZHJpdmVyX3JlbW92ZTsKIAogCXNlcmlvX3F1ZXVlX2V2ZW50KGRydiwgb3duZXIsIFNFUklPX1JFR0lTVEVSX0RSSVZFUik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKaW5kZXggMjFkNTVlZC4uMmM2NzQwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwpAQCAtMTEsNiArMTEsMTkgQEAKIAogaWYgSU5QVVRfVE9VQ0hTQ1JFRU4KIAorY29uZmlnIFRPVUNIU0NSRUVOX0FEUzc4NDYKKwl0cmlzdGF0ZSAiQURTIDc4NDYgYmFzZWQgdG91Y2hzY3JlZW5zIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSB0b3VjaHNjcmVlbiBpbnRlcmZhY2UgdXNpbmcgdGhlCisJICBBRFM3ODQ2IGNvbnRyb2xsZXIsIGFuZCB5b3VyIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisJICBjb2RlIGluY2x1ZGVzIHRoYXQgaW4gaXRzIHRhYmxlIG9mIFNQSSBkZXZpY2VzLgorCisJICBJZiB1bnN1cmUsIHNheSBOIChidXQgaXQncyBzYWZlIHRvIHNheSAiWSIpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZHM3ODQ2LgorCiBjb25maWcgVE9VQ0hTQ1JFRU5fQklUU1kKIAl0cmlzdGF0ZSAiQ29tcGFxIGlQQVEgSDM2MDAgKEJpdHN5KSB0b3VjaHNjcmVlbiIKIAlkZXBlbmRzIG9uIFNBMTEwMF9CSVRTWQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKaW5kZXggNjg0Mjg2OS4uNWU1NTU3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogCiAjIEVhY2ggY29uZmlndXJhdGlvbiBvcHRpb24gZW5hYmxlcyBhIGxpc3Qgb2YgZmlsZXMuCiAKK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2KQkrPSBhZHM3ODQ2Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9CSVRTWSkJKz0gaDM2MDBfdHNfaW5wdXQubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0NPUkdJKQkrPSBjb3JnaV90cy5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fR1VOWkUpCSs9IGd1bnplLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4YzZhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCkBAIC0wLDAgKzEsNjI1IEBACisvKgorICogQURTNzg0NiBiYXNlZCB0b3VjaHNjcmVlbiBhbmQgc2Vuc29yIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBCcm93bmVsbAorICoKKyAqIFVzaW5nIGNvZGUgZnJvbToKKyAqICAtIGNvcmdpX3RzLmMKKyAqCUNvcHlyaWdodCAoQykgMjAwNC0yMDA1IFJpY2hhcmQgUHVyZGllCisgKiAgLSBvbWFwX3RzLltoY10sIGFkczc4NDYuaCwgdHNfb3NrLmMKKyAqCUNvcHlyaWdodCAoQykgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlCisgKglDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCUNvcHlyaWdodCAoQykgMjAwNSBEaXJrIEJlaG1lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgorCisjaWZkZWYJQ09ORklHX0FSTQorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaWZkZWYJQ09ORklHX0FSQ0hfT01BUAorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNlbmRpZgorCisjZWxzZQorI2RlZmluZQlzZXRfaXJxX3R5cGUoaXJxLHR5cGUpCWRve313aGlsZSgwKQorI2VuZGlmCisKKworLyoKKyAqIFRoaXMgY29kZSBoYXMgYmVlbiBsaWdodGx5IHRlc3RlZCBvbiBhbiBhZHM3ODQ2LgorICogU3VwcG9ydCBmb3IgYWRzNzg0MyBhbmQgYWRzNzg0NSBoYXMgb25seSBiZWVuIHN0dWJiZWQgaW4uCisgKgorICogTm90IHlldCBkb25lOiAgaW52ZXN0aWdhdGUgdGhlIHZhbHVlcyByZXBvcnRlZC4gIEFyZSB4L3kvcHJlc3N1cmUKKyAqIGV2ZW50IHZhbHVlcyBzYW5lIGVub3VnaCBmb3IgWDExPyAgSG93IGFjY3VyYXRlIGFyZSB0aGUgdGVtcGVyYXR1cmUKKyAqIGFuZCB2b2x0YWdlIHJlYWRpbmdzPyAgKFN5c3RlbS1zcGVjaWZpYyBjYWxpYnJhdGlvbiBzaG91bGQgc3VwcG9ydAorICogYWNjdXJhY3kgb2YgMC4zIGRlZ3JlZXMgQzsgb3RoZXJ3aXNlIGl0J3MgMi4wIGRlZ3JlZXMuKQorICoKKyAqIGFwcCBub3RlIHNiYWEwMzYgdGFsa3MgaW4gbW9yZSBkZXRhaWwgYWJvdXQgYWNjdXJhdGUgc2FtcGxpbmcuLi4KKyAqIHRoYXQgb3VnaHQgdG8gaGVscCBpbiBzaXR1YXRpb25zIGxpa2UgTENEcyBpbmR1Y2luZyBub2lzZSAod2hpY2gKKyAqIGNhbiBhbHNvIGJlIGhlbHBlZCBieSB1c2luZyBzeW5jaCBzaWduYWxzKSBhbmQgbW9yZSBnZW5lcmFsbHkuCisgKi8KKworI2RlZmluZQlUU19QT0xMX1BFUklPRAltc2Vjc190b19qaWZmaWVzKDEwKQorCitzdHJ1Y3QgdHNfZXZlbnQgeworCS8qIEZvciBwb3J0YWJpbGl0eSwgd2UgY2FuJ3QgcmVhZCAxMiBiaXQgdmFsdWVzIHVzaW5nIFNQSSAod2hpY2gKKwkgKiB3b3VsZCBtYWtlIHRoZSBjb250cm9sbGVyIGRlbGl2ZXIgdGhlbSBhcyBuYXRpdmUgYnl0ZW9yZGVyIHUxNgorCSAqIHdpdGggbXNicyB6ZXJvZWQpLiAgSW5zdGVhZCwgd2UgcmVhZCB0aGVtIGFzIHR3byA4LWJ5dGUgdmFsdWVzLAorCSAqIHdoaWNoIG5lZWQgYnl0ZXN3YXBwaW5nIHRoZW4gcmFuZ2UgYWRqdXN0bWVudC4KKwkgKi8KKwlfX2JlMTYgeDsKKwlfX2JlMTYgeTsKKwlfX2JlMTYgejEsIHoyOworfTsKKworc3RydWN0IGFkczc4NDYgeworCXN0cnVjdCBpbnB1dF9kZXYJaW5wdXQ7CisJY2hhcgkJCXBoeXNbMzJdOworCisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKKwl1MTYJCQltb2RlbDsKKwl1MTYJCQl2cmVmX2RlbGF5X3VzZWNzOworCXUxNgkJCXhfcGxhdGVfb2htczsKKworCXN0cnVjdCB0c19ldmVudAkJdGM7CisKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXhmZXJbOF07CisJc3RydWN0IHNwaV9tZXNzYWdlCW1zZzsKKworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CQkvKiBQOiBsb2NrICovCisJdW5zaWduZWQJCXBlbmRvd246MTsJLyogUDogbG9jayAqLworCXVuc2lnbmVkCQlwZW5kaW5nOjE7CS8qIFA6IGxvY2sgKi8KKy8vIEZJWE1FIHJlbW92ZSAiaXJxX2Rpc2FibGVkIgorCXVuc2lnbmVkCQlpcnFfZGlzYWJsZWQ6MTsJLyogUDogbG9jayAqLworfTsKKworLyogbGVhdmUgY2hpcCBzZWxlY3RlZCB3aGVuIHdlJ3JlIGRvbmUsIGZvciBxdWlja2VyIHJlLXNlbGVjdD8gKi8KKyNpZgkwCisjZGVmaW5lCUNTX0NIQU5HRSh4ZmVyKQkoKHhmZXIpLmNzX2NoYW5nZSA9IDEpCisjZWxzZQorI2RlZmluZQlDU19DSEFOR0UoeGZlcikJKCh4ZmVyKS5jc19jaGFuZ2UgPSAwKQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGUgQURTNzg0NiBoYXMgdG91Y2hzY3JlZW4gYW5kIG90aGVyIHNlbnNvcnMuCisgKiBFYXJsaWVyIGFkczc4NHggY2hpcHMgYXJlIHNvbWV3aGF0IGNvbXBhdGlibGUuCisgKi8KKyNkZWZpbmUJQURTX1NUQVJUCQkoMSA8PCA3KQorI2RlZmluZQlBRFNfQTJBMUEwX2RfeQkJKDEgPDwgNCkJLyogZGlmZmVyZW50aWFsICovCisjZGVmaW5lCUFEU19BMkExQTBfZF96MQkJKDMgPDwgNCkJLyogZGlmZmVyZW50aWFsICovCisjZGVmaW5lCUFEU19BMkExQTBfZF96MgkJKDQgPDwgNCkJLyogZGlmZmVyZW50aWFsICovCisjZGVmaW5lCUFEU19BMkExQTBfZF94CQkoNSA8PCA0KQkvKiBkaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUJQURTX0EyQTFBMF90ZW1wMAkoMCA8PCA0KQkvKiBub24tZGlmZmVyZW50aWFsICovCisjZGVmaW5lCUFEU19BMkExQTBfdmJhdHQJKDIgPDwgNCkJLyogbm9uLWRpZmZlcmVudGlhbCAqLworI2RlZmluZQlBRFNfQTJBMUEwX3ZhdXgJCSg2IDw8IDQpCS8qIG5vbi1kaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUJQURTX0EyQTFBMF90ZW1wMQkoNyA8PCA0KQkvKiBub24tZGlmZmVyZW50aWFsICovCisjZGVmaW5lCUFEU184X0JJVAkJKDEgPDwgMykKKyNkZWZpbmUJQURTXzEyX0JJVAkJKDAgPDwgMykKKyNkZWZpbmUJQURTX1NFUgkJCSgxIDw8IDIpCS8qIG5vbi1kaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUJQURTX0RGUgkJCSgwIDw8IDIpCS8qIGRpZmZlcmVudGlhbCAqLworI2RlZmluZQlBRFNfUEQxMF9QRE9XTgkJKDAgPDwgMCkJLyogbG93cG93ZXIgbW9kZSArIHBlbmlycSAqLworI2RlZmluZQlBRFNfUEQxMF9BRENfT04JCSgxIDw8IDApCS8qIEFEQyBvbiAqLworI2RlZmluZQlBRFNfUEQxMF9SRUZfT04JCSgyIDw8IDApCS8qIHZSRUYgb24gKyBwZW5pcnEgKi8KKyNkZWZpbmUJQURTX1BEMTBfQUxMX09OCQkoMyA8PCAwKQkvKiBBREMgKyB2UkVGIG9uICovCisKKyNkZWZpbmUJTUFYXzEyQklUCSgoMTw8MTIpLTEpCisKKy8qIGxlYXZlIEFEQyBwb3dlcmVkIHVwIChkaXNhYmxlcyBwZW5pcnEpIGJldHdlZW4gZGlmZmVyZW50aWFsIHNhbXBsZXMgKi8KKyNkZWZpbmUJUkVBRF8xMkJJVF9ERlIoeCkgKEFEU19TVEFSVCB8IEFEU19BMkExQTBfZF8gIyMgeCBcCisJfCBBRFNfMTJfQklUIHwgQURTX0RGUikKKworc3RhdGljIGNvbnN0IHU4CXJlYWRfeSAgPSBSRUFEXzEyQklUX0RGUih5KSAgfCBBRFNfUEQxMF9BRENfT047CitzdGF0aWMgY29uc3QgdTgJcmVhZF96MSA9IFJFQURfMTJCSVRfREZSKHoxKSB8IEFEU19QRDEwX0FEQ19PTjsKK3N0YXRpYyBjb25zdCB1OAlyZWFkX3oyID0gUkVBRF8xMkJJVF9ERlIoejIpIHwgQURTX1BEMTBfQURDX09OOworc3RhdGljIGNvbnN0IHU4CXJlYWRfeCAgPSBSRUFEXzEyQklUX0RGUih4KSAgfCBBRFNfUEQxMF9QRE9XTjsJLyogTEFTVCAqLworCisvKiBzaW5nbGUtZW5kZWQgc2FtcGxlcyBuZWVkIHRvIGZpcnN0IHBvd2VyIHVwIHJlZmVyZW5jZSB2b2x0YWdlOworICogd2UgbGVhdmUgYm90aCBBREMgYW5kIFZSRUYgcG93ZXJlZAorICovCisjZGVmaW5lCVJFQURfMTJCSVRfU0VSKHgpIChBRFNfU1RBUlQgfCBBRFNfQTJBMUEwXyAjIyB4IFwKKwl8IEFEU18xMl9CSVQgfCBBRFNfU0VSKQorCitzdGF0aWMgY29uc3QgdTgJcmVmX29uID0gUkVBRF8xMkJJVF9ERlIoeCkgfCBBRFNfUEQxMF9BTExfT047CitzdGF0aWMgY29uc3QgdTgJcmVmX29mZiA9IFJFQURfMTJCSVRfREZSKHkpIHwgQURTX1BEMTBfUERPV047CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogTm9uLXRvdWNoc2NyZWVuIHNlbnNvcnMgb25seSB1c2Ugc2luZ2xlLWVuZGVkIGNvbnZlcnNpb25zLgorICovCisKK3N0cnVjdCBzZXJfcmVxIHsKKwl1OAkJCWNvbW1hbmQ7CisJdTE2CQkJc2NyYXRjaDsKKwlfX2JlMTYJCQlzYW1wbGU7CisJc3RydWN0IHNwaV9tZXNzYWdlCW1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXhmZXJbNl07Cit9OworCitzdGF0aWMgaW50IGFkczc4NDZfcmVhZDEyX3NlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNvbW1hbmQpCit7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYWRzNzg0NgkJKnRzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNlcl9yZXEJCSpyZXEgPSBremFsbG9jKHNpemVvZiAqcmVxLCBTTEFCX0tFUk5FTCk7CisJaW50CQkJc3RhdHVzOworCWludAkJCXNhbXBsZTsKKwlpbnQgCQkJaTsKKworCWlmICghcmVxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUlOSVRfTElTVF9IRUFEKCZyZXEtPm1zZy50cmFuc2ZlcnMpOworCisJLyogYWN0aXZhdGUgcmVmZXJlbmNlLCBzbyBpdCBoYXMgdGltZSB0byBzZXR0bGU7ICovCisJcmVxLT54ZmVyWzBdLnR4X2J1ZiA9ICZyZWZfb247CisJcmVxLT54ZmVyWzBdLmxlbiA9IDE7CisJcmVxLT54ZmVyWzFdLnJ4X2J1ZiA9ICZyZXEtPnNjcmF0Y2g7CisJcmVxLT54ZmVyWzFdLmxlbiA9IDI7CisKKwkvKgorCSAqIGZvciBleHRlcm5hbCBWUkVGLCAwIHVzZWMgKGFuZCBhc3N1bWUgaXQncyBhbHdheXMgb24pOworCSAqIGZvciAxdUYsIHVzZSA4MDAgdXNlYzsKKwkgKiBubyBjYXAsIDEwMCB1c2VjLgorCSAqLworCXJlcS0+eGZlclsxXS5kZWxheV91c2VjcyA9IHRzLT52cmVmX2RlbGF5X3VzZWNzOworCisJLyogdGFrZSBzYW1wbGUgKi8KKwlyZXEtPmNvbW1hbmQgPSAodTgpIGNvbW1hbmQ7CisJcmVxLT54ZmVyWzJdLnR4X2J1ZiA9ICZyZXEtPmNvbW1hbmQ7CisJcmVxLT54ZmVyWzJdLmxlbiA9IDE7CisJcmVxLT54ZmVyWzNdLnJ4X2J1ZiA9ICZyZXEtPnNhbXBsZTsKKwlyZXEtPnhmZXJbM10ubGVuID0gMjsKKworCS8qIFJFVklTSVQ6ICB0YWtlIGEgZmV3IG1vcmUgc2FtcGxlcywgYW5kIGNvbXBhcmUgLi4uICovCisKKwkvKiB0dXJuIG9mZiByZWZlcmVuY2UgKi8KKwlyZXEtPnhmZXJbNF0udHhfYnVmID0gJnJlZl9vZmY7CisJcmVxLT54ZmVyWzRdLmxlbiA9IDE7CisJcmVxLT54ZmVyWzVdLnJ4X2J1ZiA9ICZyZXEtPnNjcmF0Y2g7CisJcmVxLT54ZmVyWzVdLmxlbiA9IDI7CisKKwlDU19DSEFOR0UocmVxLT54ZmVyWzVdKTsKKworCS8qIGdyb3VwIGFsbCB0aGUgdHJhbnNmZXJzIHRvZ2V0aGVyLCBzbyB3ZSBjYW4ndCBpbnRlcmZlcmUgd2l0aAorCSAqIHJlYWRpbmcgdG91Y2hzY3JlZW4gc3RhdGU7IGRpc2FibGUgcGVuaXJxIHdoaWxlIHNhbXBsaW5nCisJICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnJlcS0+eGZlcltpXSwgJnJlcS0+bXNnKTsKKworCWRpc2FibGVfaXJxKHNwaS0+aXJxKTsKKwlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZyZXEtPm1zZyk7CisJZW5hYmxlX2lycShzcGktPmlycSk7CisKKwlpZiAocmVxLT5tc2cuc3RhdHVzKQorCQlzdGF0dXMgPSByZXEtPm1zZy5zdGF0dXM7CisJc2FtcGxlID0gYmUxNl90b19jcHUocmVxLT5zYW1wbGUpOworCXNhbXBsZSA9IHNhbXBsZSA+PiA0OworCWtmcmVlKHJlcSk7CisKKwlyZXR1cm4gc3RhdHVzID8gc3RhdHVzIDogc2FtcGxlOworfQorCisjZGVmaW5lIFNIT1cobmFtZSkgc3RhdGljIHNzaXplX3QgXAorbmFtZSAjIyBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKK3sgXAorCXNzaXplX3QgdiA9IGFkczc4NDZfcmVhZDEyX3NlcihkZXYsIFwKKwkJCVJFQURfMTJCSVRfU0VSKG5hbWUpIHwgQURTX1BEMTBfQUxMX09OKTsgXAorCWlmICh2IDwgMCkgXAorCQlyZXR1cm4gdjsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCAodW5zaWduZWQpIHYpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBuYW1lICMjIF9zaG93LCBOVUxMKTsKKworU0hPVyh0ZW1wMCkKK1NIT1codGVtcDEpCitTSE9XKHZhdXgpCitTSE9XKHZiYXR0KQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFBFTklSUSBvbmx5IGtpY2tzIHRoZSB0aW1lci4gIFRoZSB0aW1lciBvbmx5IHJlaXNzdWVzIHRoZSBTUEkgdHJhbnNmZXIsCisgKiB0byByZXRyaWV2ZSB0b3VjaHNjcmVlbiBzdGF0dXMuCisgKgorICogVGhlIFNQSSB0cmFuc2ZlciBjb21wbGV0aW9uIGNhbGxiYWNrIGRvZXMgdGhlIHJlYWwgd29yay4gIEl0IHJlcG9ydHMKKyAqIHRvdWNoc2NyZWVuIGV2ZW50cyBhbmQgcmVhY3RpdmF0ZXMgdGhlIHRpbWVyIChvciBJUlEpIGFzIGFwcHJvcHJpYXRlLgorICovCisKK3N0YXRpYyB2b2lkIGFkczc4NDZfcngodm9pZCAqYWRzKQoreworCXN0cnVjdCBhZHM3ODQ2CSp0cyA9IGFkczsKKwl1bnNpZ25lZAlSdDsKKwl1bnNpZ25lZAlzeW5jID0gMDsKKwl1MTYJCXgsIHksIHoxLCB6MjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJLyogYWRqdXN0OiAgMTIgYml0IHNhbXBsZXMgKGxlZnQgYWxpZ25lZCksIGJ1aWx0IGZyb20KKwkgKiB0d28gOCBiaXQgdmFsdWVzIHdyaXRlbiBtc2ItZmlyc3QuCisJICovCisJeCA9IGJlMTZfdG9fY3B1KHRzLT50Yy54KSA+PiA0OworCXkgPSBiZTE2X3RvX2NwdSh0cy0+dGMueSkgPj4gNDsKKwl6MSA9IGJlMTZfdG9fY3B1KHRzLT50Yy56MSkgPj4gNDsKKwl6MiA9IGJlMTZfdG9fY3B1KHRzLT50Yy56MikgPj4gNDsKKworCS8qIHJhbmdlIGZpbHRlcmluZyAqLworCWlmICh4ID09IE1BWF8xMkJJVCkKKwkJeCA9IDA7CisKKwlpZiAoeCAmJiB6MSAmJiB0cy0+c3BpLT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pIHsKKwkJLyogY29tcHV0ZSB0b3VjaCBwcmVzc3VyZSByZXNpc3RhbmNlIHVzaW5nIGVxdWF0aW9uICMyICovCisJCVJ0ID0gejI7CisJCVJ0IC09IHoxOworCQlSdCAqPSB4OworCQlSdCAqPSB0cy0+eF9wbGF0ZV9vaG1zOworCQlSdCAvPSB6MTsKKwkJUnQgPSAoUnQgKyAyMDQ3KSA+PiAxMjsKKwl9IGVsc2UKKwkJUnQgPSAwOworCisJLyogTk9URTogICJwZW5kb3duIiBpcyBpbmZlcnJlZCBmcm9tIHByZXNzdXJlOyB3ZSBkb24ndCByZWx5IG9uCisJICogYmVpbmcgYWJsZSB0byBjaGVjayBuUEVOSVJRIHN0YXR1cywgb3IgImZyaWVuZGx5IiB0cmlnZ2VyIG1vZGVzCisJICogKGJvdGgtZWRnZXMgaXMgbXVjaCBiZXR0ZXIgdGhhbiBqdXN0LWZhbGxpbmcgb3IgbG93LWxldmVsKS4KKwkgKgorCSAqIFJFVklTSVQ6ICBzb21lIGJvYXJkcyBtYXkgcmVxdWlyZSByZWFkaW5nIG5QRU5JUlE7IGl0J3MKKwkgKiBuZWVkZWQgb24gNzg0My4gIGFuZCA3ODQ1IHJlYWRzIHByZXNzdXJlIGRpZmZlcmVudGx5Li4uCisJICoKKwkgKiBSRVZJU0lUOiAgdGhlIHRvdWNoc2NyZWVuIG1pZ2h0IG5vdCBiZSBjb25uZWN0ZWQ7IHRoaXMgY29kZQorCSAqIHdvbid0IG5vdGljZSB0aGF0LCBldmVuIGlmIG5QRU5JUlEgbmV2ZXIgZmlyZXMgLi4uCisJICovCisJaWYgKCF0cy0+cGVuZG93biAmJiBSdCAhPSAwKSB7CisJCWlucHV0X3JlcG9ydF9rZXkoJnRzLT5pbnB1dCwgQlROX1RPVUNILCAxKTsKKwkJc3luYyA9IDE7CisJfSBlbHNlIGlmICh0cy0+cGVuZG93biAmJiBSdCA9PSAwKSB7CisJCWlucHV0X3JlcG9ydF9rZXkoJnRzLT5pbnB1dCwgQlROX1RPVUNILCAwKTsKKwkJc3luYyA9IDE7CisJfQorCisJaWYgKFJ0KSB7CisJCWlucHV0X3JlcG9ydF9hYnMoJnRzLT5pbnB1dCwgQUJTX1gsIHgpOworCQlpbnB1dF9yZXBvcnRfYWJzKCZ0cy0+aW5wdXQsIEFCU19ZLCB5KTsKKwkJaW5wdXRfcmVwb3J0X2FicygmdHMtPmlucHV0LCBBQlNfUFJFU1NVUkUsIFJ0KTsKKwkJc3luYyA9IDE7CisJfQorCWlmIChzeW5jKQorCQlpbnB1dF9zeW5jKCZ0cy0+aW5wdXQpOworCisjaWZkZWYJVkVSQk9TRQorCWlmIChSdCB8fCB0cy0+cGVuZG93bikKKwkJcHJfZGVidWcoIiVzOiAlZC8lZC8lZCVzXG4iLCB0cy0+c3BpLT5kZXYuYnVzX2lkLAorCQkJeCwgeSwgUnQsIFJ0ID8gIiIgOiAiIFVQIik7CisjZW5kaWYKKworCS8qIGRvbid0IHJldHJpZ2dlciB3aGlsZSB3ZSdyZSBzdXNwZW5kZWQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHMtPmxvY2ssIGZsYWdzKTsKKworCXRzLT5wZW5kb3duID0gKFJ0ICE9IDApOworCXRzLT5wZW5kaW5nID0gMDsKKworCWlmICh0cy0+c3BpLT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pIHsKKwkJaWYgKHRzLT5wZW5kb3duKQorCQkJbW9kX3RpbWVyKCZ0cy0+dGltZXIsIGppZmZpZXMgKyBUU19QT0xMX1BFUklPRCk7CisJCWVsc2UgaWYgKHRzLT5pcnFfZGlzYWJsZWQpIHsKKwkJCXRzLT5pcnFfZGlzYWJsZWQgPSAwOworCQkJZW5hYmxlX2lycSh0cy0+c3BpLT5pcnEpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWRzNzg0Nl90aW1lcih1bnNpZ25lZCBsb25nIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgYWRzNzg0NgkqdHMgPSAodm9pZCAqKWhhbmRsZTsKKwlpbnQJCXN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cy0+bG9jaywgZmxhZ3MpOworCWlmICghdHMtPnBlbmRpbmcpIHsKKwkJdHMtPnBlbmRpbmcgPSAxOworCQlpZiAoIXRzLT5pcnFfZGlzYWJsZWQpIHsKKwkJCXRzLT5pcnFfZGlzYWJsZWQgPSAxOworCQkJZGlzYWJsZV9pcnEodHMtPnNwaS0+aXJxKTsKKwkJfQorCQlzdGF0dXMgPSBzcGlfYXN5bmModHMtPnNwaSwgJnRzLT5tc2cpOworCQlpZiAoc3RhdHVzKQorCQkJZGV2X2VycigmdHMtPnNwaS0+ZGV2LCAic3BpX2FzeW5jIC0tPiAlZFxuIiwKKwkJCQkJc3RhdHVzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGFkczc4NDZfaXJxKGludCBpcnEsIHZvaWQgKmhhbmRsZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJYWRzNzg0Nl90aW1lcigodW5zaWduZWQgbG9uZykgaGFuZGxlKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50CithZHM3ODQ2X3N1c3BlbmQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IGFkczc4NDYgKnRzID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cy0+bG9jaywgZmxhZ3MpOworCisJc3BpLT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBtZXNzYWdlOworCisJLyogYXJlIHdlIHdhaXRpbmcgZm9yIElSUSwgb3IgcG9sbGluZz8gKi8KKwlpZiAoIXRzLT5wZW5kb3duKSB7CisJCWlmICghdHMtPmlycV9kaXNhYmxlZCkgeworCQkJdHMtPmlycV9kaXNhYmxlZCA9IDE7CisJCQlkaXNhYmxlX2lycSh0cy0+c3BpLT5pcnEpOworCQl9CisJfSBlbHNlIHsKKwkJLyogcG9sbGluZzsgZm9yY2UgYSBmaW5hbCBTUEkgY29tcGxldGlvbjsKKwkJICogdGhhdCB3aWxsIGNsZWFuIHRoaW5ncyB1cCBuZWF0bHkKKwkJICovCisJCWlmICghdHMtPnBlbmRpbmcpCisJCQltb2RfdGltZXIoJnRzLT50aW1lciwgamlmZmllcyk7CisKKwkJd2hpbGUgKHRzLT5wZW5kb3duIHx8IHRzLT5wZW5kaW5nKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cy0+bG9jaywgZmxhZ3MpOworCQkJdWRlbGF5KDEwKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cy0+bG9jaywgZmxhZ3MpOworCQl9CisJfQorCisJLyogd2Uga25vdyB0aGUgY2hpcCdzIGluIGxvd3Bvd2VyIG1vZGUgc2luY2Ugd2UgYWx3YXlzCisJICogbGVhdmUgaXQgdGhhdCB3YXkgYWZ0ZXIgZXZlcnkgcmVxdWVzdAorCSAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHM3ODQ2X3Jlc3VtZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZHM3ODQ2ICp0cyA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOworCisJdHMtPmlycV9kaXNhYmxlZCA9IDA7CisJZW5hYmxlX2lycSh0cy0+c3BpLT5pcnEpOworCXNwaS0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWRzNzg0Nl9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZHM3ODQ2CQkJKnRzOworCXN0cnVjdCBhZHM3ODQ2X3BsYXRmb3JtX2RhdGEJKnBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCQkqeDsKKwlpbnQJCQkJaTsKKworCWlmICghc3BpLT5pcnEpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJubyBJUlE/XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZGJnKCZzcGktPmRldiwgIm5vIHBsYXRmb3JtIGRhdGE/XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogZG9uJ3QgZXhjZWVkIG1heCBzcGVjaWZpZWQgc2FtcGxlIHJhdGUgKi8KKwlpZiAoc3BpLT5tYXhfc3BlZWRfaHogPiAoMTI1MDAwICogMTYpKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAiZihzYW1wbGUpICVkIEtIej9cbiIsCisJCQkJKHNwaS0+bWF4X3NwZWVkX2h6LzE2KS8xMDAwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogV2UnZCBzZXQgdGhlIHdvcmRzaXplIHRvIDEyIGJpdHMgLi4uIGV4Y2VwdCB0aGF0IHNvbWUgY29udHJvbGxlcnMKKwkgKiB3aWxsIHRoZW4gdHJlYXQgdGhlIDggYml0IGNvbW1hbmQgd29yZHMgYXMgMTIgYml0cyAoYW5kIGRyb3AgdGhlCisJICogZm91ciBNU0JzIG9mIHRoZSAxMiBiaXQgcmVzdWx0KS4gIFJlc3VsdDogaW5wdXRzIG11c3QgYmUgc2hpZnRlZAorCSAqIHRvIGRpc2NhcmQgdGhlIGZvdXIgZ2FyYmFnZSBMU0JzLgorCSAqLworCisJaWYgKCEodHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWRzNzg0NiksIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCB0cyk7CisKKwl0cy0+c3BpID0gc3BpOworCXNwaS0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKKworCWluaXRfdGltZXIoJnRzLT50aW1lcik7CisJdHMtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgdHM7CisJdHMtPnRpbWVyLmZ1bmN0aW9uID0gYWRzNzg0Nl90aW1lcjsKKworCXRzLT5tb2RlbCA9IHBkYXRhLT5tb2RlbCA/IDogNzg0NjsKKwl0cy0+dnJlZl9kZWxheV91c2VjcyA9IHBkYXRhLT52cmVmX2RlbGF5X3VzZWNzID8gOiAxMDA7CisJdHMtPnhfcGxhdGVfb2htcyA9IHBkYXRhLT54X3BsYXRlX29obXMgPyA6IDQwMDsKKworCWluaXRfaW5wdXRfZGV2KCZ0cy0+aW5wdXQpOworCisJdHMtPmlucHV0LmRldiA9ICZzcGktPmRldjsKKwl0cy0+aW5wdXQubmFtZSA9ICJBRFM3ODR4IFRvdWNoc2NyZWVuIjsKKwlzbnByaW50Zih0cy0+cGh5cywgc2l6ZW9mIHRzLT5waHlzLCAiJXMvaW5wdXQwIiwgc3BpLT5kZXYuYnVzX2lkKTsKKwl0cy0+aW5wdXQucGh5cyA9IHRzLT5waHlzOworCisJdHMtPmlucHV0LmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfQUJTKTsKKwl0cy0+aW5wdXQua2V5Yml0W0xPTkcoQlROX1RPVUNIKV0gPSBCSVQoQlROX1RPVUNIKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcygmdHMtPmlucHV0LCBBQlNfWCwKKwkJCXBkYXRhLT54X21pbiA/IDogMCwKKwkJCXBkYXRhLT54X21heCA/IDogTUFYXzEyQklULAorCQkJMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoJnRzLT5pbnB1dCwgQUJTX1ksCisJCQlwZGF0YS0+eV9taW4gPyA6IDAsCisJCQlwZGF0YS0+eV9tYXggPyA6IE1BWF8xMkJJVCwKKwkJCTAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKCZ0cy0+aW5wdXQsIEFCU19QUkVTU1VSRSwKKwkJCXBkYXRhLT5wcmVzc3VyZV9taW4sIHBkYXRhLT5wcmVzc3VyZV9tYXgsIDAsIDApOworCisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZ0cy0+aW5wdXQpOworCisJLyogc2V0IHVwIHRoZSB0cmFuc2ZlcnMgdG8gcmVhZCB0b3VjaHNjcmVlbiBzdGF0ZTsgdGhpcyBhc3N1bWVzIHdlCisJICogdXNlIGZvcm11bGEgIzIgZm9yIHByZXNzdXJlLCBub3QgIzMuCisJICovCisJeCA9IHRzLT54ZmVyOworCisJLyogeS0gc3RpbGwgb247IHR1cm4gb24gb25seSB5KyAoYW5kIEFEQykgKi8KKwl4LT50eF9idWYgPSAmcmVhZF95OworCXgtPmxlbiA9IDE7CisJeCsrOworCXgtPnJ4X2J1ZiA9ICZ0cy0+dGMueTsKKwl4LT5sZW4gPSAyOworCXgrKzsKKworCS8qIHR1cm4geSsgb2ZmLCB4LSBvbjsgd2UnbGwgdXNlIGZvcm11bGEgIzIgKi8KKwlpZiAodHMtPm1vZGVsID09IDc4NDYpIHsKKwkJeC0+dHhfYnVmID0gJnJlYWRfejE7CisJCXgtPmxlbiA9IDE7CisJCXgrKzsKKwkJeC0+cnhfYnVmID0gJnRzLT50Yy56MTsKKwkJeC0+bGVuID0gMjsKKwkJeCsrOworCisJCXgtPnR4X2J1ZiA9ICZyZWFkX3oyOworCQl4LT5sZW4gPSAxOworCQl4Kys7CisJCXgtPnJ4X2J1ZiA9ICZ0cy0+dGMuejI7CisJCXgtPmxlbiA9IDI7CisJCXgrKzsKKwl9CisKKwkvKiB0dXJuIHktIG9mZiwgeCsgb24sIHRoZW4gbGVhdmUgaW4gbG93cG93ZXIgKi8KKwl4LT50eF9idWYgPSAmcmVhZF94OworCXgtPmxlbiA9IDE7CisJeCsrOworCXgtPnJ4X2J1ZiA9ICZ0cy0+dGMueDsKKwl4LT5sZW4gPSAyOworCXgrKzsKKworCUNTX0NIQU5HRSh4Wy0xXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgeCAtIHRzLT54ZmVyOyBpKyspCisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0cy0+eGZlcltpXSwgJnRzLT5tc2cpOworCXRzLT5tc2cuY29tcGxldGUgPSBhZHM3ODQ2X3J4OworCXRzLT5tc2cuY29udGV4dCA9IHRzOworCisJaWYgKHJlcXVlc3RfaXJxKHNwaS0+aXJxLCBhZHM3ODQ2X2lycSwgU0FfU0FNUExFX1JBTkRPTSwKKwkJCQlzcGktPmRldi5idXNfaWQsIHRzKSkgeworCQlkZXZfZGJnKCZzcGktPmRldiwgImlycSAlZCBidXN5P1xuIiwgc3BpLT5pcnEpOworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmdHMtPmlucHV0KTsKKwkJa2ZyZWUodHMpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlzZXRfaXJxX3R5cGUoc3BpLT5pcnEsIElSUVRfRkFMTElORyk7CisKKwlkZXZfaW5mbygmc3BpLT5kZXYsICJ0b3VjaHNjcmVlbiwgaXJxICVkXG4iLCBzcGktPmlycSk7CisKKwkvKiB0YWtlIGEgZmlyc3Qgc2FtcGxlLCBsZWF2aW5nIG5QRU5JUlEgYWN0aXZlOyBhdm9pZAorCSAqIHRoZSB0b3VjaHNjcmVlbiwgaW4gY2FzZSBpdCdzIG5vdCBjb25uZWN0ZWQuCisJICovCisJKHZvaWQpIGFkczc4NDZfcmVhZDEyX3Nlcigmc3BpLT5kZXYsCisJCQkgIFJFQURfMTJCSVRfU0VSKHZhdXgpIHwgQURTX1BEMTBfQUxMX09OKTsKKworCS8qIGFkczc4NDMvNzg0NSBkb24ndCBoYXZlIHRlbXBlcmF0dXJlIHNlbnNvcnMsIGFuZAorCSAqIHVzZSB0aGUgb3RoZXIgc2Vuc29ycyBhIGJpdCBkaWZmZXJlbnRseSB0b28KKwkgKi8KKwlpZiAodHMtPm1vZGVsID09IDc4NDYpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3RlbXAwKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3RlbXAxKTsKKwl9CisJaWYgKHRzLT5tb2RlbCAhPSA3ODQ1KQorCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfdmJhdHQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl92YXV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZHM3ODQ2X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZHM3ODQ2CQkqdHMgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCWFkczc4NDZfc3VzcGVuZChzcGksIFBNU0dfU1VTUEVORCk7CisJZnJlZV9pcnEodHMtPnNwaS0+aXJxLCB0cyk7CisJaWYgKHRzLT5pcnFfZGlzYWJsZWQpCisJCWVuYWJsZV9pcnEodHMtPnNwaS0+aXJxKTsKKworCWlmICh0cy0+bW9kZWwgPT0gNzg0NikgeworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfdGVtcDApOworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfdGVtcDEpOworCX0KKwlpZiAodHMtPm1vZGVsICE9IDc4NDUpCisJCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl92YmF0dCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3ZhdXgpOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnRzLT5pbnB1dCk7CisJa2ZyZWUodHMpOworCisJZGV2X2RiZygmc3BpLT5kZXYsICJ1bnJlZ2lzdGVyZWQgdG91Y2hzY3JlZW5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRzNzg0Nl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWRzNzg0NiIsCisJCS5idXMJPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBhZHM3ODQ2X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWRzNzg0Nl9yZW1vdmUpLAorCS5zdXNwZW5kCT0gYWRzNzg0Nl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWRzNzg0Nl9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZHM3ODQ2X2luaXQodm9pZCkKK3sKKwkvKiBncnIsIGJvYXJkLXNwZWNpZmljIGluaXQgc2hvdWxkIHN0YXkgb3V0IG9mIGRyaXZlcnMhISAqLworCisjaWZkZWYJQ09ORklHX0FSQ0hfT01BUAorCWlmIChtYWNoaW5lX2lzX29tYXBfb3NrKCkpIHsKKwkJLyogR1BJTzQgPSBQRU5JUlE7IEdQSU82ID0gQlVTWSAqLworCQlvbWFwX3JlcXVlc3RfZ3Bpbyg0KTsKKwkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oNCwgMSk7CisJCW9tYXBfcmVxdWVzdF9ncGlvKDYpOworCQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbig2LCAxKTsKKwl9CisJLy8gYWxzbyBUSSAxNTEwIElubm92YXRvciwgYml0YmFuZ2luZyB0aHJvdWdoIEZQR0EKKwkvLyBhbHNvIE5va2lhIDc3MAorCS8vIGFsc28gUGFsbSBUdW5nc3RlbiBUMgorI2VuZGlmCisKKwkvLyBQWEE6CisJLy8gYWxzbyBEZWxsIEF4aW0gWDUwCisJLy8gYWxzbyBIUCBpUGFxIEgxOTF4L0gxOTJ4L0g0MTV4L0g0MzV4CisJLy8gYWxzbyBJbnRlbCBMdWJib2NrIChhZGRpdGlvbmFsIHRvIFVDQjE0MDA7IGFzIHRlbXBlcmF0dXJlIHNlbnNvcikKKwkvLyBhbHNvIFNoYXJwIFphdXJ1cyBDN3h4LCBDOHh4IChjb3JnaS9zaGVwZXJkL2h1c2t5KQorCisJLy8gQXRtZWwgYXQ5MXNhbTkyNjEtRUsgdXNlcyBhZHM3ODQzCisKKwkvLyBhbHNvIHZhcmlvdXMgQU1EIEF1MXgwMCBkZXZlbCBib2FyZHMKKworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZHM3ODQ2X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZHM3ODQ2X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWRzNzg0Nl9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZHM3ODQ2X2RyaXZlcik7CisKKyNpZmRlZglDT05GSUdfQVJDSF9PTUFQCisJaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkgeworCQlvbWFwX2ZyZWVfZ3Bpbyg0KTsKKwkJb21hcF9mcmVlX2dwaW8oNik7CisJfQorI2VuZGlmCisKK30KK21vZHVsZV9leGl0KGFkczc4NDZfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQURTNzg0NiBUb3VjaFNjcmVlbiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1fcGNpLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvYXZtX3BjaS5jCmluZGV4IDVkOGVlNzMuLjRhYmU1ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1fcGNpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2F2bV9wY2kuYwpAQCAtMzU4LDcgKzM1OCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBIRExDX2lycShzdHJ1Y3QgQkNTdGF0ZSAqYmNzLCB1X2ludCBzdGF0KSB7CiAJaW50IGxlbjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2RpdmEuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9kaXZhLmMKaW5kZXggYjYyZDZiMy4uYjBmZjFjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2RpdmEuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZGl2YS5jCkBAIC00NzYsNyArNDc2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIE1lbWhzY3hfaW50ZXJydXB0KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgdV9jaGFyIHZhbCwgdV9jaGFyIGhzY3gpCiB7CiAJdV9jaGFyIHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaHNjeF9pcnEuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oc2N4X2lycS5jCmluZGV4IDVmZTlkNDIuLjdiMWFkNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9oc2N4X2lycS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oc2N4X2lycS5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIGhzY3hfaW50ZXJydXB0KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgdV9jaGFyIHZhbCwgdV9jaGFyIGhzY3gpCiB7CiAJdV9jaGFyIHI7CkBAIC0yMjEsNyArMjIxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIGhzY3hfaW50X21haW4oc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCB1X2NoYXIgdmFsKQogewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvamFkZV9pcnEuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9qYWRlX2lycS5jCmluZGV4IDA4NTYzNDAuLjFmMjAxYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9qYWRlX2lycS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9qYWRlX2lycS5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBqYWRlX2ludGVycnVwdChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIHVfY2hhciB2YWwsIHVfY2hhciBqYWRlKQogewogCXVfY2hhciByOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW8tYWRiLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpby1hZGIuYwppbmRleCBjZjZhNmYyLi4zMTRmYzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpby1hZGIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpby1hZGIuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCiBzdHJ1Y3QgcHJlZyB7CiAJdW5zaWduZWQgY2hhciByOwpAQCAtODgsMjQgKzg5LDI2IEBACiBpbnQgbWFjaW9faW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYWRiczsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAogCWFkYnMgPSBmaW5kX2NvbXBhdGlibGVfZGV2aWNlcygiYWRiIiwgImNocnAsYWRiMCIpOwogCWlmIChhZGJzID09IDApCiAJCXJldHVybiAtRU5YSU87CiAKICNpZiAwCi0JeyBpbnQgaTsKKwl7IGludCBpID0gMDsKIAogCXByaW50aygibWFjaW9fYWRiX2luaXQ6IG5vZGUgPSAlcCwgYWRkcnMgPSIsIGFkYnMtPm5vZGUpOwotCWZvciAoaSA9IDA7IGkgPCBhZGJzLT5uX2FkZHJzOyArK2kpCi0JCXByaW50aygiICV4KCV4KSIsIGFkYnMtPmFkZHJzW2ldLmFkZHJlc3MsIGFkYnMtPmFkZHJzW2ldLnNpemUpOworCXdoaWxlKCFvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGFkYnMsIGksICZyKSkKKwkJcHJpbnRrKCIgJXgoJXgpIiwgci5zdGFydCwgci5lbmQgLSByLnN0YXJ0KTsKIAlwcmludGsoIiwgaW50cnMgPSIpOwogCWZvciAoaSA9IDA7IGkgPCBhZGJzLT5uX2ludHJzOyArK2kpCiAJCXByaW50aygiICV4IiwgYWRicy0+aW50cnNbaV0ubGluZSk7CiAJcHJpbnRrKCJcbiIpOyB9CiAjZW5kaWYKLQkKLQlhZGIgPSBpb3JlbWFwKGFkYnMtPmFkZHJzLT5hZGRyZXNzLCBzaXplb2Yoc3RydWN0IGFkYl9yZWdzKSk7CisJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoYWRicywgMCwgJnIpKQorCQlyZXR1cm4gLUVOWElPOworCWFkYiA9IGlvcmVtYXAoci5zdGFydCwgc2l6ZW9mKHN0cnVjdCBhZGJfcmVncykpOwogCiAJb3V0XzgoJmFkYi0+Y3RybC5yLCAwKTsKIAlvdXRfOCgmYWRiLT5pbnRyLnIsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCmluZGV4IDJhNTQ1Y2UuLmVkNmQzMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKQEAgLTIxMSw2ICsyMTEsOSBAQAogICAgICAgIC5uYW1lCT0gIm1hY2lvIiwKICAgICAgICAubWF0Y2gJPSBtYWNpb19idXNfbWF0Y2gsCiAgICAgICAgLnVldmVudCA9IG1hY2lvX3VldmVudCwKKyAgICAgICAucHJvYmUJPSBtYWNpb19kZXZpY2VfcHJvYmUsCisgICAgICAgLnJlbW92ZQk9IG1hY2lvX2RldmljZV9yZW1vdmUsCisgICAgICAgLnNodXRkb3duID0gbWFjaW9fZGV2aWNlX3NodXRkb3duLAogICAgICAgIC5zdXNwZW5kCT0gbWFjaW9fZGV2aWNlX3N1c3BlbmQsCiAgICAgICAgLnJlc3VtZQk9IG1hY2lvX2RldmljZV9yZXN1bWUsCiAgICAgICAgLmRldl9hdHRycyA9IG1hY2lvX2Rldl9hdHRycywKQEAgLTUyOCw5ICs1MzEsNiBAQAogCS8qIGluaXRpYWxpemUgY29tbW9uIGRyaXZlciBmaWVsZHMgKi8KIAlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZtYWNpb19idXNfdHlwZTsKLQlkcnYtPmRyaXZlci5wcm9iZSA9IG1hY2lvX2RldmljZV9wcm9iZTsKLQlkcnYtPmRyaXZlci5yZW1vdmUgPSBtYWNpb19kZXZpY2VfcmVtb3ZlOwotCWRydi0+ZHJpdmVyLnNodXRkb3duID0gbWFjaW9fZGV2aWNlX3NodXRkb3duOwogCiAJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJY291bnQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYml0bWFwLmMgYi9kcml2ZXJzL21kL2JpdG1hcC5jCmluZGV4IDc2YTE4OWMuLmVhZTQ0NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYml0bWFwLmMKKysrIGIvZHJpdmVycy9tZC9iaXRtYXAuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAvKiBpZiBwYWdlIGlzIGNvbXBsZXRlbHkgZW1wdHksIHB1dCBpdCBiYWNrIG9uIHRoZSBmcmVlIGxpc3QsIG9yIGRlYWxsb2MgaXQgKi8KIC8qIGlmIHBhZ2Ugd2FzIGhpamFja2VkLCB1bm1hcmsgdGhlIGZsYWcgc28gaXQgbWlnaHQgZ2V0IGFsbG9jZWQgbmV4dCB0aW1lICovCiAvKiBOb3RlOiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYml0bWFwX2NoZWNrZnJlZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHVuc2lnbmVkIGxvbmcgcGFnZSkKK3N0YXRpYyB2b2lkIGJpdG1hcF9jaGVja2ZyZWUoc3RydWN0IGJpdG1hcCAqYml0bWFwLCB1bnNpZ25lZCBsb25nIHBhZ2UpCiB7CiAJY2hhciAqcHRyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKaW5kZXggYTYwMWE0Mi4uZTdhNjUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwpAQCAtMjI4LDcgKzIyOCw3IEBACiB9OwogCiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBjcnlwdF9jb252ZXJ0X3NjYXR0ZXJsaXN0KHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKm91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICppbiwgdW5zaWduZWQgaW50IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdyaXRlLCBzZWN0b3JfdCBzZWN0b3IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWlvY3RsLmMgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKaW5kZXggNTYxYmRhNS4uMTIzNTEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWQvZG0taW9jdGwuYwpAQCAtNTk4LDcgKzU5OCw3IEBACiAvKgogICogQWx3YXlzIHVzZSBVVUlEIGZvciBsb29rdXBzIGlmIGl0J3MgcHJlc2VudCwgb3RoZXJ3aXNlIHVzZSBuYW1lIG9yIGRldi4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaGFzaF9jZWxsICpfX2ZpbmRfZGV2aWNlX2hhc2hfY2VsbChzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQorc3RhdGljIHN0cnVjdCBoYXNoX2NlbGwgKl9fZmluZF9kZXZpY2VfaGFzaF9jZWxsKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0pCiB7CiAJaWYgKCpwYXJhbS0+dXVpZCkKIAkJcmV0dXJuIF9fZ2V0X3V1aWRfY2VsbChwYXJhbS0+dXVpZCk7CkBAIC02MDgsNyArNjA4LDcgQEAKIAkJcmV0dXJuIGRtX2dldF9tZHB0cihodWdlX2RlY29kZV9kZXYocGFyYW0tPmRldikpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBwZWRfZGV2aWNlICpmaW5kX2RldmljZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQorc3RhdGljIHN0cnVjdCBtYXBwZWRfZGV2aWNlICpmaW5kX2RldmljZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQogewogCXN0cnVjdCBoYXNoX2NlbGwgKmhjOwogCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXNuYXAuYyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCmluZGV4IDRiOWRkOGYuLjg3NzI3ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc25hcC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCkBAIC02OTEsNyArNjkxLDcgQEAKIC8qCiAgKiBEaXNwYXRjaGVzIHRoZSBjb3B5IG9wZXJhdGlvbiB0byBrY29weWQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9jb3B5KHN0cnVjdCBwZW5kaW5nX2V4Y2VwdGlvbiAqcGUpCitzdGF0aWMgdm9pZCBzdGFydF9jb3B5KHN0cnVjdCBwZW5kaW5nX2V4Y2VwdGlvbiAqcGUpCiB7CiAJc3RydWN0IGRtX3NuYXBzaG90ICpzID0gcGUtPnNuYXA7CiAJc3RydWN0IGlvX3JlZ2lvbiBzcmMsIGRlc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggMDk3ZDFlNTQuLjhjMTYzNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uYworKysgYi9kcml2ZXJzL21kL2RtLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogICogRGVjcmVtZW50cyB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGlvcyB0aGF0IGEgYmlvIGhhcyBiZWVuCiAgKiBjbG9uZWQgaW50bywgY29tcGxldGluZyB0aGUgb3JpZ2luYWwgaW8gaWYgbmVjYy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGRlY19wZW5kaW5nKHN0cnVjdCBkbV9pbyAqaW8sIGludCBlcnJvcikKK3N0YXRpYyB2b2lkIGRlY19wZW5kaW5nKHN0cnVjdCBkbV9pbyAqaW8sIGludCBlcnJvcikKIHsKIAlpZiAoZXJyb3IpCiAJCWlvLT5lcnJvciA9IGVycm9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMS5jIGIvZHJpdmVycy9tZC9yYWlkMS5jCmluZGV4IGEwNmZmOTEuLmQzOWY1ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEuYworKysgYi9kcml2ZXJzL21kL3JhaWQxLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZyZWVfcjFiaW8ocjFiaW9fdCAqcjFfYmlvKQorc3RhdGljIHZvaWQgZnJlZV9yMWJpbyhyMWJpb190ICpyMV9iaW8pCiB7CiAJY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihyMV9iaW8tPm1kZGV2KTsKIApAQCAtMTkwLDcgKzE5MCw3IEBACiAJbWVtcG9vbF9mcmVlKHIxX2JpbywgY29uZi0+cjFiaW9fcG9vbCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfYnVmKHIxYmlvX3QgKnIxX2JpbykKK3N0YXRpYyB2b2lkIHB1dF9idWYocjFiaW9fdCAqcjFfYmlvKQogewogCWNvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYocjFfYmlvLT5tZGRldik7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxMC5jIGIvZHJpdmVycy9tZC9yYWlkMTAuYwppbmRleCA5ZTY1OGU1Li45MTMwZDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZyZWVfcjEwYmlvKHIxMGJpb190ICpyMTBfYmlvKQorc3RhdGljIHZvaWQgZnJlZV9yMTBiaW8ocjEwYmlvX3QgKnIxMF9iaW8pCiB7CiAJY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihyMTBfYmlvLT5tZGRldik7CiAKQEAgLTE5MCw3ICsxOTAsNyBAQAogCW1lbXBvb2xfZnJlZShyMTBfYmlvLCBjb25mLT5yMTBiaW9fcG9vbCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfYnVmKHIxMGJpb190ICpyMTBfYmlvKQorc3RhdGljIHZvaWQgcHV0X2J1ZihyMTBiaW9fdCAqcjEwX2JpbykKIHsKIAljb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKHIxMF9iaW8tPm1kZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS5jIGIvZHJpdmVycy9tZC9yYWlkNS5jCmluZGV4IDU0ZjRhOTguLjI1OTc2YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LmMKQEAgLTY5LDcgKzY5LDcgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfcmFpZDVfY29uZiAocmFpZDVfY29uZl90ICpjb25mKTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9fcmVsZWFzZV9zdHJpcGUocmFpZDVfY29uZl90ICpjb25mLCBzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoKQorc3RhdGljIHZvaWQgX19yZWxlYXNlX3N0cmlwZShyYWlkNV9jb25mX3QgKmNvbmYsIHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCiB7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnNoLT5jb3VudCkpIHsKIAkJaWYgKCFsaXN0X2VtcHR5KCZzaC0+bHJ1KSkKQEAgLTExOCw3ICsxMTgsNyBAQAogCWhsaXN0X2RlbF9pbml0KCZzaC0+aGFzaCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbnNlcnRfaGFzaChyYWlkNV9jb25mX3QgKmNvbmYsIHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCitzdGF0aWMgdm9pZCBpbnNlcnRfaGFzaChyYWlkNV9jb25mX3QgKmNvbmYsIHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCiB7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhwID0gc3RyaXBlX2hhc2goY29uZiwgc2gtPnNlY3Rvcik7CiAKQEAgLTE3OCw3ICsxNzgsNyBAQAogCiBzdGF0aWMgdm9pZCByYWlkNV9idWlsZF9ibG9jayAoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgaW50IGkpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9zdHJpcGUoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgcGRfaWR4KQorc3RhdGljIHZvaWQgaW5pdF9zdHJpcGUoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgcGRfaWR4KQogewogCXJhaWQ1X2NvbmZfdCAqY29uZiA9IHNoLT5yYWlkX2NvbmY7CiAJaW50IGRpc2tzID0gY29uZi0+cmFpZF9kaXNrcywgaTsKQEAgLTE0MTUsNyArMTQxNSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmFpZDVfYWN0aXZhdGVfZGVsYXllZChyYWlkNV9jb25mX3QgKmNvbmYpCitzdGF0aWMgdm9pZCByYWlkNV9hY3RpdmF0ZV9kZWxheWVkKHJhaWQ1X2NvbmZfdCAqY29uZikKIHsKIAlpZiAoYXRvbWljX3JlYWQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMpIDwgSU9fVEhSRVNIT0xEKSB7CiAJCXdoaWxlICghbGlzdF9lbXB0eSgmY29uZi0+ZGVsYXllZF9saXN0KSkgewpAQCAtMTQzMSw3ICsxNDMxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0ZV9iaXRfZGVsYXkocmFpZDVfY29uZl90ICpjb25mKQorc3RhdGljIHZvaWQgYWN0aXZhdGVfYml0X2RlbGF5KHJhaWQ1X2NvbmZfdCAqY29uZikKIHsKIAkvKiBkZXZpY2VfbG9jayBpcyBoZWxkICovCiAJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNm1haW4uYyBiL2RyaXZlcnMvbWQvcmFpZDZtYWluLmMKaW5kZXggOGM4MjNkNi4uZjYxOGE1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNm1haW4uYworKysgYi9kcml2ZXJzL21kL3JhaWQ2bWFpbi5jCkBAIC04OCw3ICs4OCw3IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X3JhaWQ2X2NvbmYgKHJhaWQ2X2NvbmZfdCAqY29uZik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3JlbGVhc2Vfc3RyaXBlKHJhaWQ2X2NvbmZfdCAqY29uZiwgc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKK3N0YXRpYyB2b2lkIF9fcmVsZWFzZV9zdHJpcGUocmFpZDZfY29uZl90ICpjb25mLCBzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoKQogewogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzaC0+Y291bnQpKSB7CiAJCWlmICghbGlzdF9lbXB0eSgmc2gtPmxydSkpCkBAIC0xOTcsNyArMTk3LDcgQEAKIAogc3RhdGljIHZvaWQgcmFpZDZfYnVpbGRfYmxvY2sgKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBpKTsKIAotc3RhdGljIGlubGluZSB2b2lkIGluaXRfc3RyaXBlKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHNlY3Rvcl90IHNlY3RvciwgaW50IHBkX2lkeCkKK3N0YXRpYyB2b2lkIGluaXRfc3RyaXBlKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHNlY3Rvcl90IHNlY3RvciwgaW50IHBkX2lkeCkKIHsKIAlyYWlkNl9jb25mX3QgKmNvbmYgPSBzaC0+cmFpZF9jb25mOwogCWludCBkaXNrcyA9IGNvbmYtPnJhaWRfZGlza3MsIGk7CkBAIC0xNTc3LDcgKzE1NzcsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHJhaWQ2X2FjdGl2YXRlX2RlbGF5ZWQocmFpZDZfY29uZl90ICpjb25mKQorc3RhdGljIHZvaWQgcmFpZDZfYWN0aXZhdGVfZGVsYXllZChyYWlkNl9jb25mX3QgKmNvbmYpCiB7CiAJaWYgKGF0b21pY19yZWFkKCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzKSA8IElPX1RIUkVTSE9MRCkgewogCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNvbmYtPmRlbGF5ZWRfbGlzdCkpIHsKQEAgLTE1OTMsNyArMTU5Myw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfYml0X2RlbGF5KHJhaWQ2X2NvbmZfdCAqY29uZikKK3N0YXRpYyB2b2lkIGFjdGl2YXRlX2JpdF9kZWxheShyYWlkNl9jb25mX3QgKmNvbmYpCiB7CiAJLyogZGV2aWNlX2xvY2sgaXMgaGVsZCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMKaW5kZXggZjY1ZjY0Yi4uNDRmY2JlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMKQEAgLTc3OSw5ICs3NzksOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGR2Yl9idDh4eF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGR2Yl9idDh4eF9wcm9iZShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpCiB7Ci0Jc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViID0gdG9fYnR0dl9zdWJfZGV2KGRldik7CiAJc3RydWN0IGR2Yl9idDh4eF9jYXJkICpjYXJkOwogCXN0cnVjdCBwY2lfZGV2KiBidHR2X3BjaV9kZXY7CiAJaW50IHJldDsKQEAgLTg5MCwxMyArODg5LDEzIEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JZGV2X3NldF9kcnZkYXRhKGRldiwgY2FyZCk7CisJZGV2X3NldF9kcnZkYXRhKCZzdWItPmRldiwgY2FyZCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHZiX2J0OHh4X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGR2Yl9idDh4eF9yZW1vdmUoc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViKQogewotCXN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3ViLT5kZXYpOwogCiAJZHByaW50aygiZHZiX2J0OHh4OiB1bmxvYWRpbmcgY2FyZCVkXG4iLCBjYXJkLT5idHR2X25yKTsKIApAQCAtOTE5LDE0ICs5MTgsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyIGRyaXZlciA9IHsKIAkuZHJ2ID0gewogCQkubmFtZQkJPSAiZHZiLWJ0OHh4IiwKLQkJLnByb2JlCQk9IGR2Yl9idDh4eF9wcm9iZSwKLQkJLnJlbW92ZQkJPSBkdmJfYnQ4eHhfcmVtb3ZlLAotCQkvKiBGSVhNRToKLQkJICogLnNodXRkb3duCT0gZHZiX2J0OHh4X3NodXRkb3duLAotCQkgKiAuc3VzcGVuZAk9IGR2Yl9idDh4eF9zdXNwZW5kLAotCQkgKiAucmVzdW1lCT0gZHZiX2J0OHh4X3Jlc3VtZSwKLQkJICovCiAJfSwKKwkucHJvYmUJCT0gZHZiX2J0OHh4X3Byb2JlLAorCS5yZW1vdmUJCT0gZHZiX2J0OHh4X3JlbW92ZSwKKwkvKiBGSVhNRToKKwkgKiAuc2h1dGRvd24JPSBkdmJfYnQ4eHhfc2h1dGRvd24sCisJICogLnN1c3BlbmQJPSBkdmJfYnQ4eHhfc3VzcGVuZCwKKwkgKiAucmVzdW1lCT0gZHZiX2J0OHh4X3Jlc3VtZSwKKwkgKi8KIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGR2Yl9idDh4eF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZ3Bpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWdwaW8uYwppbmRleCBkNjRhY2NjLi5jNGQ1ZTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZ3Bpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1ncGlvLmMKQEAgLTQ3LDkgKzQ3LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYnR0dl9zdWJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnNkZXYgPSB0b19idHR2X3N1Yl9kZXYoZGV2KTsKKwlzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyICpzdWIgPSB0b19idHR2X3N1Yl9kcnYoZGV2LT5kcml2ZXIpOworCisJcmV0dXJuIHN1Yi0+cHJvYmUgPyBzdWItPnByb2JlKHNkZXYpIDogLUVOT0RFVjsKK30KKworc3RhdGljIGludCBidHR2X3N1Yl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnNkZXYgPSB0b19idHR2X3N1Yl9kZXYoZGV2KTsKKwlzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyICpzdWIgPSB0b19idHR2X3N1Yl9kcnYoZGV2LT5kcml2ZXIpOworCisJaWYgKHN1Yi0+cmVtb3ZlKQorCQlzdWItPnJlbW92ZShzZGV2KTsKKwlyZXR1cm4gMDsKK30KKwogc3RydWN0IGJ1c190eXBlIGJ0dHZfc3ViX2J1c190eXBlID0gewotCS5uYW1lICA9ICJidHR2LXN1YiIsCi0JLm1hdGNoID0gJmJ0dHZfc3ViX2J1c19tYXRjaCwKKwkubmFtZSAgID0gImJ0dHYtc3ViIiwKKwkubWF0Y2ggID0gJmJ0dHZfc3ViX2J1c19tYXRjaCwKKwkucHJvYmUgID0gYnR0dl9zdWJfcHJvYmUsCisJLnJlbW92ZSA9IGJ0dHZfc3ViX3JlbW92ZSwKIH07CiBFWFBPUlRfU1lNQk9MKGJ0dHZfc3ViX2J1c190eXBlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYuaAppbmRleCBlMzcwZDc0Li45OTA4YzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYuaApAQCAtMzY1LDYgKzM2NSw4IEBACiBzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyIHsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAgIGRydjsKIAljaGFyICAgICAgICAgICAgICAgICAgIHdhbnRlZFtCVVNfSURfU0laRV07CisJaW50ICAgICAgICAgICAgICAgICAgICAoKnByb2JlKShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpOworCXZvaWQgICAgICAgICAgICAgICAgICAgKCpyZW1vdmUpKHN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnN1Yik7CiAJdm9pZCAgICAgICAgICAgICAgICAgICAoKmdwaW9faXJxKShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpOwogfTsKICNkZWZpbmUgdG9fYnR0dl9zdWJfZHJ2KHgpIGNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBidHR2X3N1Yl9kcml2ZXIsIGRydikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE1MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTUwLmMKaW5kZXggZTg2YjUyMi4uOTA5NGZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTUwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTUwLmMKQEAgLTkzLDcgKzkzLDcgQEAKIAlpbnQgc2F0OwogfTsKIAotc3RhdGljIGlubGluZSBpbnQgdHZwNTE1MF9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBjaGFyIGFkZHIpCitzdGF0aWMgaW50IHR2cDUxNTBfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgY2hhciBhZGRyKQogewogCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzFdOwogCWludCByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vS2NvbmZpZyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vS2NvbmZpZwppbmRleCAxODgzZDIyLi5lNjdjZjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL0tjb25maWcKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9LY29uZmlnCkBAIC0yMyw2ICsyMyw3IEBACiAJdHJpc3RhdGUgIkZ1c2lvbiBNUFQgU2NzaUhvc3QgZHJpdmVycyBmb3IgRkMiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQogCXNlbGVjdCBGVVNJT04KKwlzZWxlY3QgU0NTSV9GQ19BVFRSUwogCS0tLWhlbHAtLS0KIAkgIFNDU0kgSE9TVCBzdXBwb3J0IGZvciBhIEZpYmVyIENoYW5uZWwgaG9zdCBhZGFwdGVycy4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGkuaAppbmRleCBiNjFlM2QxLi4wMmNkYzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGkuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGkuaApAQCAtNiw3ICs2LDcgQEAKICAqICAgICAgICAgIFRpdGxlOiAgTVBJIE1lc3NhZ2UgaW5kZXBlbmRlbnQgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKICAqICBDcmVhdGlvbiBEYXRlOiAgSnVseSAyNywgMjAwMAogICoKLSAqICAgIG1waS5oIFZlcnNpb246ICAwMS4wNS4wOAorICogICAgbXBpLmggVmVyc2lvbjogIDAxLjA1LjEwCiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtNzQsNiArNzQsOCBAQAogICogIDA2LTI0LTA1ICAwMS4wNS4wOCAgQWRkZWQgZnVuY3Rpb24gY29kZXMgZm9yIFNDU0kgSU8gMzIgYW5kCiAgKiAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRBc3Npc3RFeHRlbmRlZCByZXF1ZXN0cy4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEVFRFAgSU9DU3RhdHVzIGNvZGVzLgorICogIDA4LTAzLTA1ICAwMS4wNS4wOSAgQnVtcGVkIE1QSV9IRUFERVJfVkVSU0lPTl9VTklULgorICogIDA4LTMwLTA1ICAwMS4wNS4xMCAgQWRkZWQgMiBuZXcgSU9DU3RhdHVzIGNvZGVzIGZvciBUYXJnZXQuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC0xMDQsNyArMTA2LDcgQEAKIC8qIE5vdGU6IFRoZSBtYWpvciB2ZXJzaW9ucyBvZiAweGUwIHRocm91Z2ggMHhmZiBhcmUgcmVzZXJ2ZWQgKi8KIAogLyogdmVyc2lvbmluZyBmb3IgdGhpcyBNUEkgaGVhZGVyIHNldCAqLwotI2RlZmluZSBNUElfSEVBREVSX1ZFUlNJT05fVU5JVCAgICAgICAgICAgICAoMHgwQSkKKyNkZWZpbmUgTVBJX0hFQURFUl9WRVJTSU9OX1VOSVQgICAgICAgICAgICAgKDB4MEMpCiAjZGVmaW5lIE1QSV9IRUFERVJfVkVSU0lPTl9ERVYgICAgICAgICAgICAgICgweDAwKQogI2RlZmluZSBNUElfSEVBREVSX1ZFUlNJT05fVU5JVF9NQVNLICAgICAgICAoMHhGRjAwKQogI2RlZmluZSBNUElfSEVBREVSX1ZFUlNJT05fVU5JVF9TSElGVCAgICAgICAoOCkKQEAgLTcxMSw2ICs3MTMsOCBAQAogI2RlZmluZSBNUElfSU9DU1RBVFVTX1RBUkdFVF9EQVRBX09GRlNFVF9FUlJPUiAgICgweDAwNkQpCiAjZGVmaW5lIE1QSV9JT0NTVEFUVVNfVEFSR0VUX1RPT19NVUNIX1dSSVRFX0RBVEEgKDB4MDA2RSkKICNkZWZpbmUgTVBJX0lPQ1NUQVRVU19UQVJHRVRfSVVfVE9PX1NIT1JUICAgICAgICAoMHgwMDZGKQorI2RlZmluZSBNUElfSU9DU1RBVFVTX1RBUkdFVF9BQ0tfTkFLX1RJTUVPVVQgICAgICgweDAwNzApCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfVEFSR0VUX05BS19SRUNFSVZFRCAgICAgICAgKDB4MDA3MSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgQWRkaXRpb25hbCBGQ1AgdGFyZ2V0IHZhbHVlcyAob2Jzb2xldGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTc0NSw3ICs3NDksNyBAQAogI2RlZmluZSBNUElfSU9DU1RBVFVTX0xBTl9DQU5DRUxFRCAgICAgICAgICAgICAgKDB4MDA4NykKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgU2VyaWFsIEF0dGFjaGVkIFNDU0kgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNlcmlhbCBBdHRhY2hlZCBTQ1NJIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2RlZmluZSBNUElfSU9DU1RBVFVTX1NBU19TTVBfUkVRVUVTVF9GQUlMRUQgICAgKDB4MDA5MCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9jbmZnLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfY25mZy5oCmluZGV4IGQ4MzM5ODkuLmIxYmVjZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9jbmZnLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2NuZmcuaApAQCAtNiw3ICs2LDcgQEAKICAqICAgICAgICAgIFRpdGxlOiAgTVBJIENvbmZpZyBtZXNzYWdlLCBzdHJ1Y3R1cmVzLCBhbmQgUGFnZXMKICAqICBDcmVhdGlvbiBEYXRlOiAgSnVseSAyNywgMjAwMAogICoKLSAqICAgIG1waV9jbmZnLmggVmVyc2lvbjogIDAxLjA1LjA5CisgKiAgICBtcGlfY25mZy5oIFZlcnNpb246ICAwMS4wNS4xMQogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTI0OSw2ICsyNDksMjMgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE93bmVyRGV2SGFuZGxlIGFuZCBGbGFncyBmaWVsZCB0byBTQVMgUEhZIFBhZ2UgMC4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIElPQyBHUElPIEZsYWdzIGRlZmluZSB0byBTQVMgRW5jbG9zdXJlIFBhZ2UgMC4KICAqICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIHRoZSB2YWx1ZSBmb3IgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfREVWX1NBVEFfU1VQUE9SVC4KKyAqICAwOC0wMy0wNSAgMDEuMDUuMTAgIFJlbW92ZWQgSVNEYXRhU2NydWJSYXRlIGFuZCBJU1Jlc3luY1JhdGUgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgTWFudWZhY3R1cmluZyBQYWdlIDQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUElfSU9VTklUUEFHRTFfU0FUQV9XUklURV9DQUNIRV9ESVNBQkxFIGJpdC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE51bURldnNQZXJFbmNsb3N1cmUgZmllbGQgdG8gU0FTIElPIFVuaXQgcGFnZSAyLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX1NBU19JT1VOSVQyX0ZMQUdTX0hPU1RfQVNTSUdORURfUEhZU19NQVAKKyAqICAgICAgICAgICAgICAgICAgICAgIGRlZmluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEVuY2xvc3VyZUhhbmRsZSBmaWVsZCB0byBTQVMgRXhwYW5kZXIgcGFnZSAwLgorICogICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlZCByZWR1bmRhbnQgTnVtVGFibGVFbnRyaWVzUHJvZyBmaWVsZCBmcm9tIFNBUworICogICAgICAgICAgICAgICAgICAgICAgRXhwYW5kZXIgUGFnZSAxLgorICogIDA4LTMwLTA1ICAwMS4wNS4xMSAgQWRkZWQgRGV2aWNlSUQgZm9yIEZDOTQ5RSBhbmQgY2hhbmdlZCB0aGUgRGV2aWNlSUQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICBTQVMxMDc4LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbW9yZSBkZWZpbmVzIGZvciBNYW51ZmFjdHVyaW5nIFBhZ2UgNCBGbGFncyBmaWVsZC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG1vcmUgZGVmaW5lcyBmb3IgSU9DU2V0dGluZ3MgYW5kIGFkZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRlclNwaW51cCBmaWVsZCB0byBCaW9zIFBhZ2UgMS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHBvc3Rwb25lIFNBVEEgSW5pdCBiaXQgdG8gU0FTIElPIFVuaXQgUGFnZSAxCisgKiAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRmxhZ3MuCisgKiAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkIExvZ0VudHJ5IGZvcm1hdCBmb3IgTG9nIFBhZ2UgMC4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTQ5NCw3ICs1MTEsNyBAQAogI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklDRUlEX0ZDOTI5WCAgICAgICAgICAgICgweDA2MjYpCiAjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSUNFSURfRkM5MzlYICAgICAgICAgICAgKDB4MDY0MikKICNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJQ0VJRF9GQzk0OVggICAgICAgICAgICAoMHgwNjQwKQotI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklDRUlEX0ZDOTQ5RVMgICAgICAgICAgICgweDA2NDYpCisjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSUNFSURfRkM5NDlFICAgICAgICAgICAgKDB4MDY0NikKIC8qIFNDU0kgKi8KICNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJRF81M0MxMDMwICAgICAgICAgICAgICAoMHgwMDMwKQogI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklEXzUzQzEwMzBaQyAgICAgICAgICAgICgweDAwMzEpCkBAIC01MTAsNyArNTI3LDcgQEAKICNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJRF9TQVMxMDY2RSAgICAgICAgICAgICAoMHgwMDVBKQogI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklEX1NBUzEwNjggICAgICAgICAgICAgICgweDAwNTQpCiAjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSURfU0FTMTA2OEUgICAgICAgICAgICAgKDB4MDA1OCkKLSNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJRF9TQVMxMDc4ICAgICAgICAgICAgICAoMHgwMDYwKQorI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklEX1NBUzEwNzggICAgICAgICAgICAgICgweDAwNjIpCiAKIAogdHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX01BTlVGQUNUVVJJTkdfMApAQCAtNjAyLDkgKzYxOSw3IEBACiAgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVZvbHVtZVNldHRpbmdzOyAgIC8qIDUwaCAqLwogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiA1NGggKi8KICAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgLyogNThoICovCi0gICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0RhdGFTY3J1YlJhdGU7ICAgIC8qIDVDaCAqLwotICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNSZXN5bmNSYXRlOyAgICAgICAvKiA1RGggKi8KLSAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNTsgICAgICAgICAgLyogNUVoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDU7ICAgICAgICAgIC8qIDVDaCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1FRGF0YVNjcnViUmF0ZTsgICAvKiA2MGggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNRVJlc3luY1JhdGU7ICAgICAgLyogNjFoICovCiAgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDY7ICAgICAgICAgIC8qIDYyaCAqLwpAQCAtNjE2LDkgKzYzMSwxNCBAQAogfSBDT05GSUdfUEFHRV9NQU5VRkFDVFVSSU5HXzQsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9NQU5VRkFDVFVSSU5HXzQsCiAgIE1hbnVmYWN0dXJpbmdQYWdlNF90LCBNUElfUE9JTlRFUiBwTWFudWZhY3R1cmluZ1BhZ2U0X3Q7CiAKLSNkZWZpbmUgTVBJX01BTlVGQUNUVVJJTkc0X1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9NQU5VRkFDVFVSSU5HNF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICgweDAzKQogCiAvKiBkZWZpbmVzIGZvciB0aGUgRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJX01BTlBBR0U0X0lNRV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjApCisjZGVmaW5lIE1QSV9NQU5QQUdFNF9JTV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBNUElfTUFOUEFHRTRfSVNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX01BTlBBR0U0X0lSX01PREVQQUdFOF9ESVNBQkxFICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9NQU5QQUdFNF9JTV9SRVNZTkNfQ0FDSEVfRU5BQkxFICAgICAgICAgICAgICgweDAyKQogI2RlZmluZSBNUElfTUFOUEFHRTRfSVJfTk9fTUlYX1NBU19TQVRBICAgICAgICAgICAgICAgICAoMHgwMSkKIAogCkBAIC02NjksNyArNjg5LDcgQEAKIH0gQ09ORklHX1BBR0VfSU9fVU5JVF8xLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfSU9fVU5JVF8xLAogICBJT1VuaXRQYWdlMV90LCBNUElfUE9JTlRFUiBwSU9Vbml0UGFnZTFfdDsKIAotI2RlZmluZSBNUElfSU9VTklUUEFHRTFfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX0lPVU5JVFBBR0UxX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgKDB4MDIpCiAKIC8qIElPIFVuaXQgUGFnZSAxIEZsYWdzIGRlZmluZXMgKi8KICNkZWZpbmUgTVBJX0lPVU5JVFBBR0UxX01VTFRJX0ZVTkNUSU9OICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCkBAIC02ODEsNyArNzAxLDcgQEAKICNkZWZpbmUgTVBJX0lPVU5JVFBBR0UxX0RJU0FCTEVfSVIgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNDApCiAjZGVmaW5lIE1QSV9JT1VOSVRQQUdFMV9GT1JDRV8zMiAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDgwKQogI2RlZmluZSBNUElfSU9VTklUUEFHRTFfTkFUSVZFX0NPTU1BTkRfUV9ESVNBQkxFICAgICAgICAoMHgwMDAwMDEwMCkKLQorI2RlZmluZSBNUElfSU9VTklUUEFHRTFfU0FUQV9XUklURV9DQUNIRV9ESVNBQkxFICAgICAgICAoMHgwMDAwMDIwMCkKIAogdHlwZWRlZiBzdHJ1Y3QgX01QSV9BREFQVEVSX0lORk8KIHsKQEAgLTk2OCw3ICs5ODgsOCBAQAogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KICAgICBVMzIgICAgICAgICAgICAgICAgICAgICBEZXZpY2VTZXR0aW5nczsgICAgICAgICAgICAgLyogMTBoICovCiAgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZEZXZpY2VzOyAgICAgICAgICAgIC8qIDE0aCAqLwotICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAxNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRlclNwaW51cDsgICAgICAgICAgICAgLyogMTZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDE3aCAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPVGltZW91dEJsb2NrRGV2aWNlc05vblJNOyAvKiAxOGggKi8KICAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT1RpbWVvdXRTZXF1ZW50aWFsOyAgICAgICAgLyogMUFoICovCiAgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9UaW1lb3V0T3RoZXI7ICAgICAgICAgICAgIC8qIDFDaCAqLwpAQCAtOTc2LDcgKzk5Nyw3IEBACiB9IENPTkZJR19QQUdFX0JJT1NfMSwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX0JJT1NfMSwKICAgQklPU1BhZ2UxX3QsIE1QSV9QT0lOVEVSIHBCSU9TUGFnZTFfdDsKIAotI2RlZmluZSBNUElfQklPU1BBR0UxX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDMpCiAKIC8qIHZhbHVlcyBmb3IgdGhlIEJpb3NPcHRpb25zIGZpZWxkICovCiAjZGVmaW5lIE1QSV9CSU9TUEFHRTFfT1BUSU9OU19TUElfRU5BQkxFICAgICAgICAgICAgICAgICgweDAwMDAwNDAwKQpAQCAtOTg1LDggKzEwMDYsMTUgQEAKICNkZWZpbmUgTVBJX0JJT1NQQUdFMV9PUFRJT05TX0RJU0FCTEVfQklPUyAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCiAKIC8qIHZhbHVlcyBmb3IgdGhlIElPQ1NldHRpbmdzIGZpZWxkICovCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX01BU0tfSU5JVElBTF9TUElOVVBfREVMQVkgICgweDBGMDAwMDAwKQorI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9TSElGVF9JTklUSUFMX1NQSU5VUF9ERUxBWSAoMjQpCisKICNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfTUFTS19QT1JUX0VOQUJMRV9ERUxBWSAgICAgKDB4MDBGMDAwMDApCiAjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX1NISUZUX1BPUlRfRU5BQkxFX0RFTEFZICAgICgyMCkKKworI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9BVVRPX1BPUlRfRU5BQkxFICAgICAgICAgICAoMHgwMDA4MDAwMCkKKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfRElSRUNUX0FUVEFDSF9TUElOVVBfTU9ERSAgKDB4MDAwNDAwMDApCisKICNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfTUFTS19CT09UX1BSRUZFUkVOQ0UgICAgICAgKDB4MDAwMzAwMDApCiAjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX0VOQ0xPU1VSRV9TTE9UX0JPT1QgICAgICAgICgweDAwMDAwMDAwKQogI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9TQVNfQUREUkVTU19CT09UICAgICAgICAgICAoMHgwMDAxMDAwMCkKQEAgLTEwMTYsNiArMTA0NCwxMSBAQAogI2RlZmluZSBNUElfQklPU1BBR0UxX0RFVlNFVF9ESVNBQkxFX05PTl9STV9MVU4gICAgICAgICAoMHgwMDAwMDAwMikKICNkZWZpbmUgTVBJX0JJT1NQQUdFMV9ERVZTRVRfRElTQUJMRV9PVEhFUl9MVU4gICAgICAgICAgKDB4MDAwMDAwMDEpCiAKKy8qIGRlZmluZXMgZm9yIHRoZSBFeHBhbmRlclNwaW51cCBmaWVsZCAqLworI2RlZmluZSBNUElfQklPU1BBR0UxX0VYUFNQSU5VUF9NQVNLX01BWF9UQVJHRVQgICAgICAgICAoMHhGMCkKKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9FWFBTUElOVVBfU0hJRlRfTUFYX1RBUkdFVCAgICAgICAgKDQpCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfRVhQU1BJTlVQX01BU0tfREVMQVkgICAgICAgICAgICAgICgweDBGKQorCiB0eXBlZGVmIHN0cnVjdCBfTVBJX0JPT1RfREVWSUNFX0FEQVBURVJfT1JERVIKIHsKICAgICBVMzIgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCkBAIC0xMjMzLDEzICsxMjY2LDEzIEBACiAKICNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX1NISUZUX01JTl9TWU5DX1BFUklPRCAgICAgKDgpCiAjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9HRVRfTUlOX1NZTkNfUEVSSU9EKENhcCkgICAgICBcCi0gICAgKCAgKChDYXApICYgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX01BU0tfTUlOX1NZTkNfUEVSSU9EKSBcCisgICAgKCAgKChDYXApICYgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX01JTl9TWU5DX1BFUklPRF9NQVNLKSBcCiAgICAgPj4gTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX1NISUZUX01JTl9TWU5DX1BFUklPRCAgICAgICAgICBcCiAgICAgKQogI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMF9DQVBfTUFYX1NZTkNfT0ZGU0VUX01BU0sgICAgICAoMHgwMEZGMDAwMCkKICNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX1NISUZUX01BWF9TWU5DX09GRlNFVCAgICAgKDE2KQogI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMF9DQVBfR0VUX01BWF9TWU5DX09GRlNFVChDYXApICAgICAgXAotICAgICggICgoQ2FwKSAmIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9NQVNLX01BWF9TWU5DX09GRlNFVCkgXAorICAgICggICgoQ2FwKSAmIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9NQVhfU1lOQ19PRkZTRVRfTUFTSykgXAogICAgID4+IE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9TSElGVF9NQVhfU1lOQ19PRkZTRVQgICAgICAgICAgXAogICAgICkKICNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX0lEUCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDgwMDAwMDApCkBAIC0yMzcwLDQ3ICsyNDAzLDQ4IEBACiB9IENPTkZJR19QQUdFX1NBU19JT19VTklUXzEsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQVNfSU9fVU5JVF8xLAogICBTYXNJT1VuaXRQYWdlMV90LCBNUElfUE9JTlRFUiBwU2FzSU9Vbml0UGFnZTFfdDsKIAotI2RlZmluZSBNUElfU0FTSU9VTklUUEFHRTFfUEFHRVZFUlNJT04gICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1NBU0lPVU5JVFBBR0UxX1BBR0VWRVJTSU9OICAgICAgKDB4MDUpCiAKIC8qIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAxIENvbnRyb2xGbGFncyAqLwotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZJQ0VfU0VMRl9URVNUICAgICAgICAoMHg4MDAwKQotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBXzNfMF9NQVggICAgICAgICAgICAoMHg0MDAwKQotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBXzFfNV9NQVggICAgICAgICAgICAoMHgyMDAwKQotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBX1NXX1BSRVNFUlZFICAgICAgICAoMHgxMDAwKQotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ESVNBQkxFX1NBU19IQVNIICAgICAgICAoMHgwODAwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZJQ0VfU0VMRl9URVNUICAgICAgICAgICAgKDB4ODAwMCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV8zXzBfTUFYICAgICAgICAgICAgICAgICgweDQwMDApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NBVEFfMV81X01BWCAgICAgICAgICAgICAgICAoMHgyMDAwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBX1NXX1BSRVNFUlZFICAgICAgICAgICAgKDB4MTAwMCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfRElTQUJMRV9TQVNfSEFTSCAgICAgICAgICAgICgweDA4MDApCiAKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfTUFTS19ERVZfU1VQUE9SVCAgICAgICAgKDB4MDYwMCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0hJRlRfREVWX1NVUFBPUlQgICAgICAgKDkpCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0RFVl9TVVBQT1JUX0JPVEggICAgICAgICgweDAwKQotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZfU0FTX1NVUFBPUlQgICAgICAgICAoMHgwMSkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfREVWX1NBVEFfU1VQUE9SVCAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX01BU0tfREVWX1NVUFBPUlQgICAgICAgICAgICAoMHgwNjAwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TSElGVF9ERVZfU1VQUE9SVCAgICAgICAgICAgKDkpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0RFVl9TVVBQT1JUX0JPVEggICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfREVWX1NBU19TVVBQT1JUICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZfU0FUQV9TVVBQT1JUICAgICAgICAgICAgKDB4MDIpCiAKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV80OEJJVF9MQkFfUkVRVUlSRUQgKDB4MDA4MCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV9TTUFSVF9SRVFVSVJFRCAgICAgKDB4MDA0MCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV9OQ1FfUkVRVUlSRUQgICAgICAgKDB4MDAyMCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV9GVUFfUkVRVUlSRUQgICAgICAgKDB4MDAxMCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfUEhZX0VOQUJMRV9PUkRFUl9ISUdIICAgKDB4MDAwOCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU1VCVFJBQ1RJVkVfSUxMRUdBTCAgICAgKDB4MDAwNCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfRklSU1RfTFZMX0RJU0NfT05MWSAgICAgKDB4MDAwMikKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfQ0xFQVJfQUZGSUxJQVRJT04gICAgICAgKDB4MDAwMSkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfUE9TVFBPTkVfU0FUQV9JTklUICAgICAgICAgICgweDAxMDApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NBVEFfNDhCSVRfTEJBX1JFUVVJUkVEICAgICAoMHgwMDgwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBX1NNQVJUX1JFUVVJUkVEICAgICAgICAgKDB4MDA0MCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV9OQ1FfUkVRVUlSRUQgICAgICAgICAgICgweDAwMjApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NBVEFfRlVBX1JFUVVJUkVEICAgICAgICAgICAoMHgwMDEwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9QSFlfRU5BQkxFX09SREVSX0hJR0ggICAgICAgKDB4MDAwOCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU1VCVFJBQ1RJVkVfSUxMRUdBTCAgICAgICAgICgweDAwMDQpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0ZJUlNUX0xWTF9ESVNDX09OTFkgICAgICAgICAoMHgwMDAyKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9DTEVBUl9BRkZJTElBVElPTiAgICAgICAgICAgKDB4MDAwMSkKIAogLyogdmFsdWVzIGZvciBTQVMgSU8gVW5pdCBQYWdlIDEgUG9ydEZsYWdzICovCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9QT1JUX0ZMQUdTXzBfVEFSR0VUX0lPQ19OVU0gICAgICgweDAwKQotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfUE9SVF9GTEFHU18xX1RBUkdFVF9JT0NfTlVNICAgICAoMHgwNCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX1BPUlRfRkxBR1NfQVVUT19QT1JUX0NPTkZJRyAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9QT1JUX0ZMQUdTXzBfVEFSR0VUX0lPQ19OVU0gICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX1BPUlRfRkxBR1NfMV9UQVJHRVRfSU9DX05VTSAgICAgICAgICgweDA0KQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfUE9SVF9GTEFHU19BVVRPX1BPUlRfQ09ORklHICAgICAgICAgKDB4MDEpCiAKIC8qIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAwIFBoeUZsYWdzICovCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9QSFlfRkxBR1NfUEhZX0RJU0FCTEUgICAgICAgICAgICgweDA0KQotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfUEhZX0ZMQUdTX1RYX0lOVkVSVCAgICAgICAgICAgICAoMHgwMikKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX1BIWV9GTEFHU19SWF9JTlZFUlQgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9QSFlfRkxBR1NfUEhZX0RJU0FCTEUgICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX1BIWV9GTEFHU19UWF9JTlZFUlQgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfUEhZX0ZMQUdTX1JYX0lOVkVSVCAgICAgICAgICAgICAgICAgKDB4MDEpCiAKIC8qIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAwIE1heE1pbkxpbmtSYXRlICovCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9NQVhfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICgweEYwKQotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfTUFYX1JBVEVfMV81ICAgICAgICAgICAgICAgICAgICAoMHg4MCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX01BWF9SQVRFXzNfMCAgICAgICAgICAgICAgICAgICAgKDB4OTApCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9NSU5fUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICgweDBGKQotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfTUlOX1JBVEVfMV81ICAgICAgICAgICAgICAgICAgICAoMHgwOCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX01JTl9SQVRFXzNfMCAgICAgICAgICAgICAgICAgICAgKDB4MDkpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9NQVhfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAoMHhGMCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX01BWF9SQVRFXzFfNSAgICAgICAgICAgICAgICAgICAgICAgICgweDgwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfTUFYX1JBVEVfM18wICAgICAgICAgICAgICAgICAgICAgICAgKDB4OTApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9NSU5fUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAoMHgwRikKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX01JTl9SQVRFXzFfNSAgICAgICAgICAgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfTUlOX1JBVEVfM18wICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDkpCiAKIC8qIHNlZSBtcGlfc2FzLmggZm9yIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAxIENvbnRyb2xsZXJQaHlEZXZpY2VJbmZvIHZhbHVlcyAqLwogCkBAIC0yNDE4LDE2ICsyNDUyLDE4IEBACiB0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfU0FTX0lPX1VOSVRfMgogewogICAgIENPTkZJR19FWFRFTkRFRF9QQUdFX0hFQURFUiAgICAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgIC8qIDAwaCAqLwotICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bURldnNQZXJFbmNsb3N1cmU7ICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIDA5aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgIC8qIDBBaCAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heFBlcnNpc3RlbnRJRHM7ICAgICAgIC8qIDBDaCAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVBlcnNpc3RlbnRJRHNVc2VkOyAgIC8qIDBFaCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1czsgICAgICAgICAgICAgICAgIC8qIDEwaCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIDExaCAqLwotICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heE51bVBoeXNpY2FsTWFwcGVkSURzOy8qIDEyaCAqLyAgICAgICAgICAgICAgLyogMTJoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4TnVtUGh5c2ljYWxNYXBwZWRJRHM7LyogMTJoICovCiB9IENPTkZJR19QQUdFX1NBU19JT19VTklUXzIsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQVNfSU9fVU5JVF8yLAogICBTYXNJT1VuaXRQYWdlMl90LCBNUElfUE9JTlRFUiBwU2FzSU9Vbml0UGFnZTJfdDsKIAotI2RlZmluZSBNUElfU0FTSU9VTklUUEFHRTJfUEFHRVZFUlNJT04gICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1NBU0lPVU5JVFBBR0UyX1BBR0VWRVJTSU9OICAgICAgKDB4MDUpCiAKIC8qIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAyIFN0YXR1cyBmaWVsZCAqLwogI2RlZmluZSBNUElfU0FTX0lPVU5JVDJfU1RBVFVTX0RJU0FCTEVEX1BFUlNJU1RFTlRfTUFQUElOR1MgKDB4MDIpCkBAIC0yNDQxLDYgKzI0NzcsNyBAQAogI2RlZmluZSBNUElfU0FTX0lPVU5JVDJfRkxBR1NfTk9fUEhZU19NQVAgICAgICAgICAgICAgICAgICAgKDB4MDApCiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMl9GTEFHU19ESVJFQ1RfQVRUQUNIX1BIWVNfTUFQICAgICAgICAoMHgwMSkKICNkZWZpbmUgTVBJX1NBU19JT1VOSVQyX0ZMQUdTX0VOQ0xPU1VSRV9TTE9UX1BIWVNfTUFQICAgICAgICgweDAyKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDJfRkxBR1NfSE9TVF9BU1NJR05FRF9QSFlTX01BUCAgICAgICAgKDB4MDcpCiAKICNkZWZpbmUgTVBJX1NBU19JT1VOSVQyX0ZMQUdTX1JFU0VSVkVfSURfMF9GT1JfQk9PVCAgICAgICAgICgweDEwKQogI2RlZmluZSBNUElfU0FTX0lPVU5JVDJfRkxBR1NfREFfU1RBUlRJTkdfU0xPVCAgICAgICAgICAgICAgKDB4MjApCkBAIC0yNDczLDcgKzI1MTAsNyBAQAogICAgIENPTkZJR19FWFRFTkRFRF9QQUdFX0hFQURFUiAgICAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgIC8qIDAwaCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBoeXNpY2FsUG9ydDsgICAgICAgICAgIC8qIDA4aCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIDA5aCAqLwotICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgIC8qIDBBaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY2xvc3VyZUhhbmRsZTsgICAgICAgIC8qIDBBaCAqLwogICAgIFU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBU0FkZHJlc3M7ICAgICAgICAgICAgIC8qIDBDaCAqLwogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvdmVyeVN0YXR1czsgICAgICAgIC8qIDE0aCAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldkhhbmRsZTsgICAgICAgICAgICAgIC8qIDE4aCAqLwpAQCAtMjQ4Nyw3ICsyNTI0LDcgQEAKIH0gQ09ORklHX1BBR0VfU0FTX0VYUEFOREVSXzAsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQVNfRVhQQU5ERVJfMCwKICAgU2FzRXhwYW5kZXJQYWdlMF90LCBNUElfUE9JTlRFUiBwU2FzRXhwYW5kZXJQYWdlMF90OwogCi0jZGVmaW5lIE1QSV9TQVNFWFBBTkRFUjBfUEFHRVZFUlNJT04gICAgICAgICgweDAyKQorI2RlZmluZSBNUElfU0FTRVhQQU5ERVIwX1BBR0VWRVJTSU9OICAgICAgICAoMHgwMykKIAogLyogdmFsdWVzIGZvciBTQVMgRXhwYW5kZXIgUGFnZSAwIERpc2NvdmVyeVN0YXR1cyBmaWVsZCAqLwogI2RlZmluZSBNUElfU0FTX0VYUEFOREVSMF9EU19MT09QX0RFVEVDVEVEICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKQEAgLTI1MjcsOSArMjU2NCw5IEBACiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIE5lZ290aWF0ZWRMaW5rUmF0ZTsgICAgIC8qIDFGaCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBQaHlJZGVudGlmaWVyOyAgICAgICAgICAvKiAyMGggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNoZWRQaHlJZGVudGlmaWVyOyAgLyogMjFoICovCi0gICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIE51bVRhYmxlRW50cmllc1Byb2c7ICAgIC8qIDIyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAvKiAyMmggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY292ZXJ5SW5mbzsgICAgICAgICAgLyogMjNoICovCi0gICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgIC8qIDI0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAvKiAyNGggKi8KIH0gQ09ORklHX1BBR0VfU0FTX0VYUEFOREVSXzEsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQVNfRVhQQU5ERVJfMSwKICAgU2FzRXhwYW5kZXJQYWdlMV90LCBNUElfUE9JTlRFUiBwU2FzRXhwYW5kZXJQYWdlMV90OwogCkBAIC0yNzY2LDE2ICsyODAzLDE1IEBACiAjZGVmaW5lIE1QSV9MT0dfMF9OVU1fTE9HX0VOVFJJRVMgICAgICAgICgxKQogI2VuZGlmCiAKLSNkZWZpbmUgTVBJX0xPR18wX0xPR19EQVRBX0xFTkdUSCAgICAgICAgKDIwKQorI2RlZmluZSBNUElfTE9HXzBfTE9HX0RBVEFfTEVOR1RIICAgICAgICAoMHgxQykKIAogdHlwZWRlZiBzdHJ1Y3QgX01QSV9MT0dfMF9FTlRSWQogewotICAgIFU2NCAgICAgICAgIFdXSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLwotICAgIFUzMiAgICAgICAgIFRpbWVTdGFtcDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA4aCAqLwotICAgIFUzMiAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLwotICAgIFUxNiAgICAgICAgIExvZ1NlcXVlbmNlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwaCAqLwotICAgIFUxNiAgICAgICAgIExvZ0VudHJ5UXVhbGlmaWVyOyAgICAgICAgICAgICAgICAgIC8qIDEyaCAqLwotICAgIFU4ICAgICAgICAgIExvZ0RhdGFbTVBJX0xPR18wX0xPR19EQVRBX0xFTkdUSF07IC8qIDE0aCAqLworICAgIFUzMiAgICAgICAgIFRpbWVTdGFtcDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFUxNiAgICAgICAgIExvZ1NlcXVlbmNlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgIExvZ0VudHJ5UXVhbGlmaWVyOyAgICAgICAgICAgICAgICAgIC8qIDBBaCAqLworICAgIFU4ICAgICAgICAgIExvZ0RhdGFbTVBJX0xPR18wX0xPR19EQVRBX0xFTkdUSF07IC8qIDBDaCAqLwogfSBNUElfTE9HXzBfRU5UUlksIE1QSV9QT0lOVEVSIFBUUl9NUElfTE9HXzBfRU5UUlksCiAgIE1waUxvZzBFbnRyeV90LCBNUElfUE9JTlRFUiBwTXBpTG9nMEVudHJ5X3Q7CiAKQEAgLTI3OTQsNyArMjgzMCw3IEBACiB9IENPTkZJR19QQUdFX0xPR18wLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfTE9HXzAsCiAgIExvZ1BhZ2UwX3QsIE1QSV9QT0lOVEVSIHBMb2dQYWdlMF90OwogCi0jZGVmaW5lIE1QSV9MT0dfMF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfTE9HXzBfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAoMHgwMSkKIAogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9oaXN0b3J5LnR4dCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9oaXN0b3J5LnR4dAppbmRleCAxYTMwZWYxLi40YTVmOGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaGlzdG9yeS50eHQKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2hpc3RvcnkudHh0CkBAIC02LDI1ICs2LDI1IEBACiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTFNJIExvZ2ljIENvcnBvcmF0aW9uLgogCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSGVhZGVyIFNldCBSZWxlYXNlIFZlcnNpb246ICAgIDAxLjA1LjEwCi0gSGVhZGVyIFNldCBSZWxlYXNlIERhdGU6ICAgICAgIDAzLTExLTA1CisgSGVhZGVyIFNldCBSZWxlYXNlIFZlcnNpb246ICAgIDAxLjA1LjEyCisgSGVhZGVyIFNldCBSZWxlYXNlIERhdGU6ICAgICAgIDA4LTMwLTA1CiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICBGaWxlbmFtZSAgICAgICAgICAgICAgIEN1cnJlbnQgdmVyc2lvbiAgICAgUHJpb3IgdmVyc2lvbgogIC0tLS0tLS0tLS0gICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tCi0gbXBpLmggICAgICAgICAgICAgICAgICAwMS4wNS4wOCAgICAgICAgICAgIDAxLjA1LjA3Ci0gbXBpX2lvYy5oICAgICAgICAgICAgICAwMS4wNS4wOSAgICAgICAgICAgIDAxLjA1LjA4Ci0gbXBpX2NuZmcuaCAgICAgICAgICAgICAwMS4wNS4wOSAgICAgICAgICAgIDAxLjA1LjA4Ci0gbXBpX2luaXQuaCAgICAgICAgICAgICAwMS4wNS4wNSAgICAgICAgICAgIDAxLjA1LjA0Ci0gbXBpX3RhcmcuaCAgICAgICAgICAgICAwMS4wNS4wNSAgICAgICAgICAgIDAxLjA1LjA0CisgbXBpLmggICAgICAgICAgICAgICAgICAwMS4wNS4xMCAgICAgICAgICAgIDAxLjA1LjA5CisgbXBpX2lvYy5oICAgICAgICAgICAgICAwMS4wNS4xMCAgICAgICAgICAgIDAxLjA1LjA5CisgbXBpX2NuZmcuaCAgICAgICAgICAgICAwMS4wNS4xMSAgICAgICAgICAgIDAxLjA1LjEwCisgbXBpX2luaXQuaCAgICAgICAgICAgICAwMS4wNS4wNiAgICAgICAgICAgIDAxLjA1LjA2CisgbXBpX3RhcmcuaCAgICAgICAgICAgICAwMS4wNS4wNSAgICAgICAgICAgIDAxLjA1LjA1CiAgbXBpX2ZjLmggICAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCiAgbXBpX2xhbi5oICAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCiAgbXBpX3JhaWQuaCAgICAgICAgICAgICAwMS4wNS4wMiAgICAgICAgICAgIDAxLjA1LjAyCiAgbXBpX3Rvb2wuaCAgICAgICAgICAgICAwMS4wNS4wMyAgICAgICAgICAgIDAxLjA1LjAzCiAgbXBpX2luYi5oICAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCi0gbXBpX3Nhcy5oICAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCi0gbXBpX3R5cGUuaCAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCi0gbXBpX2hpc3RvcnkudHh0ICAgICAgICAwMS4wNS4wOSAgICAgICAgICAgIDAxLjA1LjA5CisgbXBpX3Nhcy5oICAgICAgICAgICAgICAwMS4wNS4wMiAgICAgICAgICAgIDAxLjA1LjAxCisgbXBpX3R5cGUuaCAgICAgICAgICAgICAwMS4wNS4wMiAgICAgICAgICAgIDAxLjA1LjAxCisgbXBpX2hpc3RvcnkudHh0ICAgICAgICAwMS4wNS4xMiAgICAgICAgICAgIDAxLjA1LjExCiAKIAogICogIERhdGUgICAgICBWZXJzaW9uICAgRGVzY3JpcHRpb24KQEAgLTkxLDYgKzkxLDggQEAKICAqICAwNi0yNC0wNSAgMDEuMDUuMDggIEFkZGVkIGZ1bmN0aW9uIGNvZGVzIGZvciBTQ1NJIElPIDMyIGFuZAogICogICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0QXNzaXN0RXh0ZW5kZWQgcmVxdWVzdHMuCiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBFRURQIElPQ1N0YXR1cyBjb2Rlcy4KKyAqICAwOC0wMy0wNSAgMDEuMDUuMDkgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAwOC0zMC0wNSAgMDEuMDUuMTAgIEFkZGVkIDIgbmV3IElPQ1N0YXR1cyBjb2RlcyBmb3IgVGFyZ2V0LgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG1waV9pb2MuaApAQCAtMTY0LDYgKzE2NiwxMCBAQAogICogICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlZCBJT0NGYWN0cyBSZXBseSBFRURQIENhcGFiaWxpdHkgYml0LgogICogIDA2LTI0LTA1ICAwMS4wNS4wOSAgQWRkZWQgNSBuZXcgSU9DRmFjdHMgUmVwbHkgSU9DQ2FwYWJpbGl0aWVzIGJpdHMuCiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNYXggU0FUQSBUYXJnZXRzIHRvIFNBUyBEaXNjb3ZlcnkgRXJyb3IgZXZlbnQuCisgKiAgMDgtMzAtMDUgIDAxLjA1LjEwICBBZGRlZCA0IG5ldyBldmVudHMgYW5kIHRoZWlyIGV2ZW50IGRhdGEgc3RydWN0dXJlcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG5ldyBSZWFzb25Db2RlIHZhbHVlIGZvciBTQVMgRGV2aWNlIFN0YXR1cyBDaGFuZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbmV3IGZhbWlseSBjb2RlIGZvciBGQzk0OUUuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbXBpX2NuZmcuaApAQCAtNDAyLDYgKzQwOCwyMyBAQAogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgT3duZXJEZXZIYW5kbGUgYW5kIEZsYWdzIGZpZWxkIHRvIFNBUyBQSFkgUGFnZSAwLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgSU9DIEdQSU8gRmxhZ3MgZGVmaW5lIHRvIFNBUyBFbmNsb3N1cmUgUGFnZSAwLgogICogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgdGhlIHZhbHVlIGZvciBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZfU0FUQV9TVVBQT1JULgorICogIDA4LTAzLTA1ICAwMS4wNS4xMCAgUmVtb3ZlZCBJU0RhdGFTY3J1YlJhdGUgYW5kIElTUmVzeW5jUmF0ZSBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICBNYW51ZmFjdHVyaW5nIFBhZ2UgNC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9JT1VOSVRQQUdFMV9TQVRBX1dSSVRFX0NBQ0hFX0RJU0FCTEUgYml0LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTnVtRGV2c1BlckVuY2xvc3VyZSBmaWVsZCB0byBTQVMgSU8gVW5pdCBwYWdlIDIuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUElfU0FTX0lPVU5JVDJfRkxBR1NfSE9TVF9BU1NJR05FRF9QSFlTX01BUAorICogICAgICAgICAgICAgICAgICAgICAgZGVmaW5lLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgRW5jbG9zdXJlSGFuZGxlIGZpZWxkIHRvIFNBUyBFeHBhbmRlciBwYWdlIDAuCisgKiAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIHJlZHVuZGFudCBOdW1UYWJsZUVudHJpZXNQcm9nIGZpZWxkIGZyb20gU0FTCisgKiAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRlciBQYWdlIDEuCisgKiAgMDgtMzAtMDUgIDAxLjA1LjExICBBZGRlZCBEZXZpY2VJRCBmb3IgRkM5NDlFIGFuZCBjaGFuZ2VkIHRoZSBEZXZpY2VJRCBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgIFNBUzEwNzguCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBtb3JlIGRlZmluZXMgZm9yIE1hbnVmYWN0dXJpbmcgUGFnZSA0IEZsYWdzIGZpZWxkLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbW9yZSBkZWZpbmVzIGZvciBJT0NTZXR0aW5ncyBhbmQgYWRkZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIEV4cGFuZGVyU3BpbnVwIGZpZWxkIHRvIEJpb3MgUGFnZSAxLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgcG9zdHBvbmUgU0FUQSBJbml0IGJpdCB0byBTQVMgSU8gVW5pdCBQYWdlIDEKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGbGFncy4KKyAqICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgTG9nRW50cnkgZm9ybWF0IGZvciBMb2cgUGFnZSAwLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG1waV9pbml0LmgKQEAgLTQ0Miw2ICs0NjUsOCBAQAogICogICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZy4KICAqICAwNi0yNC0wNSAgMDEuMDUuMDUgIEFkZGVkIFNDU0kgSU8gMzIgc3RydWN0dXJlcyBhbmQgZGVmaW5lcy4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZvdXIgbmV3IGRlZmluZXMgZm9yIFNFUCBTbG90U3RhdHVzLgorICogIDA4LTAzLTA1ICAwMS4wNS4wNiAgRml4ZWQgc29tZSBNUElfU0NTSUlPMzJfTVNHRkxHU18gZGVmaW5lcyB0byBtYWtlIHRoZW0KKyAqICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSBpbiB0aGUgZmlyc3QgMzIgY2hhcmFjdGVycy4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBtcGlfdGFyZy5oCkBAIC01ODIsNiArNjA3LDkgQEAKIAogbXBpX3Nhcy5oCiAgKiAgMDgtMTktMDQgIDAxLjA1LjAxICBPcmlnaW5hbCByZWxlYXNlLgorICogIDA4LTMwLTA1ICAwMS4wNS4wMiAgQWRkZWQgRGV2aWNlSW5mbyBiaXQgZm9yIFNFUC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFByaW1GbGFncyBhbmQgUHJpbWl0aXZlIGZpZWxkIHRvIFNBUyBJTyBVbml0CisgKiAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJlcXVlc3QsIGFuZCBhZGRlZCBhIG5ldyBvcGVyYXRpb24gY29kZS4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBtcGlfdHlwZS5oCkBAIC01OTIsMjQgKzYyMCwyNSBAQAogICogIDA4LTA4LTAxICAwMS4wMi4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgdjEuMiB3b3JrLgogICogIDA1LTExLTA0ICAwMS4wMy4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgTVBJIHYxLjMuCiAgKiAgMDgtMTktMDQgIDAxLjA1LjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciBNUEkgdjEuNS4KKyAqICAwOC0zMC0wNSAgMDEuMDUuMDIgIEFkZGVkIFBvd2VyUEMgb3B0aW9uIHRvICNpZmRlZidzLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG1waV9oaXN0b3J5LnR4dCAgICAgICAgIFBhcnRzIGxpc3QgaGlzdG9yeQogCi1GaWxlbmFtZSAgICAwMS4wNS4xMCAgMDEuMDUuMDkKLS0tLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLQotbXBpLmggICAgICAgMDEuMDUuMDggIDAxLjA1LjA3Ci1tcGlfaW9jLmggICAwMS4wNS4wOSAgMDEuMDUuMDgKLW1waV9jbmZnLmggIDAxLjA1LjA5ICAwMS4wNS4wOAotbXBpX2luaXQuaCAgMDEuMDUuMDUgIDAxLjA1LjA0Ci1tcGlfdGFyZy5oICAwMS4wNS4wNSAgMDEuMDUuMDQKLW1waV9mYy5oICAgIDAxLjA1LjAxICAwMS4wNS4wMQotbXBpX2xhbi5oICAgMDEuMDUuMDEgIDAxLjA1LjAxCi1tcGlfcmFpZC5oICAwMS4wNS4wMiAgMDEuMDUuMDIKLW1waV90b29sLmggIDAxLjA1LjAzICAwMS4wNS4wMwotbXBpX2luYi5oICAgMDEuMDUuMDEgIDAxLjA1LjAxCi1tcGlfc2FzLmggICAwMS4wNS4wMSAgMDEuMDUuMDEKLW1waV90eXBlLmggIDAxLjA1LjAxICAwMS4wNS4wMQorRmlsZW5hbWUgICAgMDEuMDUuMTIgIDAxLjA1LjExICAwMS4wNS4xMCAgMDEuMDUuMDkKKy0tLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0gIC0tLS0tLS0tCittcGkuaCAgICAgICAwMS4wNS4xMCAgMDEuMDUuMDkgIDAxLjA1LjA4ICAwMS4wNS4wNworbXBpX2lvYy5oICAgMDEuMDUuMTAgIDAxLjA1LjA5ICAwMS4wNS4wOSAgMDEuMDUuMDgKK21waV9jbmZnLmggIDAxLjA1LjExICAwMS4wNS4xMCAgMDEuMDUuMDkgIDAxLjA1LjA4CittcGlfaW5pdC5oICAwMS4wNS4wNiAgMDEuMDUuMDYgIDAxLjA1LjA1ICAwMS4wNS4wNAorbXBpX3RhcmcuaCAgMDEuMDUuMDUgIDAxLjA1LjA1ICAwMS4wNS4wNSAgMDEuMDUuMDQKK21waV9mYy5oICAgIDAxLjA1LjAxICAwMS4wNS4wMSAgMDEuMDUuMDEgIDAxLjA1LjAxCittcGlfbGFuLmggICAwMS4wNS4wMSAgMDEuMDUuMDEgIDAxLjA1LjAxICAwMS4wNS4wMQorbXBpX3JhaWQuaCAgMDEuMDUuMDIgIDAxLjA1LjAyICAwMS4wNS4wMiAgMDEuMDUuMDIKK21waV90b29sLmggIDAxLjA1LjAzICAwMS4wNS4wMyAgMDEuMDUuMDMgIDAxLjA1LjAzCittcGlfaW5iLmggICAwMS4wNS4wMSAgMDEuMDUuMDEgIDAxLjA1LjAxICAwMS4wNS4wMQorbXBpX3Nhcy5oICAgMDEuMDUuMDIgIDAxLjA1LjAxICAwMS4wNS4wMSAgMDEuMDUuMDEKK21waV90eXBlLmggIDAxLjA1LjAyICAwMS4wNS4wMSAgMDEuMDUuMDEgIDAxLjA1LjAxCiAKIEZpbGVuYW1lICAgIDAxLjA1LjA4ICAgMDEuMDUuMDcgICAwMS4wNS4wNiAgIDAxLjA1LjA1ICAgMDEuMDUuMDQgICAwMS4wNS4wMwogLS0tLS0tLS0tLSAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW5pdC5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2luaXQuaAppbmRleCBkNWFmNzVhLi42ODk0MWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW5pdC5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pbml0LmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBpbml0aWF0b3IgbW9kZSBtZXNzYWdlcyBhbmQgc3RydWN0dXJlcwogICogIENyZWF0aW9uIERhdGU6ICBKdW5lIDgsIDIwMDAKICAqCi0gKiAgICBtcGlfaW5pdC5oIFZlcnNpb246ICAwMS4wNS4wNQorICogICAgbXBpX2luaXQuaCBWZXJzaW9uOiAgMDEuMDUuMDYKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC01MCw2ICs1MCw4IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzaW5nLgogICogIDA2LTI0LTA1ICAwMS4wNS4wNSAgQWRkZWQgU0NTSSBJTyAzMiBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZm91ciBuZXcgZGVmaW5lcyBmb3IgU0VQIFNsb3RTdGF0dXMuCisgKiAgMDgtMDMtMDUgIDAxLjA1LjA2ICBGaXhlZCBzb21lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTXyBkZWZpbmVzIHRvIG1ha2UgdGhlbQorICogICAgICAgICAgICAgICAgICAgICAgdW5pcXVlIGluIHRoZSBmaXJzdCAzMiBjaGFyYWN0ZXJzLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtMjkwLDggKzI5Miw4IEBACiAKIC8qIFNDU0kgSU8gMzIgTXNnRmxhZ3MgYml0cyAqLwogI2RlZmluZSBNUElfU0NTSUlPMzJfTVNHRkxHU19TRU5TRV9XSURUSCAgICAgICAgICAgICAgICAoMHgwMSkKLSNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfU0VOU0VfV0lEVEhfMzIgICAgICAgICAgICAgKDB4MDApCi0jZGVmaW5lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTX1NFTlNFX1dJRFRIXzY0ICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfU0NTSUlPMzJfTVNHRkxHU18zMl9TRU5TRV9XSURUSCAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfNjRfU0VOU0VfV0lEVEggICAgICAgICAgICAgKDB4MDEpCiAKICNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfU0VOU0VfTE9DQVRJT04gICAgICAgICAgICAgKDB4MDIpCiAjZGVmaW5lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTX1NFTlNFX0xPQ19IT1NUICAgICAgICAgICAgICgweDAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2lvYy5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2lvYy5oCmluZGV4IDkzYjcwZTIuLjJjNWY0M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pb2MuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW9jLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBJT0MsIFBvcnQsIEV2ZW50LCBGVyBEb3dubG9hZCwgYW5kIEZXIFVwbG9hZCBtZXNzYWdlcwogICogIENyZWF0aW9uIERhdGU6ICBBdWd1c3QgMTEsIDIwMDAKICAqCi0gKiAgICBtcGlfaW9jLmggVmVyc2lvbjogIDAxLjA1LjA5CisgKiAgICBtcGlfaW9jLmggVmVyc2lvbjogIDAxLjA1LjEwCiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtODMsNiArODMsMTAgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgSU9DRmFjdHMgUmVwbHkgRUVEUCBDYXBhYmlsaXR5IGJpdC4KICAqICAwNi0yNC0wNSAgMDEuMDUuMDkgIEFkZGVkIDUgbmV3IElPQ0ZhY3RzIFJlcGx5IElPQ0NhcGFiaWxpdGllcyBiaXRzLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTWF4IFNBVEEgVGFyZ2V0cyB0byBTQVMgRGlzY292ZXJ5IEVycm9yIGV2ZW50LgorICogIDA4LTMwLTA1ICAwMS4wNS4xMCAgQWRkZWQgNCBuZXcgZXZlbnRzIGFuZCB0aGVpciBldmVudCBkYXRhIHN0cnVjdHVyZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBuZXcgUmVhc29uQ29kZSB2YWx1ZSBmb3IgU0FTIERldmljZSBTdGF0dXMgQ2hhbmdlCisgKiAgICAgICAgICAgICAgICAgICAgICBldmVudC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG5ldyBmYW1pbHkgY29kZSBmb3IgRkM5NDlFLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtNDY0LDYgKzQ2OCwxMCBAQAogI2RlZmluZSBNUElfRVZFTlRfUEVSU0lTVEVOVF9UQUJMRV9GVUxMICAgICAoMHgwMDAwMDAxMSkKICNkZWZpbmUgTVBJX0VWRU5UX1NBU19QSFlfTElOS19TVEFUVVMgICAgICAgKDB4MDAwMDAwMTIpCiAjZGVmaW5lIE1QSV9FVkVOVF9TQVNfRElTQ09WRVJZX0VSUk9SICAgICAgICgweDAwMDAwMDEzKQorI2RlZmluZSBNUElfRVZFTlRfSVJfUkVTWU5DX1VQREFURSAgICAgICAgICAoMHgwMDAwMDAxNCkKKyNkZWZpbmUgTVBJX0VWRU5UX0lSMiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTUpCisjZGVmaW5lIE1QSV9FVkVOVF9TQVNfRElTQ09WRVJZICAgICAgICAgICAgICgweDAwMDAwMDE2KQorI2RlZmluZSBNUElfRVZFTlRfTE9HX0VOVFJZX0FEREVEICAgICAgICAgICAoMHgwMDAwMDAyMSkKIAogLyogQWNrUmVxdWlyZWQgZmllbGQgdmFsdWVzICovCiAKQEAgLTQ4MCw2ICs0ODgsMjkgQEAKIH0gRVZFTlRfREFUQV9FVkVOVF9DSEFOR0UsIE1QSV9QT0lOVEVSIFBUUl9FVkVOVF9EQVRBX0VWRU5UX0NIQU5HRSwKICAgRXZlbnREYXRhRXZlbnRDaGFuZ2VfdCwgTVBJX1BPSU5URVIgcEV2ZW50RGF0YUV2ZW50Q2hhbmdlX3Q7CiAKKy8qIExvZ0VudHJ5QWRkZWQgRXZlbnQgZGF0YSAqLworCisvKiB0aGlzIHN0cnVjdHVyZSBtYXRjaGVzIE1QSV9MT0dfMF9FTlRSWSBpbiBtcGlfY25mZy5oICovCisjZGVmaW5lIE1QSV9FVkVOVF9EQVRBX0xPR19FTlRSWV9EQVRBX0xFTkdUSCAgICAoMHgxQykKK3R5cGVkZWYgc3RydWN0IF9FVkVOVF9EQVRBX0xPR19FTlRSWQoreworICAgIFUzMiAgICAgICAgIFRpbWVTdGFtcDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFUxNiAgICAgICAgIExvZ1NlcXVlbmNlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgIExvZ0VudHJ5UXVhbGlmaWVyOyAgICAgICAgICAgICAgICAgIC8qIDBBaCAqLworICAgIFU4ICAgICAgICAgIExvZ0RhdGFbTVBJX0VWRU5UX0RBVEFfTE9HX0VOVFJZX0RBVEFfTEVOR1RIXTsgLyogMENoICovCit9IEVWRU5UX0RBVEFfTE9HX0VOVFJZLCBNUElfUE9JTlRFUiBQVFJfRVZFTlRfREFUQV9MT0dfRU5UUlksCisgIE1waUV2ZW50RGF0YUxvZ0VudHJ5X3QsIE1QSV9QT0lOVEVSIHBNcGlFdmVudERhdGFMb2dFbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBfRVZFTlRfREFUQV9MT0dfRU5UUllfQURERUQKK3sKKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBMb2dTZXF1ZW5jZTsgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBFVkVOVF9EQVRBX0xPR19FTlRSWSAgICBMb2dFbnRyeTsgICAgICAgICAgICAgICAvKiAwOGggKi8KK30gRVZFTlRfREFUQV9MT0dfRU5UUllfQURERUQsIE1QSV9QT0lOVEVSIFBUUl9FVkVOVF9EQVRBX0xPR19FTlRSWV9BRERFRCwKKyAgTXBpRXZlbnREYXRhTG9nRW50cnlBZGRlZF90LCBNUElfUE9JTlRFUiBwTXBpRXZlbnREYXRhTG9nRW50cnlBZGRlZF90OworCiAvKiBTQ1NJIEV2ZW50IGRhdGEgZm9yIFBvcnQsIEJ1cyBhbmQgRGV2aWNlIGZvcm1zICovCiAKIHR5cGVkZWYgc3RydWN0IF9FVkVOVF9EQVRBX1NDU0kKQEAgLTUzOCw2ICs1NjksNyBAQAogI2RlZmluZSBNUElfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX1NNQVJUX0RBVEEgICAgICAgICAgICAoMHgwNSkKICNkZWZpbmUgTVBJX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19OT19QRVJTSVNUX0FEREVEICAgICAgKDB4MDYpCiAjZGVmaW5lIE1QSV9FVkVOVF9TQVNfREVWX1NUQVRfUkNfVU5TVVBQT1JURUQgICAgICAgICAgICgweDA3KQorI2RlZmluZSBNUElfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX0lOVEVSTkFMX0RFVklDRV9SRVNFVCAoMHgwOCkKIAogCiAvKiBTQ1NJIEV2ZW50IGRhdGEgZm9yIFF1ZXVlIEZ1bGwgZXZlbnQgKi8KQEAgLTU3OSw2ICs2MTEsNzkgQEAKICNkZWZpbmUgTVBJX0VWRU5UX1JBSURfUkNfU01BUlRfREFUQSAgICAgICAgICAgICAgICAgICAgKDB4MEEpCiAjZGVmaW5lIE1QSV9FVkVOVF9SQUlEX1JDX1JFUExBQ0VfQUNUSU9OX1NUQVJURUQgICAgICAgICgweDBCKQogCisKKy8qIE1QSSBJbnRlZ3JhdGVkIFJBSUQgUmVzeW5jIFVwZGF0ZSBFdmVudCBkYXRhICovCisKK3R5cGVkZWYgc3RydWN0IF9NUElfRVZFTlRfREFUQV9JUl9SRVNZTkNfVVBEQVRFCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVm9sdW1lSUQ7ICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUJ1czsgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXN5bmNDb21wbGV0ZTsgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KK30gTVBJX0VWRU5UX0RBVEFfSVJfUkVTWU5DX1VQREFURSwKKyAgTVBJX1BPSU5URVIgUFRSX01QSV9FVkVOVF9EQVRBX0lSX1JFU1lOQ19VUERBVEUsCisgIE1waUV2ZW50RGF0YUlyUmVzeW5jVXBkYXRlX3QsIE1QSV9QT0lOVEVSIHBNcGlFdmVudERhdGFJclJlc3luY1VwZGF0ZV90OworCisvKiBNUEkgSVIyIEV2ZW50IGRhdGEgKi8KKworLyogTVBJX0xEX1NUQVRFIG9yIE1QSV9QRF9TVEFURSAqLwordHlwZWRlZiBzdHJ1Y3QgX0lSMl9TVEFURV9DSEFOR0VECit7CisgICAgVTE2ICAgICAgICAgICAgICAgICBQcmV2aW91c1N0YXRlOyAgLyogMDBoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICBOZXdTdGF0ZTsgICAgICAgLyogMDJoICovCit9IElSMl9TVEFURV9DSEFOR0VELCBNUElfUE9JTlRFUiBQVFJfSVIyX1NUQVRFX0NIQU5HRUQ7CisKK3R5cGVkZWYgc3RydWN0IF9JUjJfUERfSU5GTworeworICAgIFUxNiAgICAgICAgICAgICAgICAgRGV2aWNlSGFuZGxlOyAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICBUcnVuY0VuY2xvc3VyZUhhbmRsZTsgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgIFRydW5jYXRlZFNsb3Q7ICAgICAgICAgIC8qIDAzaCAqLworfSBJUjJfUERfSU5GTywgTVBJX1BPSU5URVIgUFRSX0lSMl9QRF9JTkZPOworCit0eXBlZGVmIHVuaW9uIF9NUElfSVIyX1JDX0VWRU5UX0RBVEEKK3sKKyAgICBJUjJfU1RBVEVfQ0hBTkdFRCAgIFN0YXRlQ2hhbmdlZDsKKyAgICBVMzIgICAgICAgICAgICAgICAgIExiYTsKKyAgICBJUjJfUERfSU5GTyAgICAgICAgIFBkSW5mbzsKK30gTVBJX0lSMl9SQ19FVkVOVF9EQVRBLCBNUElfUE9JTlRFUiBQVFJfTVBJX0lSMl9SQ19FVkVOVF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCBfTVBJX0VWRU5UX0RBVEFfSVIyCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SUQ7ICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1czsgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZWFzb25Db2RlOyAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUGh5c0Rpc2tOdW07ICAgICAgICAgIC8qIDAzaCAqLworICAgIE1QSV9JUjJfUkNfRVZFTlRfREFUQSAgIElSMkV2ZW50RGF0YTsgICAgICAgICAvKiAwNGggKi8KK30gTVBJX0VWRU5UX0RBVEFfSVIyLCBNUElfUE9JTlRFUiBQVFJfTVBJX0VWRU5UX0RBVEFfSVIyLAorICBNcGlFdmVudERhdGFJUjJfdCwgTVBJX1BPSU5URVIgcE1waUV2ZW50RGF0YUlSMl90OworCisvKiBNUEkgSVIyIEV2ZW50IGRhdGEgUmVhc29uQ29kZSB2YWx1ZXMgKi8KKyNkZWZpbmUgTVBJX0VWRU5UX0lSMl9SQ19MRF9TVEFURV9DSEFOR0VEICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX0VWRU5UX0lSMl9SQ19QRF9TVEFURV9DSEFOR0VEICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX0VWRU5UX0lSMl9SQ19CQURfQkxPQ0tfVEFCTEVfRlVMTCAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX0VWRU5UX0lSMl9SQ19QRF9JTlNFUlRFRCAgICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX0VWRU5UX0lSMl9SQ19QRF9SRU1PVkVEICAgICAgICAgICAgICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJX0VWRU5UX0lSMl9SQ19GT1JFSUdOX0NGR19ERVRFQ1RFRCAgICAgICAoMHgwNikKKyNkZWZpbmUgTVBJX0VWRU5UX0lSMl9SQ19SRUJVSUxEX01FRElVTV9FUlJPUiAgICAgICAoMHgwNykKKworLyogZGVmaW5lcyBmb3IgbG9naWNhbCBkaXNrIHN0YXRlcyAqLworI2RlZmluZSBNUElfTERfU1RBVEVfT1BUSU1BTCAgICAgICAgICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfTERfU1RBVEVfREVHUkFERUQgICAgICAgICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfTERfU1RBVEVfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfTERfU1RBVEVfTUlTU0lORyAgICAgICAgICAgICAgICAgICAgICAgICgweDAzKQorI2RlZmluZSBNUElfTERfU1RBVEVfT0ZGTElORSAgICAgICAgICAgICAgICAgICAgICAgICgweDA0KQorCisvKiBkZWZpbmVzIGZvciBwaHlzaWNhbCBkaXNrIHN0YXRlcyAqLworI2RlZmluZSBNUElfUERfU1RBVEVfT05MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfUERfU1RBVEVfTUlTU0lORyAgICAgICAgICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfUERfU1RBVEVfTk9UX0NPTVBBVElCTEUgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfUERfU1RBVEVfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICgweDAzKQorI2RlZmluZSBNUElfUERfU1RBVEVfSU5JVElBTElaSU5HICAgICAgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNUElfUERfU1RBVEVfT0ZGTElORV9BVF9IT1NUX1JFUVVFU1QgICAgICAgICgweDA1KQorI2RlZmluZSBNUElfUERfU1RBVEVfRkFJTEVEX0FUX0hPU1RfUkVRVUVTVCAgICAgICAgICgweDA2KQorI2RlZmluZSBNUElfUERfU1RBVEVfT0ZGTElORV9GT1JfQU5PVEhFUl9SRUFTT04gICAgICgweEZGKQorCiAvKiBNUEkgTGluayBTdGF0dXMgQ2hhbmdlIEV2ZW50IGRhdGEgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgX0VWRU5UX0RBVEFfTElOS19TVEFUVVMKQEAgLTY2MCw2ICs3NjUsMjAgQEAKICNkZWZpbmUgTVBJX0VWRU5UX1NBU19QTFNfTFJfUkFURV8xXzUgICAgICAgICAgICAgICAgICAgICAgICgweDA4KQogI2RlZmluZSBNUElfRVZFTlRfU0FTX1BMU19MUl9SQVRFXzNfMCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDkpCiAKKy8qIFNBUyBEaXNjb3ZlcnkgRXZlbnQgZGF0YSAqLworCit0eXBlZGVmIHN0cnVjdCBfRVZFTlRfREFUQV9TQVNfRElTQ09WRVJZCit7CisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRGlzY292ZXJ5U3RhdHVzOyAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KK30gRVZFTlRfREFUQV9TQVNfRElTQ09WRVJZLCBNUElfUE9JTlRFUiBQVFJfRVZFTlRfREFUQV9TQVNfRElTQ09WRVJZLAorICBFdmVudERhdGFTYXNEaXNjb3ZlcnlfdCwgTVBJX1BPSU5URVIgcEV2ZW50RGF0YVNhc0Rpc2NvdmVyeV90OworCisjZGVmaW5lIE1QSV9FVkVOVF9TQVNfRFNDVlJZX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTVBJX0VWRU5UX1NBU19EU0NWUllfSU5fUFJPR1JFU1MgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNUElfRVZFTlRfU0FTX0RTQ1ZSWV9QSFlfQklUU19NQVNLICAgICAgICAgICAgICAgICAgKDB4RkZGRjAwMDApCisjZGVmaW5lIE1QSV9FVkVOVF9TQVNfRFNDVlJZX1BIWV9CSVRTX1NISUZUICAgICAgICAgICAgICAgICAoMTYpCisKIC8qIFNBUyBEaXNjb3ZlcnkgRXJycm9yIEV2ZW50IGRhdGEgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgX0VWRU5UX0RBVEFfRElTQ09WRVJZX0VSUk9SCkBAIC04NjksNiArOTg4LDcgQEAKICNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfRkFNSUxZXzkxOVhMX0ZDICAgICAgICgweDAwMDMpIC8qIDkxOVhMIGFuZCA5MjlYTCAqLwogI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9GQU1JTFlfOTM5WF9GQyAgICAgICAgKDB4MDAwNCkgLyogOTM5WCBhbmQgOTQ5WCAgICovCiAjZGVmaW5lIE1QSV9GV19IRUFERVJfUElEX0ZBTUlMWV85NTlfRkMgICAgICAgICAoMHgwMDA1KQorI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9GQU1JTFlfOTQ5RV9GQyAgICAgICAgKDB4MDAwNikKIC8qIFNBUyAqLwogI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9GQU1JTFlfMTA2NF9TQVMgICAgICAgKDB4MDAwMSkKICNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfRkFNSUxZXzEwNjhfU0FTICAgICAgICgweDAwMDIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfbG9nX2ZjLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfbG9nX2ZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5OGQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9sb2dfZmMuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIExTSSBMb2dpYyBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgTkFNRTogICAgICAgICAgIGZjX2xvZy5oCisgKiAgU1VNTUFSWTogICAgICAgIE1QSSBJb2NMb2dJbmZvIGRlZmluaXRpb25zIGZvciB0aGUgU1lNRkM5eHggY2hpcHMKKyAqICBERVNDUklQVElPTjogICAgQ29udGFpbnMgdGhlIGVudW1lcmF0ZWQgbGlzdCBvZiB2YWx1ZXMgdGhhdCBtYXkgYmUgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICAgICAgaW4gdGhlIElPQ0xvZ0luZm8gZmllbGQgb2YgYSBNUEkgRGVmYXVsdCBSZXBseSBNZXNzYWdlLgorICoKKyAqICBDUkVBVElPTiBEQVRFOiAgNi8wMi8yMDAwCisgKiAgSUQ6ICAgICAgICAgICAgICRJZDogZmNfbG9nLmgsdiA0LjYgMjAwMS8wNy8yNiAxNDo0MTozMyBzc2NocmVtbSBFeHAgJAorICovCisKKworLyoKKyAqIE1waUlvY0xvZ0luZm9fdCBlbnVtCisgKgorICogVGhlc2UgMzIgYml0IHZhbHVlcyBhcmUgdXNlZCBpbiB0aGUgSU9DTG9nSW5mbyBmaWVsZCBvZiB0aGUgTVBJIHJlcGx5CisgKiBtZXNzYWdlcy4KKyAqIFRoZSB2YWx1ZSBpcyAweGFiY2NjY2NjIHdoZXJlCisgKiAgICAgICAgICBhID0gVGhlIHR5cGUgb2YgbG9nIGluZm8gYXMgcGVyIHRoZSBNUEkgc3BlYy4gU2luY2UgdGhlc2UgY29kZXMgYXJlCisgKiAgICAgICAgICAgICAgYWxsIGZvciBGaWJyZSBDaGFubmVsIHRoaXMgdmFsdWUgd2lsbCBhbHdheXMgYmUgMi4KKyAqICAgICAgICAgIGIgPSBTcGVjaWZpZXMgYSBzdWJjbGFzcyBvZiB0aGUgZmlybXdhcmUgd2hlcmUKKyAqICAgICAgICAgICAgICAgICAgMCA9IEZDUCBJbml0aWF0b3IKKyAqICAgICAgICAgICAgICAgICAgMSA9IEZDUCBUYXJnZXQKKyAqICAgICAgICAgICAgICAgICAgMiA9IExBTgorICogICAgICAgICAgICAgICAgICAzID0gTVBJIE1lc3NhZ2UgTGF5ZXIKKyAqICAgICAgICAgICAgICAgICAgNCA9IEZDIExpbmsKKyAqICAgICAgICAgICAgICAgICAgNSA9IENvbnRleHQgTWFuYWdlcgorICogICAgICAgICAgICAgICAgICA2ID0gSW52YWxpZCBGaWVsZCBPZmZzZXQKKyAqICAgICAgICAgICAgICAgICAgNyA9IFN0YXRlIENoYW5nZSBJbmZvCisgKiAgICAgICAgICAgICAgICAgIGFsbCBvdGhlcnMgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgKiAgICAgICAgICBjID0gQSBzcGVjaWZpYyB2YWx1ZSB3aXRoaW4gdGhlIHN1YmNsYXNzLgorICoKKyAqIE5PVEU6IEFueSBuZXcgdmFsdWVzIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIGVhY2ggc3ViY2xhc3Mgc28gdGhhdCB0aGUKKyAqICAgICAgIGNvZGVzIHJlbWFpbiBjb25zaXN0ZW50IGFjcm9zcyBmaXJtd2FyZSByZWxlYXNlcy4KKyAqLwordHlwZWRlZiBlbnVtIF9NcGlJb2NMb2dJbmZvRmMKK3sKKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTklUX0JBU0UgICAgICAgICAgICAgICAgICAgICA9IDB4MjAwMDAwMDAsCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5JVF9FUlJPUl9PVVRfT0ZfT1JERVJfRlJBTUUgPSAweDIwMDAwMDAxLCAvKiByZWNlaXZlZCBhbiBvdXQgb2Ygb3JkZXIgZnJhbWUgLSB1bnN1cHBvcnRlZCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOSVRfRVJST1JfQkFEX1NUQVJUX09GX0ZSQU1FID0gMHgyMDAwMDAwMiwgLyogQmFkIFJ4IEZyYW1lLCBiYWQgc3RhcnQgb2YgZnJhbWUgcHJpbWF0aXZlICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5JVF9FUlJPUl9CQURfRU5EX09GX0ZSQU1FICAgPSAweDIwMDAwMDAzLCAvKiBCYWQgUnggRnJhbWUsIGJhZCBlbmQgb2YgZnJhbWUgcHJpbWF0aXZlICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5JVF9FUlJPUl9PVkVSX1JVTiAgICAgICAgICAgPSAweDIwMDAwMDA0LCAvKiBCYWQgUnggRnJhbWUsIG92ZXJydW4gKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTklUX0VSUk9SX1JYX09USEVSICAgICAgICAgICA9IDB4MjAwMDAwMDUsIC8qIE90aGVyIGVycm9ycyBjYXVnaHQgYnkgSU9DIHdoaWNoIHJlcXVpcmUgcmV0cmllcyAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOSVRfRVJST1JfU1VCUFJPQ19ERUFEICAgICAgID0gMHgyMDAwMDAwNiwgLyogTWFpbiBwcm9jZXNzb3IgY291bGQgbm90IGluaXRpYWxpemUgc3ViLXByb2Nlc3NvciAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOSVRfRVJST1JfUlhfT1ZFUlJVTiAgICAgICAgID0gMHgyMDAwMDAwNywgLyogU2NhdHRlciBHYXRoZXIgb3ZlcnJ1biAgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTklUX0VSUk9SX1JYX0JBRF9TVEFUVVMgICAgICA9IDB4MjAwMDAwMDgsIC8qIFJlY2VpdmVyIGRldGVjdGVkIGNvbnRleHQgbWlzbWF0Y2ggdmlhIGludmFsaWQgaGVhZGVyICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5JVF9FUlJPUl9SWF9VTkVYUEVDVEVEX0ZSQU1FPSAweDIwMDAwMDA5LCAvKiBDdHhNZ3IgZGV0ZWN0ZWQgdW5zdXBwb3J0ZWQgZnJhbWUgdHlwZSAgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTklUX0VSUk9SX0xJTktfRkFJTFVSRSAgICAgICA9IDB4MjAwMDAwMEEsIC8qIExpbmsgZmFpbHVyZSBvY2N1cnJlZCAgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTklUX0VSUk9SX1RYX1RJTUVPVVQgICAgICAgICA9IDB4MjAwMDAwMEIsIC8qIFRyYW5zbWl0dGVyIHRpbWVvdXQgZXJyb3IgKi8KKworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9CQVNFICAgICAgICAgICAgICAgICAgID0gMHgyMTAwMDAwMCwKKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfTk9fUERJU0MgICAgICAgICAgICAgICA9IDB4MjEwMDAwMDEsIC8qIG5vdCBzZW50IGJlY2F1c2Ugd2UgYXJlIHdhaXRpbmcgZm9yIGEgUERJU0MgZnJvbSB0aGUgaW5pdGlhdG9yICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX05PX0xPR0lOICAgICAgICAgICAgICAgPSAweDIxMDAwMDAyLCAvKiBub3Qgc2VudCBiZWNhdXNlIHdlIGFyZSBub3QgbG9nZ2VkIGluIHRvIHRoZSByZW1vdGUgbm9kZSAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9ET0FSX0tJTExFRF9CWV9MSVAgICAgID0gMHgyMTAwMDAwMywgLyogRGF0YSBPdXQsIEF1dG8gUmVzcG9uc2UsIG5vdCBzZW50IGR1ZSB0byBhIExJUCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9ESUFSX0tJTExFRF9CWV9MSVAgICAgID0gMHgyMTAwMDAwNCwgLyogRGF0YSBJbiwgQXV0byBSZXNwb25zZSwgbm90IHNlbnQgZHVlIHRvIGEgTElQICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX0RJQVJfTUlTU0lOR19EQVRBICAgICAgPSAweDIxMDAwMDA1LCAvKiBEYXRhIEluLCBBdXRvIFJlc3BvbnNlLCBtaXNzaW5nIGRhdGEgZnJhbWVzICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX0RPTlJfS0lMTEVEX0JZX0xJUCAgICAgPSAweDIxMDAwMDA2LCAvKiBEYXRhIE91dCwgTm8gUmVzcG9uc2UsIG5vdCBzZW50IGR1ZSB0byBhIExJUCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9XUlNQX0tJTExFRF9CWV9MSVAgICAgID0gMHgyMTAwMDAwNywgLyogQXV0by1yZXNwb25zZSBhZnRlciBhIHdyaXRlIG5vdCBzZW50IGR1ZSB0byBhIExJUCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9ESU5SX0tJTExFRF9CWV9MSVAgICAgID0gMHgyMTAwMDAwOCwgLyogRGF0YSBJbiwgTm8gUmVzcG9uc2UsIG5vdCBjb21wbGV0ZWQgZHVlIHRvIGEgTElQICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX0RJTlJfTUlTU0lOR19EQVRBICAgICAgPSAweDIxMDAwMDA5LCAvKiBEYXRhIEluLCBObyBSZXNwb25zZSwgbWlzc2luZyBkYXRhIGZyYW1lcyAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9NUlNQX0tJTExFRF9CWV9MSVAgICAgID0gMHgyMTAwMDAwYSwgLyogTWFudWFsIFJlc3BvbnNlIG5vdCBzZW50IGR1ZSB0byBhIExJUCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9OT19DTEFTU18zICAgICAgICAgICAgID0gMHgyMTAwMDAwYiwgLyogbm90IHNlbnQgYmVjYXVzZSByZW1vdGUgbm9kZSBkb2VzIG5vdCBzdXBwb3J0IENsYXNzIDMgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfTE9HSU5fTk9UX1ZBTElEICAgICAgICA9IDB4MjEwMDAwMGMsIC8qIG5vdCBzZW50IGJlY2F1c2UgbG9naW4gdG8gcmVtb3RlIG5vZGUgbm90IHZhbGlkYXRlZCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9GUk9NX09VVEJPVU5EICAgICAgICAgID0gMHgyMTAwMDAwZSwgLyogY2xlYXJlZCBmcm9tIHRoZSBvdXRib3VuZCBxdWV1ZSBhZnRlciBhIGxvZ291dCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9XQUlUSU5HX0ZPUl9EQVRBX0lOICAgID0gMHgyMTAwMDAwZiwgLyogY2xlYXJlZCB3YWl0aW5nIGZvciBkYXRhIGFmdGVyIGEgbG9nb3V0ICovCisKKyAgICBNUElfSU9DTE9HSU5GT19GQ19MQU5fQkFTRSAgICAgICAgICAgICAgICAgICAgICA9IDB4MjIwMDAwMDAsCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfTEFOX1RSQU5TX1NHTF9NSVNTSU5HICAgICAgICAgPSAweDIyMDAwMDAxLCAvKiBUcmFuc2FjdGlvbiBDb250ZXh0IFNnbCBNaXNzaW5nICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfTEFOX1RSQU5TX1dST05HX1BMQUNFICAgICAgICAgPSAweDIyMDAwMDAyLCAvKiBUcmFuc2FjdGlvbiBDb250ZXh0IGZvdW5kIGJlZm9yZSBhbiBFT0IgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19MQU5fVFJBTlNfUkVTX0JJVFNfU0VUICAgICAgICA9IDB4MjIwMDAwMDMsIC8qIFRyYW5zYWN0aW9uIENvbnRleHQgdmFsdWUgaGFzIHJlc2VydmVkIGJpdHMgc2V0ICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfTEFOX1dST05HX1NHTF9GTEFHICAgICAgICAgICAgPSAweDIyMDAwMDA0LCAvKiBJbnZhbGlkIFNHTCBGbGFncyAqLworCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfTVNHX0JBU0UgICAgICAgICAgICAgICAgICAgICAgPSAweDIzMDAwMDAwLAorCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfTElOS19CQVNFICAgICAgICAgICAgICAgICAgICAgPSAweDI0MDAwMDAwLAorICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0xJTktfTE9PUF9JTklUX1RJTUVPVVQgICAgICAgID0gMHgyNDAwMDAwMSwgLyogTG9vcCBpbml0aWFsaXphdGlvbiB0aW1lZCBvdXQgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19MSU5LX0FMUkVBRFlfSU5JVElBTElaRUQgICAgICA9IDB4MjQwMDAwMDIsIC8qIEFub3RoZXIgc3lzdGVtIGNvbnRyb2xsZXIgYWxyZWFkeSBpbml0aWFsaXplZCB0aGUgbG9vcCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0xJTktfTElOS19OT1RfRVNUQUJMSVNIRUQgICAgID0gMHgyNDAwMDAwMywgLyogTm90IHN5bmNocm9uaXplZCB0byBzaWduYWwgb3Igc3RpbGwgbmVnb3RpYXRpbmcgKHBvc3NpYmxlIGNhYmxlIHByb2JsZW0pICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfTElOS19DUkNfRVJST1IgICAgICAgICAgICAgICAgPSAweDI0MDAwMDA0LCAvKiBDUkMgY2hlY2sgZGV0ZWN0ZWQgZXJyb3Igb24gcmVjZWl2ZWQgZnJhbWUgKi8KKworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0NUWF9CQVNFICAgICAgICAgICAgICAgICAgICAgID0gMHgyNTAwMDAwMCwKKworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOVkFMSURfRklFTERfQllURV9PRkZTRVQgICAgID0gMHgyNjAwMDAwMCwgLyogVGhlIGxvd2VyIDI0IGJpdHMgZ2l2ZSB0aGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGZpZWxkIGluIHRoZSByZXF1ZXN0IG1lc3NhZ2UgdGhhdCBpcyBpbnZhbGlkICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5WQUxJRF9GSUVMRF9NQVhfT0ZGU0VUICAgICAgPSAweDI2ZmZmZmZmLAorCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfU1RBVEVfQ0hBTkdFICAgICAgICAgICAgICAgICAgPSAweDI3MDAwMDAwICAvKiBUaGUgbG93ZXIgMjQgYml0cyBnaXZlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gY29uY2VybmluZyBzdGF0ZSBjaGFuZ2UgKi8KKworfSBNcGlJb2NMb2dJbmZvRmNfdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9sb2dfc2FzLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfbG9nX3Nhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNTlkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfbG9nX3Nhcy5oCkBAIC0wLDAgKzEsMTYyIEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBDb3B5cmlnaHQgMjAwMyBMU0kgTG9naWMgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBUaGlzIGZpbGUgaXMgY29uZmlkZW50aWFsIGFuZCBhIHRyYWRlIHNlY3JldCBvZiBMU0kgTG9naWMuICBUaGUgICAgICAgICoKKyAqICByZWNlaXB0IG9mIG9yIHBvc3Nlc3Npb24gb2YgdGhpcyBmaWxlIGRvZXMgbm90IGNvbnZleSBhbnkgcmlnaHRzIHRvICAgICoKKyAqICByZXByb2R1Y2Ugb3IgZGlzY2xvc2UgaXRzIGNvbnRlbnRzIG9yIHRvIG1hbnVmYWN0dXJlLCB1c2UsIG9yIHNlbGwgICAgICoKKyAqICBhbnl0aGluZyBpdCBtYXkgZGVzY3JpYmUsIGluIHdob2xlLCBvciBpbiBwYXJ0LCB3aXRob3V0IHRoZSBzcGVjaWZpYyAgICoKKyAqICB3cml0dGVuIGNvbnNlbnQgb2YgTFNJIExvZ2ljIENvcnBvcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgICAgICAgTmFtZTogIGlvcGlJb2NMb2dJbmZvLmgKKyAqICAgICAgICAgIFRpdGxlOiAgU0FTIEZpcm13YXJlIElPUCBJbnRlcmZhY2UgSU9DIExvZyBJbmZvIERlZmluaXRpb25zCisgKiAgICAgUHJvZ3JhbW1lcjogIEd1eSBLZW5kYWxsCisgKiAgQ3JlYXRpb24gRGF0ZTogIFNlcHRlbWJlciAyNCwgMjAwMworICoKKyAqICBWZXJzaW9uIEhpc3RvcnkKKyAqICAtLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgTGFzdCBVcGRhdGVkCisgKiAgLS0tLS0tLS0tLS0tLQorICogIFZlcnNpb24gICAgICAgICAldmVyc2lvbjogMjIgJQorICogIERhdGUgVXBkYXRlZCAgICAlZGF0ZV9tb2RpZmllZDogJQorICogIFByb2dyYW1tZXIgICAgICAlY3JlYXRlZF9ieTogbnBlcnVjY2EgJQorICoKKyAqICBEYXRlICAgICAgV2hvICAgRGVzY3JpcHRpb24KKyAqICAtLS0tLS0tLSAgLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIDA5LzI0LzAzICBHV0sgICBJbml0aWFsIHZlcnNpb24KKyAqCisgKgorICogRGVzY3JpcHRpb24KKyAqIC0tLS0tLS0tLS0tLQorICogVGhpcyBpbmNsdWRlIGZpbGUgY29udGFpbnMgU0FTIGZpcm13YXJlIGludGVyZmFjZSBJT0MgTG9nIEluZm8gY29kZXMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIElPUElfSU9DTE9HSU5GT19IX0lOQ0xVREVECisjZGVmaW5lIElPUElfSU9DTE9HSU5GT19IX0lOQ0xVREVECisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgSU9DIExPR0lORk8gZGVmaW5lcywgMHgwMDAwMDAwMCAtIDB4MEZGRkZGRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGb3JtYXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBCaXRzIDMxLTI4OiBNUElfSU9DTE9HSU5GT19UWVBFX1NBUyAoMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEJpdHMgMjctMjQ6IElPQ19MT0dJTkZPX09SSUdJTkFUT1I6IDA9SU9QLCAxPVBMLCAyPUlSICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQml0cyAyMy0xNjogTE9HSU5GT19DT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBCaXRzIDE1LTA6ICBMT0dJTkZPX0NPREUgU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJT0NfTE9HSU5GT19PUklHSU5BVE9SIGRlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJT0NfTE9HSU5GT19PUklHSU5BVE9SX0lPUCAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgSU9DX0xPR0lORk9fT1JJR0lOQVRPUl9QTCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDEwMDAwMDApCisjZGVmaW5lIElPQ19MT0dJTkZPX09SSUdJTkFUT1JfSVIgICAgICAgICAgICAgICAgICAgICAgICgweDAyMDAwMDAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExPR0lORk9fQ09ERSBkZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElPQ19MT0dJTkZPX0NPREVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwRkYwMDAwKQorI2RlZmluZSBJT0NfTE9HSU5GT19DT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAoMTYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSU9QIExPR0lORk9fQ09ERSBkZWZpbmVzLCB2YWxpZCBpZiBJT0NfTE9HSU5GT19PUklHSU5BVE9SID0gSU9QICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSU9QX0xPR0lORk9fQ09ERV9JTlZBTElEX1NBU19BRERSRVNTICAgICAgICAgICAgKDB4MDAwMTAwMDApCisjZGVmaW5lIElPUF9MT0dJTkZPX0NPREVfVU5VU0VEMiAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDIwMDAwKQorI2RlZmluZSBJT1BfTE9HSU5GT19DT0RFX0NPTkZJR19JTlZBTElEX1BBR0UgICAgICAgICAgICAoMHgwMDAzMDAwMCkKKyNkZWZpbmUgSU9QX0xPR0lORk9fQ09ERV9DT05GSUdfSU5WQUxJRF9QQUdFX1JUICAgICAgICAgKDB4MDAwMzAxMDApIC8qIFJvdXRlIFRhYmxlIEVudHJ5IG5vdCBmb3VuZCAqLworI2RlZmluZSBJT1BfTE9HSU5GT19DT0RFX0NPTkZJR19JTlZBTElEX1BBR0VfUE4gICAgICAgICAoMHgwMDAzMDIwMCkgLyogSW52YWxpZCBQYWdlIE51bWJlciAqLworI2RlZmluZSBJT1BfTE9HSU5GT19DT0RFX0NPTkZJR19JTlZBTElEX1BBR0VfRk9STSAgICAgICAoMHgwMDAzMDMwMCkgLyogSW52YWxpZCBGT1JNICovCisjZGVmaW5lIElPUF9MT0dJTkZPX0NPREVfQ09ORklHX0lOVkFMSURfUEFHRV9QVCAgICAgICAgICgweDAwMDMwNDAwKSAvKiBJbnZhbGlkIFBhZ2UgVHlwZSAqLworI2RlZmluZSBJT1BfTE9HSU5GT19DT0RFX0NPTkZJR19JTlZBTElEX1BBR0VfRE5NICAgICAgICAoMHgwMDAzMDUwMCkgLyogRGV2aWNlIE5vdCBNYXBwZWQgKi8KKyNkZWZpbmUgSU9QX0xPR0lORk9fQ09ERV9DT05GSUdfSU5WQUxJRF9QQUdFX1BFUlNJU1QgICAgKDB4MDAwMzA2MDApIC8qIFBlcnNpc3RlbnQgUGFnZSBub3QgZm91bmQgKi8KKyNkZWZpbmUgSU9QX0xPR0lORk9fQ09ERV9DT05GSUdfSU5WQUxJRF9QQUdFX0RFRkFVTFQgICAgKDB4MDAwMzA3MDApIC8qIERlZmF1bHQgUGFnZSBub3QgZm91bmQgKi8KKyNkZWZpbmUgSU9QX0xPR0lORk9fQ09ERV9UQVNLX1RFUk1JTkFURUQgICAgICAgICAgICAgICAgKDB4MDAwNTAwMDApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQTCBMT0dJTkZPX0NPREUgZGVmaW5lcywgdmFsaWQgaWYgSU9DX0xPR0lORk9fT1JJR0lOQVRPUiA9IFBMICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfT1BFTl9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMTAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9JTlZBTElEX1NHTCAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX1dST05HX1JFTF9PRkZfT1JfRlJBTUVfTEVOR1RIICAgICAgICgweDAwMDMwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfRlJBTUVfWEZFUl9FUlJPUiAgICAgICAgICAgICAgICAgICAgKDB4MDAwNDAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9UWF9GTV9DT05ORUNURURfTE9XICAgICAgICAgICAgICAgICAoMHgwMDA1MDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX1NBVEFfTk9OX05DUV9SV19FUlJfQklUX1NFVCAgICAgICAgICgweDAwMDYwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfU0FUQV9SRUFEX0xPR19SRUNFSVZFX0RBVEFfRVJSICAgICAgKDB4MDAwNzAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9TQVRBX05DUV9GQUlMX0FMTF9DTURTX0FGVFJfRVJSICAgICAoMHgwMDA4MDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX1NBVEFfRVJSX0lOX1JDVl9TRVRfREVWX0JJVF9GSVMgICAgICgweDAwMDkwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfUlhfRk1fSU5WQUxJRF9NRVNTQUdFICAgICAgICAgICAgICAgKDB4MDAwQTAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9SWF9DVFhfTUVTU0FHRV9WQUxJRF9FUlJPUiAgICAgICAgICAoMHgwMDBCMDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX1JYX0ZNX0NVUlJFTlRfRlJBTUVfRVJST1IgICAgICAgICAgICgweDAwMEMwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfU0FUQV9MSU5LX0RPV04gICAgICAgICAgICAgICAgICAgICAgKDB4MDAwRDAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9ESVNDT1ZFUllfU0FUQV9JTklUX1dfSU9TICAgICAgICAgICAoMHgwMDBFMDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0NPTkZJR19JTlZBTElEX1BBR0UgICAgICAgICAgICAgICAgICgweDAwMEYwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfQ09ORklHX0lOVkFMSURfUEFHRV9QVCAgICAgICAgICAgICAgKDB4MDAwRjAxMDApIC8qIEludmFsaWQgUGFnZSBUeXBlICovCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9DT05GSUdfSU5WQUxJRF9QQUdFX05VTV9QSFlTICAgICAgICAoMHgwMDBGMDIwMCkgLyogSW52YWxpZCBOdW1iZXIgb2YgUGh5cyAqLworI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfQ09ORklHX0lOVkFMSURfUEFHRV9OT1RfSU1QICAgICAgICAgKDB4MDAwRjAzMDApIC8qIENhc2UgTm90IEhhbmRsZWQgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0NPTkZJR19JTlZBTElEX1BBR0VfTk9fREVWICAgICAgICAgICgweDAwMEYwNDAwKSAvKiBObyBEZXZpY2UgRm91bmQgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0NPTkZJR19JTlZBTElEX1BBR0VfRk9STSAgICAgICAgICAgICgweDAwMEYwNTAwKSAvKiBJbnZhbGlkIEZPUk0gKi8KKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0NPTkZJR19JTlZBTElEX1BBR0VfUEhZICAgICAgICAgICAgICgweDAwMEYwNjAwKSAvKiBJbnZhbGlkIFBoeSAqLworI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfQ09ORklHX0lOVkFMSURfUEFHRV9OT19PV05FUiAgICAgICAgKDB4MDAwRjA3MDApIC8qIE5vIE93bmVyIEZvdW5kICovCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9EU0NWUllfU0FUQV9JTklUX1RJTUVPVVQgICAgICAgICAgICAoMHgwMDEwMDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTEwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfQUJPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMjAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9JT19OT1RfWUVUX0VYRUNVVEVEICAgICAgICAgICAgICAgICAoMHgwMDEzMDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0lPX0VYRUNVVEVEICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTQwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX09QRU5fRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAxMDApCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfSU5WQUxJRF9TR0wgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9XUk9OR19SRUxfT0ZGX09SX0ZSQU1FX0xFTkdUSCAgICgweDAwMDAwMzAwKQorI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX0ZSQU1FX1hGRVJfRVJST1IgICAgICAgICAgICAgICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfVFhfRk1fQ09OTkVDVEVEX0xPVyAgICAgICAgICAgICAoMHgwMDAwMDUwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9TQVRBX05PTl9OQ1FfUldfRVJSX0JJVF9TRVQgICAgICgweDAwMDAwNjAwKQorI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX1NBVEFfUkVBRF9MT0dfUkVDRUlWRV9EQVRBX0VSUiAgKDB4MDAwMDA3MDApCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfU0FUQV9OQ1FfRkFJTF9BTExfQ01EU19BRlRSX0VSUiAoMHgwMDAwMDgwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9TQVRBX0VSUl9JTl9SQ1ZfU0VUX0RFVl9CSVRfRklTICgweDAwMDAwOTAwKQorI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX1JYX0ZNX0lOVkFMSURfTUVTU0FHRSAgICAgICAgICAgKDB4MDAwMDBBMDApCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfUlhfQ1RYX01FU1NBR0VfVkFMSURfRVJST1IgICAgICAoMHgwMDAwMEIwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9SWF9GTV9DVVJSRU5UX0ZSQU1FX0VSUk9SICAgICAgICgweDAwMDAwQzAwKQorI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX1NBVEFfTElOS19ET1dOICAgICAgICAgICAgICAgICAgKDB4MDAwMDBEMDApCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfRElTQ09WRVJZX1NBVEFfSU5JVF9XX0lPUyAgICAgICAoMHgwMDAwMEUwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9EU0NWUllfU0FUQV9JTklUX1RJTUVPVVQgICAgICAgICgweDAwMDAxMDAwKQorCisKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0VOQ0xfTUdNVF9TTVBfRlJBTUVfRkFJTFVSRSAgICAgICAgICgweDAwMjAwMDAwKSAvKiBDYW4ndCBnZXQgU01QIEZyYW1lICovCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9FTkNMX01HTVRfU01QX1JFQURfRVJST1IgICAgICAgICAgICAoMHgwMDIwMDAwMSkgLyogRXJyb3Igb2NjdXJlZCBvbiBTTVAgUmVhZCAqLworI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfRU5DTF9NR01UX1NNUF9XUklURV9FUlJPUiAgICAgICAgICAgKDB4MDAyMDAwMDIpIC8qIEVycm9yIG9jY3VyZWQgb24gU01QIFdyaXRlICovCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9FTkNMX01HTVRfTk9UX1NVUFBPUlRFRF9PTl9FTkNMICAgICAoMHgwMDIwMDAwNCkgLyogRW5jbCBNZ210IHNlcnZpY2VzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgV1dJRCAqLworI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfRU5DTF9NR01UX0FERFJfTU9ERV9OT1RfU1VQUE9SVEVEICAgKDB4MDAyMDAwMDUpIC8qIEFkZHJlc3MgTW9kZSBub3Qgc3VwcG9yZWQgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0VOQ0xfTUdNVF9CQURfU0xPVF9OVU0gICAgICAgICAgICAgICgweDAwMjAwMDA2KSAvKiBJbnZhbGlkIFNsb3QgTnVtYmVyIGluIFNFUCBNc2cgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0VOQ0xfTUdNVF9TR1BJT19OT1RfUFJFU0VOVCAgICAgICAgICgweDAwMjAwMDA3KSAvKiBTR1BJTyBub3QgcHJlc2VudC9lbmFibGVkICovCisKKyNkZWZpbmUgUExfTE9HSU5GT19EQV9TRVBfTk9UX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAgICgweDAwMjAwMTAwKSAvKiBTRVAgbm90IHByZXNlbnQgd2hlbiBtc2cgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19EQV9TRVBfU0lOR0xFX1RIUkVBRF9FUlJPUiAgICAgICAgICAgICAgICgweDAwMjAwMTAxKSAvKiBDYW4gb25seSBhY2NlcHQgMSBtc2cgYXQgYSB0aW1lICovCisjZGVmaW5lIFBMX0xPR0lORk9fREFfU0VQX0lTVFdJX0lOVFJfSU5fSURMRV9TVEFURSAgICAgICAgICAoMHgwMDIwMDEwMikgLyogSVNUV0kgaW50ZXJydXB0IHJlY3ZkLiB3aGlsZSBJRExFICovCisjZGVmaW5lIFBMX0xPR0lORk9fREFfU0VQX1JFQ0VJVkVEX05BQ0tfRlJPTV9TTEFWRSAgICAgICAgICAoMHgwMDIwMDEwMykgLyogU0VQIE5BQ0snZCwgaXQgaXMgYnVzeSAqLworI2RlZmluZSBQTF9MT0dJTkZPX0RBX1NFUF9CQURfU1RBVFVTX0hEUl9DSEtTVU0gICAgICAgICAgICAgKDB4MDAyMDAxMDQpIC8qIFNFUCBzdG9wcGVkIG9yIHNlbnQgYmFkIGNoa3N1bSBpbiBIZHIgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19EQV9TRVBfVU5TVVBQT1JURURfU0NTSV9TVEFUVVNfMSAgICAgICAgICgweDAwMjAwMTA1KSAvKiBTRVAgcmV0dXJuZWQgdW5rbm93biBzY3NpIHN0YXR1cyAqLworI2RlZmluZSBQTF9MT0dJTkZPX0RBX1NFUF9VTlNVUFBPUlRFRF9TQ1NJX1NUQVRVU18yICAgICAgICAgKDB4MDAyMDAxMDYpIC8qIFNFUCByZXR1cm5lZCB1bmtub3duIHNjc2kgc3RhdHVzICovCisjZGVmaW5lIFBMX0xPR0lORk9fREFfU0VQX0NIS1NVTV9FUlJPUl9BRlRFUl9TVE9QICAgICAgICAgICAoMHgwMDIwMDEwNykgLyogU0VQIHJldHVybmVkIGJhZCBjaGtzdW0gYWZ0ZXIgU1RPUCAqLworI2RlZmluZSBQTF9MT0dJTkZPX0RBX1NFUF9DSEtTVU1fRVJST1JfQUZURVJfU1RPUF9HRVREQVRBICAgKDB4MDAyMDAxMDgpIC8qIFNFUCByZXR1cm5lZCBiYWQgY2hrc3VtIGFmdGVyIFNUT1Agd2hpbGUgZ2V0dGluIGRhdGEqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSVIgTE9HSU5GT19DT0RFIGRlZmluZXMsIHZhbGlkIGlmIElPQ19MT0dJTkZPX09SSUdJTkFUT1IgPSBJUiAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSVJfTE9HSU5GT19DT0RFX1VOVVNFRDEgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMTAwMDApCisjZGVmaW5lIElSX0xPR0lORk9fQ09ERV9VTlVTRUQyICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDIwMDAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlZmluZXMgZm9yIGNvbnZpZW5lbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElPQ19MT0dJTkZPX1BSRUZJWF9JT1AgICAgICAgICAgICAgICAgICAgICAgICAgICgoTVBJX0lPQ0xPR0lORk9fVFlQRV9TQVMgPDwgTVBJX0lPQ0xPR0lORk9fVFlQRV9TSElGVCkgfCBJT0NfTE9HSU5GT19PUklHSU5BVE9SX0lPUCkKKyNkZWZpbmUgSU9DX0xPR0lORk9fUFJFRklYX1BMICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNUElfSU9DTE9HSU5GT19UWVBFX1NBUyA8PCBNUElfSU9DTE9HSU5GT19UWVBFX1NISUZUKSB8IElPQ19MT0dJTkZPX09SSUdJTkFUT1JfUEwpCisjZGVmaW5lIElPQ19MT0dJTkZPX1BSRUZJWF9JUiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTVBJX0lPQ0xPR0lORk9fVFlQRV9TQVMgPDwgTVBJX0lPQ0xPR0lORk9fVFlQRV9TSElGVCkgfCBJT0NfTE9HSU5GT19PUklHSU5BVE9SX0lSKQorCisjZW5kaWYgLyogZW5kIG9mIGZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3Nhcy5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3Nhcy5oCmluZGV4IDIzMGZhNjkuLjcwNTE0ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9zYXMuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfc2FzLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBTZXJpYWwgQXR0YWNoZWQgU0NTSSBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucwogICogIENyZWF0aW9uIERhdGU6ICBBdWd1c3QgMTksIDIwMDQKICAqCi0gKiAgICBtcGlfc2FzLmggVmVyc2lvbjogIDAxLjA1LjAxCisgKiAgICBtcGlfc2FzLmggVmVyc2lvbjogIDAxLjA1LjAyCiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtMTQsNiArMTQsOSBAQAogICogIERhdGUgICAgICBWZXJzaW9uICAgRGVzY3JpcHRpb24KICAqICAtLS0tLS0tLSAgLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIDA4LTE5LTA0ICAwMS4wNS4wMSAgT3JpZ2luYWwgcmVsZWFzZS4KKyAqICAwOC0zMC0wNSAgMDEuMDUuMDIgIEFkZGVkIERldmljZUluZm8gYml0IGZvciBTRVAuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBQcmltRmxhZ3MgYW5kIFByaW1pdGl2ZSBmaWVsZCB0byBTQVMgSU8gVW5pdAorICogICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByZXF1ZXN0LCBhbmQgYWRkZWQgYSBuZXcgb3BlcmF0aW9uIGNvZGUuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC01MSw2ICs1NCw3IEBACiAgKiBWYWx1ZXMgZm9yIHRoZSBTQVMgRGV2aWNlSW5mbyBmaWVsZCB1c2VkIGluIFNBUyBEZXZpY2UgU3RhdHVzIENoYW5nZSBFdmVudAogICogZGF0YSBhbmQgU0FTIElPIFVuaXQgQ29uZmlndXJhdGlvbiBwYWdlcy4KICAqLworI2RlZmluZSBNUElfU0FTX0RFVklDRV9JTkZPX1NFUCAgICAgICAgICAgICAgICAgKDB4MDAwMDQwMDApCiAjZGVmaW5lIE1QSV9TQVNfREVWSUNFX0lORk9fQVRBUElfREVWSUNFICAgICAgICAoMHgwMDAwMjAwMCkKICNkZWZpbmUgTVBJX1NBU19ERVZJQ0VfSU5GT19MU0lfREVWSUNFICAgICAgICAgICgweDAwMDAxMDAwKQogI2RlZmluZSBNUElfU0FTX0RFVklDRV9JTkZPX0RJUkVDVF9BVFRBQ0ggICAgICAgKDB4MDAwMDA4MDApCkBAIC0yMTIsMjAgKzIxNiwyNiBAQAogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRhcmdldElEOyAgICAgICAgICAgLyogMENoICovCiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgQnVzOyAgICAgICAgICAgICAgICAvKiAwRGggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICBQaHlOdW07ICAgICAgICAgICAgIC8qIDBFaCAqLwotICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgLyogMEZoICovCi0gICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ1OyAgICAgICAgICAvKiAxMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBQcmltRmxhZ3M7ICAgICAgICAgIC8qIDBGaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZTsgICAgICAgICAgLyogMTBoICovCiAgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgU0FTQWRkcmVzczsgICAgICAgICAvKiAxNGggKi8KLSAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDY7ICAgICAgICAgIC8qIDFDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgLyogMUNoICovCiB9IE1TR19TQVNfSU9VTklUX0NPTlRST0xfUkVRVUVTVCwgTVBJX1BPSU5URVIgUFRSX01TR19TQVNfSU9VTklUX0NPTlRST0xfUkVRVUVTVCwKICAgU2FzSW9Vbml0Q29udHJvbFJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcFNhc0lvVW5pdENvbnRyb2xSZXF1ZXN0X3Q7CiAKIC8qIHZhbHVlcyBmb3IgdGhlIE9wZXJhdGlvbiBmaWVsZCAqLwotI2RlZmluZSBNUElfU0FTX09QX0NMRUFSX05PVF9QUkVTRU5UICAgICAgICAgICAgICgweDAxKQotI2RlZmluZSBNUElfU0FTX09QX0NMRUFSX0FMTF9QRVJTSVNURU5UICAgICAgICAgICgweDAyKQotI2RlZmluZSBNUElfU0FTX09QX1BIWV9MSU5LX1JFU0VUICAgICAgICAgICAgICAgICgweDA2KQotI2RlZmluZSBNUElfU0FTX09QX1BIWV9IQVJEX1JFU0VUICAgICAgICAgICAgICAgICgweDA3KQotI2RlZmluZSBNUElfU0FTX09QX1BIWV9DTEVBUl9FUlJPUl9MT0cgICAgICAgICAgICgweDA4KQotI2RlZmluZSBNUElfU0FTX09QX01BUF9DVVJSRU5UICAgICAgICAgICAgICAgICAgICgweDA5KQorI2RlZmluZSBNUElfU0FTX09QX0NMRUFSX05PVF9QUkVTRU5UICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9TQVNfT1BfQ0xFQVJfQUxMX1BFUlNJU1RFTlQgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1NBU19PUF9QSFlfTElOS19SRVNFVCAgICAgICAgICAgICAgICgweDA2KQorI2RlZmluZSBNUElfU0FTX09QX1BIWV9IQVJEX1JFU0VUICAgICAgICAgICAgICAgKDB4MDcpCisjZGVmaW5lIE1QSV9TQVNfT1BfUEhZX0NMRUFSX0VSUk9SX0xPRyAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX1NBU19PUF9NQVBfQ1VSUkVOVCAgICAgICAgICAgICAgICAgICgweDA5KQorI2RlZmluZSBNUElfU0FTX09QX1NFTkRfUFJJTUlUSVZFICAgICAgICAgICAgICAgKDB4MEEpCisKKy8qIHZhbHVlcyBmb3IgdGhlIFByaW1GbGFncyBmaWVsZCAqLworI2RlZmluZSBNUElfU0FTX1BSSU1GTEFHU19TSU5HTEUgICAgICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1QSV9TQVNfUFJJTUZMQUdTX1RSSVBMRSAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1NBU19QUklNRkxBR1NfUkVEVU5EQU5UICAgICAgICAgICAgICgweDAxKQogCiAKIC8qIFNBUyBJTyBVbml0IENvbnRyb2wgUmVwbHkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKaW5kZXggNTM3ODM2MC4uZDg5MGIyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKQEAgLTE0OCw3ICsxNDgsNiBAQAogc3RhdGljIGludAlXYWl0Rm9yRG9vcmJlbGxJbnQoTVBUX0FEQVBURVIgKmlvYywgaW50IGhvd2xvbmcsIGludCBzbGVlcEZsYWcpOwogc3RhdGljIGludAlXYWl0Rm9yRG9vcmJlbGxSZXBseShNUFRfQURBUFRFUiAqaW9jLCBpbnQgaG93bG9uZywgaW50IHNsZWVwRmxhZyk7CiBzdGF0aWMgaW50CUdldExhbkNvbmZpZ1BhZ2VzKE1QVF9BREFQVEVSICppb2MpOwotc3RhdGljIGludAlHZXRGY1BvcnRQYWdlMChNUFRfQURBUFRFUiAqaW9jLCBpbnQgcG9ydG51bSk7CiBzdGF0aWMgaW50CUdldElvVW5pdFBhZ2UyKE1QVF9BREFQVEVSICppb2MpOwogaW50CQltcHRiYXNlX3Nhc19wZXJzaXN0X29wZXJhdGlvbihNUFRfQURBUFRFUiAqaW9jLCB1OCBwZXJzaXN0X29wY29kZSk7CiBzdGF0aWMgaW50CW1wdF9HZXRTY3NpUG9ydFNldHRpbmdzKE1QVF9BREFQVEVSICppb2MsIGludCBwb3J0bnVtKTsKQEAgLTEyMzIsMTIgKzEyMzEsMTEgQEAKIAkJZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNCiAJCQkiOiBOb3QgdXNpbmcgNjQgYml0IGNvbnNpc3RlbnQgbWFza1xuIikpOwogCi0JaW9jID0ga21hbGxvYyhzaXplb2YoTVBUX0FEQVBURVIpLCBHRlBfQVRPTUlDKTsKKwlpb2MgPSBremFsbG9jKHNpemVvZihNUFRfQURBUFRFUiksIEdGUF9BVE9NSUMpOwogCWlmIChpb2MgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgTVlOQU0gIjogRVJST1IgLSBJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFkZCBhZGFwdGVyIVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoaW9jLCAwLCBzaXplb2YoTVBUX0FEQVBURVIpKTsKIAlpb2MtPmFsbG9jX3RvdGFsID0gc2l6ZW9mKE1QVF9BREFQVEVSKTsKIAlpb2MtPnJlcV9zeiA9IE1QVF9ERUZBVUxUX0ZSQU1FX1NJWkU7CQkvKiBhdm9pZCBkaXYgYnkgemVybyEgKi8KIAlpb2MtPnJlcGx5X3N6ID0gTVBUX1JFUExZX0ZSQU1FX1NJWkU7CkBAIC0xMjQ1LDYgKzEyNDMsOCBAQAogCWlvYy0+cGNpZGV2ID0gcGRldjsKIAlpb2MtPmRpYWdQZW5kaW5nID0gMDsKIAlzcGluX2xvY2tfaW5pdCgmaW9jLT5kaWFnTG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmlvYy0+ZmNfcmVzY2FuX3dvcmtfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmlvYy0+ZmNfcnBvcnRfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmlvYy0+aW5pdGlhbGl6aW5nX2hiYV9sb2NrKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIGV2ZW50IGxvZ2dpbmcuCkBAIC0xMjY4LDYgKzEyNjgsMTAgQEAKIAkgKi8KIAlJTklUX0xJU1RfSEVBRCgmaW9jLT5jb25maWdRKTsKIAorCS8qIEluaXRpYWxpemUgdGhlIGZjIHJwb3J0IGxpc3QgaGVhZC4KKwkgKi8KKwlJTklUX0xJU1RfSEVBRCgmaW9jLT5mY19ycG9ydHMpOworCiAJLyogRmluZCBsb29rdXAgc2xvdC4gKi8KIAlJTklUX0xJU1RfSEVBRCgmaW9jLT5saXN0KTsKIAlpb2MtPmlkID0gbXB0X2lkcysrOwpAQCAtMTM3NCw2ICsxMzc4LDEwIEBACiAJCWlvYy0+YnVzX3R5cGUgPSBGQzsKIAkJaW9jLT5lcnJhdGFfZmxhZ18xMDY0ID0gMTsKIAl9CisJZWxzZSBpZiAocGRldi0+ZGV2aWNlID09IE1QSV9NQU5VRkFDVFBBR0VfREVWSUNFSURfRkM5NDlFKSB7CisJCWlvYy0+cHJvZF9uYW1lID0gIkxTSUZDOTQ5RSI7CisJCWlvYy0+YnVzX3R5cGUgPSBGQzsKKwl9CiAJZWxzZSBpZiAocGRldi0+ZGV2aWNlID09IE1QSV9NQU5VRkFDVFBBR0VfREVWSURfNTNDMTAzMCkgewogCQlpb2MtPnByb2RfbmFtZSA9ICJMU0k1M0MxMDMwIjsKIAkJaW9jLT5idXNfdHlwZSA9IFNQSTsKQEAgLTE2MjIsNyArMTYzMCw3IEBACiAJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAKIAkvKiBlbmFibGUgaW50ZXJydXB0cyAqLwotCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRNYXNrLCB+KE1QSV9ISU1fUklNKSk7CisJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkludE1hc2ssIE1QSV9ISU1fRElNKTsKIAlpb2MtPmFjdGl2ZSA9IDE7CiAKIAkvKiBGL1cgbm90IHJ1bm5pbmcgKi8KQEAgLTE3MTUsNyArMTcyMyw3IEBACiAJCQkJLyogKHJlKUVuYWJsZSBhbHQtSU9DISAocmVwbHkgaW50ZXJydXB0LCBGcmVlUSkgKi8KIAkJCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogYWx0LSVzIHJlcGx5IGlycSByZS1lbmFibGVkXG4iLAogCQkJCQkJaW9jLT5hbHRfaW9jLT5uYW1lKSk7Ci0JCQkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmFsdF9pb2MtPmNoaXAtPkludE1hc2ssIH4oTVBJX0hJTV9SSU0pKTsKKwkJCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+YWx0X2lvYy0+Y2hpcC0+SW50TWFzaywgTVBJX0hJTV9ESU0pOwogCQkJCWlvYy0+YWx0X2lvYy0+YWN0aXZlID0gMTsKIAkJCX0KIApAQCAtMTgzMSw3ICsxODM5LDcgQEAKIAogCWlmIChyZXQgPT0gMCkgewogCQkvKiBFbmFibGUhIChyZXBseSBpbnRlcnJ1cHQpICovCi0JCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRNYXNrLCB+KE1QSV9ISU1fUklNKSk7CisJCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRNYXNrLCBNUElfSElNX0RJTSk7CiAJCWlvYy0+YWN0aXZlID0gMTsKIAl9CiAKQEAgLTE4MzksNyArMTg0Nyw3IEBACiAJCS8qIChyZSlFbmFibGUgYWx0LUlPQyEgKHJlcGx5IGludGVycnVwdCkgKi8KIAkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBhbHQtJXMgcmVwbHkgaXJxIHJlLWVuYWJsZWRcbiIsCiAJCQkJaW9jLT5hbHRfaW9jLT5uYW1lKSk7Ci0JCUNISVBSRUdfV1JJVEUzMigmaW9jLT5hbHRfaW9jLT5jaGlwLT5JbnRNYXNrLCB+KE1QSV9ISU1fUklNKSk7CisJCUNISVBSRUdfV1JJVEUzMigmaW9jLT5hbHRfaW9jLT5jaGlwLT5JbnRNYXNrLCBNUElfSElNX0RJTSk7CiAJCWlvYy0+YWx0X2lvYy0+YWN0aXZlID0gMTsKIAl9CiAKQEAgLTE4ODAsNyArMTg4OCw3IEBACiAJCQkgKiAgKEZDUG9ydFBhZ2UwX3Qgc3R1ZmYpCiAJCQkgKi8KIAkJCWZvciAoaWk9MDsgaWkgPCBpb2MtPmZhY3RzLk51bWJlck9mUG9ydHM7IGlpKyspIHsKLQkJCQkodm9pZCkgR2V0RmNQb3J0UGFnZTAoaW9jLCBpaSk7CisJCQkJKHZvaWQpIG1wdGJhc2VfR2V0RmNQb3J0UGFnZTAoaW9jLCBpaSk7CiAJCQl9CiAKIAkJCWlmICgoaW9jLT5wZmFjdHNbMF0uUHJvdG9jb2xGbGFncyAmIE1QSV9QT1JURkFDVFNfUFJPVE9DT0xfTEFOKSAmJgpAQCAtNDE5OSw3ICs0MjA3LDcgQEAKIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwogLyoKLSAqCUdldEZjUG9ydFBhZ2UwIC0gRmV0Y2ggRkNQb3J0IGNvbmZpZyBQYWdlMC4KKyAqCW1wdGJhc2VfR2V0RmNQb3J0UGFnZTAgLSBGZXRjaCBGQ1BvcnQgY29uZmlnIFBhZ2UwLgogICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKICAqCUBwb3J0bnVtOiBJT0MgUG9ydCBudW1iZXIKICAqCkBAIC00MjA5LDggKzQyMTcsOCBAQAogICoJCS1FQUdBSU4gaWYgbm8gbXNnIGZyYW1lcyBjdXJyZW50bHkgYXZhaWxhYmxlCiAgKgkJLUVGQVVMVCBmb3Igbm9uLXN1Y2Nlc3NmdWwgcmVwbHkgb3Igbm8gcmVwbHkgKHRpbWVvdXQpCiAgKi8KLXN0YXRpYyBpbnQKLUdldEZjUG9ydFBhZ2UwKE1QVF9BREFQVEVSICppb2MsIGludCBwb3J0bnVtKQoraW50CittcHRiYXNlX0dldEZjUG9ydFBhZ2UwKE1QVF9BREFQVEVSICppb2MsIGludCBwb3J0bnVtKQogewogCUNvbmZpZ1BhZ2VIZWFkZXJfdAkgaGRyOwogCUNPTkZJR1BBUk1TCQkgY2ZnOwpAQCAtNDIyMCw2ICs0MjI4LDggQEAKIAlpbnQJCQkgZGF0YV9zejsKIAlpbnQJCQkgY29weV9zejsKIAlpbnQJCQkgcmM7CisJaW50CQkJIGNvdW50ID0gNDAwOworCiAKIAkvKiBHZXQgRkNQb3J0IFBhZ2UgMCBoZWFkZXIgKi8KIAloZHIuUGFnZVZlcnNpb24gPSAwOwpAQCAtNDI0Myw2ICs0MjUzLDggQEAKIAlyYyA9IC1FTk9NRU07CiAJcHBhZ2UwX2FsbG9jID0gKEZDUG9ydFBhZ2UwX3QgKikgcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIGRhdGFfc3osICZwYWdlMF9kbWEpOwogCWlmIChwcGFnZTBfYWxsb2MpIHsKKworIHRyeV9hZ2FpbjoKIAkJbWVtc2V0KCh1OCAqKXBwYWdlMF9hbGxvYywgMCwgZGF0YV9zeik7CiAJCWNmZy5waHlzQWRkciA9IHBhZ2UwX2RtYTsKIAkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9DVVJSRU5UOwpAQCAtNDI3NCw2ICs0Mjg2LDE5IEBACiAJCQlwcDBkZXN0LT5EaXNjb3ZlcmVkUG9ydHNDb3VudCA9IGxlMzJfdG9fY3B1KHBwMGRlc3QtPkRpc2NvdmVyZWRQb3J0c0NvdW50KTsKIAkJCXBwMGRlc3QtPk1heEluaXRpYXRvcnMgPSBsZTMyX3RvX2NwdShwcDBkZXN0LT5NYXhJbml0aWF0b3JzKTsKIAorCQkJLyoKKwkJCSAqIGlmIHN0aWxsIGRvaW5nIGRpc2NvdmVyeSwKKwkJCSAqIGhhbmcgbG9vc2UgYSB3aGlsZSB1bnRpbCBmaW5pc2hlZAorCQkJICovCisJCQlpZiAocHAwZGVzdC0+UG9ydFN0YXRlID09IE1QSV9GQ1BPUlRQQUdFMF9QT1JUU1RBVEVfVU5LTk9XTikgeworCQkJCWlmIChjb3VudC0tID4gMCkgeworCQkJCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDApOworCQkJCQlnb3RvIHRyeV9hZ2FpbjsKKwkJCQl9CisJCQkJcHJpbnRrKE1ZSU9DX3NfSU5GT19GTVQgIkZpcm13YXJlIGRpc2NvdmVyeSBub3QiCisJCQkJCQkJIiBjb21wbGV0ZS5cbiIsCisJCQkJCQlpb2MtPm5hbWUpOworCQkJfQogCQl9CiAKIAkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgZGF0YV9zeiwgKHU4ICopIHBwYWdlMF9hbGxvYywgcGFnZTBfZG1hKTsKQEAgLTYzNTgsNiArNjM4Myw3IEBACiBFWFBPUlRfU1lNQk9MKG1wdF9mcmVlX2Z3X21lbW9yeSk7CiBFWFBPUlRfU1lNQk9MKG1wdGJhc2Vfc2FzX3BlcnNpc3Rfb3BlcmF0aW9uKTsKIEVYUE9SVF9TWU1CT0wobXB0X2FsdF9pb2Nfd2FpdCk7CitFWFBPUlRfU1lNQk9MKG1wdGJhc2VfR2V0RmNQb3J0UGFnZTApOwogCiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmgKaW5kZXggNmM0OGQxZi4uNDcwNTNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmgKQEAgLTc2LDggKzc2LDggQEAKICNkZWZpbmUgQ09QWVJJR0hUCSJDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSAiIE1PRFVMRUFVVEhPUgogI2VuZGlmCiAKLSNkZWZpbmUgTVBUX0xJTlVYX1ZFUlNJT05fQ09NTU9OCSIzLjAzLjA1IgotI2RlZmluZSBNUFRfTElOVVhfUEFDS0FHRV9OQU1FCQkiQCgjKW1wdGxpbnV4LTMuMDMuMDUiCisjZGVmaW5lIE1QVF9MSU5VWF9WRVJTSU9OX0NPTU1PTgkiMy4wMy4wNiIKKyNkZWZpbmUgTVBUX0xJTlVYX1BBQ0tBR0VfTkFNRQkJIkAoIyltcHRsaW51eC0zLjAzLjA2IgogI2RlZmluZSBXSEFUX01BR0lDX1NUUklORwkJIkAiICIoIiAiIyIgIikiCiAKICNkZWZpbmUgc2hvd19tcHRtb2RfdmVyKHMsdmVyKSAgXApAQCAtNDEzLDcgKzQxMyw3IEBACiAJdTgJCQkgc3RhdHVzOwkvKiBjdXJyZW50IGNvbW1hbmQgc3RhdHVzICovCiAJdTgJCQkgcmVzZXQ7CQkvKiAxIGlmIGJ1cyByZXNldCBhbGxvd2VkICovCiAJdTgJCQkgdGFyZ2V0OwkvKiB0YXJnZXQgZm9yIHJlc2V0ICovCi0Jc3RydWN0IHNlbWFwaG9yZQkgc2VtX2lvYzsKKwlzdHJ1Y3QgbXV0ZXgJCSBpb2N0bF9tdXRleDsKIH0gTVBUX0lPQ1RMOwogCiAjZGVmaW5lIE1QVF9TQVNfTUdNVF9TVEFUVVNfUkZfVkFMSUQJMHgwMgkvKiBUaGUgUmVwbHkgRnJhbWUgaXMgVkFMSUQgKi8KQEAgLTQyMSw3ICs0MjEsNyBAQAogI2RlZmluZSBNUFRfU0FTX01HTVRfU1RBVFVTX1RNX0ZBSUxFRAkweDQwCS8qIFVzZXIgVE0gcmVxdWVzdCBmYWlsZWQgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgX01QVF9TQVNfTUdNVCB7Ci0Jc3RydWN0IHNlbWFwaG9yZQkgbXV0ZXg7CisJc3RydWN0IG11dGV4CQkgbXV0ZXg7CiAJc3RydWN0IGNvbXBsZXRpb24JIGRvbmU7CiAJdTgJCQkgcmVwbHlbTVBUX0RFRkFVTFRfRlJBTUVfU0laRV07IC8qIHJlcGx5IGZyYW1lIGRhdGEgKi8KIAl1OAkJCSBzdGF0dXM7CS8qIGN1cnJlbnQgY29tbWFuZCBzdGF0dXMgKi8KQEAgLTQ5OSw2ICs0OTksMjIgQEAKIAlpbnQJCSBpc1JhaWQ7CQkvKiBiaXQgZmllbGQsIDEgaWYgUkFJRCAqLwogfVJhaWRDZmdEYXRhOwogCisjZGVmaW5lIE1QVF9SUE9SVF9JTkZPX0ZMQUdTX1JFR0lTVEVSRUQJMHgwMQkvKiBycG9ydCByZWdpc3RlcmVkICovCisjZGVmaW5lIE1QVF9SUE9SVF9JTkZPX0ZMQUdTX01JU1NJTkcJMHgwMgkvKiBtaXNzaW5nIGZyb20gRGV2UGFnZTAgc2NhbiAqLworI2RlZmluZSBNUFRfUlBPUlRfSU5GT19GTEFHU19NQVBQRURfVkRFViAweDA0CS8qIHRhcmdldCBtYXBwZWQgaW4gdmRldiAqLworCisvKgorICogZGF0YSBhbGxvY2F0ZWQgZm9yIGVhY2ggZmMgcnBvcnQgZGV2aWNlCisgKi8KK3N0cnVjdCBtcHRmY19ycG9ydF9pbmZvCit7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7CisJVmlydERldmljZQkqdmRldjsKKwlGQ0RldmljZVBhZ2UwX3QgcGcwOworCXU4CQlmbGFnczsKK307CisKIC8qCiAgKiAgQWRhcHRlciBTdHJ1Y3R1cmUgLSBwY2lfZGV2IHNwZWNpZmljLiBNYXhpbXVtOiBNUFRfTUFYX0FEQVBURVJTCiAgKi8KQEAgLTYxMiw3ICs2MjgsMTYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCSBsaXN0OwogCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRkZXY7CiAJc3RydWN0IGxpc3RfaGVhZAkgc2FzX3RvcG9sb2d5OworCXN0cnVjdCBtdXRleAkJIHNhc190b3BvbG9neV9tdXRleDsKIAlNUFRfU0FTX01HTVQJCSBzYXNfbWdtdDsKKwlpbnQJCQkgbnVtX3BvcnRzOworCisJc3RydWN0IGxpc3RfaGVhZAkgZmNfcnBvcnRzOworCXNwaW5sb2NrX3QJCSBmY19ycG9ydF9sb2NrOyAvKiBsaXN0IGFuZCByaSBmbGFncyAqLworCXNwaW5sb2NrX3QJCSBmY19yZXNjYW5fd29ya19sb2NrOworCWludAkJCSBmY19yZXNjYW5fd29ya19jb3VudDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJIGZjX3Jlc2Nhbl93b3JrOworCiB9IE1QVF9BREFQVEVSOwogCiAvKgpAQCAtOTk5LDYgKzEwMjQsNyBAQAogZXh0ZXJuIGludAkgbXB0X2ZpbmRJbVZvbHVtZXMoTVBUX0FEQVBURVIgKmlvYyk7CiBleHRlcm4gaW50CSBtcHRfcmVhZF9pb2NfcGdfMyhNUFRfQURBUFRFUiAqaW9jKTsKIGV4dGVybiBpbnQJIG1wdGJhc2Vfc2FzX3BlcnNpc3Rfb3BlcmF0aW9uKE1QVF9BREFQVEVSICppb2MsIHU4IHBlcnNpc3Rfb3Bjb2RlKTsKK2V4dGVybiBpbnQJIG1wdGJhc2VfR2V0RmNQb3J0UGFnZTAoTVBUX0FEQVBURVIgKmlvYywgaW50IHBvcnRudW0pOwogZXh0ZXJuIGludAkgbXB0X2FsdF9pb2Nfd2FpdChNUFRfQURBUFRFUiAqaW9jKTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jCmluZGV4IDdjMzQwMjQuLmJkZjcwOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYwpAQCAtMTc3LDEwICsxNzcsMTAgQEAKIAlkY3RscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjo6bXB0Y3RsX3N5c2NhbGxfZG93biglcCwlZCkgY2FsbGVkXG4iLCBpb2MsIG5vbmJsb2NrKSk7CiAKIAlpZiAobm9uYmxvY2spIHsKLQkJaWYgKGRvd25fdHJ5bG9jaygmaW9jLT5pb2N0bC0+c2VtX2lvYykpCisJCWlmICghbXV0ZXhfdHJ5bG9jaygmaW9jLT5pb2N0bC0+aW9jdGxfbXV0ZXgpKQogCQkJcmMgPSAtRUFHQUlOOwogCX0gZWxzZSB7Ci0JCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlvYy0+aW9jdGwtPnNlbV9pb2MpKQorCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZpb2MtPmlvY3RsLT5pb2N0bF9tdXRleCkpCiAJCQlyYyA9IC1FUkVTVEFSVFNZUzsKIAl9CiAJZGN0bHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6Om1wdGN0bF9zeXNjYWxsX2Rvd24gcmV0dXJuICVkXG4iLCByYykpOwpAQCAtNTU3LDcgKzU1Nyw3IEBACiAJZWxzZQogCQlyZXQgPSAtRUlOVkFMOwogCi0JdXAoJmlvY3AtPmlvY3RsLT5zZW1faW9jKTsKKwltdXRleF91bmxvY2soJmlvY3AtPmlvY3RsLT5pb2N0bF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjYxOSw3ICsyNjE5LDcgQEAKIAogCXJldCA9IG1wdGN0bF9kb19md19kb3dubG9hZChrZncuaW9jbnVtLCBrZncuYnVmcCwga2Z3LmZ3bGVuKTsKIAotCXVwKCZpb2NwLT5pb2N0bC0+c2VtX2lvYyk7CisJbXV0ZXhfdW5sb2NrKCZpb2NwLT5pb2N0bC0+aW9jdGxfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI2NzMsNyArMjY3Myw3IEBACiAJICovCiAJcmV0ID0gbXB0Y3RsX2RvX21wdF9jb21tYW5kIChrYXJnLCAmdWFyZy0+TUYpOwogCi0JdXAoJmlvY3AtPmlvY3RsLT5zZW1faW9jKTsKKwltdXRleF91bmxvY2soJmlvY3AtPmlvY3RsLT5pb2N0bF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjc0Myw3ICsyNzQzLDcgQEAKIAltZW1zZXQobWVtLCAwLCBzeik7CiAJaW9jLT5pb2N0bCA9IChNUFRfSU9DVEwgKikgbWVtOwogCWlvYy0+aW9jdGwtPmlvYyA9IGlvYzsKLQlzZW1hX2luaXQoJmlvYy0+aW9jdGwtPnNlbV9pb2MsIDEpOworCW11dGV4X2luaXQoJmlvYy0+aW9jdGwtPmlvY3RsX211dGV4KTsKIAlyZXR1cm4gMDsKIAogb3V0X2ZhaWw6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMKaW5kZXggYmE2MWUxOC4uYjEwMmM3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRmYy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZmMuYwpAQCAtNTUsMTIgKzU1LDE0IEBACiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CS8qIG5vdGlmaWVyIGNvZGUgKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KIAogI2luY2x1ZGUgIm1wdGJhc2UuaCIKICNpbmNsdWRlICJtcHRzY3NpaC5oIgpAQCAtNzksMTkgKzgxLDM0IEBACiBtb2R1bGVfcGFyYW0obXB0X3BxX2ZpbHRlciwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobXB0X3BxX2ZpbHRlciwgIiBFbmFibGUgcGVyaXBoZXJhbCBxdWFsaWZpZXIgZmlsdGVyOiBlbmFibGU9MSAgKGRlZmF1bHQ9MCkiKTsKIAorI2RlZmluZSBNUFRGQ19ERVZfTE9TU19UTU8gKDYwKQorc3RhdGljIGludCBtcHRmY19kZXZfbG9zc190bW8gPSBNUFRGQ19ERVZfTE9TU19UTU87CS8qIHJlYXNvbmFibGUgZGVmYXVsdCAqLworbW9kdWxlX3BhcmFtKG1wdGZjX2Rldl9sb3NzX3RtbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXB0ZmNfZGV2X2xvc3NfdG1vLCAiIEluaXRpYWwgdGltZSB0aGUgZHJpdmVyIHByb2dyYW1zIHRoZSAiCisgICAgCQkJCSAgICAgIiB0cmFuc3BvcnQgdG8gd2FpdCBmb3IgYW4gcnBvcnQgdG8gIgorCQkJCSAgICAgIiByZXR1cm4gZm9sbG93aW5nIGEgZGV2aWNlIGxvc3MgZXZlbnQuIgorCQkJCSAgICAgIiAgRGVmYXVsdD02MC4iKTsKKwogc3RhdGljIGludAltcHRmY0RvbmVDdHggPSAtMTsKIHN0YXRpYyBpbnQJbXB0ZmNUYXNrQ3R4ID0gLTE7CiBzdGF0aWMgaW50CW1wdGZjSW50ZXJuYWxDdHggPSAtMTsgLyogVXNlZCBvbmx5IGZvciBpbnRlcm5hbCBjb21tYW5kcyAqLwogCitpbnQgbXB0ZmNfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBtcHRmY19xY21kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAorICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKKworc3RhdGljIHZvaWQgbXB0ZmNfc2V0X3Jwb3J0X2xvc3NfdG1vKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsIHVpbnQzMl90IHRpbWVvdXQpOworc3RhdGljIHZvaWQgX19kZXZleGl0IG1wdGZjX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIG1wdGZjX2RyaXZlcl90ZW1wbGF0ZSA9IHsKIAkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCiAJLnByb2NfbmFtZQkJCT0gIm1wdGZjIiwKIAkucHJvY19pbmZvCQkJPSBtcHRzY3NpaF9wcm9jX2luZm8sCiAJLm5hbWUJCQkJPSAiTVBUIEZDIEhvc3QiLAogCS5pbmZvCQkJCT0gbXB0c2NzaWhfaW5mbywKLQkucXVldWVjb21tYW5kCQkJPSBtcHRzY3NpaF9xY21kLAorCS5xdWV1ZWNvbW1hbmQJCQk9IG1wdGZjX3FjbWQsCiAJLnRhcmdldF9hbGxvYwkJCT0gbXB0c2NzaWhfdGFyZ2V0X2FsbG9jLAotCS5zbGF2ZV9hbGxvYwkJCT0gbXB0c2NzaWhfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2FsbG9jCQkJPSBtcHRmY19zbGF2ZV9hbGxvYywKIAkuc2xhdmVfY29uZmlndXJlCQk9IG1wdHNjc2loX3NsYXZlX2NvbmZpZ3VyZSwKIAkudGFyZ2V0X2Rlc3Ryb3kJCQk9IG1wdHNjc2loX3RhcmdldF9kZXN0cm95LAogCS5zbGF2ZV9kZXN0cm95CQkJPSBtcHRzY3NpaF9zbGF2ZV9kZXN0cm95LApAQCAtMTI4LDE5ICsxNDUsNDc4IEBACiAJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKIAl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV9GQzk0OVgsCiAJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV9GQzk0OUVTLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCiAJezB9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1wdGZjX3BjaV90YWJsZSk7CiAKLS8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCi0gKgltcHRmY19wcm9iZSAtIEluc3RhbGxzIHNjc2kgZGV2aWNlcyBwZXIgYnVzLgotICoJQHBkZXY6IFBvaW50ZXIgdG8gcGNpX2RldiBzdHJ1Y3R1cmUKLSAqCi0gKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgotICoKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKm1wdGZjX3RyYW5zcG9ydF90ZW1wbGF0ZSA9IE5VTEw7CisKK3N0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZSBtcHRmY190cmFuc3BvcnRfZnVuY3Rpb25zID0geworCS5kZF9mY3Jwb3J0X3NpemUgPSA4LAorCS5zaG93X2hvc3Rfbm9kZV9uYW1lID0gMSwKKwkuc2hvd19ob3N0X3BvcnRfbmFtZSA9IDEsCisJLnNob3dfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlcyA9IDEsCisJLnNob3dfaG9zdF9wb3J0X2lkID0gMSwKKwkuc2hvd19ycG9ydF9zdXBwb3J0ZWRfY2xhc3NlcyA9IDEsCisJLnNob3dfc3RhcmdldF9ub2RlX25hbWUgPSAxLAorCS5zaG93X3N0YXJnZXRfcG9ydF9uYW1lID0gMSwKKwkuc2hvd19zdGFyZ2V0X3BvcnRfaWQgPSAxLAorCS5zZXRfcnBvcnRfZGV2X2xvc3NfdG1vID0gbXB0ZmNfc2V0X3Jwb3J0X2xvc3NfdG1vLAorCS5zaG93X3Jwb3J0X2Rldl9sb3NzX3RtbyA9IDEsCisKK307CisKKy8qIEZJWE1FISB2YWx1ZXMgY29udHJvbGxpbmcgZmlybXdhcmUgUkVTQ0FOIGV2ZW50CisgKiBuZWVkIHRvIGJlIHNldCBsb3cgdG8gYWxsb3cgZGV2X2xvc3NfdG1vIHRvCisgKiB3b3JrIGFzIGV4cGVjdGVkLiAgQ3VycmVudGx5LCBmaXJtd2FyZSBkb2Vzbid0CisgKiBub3RpZnkgZHJpdmVyIG9mIFJFU0NBTiBldmVudCB1bnRpbCBzb21lIG51bWJlcgorICogb2Ygc2Vjb25kcyBlbGFwc2UuICBUaGlzIHZhbHVlIGNhbiBiZSBzZXQgdmlhCisgKiBsc2l1dGlsLgogICovCitzdGF0aWMgdm9pZAorbXB0ZmNfc2V0X3Jwb3J0X2xvc3NfdG1vKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsIHVpbnQzMl90IHRpbWVvdXQpCit7CisJaWYgKHRpbWVvdXQgPiAwKQorCQlycG9ydC0+ZGV2X2xvc3NfdG1vID0gdGltZW91dDsKKwllbHNlCisJCXJwb3J0LT5kZXZfbG9zc190bW8gPSBtcHRmY19kZXZfbG9zc190bW87Cit9CisKK3N0YXRpYyBpbnQKK21wdGZjX0ZjRGV2UGFnZTBfY21wX2Z1bmMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwlGQ0RldmljZVBhZ2UwX3QgKiphYSA9IChGQ0RldmljZVBhZ2UwX3QgKiopYTsKKwlGQ0RldmljZVBhZ2UwX3QgKipiYiA9IChGQ0RldmljZVBhZ2UwX3QgKiopYjsKKworCWlmICgoKmFhKS0+Q3VycmVudEJ1cyA9PSAoKmJiKS0+Q3VycmVudEJ1cykgeworCQlpZiAoKCphYSktPkN1cnJlbnRUYXJnZXRJRCA9PSAoKmJiKS0+Q3VycmVudFRhcmdldElEKQorCQkJcmV0dXJuIDA7CisJCWlmICgoKmFhKS0+Q3VycmVudFRhcmdldElEIDwgKCpiYiktPkN1cnJlbnRUYXJnZXRJRCkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICgoKmFhKS0+Q3VycmVudEJ1cyA8ICgqYmIpLT5DdXJyZW50QnVzKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK21wdGZjX0dldEZjRGV2UGFnZTAoTVBUX0FEQVBURVIgKmlvYywgaW50IGlvY19wb3J0LAorCXZvaWQoKmZ1bmMpKE1QVF9BREFQVEVSICppb2MsaW50IGNoYW5uZWwsIEZDRGV2aWNlUGFnZTBfdCAqYXJnKSkKK3sKKwlDb25maWdQYWdlSGVhZGVyX3QJIGhkcjsKKwlDT05GSUdQQVJNUwkJIGNmZzsKKwlGQ0RldmljZVBhZ2UwX3QJCSpwcGFnZTBfYWxsb2MsICpmYzsKKwlkbWFfYWRkcl90CQkgcGFnZTBfZG1hOworCWludAkJCSBkYXRhX3N6OworCWludAkJCSBpaTsKKworCUZDRGV2aWNlUGFnZTBfdAkJKnAwX2FycmF5PU5VTEwsICpwX3AwOworCUZDRGV2aWNlUGFnZTBfdAkJKipwcDBfYXJyYXk9TlVMTCwgKipwX3BwMDsKKworCWludAkJCSByYyA9IC1FTk9NRU07CisJVTMyCQkJIHBvcnRfaWQgPSAweGZmZmZmZjsKKwlpbnQJCQkgbnVtX3RhcmcgPSAwOworCWludAkJCSBtYXhfYnVzID0gaW9jLT5mYWN0cy5NYXhCdXNlczsKKwlpbnQJCQkgbWF4X3RhcmcgPSBpb2MtPmZhY3RzLk1heERldmljZXM7CisKKwlpZiAobWF4X2J1cyA9PSAwIHx8IG1heF90YXJnID09IDApCisJCWdvdG8gb3V0OworCisJZGF0YV9zeiA9IHNpemVvZihGQ0RldmljZVBhZ2UwX3QpICogbWF4X2J1cyAqIG1heF90YXJnOworCXBfcDAgPSBwMF9hcnJheSA9ICBremFsbG9jKGRhdGFfc3osIEdGUF9LRVJORUwpOworCWlmICghcDBfYXJyYXkpCisJCWdvdG8gb3V0OworCisJZGF0YV9zeiA9IHNpemVvZihGQ0RldmljZVBhZ2UwX3QgKikgKiBtYXhfYnVzICogbWF4X3Rhcmc7CisJcF9wcDAgPSBwcDBfYXJyYXkgPSBremFsbG9jKGRhdGFfc3osIEdGUF9LRVJORUwpOworCWlmICghcHAwX2FycmF5KQorCQlnb3RvIG91dDsKKworCWRvIHsKKwkJLyogR2V0IEZDIERldmljZSBQYWdlIDAgaGVhZGVyICovCisJCWhkci5QYWdlVmVyc2lvbiA9IDA7CisJCWhkci5QYWdlTGVuZ3RoID0gMDsKKwkJaGRyLlBhZ2VOdW1iZXIgPSAwOworCQloZHIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX0ZDX0RFVklDRTsKKwkJY2ZnLmNmZ2hkci5oZHIgPSAmaGRyOworCQljZmcucGh5c0FkZHIgPSAtMTsKKwkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOworCQljZmcuZGlyID0gMDsKKwkJY2ZnLnBhZ2VBZGRyID0gcG9ydF9pZDsKKwkJY2ZnLnRpbWVvdXQgPSAwOworCisJCWlmICgocmMgPSBtcHRfY29uZmlnKGlvYywgJmNmZykpICE9IDApCisJCQlicmVhazsKKworCQlpZiAoaGRyLlBhZ2VMZW5ndGggPD0gMCkKKwkJCWJyZWFrOworCisJCWRhdGFfc3ogPSBoZHIuUGFnZUxlbmd0aCAqIDQ7CisJCXBwYWdlMF9hbGxvYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBkYXRhX3N6LAorCQkgICAgCQkJCQkmcGFnZTBfZG1hKTsKKwkJcmMgPSAtRU5PTUVNOworCQlpZiAoIXBwYWdlMF9hbGxvYykKKwkJCWJyZWFrOworCisJCWNmZy5waHlzQWRkciA9IHBhZ2UwX2RtYTsKKwkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9DVVJSRU5UOworCisJCWlmICgocmMgPSBtcHRfY29uZmlnKGlvYywgJmNmZykpID09IDApIHsKKwkJCXBwYWdlMF9hbGxvYy0+UG9ydElkZW50aWZpZXIgPQorCQkJCWxlMzJfdG9fY3B1KHBwYWdlMF9hbGxvYy0+UG9ydElkZW50aWZpZXIpOworCisJCQlwcGFnZTBfYWxsb2MtPldXTk4uTG93ID0KKwkJCQlsZTMyX3RvX2NwdShwcGFnZTBfYWxsb2MtPldXTk4uTG93KTsKKworCQkJcHBhZ2UwX2FsbG9jLT5XV05OLkhpZ2ggPQorCQkJCWxlMzJfdG9fY3B1KHBwYWdlMF9hbGxvYy0+V1dOTi5IaWdoKTsKKworCQkJcHBhZ2UwX2FsbG9jLT5XV1BOLkxvdyA9CisJCQkJbGUzMl90b19jcHUocHBhZ2UwX2FsbG9jLT5XV1BOLkxvdyk7CisKKwkJCXBwYWdlMF9hbGxvYy0+V1dQTi5IaWdoID0KKwkJCQlsZTMyX3RvX2NwdShwcGFnZTBfYWxsb2MtPldXUE4uSGlnaCk7CisKKwkJCXBwYWdlMF9hbGxvYy0+QkJDcmVkaXQgPQorCQkJCWxlMTZfdG9fY3B1KHBwYWdlMF9hbGxvYy0+QkJDcmVkaXQpOworCisJCQlwcGFnZTBfYWxsb2MtPk1heFJ4RnJhbWVTaXplID0KKwkJCQlsZTE2X3RvX2NwdShwcGFnZTBfYWxsb2MtPk1heFJ4RnJhbWVTaXplKTsKKworCQkJcG9ydF9pZCA9IHBwYWdlMF9hbGxvYy0+UG9ydElkZW50aWZpZXI7CisJCQludW1fdGFyZysrOworCQkJKnBfcDAgPSAqcHBhZ2UwX2FsbG9jOwkvKiBzYXZlIGRhdGEgKi8KKwkJCSpwX3BwMCsrID0gcF9wMCsrOwkvKiBzYXZlIGFkZHIgKi8KKwkJfQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBkYXRhX3N6LAorCQkgICAgCQkJKHU4ICopIHBwYWdlMF9hbGxvYywgcGFnZTBfZG1hKTsKKwkJaWYgKHJjICE9IDApCisJCQlicmVhazsKKworCX0gd2hpbGUgKHBvcnRfaWQgPD0gMHhmZjAwMDApOworCisJaWYgKG51bV90YXJnKSB7CisJCS8qIHNvcnQgYXJyYXkgKi8KKwkJaWYgKG51bV90YXJnID4gMSkKKwkJCXNvcnQgKHBwMF9hcnJheSwgbnVtX3RhcmcsIHNpemVvZihGQ0RldmljZVBhZ2UwX3QgKiksCisJCQkJbXB0ZmNfRmNEZXZQYWdlMF9jbXBfZnVuYywgTlVMTCk7CisJCS8qIGNhbGwgY2FsbGVyJ3MgZnVuYyBmb3IgZWFjaCB0YXJnICovCisJCWZvciAoaWkgPSAwOyBpaSA8IG51bV90YXJnOyAgaWkrKykgeworCQkJZmMgPSAqKHBwMF9hcnJheStpaSk7CisJCQlmdW5jKGlvYywgaW9jX3BvcnQsIGZjKTsKKwkJfQorCX0KKworIG91dDoKKwlpZiAocHAwX2FycmF5KQorCQlrZnJlZShwcDBfYXJyYXkpOworCWlmIChwMF9hcnJheSkKKwkJa2ZyZWUocDBfYXJyYXkpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorbXB0ZmNfZ2VuZXJhdGVfcnBvcnRfaWRzKEZDRGV2aWNlUGFnZTBfdCAqcGcwLCBzdHJ1Y3QgZmNfcnBvcnRfaWRlbnRpZmllcnMgKnJpZCkKK3sKKwkvKiBub3QgY3VycmVudGx5IHVzYWJsZSAqLworCWlmIChwZzAtPkZsYWdzICYgKE1QSV9GQ19ERVZJQ0VfUEFHRTBfRkxBR1NfUExPR0lfSU5WQUxJRCB8CisJCQkgIE1QSV9GQ19ERVZJQ0VfUEFHRTBfRkxBR1NfUFJMSV9JTlZBTElEKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCEocGcwLT5GbGFncyAmIE1QSV9GQ19ERVZJQ0VfUEFHRTBfRkxBR1NfVEFSR0VUSURfQlVTX1ZBTElEKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCEocGcwLT5Qcm90b2NvbCAmIE1QSV9GQ19ERVZJQ0VfUEFHRTBfUFJPVF9GQ1BfVEFSR0VUKSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBib2FyZCBkYXRhIHN0cnVjdHVyZSBhbHJlYWR5IG5vcm1hbGl6ZWQgdG8gcGxhdGZvcm0gZW5kaWFubmVzcworCSAqIHNoaWZ0ZWQgdG8gYXZvaWQgdW5hbGlnbmVkIGFjY2VzcyBvbiA2NCBiaXQgYXJjaGl0ZWN0dXJlCisJICovCisJcmlkLT5ub2RlX25hbWUgPSAoKHU2NClwZzAtPldXTk4uSGlnaCkgPDwgMzIgfCAodTY0KXBnMC0+V1dOTi5Mb3c7CisJcmlkLT5wb3J0X25hbWUgPSAoKHU2NClwZzAtPldXUE4uSGlnaCkgPDwgMzIgfCAodTY0KXBnMC0+V1dQTi5Mb3c7CisJcmlkLT5wb3J0X2lkID0gICBwZzAtPlBvcnRJZGVudGlmaWVyOworCXJpZC0+cm9sZXMgPSBGQ19SUE9SVF9ST0xFX1VOS05PV047CisJcmlkLT5yb2xlcyB8PSBGQ19SUE9SVF9ST0xFX0ZDUF9UQVJHRVQ7CisJaWYgKHBnMC0+UHJvdG9jb2wgJiBNUElfRkNfREVWSUNFX1BBR0UwX1BST1RfRkNQX0lOSVRJQVRPUikKKwkJcmlkLT5yb2xlcyB8PSBGQ19SUE9SVF9ST0xFX0ZDUF9JTklUSUFUT1I7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK21wdGZjX3JlZ2lzdGVyX2RldihNUFRfQURBUFRFUiAqaW9jLCBpbnQgY2hhbm5lbCwgRkNEZXZpY2VQYWdlMF90ICpwZzApCit7CisJc3RydWN0IGZjX3Jwb3J0X2lkZW50aWZpZXJzIHJwb3J0X2lkczsKKwlzdHJ1Y3QgZmNfcnBvcnQJCSpycG9ydDsKKwlzdHJ1Y3QgbXB0ZmNfcnBvcnRfaW5mbwkqcmk7CisJaW50CQkJbWF0Y2ggPSAwOworCXU2NAkJCXBvcnRfbmFtZTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCWlmIChtcHRmY19nZW5lcmF0ZV9ycG9ydF9pZHMocGcwLCAmcnBvcnRfaWRzKSA8IDApCisJCXJldHVybjsKKworCS8qIHNjYW4gbGlzdCBsb29raW5nIGZvciBhIG1hdGNoICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+ZmNfcnBvcnRfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmksICZpb2MtPmZjX3Jwb3J0cywgbGlzdCkgeworCQlwb3J0X25hbWUgPSAodTY0KXJpLT5wZzAuV1dQTi5IaWdoIDw8IDMyIHwgKHU2NClyaS0+cGcwLldXUE4uTG93OworCQlpZiAocG9ydF9uYW1lID09IHJwb3J0X2lkcy5wb3J0X25hbWUpIHsJLyogbWF0Y2ggKi8KKwkJCWxpc3RfbW92ZV90YWlsKCZyaS0+bGlzdCwgJmlvYy0+ZmNfcnBvcnRzKTsKKwkJCW1hdGNoID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghbWF0Y2gpIHsJLyogYWxsb2NhdGUgb25lICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+ZmNfcnBvcnRfbG9jaywgZmxhZ3MpOworCQlyaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtcHRmY19ycG9ydF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmkpCisJCQlyZXR1cm47CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmZjX3Jwb3J0X2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmcmktPmxpc3QsICZpb2MtPmZjX3Jwb3J0cyk7CisJfQorCisJcmktPnBnMCA9ICpwZzA7CS8qIGFkZC91cGRhdGUgcGcwIGRhdGEgKi8KKwlyaS0+ZmxhZ3MgJj0gfk1QVF9SUE9SVF9JTkZPX0ZMQUdTX01JU1NJTkc7CisKKwlpZiAoIShyaS0+ZmxhZ3MgJiBNUFRfUlBPUlRfSU5GT19GTEFHU19SRUdJU1RFUkVEKSkgeworCQlyaS0+ZmxhZ3MgfD0gTVBUX1JQT1JUX0lORk9fRkxBR1NfUkVHSVNURVJFRDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5mY19ycG9ydF9sb2NrLCBmbGFncyk7CisJCXJwb3J0ID0gZmNfcmVtb3RlX3BvcnRfYWRkKGlvYy0+c2gsY2hhbm5lbCwgJnJwb3J0X2lkcyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmZjX3Jwb3J0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKHJwb3J0KSB7CisJCQlpZiAoKigoc3RydWN0IG1wdGZjX3Jwb3J0X2luZm8gKiopcnBvcnQtPmRkX2RhdGEpICE9IHJpKSB7CisJCQkJcmktPmZsYWdzICY9IH5NUFRfUlBPUlRfSU5GT19GTEFHU19NQVBQRURfVkRFVjsKKwkJCQlyaS0+dmRldiA9IE5VTEw7CisJCQkJcmktPnJwb3J0ID0gcnBvcnQ7CisJCQkJKigoc3RydWN0IG1wdGZjX3Jwb3J0X2luZm8gKiopcnBvcnQtPmRkX2RhdGEpID0gcmk7CisJCQl9CisJCQlycG9ydC0+ZGV2X2xvc3NfdG1vID0gbXB0ZmNfZGV2X2xvc3NfdG1vOworCQkJLyoKKwkJCSAqIGlmIGFscmVhZHkgbWFwcGVkLCByZW1hcCBoZXJlLiAgSWYgbm90IG1hcHBlZCwKKwkJCSAqIHNsYXZlX2FsbG9jIHdpbGwgYWxsb2NhdGUgdmRldiBhbmQgbWFwCisJCQkgKi8KKwkJCWlmIChyaS0+ZmxhZ3MgJiBNUFRfUlBPUlRfSU5GT19GTEFHU19NQVBQRURfVkRFVikgeworCQkJCXJpLT52ZGV2LT50YXJnZXRfaWQgPSByaS0+cGcwLkN1cnJlbnRUYXJnZXRJRDsKKwkJCQlyaS0+dmRldi0+YnVzX2lkID0gcmktPnBnMC5DdXJyZW50QnVzOworCQkJCXJpLT52ZGV2LT52dGFyZ2V0LT50YXJnZXRfaWQgPSByaS0+dmRldi0+dGFyZ2V0X2lkOworCQkJCXJpLT52ZGV2LT52dGFyZ2V0LT5idXNfaWQgPSByaS0+dmRldi0+YnVzX2lkOworCQkJfQorCQkJI2lmZGVmIE1QVF9ERUJVRworCQkJcHJpbnRrICgibXB0ZmNfcmVnX2Rldi4lZDogJXgsICVsbHggLyAlbGx4LCB0aWQgJWQsICIKKwkJCQkicnBvcnQgdGlkICVkLCB0bW8gJWRcbiIsCisJCQkJCWlvYy0+c2gtPmhvc3Rfbm8sCisJCQkJCXBnMC0+UG9ydElkZW50aWZpZXIsCisJCQkJCXBnMC0+V1dOTiwKKwkJCQkJcGcwLT5XV1BOLAorCQkJCQlwZzAtPkN1cnJlbnRUYXJnZXRJRCwKKwkJCQkJcmktPnJwb3J0LT5zY3NpX3RhcmdldF9pZCwKKwkJCQkJcmktPnJwb3J0LT5kZXZfbG9zc190bW8pOworCQkJI2VuZGlmCisJCX0gZWxzZSB7CisJCQlsaXN0X2RlbCgmcmktPmxpc3QpOworCQkJa2ZyZWUocmkpOworCQkJcmkgPSBOVUxMOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+ZmNfcnBvcnRfbG9jayxmbGFncyk7CisKK30KKworLyoKKyAqCU9TIGVudHJ5IHBvaW50IHRvIGFsbG93IGhvc3QgZHJpdmVyIHRvIGFsbG9jIG1lbW9yeQorICoJZm9yIGVhY2ggc2NzaSBkZXZpY2UuIENhbGxlZCBvbmNlIHBlciBkZXZpY2UgdGhlIGJ1cyBzY2FuLgorICoJUmV0dXJuIG5vbi16ZXJvIGlmIGFsbG9jYXRpb24gZmFpbHMuCisgKglJbml0IG1lbW9yeSBvbmNlIHBlciBMVU4uCisgKi8KK2ludAorbXB0ZmNfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCU1QVF9TQ1NJX0hPU1QJCSpoZDsKKwlWaXJ0VGFyZ2V0CQkqdnRhcmdldDsKKwlWaXJ0RGV2aWNlCQkqdmRldjsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQJKnN0YXJnZXQ7CisJc3RydWN0IGZjX3Jwb3J0CQkqcnBvcnQ7CisJc3RydWN0IG1wdGZjX3Jwb3J0X2luZm8gKnJpOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisKKwlycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc2NzaV90YXJnZXQoc2RldikpOworCisJaWYgKCFycG9ydCB8fCBmY19yZW1vdGVfcG9ydF9jaGtyZWFkeShycG9ydCkpCisJCXJldHVybiAtRU5YSU87CisKKwloZCA9IChNUFRfU0NTSV9IT1NUICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisKKwl2ZGV2ID0ga21hbGxvYyhzaXplb2YoVmlydERldmljZSksIEdGUF9LRVJORUwpOworCWlmICghdmRldikgeworCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJzbGF2ZV9hbGxvYyBrbWFsbG9jKCV6ZCkgRkFJTEVEIVxuIiwKKwkJCQloZC0+aW9jLT5uYW1lLCBzaXplb2YoVmlydERldmljZSkpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHZkZXYsIDAsIHNpemVvZihWaXJ0RGV2aWNlKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGQtPmlvYy0+ZmNfcnBvcnRfbG9jayxmbGFncyk7CisKKwlpZiAoIShyaSA9ICooKHN0cnVjdCBtcHRmY19ycG9ydF9pbmZvICoqKXJwb3J0LT5kZF9kYXRhKSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGQtPmlvYy0+ZmNfcnBvcnRfbG9jayxmbGFncyk7CisJCWtmcmVlKHZkZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzZGV2LT5ob3N0ZGF0YSA9IHZkZXY7CisJc3RhcmdldCA9IHNjc2lfdGFyZ2V0KHNkZXYpOworCXZ0YXJnZXQgPSBzdGFyZ2V0LT5ob3N0ZGF0YTsKKwlpZiAodnRhcmdldC0+bnVtX2x1bnMgPT0gMCkgeworCQl2dGFyZ2V0LT50ZmxhZ3MgPSBNUFRfVEFSR0VUX0ZMQUdTX1FfWUVTIHwKKwkJICAgIAkJICBNUFRfVEFSR0VUX0ZMQUdTX1ZBTElEX0lOUVVJUlk7CisJCWhkLT5UYXJnZXRzW3NkZXYtPmlkXSA9IHZ0YXJnZXQ7CisJfQorCisJdnRhcmdldC0+dGFyZ2V0X2lkID0gdmRldi0+dGFyZ2V0X2lkOworCXZ0YXJnZXQtPmJ1c19pZCA9IHZkZXYtPmJ1c19pZDsKKworCXZkZXYtPnZ0YXJnZXQgPSB2dGFyZ2V0OworCXZkZXYtPmlvY19pZCA9IGhkLT5pb2MtPmlkOworCXZkZXYtPmx1biA9IHNkZXYtPmx1bjsKKwl2ZGV2LT50YXJnZXRfaWQgPSByaS0+cGcwLkN1cnJlbnRUYXJnZXRJRDsKKwl2ZGV2LT5idXNfaWQgPSByaS0+cGcwLkN1cnJlbnRCdXM7CisKKwlyaS0+ZmxhZ3MgfD0gTVBUX1JQT1JUX0lORk9fRkxBR1NfTUFQUEVEX1ZERVY7CisJcmktPnZkZXYgPSB2ZGV2OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGQtPmlvYy0+ZmNfcnBvcnRfbG9jayxmbGFncyk7CisKKwl2dGFyZ2V0LT5udW1fbHVucysrOworCisjaWZkZWYgTVBUX0RFQlVHCisJcHJpbnRrICgibXB0ZmNfc2x2X2FsbG9jLiVkOiBudW1fbHVucyAlZCwgc2Rldi5pZCAlZCwgIgorCSAgICAgICAgIkN1cnJlbnRUYXJnZXRJRCAlZCwgJXggJWxseCAlbGx4XG4iLAorCQkJc2Rldi0+aG9zdC0+aG9zdF9ubywKKwkJCXZ0YXJnZXQtPm51bV9sdW5zLAorCQkJc2Rldi0+aWQsIHJpLT5wZzAuQ3VycmVudFRhcmdldElELAorCQkJcmktPnBnMC5Qb3J0SWRlbnRpZmllciwgcmktPnBnMC5XV1BOLCByaS0+cGcwLldXTk4pOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbXB0ZmNfcWNtZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IGZjX3Jwb3J0CSpycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc2NzaV90YXJnZXQoU0NwbnQtPmRldmljZSkpOworCWludAkJZXJyOworCisJZXJyID0gZmNfcmVtb3RlX3BvcnRfY2hrcmVhZHkocnBvcnQpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCVNDcG50LT5yZXN1bHQgPSBlcnI7CisJCWRvbmUoU0NwbnQpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIG1wdHNjc2loX3FjbWQoU0NwbnQsZG9uZSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHRmY19pbml0X2hvc3RfYXR0cihNUFRfQURBUFRFUiAqaW9jLGludCBwb3J0bnVtKQoreworCXVuc2lnbmVkIGNsYXNzID0gMCwgY29zID0gMDsKKworCS8qIGRvbid0IGtub3cgd2hhdCB0byBkbyBhcyBvbmx5IG9uZSBzY3NpIChmYykgaG9zdCB3YXMgYWxsb2NhdGVkICovCisJaWYgKHBvcnRudW0gIT0gMCkKKwkJcmV0dXJuOworCisJY2xhc3MgPSBpb2MtPmZjX3BvcnRfcGFnZTBbcG9ydG51bV0uU3VwcG9ydGVkU2VydmljZUNsYXNzOworCWlmIChjbGFzcyAmIE1QSV9GQ1BPUlRQQUdFMF9TVVBQT1JUX0NMQVNTXzEpCisJCWNvcyB8PSBGQ19DT1NfQ0xBU1MxOworCWlmIChjbGFzcyAmIE1QSV9GQ1BPUlRQQUdFMF9TVVBQT1JUX0NMQVNTXzIpCisJCWNvcyB8PSBGQ19DT1NfQ0xBU1MyOworCWlmIChjbGFzcyAmIE1QSV9GQ1BPUlRQQUdFMF9TVVBQT1JUX0NMQVNTXzMpCisJCWNvcyB8PSBGQ19DT1NfQ0xBU1MzOworCisJZmNfaG9zdF9ub2RlX25hbWUoaW9jLT5zaCkgPQorCSAgICAJKHU2NClpb2MtPmZjX3BvcnRfcGFnZTBbcG9ydG51bV0uV1dOTi5IaWdoIDw8IDMyCisJCSAgICB8ICh1NjQpaW9jLT5mY19wb3J0X3BhZ2UwW3BvcnRudW1dLldXTk4uTG93OworCisJZmNfaG9zdF9wb3J0X25hbWUoaW9jLT5zaCkgPQorCSAgICAJKHU2NClpb2MtPmZjX3BvcnRfcGFnZTBbcG9ydG51bV0uV1dQTi5IaWdoIDw8IDMyCisJCSAgICB8ICh1NjQpaW9jLT5mY19wb3J0X3BhZ2UwW3BvcnRudW1dLldXUE4uTG93OworCisJZmNfaG9zdF9wb3J0X2lkKGlvYy0+c2gpID0gaW9jLT5mY19wb3J0X3BhZ2UwW3BvcnRudW1dLlBvcnRJZGVudGlmaWVyOworCisJZmNfaG9zdF9zdXBwb3J0ZWRfY2xhc3Nlcyhpb2MtPnNoKSA9IGNvczsKKworCWZjX2hvc3RfdGd0aWRfYmluZF90eXBlKGlvYy0+c2gpID0gRkNfVEdUSURfQklORF9CWV9XV1BOOworfQorCitzdGF0aWMgdm9pZAorbXB0ZmNfcmVzY2FuX2RldmljZXModm9pZCAqYXJnKQoreworCU1QVF9BREFQVEVSCQkqaW9jID0gKE1QVF9BREFQVEVSICopYXJnOworCWludAkJCWlpOworCWludAkJCXdvcmtfdG9fZG87CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJc3RydWN0IG1wdGZjX3Jwb3J0X2luZm8gKnJpOworCisJZG8geworCQkvKiBzdGFydCBieSB0YWdnaW5nIGFsbCBwb3J0cyBhcyBtaXNzaW5nICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmZjX3Jwb3J0X2xvY2ssZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJpLCAmaW9jLT5mY19ycG9ydHMsIGxpc3QpIHsKKwkJCWlmIChyaS0+ZmxhZ3MgJiBNUFRfUlBPUlRfSU5GT19GTEFHU19SRUdJU1RFUkVEKSB7CisJCQkJcmktPmZsYWdzIHw9IE1QVF9SUE9SVF9JTkZPX0ZMQUdTX01JU1NJTkc7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5mY19ycG9ydF9sb2NrLGZsYWdzKTsKKworCQkvKgorCQkgKiBub3cgcmVzY2FuIGRldmljZXMga25vd24gdG8gYWRhcHRlciwKKwkJICogd2lsbCByZXJlZ2lzdGVyIGV4aXN0aW5nIHJwb3J0cworCQkgKi8KKwkJZm9yIChpaT0wOyBpaSA8IGlvYy0+ZmFjdHMuTnVtYmVyT2ZQb3J0czsgaWkrKykgeworCQkJKHZvaWQpIG1wdGJhc2VfR2V0RmNQb3J0UGFnZTAoaW9jLCBpaSk7CisJCQltcHRmY19pbml0X2hvc3RfYXR0cihpb2MsaWkpOwkvKiByZWZyZXNoICovCisJCQltcHRmY19HZXRGY0RldlBhZ2UwKGlvYyxpaSxtcHRmY19yZWdpc3Rlcl9kZXYpOworCQl9CisKKwkJLyogZGVsZXRlIGRldmljZXMgc3RpbGwgbWlzc2luZyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5mY19ycG9ydF9sb2NrLCBmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmksICZpb2MtPmZjX3Jwb3J0cywgbGlzdCkgeworCQkJLyogaWYgbmV3bHkgbWlzc2luZywgZGVsZXRlIGl0ICovCisJCQlpZiAoKHJpLT5mbGFncyAmIChNUFRfUlBPUlRfSU5GT19GTEFHU19SRUdJU1RFUkVEIHwKKwkJCQkJICBNUFRfUlBPUlRfSU5GT19GTEFHU19NSVNTSU5HKSkKKwkJCSAgPT0gKE1QVF9SUE9SVF9JTkZPX0ZMQUdTX1JFR0lTVEVSRUQgfAorCQkJICAgICAgTVBUX1JQT1JUX0lORk9fRkxBR1NfTUlTU0lORykpIHsKKworCQkJCXJpLT5mbGFncyAmPSB+KE1QVF9SUE9SVF9JTkZPX0ZMQUdTX1JFR0lTVEVSRUR8CisJCQkJCSAgICAgICBNUFRfUlBPUlRfSU5GT19GTEFHU19NSVNTSU5HKTsKKwkJCQlmY19yZW1vdGVfcG9ydF9kZWxldGUocmktPnJwb3J0KTsKKwkJCQkvKgorCQkJCSAqIHJlbW90ZSBwb3J0IG5vdCByZWFsbHkgZGVsZXRlZCAnY2F1c2UKKwkJCQkgKiBiaW5kaW5nIGlzIGJ5IFdXUE4gYW5kIGRyaXZlciBvbmx5CisJCQkJICogcmVnaXN0ZXJzIEZDUF9UQVJHRVRzCisJCQkJICovCisJCQkJI2lmZGVmIE1QVF9ERUJVRworCQkJCXByaW50ayAoIm1wdGZjX3Jlc2Nhbi4lZDogJWxseCBkZWxldGVkXG4iLAorCQkJCQlpb2MtPnNoLT5ob3N0X25vLCByaS0+cGcwLldXUE4pOworCQkJCSNlbmRpZgorCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+ZmNfcnBvcnRfbG9jayxmbGFncyk7CisKKwkJLyoKKwkJICogYWxsb3cgbXVsdGlwbGUgcGFzc2VzIGFzIHRhcmdldCBzdGF0ZQorCQkgKiBtaWdodCBoYXZlIGNoYW5nZWQgZHVyaW5nIHNjYW4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmZjX3Jlc2Nhbl93b3JrX2xvY2ssIGZsYWdzKTsKKwkJaWYgKGlvYy0+ZmNfcmVzY2FuX3dvcmtfY291bnQgPiAyKSAJLyogb25seSBuZWVkIG9uZSBtb3JlICovCisJCQlpb2MtPmZjX3Jlc2Nhbl93b3JrX2NvdW50ID0gMjsKKwkJd29ya190b19kbyA9IC0taW9jLT5mY19yZXNjYW5fd29ya19jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5mY19yZXNjYW5fd29ya19sb2NrLCBmbGFncyk7CisJfSB3aGlsZSAod29ya190b19kbyk7Cit9CisKIHN0YXRpYyBpbnQKIG1wdGZjX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CkBAIC0xNDgsMTcgKzYyNCwxNiBAQAogCU1QVF9TQ1NJX0hPU1QJCSpoZDsKIAlNUFRfQURBUFRFUiAJCSppb2M7CiAJdW5zaWduZWQgbG9uZwkJIGZsYWdzOwotCWludAkJCSBzeiwgaWk7CisJaW50CQkJIGlpOwogCWludAkJCSBudW1TR0UgPSAwOwogCWludAkJCSBzY2FsZTsKIAlpbnQJCQkgaW9jX2NhcDsKLQl1OAkJCSptZW07CiAJaW50CQkJZXJyb3I9MDsKIAlpbnQJCQlyOwotCQkKKwogCWlmICgociA9IG1wdF9hdHRhY2gocGRldixpZCkpICE9IDApCiAJCXJldHVybiByOwotCQorCiAJaW9jID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWlvYy0+RG9uZUN0eCA9IG1wdGZjRG9uZUN0eDsKIAlpb2MtPlRhc2tDdHggPSBtcHRmY1Rhc2tDdHg7CkBAIC0xOTQsNyArNjY5LDcgQEAKIAkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQKIAkJCSJTa2lwcGluZyBpb2M9JXAgYmVjYXVzZSBTQ1NJIEluaXRpYXRvciBtb2RlIGlzIE5PVCBlbmFibGVkIVxuIiwKIAkJCWlvYy0+bmFtZSwgaW9jKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXNoID0gc2NzaV9ob3N0X2FsbG9jKCZtcHRmY19kcml2ZXJfdGVtcGxhdGUsIHNpemVvZihNUFRfU0NTSV9IT1NUKSk7CkBAIC0yMDcsNiArNjgyLDggQEAKIAkJZ290byBvdXRfbXB0ZmNfcHJvYmU7CiAgICAgICAgIH0KIAorCUlOSVRfV09SSygmaW9jLT5mY19yZXNjYW5fd29yaywgbXB0ZmNfcmVzY2FuX2RldmljZXMsKHZvaWQgKilpb2MpOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CiAKIAkvKiBBdHRhY2ggdGhlIFNDU0kgSG9zdCB0byB0aGUgSU9DIHN0cnVjdHVyZQpAQCAtMjY4LDM2ICs3NDUsMjcgQEAKIAkvKiBTQ1NJIG5lZWRzIHNjc2lfY21uZCBsb29rdXAgdGFibGUhCiAJICogKHdpdGggc2l6ZSBlcXVhbCB0byByZXFfZGVwdGgqUHRyU3ohKQogCSAqLwotCXN6ID0gaW9jLT5yZXFfZGVwdGggKiBzaXplb2Yodm9pZCAqKTsKLQltZW0gPSBrbWFsbG9jKHN6LCBHRlBfQVRPTUlDKTsKLQlpZiAobWVtID09IE5VTEwpIHsKKwloZC0+U2NzaUxvb2t1cCA9IGtjYWxsb2MoaW9jLT5yZXFfZGVwdGgsIHNpemVvZih2b2lkICopLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWhkLT5TY3NpTG9va3VwKSB7CiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBvdXRfbXB0ZmNfcHJvYmU7CiAJfQogCi0JbWVtc2V0KG1lbSwgMCwgc3opOwotCWhkLT5TY3NpTG9va3VwID0gKHN0cnVjdCBzY3NpX2NtbmQgKiopIG1lbTsKLQotCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNjc2lMb29rdXAgQCAlcCwgc3o9JWRcbiIsCi0JCSBpb2MtPm5hbWUsIGhkLT5TY3NpTG9va3VwLCBzeikpOworCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNjc2lMb29rdXAgQCAlcFxuIiwKKwkJIGlvYy0+bmFtZSwgaGQtPlNjc2lMb29rdXApKTsKIAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRldmljZSBzdHJ1Y3R1cmVzLgogCSAqIEEgbm9uLU51bGwgcG9pbnRlciBhdCBhbiBvZmZzZXQKIAkgKiBpbmRpY2F0ZXMgYSBkZXZpY2UgZXhpc3RzLgogCSAqIG1heF9pZCA9IDEgKyBtYXhpbXVtIGlkIChob3N0cy5oKQogCSAqLwotCXN6ID0gc2gtPm1heF9pZCAqIHNpemVvZih2b2lkICopOwotCW1lbSA9IGttYWxsb2Moc3osIEdGUF9BVE9NSUMpOwotCWlmIChtZW0gPT0gTlVMTCkgeworCWhkLT5UYXJnZXRzID0ga2NhbGxvYyhzaC0+bWF4X2lkLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFoZC0+VGFyZ2V0cykgewogCQllcnJvciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X21wdGZjX3Byb2JlOwogCX0KIAotCW1lbXNldChtZW0sIDAsIHN6KTsKLQloZC0+VGFyZ2V0cyA9IChWaXJ0VGFyZ2V0ICoqKSBtZW07Ci0KLQlkcHJpbnRrKChLRVJOX0lORk8KLQkgICIgIHZkZXYgQCAlcCwgc3o9JWRcbiIsIGhkLT5UYXJnZXRzLCBzeikpOworCWRwcmludGsoKEtFUk5fSU5GTyAiICB2ZGV2IEAgJXBcbiIsIGhkLT5UYXJnZXRzKSk7CiAKIAkvKiBDbGVhciB0aGUgVE0gZmxhZ3MKIAkgKi8KQEAgLTMzMiw2ICs4MDAsNyBAQAogCWhkLT5zY2FuZHZfd2FpdF9kb25lID0gMDsKIAloZC0+bGFzdF9xdWV1ZV9mdWxsID0gMDsKIAorCXNoLT50cmFuc3BvcnR0ID0gbXB0ZmNfdHJhbnNwb3J0X3RlbXBsYXRlOwogCWVycm9yID0gc2NzaV9hZGRfaG9zdCAoc2gsICZpb2MtPnBjaWRldi0+ZGV2KTsKIAlpZihlcnJvcikgewogCQlkcHJpbnRrKChLRVJOX0VSUiBNWU5BTQpAQCAtMzM5LDcgKzgwOCwxMSBAQAogCQlnb3RvIG91dF9tcHRmY19wcm9iZTsKIAl9CiAKLQlzY3NpX3NjYW5faG9zdChzaCk7CisJZm9yIChpaT0wOyBpaSA8IGlvYy0+ZmFjdHMuTnVtYmVyT2ZQb3J0czsgaWkrKykgeworCQltcHRmY19pbml0X2hvc3RfYXR0cihpb2MsaWkpOworCQltcHRmY19HZXRGY0RldlBhZ2UwKGlvYyxpaSxtcHRmY19yZWdpc3Rlcl9kZXYpOworCX0KKwogCXJldHVybiAwOwogCiBvdXRfbXB0ZmNfcHJvYmU6CkBAIC0zNTIsNyArODI1LDcgQEAKIAkubmFtZQkJPSAibXB0ZmMiLAogCS5pZF90YWJsZQk9IG1wdGZjX3BjaV90YWJsZSwKIAkucHJvYmUJCT0gbXB0ZmNfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtcHRzY3NpaF9yZW1vdmUpLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobXB0ZmNfcmVtb3ZlKSwKIAkuc2h1dGRvd24JPSBtcHRzY3NpaF9zaHV0ZG93biwKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZAk9IG1wdHNjc2loX3N1c3BlbmQsCkBAIC0zNzAsOSArODQzLDIwIEBACiBzdGF0aWMgaW50IF9faW5pdAogbXB0ZmNfaW5pdCh2b2lkKQogeworCWludCBlcnJvcjsKIAogCXNob3dfbXB0bW9kX3ZlcihteV9OQU1FLCBteV9WRVJTSU9OKTsKIAorCS8qIHNhbml0eSBjaGVjayBtb2R1bGUgcGFyYW1ldGVyICovCisJaWYgKG1wdGZjX2Rldl9sb3NzX3RtbyA9PSAwKQorCQltcHRmY19kZXZfbG9zc190bW8gPSBNUFRGQ19ERVZfTE9TU19UTU87CisKKwltcHRmY190cmFuc3BvcnRfdGVtcGxhdGUgPQorCQlmY19hdHRhY2hfdHJhbnNwb3J0KCZtcHRmY190cmFuc3BvcnRfZnVuY3Rpb25zKTsKKworCWlmICghbXB0ZmNfdHJhbnNwb3J0X3RlbXBsYXRlKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCW1wdGZjRG9uZUN0eCA9IG1wdF9yZWdpc3RlcihtcHRzY3NpaF9pb19kb25lLCBNUFRGQ19EUklWRVIpOwogCW1wdGZjVGFza0N0eCA9IG1wdF9yZWdpc3RlcihtcHRzY3NpaF90YXNrbWdtdF9jb21wbGV0ZSwgTVBURkNfRFJJVkVSKTsKIAltcHRmY0ludGVybmFsQ3R4ID0gbXB0X3JlZ2lzdGVyKG1wdHNjc2loX3NjYW5kdl9jb21wbGV0ZSwgTVBURkNfRFJJVkVSKTsKQEAgLTM4Nyw3ICs4NzEsMzMgQEAKIAkJICAiOiBSZWdpc3RlcmVkIGZvciBJT0MgcmVzZXQgbm90aWZpY2F0aW9uc1xuIikpOwogCX0KIAotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZtcHRmY19kcml2ZXIpOworCWVycm9yID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbXB0ZmNfZHJpdmVyKTsKKwlpZiAoZXJyb3IpIHsKKwkJZmNfcmVsZWFzZV90cmFuc3BvcnQobXB0ZmNfdHJhbnNwb3J0X3RlbXBsYXRlKTsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0ZmNfcmVtb3ZlIC0gUmVtb3ZlZCBmYyBpbmZyYXN0cnVjdHVyZSBmb3IgZGV2aWNlcworICoJQHBkZXY6IFBvaW50ZXIgdG8gcGNpX2RldiBzdHJ1Y3R1cmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBtcHRmY19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJTVBUX0FEQVBURVIgKmlvYyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbXB0ZmNfcnBvcnRfaW5mbyAqcCwgKm47CisKKwlmY19yZW1vdmVfaG9zdChpb2MtPnNoKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmaW9jLT5mY19ycG9ydHMsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJnAtPmxpc3QpOworCQlrZnJlZShwKTsKKwl9CisKKwltcHRzY3NpaF9yZW1vdmUocGRldik7CiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KQEAgLTQwMCw3ICs5MTAsOCBAQAogbXB0ZmNfZXhpdCh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbXB0ZmNfZHJpdmVyKTsKLQkKKwlmY19yZWxlYXNlX3RyYW5zcG9ydChtcHRmY190cmFuc3BvcnRfdGVtcGxhdGUpOworCiAJbXB0X3Jlc2V0X2RlcmVnaXN0ZXIobXB0ZmNEb25lQ3R4KTsKIAlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0KIAkgICI6IERlcmVnaXN0ZXJlZCBmb3IgSU9DIHJlc2V0IG5vdGlmaWNhdGlvbnNcbiIpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jCmluZGV4IDAxNDA4NWQuLjczZjU5NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYwpAQCAtNDExLDE0ICs0MTEsMTIgQEAKIAkJZ290byBvdXQ7CiAJcHJpdi0+bXB0X3R4ZmlkeF90YWlsID0gLTE7CiAKLQlwcml2LT5TZW5kQ3RsID0ga21hbGxvYyhwcml2LT50eF9tYXhfb3V0ICogc2l6ZW9mKHN0cnVjdCBCdWZmZXJDb250cm9sKSwKKwlwcml2LT5TZW5kQ3RsID0ga2NhbGxvYyhwcml2LT50eF9tYXhfb3V0LCBzaXplb2Yoc3RydWN0IEJ1ZmZlckNvbnRyb2wpLAogCQkJCUdGUF9LRVJORUwpOwogCWlmIChwcml2LT5TZW5kQ3RsID09IE5VTEwpCiAJCWdvdG8gb3V0X21wdF90eGZpZHg7Ci0JZm9yIChpID0gMDsgaSA8IHByaXYtPnR4X21heF9vdXQ7IGkrKykgewotCQltZW1zZXQoJnByaXYtPlNlbmRDdGxbaV0sIDAsIHNpemVvZihzdHJ1Y3QgQnVmZmVyQ29udHJvbCkpOworCWZvciAoaSA9IDA7IGkgPCBwcml2LT50eF9tYXhfb3V0OyBpKyspCiAJCXByaXYtPm1wdF90eGZpZHhbKytwcml2LT5tcHRfdHhmaWR4X3RhaWxdID0gaTsKLQl9CiAKIAlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICJAbG86IEZpbmlzaGVkIGluaXRpYWxpemluZyBTZW5kQ3RsXG4iKSk7CiAKQEAgLTQyOCwxNSArNDI2LDEzIEBACiAJCWdvdG8gb3V0X1NlbmRDdGw7CiAJcHJpdi0+bXB0X3J4ZmlkeF90YWlsID0gLTE7CiAKLQlwcml2LT5SY3ZDdGwgPSBrbWFsbG9jKHByaXYtPm1heF9idWNrZXRzX291dCAqCi0JCQkJCQlzaXplb2Yoc3RydWN0IEJ1ZmZlckNvbnRyb2wpLAorCXByaXYtPlJjdkN0bCA9IGtjYWxsb2MocHJpdi0+bWF4X2J1Y2tldHNfb3V0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgQnVmZmVyQ29udHJvbCksCiAJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKHByaXYtPlJjdkN0bCA9PSBOVUxMKQogCQlnb3RvIG91dF9tcHRfcnhmaWR4OwotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5tYXhfYnVja2V0c19vdXQ7IGkrKykgewotCQltZW1zZXQoJnByaXYtPlJjdkN0bFtpXSwgMCwgc2l6ZW9mKHN0cnVjdCBCdWZmZXJDb250cm9sKSk7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPm1heF9idWNrZXRzX291dDsgaSsrKQogCQlwcml2LT5tcHRfcnhmaWR4WysrcHJpdi0+bXB0X3J4ZmlkeF90YWlsXSA9IGk7Ci0JfQogCiAvKiovCWRscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIi9sbzogdHhmaWR4IGNvbnRhaW5zIC0gIikpOwogLyoqLwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhfbWF4X291dDsgaSsrKQpAQCAtODQ4LDcgKzg0NCw3IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIG1wdF9sYW5fd2FrZV9wb3N0X2J1Y2tldHNfdGFzayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpb3JpdHkpCiAvKgogICogQHByaW9yaXR5OiAwID0gcHV0IGl0IG9uIHRoZSB0aW1lciBxdWV1ZSwgMSA9IHB1dCBpdCBvbiB0aGUgaW1tZWRpYXRlIHF1ZXVlCkBAIC04NzAsNyArODY2LDcgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIG1wdF9sYW5fcmVjZWl2ZV9za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbXB0X2xhbl9wcml2ICpwcml2ID0gZGV2LT5wcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmMKaW5kZXggMTdlOTc1N2UuLjVhMDZkOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYwpAQCAtNSw3ICs1LDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgTFNJIExvZ2ljIENvcnBvcmF0aW9uCiAgKiAgKG1haWx0bzptcHRfbGludXhfZGV2ZWxvcGVyQGxzaWwuY29tKQotICogIENvcHlyaWdodCAoYykgMjAwNSBEZWxsCisgKiAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgRGVsbAogICovCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCiAvKgpAQCAtODYsNiArODYsMjQgQEAKIHN0YXRpYyBpbnQJbXB0c2FzTWdtdEN0eCA9IC0xOwogCiAKK2VudW0gbXB0c2FzX2hvdHBsdWdfYWN0aW9uIHsKKwlNUFRTQVNfQUREX0RFVklDRSwKKwlNUFRTQVNfREVMX0RFVklDRSwKK307CisKK3N0cnVjdCBtcHRzYXNfaG90cGx1Z19ldmVudCB7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJTVBUX0FEQVBURVIJCSppb2M7CisJZW51bSBtcHRzYXNfaG90cGx1Z19hY3Rpb24gZXZlbnRfdHlwZTsKKwl1NjQJCQlzYXNfYWRkcmVzczsKKwl1MzIJCQljaGFubmVsOworCXUzMgkJCWlkOworCXUzMgkJCWRldmljZV9pbmZvOworCXUxNgkJCWhhbmRsZTsKKwl1MTYJCQlwYXJlbnRfaGFuZGxlOworCXU4CQkJcGh5X2lkOworfTsKKwogLyoKICAqIFNBUyB0b3BvbG9neSBzdHJ1Y3R1cmVzCiAgKgpAQCAtOTksOCArMTE3LDggQEAKIAl1OAlwaHlfaWQ7CQkvKiBwaHkgbnVtYmVyIG9mIHBhcmVudCBkZXZpY2UgKi8KIAl1OAlwb3J0X2lkOwkvKiBzYXMgcGh5c2ljYWwgcG9ydCB0aGlzIGRldmljZQogCQkJCSAgIGlzIGFzc29jJ2Qgd2l0aCAqLwotCXU4CXRhcmdldDsJCS8qIGxvZ2ljYWwgdGFyZ2V0IGlkIG9mIHRoaXMgZGV2aWNlICovCi0JdTgJYnVzOwkJLyogbG9naWNhbCBidXMgbnVtYmVyIG9mIHRoaXMgZGV2aWNlICovCisJdTgJaWQ7CQkvKiBsb2dpY2FsIHRhcmdldCBpZCBvZiB0aGlzIGRldmljZSAqLworCXU4CWNoYW5uZWw7CS8qIGxvZ2ljYWwgYnVzIG51bWJlciBvZiB0aGlzIGRldmljZSAqLwogCXU2NAlzYXNfYWRkcmVzczsgICAgLyogV1dOIG9mIHRoaXMgZGV2aWNlLAogCQkJCSAgIFNBVEEgaXMgYXNzaWduZWQgYnkgSEJBLGV4cGFuZGVyICovCiAJdTMyCWRldmljZV9pbmZvOwkvKiBiaXRmaWVsZCBkZXRhaWxlZCBpbmZvIGFib3V0IHRoaXMgZGV2aWNlICovCkBAIC0xMTQsNiArMTMyLDcgQEAKIAl1OAlwcm9ncmFtbWVkX2xpbmtfcmF0ZTsJLyogcHJvZ3JhbW1lZCBtYXgvbWluIHBoeSBsaW5rIHJhdGUgKi8KIAlzdHJ1Y3QgbXB0c2FzX2RldmluZm8gaWRlbnRpZnk7CS8qIHBvaW50IHRvIHBoeSBkZXZpY2UgaW5mbyAqLwogCXN0cnVjdCBtcHRzYXNfZGV2aW5mbyBhdHRhY2hlZDsJLyogcG9pbnQgdG8gYXR0YWNoZWQgZGV2aWNlIGluZm8gKi8KKwlzdHJ1Y3Qgc2FzX3BoeSAqcGh5OwogCXN0cnVjdCBzYXNfcnBoeSAqcnBoeTsKIH07CiAKQEAgLTIzOSwxMyArMjU4LDEyIEBACiAJc3RydWN0IHNjc2lfdGFyZ2V0IAkqc3RhcmdldDsKIAlpbnQgaTsKIAotCXZkZXYgPSBrbWFsbG9jKHNpemVvZihWaXJ0RGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJdmRldiA9IGt6YWxsb2Moc2l6ZW9mKFZpcnREZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZkZXYpIHsKIAkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAic2xhdmVfYWxsb2Mga21hbGxvYyglemQpIEZBSUxFRCFcbiIsCiAJCQkJaGQtPmlvYy0+bmFtZSwgc2l6ZW9mKFZpcnREZXZpY2UpKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldCh2ZGV2LCAwLCBzaXplb2YoVmlydERldmljZSkpOwogCXZkZXYtPmlvY19pZCA9IGhkLT5pb2MtPmlkOwogCXNkZXYtPmhvc3RkYXRhID0gdmRldjsKIAlzdGFyZ2V0ID0gc2NzaV90YXJnZXQoc2Rldik7CkBAIC0yNTYsMTkgKzI3NCwzMiBAQAogCQloZC0+VGFyZ2V0c1tzZGV2LT5pZF0gPSB2dGFyZ2V0OwogCX0KIAorCS8qCisJICBSQUlEIHZvbHVtZXMgcGxhY2VkIGJleW9uZCB0aGUgbGFzdCBleHBlY3RlZCBwb3J0LgorCSovCisJaWYgKHNkZXYtPmNoYW5uZWwgPT0gaGQtPmlvYy0+bnVtX3BvcnRzKSB7CisJCXZkZXYtPnRhcmdldF9pZCA9IHNkZXYtPmlkOworCQl2ZGV2LT5idXNfaWQgPSAwOworCQl2ZGV2LT5sdW4gPSAwOworCQlnb3RvIG91dDsKKwl9CisKIAlycGh5ID0gZGV2X3RvX3JwaHkoc2Rldi0+c2Rldl90YXJnZXQtPmRldi5wYXJlbnQpOworCW11dGV4X2xvY2soJmhkLT5pb2MtPnNhc190b3BvbG9neV9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmaGQtPmlvYy0+c2FzX3RvcG9sb2d5LCBsaXN0KSB7CiAJCWZvciAoaSA9IDA7IGkgPCBwLT5udW1fcGh5czsgaSsrKSB7CiAJCQlpZiAocC0+cGh5X2luZm9baV0uYXR0YWNoZWQuc2FzX2FkZHJlc3MgPT0KIAkJCQkJcnBoeS0+aWRlbnRpZnkuc2FzX2FkZHJlc3MpIHsKIAkJCQl2ZGV2LT50YXJnZXRfaWQgPQotCQkJCQlwLT5waHlfaW5mb1tpXS5hdHRhY2hlZC50YXJnZXQ7Ci0JCQkJdmRldi0+YnVzX2lkID0gcC0+cGh5X2luZm9baV0uYXR0YWNoZWQuYnVzOworCQkJCQlwLT5waHlfaW5mb1tpXS5hdHRhY2hlZC5pZDsKKwkJCQl2ZGV2LT5idXNfaWQgPSBwLT5waHlfaW5mb1tpXS5hdHRhY2hlZC5jaGFubmVsOwogCQkJCXZkZXYtPmx1biA9IHNkZXYtPmx1bjsKKyAJbXV0ZXhfdW5sb2NrKCZoZC0+aW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQl9CiAJfQorCW11dGV4X3VubG9jaygmaGQtPmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKIAogCXByaW50aygiTm8gbWF0Y2hpbmcgU0FTIGRldmljZSBmb3VuZCEhXG4iKTsKIAlrZnJlZSh2ZGV2KTsKQEAgLTI4Miw2ICszMTMsNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQKK21wdHNhc19zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gc2Rldi0+aG9zdDsKKwlNUFRfU0NTSV9IT1NUICpoZCA9IChNUFRfU0NTSV9IT1NUICopaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IHNhc19ycGh5ICpycGh5OworCXN0cnVjdCBtcHRzYXNfcG9ydGluZm8gKnA7CisJaW50IGk7CisKKwkvKgorCSAqIEhhbmRsZSBob3RwbHVnIHJlbW92YWwgY2FzZS4KKwkgKiBXZSBuZWVkIHRvIGNsZWFyIG91dCBhdHRhY2hlZCBkYXRhIHN0cnVjdHVyZS4KKwkgKi8KKwlycGh5ID0gZGV2X3RvX3JwaHkoc2Rldi0+c2Rldl90YXJnZXQtPmRldi5wYXJlbnQpOworCisJbXV0ZXhfbG9jaygmaGQtPmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZoZC0+aW9jLT5zYXNfdG9wb2xvZ3ksIGxpc3QpIHsKKwkJZm9yIChpID0gMDsgaSA8IHAtPm51bV9waHlzOyBpKyspIHsKKwkJCWlmIChwLT5waHlfaW5mb1tpXS5hdHRhY2hlZC5zYXNfYWRkcmVzcyA9PQorCQkJCQlycGh5LT5pZGVudGlmeS5zYXNfYWRkcmVzcykgeworCQkJCW1lbXNldCgmcC0+cGh5X2luZm9baV0uYXR0YWNoZWQsIDAsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgbXB0c2FzX2RldmluZm8pKTsKKwkJCQlwLT5waHlfaW5mb1tpXS5ycGh5ID0gTlVMTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKworIG91dDoKKwltdXRleF91bmxvY2soJmhkLT5pb2MtPnNhc190b3BvbG9neV9tdXRleCk7CisJLyoKKwkgKiBUT0RPOiBJc3N1ZSB0YXJnZXQgcmVzZXQgdG8gZmx1c2ggZmlybXdhcmUgb3V0c3RhbmRpbmcgY29tbWFuZHMuCisJICovCisJbXB0c2NzaWhfc2xhdmVfZGVzdHJveShzZGV2KTsKK30KKwogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbXB0c2FzX2RyaXZlcl90ZW1wbGF0ZSA9IHsKIAkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCiAJLnByb2NfbmFtZQkJCT0gIm1wdHNhcyIsCkBAIC0yOTMsNyArMzYwLDcgQEAKIAkuc2xhdmVfYWxsb2MJCQk9IG1wdHNhc19zbGF2ZV9hbGxvYywKIAkuc2xhdmVfY29uZmlndXJlCQk9IG1wdHNjc2loX3NsYXZlX2NvbmZpZ3VyZSwKIAkudGFyZ2V0X2Rlc3Ryb3kJCQk9IG1wdHNjc2loX3RhcmdldF9kZXN0cm95LAotCS5zbGF2ZV9kZXN0cm95CQkJPSBtcHRzY3NpaF9zbGF2ZV9kZXN0cm95LAorCS5zbGF2ZV9kZXN0cm95CQkJPSBtcHRzYXNfc2xhdmVfZGVzdHJveSwKIAkuY2hhbmdlX3F1ZXVlX2RlcHRoIAkJPSBtcHRzY3NpaF9jaGFuZ2VfcXVldWVfZGVwdGgsCiAJLmVoX2Fib3J0X2hhbmRsZXIJCT0gbXB0c2NzaWhfYWJvcnQsCiAJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gbXB0c2NzaWhfZGV2X3Jlc2V0LApAQCAtMzk5LDcgKzQ2Niw3IEBACiAJaWYgKHBoeS0+aWRlbnRpZnkudGFyZ2V0X3BvcnRfcHJvdG9jb2xzICYgU0FTX1BST1RPQ09MX1NNUCkKIAkJcmV0dXJuIC1FTlhJTzsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlvYy0+c2FzX21nbXQubXV0ZXgpKQorCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmlvYy0+c2FzX21nbXQubXV0ZXgpKQogCQlnb3RvIG91dDsKIAogCW1mID0gbXB0X2dldF9tc2dfZnJhbWUobXB0c2FzTWdtdEN0eCwgaW9jKTsKQEAgLTQ1MCw3ICs1MTcsNyBAQAogCWVycm9yID0gMDsKIAogIG91dF91bmxvY2s6Ci0JdXAoJmlvYy0+c2FzX21nbXQubXV0ZXgpOworCW11dGV4X3VubG9jaygmaW9jLT5zYXNfbWdtdC5tdXRleCk7CiAgb3V0OgogCXJldHVybiBlcnJvcjsKIH0KQEAgLTY0OSw4ICs3MTYsOCBAQAogCWRldmljZV9pbmZvLT5oYW5kbGUgPSBsZTE2X3RvX2NwdShidWZmZXItPkRldkhhbmRsZSk7CiAJZGV2aWNlX2luZm8tPnBoeV9pZCA9IGJ1ZmZlci0+UGh5TnVtOwogCWRldmljZV9pbmZvLT5wb3J0X2lkID0gYnVmZmVyLT5QaHlzaWNhbFBvcnQ7Ci0JZGV2aWNlX2luZm8tPnRhcmdldCA9IGJ1ZmZlci0+VGFyZ2V0SUQ7Ci0JZGV2aWNlX2luZm8tPmJ1cyA9IGJ1ZmZlci0+QnVzOworCWRldmljZV9pbmZvLT5pZCA9IGJ1ZmZlci0+VGFyZ2V0SUQ7CisJZGV2aWNlX2luZm8tPmNoYW5uZWwgPSBidWZmZXItPkJ1czsKIAltZW1jcHkoJnNhc19hZGRyZXNzLCAmYnVmZmVyLT5TQVNBZGRyZXNzLCBzaXplb2YoX19sZTY0KSk7CiAJZGV2aWNlX2luZm8tPnNhc19hZGRyZXNzID0gbGU2NF90b19jcHUoc2FzX2FkZHJlc3MpOwogCWRldmljZV9pbmZvLT5kZXZpY2VfaW5mbyA9CkBAIC04NTgsMzYgKzkyNSwzNiBAQAogc3RhdGljIGludCBtcHRzYXNfcHJvYmVfb25lX3BoeShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBtcHRzYXNfcGh5aW5mbyAqcGh5X2luZm8sIGludCBpbmRleCwgaW50IGxvY2FsKQogewotCXN0cnVjdCBzYXNfcGh5ICpwb3J0OworCXN0cnVjdCBzYXNfcGh5ICpwaHk7CiAJaW50IGVycm9yOwogCi0JcG9ydCA9IHNhc19waHlfYWxsb2MoZGV2LCBpbmRleCk7Ci0JaWYgKCFwb3J0KQorCXBoeSA9IHNhc19waHlfYWxsb2MoZGV2LCBpbmRleCk7CisJaWYgKCFwaHkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcG9ydC0+cG9ydF9pZGVudGlmaWVyID0gcGh5X2luZm8tPnBvcnRfaWQ7Ci0JbXB0c2FzX3BhcnNlX2RldmljZV9pbmZvKCZwb3J0LT5pZGVudGlmeSwgJnBoeV9pbmZvLT5pZGVudGlmeSk7CisJcGh5LT5wb3J0X2lkZW50aWZpZXIgPSBwaHlfaW5mby0+cG9ydF9pZDsKKwltcHRzYXNfcGFyc2VfZGV2aWNlX2luZm8oJnBoeS0+aWRlbnRpZnksICZwaHlfaW5mby0+aWRlbnRpZnkpOwogCiAJLyoKIAkgKiBTZXQgTmVnb3RpYXRlZCBsaW5rIHJhdGUuCiAJICovCiAJc3dpdGNoIChwaHlfaW5mby0+bmVnb3RpYXRlZF9saW5rX3JhdGUpIHsKIAljYXNlIE1QSV9TQVNfSU9VTklUMF9SQVRFX1BIWV9ESVNBQkxFRDoKLQkJcG9ydC0+bmVnb3RpYXRlZF9saW5rcmF0ZSA9IFNBU19QSFlfRElTQUJMRUQ7CisJCXBoeS0+bmVnb3RpYXRlZF9saW5rcmF0ZSA9IFNBU19QSFlfRElTQUJMRUQ7CiAJCWJyZWFrOwogCWNhc2UgTVBJX1NBU19JT1VOSVQwX1JBVEVfRkFJTEVEX1NQRUVEX05FR09USUFUSU9OOgotCQlwb3J0LT5uZWdvdGlhdGVkX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV9GQUlMRUQ7CisJCXBoeS0+bmVnb3RpYXRlZF9saW5rcmF0ZSA9IFNBU19MSU5LX1JBVEVfRkFJTEVEOwogCQlicmVhazsKIAljYXNlIE1QSV9TQVNfSU9VTklUMF9SQVRFXzFfNToKLQkJcG9ydC0+bmVnb3RpYXRlZF9saW5rcmF0ZSA9IFNBU19MSU5LX1JBVEVfMV81X0dCUFM7CisJCXBoeS0+bmVnb3RpYXRlZF9saW5rcmF0ZSA9IFNBU19MSU5LX1JBVEVfMV81X0dCUFM7CiAJCWJyZWFrOwogCWNhc2UgTVBJX1NBU19JT1VOSVQwX1JBVEVfM18wOgotCQlwb3J0LT5uZWdvdGlhdGVkX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8zXzBfR0JQUzsKKwkJcGh5LT5uZWdvdGlhdGVkX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8zXzBfR0JQUzsKIAkJYnJlYWs7CiAJY2FzZSBNUElfU0FTX0lPVU5JVDBfUkFURV9TQVRBX09PQl9DT01QTEVURToKIAljYXNlIE1QSV9TQVNfSU9VTklUMF9SQVRFX1VOS05PV046CiAJZGVmYXVsdDoKLQkJcG9ydC0+bmVnb3RpYXRlZF9saW5rcmF0ZSA9IFNBU19MSU5LX1JBVEVfVU5LTk9XTjsKKwkJcGh5LT5uZWdvdGlhdGVkX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV9VTktOT1dOOwogCQlicmVhazsKIAl9CiAKQEAgLTg5NiwxMCArOTYzLDEwIEBACiAJICovCiAJc3dpdGNoIChwaHlfaW5mby0+aHdfbGlua19yYXRlICYgTVBJX1NBU19QSFkwX1BSQVRFX01BWF9SQVRFX01BU0spIHsKIAljYXNlIE1QSV9TQVNfUEhZMF9IV1JBVEVfTUFYX1JBVEVfMV81OgotCQlwb3J0LT5tYXhpbXVtX2xpbmtyYXRlX2h3ID0gU0FTX0xJTktfUkFURV8xXzVfR0JQUzsKKwkJcGh5LT5tYXhpbXVtX2xpbmtyYXRlX2h3ID0gU0FTX0xJTktfUkFURV8xXzVfR0JQUzsKIAkJYnJlYWs7CiAJY2FzZSBNUElfU0FTX1BIWTBfUFJBVEVfTUFYX1JBVEVfM18wOgotCQlwb3J0LT5tYXhpbXVtX2xpbmtyYXRlX2h3ID0gU0FTX0xJTktfUkFURV8zXzBfR0JQUzsKKwkJcGh5LT5tYXhpbXVtX2xpbmtyYXRlX2h3ID0gU0FTX0xJTktfUkFURV8zXzBfR0JQUzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC05MTEsMTAgKzk3OCwxMCBAQAogCXN3aXRjaCAocGh5X2luZm8tPnByb2dyYW1tZWRfbGlua19yYXRlICYKIAkJCU1QSV9TQVNfUEhZMF9QUkFURV9NQVhfUkFURV9NQVNLKSB7CiAJY2FzZSBNUElfU0FTX1BIWTBfUFJBVEVfTUFYX1JBVEVfMV81OgotCQlwb3J0LT5tYXhpbXVtX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8xXzVfR0JQUzsKKwkJcGh5LT5tYXhpbXVtX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8xXzVfR0JQUzsKIAkJYnJlYWs7CiAJY2FzZSBNUElfU0FTX1BIWTBfUFJBVEVfTUFYX1JBVEVfM18wOgotCQlwb3J0LT5tYXhpbXVtX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8zXzBfR0JQUzsKKwkJcGh5LT5tYXhpbXVtX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8zXzBfR0JQUzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC05MjUsMTAgKzk5MiwxMCBAQAogCSAqLwogCXN3aXRjaCAocGh5X2luZm8tPmh3X2xpbmtfcmF0ZSAmIE1QSV9TQVNfUEhZMF9IV1JBVEVfTUlOX1JBVEVfTUFTSykgewogCWNhc2UgTVBJX1NBU19QSFkwX0hXUkFURV9NSU5fUkFURV8xXzU6Ci0JCXBvcnQtPm1pbmltdW1fbGlua3JhdGVfaHcgPSBTQVNfTElOS19SQVRFXzFfNV9HQlBTOworCQlwaHktPm1pbmltdW1fbGlua3JhdGVfaHcgPSBTQVNfTElOS19SQVRFXzFfNV9HQlBTOwogCQlicmVhazsKIAljYXNlIE1QSV9TQVNfUEhZMF9QUkFURV9NSU5fUkFURV8zXzA6Ci0JCXBvcnQtPm1pbmltdW1fbGlua3JhdGVfaHcgPSBTQVNfTElOS19SQVRFXzNfMF9HQlBTOworCQlwaHktPm1pbmltdW1fbGlua3JhdGVfaHcgPSBTQVNfTElOS19SQVRFXzNfMF9HQlBTOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTk0MCwyOCArMTAwNywyOSBAQAogCXN3aXRjaCAocGh5X2luZm8tPnByb2dyYW1tZWRfbGlua19yYXRlICYKIAkJCU1QSV9TQVNfUEhZMF9QUkFURV9NSU5fUkFURV9NQVNLKSB7CiAJY2FzZSBNUElfU0FTX1BIWTBfUFJBVEVfTUlOX1JBVEVfMV81OgotCQlwb3J0LT5taW5pbXVtX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8xXzVfR0JQUzsKKwkJcGh5LT5taW5pbXVtX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8xXzVfR0JQUzsKIAkJYnJlYWs7CiAJY2FzZSBNUElfU0FTX1BIWTBfUFJBVEVfTUlOX1JBVEVfM18wOgotCQlwb3J0LT5taW5pbXVtX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8zXzBfR0JQUzsKKwkJcGh5LT5taW5pbXVtX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8zXzBfR0JQUzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCiAJaWYgKGxvY2FsKQotCQlwb3J0LT5sb2NhbF9hdHRhY2hlZCA9IDE7CisJCXBoeS0+bG9jYWxfYXR0YWNoZWQgPSAxOwogCi0JZXJyb3IgPSBzYXNfcGh5X2FkZChwb3J0KTsKKwllcnJvciA9IHNhc19waHlfYWRkKHBoeSk7CiAJaWYgKGVycm9yKSB7Ci0JCXNhc19waHlfZnJlZShwb3J0KTsKKwkJc2FzX3BoeV9mcmVlKHBoeSk7CiAJCXJldHVybiBlcnJvcjsKIAl9CisJcGh5X2luZm8tPnBoeSA9IHBoeTsKIAogCWlmIChwaHlfaW5mby0+YXR0YWNoZWQuaGFuZGxlKSB7CiAJCXN0cnVjdCBzYXNfcnBoeSAqcnBoeTsKIAotCQlycGh5ID0gc2FzX3JwaHlfYWxsb2MocG9ydCk7CisJCXJwaHkgPSBzYXNfcnBoeV9hbGxvYyhwaHkpOwogCQlpZiAoIXJwaHkpCiAJCQlyZXR1cm4gMDsgLyogbm9uLWZhdGFsOiBhbiBycGh5IGNhbiBiZSBhZGRlZCBsYXRlciAqLwogCkBAIC05ODUsMTYgKzEwNTMsMTkgQEAKIAl1MzIgaGFuZGxlID0gMHhGRkZGOwogCWludCBlcnJvciA9IC1FTk9NRU0sIGk7CiAKLQlwb3J0X2luZm8gPSBrbWFsbG9jKHNpemVvZigqcG9ydF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJcG9ydF9pbmZvID0ga3phbGxvYyhzaXplb2YoKnBvcnRfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydF9pbmZvKQogCQlnb3RvIG91dDsKLQltZW1zZXQocG9ydF9pbmZvLCAwLCBzaXplb2YoKnBvcnRfaW5mbykpOwogCiAJZXJyb3IgPSBtcHRzYXNfc2FzX2lvX3VuaXRfcGcwKGlvYywgcG9ydF9pbmZvKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2ZyZWVfcG9ydF9pbmZvOwogCisJaW9jLT5udW1fcG9ydHMgPSBwb3J0X2luZm8tPm51bV9waHlzOworCW11dGV4X2xvY2soJmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKIAlsaXN0X2FkZF90YWlsKCZwb3J0X2luZm8tPmxpc3QsICZpb2MtPnNhc190b3BvbG9neSk7CisJbXV0ZXhfdW5sb2NrKCZpb2MtPnNhc190b3BvbG9neV9tdXRleCk7CisKIAlmb3IgKGkgPSAwOyBpIDwgcG9ydF9pbmZvLT5udW1fcGh5czsgaSsrKSB7CiAJCW1wdHNhc19zYXNfcGh5X3BnMChpb2MsICZwb3J0X2luZm8tPnBoeV9pbmZvW2ldLAogCQkJKE1QSV9TQVNfUEhZX1BHQURfRk9STV9QSFlfTlVNQkVSIDw8CkBAIC0xMDM0LDEwICsxMTA1LDkgQEAKIAlzdHJ1Y3QgbXB0c2FzX3BvcnRpbmZvICpwb3J0X2luZm8sICpwOwogCWludCBlcnJvciA9IC1FTk9NRU0sIGksIGo7CiAKLQlwb3J0X2luZm8gPSBrbWFsbG9jKHNpemVvZigqcG9ydF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJcG9ydF9pbmZvID0ga3phbGxvYyhzaXplb2YoKnBvcnRfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydF9pbmZvKQogCQlnb3RvIG91dDsKLQltZW1zZXQocG9ydF9pbmZvLCAwLCBzaXplb2YoKnBvcnRfaW5mbykpOwogCiAJZXJyb3IgPSBtcHRzYXNfc2FzX2V4cGFuZGVyX3BnMChpb2MsIHBvcnRfaW5mbywKIAkJKE1QSV9TQVNfRVhQQU5EX1BHQURfRk9STV9HRVRfTkVYVF9IQU5ETEUgPDwKQEAgLTEwNDcsNyArMTExNywxMCBAQAogCiAJKmhhbmRsZSA9IHBvcnRfaW5mby0+aGFuZGxlOwogCisJbXV0ZXhfbG9jaygmaW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJnBvcnRfaW5mby0+bGlzdCwgJmlvYy0+c2FzX3RvcG9sb2d5KTsKKwltdXRleF91bmxvY2soJmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKKwogCWZvciAoaSA9IDA7IGkgPCBwb3J0X2luZm8tPm51bV9waHlzOyBpKyspIHsKIAkJc3RydWN0IGRldmljZSAqcGFyZW50OwogCkBAIC0xMDc5LDYgKzExNTIsNyBAQAogCQkgKiBIQkEgcGh5cy4KIAkJICovCiAJCXBhcmVudCA9ICZpb2MtPnNoLT5zaG9zdF9nZW5kZXY7CisJCW11dGV4X2xvY2soJmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmaW9jLT5zYXNfdG9wb2xvZ3ksIGxpc3QpIHsKIAkJCWZvciAoaiA9IDA7IGogPCBwLT5udW1fcGh5czsgaisrKSB7CiAJCQkJaWYgKHBvcnRfaW5mby0+cGh5X2luZm9baV0uaWRlbnRpZnkuaGFuZGxlID09CkBAIC0xMDg2LDYgKzExNjAsNyBAQAogCQkJCQlwYXJlbnQgPSAmcC0+cGh5X2luZm9bal0ucnBoeS0+ZGV2OwogCQkJfQogCQl9CisJCW11dGV4X3VubG9jaygmaW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOwogCiAJCW1wdHNhc19wcm9iZV9vbmVfcGh5KHBhcmVudCwgJnBvcnRfaW5mby0+cGh5X2luZm9baV0sCiAJCQkJICAgICAqaW5kZXgsIDApOwpAQCAtMTExMSw2ICsxMTg2LDIxMSBAQAogCQk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbXB0c2FzX3BoeWluZm8gKgorbXB0c2FzX2ZpbmRfcGh5aW5mb19ieV9wYXJlbnQoTVBUX0FEQVBURVIgKmlvYywgdTE2IHBhcmVudF9oYW5kbGUsIHU4IHBoeV9pZCkKK3sKKwlzdHJ1Y3QgbXB0c2FzX3BvcnRpbmZvICpwb3J0X2luZm87CisJc3RydWN0IG1wdHNhc19kZXZpbmZvIGRldmljZV9pbmZvOworCXN0cnVjdCBtcHRzYXNfcGh5aW5mbyAqcGh5X2luZm8gPSBOVUxMOworCWludCBpLCBlcnJvcjsKKworCS8qCisJICogUmV0cmlldmUgdGhlIHBhcmVudCBzYXNfYWRkcmVzcworCSAqLworCWVycm9yID0gbXB0c2FzX3Nhc19kZXZpY2VfcGcwKGlvYywgJmRldmljZV9pbmZvLAorCQkoTVBJX1NBU19ERVZJQ0VfUEdBRF9GT1JNX0hBTkRMRSA8PAorCQkgTVBJX1NBU19ERVZJQ0VfUEdBRF9GT1JNX1NISUZUKSwKKwkJcGFyZW50X2hhbmRsZSk7CisJaWYgKGVycm9yKSB7CisJCXByaW50aygibXB0c2FzOiBmYWlsZWQgdG8gcmV0cmlldmUgZGV2aWNlIHBhZ2VcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIFRoZSBwaHlfaW5mbyBzdHJ1Y3R1cmVzIGFyZSBuZXZlciBkZWFsbG9jYXRlZCBkdXJpbmcgbGlmZXRpbWUgb2YKKwkgKiBhIGhvc3QsIHNvIHRoZSBjb2RlIGJlbG93IGlzIHNhZmUgd2l0aG91dCBhZGRpdGlvbmFsIHJlZmNvdW50aW5nLgorCSAqLworCW11dGV4X2xvY2soJmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnRfaW5mbywgJmlvYy0+c2FzX3RvcG9sb2d5LCBsaXN0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBwb3J0X2luZm8tPm51bV9waHlzOyBpKyspIHsKKwkJCWlmIChwb3J0X2luZm8tPnBoeV9pbmZvW2ldLmlkZW50aWZ5LnNhc19hZGRyZXNzID09CisJCQkgICAgZGV2aWNlX2luZm8uc2FzX2FkZHJlc3MgJiYKKwkJCSAgICBwb3J0X2luZm8tPnBoeV9pbmZvW2ldLnBoeV9pZCA9PSBwaHlfaWQpIHsKKwkJCQlwaHlfaW5mbyA9ICZwb3J0X2luZm8tPnBoeV9pbmZvW2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCW11dGV4X3VubG9jaygmaW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOworCisJcmV0dXJuIHBoeV9pbmZvOworfQorCitzdGF0aWMgc3RydWN0IG1wdHNhc19waHlpbmZvICoKK21wdHNhc19maW5kX3BoeWluZm9fYnlfaGFuZGxlKE1QVF9BREFQVEVSICppb2MsIHUxNiBoYW5kbGUpCit7CisJc3RydWN0IG1wdHNhc19wb3J0aW5mbyAqcG9ydF9pbmZvOworCXN0cnVjdCBtcHRzYXNfcGh5aW5mbyAqcGh5X2luZm8gPSBOVUxMOworCWludCBpOworCisJLyoKKwkgKiBUaGUgcGh5X2luZm8gc3RydWN0dXJlcyBhcmUgbmV2ZXIgZGVhbGxvY2F0ZWQgZHVyaW5nIGxpZmV0aW1lIG9mCisJICogYSBob3N0LCBzbyB0aGUgY29kZSBiZWxvdyBpcyBzYWZlIHdpdGhvdXQgYWRkaXRpb25hbCByZWZjb3VudGluZy4KKwkgKi8KKwltdXRleF9sb2NrKCZpb2MtPnNhc190b3BvbG9neV9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0X2luZm8sICZpb2MtPnNhc190b3BvbG9neSwgbGlzdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgcG9ydF9pbmZvLT5udW1fcGh5czsgaSsrKSB7CisJCQlpZiAocG9ydF9pbmZvLT5waHlfaW5mb1tpXS5hdHRhY2hlZC5oYW5kbGUgPT0gaGFuZGxlKSB7CisJCQkJcGh5X2luZm8gPSAmcG9ydF9pbmZvLT5waHlfaW5mb1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwltdXRleF91bmxvY2soJmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKKworCXJldHVybiBwaHlfaW5mbzsKK30KKworc3RhdGljIHZvaWQKK21wdHNhc19ob3RwbHVnX3dvcmsodm9pZCAqYXJnKQoreworCXN0cnVjdCBtcHRzYXNfaG90cGx1Z19ldmVudCAqZXYgPSBhcmc7CisJTVBUX0FEQVBURVIgKmlvYyA9IGV2LT5pb2M7CisJc3RydWN0IG1wdHNhc19waHlpbmZvICpwaHlfaW5mbzsKKwlzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHk7CisJY2hhciAqZHMgPSBOVUxMOworCisJaWYgKGV2LT5kZXZpY2VfaW5mbyAmIE1QSV9TQVNfREVWSUNFX0lORk9fU1NQX1RBUkdFVCkKKwkJZHMgPSAic3NwIjsKKwlpZiAoZXYtPmRldmljZV9pbmZvICYgTVBJX1NBU19ERVZJQ0VfSU5GT19TVFBfVEFSR0VUKQorCQlkcyA9ICJzdHAiOworCWlmIChldi0+ZGV2aWNlX2luZm8gJiBNUElfU0FTX0RFVklDRV9JTkZPX1NBVEFfREVWSUNFKQorCQlkcyA9ICJzYXRhIjsKKworCXN3aXRjaCAoZXYtPmV2ZW50X3R5cGUpIHsKKwljYXNlIE1QVFNBU19ERUxfREVWSUNFOgorCQlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVAorCQkgICAgICAgInJlbW92aW5nICVzIGRldmljZSwgY2hhbm5lbCAlZCwgaWQgJWQsIHBoeSAlZFxuIiwKKwkJICAgICAgIGlvYy0+bmFtZSwgZHMsIGV2LT5jaGFubmVsLCBldi0+aWQsIGV2LT5waHlfaWQpOworCisJCXBoeV9pbmZvID0gbXB0c2FzX2ZpbmRfcGh5aW5mb19ieV9oYW5kbGUoaW9jLCBldi0+aGFuZGxlKTsKKwkJaWYgKCFwaHlfaW5mbykgeworCQkJcHJpbnRrKCJtcHRzYXM6IHJlbW92ZSBldmVudCBmb3Igbm9uLWV4aXN0YW50IFBIWS5cbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocGh5X2luZm8tPnJwaHkpIHsKKwkJCXNhc19ycGh5X2RlbGV0ZShwaHlfaW5mby0+cnBoeSk7CisJCQlwaHlfaW5mby0+cnBoeSA9IE5VTEw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNUFRTQVNfQUREX0RFVklDRToKKwkJcHJpbnRrKE1ZSU9DX3NfSU5GT19GTVQKKwkJICAgICAgICJhdHRhY2hpbmcgJXMgZGV2aWNlLCBjaGFubmVsICVkLCBpZCAlZCwgcGh5ICVkXG4iLAorCQkgICAgICAgaW9jLT5uYW1lLCBkcywgZXYtPmNoYW5uZWwsIGV2LT5pZCwgZXYtPnBoeV9pZCk7CisKKwkJcGh5X2luZm8gPSBtcHRzYXNfZmluZF9waHlpbmZvX2J5X3BhcmVudChpb2MsCisJCQkJZXYtPnBhcmVudF9oYW5kbGUsIGV2LT5waHlfaWQpOworCQlpZiAoIXBoeV9pbmZvKSB7CisJCQlwcmludGsoIm1wdHNhczogYWRkIGV2ZW50IGZvciBub24tZXhpc3RhbnQgUEhZLlxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwaHlfaW5mby0+cnBoeSkgeworCQkJcHJpbnRrKCJtcHRzYXM6IHRyeWluZyB0byBhZGQgZXhpc3RpbmcgZGV2aWNlLlxuIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGZpbGwgYXR0YWNoZWQgaW5mbyAqLworCQlwaHlfaW5mby0+YXR0YWNoZWQuaGFuZGxlID0gZXYtPmhhbmRsZTsKKwkJcGh5X2luZm8tPmF0dGFjaGVkLnBoeV9pZCA9IGV2LT5waHlfaWQ7CisJCXBoeV9pbmZvLT5hdHRhY2hlZC5wb3J0X2lkID0gcGh5X2luZm8tPmlkZW50aWZ5LnBvcnRfaWQ7CisJCXBoeV9pbmZvLT5hdHRhY2hlZC5pZCA9IGV2LT5pZDsKKwkJcGh5X2luZm8tPmF0dGFjaGVkLmNoYW5uZWwgPSBldi0+Y2hhbm5lbDsKKwkJcGh5X2luZm8tPmF0dGFjaGVkLnNhc19hZGRyZXNzID0gZXYtPnNhc19hZGRyZXNzOworCQlwaHlfaW5mby0+YXR0YWNoZWQuZGV2aWNlX2luZm8gPSBldi0+ZGV2aWNlX2luZm87CisKKwkJcnBoeSA9IHNhc19ycGh5X2FsbG9jKHBoeV9pbmZvLT5waHkpOworCQlpZiAoIXJwaHkpCisJCQlicmVhazsgLyogbm9uLWZhdGFsOiBhbiBycGh5IGNhbiBiZSBhZGRlZCBsYXRlciAqLworCisJCW1wdHNhc19wYXJzZV9kZXZpY2VfaW5mbygmcnBoeS0+aWRlbnRpZnksICZwaHlfaW5mby0+YXR0YWNoZWQpOworCQlpZiAoc2FzX3JwaHlfYWRkKHJwaHkpKSB7CisJCQlzYXNfcnBoeV9mcmVlKHJwaHkpOworCQkJYnJlYWs7CisJCX0KKworCQlwaHlfaW5mby0+cnBoeSA9IHJwaHk7CisJCWJyZWFrOworCX0KKworCWtmcmVlKGV2KTsKK30KKworc3RhdGljIHZvaWQKK21wdHNjc2loX3NlbmRfc2FzX2V2ZW50KE1QVF9BREFQVEVSICppb2MsCisJCUVWRU5UX0RBVEFfU0FTX0RFVklDRV9TVEFUVVNfQ0hBTkdFICpzYXNfZXZlbnRfZGF0YSkKK3sKKwlzdHJ1Y3QgbXB0c2FzX2hvdHBsdWdfZXZlbnQgKmV2OworCXUzMiBkZXZpY2VfaW5mbyA9IGxlMzJfdG9fY3B1KHNhc19ldmVudF9kYXRhLT5EZXZpY2VJbmZvKTsKKwlfX2xlNjQgc2FzX2FkZHJlc3M7CisKKwlpZiAoKGRldmljZV9pbmZvICYKKwkgICAgIChNUElfU0FTX0RFVklDRV9JTkZPX1NTUF9UQVJHRVQgfAorCSAgICAgIE1QSV9TQVNfREVWSUNFX0lORk9fU1RQX1RBUkdFVCB8CisJICAgICAgTVBJX1NBU19ERVZJQ0VfSU5GT19TQVRBX0RFVklDRSApKSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoKHNhc19ldmVudF9kYXRhLT5SZWFzb25Db2RlICYKKwkgICAgIChNUElfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX0FEREVEIHwKKwkgICAgICBNUElfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX05PVF9SRVNQT05ESU5HKSkgPT0gMCkKKwkJcmV0dXJuOworCisJZXYgPSBrbWFsbG9jKHNpemVvZigqZXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWV2KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1wdHNhczogbG9zdCBob3RwbHVnIGV2ZW50XG4iKTsKKwkJcmV0dXJuOworCX0KKworCisJSU5JVF9XT1JLKCZldi0+d29yaywgbXB0c2FzX2hvdHBsdWdfd29yaywgZXYpOworCWV2LT5pb2MgPSBpb2M7CisJZXYtPmhhbmRsZSA9IGxlMTZfdG9fY3B1KHNhc19ldmVudF9kYXRhLT5EZXZIYW5kbGUpOworCWV2LT5wYXJlbnRfaGFuZGxlID0gbGUxNl90b19jcHUoc2FzX2V2ZW50X2RhdGEtPlBhcmVudERldkhhbmRsZSk7CisJZXYtPmNoYW5uZWwgPSBzYXNfZXZlbnRfZGF0YS0+QnVzOworCWV2LT5pZCA9IHNhc19ldmVudF9kYXRhLT5UYXJnZXRJRDsKKwlldi0+cGh5X2lkID0gc2FzX2V2ZW50X2RhdGEtPlBoeU51bTsKKwltZW1jcHkoJnNhc19hZGRyZXNzLCAmc2FzX2V2ZW50X2RhdGEtPlNBU0FkZHJlc3MsIHNpemVvZihfX2xlNjQpKTsKKwlldi0+c2FzX2FkZHJlc3MgPSBsZTY0X3RvX2NwdShzYXNfYWRkcmVzcyk7CisJZXYtPmRldmljZV9pbmZvID0gZGV2aWNlX2luZm87CisKKwlpZiAoc2FzX2V2ZW50X2RhdGEtPlJlYXNvbkNvZGUgJiBNUElfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX0FEREVEKQorCQlldi0+ZXZlbnRfdHlwZSA9IE1QVFNBU19BRERfREVWSUNFOworCWVsc2UKKwkJZXYtPmV2ZW50X3R5cGUgPSBNUFRTQVNfREVMX0RFVklDRTsKKworCXNjaGVkdWxlX3dvcmsoJmV2LT53b3JrKTsKK30KKworc3RhdGljIGludAorbXB0c2FzX2V2ZW50X3Byb2Nlc3MoTVBUX0FEQVBURVIgKmlvYywgRXZlbnROb3RpZmljYXRpb25SZXBseV90ICpyZXBseSkKK3sKKwl1OCBldmVudCA9IGxlMzJfdG9fY3B1KHJlcGx5LT5FdmVudCkgJiAweEZGOworCisJaWYgKCFpb2MtPnNoKQorCQlyZXR1cm4gMTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE1QSV9FVkVOVF9TQVNfREVWSUNFX1NUQVRVU19DSEFOR0U6CisJCW1wdHNjc2loX3NlbmRfc2FzX2V2ZW50KGlvYywKKwkJCShFVkVOVF9EQVRBX1NBU19ERVZJQ0VfU1RBVFVTX0NIQU5HRSAqKXJlcGx5LT5EYXRhKTsKKwkJcmV0dXJuIDE7CQkvKiBjdXJyZW50bHkgbWVhbnMgbm90aGluZyByZWFsbHkgKi8KKworCWRlZmF1bHQ6CisJCXJldHVybiBtcHRzY3NpaF9ldmVudF9wcm9jZXNzKGlvYywgcmVwbHkpOworCX0KK30KKwogc3RhdGljIGludAogbXB0c2FzX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CkBAIC0xMTE4LDExICsxMzk4LDEwIEBACiAJTVBUX1NDU0lfSE9TVAkJKmhkOwogCU1QVF9BREFQVEVSIAkJKmlvYzsKIAl1bnNpZ25lZCBsb25nCQkgZmxhZ3M7Ci0JaW50CQkJIHN6LCBpaTsKKwlpbnQJCQkgaWk7CiAJaW50CQkJIG51bVNHRSA9IDA7CiAJaW50CQkJIHNjYWxlOwogCWludAkJCSBpb2NfY2FwOwotCXU4CQkJKm1lbTsKIAlpbnQJCQllcnJvcj0wOwogCWludAkJCXI7CiAKQEAgLTEyMDMsNyArMTQ4Miw5IEBACiAJc2gtPnVuaXF1ZV9pZCA9IGlvYy0+aWQ7CiAKIAlJTklUX0xJU1RfSEVBRCgmaW9jLT5zYXNfdG9wb2xvZ3kpOwotCWluaXRfTVVURVgoJmlvYy0+c2FzX21nbXQubXV0ZXgpOworCW11dGV4X2luaXQoJmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKKworCW11dGV4X2luaXQoJmlvYy0+c2FzX21nbXQubXV0ZXgpOwogCWluaXRfY29tcGxldGlvbigmaW9jLT5zYXNfbWdtdC5kb25lKTsKIAogCS8qIFZlcmlmeSB0aGF0IHdlIHdvbid0IGV4Y2VlZCB0aGUgbWF4aW11bQpAQCAtMTI0NCwzNiArMTUyNSwyNyBAQAogCS8qIFNDU0kgbmVlZHMgc2NzaV9jbW5kIGxvb2t1cCB0YWJsZSEKIAkgKiAod2l0aCBzaXplIGVxdWFsIHRvIHJlcV9kZXB0aCpQdHJTeiEpCiAJICovCi0Jc3ogPSBpb2MtPnJlcV9kZXB0aCAqIHNpemVvZih2b2lkICopOwotCW1lbSA9IGttYWxsb2Moc3osIEdGUF9BVE9NSUMpOwotCWlmIChtZW0gPT0gTlVMTCkgeworCWhkLT5TY3NpTG9va3VwID0ga2NhbGxvYyhpb2MtPnJlcV9kZXB0aCwgc2l6ZW9mKHZvaWQgKiksIEdGUF9BVE9NSUMpOworCWlmICghaGQtPlNjc2lMb29rdXApIHsKIAkJZXJyb3IgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9tcHRzYXNfcHJvYmU7CiAJfQogCi0JbWVtc2V0KG1lbSwgMCwgc3opOwotCWhkLT5TY3NpTG9va3VwID0gKHN0cnVjdCBzY3NpX2NtbmQgKiopIG1lbTsKLQotCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNjc2lMb29rdXAgQCAlcCwgc3o9JWRcbiIsCi0JCSBpb2MtPm5hbWUsIGhkLT5TY3NpTG9va3VwLCBzeikpOworCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNjc2lMb29rdXAgQCAlcFxuIiwKKwkJIGlvYy0+bmFtZSwgaGQtPlNjc2lMb29rdXApKTsKIAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRldmljZSBzdHJ1Y3R1cmVzLgogCSAqIEEgbm9uLU51bGwgcG9pbnRlciBhdCBhbiBvZmZzZXQKIAkgKiBpbmRpY2F0ZXMgYSBkZXZpY2UgZXhpc3RzLgogCSAqIG1heF9pZCA9IDEgKyBtYXhpbXVtIGlkIChob3N0cy5oKQogCSAqLwotCXN6ID0gc2gtPm1heF9pZCAqIHNpemVvZih2b2lkICopOwotCW1lbSA9IGttYWxsb2Moc3osIEdGUF9BVE9NSUMpOwotCWlmIChtZW0gPT0gTlVMTCkgeworCWhkLT5UYXJnZXRzID0ga2NhbGxvYyhzaC0+bWF4X2lkLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFoZC0+VGFyZ2V0cykgewogCQllcnJvciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X21wdHNhc19wcm9iZTsKIAl9CiAKLQltZW1zZXQobWVtLCAwLCBzeik7Ci0JaGQtPlRhcmdldHMgPSAoVmlydFRhcmdldCAqKikgbWVtOwotCi0JZHByaW50aygoS0VSTl9JTkZPCi0JICAiICB2dGFyZ2V0IEAgJXAsIHN6PSVkXG4iLCBoZC0+VGFyZ2V0cywgc3opKTsKKwlkcHJpbnRrKChLRVJOX0lORk8gIiAgdnRhcmdldCBAICVwXG4iLCBoZC0+VGFyZ2V0cykpOwogCiAJLyogQ2xlYXIgdGhlIFRNIGZsYWdzCiAJICovCkBAIC0xMzI0LDYgKzE1OTYsMjAgQEAKIAogCW1wdHNhc19zY2FuX3Nhc190b3BvbG9neShpb2MpOwogCisJLyoKKwkgIFJlcG9ydGluZyBSQUlEIHZvbHVtZXMuCisJKi8KKwlpZiAoIWlvYy0+cmFpZF9kYXRhLnBJb2NQZzIpCisJCXJldHVybiAwOworCWlmICghaW9jLT5yYWlkX2RhdGEucElvY1BnMi0+TnVtQWN0aXZlVm9sdW1lcykKKwkJcmV0dXJuIDA7CisJZm9yIChpaT0wO2lpPGlvYy0+cmFpZF9kYXRhLnBJb2NQZzItPk51bUFjdGl2ZVZvbHVtZXM7aWkrKykgeworCQlzY3NpX2FkZF9kZXZpY2Uoc2gsCisJCQlpb2MtPm51bV9wb3J0cywKKwkJCWlvYy0+cmFpZF9kYXRhLnBJb2NQZzItPlJhaWRWb2x1bWVbaWldLlZvbHVtZUlELAorCQkJMCk7CisJfQorCiAJcmV0dXJuIDA7CiAKIG91dF9tcHRzYXNfcHJvYmU6CkBAIC0xMzM5LDEwICsxNjI1LDEyIEBACiAKIAlzYXNfcmVtb3ZlX2hvc3QoaW9jLT5zaCk7CiAKKwltdXRleF9sb2NrKCZpb2MtPnNhc190b3BvbG9neV9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG4sICZpb2MtPnNhc190b3BvbG9neSwgbGlzdCkgewogCQlsaXN0X2RlbCgmcC0+bGlzdCk7CiAJCWtmcmVlKHApOwogCX0KKwltdXRleF91bmxvY2soJmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKIAogCW1wdHNjc2loX3JlbW92ZShwZGV2KTsKIH0KQEAgLTEzOTMsNyArMTY4MSw3IEBACiAJCW1wdF9yZWdpc3RlcihtcHRzY3NpaF9zY2FuZHZfY29tcGxldGUsIE1QVFNBU19EUklWRVIpOwogCW1wdHNhc01nbXRDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2FzX21nbXRfZG9uZSwgTVBUU0FTX0RSSVZFUik7CiAKLQlpZiAobXB0X2V2ZW50X3JlZ2lzdGVyKG1wdHNhc0RvbmVDdHgsIG1wdHNjc2loX2V2ZW50X3Byb2Nlc3MpID09IDApIHsKKwlpZiAobXB0X2V2ZW50X3JlZ2lzdGVyKG1wdHNhc0RvbmVDdHgsIG1wdHNhc19ldmVudF9wcm9jZXNzKSA9PSAwKSB7CiAJCWRldnRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQogCQkgICI6IFJlZ2lzdGVyZWQgZm9yIElPQyBldmVudCBub3RpZmljYXRpb25zXG4iKSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCmluZGV4IDkzYTE2ZmEuLmNkYWM1NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKQEAgLTg5Myw2ICs4OTMsNyBAQAogICoJCXdoZW4gYSBsdW4gaXMgZGlzYWJsZSBieSBtaWQtbGF5ZXIuCiAgKgkJRG8gTk9UIGFjY2VzcyB0aGUgcmVmZXJlbmNlZCBzY3NpX2NtbmQgc3RydWN0dXJlIG9yCiAgKgkJbWVtYmVycy4gV2lsbCBjYXVzZSBlaXRoZXIgYSBwYWdpbmcgb3IgTlVMTCBwdHIgZXJyb3IuCisgKgkJKEJVVCwgQlVULCBCVVQsIHRoZSBjb2RlIGRvZXMgcmVmZXJlbmNlIGl0ISAtIG1kcikKICAqICAgICAgQGhkOiBQb2ludGVyIHRvIGEgU0NTSSBIT1NUIHN0cnVjdHVyZQogICoJQHZkZXZpY2U6IHBlciBkZXZpY2UgcHJpdmF0ZSBkYXRhCiAgKgpAQCAtMjE2MiwxMCArMjE2Myw5IEBACiB7CiAJVmlydFRhcmdldAkJKnZ0YXJnZXQ7CiAKLQl2dGFyZ2V0ID0ga21hbGxvYyhzaXplb2YoVmlydFRhcmdldCksIEdGUF9LRVJORUwpOworCXZ0YXJnZXQgPSBremFsbG9jKHNpemVvZihWaXJ0VGFyZ2V0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2dGFyZ2V0KQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQodnRhcmdldCwgMCwgc2l6ZW9mKFZpcnRUYXJnZXQpKTsKIAlzdGFyZ2V0LT5ob3N0ZGF0YSA9IHZ0YXJnZXQ7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTg1LDE0ICsyMTg1LDEzIEBACiAJVmlydERldmljZQkJKnZkZXY7CiAJc3RydWN0IHNjc2lfdGFyZ2V0IAkqc3RhcmdldDsKIAotCXZkZXYgPSBrbWFsbG9jKHNpemVvZihWaXJ0RGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJdmRldiA9IGt6YWxsb2Moc2l6ZW9mKFZpcnREZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZkZXYpIHsKIAkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAic2xhdmVfYWxsb2Mga21hbGxvYyglemQpIEZBSUxFRCFcbiIsCiAJCQkJaGQtPmlvYy0+bmFtZSwgc2l6ZW9mKFZpcnREZXZpY2UpKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbWVtc2V0KHZkZXYsIDAsIHNpemVvZihWaXJ0RGV2aWNlKSk7CiAJdmRldi0+aW9jX2lkID0gaGQtPmlvYy0+aWQ7CiAJdmRldi0+dGFyZ2V0X2lkID0gc2Rldi0+aWQ7CiAJdmRldi0+YnVzX2lkID0gc2Rldi0+Y2hhbm5lbDsKQEAgLTI1NTksMTMgKzI1NTgsMjUgQEAKIAkJCWhkLT5jbWRQdHIgPSBOVUxMOwogCQl9CiAKLQkJLyogNy4gU2V0IGZsYWcgdG8gZm9yY2UgRFYgYW5kIHJlLXJlYWQgSU9DIFBhZ2UgMworCQkvKiA3LiBTUEk6IFNldCBmbGFnIHRvIGZvcmNlIERWIGFuZCByZS1yZWFkIElPQyBQYWdlIDMKIAkJICovCiAJCWlmIChpb2MtPmJ1c190eXBlID09IFNQSSkgewogCQkJaW9jLT5zcGlfZGF0YS5mb3JjZUR2ID0gTVBUX1NDU0lDRkdfTkVFRF9EViB8IE1QVF9TQ1NJQ0ZHX1JFTE9BRF9JT0NfUEczOwogCQkJZGR2dHByaW50aygoIlNldCByZWxvYWQgSU9DIFBnMyBGbGFnXG4iKSk7CiAJCX0KIAorCQkvKiA3LiBGQzogUmVzY2FuIGZvciBibG9ja2VkIHJwb3J0cyB3aGljaCBtaWdodCBoYXZlIHJldHVybmVkLgorCQkgKi8KKwkJZWxzZSBpZiAoaW9jLT5idXNfdHlwZSA9PSBGQykgeworCQkJaW50IHdvcmtfY291bnQ7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5mY19yZXNjYW5fd29ya19sb2NrLCBmbGFncyk7CisJCQl3b3JrX2NvdW50ID0gKytpb2MtPmZjX3Jlc2Nhbl93b3JrX2NvdW50OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5mY19yZXNjYW5fd29ya19sb2NrLCBmbGFncyk7CisJCQlpZiAod29ya19jb3VudCA9PSAxKQorCQkJCXNjaGVkdWxlX3dvcmsoJmlvYy0+ZmNfcmVzY2FuX3dvcmspOworCQl9CiAJCWR0bXByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiUG9zdC1SZXNldCBjb21wbGV0ZS5cbiIsIGlvYy0+bmFtZSkpOwogCiAJfQpAQCAtMjU4OSw2ICsyNjAwLDggQEAKIHsKIAlNUFRfU0NTSV9IT1NUICpoZDsKIAl1OCBldmVudCA9IGxlMzJfdG9fY3B1KHBFdlJlcGx5LT5FdmVudCkgJiAweEZGOworCWludCB3b3JrX2NvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlkZXZ0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJNUFQgZXZlbnQgKD0lMDJYaCkgcm91dGVkIHRvIFNDU0kgaG9zdCBkcml2ZXIhXG4iLAogCQkJaW9jLT5uYW1lLCBldmVudCkpOwpAQCAtMjYxMCwxMSArMjYyMywxOCBAQAogCQkvKiBGSVhNRSEgKi8KIAkJYnJlYWs7CiAKKwljYXNlIE1QSV9FVkVOVF9SRVNDQU46CQkJCS8qIDA2ICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmZjX3Jlc2Nhbl93b3JrX2xvY2ssIGZsYWdzKTsKKwkJd29ya19jb3VudCA9ICsraW9jLT5mY19yZXNjYW5fd29ya19jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5mY19yZXNjYW5fd29ya19sb2NrLCBmbGFncyk7CisJCWlmICh3b3JrX2NvdW50ID09IDEpCisJCQlzY2hlZHVsZV93b3JrKCZpb2MtPmZjX3Jlc2Nhbl93b3JrKTsKKwkJYnJlYWs7CisKIAkJLyoKIAkJICogIENIRUNLTUUhIERvbid0IHRoaW5rIHdlIG5lZWQgdG8gZG8KIAkJICogIGFueXRoaW5nIGZvciB0aGVzZSwgYnV0Li4uCiAJCSAqLwotCWNhc2UgTVBJX0VWRU5UX1JFU0NBTjoJCQkJLyogMDYgKi8KIAljYXNlIE1QSV9FVkVOVF9MSU5LX1NUQVRVU19DSEFOR0U6CQkvKiAwNyAqLwogCWNhc2UgTVBJX0VWRU5UX0xPT1BfU1RBVEVfQ0hBTkdFOgkJLyogMDggKi8KIAkJLyoKQEAgLTM5NTQsOCArMzk3NCw2IEBACiAKIC8qIFNlYXJjaCBJT0MgcGFnZSAzIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGhpZGRlbiBwaHlzaWNhbCBkaXNrCiAgKi8KLS8qIFNlYXJjaCBJT0MgcGFnZSAzIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGhpZGRlbiBwaHlzaWNhbCBkaXNrCi0gKi8KIHN0YXRpYyBpbnQKIG1wdHNjc2loX2lzX3BoeXNfZGlzayhNUFRfQURBUFRFUiAqaW9jLCBpbnQgaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNwaS5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYwppbmRleCBjZTMzMmE2Li43ZGNlMjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNwaS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMKQEAgLTE1OCwxMSArMTU4LDEwIEBACiAJTVBUX1NDU0lfSE9TVAkJKmhkOwogCU1QVF9BREFQVEVSIAkJKmlvYzsKIAl1bnNpZ25lZCBsb25nCQkgZmxhZ3M7Ci0JaW50CQkJIHN6LCBpaTsKKwlpbnQJCQkgaWk7CiAJaW50CQkJIG51bVNHRSA9IDA7CiAJaW50CQkJIHNjYWxlOwogCWludAkJCSBpb2NfY2FwOwotCXU4CQkJKm1lbTsKIAlpbnQJCQllcnJvcj0wOwogCWludAkJCXI7CiAKQEAgLTI4OCwzNiArMjg3LDI3IEBACiAJLyogU0NTSSBuZWVkcyBzY3NpX2NtbmQgbG9va3VwIHRhYmxlIQogCSAqICh3aXRoIHNpemUgZXF1YWwgdG8gcmVxX2RlcHRoKlB0clN6ISkKIAkgKi8KLQlzeiA9IGlvYy0+cmVxX2RlcHRoICogc2l6ZW9mKHZvaWQgKik7Ci0JbWVtID0ga21hbGxvYyhzeiwgR0ZQX0FUT01JQyk7Ci0JaWYgKG1lbSA9PSBOVUxMKSB7CisJaGQtPlNjc2lMb29rdXAgPSBrY2FsbG9jKGlvYy0+cmVxX2RlcHRoLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFoZC0+U2NzaUxvb2t1cCkgewogCQllcnJvciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X21wdHNwaV9wcm9iZTsKIAl9CiAKLQltZW1zZXQobWVtLCAwLCBzeik7Ci0JaGQtPlNjc2lMb29rdXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKikgbWVtOwotCi0JZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2NzaUxvb2t1cCBAICVwLCBzej0lZFxuIiwKLQkJIGlvYy0+bmFtZSwgaGQtPlNjc2lMb29rdXAsIHN6KSk7CisJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2NzaUxvb2t1cCBAICVwXG4iLAorCQkgaW9jLT5uYW1lLCBoZC0+U2NzaUxvb2t1cCkpOwogCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZGV2aWNlIHN0cnVjdHVyZXMuCiAJICogQSBub24tTnVsbCBwb2ludGVyIGF0IGFuIG9mZnNldAogCSAqIGluZGljYXRlcyBhIGRldmljZSBleGlzdHMuCiAJICogbWF4X2lkID0gMSArIG1heGltdW0gaWQgKGhvc3RzLmgpCiAJICovCi0Jc3ogPSBzaC0+bWF4X2lkICogc2l6ZW9mKHZvaWQgKik7Ci0JbWVtID0ga21hbGxvYyhzeiwgR0ZQX0FUT01JQyk7Ci0JaWYgKG1lbSA9PSBOVUxMKSB7CisJaGQtPlRhcmdldHMgPSBrY2FsbG9jKHNoLT5tYXhfaWQsIHNpemVvZih2b2lkICopLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWhkLT5UYXJnZXRzKSB7CiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBvdXRfbXB0c3BpX3Byb2JlOwogCX0KIAotCW1lbXNldChtZW0sIDAsIHN6KTsKLQloZC0+VGFyZ2V0cyA9IChWaXJ0VGFyZ2V0ICoqKSBtZW07Ci0KLQlkcHJpbnRrKChLRVJOX0lORk8KLQkgICIgIHZkZXYgQCAlcCwgc3o9JWRcbiIsIGhkLT5UYXJnZXRzLCBzeikpOworCWRwcmludGsoKEtFUk5fSU5GTyAiICB2ZGV2IEAgJXBcbiIsIGhkLT5UYXJnZXRzKSk7CiAKIAkvKiBDbGVhciB0aGUgVE0gZmxhZ3MKIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCmluZGV4IGM1YjY1NmMuLmQ2OThkNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYwpAQCAtODgsMTEgKzg4LDYgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCWludCBpOwogCi0JaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgT1NNX0RFU0NSSVBUSU9OKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkZXZpY2UgYWxyZWFkeSBjbGFpbWVkXG4iLCBjLT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogCQkvKiBTa2lwIEkvTyBzcGFjZXMgKi8KIAkJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpICYgSU9SRVNPVVJDRV9JTykpIHsKQEAgLTMxOSw2ICszMTQsMTEgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAorCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIE9TTV9ERVNDUklQVElPTikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMm86IGRldmljZSBhbHJlYWR5IGNsYWltZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTJvOiBubyBzdWl0YWJsZSBETUEgZm91bmQgZm9yICVzXG4iLAogCQkgICAgICAgcGNpX25hbWUocGRldikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbWNwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL21jcC1jb3JlLmMKaW5kZXggNTViYTIzMC4uNzVmNDAxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbWNwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9tY3AtY29yZS5jCkBAIC03Nyw2ICs3Nyw4IEBACiBzdGF0aWMgc3RydWN0IGJ1c190eXBlIG1jcF9idXNfdHlwZSA9IHsKIAkubmFtZQkJPSAibWNwIiwKIAkubWF0Y2gJCT0gbWNwX2J1c19tYXRjaCwKKwkucHJvYmUJCT0gbWNwX2J1c19wcm9iZSwKKwkucmVtb3ZlCQk9IG1jcF9idXNfcmVtb3ZlLAogCS5zdXNwZW5kCT0gbWNwX2J1c19zdXNwZW5kLAogCS5yZXN1bWUJCT0gbWNwX2J1c19yZXN1bWUsCiB9OwpAQCAtMjI3LDggKzIyOSw2IEBACiBpbnQgbWNwX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgbWNwX2RyaXZlciAqbWNwZHJ2KQogewogCW1jcGRydi0+ZHJ2LmJ1cyA9ICZtY3BfYnVzX3R5cGU7Ci0JbWNwZHJ2LT5kcnYucHJvYmUgPSBtY3BfYnVzX3Byb2JlOwotCW1jcGRydi0+ZHJ2LnJlbW92ZSA9IG1jcF9idXNfcmVtb3ZlOwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJm1jcGRydi0+ZHJ2KTsKIH0KIEVYUE9SVF9TWU1CT0wobWNwX2RyaXZlcl9yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYyBiL2RyaXZlcnMvbW1jL21tY19zeXNmcy5jCmluZGV4IGVjNzAxNjYuLmEyYTM1ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL21tY19zeXNmcy5jCisrKyBiL2RyaXZlcnMvbW1jL21tY19zeXNmcy5jCkBAIC0xMzYsMTcgKzEzNiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBidXNfdHlwZSBtbWNfYnVzX3R5cGUgPSB7Ci0JLm5hbWUJCT0gIm1tYyIsCi0JLmRldl9hdHRycwk9IG1tY19kZXZfYXR0cnMsCi0JLm1hdGNoCQk9IG1tY19idXNfbWF0Y2gsCi0JLnVldmVudAkJPSBtbWNfYnVzX3VldmVudCwKLQkuc3VzcGVuZAk9IG1tY19idXNfc3VzcGVuZCwKLQkucmVzdW1lCQk9IG1tY19idXNfcmVzdW1lLAotfTsKLQotCi1zdGF0aWMgaW50IG1tY19kcnZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBtbWNfYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbW1jX2RyaXZlciAqZHJ2ID0gdG9fbW1jX2RyaXZlcihkZXYtPmRyaXZlcik7CiAJc3RydWN0IG1tY19jYXJkICpjYXJkID0gZGV2X3RvX21tY19jYXJkKGRldik7CkBAIC0xNTQsNyArMTQ0LDcgQEAKIAlyZXR1cm4gZHJ2LT5wcm9iZShjYXJkKTsKIH0KIAotc3RhdGljIGludCBtbWNfZHJ2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IG1tY19idXNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbW1jX2RyaXZlciAqZHJ2ID0gdG9fbW1jX2RyaXZlcihkZXYtPmRyaXZlcik7CiAJc3RydWN0IG1tY19jYXJkICpjYXJkID0gZGV2X3RvX21tY19jYXJkKGRldik7CkBAIC0xNjQsNiArMTU0LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgbW1jX2J1c190eXBlID0geworCS5uYW1lCQk9ICJtbWMiLAorCS5kZXZfYXR0cnMJPSBtbWNfZGV2X2F0dHJzLAorCS5tYXRjaAkJPSBtbWNfYnVzX21hdGNoLAorCS51ZXZlbnQJCT0gbW1jX2J1c191ZXZlbnQsCisJLnByb2JlCQk9IG1tY19idXNfcHJvYmUsCisJLnJlbW92ZQkJPSBtbWNfYnVzX3JlbW92ZSwKKwkuc3VzcGVuZAk9IG1tY19idXNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG1tY19idXNfcmVzdW1lLAorfTsKIAogLyoqCiAgKgltbWNfcmVnaXN0ZXJfZHJpdmVyIC0gcmVnaXN0ZXIgYSBtZWRpYSBkcml2ZXIKQEAgLTE3Miw4ICsxNzIsNiBAQAogaW50IG1tY19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG1tY19kcml2ZXIgKmRydikKIHsKIAlkcnYtPmRydi5idXMgPSAmbW1jX2J1c190eXBlOwotCWRydi0+ZHJ2LnByb2JlID0gbW1jX2Rydl9wcm9iZTsKLQlkcnYtPmRydi5yZW1vdmUgPSBtbWNfZHJ2X3JlbW92ZTsKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRydik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZwppbmRleCA5YTJhYTQwLi41MDM4ZTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnCkBAIC00Nyw2ICs0NywyMiBAQAogCSAgYWNjZWxlcmF0b3IuICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgREVDc3RhdGlvbiA1MDAwLzJ4MCBvciBhCiAJICBERUNzeXN0ZW0gNTkwMCBlcXVpcHBlZCB3aXRoIHN1Y2ggYSBtb2R1bGUuCiAKK2NvbmZpZyBNVERfREFUQUZMQVNICisJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIEFUNDV4eHggRGF0YUZsYXNoIgorCWRlcGVuZHMgb24gTVREICYmIFNQSV9NQVNURVIgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byBBVDQ1eHh4IERhdGFGbGFzaCBjaGlwcywgdXNpbmcgU1BJLgorCSAgU29tZXRpbWVzIERhdGFGbGFzaCBjaGlwcyBhcmUgcGFja2FnZWQgaW5zaWRlIE1NQy1mb3JtYXQKKwkgIGNhcmRzOyBhdCB0aGlzIHdyaXRpbmcsIHRoZSBNTUMgc3RhY2sgd29uJ3QgaGFuZGxlIHRob3NlLgorCitjb25maWcgTVREX00yNVA4MAorCXRyaXN0YXRlICJTdXBwb3J0IGZvciBNMjUgU1BJIEZsYXNoIgorCWRlcGVuZHMgb24gTVREICYmIFNQSV9NQVNURVIgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byBTVCBNMjVQODAgYW5kIHNpbWlsYXIgU1BJIGZsYXNoIGNoaXBzLAorCSAgdXNlZCBmb3IgcHJvZ3JhbSBhbmQgZGF0YSBzdG9yYWdlLiAgU2V0IHVwIHlvdXIgc3BpIGRldmljZXMKKwkgIHdpdGggdGhlIHJpZ2h0IGJvYXJkLXNwZWNpZmljIHBsYXRmb3JtIGRhdGEuCisKIGNvbmZpZyBNVERfU0xSQU0KIAl0cmlzdGF0ZSAiVW5jYWNoZWQgc3lzdGVtIFJBTSIKIAlkZXBlbmRzIG9uIE1URApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL2RldmljZXMvTWFrZWZpbGUKaW5kZXggZTM4ZGIzNC4uN2M1ZWQyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlCkBAIC0yMywzICsyMyw1IEBACiBvYmotJChDT05GSUdfTVREX0xBUlQpCQkrPSBsYXJ0Lm8KIG9iai0kKENPTkZJR19NVERfQkxLTVREKQkrPSBibGttdGQubwogb2JqLSQoQ09ORklHX01URF9CTE9DSzJNVEQpCSs9IGJsb2NrMm10ZC5vCitvYmotJChDT05GSUdfTVREX0RBVEFGTEFTSCkJKz0gbXRkX2RhdGFmbGFzaC5vCitvYmotJChDT05GSUdfTVREX00yNVA4MCkJKz0gbTI1cDgwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAwLmMKaW5kZXggYmU1ZTg4Yi4uZTQzNDVjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAwLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAwLmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgYnlwYXNzIHRoZSBpbnRlcm5hbCBwaXBlbGluZS4gRWFjaCBvZiA0IGRlbGF5IGN5Y2xlcyAocmVhZCBmcm9tIHRoZSBOT1AgcmVnaXN0ZXIpIGlzCiAgICByZXF1aXJlZCBhZnRlciB3cml0aW5nIHRvIENEU04gQ29udHJvbCByZWdpc3Rlciwgc2VlIFNvZnR3YXJlIFJlcXVpcmVtZW50IDExLjQgaXRlbSAzLiAqLwogCi1zdGF0aWMgaW5saW5lIGludCBEb0NfQ29tbWFuZChzdHJ1Y3QgRGlza09uQ2hpcCAqZG9jLCB1bnNpZ25lZCBjaGFyIGNvbW1hbmQsCitzdGF0aWMgaW50IERvQ19Db21tYW5kKHN0cnVjdCBEaXNrT25DaGlwICpkb2MsIHVuc2lnbmVkIGNoYXIgY29tbWFuZCwKIAkJCSAgICAgIHVuc2lnbmVkIGNoYXIgeHRyYWZsYWdzKQogewogCXZvaWQgX19pb21lbSAqZG9jcHRyID0gZG9jLT52aXJ0YWRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDEuYwppbmRleCBmY2IyOGE2Li42ODFhOWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDEuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDEuYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAgICB3aXRoIHRoZSBpbnRlcm5hbCBwaXBlbGluZS4gRWFjaCBvZiA0IGRlbGF5IGN5Y2xlcyAocmVhZCBmcm9tIHRoZSBOT1AgcmVnaXN0ZXIpIGlzCiAgICByZXF1aXJlZCBhZnRlciB3cml0aW5nIHRvIENEU04gQ29udHJvbCByZWdpc3Rlciwgc2VlIFNvZnR3YXJlIFJlcXVpcmVtZW50IDExLjQgaXRlbSAzLiAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgRG9DX0NvbW1hbmQodm9pZCBfX2lvbWVtICogZG9jcHRyLCB1bnNpZ25lZCBjaGFyIGNvbW1hbmQsCitzdGF0aWMgdm9pZCBEb0NfQ29tbWFuZCh2b2lkIF9faW9tZW0gKiBkb2NwdHIsIHVuc2lnbmVkIGNoYXIgY29tbWFuZCwKIAkJCSAgICAgICB1bnNpZ25lZCBjaGFyIHh0cmFmbGFncykKIHsKIAkvKiBBc3NlcnQgdGhlIENMRSAoQ29tbWFuZCBMYXRjaCBFbmFibGUpIGxpbmUgdG8gdGhlIGZsYXNoIGNoaXAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMXBsdXMuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMXBsdXMuYwppbmRleCAwNTk1Y2M3Li41ZjU3ZjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDFwbHVzLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxcGx1cy5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIC8qIERvQ19Db21tYW5kOiBTZW5kIGEgZmxhc2ggY29tbWFuZCB0byB0aGUgZmxhc2ggY2hpcCB0aHJvdWdoIHRoZSBGbGFzaAogICogY29tbWFuZCByZWdpc3Rlci4gTmVlZCAyIFdyaXRlIFBpcGVsaW5lIFRlcm1pbmF0ZXMgdG8gY29tcGxldGUgc2VuZC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIERvQ19Db21tYW5kKHZvaWQgX19pb21lbSAqIGRvY3B0ciwgdW5zaWduZWQgY2hhciBjb21tYW5kLAorc3RhdGljIHZvaWQgRG9DX0NvbW1hbmQodm9pZCBfX2lvbWVtICogZG9jcHRyLCB1bnNpZ25lZCBjaGFyIGNvbW1hbmQsCiAJCQkgICAgICAgdW5zaWduZWQgY2hhciB4dHJhZmxhZ3MpCiB7CiAJV3JpdGVET0MoY29tbWFuZCwgZG9jcHRyLCBNcGx1c19GbGFzaENtZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWYyNDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYwpAQCAtMCwwICsxLDU4MiBAQAorLyoKKyAqIE1URCBTUEkgZHJpdmVyIGZvciBTVCBNMjVQeHggZmxhc2ggY2hpcHMKKyAqCisgKiBBdXRob3I6IE1pa2UgTGF2ZW5kZXIsIG1pa2VAc3Rlcm9pZG1pY3Jvcy5jb20KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEludGVjIEF1dG9tYXRpb24gSW5jLgorICoKKyAqIFNvbWUgcGFydHMgYXJlIGJhc2VkIG9uIGxhcnQuYyBieSBBYnJhaGFtIFZhbiBEZXIgTWVyd2UKKyAqCisgKiBDbGVhbmVkIHVwIGFuZCBnZW5lcmFsaXplZCBiYXNlZCBvbiBtdGRfZGF0YWZsYXNoLmMKKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KKworI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworCisvKiBOT1RFOiBBVCAyNUYgYW5kIFNTVCAyNUxGIHNlcmllcyBhcmUgdmVyeSBzaW1pbGFyLAorICogYnV0IGNvbW1hbmRzIGZvciBzZWN0b3IgZXJhc2UgYW5kIGNoaXAgaWQgZGlmZmVyLi4uCisgKi8KKworI2RlZmluZSBGTEFTSF9QQUdFU0laRQkJMjU2CisKKy8qIEZsYXNoIG9wY29kZXMuICovCisjZGVmaW5lCU9QQ09ERV9XUkVOCQk2CS8qIFdyaXRlIGVuYWJsZSAqLworI2RlZmluZQlPUENPREVfUkRTUgkJNQkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlPUENPREVfUkVBRAkJMwkvKiBSZWFkIGRhdGEgYnl0ZXMgKi8KKyNkZWZpbmUJT1BDT0RFX1BQCQkyCS8qIFBhZ2UgcHJvZ3JhbSAqLworI2RlZmluZQlPUENPREVfU0UJCTB4ZDgJLyogU2VjdG9yIGVyYXNlICovCisjZGVmaW5lCU9QQ09ERV9SRVMJCTB4YWIJLyogUmVhZCBFbGVjdHJvbmljIFNpZ25hdHVyZSAqLworI2RlZmluZQlPUENPREVfUkRJRAkJMHg5ZgkvKiBSZWFkIEpFREVDIElEICovCisKKy8qIFN0YXR1cyBSZWdpc3RlciBiaXRzLiAqLworI2RlZmluZQlTUl9XSVAJCQkxCS8qIFdyaXRlIGluIHByb2dyZXNzICovCisjZGVmaW5lCVNSX1dFTAkJCTIJLyogV3JpdGUgZW5hYmxlIGxhdGNoICovCisjZGVmaW5lCVNSX0JQMAkJCTQJLyogQmxvY2sgcHJvdGVjdCAwICovCisjZGVmaW5lCVNSX0JQMQkJCTgJLyogQmxvY2sgcHJvdGVjdCAxICovCisjZGVmaW5lCVNSX0JQMgkJCTB4MTAJLyogQmxvY2sgcHJvdGVjdCAyICovCisjZGVmaW5lCVNSX1NSV0QJCQkweDgwCS8qIFNSIHdyaXRlIHByb3RlY3QgKi8KKworLyogRGVmaW5lIG1heCB0aW1lcyB0byBjaGVjayBzdGF0dXMgcmVnaXN0ZXIgYmVmb3JlIHdlIGdpdmUgdXAuICovCisjZGVmaW5lCU1BWF9SRUFEWV9XQUlUX0NPVU5UCTEwMDAwMAorCisKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKyNkZWZpbmUJbXRkX2hhc19wYXJ0aXRpb25zKCkJKDEpCisjZWxzZQorI2RlZmluZQltdGRfaGFzX3BhcnRpdGlvbnMoKQkoMCkKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IG0yNXAgeworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CisJc3RydWN0IHNlbWFwaG9yZQlsb2NrOworCXN0cnVjdCBtdGRfaW5mbwkJbXRkOworCXVuc2lnbmVkCQlwYXJ0aXRpb25lZDsKKwl1OAkJCWNvbW1hbmRbNF07Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtMjVwICptdGRfdG9fbTI1cChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKG10ZCwgc3RydWN0IG0yNXAsIG10ZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucworICovCisKKy8qCisgKiBSZWFkIHRoZSBzdGF0dXMgcmVnaXN0ZXIsIHJldHVybmluZyBpdHMgdmFsdWUgaW4gdGhlIGxvY2F0aW9uCisgKiBSZXR1cm4gdGhlIHN0YXR1cyByZWdpc3RlciB2YWx1ZS4KKyAqIFJldHVybnMgbmVnYXRpdmUgaWYgZXJyb3Igb2NjdXJyZWQuCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9zcihzdHJ1Y3QgbTI1cCAqZmxhc2gpCit7CisJc3NpemVfdCByZXR2YWw7CisJdTggY29kZSA9IE9QQ09ERV9SRFNSOworCXU4IHZhbDsKKworCXJldHZhbCA9IHNwaV93cml0ZV90aGVuX3JlYWQoZmxhc2gtPnNwaSwgJmNvZGUsIDEsICZ2YWwsIDEpOworCisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2VycigmZmxhc2gtPnNwaS0+ZGV2LCAiZXJyb3IgJWQgcmVhZGluZyBTUlxuIiwKKwkJCQkoaW50KSByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXJldHVybiB2YWw7Cit9CisKKworLyoKKyAqIFNldCB3cml0ZSBlbmFibGUgbGF0Y2ggd2l0aCBXcml0ZSBFbmFibGUgY29tbWFuZC4KKyAqIFJldHVybnMgbmVnYXRpdmUgaWYgZXJyb3Igb2NjdXJyZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHdyaXRlX2VuYWJsZShzdHJ1Y3QgbTI1cCAqZmxhc2gpCit7CisJdTgJY29kZSA9IE9QQ09ERV9XUkVOOworCisJcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQoZmxhc2gtPnNwaSwgJmNvZGUsIDEsIE5VTEwsIDApOworfQorCisKKy8qCisgKiBTZXJ2aWNlIHJvdXRpbmUgdG8gcmVhZCBzdGF0dXMgcmVnaXN0ZXIgdW50aWwgcmVhZHksIG9yIHRpbWVvdXQgb2NjdXJzLgorICogUmV0dXJucyBub24temVybyBpZiBlcnJvci4KKyAqLworc3RhdGljIGludCB3YWl0X3RpbGxfcmVhZHkoc3RydWN0IG0yNXAgKmZsYXNoKQoreworCWludCBjb3VudDsKKwlpbnQgc3I7CisKKwkvKiBvbmUgY2hpcCBndWFyYW50ZWVzIG1heCA1IG1zZWMgd2FpdCBoZXJlIGFmdGVyIHBhZ2Ugd3JpdGVzLAorCSAqIGJ1dCBwb3RlbnRpYWxseSB0aHJlZSBzZWNvbmRzICghKSBhZnRlciBwYWdlIGVyYXNlLgorCSAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE1BWF9SRUFEWV9XQUlUX0NPVU5UOyBjb3VudCsrKSB7CisJCWlmICgoc3IgPSByZWFkX3NyKGZsYXNoKSkgPCAwKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKCEoc3IgJiBTUl9XSVApKQorCQkJcmV0dXJuIDA7CisKKwkJLyogUkVWSVNJVCBzb21ldGltZXMgc2xlZXBpbmcgd291bGQgYmUgYmVzdCAqLworCX0KKworCXJldHVybiAxOworfQorCisKKy8qCisgKiBFcmFzZSBvbmUgc2VjdG9yIG9mIGZsYXNoIG1lbW9yeSBhdCBvZmZzZXQgYGBvZmZzZXQnJyB3aGljaCBpcyBhbnkKKyAqIGFkZHJlc3Mgd2l0aGluIHRoZSBzZWN0b3Igd2hpY2ggc2hvdWxkIGJlIGVyYXNlZC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgbm9uLXplcm8gb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGVyYXNlX3NlY3RvcihzdHJ1Y3QgbTI1cCAqZmxhc2gsIHUzMiBvZmZzZXQpCit7CisJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiAlcyBhdCAweCUwOHhcbiIsIGZsYXNoLT5zcGktPmRldi5idXNfaWQsCisJCQlfX0ZVTkNUSU9OX18sIG9mZnNldCk7CisKKwkvKiBXYWl0IHVudGlsIGZpbmlzaGVkIHByZXZpb3VzIHdyaXRlIGNvbW1hbmQuICovCisJaWYgKHdhaXRfdGlsbF9yZWFkeShmbGFzaCkpCisJCXJldHVybiAxOworCisJLyogU2VuZCB3cml0ZSBlbmFibGUsIHRoZW4gZXJhc2UgY29tbWFuZHMuICovCisJd3JpdGVfZW5hYmxlKGZsYXNoKTsKKworCS8qIFNldCB1cCBjb21tYW5kIGJ1ZmZlci4gKi8KKwlmbGFzaC0+Y29tbWFuZFswXSA9IE9QQ09ERV9TRTsKKwlmbGFzaC0+Y29tbWFuZFsxXSA9IG9mZnNldCA+PiAxNjsKKwlmbGFzaC0+Y29tbWFuZFsyXSA9IG9mZnNldCA+PiA4OworCWZsYXNoLT5jb21tYW5kWzNdID0gb2Zmc2V0OworCisJc3BpX3dyaXRlKGZsYXNoLT5zcGksIGZsYXNoLT5jb21tYW5kLCBzaXplb2YoZmxhc2gtPmNvbW1hbmQpKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE1URCBpbXBsZW1lbnRhdGlvbgorICovCisKKy8qCisgKiBFcmFzZSBhbiBhZGRyZXNzIHJhbmdlIG9uIHRoZSBmbGFzaCBjaGlwLiAgVGhlIGFkZHJlc3MgcmFuZ2UgbWF5IGV4dGVuZAorICogb25lIG9yIG1vcmUgZXJhc2Ugc2VjdG9ycy4gIFJldHVybiBhbiBlcnJvciBpcyB0aGVyZSBpcyBhIHByb2JsZW0gZXJhc2luZy4KKyAqLworc3RhdGljIGludCBtMjVwODBfZXJhc2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKK3sKKwlzdHJ1Y3QgbTI1cCAqZmxhc2ggPSBtdGRfdG9fbTI1cChtdGQpOworCXUzMiBhZGRyLGxlbjsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAorCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19GVU5DVElPTl9fLCAiYXQiLAorCQkJKHUzMilpbnN0ci0+YWRkciwgaW5zdHItPmxlbik7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKGluc3RyLT5hZGRyICsgaW5zdHItPmxlbiA+IGZsYXNoLT5tdGQuc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKChpbnN0ci0+YWRkciAlIG10ZC0+ZXJhc2VzaXplKSAhPSAwCisJCQl8fCAoaW5zdHItPmxlbiAlIG10ZC0+ZXJhc2VzaXplKSAhPSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFkZHIgPSBpbnN0ci0+YWRkcjsKKwlsZW4gPSBpbnN0ci0+bGVuOworCisgIAlkb3duKCZmbGFzaC0+bG9jayk7CisKKwkvKiBub3cgZXJhc2UgdGhvc2Ugc2VjdG9ycyAqLworCXdoaWxlIChsZW4pIHsKKwkJaWYgKGVyYXNlX3NlY3RvcihmbGFzaCwgYWRkcikpIHsKKwkJCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9GQUlMRUQ7CisJCQl1cCgmZmxhc2gtPmxvY2spOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlhZGRyICs9IG10ZC0+ZXJhc2VzaXplOworCQlsZW4gLT0gbXRkLT5lcmFzZXNpemU7CisJfQorCisgIAl1cCgmZmxhc2gtPmxvY2spOworCisJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0RPTkU7CisJbXRkX2VyYXNlX2NhbGxiYWNrKGluc3RyKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBhbiBhZGRyZXNzIHJhbmdlIGZyb20gdGhlIGZsYXNoIGNoaXAuICBUaGUgYWRkcmVzcyByYW5nZQorICogbWF5IGJlIGFueSBzaXplIHByb3ZpZGVkIGl0IGlzIHdpdGhpbiB0aGUgcGh5c2ljYWwgYm91bmRhcmllcy4KKyAqLworc3RhdGljIGludCBtMjVwODBfcmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCisJc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQoreworCXN0cnVjdCBtMjVwICpmbGFzaCA9IG10ZF90b19tMjVwKG10ZCk7CisJc3RydWN0IHNwaV90cmFuc2ZlciB0WzJdOworCXN0cnVjdCBzcGlfbWVzc2FnZSBtOworCisJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiAlcyAlcyAweCUwOHgsIGxlbiAlemRcbiIsCisJCQlmbGFzaC0+c3BpLT5kZXYuYnVzX2lkLCBfX0ZVTkNUSU9OX18sICJmcm9tIiwKKwkJCSh1MzIpZnJvbSwgbGVuKTsKKworCS8qIHNhbml0eSBjaGVja3MgKi8KKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZnJvbSArIGxlbiA+IGZsYXNoLT5tdGQuc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtKTsKKwltZW1zZXQodCwgMCwgKHNpemVvZiB0KSk7CisKKwl0WzBdLnR4X2J1ZiA9IGZsYXNoLT5jb21tYW5kOworCXRbMF0ubGVuID0gc2l6ZW9mKGZsYXNoLT5jb21tYW5kKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdFswXSwgJm0pOworCisJdFsxXS5yeF9idWYgPSBidWY7CisJdFsxXS5sZW4gPSBsZW47CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMV0sICZtKTsKKworCS8qIEJ5dGUgY291bnQgc3RhcnRzIGF0IHplcm8uICovCisJaWYgKHJldGxlbikKKwkJKnJldGxlbiA9IDA7CisKKwlkb3duKCZmbGFzaC0+bG9jayk7CisKKwkvKiBXYWl0IHRpbGwgcHJldmlvdXMgd3JpdGUvZXJhc2UgaXMgZG9uZS4gKi8KKwlpZiAod2FpdF90aWxsX3JlYWR5KGZsYXNoKSkgeworCQkvKiBSRVZJU0lUIHN0YXR1cyByZXR1cm4/PyAqLworCQl1cCgmZmxhc2gtPmxvY2spOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBOT1RFOiAgT1BDT0RFX0ZBU1RfUkVBRCAoaWYgYXZhaWxhYmxlKSBpcyBmYXN0ZXIuLi4gKi8KKworCS8qIFNldCB1cCB0aGUgd3JpdGUgZGF0YSBidWZmZXIuICovCisJZmxhc2gtPmNvbW1hbmRbMF0gPSBPUENPREVfUkVBRDsKKwlmbGFzaC0+Y29tbWFuZFsxXSA9IGZyb20gPj4gMTY7CisJZmxhc2gtPmNvbW1hbmRbMl0gPSBmcm9tID4+IDg7CisJZmxhc2gtPmNvbW1hbmRbM10gPSBmcm9tOworCisJc3BpX3N5bmMoZmxhc2gtPnNwaSwgJm0pOworCisJKnJldGxlbiA9IG0uYWN0dWFsX2xlbmd0aCAtIHNpemVvZihmbGFzaC0+Y29tbWFuZCk7CisKKyAgCXVwKCZmbGFzaC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdyaXRlIGFuIGFkZHJlc3MgcmFuZ2UgdG8gdGhlIGZsYXNoIGNoaXAuICBEYXRhIG11c3QgYmUgd3JpdHRlbiBpbgorICogRkxBU0hfUEFHRVNJWkUgY2h1bmtzLiAgVGhlIGFkZHJlc3MgcmFuZ2UgbWF5IGJlIGFueSBzaXplIHByb3ZpZGVkCisgKiBpdCBpcyB3aXRoaW4gdGhlIHBoeXNpY2FsIGJvdW5kYXJpZXMuCisgKi8KK3N0YXRpYyBpbnQgbTI1cDgwX3dyaXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sCisJc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKQoreworCXN0cnVjdCBtMjVwICpmbGFzaCA9IG10ZF90b19tMjVwKG10ZCk7CisJdTMyIHBhZ2Vfb2Zmc2V0LCBwYWdlX3NpemU7CisJc3RydWN0IHNwaV90cmFuc2ZlciB0WzJdOworCXN0cnVjdCBzcGlfbWVzc2FnZSBtOworCisJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiAlcyAlcyAweCUwOHgsIGxlbiAlemRcbiIsCisJCQlmbGFzaC0+c3BpLT5kZXYuYnVzX2lkLCBfX0ZVTkNUSU9OX18sICJ0byIsCisJCQkodTMyKXRvLCBsZW4pOworCisJaWYgKHJldGxlbikKKwkJKnJldGxlbiA9IDA7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCFsZW4pCisJCXJldHVybigwKTsKKworCWlmICh0byArIGxlbiA+IGZsYXNoLT5tdGQuc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtKTsKKwltZW1zZXQodCwgMCwgKHNpemVvZiB0KSk7CisKKwl0WzBdLnR4X2J1ZiA9IGZsYXNoLT5jb21tYW5kOworCXRbMF0ubGVuID0gc2l6ZW9mKGZsYXNoLT5jb21tYW5kKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdFswXSwgJm0pOworCisJdFsxXS50eF9idWYgPSBidWY7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMV0sICZtKTsKKworICAJZG93bigmZmxhc2gtPmxvY2spOworCisJLyogV2FpdCB1bnRpbCBmaW5pc2hlZCBwcmV2aW91cyB3cml0ZSBjb21tYW5kLiAqLworCWlmICh3YWl0X3RpbGxfcmVhZHkoZmxhc2gpKQorCQlyZXR1cm4gMTsKKworCXdyaXRlX2VuYWJsZShmbGFzaCk7CisKKwkvKiBTZXQgdXAgdGhlIG9wY29kZSBpbiB0aGUgd3JpdGUgYnVmZmVyLiAqLworCWZsYXNoLT5jb21tYW5kWzBdID0gT1BDT0RFX1BQOworCWZsYXNoLT5jb21tYW5kWzFdID0gdG8gPj4gMTY7CisJZmxhc2gtPmNvbW1hbmRbMl0gPSB0byA+PiA4OworCWZsYXNoLT5jb21tYW5kWzNdID0gdG87CisKKwkvKiB3aGF0IHBhZ2UgZG8gd2Ugc3RhcnQgd2l0aD8gKi8KKwlwYWdlX29mZnNldCA9IHRvICUgRkxBU0hfUEFHRVNJWkU7CisKKwkvKiBkbyBhbGwgdGhlIGJ5dGVzIGZpdCBvbnRvIG9uZSBwYWdlPyAqLworCWlmIChwYWdlX29mZnNldCArIGxlbiA8PSBGTEFTSF9QQUdFU0laRSkgeworCQl0WzFdLmxlbiA9IGxlbjsKKworCQlzcGlfc3luYyhmbGFzaC0+c3BpLCAmbSk7CisKKwkJKnJldGxlbiA9IG0uYWN0dWFsX2xlbmd0aCAtIHNpemVvZihmbGFzaC0+Y29tbWFuZCk7CisJfSBlbHNlIHsKKwkJdTMyIGk7CisKKwkJLyogdGhlIHNpemUgb2YgZGF0YSByZW1haW5pbmcgb24gdGhlIGZpcnN0IHBhZ2UgKi8KKwkJcGFnZV9zaXplID0gRkxBU0hfUEFHRVNJWkUgLSBwYWdlX29mZnNldDsKKworCQl0WzFdLmxlbiA9IHBhZ2Vfc2l6ZTsKKwkJc3BpX3N5bmMoZmxhc2gtPnNwaSwgJm0pOworCisJCSpyZXRsZW4gPSBtLmFjdHVhbF9sZW5ndGggLSBzaXplb2YoZmxhc2gtPmNvbW1hbmQpOworCisJCS8qIHdyaXRlIGV2ZXJ5dGhpbmcgaW4gUEFHRVNJWkUgY2h1bmtzICovCisJCWZvciAoaSA9IHBhZ2Vfc2l6ZTsgaSA8IGxlbjsgaSArPSBwYWdlX3NpemUpIHsKKwkJCXBhZ2Vfc2l6ZSA9IGxlbiAtIGk7CisJCQlpZiAocGFnZV9zaXplID4gRkxBU0hfUEFHRVNJWkUpCisJCQkJcGFnZV9zaXplID0gRkxBU0hfUEFHRVNJWkU7CisKKwkJCS8qIHdyaXRlIHRoZSBuZXh0IHBhZ2UgdG8gZmxhc2ggKi8KKwkJCWZsYXNoLT5jb21tYW5kWzFdID0gKHRvICsgaSkgPj4gMTY7CisJCQlmbGFzaC0+Y29tbWFuZFsyXSA9ICh0byArIGkpID4+IDg7CisJCQlmbGFzaC0+Y29tbWFuZFszXSA9ICh0byArIGkpOworCisJCQl0WzFdLnR4X2J1ZiA9IGJ1ZiArIGk7CisJCQl0WzFdLmxlbiA9IHBhZ2Vfc2l6ZTsKKworCQkJd2FpdF90aWxsX3JlYWR5KGZsYXNoKTsKKworCQkJd3JpdGVfZW5hYmxlKGZsYXNoKTsKKworCQkJc3BpX3N5bmMoZmxhc2gtPnNwaSwgJm0pOworCisJCQlpZiAocmV0bGVuKQorCQkJCSpyZXRsZW4gKz0gbS5hY3R1YWxfbGVuZ3RoCisJCQkJCS0gc2l6ZW9mKGZsYXNoLT5jb21tYW5kKTsKKwkgICAgICAgIH0KKyAJfQorCisJdXAoJmZsYXNoLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU1BJIGRldmljZSBkcml2ZXIgc2V0dXAgYW5kIHRlYXJkb3duCisgKi8KKworc3RydWN0IGZsYXNoX2luZm8geworCWNoYXIJCSpuYW1lOworCXU4CQlpZDsKKwl1MTYJCWplZGVjX2lkOworCXVuc2lnbmVkCXNlY3Rvcl9zaXplOworCXVuc2lnbmVkCW5fc2VjdG9yczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfaW5mbyBfX2RldmluaXRkYXRhIG0yNXBfZGF0YSBbXSA9IHsKKwkvKiBSRVZJU0lUOiBmaWxsIGluIEpFREVDIGlkcywgZm9yIHBhcnRzIHRoYXQgaGF2ZSB0aGVtICovCisJeyAibTI1cDA1IiwgMHgwNSwgMHgwMDAwLCAzMiAqIDEwMjQsIDIgfSwKKwl7ICJtMjVwMTAiLCAweDEwLCAweDAwMDAsIDMyICogMTAyNCwgNCB9LAorCXsgIm0yNXAyMCIsIDB4MTEsIDB4MDAwMCwgNjQgKiAxMDI0LCA0IH0sCisJeyAibTI1cDQwIiwgMHgxMiwgMHgwMDAwLCA2NCAqIDEwMjQsIDggfSwKKwl7ICJtMjVwODAiLCAweDEzLCAweDAwMDAsIDY0ICogMTAyNCwgMTYgfSwKKwl7ICJtMjVwMTYiLCAweDE0LCAweDAwMDAsIDY0ICogMTAyNCwgMzIgfSwKKwl7ICJtMjVwMzIiLCAweDE1LCAweDAwMDAsIDY0ICogMTAyNCwgNjQgfSwKKwl7ICJtMjVwNjQiLCAweDE2LCAweDIwMTcsIDY0ICogMTAyNCwgMTI4IH0sCit9OworCisvKgorICogYm9hcmQgc3BlY2lmaWMgc2V0dXAgc2hvdWxkIGhhdmUgZW5zdXJlZCB0aGUgU1BJIGNsb2NrIHVzZWQgaGVyZQorICogbWF0Y2hlcyB3aGF0IHRoZSBSRUFEIGNvbW1hbmQgc3VwcG9ydHMsIGF0IGxlYXN0IHVudGlsIHRoaXMgZHJpdmVyCisgKiB1bmRlcnN0YW5kcyBGQVNUX1JFQUQgKGZvciBjbG9ja3Mgb3ZlciAyNSBNSHopLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtMjVwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEJKmRhdGE7CisJc3RydWN0IG0yNXAJCQkqZmxhc2g7CisJc3RydWN0IGZsYXNoX2luZm8JCSppbmZvOworCXVuc2lnbmVkCQkJaTsKKworCS8qIFBsYXRmb3JtIGRhdGEgaGVscHMgc29ydCBvdXQgd2hpY2ggY2hpcCB0eXBlIHdlIGhhdmUsIGFzCisJICogd2VsbCBhcyBob3cgdGhpcyBib2FyZCBwYXJ0aXRpb25zIGl0LgorCSAqLworCWRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghZGF0YSB8fCAhZGF0YS0+dHlwZSkgeworCQkvKiBGSVhNRSBzb21lIGNoaXBzIGNhbiBpZGVudGlmeSB0aGVtc2VsdmVzIHdpdGggUkVTCisJCSAqIG9yIEpFREVDIGdldC1pZCBjb21tYW5kcy4gIFRyeSB0aGVtIC4uLgorCQkgKi8KKwkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBubyBjaGlwIGlkXG4iLAorCQkJCWZsYXNoLT5zcGktPmRldi5idXNfaWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKGkgPSAwLCBpbmZvID0gbTI1cF9kYXRhOyBpIDwgQVJSQVlfU0laRShtMjVwX2RhdGEpOyBpKyssIGluZm8rKykgeworCQlpZiAoc3RyY21wKGRhdGEtPnR5cGUsIGluZm8tPm5hbWUpID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gQVJSQVlfU0laRShtMjVwX2RhdGEpKSB7CisJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogdW5yZWNvZ25pemVkIGlkICVzXG4iLAorCQkJCWZsYXNoLT5zcGktPmRldi5idXNfaWQsIGRhdGEtPnR5cGUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmbGFzaCA9IGt6YWxsb2Moc2l6ZW9mICpmbGFzaCwgU0xBQl9LRVJORUwpOworCWlmICghZmxhc2gpCisJCXJldHVybiAtRU5PTUVNOworCisJZmxhc2gtPnNwaSA9IHNwaTsKKwlpbml0X01VVEVYKCZmbGFzaC0+bG9jayk7CisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgZmxhc2gpOworCisJaWYgKGRhdGEtPm5hbWUpCisJCWZsYXNoLT5tdGQubmFtZSA9IGRhdGEtPm5hbWU7CisJZWxzZQorCQlmbGFzaC0+bXRkLm5hbWUgPSBzcGktPmRldi5idXNfaWQ7CisKKwlmbGFzaC0+bXRkLnR5cGUgPSBNVERfTk9SRkxBU0g7CisJZmxhc2gtPm10ZC5mbGFncyA9IE1URF9DQVBfTk9SRkxBU0g7CisJZmxhc2gtPm10ZC5zaXplID0gaW5mby0+c2VjdG9yX3NpemUgKiBpbmZvLT5uX3NlY3RvcnM7CisJZmxhc2gtPm10ZC5lcmFzZXNpemUgPSBpbmZvLT5zZWN0b3Jfc2l6ZTsKKwlmbGFzaC0+bXRkLmVyYXNlID0gbTI1cDgwX2VyYXNlOworCWZsYXNoLT5tdGQucmVhZCA9IG0yNXA4MF9yZWFkOworCWZsYXNoLT5tdGQud3JpdGUgPSBtMjVwODBfd3JpdGU7CisKKwlkZXZfaW5mbygmc3BpLT5kZXYsICIlcyAoJWQgS2J5dGVzKVxuIiwgaW5mby0+bmFtZSwKKwkJCWZsYXNoLT5tdGQuc2l6ZSAvIDEwMjQpOworCisJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwKKwkJIm10ZCAubmFtZSA9ICVzLCAuc2l6ZSA9IDB4JS44eCAoJXVNKSAiCisJCQkiLmVyYXNlc2l6ZSA9IDB4JS44eCAoJXVLKSAubnVtZXJhc2VyZWdpb25zID0gJWRcbiIsCisJCWZsYXNoLT5tdGQubmFtZSwKKwkJZmxhc2gtPm10ZC5zaXplLCBmbGFzaC0+bXRkLnNpemUgLyAoMTAyNCoxMDI0KSwKKwkJZmxhc2gtPm10ZC5lcmFzZXNpemUsIGZsYXNoLT5tdGQuZXJhc2VzaXplIC8gMTAyNCwKKwkJZmxhc2gtPm10ZC5udW1lcmFzZXJlZ2lvbnMpOworCisJaWYgKGZsYXNoLT5tdGQubnVtZXJhc2VyZWdpb25zKQorCQlmb3IgKGkgPSAwOyBpIDwgZmxhc2gtPm10ZC5udW1lcmFzZXJlZ2lvbnM7IGkrKykKKwkJCURFQlVHKE1URF9ERUJVR19MRVZFTDIsCisJCQkJIm10ZC5lcmFzZXJlZ2lvbnNbJWRdID0geyAub2Zmc2V0ID0gMHglLjh4LCAiCisJCQkJIi5lcmFzZXNpemUgPSAweCUuOHggKCV1SyksICIKKwkJCQkiLm51bWJsb2NrcyA9ICVkIH1cbiIsCisJCQkJaSwgZmxhc2gtPm10ZC5lcmFzZXJlZ2lvbnNbaV0ub2Zmc2V0LAorCQkJCWZsYXNoLT5tdGQuZXJhc2VyZWdpb25zW2ldLmVyYXNlc2l6ZSwKKwkJCQlmbGFzaC0+bXRkLmVyYXNlcmVnaW9uc1tpXS5lcmFzZXNpemUgLyAxMDI0LAorCQkJCWZsYXNoLT5tdGQuZXJhc2VyZWdpb25zW2ldLm51bWJsb2Nrcyk7CisKKworCS8qIHBhcnRpdGlvbnMgc2hvdWxkIG1hdGNoIHNlY3RvciBib3VuZGFyaWVzOyBhbmQgaXQgbWF5IGJlIGdvb2QgdG8KKwkgKiB1c2UgcmVhZG9ubHkgcGFydGl0aW9ucyBmb3Igd3JpdGVwcm90ZWN0ZWQgc2VjdG9ycyAoQlAyLi5CUDApLgorCSAqLworCWlmIChtdGRfaGFzX3BhcnRpdGlvbnMoKSkgeworCQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydHMgPSBOVUxMOworCQlpbnQJCQlucl9wYXJ0cyA9IDA7CisKKyNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKKwkJc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwsIH07CisKKwkJbnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucygmZmxhc2gtPm10ZCwKKwkJCQlwYXJ0X3Byb2JlcywgJnBhcnRzLCAwKTsKKyNlbmRpZgorCisJCWlmIChucl9wYXJ0cyA8PSAwICYmIGRhdGEgJiYgZGF0YS0+cGFydHMpIHsKKwkJCXBhcnRzID0gZGF0YS0+cGFydHM7CisJCQlucl9wYXJ0cyA9IGRhdGEtPm5yX3BhcnRzOworCQl9CisKKwkJaWYgKG5yX3BhcnRzID4gMCkgeworCQkJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yX3BhcnRzOyBpKyspIHsKKwkJCQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAicGFydGl0aW9uc1slZF0gPSAiCisJCQkJCSJ7Lm5hbWUgPSAlcywgLm9mZnNldCA9IDB4JS44eCwgIgorCQkJCQkJIi5zaXplID0gMHglLjh4ICgldUspIH1cbiIsCisJCQkJCWksIGRhdGEtPnBhcnRzW2ldLm5hbWUsCisJCQkJCWRhdGEtPnBhcnRzW2ldLm9mZnNldCwKKwkJCQkJZGF0YS0+cGFydHNbaV0uc2l6ZSwKKwkJCQkJZGF0YS0+cGFydHNbaV0uc2l6ZSAvIDEwMjQpOworCQkJfQorCQkJZmxhc2gtPnBhcnRpdGlvbmVkID0gMTsKKwkJCXJldHVybiBhZGRfbXRkX3BhcnRpdGlvbnMoJmZsYXNoLT5tdGQsIHBhcnRzLCBucl9wYXJ0cyk7CisJCX0KKwl9IGVsc2UgaWYgKGRhdGEtPm5yX3BhcnRzKQorCQlkZXZfd2Fybigmc3BpLT5kZXYsICJpZ25vcmluZyAlZCBkZWZhdWx0IHBhcnRpdGlvbnMgb24gJXNcbiIsCisJCQkJZGF0YS0+bnJfcGFydHMsIGRhdGEtPm5hbWUpOworCisJcmV0dXJuIGFkZF9tdGRfZGV2aWNlKCZmbGFzaC0+bXRkKSA9PSAxID8gLUVOT0RFViA6IDA7Cit9CisKKworc3RhdGljIGludCBfX2RldmV4aXQgbTI1cF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgbTI1cAkqZmxhc2ggPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKwlpbnQJCXN0YXR1czsKKworCS8qIENsZWFuIHVwIE1URCBzdHVmZi4gKi8KKwlpZiAobXRkX2hhc19wYXJ0aXRpb25zKCkgJiYgZmxhc2gtPnBhcnRpdGlvbmVkKQorCQlzdGF0dXMgPSBkZWxfbXRkX3BhcnRpdGlvbnMoJmZsYXNoLT5tdGQpOworCWVsc2UKKwkJc3RhdHVzID0gZGVsX210ZF9kZXZpY2UoJmZsYXNoLT5tdGQpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJa2ZyZWUoZmxhc2gpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBtMjVwODBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gIm0yNXA4MCIsCisJCS5idXMJPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQk9IG0yNXBfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKG0yNXBfcmVtb3ZlKSwKK307CisKKworc3RhdGljIGludCBtMjVwODBfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZtMjVwODBfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBtMjVwODBfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmbTI1cDgwX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQobTI1cDgwX2luaXQpOworbW9kdWxlX2V4aXQobTI1cDgwX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNaWtlIExhdmVuZGVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBTUEkgZHJpdmVyIGZvciBTVCBNMjVQeHggZmxhc2ggY2hpcHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRfZGF0YWZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1NzM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCkBAIC0wLDAgKzEsNjI5IEBACisvKgorICogQXRtZWwgQVQ0NXh4eCBEYXRhRmxhc2ggTVREIGRyaXZlciBmb3IgbGlnaHR3ZWlnaHQgU1BJIGZyYW1ld29yaworICoKKyAqIExhcmdlbHkgZGVyaXZlZCBmcm9tIGF0OTFfZGF0YWZsYXNoLmM6CisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgU0FOIFBlb3BsZSAoUHR5KSBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgorCisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKworLyoKKyAqIERhdGFGbGFzaCBpcyBhIGtpbmQgb2YgU1BJIGZsYXNoLiAgTW9zdCBBVDQ1IGNoaXBzIGhhdmUgdHdvIGJ1ZmZlcnMgaW4KKyAqIGVhY2ggY2hpcCwgd2hpY2ggbWF5IGJlIHVzZWQgZm9yIGRvdWJsZSBidWZmZXJlZCBJL087IGJ1dCB0aGlzIGRyaXZlcgorICogZG9lc24ndCAoeWV0KSB1c2UgdGhlc2UgZm9yIGFueSBraW5kIG9mIGkvbyBvdmVybGFwIG9yIHByZWZldGNoaW5nLgorICoKKyAqIFNvbWV0aW1lcyBEYXRhRmxhc2ggaXMgcGFja2FnZWQgaW4gTU1DLWZvcm1hdCBjYXJkcywgYWx0aG91Z2ggdGhlCisgKiBNTUMgc3RhY2sgY2FuJ3QgdXNlIFNQSSAoeWV0KSwgb3IgZGlzdGluZ3Vpc2ggYmV0d2VlbiBNTUMgYW5kIERhdGFGbGFzaAorICogcHJvdG9jb2xzIGR1cmluZyBlbnVtZXJhdGlvbi4KKyAqLworCisjZGVmaW5lIENPTkZJR19EQVRBRkxBU0hfV1JJVEVfVkVSSUZZCisKKy8qIHJlYWRzIGNhbiBieXBhc3MgdGhlIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgT1BfUkVBRF9DT05USU5VT1VTCTB4RTgKKyNkZWZpbmUgT1BfUkVBRF9QQUdFCQkweEQyCisKKy8qIGdyb3VwIEIgcmVxdWVzdHMgY2FuIHJ1biBldmVuIHdoaWxlIHN0YXR1cyByZXBvcnRzICJidXN5IiAqLworI2RlZmluZSBPUF9SRUFEX1NUQVRVUwkJMHhENwkvKiBncm91cCBCICovCisKKy8qIG1vdmUgZGF0YSBiZXR3ZWVuIGhvc3QgYW5kIGJ1ZmZlciAqLworI2RlZmluZSBPUF9SRUFEX0JVRkZFUjEJCTB4RDQJLyogZ3JvdXAgQiAqLworI2RlZmluZSBPUF9SRUFEX0JVRkZFUjIJCTB4RDYJLyogZ3JvdXAgQiAqLworI2RlZmluZSBPUF9XUklURV9CVUZGRVIxCTB4ODQJLyogZ3JvdXAgQiAqLworI2RlZmluZSBPUF9XUklURV9CVUZGRVIyCTB4ODcJLyogZ3JvdXAgQiAqLworCisvKiBlcmFzaW5nIGZsYXNoICovCisjZGVmaW5lIE9QX0VSQVNFX1BBR0UJCTB4ODEKKyNkZWZpbmUgT1BfRVJBU0VfQkxPQ0sJCTB4NTAKKworLyogbW92ZSBkYXRhIGJldHdlZW4gYnVmZmVyIGFuZCBmbGFzaCAqLworI2RlZmluZSBPUF9UUkFOU0ZFUl9CVUYxCTB4NTMKKyNkZWZpbmUgT1BfVFJBTlNGRVJfQlVGMgkweDU1CisjZGVmaW5lIE9QX01SRUFEX0JVRkZFUjEJMHhENAorI2RlZmluZSBPUF9NUkVBRF9CVUZGRVIyCTB4RDYKKyNkZWZpbmUgT1BfTVdFUkFTRV9CVUZGRVIxCTB4ODMKKyNkZWZpbmUgT1BfTVdFUkFTRV9CVUZGRVIyCTB4ODYKKyNkZWZpbmUgT1BfTVdSSVRFX0JVRkZFUjEJMHg4OAkvKiBzZWN0b3IgbXVzdCBiZSBwcmUtZXJhc2VkICovCisjZGVmaW5lIE9QX01XUklURV9CVUZGRVIyCTB4ODkJLyogc2VjdG9yIG11c3QgYmUgcHJlLWVyYXNlZCAqLworCisvKiB3cml0ZSB0byBidWZmZXIsIHRoZW4gd3JpdGUtZXJhc2UgdG8gZmxhc2ggKi8KKyNkZWZpbmUgT1BfUFJPR1JBTV9WSUFfQlVGMQkweDgyCisjZGVmaW5lIE9QX1BST0dSQU1fVklBX0JVRjIJMHg4NQorCisvKiBjb21wYXJlIGJ1ZmZlciB0byBmbGFzaCAqLworI2RlZmluZSBPUF9DT01QQVJFX0JVRjEJCTB4NjAKKyNkZWZpbmUgT1BfQ09NUEFSRV9CVUYyCQkweDYxCisKKy8qIHJlYWQgZmxhc2ggdG8gYnVmZmVyLCB0aGVuIHdyaXRlLWVyYXNlIHRvIGZsYXNoICovCisjZGVmaW5lIE9QX1JFV1JJVEVfVklBX0JVRjEJMHg1OAorI2RlZmluZSBPUF9SRVdSSVRFX1ZJQV9CVUYyCTB4NTkKKworLyogbmV3ZXIgY2hpcHMgcmVwb3J0IEpFREVDIG1hbnVmYWN0dXJlciBhbmQgZGV2aWNlIElEczsgY2hpcAorICogc2VyaWFsIG51bWJlciBhbmQgT1RQIGJpdHM7IGFuZCBwZXItc2VjdG9yIHdyaXRlcHJvdGVjdC4KKyAqLworI2RlZmluZSBPUF9SRUFEX0lECQkweDlGCisjZGVmaW5lIE9QX1JFQURfU0VDVVJJVFkJMHg3NworI2RlZmluZSBPUF9XUklURV9TRUNVUklUWQkweDlBCS8qIE9UUCBiaXRzICovCisKKworc3RydWN0IGRhdGFmbGFzaCB7CisJdTgJCQljb21tYW5kWzRdOworCWNoYXIJCQluYW1lWzI0XTsKKworCXVuc2lnbmVkCQlwYXJ0aXRpb25lZDoxOworCisJdW5zaWduZWQgc2hvcnQJCXBhZ2Vfb2Zmc2V0OwkvKiBvZmZzZXQgaW4gZmxhc2ggYWRkcmVzcyAqLworCXVuc2lnbmVkIGludAkJcGFnZV9zaXplOwkvKiBvZiBieXRlcyBwZXIgcGFnZSAqLworCisJc3RydWN0IHNlbWFwaG9yZQlsb2NrOworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CisKKwlzdHJ1Y3QgbXRkX2luZm8JCW10ZDsKK307CisKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKyNkZWZpbmUJbXRkX2hhc19wYXJ0aXRpb25zKCkJKDEpCisjZWxzZQorI2RlZmluZQltdGRfaGFzX3BhcnRpdGlvbnMoKQkoMCkKKyNlbmRpZgorCisvKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCisKKy8qCisgKiBSZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgRGF0YUZsYXNoIGRldmljZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZGF0YWZsYXNoX3N0YXR1cyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCS8qIE5PVEU6ICBhdDQ1ZGIzMjFjIG92ZXIgMjUgTUh6IHdhbnRzIHRvIHdyaXRlCisJICogYSBkdW1teSBieXRlIGFmdGVyIHRoZSBvcGNvZGUuLi4KKwkgKi8KKwlyZXR1cm4gc3BpX3c4cjgoc3BpLCBPUF9SRUFEX1NUQVRVUyk7Cit9CisKKy8qCisgKiBQb2xsIHRoZSBEYXRhRmxhc2ggZGV2aWNlIHVudGlsIGl0IGlzIFJFQURZLgorICogVGhpcyB1c3VhbGx5IHRha2VzIDUtMjAgbXNlYyBvciBzbzsgbW9yZSBmb3Igc2VjdG9yIGVyYXNlLgorICovCitzdGF0aWMgaW50IGRhdGFmbGFzaF93YWl0cmVhZHkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQJc3RhdHVzOworCisJZm9yICg7OykgeworCQlzdGF0dXMgPSBkYXRhZmxhc2hfc3RhdHVzKHNwaSk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHN0YXR1cyAlZD9cbiIsCisJCQkJCXNwaS0+ZGV2LmJ1c19pZCwgc3RhdHVzKTsKKwkJCXN0YXR1cyA9IDA7CisJCX0KKworCQlpZiAoc3RhdHVzICYgKDEgPDwgNykpCS8qIFJEWS9uQlNZICovCisJCQlyZXR1cm4gc3RhdHVzOworCisJCW1zbGVlcCgzKTsKKwl9Cit9CisKKy8qIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworLyoKKyAqIEVyYXNlIHBhZ2VzIG9mIGZsYXNoLgorICovCitzdGF0aWMgaW50IGRhdGFmbGFzaF9lcmFzZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKQoreworCXN0cnVjdCBkYXRhZmxhc2gJKnByaXYgPSAoc3RydWN0IGRhdGFmbGFzaCAqKW10ZC0+cHJpdjsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gcHJpdi0+c3BpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJeCA9IHsgLnR4X2RtYSA9IDAsIH07CisJc3RydWN0IHNwaV9tZXNzYWdlCW1zZzsKKwl1bnNpZ25lZAkJYmxvY2tzaXplID0gcHJpdi0+cGFnZV9zaXplIDw8IDM7CisJdTgJCQkqY29tbWFuZDsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogZXJhc2UgYWRkcj0weCV4IGxlbiAweCV4XG4iLAorCQkJc3BpLT5kZXYuYnVzX2lkLAorCQkJaW5zdHItPmFkZHIsIGluc3RyLT5sZW4pOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWlmICgoaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuKSA+IG10ZC0+c2l6ZQorCQkJfHwgKGluc3RyLT5sZW4gJSBwcml2LT5wYWdlX3NpemUpICE9IDAKKwkJCXx8IChpbnN0ci0+YWRkciAlIHByaXYtPnBhZ2Vfc2l6ZSkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCisJeC50eF9idWYgPSBjb21tYW5kID0gcHJpdi0+Y29tbWFuZDsKKwl4LmxlbiA9IDQ7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJngsICZtc2cpOworCisJZG93bigmcHJpdi0+bG9jayk7CisJd2hpbGUgKGluc3RyLT5sZW4gPiAwKSB7CisJCXVuc2lnbmVkIGludAlwYWdlYWRkcjsKKwkJaW50CQlzdGF0dXM7CisJCWludAkJZG9fYmxvY2s7CisKKwkJLyogQ2FsY3VsYXRlIGZsYXNoIHBhZ2UgYWRkcmVzczsgdXNlIGJsb2NrIGVyYXNlIChmb3Igc3BlZWQpIGlmCisJCSAqIHdlJ3JlIGF0IGEgYmxvY2sgYm91bmRhcnkgYW5kIG5lZWQgdG8gZXJhc2UgdGhlIHdob2xlIGJsb2NrLgorCQkgKi8KKwkJcGFnZWFkZHIgPSBpbnN0ci0+YWRkciAvIHByaXYtPnBhZ2Vfc2l6ZTsKKwkJZG9fYmxvY2sgPSAocGFnZWFkZHIgJiAweDcpID09IDAgJiYgaW5zdHItPmxlbiA8PSBibG9ja3NpemU7CisJCXBhZ2VhZGRyID0gcGFnZWFkZHIgPDwgcHJpdi0+cGFnZV9vZmZzZXQ7CisKKwkJY29tbWFuZFswXSA9IGRvX2Jsb2NrID8gT1BfRVJBU0VfQkxPQ0sgOiBPUF9FUkFTRV9QQUdFOworCQljb21tYW5kWzFdID0gKHU4KShwYWdlYWRkciA+PiAxNik7CisJCWNvbW1hbmRbMl0gPSAodTgpKHBhZ2VhZGRyID4+IDgpOworCQljb21tYW5kWzNdID0gMDsKKworCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiRVJBU0UgJXM6ICgleCkgJXggJXggJXggWyVpXVxuIiwKKwkJCWRvX2Jsb2NrID8gImJsb2NrIiA6ICJwYWdlIiwKKwkJCWNvbW1hbmRbMF0sIGNvbW1hbmRbMV0sIGNvbW1hbmRbMl0sIGNvbW1hbmRbM10sCisJCQlwYWdlYWRkcik7CisKKwkJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKKwkJKHZvaWQpIGRhdGFmbGFzaF93YWl0cmVhZHkoc3BpKTsKKworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJhc2UgJXgsIGVyciAlZFxuIiwKKwkJCQlzcGktPmRldi5idXNfaWQsIHBhZ2VhZGRyLCBzdGF0dXMpOworCQkJLyogUkVWSVNJVDogIGNhbiByZXRyeSBpbnN0ci0+cmV0cmllcyB0aW1lczsgb3IKKwkJCSAqIGdpdmV1cCBhbmQgaW5zdHItPmZhaWxfYWRkciA9IGluc3RyLT5hZGRyOworCQkJICovCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChkb19ibG9jaykgeworCQkJaW5zdHItPmFkZHIgKz0gYmxvY2tzaXplOworCQkJaW5zdHItPmxlbiAtPSBibG9ja3NpemU7CisJCX0gZWxzZSB7CisJCQlpbnN0ci0+YWRkciArPSBwcml2LT5wYWdlX3NpemU7CisJCQlpbnN0ci0+bGVuIC09IHByaXYtPnBhZ2Vfc2l6ZTsKKwkJfQorCX0KKwl1cCgmcHJpdi0+bG9jayk7CisKKwkvKiBJbmZvcm0gTVREIHN1YnN5c3RlbSB0aGF0IGVyYXNlIGlzIGNvbXBsZXRlICovCisJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0RPTkU7CisJbXRkX2VyYXNlX2NhbGxiYWNrKGluc3RyKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBmcm9tIHRoZSBEYXRhRmxhc2ggZGV2aWNlLgorICogICBmcm9tICAgOiBTdGFydCBvZmZzZXQgaW4gZmxhc2ggZGV2aWNlCisgKiAgIGxlbiAgICA6IEFtb3VudCB0byByZWFkCisgKiAgIHJldGxlbiA6IEFib3V0IG9mIGRhdGEgYWN0dWFsbHkgcmVhZAorICogICBidWYgICAgOiBCdWZmZXIgY29udGFpbmluZyB0aGUgZGF0YQorICovCitzdGF0aWMgaW50IGRhdGFmbGFzaF9yZWFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKKwkJCSAgICAgICBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpCit7CisJc3RydWN0IGRhdGFmbGFzaAkqcHJpdiA9IChzdHJ1Y3QgZGF0YWZsYXNoICopbXRkLT5wcml2OworCXN0cnVjdCBzcGlfdHJhbnNmZXIJeFsyXSA9IHsgeyAudHhfZG1hID0gMCwgfSwgfTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbXNnOworCXVuc2lnbmVkIGludAkJYWRkcjsKKwl1OAkJCSpjb21tYW5kOworCWludAkJCXN0YXR1czsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogcmVhZCAweCV4Li4weCV4XG4iLAorCQlwcml2LT5zcGktPmRldi5idXNfaWQsICh1bnNpZ25lZClmcm9tLCAodW5zaWduZWQpKGZyb20gKyBsZW4pKTsKKworCSpyZXRsZW4gPSAwOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWlmICghbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoZnJvbSArIGxlbiA+IG10ZC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBDYWxjdWxhdGUgZmxhc2ggcGFnZS9ieXRlIGFkZHJlc3MgKi8KKwlhZGRyID0gKCgodW5zaWduZWQpZnJvbSAvIHByaXYtPnBhZ2Vfc2l6ZSkgPDwgcHJpdi0+cGFnZV9vZmZzZXQpCisJCSsgKCh1bnNpZ25lZClmcm9tICUgcHJpdi0+cGFnZV9zaXplKTsKKworCWNvbW1hbmQgPSBwcml2LT5jb21tYW5kOworCisJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIlJFQUQ6ICgleCkgJXggJXggJXhcbiIsCisJCWNvbW1hbmRbMF0sIGNvbW1hbmRbMV0sIGNvbW1hbmRbMl0sIGNvbW1hbmRbM10pOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKworCXhbMF0udHhfYnVmID0gY29tbWFuZDsKKwl4WzBdLmxlbiA9IDg7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhbMF0sICZtc2cpOworCisJeFsxXS5yeF9idWYgPSBidWY7CisJeFsxXS5sZW4gPSBsZW47CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhbMV0sICZtc2cpOworCisJZG93bigmcHJpdi0+bG9jayk7CisKKwkvKiBDb250aW51b3VzIHJlYWQsIG1heCBjbG9jayA9IGYoY2FyKSB3aGljaCBtYXkgYmUgbGVzcyB0aGFuCisJICogdGhlIHBlYWsgcmF0ZSBhdmFpbGFibGUuICBTb21lIGNoaXBzIHN1cHBvcnQgY29tbWFuZHMgd2l0aAorCSAqIGZld2VyICJkb24ndCBjYXJlIiBieXRlcy4gIEJvdGggYnVmZmVycyBzdGF5IHVuY2hhbmdlZC4KKwkgKi8KKwljb21tYW5kWzBdID0gT1BfUkVBRF9DT05USU5VT1VTOworCWNvbW1hbmRbMV0gPSAodTgpKGFkZHIgPj4gMTYpOworCWNvbW1hbmRbMl0gPSAodTgpKGFkZHIgPj4gOCk7CisJY29tbWFuZFszXSA9ICh1OCkoYWRkciA+PiAwKTsKKwkvKiBwbHVzIDQgImRvbid0IGNhcmUiIGJ5dGVzICovCisKKwlzdGF0dXMgPSBzcGlfc3luYyhwcml2LT5zcGksICZtc2cpOworCXVwKCZwcml2LT5sb2NrKTsKKworCWlmIChzdGF0dXMgPj0gMCkgeworCQkqcmV0bGVuID0gbXNnLmFjdHVhbF9sZW5ndGggLSA4OworCQlzdGF0dXMgPSAwOworCX0gZWxzZQorCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHJlYWQgJXguLiV4IC0tPiAlZFxuIiwKKwkJCXByaXYtPnNwaS0+ZGV2LmJ1c19pZCwKKwkJCSh1bnNpZ25lZClmcm9tLCAodW5zaWduZWQpKGZyb20gKyBsZW4pLAorCQkJc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogV3JpdGUgdG8gdGhlIERhdGFGbGFzaCBkZXZpY2UuCisgKiAgIHRvICAgICA6IFN0YXJ0IG9mZnNldCBpbiBmbGFzaCBkZXZpY2UKKyAqICAgbGVuICAgIDogQW1vdW50IHRvIHdyaXRlCisgKiAgIHJldGxlbiA6IEFtb3VudCBvZiBkYXRhIGFjdHVhbGx5IHdyaXR0ZW4KKyAqICAgYnVmICAgIDogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEKKyAqLworc3RhdGljIGludCBkYXRhZmxhc2hfd3JpdGUoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwKKwkJCQlzaXplX3QgKiByZXRsZW4sIGNvbnN0IHVfY2hhciAqIGJ1ZikKK3sKKwlzdHJ1Y3QgZGF0YWZsYXNoCSpwcml2ID0gKHN0cnVjdCBkYXRhZmxhc2ggKiltdGQtPnByaXY7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IHByaXYtPnNwaTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXhbMl0gPSB7IHsgLnR4X2RtYSA9IDAsIH0sIH07CisJc3RydWN0IHNwaV9tZXNzYWdlCW1zZzsKKwl1bnNpZ25lZCBpbnQJCXBhZ2VhZGRyLCBhZGRyLCBvZmZzZXQsIHdyaXRlbGVuOworCXNpemVfdAkJCXJlbWFpbmluZyA9IGxlbjsKKwl1X2NoYXIJCQkqd3JpdGVidWYgPSAodV9jaGFyICopIGJ1ZjsKKwlpbnQJCQlzdGF0dXMgPSAtRUlOVkFMOworCXU4CQkJKmNvbW1hbmQ7CisKKwlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6IHdyaXRlIDB4JXguLjB4JXhcbiIsCisJCXNwaS0+ZGV2LmJ1c19pZCwgKHVuc2lnbmVkKXRvLCAodW5zaWduZWQpKHRvICsgbGVuKSk7CisKKwkqcmV0bGVuID0gMDsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisJaWYgKCh0byArIGxlbikgPiBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKworCXhbMF0udHhfYnVmID0gY29tbWFuZCA9IHByaXYtPmNvbW1hbmQ7CisJeFswXS5sZW4gPSA0OworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4WzBdLCAmbXNnKTsKKworCXBhZ2VhZGRyID0gKCh1bnNpZ25lZCl0byAvIHByaXYtPnBhZ2Vfc2l6ZSk7CisJb2Zmc2V0ID0gKCh1bnNpZ25lZCl0byAlIHByaXYtPnBhZ2Vfc2l6ZSk7CisJaWYgKG9mZnNldCArIGxlbiA+IHByaXYtPnBhZ2Vfc2l6ZSkKKwkJd3JpdGVsZW4gPSBwcml2LT5wYWdlX3NpemUgLSBvZmZzZXQ7CisJZWxzZQorCQl3cml0ZWxlbiA9IGxlbjsKKworCWRvd24oJnByaXYtPmxvY2spOworCXdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisJCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJ3cml0ZSBAICVpOiVpIGxlbj0laVxuIiwKKwkJCXBhZ2VhZGRyLCBvZmZzZXQsIHdyaXRlbGVuKTsKKworCQkvKiBSRVZJU0lUOgorCQkgKiAoYSkgZWFjaCBwYWdlIGluIGEgc2VjdG9yIG11c3QgYmUgcmV3cml0dGVuIGF0IGxlYXN0CisJCSAqICAgICBvbmNlIGV2ZXJ5IDEwSyBzaWJsaW5nIGVyYXNlL3Byb2dyYW0gb3BlcmF0aW9ucy4KKwkJICogKGIpIGZvciBwYWdlcyB0aGF0IGFyZSBhbHJlYWR5IGVyYXNlZCwgd2UgY291bGQKKwkJICogICAgIHVzZSBXUklURStNV1JJVEUgbm90IFBST0dSQU0gZm9yIH4zMCUgc3BlZWR1cC4KKwkJICogKGMpIFdSSVRFIHRvIGJ1ZmZlciBjb3VsZCBiZSBkb25lIHdoaWxlIHdhaXRpbmcgZm9yCisJCSAqICAgICBhIHByZXZpb3VzIE1XUklURS9NV0VSQVNFIHRvIGNvbXBsZXRlIC4uLgorCQkgKiAoZCkgZXJyb3IgaGFuZGxpbmcgaGVyZSBzZWVtcyB0byBiZSBtb3N0bHkgbWlzc2luZy4KKwkJICoKKwkJICogVHdvIHBlcnNpc3RlbnQgYml0cyBwZXIgcGFnZSwgcGx1cyBhIHBlci1zZWN0b3IgY291bnRlciwKKwkJICogY291bGQgc3VwcG9ydCAoYSkgYW5kIChiKSAuLi4gd2UgbWlnaHQgY29uc2lkZXIgdXNpbmcKKwkJICogdGhlIHNlY29uZCBoYWxmIG9mIHNlY3RvciB6ZXJvLCB3aGljaCBpcyBqdXN0IG9uZSBibG9jaywKKwkJICogdG8gdHJhY2sgdGhhdCBzdGF0ZS4gIChPbiBBVDkxLCB0aGF0IHNlY3RvciBzaG91bGQgYWxzbworCQkgKiBzdXBwb3J0IGJvb3QtZnJvbS1EYXRhRmxhc2guKQorCQkgKi8KKworCQlhZGRyID0gcGFnZWFkZHIgPDwgcHJpdi0+cGFnZV9vZmZzZXQ7CisKKwkJLyogKDEpIE1heWJlIHRyYW5zZmVyIHBhcnRpYWwgcGFnZSB0byBCdWZmZXIxICovCisJCWlmICh3cml0ZWxlbiAhPSBwcml2LT5wYWdlX3NpemUpIHsKKwkJCWNvbW1hbmRbMF0gPSBPUF9UUkFOU0ZFUl9CVUYxOworCQkJY29tbWFuZFsxXSA9IChhZGRyICYgMHgwMEZGMDAwMCkgPj4gMTY7CisJCQljb21tYW5kWzJdID0gKGFkZHIgJiAweDAwMDBGRjAwKSA+PiA4OworCQkJY29tbWFuZFszXSA9IDA7CisKKwkJCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJUUkFOU0ZFUjogKCV4KSAleCAleCAleFxuIiwKKwkJCQljb21tYW5kWzBdLCBjb21tYW5kWzFdLCBjb21tYW5kWzJdLCBjb21tYW5kWzNdKTsKKworCQkJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogeGZlciAldSAtPiAlZCBcbiIsCisJCQkJCXNwaS0+ZGV2LmJ1c19pZCwgYWRkciwgc3RhdHVzKTsKKworCQkJKHZvaWQpIGRhdGFmbGFzaF93YWl0cmVhZHkocHJpdi0+c3BpKTsKKwkJfQorCisJCS8qICgyKSBQcm9ncmFtIGZ1bGwgcGFnZSB2aWEgQnVmZmVyMSAqLworCQlhZGRyICs9IG9mZnNldDsKKwkJY29tbWFuZFswXSA9IE9QX1BST0dSQU1fVklBX0JVRjE7CisJCWNvbW1hbmRbMV0gPSAoYWRkciAmIDB4MDBGRjAwMDApID4+IDE2OworCQljb21tYW5kWzJdID0gKGFkZHIgJiAweDAwMDBGRjAwKSA+PiA4OworCQljb21tYW5kWzNdID0gKGFkZHIgJiAweDAwMDAwMEZGKTsKKworCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiUFJPR1JBTTogKCV4KSAleCAleCAleFxuIiwKKwkJCWNvbW1hbmRbMF0sIGNvbW1hbmRbMV0sIGNvbW1hbmRbMl0sIGNvbW1hbmRbM10pOworCisJCXhbMV0udHhfYnVmID0gd3JpdGVidWY7CisJCXhbMV0ubGVuID0gd3JpdGVsZW47CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKHggKyAxLCAmbXNnKTsKKwkJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKKwkJc3BpX3RyYW5zZmVyX2RlbCh4ICsgMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBwZ20gJXUvJXUgLT4gJWQgXG4iLAorCQkJCXNwaS0+ZGV2LmJ1c19pZCwgYWRkciwgd3JpdGVsZW4sIHN0YXR1cyk7CisKKwkJKHZvaWQpIGRhdGFmbGFzaF93YWl0cmVhZHkocHJpdi0+c3BpKTsKKworCisjaWZkZWYJQ09ORklHX0RBVEFGTEFTSF9XUklURV9WRVJJRlkKKworCQkvKiAoMykgQ29tcGFyZSB0byBCdWZmZXIxICovCisJCWFkZHIgPSBwYWdlYWRkciA8PCBwcml2LT5wYWdlX29mZnNldDsKKwkJY29tbWFuZFswXSA9IE9QX0NPTVBBUkVfQlVGMTsKKwkJY29tbWFuZFsxXSA9IChhZGRyICYgMHgwMEZGMDAwMCkgPj4gMTY7CisJCWNvbW1hbmRbMl0gPSAoYWRkciAmIDB4MDAwMEZGMDApID4+IDg7CisJCWNvbW1hbmRbM10gPSAwOworCisJCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJDT01QQVJFOiAoJXgpICV4ICV4ICV4XG4iLAorCQkJY29tbWFuZFswXSwgY29tbWFuZFsxXSwgY29tbWFuZFsyXSwgY29tbWFuZFszXSk7CisKKwkJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IGNvbXBhcmUgJXUgLT4gJWQgXG4iLAorCQkJCXNwaS0+ZGV2LmJ1c19pZCwgYWRkciwgc3RhdHVzKTsKKworCQlzdGF0dXMgPSBkYXRhZmxhc2hfd2FpdHJlYWR5KHByaXYtPnNwaSk7CisKKwkJLyogQ2hlY2sgcmVzdWx0IG9mIHRoZSBjb21wYXJlIG9wZXJhdGlvbiAqLworCQlpZiAoKHN0YXR1cyAmICgxIDw8IDYpKSA9PSAxKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb21wYXJlIHBhZ2UgJXUsIGVyciAlZFxuIiwKKwkJCQlzcGktPmRldi5idXNfaWQsIHBhZ2VhZGRyLCBzdGF0dXMpOworCQkJcmVtYWluaW5nID0gMDsKKwkJCXN0YXR1cyA9IC1FSU87CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQlzdGF0dXMgPSAwOworCisjZW5kaWYJLyogQ09ORklHX0RBVEFGTEFTSF9XUklURV9WRVJJRlkgKi8KKworCQlyZW1haW5pbmcgPSByZW1haW5pbmcgLSB3cml0ZWxlbjsKKwkJcGFnZWFkZHIrKzsKKwkJb2Zmc2V0ID0gMDsKKwkJd3JpdGVidWYgKz0gd3JpdGVsZW47CisJCSpyZXRsZW4gKz0gd3JpdGVsZW47CisKKwkJaWYgKHJlbWFpbmluZyA+IHByaXYtPnBhZ2Vfc2l6ZSkKKwkJCXdyaXRlbGVuID0gcHJpdi0+cGFnZV9zaXplOworCQllbHNlCisJCQl3cml0ZWxlbiA9IHJlbWFpbmluZzsKKwl9CisJdXAoJnByaXYtPmxvY2spOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLworCisvKgorICogUmVnaXN0ZXIgRGF0YUZsYXNoIGRldmljZSB3aXRoIE1URCBzdWJzeXN0ZW0uCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CithZGRfZGF0YWZsYXNoKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGNoYXIgKm5hbWUsCisJCWludCBucl9wYWdlcywgaW50IHBhZ2VzaXplLCBpbnQgcGFnZW9mZnNldCkKK3sKKwlzdHJ1Y3QgZGF0YWZsYXNoCQkqcHJpdjsKKwlzdHJ1Y3QgbXRkX2luZm8JCQkqZGV2aWNlOworCXN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhCSpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlwcml2ID0gKHN0cnVjdCBkYXRhZmxhc2ggKikga3phbGxvYyhzaXplb2YgKnByaXYsIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbml0X01VVEVYKCZwcml2LT5sb2NrKTsKKwlwcml2LT5zcGkgPSBzcGk7CisJcHJpdi0+cGFnZV9zaXplID0gcGFnZXNpemU7CisJcHJpdi0+cGFnZV9vZmZzZXQgPSBwYWdlb2Zmc2V0OworCisJLyogbmFtZSBtdXN0IGJlIHVzYWJsZSB3aXRoIGNtZGxpbmVwYXJ0ICovCisJc3ByaW50Zihwcml2LT5uYW1lLCAic3BpJWQuJWQtJXMiLAorCQkJc3BpLT5tYXN0ZXItPmJ1c19udW0sIHNwaS0+Y2hpcF9zZWxlY3QsCisJCQluYW1lKTsKKworCWRldmljZSA9ICZwcml2LT5tdGQ7CisJZGV2aWNlLT5uYW1lID0gKHBkYXRhICYmIHBkYXRhLT5uYW1lKSA/IHBkYXRhLT5uYW1lIDogcHJpdi0+bmFtZTsKKwlkZXZpY2UtPnNpemUgPSBucl9wYWdlcyAqIHBhZ2VzaXplOworCWRldmljZS0+ZXJhc2VzaXplID0gcGFnZXNpemU7CisJZGV2aWNlLT5vd25lciA9IFRISVNfTU9EVUxFOworCWRldmljZS0+dHlwZSA9IE1URF9EQVRBRkxBU0g7CisJZGV2aWNlLT5mbGFncyA9IE1URF9DQVBfTk9SRkxBU0g7CisJZGV2aWNlLT5lcmFzZSA9IGRhdGFmbGFzaF9lcmFzZTsKKwlkZXZpY2UtPnJlYWQgPSBkYXRhZmxhc2hfcmVhZDsKKwlkZXZpY2UtPndyaXRlID0gZGF0YWZsYXNoX3dyaXRlOworCWRldmljZS0+cHJpdiA9IHByaXY7CisKKwlkZXZfaW5mbygmc3BpLT5kZXYsICIlcyAoJWQgS0J5dGVzKVxuIiwgbmFtZSwgZGV2aWNlLT5zaXplLzEwMjQpOworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIHByaXYpOworCisJaWYgKG10ZF9oYXNfcGFydGl0aW9ucygpKSB7CisJCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKKwkJaW50CQkJbnJfcGFydHMgPSAwOworCisjaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCisJCXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMLCB9OworCisJCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoZGV2aWNlLCBwYXJ0X3Byb2JlcywgJnBhcnRzLCAwKTsKKyNlbmRpZgorCisJCWlmIChucl9wYXJ0cyA8PSAwICYmIHBkYXRhICYmIHBkYXRhLT5wYXJ0cykgeworCQkJcGFydHMgPSBwZGF0YS0+cGFydHM7CisJCQlucl9wYXJ0cyA9IHBkYXRhLT5ucl9wYXJ0czsKKwkJfQorCisJCWlmIChucl9wYXJ0cyA+IDApIHsKKwkJCXByaXYtPnBhcnRpdGlvbmVkID0gMTsKKwkJCXJldHVybiBhZGRfbXRkX3BhcnRpdGlvbnMoZGV2aWNlLCBwYXJ0cywgbnJfcGFydHMpOworCQl9CisJfSBlbHNlIGlmIChwZGF0YSAmJiBwZGF0YS0+bnJfcGFydHMpCisJCWRldl93YXJuKCZzcGktPmRldiwgImlnbm9yaW5nICVkIGRlZmF1bHQgcGFydGl0aW9ucyBvbiAlc1xuIiwKKwkJCQlwZGF0YS0+bnJfcGFydHMsIGRldmljZS0+bmFtZSk7CisKKwlyZXR1cm4gYWRkX210ZF9kZXZpY2UoZGV2aWNlKSA9PSAxID8gLUVOT0RFViA6IDA7Cit9CisKKy8qCisgKiBEZXRlY3QgYW5kIGluaXRpYWxpemUgRGF0YUZsYXNoIGRldmljZToKKyAqCisgKiAgIERldmljZSAgICAgIERlbnNpdHkgICAgICAgICBJRCBjb2RlICAgICAgICAgICNQYWdlcyBQYWdlU2l6ZSAgT2Zmc2V0CisgKiAgIEFUNDVEQjAxMUIgIDFNYml0ICAgKDEyOEspICB4eDAwMTF4eCAoMHgwYykgICAgNTEyICAgIDI2NCAgICAgIDkKKyAqICAgQVQ0NURCMDIxQiAgMk1iaXQgICAoMjU2SykgIHh4MDEwMXh4ICgweDE0KSAgIDEwMjUgICAgMjY0ICAgICAgOQorICogICBBVDQ1REIwNDFCICA0TWJpdCAgICg1MTJLKSAgeHgwMTExeHggKDB4MWMpICAgMjA0OCAgICAyNjQgICAgICA5CisgKiAgIEFUNDVEQjA4MUIgIDhNYml0ICAgKDFNKSAgICB4eDEwMDF4eCAoMHgyNCkgICA0MDk2ICAgIDI2NCAgICAgIDkKKyAqICAgQVQ0NURCMDE2MUIgMTZNYml0ICAoMk0pICAgIHh4MTAxMXh4ICgweDJjKSAgIDQwOTYgICAgNTI4ICAgICAxMAorICogICBBVDQ1REIwMzIxQiAzMk1iaXQgICg0TSkgICAgeHgxMTAxeHggKDB4MzQpICAgODE5MiAgICA1MjggICAgIDEwCisgKiAgIEFUNDVEQjA2NDIgIDY0TWJpdCAgKDhNKSAgICB4eDExMXh4eCAoMHgzYykgICA4MTkyICAgMTA1NiAgICAgMTEKKyAqICAgQVQ0NURCMTI4MiAgMTI4TWJpdCAoMTZNKSAgIHh4MDEwMHh4ICgweDEwKSAgMTYzODQgICAxMDU2ICAgICAxMQorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkYXRhZmxhc2hfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZGF0YWZsYXNoX3N0YXR1cyhzcGkpOworCWlmIChzdGF0dXMgPD0gMCB8fCBzdGF0dXMgPT0gMHhmZikgeworCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHN0YXR1cyBlcnJvciAlZFxuIiwKKwkJCQlzcGktPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCWlmIChzdGF0dXMgPT0gMHhmZikKKwkJCXN0YXR1cyA9IC1FTk9ERVY7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogaWYgdGhlcmUncyBhIGRldmljZSB0aGVyZSwgYXNzdW1lIGl0J3MgZGF0YWZsYXNoLgorCSAqIGJvYXJkIHNldHVwIHNob3VsZCBoYXZlIHNldCBzcGktPm1heF9zcGVlZF9tYXggdG8KKwkgKiBtYXRjaCBmKGNhcikgZm9yIGNvbnRpbnVvdXMgcmVhZHMsIG1vZGUgMCBvciAzLgorCSAqLworCXN3aXRjaCAoc3RhdHVzICYgMHgzYykgeworCWNhc2UgMHgwYzoJLyogMCAwIDEgMSB4IHggKi8KKwkJc3RhdHVzID0gYWRkX2RhdGFmbGFzaChzcGksICJBVDQ1REIwMTFCIiwgNTEyLCAyNjQsIDkpOworCQlicmVhazsKKwljYXNlIDB4MTQ6CS8qIDAgMSAwIDEgeCB4ICovCisJCXN0YXR1cyA9IGFkZF9kYXRhZmxhc2goc3BpLCAiQVQ0NURCMDIxQiIsIDEwMjUsIDI2NCwgOSk7CisJCWJyZWFrOworCWNhc2UgMHgxYzoJLyogMCAxIDEgMSB4IHggKi8KKwkJc3RhdHVzID0gYWRkX2RhdGFmbGFzaChzcGksICJBVDQ1REIwNDF4IiwgMjA0OCwgMjY0LCA5KTsKKwkJYnJlYWs7CisJY2FzZSAweDI0OgkvKiAxIDAgMCAxIHggeCAqLworCQlzdGF0dXMgPSBhZGRfZGF0YWZsYXNoKHNwaSwgIkFUNDVEQjA4MUIiLCA0MDk2LCAyNjQsIDkpOworCQlicmVhazsKKwljYXNlIDB4MmM6CS8qIDEgMCAxIDEgeCB4ICovCisJCXN0YXR1cyA9IGFkZF9kYXRhZmxhc2goc3BpLCAiQVQ0NURCMTYxeCIsIDQwOTYsIDUyOCwgMTApOworCQlicmVhazsKKwljYXNlIDB4MzQ6CS8qIDEgMSAwIDEgeCB4ICovCisJCXN0YXR1cyA9IGFkZF9kYXRhZmxhc2goc3BpLCAiQVQ0NURCMzIxeCIsIDgxOTIsIDUyOCwgMTApOworCQlicmVhazsKKwljYXNlIDB4Mzg6CS8qIDEgMSAxIHggeCB4ICovCisJY2FzZSAweDNjOgorCQlzdGF0dXMgPSBhZGRfZGF0YWZsYXNoKHNwaSwgIkFUNDVEQjY0MngiLCA4MTkyLCAxMDU2LCAxMSk7CisJCWJyZWFrOworCS8qIG9ic29sZXRlIEFUNDVEQjEyODIgbm90ICh5ZXQ/KSBzdXBwb3J0ZWQgKi8KKwlkZWZhdWx0OgorCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHVuc3VwcG9ydGVkIGRldmljZSAoJXgpXG4iLAorCQkJCXNwaS0+ZGV2LmJ1c19pZCwgc3RhdHVzICYgMHgzYyk7CisJCXN0YXR1cyA9IC1FTk9ERVY7CisJfQorCisJaWYgKHN0YXR1cyA8IDApCisJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogYWRkX2RhdGFmbGFzaCAtLT4gJWRcbiIsCisJCQkJc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZGF0YWZsYXNoX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBkYXRhZmxhc2gJKmZsYXNoID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisJaW50CQkJc3RhdHVzOworCisJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiByZW1vdmVcbiIsIHNwaS0+ZGV2LmJ1c19pZCk7CisKKwlpZiAobXRkX2hhc19wYXJ0aXRpb25zKCkgJiYgZmxhc2gtPnBhcnRpdGlvbmVkKQorCQlzdGF0dXMgPSBkZWxfbXRkX3BhcnRpdGlvbnMoJmZsYXNoLT5tdGQpOworCWVsc2UKKwkJc3RhdHVzID0gZGVsX210ZF9kZXZpY2UoJmZsYXNoLT5tdGQpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJa2ZyZWUoZmxhc2gpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBkYXRhZmxhc2hfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJtdGRfZGF0YWZsYXNoIiwKKwkJLmJ1cwkJPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJfSwKKworCS5wcm9iZQkJPSBkYXRhZmxhc2hfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkYXRhZmxhc2hfcmVtb3ZlKSwKKworCS8qIEZJWE1FOiAgaW52ZXN0aWdhdGUgc3VzcGVuZCBhbmQgcmVzdW1lLi4uICovCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkYXRhZmxhc2hfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZkYXRhZmxhc2hfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGRhdGFmbGFzaF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGRhdGFmbGFzaF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZkYXRhZmxhc2hfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGRhdGFmbGFzaF9leGl0KTsKKworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBbmRyZXcgVmljdG9yLCBEYXZpZCBCcm93bmVsbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgRGF0YUZsYXNoIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9kaXNrb25jaGlwLmMgYi9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYwppbmRleCAyMWQ0ZThmLi5lYzVlNDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYwpAQCAtMTUwNiw3ICsxNTA2LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX19pbml0IGRvY19wcm9iZSh1bnNpZ25lZCBsb25nIHBoeXNhZHIpCitzdGF0aWMgaW50IF9faW5pdCBkb2NfcHJvYmUodW5zaWduZWQgbG9uZyBwaHlzYWRyKQogewogCXVuc2lnbmVkIGNoYXIgQ2hpcElEOwogCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggNWMxNWYzZS4uMTcxOTk5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0xMzg3LDcgKzEzODcsNyBAQAogCiBjb25maWcgQ1M4OXgwCiAJdHJpc3RhdGUgIkNTODl4MCBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1BDSSAmJiAoSVNBIHx8IEFSQ0hfSVhEUDJYMDEgfHwgQVJDSF9QTlgwMTBYKQorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiAoSVNBIHx8IE1BQ0hfSVhEUDIzNTEgfHwgQVJDSF9JWERQMlgwMSB8fCBBUkNIX1BOWDAxMFgpCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgQ1M4OXgwIGNoaXBzZXQgYmFzZWQgRXRoZXJuZXQgY2FyZHMuIElmIHlvdSBoYXZlIGEKIAkgIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jczg5eDAuYyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCmluZGV4IGUyY2ZkZTcuLmZhYjY1ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NzODl4MC5jCisrKyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCkBAIC04Nyw2ICs4NywxMiBAQAogICBEZWVwYWsgU2F4ZW5hICAgICA6IGRzYXhlbmFAcGxleGl0eS5uZXQKICAgICAgICAgICAgICAgICAgICAgOiBJbnRlbCBJWERQMngwMSAoWFNjYWxlIGl4cDJ4MDAgTlBVKSBwbGF0Zm9ybSBzdXBwb3J0CiAKKyAgRG1pdHJ5IFBlcnZ1c2hpbiAgOiBkcGVydnVzaGluQHJ1Lm12aXN0YS5jb20KKyAgICAgICAgICAgICAgICAgICAgOiBQTlgwMTBYIHBsYXRmb3JtIHN1cHBvcnQKKworICBEZWVwYWsgU2F4ZW5hICAgICA6IGRzYXhlbmFAcGxleGl0eS5uZXQKKyAgICAgICAgICAgICAgICAgICAgOiBJbnRlbCBJWERQMjM1MSBwbGF0Zm9ybSBzdXBwb3J0CisKICovCiAKIC8qIEFsd2F5cyBpbmNsdWRlICdjb25maWcuaCcgZmlyc3QgaW4gY2FzZSB0aGUgdXNlciB3YW50cyB0byB0dXJuIG9uCkBAIC0xNzEsNiArMTc3LDEwIEBACiBzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0KICAgIHsgMHgwMzAwLCAwfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3M4OTAwX2lycV9tYXBbXSA9IHsxLDAsMCwwfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01BQ0hfSVhEUDIzNTEpCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0ge0lYRFAyMzUxX1ZJUlRfQ1M4OTAwX0JBU0UsIDB9Oworc3RhdGljIHVuc2lnbmVkIGludCBjczg5MDBfaXJxX21hcFtdID0ge0lSUV9JWERQMjM1MV9DUzg5MDAsIDAsIDAsIDB9OworI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9IHtJWERQMlgwMV9DUzg5MDBfVklSVF9CQVNFLCAwfTsKQEAgLTMzOCw0NSArMzQ4LDU1IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpCi1zdGF0aWMgaW50CisjaWYgZGVmaW5lZChDT05GSUdfTUFDSF9JWERQMjM1MSkKK3N0YXRpYyB1MTYKIHJlYWR3b3JkKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyLCBpbnQgcG9ydG5vKQogewotCXJldHVybiAodTE2KV9fcmF3X3JlYWRsKGJhc2VfYWRkciArIChwb3J0bm8gPDwgMSkpOworCXJldHVybiBfX3Jhd19yZWFkdyhiYXNlX2FkZHIgKyAocG9ydG5vIDw8IDEpKTsKIH0KIAogc3RhdGljIHZvaWQKLXdyaXRld29yZCh1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgaW50IHBvcnRubywgaW50IHZhbHVlKQord3JpdGV3b3JkKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyLCBpbnQgcG9ydG5vLCB1MTYgdmFsdWUpCiB7Ci0JX19yYXdfd3JpdGVsKCh1MTYpdmFsdWUsIGJhc2VfYWRkciArIChwb3J0bm8gPDwgMSkpOworCV9fcmF3X3dyaXRldyh2YWx1ZSwgYmFzZV9hZGRyICsgKHBvcnRubyA8PCAxKSk7CiB9Ci0jZWxzZQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfUE5YMDEwWCkKLXN0YXRpYyBpbnQKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpCitzdGF0aWMgdTE2CityZWFkd29yZCh1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgaW50IHBvcnRubykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoYmFzZV9hZGRyICsgKHBvcnRubyA8PCAxKSk7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZXdvcmQodW5zaWduZWQgbG9uZyBiYXNlX2FkZHIsIGludCBwb3J0bm8sIHUxNiB2YWx1ZSkKK3sKKwlfX3Jhd193cml0ZWwodmFsdWUsIGJhc2VfYWRkciArIChwb3J0bm8gPDwgMSkpOworfQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9QTlgwMTBYKQorc3RhdGljIHUxNgogcmVhZHdvcmQodW5zaWduZWQgbG9uZyBiYXNlX2FkZHIsIGludCBwb3J0bm8pCiB7CiAJcmV0dXJuIGludyhiYXNlX2FkZHIgKyAocG9ydG5vIDw8IDEpKTsKIH0KIAogc3RhdGljIHZvaWQKLXdyaXRld29yZCh1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgaW50IHBvcnRubywgaW50IHZhbHVlKQord3JpdGV3b3JkKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyLCBpbnQgcG9ydG5vLCB1MTYgdmFsdWUpCiB7CiAJb3V0dyh2YWx1ZSwgYmFzZV9hZGRyICsgKHBvcnRubyA8PCAxKSk7CiB9CiAjZWxzZQotc3RhdGljIGludAorc3RhdGljIHUxNgogcmVhZHdvcmQodW5zaWduZWQgbG9uZyBiYXNlX2FkZHIsIGludCBwb3J0bm8pCiB7CiAJcmV0dXJuIGludyhiYXNlX2FkZHIgKyBwb3J0bm8pOwogfQogCiBzdGF0aWMgdm9pZAotd3JpdGV3b3JkKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyLCBpbnQgcG9ydG5vLCBpbnQgdmFsdWUpCit3cml0ZXdvcmQodW5zaWduZWQgbG9uZyBiYXNlX2FkZHIsIGludCBwb3J0bm8sIHUxNiB2YWx1ZSkKIHsKIAlvdXR3KHZhbHVlLCBiYXNlX2FkZHIgKyBwb3J0bm8pOwogfQogI2VuZGlmCi0jZW5kaWYKIAogc3RhdGljIHZvaWQKIHJlYWR3b3Jkcyh1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgaW50IHBvcnRubywgdm9pZCAqYnVmLCBpbnQgbGVuZ3RoKQpAQCAtMzg0LDExICs0MDQsMTEgQEAKIAl1OCAqYnVmOCA9ICh1OCAqKWJ1ZjsKIAogCWRvIHsKLQkJdTMyIHRtcDMyOworCQl1MTYgdG1wMTY7CiAKLQkJdG1wMzIgPSByZWFkd29yZChiYXNlX2FkZHIsIHBvcnRubyk7Ci0JCSpidWY4KysgPSAodTgpdG1wMzI7Ci0JCSpidWY4KysgPSAodTgpKHRtcDMyID4+IDgpOworCQl0bXAxNiA9IHJlYWR3b3JkKGJhc2VfYWRkciwgcG9ydG5vKTsKKwkJKmJ1ZjgrKyA9ICh1OCl0bXAxNjsKKwkJKmJ1ZjgrKyA9ICh1OCkodG1wMTYgPj4gOCk7CiAJfSB3aGlsZSAoLS1sZW5ndGgpOwogfQogCkBAIC0zOTgsMjMgKzQxOCwyMyBAQAogCXU4ICpidWY4ID0gKHU4ICopYnVmOwogCiAJZG8gewotCQl1MzIgdG1wMzI7CisJCXUxNiB0bXAxNjsKIAotCQl0bXAzMiA9ICpidWY4Kys7Ci0JCXRtcDMyIHw9ICgqYnVmOCsrKSA8PCA4OwotCQl3cml0ZXdvcmQoYmFzZV9hZGRyLCBwb3J0bm8sIHRtcDMyKTsKKwkJdG1wMTYgPSAqYnVmOCsrOworCQl0bXAxNiB8PSAoKmJ1ZjgrKykgPDwgODsKKwkJd3JpdGV3b3JkKGJhc2VfYWRkciwgcG9ydG5vLCB0bXAxNik7CiAJfSB3aGlsZSAoLS1sZW5ndGgpOwogfQogCi1zdGF0aWMgaW50Ci1yZWFkcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWdubykKK3N0YXRpYyB1MTYKK3JlYWRyZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHJlZ25vKQogewogCXdyaXRld29yZChkZXYtPmJhc2VfYWRkciwgQUREX1BPUlQsIHJlZ25vKTsKIAlyZXR1cm4gcmVhZHdvcmQoZGV2LT5iYXNlX2FkZHIsIERBVEFfUE9SVCk7CiB9CiAKIHN0YXRpYyB2b2lkCi13cml0ZXJlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVnbm8sIGludCB2YWx1ZSkKK3dyaXRlcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiByZWdubywgdTE2IHZhbHVlKQogewogCXdyaXRld29yZChkZXYtPmJhc2VfYWRkciwgQUREX1BPUlQsIHJlZ25vKTsKIAl3cml0ZXdvcmQoZGV2LT5iYXNlX2FkZHIsIERBVEFfUE9SVCwgdmFsdWUpOwpAQCAtNzgwLDcgKzgwMCw3IEBACiAJfSBlbHNlIHsKIAkJaSA9IGxwLT5pc2FfY29uZmlnICYgSU5UX05PX01BU0s7CiAJCWlmIChscC0+Y2hpcF90eXBlID09IENTODkwMCkgewotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfUE5YMDEwWCkKKyNpZiBkZWZpbmVkKENPTkZJR19NQUNIX0lYRFAyMzUxKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX0lYRFAyWDAxKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMFgpCiAJCSAgICAgICAgaSA9IGNzODkwMF9pcnFfbWFwWzBdOwogI2Vsc2UKIAkJCS8qIFRyYW5zbGF0ZSB0aGUgSVJRIHVzaW5nIHRoZSBJUlEgbWFwcGluZyB0YWJsZS4gKi8KQEAgLTEwMTIsNyArMTAzMiw3IEBACiAKIHZvaWQgIF9faW5pdCByZXNldF9jaGlwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0jaWZuZGVmIENPTkZJR19BUkNIX0lYRFAyWDAxCisjaWYgIWRlZmluZWQoQ09ORklHX01BQ0hfSVhEUDIzNTEpICYmICFkZWZpbmVkKENPTkZJR19BUkNIX0lYRFAyWDAxKQogCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAjZW5kaWYKQEAgLTEwMjMsNyArMTA0Myw3IEBACiAJLyogd2FpdCAzMCBtcyAqLwogCW1zbGVlcCgzMCk7CiAKLSNpZm5kZWYgQ09ORklHX0FSQ0hfSVhEUDJYMDEKKyNpZiAhZGVmaW5lZChDT05GSUdfTUFDSF9JWERQMjM1MSkgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpCiAJaWYgKGxwLT5jaGlwX3R5cGUgIT0gQ1M4OTAwKSB7CiAJCS8qIEhhcmR3YXJlIHByb2JsZW0gcmVxdWlyZXMgUE5QIHJlZ2lzdGVycyB0byBiZSByZWNvbmZpZ3VyZWQgYWZ0ZXIgYSByZXNldCAqLwogCQl3cml0ZXdvcmQoaW9hZGRyLCBBRERfUE9SVCwgUFBfQ1M4OTIwX0lTQUlOVCk7CkBAIC0xMjg3LDcgKzEzMDcsNyBAQAogCWVsc2UKICNlbmRpZgogCXsKLSNpZiAhZGVmaW5lZChDT05GSUdfQVJDSF9JWERQMlgwMSkgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfUE5YMDEwWCkKKyNpZiAhZGVmaW5lZChDT05GSUdfTUFDSF9JWERQMjM1MSkgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpICYmICFkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMFgpCiAJCWlmICgoKDEgPDwgZGV2LT5pcnEpICYgbHAtPmlycV9tYXApID09IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IElSUSAlZCBpcyBub3QgaW4gb3VyIG1hcCBvZiBhbGxvd2FibGUgSVJRcywgd2hpY2ggaXMgJXhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSwgbHAtPmlycV9tYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMC5jIGIvZHJpdmVycy9uZXQvZTEwMC5jCmluZGV4IDIzZGUyMjYuLjQ3MjY3MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAuYworKysgYi9kcml2ZXJzL25ldC9lMTAwLmMKQEAgLTU5Miw3ICs1OTIsNyBAQAogCSh2b2lkKXJlYWRiKCZuaWMtPmNzci0+c2NiLnN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX2VuYWJsZV9pcnEoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgZTEwMF9lbmFibGVfaXJxKHN0cnVjdCBuaWMgKm5pYykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC02MDIsNyArNjAyLDcgQEAKIAllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX2Rpc2FibGVfaXJxKHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyB2b2lkIGUxMDBfZGlzYWJsZV9pcnEoc3RydWN0IG5pYyAqbmljKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTc5MSw3ICs3OTEsNyBAQAogCiAjZGVmaW5lIEUxMDBfV0FJVF9TQ0JfVElNRU9VVCAyMDAwMCAvKiB3ZSBtaWdodCBoYXZlIHRvIHdhaXQgMTAwbXMhISEgKi8KICNkZWZpbmUgRTEwMF9XQUlUX1NDQl9GQVNUIDIwICAgICAgIC8qIGRlbGF5IGxpa2UgdGhlIG9sZCBjb2RlICovCi1zdGF0aWMgaW5saW5lIGludCBlMTAwX2V4ZWNfY21kKHN0cnVjdCBuaWMgKm5pYywgdTggY21kLCBkbWFfYWRkcl90IGRtYV9hZGRyKQorc3RhdGljIGludCBlMTAwX2V4ZWNfY21kKHN0cnVjdCBuaWMgKm5pYywgdTggY21kLCBkbWFfYWRkcl90IGRtYV9hZGRyKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGk7CkBAIC04MjIsNyArODIyLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBlMTAwX2V4ZWNfY2Ioc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIGludCBlMTAwX2V4ZWNfY2Ioc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCXZvaWQgKCpjYl9wcmVwYXJlKShzdHJ1Y3QgbmljICosIHN0cnVjdCBjYiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKSkKIHsKIAlzdHJ1Y3QgY2IgKmNiOwpAQCAtMTU2Nyw3ICsxNTY3LDcgQEAKIAltb2RfdGltZXIoJm5pYy0+d2F0Y2hkb2csIGppZmZpZXMgKyBFMTAwX1dBVENIRE9HX1BFUklPRCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX3htaXRfcHJlcGFyZShzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBjYiAqY2IsCitzdGF0aWMgdm9pZCBlMTAwX3htaXRfcHJlcGFyZShzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBjYiAqY2IsCiAJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAljYi0+Y29tbWFuZCA9IG5pYy0+dHhfY29tbWFuZDsKQEAgLTE2MTcsNyArMTYxNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGUxMDBfdHhfY2xlYW4oc3RydWN0IG5pYyAqbmljKQorc3RhdGljIGludCBlMTAwX3R4X2NsZWFuKHN0cnVjdCBuaWMgKm5pYykKIHsKIAlzdHJ1Y3QgY2IgKmNiOwogCWludCB0eF9jbGVhbmVkID0gMDsKQEAgLTE3MjgsNyArMTcyOCw3IEBACiB9CiAKICNkZWZpbmUgUkZEX0JVRl9MRU4gKHNpemVvZihzdHJ1Y3QgcmZkKSArIFZMQU5fRVRIX0ZSQU1FX0xFTikKLXN0YXRpYyBpbmxpbmUgaW50IGUxMDBfcnhfYWxsb2Nfc2tiKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHJ4ICpyeCkKK3N0YXRpYyBpbnQgZTEwMF9yeF9hbGxvY19za2Ioc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcnggKnJ4KQogewogCWlmKCEocngtPnNrYiA9IGRldl9hbGxvY19za2IoUkZEX0JVRl9MRU4gKyBORVRfSVBfQUxJR04pKSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNzYyLDcgKzE3NjIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBlMTAwX3J4X2luZGljYXRlKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHJ4ICpyeCwKK3N0YXRpYyBpbnQgZTEwMF9yeF9pbmRpY2F0ZShzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCByeCAqcngsCiAJdW5zaWduZWQgaW50ICp3b3JrX2RvbmUsIHVuc2lnbmVkIGludCB3b3JrX3RvX2RvKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSByeC0+c2tiOwpAQCAtMTgyMiw3ICsxODIyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGUxMDBfcnhfY2xlYW4oc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBpbnQgKndvcmtfZG9uZSwKK3N0YXRpYyB2b2lkIGUxMDBfcnhfY2xlYW4oc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBpbnQgKndvcmtfZG9uZSwKIAl1bnNpZ25lZCBpbnQgd29ya190b19kbykKIHsKIAlzdHJ1Y3QgcnggKnJ4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2IxMDAwLmMgYi9kcml2ZXJzL25ldC9zYjEwMDAuYwppbmRleCBkNjM4OGUxLi43NjEzOTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zYjEwMDAuYworKysgYi9kcml2ZXJzL25ldC9zYjEwMDAuYwpAQCAtOTQsNyArOTQsNyBAQAogCWNvbnN0IGNoYXIqIG5hbWUpOwogc3RhdGljIGlubGluZSBpbnQgY2FyZF93YWl0X2Zvcl9yZWFkeShjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCiAJdW5zaWduZWQgY2hhciBpbltdKTsKLXN0YXRpYyBpbmxpbmUgaW50IGNhcmRfc2VuZF9jb21tYW5kKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKK3N0YXRpYyBpbnQgY2FyZF9zZW5kX2NvbW1hbmQoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgb3V0W10sIHVuc2lnbmVkIGNoYXIgaW5bXSk7CiAKIC8qIFNCMTAwMCBoYXJkd2FyZSByb3V0aW5lcyB0byBiZSB1c2VkIGR1cmluZyBmcmFtZSByeCBpbnRlcnJ1cHQgKi8KQEAgLTMwOSw3ICszMDksNyBAQAogfQogCiAvKiBDYXJkIFNlbmQgQ29tbWFuZCAoY2Fubm90IGJlIHVzZWQgZHVyaW5nIGFuIGludGVycnVwdCkgKi8KLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBjYXJkX3NlbmRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCiAJY29uc3QgdW5zaWduZWQgY2hhciBvdXRbXSwgdW5zaWduZWQgY2hhciBpbltdKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV9yeC5jCmluZGV4IGZmYWM1MDguLjRiMTNiNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3J4LmMKQEAgLTQzNSw3ICs0MzUsNyBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBob3N0YXBfcnhfZnJhbWVfbWdtdChsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgIHN0cnVjdCBob3N0YXBfODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0cywgdTE2IHR5cGUsCiAJCSAgICAgdTE2IHN0eXBlKQpAQCAtNDk5LDcgKzQ5OSw3IEBACiAKIAogLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICpwcmlzbTJfcnhfZ2V0X3dkcyhsb2NhbF9pbmZvX3QgKmxvY2FsLAorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpwcmlzbTJfcnhfZ2V0X3dkcyhsb2NhbF9pbmZvX3QgKmxvY2FsLAogCQkJCQkJICAgdTggKmFkZHIpCiB7CiAJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlID0gTlVMTDsKQEAgLTUxOSw3ICs1MTksNyBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBob3N0YXBfcnhfZnJhbWVfd2RzKGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHIsCiAJCSAgICB1MTYgZmMsIHN0cnVjdCBuZXRfZGV2aWNlICoqd2RzKQogewpAQCAtNjE1LDcgKzYxNSw3IEBACiAKIAogLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogaG9zdGFwX3J4X2ZyYW1lX2RlY3J5cHQobG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQpCiB7CkBAIC02NTQsNyArNjU0LDcgQEAKIAogCiAvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBob3N0YXBfcnhfZnJhbWVfZGVjcnlwdF9tc2R1KGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgIGludCBrZXlpZHgsIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2h3LmMKaW5kZXggYWJmYWU3Zi4uYjFmMTQyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaHcuYwpAQCAtMjUzLDcgKzI1Myw3IEBACiAgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKICAqIEBlbnRyeTogUHJpc20yIGNvbW1hbmQgcXVldWUgZW50cnkgdG8gYmUgaXNzdWVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGhmYTM4NHhfY21kX2lzc3VlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IGhmYTM4NHhfY21kX2lzc3VlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBob3N0YXBfY21kX3F1ZXVlICplbnRyeSkKIHsKIAlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CkBAIC03NDMsNyArNzQzLDcgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludCBoZmEzODR4X3dhaXRfb2Zmc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBvX29mZikKK3N0YXRpYyBpbnQgaGZhMzg0eF93YWl0X29mZnNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb19vZmYpCiB7CiAJaW50IHRyaWVzID0gSEZBMzg0WF9CQVBfQlVTWV9USU1FT1VUOwogCWludCByZXMgPSBIRkEzODRYX0lOVyhvX29mZikgJiBIRkEzODRYX09GRlNFVF9CVVNZOwpAQCAtMTkwNCw3ICsxOTA0LDcgQEAKICAqIGFuZCB3aWxsIHRyeSB0byBnZXQgdGhlIGNvcnJlY3QgZmlkIGV2ZW50dWFsbHkuICovCiAjZGVmaW5lIEVYVFJBX0ZJRF9SRUFEX1RFU1RTCiAKLXN0YXRpYyBpbmxpbmUgdTE2IHByaXNtMl9yZWFkX2ZpZF9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHJlZykKK3N0YXRpYyB1MTYgcHJpc20yX3JlYWRfZmlkX3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgcmVnKQogewogI2lmZGVmIEVYVFJBX0ZJRF9SRUFEX1RFU1RTCiAJdTE2IHZhbCwgdmFsMiwgdmFsMzsKQEAgLTI1ODEsNyArMjU4MSw3IEBACiAKIAogLyogQ2FsbGVkIG9ubHkgZnJvbSBoYXJkd2FyZSBJUlEgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmlzbTJfY2hlY2tfbWFnaWMobG9jYWxfaW5mb190ICpsb2NhbCkKK3N0YXRpYyB2b2lkIHByaXNtMl9jaGVja19tYWdpYyhsb2NhbF9pbmZvX3QgKmxvY2FsKQogewogCS8qIGF0IGxlYXN0IFBDSSBQcmlzbTIuNSB3aXRoIGJ1cyBtYXN0ZXJpbmcgc2VlbXMgdG8gc29tZXRpbWVzCiAJICogcmV0dXJuIDB4MDAwMCBpbiBTV1NVUFBPUlQwIGZvciB1bmtub3duIHJlYXNvbiwgYnV0IHJlLXJlYWRpbmcgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKaW5kZXggY2YwNTY2MS4uNzUxODM4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwpAQCAtNDExLDcgKzQxMSw3IEBACiAJd3JpdGVfcmVnaXN0ZXIoZGV2LCBJUFdfUkVHX0FVVE9JTkNSRU1FTlRfREFUQSwgdmFsKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX25pY19tZW1vcnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGFkZHIsIHUzMiBsZW4sCitzdGF0aWMgdm9pZCB3cml0ZV9uaWNfbWVtb3J5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyLCB1MzIgbGVuLAogCQkJCSAgICBjb25zdCB1OCAqIGJ1ZikKIHsKIAl1MzIgYWxpZ25lZF9hZGRyOwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJCQkJICAgICpidWYpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9uaWNfbWVtb3J5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyLCB1MzIgbGVuLAorc3RhdGljIHZvaWQgcmVhZF9uaWNfbWVtb3J5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyLCB1MzIgbGVuLAogCQkJCSAgIHU4ICogYnVmKQogewogCXUzMiBhbGlnbmVkX2FkZHI7CkBAIC02NTcsNyArNjU3LDcgQEAKIAogI2RlZmluZSBNQVhfUkVTRVRfQkFDS09GRiAxMAogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2NoZWR1bGVfcmVzZXQoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIHNjaGVkdWxlX3Jlc2V0KHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCiB7CiAJdW5zaWduZWQgbG9uZyBub3cgPSBnZXRfc2Vjb25kcygpOwogCkBAIC0xMTMwLDcgKzExMzAsNyBAQAogCXdyaXRlX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfR1BJTywgcmVnKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmZfa2lsbF9hY3RpdmUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgcmZfa2lsbF9hY3RpdmUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKIHsKICNkZWZpbmUgTUFYX1JGX0tJTExfQ0hFQ0tTIDUKICNkZWZpbmUgUkZfS0lMTF9DSEVDS19ERUxBWSA0MApAQCAtMjE3Nyw3ICsyMTc3LDcgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBpbnQgaXB3MjEwMF9hbGxvY19za2Ioc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKK3N0YXRpYyBpbnQgaXB3MjEwMF9hbGxvY19za2Ioc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKIAkJCQkgICAgc3RydWN0IGlwdzIxMDBfcnhfcGFja2V0ICpwYWNrZXQpCiB7CiAJcGFja2V0LT5za2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaXB3MjEwMF9yeCkpOwpAQCAtMjIwMSw3ICsyMjAxLDcgQEAKICNkZWZpbmUgU0VBUkNIX1NOQVBTSE9UIDEKIAogI2RlZmluZSBTTkFQU0hPVF9BRERSKG9mcykgKHByaXYtPnNuYXBzaG90Wygob2ZzKSA+PiAxMikgJiAweGZmXSArICgob2ZzKSAmIDB4ZmZmKSkKLXN0YXRpYyBpbmxpbmUgaW50IGlwdzIxMDBfc25hcHNob3RfYWxsb2Moc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgaXB3MjEwMF9zbmFwc2hvdF9hbGxvYyhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQogewogCWludCBpOwogCWlmIChwcml2LT5zbmFwc2hvdFswXSkKQEAgLTIyMjEsNyArMjIyMSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcHcyMTAwX3NuYXBzaG90X2ZyZWUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGlwdzIxMDBfc25hcHNob3RfZnJlZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQogewogCWludCBpOwogCWlmICghcHJpdi0+c25hcHNob3RbMF0pCkBAIC0yMjMxLDcgKzIyMzEsNyBAQAogCXByaXYtPnNuYXBzaG90WzBdID0gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgaXB3MjEwMF9tYXRjaF9idWYoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgdTggKiBpbl9idWYsCitzdGF0aWMgdTMyIGlwdzIxMDBfbWF0Y2hfYnVmKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHU4ICogaW5fYnVmLAogCQkJCSAgICBzaXplX3QgbGVuLCBpbnQgbW9kZSkKIHsKIAl1MzIgaSwgajsKQEAgLTIyODgsNyArMjI4OCw3IEBACiBzdGF0aWMgdTggcGFja2V0X2RhdGFbSVBXX1JYX05JQ19CVUZGRVJfTEVOR1RIXTsKICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXB3MjEwMF9jb3JydXB0aW9uX2RldGVjdGVkKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGludCBpKQorc3RhdGljIHZvaWQgaXB3MjEwMF9jb3JydXB0aW9uX2RldGVjdGVkKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGludCBpKQogewogI2lmZGVmIENPTkZJR19JUFcyMTAwX0RFQlVHX0MzCiAJc3RydWN0IGlwdzIxMDBfc3RhdHVzICpzdGF0dXMgPSAmcHJpdi0+c3RhdHVzX3F1ZXVlLmRydltpXTsKQEAgLTIzNDYsNyArMjM0Niw3IEBACiAJc2NoZWR1bGVfcmVzZXQocHJpdik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpc3Jfcngoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgaW50IGksCitzdGF0aWMgdm9pZCBpc3Jfcngoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgaW50IGksCiAJCQkgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQogewogCXN0cnVjdCBpcHcyMTAwX3N0YXR1cyAqc3RhdHVzID0gJnByaXYtPnN0YXR1c19xdWV1ZS5kcnZbaV07CkBAIC0yNDI1LDcgKzI0MjUsNyBAQAogCXByaXYtPnJ4X3F1ZXVlLmRydltpXS5ob3N0X2FkZHIgPSBwYWNrZXQtPmRtYV9hZGRyOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpcHcyMTAwX2NvcnJ1cHRpb25fY2hlY2soc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgaW50IGkpCitzdGF0aWMgaW50IGlwdzIxMDBfY29ycnVwdGlvbl9jaGVjayhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LCBpbnQgaSkKIHsKIAlzdHJ1Y3QgaXB3MjEwMF9zdGF0dXMgKnN0YXR1cyA9ICZwcml2LT5zdGF0dXNfcXVldWUuZHJ2W2ldOwogCXN0cnVjdCBpcHcyMTAwX3J4ICp1ID0gcHJpdi0+cnhfYnVmZmVyc1tpXS5yeHA7CkBAIC0yNDgxLDcgKzI0ODEsNyBAQAogICogVGhlIFdSSVRFIGluZGV4IGlzIGNhY2hlZCBpbiB0aGUgdmFyaWFibGUgJ3ByaXYtPnJ4X3F1ZXVlLm5leHQnLgogICoKICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9faXB3MjEwMF9yeF9wcm9jZXNzKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCitzdGF0aWMgdm9pZCBfX2lwdzIxMDBfcnhfcHJvY2VzcyhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQogewogCXN0cnVjdCBpcHcyMTAwX2JkX3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhfcXVldWU7CiAJc3RydWN0IGlwdzIxMDBfc3RhdHVzX3F1ZXVlICpzcSA9ICZwcml2LT5zdGF0dXNfcXVldWU7CkBAIC0yNjM0LDcgKzI2MzQsNyBAQAogICogZm9yIHVzZSBieSBmdXR1cmUgY29tbWFuZCBhbmQgZGF0YSBwYWNrZXRzLgogICoKICAqLwotc3RhdGljIGlubGluZSBpbnQgX19pcHcyMTAwX3R4X3Byb2Nlc3Moc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgX19pcHcyMTAwX3R4X3Byb2Nlc3Moc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgaXB3MjEwMF9iZF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4X3F1ZXVlOwogCXN0cnVjdCBpcHcyMTAwX2JkICp0YmQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKaW5kZXggY2RmZTUwMi4uODE5YmUyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYwpAQCAtODEzLDcgKzgxMyw3IEBACiAJdXAoJnByaXYtPnNlbSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lwd19sZWRfYWN0aXZpdHlfb24oc3RydWN0IGlwd19wcml2ICpwcml2KQorc3RhdGljIHZvaWQgX19pcHdfbGVkX2FjdGl2aXR5X29uKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKIHsKIAl1MzIgbGVkOwogCkBAIC0xNTA4LDcgKzE1MDgsNyBAQAogc3RhdGljIERFVklDRV9BVFRSKGRpcmVjdF9kd29yZCwgU19JV1VTUiB8IFNfSVJVR08sCiAJCSAgIHNob3dfZGlyZWN0X2R3b3JkLCBzdG9yZV9kaXJlY3RfZHdvcmQpOwogCi1zdGF0aWMgaW5saW5lIGludCByZl9raWxsX2FjdGl2ZShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCitzdGF0aWMgaW50IHJmX2tpbGxfYWN0aXZlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKIHsKIAlpZiAoMCA9PSAoaXB3X3JlYWQzMihwcml2LCAweDMwKSAmIDB4MTAwMDApKQogCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1JGX0tJTExfSFc7CkBAIC0yMzU5LDcgKzIzNTksNyBAQAogfQogCiAvKiBwZXJmb3JtIGEgY2hpcCBzZWxlY3Qgb3BlcmF0aW9uICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVwcm9tX2NzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGVlcHJvbV9jcyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCiB7CiAJZWVwcm9tX3dyaXRlX3JlZyhwcml2LCAwKTsKIAllZXByb21fd3JpdGVfcmVnKHByaXYsIEVFUFJPTV9CSVRfQ1MpOwpAQCAtMjM2OCw3ICsyMzY4LDcgQEAKIH0KIAogLyogcGVyZm9ybSBhIGNoaXAgc2VsZWN0IG9wZXJhdGlvbiAqLwotc3RhdGljIGlubGluZSB2b2lkIGVlcHJvbV9kaXNhYmxlX2NzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGVlcHJvbV9kaXNhYmxlX2NzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKIHsKIAllZXByb21fd3JpdGVfcmVnKHByaXYsIEVFUFJPTV9CSVRfQ1MpOwogCWVlcHJvbV93cml0ZV9yZWcocHJpdiwgMCk7CkBAIC0yNDc1LDcgKzI0NzUsNyBAQAogCUlQV19ERUJVR19UUkFDRSgiPDxcbiIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXB3X3plcm9fbWVtb3J5KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIHN0YXJ0LCB1MzIgY291bnQpCitzdGF0aWMgdm9pZCBpcHdfemVyb19tZW1vcnkoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgc3RhcnQsIHUzMiBjb3VudCkKIHsKIAljb3VudCA+Pj0gMjsKIAlpZiAoIWNvdW50KQpAQCAtMjc3Miw3ICsyNzcyLDcgQEAKIAlyZXR1cm4gaXB3X3JlYWQzMihwcml2LCAweDkwKSA9PSAweGQ1NTU1NWQ1OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpcHdfcG9sbF9iaXQoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgYWRkciwgdTMyIG1hc2ssCitzdGF0aWMgaW50IGlwd19wb2xsX2JpdChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiBhZGRyLCB1MzIgbWFzaywKIAkJCSAgICAgICBpbnQgdGltZW91dCkKIHsKIAlpbnQgaSA9IDA7CkBAIC0zMTUwLDcgKzMxNTAsNyBAQAogCiAjZGVmaW5lIElQV19SWF9CVUZfU0laRSAoMzAwMCkKIAotc3RhdGljIGlubGluZSB2b2lkIGlwd19yeF9xdWV1ZV9yZXNldChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCitzdGF0aWMgdm9pZCBpcHdfcnhfcXVldWVfcmVzZXQoc3RydWN0IGlwd19wcml2ICpwcml2LAogCQkJCSAgICAgIHN0cnVjdCBpcHdfcnhfcXVldWUgKnJ4cSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzYwOCw3ICszNjA4LDcgQEAKIAlpcHdfcXVldWVfdHhfZnJlZShwcml2LCAmcHJpdi0+dHhxWzNdKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGlwd19jcmVhdGVfYnNzaWQoc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqIGJzc2lkKQorc3RhdGljIHZvaWQgaXB3X2NyZWF0ZV9ic3NpZChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4ICogYnNzaWQpCiB7CiAJLyogRmlyc3QgMyBieXRlcyBhcmUgbWFudWZhY3R1cmVyICovCiAJYnNzaWRbMF0gPSBwcml2LT5tYWNfYWRkclswXTsKQEAgLTM2MjIsNyArMzYyMiw3IEBACiAJYnNzaWRbMF0gfD0gMHgwMjsJLyogc2V0IGxvY2FsIGFzc2lnbm1lbnQgYml0IChJRUVFODAyKSAqLwogfQogCi1zdGF0aWMgaW5saW5lIHU4IGlwd19hZGRfc3RhdGlvbihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4ICogYnNzaWQpCitzdGF0aWMgdTggaXB3X2FkZF9zdGF0aW9uKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTggKiBic3NpZCkKIHsKIAlzdHJ1Y3QgaXB3X3N0YXRpb25fZW50cnkgZW50cnk7CiAJaW50IGk7CkBAIC0zNjU1LDcgKzM2NTUsNyBAQAogCXJldHVybiBpOwogfQogCi1zdGF0aWMgaW5saW5lIHU4IGlwd19maW5kX3N0YXRpb24oc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqIGJzc2lkKQorc3RhdGljIHU4IGlwd19maW5kX3N0YXRpb24oc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqIGJzc2lkKQogewogCWludCBpOwogCkBAIC0zNzk0LDcgKzM3OTQsNyBAQAogCW1lbXNldChhdmcsIDAsIHNpemVvZigqYXZnKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGlubGluZSBhdmVyYWdlX2FkZChzdHJ1Y3QgYXZlcmFnZSAqYXZnLCBzMTYgdmFsKQorc3RhdGljIHZvaWQgYXZlcmFnZV9hZGQoc3RydWN0IGF2ZXJhZ2UgKmF2ZywgczE2IHZhbCkKIHsKIAlhdmctPnN1bSAtPSBhdmctPmVudHJpZXNbYXZnLT5wb3NdOwogCWF2Zy0+c3VtICs9IHZhbDsKQEAgLTM4MDUsNyArMzgwNSw3IEBACiAJfQogfQogCi1zdGF0aWMgczE2IGlubGluZSBhdmVyYWdlX3ZhbHVlKHN0cnVjdCBhdmVyYWdlICphdmcpCitzdGF0aWMgczE2IGF2ZXJhZ2VfdmFsdWUoc3RydWN0IGF2ZXJhZ2UgKmF2ZykKIHsKIAlpZiAoIXVubGlrZWx5KGF2Zy0+aW5pdCkpIHsKIAkJaWYgKGF2Zy0+cG9zKQpAQCAtMzg0Nyw3ICszODQ3LDcgQEAKIAogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBpcHdfZ2V0X21heF9yYXRlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3N0YXRpYyB1MzIgaXB3X2dldF9tYXhfcmF0ZShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCiB7CiAJdTMyIGkgPSAweDgwMDAwMDAwOwogCXUzMiBtYXNrID0gcHJpdi0+cmF0ZXNfbWFzazsKQEAgLTQwODcsNyArNDA4Nyw3IEBACiAgKiByb2FtaW5nX3RocmVzaG9sZCAtPiBkaXNhc3NvY2lhdGVfdGhyZXNob2xkLCBzY2FuIGFuZCByb2FtIGZvciBiZXR0ZXIgc2lnbmFsLgogICogQWJvdmUgZGlzYXNzb2NpYXRlIHRocmVzaG9sZCwgZ2l2ZSB1cCBhbmQgc3RvcCBzY2FubmluZy4KICAqIFJvYW1pbmcgaXMgZGlzYWJsZWQgaWYgZGlzYXNzb2NpYXRlX3RocmVzaG9sZCA8PSByb2FtaW5nX3RocmVzaG9sZCAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpcHdfaGFuZGxlX21pc3NlZF9iZWFjb24oc3RydWN0IGlwd19wcml2ICpwcml2LAorc3RhdGljIHZvaWQgaXB3X2hhbmRsZV9taXNzZWRfYmVhY29uKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKIAkJCQkJICAgIGludCBtaXNzZWRfY291bnQpCiB7CiAJcHJpdi0+bm90aWZfbWlzc2VkX2JlYWNvbnMgPSBtaXNzZWRfY291bnQ7CkBAIC00MTU3LDcgKzQxNTcsNyBAQAogICogSGFuZGxlIGhvc3Qgbm90aWZpY2F0aW9uIHBhY2tldC4KICAqIENhbGxlZCBmcm9tIGludGVycnVwdCByb3V0aW5lCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpcHdfcnhfbm90aWZpY2F0aW9uKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKK3N0YXRpYyB2b2lkIGlwd19yeF9ub3RpZmljYXRpb24oc3RydWN0IGlwd19wcml2ICpwcml2LAogCQkJCSAgICAgICBzdHJ1Y3QgaXB3X3J4X25vdGlmaWNhdGlvbiAqbm90aWYpCiB7CiAJbm90aWYtPnNpemUgPSBsZTE2X3RvX2NwdShub3RpZi0+c2l6ZSk7CkBAIC01MDk1LDcgKzUwOTUsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXB3X2NvcHlfcmF0ZXMoc3RydWN0IGlwd19zdXBwb3J0ZWRfcmF0ZXMgKmRlc3QsCitzdGF0aWMgdm9pZCBpcHdfY29weV9yYXRlcyhzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyAqZGVzdCwKIAkJCQkgIGNvbnN0IHN0cnVjdCBpcHdfc3VwcG9ydGVkX3JhdGVzICpzcmMpCiB7CiAJdTggaTsKQEAgLTU4NTYsNyArNTg1Niw3IEBACiAjZGVmaW5lIGlwd19kZWJ1Z19jb25maWcoeCkgZG8ge30gd2hpbGUgKDApCiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB2b2lkIGlwd19zZXRfZml4ZWRfcmF0ZShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIGludCBtb2RlKQorc3RhdGljIHZvaWQgaXB3X3NldF9maXhlZF9yYXRlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgaW50IG1vZGUpCiB7CiAJLyogVE9ETzogVmVyaWZ5IHRoYXQgdGhpcyB3b3Jrcy4uLiAqLwogCXN0cnVjdCBpcHdfZml4ZWRfcmF0ZSBmciA9IHsKQEAgLTc2MzQsNyArNzYzNCw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBpbnQgaXNfbmV0d29ya19wYWNrZXQoc3RydWN0IGlwd19wcml2ICpwcml2LAorc3RhdGljIGludCBpc19uZXR3b3JrX3BhY2tldChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCiAJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZWFkZXIpCiB7CiAJLyogRmlsdGVyIGluY29taW5nIHBhY2tldHMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIHRhcmdldHRlZCB0b3dhcmQKQEAgLTc2NzIsNyArNzY3Miw3IEBACiAKICNkZWZpbmUgSVBXX1BBQ0tFVF9SRVRSWV9USU1FIEhaCiAKLXN0YXRpYyBpbmxpbmUgaW50IGlzX2R1cGxpY2F0ZV9wYWNrZXQoc3RydWN0IGlwd19wcml2ICpwcml2LAorc3RhdGljICBpbnQgaXNfZHVwbGljYXRlX3BhY2tldChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCiAJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhlYWRlcikKIHsKIAl1MTYgc2MgPSBsZTE2X3RvX2NwdShoZWFkZXItPnNlcV9jdGwpOwpAQCAtOTU4MSw3ICs5NTgxLDcgQEAKIAogLyogbmV0IGRldmljZSBzdHVmZiAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9zeXNfY29uZmlnKHN0cnVjdCBpcHdfc3lzX2NvbmZpZyAqc3lzX2NvbmZpZykKK3N0YXRpYyAgdm9pZCBpbml0X3N5c19jb25maWcoc3RydWN0IGlwd19zeXNfY29uZmlnICpzeXNfY29uZmlnKQogewogCW1lbXNldChzeXNfY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGlwd19zeXNfY29uZmlnKSk7CiAJc3lzX2NvbmZpZy0+YnRfY29leGlzdGVuY2UgPSAxOwkvKiBXZSBtYXkgbmVlZCB0byBsb29rIGludG8gcHJ2U3RhQnRDb25maWcgKi8KQEAgLTk2MjcsNyArOTYyNyw3IEBACiB3ZSBuZWVkIHRvIGhlYXZpbHkgbW9kaWZ5IHRoZSBpZWVlODAyMTFfc2tiX3RvX3R4Yi4KICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IGlwd190eF9za2Ioc3RydWN0IGlwd19wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLAorc3RhdGljIGludCBpcHdfdHhfc2tiKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiwKIAkJCSAgICAgaW50IHByaSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMKaW5kZXggYjBkOGI1Yi4uZmYxOTJlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAgKiBXcml0ZSB0byBjYXJkJ3MgSG9zdCBBZGFwdGVyIENvbW1hbmQgUmVnaXN0ZXIuIEluY2x1ZGUgYSBkZWxheSBmb3IKICAqIHRob3NlIHRpbWVzIHdoZW4gaXQgaXMgbmVlZGVkLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaGFjcl93cml0ZV9zbG93KHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgaGFjcikKK3N0YXRpYyB2b2lkIGhhY3Jfd3JpdGVfc2xvdyh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCiB7CiAJaGFjcl93cml0ZShpb2FkZHIsIGhhY3IpOwogCS8qIGRlbGF5IG1pZ2h0IG9ubHkgYmUgbmVlZGVkIHNvbWV0aW1lcyAqLwpAQCAtMjQyLDcgKzI0Miw3IEBACiAgKiBUaGUgV2luZG93cyBkcml2ZXJzIGRvbid0IHVzZSB0aGUgQ1JDLCBidXQgdGhlIEFQIGFuZCB0aGUgUHRQIHRvb2wKICAqIGRlcGVuZCBvbiBpdC4KICAqLwotc3RhdGljIGlubGluZSB1MTYgcHNhX2NyYyh1OCAqIHBzYSwJLyogVGhlIFBTQSAqLworc3RhdGljIHUxNiBwc2FfY3JjKHU4ICogcHNhLAkvKiBUaGUgUFNBICovCiAJCQkgICAgICBpbnQgc2l6ZSkKIHsJCQkJLyogTnVtYmVyIG9mIHNob3J0IGZvciBDUkMgKi8KIAlpbnQgYnl0ZV9jbnQ7CQkvKiBMb29wIG9uIHRoZSBQU0EgKi8KQEAgLTMxMCw3ICszMTAsNyBAQAogLyoKICAqIFdyaXRlIDEgYnl0ZSB0byB0aGUgTU1DLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbW1jX291dCh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IG8sIHU4IGQpCitzdGF0aWMgdm9pZCBtbWNfb3V0KHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgbywgdTggZCkKIHsKIAlpbnQgY291bnQgPSAwOwogCkBAIC0zMjYsNyArMzI2LDcgQEAKICAqIFJvdXRpbmUgdG8gd3JpdGUgYnl0ZXMgdG8gdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KICAqIFdlIHN0YXJ0IGF0IHRoZSBlbmQgYmVjYXVzZSBpdCBpcyB0aGUgd2F5IGl0IHNob3VsZCBiZSEKICAqLwotc3RhdGljIGlubGluZSB2b2lkIG1tY193cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTggbywgdTggKiBiLCBpbnQgbikKK3N0YXRpYyB2b2lkIG1tY193cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTggbywgdTggKiBiLCBpbnQgbikKIHsKIAlvICs9IG47CiAJYiArPSBuOwpAQCAtMzQwLDcgKzM0MCw3IEBACiAgKiBSZWFkIGEgYnl0ZSBmcm9tIHRoZSBNTUMuCiAgKiBPcHRpbWlzZWQgdmVyc2lvbiBmb3IgMSBieXRlLCBhdm9pZCB1c2luZyBtZW1vcnkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdTggbW1jX2luKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgbykKK3N0YXRpYyB1OCBtbWNfaW4odW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBvKQogewogCWludCBjb3VudCA9IDA7CiAKQEAgLTU4Nyw3ICs1ODcsNyBAQAogICogU2V0IGNoYW5uZWwgYXR0ZW50aW9uIGJpdCBhbmQgYnVzeSB3YWl0IHVudGlsIGNvbW1hbmQgaGFzCiAgKiBjb21wbGV0ZWQsIHRoZW4gYWNrbm93bGVkZ2UgY29tcGxldGlvbiBvZiB0aGUgY29tbWFuZC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgd3Zfc3luY2hyb25vdXNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBjb25zdCBjaGFyICpzdHIpCitzdGF0aWMgaW50IHd2X3N5bmNocm9ub3VzX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgY29uc3QgY2hhciAqc3RyKQogewogCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwpAQCAtNjMzLDcgKzYzMyw3IEBACiAgKiBDb25maWd1cmF0aW9uIGNvbW1hbmRzIGNvbXBsZXRpb24gaW50ZXJydXB0LgogICogQ2hlY2sgaWYgZG9uZSwgYW5kIGlmIE9LLgogICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogd3ZfY29uZmlnX2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIGlvYWRkciwgbmV0X2xvY2FsICogbHApCiB7CiAJdW5zaWduZWQgc2hvcnQgbWNzX2FkZHI7CkBAIC04NDMsNyArODQzLDcgQEAKICAqIHdhdmVsYW5faW50ZXJydXB0IGlzIG5vdCBhbiBvcHRpb24pLCBzbyB5b3UgbWF5IGV4cGVyaWVuY2UKICAqIGRlbGF5cyBzb21ldGltZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB3dl84MjU4Nl9yZWNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3N0YXRpYyB2b2lkIHd2XzgyNTg2X3JlY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQogewogCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTI4MSw3ICsxMjgxLDcgQEAKICAqIFRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHdoaWNoIGlzIGRpc3BsYXllZCBieSB0aGUgZHJpdmVyIGF0IHN0YXJ0dXAuCiAgKiBUaGVyZSBhcmUgbG90cyBvZiBmbGFncyBmb3IgY29uZmlndXJpbmcgaXQgdG8geW91ciBsaWtpbmcuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB3dl9pbml0X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCB3dl9pbml0X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCiB7CiAJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwpAQCAtMTUwMiw3ICsxNTAyLDcgQEAKICAqIEl0J3MgYSBiaXQgY29tcGxpY2F0ZWQgYW5kIHlvdSBkb24ndCByZWFsbHkgd2FudCB0byBsb29rIGludG8gaXQuCiAgKiAoY2FsbGVkIGluIHdhdmVsYW5faW9jdGwpCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHd2X3NldF9mcmVxdWVuY3kodW5zaWduZWQgbG9uZyBpb2FkZHIsCS8qIEkvTyBwb3J0IG9mIHRoZSBjYXJkICovCitzdGF0aWMgaW50IHd2X3NldF9mcmVxdWVuY3kodW5zaWduZWQgbG9uZyBpb2FkZHIsCS8qIEkvTyBwb3J0IG9mIHRoZSBjYXJkICovCiAJCQkJICAgaXdfZnJlcSAqIGZyZXF1ZW5jeSkKIHsKIAljb25zdCBpbnQgQkFORF9OVU0gPSAxMDsJLyogTnVtYmVyIG9mIGJhbmRzICovCkBAIC0xNjc3LDcgKzE2NzcsNyBAQAogLyoKICAqIEdpdmUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGZyZXF1ZW5jaWVzLgogICovCi1zdGF0aWMgaW5saW5lIGludCB3dl9mcmVxdWVuY3lfbGlzdCh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KK3N0YXRpYyBpbnQgd3ZfZnJlcXVlbmN5X2xpc3QodW5zaWduZWQgbG9uZyBpb2FkZHIsCS8qIEkvTyBwb3J0IG9mIHRoZSBjYXJkICovCiAJCQkJICAgIGl3X2ZyZXEgKiBsaXN0LAkvKiBMaXN0IG9mIGZyZXF1ZW5jaWVzIHRvIGZpbGwgKi8KIAkJCQkgICAgaW50IG1heCkKIHsJCQkJLyogTWF4aW11bSBudW1iZXIgb2YgZnJlcXVlbmNpZXMgKi8KQEAgLTI0ODksNyArMjQ4OSw3IEBACiAgKiBOb3RlOiBpZiBhbnkgZXJyb3JzIG9jY3VyLCB0aGUgcGFja2V0IGlzICJkcm9wcGVkIG9uIHRoZSBmbG9vciIuCiAgKiAoY2FsbGVkIGJ5IHd2X3BhY2tldF9yY3YoKSkKICAqLwotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogd3ZfcGFja2V0X3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHUxNiBidWZfb2ZmLCBpbnQgc2tzaXplKQogewogCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKQEAgLTI1ODUsNyArMjU4NSw3IEBACiAgKiAoY2FsbGVkIGluIHdhdmVsYW5faW50ZXJydXB0KCkpLgogICogTm90ZSA6IHRoZSBzcGlubG9jayBpcyBhbHJlYWR5IGdyYWJiZWQgZm9yIHVzLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgd3ZfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3N0YXRpYyB2b2lkIHd2X3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKIAluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CkBAIC0yNzY4LDcgKzI3NjgsNyBAQAogICoKICAqIChjYWxsZWQgaW4gd2F2ZWxhbl9wYWNrZXRfeG1pdCgpKQogICovCi1zdGF0aWMgaW5saW5lIGludCB3dl9wYWNrZXRfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHZvaWQgKmJ1Ziwgc2hvcnQgbGVuZ3RoKQorc3RhdGljIGludCB3dl9wYWNrZXRfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHZvaWQgKmJ1Ziwgc2hvcnQgbGVuZ3RoKQogewogCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwpAQCAtMjk2NCw3ICsyOTY0LDcgQEAKICAqIFJvdXRpbmUgdG8gaW5pdGlhbGl6ZSB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgogICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQogICovCi1zdGF0aWMgaW5saW5lIGludCB3dl9tbWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3N0YXRpYyBpbnQgd3ZfbW1jX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKIAluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CkBAIC0zMTM2LDcgKzMxMzYsNyBAQAogICogU3RhcnQgdGhlIHJlY2VpdmUgdW5pdC4KICAqIChjYWxsZWQgYnkgd3ZfaHdfcmVzZXQoKSkKICAqLwotc3RhdGljIGlubGluZSBpbnQgd3ZfcnVfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCitzdGF0aWMgaW50IHd2X3J1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQogewogCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwpAQCAtMzIyOCw3ICszMjI4LDcgQEAKICAqCiAgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCkpCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHd2X2N1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQorc3RhdGljIGludCB3dl9jdV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKIHsKIAluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKQEAgLTMzMjksNyArMzMyOSw3IEBACiAgKgogICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQogICovCi1zdGF0aWMgaW5saW5lIGludCB3dl84MjU4Nl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3N0YXRpYyBpbnQgd3ZfODI1ODZfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCiB7CiAJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwogCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CkBAIC0zNjQxLDcgKzM2NDEsNyBAQAogICogV2F2ZUxBTiBjb250cm9sbGVyIChpODI1ODYpLgogICogKGNhbGxlZCBieSB3YXZlbGFuX2Nsb3NlKCkpCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB3dl84MjU4Nl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQorc3RhdGljIHZvaWQgd3ZfODI1ODZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKIHsKIAluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwppbmRleCA3MTQ2YjY5Li4wYWExNGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCkBAIC0zODAsOCArMzgwLDYgQEAKIAkvKiBpbml0aWFsaXplIGNvbW1vbiBkcml2ZXIgZmllbGRzICovCiAJZHJ2LT5kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsKIAlkcnYtPmRyaXZlci5idXMgPSAmcGNpX2J1c190eXBlOwotCWRydi0+ZHJpdmVyLnByb2JlID0gcGNpX2RldmljZV9wcm9iZTsKLQlkcnYtPmRyaXZlci5yZW1vdmUgPSBwY2lfZGV2aWNlX3JlbW92ZTsKIAkvKiBGSVhNRSwgb25jZSBhbGwgb2YgdGhlIGV4aXN0aW5nIFBDSSBkcml2ZXJzIGhhdmUgYmVlbiBmaXhlZCB0byBzZXQKIAkgKiB0aGUgcGNpIHNodXRkb3duIGZ1bmN0aW9uLCB0aGlzIHRlc3QgY2FuIGdvIGF3YXkuICovCiAJaWYgKCFkcnYtPmRyaXZlci5zaHV0ZG93bikKQEAgLTUxMyw2ICs1MTEsOCBAQAogCS5uYW1lCQk9ICJwY2kiLAogCS5tYXRjaAkJPSBwY2lfYnVzX21hdGNoLAogCS51ZXZlbnQJCT0gcGNpX3VldmVudCwKKwkucHJvYmUJCT0gcGNpX2RldmljZV9wcm9iZSwKKwkucmVtb3ZlCQk9IHBjaV9kZXZpY2VfcmVtb3ZlLAogCS5zdXNwZW5kCT0gcGNpX2RldmljZV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gcGNpX2RldmljZV9yZXN1bWUsCiAJLmRldl9hdHRycwk9IHBjaV9kZXZfYXR0cnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9kcy5jIGIvZHJpdmVycy9wY21jaWEvZHMuYwppbmRleCA2MjFlYzQ1Li4wYTQyNGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9kcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKQEAgLTMxMSw4ICszMTEsNiBAQAogCS8qIGluaXRpYWxpemUgY29tbW9uIGZpZWxkcyAqLwogCWRyaXZlci0+ZHJ2LmJ1cyA9ICZwY21jaWFfYnVzX3R5cGU7CiAJZHJpdmVyLT5kcnYub3duZXIgPSBkcml2ZXItPm93bmVyOwotCWRyaXZlci0+ZHJ2LnByb2JlID0gcGNtY2lhX2RldmljZV9wcm9iZTsKLQlkcml2ZXItPmRydi5yZW1vdmUgPSBwY21jaWFfZGV2aWNlX3JlbW92ZTsKIAogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJ2KTsKIH0KQEAgLTEyMDAsNiArMTE5OCw4IEBACiAJLnVldmVudCA9IHBjbWNpYV9idXNfdWV2ZW50LAogCS5tYXRjaCA9IHBjbWNpYV9idXNfbWF0Y2gsCiAJLmRldl9hdHRycyA9IHBjbWNpYV9kZXZfYXR0cnMsCisJLnByb2JlID0gcGNtY2lhX2RldmljZV9wcm9iZSwKKwkucmVtb3ZlID0gcGNtY2lhX2RldmljZV9yZW1vdmUsCiAJLnN1c3BlbmQgPSBwY21jaWFfZGV2X3N1c3BlbmQsCiAJLnJlc3VtZSA9IHBjbWNpYV9kZXZfcmVzdW1lLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2RyaXZlci5jIGIvZHJpdmVycy9wbnAvZHJpdmVyLmMKaW5kZXggMTVmYjc1OC4uN2NhZmFjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9wbnAvZHJpdmVyLmMKQEAgLTE5NSw2ICsxOTUsOCBAQAogc3RydWN0IGJ1c190eXBlIHBucF9idXNfdHlwZSA9IHsKIAkubmFtZQk9ICJwbnAiLAogCS5tYXRjaAk9IHBucF9idXNfbWF0Y2gsCisJLnByb2JlCT0gcG5wX2RldmljZV9wcm9iZSwKKwkucmVtb3ZlCT0gcG5wX2RldmljZV9yZW1vdmUsCiAJLnN1c3BlbmQgPSBwbnBfYnVzX3N1c3BlbmQsCiAJLnJlc3VtZSA9IHBucF9idXNfcmVzdW1lLAogfTsKQEAgLTIxNSw4ICsyMTcsNiBAQAogCiAJZHJ2LT5kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsKIAlkcnYtPmRyaXZlci5idXMgPSAmcG5wX2J1c190eXBlOwotCWRydi0+ZHJpdmVyLnByb2JlID0gcG5wX2RldmljZV9wcm9iZTsKLQlkcnYtPmRyaXZlci5yZW1vdmUgPSBwbnBfZGV2aWNlX3JlbW92ZTsKIAogCWNvdW50ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9yaW8tZHJpdmVyLmMgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLWRyaXZlci5jCmluZGV4IGRjNzQ5NjAuLjU0ODAxMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmFwaWRpby9yaW8tZHJpdmVyLmMKKysrIGIvZHJpdmVycy9yYXBpZGlvL3Jpby1kcml2ZXIuYwpAQCAtMTQ3LDggKzE0Nyw2IEBACiAJLyogaW5pdGlhbGl6ZSBjb21tb24gZHJpdmVyIGZpZWxkcyAqLwogCXJkcnYtPmRyaXZlci5uYW1lID0gcmRydi0+bmFtZTsKIAlyZHJ2LT5kcml2ZXIuYnVzID0gJnJpb19idXNfdHlwZTsKLQlyZHJ2LT5kcml2ZXIucHJvYmUgPSByaW9fZGV2aWNlX3Byb2JlOwotCXJkcnYtPmRyaXZlci5yZW1vdmUgPSByaW9fZGV2aWNlX3JlbW92ZTsKIAogCS8qIHJlZ2lzdGVyIHdpdGggY29yZSAqLwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnJkcnYtPmRyaXZlcik7CkBAIC0yMDQsNyArMjAyLDkgQEAKIHN0cnVjdCBidXNfdHlwZSByaW9fYnVzX3R5cGUgPSB7CiAJLm5hbWUgPSAicmFwaWRpbyIsCiAJLm1hdGNoID0gcmlvX21hdGNoX2J1cywKLQkuZGV2X2F0dHJzID0gcmlvX2Rldl9hdHRycworCS5kZXZfYXR0cnMgPSByaW9fZGV2X2F0dHJzLAorCS5wcm9iZSA9IHJpb19kZXZpY2VfcHJvYmUsCisJLnJlbW92ZSA9IHJpb19kZXZpY2VfcmVtb3ZlLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwppbmRleCA5YzI1NjU0Li5lZjRjNjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKQEAgLTE2MzUsNyArMTYzNSw3IEBACiAJYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyhkZXZpY2UtPnJlcXVlc3RfcXVldWUsIC0xTCk7CiAJYmxrX3F1ZXVlX21heF9zZWdtZW50X3NpemUoZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLCAtMUwpOwogCWJsa19xdWV1ZV9zZWdtZW50X2JvdW5kYXJ5KGRldmljZS0+cmVxdWVzdF9xdWV1ZSwgLTFMKTsKLQlibGtfcXVldWVfb3JkZXJlZChkZXZpY2UtPnJlcXVlc3RfcXVldWUsIDEpOworCWJsa19xdWV1ZV9vcmRlcmVkKGRldmljZS0+cmVxdWVzdF9xdWV1ZSwgUVVFVUVfT1JERVJFRF9UQUcsIE5VTEwpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9haXJxLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2FpcnEuYwppbmRleCA4M2U2YTA2Li5jZDJjYzI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2FpcnEuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2FpcnEuYwpAQCAtMiwxMiArMiwxMiBAQAogICogIGRyaXZlcnMvczM5MC9jaW8vYWlycS5jCiAgKiAgIFMvMzkwIGNvbW1vbiBJL08gcm91dGluZXMgLS0gc3VwcG9ydCBmb3IgYWRhcHRlciBpbnRlcnJ1cHRpb25zCiAgKgotICogICAkUmV2aXNpb246IDEuMTIgJAorICogICAkUmV2aXNpb246IDEuMTUgJAogICoKICAqICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgICAgICBJQk0gQ29ycG9yYXRpb24KICAqICAgIEF1dGhvcihzKTogSW5nbyBBZGx1bmcgKGFkbHVuZ0BkZS5pYm0uY29tKQotICoJCSBDb3JuZWxpYSBIdWNrIChjb2h1Y2tAZGUuaWJtLmNvbSkKKyAqCQkgQ29ybmVsaWEgSHVjayAoY29ybmVsaWEuaHVja0BkZS5pYm0uY29tKQogICoJCSBBcm5kIEJlcmdtYW5uIChhcm5kYkBkZS5pYm0uY29tKQogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vYmxhY2tsaXN0LmMgYi9kcml2ZXJzL3MzOTAvY2lvL2JsYWNrbGlzdC5jCmluZGV4IGRhZjIxZTAuLjcyZjI3YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vYmxhY2tsaXN0LmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9ibGFja2xpc3QuYwpAQCAtMSwxMiArMSwxMiBAQAogLyoKICAqICBkcml2ZXJzL3MzOTAvY2lvL2JsYWNrbGlzdC5jCiAgKiAgIFMvMzkwIGNvbW1vbiBJL08gcm91dGluZXMgLS0gYmxhY2tsaXN0aW5nIG9mIHNwZWNpZmljIGRldmljZXMKLSAqICAgJFJldmlzaW9uOiAxLjM5ICQKKyAqICAgJFJldmlzaW9uOiAxLjQyICQKICAqCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMiBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKICAqCQkJICAgICAgSUJNIENvcnBvcmF0aW9uCiAgKiAgICBBdXRob3Iocyk6IEluZ28gQWRsdW5nIChhZGx1bmdAZGUuaWJtLmNvbSkKLSAqCQkgQ29ybmVsaWEgSHVjayAoY29odWNrQGRlLmlibS5jb20pCisgKgkJIENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKICAqCQkgQXJuZCBCZXJnbWFubiAoYXJuZGJAZGUuaWJtLmNvbSkKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMKaW5kZXggZTg0OTI4OS4uNmMwNzdhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwpAQCAtMSwxMiArMSwxMiBAQAogLyoKICAqICBkcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMKICAqICBidXMgZHJpdmVyIGZvciBjY3dncm91cAotICogICAkUmV2aXNpb246IDEuMzMgJAorICogICAkUmV2aXNpb246IDEuMzUgJAogICoKICAqICAgIENvcHlyaWdodCAoQykgMjAwMiBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKICAqICAgICAgICAgICAgICAgICAgICAgICBJQk0gQ29ycG9yYXRpb24KICAqICAgIEF1dGhvcihzKTogQXJuZCBCZXJnbWFubiAoYXJuZGJAZGUuaWJtLmNvbSkKLSAqICAgICAgICAgICAgICAgQ29ybmVsaWEgSHVjayAoY29odWNrQGRlLmlibS5jb20pCisgKiAgICAgICAgICAgICAgIENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC01MiwxMSArNTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGJ1c190eXBlIGNjd2dyb3VwX2J1c190eXBlID0gewotCS5uYW1lICAgID0gImNjd2dyb3VwIiwKLQkubWF0Y2ggICA9IGNjd2dyb3VwX2J1c19tYXRjaCwKLQkudWV2ZW50ID0gY2N3Z3JvdXBfdWV2ZW50LAotfTsKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgY2N3Z3JvdXBfYnVzX3R5cGU7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogX19jY3dncm91cF9yZW1vdmVfc3ltbGlua3Moc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldikKQEAgLTM4OSw2ICszODUsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBidXNfdHlwZSBjY3dncm91cF9idXNfdHlwZSA9IHsKKwkubmFtZSAgID0gImNjd2dyb3VwIiwKKwkubWF0Y2ggID0gY2N3Z3JvdXBfYnVzX21hdGNoLAorCS51ZXZlbnQgPSBjY3dncm91cF91ZXZlbnQsCisJLnByb2JlICA9IGNjd2dyb3VwX3Byb2JlLAorCS5yZW1vdmUgPSBjY3dncm91cF9yZW1vdmUsCit9OworCiBpbnQKIGNjd2dyb3VwX2RyaXZlcl9yZWdpc3RlciAoc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqY2RyaXZlcikKIHsKQEAgLTM5Niw4ICs0MDAsNiBAQAogCWNkcml2ZXItPmRyaXZlciA9IChzdHJ1Y3QgZGV2aWNlX2RyaXZlcikgewogCQkuYnVzID0gJmNjd2dyb3VwX2J1c190eXBlLAogCQkubmFtZSA9IGNkcml2ZXItPm5hbWUsCi0JCS5wcm9iZSA9IGNjd2dyb3VwX3Byb2JlLAotCQkucmVtb3ZlID0gY2N3Z3JvdXBfcmVtb3ZlLAogCX07CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZjZHJpdmVyLT5kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYwppbmRleCA3MjcwODA4Li4yY2JiNzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYwpAQCAtMSwxMiArMSwxMiBAQAogLyoKICAqICBkcml2ZXJzL3MzOTAvY2lvL2Noc2MuYwogICogICBTLzM5MCBjb21tb24gSS9PIHJvdXRpbmVzIC0tIGNoYW5uZWwgc3Vic3lzdGVtIGNhbGwKLSAqICAgJFJldmlzaW9uOiAxLjEyNiAkCisgKiAgICRSZXZpc2lvbjogMS4xMjggJAogICoKICAqICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgICAgICBJQk0gQ29ycG9yYXRpb24KICAqICAgIEF1dGhvcihzKTogSW5nbyBBZGx1bmcgKGFkbHVuZ0BkZS5pYm0uY29tKQotICoJCSBDb3JuZWxpYSBIdWNrIChjb2h1Y2tAZGUuaWJtLmNvbSkKKyAqCQkgQ29ybmVsaWEgSHVjayAoY29ybmVsaWEuaHVja0BkZS5pYm0uY29tKQogICoJCSBBcm5kIEJlcmdtYW5uIChhcm5kYkBkZS5pYm0uY29tKQogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCmluZGV4IDczNzZiYzguLjYyMjNiMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwpAQCAtMSwxMiArMSwxMiBAQAogLyoKICAqICBkcml2ZXJzL3MzOTAvY2lvL2Npby5jCiAgKiAgIFMvMzkwIGNvbW1vbiBJL08gcm91dGluZXMgLS0gbG93IGxldmVsIGkvbyBjYWxscwotICogICAkUmV2aXNpb246IDEuMTM4ICQKKyAqICAgJFJldmlzaW9uOiAxLjE0MCAkCiAgKgogICogICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsCiAgKgkJCSAgICAgIElCTSBDb3Jwb3JhdGlvbgogICogICAgQXV0aG9yKHMpOiBJbmdvIEFkbHVuZyAoYWRsdW5nQGRlLmlibS5jb20pCi0gKgkJIENvcm5lbGlhIEh1Y2sgKGNvaHVja0BkZS5pYm0uY29tKQorICoJCSBDb3JuZWxpYSBIdWNrIChjb3JuZWxpYS5odWNrQGRlLmlibS5jb20pCiAgKgkJIEFybmQgQmVyZ21hbm4gKGFybmRiQGRlLmlibS5jb20pCiAgKgkJIE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKaW5kZXggZTU2NTE5My4uNTE2MTA4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCkBAIC0xLDEyICsxLDEyIEBACiAvKgogICogIGRyaXZlcnMvczM5MC9jaW8vY3NzLmMKICAqICBkcml2ZXIgZm9yIGNoYW5uZWwgc3Vic3lzdGVtCi0gKiAgICRSZXZpc2lvbjogMS45MyAkCisgKiAgICRSZXZpc2lvbjogMS45NiAkCiAgKgogICogICAgQ29weXJpZ2h0IChDKSAyMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgSUJNIENvcnBvcmF0aW9uCiAgKiAgICBBdXRob3Iocyk6IEFybmQgQmVyZ21hbm4gKGFybmRiQGRlLmlibS5jb20pCi0gKgkJIENvcm5lbGlhIEh1Y2sgKGNvaHVja0BkZS5pYm0uY29tKQorICoJCSBDb3JuZWxpYSBIdWNrIChjb3JuZWxpYS5odWNrQGRlLmlibS5jb20pCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC01NDIsOSArNTQyLDQxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK2Nzc19wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CisKKwlzY2ggPSB0b19zdWJjaGFubmVsKGRldik7CisJc2NoLT5kcml2ZXIgPSBjb250YWluZXJfb2YgKGRldi0+ZHJpdmVyLCBzdHJ1Y3QgY3NzX2RyaXZlciwgZHJ2KTsKKwlyZXR1cm4gKHNjaC0+ZHJpdmVyLT5wcm9iZSA/IHNjaC0+ZHJpdmVyLT5wcm9iZShzY2gpIDogMCk7Cit9CisKK3N0YXRpYyBpbnQKK2Nzc19yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOworCisJc2NoID0gdG9fc3ViY2hhbm5lbChkZXYpOworCXJldHVybiAoc2NoLT5kcml2ZXItPnJlbW92ZSA/IHNjaC0+ZHJpdmVyLT5yZW1vdmUoc2NoKSA6IDApOworfQorCitzdGF0aWMgdm9pZAorY3NzX3NodXRkb3duIChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKKworCXNjaCA9IHRvX3N1YmNoYW5uZWwoZGV2KTsKKwlpZiAoc2NoLT5kcml2ZXItPnNodXRkb3duKQorCQlzY2gtPmRyaXZlci0+c2h1dGRvd24oc2NoKTsKK30KKwogc3RydWN0IGJ1c190eXBlIGNzc19idXNfdHlwZSA9IHsKLQkubmFtZSAgPSAiY3NzIiwKLQkubWF0Y2ggPSAmY3NzX2J1c19tYXRjaCwKKwkubmFtZSAgICAgPSAiY3NzIiwKKwkubWF0Y2ggICAgPSBjc3NfYnVzX21hdGNoLAorCS5wcm9iZSAgICA9IGNzc19wcm9iZSwKKwkucmVtb3ZlICAgPSBjc3NfcmVtb3ZlLAorCS5zaHV0ZG93biA9IGNzc19zaHV0ZG93biwKIH07CiAKIHN1YnN5c19pbml0Y2FsbChpbml0X2NoYW5uZWxfc3Vic3lzdGVtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oCmluZGV4IDI1MWViZDcuLmI2Mzc1ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuaApAQCAtMTE1LDYgKzExNSw3IEBACiAgKiBDdXJyZW50bHksIHdlIG9ubHkgY2FyZSBhYm91dCBJL08gc3ViY2hhbm5lbHMgKHR5cGUgMCksIHRoZXNlCiAgKiBoYXZlIGEgY2N3X2RldmljZSBjb25uZWN0ZWQgdG8gdGhlbS4KICAqLworc3RydWN0IHN1YmNoYW5uZWw7CiBzdHJ1Y3QgY3NzX2RyaXZlciB7CiAJdW5zaWduZWQgaW50IHN1YmNoYW5uZWxfdHlwZTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcnY7CkBAIC0xMjIsNiArMTIzLDkgQEAKIAlpbnQgKCpub3RpZnkpKHN0cnVjdCBkZXZpY2UgKiwgaW50KTsKIAl2b2lkICgqdmVyaWZ5KShzdHJ1Y3QgZGV2aWNlICopOwogCXZvaWQgKCp0ZXJtaW5hdGlvbikoc3RydWN0IGRldmljZSAqKTsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHN1YmNoYW5uZWwgKik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdWJjaGFubmVsICopOwogfTsKIAogLyoKQEAgLTE0Myw3ICsxNDcsNyBAQAogc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtIHsKIAl1OCBjc3NpZDsKIAlpbnQgdmFsaWQ7Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwc1tfX01BWF9DSFBJRF07CisJc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwc1tfX01BWF9DSFBJRCArIDFdOwogCXN0cnVjdCBkZXZpY2UgZGV2aWNlOwogCXN0cnVjdCBwZ2lkIGdsb2JhbF9wZ2lkOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCmluZGV4IGZhM2U0YzAuLmE2N2U3ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwpAQCAtMSwxMiArMSwxMiBAQAogLyoKICAqICBkcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCiAgKiAgYnVzIGRyaXZlciBmb3IgY2N3IGRldmljZXMKLSAqICAgJFJldmlzaW9uOiAxLjEzNyAkCisgKiAgICRSZXZpc2lvbjogMS4xNDAgJAogICoKICAqICAgIENvcHlyaWdodCAoQykgMjAwMiBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKICAqCQkJIElCTSBDb3Jwb3JhdGlvbgogICogICAgQXV0aG9yKHMpOiBBcm5kIEJlcmdtYW5uIChhcm5kYkBkZS5pYm0uY29tKQotICoJCSBDb3JuZWxpYSBIdWNrIChjb2h1Y2tAZGUuaWJtLmNvbSkKKyAqCQkgQ29ybmVsaWEgSHVjayAoY29ybmVsaWEuaHVja0BkZS5pYm0uY29tKQogICoJCSBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTEwNywzMyArMTA3LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBidXNfdHlwZSBjY3dfYnVzX3R5cGUgPSB7Ci0JLm5hbWUgID0gImNjdyIsCi0JLm1hdGNoID0gJmNjd19idXNfbWF0Y2gsCi0JLnVldmVudCA9ICZjY3dfdWV2ZW50LAotfTsKK3N0cnVjdCBidXNfdHlwZSBjY3dfYnVzX3R5cGU7CiAKLXN0YXRpYyBpbnQgaW9fc3ViY2hhbm5lbF9wcm9iZSAoc3RydWN0IGRldmljZSAqKTsKLXN0YXRpYyBpbnQgaW9fc3ViY2hhbm5lbF9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IGlvX3N1YmNoYW5uZWxfcHJvYmUgKHN0cnVjdCBzdWJjaGFubmVsICopOworc3RhdGljIGludCBpb19zdWJjaGFubmVsX3JlbW92ZSAoc3RydWN0IHN1YmNoYW5uZWwgKik7CiB2b2lkIGlvX3N1YmNoYW5uZWxfaXJxIChzdHJ1Y3QgZGV2aWNlICopOwogc3RhdGljIGludCBpb19zdWJjaGFubmVsX25vdGlmeShzdHJ1Y3QgZGV2aWNlICosIGludCk7CiBzdGF0aWMgdm9pZCBpb19zdWJjaGFubmVsX3ZlcmlmeShzdHJ1Y3QgZGV2aWNlICopOwogc3RhdGljIHZvaWQgaW9fc3ViY2hhbm5lbF9pb3Rlcm0oc3RydWN0IGRldmljZSAqKTsKLXN0YXRpYyB2b2lkIGlvX3N1YmNoYW5uZWxfc2h1dGRvd24oc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyB2b2lkIGlvX3N1YmNoYW5uZWxfc2h1dGRvd24oc3RydWN0IHN1YmNoYW5uZWwgKik7CiAKIHN0cnVjdCBjc3NfZHJpdmVyIGlvX3N1YmNoYW5uZWxfZHJpdmVyID0gewogCS5zdWJjaGFubmVsX3R5cGUgPSBTVUJDSEFOTkVMX1RZUEVfSU8sCiAJLmRydiA9IHsKIAkJLm5hbWUgPSAiaW9fc3ViY2hhbm5lbCIsCiAJCS5idXMgID0gJmNzc19idXNfdHlwZSwKLQkJLnByb2JlID0gJmlvX3N1YmNoYW5uZWxfcHJvYmUsCi0JCS5yZW1vdmUgPSAmaW9fc3ViY2hhbm5lbF9yZW1vdmUsCi0JCS5zaHV0ZG93biA9ICZpb19zdWJjaGFubmVsX3NodXRkb3duLAogCX0sCiAJLmlycSA9IGlvX3N1YmNoYW5uZWxfaXJxLAogCS5ub3RpZnkgPSBpb19zdWJjaGFubmVsX25vdGlmeSwKIAkudmVyaWZ5ID0gaW9fc3ViY2hhbm5lbF92ZXJpZnksCiAJLnRlcm1pbmF0aW9uID0gaW9fc3ViY2hhbm5lbF9pb3Rlcm0sCisJLnByb2JlID0gaW9fc3ViY2hhbm5lbF9wcm9iZSwKKwkucmVtb3ZlID0gaW9fc3ViY2hhbm5lbF9yZW1vdmUsCisJLnNodXRkb3duID0gaW9fc3ViY2hhbm5lbF9zaHV0ZG93biwKIH07CiAKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpjY3dfZGV2aWNlX3dvcms7CkBAIC04MDMsMTQgKzc5OSwxMiBAQAogfQogCiBzdGF0aWMgaW50Ci1pb19zdWJjaGFubmVsX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpwZGV2KQoraW9fc3ViY2hhbm5lbF9wcm9iZSAoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKIHsKLQlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCWludCByYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc2NoID0gdG9fc3ViY2hhbm5lbChwZGV2KTsKIAlpZiAoc2NoLT5kZXYuZHJpdmVyX2RhdGEpIHsKIAkJLyoKIAkJICogVGhpcyBzdWJjaGFubmVsIGFscmVhZHkgaGFzIGFuIGFzc29jaWF0ZWQgY2N3X2RldmljZS4KQEAgLTg0Niw3ICs4NDAsNyBAQAogCW1lbXNldChjZGV2LT5wcml2YXRlLCAwLCBzaXplb2Yoc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSkpOwogCWF0b21pY19zZXQoJmNkZXYtPnByaXZhdGUtPm9ub2ZmLCAwKTsKIAljZGV2LT5kZXYgPSAoc3RydWN0IGRldmljZSkgewotCQkucGFyZW50ID0gcGRldiwKKwkJLnBhcmVudCA9ICZzY2gtPmRldiwKIAkJLnJlbGVhc2UgPSBjY3dfZGV2aWNlX3JlbGVhc2UsCiAJfTsKIAlJTklUX0xJU1RfSEVBRCgmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLmVudHJ5KTsKQEAgLTg1OSw3ICs4NTMsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlyYyA9IGlvX3N1YmNoYW5uZWxfcmVjb2coY2RldiwgdG9fc3ViY2hhbm5lbChwZGV2KSk7CisJcmMgPSBpb19zdWJjaGFubmVsX3JlY29nKGNkZXYsIHNjaCk7CiAJaWYgKHJjKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzY2gtPmxvY2ssIGZsYWdzKTsKIAkJc2NoLT5kZXYuZHJpdmVyX2RhdGEgPSBOVUxMOwpAQCAtODgzLDE3ICs4NzcsMTcgQEAKIH0KIAogc3RhdGljIGludAotaW9fc3ViY2hhbm5lbF9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldikKK2lvX3N1YmNoYW5uZWxfcmVtb3ZlIChzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQogewogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIWRldi0+ZHJpdmVyX2RhdGEpCisJaWYgKCFzY2gtPmRldi5kcml2ZXJfZGF0YSkKIAkJcmV0dXJuIDA7Ci0JY2RldiA9IGRldi0+ZHJpdmVyX2RhdGE7CisJY2RldiA9IHNjaC0+ZGV2LmRyaXZlcl9kYXRhOwogCS8qIFNldCBjY3cgZGV2aWNlIHRvIG5vdCBvcGVyYXRpb25hbCBhbmQgZHJvcCByZWZlcmVuY2UuICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwotCWRldi0+ZHJpdmVyX2RhdGEgPSBOVUxMOworCXNjaC0+ZGV2LmRyaXZlcl9kYXRhID0gTlVMTDsKIAljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9OT1RfT1BFUjsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKIAkvKgpAQCAtOTQ4LDE0ICs5NDIsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQKLWlvX3N1YmNoYW5uZWxfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoraW9fc3ViY2hhbm5lbF9zaHV0ZG93bihzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQogewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CiAJaW50IHJldDsKIAotCXNjaCA9IHRvX3N1YmNoYW5uZWwoZGV2KTsKLQljZGV2ID0gZGV2LT5kcml2ZXJfZGF0YTsKKwljZGV2ID0gc2NoLT5kZXYuZHJpdmVyX2RhdGE7CiAKIAlpZiAoY2lvX2lzX2NvbnNvbGUoc2NoLT5zY2hpZCkpCiAJCXJldHVybjsKQEAgLTExMjksNiArMTEyMSwxNCBAQAogCXJldHVybiAwOwogfQogCitzdHJ1Y3QgYnVzX3R5cGUgY2N3X2J1c190eXBlID0geworCS5uYW1lICAgPSAiY2N3IiwKKwkubWF0Y2ggID0gY2N3X2J1c19tYXRjaCwKKwkudWV2ZW50ID0gY2N3X3VldmVudCwKKwkucHJvYmUgID0gY2N3X2RldmljZV9wcm9iZSwKKwkucmVtb3ZlID0gY2N3X2RldmljZV9yZW1vdmUsCit9OworCiBpbnQKIGNjd19kcml2ZXJfcmVnaXN0ZXIgKHN0cnVjdCBjY3dfZHJpdmVyICpjZHJpdmVyKQogewpAQCAtMTEzNiw4ICsxMTM2LDYgQEAKIAogCWRydi0+YnVzID0gJmNjd19idXNfdHlwZTsKIAlkcnYtPm5hbWUgPSBjZHJpdmVyLT5uYW1lOwotCWRydi0+cHJvYmUgPSBjY3dfZGV2aWNlX3Byb2JlOwotCWRydi0+cmVtb3ZlID0gY2N3X2RldmljZV9yZW1vdmU7CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKGRydik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9mc20uYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCmluZGV4IDIzZDEyYjYuLmIzMDI3NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCkBAIC00LDcgKzQsNyBAQAogICoKICAqICAgIENvcHlyaWdodCAoQykgMjAwMiBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKICAqCQkJIElCTSBDb3Jwb3JhdGlvbgotICogICAgQXV0aG9yKHMpOiBDb3JuZWxpYSBIdWNrKGNvaHVja0BkZS5pYm0uY29tKQorICogICAgQXV0aG9yKHMpOiBDb3JuZWxpYSBIdWNrIChjb3JuZWxpYS5odWNrQGRlLmlibS5jb20pCiAgKgkJIE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9pZC5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfaWQuYwppbmRleCAwNGNlYmEzLi5lNjBiMmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9pZC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2lkLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogICAgQ29weXJpZ2h0IChDKSAyMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2soY29odWNrQGRlLmlibS5jb20pCisgKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKICAqCQkgTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQogICoKICAqIFNlbnNlIElEIGZ1bmN0aW9ucy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX29wcy5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKaW5kZXggMTQzYjZjMi4uOGIwMjE4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKQEAgLTEsMTIgKzEsMTIgQEAKIC8qCiAgKiAgZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKICAqCi0gKiAgICRSZXZpc2lvbjogMS41OCAkCisgKiAgICRSZXZpc2lvbjogMS42MSAkCiAgKgogICogICAgQ29weXJpZ2h0IChDKSAyMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgSUJNIENvcnBvcmF0aW9uCiAgKiAgICBBdXRob3Iocyk6IE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKLSAqICAgICAgICAgICAgICAgQ29ybmVsaWEgSHVjayAoY29odWNrQGRlLmlibS5jb20pCisgKiAgICAgICAgICAgICAgIENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfcGdpZC5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfcGdpZC5jCmluZGV4IDA1MjgzMmQuLmQyYTViMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3BnaWQuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9wZ2lkLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogICAgQ29weXJpZ2h0IChDKSAyMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2soY29odWNrQGRlLmlibS5jb20pCisgKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKICAqCQkgTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQogICoKICAqIFBhdGggR3JvdXAgSUQgZnVuY3Rpb25zLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfc3RhdHVzLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9zdGF0dXMuYwppbmRleCBkYjA5YzIwLi5kYWQ0ZGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9zdGF0dXMuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9zdGF0dXMuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDIgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsCiAgKgkJCSBJQk0gQ29ycG9yYXRpb24KLSAqICAgIEF1dGhvcihzKTogQ29ybmVsaWEgSHVjayhjb2h1Y2tAZGUuaWJtLmNvbSkKKyAqICAgIEF1dGhvcihzKTogQ29ybmVsaWEgSHVjayAoY29ybmVsaWEuaHVja0BkZS5pYm0uY29tKQogICoJCSBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pCiAgKgogICogU3RhdHVzIGFjY3VtdWxhdGlvbiBhbmQgYmFzaWMgc2Vuc2UgZnVuY3Rpb25zLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYwppbmRleCAzMGE4MzZmLi43N2JlMmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgMjAwMCwyMDAyIElCTSBDb3Jwb3JhdGlvbgogICogQXV0aG9yKHMpOiAgICAgICAgICAgICBVdHogQmFjaGVyIDx1dHouYmFjaGVyQGRlLmlibS5jb20+Ci0gKiAyLjYgY2lvIGludGVncmF0aW9uIGJ5IENvcm5lbGlhIEh1Y2sgPGNvaHVja0BkZS5pYm0uY29tPgorICogMi42IGNpbyBpbnRlZ3JhdGlvbiBieSBDb3JuZWxpYSBIdWNrIDxjb3JuZWxpYS5odWNrQGRlLmlibS5jb20+CiAgKgogICogUmVzdHJpY3Rpb246IG9ubHkgNjMgaXFkaW8gc3ViY2hhbm5lbHMgd291bGQgaGF2ZSBpdHMgb3duIGluZGljYXRvciwKICAqIGFmdGVyIHRoYXQsIHN1YnNlcXVlbnQgc3ViY2hhbm5lbHMgc2hhcmUgb25lIGluZGljYXRvcgpAQCAtNTYsNyArNTYsNyBAQAogI2luY2x1ZGUgImlvYXNtLmgiCiAjaW5jbHVkZSAiY2hzYy5oIgogCi0jZGVmaW5lIFZFUlNJT05fUURJT19DICIkUmV2aXNpb246IDEuMTE0ICQiCisjZGVmaW5lIFZFUlNJT05fUURJT19DICIkUmV2aXNpb246IDEuMTE3ICQiCiAKIC8qKioqKioqKioqKioqKioqKiogTU9EVUxFIFBBUkFNRVRFUiBWQVJJQUJMRVMgKioqKioqKioqKioqKioqKioqKiovCiBNT0RVTEVfQVVUSE9SKCJVdHogQmFjaGVyIDx1dHouYmFjaGVyQGRlLmlibS5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2N0Y21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvY3RjbWFpbi5jCmluZGV4IDBkYjRmNTcuLjE5MDFmZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvY3RjbWFpbi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogY3RjbWFpbi5jLHYgMS43OCAyMDA1LzA5LzA3IDEyOjE4OjAyIHBhdmxpYyBFeHAgJAorICogJElkOiBjdGNtYWluLmMsdiAxLjc5IDIwMDYvMDEvMTEgMTE6MzI6MTggY29odWNrIEV4cCAkCiAgKgogICogQ1RDIC8gRVNDT04gbmV0d29yayBkcml2ZXIKICAqCkBAIC04LDcgKzgsNyBAQAogICogRml4ZXMgYnkgOiBKb2NoZW4gUvZocmlnIChyb2VocmlnQGRlLmlibS5jb20pCiAgKiAgICAgICAgICAgIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgogCSAgICAgIFBldGVyIFRpZWRlbWFubiAocHRpZWRlbUBkZS5pYm0uY29tKQotICogRHJpdmVyIE1vZGVsIHN0dWZmIGJ5IDogQ29ybmVsaWEgSHVjayA8Y29odWNrQGRlLmlibS5jb20+CisgKiBEcml2ZXIgTW9kZWwgc3R1ZmYgYnkgOiBDb3JuZWxpYSBIdWNrIDxodWNrY0BkZS5pYm0uY29tPgogICoKICAqIERvY3VtZW50YXRpb24gdXNlZDoKICAqICAtIFByaW5jaXBsZXMgb2YgT3BlcmF0aW9uIChJQk0gZG9jIzogU0EyMi03MjAxLTA2KQpAQCAtMzcsNyArMzcsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICoKLSAqIFJFTEVBU0UtVEFHOiBDVEMvRVNDT04gbmV0d29yayBkcml2ZXIgJFJldmlzaW9uOiAxLjc4ICQKKyAqIFJFTEVBU0UtVEFHOiBDVEMvRVNDT04gbmV0d29yayBkcml2ZXIgJFJldmlzaW9uOiAxLjc5ICQKICAqCiAgKi8KICN1bmRlZiBERUJVRwpAQCAtMjQ4LDcgKzI0OCw3IEBACiBwcmludF9iYW5uZXIodm9pZCkKIHsKIAlzdGF0aWMgaW50IHByaW50ZWQgPSAwOwotCWNoYXIgdmJ1ZltdID0gIiRSZXZpc2lvbjogMS43OCAkIjsKKwljaGFyIHZidWZbXSA9ICIkUmV2aXNpb246IDEuNzkgJCI7CiAJY2hhciAqdmVyc2lvbiA9IHZidWY7CiAKIAlpZiAocHJpbnRlZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3UzMDg4LmMgYi9kcml2ZXJzL3MzOTAvbmV0L2N1MzA4OC5jCmluZGV4IDc3ZGFjYjQuLjIwMTRmYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY3UzMDg4LmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdTMwODguYwpAQCAtMSwxMSArMSwxMSBAQAogLyoKLSAqICRJZDogY3UzMDg4LmMsdiAxLjM2IDIwMDUvMTAvMjUgMTQ6Mzc6MTcgY29odWNrIEV4cCAkCisgKiAkSWQ6IGN1MzA4OC5jLHYgMS4zOCAyMDA2LzAxLzEyIDE0OjMzOjA5IGNvaHVjayBFeHAgJAogICoKICAqIENUQyAvIExDUyBjY3dfZGV2aWNlIGRyaXZlcgogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCiAgKiBBdXRob3Iocyk6IEFybmQgQmVyZ21hbm4gPGFybmRiQGRlLmlibS5jb20+Ci0gKiAgICAgICAgICAgIENvcm5lbGlhIEh1Y2sgPGNvaHVja0BkZS5pYm0uY29tPgorICogICAgICAgICAgICBDb3JuZWxpYSBIdWNrIDxjb3JuZWxpYS5odWNrQGRlLmlibS5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYyBiL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCmluZGV4IDY5NDI1YTcuLmFjNGM0YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCkBAIC0xLDEyICsxLDEzIEBACiAvKgotICogJElkOiBuZXRpdWN2LmMsdiAxLjY2IDIwMDUvMDUvMTEgMDg6MTA6MTcgaG9semhldSBFeHAgJAorICogJElkOiBuZXRpdWN2LmMsdiAxLjY5IDIwMDYvMDEvMTIgMTQ6MzM6MDkgY29odWNrIEV4cCAkCiAgKgogICogSVVDViBuZXR3b3JrIGRyaXZlcgogICoKICAqIENvcHlyaWdodCAoQykgMjAwMSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCiAgKiBBdXRob3Iocyk6IEZyaXR6IEVsZmVydCAoZWxmZXJ0QGRlLmlibS5jb20sIGZlbGZlcnRAbWlsbGVudXguY29tKQogICoKLSAqIERyaXZlcmZzIGludGVncmF0aW9uIGFuZCBhbGwgYnVncyB0aGVyZWluIGJ5IENvcm5lbGlhIEh1Y2soY29odWNrQGRlLmlibS5jb20pCisgKiBTeXNmcyBpbnRlZ3JhdGlvbiBhbmQgYWxsIGJ1Z3MgdGhlcmVpbiBieSBDb3JuZWxpYSBIdWNrCisgKiAoY29ybmVsaWEuaHVja0BkZS5pYm0uY29tKQogICoKICAqIERvY3VtZW50YXRpb24gdXNlZDoKICAqICB0aGUgc291cmNlIG9mIHRoZSBvcmlnaW5hbCBJVUNWIGRyaXZlciBieToKQEAgLTMwLDcgKzMxLDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqCi0gKiBSRUxFQVNFLVRBRzogSVVDViBuZXR3b3JrIGRyaXZlciAkUmV2aXNpb246IDEuNjYgJAorICogUkVMRUFTRS1UQUc6IElVQ1YgbmV0d29yayBkcml2ZXIgJFJldmlzaW9uOiAxLjY5ICQKICAqCiAgKi8KIAwKQEAgLTIwNzYsNyArMjA3Nyw3IEBACiBzdGF0aWMgdm9pZAogbmV0aXVjdl9iYW5uZXIodm9pZCkKIHsKLQljaGFyIHZidWZbXSA9ICIkUmV2aXNpb246IDEuNjYgJCI7CisJY2hhciB2YnVmW10gPSAiJFJldmlzaW9uOiAxLjY5ICQiOwogCWNoYXIgKnZlcnNpb24gPSB2YnVmOwogCiAJaWYgKCh2ZXJzaW9uID0gc3RyY2hyKHZlcnNpb24sICc6JykpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvczM5MF9yZGV2LmMgYi9kcml2ZXJzL3MzOTAvczM5MF9yZGV2LmMKaW5kZXggNTY2Y2MzZC4uMjA2NTE4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jCisrKyBiL2RyaXZlcnMvczM5MC9zMzkwX3JkZXYuYwpAQCAtMSwxMSArMSwxMSBAQAogLyoKICAqICBkcml2ZXJzL3MzOTAvczM5MF9yZGV2LmMKICAqICBzMzkwIHJvb3QgZGV2aWNlCi0gKiAgICRSZXZpc2lvbjogMS4yICQKKyAqICAgJFJldmlzaW9uOiAxLjQgJAogICoKICAqICAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKICAqCQkJIElCTSBDb3Jwb3JhdGlvbgotICogICAgQXV0aG9yKHMpOiBDb3JuZWxpYSBIdWNrIChjb2h1Y2tAZGUuaWJtLmNvbSkKKyAqICAgIEF1dGhvcihzKTogQ29ybmVsaWEgSHVjayAoY29ybmVsaWEuaHVja0BkZS5pYm0uY29tKQogICoJCSAgQ2Fyc3RlbiBPdHRlICAoY290dGVAZGUuaWJtLmNvbSkKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYwppbmRleCA1ZTg0YzVhLi4xNjdmZWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMKQEAgLTExMjUsNiArMTEyNSw4IEBACiAJemZjcF9mcmVlX2xvd19tZW1fYnVmZmVycyhhZGFwdGVyKTsKIAkvKiBmcmVlIG1lbW9yeSBvZiBhZGFwdGVyIGRhdGEgc3RydWN0dXJlIGFuZCBxdWV1ZXMgKi8KIAl6ZmNwX3FkaW9fZnJlZV9xdWV1ZXMoYWRhcHRlcik7CisJa2ZyZWUoYWRhcHRlci0+ZmNfc3RhdHMpOworCWtmcmVlKGFkYXB0ZXItPnN0YXRzX3Jlc2V0X2RhdGEpOwogCVpGQ1BfTE9HX1RSQUNFKCJmcmVlaW5nIGFkYXB0ZXIgc3RydWN0dXJlXG4iKTsKIAlrZnJlZShhZGFwdGVyKTsKICBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RlZi5oIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaAppbmRleCBkODFiNzM3Li45YmI1MTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RlZi5oCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmgKQEAgLTkyMSw3ICs5MjEsNiBAQAogCXUzMgkJCXBoeXNpY2FsX3NfaWQ7ICAgICAvKiBsb2NhbCBGQyBwb3J0IElEICovCiAJc3RydWN0IGNjd19kZXZpY2UgICAgICAgKmNjd19kZXZpY2U7CSAgIC8qIFMvMzkwIGNjdyBkZXZpY2UgKi8KIAl1OAkJCWZjX3NlcnZpY2VfY2xhc3M7Ci0JdTMyCQkJZmNfdG9wb2xvZ3k7CSAgIC8qIEZDIHRvcG9sb2d5ICovCiAJdTMyCQkJaHlkcmFfdmVyc2lvbjsJICAgLyogSHlkcmEgdmVyc2lvbiAqLwogCXUzMgkJCWZzZl9saWNfdmVyc2lvbjsKIAl1MzIJCQlhZGFwdGVyX2ZlYXR1cmVzOyAgLyogRkNQIGNoYW5uZWwgZmVhdHVyZXMgKi8KQEAgLTk3OCw2ICs5NzcsOSBAQAogCXN0cnVjdCB6ZmNwX2FkYXB0ZXJfbWVtcG9vbAlwb29sOyAgICAgIC8qIEFkYXB0ZXIgbWVtb3J5IHBvb2xzICovCiAJc3RydWN0IHFkaW9faW5pdGlhbGl6ZSAgcWRpb19pbml0X2RhdGE7ICAgIC8qIGZvciBxZGlvX2VzdGFibGlzaCAqLwogCXN0cnVjdCBkZXZpY2UgICAgICAgICAgIGdlbmVyaWNfc2VydmljZXM7ICAvKiBkaXJlY3RvcnkgZm9yIFdLQSBwb3J0cyAqLworCXN0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MgKmZjX3N0YXRzOworCXN0cnVjdCBmc2ZfcXRjYl9ib3R0b21fcG9ydCAqc3RhdHNfcmVzZXRfZGF0YTsKKwl1bnNpZ25lZCBsb25nCQlzdGF0c19yZXNldDsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYwppbmRleCBlZTczMTRkLi43YmRiMDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMKQEAgLTI2MTMsNyArMjYxMyw3IEBACiAJY2FzZSBaRkNQX0VSUF9TVEVQX1VOSU5JVElBTElaRUQ6CiAJY2FzZSBaRkNQX0VSUF9TVEVQX1BIWVNfUE9SVF9DTE9TSU5HOgogCWNhc2UgWkZDUF9FUlBfU1RFUF9QT1JUX0NMT1NJTkc6Ci0JCWlmIChhZGFwdGVyLT5mY190b3BvbG9neSA9PSBGU0ZfVE9QT19QMlApIHsKKwkJaWYgKGZjX2hvc3RfcG9ydF90eXBlKGFkYXB0ZXItPnNjc2lfaG9zdCkgPT0gRkNfUE9SVFRZUEVfUFRQKSB7CiAJCQlpZiAocG9ydC0+d3dwbiAhPSBhZGFwdGVyLT5wZWVyX3d3cG4pIHsKIAkJCQlaRkNQX0xPR19OT1JNQUwoIkZhaWxlZCB0byBvcGVuIHBvcnQgMHglMDE2THggIgogCQkJCQkJIm9uIGFkYXB0ZXIgJXMuXG5QZWVyIFdXUE4gIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKaW5kZXggNTk1ODc5NS4uY2JmYWIwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCkBAIC05NjQsNiArOTY0LDQwIEBACiAJCQkJCXwgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQpOwogCQlicmVhazsKIAorCWNhc2UgRlNGX1NUQVRVU19SRUFEX05PVElGSUNBVElPTl9MT1NUOgorCQlaRkNQX0xPR19OT1JNQUwoIlVuc29saWNpdGVkIHN0YXR1cyBub3RpZmljYXRpb24ocykgbG9zdDogIgorCQkJCSJhZGFwdGVyICVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKKwkJCQl6ZmNwX2dldF9idXNpZF9ieV9hZGFwdGVyKGFkYXB0ZXIpLAorCQkJCShzdGF0dXNfYnVmZmVyLT5zdGF0dXNfc3VidHlwZSAmCisJCQkJCUZTRl9TVEFUVVNfUkVBRF9TVUJfSU5DT01JTkdfRUxTKSA/CisJCQkJCSIsIGluY29taW5nIEVMUyIgOiAiIiwKKwkJCQkoc3RhdHVzX2J1ZmZlci0+c3RhdHVzX3N1YnR5cGUgJgorCQkJCQlGU0ZfU1RBVFVTX1JFQURfU1VCX1NFTlNFX0RBVEEpID8KKwkJCQkJIiwgc2Vuc2UgZGF0YSIgOiAiIiwKKwkJCQkoc3RhdHVzX2J1ZmZlci0+c3RhdHVzX3N1YnR5cGUgJgorCQkJCQlGU0ZfU1RBVFVTX1JFQURfU1VCX0xJTktfU1RBVFVTKSA/CisJCQkJCSIsIGxpbmsgc3RhdHVzIGNoYW5nZSIgOiAiIiwKKwkJCQkoc3RhdHVzX2J1ZmZlci0+c3RhdHVzX3N1YnR5cGUgJgorCQkJCQlGU0ZfU1RBVFVTX1JFQURfU1VCX1BPUlRfQ0xPU0VEKSA/CisJCQkJCSIsIHBvcnQgY2xvc2UiIDogIiIsCisJCQkJKHN0YXR1c19idWZmZXItPnN0YXR1c19zdWJ0eXBlICYKKwkJCQkJRlNGX1NUQVRVU19SRUFEX1NVQl9CSVRfRVJST1JfVEhSRVNIT0xEKSA/CisJCQkJCSIsIGJpdCBlcnJvciBleGNlcHRpb24iIDogIiIsCisJCQkJKHN0YXR1c19idWZmZXItPnN0YXR1c19zdWJ0eXBlICYKKwkJCQkJRlNGX1NUQVRVU19SRUFEX1NVQl9BQ1RfVVBEQVRFRCkgPworCQkJCQkiLCBBQ1QgdXBkYXRlIiA6ICIiLAorCQkJCShzdGF0dXNfYnVmZmVyLT5zdGF0dXNfc3VidHlwZSAmCisJCQkJCUZTRl9TVEFUVVNfUkVBRF9TVUJfQUNUX0hBUkRFTkVEKSA/CisJCQkJCSIsIEFDVCBoYXJkZW5pbmciIDogIiIsCisJCQkJKHN0YXR1c19idWZmZXItPnN0YXR1c19zdWJ0eXBlICYKKwkJCQkJRlNGX1NUQVRVU19SRUFEX1NVQl9GRUFUVVJFX1VQREFURV9BTEVSVCkgPworCQkJCQkiLCBhZGFwdGVyIGZlYXR1cmUgY2hhbmdlIiA6ICIiKTsKKworCQlpZiAoc3RhdHVzX2J1ZmZlci0+c3RhdHVzX3N1YnR5cGUgJgorCQkgICAgRlNGX1NUQVRVU19SRUFEX1NVQl9BQ1RfVVBEQVRFRCkKKwkJCXpmY3BfZXJwX2FkYXB0ZXJfYWNjZXNzX2NoYW5nZWQoYWRhcHRlcik7CisJCWJyZWFrOworCiAJY2FzZSBGU0ZfU1RBVFVTX1JFQURfQ0ZEQ19VUERBVEVEOgogCQlaRkNQX0xPR19OT1JNQUwoIkNGREMgaGFzIGJlZW4gdXBkYXRlZCBvbiB0aGUgYWRhcHRlciAlc1xuIiwKIAkJCSAgICAgIHpmY3BfZ2V0X2J1c2lkX2J5X2FkYXB0ZXIoYWRhcHRlcikpOwpAQCAtMTk1NCw2ICsxOTg4LDcgQEAKIAllcnBfYWN0aW9uLT5mc2ZfcmVxLT5xdGNiLT5ib3R0b20uY29uZmlnLmZlYXR1cmVfc2VsZWN0aW9uID0KIAkJCUZTRl9GRUFUVVJFX0NGREMgfAogCQkJRlNGX0ZFQVRVUkVfTFVOX1NIQVJJTkcgfAorCQkJRlNGX0ZFQVRVUkVfTk9USUZJQ0FUSU9OX0xPU1QgfAogCQkJRlNGX0ZFQVRVUkVfVVBEQVRFX0FMRVJUOwogCiAJLyogc3RhcnQgUURJTyByZXF1ZXN0IGZvciB0aGlzIEZTRiByZXF1ZXN0ICovCkBAIC0yMDA4LDI3ICsyMDQzLDMwIEBACiAJCWZjX2hvc3RfcG9ydF9pZChzaG9zdCkgPSBib3R0b20tPnNfaWQgJiBaRkNQX0RJRF9NQVNLOwogCQlmY19ob3N0X3NwZWVkKHNob3N0KSA9IGJvdHRvbS0+ZmNfbGlua19zcGVlZDsKIAkJZmNfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlcyhzaG9zdCkgPSBGQ19DT1NfQ0xBU1MyIHwgRkNfQ09TX0NMQVNTMzsKLQkJYWRhcHRlci0+ZmNfdG9wb2xvZ3kgPSBib3R0b20tPmZjX3RvcG9sb2d5OwogCQlhZGFwdGVyLT5oeWRyYV92ZXJzaW9uID0gYm90dG9tLT5hZGFwdGVyX3R5cGU7Ci0JCWlmIChhZGFwdGVyLT5waHlzaWNhbF93d3BuID09IDApCi0JCQlhZGFwdGVyLT5waHlzaWNhbF93d3BuID0gZmNfaG9zdF9wb3J0X25hbWUoc2hvc3QpOwotCQlpZiAoYWRhcHRlci0+cGh5c2ljYWxfc19pZCA9PSAwKQotCQkJYWRhcHRlci0+cGh5c2ljYWxfc19pZCA9IGZjX2hvc3RfcG9ydF9pZChzaG9zdCk7CisJCWlmIChmY19ob3N0X3Blcm1hbmVudF9wb3J0X25hbWUoc2hvc3QpID09IC0xKQorCQkJZmNfaG9zdF9wZXJtYW5lbnRfcG9ydF9uYW1lKHNob3N0KSA9CisJCQkJZmNfaG9zdF9wb3J0X25hbWUoc2hvc3QpOworCQlpZiAoYm90dG9tLT5mY190b3BvbG9neSA9PSBGU0ZfVE9QT19QMlApIHsKKwkJCWFkYXB0ZXItPnBlZXJfZF9pZCA9IGJvdHRvbS0+cGVlcl9kX2lkICYgWkZDUF9ESURfTUFTSzsKKwkJCWFkYXB0ZXItPnBlZXJfd3dwbiA9IGJvdHRvbS0+cGxvZ2lfcGF5bG9hZC53d3BuOworCQkJYWRhcHRlci0+cGVlcl93d25uID0gYm90dG9tLT5wbG9naV9wYXlsb2FkLnd3bm47CisJCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9QVFA7CisJCX0gZWxzZSBpZiAoYm90dG9tLT5mY190b3BvbG9neSA9PSBGU0ZfVE9QT19GQUJSSUMpCisJCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9OUE9SVDsKKwkJZWxzZSBpZiAoYm90dG9tLT5mY190b3BvbG9neSA9PSBGU0ZfVE9QT19BTCkKKwkJCWZjX2hvc3RfcG9ydF90eXBlKHNob3N0KSA9IEZDX1BPUlRUWVBFX05MUE9SVDsKKwkJZWxzZQorCQkJZmNfaG9zdF9wb3J0X3R5cGUoc2hvc3QpID0gRkNfUE9SVFRZUEVfVU5LTk9XTjsKIAl9IGVsc2UgewogCQlmY19ob3N0X25vZGVfbmFtZShzaG9zdCkgPSAwOwogCQlmY19ob3N0X3BvcnRfbmFtZShzaG9zdCkgPSAwOwogCQlmY19ob3N0X3BvcnRfaWQoc2hvc3QpID0gMDsKIAkJZmNfaG9zdF9zcGVlZChzaG9zdCkgPSBGQ19QT1JUU1BFRURfVU5LTk9XTjsKLQkJYWRhcHRlci0+ZmNfdG9wb2xvZ3kgPSAwOworCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9VTktOT1dOOwogCQlhZGFwdGVyLT5oeWRyYV92ZXJzaW9uID0gMDsKIAl9CiAKLQlpZiAoYWRhcHRlci0+ZmNfdG9wb2xvZ3kgPT0gRlNGX1RPUE9fUDJQKSB7Ci0JCWFkYXB0ZXItPnBlZXJfZF9pZCA9IGJvdHRvbS0+cGVlcl9kX2lkICYgWkZDUF9ESURfTUFTSzsKLQkJYWRhcHRlci0+cGVlcl93d3BuID0gYm90dG9tLT5wbG9naV9wYXlsb2FkLnd3cG47Ci0JCWFkYXB0ZXItPnBlZXJfd3dubiA9IGJvdHRvbS0+cGxvZ2lfcGF5bG9hZC53d25uOwotCX0KLQogCWlmIChhZGFwdGVyLT5hZGFwdGVyX2ZlYXR1cmVzICYgRlNGX0ZFQVRVUkVfSEJBQVBJX01BTkFHRU1FTlQpIHsKIAkJYWRhcHRlci0+aGFyZHdhcmVfdmVyc2lvbiA9IGJvdHRvbS0+aGFyZHdhcmVfdmVyc2lvbjsKIAkJbWVtY3B5KGZjX2hvc3Rfc2VyaWFsX251bWJlcihzaG9zdCksIGJvdHRvbS0+c2VyaWFsX251bWJlciwKQEAgLTIwOTcsOCArMjEzNSw4IEBACiAJCWlmICh6ZmNwX2ZzZl9leGNoYW5nZV9jb25maWdfZXZhbHVhdGUoZnNmX3JlcSwgMSkpCiAJCQlyZXR1cm4gLUVJTzsKIAotCQlzd2l0Y2ggKGFkYXB0ZXItPmZjX3RvcG9sb2d5KSB7Ci0JCWNhc2UgRlNGX1RPUE9fUDJQOgorCQlzd2l0Y2ggKGZjX2hvc3RfcG9ydF90eXBlKGFkYXB0ZXItPnNjc2lfaG9zdCkpIHsKKwkJY2FzZSBGQ19QT1JUVFlQRV9QVFA6CiAJCQlaRkNQX0xPR19OT1JNQUwoIlBvaW50LXRvLVBvaW50IGZpYnJlY2hhbm5lbCAiCiAJCQkJCSJjb25maWd1cmF0aW9uIGRldGVjdGVkIGF0IGFkYXB0ZXIgJXNcbiIKIAkJCQkJIlBlZXIgV1dOTiAweCUwMTZsbHgsICIKQEAgLTIxMTEsNyArMjE0OSw3IEBACiAJCQlkZWJ1Z190ZXh0X2V2ZW50KGZzZl9yZXEtPmFkYXB0ZXItPmVycF9kYmYsIDAsCiAJCQkJCSAidG9wLXAtdG8tcCIpOwogCQkJYnJlYWs7Ci0JCWNhc2UgRlNGX1RPUE9fQUw6CisJCWNhc2UgRkNfUE9SVFRZUEVfTkxQT1JUOgogCQkJWkZDUF9MT0dfTk9STUFMKCJlcnJvcjogQXJiaXRyYXRlZCBsb29wIGZpYnJlY2hhbm5lbCAiCiAJCQkJCSJ0b3BvbG9neSBkZXRlY3RlZCBhdCBhZGFwdGVyICVzICIKIAkJCQkJInVuc3VwcG9ydGVkLCBzaHV0dGluZyBkb3duIGFkYXB0ZXJcbiIsCkBAIC0yMTIwLDcgKzIxNTgsNyBAQAogCQkJCQkgInRvcC1hbCIpOwogCQkJemZjcF9lcnBfYWRhcHRlcl9zaHV0ZG93bihhZGFwdGVyLCAwKTsKIAkJCXJldHVybiAtRUlPOwotCQljYXNlIEZTRl9UT1BPX0ZBQlJJQzoKKwkJY2FzZSBGQ19QT1JUVFlQRV9OUE9SVDoKIAkJCVpGQ1BfTE9HX05PUk1BTCgiU3dpdGNoZWQgZmFicmljIGZpYnJlY2hhbm5lbCAiCiAJCQkJICAgICAgIm5ldHdvcmsgZGV0ZWN0ZWQgYXQgYWRhcHRlciAlcy5cbiIsCiAJCQkJICAgICAgemZjcF9nZXRfYnVzaWRfYnlfYWRhcHRlcihhZGFwdGVyKSk7CkBAIC0yMTMzLDcgKzIxNzEsNiBAQAogCQkJCQkib2YgYSB0eXBlIGtub3duIHRvIHRoZSB6ZmNwICIKIAkJCQkJImRyaXZlciwgc2h1dHRpbmcgZG93biBhZGFwdGVyXG4iLAogCQkJCQl6ZmNwX2dldF9idXNpZF9ieV9hZGFwdGVyKGFkYXB0ZXIpKTsKLQkJCWFkYXB0ZXItPmZjX3RvcG9sb2d5ID0gRlNGX1RPUE9fRVJST1I7CiAJCQlkZWJ1Z190ZXh0X2V4Y2VwdGlvbihmc2ZfcmVxLT5hZGFwdGVyLT5lcnBfZGJmLCAwLAogCQkJCQkgICAgICJ1bmtub3duLXRvcG8iKTsKIAkJCXpmY3BfZXJwX2FkYXB0ZXJfc2h1dGRvd24oYWRhcHRlciwgMCk7CkBAIC0yMjkzLDE0ICsyMzMwLDEzIEBACiAJCWRhdGEgPSAoc3RydWN0IGZzZl9xdGNiX2JvdHRvbV9wb3J0KikgZnNmX3JlcS0+ZGF0YTsKIAkJaWYgKGRhdGEpCiAJCQltZW1jcHkoZGF0YSwgYm90dG9tLCBzaXplb2Yoc3RydWN0IGZzZl9xdGNiX2JvdHRvbV9wb3J0KSk7Ci0JCWlmIChhZGFwdGVyLT5jb25uZWN0aW9uX2ZlYXR1cmVzICYgRlNGX0ZFQVRVUkVfTlBJVl9NT0RFKSB7Ci0JCQlhZGFwdGVyLT5waHlzaWNhbF93d3BuID0gYm90dG9tLT53d3BuOwotCQkJYWRhcHRlci0+cGh5c2ljYWxfc19pZCA9IGJvdHRvbS0+ZmNfcG9ydF9pZDsKLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXItPnBoeXNpY2FsX3d3cG4gPSBmY19ob3N0X3BvcnRfbmFtZShzaG9zdCk7Ci0JCQlhZGFwdGVyLT5waHlzaWNhbF9zX2lkID0gZmNfaG9zdF9wb3J0X2lkKHNob3N0KTsKLQkJfQorCQlpZiAoYWRhcHRlci0+Y29ubmVjdGlvbl9mZWF0dXJlcyAmIEZTRl9GRUFUVVJFX05QSVZfTU9ERSkKKwkJCWZjX2hvc3RfcGVybWFuZW50X3BvcnRfbmFtZShzaG9zdCkgPSBib3R0b20tPnd3cG47CisJCWVsc2UKKwkJCWZjX2hvc3RfcGVybWFuZW50X3BvcnRfbmFtZShzaG9zdCkgPQorCQkJCWZjX2hvc3RfcG9ydF9uYW1lKHNob3N0KTsKIAkJZmNfaG9zdF9tYXhmcmFtZV9zaXplKHNob3N0KSA9IGJvdHRvbS0+bWF4aW11bV9mcmFtZV9zaXplOworCQlmY19ob3N0X3N1cHBvcnRlZF9zcGVlZHMoc2hvc3QpID0gYm90dG9tLT5zdXBwb3J0ZWRfc3BlZWQ7CiAJCWJyZWFrOwogCiAJY2FzZSBGU0ZfRVhDSEFOR0VfQ09ORklHX0RBVEFfSU5DT01QTEVURToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5oCmluZGV4IDQ4NzE5ZjAuLmU3MzQ0MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuaApAQCAtMTY2LDYgKzE2Niw3IEBACiAjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9CSVRfRVJST1JfVEhSRVNIT0xECTB4MDAwMDAwMDQKICNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX0xJTktfRE9XTgkJMHgwMDAwMDAwNQogI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfTElOS19VUCAgICAgICAgICAJMHgwMDAwMDAwNgorI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfTk9USUZJQ0FUSU9OX0xPU1QJMHgwMDAwMDAwOQogI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfQ0ZEQ19VUERBVEVECQkweDAwMDAwMDBBCiAjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9DRkRDX0hBUkRFTkVECQkweDAwMDAwMDBCCiAjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9GRUFUVVJFX1VQREFURV9BTEVSVAkweDAwMDAwMDBDCkBAIC0xNzksNiArMTgwLDE2IEBACiAjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9TVUJfRkRJU0NfRkFJTEVECTB4MDAwMDAwMDEKICNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX1NVQl9GSVJNV0FSRV9VUERBVEUJMHgwMDAwMDAwMgogCisvKiBzdGF0dXMgc3VidHlwZXMgZm9yIHVuc29saWNpdGVkIHN0YXR1cyBub3RpZmljYXRpb24gbG9zdCAqLworI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfU1VCX0lOQ09NSU5HX0VMUwkweDAwMDAwMDAxCisjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9TVUJfU0VOU0VfREFUQQkJMHgwMDAwMDAwMgorI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfU1VCX0xJTktfU1RBVFVTCQkweDAwMDAwMDA0CisjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9TVUJfUE9SVF9DTE9TRUQJCTB4MDAwMDAwMDgKKyNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX1NVQl9CSVRfRVJST1JfVEhSRVNIT0xECTB4MDAwMDAwMTAKKyNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX1NVQl9BQ1RfVVBEQVRFRAkJMHgwMDAwMDAyMAorI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfU1VCX0FDVF9IQVJERU5FRAkweDAwMDAwMDQwCisjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9TVUJfRkVBVFVSRV9VUERBVEVfQUxFUlQgMHgwMDAwMDA4MAorCiAvKiBzdGF0dXMgc3VidHlwZXMgZm9yIENGREMgKi8KICNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX1NVQl9DRkRDX0hBUkRFTkVEX09OX1NFCTB4MDAwMDAwMDIKICNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX1NVQl9DRkRDX0hBUkRFTkVEX09OX1NFMiAweDAwMDAwMDBGCkBAIC0xODgsNyArMTk5LDYgQEAKICNkZWZpbmUgRlNGX1RPUE9fUDJQCQkJCTB4MDAwMDAwMDEKICNkZWZpbmUgRlNGX1RPUE9fRkFCUklDCQkJCTB4MDAwMDAwMDIKICNkZWZpbmUgRlNGX1RPUE9fQUwJCQkJMHgwMDAwMDAwMwotI2RlZmluZSBGU0ZfVE9QT19GQUJSSUNfVklSVAkJCTB4MDAwMDAwMDQKIAogLyogZGF0YSBkaXJlY3Rpb24gZm9yIEZDUCBjb21tYW5kcyAqLwogI2RlZmluZSBGU0ZfREFUQURJUl9XUklURQkJCTB4MDAwMDAwMDEKQEAgLTIxMSw2ICsyMjEsNyBAQAogLyogY2hhbm5lbCBmZWF0dXJlcyAqLwogI2RlZmluZSBGU0ZfRkVBVFVSRV9DRkRDCQkJMHgwMDAwMDAwMgogI2RlZmluZSBGU0ZfRkVBVFVSRV9MVU5fU0hBUklORwkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRlNGX0ZFQVRVUkVfTk9USUZJQ0FUSU9OX0xPU1QJCTB4MDAwMDAwMDgKICNkZWZpbmUgRlNGX0ZFQVRVUkVfSEJBQVBJX01BTkFHRU1FTlQgICAgICAgICAgIDB4MDAwMDAwMTAKICNkZWZpbmUgRlNGX0ZFQVRVUkVfRUxTX0NUX0NIQUlORURfU0JBTFMgICAgICAgIDB4MDAwMDAwMjAKICNkZWZpbmUgRlNGX0ZFQVRVUkVfVVBEQVRFX0FMRVJUCQkweDAwMDAwMTAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCmluZGV4IDY2NjA4ZDEuLjNjMmNiY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCkBAIC00OSw4ICs0OSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgemZjcF91bml0ICp6ZmNwX3VuaXRfbG9va3VwKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKiwgaW50LCBzY3NpX2lkX3QsCiAJCQkJCSAgc2NzaV9sdW5fdCk7Ci1zdGF0aWMgc3RydWN0IHpmY3BfcG9ydCAqemZjcF9wb3J0X2xvb2t1cChzdHJ1Y3QgemZjcF9hZGFwdGVyICosIGludCwKLQkJCQkJICBzY3NpX2lkX3QpOwogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnpmY3Bfc3lzZnNfc2Rldl9hdHRyc1tdOwogCkBAIC00MDYsMTggKzQwNCw2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHN0cnVjdCB6ZmNwX3BvcnQgKgotemZjcF9wb3J0X2xvb2t1cChzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyLCBpbnQgY2hhbm5lbCwgc2NzaV9pZF90IGlkKQotewotCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZhZGFwdGVyLT5wb3J0X2xpc3RfaGVhZCwgbGlzdCkgewotCQlpZiAocG9ydC0+cnBvcnQgJiYgKGlkID09IHBvcnQtPnJwb3J0LT5zY3NpX3RhcmdldF9pZCkpCi0JCQlyZXR1cm4gcG9ydDsKLQl9Ci0JcmV0dXJuIChzdHJ1Y3QgemZjcF9wb3J0ICopIE5VTEw7Ci19Ci0KIC8qKgogICogemZjcF9zY3NpX2VoX2Fib3J0X2hhbmRsZXIgLSBhYm9ydCB0aGUgc3BlY2lmaWVkIFNDU0kgY29tbWFuZAogICogQHNjcG50OiBwb2ludGVyIHRvIHNjc2lfY21uZCB0byBiZSBhYm9ydGVkIApAQCAtNzMxLDcwICs3MTcsMTY0IEBACiAvKgogICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIEZDIHRyYW5zcG9ydCBjbGFzcwogICovCi1zdGF0aWMgdm9pZAotemZjcF9nZXRfcG9ydF9pZChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCitzdGF0aWMgc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyoKK3pmY3BfaW5pdF9mY19ob3N0X3N0YXRzKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgemZjcF9hZGFwdGVyICopc2hvc3QtPmhvc3RkYXRhWzBdOwotCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICpmY19zdGF0czsKIAotCXJlYWRfbG9ja19pcnFzYXZlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKLQlwb3J0ID0gemZjcF9wb3J0X2xvb2t1cChhZGFwdGVyLCBzdGFyZ2V0LT5jaGFubmVsLCBzdGFyZ2V0LT5pZCk7Ci0JaWYgKHBvcnQpCi0JCWZjX3N0YXJnZXRfcG9ydF9pZChzdGFyZ2V0KSA9IHBvcnQtPmRfaWQ7Ci0JZWxzZQotCQlmY19zdGFyZ2V0X3BvcnRfaWQoc3RhcmdldCkgPSAtMTsKLQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWFkYXB0ZXItPmZjX3N0YXRzKSB7CisJCWZjX3N0YXRzID0ga21hbGxvYyhzaXplb2YoKmZjX3N0YXRzKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZmNfc3RhdHMpCisJCQlyZXR1cm4gTlVMTDsKKwkJYWRhcHRlci0+ZmNfc3RhdHMgPSBmY19zdGF0czsgLyogZnJlZWQgaW4gYWRhdGVyX2RlcXVldWUgKi8KKwl9CisJbWVtc2V0KGFkYXB0ZXItPmZjX3N0YXRzLCAwLCBzaXplb2YoKmFkYXB0ZXItPmZjX3N0YXRzKSk7CisJcmV0dXJuIGFkYXB0ZXItPmZjX3N0YXRzOwogfQogCiBzdGF0aWMgdm9pZAotemZjcF9nZXRfcG9ydF9uYW1lKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3pmY3BfYWRqdXN0X2ZjX2hvc3Rfc3RhdHMoc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqZmNfc3RhdHMsCisJCQkgIHN0cnVjdCBmc2ZfcXRjYl9ib3R0b21fcG9ydCAqZGF0YSwKKwkJCSAgc3RydWN0IGZzZl9xdGNiX2JvdHRvbV9wb3J0ICpvbGQpCiB7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgemZjcF9hZGFwdGVyICopc2hvc3QtPmhvc3RkYXRhWzBdOwotCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXJlYWRfbG9ja19pcnFzYXZlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKLQlwb3J0ID0gemZjcF9wb3J0X2xvb2t1cChhZGFwdGVyLCBzdGFyZ2V0LT5jaGFubmVsLCBzdGFyZ2V0LT5pZCk7Ci0JaWYgKHBvcnQpCi0JCWZjX3N0YXJnZXRfcG9ydF9uYW1lKHN0YXJnZXQpID0gcG9ydC0+d3dwbjsKLQllbHNlCi0JCWZjX3N0YXJnZXRfcG9ydF9uYW1lKHN0YXJnZXQpID0gLTE7Ci0JcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7CisJZmNfc3RhdHMtPnNlY29uZHNfc2luY2VfbGFzdF9yZXNldCA9IGRhdGEtPnNlY29uZHNfc2luY2VfbGFzdF9yZXNldCAtCisJCW9sZC0+c2Vjb25kc19zaW5jZV9sYXN0X3Jlc2V0OworCWZjX3N0YXRzLT50eF9mcmFtZXMgPSBkYXRhLT50eF9mcmFtZXMgLSBvbGQtPnR4X2ZyYW1lczsKKwlmY19zdGF0cy0+dHhfd29yZHMgPSBkYXRhLT50eF93b3JkcyAtIG9sZC0+dHhfd29yZHM7CisJZmNfc3RhdHMtPnJ4X2ZyYW1lcyA9IGRhdGEtPnJ4X2ZyYW1lcyAtIG9sZC0+cnhfZnJhbWVzOworCWZjX3N0YXRzLT5yeF93b3JkcyA9IGRhdGEtPnJ4X3dvcmRzIC0gb2xkLT5yeF93b3JkczsKKwlmY19zdGF0cy0+bGlwX2NvdW50ID0gZGF0YS0+bGlwIC0gb2xkLT5saXA7CisJZmNfc3RhdHMtPm5vc19jb3VudCA9IGRhdGEtPm5vcyAtIG9sZC0+bm9zOworCWZjX3N0YXRzLT5lcnJvcl9mcmFtZXMgPSBkYXRhLT5lcnJvcl9mcmFtZXMgLSBvbGQtPmVycm9yX2ZyYW1lczsKKwlmY19zdGF0cy0+ZHVtcGVkX2ZyYW1lcyA9IGRhdGEtPmR1bXBlZF9mcmFtZXMgLSBvbGQtPmR1bXBlZF9mcmFtZXM7CisJZmNfc3RhdHMtPmxpbmtfZmFpbHVyZV9jb3VudCA9IGRhdGEtPmxpbmtfZmFpbHVyZSAtIG9sZC0+bGlua19mYWlsdXJlOworCWZjX3N0YXRzLT5sb3NzX29mX3N5bmNfY291bnQgPSBkYXRhLT5sb3NzX29mX3N5bmMgLSBvbGQtPmxvc3Nfb2Zfc3luYzsKKwlmY19zdGF0cy0+bG9zc19vZl9zaWduYWxfY291bnQgPSBkYXRhLT5sb3NzX29mX3NpZ25hbCAtCisJCW9sZC0+bG9zc19vZl9zaWduYWw7CisJZmNfc3RhdHMtPnByaW1fc2VxX3Byb3RvY29sX2Vycl9jb3VudCA9IGRhdGEtPnBzcF9lcnJvcl9jb3VudHMgLQorCQlvbGQtPnBzcF9lcnJvcl9jb3VudHM7CisJZmNfc3RhdHMtPmludmFsaWRfdHhfd29yZF9jb3VudCA9IGRhdGEtPmludmFsaWRfdHhfd29yZHMgLQorCQlvbGQtPmludmFsaWRfdHhfd29yZHM7CisJZmNfc3RhdHMtPmludmFsaWRfY3JjX2NvdW50ID0gZGF0YS0+aW52YWxpZF9jcmNzIC0gb2xkLT5pbnZhbGlkX2NyY3M7CisJZmNfc3RhdHMtPmZjcF9pbnB1dF9yZXF1ZXN0cyA9IGRhdGEtPmlucHV0X3JlcXVlc3RzIC0KKwkJb2xkLT5pbnB1dF9yZXF1ZXN0czsKKwlmY19zdGF0cy0+ZmNwX291dHB1dF9yZXF1ZXN0cyA9IGRhdGEtPm91dHB1dF9yZXF1ZXN0cyAtCisJCW9sZC0+b3V0cHV0X3JlcXVlc3RzOworCWZjX3N0YXRzLT5mY3BfY29udHJvbF9yZXF1ZXN0cyA9IGRhdGEtPmNvbnRyb2xfcmVxdWVzdHMgLQorCQlvbGQtPmNvbnRyb2xfcmVxdWVzdHM7CisJZmNfc3RhdHMtPmZjcF9pbnB1dF9tZWdhYnl0ZXMgPSBkYXRhLT5pbnB1dF9tYiAtIG9sZC0+aW5wdXRfbWI7CisJZmNfc3RhdHMtPmZjcF9vdXRwdXRfbWVnYWJ5dGVzID0gZGF0YS0+b3V0cHV0X21iIC0gb2xkLT5vdXRwdXRfbWI7CiB9CiAKIHN0YXRpYyB2b2lkCi16ZmNwX2dldF9ub2RlX25hbWUoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQoremZjcF9zZXRfZmNfaG9zdF9zdGF0cyhzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICpmY19zdGF0cywKKwkJICAgICAgIHN0cnVjdCBmc2ZfcXRjYl9ib3R0b21fcG9ydCAqZGF0YSkKIHsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKilzaG9zdC0+aG9zdGRhdGFbMF07Ci0Jc3RydWN0IHpmY3BfcG9ydCAqcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCWZjX3N0YXRzLT5zZWNvbmRzX3NpbmNlX2xhc3RfcmVzZXQgPSBkYXRhLT5zZWNvbmRzX3NpbmNlX2xhc3RfcmVzZXQ7CisJZmNfc3RhdHMtPnR4X2ZyYW1lcyA9IGRhdGEtPnR4X2ZyYW1lczsKKwlmY19zdGF0cy0+dHhfd29yZHMgPSBkYXRhLT50eF93b3JkczsKKwlmY19zdGF0cy0+cnhfZnJhbWVzID0gZGF0YS0+cnhfZnJhbWVzOworCWZjX3N0YXRzLT5yeF93b3JkcyA9IGRhdGEtPnJ4X3dvcmRzOworCWZjX3N0YXRzLT5saXBfY291bnQgPSBkYXRhLT5saXA7CisJZmNfc3RhdHMtPm5vc19jb3VudCA9IGRhdGEtPm5vczsKKwlmY19zdGF0cy0+ZXJyb3JfZnJhbWVzID0gZGF0YS0+ZXJyb3JfZnJhbWVzOworCWZjX3N0YXRzLT5kdW1wZWRfZnJhbWVzID0gZGF0YS0+ZHVtcGVkX2ZyYW1lczsKKwlmY19zdGF0cy0+bGlua19mYWlsdXJlX2NvdW50ID0gZGF0YS0+bGlua19mYWlsdXJlOworCWZjX3N0YXRzLT5sb3NzX29mX3N5bmNfY291bnQgPSBkYXRhLT5sb3NzX29mX3N5bmM7CisJZmNfc3RhdHMtPmxvc3Nfb2Zfc2lnbmFsX2NvdW50ID0gZGF0YS0+bG9zc19vZl9zaWduYWw7CisJZmNfc3RhdHMtPnByaW1fc2VxX3Byb3RvY29sX2Vycl9jb3VudCA9IGRhdGEtPnBzcF9lcnJvcl9jb3VudHM7CisJZmNfc3RhdHMtPmludmFsaWRfdHhfd29yZF9jb3VudCA9IGRhdGEtPmludmFsaWRfdHhfd29yZHM7CisJZmNfc3RhdHMtPmludmFsaWRfY3JjX2NvdW50ID0gZGF0YS0+aW52YWxpZF9jcmNzOworCWZjX3N0YXRzLT5mY3BfaW5wdXRfcmVxdWVzdHMgPSBkYXRhLT5pbnB1dF9yZXF1ZXN0czsKKwlmY19zdGF0cy0+ZmNwX291dHB1dF9yZXF1ZXN0cyA9IGRhdGEtPm91dHB1dF9yZXF1ZXN0czsKKwlmY19zdGF0cy0+ZmNwX2NvbnRyb2xfcmVxdWVzdHMgPSBkYXRhLT5jb250cm9sX3JlcXVlc3RzOworCWZjX3N0YXRzLT5mY3BfaW5wdXRfbWVnYWJ5dGVzID0gZGF0YS0+aW5wdXRfbWI7CisJZmNfc3RhdHMtPmZjcF9vdXRwdXRfbWVnYWJ5dGVzID0gZGF0YS0+b3V0cHV0X21iOworfQogCi0JcmVhZF9sb2NrX2lycXNhdmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOwotCXBvcnQgPSB6ZmNwX3BvcnRfbG9va3VwKGFkYXB0ZXIsIHN0YXJnZXQtPmNoYW5uZWwsIHN0YXJnZXQtPmlkKTsKLQlpZiAocG9ydCkKLQkJZmNfc3RhcmdldF9ub2RlX25hbWUoc3RhcmdldCkgPSBwb3J0LT53d25uOwotCWVsc2UKLQkJZmNfc3RhcmdldF9ub2RlX25hbWUoc3RhcmdldCkgPSAtMTsKLQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKKy8qKgorICogemZjcF9nZXRfZmNfaG9zdF9zdGF0cyAtIHByb3ZpZGUgZmNfaG9zdF9zdGF0aXN0aWNzIGZvciBzY3NpX3RyYW5zcG9ydF9mYworICoKKyAqIGFzc3VtcHRpb246IHNjc2lfdHJhbnNwb3J0X2ZjIHN5bmNocm9uaXplcyBjYWxscyBvZgorICogICAgICAgICAgICAgZ2V0X2ZjX2hvc3Rfc3RhdHMgYW5kIHJlc2V0X2ZjX2hvc3Rfc3RhdHMKKyAqICAgICAgICAgICAgIChYWFggdG8gYmUgY2hlY2tlZCBvdGhlcndpc2UgaW50cm9kdWNlIGxvY2tpbmcpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICoKK3pmY3BfZ2V0X2ZjX2hvc3Rfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICpmY19zdGF0czsKKwlzdHJ1Y3QgZnNmX3F0Y2JfYm90dG9tX3BvcnQgKmRhdGE7CisJaW50IHJldDsKKworCWFkYXB0ZXIgPSAoc3RydWN0IHpmY3BfYWRhcHRlciAqKXNob3N0LT5ob3N0ZGF0YVswXTsKKwlmY19zdGF0cyA9IHpmY3BfaW5pdF9mY19ob3N0X3N0YXRzKGFkYXB0ZXIpOworCWlmICghZmNfc3RhdHMpCisJCXJldHVybiBOVUxMOworCisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CisKKwlyZXQgPSB6ZmNwX2ZzZl9leGNoYW5nZV9wb3J0X2RhdGEoTlVMTCwgYWRhcHRlciwgZGF0YSk7CisJaWYgKHJldCkgeworCQlrZnJlZShkYXRhKTsKKwkJcmV0dXJuIE5VTEw7IC8qIFhYWCByZXR1cm4gemVyb2VkIGZjX3N0YXRzPyAqLworCX0KKworCWlmIChhZGFwdGVyLT5zdGF0c19yZXNldCAmJgorCSAgICAoKGppZmZpZXMvSFogLSBhZGFwdGVyLT5zdGF0c19yZXNldCkgPAorCSAgICAgZGF0YS0+c2Vjb25kc19zaW5jZV9sYXN0X3Jlc2V0KSkgeworCQl6ZmNwX2FkanVzdF9mY19ob3N0X3N0YXRzKGZjX3N0YXRzLCBkYXRhLAorCQkJCQkgIGFkYXB0ZXItPnN0YXRzX3Jlc2V0X2RhdGEpOworCX0gZWxzZQorCQl6ZmNwX3NldF9mY19ob3N0X3N0YXRzKGZjX3N0YXRzLCBkYXRhKTsKKworCWtmcmVlKGRhdGEpOworCXJldHVybiBmY19zdGF0czsKK30KKworc3RhdGljIHZvaWQKK3pmY3BfcmVzZXRfZmNfaG9zdF9zdGF0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBmc2ZfcXRjYl9ib3R0b21fcG9ydCAqZGF0YSwgKm9sZF9kYXRhOworCWludCByZXQ7CisKKwlhZGFwdGVyID0gKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKilzaG9zdC0+aG9zdGRhdGFbMF07CisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZigqZGF0YSkpOworCisJcmV0ID0gemZjcF9mc2ZfZXhjaGFuZ2VfcG9ydF9kYXRhKE5VTEwsIGFkYXB0ZXIsIGRhdGEpOworCWlmIChyZXQgPT0gMCkgeworCQlhZGFwdGVyLT5zdGF0c19yZXNldCA9IGppZmZpZXMvSFo7CisJCW9sZF9kYXRhID0gYWRhcHRlci0+c3RhdHNfcmVzZXRfZGF0YTsKKwkJYWRhcHRlci0+c3RhdHNfcmVzZXRfZGF0YSA9IGRhdGE7IC8qIGZpbmFsbHkgZnJlZWQgaW4KKwkJCQkJCSAgICAgYWRhdGVyX2RlcXVldWUgKi8KKwkJa2ZyZWUob2xkX2RhdGEpOworCX0KIH0KIAogc3RydWN0IGZjX2Z1bmN0aW9uX3RlbXBsYXRlIHpmY3BfdHJhbnNwb3J0X2Z1bmN0aW9ucyA9IHsKLQkuZ2V0X3N0YXJnZXRfcG9ydF9pZCA9IHpmY3BfZ2V0X3BvcnRfaWQsCi0JLmdldF9zdGFyZ2V0X3BvcnRfbmFtZSA9IHpmY3BfZ2V0X3BvcnRfbmFtZSwKLQkuZ2V0X3N0YXJnZXRfbm9kZV9uYW1lID0gemZjcF9nZXRfbm9kZV9uYW1lLAogCS5zaG93X3N0YXJnZXRfcG9ydF9pZCA9IDEsCiAJLnNob3dfc3RhcmdldF9wb3J0X25hbWUgPSAxLAogCS5zaG93X3N0YXJnZXRfbm9kZV9uYW1lID0gMSwKIAkuc2hvd19ycG9ydF9zdXBwb3J0ZWRfY2xhc3NlcyA9IDEsCiAJLnNob3dfaG9zdF9ub2RlX25hbWUgPSAxLAogCS5zaG93X2hvc3RfcG9ydF9uYW1lID0gMSwKKwkuc2hvd19ob3N0X3Blcm1hbmVudF9wb3J0X25hbWUgPSAxLAogCS5zaG93X2hvc3Rfc3VwcG9ydGVkX2NsYXNzZXMgPSAxLAorCS5zaG93X2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyA9IDEsCiAJLnNob3dfaG9zdF9tYXhmcmFtZV9zaXplID0gMSwKIAkuc2hvd19ob3N0X3NlcmlhbF9udW1iZXIgPSAxLAorCS5nZXRfZmNfaG9zdF9zdGF0cyA9IHpmY3BfZ2V0X2ZjX2hvc3Rfc3RhdHMsCisJLnJlc2V0X2ZjX2hvc3Rfc3RhdHMgPSB6ZmNwX3Jlc2V0X2ZjX2hvc3Rfc3RhdHMsCisJLyogbm8gZnVuY3Rpb25zIHJlZ2lzdGVyZWQgZm9yIGZvbGxvd2luZyBkeW5hbWljIGF0dHJpYnV0ZXMgYnV0CisJICAgZGlyZWN0bHkgc2V0IGJ5IExMREQgKi8KKwkuc2hvd19ob3N0X3BvcnRfdHlwZSA9IDEsCiAJLnNob3dfaG9zdF9zcGVlZCA9IDEsCiAJLnNob3dfaG9zdF9wb3J0X2lkID0gMSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzX2FkYXB0ZXIuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnNfYWRhcHRlci5jCmluZGV4IDBjZDQzNTIuLjlmMjYyMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnNfYWRhcHRlci5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnNfYWRhcHRlci5jCkBAIC0zMywxNCArMzMsNiBAQAogCiAjZGVmaW5lIFpGQ1BfTE9HX0FSRUEgICAgICAgICAgICAgICAgICAgWkZDUF9MT0dfQVJFQV9DT05GSUcKIAotc3RhdGljIGNvbnN0IGNoYXIgZmNfdG9wb2xvZ2llc1s1XVsyNV0gPSB7Ci0JIjxlcnJvcj4iLAotCSJwb2ludC10by1wb2ludCIsCi0JImZhYnJpYyIsCi0JImFyYml0cmF0ZWQgbG9vcCIsCi0JImZhYnJpYyAodmlydC4gYWRhcHRlcikiCi19OwotCiAvKioKICAqIFpGQ1BfREVGSU5FX0FEQVBURVJfQVRUUgogICogQF9uYW1lOiAgIG5hbWUgb2Ygc2hvdyBhdHRyaWJ1dGUKQEAgLTY5LDEyICs2MSw4IEBACiBaRkNQX0RFRklORV9BREFQVEVSX0FUVFIocGh5c2ljYWxfc19pZCwgIjB4JTA2eFxuIiwgYWRhcHRlci0+cGh5c2ljYWxfc19pZCk7CiBaRkNQX0RFRklORV9BREFQVEVSX0FUVFIoY2FyZF92ZXJzaW9uLCAiMHglMDR4XG4iLCBhZGFwdGVyLT5oeWRyYV92ZXJzaW9uKTsKIFpGQ1BfREVGSU5FX0FEQVBURVJfQVRUUihsaWNfdmVyc2lvbiwgIjB4JTA4eFxuIiwgYWRhcHRlci0+ZnNmX2xpY192ZXJzaW9uKTsKLVpGQ1BfREVGSU5FX0FEQVBURVJfQVRUUihmY19zZXJ2aWNlX2NsYXNzLCAiJWRcbiIsIGFkYXB0ZXItPmZjX3NlcnZpY2VfY2xhc3MpOwotWkZDUF9ERUZJTkVfQURBUFRFUl9BVFRSKGZjX3RvcG9sb2d5LCAiJXNcbiIsCi0JCQkgZmNfdG9wb2xvZ2llc1thZGFwdGVyLT5mY190b3BvbG9neV0pOwogWkZDUF9ERUZJTkVfQURBUFRFUl9BVFRSKGhhcmR3YXJlX3ZlcnNpb24sICIweCUwOHhcbiIsCiAJCQkgYWRhcHRlci0+aGFyZHdhcmVfdmVyc2lvbik7Ci1aRkNQX0RFRklORV9BREFQVEVSX0FUVFIoc2NzaV9ob3N0X25vLCAiMHgleFxuIiwgYWRhcHRlci0+c2NzaV9ob3N0X25vKTsKIFpGQ1BfREVGSU5FX0FEQVBURVJfQVRUUihpbl9yZWNvdmVyeSwgIiVkXG4iLCBhdG9taWNfdGVzdF9tYXNrCiAJCQkgKFpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfSU5VU0UsICZhZGFwdGVyLT5zdGF0dXMpKTsKIApAQCAtMjU5LDkgKzI0Nyw2IEBACiAJJmRldl9hdHRyX3BoeXNpY2FsX3NfaWQuYXR0ciwKIAkmZGV2X2F0dHJfY2FyZF92ZXJzaW9uLmF0dHIsCiAJJmRldl9hdHRyX2xpY192ZXJzaW9uLmF0dHIsCi0JJmRldl9hdHRyX2ZjX3NlcnZpY2VfY2xhc3MuYXR0ciwKLQkmZGV2X2F0dHJfZmNfdG9wb2xvZ3kuYXR0ciwKLQkmZGV2X2F0dHJfc2NzaV9ob3N0X25vLmF0dHIsCiAJJmRldl9hdHRyX3N0YXR1cy5hdHRyLAogCSZkZXZfYXR0cl9oYXJkd2FyZV92ZXJzaW9uLmF0dHIsCiAJTlVMTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmc19wb3J0LmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzX3BvcnQuYwppbmRleCBjNTVlODJkLi4zOTI0ZWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzX3BvcnQuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzX3BvcnQuYwpAQCAtNjUsOCArNjUsNiBAQAogc3RhdGljIERFVklDRV9BVFRSKF9uYW1lLCBTX0lSVUdPLCB6ZmNwX3N5c2ZzX3BvcnRfIyNfbmFtZSMjX3Nob3csIE5VTEwpOwogCiBaRkNQX0RFRklORV9QT1JUX0FUVFIoc3RhdHVzLCAiMHglMDh4XG4iLCBhdG9taWNfcmVhZCgmcG9ydC0+c3RhdHVzKSk7Ci1aRkNQX0RFRklORV9QT1JUX0FUVFIod3dubiwgIjB4JTAxNmxseFxuIiwgcG9ydC0+d3dubik7Ci1aRkNQX0RFRklORV9QT1JUX0FUVFIoZF9pZCwgIjB4JTA2eFxuIiwgcG9ydC0+ZF9pZCk7CiBaRkNQX0RFRklORV9QT1JUX0FUVFIoaW5fcmVjb3ZlcnksICIlZFxuIiwgYXRvbWljX3Rlc3RfbWFzawogCQkgICAgICAoWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9JTlVTRSwgJnBvcnQtPnN0YXR1cykpOwogWkZDUF9ERUZJTkVfUE9SVF9BVFRSKGFjY2Vzc19kZW5pZWQsICIlZFxuIiwgYXRvbWljX3Rlc3RfbWFzawpAQCAtMjQ1LDggKzI0Myw2IEBACiAJJmRldl9hdHRyX2ZhaWxlZC5hdHRyLAogCSZkZXZfYXR0cl9pbl9yZWNvdmVyeS5hdHRyLAogCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKLQkmZGV2X2F0dHJfd3dubi5hdHRyLAotCSZkZXZfYXR0cl9kX2lkLmF0dHIsCiAJJmRldl9hdHRyX2FjY2Vzc19kZW5pZWQuYXR0ciwKIAlOVUxMCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmc191bml0LmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzX3VuaXQuYwppbmRleCAwNTU2NjQyLi4yZjUwODE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzX3VuaXQuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzX3VuaXQuYwpAQCAtNjUsNyArNjUsNiBAQAogc3RhdGljIERFVklDRV9BVFRSKF9uYW1lLCBTX0lSVUdPLCB6ZmNwX3N5c2ZzX3VuaXRfIyNfbmFtZSMjX3Nob3csIE5VTEwpOwogCiBaRkNQX0RFRklORV9VTklUX0FUVFIoc3RhdHVzLCAiMHglMDh4XG4iLCBhdG9taWNfcmVhZCgmdW5pdC0+c3RhdHVzKSk7Ci1aRkNQX0RFRklORV9VTklUX0FUVFIoc2NzaV9sdW4sICIweCV4XG4iLCB1bml0LT5zY3NpX2x1bik7CiBaRkNQX0RFRklORV9VTklUX0FUVFIoaW5fcmVjb3ZlcnksICIlZFxuIiwgYXRvbWljX3Rlc3RfbWFzawogCQkgICAgICAoWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9JTlVTRSwgJnVuaXQtPnN0YXR1cykpOwogWkZDUF9ERUZJTkVfVU5JVF9BVFRSKGFjY2Vzc19kZW5pZWQsICIlZFxuIiwgYXRvbWljX3Rlc3RfbWFzawpAQCAtMTM4LDcgKzEzNyw2IEBACiAJCSAgIHpmY3Bfc3lzZnNfdW5pdF9mYWlsZWRfc3RvcmUpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqemZjcF91bml0X2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX3Njc2lfbHVuLmF0dHIsCiAJJmRldl9hdHRyX2ZhaWxlZC5hdHRyLAogCSZkZXZfYXR0cl9pbl9yZWNvdmVyeS5hdHRyLAogCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2F1cm9yYS5jIGIvZHJpdmVycy9zYnVzL2NoYXIvYXVyb3JhLmMKaW5kZXggOTJlNmM1NjM5Li4wMTVkYjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9hdXJvcmEuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9hdXJvcmEuYwpAQCAtOTIsNyArOTIsNiBAQAogCiAvKiBubyBsb25nZXIgdXNlZC4gc3RhdGljIHN0cnVjdCBBdXJvcmFfYm9hcmQgKiBJUlFfdG9fYm9hcmRbMTZdID0geyBOVUxMLCB9IDsqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKiB0bXBfYnVmID0gTlVMTDsKLXN0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogREVDTEFSRV9UQVNLX1FVRVVFKHRxX2F1cm9yYSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS8zdy05eHh4LmMgYi9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jCmluZGV4IDNmZjc0ZjQuLjMxYzQ5NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS8zdy05eHh4LmMKKysrIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguYwpAQCAtNzMsNiArNzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC02MTUsNyArNjE2LDcgQEAKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAogCS8qIE9ubHkgbGV0IG9uZSBvZiB0aGVzZSB0aHJvdWdoIGF0IGEgdGltZSAqLwotCWlmIChkb3duX2ludGVycnVwdGlibGUoJnR3X2Rldi0+aW9jdGxfc2VtKSkgeworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnR3X2Rldi0+aW9jdGxfbG9jaykpIHsKIAkJcmV0dmFsID0gVFdfSU9DVExfRVJST1JfT1NfRUlOVFI7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTg1Miw3ICs4NTMsNyBAQAogCS8qIE5vdyBmcmVlIGlvY3RsIGJ1ZiBtZW1vcnkgKi8KIAlkbWFfZnJlZV9jb2hlcmVudCgmdHdfZGV2LT50d19wY2lfZGV2LT5kZXYsIGRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZCtzaXplb2YoVFdfSW9jdGxfQnVmX0FwYWNoZSkgLSAxLCBjcHVfYWRkciwgZG1hX2hhbmRsZSk7CiBvdXQyOgotCXVwKCZ0d19kZXYtPmlvY3RsX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZ0d19kZXYtPmlvY3RsX2xvY2spOwogb3V0OgogCXJldHVybiByZXR2YWw7CiB9IC8qIEVuZCB0d2FfY2hyZGV2X2lvY3RsKCkgKi8KQEAgLTExODIsNyArMTE4Myw3IEBACiAJdHdfZGV2LT5lcnJvcl9zZXF1ZW5jZV9pZCA9IDE7CiAJdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFOwogCi0JaW5pdF9NVVRFWCgmdHdfZGV2LT5pb2N0bF9zZW0pOworCW11dGV4X2luaXQoJnR3X2Rldi0+aW9jdGxfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdHdfZGV2LT5pb2N0bF93cXVldWUpOwogCiAJcmV0dmFsID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS8zdy05eHh4LmggYi9kcml2ZXJzL3Njc2kvM3ctOXh4eC5oCmluZGV4IDQ2ZjIyY2QuLjFiMTZkNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS8zdy05eHh4LmgKKysrIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguaApAQCAtNjcyLDcgKzY3Miw3IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgaW9jdGxfbXNlYzsKIAlpbnQJCQljaHJkZXZfcmVxdWVzdF9pZDsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlpb2N0bF93cXVldWU7Ci0Jc3RydWN0IHNlbWFwaG9yZQlpb2N0bF9zZW07CisJc3RydWN0IG11dGV4CQlpb2N0bF9sb2NrOwogCWNoYXIJCQlhZW5fY2xvYmJlcjsKIAl1bnNpZ25lZCBzaG9ydAkJd29ya2luZ19zcmw7CiAJdW5zaWduZWQgc2hvcnQJCXdvcmtpbmdfYnJhbmNoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzN3LXh4eHguYyBiL2RyaXZlcnMvc2NzaS8zdy14eHh4LmMKaW5kZXggMjgzZjZkMi4uMjVmNjc4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpLzN3LXh4eHguYworKysgYi9kcml2ZXJzL3Njc2kvM3cteHh4eC5jCkBAIC0yMDMsNiArMjAzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtODg4LDcgKzg4OSw3IEBACiAJZHByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2NocmRldl9pb2N0bCgpXG4iKTsKIAogCS8qIE9ubHkgbGV0IG9uZSBvZiB0aGVzZSB0aHJvdWdoIGF0IGEgdGltZSAqLwotCWlmIChkb3duX2ludGVycnVwdGlibGUoJnR3X2Rldi0+aW9jdGxfc2VtKSkKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0d19kZXYtPmlvY3RsX2xvY2spKQogCQlyZXR1cm4gLUVJTlRSOwogCiAJLyogRmlyc3QgY29weSBkb3duIHRoZSBidWZmZXIgbGVuZ3RoICovCkBAIC0xMDI5LDcgKzEwMzAsNyBAQAogCS8qIE5vdyBmcmVlIGlvY3RsIGJ1ZiBtZW1vcnkgKi8KIAlkbWFfZnJlZV9jb2hlcmVudCgmdHdfZGV2LT50d19wY2lfZGV2LT5kZXYsIGRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZCtzaXplb2YoVFdfTmV3X0lvY3RsKSAtIDEsIGNwdV9hZGRyLCBkbWFfaGFuZGxlKTsKIG91dDoKLQl1cCgmdHdfZGV2LT5pb2N0bF9zZW0pOworCW11dGV4X3VubG9jaygmdHdfZGV2LT5pb2N0bF9sb2NrKTsKIAlyZXR1cm4gcmV0dmFsOwogfSAvKiBFbmQgdHdfY2hyZGV2X2lvY3RsKCkgKi8KIApAQCAtMTI3MCw3ICsxMjcxLDcgQEAKIAl0d19kZXYtPnBlbmRpbmdfdGFpbCA9IFRXX1FfU1RBUlQ7CiAJdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFOwogCi0JaW5pdF9NVVRFWCgmdHdfZGV2LT5pb2N0bF9zZW0pOworCW11dGV4X2luaXQoJnR3X2Rldi0+aW9jdGxfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdHdfZGV2LT5pb2N0bF93cXVldWUpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvM3cteHh4eC5oIGIvZHJpdmVycy9zY3NpLzN3LXh4eHguaAppbmRleCA0ZjgxZmMzLi4zMWZlNWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvM3cteHh4eC5oCisrKyBiL2RyaXZlcnMvc2NzaS8zdy14eHh4LmgKQEAgLTQyMCw3ICs0MjAsNyBAQAogCXUzMgkJCW1heF9zZWN0b3JfY291bnQ7CiAJdTMyCQkJYWVuX2NvdW50OwogCXN0cnVjdCBTY3NpX0hvc3QJKmhvc3Q7Ci0Jc3RydWN0IHNlbWFwaG9yZQlpb2N0bF9zZW07CisJc3RydWN0IG11dGV4CQlpb2N0bF9sb2NrOwogCXVuc2lnbmVkIHNob3J0CQlhZW5fcXVldWVbVFdfUV9MRU5HVEhdOwogCXVuc2lnbmVkIGNoYXIJCWFlbl9oZWFkOwogCXVuc2lnbmVkIGNoYXIJCWFlbl90YWlsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmMgYi9kcml2ZXJzL3Njc2kvQnVzTG9naWMuYwppbmRleCA5ZDYwNDBiLi4xYzQ1OTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvQnVzTG9naWMuYworKysgYi9kcml2ZXJzL3Njc2kvQnVzTG9naWMuYwpAQCAtMjIxNiw2ICsyMjE2LDcgQEAKIAkJSG9zdEFkYXB0ZXItPlBDSV9BZGRyZXNzID0gUHJvYmVJbmZvLT5QQ0lfQWRkcmVzczsKIAkJSG9zdEFkYXB0ZXItPkJ1cyA9IFByb2JlSW5mby0+QnVzOwogCQlIb3N0QWRhcHRlci0+RGV2aWNlID0gUHJvYmVJbmZvLT5EZXZpY2U7CisJCUhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlID0gUHJvYmVJbmZvLT5QQ0lfRGV2aWNlOwogCQlIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWwgPSBQcm9iZUluZm8tPklSUV9DaGFubmVsOwogCQlIb3N0QWRhcHRlci0+QWRkcmVzc0NvdW50ID0gQnVzTG9naWNfSG9zdEFkYXB0ZXJBZGRyZXNzQ291bnRbSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyVHlwZV07CiAJCS8qCkBAIC0yMjk2LDcgKzIyOTcsNyBAQAogCQkJCXNjc2lfaG9zdF9wdXQoSG9zdCk7CiAJCQl9IGVsc2UgewogCQkJCUJ1c0xvZ2ljX0luaXRpYWxpemVIb3N0U3RydWN0dXJlKEhvc3RBZGFwdGVyLCBIb3N0KTsKLQkJCQlzY3NpX2FkZF9ob3N0KEhvc3QsIE5VTEwpOworCQkJCXNjc2lfYWRkX2hvc3QoSG9zdCwgSG9zdEFkYXB0ZXItPlBDSV9EZXZpY2UgPyAmSG9zdEFkYXB0ZXItPlBDSV9EZXZpY2UtPmRldiA6IE5VTEwpOwogCQkJCXNjc2lfc2Nhbl9ob3N0KEhvc3QpOwogCQkJCUJ1c0xvZ2ljSG9zdEFkYXB0ZXJDb3VudCsrOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCmluZGV4IDZlMGMwNTkuLjMyMGU3NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKQEAgLTgwLDcgKzgwLDcgQEAKIG9iai0kKENPTkZJR19QQ01DSUFfUUxPR0lDKQkrPSBxbG9naWNmYXM0MDgubwogb2JqLSQoQ09ORklHX1NDU0lfUUxPR0lDX0ZDKQkrPSBxbG9naWNmYy5vIAogb2JqLSQoQ09ORklHX1NDU0lfUUxPR0lDXzEyODApCSs9IHFsYTEyODAubyAKLW9iai0kKENPTkZJR19TQ1NJX1FMQTJYWFgpCSs9IHFsYTJ4eHgvCitvYmotJChDT05GSUdfU0NTSV9RTEFfRkMpCSs9IHFsYTJ4eHgvCiBvYmotJChDT05GSUdfU0NTSV9MUEZDKQkJKz0gbHBmYy8KIG9iai0kKENPTkZJR19TQ1NJX1BBUzE2KQkrPSBwYXMxNi5vCiBvYmotJChDT05GSUdfU0NTSV9TRUFHQVRFKQkrPSBzZWFnYXRlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL1JFQURNRSBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5Mzg2NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi1BQUNSQUlEIERyaXZlciBmb3IgTGludXggKHRha2UgdHdvKQotCi1JbnRyb2R1Y3Rpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoZSBhYWNyYWlkIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIEFkYXB0ZWMgKGh0dHA6Ly93d3cuYWRhcHRlYy5jb20pCi1SQUlEIGNvbnRyb2xsZXJzLiBUaGlzIGlzIGEgbWFqb3IgcmV3cml0ZSBmcm9tIHRoZSBvcmlnaW5hbCAKLUFkYXB0ZWMgc3VwcGxpZWQgZHJpdmVyLiBJdCBoYXMgc2lnbmZpY2FudGx5IGNsZWFuZWQgdXAgYm90aCB0aGUgY29kZQotYW5kIHRoZSBydW5uaW5nIGJpbmFyeSBzaXplICh0aGUgbW9kdWxlIGlzIGxlc3MgdGhhbiBoYWxmIHRoZSBzaXplIG9mCi10aGUgb3JpZ2luYWwpLgotCi1TdXBwb3J0ZWQgQ2FyZHMvQ2hpcHNldHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlBZGFwdGVjIDIwMjBTCi0JQWRhcHRlYyAyMDI1UwotCUFkYXB0ZWMgMjEyMFMKLQlBZGFwdGVjIDIxMzBTCi0JQWRhcHRlYyAyMjAwUwotCUFkYXB0ZWMgMjIzMFMKLQlBZGFwdGVjIDIyNDBTCi0JQWRhcHRlYyAyNDEwU0EKLQlBZGFwdGVjIDI2MTBTQQotCUFkYXB0ZWMgMjgxMFNBCi0JQWRhcHRlYyAyMTYxMFNBCi0JQWRhcHRlYyAzMjMwUwotCUFkYXB0ZWMgMzI0MFMKLQlBZGFwdGVjIDQwMDBTQVMKLQlBZGFwdGVjIDQwMDVTQVMKLQlBZGFwdGVjIDQ4MDBTQVMKLQlBZGFwdGVjIDQ4MDVTQVMKLQlBZGFwdGVjIDU0MDBTCi0JRGVsbCBQRVJDIDIgUXVhZCBDaGFubmVsCi0JRGVsbCBQRVJDIDIvU2kKLQlEZWxsIFBFUkMgMy9TaQotCURlbGwgUEVSQyAzL0RpCi0JRGVsbCBDRVJDIDIKLQlIUCBOZXRSQUlELTRNCi0JTGVnZW5kIFMyMjAKLQlMZWdlbmQgUzIzMAotCUlCTSBTZXJ2ZVJBSUQgOGkKLQlJQ1AgOTAxNFIwCi0JSUNQIDkwMjRSMAotCUlDUCA5MDQ3TUEKLQlJQ1AgOTA4N01BCi0JSUNQIDkwODVMSQotCUlDUCA1MDg1QVUKLQotUGVvcGxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgotQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZyYWRlYWQub3JnPgkodXBkYXRlcyBmb3IgbmV3LXN0eWxlIFBDSSBwcm9iaW5nIGFuZCBTQ1NJIGhvc3QgcmVnaXN0cmF0aW9uLAotCQkJCQkgc21hbGwgY2xlYW51cHMvZml4ZXMpCi1NYXR0IERvbXNjaCA8bWF0dF9kb21zY2hAZGVsbC5jb20+CShyZXZpc2lvbiBpb2N0bCwgYWRhcHRlciBtZXNzYWdlcykKLURlYW5uYSBCb25kcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9uLURBU0Qgc3VwcG9ydCwgUEFFIGZpYnMgYW5kIDY0IGJpdCwgYWRkZWQgbmV3IGFkYXB0ZWMgY29udHJvbGxlcnMKLQkJCQkJIGFkZGVkIG5ldyBpb2N0bHMsIGNoYW5nZWQgc2NzaSBpbnRlcmZhY2UgdG8gdXNlIG5ldyBlcnJvciBoYW5kbGVyLAotCQkJCQkgaW5jcmVhc2VkIHRoZSBudW1iZXIgb2YgZmlicyBhbmQgb3V0c3RhbmRpbmcgY29tbWFuZHMgdG8gYSBjb250YWluZXIpCi0KLQkJCQkJKGZpeGVkIDY0Yml0IGFuZCA2NEcgbWVtb3J5IG1vZGVsLCBjaGFuZ2VkIGNvbmZ1c2luZyBuYW1pbmcgY29udmVudGlvbgotCQkJCQkgd2hlcmUgZmlicyB0aGF0IGdvIHRvIHRoZSBoYXJkd2FyZSBhcmUgY29uc2lzdGVudGx5IGNhbGxlZCBod19maWJzIGFuZAotCQkJCQkgbm90IGp1c3QgZmlicyBsaWtlIHRoZSBuYW1lIG9mIHRoZSBkcml2ZXIgdHJhY2tpbmcgc3RydWN0dXJlKQotTWFyayBTYWx5enluIDxNYXJrX1NhbHl6eW5AYWRhcHRlYy5jb20+IEZpeGVkIHBhbmljIGlzc3VlcyBhbmQgYWRkZWQgc29tZSBuZXcgcHJvZHVjdCBpZHMgZm9yIHVwY29taW5nIGhiYXMuIFBlcmZvcm1hbmNlIHR1bmluZywgY2FyZCBmYWlsb3ZlciBhbmQgYnVnIG1pdGlnYXRpb25zLgotCi1PcmlnaW5hbCBEcml2ZXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFkYXB0ZWMgVW5peCBPRU0gUHJvZHVjdCBHcm91cAotCi1NYWlsaW5nIExpc3QKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnIChJbnRlcmVzdGVkIHBhcnRpZXMgdHJvbGwgaGVyZSkKLUFsc28gbm90ZSB0aGlzIGlzIHZlcnkgZGlmZmVyZW50IHRvIEJyaWFuJ3Mgb3JpZ2luYWwgZHJpdmVyCi1zbyBkb24ndCBleHBlY3QgaGltIHRvIHN1cHBvcnQgaXQuCi1BZGFwdGVjIGRvZXMgc3VwcG9ydCB0aGlzIGRyaXZlci4gIENvbnRhY3QgZWl0aGVyIHRlY2ggc3VwcG9ydCBvciBNYXJrIFNhbHl6eW4uCi0KLU9yaWdpbmFsIGJ5IEJyaWFuIEJvZXJuZXIgRmVicnVhcnkgMjAwMQotUmV3cml0dGVuIGJ5IEFsYW4gQ294LCBOb3ZlbWJlciAyMDAxCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmggYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmgKaW5kZXggMzBmZDhkNi4uNjZkYmI2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaApAQCAtNTMyLDYgKzUzMiwxMyBAQAogI2RlZmluZSBBQUNfUVVJUktfTUFTVEVSIDB4MDAwOAogCiAvKgorICogU29tZSBhZGFwdGVyIGZpcm13YXJlIHBlcmZvcm0gcG9vcmx5IHdoZW4gaXQgbXVzdCBzcGxpdCB1cCBzY2F0dGVyIGdhdGhlcnMKKyAqIGluIG9yZGVyIHRvIGRlYWwgd2l0aCB0aGUgbGltaXRzIG9mIHRoZSB1bmRlcmx5aW5nIENISU0uIFRoaXMgbGltaXQgaW4gdGhpcworICogY2xhc3Mgb2YgYWRhcHRlcnMgaXMgMTcgc2NhdHRlciBnYXRoZXIgZWxlbWVudHMuCisgKi8KKyNkZWZpbmUgQUFDX1FVSVJLXzE3U0cJMHgwMDEwCisKKy8qCiAgKglUaGUgYWRhcHRlciBpbnRlcmZhY2Ugc3BlY3MgYWxsIHF1ZXVlcyB0byBiZSBsb2NhdGVkIGluIHRoZSBzYW1lCiAgKglwaHlzaWNhbGx5IGNvbnRpZ291cyBibG9jay4gVGhlIGhvc3Qgc3RydWN0dXJlIHRoYXQgZGVmaW5lcyB0aGUKICAqCWNvbW11aWNhdGlvbiBxdWV1ZXMgd2lsbCBhc3N1bWUgdGhleSBhcmUgZWFjaCBhIHNlcGFyYXRlIHBoeXNpY2FsbHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCmluZGV4IGVmNjIzYmQuLjRmZTc5Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWN0cmwuYwpAQCAtODUsNiArODUsMTAgQEAKIAlpZiAoc2l6ZSA8IGxlMTZfdG9fY3B1KGtmaWItPmhlYWRlci5TZW5kZXJTaXplKSkKIAkJc2l6ZSA9IGxlMTZfdG9fY3B1KGtmaWItPmhlYWRlci5TZW5kZXJTaXplKTsKIAlpZiAoc2l6ZSA+IGRldi0+bWF4X2ZpYl9zaXplKSB7CisJCWlmIChzaXplID4gMjA0OCkgeworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQogCQkvKiBIaWdoamFjayB0aGUgaHdfZmliICovCiAJCWh3X2ZpYiA9IGZpYnB0ci0+aHdfZmliOwogCQlod19maWJfcGEgPSBmaWJwdHItPmh3X2ZpYl9wYTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCmluZGV4IDliOTA2MmYuLjBiZjVmOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYwpAQCAtMjAwLDEwICsyMDAsMTAgQEAKIAl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkNhbGxpc3RvICAgICAgICAiLCAyLCBBQUNfUVVJUktfTUFTVEVSIH0sIC8qIEp1cGl0ZXIgUGxhdGZvcm0gKi8KIAl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTIwMjBTQSAgICAgICAiLCAxIH0sIC8qIEFTUi0yMDIwU0EgU0FUQSBQQ0ktWCBaQ1IgKFNreWhhd2spICovCiAJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi0yMDI1U0EgICAgICAgIiwgMSB9LCAvKiBBU1ItMjAyNVNBIFNBVEEgU08tRElNTSBQQ0ktWCBaQ1IgKFRlcm1pbmF0b3IpICovCi0JeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFBUi0yNDEwU0EgU0FUQSAiLCAxIH0sIC8qIEFBUi0yNDEwU0EgUENJIFNBVEEgNGNoIChKYWd1YXIgSUkpICovCi0JeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkRFTEwgICAgIiwgIkNFUkMgU1IyICAgICAgICAiLCAxIH0sIC8qIENFUkMgU0FUQSBSQUlEIDIgUENJIFNBVEEgNmNoIChEZWxsQ29yc2FpcikgKi8KLQl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQUFSLTI4MTBTQSBTQVRBICIsIDEgfSwgLyogQUFSLTI4MTBTQSBQQ0kgU0FUQSA4Y2ggKENvcnNhaXItOCkgKi8KLQl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQUFSLTIxNjEwU0EgU0FUQSIsIDEgfSwgLyogQUFSLTIxNjEwU0EgUENJIFNBVEEgMTZjaCAoQ29yc2Fpci0xNikgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQUFSLTI0MTBTQSBTQVRBICIsIDEsIEFBQ19RVUlSS18xN1NHIH0sIC8qIEFBUi0yNDEwU0EgUENJIFNBVEEgNGNoIChKYWd1YXIgSUkpICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkRFTEwgICAgIiwgIkNFUkMgU1IyICAgICAgICAiLCAxLCBBQUNfUVVJUktfMTdTRyB9LCAvKiBDRVJDIFNBVEEgUkFJRCAyIFBDSSBTQVRBIDZjaCAoRGVsbENvcnNhaXIpICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFBUi0yODEwU0EgU0FUQSAiLCAxLCBBQUNfUVVJUktfMTdTRyB9LCAvKiBBQVItMjgxMFNBIFBDSSBTQVRBIDhjaCAoQ29yc2Fpci04KSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBQVItMjE2MTBTQSBTQVRBIiwgMSwgQUFDX1FVSVJLXzE3U0cgfSwgLyogQUFSLTIxNjEwU0EgUENJIFNBVEEgMTZjaCAoQ29yc2Fpci0xNikgKi8KIAl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTIwMjZaQ1IgICAgICIsIDEgfSwgLyogRVNEIFNPLURJTU0gUENJLVggU0FUQSBaQ1IgKFByb3dsZXIpICovCiAJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFBUi0yNjEwU0EgICAgICAiLCAxIH0sIC8qIFNBVEEgNkNoIChCZWFyY2F0KSAqLwogCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItMjI0MFMgICAgICAgIiwgMSB9LCAvKiBBU1ItMjI0MFMgKFNhYnJlRXhwcmVzcykgKi8KQEAgLTU3NCw3ICs1NzQsMTUgQEAKIAlzdHJ1Y3QgYWFjX2RldiAqZGV2ID0gKHN0cnVjdCBhYWNfZGV2KiljbGFzc190b19zaG9zdChjbGFzc19kZXYpLT5ob3N0ZGF0YTsKIAlpbnQgbGVuOwogCi0JbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwKKwlpZiAoZGV2LT5zdXBwbGVtZW50X2FkYXB0ZXJfaW5mby5BZGFwdGVyVHlwZVRleHRbMF0pIHsKKwkJY2hhciAqIGNwID0gZGV2LT5zdXBwbGVtZW50X2FkYXB0ZXJfaW5mby5BZGFwdGVyVHlwZVRleHQ7CisJCXdoaWxlICgqY3AgJiYgKmNwICE9ICcgJykKKwkJCSsrY3A7CisJCXdoaWxlICgqY3AgPT0gJyAnKQorCQkJKytjcDsKKwkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgY3ApOworCX0gZWxzZQorCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAogCQkgIGFhY19kcml2ZXJzW2Rldi0+Y2FyZHR5cGVdLm1vZGVsKTsKIAlyZXR1cm4gbGVuOwogfQpAQCAtNTg1LDcgKzU5MywxNSBAQAogCXN0cnVjdCBhYWNfZGV2ICpkZXYgPSAoc3RydWN0IGFhY19kZXYqKWNsYXNzX3RvX3Nob3N0KGNsYXNzX2RldiktPmhvc3RkYXRhOwogCWludCBsZW47CiAKLQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAorCWlmIChkZXYtPnN1cHBsZW1lbnRfYWRhcHRlcl9pbmZvLkFkYXB0ZXJUeXBlVGV4dFswXSkgeworCQljaGFyICogY3AgPSBkZXYtPnN1cHBsZW1lbnRfYWRhcHRlcl9pbmZvLkFkYXB0ZXJUeXBlVGV4dDsKKwkJd2hpbGUgKCpjcCAmJiAqY3AgIT0gJyAnKQorCQkJKytjcDsKKwkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlLipzXG4iLAorCQkgIChpbnQpKGNwIC0gKGNoYXIgKilkZXYtPnN1cHBsZW1lbnRfYWRhcHRlcl9pbmZvLkFkYXB0ZXJUeXBlVGV4dCksCisJCSAgZGV2LT5zdXBwbGVtZW50X2FkYXB0ZXJfaW5mby5BZGFwdGVyVHlwZVRleHQpOworCX0gZWxzZQorCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAogCQkgIGFhY19kcml2ZXJzW2Rldi0+Y2FyZHR5cGVdLnZuYW1lKTsKIAlyZXR1cm4gbGVuOwogfQpAQCAtODM3LDYgKzg1MywxMyBAQAogIAkJICA9IChhYWMtPnNjc2lfaG9zdF9wdHItPnNnX3RhYmxlc2l6ZSAqIDgpICsgMTEyOwogIAl9CiAKKyAJaWYgKChhYWNfZHJpdmVyc1tpbmRleF0ucXVpcmtzICYgQUFDX1FVSVJLXzE3U0cpICYmCisJCQkoYWFjLT5zY3NpX2hvc3RfcHRyLT5zZ190YWJsZXNpemUgPiAxNykpIHsKKyAJCWFhYy0+c2NzaV9ob3N0X3B0ci0+c2dfdGFibGVzaXplID0gMTc7CisgCQlhYWMtPnNjc2lfaG9zdF9wdHItPm1heF9zZWN0b3JzCisgCQkgID0gKGFhYy0+c2NzaV9ob3N0X3B0ci0+c2dfdGFibGVzaXplICogOCkgKyAxMTI7CisgCX0KKwogCS8qCiAJICogRmlyd2FyZSBwcmludGYgd29ya3Mgb25seSB3aXRoIG9sZGVyIGZpcm13YXJlLgogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvS2NvbmZpZy5haWM3eHh4IGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvS2NvbmZpZy5haWM3eHh4CmluZGV4IGFjOGRlMDMuLjZjMmMzOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljN3h4eAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzd4eHgKQEAgLTQyLDEzICs0MiwxMyBAQAogY29uZmlnIEFJQzdYWFhfUkVTRVRfREVMQVlfTVMKIAlpbnQgIkluaXRpYWwgYnVzIHJlc2V0IGRlbGF5IGluIG1pbGxpLXNlY29uZHMiCiAJZGVwZW5kcyBvbiBTQ1NJX0FJQzdYWFgKLQlkZWZhdWx0ICIxNTAwMCIKKwlkZWZhdWx0ICI1MDAwIgogCS0tLWhlbHAtLS0KIAlUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBhZnRlciBhbiBpbml0aWFsIGJ1cyByZXNldC4KIAlUaGUgYnVzIHNldHRsZSBkZWxheSBmb2xsb3dpbmcgYWxsIGVycm9yIHJlY292ZXJ5IGFjdGlvbnMgaXMKIAlkaWN0YXRlZCBieSB0aGUgU0NTSSBsYXllciBhbmQgaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgdmFsdWUuCiAKLQlEZWZhdWx0OiAxNTAwMCAoMTUgc2Vjb25kcykKKwlEZWZhdWx0OiA1MDAwICg1IHNlY29uZHMpCiAKIGNvbmZpZyBBSUM3WFhYX1BST0JFX0VJU0FfVkwKIAlib29sICJQcm9iZSBmb3IgRUlTQSBhbmQgVkwgQUlDN1hYWCBBZGFwdGVycyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaAppbmRleCA2NTNmYjBiLi4yY2ZkYmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5oCkBAIC0zNyw3ICszNyw3IEBACiAgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqCi0gKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguaCM5NSAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguaCMxMDggJAogICoKICAqICRGcmVlQlNEJAogICovCkBAIC03NSw4ICs3NSw3IEBACiAjZGVmaW5lIElOSVRJQVRPUl9XSUxEQ0FSRAkofjApCiAjZGVmaW5lCVNDQl9MSVNUX05VTEwJCTB4RkYwMAogI2RlZmluZQlTQ0JfTElTVF9OVUxMX0xFCShhaGRfaHRvbGUxNihTQ0JfTElTVF9OVUxMKSkKLSNkZWZpbmUgUU9VVEZJRk9fRU5UUllfVkFMSUQgMHg4MDAwCi0jZGVmaW5lIFFPVVRGSUZPX0VOVFJZX1ZBTElEX0xFIChhaGRfaHRvbGUxNigweDgwMDApKQorI2RlZmluZSBRT1VURklGT19FTlRSWV9WQUxJRCAweDgwCiAjZGVmaW5lIFNDQklEX0lTX05VTEwoc2NiaWQpICgoKHNjYmlkKSAmIDB4RkYwMCApID09IFNDQl9MSVNUX05VTEwpCiAKICNkZWZpbmUgU0NTSUlEX1RBUkdFVChhaGQsIHNjc2lpZCkJXApAQCAtMTA1Myw2ICsxMDUyLDEzIEBACiAKIHR5cGVkZWYgdm9pZCBhaGRfY2FsbGJhY2tfdCAodm9pZCAqKTsKIAorc3RydWN0IGFoZF9jb21wbGV0aW9uCit7CisJdWludDE2X3QJdGFnOworCXVpbnQ4X3QJCXNnX3N0YXR1czsKKwl1aW50OF90CQl2YWxpZF90YWc7Cit9OworCiBzdHJ1Y3QgYWhkX3NvZnRjIHsKIAlidXNfc3BhY2VfdGFnX3QgICAgICAgICAgIHRhZ3NbMl07CiAJYnVzX3NwYWNlX2hhbmRsZV90ICAgICAgICBic2hzWzJdOwpAQCAtMTA2Miw2ICsxMDY4LDcgQEAKIAlzdHJ1Y3Qgc2NiX2RhdGEJCSAgc2NiX2RhdGE7CiAKIAlzdHJ1Y3QgaGFyZHdhcmVfc2NiCSAqbmV4dF9xdWV1ZWRfaHNjYjsKKwlzdHJ1Y3QgbWFwX25vZGUJCSAqbmV4dF9xdWV1ZWRfaHNjYl9tYXA7CiAKIAkvKgogCSAqIFNDQnMgdGhhdCBoYXZlIGJlZW4gc2VudCB0byB0aGUgY29udHJvbGxlcgpAQCAtMTE0MCwxNiArMTE0NywyMyBAQAogCWFoZF9mbGFnCQkgIGZsYWdzOwogCXN0cnVjdCBzZWVwcm9tX2NvbmZpZwkgKnNlZXBfY29uZmlnOwogCi0JLyogVmFsdWVzIHRvIHN0b3JlIGluIHRoZSBTRVFDVEwgcmVnaXN0ZXIgZm9yIHBhdXNlIGFuZCB1bnBhdXNlICovCi0JdWludDhfdAkJCSAgdW5wYXVzZTsKLQl1aW50OF90CQkJICBwYXVzZTsKLQogCS8qIENvbW1hbmQgUXVldWVzICovCisJc3RydWN0IGFoZF9jb21wbGV0aW9uCSAgKnFvdXRmaWZvOwogCXVpbnQxNl90CQkgIHFvdXRmaWZvbmV4dDsKIAl1aW50MTZfdAkJICBxb3V0Zmlmb25leHRfdmFsaWRfdGFnOwogCXVpbnQxNl90CQkgIHFpbmZpZm9uZXh0OwogCXVpbnQxNl90CQkgIHFpbmZpZm9bQUhEX1NDQl9NQVhdOwotCXVpbnQxNl90CQkgKnFvdXRmaWZvOworCisJLyoKKwkgKiBPdXIgcWZyZWV6ZSBjb3VudC4gIFRoZSBzZXF1ZW5jZXIgY29tcGFyZXMKKwkgKiB0aGlzIHZhbHVlIHdpdGggaXRzIG93biBjb3VudGVyIHRvIGRldGVybWluZQorCSAqIHdoZXRoZXIgdG8gYWxsb3cgc2VsZWN0aW9ucyB0byBvY2N1ci4KKwkgKi8KKwl1aW50MTZfdAkJICBxZnJlZXplX2NudDsKKworCS8qIFZhbHVlcyB0byBzdG9yZSBpbiB0aGUgU0VRQ1RMIHJlZ2lzdGVyIGZvciBwYXVzZSBhbmQgdW5wYXVzZSAqLworCXVpbnQ4X3QJCQkgIHVucGF1c2U7CisJdWludDhfdAkJCSAgcGF1c2U7CiAKIAkvKiBDcml0aWNhbCBTZWN0aW9uIERhdGEgKi8KIAlzdHJ1Y3QgY3MJCSAqY3JpdGljYWxfc2VjdGlvbnM7CkBAIC0xMTk3LDggKzEyMTEsNyBAQAogCSAqLwogCWJ1c19kbWFfdGFnX3QJCSAgcGFyZW50X2RtYXQ7CiAJYnVzX2RtYV90YWdfdAkJICBzaGFyZWRfZGF0YV9kbWF0OwotCWJ1c19kbWFtYXBfdAkJICBzaGFyZWRfZGF0YV9kbWFtYXA7Ci0JZG1hX2FkZHJfdAkJICBzaGFyZWRfZGF0YV9idXNhZGRyOworCXN0cnVjdCBtYXBfbm9kZQkJICBzaGFyZWRfZGF0YV9tYXA7CiAKIAkvKiBJbmZvcm1hdGlvbiBzYXZlZCB0aHJvdWdoIHN1c3BlbmQvcmVzdW1lIGN5Y2xlcyAqLwogCXN0cnVjdCBhaGRfc3VzcGVuZF9zdGF0ZSAgc3VzcGVuZF9zdGF0ZTsKQEAgLTEyOTYsOSArMTMwOSw5IEBACiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBBSERfUENJX0lPQUREUjAJUENJUl9NQVBTCS8qIEkvTyBCQVIqLwotI2RlZmluZSBBSERfUENJX01FTUFERFIJKFBDSVJfTUFQUyArIDQpCS8qIE1lbW9yeSBCQVIgKi8KLSNkZWZpbmUgQUhEX1BDSV9JT0FERFIxCShQQ0lSX01BUFMgKyAxMikvKiBTZWNvbmQgSS9PIEJBUiAqLworI2RlZmluZSBBSERfUENJX0lPQUREUjAJUENJUl9CQVIoMCkJLyogSS9PIEJBUiovCisjZGVmaW5lIEFIRF9QQ0lfTUVNQUREUglQQ0lSX0JBUigxKQkvKiBNZW1vcnkgQkFSICovCisjZGVmaW5lIEFIRF9QQ0lfSU9BRERSMQlQQ0lSX0JBUigzKQkvKiBTZWNvbmQgSS9PIEJBUiAqLwogCiB0eXBlZGVmIGludCAoYWhkX2RldmljZV9zZXR1cF90KShzdHJ1Y3QgYWhkX3NvZnRjICopOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LnJlZyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHgucmVnCmluZGV4IGNjYTU4ZWQuLjNhMzIwNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHgucmVnCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHgucmVnCkBAIC0zOSw3ICszOSw3IEBACiAgKgogICogJEZyZWVCU0QkCiAgKi8KLVZFUlNJT04gPSAiJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnJlZyM3MCAkIgorVkVSU0lPTiA9ICIkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHgucmVnIzc2ICQiCiAKIC8qCiAgKiBUaGlzIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBhaWM3eHh4X2FzbSB1dGlsaXR5IGZvciB1c2UgaW4gYXNzZW1ibGluZwpAQCAtNjUsMTMgKzY1LDYgQEAKIAkJbXZpCU1PREVfUFRSLCBNS19NT0RFKHNyYywgZHN0KTsJCQlcCiAJfQogCi0jZGVmaW5lIFRPR0dMRV9ERkZfTU9ERQkJCQkJCQlcCi0JaWYgKChhaGQtPmJ1Z3MgJiBBSERfU0VUX01PREVfQlVHKSAhPSAwKSB7CQkJXAotCQljYWxsCXRvZ2dsZV9kZmZfbW9kZV93b3JrX2Fyb3VuZDsJCQlcCi0JfSBlbHNlIHsJCQkJCQkJXAotCQl4b3IJTU9ERV9QVFIsIE1LX01PREUoTV9ERkYxLCBNX0RGRjEpOwkJXAotCX0KLQkKICNkZWZpbmUgUkVTVE9SRV9NT0RFKG1vZGUpCQkJCQkJXAogCWlmICgoYWhkLT5idWdzICYgQUhEX1NFVF9NT0RFX0JVRykgIT0gMCkgewkJCVwKIAkJbW92CW1vZGUgY2FsbCBzZXRfbW9kZV93b3JrX2Fyb3VuZDsJCQlcCkBAIC0xMTk5LDcgKzExOTIsNyBAQAogCiAvKgogICogTFEgUGFja2V0IEluCi0gKiBUaGUgbGFzdCBMUSBQYWNrZXQgcmVjZWl2ZWQKKyAqIFRoZSBsYXN0IExRIFBhY2tldCByZWNpZXZlZAogICovCiByZWdpc3RlciBMUUlOIHsKIAlhZGRyZXNzCQkJMHgwMjAKQEAgLTM1NDIsMTAgKzM1MzUsMzQgQEAKIAlDT01QTEVURV9ETUFfU0NCX0hFQUQgewogCQlzaXplCQkyCiAJfQotCS8qIENvdW50aW5nIHNlbWFwaG9yZSB0byBwcmV2ZW50IG5ldyBzZWxlY3Qtb3V0cyAqLworCS8qCisJICogdGFpbCBvZiBsaXN0IG9mIFNDQnMgdGhhdCBoYXZlCisJICogY29tcGxldGVkIGJ1dCBuZWVkIHRvIGJlIHVwbG9hZGVkCisJICogdG8gdGhlIGhvc3QgcHJpb3IgdG8gYmVpbmcgY29tcGxldGVkLgorCSAqLworCUNPTVBMRVRFX0RNQV9TQ0JfVEFJTCB7CisJCXNpemUJCTIKKwl9CisJLyoKKwkgKiBoZWFkIG9mIGxpc3Qgb2YgU0NCcyB0aGF0IGhhdmUKKwkgKiBiZWVuIHVwbG9hZGVkIHRvIHRoZSBob3N0LCBidXQgY2Fubm90CisJICogYmUgY29tcGxldGVkIHVudGlsIHRoZSBRRlJFRVpFIGlzIGluCisJICogZnVsbCBlZmZlY3QgKGkuZS4gbm8gc2VsZWN0aW9ucyBwZW5kaW5nKS4KKwkgKi8KKwlDT01QTEVURV9PTl9RRlJFRVpFX0hFQUQgeworCQlzaXplCQkyCisJfQorCS8qCisJICogQ291bnRpbmcgc2VtYXBob3JlIHRvIHByZXZlbnQgbmV3IHNlbGVjdC1vdXRzCisJICogVGhlIHF1ZXVlIGlzIGZyb3plbiBzbyBsb25nIGFzIHRoZSBzZXF1ZW5jZXIKKwkgKiBhbmQga2VybmVsIGZyZWV6ZSBjb3VudHMgZGlmZmVyLgorCSAqLwogCVFGUkVFWkVfQ09VTlQgewogCQlzaXplCQkyCiAJfQorCUtFUk5FTF9RRlJFRVpFX0NPVU5UIHsKKwkJc2l6ZQkJMgorCX0KIAkvKgogCSAqIE1vZGUgdG8gcmVzdG9yZSBvbiBsZWdhY3kgaWRsZSBsb29wIGV4aXQuCiAJICovCkBAIC0zNjI1LDYgKzM2NDIsMTcgQEAKIAkJc2l6ZQkJMQogCX0KIAkvKgorCSAqIEtlcm5lbCBhbmQgc2VxdWVuY2VyIG9mZnNldHMgaW50byB0aGUgcXVldWUgb2YKKwkgKiBpbmNvbWluZyB0YXJnZXQgbW9kZSBjb21tYW5kIGRlc2NyaXB0b3JzLiAgVGhlCisJICogcXVldWUgaXMgZnVsbCB3aGVuIHRoZSBLRVJORUxfVFFJTlBPUyA9PSBUUUlOUE9TLgorCSAqLworCUtFUk5FTF9UUUlOUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwlUUUlOUE9TIHsgICAgICAgICAgICAgICAgCisJCXNpemUJCTEKKwl9CisJLyoKIAkgKiBCYXNlIGFkZHJlc3Mgb2Ygb3VyIHNoYXJlZCBkYXRhIHdpdGggdGhlIGtlcm5lbCBkcml2ZXIgaW4gaG9zdAogCSAqIG1lbW9yeS4gIFRoaXMgaW5jbHVkZXMgdGhlIHFvdXRmaWZvIGFuZCB0YXJnZXQgbW9kZQogCSAqIGluY29taW5nIGNvbW1hbmQgcXVldWUuCkBAIC0zNjM5LDE3ICszNjY3LDYgQEAKIAlRT1VURklGT19ORVhUX0FERFIgewogCQlzaXplCQk0CiAJfQotCS8qCi0JICogS2VybmVsIGFuZCBzZXF1ZW5jZXIgb2Zmc2V0cyBpbnRvIHRoZSBxdWV1ZSBvZgotCSAqIGluY29taW5nIHRhcmdldCBtb2RlIGNvbW1hbmQgZGVzY3JpcHRvcnMuICBUaGUKLQkgKiBxdWV1ZSBpcyBmdWxsIHdoZW4gdGhlIEtFUk5FTF9UUUlOUE9TID09IFRRSU5QT1MuCi0JICovCi0JS0VSTkVMX1RRSU5QT1MgewotCQlzaXplCQkxCi0JfQotCVRRSU5QT1MgeyAgICAgICAgICAgICAgICAKLQkJc2l6ZQkJMQotCX0KIAlBUkdfMSB7CiAJCXNpemUJCTEKIAkJbWFzawlTRU5EX01TRwkJMHg4MApAQCAtMzk1MSw2ICszOTY4LDcgQEAKIGNvbnN0IFNHX1NJWkVPRiBkb3dubG9hZAogY29uc3QgUEtUX09WRVJSVU5fQlVGT0ZGU0VUIGRvd25sb2FkCiBjb25zdCBTQ0JfVFJBTlNGRVJfU0laRQlkb3dubG9hZAorY29uc3QgQ0FDSEVMSU5FX01BU0sgZG93bmxvYWQKIAogLyoKICAqIEJJT1MgU0NCIG9mZnNldHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguc2VxIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5zZXEKaW5kZXggNjUzMzliYy4uYmVmMWY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5zZXEKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5zZXEKQEAgLTQwLDcgKzQwLDcgQEAKICAqICRGcmVlQlNEJAogICovCiAKLVZFUlNJT04gPSAiJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnNlcSM5OSAkIgorVkVSU0lPTiA9ICIkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguc2VxIzExOSAkIgogUEFUQ0hfQVJHX0xJU1QgPSAic3RydWN0IGFoZF9zb2Z0YyAqYWhkIgogUFJFRklYID0gImFoZF8iCiAKQEAgLTY4LDEzICs2OCw0NyBAQAogCX0KIAlTRVRfTU9ERShNX1NDU0ksIE1fU0NTSSkKIAl0ZXN0CVNDU0lTRVEwLCBFTlNFTE98RU5BUkJPIGpueiBpZGxlX2xvb3BfY2hlY2tidXM7Ci0JdGVzdAlTRVFfRkxBR1MyLCBTRUxFQ1RPVVRfUUZST1pFTiBqbnogaWRsZV9sb29wX2NoZWNrYnVzOworCXRlc3QJU0VRX0ZMQUdTMiwgU0VMRUNUT1VUX1FGUk9aRU4ganogY2hlY2tfd2FpdGluZ19saXN0OworCS8qCisJICogSWYgdGhlIGtlcm5lbCBoYXMgY2F1Z2h0IHVwIHdpdGggdXMsIHRoYXcgdGhlIHF1ZXVlLgorCSAqLworCW1vdglBLCBLRVJORUxfUUZSRUVaRV9DT1VOVDsKKwljbXAJUUZSRUVaRV9DT1VOVCwgQSBqbmUgY2hlY2tfZnJvemVuX2NvbXBsZXRpb25zOworCW1vdglBLCBLRVJORUxfUUZSRUVaRV9DT1VOVFsxXTsKKwljbXAJUUZSRUVaRV9DT1VOVFsxXSwgQSBqbmUgY2hlY2tfZnJvemVuX2NvbXBsZXRpb25zOworCWFuZAlTRVFfRkxBR1MyLCB+U0VMRUNUT1VUX1FGUk9aRU47CisJam1wCWNoZWNrX3dhaXRpbmdfbGlzdDsKK2NoZWNrX2Zyb3plbl9jb21wbGV0aW9uczoKKwl0ZXN0CVNTVEFUMCwgU0VMRE98U0VMSU5HTyBqbnogaWRsZV9sb29wX2NoZWNrYnVzOworQkVHSU5fQ1JJVElDQUw7CisJLyoKKwkgKiBJZiB3ZSBoYXZlIGNvbXBsZXRpb25zIHN0YWxsZWQgd2FpdGluZyBmb3IgdGhlIHFmcmVlemUKKwkgKiB0byB0YWtlIGVmZmVjdCwgbW92ZSB0aGVtIG92ZXIgdG8gdGhlIGNvbXBsZXRlX3NjYiBsaXN0CisJICogbm93IHRoYXQgbm8gc2VsZWN0aW9ucyBhcmUgcGVuZGluZy4KKwkgKi8KKwljbXAJQ09NUExFVEVfT05fUUZSRUVaRV9IRUFEWzFdLFNDQl9MSVNUX05VTEwgamUgaWRsZV9sb29wX2NoZWNrYnVzOworCS8qCisJICogRmluZCB0aGUgZW5kIG9mIHRoZSBxZnJlZXplIGxpc3QuICBUaGUgZmlyc3QgZWxlbWVudCBoYXMKKwkgKiB0byBiZSB0cmVhdGVkIHNwZWNpYWxseS4KKwkgKi8KKwlibW92CVNDQlBUUiwgQ09NUExFVEVfT05fUUZSRUVaRV9IRUFELCAyOworCWNtcCAJU0NCX05FWFRfQ09NUExFVEVbMV0sIFNDQl9MSVNUX05VTEwgamUgam9pbl9saXN0czsKKwkvKgorCSAqIE5vdyB0aGUgbm9ybWFsIGxvb3AuCisJICovCisJYm1vdglTQ0JQVFIsIFNDQl9ORVhUX0NPTVBMRVRFLCAyOworCWNtcCAJU0NCX05FWFRfQ09NUExFVEVbMV0sIFNDQl9MSVNUX05VTEwgam5lIC4gLSAxOworam9pbl9saXN0czoKKwlibW92CVNDQl9ORVhUX0NPTVBMRVRFLCBDT01QTEVURV9TQ0JfSEVBRCwgMjsKKwlibW92CUNPTVBMRVRFX1NDQl9IRUFELCBDT01QTEVURV9PTl9RRlJFRVpFX0hFQUQsIDI7CisJbXZpCUNPTVBMRVRFX09OX1FGUkVFWkVfSEVBRFsxXSwgU0NCX0xJU1RfTlVMTDsKKwlqbXAJaWRsZV9sb29wX2NoZWNrYnVzOworY2hlY2tfd2FpdGluZ19saXN0OgogCWNtcAlXQUlUSU5HX1RJRF9IRUFEWzFdLCBTQ0JfTElTVF9OVUxMIGplIGlkbGVfbG9vcF9jaGVja2J1czsKIAkvKgogCSAqIEVOU0VMTyBpcyBjbGVhcmVkIGJ5IGEgU0VMRE8sIHNvIHdlIG11c3QgdGVzdCBmb3IgU0VMRE8KIAkgKiBvbmUgbGFzdCB0aW1lLgogCSAqLwotQkVHSU5fQ1JJVElDQUw7CiAJdGVzdAlTU1RBVDAsIFNFTERPIGpueiBzZWxlY3Rfb3V0OwogRU5EX0NSSVRJQ0FMOwogCWNhbGwJc3RhcnRfc2VsZWN0aW9uOwpAQCAtOTAsNiArMTI0LDEzIEBACiAJdGVzdAlTU1RBVDIsIE5PTlBBQ0tSRVEganogLiArIDI7CiAJY2FsbAl1bmV4cGVjdGVkX25vbnBrdF9waGFzZV9maW5kX2N0eHQ7CiAJaWYgKChhaGQtPmJ1Z3MgJiBBSERfRkFJTlRfTEVEX0JVRykgIT0gMCkgeworCQkvKgorCQkgKiBPbiBSZXYgQS4gaGFyZHdhcmUsIHRoZSBidXN5IExFRCBpcyBvbmx5CisJCSAqIHR1cm5lZCBvbiBhdXRvbWFpY2FsbHkgZHVyaW5nIHNlbGVjdGlvbnMKKwkJICogYW5kIHJlLXNlbGVjdGlvbnMuICBNYWtlIHRoZSBMRUQgc3RhdHVzCisJCSAqIG1vcmUgdXNlZnVsIGJ5IGZvcmNpbmcgaXQgdG8gYmUgb24gc28KKwkJICogbG9uZyBhcyBvbmUgb2Ygb3VyIGRhdGEgRklGT3MgaXMgYWN0aXZlLgorCQkgKi8KIAkJYW5kCUEsIEZJRk8wRlJFRXxGSUZPMUZSRUUsIERGRlNUQVQ7CiAJCWNtcAlBLCBGSUZPMEZSRUV8RklGTzFGUkVFIGpuZSAuICsgMzsKIAkJYW5kCVNCTEtDVEwsIH5ESUFHTEVERU58RElBR0xFRE9OOwpAQCAtMTAxLDkgKzE0Miw5IEBACiAJY2FsbAlpZGxlX2xvb3BfY2NoYW47CiAJam1wCWlkbGVfbG9vcDsKIAotQkVHSU5fQ1JJVElDQUw7CiBpZGxlX2xvb3BfZ3NmaWZvOgogCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQorQkVHSU5fQ1JJVElDQUw7CiBpZGxlX2xvb3BfZ3NmaWZvX2luX3Njc2lfbW9kZToKIAl0ZXN0CUxRSVNUQVQyLCBMUUlHU0FWQUlMIGp6IHJldHVybjsKIAkvKgpAQCAtMTUyLDExICsxOTMsMTUgQEAKIAogaWRsZV9sb29wX3NlcnZpY2VfZmlmb3M6CiAJU0VUX01PREUoTV9ERkYwLCBNX0RGRjApCitCRUdJTl9DUklUSUNBTDsKIAl0ZXN0CUxPTkdKTVBfQUREUlsxXSwgSU5WQUxJRF9BRERSIGpueiBpZGxlX2xvb3BfbmV4dF9maWZvOwogCWNhbGwJbG9uZ2ptcDsKK0VORF9DUklUSUNBTDsKIGlkbGVfbG9vcF9uZXh0X2ZpZm86CiAJU0VUX01PREUoTV9ERkYxLCBNX0RGRjEpCitCRUdJTl9DUklUSUNBTDsKIAl0ZXN0CUxPTkdKTVBfQUREUlsxXSwgSU5WQUxJRF9BRERSIGp6IGxvbmdqbXA7CitFTkRfQ1JJVElDQUw7CiByZXR1cm46CiAJcmV0OwogCkBAIC0xNzAsNyArMjE1LDYgQEAKIAl0ZXN0CUNDU0NCQ1RMLCBDQ0FSUkVOfENDU0NCRU4ganogc2NiZG1hX2lkbGU7CiAJdGVzdAlDQ1NDQkNUTCwgQ0NTQ0JESVIgam56IGZldGNoX25ld19zY2JfaW5wcm9nOwogCXRlc3QJQ0NTQ0JDVEwsIENDU0NCRE9ORSBqeiByZXR1cm47Ci1FTkRfQ1JJVElDQUw7CiAJLyogRkFMTFRIUk9VR0ggKi8KIHNjYmRtYV90b2hvc3RfZG9uZToKIAl0ZXN0CUNDU0NCQ1RMLCBDQ0FSUkVOIGp6IGZpbGxfcW91dGZpZm9fZG1hZG9uZTsKQEAgLTE4MCwyNiArMjI0LDE4IEBACiAJICogYmFkIFNDU0kgc3RhdHVzIChjdXJyZW50bHkgb25seSBmb3IgdW5kZXJydW5zKSwgd2UKIAkgKiBxdWV1ZSB0aGUgU0NCIGZvciBub3JtYWwgY29tcGxldGlvbi4gIE90aGVyd2lzZSwgd2UKIAkgKiB3YWl0IHVudGlsIGFueSBzZWxlY3Qtb3V0IGFjdGl2aXR5IGhhcyBoYWx0ZWQsIGFuZAotCSAqIHRoZW4gbm90aWZ5IHRoZSBob3N0IHNvIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGNhbiBiZQotCSAqIGRlYWx0IHdpdGguCisJICogdGhlbiBxdWV1ZSB0aGUgY29tcGxldGlvbi4KIAkgKi8KLQl0ZXN0CVNDQl9TQ1NJX1NUQVRVUywgMHhmZiBqbnogc2NiZG1hX25vdGlmeV9ob3N0OwogCWFuZAlDQ1NDQkNUTCwgfihDQ0FSUkVOfENDU0NCRU4pOwogCWJtb3YJQ09NUExFVEVfRE1BX1NDQl9IRUFELCBTQ0JfTkVYVF9DT01QTEVURSwgMjsKKwljbXAJU0NCX05FWFRfQ09NUExFVEVbMV0sIFNDQl9MSVNUX05VTEwgam5lIC4gKyAyOworCW12aQlDT01QTEVURV9ETUFfU0NCX1RBSUxbMV0sIFNDQl9MSVNUX05VTEw7CisJdGVzdAlTQ0JfU0NTSV9TVEFUVVMsIDB4ZmYganogc2NiZG1hX3F1ZXVlX2NvbXBsZXRpb247CisJYm1vdglTQ0JfTkVYVF9DT01QTEVURSwgQ09NUExFVEVfT05fUUZSRUVaRV9IRUFELCAyOworCWJtb3YJQ09NUExFVEVfT05fUUZSRUVaRV9IRUFELCBTQ0JQVFIsIDIgcmV0Oworc2NiZG1hX3F1ZXVlX2NvbXBsZXRpb246CiAJYm1vdglTQ0JfTkVYVF9DT01QTEVURSwgQ09NUExFVEVfU0NCX0hFQUQsIDI7CiAJYm1vdglDT01QTEVURV9TQ0JfSEVBRCwgU0NCUFRSLCAyIHJldDsKLXNjYmRtYV9ub3RpZnlfaG9zdDoKLQlTRVRfTU9ERShNX1NDU0ksIE1fU0NTSSkKLQl0ZXN0CVNDU0lTRVEwLCBFTlNFTE8gam56IHJldHVybjsKLQl0ZXN0CVNTVEFUMCwgKFNFTERPfFNFTElOR08pIGpueiByZXR1cm47Ci0JU0VUX01PREUoTV9DQ0hBTiwgTV9DQ0hBTikKLQkvKgotCSAqIFJlbW92ZSBTQ0IgYW5kIG5vdGlmeSBob3N0LgotCSAqLwotCWFuZAlDQ1NDQkNUTCwgfihDQ0FSUkVOfENDU0NCRU4pOwotCWJtb3YJQ09NUExFVEVfRE1BX1NDQl9IRUFELCBTQ0JfTkVYVF9DT01QTEVURSwgMjsKLQlTRVRfU0VRSU5UQ09ERShCQURfU0NCX1NUQVRVUykKLQlyZXQ7CiBmaWxsX3FvdXRmaWZvX2RtYWRvbmU6CiAJYW5kCUNDU0NCQ1RMLCB+KENDQVJSRU58Q0NTQ0JFTik7CiAJY2FsbAlxb3V0Zmlmb191cGRhdGVkOwpAQCAtMjA4LDYgKzI0NCw3IEBACiAJdGVzdAlRT0ZGX0NUTFNUQSwgU0RTQ0JfUk9MTE9WUiBqeiByZXR1cm47CiAJYm1vdglRT1VURklGT19ORVhUX0FERFIsIFNIQVJFRF9EQVRBX0FERFIsIDQ7CiAJeG9yCVFPVVRGSUZPX0VOVFJZX1ZBTElEX1RBRywgUU9VVEZJRk9fRU5UUllfVkFMSURfVE9HR0xFIHJldDsKK0VORF9DUklUSUNBTDsKIAogcW91dGZpZm9fdXBkYXRlZDoKIAkvKgpAQCAtMzI0LDE0ICszNjEsMTUgQEAKIAkgKiBLZWVwIHRyYWNrIG9mIHRoZSBTQ0JzIHdlIGFyZSBkbWFpbmcganVzdAogCSAqIGluIGNhc2UgdGhlIERNQSBmYWlscyBvciBpcyBhYm9ydGVkLgogCSAqLwotCW1vdglBLCBRT1VURklGT19FTlRSWV9WQUxJRF9UQUc7CiAJYm1vdglDT01QTEVURV9TQ0JfRE1BSU5QUk9HX0hFQUQsIENPTVBMRVRFX1NDQl9IRUFELCAyOwogCW12aQlDQ1NDQkNUTCwgQ0NTQ0JSRVNFVDsKIAlibW92CVNDQkhBRERSLCBRT1VURklGT19ORVhUX0FERFIsIDQ7CisJbW92CUEsIFFPVVRGSUZPX05FWFRfQUREUjsKIAlibW92CVNDQlBUUiwgQ09NUExFVEVfU0NCX0hFQUQsIDI7CiBmaWxsX3FvdXRmaWZvX2xvb3A6Ci0JbW92CUNDU0NCUkFNLCBTQ0JQVFI7Ci0Jb3IJQ0NTQ0JSQU0sIEEsIFNDQlBUUlsxXTsKKwlibW92CUNDU0NCUkFNLCBTQ0JQVFIsIDI7CisJbW92CUNDU0NCUkFNLCBTQ0JfU0dQVFJbMF07CisJbW92CUNDU0NCUkFNLCBRT1VURklGT19FTlRSWV9WQUxJRF9UQUc7CiAJbW92CU5PTkUsIFNEU0NCX1FPRkY7CiAJaW5jCUlOVF9DT0FMRVNDSU5HX0NNRENPVU5UOwogCWFkZAlDTURTX1BFTkRJTkcsIC0xOwpAQCAtMzM5LDYgKzM3NywxOCBAQAogCWNtcAlTQ0JfTkVYVF9DT01QTEVURVsxXSwgU0NCX0xJU1RfTlVMTCBqZSBmaWxsX3FvdXRmaWZvX2RvbmU7CiAJY21wCUNDU0NCQUREUiwgQ0NTQ0JBRERSX01BWCBqZSBmaWxsX3FvdXRmaWZvX2RvbmU7CiAJdGVzdAlRT0ZGX0NUTFNUQSwgU0RTQ0JfUk9MTE9WUiBqbnogZmlsbF9xb3V0Zmlmb19kb25lOworCS8qCisJICogRG9uJ3QgY3Jvc3MgYW4gQURCIG9yIENhY2hsaW5lIGJvdW5kYXJ5IHdoZW4gRE1BJ2luZworCSAqIGNvbXBsZXRpb24gZW50cmllcy4gIEluIFBDSSBtb2RlLCBhdCBsZWFzdCBpbiAzMi8zMworCSAqIGNvbmZpZ3VyYXRpb25zLCB0aGUgU0NCIERNQSBlbmdpbmUgbWF5IGxvc2UgaXRzIHBsYWNlCisJICogaW4gdGhlIGRhdGEtc3RyZWFtIHNob3VsZCB0aGUgdGFyZ2V0IGZvcmNlIGEgcmV0cnkgb24KKwkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiA4Ynl0ZSBhbGlnbmVkIGJvdW5kYXJ5LiBJbgorCSAqIFBDSS1YIG1vZGUsIHdlIGRvIHRoaXMgdG8gYXZvaWQgc3BsaXQgdHJhbnNhY3Rpb25zIHNpbmNlCisJICogbWFueSBjaGlwc2V0cyBzZWVtIHRvIGJlIHVuYWJsZSB0byBmb3JtYXQgcHJvcGVyIHNwbGl0CisJICogY29tcGxldGlvbnMgdG8gY29udGludWUgdGhlIGRhdGEgdHJhbnNmZXIuCisJICovCisJYWRkCVNJTkRFWCwgQSwgQ0NTQ0JBRERSOworCXRlc3QJU0lOREVYLCBDQUNIRUxJTkVfTUFTSyBqeiBmaWxsX3FvdXRmaWZvX2RvbmU7CiAJYm1vdglTQ0JQVFIsIFNDQl9ORVhUX0NPTVBMRVRFLCAyOwogCWptcAlmaWxsX3FvdXRmaWZvX2xvb3A7CiBmaWxsX3FvdXRmaWZvX2RvbmU6CkBAIC0zNTQsNyArNDA0LDYgQEAKIAlibW92CVNDQlBUUiwgQ09NUExFVEVfRE1BX1NDQl9IRUFELCAyOwogCWJtb3YJU0NCSEFERFIsIFNDQl9CVVNBRERSLCA0OwogCW12aQlDQ0FSUkVOfENDU0NCRU58Q0NTQ0JSRVNFVCBqbXAgZG1hX3NjYjsKLUVORF9DUklUSUNBTDsKIAogLyoKICAqIEVpdGhlciBwb3N0IG9yIGZldGNoIGFuIFNDQiBmcm9tIGhvc3QgbWVtb3J5LiAgVGhlIGNhbGxlcgpAQCAtMzcxLDkgKzQyMCwxOSBAQAogCW12aQlTQ0JIQ05ULCBTQ0JfVFJBTlNGRVJfU0laRTsKIAltb3YJQ0NTQ0JDVEwsIFNJTkRFWCByZXQ7CiAKLUJFR0lOX0NSSVRJQ0FMOwogc2V0am1wOgotCWJtb3YJTE9OR0pNUF9BRERSLCBTVEFDSywgMiByZXQ7CisJLyoKKwkgKiBBdCBsZWFzdCBvbiB0aGUgQSwgYSByZXR1cm4gaW4gdGhlIHNhbWUKKwkgKiBpbnN0cnVjdGlvbiBhcyB0aGUgYm1vdiByZXN1bHRzIGluIGEgcmV0dXJuCisJICogdG8gdGhlIGNhbGxlciwgbm90IHRvIHRoZSBuZXcgYWRkcmVzcyBhdCB0aGUKKwkgKiB0b3Agb2YgdGhlIHN0YWNrLiAgU2luY2Ugd2Ugd2FudCB0aGUgbGF0dGVyCisJICogKHdlIHVzZSBzZXRqbXAgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGZyb20gYW4KKwkgKiBpbnRlcnJ1cHQgY29udGV4dCBidXQgbm90IGludm9rZSB0aGF0IGhhbmRsZXIKKwkgKiB1bnRpbCB3ZSByZXR1cm4gdG8gb3VyIGlkbGUgbG9vcCksIHVzZSBhCisJICogc2VwYXJhdGUgcmV0IGluc3RydWN0aW9uLgorCSAqLworCWJtb3YJTE9OR0pNUF9BRERSLCBTVEFDSywgMjsKKwlyZXQ7CiBzZXRqbXBfaW5saW5lOgogCWJtb3YJTE9OR0pNUF9BRERSLCBTVEFDSywgMjsKIGxvbmdqbXA6CkBAIC0zOTIsMTEgKzQ1MSw2IEBACiAJbXZpCVNFUUlOVENUTCwgSU5UVkVDMURTTDsKIAltb3YJTU9ERV9QVFIsIFNJTkRFWDsKIAljbHIJU0VRSU5UQ1RMIHJldDsKLQotdG9nZ2xlX2RmZl9tb2RlX3dvcmtfYXJvdW5kOgotCW12aQlTRVFJTlRDVEwsIElOVFZFQzFEU0w7Ci0JeG9yCU1PREVfUFRSLCBNS19NT0RFKE1fREZGMSwgTV9ERkYxKTsKLQljbHIJU0VRSU5UQ1RMIHJldDsKIH0KIAogCkBAIC00OTAsNiArNTQ0LDIxIEBACiBTRVRfU1JDX01PREUJTV9TQ1NJOwogU0VUX0RTVF9NT0RFCU1fU0NTSTsKIHNlbGVjdF9pbjoKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9GQUlOVF9MRURfQlVHKSAhPSAwKSB7CisJCS8qCisJCSAqIE9uIFJldiBBLiBoYXJkd2FyZSwgdGhlIGJ1c3kgTEVEIGlzIG9ubHkKKwkJICogdHVybmVkIG9uIGF1dG9tYWljYWxseSBkdXJpbmcgc2VsZWN0aW9ucworCQkgKiBhbmQgcmUtc2VsZWN0aW9ucy4gIE1ha2UgdGhlIExFRCBzdGF0dXMKKwkJICogbW9yZSB1c2VmdWwgYnkgZm9yY2luZyBpdCB0byBiZSBvbiBmcm9tCisJCSAqIHRoZSBwb2ludCBvZiBzZWxlY3Rpb24gdW50aWwgb3VyIGlkbGUKKwkJICogbG9vcCBkZXRlcm1pbmVzIHRoYXQgbmVpdGhlciBvZiBvdXIgRklGT3MKKwkJICogYXJlIGJ1c3kuICBUaGlzIGhhbmRsZXMgdGhlIG5vbi1wYWNrZXRpemVkCisJCSAqIGNhc2UgbmljZWx5IGFzIHdlIHdpbGwgbm90IHJldHVybiB0byB0aGUKKwkJICogaWRsZSBsb29wIHVudGlsIHRoZSBidXNmcmVlIGF0IHRoZSBlbmQgb2YKKwkJICogZWFjaCB0cmFuc2FjdGlvbi4KKwkJICovCisJCW9yCVNCTEtDVEwsIERJQUdMRURFTnxESUFHTEVET047CisJfQogCWlmICgoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSAhPSAwKSB7CiAJCS8qCiAJCSAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1cyBoYXMgbm90CkBAIC01MjgsNiArNTk3LDIxIEBACiBTRVRfRFNUX01PREUJTV9TQ1NJOwogc2VsZWN0X291dDoKIEJFR0lOX0NSSVRJQ0FMOworCWlmICgoYWhkLT5idWdzICYgQUhEX0ZBSU5UX0xFRF9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogT24gUmV2IEEuIGhhcmR3YXJlLCB0aGUgYnVzeSBMRUQgaXMgb25seQorCQkgKiB0dXJuZWQgb24gYXV0b21haWNhbGx5IGR1cmluZyBzZWxlY3Rpb25zCisJCSAqIGFuZCByZS1zZWxlY3Rpb25zLiAgTWFrZSB0aGUgTEVEIHN0YXR1cworCQkgKiBtb3JlIHVzZWZ1bCBieSBmb3JjaW5nIGl0IHRvIGJlIG9uIGZyb20KKwkJICogdGhlIHBvaW50IG9mIHJlLXNlbGVjdGlvbiB1bnRpbCBvdXIgaWRsZQorCQkgKiBsb29wIGRldGVybWluZXMgdGhhdCBuZWl0aGVyIG9mIG91ciBGSUZPcworCQkgKiBhcmUgYnVzeS4gIFRoaXMgaGFuZGxlcyB0aGUgbm9uLXBhY2tldGl6ZWQKKwkJICogY2FzZSBuaWNlbHkgYXMgd2Ugd2lsbCBub3QgcmV0dXJuIHRvIHRoZQorCQkgKiBpZGxlIGxvb3AgdW50aWwgdGhlIGJ1c2ZyZWUgYXQgdGhlIGVuZCBvZgorCQkgKiBlYWNoIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJb3IJU0JMS0NUTCwgRElBR0xFREVOfERJQUdMRURPTjsKKwl9CiAJLyogQ2xlYXIgb3V0IGFsbCBTQ0JzIHRoYXQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBzZW50LiAqLwogCWlmICgoYWhkLT5idWdzICYgQUhEX1NFTlRfU0NCX1VQREFURV9CVUcpICE9IDApIHsKIAkJLyoKQEAgLTEwMDAsMTUgKzEwODQsOSBAQAogLyoKICAqIFdlIHJlY2VpdmVkIGEgImNvbW1hbmQgY29tcGxldGUiIG1lc3NhZ2UuICBQdXQgdGhlIFNDQiBvbiB0aGUgY29tcGxldGUKICAqIHF1ZXVlIGFuZCB0cmlnZ2VyIGEgY29tcGxldGlvbiBpbnRlcnJ1cHQgdmlhIHRoZSBpZGxlIGxvb3AuICBCZWZvcmUgZG9pbmcKLSAqIHNvLCBjaGVjayB0byBzZWUgaWYgdGhlcmUKLSAqIGlzIGEgcmVzaWR1YWwgb3IgdGhlIHN0YXR1cyBieXRlIGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIFNUQVRVU19HT09EICgwKS4KLSAqIEluIGVpdGhlciBvZiB0aGVzZSBjb25kaXRpb25zLCB3ZSB1cGxvYWQgdGhlIFNDQiBiYWNrIHRvIHRoZSBob3N0IHNvIGl0IGNhbgotICogcHJvY2VzcyB0aGlzIGluZm9ybWF0aW9uLiAgSW4gdGhlIGNhc2Ugb2YgYSBub24gemVybyBzdGF0dXMgYnl0ZSwgd2UgCi0gKiBhZGRpdGlvbmFsbHkgaW50ZXJydXB0IHRoZSBrZXJuZWwgZHJpdmVyIHN5bmNocm9ub3VzbHksIGFsbG93aW5nIGl0IHRvCi0gKiBkZWNpZGUgaWYgc2Vuc2Ugc2hvdWxkIGJlIHJldHJpZXZlZC4gIElmIHRoZSBrZXJuZWwgZHJpdmVyIHdpc2hlcyB0byByZXF1ZXN0Ci0gKiBzZW5zZSwgaXQgd2lsbCBmaWxsIHRoZSBrZXJuZWwgU0NCIHdpdGggYSByZXF1ZXN0IHNlbnNlIGNvbW1hbmQsIHJlcXVldWUKLSAqIGl0IHRvIHRoZSBRSU5GSUZPIGFuZCB0ZWxsIHVzIG5vdCB0byBwb3N0IHRvIHRoZSBRT1VURklGTyBieSBzZXR0aW5nIAotICogUkVUVVJOXzEgdG8gU0VORF9TRU5TRS4KKyAqIHNvLCBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSByZXNpZHVhbCBvciB0aGUgc3RhdHVzIGJ5dGUgaXMgc29tZXRoaW5nCisgKiBvdGhlciB0aGFuIFNUQVRVU19HT09EICgwKS4gIEluIGVpdGhlciBvZiB0aGVzZSBjb25kaXRpb25zLCB3ZSB1cGxvYWQgdGhlCisgKiBTQ0IgYmFjayB0byB0aGUgaG9zdCBzbyBpdCBjYW4gcHJvY2VzcyB0aGlzIGluZm9ybWF0aW9uLgogICovCiBtZXNnaW5fY29tcGxldGU6CiAKQEAgLTEwNTMsNiArMTEzMSw3IEBACiAJY2FsbAlxdWV1ZV9zY2JfY29tcGxldGlvbjsKIAlqbXAJYXdhaXRfYnVzZnJlZTsKIAorQkVHSU5fQ1JJVElDQUw7CiBmcmVlemVfcXVldWU6CiAJLyogQ2FuY2VsIGFueSBwZW5kaW5nIHNlbGVjdC1vdXQuICovCiAJdGVzdAlTU1RBVDAsIFNFTERPfFNFTElOR08gam56IC4gKyAyOwpAQCAtMTA2Myw2ICsxMTQyLDcgQEAKIAlhZGMJUUZSRUVaRV9DT1VOVFsxXSwgQTsKIAlvcglTRVFfRkxBR1MyLCBTRUxFQ1RPVVRfUUZST1pFTjsKIAltb3YJQSwgQUNDVU1fU0FWRSByZXQ7CitFTkRfQ1JJVElDQUw7CiAKIC8qCiAgKiBDb21wbGV0ZSB0aGUgY3VycmVudCBGSUZPJ3MgU0NCIGlmIGRhdGEgZm9yIHRoaXMgc2FtZQpAQCAtMTA4NSw4ICsxMTY1LDEwIEBACiAJdGVzdAlTQ0JfU0dQVFIsIFNHX0ZVTExfUkVTSUQgam56IHVwbG9hZF9zY2I7LyogTmV2ZXIgeGZlcmVkICovCiAJdGVzdAlTQ0JfUkVTSURVQUxfU0dQVFIsIFNHX0xJU1RfTlVMTCBqeiB1cGxvYWRfc2NiOwogY29tcGxldGU6CitCRUdJTl9DUklUSUNBTDsKIAlibW92CVNDQl9ORVhUX0NPTVBMRVRFLCBDT01QTEVURV9TQ0JfSEVBRCwgMjsKIAlibW92CUNPTVBMRVRFX1NDQl9IRUFELCBTQ0JQVFIsIDIgcmV0OworRU5EX0NSSVRJQ0FMOwogYmFkX3N0YXR1czoKIAljbXAJU0NCX1NDU0lfU1RBVFVTLCBTVEFUVVNfUEtUX1NFTlNFIGplIHVwbG9hZF9zY2I7CiAJY2FsbAlmcmVlemVfcXVldWU7CkBAIC0xMDk3LDkgKzExNzksMTggQEAKIAkgKiBpdCBvbiB0aGUgaG9zdC4KIAkgKi8KIAlibW92CVNDQl9UQUcsIFNDQlBUUiwgMjsKLQlibW92CVNDQl9ORVhUX0NPTVBMRVRFLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsIDI7CitCRUdJTl9DUklUSUNBTDsKKwlvcglTQ0JfU0dQVFIsIFNHX1NUQVRVU19WQUxJRDsKKwltdmkJU0NCX05FWFRfQ09NUExFVEVbMV0sIFNDQl9MSVNUX05VTEw7CisJY21wCUNPTVBMRVRFX0RNQV9TQ0JfSEVBRFsxXSwgU0NCX0xJU1RfTlVMTCBqbmUgYWRkX2RtYV9zY2JfdGFpbDsKIAlibW92CUNPTVBMRVRFX0RNQV9TQ0JfSEVBRCwgU0NCUFRSLCAyOwotCW9yCVNDQl9TR1BUUiwgU0dfU1RBVFVTX1ZBTElEIHJldDsKKwlibW92CUNPTVBMRVRFX0RNQV9TQ0JfVEFJTCwgU0NCUFRSLCAyIHJldDsKK2FkZF9kbWFfc2NiX3RhaWw6CisJYm1vdglSRUcwLCBTQ0JQVFIsIDI7CisJYm1vdglTQ0JQVFIsIENPTVBMRVRFX0RNQV9TQ0JfVEFJTCwgMjsKKwlibW92CVNDQl9ORVhUX0NPTVBMRVRFLCBSRUcwLCAyOworCWJtb3YJQ09NUExFVEVfRE1BX1NDQl9UQUlMLCBSRUcwLCAyIHJldDsKK0VORF9DUklUSUNBTDsKIAogLyoKICAqIElzIGl0IGEgZGlzY29ubmVjdCBtZXNzYWdlPyAgU2V0IGEgZmxhZyBpbiB0aGUgU0NCIHRvIHJlbWluZCB1cwpAQCAtMTE0Niw4ICsxMjM3LDE4IEBACiBhd2FpdF9idXNmcmVlX2NscmNobjoKIAltdmkJREZGU1hGUkNUTCwgQ0xSQ0hOOwogYXdhaXRfYnVzZnJlZV9ub3RfbV9kZmY6Ci0JY2FsbAljbGVhcl90YXJnZXRfc3RhdGU7CisJLyogY2xlYXIgdGFyZ2V0IHNwZWNpZmljIGZsYWdzICovCisJbXZpCVNFUV9GTEFHUywgTk9UX0lERU5USUZJRUR8Tk9fQ0RCX1NFTlQ7CiAJdGVzdAlTU1RBVDEsUkVRSU5JVHxCVVNGUkVFCWp6IC47CisJLyoKKwkgKiBXZSBvbmx5IHNldCBCVVNGUkVFIHN0YXR1cyBvbmNlIGVpdGhlciBhIG5ldworCSAqIHBoYXNlIGhhcyBiZWVuIGRldGVjdGVkIG9yIHdlIGFyZSByZWFsbHkKKwkgKiBCVVNGUkVFLiAgVGhpcyBhbGxvd3MgdGhlIGRyaXZlciB0byBrbm93CisJICogdGhhdCB3ZSBhcmUgYWN0aXZlIG9uIHRoZSBidXMgZXZlbiB0aG91Z2gKKwkgKiBubyBpZGVudGlmaWVkIHRyYW5zYWN0aW9uIGV4aXN0cyBzaG91bGQgYQorCSAqIHRpbWVvdXQgb2NjdXIgd2hpbGUgYXdhaXRpbmcgYnVzZnJlZS4KKwkgKi8KKwltdmkJTEFTVFBIQVNFLCBQX0JVU0ZSRUU7CiAJdGVzdAlTU1RBVDEsIEJVU0ZSRUUgam56IGlkbGVfbG9vcDsKIAlTRVRfU0VRSU5UQ09ERShNSVNTRURfQlVTRlJFRSkKIApAQCAtMTIwMiwxMSArMTMwMyw2IEBACiAJY2FsbAlhbGxvY2F0ZV9maWZvOwogCWptcAltZXNnaW5fZG9uZTsKIAotY2xlYXJfdGFyZ2V0X3N0YXRlOgotCW12aQlMQVNUUEhBU0UsIFBfQlVTRlJFRTsKLQkvKiBjbGVhciB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MgKi8KLQltdmkJU0VRX0ZMQUdTLCBOT1RfSURFTlRJRklFRHxOT19DREJfU0VOVCByZXQ7Ci0KIHBoYXNlX2xvY2s6ICAgICAKIAlpZiAoKGFoZC0+YnVncyAmIEFIRF9FQVJMWV9SRVFfQlVHKSAhPSAwKSB7CiAJCS8qCkBAIC0xMjk4LDYgKzEzOTQsNDcgQEAKIAl0ZXN0CUNDU0dDVEwsIENDU0dFTkFDSyBqbnogcmV0dXJuOwogCiAJLyoKKwkgKiBTaG91bGQgdGhlIG90aGVyIEZJRk8gZ2V0IHRoZSBTL0cgY2FjaGUgZmlyc3Q/ICBJZgorCSAqIGJvdGggRklGT3MgaGF2ZSBiZWVuIGFsbG9jYXRlZCBzaW5jZSB3ZSBsYXN0IGNoZWNrZWQKKwkgKiBhbnkgRklGTywgaXQgaXMgaW1wb3J0YW50IHRoYXQgd2Ugc2VydmljZSBhIEZJRk8KKwkgKiB0aGF0IGlzIG5vdCBhY3RpdmVseSBvbiB0aGUgYnVzIGZpcnN0LiAgVGhpcyBndWFyYW50ZWVzCisJICogdGhhdCBhIEZJRk8gd2lsbCBiZSBmcmVlZCB0byBoYW5kbGUgc25hcHNob3QgcmVxdWVzdHMgZm9yCisJICogYW55IEZJRk8gdGhhdCBpcyBzdGlsbCBvbiB0aGUgYnVzLiAgQ2hpcHMgd2l0aCBSVEkgZG8gbm90CisJICogcGVyZm9ybSBzbmFwc2hvdHMsIHNvIGRvbid0IGJvdGhlciB3aXRoIHRoaXMgdGVzdCB0aGVyZS4KKwkgKi8KKwlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfUlRJKSA9PSAwKSB7CisJCS8qCisJCSAqIElmIHdlJ3JlIG5vdCBzdGlsbCByZWNlaXZpbmcgU0NTSSBkYXRhLAorCQkgKiBpdCBpcyBzYWZlIHRvIGFsbG9jYXRlIHRoZSBTL0cgY2FjaGUgdG8KKwkJICogdGhpcyBGSUZPLgorCQkgKi8KKwkJdGVzdAlERkNOVFJMLCBTQ1NJRU4ganogaWRsZV9zZ2ZldGNoX3N0YXJ0OworCisJCS8qCisJCSAqIFN3aXRjaCB0byB0aGUgb3RoZXIgRklGTy4gIE5vbi1SVEkgY2hpcHMKKwkJICogYWxzbyBoYXZlIHRoZSAic2V0IG1vZGUiIGJ1Zywgc28gd2UgbXVzdAorCQkgKiBkaXNhYmxlIGludGVycnVwdHMgZHVyaW5nIHRoZSBzd2l0Y2guCisJCSAqLworCQltdmkJU0VRSU5UQ1RMLCBJTlRWRUMxRFNMOworCQl4b3IJTU9ERV9QVFIsIE1LX01PREUoTV9ERkYxLCBNX0RGRjEpOworCisJCS8qCisJCSAqIElmIHRoZSBvdGhlciBGSUZPIG5lZWRzIGxvYWRpbmcsIHRoZW4gaXQKKwkJICogbXVzdCBub3QgaGF2ZSBjbGFpbWVkIHRoZSBTL0cgY2FjaGUgeWV0CisJCSAqIChTR19DQUNIRV9BVkFJTCB3b3VsZCBoYXZlIGJlZW4gY2xlYXJlZCBpbgorCQkgKiB0aGUgb3JnaW5hbCBGSUZPIG1vZGUgYW5kIHdlIHRlc3QgdGhpcyBhYm92ZSkuCisJCSAqIFJldHVybiB0byB0aGUgaWRsZSBsb29wIHNvIHdlIGNhbiBwcm9jZXNzIHRoZQorCQkgKiBGSUZPIG5vdCBjdXJyZW50bHkgb24gdGhlIGJ1cyBmaXJzdC4KKwkJICovCisJCXRlc3QJU0dfU1RBVEUsIExPQURJTkdfTkVFREVEIGp6IGlkbGVfc2dmZXRjaF9va2F5OworCQljbHIJU0VRSU5UQ1RMIHJldDsKK2lkbGVfc2dmZXRjaF9va2F5OgorCQl4b3IJTU9ERV9QVFIsIE1LX01PREUoTV9ERkYxLCBNX0RGRjEpOworCQljbHIJU0VRSU5UQ1RMOworCX0KKworaWRsZV9zZ2ZldGNoX3N0YXJ0OgorCS8qCiAJICogV2UgZmV0Y2ggYSAiY2FjaGVsaW5lIGFsaWduZWQiIGFuZCBzaXplZCBhbW91bnQgb2YgZGF0YQogCSAqIHNvIHdlIGRvbid0IGVuZCB1cCByZWZlcmVuY2luZyBhIG5vbi1leGlzdGFudCBwYWdlLgogCSAqIENhY2hlbGluZSBhbGlnbmVkIGlzIGluIHF1b3RlcyBiZWNhdXNlIHRoZSBrZXJuZWwgd2lsbApAQCAtMTMwOCw3ICsxNDQ1LDcgQEAKIAltdmkJU0dIQ05ULCBTR19QUkVGRVRDSF9DTlQ7CiAJaWYgKChhaGQtPmJ1Z3MgJiBBSERfUkVHX1NMT1dfU0VUVExFX0JVRykgIT0gMCkgewogCQkvKgotCQkgKiBOZWVkIHR3byBpbnN0cnVjdGlvbiBiZXR3ZWVuICJ0b3VjaGVzIiBvZiBTR0hBRERSLgorCQkgKiBOZWVkIHR3byBpbnN0cnVjdGlvbnMgYmV0d2VlbiAidG91Y2hlcyIgb2YgU0dIQUREUi4KIAkJICovCiAJCW5vcDsKIAl9CkBAIC0xNjU4LDcgKzE3OTUsNyBAQAogCQkgKiBzYXZlcG9pbnRlciBpbiB0aGUgY3VycmVudCBGSUZPLiAgV2UgZG8gdGhpcyBzbyB0aGF0CiAJCSAqIGEgcGVuZGluZyBDVFhURE9ORSBvciBTQVZFUFRSIGlzIHZpc2libGUgaW4gdGhlIGFjdGl2ZQogCQkgKiBGSUZPLiAgVGhpcyBzdGF0dXMgaXMgdGhlIG9ubHkgd2F5IHdlIGNhbiBkZXRlY3QgaWYgd2UKLQkJICogaGF2ZSBsb3N0IHRoZSByYWNlIChlLmcuIGhvc3QgcGF1c2VkIHVzKSBhbmQgb3VyIGF0dGVwdHMKKwkJICogaGF2ZSBsb3N0IHRoZSByYWNlIChlLmcuIGhvc3QgcGF1c2VkIHVzKSBhbmQgb3VyIGF0dGVtcHRzCiAJCSAqIHRvIGRpc2FibGUgdGhlIGNoYW5uZWwgb2NjdXJyZWQgYWZ0ZXIgYWxsIFJFUXMgd2VyZQogCQkgKiBhbHJlYWR5IHNlZW4gYW5kIGFja2VkIChSRVFJTklUIG5ldmVyIGNvbWVzIHRydWUpLgogCQkgKi8KQEAgLTE2NjcsNyArMTgwNCw3IEBACiAJCXRlc3QJREZDTlRSTCwgRElSRUNUSU9OIGp6IGludGVycnVwdF9yZXR1cm47CiAJCWFuZAlERkNOVFJMLCB+U0NTSUVOOwogc25hcHNob3Rfd2FpdF9kYXRhX3ZhbGlkOgotCQl0ZXN0CVNFUUlOVFNSQywgKENUWFRET05FfFNBVkVQVFJTKSBqbnogc25hcHNob3RfZGF0YV92YWxpZDsKKwkJdGVzdAlTRVFJTlRTUkMsIChDVFhURE9ORXxTQVZFUFRSUykgam56IGludGVycnVwdF9yZXR1cm47CiAJCXRlc3QJU1NUQVQxLCBSRVFJTklUCWp6IHNuYXBzaG90X3dhaXRfZGF0YV92YWxpZDsKIHNuYXBzaG90X2RhdGFfdmFsaWQ6CiAJCW9yCURGQ05UUkwsIFNDU0lFTjsKQEAgLTE4MzQsNyArMTk3MSw2IEBACiAJZGVjCVNDQl9GSUZPX1VTRV9DT1VOVDsKIAl0ZXN0CVNDQl9DT05UUk9MLCBTVEFUVVNfUkNWRCBqbnogcGt0X2NvbXBsZXRlX3NjYl9pZl9maWZvc19pZGxlOwogCW12aQlERkZTWEZSQ1RMLCBDTFJDSE4gcmV0OwotRU5EX0NSSVRJQ0FMOwogCiAvKgogICogTEFTVF9TRUdfRE9ORSBzdGF0dXMgaGFzIGJlZW4gc2VlbiBpbiB0aGUgY3VycmVudCBGSUZPLgpAQCAtMTg0Myw3ICsxOTc5LDYgQEAKICAqIENoZWNrIGZvciBvdmVycnVuIGFuZCBzZWUgaWYgd2UgY2FuIGNvbXBsZXRlIHRoaXMgY29tbWFuZC4KICAqLwogcGt0X2xhc3Rfc2VnX2RvbmU6Ci1CRUdJTl9DUklUSUNBTDsKIAkvKgogCSAqIE1hcmsgdHJhbnNmZXIgYXMgY29tcGxldGVkLgogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9jb3JlLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYwppbmRleCA0ZThmMDBkLi5kYjhmNWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYwpAQCAtMzcsOSArMzcsNyBAQAogICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKgotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LmMjMjAyICQKLSAqCi0gKiAkRnJlZUJTRCQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5jIzI0NyAkCiAgKi8KIAogI2lmZGVmIF9fbGludXhfXwpAQCAtMzMyLDYgKzMzMCwxNCBAQAogCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTEsCiAJCSBhaGRfaW5iKGFoZCwgU0NTSVNFUV9URU1QTEFURSkgJiAoRU5TRUxJfEVOUlNFTEl8RU5BVVRPQVROUCkpOwogCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DQ0hBTiwgQUhEX01PREVfQ0NIQU4pOworCisJLyoKKwkgKiBDbGVhciBhbnkgcGVuZGluZyBzZXF1ZW5jZXIgaW50ZXJydXB0LiAgSXQgaXMgbm8KKwkgKiBsb25nZXIgcmVsZXZhbnQgc2luY2Ugd2UncmUgcmVzZXR0aW5nIHRoZSBQcm9ncmFtCisJICogQ291bnRlci4KKwkgKi8KKwlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0VRSU5UKTsKKwogCWFoZF9vdXRiKGFoZCwgU0VRQ1RMMCwgRkFTVE1PREV8U0VRUkVTRVQpOwogCWFoZF91bnBhdXNlKGFoZCk7CiB9CkBAIC0zNzMsMTMgKzM3OSw3IEBACiAJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOwogCiAJLyoKLQkgKiBDb21wbGV0ZSBhbnkgU0NCcyB0aGF0IGp1c3QgZmluaXNoZWQgYmVpbmcKLQkgKiBETUEnZWQgaW50byB0aGUgcW91dGZpZm8uCi0JICovCi0JYWhkX3J1bl9xb3V0ZmlmbyhhaGQpOwotCi0JLyoKLQkgKiBGbHVzaCB0aGUgZ29vZCBzdGF0dXMgRklGTyBmb3IgY29tcGVsdGVkIHBhY2tldGl6ZWQgY29tbWFuZHMuCisJICogRmx1c2ggdGhlIGdvb2Qgc3RhdHVzIEZJRk8gZm9yIGNvbXBsZXRlZCBwYWNrZXRpemVkIGNvbW1hbmRzLgogCSAqLwogCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKIAlzYXZlZF9zY2JwdHIgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOwpAQCAtMzg3LDggKzM4Nyw3IEBACiAJCXVfaW50IGZpZm9fbW9kZTsKIAkJdV9pbnQgaTsKIAkJCi0JCXNjYmlkID0gKGFoZF9pbmIoYWhkLCBHU0ZJRk8rMSkgPDwgOCkKLQkJICAgICAgfCBhaGRfaW5iKGFoZCwgR1NGSUZPKTsKKwkJc2NiaWQgPSBhaGRfaW53KGFoZCwgR1NGSUZPKTsKIAkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CiAJCWlmIChzY2IgPT0gTlVMTCkgewogCQkJcHJpbnRmKCIlczogV2FybmluZyAtIEdTRklGTyBTQ0IgJWQgaW52YWxpZFxuIiwKQEAgLTQwMSwyMiArNDAwLDMzIEBACiAJCSAqIHRoZSBob3N0IGJlZm9yZSBjb21wbGV0aW5nIHRoZSAgY29tbWFuZC4KIAkJICovCiAJCWZpZm9fbW9kZSA9IDA7CityZXNjYW5fZmlmb3M6CiAJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKIAkJCS8qIFRvZ2dsZSB0byB0aGUgb3RoZXIgbW9kZS4gKi8KIAkJCWZpZm9fbW9kZSBePSAxOwogCQkJYWhkX3NldF9tb2RlcyhhaGQsIGZpZm9fbW9kZSwgZmlmb19tb2RlKTsKKwogCQkJaWYgKGFoZF9zY2JfYWN0aXZlX2luX2ZpZm8oYWhkLCBzY2IpID09IDApCiAJCQkJY29udGludWU7CiAKIAkJCWFoZF9ydW5fZGF0YV9maWZvKGFoZCwgc2NiKTsKIAogCQkJLyoKLQkJCSAqIENsZWFyaW5nIHRoaXMgdHJhbnNhY3Rpb24gaW4gdGhpcyBGSUZPIG1heQotCQkJICogY2F1c2UgYSBDRkc0REFUQSBmb3IgdGhpcyBzYW1lIHRyYW5zYWN0aW9uCi0JCQkgKiB0byBhc3NlcnQgaW4gdGhlIG90aGVyIEZJRk8uICBNYWtlIHN1cmUgd2UKLQkJCSAqIGxvb3Agb25lIG1vcmUgdGltZSBhbmQgY2hlY2sgdGhlIG90aGVyIEZJRk8uCisJCQkgKiBSdW5uaW5nIHRoaXMgRklGTyBtYXkgY2F1c2UgYSBDRkc0REFUQSBmb3IKKwkJCSAqIHRoaXMgc2FtZSB0cmFuc2FjdGlvbiB0byBhc3NlcnQgaW4gdGhlIG90aGVyCisJCQkgKiBGSUZPIG9yIGEgbmV3IHNuYXBzaG90IFNBVkVQVFJTIGludGVycnVwdAorCQkJICogaW4gdGhpcyBGSUZPLiAgRXZlbiBydW5uaW5nIGEgRklGTyBtYXkgbm90CisJCQkgKiBjbGVhciB0aGUgdHJhbnNhY3Rpb24gaWYgd2UgYXJlIHN0aWxsIHdhaXRpbmcKKwkJCSAqIGZvciBkYXRhIHRvIGRyYWluIHRvIHRoZSBob3N0LiBXZSBtdXN0IGxvb3AKKwkJCSAqIHVudGlsIHRoZSB0cmFuc2FjdGlvbiBpcyBub3QgYWN0aXZlIGluIGVpdGhlcgorCQkJICogRklGTyBqdXN0IHRvIGJlIHN1cmUuICBSZXNldCBvdXIgbG9vcCBjb3VudGVyCisJCQkgKiBzbyB3ZSB3aWxsIHZpc2l0IGJvdGggRklGT3MgYWdhaW4gYmVmb3JlCisJCQkgKiBkZWNsYXJpbmcgdGhpcyB0cmFuc2FjdGlvbiBmaW5pc2hlZC4gIFdlCisJCQkgKiBhbHNvIGRlbGF5IGEgYml0IHNvIHRoYXQgc3RhdHVzIGhhcyBhIGNoYW5jZQorCQkJICogdG8gY2hhbmdlIGJlZm9yZSB3ZSBsb29rIGF0IHRoaXMgRklGTyBhZ2Fpbi4KIAkJCSAqLwotCQkJaSA9IDA7CisJCQlhaGRfZGVsYXkoMjAwKTsKKwkJCWdvdG8gcmVzY2FuX2ZpZm9zOwogCQl9CiAJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKIAkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JpZCk7CkBAIC00MjksMTkgKzQzOSwyOCBAQAogCQkJLyoKIAkJCSAqIFRoZSB0cmFuc2ZlciBjb21wbGV0ZWQgd2l0aCBhIHJlc2lkdWFsLgogCQkJICogUGxhY2UgdGhpcyBTQ0Igb24gdGhlIGNvbXBsZXRlIERNQSBsaXN0Ci0JCQkgKiBzbyB0aGF0IHdlIFVwZGF0ZSBvdXIgaW4tY29yZSBjb3B5IG9mIHRoZQorCQkJICogc28gdGhhdCB3ZSB1cGRhdGUgb3VyIGluLWNvcmUgY29weSBvZiB0aGUKIAkJCSAqIFNDQiBiZWZvcmUgY29tcGxldGluZyB0aGUgY29tbWFuZC4KIAkJCSAqLwogCQkJYWhkX291dGIoYWhkLCBTQ0JfU0NTSV9TVEFUVVMsIDApOwogCQkJYWhkX291dGIoYWhkLCBTQ0JfU0dQVFIsCiAJCQkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1NHUFRSKQogCQkJCSB8IFNHX1NUQVRVU19WQUxJRCk7Ci0JCQlhaGRfb3V0dyhhaGQsIFNDQl9UQUcsIFNDQl9HRVRfVEFHKHNjYikpOworCQkJYWhkX291dHcoYWhkLCBTQ0JfVEFHLCBzY2JpZCk7CisJCQlhaGRfb3V0dyhhaGQsIFNDQl9ORVhUX0NPTVBMRVRFLCBTQ0JfTElTVF9OVUxMKTsKIAkJCWNvbXBfaGVhZCA9IGFoZF9pbncoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQpOwotCQkJYWhkX291dHcoYWhkLCBTQ0JfTkVYVF9DT01QTEVURSwgY29tcF9oZWFkKTsKLQkJCWlmIChTQ0JJRF9JU19OVUxMKGNvbXBfaGVhZCkpCi0JCQkJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsCi0JCQkJCSBTQ0JfR0VUX1RBRyhzY2IpKTsKKwkJCWlmIChTQ0JJRF9JU19OVUxMKGNvbXBfaGVhZCkpIHsKKwkJCQlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX0RNQV9TQ0JfSEVBRCwgc2NiaWQpOworCQkJCWFoZF9vdXR3KGFoZCwgQ09NUExFVEVfRE1BX1NDQl9UQUlMLCBzY2JpZCk7CisJCQl9IGVsc2UgeworCQkJCXVfaW50IHRhaWw7CisKKwkJCQl0YWlsID0gYWhkX2ludyhhaGQsIENPTVBMRVRFX0RNQV9TQ0JfVEFJTCk7CisJCQkJYWhkX3NldF9zY2JwdHIoYWhkLCB0YWlsKTsKKwkJCQlhaGRfb3V0dyhhaGQsIFNDQl9ORVhUX0NPTVBMRVRFLCBzY2JpZCk7CisJCQkJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX1RBSUwsIHNjYmlkKTsKKwkJCQlhaGRfc2V0X3NjYnB0cihhaGQsIHNjYmlkKTsKKwkJCX0KIAkJfSBlbHNlCiAJCQlhaGRfY29tcGxldGVfc2NiKGFoZCwgc2NiKTsKIAl9CkBAIC00NjUsOSArNDg0LDIyIEBACiAJCQlicmVhazsKIAkJYWhkX2RlbGF5KDIwMCk7CiAJfQotCWlmICgoY2NzY2JjdGwgJiBDQ1NDQkRJUikgIT0gMCkKKwkvKgorCSAqIFdlIGxlYXZlIHRoZSBzZXF1ZW5jZXIgdG8gY2xlYW51cCBpbiB0aGUgY2FzZSBvZiBETUEncyB0bworCSAqIHVwZGF0ZSB0aGUgcW91dGZpZm8uICBJbiBhbGwgb3RoZXIgY2FzZXMgKERNQSdzIHRvIHRoZQorCSAqIGNoaXAgb3IgYSBwdXNoIG9mIGFuIFNDQiBmcm9tIHRoZSBDT01QTEVURV9ETUFfU0NCIGxpc3QpLAorCSAqIHdlIGRpc2FibGUgdGhlIERNQSBlbmdpbmUgc28gdGhhdCB0aGUgc2VxdWVuY2VyIHdpbGwgbm90CisJICogYXR0ZW1wdCB0byBoYW5kbGUgdGhlIERNQSBjb21wbGV0aW9uLgorCSAqLworCWlmICgoY2NzY2JjdGwgJiBDQ1NDQkRJUikgIT0gMCB8fCAoY2NzY2JjdGwgJiBBUlJET05FKSAhPSAwKQogCQlhaGRfb3V0YihhaGQsIENDU0NCQ1RMLCBjY3NjYmN0bCAmIH4oQ0NBUlJFTnxDQ1NDQkVOKSk7CiAKKwkvKgorCSAqIENvbXBsZXRlIGFueSBTQ0JzIHRoYXQganVzdCBmaW5pc2hlZAorCSAqIGJlaW5nIERNQSdlZCBpbnRvIHRoZSBxb3V0Zmlmby4KKwkgKi8KKwlhaGRfcnVuX3FvdXRmaWZvKGFoZCk7CisKIAlzYXZlZF9zY2JwdHIgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOwogCS8qCiAJICogTWFudWFsbHkgdXBkYXRlL2NvbXBsZXRlIGFueSBjb21wbGV0ZWQgU0NCcyB0aGF0IGFyZSB3YWl0aW5nIHRvIGJlCkBAIC00OTQsNiArNTI2LDI0IEBACiAJCXNjYmlkID0gbmV4dF9zY2JpZDsKIAl9CiAJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsIFNDQl9MSVNUX05VTEwpOworCWFoZF9vdXR3KGFoZCwgQ09NUExFVEVfRE1BX1NDQl9UQUlMLCBTQ0JfTElTVF9OVUxMKTsKKworCXNjYmlkID0gYWhkX2ludyhhaGQsIENPTVBMRVRFX09OX1FGUkVFWkVfSEVBRCk7CisJd2hpbGUgKCFTQ0JJRF9JU19OVUxMKHNjYmlkKSkgeworCisJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2NiaWQpOworCQluZXh0X3NjYmlkID0gYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfTkVYVF9DT01QTEVURSk7CisJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOworCQlpZiAoc2NiID09IE5VTEwpIHsKKwkJCXByaW50ZigiJXM6IFdhcm5pbmcgLSBDb21wbGV0ZSBRZnJ6IFNDQiAlZCBpbnZhbGlkXG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIHNjYmlkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYWhkX2NvbXBsZXRlX3NjYihhaGQsIHNjYik7CisJCXNjYmlkID0gbmV4dF9zY2JpZDsKKwl9CisJYWhkX291dHcoYWhkLCBDT01QTEVURV9PTl9RRlJFRVpFX0hFQUQsIFNDQl9MSVNUX05VTEwpOwogCiAJc2NiaWQgPSBhaGRfaW53KGFoZCwgQ09NUExFVEVfU0NCX0hFQUQpOwogCXdoaWxlICghU0NCSURfSVNfTlVMTChzY2JpZCkpIHsKQEAgLTU1OCwxNTAgKzYwOCwxNDYgQEAKIHsKIAl1X2ludCBzZXFpbnRzcmM7CiAKLQl3aGlsZSAoMSkgewotCQlzZXFpbnRzcmMgPSBhaGRfaW5iKGFoZCwgU0VRSU5UU1JDKTsKLQkJaWYgKChzZXFpbnRzcmMgJiBDRkc0REFUQSkgIT0gMCkgewotCQkJdWludDMyX3QgZGF0YWNudDsKLQkJCXVpbnQzMl90IHNncHRyOworCXNlcWludHNyYyA9IGFoZF9pbmIoYWhkLCBTRVFJTlRTUkMpOworCWlmICgoc2VxaW50c3JjICYgQ0ZHNERBVEEpICE9IDApIHsKKwkJdWludDMyX3QgZGF0YWNudDsKKwkJdWludDMyX3Qgc2dwdHI7CiAKLQkJCS8qCi0JCQkgKiBDbGVhciBmdWxsIHJlc2lkdWFsIGZsYWcuCi0JCQkgKi8KLQkJCXNncHRyID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfU0dQVFIpICYgflNHX0ZVTExfUkVTSUQ7Ci0JCQlhaGRfb3V0YihhaGQsIFNDQl9TR1BUUiwgc2dwdHIpOworCQkvKgorCQkgKiBDbGVhciBmdWxsIHJlc2lkdWFsIGZsYWcuCisJCSAqLworCQlzZ3B0ciA9IGFoZF9pbmxfc2NicmFtKGFoZCwgU0NCX1NHUFRSKSAmIH5TR19GVUxMX1JFU0lEOworCQlhaGRfb3V0YihhaGQsIFNDQl9TR1BUUiwgc2dwdHIpOwogCi0JCQkvKgotCQkJICogTG9hZCBkYXRhY250IGFuZCBhZGRyZXNzLgotCQkJICovCi0JCQlkYXRhY250ID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfREFUQUNOVCk7Ci0JCQlpZiAoKGRhdGFjbnQgJiBBSERfRE1BX0xBU1RfU0VHKSAhPSAwKSB7Ci0JCQkJc2dwdHIgfD0gTEFTVF9TRUc7Ci0JCQkJYWhkX291dGIoYWhkLCBTR19TVEFURSwgMCk7Ci0JCQl9IGVsc2UKLQkJCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCBMT0FESU5HX05FRURFRCk7Ci0JCQlhaGRfb3V0cShhaGQsIEhBRERSLCBhaGRfaW5xX3NjYnJhbShhaGQsIFNDQl9EQVRBUFRSKSk7Ci0JCQlhaGRfb3V0bChhaGQsIEhDTlQsIGRhdGFjbnQgJiBBSERfU0dfTEVOX01BU0spOwotCQkJYWhkX291dGIoYWhkLCBTR19DQUNIRV9QUkUsIHNncHRyKTsKLQkJCWFoZF9vdXRiKGFoZCwgREZDTlRSTCwgUFJFTE9BREVOfFNDU0lFTnxIRE1BRU4pOwotCi0JCQkvKgotCQkJICogSW5pdGlhbGl6ZSBSZXNpZHVhbCBGaWVsZHMuCi0JCQkgKi8KLQkJCWFoZF9vdXRiKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQrMywgZGF0YWNudCA+PiAyNCk7Ci0JCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiwgc2dwdHIgJiBTR19QVFJfTUFTSyk7Ci0KLQkJCS8qCi0JCQkgKiBNYXJrIHRoZSBTQ0IgYXMgaGF2aW5nIGEgRklGTyBpbiB1c2UuCi0JCQkgKi8KLQkJCWFoZF9vdXRiKGFoZCwgU0NCX0ZJRk9fVVNFX0NPVU5ULAotCQkJCSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9GSUZPX1VTRV9DT1VOVCkgKyAxKTsKLQotCQkJLyoKLQkJCSAqIEluc3RhbGwgYSAiZmFrZSIgaGFuZGxlciBmb3IgdGhpcyBGSUZPLgotCQkJICovCi0JCQlhaGRfb3V0dyhhaGQsIExPTkdKTVBfQUREUiwgMCk7Ci0KLQkJCS8qCi0JCQkgKiBOb3RpZnkgdGhlIGhhcmR3YXJlIHRoYXQgd2UgaGF2ZSBzYXRpc2ZpZWQKLQkJCSAqIHRoaXMgc2VxdWVuY2VyIGludGVycnVwdC4KLQkJCSAqLwotCQkJYWhkX291dGIoYWhkLCBDTFJTRVFJTlRTUkMsIENMUkNGRzREQVRBKTsKLQkJfSBlbHNlIGlmICgoc2VxaW50c3JjICYgU0FWRVBUUlMpICE9IDApIHsKLQkJCXVpbnQzMl90IHNncHRyOwotCQkJdWludDMyX3QgcmVzaWQ7Ci0KLQkJCWlmICgoYWhkX2luYihhaGQsIExPTkdKTVBfQUREUisxKSZJTlZBTElEX0FERFIpICE9IDApIHsKLQkJCQkvKgotCQkJCSAqIFNuYXBzaG90IFNhdmUgUG9pbnRlcnMuICBDbGVhcgotCQkJCSAqIHRoZSBzbmFwc2hvdCBhbmQgY29udGludWUuCi0JCQkJICovCi0JCQkJYWhkX291dGIoYWhkLCBERkZTWEZSQ1RMLCBDTFJDSE4pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKgotCQkJICogRGlzYWJsZSBTL0cgZmV0Y2ggc28gdGhlIERNQSBlbmdpbmUKLQkJCSAqIGlzIGF2YWlsYWJsZSB0byBmdXR1cmUgdXNlcnMuCi0JCQkgKi8KLQkJCWlmICgoYWhkX2luYihhaGQsIFNHX1NUQVRFKSAmIEZFVENIX0lOUFJPRykgIT0gMCkKLQkJCQlhaGRfb3V0YihhaGQsIENDU0dDVEwsIDApOworCQkvKgorCQkgKiBMb2FkIGRhdGFjbnQgYW5kIGFkZHJlc3MuCisJCSAqLworCQlkYXRhY250ID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfREFUQUNOVCk7CisJCWlmICgoZGF0YWNudCAmIEFIRF9ETUFfTEFTVF9TRUcpICE9IDApIHsKKwkJCXNncHRyIHw9IExBU1RfU0VHOwogCQkJYWhkX291dGIoYWhkLCBTR19TVEFURSwgMCk7CisJCX0gZWxzZQorCQkJYWhkX291dGIoYWhkLCBTR19TVEFURSwgTE9BRElOR19ORUVERUQpOworCQlhaGRfb3V0cShhaGQsIEhBRERSLCBhaGRfaW5xX3NjYnJhbShhaGQsIFNDQl9EQVRBUFRSKSk7CisJCWFoZF9vdXRsKGFoZCwgSENOVCwgZGF0YWNudCAmIEFIRF9TR19MRU5fTUFTSyk7CisJCWFoZF9vdXRiKGFoZCwgU0dfQ0FDSEVfUFJFLCBzZ3B0cik7CisJCWFoZF9vdXRiKGFoZCwgREZDTlRSTCwgUFJFTE9BREVOfFNDU0lFTnxIRE1BRU4pOwogCi0JCQkvKgotCQkJICogRmx1c2ggdGhlIGRhdGEgRklGTy4gIFN0cmlja2x5IG9ubHkKLQkJCSAqIG5lY2Vzc2FyeSBmb3IgUmV2IEEgcGFydHMuCi0JCQkgKi8KLQkJCWFoZF9vdXRiKGFoZCwgREZDTlRSTCwKLQkJCQkgYWhkX2luYihhaGQsIERGQ05UUkwpIHwgRklGT0ZMVVNIKTsKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSBSZXNpZHVhbCBGaWVsZHMuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNDQl9SRVNJRFVBTF9EQVRBQ05UKzMsIGRhdGFjbnQgPj4gMjQpOworCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiwgc2dwdHIgJiBTR19QVFJfTUFTSyk7CiAKLQkJCS8qCi0JCQkgKiBDYWxjdWxhdGUgcmVzaWR1YWwuCi0JCQkgKi8KLQkJCXNncHRyID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIpOwotCQkJcmVzaWQgPSBhaGRfaW5sKGFoZCwgU0hDTlQpOwotCQkJcmVzaWQgfD0KLQkJCSAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9EQVRBQ05UKzMpIDw8IDI0OwotCQkJYWhkX291dGwoYWhkLCBTQ0JfUkVTSURVQUxfREFUQUNOVCwgcmVzaWQpOwotCQkJaWYgKChhaGRfaW5iKGFoZCwgU0dfQ0FDSEVfU0hBRE9XKSAmIExBU1RfU0VHKSA9PSAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBNdXN0IGJhY2sgdXAgdG8gdGhlIGNvcnJlY3QgUy9HIGVsZW1lbnQuCi0JCQkJICogVHlwaWNhbGx5IHRoaXMganVzdCBtZWFucyByZXNldHRpbmcgb3VyCi0JCQkJICogbG93IGJ5dGUgdG8gdGhlIG9mZnNldCBpbiB0aGUgU0dfQ0FDSEUsCi0JCQkJICogYnV0IGlmIHdlIHdyYXBwZWQsIHdlIGhhdmUgdG8gY29ycmVjdAotCQkJCSAqIHRoZSBvdGhlciBieXRlcyBvZiB0aGUgc2dwdHIgdG9vLgotCQkJCSAqLwotCQkJCWlmICgoYWhkX2luYihhaGQsIFNHX0NBQ0hFX1NIQURPVykgJiAweDgwKSAhPSAwCi0JCQkJICYmIChzZ3B0ciAmIDB4ODApID09IDApCi0JCQkJCXNncHRyIC09IDB4MTAwOwotCQkJCXNncHRyICY9IH4weEZGOwotCQkJCXNncHRyIHw9IGFoZF9pbmIoYWhkLCBTR19DQUNIRV9TSEFET1cpCi0JCQkJICAgICAgICYgU0dfQUREUl9NQVNLOwotCQkJCWFoZF9vdXRsKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSLCBzZ3B0cik7Ci0JCQkJYWhkX291dGIoYWhkLCBTQ0JfUkVTSURVQUxfREFUQUNOVCArIDMsIDApOwotCQkJfSBlbHNlIGlmICgocmVzaWQgJiBBSERfU0dfTEVOX01BU0spID09IDApIHsKLQkJCQlhaGRfb3V0YihhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiwKLQkJCQkJIHNncHRyIHwgU0dfTElTVF9OVUxMKTsKLQkJCX0KLQkJCS8qCi0JCQkgKiBTYXZlIFBvaW50ZXJzLgotCQkJICovCi0JCQlhaGRfb3V0cShhaGQsIFNDQl9EQVRBUFRSLCBhaGRfaW5xKGFoZCwgU0hBRERSKSk7Ci0JCQlhaGRfb3V0bChhaGQsIFNDQl9EQVRBQ05ULCByZXNpZCk7Ci0JCQlhaGRfb3V0bChhaGQsIFNDQl9TR1BUUiwgc2dwdHIpOwotCQkJYWhkX291dGIoYWhkLCBDTFJTRVFJTlRTUkMsIENMUlNBVkVQVFJTKTsKLQkJCWFoZF9vdXRiKGFoZCwgU0VRSU1PREUsCi0JCQkJIGFoZF9pbmIoYWhkLCBTRVFJTU9ERSkgfCBFTlNBVkVQVFJTKTsKLQkJCS8qCi0JCQkgKiBJZiB0aGUgZGF0YSBpcyB0byB0aGUgU0NTSSBidXMsIHdlIGFyZQotCQkJICogZG9uZSwgb3RoZXJ3aXNlIHdhaXQgZm9yIEZJRk9FTVAuCi0JCQkgKi8KLQkJCWlmICgoYWhkX2luYihhaGQsIERGQ05UUkwpICYgRElSRUNUSU9OKSAhPSAwKQotCQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKChhaGRfaW5iKGFoZCwgU0dfU1RBVEUpICYgTE9BRElOR19ORUVERUQpICE9IDApIHsKLQkJCXVpbnQzMl90IHNncHRyOwotCQkJdWludDY0X3QgZGF0YV9hZGRyOwotCQkJdWludDMyX3QgZGF0YV9sZW47Ci0JCQl1X2ludAkgZGZjbnRybDsKKwkJLyoKKwkJICogTWFyayB0aGUgU0NCIGFzIGhhdmluZyBhIEZJRk8gaW4gdXNlLgorCQkgKi8KKwkJYWhkX291dGIoYWhkLCBTQ0JfRklGT19VU0VfQ09VTlQsCisJCQkgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfRklGT19VU0VfQ09VTlQpICsgMSk7CiAKLQkJCS8qCi0JCQkgKiBEaXNhYmxlIFMvRyBmZXRjaCBzbyB0aGUgRE1BIGVuZ2luZQotCQkJICogaXMgYXZhaWxhYmxlIHRvIGZ1dHVyZSB1c2Vycy4KLQkJCSAqLwotCQkJaWYgKChhaGRfaW5iKGFoZCwgU0dfU1RBVEUpICYgRkVUQ0hfSU5QUk9HKSAhPSAwKSB7Ci0JCQkJYWhkX291dGIoYWhkLCBDQ1NHQ1RMLCAwKTsKLQkJCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCBMT0FESU5HX05FRURFRCk7Ci0JCQl9CisJCS8qCisJCSAqIEluc3RhbGwgYSAiZmFrZSIgaGFuZGxlciBmb3IgdGhpcyBGSUZPLgorCQkgKi8KKwkJYWhkX291dHcoYWhkLCBMT05HSk1QX0FERFIsIDApOwogCisJCS8qCisJCSAqIE5vdGlmeSB0aGUgaGFyZHdhcmUgdGhhdCB3ZSBoYXZlIHNhdGlzZmllZAorCQkgKiB0aGlzIHNlcXVlbmNlciBpbnRlcnJ1cHQuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIENMUlNFUUlOVFNSQywgQ0xSQ0ZHNERBVEEpOworCX0gZWxzZSBpZiAoKHNlcWludHNyYyAmIFNBVkVQVFJTKSAhPSAwKSB7CisJCXVpbnQzMl90IHNncHRyOworCQl1aW50MzJfdCByZXNpZDsKKworCQlpZiAoKGFoZF9pbmIoYWhkLCBMT05HSk1QX0FERFIrMSkmSU5WQUxJRF9BRERSKSAhPSAwKSB7CiAJCQkvKgotCQkJICogV2FpdCBmb3IgdGhlIERNQSBlbmdpbmUgdG8gbm90aWNlIHRoYXQgdGhlCi0JCQkgKiBob3N0IHRyYW5zZmVyIGlzIGVuYWJsZWQgYW5kIHRoYXQgdGhlcmUgaXMKLQkJCSAqIHNwYWNlIGluIHRoZSBTL0cgRklGTyBmb3IgbmV3IHNlZ21lbnRzIGJlZm9yZQotCQkJICogbG9hZGluZyBtb3JlIHNlZ21lbnRzLgorCQkJICogU25hcHNob3QgU2F2ZSBQb2ludGVycy4gIEFsbCB0aGF0CisJCQkgKiBpcyBuZWNlc3NhcnkgdG8gY2xlYXIgdGhlIHNuYXBzaG90CisJCQkgKiBpcyBhIENMUkNITi4KIAkJCSAqLwotCQkJaWYgKChhaGRfaW5iKGFoZCwgREZTVEFUVVMpICYgUFJFTE9BRF9BVkFJTCkgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCWlmICgoYWhkX2luYihhaGQsIERGQ05UUkwpICYgSERNQUVOQUNLKSA9PSAwKQotCQkJCWNvbnRpbnVlOworCQkJZ290byBjbHJjaG47CisJCX0KKworCQkvKgorCQkgKiBEaXNhYmxlIFMvRyBmZXRjaCBzbyB0aGUgRE1BIGVuZ2luZQorCQkgKiBpcyBhdmFpbGFibGUgdG8gZnV0dXJlIHVzZXJzLgorCQkgKi8KKwkJaWYgKChhaGRfaW5iKGFoZCwgU0dfU1RBVEUpICYgRkVUQ0hfSU5QUk9HKSAhPSAwKQorCQkJYWhkX291dGIoYWhkLCBDQ1NHQ1RMLCAwKTsKKwkJYWhkX291dGIoYWhkLCBTR19TVEFURSwgMCk7CisKKwkJLyoKKwkJICogRmx1c2ggdGhlIGRhdGEgRklGTy4gIFN0cmlja2x5IG9ubHkKKwkJICogbmVjZXNzYXJ5IGZvciBSZXYgQSBwYXJ0cy4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgREZDTlRSTCwgYWhkX2luYihhaGQsIERGQ05UUkwpIHwgRklGT0ZMVVNIKTsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgcmVzaWR1YWwuCisJCSAqLworCQlzZ3B0ciA9IGFoZF9pbmxfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKwkJcmVzaWQgPSBhaGRfaW5sKGFoZCwgU0hDTlQpOworCQlyZXNpZCB8PSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9EQVRBQ05UKzMpIDw8IDI0OworCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9EQVRBQ05ULCByZXNpZCk7CisJCWlmICgoYWhkX2luYihhaGQsIFNHX0NBQ0hFX1NIQURPVykgJiBMQVNUX1NFRykgPT0gMCkgeworCQkJLyoKKwkJCSAqIE11c3QgYmFjayB1cCB0byB0aGUgY29ycmVjdCBTL0cgZWxlbWVudC4KKwkJCSAqIFR5cGljYWxseSB0aGlzIGp1c3QgbWVhbnMgcmVzZXR0aW5nIG91cgorCQkJICogbG93IGJ5dGUgdG8gdGhlIG9mZnNldCBpbiB0aGUgU0dfQ0FDSEUsCisJCQkgKiBidXQgaWYgd2Ugd3JhcHBlZCwgd2UgaGF2ZSB0byBjb3JyZWN0CisJCQkgKiB0aGUgb3RoZXIgYnl0ZXMgb2YgdGhlIHNncHRyIHRvby4KKwkJCSAqLworCQkJaWYgKChhaGRfaW5iKGFoZCwgU0dfQ0FDSEVfU0hBRE9XKSAmIDB4ODApICE9IDAKKwkJCSAmJiAoc2dwdHIgJiAweDgwKSA9PSAwKQorCQkJCXNncHRyIC09IDB4MTAwOworCQkJc2dwdHIgJj0gfjB4RkY7CisJCQlzZ3B0ciB8PSBhaGRfaW5iKGFoZCwgU0dfQ0FDSEVfU0hBRE9XKQorCQkJICAgICAgICYgU0dfQUREUl9NQVNLOworCQkJYWhkX291dGwoYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIsIHNncHRyKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQgKyAzLCAwKTsKKwkJfSBlbHNlIGlmICgocmVzaWQgJiBBSERfU0dfTEVOX01BU0spID09IDApIHsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSLAorCQkJCSBzZ3B0ciB8IFNHX0xJU1RfTlVMTCk7CisJCX0KKwkJLyoKKwkJICogU2F2ZSBQb2ludGVycy4KKwkJICovCisJCWFoZF9vdXRxKGFoZCwgU0NCX0RBVEFQVFIsIGFoZF9pbnEoYWhkLCBTSEFERFIpKTsKKwkJYWhkX291dGwoYWhkLCBTQ0JfREFUQUNOVCwgcmVzaWQpOworCQlhaGRfb3V0bChhaGQsIFNDQl9TR1BUUiwgc2dwdHIpOworCQlhaGRfb3V0YihhaGQsIENMUlNFUUlOVFNSQywgQ0xSU0FWRVBUUlMpOworCQlhaGRfb3V0YihhaGQsIFNFUUlNT0RFLAorCQkJIGFoZF9pbmIoYWhkLCBTRVFJTU9ERSkgfCBFTlNBVkVQVFJTKTsKKwkJLyoKKwkJICogSWYgdGhlIGRhdGEgaXMgdG8gdGhlIFNDU0kgYnVzLCB3ZSBhcmUKKwkJICogZG9uZSwgb3RoZXJ3aXNlIHdhaXQgZm9yIEZJRk9FTVAuCisJCSAqLworCQlpZiAoKGFoZF9pbmIoYWhkLCBERkNOVFJMKSAmIERJUkVDVElPTikgIT0gMCkKKwkJCWdvdG8gY2xyY2huOworCX0gZWxzZSBpZiAoKGFoZF9pbmIoYWhkLCBTR19TVEFURSkgJiBMT0FESU5HX05FRURFRCkgIT0gMCkgeworCQl1aW50MzJfdCBzZ3B0cjsKKwkJdWludDY0X3QgZGF0YV9hZGRyOworCQl1aW50MzJfdCBkYXRhX2xlbjsKKwkJdV9pbnQJIGRmY250cmw7CisKKwkJLyoKKwkJICogRGlzYWJsZSBTL0cgZmV0Y2ggc28gdGhlIERNQSBlbmdpbmUKKwkJICogaXMgYXZhaWxhYmxlIHRvIGZ1dHVyZSB1c2Vycy4gIFdlIHdvbid0CisJCSAqIGJlIHVzaW5nIHRoZSBETUEgZW5naW5lIHRvIGxvYWQgc2VnbWVudHMuCisJCSAqLworCQlpZiAoKGFoZF9pbmIoYWhkLCBTR19TVEFURSkgJiBGRVRDSF9JTlBST0cpICE9IDApIHsKKwkJCWFoZF9vdXRiKGFoZCwgQ0NTR0NUTCwgMCk7CisJCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCBMT0FESU5HX05FRURFRCk7CisJCX0KKworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgRE1BIGVuZ2luZSB0byBub3RpY2UgdGhhdCB0aGUKKwkJICogaG9zdCB0cmFuc2ZlciBpcyBlbmFibGVkIGFuZCB0aGF0IHRoZXJlIGlzCisJCSAqIHNwYWNlIGluIHRoZSBTL0cgRklGTyBmb3IgbmV3IHNlZ21lbnRzIGJlZm9yZQorCQkgKiBsb2FkaW5nIG1vcmUgc2VnbWVudHMuCisJCSAqLworCQlpZiAoKGFoZF9pbmIoYWhkLCBERlNUQVRVUykgJiBQUkVMT0FEX0FWQUlMKSAhPSAwCisJCSAmJiAoYWhkX2luYihhaGQsIERGQ05UUkwpICYgSERNQUVOQUNLKSAhPSAwKSB7CiAKIAkJCS8qCiAJCQkgKiBEZXRlcm1pbmUgdGhlIG9mZnNldCBvZiB0aGUgbmV4dCBTL0cKQEAgLTc0OCw3ICs3OTQsNyBAQAogCQkJICogQWR2ZXJ0aXNlIHRoZSBzZWdtZW50IHRvIHRoZSBoYXJkd2FyZS4KIAkJCSAqLwogCQkJZGZjbnRybCA9IGFoZF9pbmIoYWhkLCBERkNOVFJMKXxQUkVMT0FERU58SERNQUVOOwotCQkJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19ERkNOVFJMX09QVFMpIT0wKSB7CisJCQlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTkVXX0RGQ05UUkxfT1BUUykgIT0gMCkgewogCQkJCS8qCiAJCQkJICogVXNlIFNDU0lFTldSRElTIHNvIHRoYXQgU0NTSUVOCiAJCQkJICogaXMgbmV2ZXIgbW9kaWZpZWQgYnkgdGhpcwpAQCAtNzU3LDM1ICs4MDMsNDQgQEAKIAkJCQlkZmNudHJsIHw9IFNDU0lFTldSRElTOwogCQkJfQogCQkJYWhkX291dGIoYWhkLCBERkNOVFJMLCBkZmNudHJsKTsKLQkJfSBlbHNlIGlmICgoYWhkX2luYihhaGQsIFNHX0NBQ0hFX1NIQURPVykKLQkJCSAmIExBU1RfU0VHX0RPTkUpICE9IDApIHsKLQotCQkJLyoKLQkJCSAqIFRyYW5zZmVyIGNvbXBsZXRlZCB0byB0aGUgZW5kIG9mIFNHIGxpc3QKLQkJCSAqIGFuZCBoYXMgZmx1c2hlZCB0byB0aGUgaG9zdC4KLQkJCSAqLwotCQkJYWhkX291dGIoYWhkLCBTQ0JfU0dQVFIsCi0JCQkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1NHUFRSKSB8IFNHX0xJU1RfTlVMTCk7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmICgoYWhkX2luYihhaGQsIERGU1RBVFVTKSAmIEZJRk9FTVApICE9IDApIHsKLQkJCWJyZWFrOwogCQl9Ci0JCWFoZF9kZWxheSgyMDApOworCX0gZWxzZSBpZiAoKGFoZF9pbmIoYWhkLCBTR19DQUNIRV9TSEFET1cpICYgTEFTVF9TRUdfRE9ORSkgIT0gMCkgeworCisJCS8qCisJCSAqIFRyYW5zZmVyIGNvbXBsZXRlZCB0byB0aGUgZW5kIG9mIFNHIGxpc3QKKwkJICogYW5kIGhhcyBmbHVzaGVkIHRvIHRoZSBob3N0LgorCQkgKi8KKwkJYWhkX291dGIoYWhkLCBTQ0JfU0dQVFIsCisJCQkgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfU0dQVFIpIHwgU0dfTElTVF9OVUxMKTsKKwkJZ290byBjbHJjaG47CisJfSBlbHNlIGlmICgoYWhkX2luYihhaGQsIERGU1RBVFVTKSAmIEZJRk9FTVApICE9IDApIHsKK2NscmNobjoKKwkJLyoKKwkJICogQ2xlYXIgYW55IGhhbmRsZXIgZm9yIHRoaXMgRklGTywgZGVjcmVtZW50CisJCSAqIHRoZSBGSUZPIHVzZSBjb3VudCBmb3IgdGhlIFNDQiwgYW5kIHJlbGVhc2UKKwkJICogdGhlIEZJRk8uCisJCSAqLworCQlhaGRfb3V0YihhaGQsIExPTkdKTVBfQUREUiArIDEsIElOVkFMSURfQUREUik7CisJCWFoZF9vdXRiKGFoZCwgU0NCX0ZJRk9fVVNFX0NPVU5ULAorCQkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0ZJRk9fVVNFX0NPVU5UKSAtIDEpOworCQlhaGRfb3V0YihhaGQsIERGRlNYRlJDVEwsIENMUkNITik7CiAJfQotCS8qCi0JICogQ2xlYXIgYW55IGhhbmRsZXIgZm9yIHRoaXMgRklGTywgZGVjcmVtZW50Ci0JICogdGhlIEZJRk8gdXNlIGNvdW50IGZvciB0aGUgU0NCLCBhbmQgcmVsZWFzZQotCSAqIHRoZSBGSUZPLgotCSAqLwotCWFoZF9vdXRiKGFoZCwgTE9OR0pNUF9BRERSICsgMSwgSU5WQUxJRF9BRERSKTsKLQlhaGRfb3V0YihhaGQsIFNDQl9GSUZPX1VTRV9DT1VOVCwKLQkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0ZJRk9fVVNFX0NPVU5UKSAtIDEpOwotCWFoZF9vdXRiKGFoZCwgREZGU1hGUkNUTCwgQ0xSQ0hOKTsKIH0KIAorLyoKKyAqIExvb2sgZm9yIGVudHJpZXMgaW4gdGhlIFFvdXRGSUZPIHRoYXQgaGF2ZSBjb21wbGV0ZWQuCisgKiBUaGUgdmFsaWRfdGFnIGNvbXBsZXRpb24gZmllbGQgaW5kaWNhdGVzIHRoZSB2YWxpZGl0eQorICogb2YgdGhlIGVudHJ5IC0gdGhlIHZhbGlkIHZhbHVlIHRvZ2dsZXMgZWFjaCB0aW1lIHRocm91Z2gKKyAqIHRoZSBxdWV1ZS4gV2UgdXNlIHRoZSBzZ19zdGF0dXMgZmllbGQgaW4gdGhlIGNvbXBsZXRpb24KKyAqIGVudHJ5IHRvIGF2b2lkIHJlZmVyZW5jaW5nIHRoZSBoc2NiIGlmIHRoZSBjb21wbGV0aW9uCisgKiBvY2N1cnJlZCB3aXRoIG5vIGVycm9ycyBhbmQgbm8gcmVzaWR1YWwuICBzZ19zdGF0dXMgaXMKKyAqIGEgY29weSBvZiB0aGUgZmlyc3QgYnl0ZSAobGl0dGxlIGVuZGlhbikgb2YgdGhlIHNncHRyCisgKiBoc2NiIGZpZWxkLgorICovCiB2b2lkCiBhaGRfcnVuX3FvdXRmaWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKKwlzdHJ1Y3QgYWhkX2NvbXBsZXRpb24gKmNvbXBsZXRpb247CiAJc3RydWN0IHNjYiAqc2NiOwogCXVfaW50ICBzY2JfaW5kZXg7CiAKQEAgLTc5MywxMSArODQ4LDEzIEBACiAJCXBhbmljKCJhaGRfcnVuX3FvdXRmaWZvIHJlY3Vyc2lvbiIpOwogCWFoZC0+ZmxhZ3MgfD0gQUhEX1JVTk5JTkdfUU9VVEZJRk87CiAJYWhkX3N5bmNfcW91dGZpZm8oYWhkLCBCVVNfRE1BU1lOQ19QT1NUUkVBRCk7Ci0Jd2hpbGUgKChhaGQtPnFvdXRmaWZvW2FoZC0+cW91dGZpZm9uZXh0XQotCSAgICAgJiBRT1VURklGT19FTlRSWV9WQUxJRF9MRSkgPT0gYWhkLT5xb3V0Zmlmb25leHRfdmFsaWRfdGFnKSB7CisJZm9yICg7OykgeworCQljb21wbGV0aW9uID0gJmFoZC0+cW91dGZpZm9bYWhkLT5xb3V0Zmlmb25leHRdOwogCi0JCXNjYl9pbmRleCA9IGFoZF9sZTE2dG9oKGFoZC0+cW91dGZpZm9bYWhkLT5xb3V0Zmlmb25leHRdCi0JCQkJICAgICAgJiB+UU9VVEZJRk9fRU5UUllfVkFMSURfTEUpOworCQlpZiAoY29tcGxldGlvbi0+dmFsaWRfdGFnICE9IGFoZC0+cW91dGZpZm9uZXh0X3ZhbGlkX3RhZykKKwkJCWJyZWFrOworCisJCXNjYl9pbmRleCA9IGFoZF9sZTE2dG9oKGNvbXBsZXRpb24tPnRhZyk7CiAJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiX2luZGV4KTsKIAkJaWYgKHNjYiA9PSBOVUxMKSB7CiAJCQlwcmludGYoIiVzOiBXQVJOSU5HIG5vIGNvbW1hbmQgZm9yIHNjYiAlZCAiCkBAIC04MDUsMTIgKzg2MiwxNSBAQAogCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIHNjYl9pbmRleCwKIAkJCSAgICAgICBhaGQtPnFvdXRmaWZvbmV4dCk7CiAJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7Ci0JCX0gZWxzZQotCQkJYWhkX2NvbXBsZXRlX3NjYihhaGQsIHNjYik7CisJCX0gZWxzZSBpZiAoKGNvbXBsZXRpb24tPnNnX3N0YXR1cyAmIFNHX1NUQVRVU19WQUxJRCkgIT0gMCkgeworCQkJYWhkX2hhbmRsZV9zY2Jfc3RhdHVzKGFoZCwgc2NiKTsKKwkJfSBlbHNlIHsKKwkJCWFoZF9kb25lKGFoZCwgc2NiKTsKKwkJfQogCiAJCWFoZC0+cW91dGZpZm9uZXh0ID0gKGFoZC0+cW91dGZpZm9uZXh0KzEpICYgKEFIRF9RT1VUX1NJWkUtMSk7CiAJCWlmIChhaGQtPnFvdXRmaWZvbmV4dCA9PSAwKQotCQkJYWhkLT5xb3V0Zmlmb25leHRfdmFsaWRfdGFnIF49IFFPVVRGSUZPX0VOVFJZX1ZBTElEX0xFOworCQkJYWhkLT5xb3V0Zmlmb25leHRfdmFsaWRfdGFnIF49IFFPVVRGSUZPX0VOVFJZX1ZBTElEOwogCX0KIAlhaGQtPmZsYWdzICY9IH5BSERfUlVOTklOR19RT1VURklGTzsKIH0KQEAgLTg3NiwyNiArOTM2LDYgQEAKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIHNlcWludGNvZGUpOwogI2VuZGlmCiAJc3dpdGNoIChzZXFpbnRjb2RlKSB7Ci0JY2FzZSBCQURfU0NCX1NUQVRVUzoKLQl7Ci0JCXN0cnVjdAlzY2IgKnNjYjsKLQkJdV9pbnQJc2NiaWQ7Ci0JCWludAljbWRzX3BlbmRpbmc7Ci0KLQkJc2NiaWQgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOwotCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKLQkJaWYgKHNjYiAhPSBOVUxMKSB7Ci0JCQlhaGRfY29tcGxldGVfc2NiKGFoZCwgc2NiKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50ZigiJXM6IFdBUk5JTkcgbm8gY29tbWFuZCBmb3Igc2NiICVkICIKLQkJCSAgICAgICAiKGJhZCBzdGF0dXMpXG4iLCBhaGRfbmFtZShhaGQpLCBzY2JpZCk7Ci0JCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7Ci0JCX0KLQkJY21kc19wZW5kaW5nID0gYWhkX2ludyhhaGQsIENNRFNfUEVORElORyk7Ci0JCWlmIChjbWRzX3BlbmRpbmcgPiAwKQotCQkJYWhkX291dHcoYWhkLCBDTURTX1BFTkRJTkcsIGNtZHNfcGVuZGluZyAtIDEpOwotCQlicmVhazsKLQl9CiAJY2FzZSBFTlRFUklOR19OT05QQUNLOgogCXsKIAkJc3RydWN0CXNjYiAqc2NiOwpAQCAtMTA2MCw3ICsxMTAwLDcgQEAKIAkJCWFoZF9vdXRiKGFoZCwgU0FWRURfTFVOLCAwKTsKIAkJCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTLCAwKTsKIAkJCWFoZF9hc3NlcnRfYXRuKGFoZCk7Ci0JCQlzY2ItPmZsYWdzICY9IH4oU0NCX1BBQ0tFVElaRUQpOworCQkJc2NiLT5mbGFncyAmPSB+U0NCX1BBQ0tFVElaRUQ7CiAJCQlzY2ItPmZsYWdzIHw9IFNDQl9BQk9SVHxTQ0JfQ01EUEhBU0VfQUJPUlQ7CiAJCQlhaGRfZnJlZXplX2RldnEoYWhkLCBzY2IpOwogCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fUkVRVUVVRV9SRVEpOwpAQCAtMTUwMyw5ICsxNTQzLDYgQEAKIAkgJiYgKGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MpICYgTk9UX0lERU5USUZJRUQpICE9IDApCiAJCXNjYiA9IE5VTEw7CiAKLQkvKiBNYWtlIHN1cmUgdGhlIHNlcXVlbmNlciBpcyBpbiBhIHNhZmUgbG9jYXRpb24uICovCi0JYWhkX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oYWhkKTsKLQogCWlmICgoc3RhdHVzMCAmIElPRVJSKSAhPSAwKSB7CiAJCXVfaW50IG5vd19sdmQ7CiAKQEAgLTE1MjEsMjYgKzE1NTgsMzUgQEAKIAkJYWhkX3NldHVwX2lvY2VsbF93b3JrYXJvdW5kKGFoZCk7CiAJCWFoZF91bnBhdXNlKGFoZCk7CiAJfSBlbHNlIGlmICgoc3RhdHVzMCAmIE9WRVJSVU4pICE9IDApIHsKKwogCQlwcmludGYoIiVzOiBTQ1NJIG9mZnNldCBvdmVycnVuIGRldGVjdGVkLiAgUmVzZXR0aW5nIGJ1cy5cbiIsCiAJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKIAkJYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCAnQScsIC8qSW5pdGlhdGUgUmVzZXQqL1RSVUUpOwogCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNDU0lSU1RJKSAhPSAwKSB7CisKIAkJcHJpbnRmKCIlczogU29tZW9uZSByZXNldCBjaGFubmVsIEFcbiIsIGFoZF9uYW1lKGFoZCkpOwogCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovRkFMU0UpOwogCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNDU0lQRVJSKSAhPSAwKSB7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBzZXF1ZW5jZXIgaXMgaW4gYSBzYWZlIGxvY2F0aW9uLiAqLworCQlhaGRfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihhaGQpOworCiAJCWFoZF9oYW5kbGVfdHJhbnNtaXNzaW9uX2Vycm9yKGFoZCk7CiAJfSBlbHNlIGlmIChscW9zdGF0MCAhPSAwKSB7CisKIAkJcHJpbnRmKCIlczogbHFvc3RhdDAgPT0gMHgleCFcbiIsIGFoZF9uYW1lKGFoZCksIGxxb3N0YXQwKTsKIAkJYWhkX291dGIoYWhkLCBDTFJMUU9JTlQwLCBscW9zdGF0MCk7Ci0JCWlmICgoYWhkLT5idWdzICYgQUhEX0NMUkxRT19BVVRPQ0xSX0JVRykgIT0gMCkgeworCQlpZiAoKGFoZC0+YnVncyAmIEFIRF9DTFJMUU9fQVVUT0NMUl9CVUcpICE9IDApCiAJCQlhaGRfb3V0YihhaGQsIENMUkxRT0lOVDEsIDApOwotCQl9CiAJfSBlbHNlIGlmICgoc3RhdHVzICYgU0VMVE8pICE9IDApIHsKIAkJdV9pbnQgIHNjYmlkOwogCiAJCS8qIFN0b3AgdGhlIHNlbGVjdGlvbiAqLwogCQlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLCAwKTsKIAorCQkvKiBNYWtlIHN1cmUgdGhlIHNlcXVlbmNlciBpcyBpbiBhIHNhZmUgbG9jYXRpb24uICovCisJCWFoZF9jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoZCk7CisKIAkJLyogTm8gbW9yZSBwZW5kaW5nIG1lc3NhZ2VzICovCiAJCWFoZF9jbGVhcl9tc2dfc3RhdGUoYWhkKTsKIApAQCAtMTU3MywyNCArMTYxOSwyNyBAQAogCQkJCSAgICAgICBzY2JpZCk7CiAJCQl9CiAjZW5kaWYKLQkJCS8qCi0JCQkgKiBGb3JjZSBhIHJlbmVnb3RpYXRpb24gd2l0aCB0aGlzIHRhcmdldCBqdXN0IGluCi0JCQkgKiBjYXNlIHRoZSBjYWJsZSB3YXMgcHVsbGVkIGFuZCB3aWxsIGxhdGVyIGJlCi0JCQkgKiByZS1hdHRhY2hlZC4gIFRoZSB0YXJnZXQgbWF5IGZvcmdldCBpdHMgbmVnb3RpYXRpb24KLQkJCSAqIHNldHRpbmdzIHdpdGggdXMgc2hvdWxkIGl0IGF0dGVtcHQgdG8gcmVzZWxlY3QKLQkJCSAqIGR1cmluZyB0aGUgaW50ZXJydXB0aW9uLiAgVGhlIHRhcmdldCB3aWxsIG5vdCBpc3N1ZQotCQkJICogYSB1bml0IGF0dGVudGlvbiBpbiB0aGlzIGNhc2UsIHNvIHdlIG11c3QgYWx3YXlzCi0JCQkgKiByZW5lZ290aWF0ZS4KLQkJCSAqLwogCQkJYWhkX3NjYl9kZXZpbmZvKGFoZCwgJmRldmluZm8sIHNjYik7Ci0JCQlhaGRfZm9yY2VfcmVuZWdvdGlhdGlvbihhaGQsICZkZXZpbmZvKTsKIAkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1NFTF9USU1FT1VUKTsKIAkJCWFoZF9mcmVlemVfZGV2cShhaGQsIHNjYik7CisKKwkJCS8qCisJCQkgKiBDYW5jZWwgYW55IHBlbmRpbmcgdHJhbnNhY3Rpb25zIG9uIHRoZSBkZXZpY2UKKwkJCSAqIG5vdyB0aGF0IGl0IHNlZW1zIHRvIGJlIG1pc3NpbmcuICBUaGlzIHdpbGwKKwkJCSAqIGFsc28gcmV2ZXJ0IHVzIHRvIGFzeW5jL25hcnJvdyB0cmFuc2ZlcnMgdW50aWwKKwkJCSAqIHdlIGNhbiByZW5lZ290aWF0ZSB3aXRoIHRoZSBkZXZpY2UuCisJCQkgKi8KKwkJCWFoZF9oYW5kbGVfZGV2cmVzZXQoYWhkLCAmZGV2aW5mbywKKwkJCQkJICAgIENBTV9MVU5fV0lMRENBUkQsCisJCQkJCSAgICBDQU1fU0VMX1RJTUVPVVQsCisJCQkJCSAgICAiU2VsZWN0aW9uIFRpbWVvdXQiLAorCQkJCQkgICAgLyp2ZXJib3NlX2xldmVsKi8xKTsKIAkJfQogCQlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7CiAJCWFoZF9pb2NlbGxfZmlyc3Rfc2VsZWN0aW9uKGFoZCk7CiAJCWFoZF91bnBhdXNlKGFoZCk7CiAJfSBlbHNlIGlmICgoc3RhdHVzMCAmIChTRUxESXxTRUxETykpICE9IDApIHsKKwogCQlhaGRfaW9jZWxsX2ZpcnN0X3NlbGVjdGlvbihhaGQpOwogCQlhaGRfdW5wYXVzZShhaGQpOwogCX0gZWxzZSBpZiAoc3RhdHVzMyAhPSAwKSB7CkBAIC0xNTk4LDYgKzE2NDcsMTAgQEAKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIHN0YXR1czMpOwogCQlhaGRfb3V0YihhaGQsIENMUlNJTlQzLCBzdGF0dXMzKTsKIAl9IGVsc2UgaWYgKChscWlzdGF0MSAmIChMUUlQSEFTRV9MUXxMUUlQSEFTRV9OTFEpKSAhPSAwKSB7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBzZXF1ZW5jZXIgaXMgaW4gYSBzYWZlIGxvY2F0aW9uLiAqLworCQlhaGRfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihhaGQpOworCiAJCWFoZF9oYW5kbGVfbHFpcGhhc2VfZXJyb3IoYWhkLCBscWlzdGF0MSk7CiAJfSBlbHNlIGlmICgobHFpc3RhdDEgJiBMUUlDUkNJX05MUSkgIT0gMCkgewogCQkvKgpAQCAtMTYyMiw2ICsxNjc1LDkgQEAKIAkJICovCiAJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIDApOwogCisJCS8qIE1ha2Ugc3VyZSB0aGUgc2VxdWVuY2VyIGlzIGluIGEgc2FmZSBsb2NhdGlvbi4gKi8KKwkJYWhkX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oYWhkKTsKKwogCQkvKgogCQkgKiBEZXRlcm1pbmUgd2hhdCB3ZSB3ZXJlIHVwIHRvIGF0IHRoZSB0aW1lIG9mCiAJCSAqIHRoZSBidXNmcmVlLgpAQCAtMTY1OSw3ICsxNzE1LDE2IEBACiAJCQljbGVhcl9maWZvID0gMDsKIAkJCXBhY2tldGl6ZWQgPSAgKGxxb3N0YXQxICYgTFFPQlVTRlJFRSkgIT0gMDsKIAkJCWlmICghcGFja2V0aXplZAotCQkJICYmIGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpID09IFBfQlVTRlJFRSkKKwkJCSAmJiBhaGRfaW5iKGFoZCwgTEFTVFBIQVNFKSA9PSBQX0JVU0ZSRUUKKwkJCSAmJiAoYWhkX2luYihhaGQsIFNTVEFUMCkgJiBTRUxESSkgPT0gMAorCQkJICYmICgoYWhkX2luYihhaGQsIFNTVEFUMCkgJiBTRUxETykgPT0gMAorCQkJICB8fCAoYWhkX2luYihhaGQsIFNDU0lTRVEwKSAmIEVOU0VMTykgPT0gMCkpCisJCQkJLyoKKwkJCQkgKiBBc3N1bWUgcGFja2V0aXplZCBpZiB3ZSBhcmUgbm90CisJCQkJICogb24gdGhlIGJ1cyBpbiBhIG5vbi1wYWNrZXRpemVkCisJCQkJICogY2FwYWNpdHkgYW5kIGFueSBwZW5kaW5nIHNlbGVjdGlvbgorCQkJCSAqIHdhcyBhIHBhY2tldGl6ZWQgc2VsZWN0aW9uLgorCQkJCSAqLwogCQkJCXBhY2tldGl6ZWQgPSAxOwogCQkJYnJlYWs7CiAJCX0KQEAgLTIzMTAsOCArMjM3NSw3IEBACiAJCSAgICAgICAiUFJHTUNOVCA9PSAweCV4XG4iLAogCQkgICAgICAgYWhkX2xvb2t1cF9waGFzZV9lbnRyeShsYXN0cGhhc2UpLT5waGFzZW1zZywKIAkJICAgICAgIGFib3J0ZWQsCi0JCSAgICAgICBhaGRfaW5iKGFoZCwgUFJHTUNOVCkKLQkJCXwgKGFoZF9pbmIoYWhkLCBQUkdNQ05UKzEpIDw8IDgpKTsKKwkJICAgICAgIGFoZF9pbncoYWhkLCBQUkdNQ05UKSk7CiAJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKIAl9CiAJLyogQWx3YXlzIHJlc3RhcnQgdGhlIHNlcXVlbmNlci4gKi8KQEAgLTI0NzQsOCArMjUzOCw3IEBACiAJCXVfaW50CWk7CiAKIAkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOwotCQlzZXFhZGRyID0gYWhkX2luYihhaGQsIENVUkFERFIpCi0JCQl8IChhaGRfaW5iKGFoZCwgQ1VSQUREUisxKSA8PCA4KTsKKwkJc2VxYWRkciA9IGFoZF9pbncoYWhkLCBDVVJBRERSKTsKIAogCQljcyA9IGFoZC0+Y3JpdGljYWxfc2VjdGlvbnM7CiAJCWZvciAoaSA9IDA7IGkgPCBhaGQtPm51bV9jcml0aWNhbF9zZWN0aW9uczsgaSsrLCBjcysrKSB7CkBAIC0zMTk2LDE0ICszMjU5LDI1IEBACiAJCWlvY2VsbF9vcHRzW0FIRF9QUkVDT01QX1NMRVdfSU5ERVhdICY9IH5BSERfUFJFQ09NUF9NQVNLOwogCiAJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9ORVdfSU9DRUxMX09QVFMpICE9IDAKLQkJICYmIChwcHJfb3B0cyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgIT0gMCkgeworCQkgJiYgKHBwcl9vcHRzICYgTVNHX0VYVF9QUFJfRFRfUkVRKSAhPSAwCisJCSAmJiAocHByX29wdHMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpID09IDApIHsKIAkJCS8qCiAJCQkgKiBTbG93IGRvd24gb3VyIENSQyBpbnRlcnZhbCB0byBiZQotCQkJICogY29tcGF0aWJsZSB3aXRoIGRldmljZXMgdGhhdCBjYW4ndAotCQkJICogaGFuZGxlIGEgQ1JDIGF0IGZ1bGwgc3BlZWQuCisJCQkgKiBjb21wYXRpYmxlIHdpdGggbm9uLXBhY2tldGl6ZWQKKwkJCSAqIFUxNjAgZGV2aWNlcyB0aGF0IGNhbid0IGhhbmRsZSBhCisJCQkgKiBDUkMgYXQgZnVsbCBzcGVlZC4KIAkJCSAqLwogCQkJY29uX29wdHMgfD0gRU5TTE9XQ1JDOwogCQl9CisKKwkJaWYgKChhaGQtPmJ1Z3MgJiBBSERfUEFDRURfTkVHVEFCTEVfQlVHKSAhPSAwKSB7CisJCQkvKgorCQkJICogT24gSDJBNCwgcmV2ZXJ0IHRvIGEgc2xvd2VyIHNsZXdyYXRlCisJCQkgKiBvbiBub24tcGFjZWQgdHJhbnNmZXJzLgorCQkJICovCisJCQlpb2NlbGxfb3B0c1tBSERfUFJFQ09NUF9TTEVXX0lOREVYXSAmPQorCQkJICAgIH5BSERfU0xFV1JBVEVfTUFTSzsKKwkJfQogCX0KIAogCWFoZF9vdXRiKGFoZCwgQU5ORVhDT0wsIEFIRF9BTk5FWENPTF9QUkVDT01QX1NMRVcpOwpAQCAtMzI5MiwxMSArMzM2NiwxNSBAQAogCSAqIEZvcmNlIHRoZSBzZXF1ZW5jZXIgdG8gcmVpbml0aWFsaXplIHRoZSBzZWxlY3Rpb24gZm9yCiAJICogdGhlIGNvbW1hbmQgYXQgdGhlIGhlYWQgb2YgdGhlIGV4ZWN1dGlvbiBxdWV1ZSBpZiBpdAogCSAqIGhhcyBhbHJlYWR5IGJlZW4gc2V0dXAuICBUaGUgbmVnb3RpYXRpb24gY2hhbmdlcyBtYXkKLQkgKiBlZmZlY3Qgd2hldGhlciB3ZSBzZWxlY3Qtb3V0IHdpdGggQVROLgorCSAqIGVmZmVjdCB3aGV0aGVyIHdlIHNlbGVjdC1vdXQgd2l0aCBBVE4uICBJdCBpcyBvbmx5CisJICogc2FmZSB0byBjbGVhciBFTlNFTE8gd2hlbiB0aGUgYnVzIGlzIG5vdCBmcmVlIGFuZCBubworCSAqIHNlbGVjdGlvbiBpcyBpbiBwcm9ncmVzIG9yIGNvbXBsZXRlZC4KIAkgKi8KIAlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CiAJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOwotCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIGFoZF9pbmIoYWhkLCBTQ1NJU0VRMCkgJiB+RU5TRUxPKTsKKwlpZiAoKGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkgJiBCU1lJKSAhPSAwCisJICYmIChhaGRfaW5iKGFoZCwgU1NUQVQwKSAmIChTRUxET3xTRUxJTkdPKSkgPT0gMCkKKwkJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwgYWhkX2luYihhaGQsIFNDU0lTRVEwKSAmIH5FTlNFTE8pOwogCXNhdmVkX3NjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CiAJLyogRW5zdXJlIHRoYXQgdGhlIGhzY2JzIGRvd24gb24gdGhlIGNhcmQgbWF0Y2ggdGhlIG5ldyBpbmZvcm1hdGlvbiAqLwogCWZvciAoc2NiX3RhZyA9IDA7IHNjYl90YWcgPCBhaGQtPnNjYl9kYXRhLm1heGhzY2JzOyBzY2JfdGFnKyspIHsKQEAgLTQ5MDksMTAgKzQ5ODcsNyBAQAogCSAqIERldGVybWluZSBpbml0aWFsIHZhbHVlcyBmb3IgZGF0YV9hZGRyIGFuZCBkYXRhX2NudAogCSAqIGZvciByZXN1bWluZyB0aGUgZGF0YSBwaGFzZS4KIAkgKi8KLQlzZ3B0ciA9IChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiArIDMpIDw8IDI0KQotCSAgICAgIHwgKGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSICsgMikgPDwgMTYpCi0JICAgICAgfCAoYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIgKyAxKSA8PCA4KQotCSAgICAgIHwJYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIpOworCXNncHRyID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIpOwogCXNncHRyICY9IFNHX1BUUl9NQVNLOwogCiAJcmVzaWQgPSAoYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfREFUQUNOVCArIDIpIDw8IDE2KQpAQCAtNDkzMCwxMCArNTAwNSw3IEBACiAJCWRhdGFwdHIgPSBhaGRfbGU2NHRvaChzZy0+YWRkcikKIAkJCSsgKGFoZF9sZTMydG9oKHNnLT5sZW4pICYgQUhEX1NHX0xFTl9NQVNLKQogCQkJLSByZXNpZDsKLQkJYWhkX291dGIoYWhkLCBIQUREUiArIDcsIGRhdGFwdHIgPj4gNTYpOwotCQlhaGRfb3V0YihhaGQsIEhBRERSICsgNiwgZGF0YXB0ciA+PiA0OCk7Ci0JCWFoZF9vdXRiKGFoZCwgSEFERFIgKyA1LCBkYXRhcHRyID4+IDQwKTsKLQkJYWhkX291dGIoYWhkLCBIQUREUiArIDQsIGRhdGFwdHIgPj4gMzIpOworCQlhaGRfb3V0bChhaGQsIEhBRERSICsgNCwgZGF0YXB0ciA+PiAzMik7CiAJfSBlbHNlIHsKIAkJc3RydWN0CSBhaGRfZG1hX3NlZyAqc2c7CiAKQEAgLTQ5NDgsMTAgKzUwMjAsNyBAQAogCQlhaGRfb3V0YihhaGQsIEhBRERSICsgNCwKIAkJCSAoYWhkX2xlMzJ0b2goc2ctPmxlbikgJiB+QUhEX1NHX0xFTl9NQVNLKSA+PiAyNCk7CiAJfQotCWFoZF9vdXRiKGFoZCwgSEFERFIgKyAzLCBkYXRhcHRyID4+IDI0KTsKLQlhaGRfb3V0YihhaGQsIEhBRERSICsgMiwgZGF0YXB0ciA+PiAxNik7Ci0JYWhkX291dGIoYWhkLCBIQUREUiArIDEsIGRhdGFwdHIgPj4gOCk7Ci0JYWhkX291dGIoYWhkLCBIQUREUiwgZGF0YXB0cik7CisJYWhkX291dGwoYWhkLCBIQUREUiwgZGF0YXB0cik7CiAJYWhkX291dGIoYWhkLCBIQ05UICsgMiwgcmVzaWQgPj4gMTYpOwogCWFoZF9vdXRiKGFoZCwgSENOVCArIDEsIHJlc2lkID4+IDgpOwogCWFoZF9vdXRiKGFoZCwgSENOVCwgcmVzaWQpOwpAQCAtNTAxMSwxMyArNTA4MCwxNCBAQAogCWFoZF9zZXRfd2lkdGgoYWhkLCBkZXZpbmZvLCBNU0dfRVhUX1dEVFJfQlVTXzhfQklULAogCQkgICAgICBBSERfVFJBTlNfQ1VSLCAvKnBhdXNlZCovVFJVRSk7CiAJYWhkX3NldF9zeW5jcmF0ZShhaGQsIGRldmluZm8sIC8qcGVyaW9kKi8wLCAvKm9mZnNldCovMCwKLQkJCSAvKnBwcl9vcHRpb25zKi8wLCBBSERfVFJBTlNfQ1VSLCAvKnBhdXNlZCovVFJVRSk7CisJCQkgLypwcHJfb3B0aW9ucyovMCwgQUhEX1RSQU5TX0NVUiwKKwkJCSAvKnBhdXNlZCovVFJVRSk7CiAJCi0JYWhkX3NlbmRfYXN5bmMoYWhkLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCi0JCSAgICAgICBsdW4sIEFDX1NFTlRfQkRSLCBOVUxMKTsKKwlpZiAoc3RhdHVzICE9IENBTV9TRUxfVElNRU9VVCkKKwkJYWhkX3NlbmRfYXN5bmMoYWhkLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCisJCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgQUNfU0VOVF9CRFIsIE5VTEwpOwogCi0JaWYgKG1lc3NhZ2UgIT0gTlVMTAotCSAmJiAodmVyYm9zZV9sZXZlbCA8PSBib290dmVyYm9zZSkpCisJaWYgKG1lc3NhZ2UgIT0gTlVMTCAmJiBib290dmVyYm9zZSkKIAkJcHJpbnRmKCIlczogJXMgb24gJWM6JWQuICVkIFNDQnMgYWJvcnRlZFxuIiwgYWhkX25hbWUoYWhkKSwKIAkJICAgICAgIG1lc3NhZ2UsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwgZm91bmQpOwogfQpAQCAtNTIwMywxMyArNTI3MywxMyBAQAogCQkvKiBGQUxMVEhST1VHSCAqLwogCWNhc2UgNDoKIAkJYWhkX2RtYW1hcF91bmxvYWQoYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsCi0JCQkJICBhaGQtPnNoYXJlZF9kYXRhX2RtYW1hcCk7CisJCQkJICBhaGQtPnNoYXJlZF9kYXRhX21hcC5kbWFtYXApOwogCQkvKiBGQUxMVEhST1VHSCAqLwogCWNhc2UgMzoKIAkJYWhkX2RtYW1lbV9mcmVlKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LCBhaGQtPnFvdXRmaWZvLAotCQkJCWFoZC0+c2hhcmVkX2RhdGFfZG1hbWFwKTsKKwkJCQlhaGQtPnNoYXJlZF9kYXRhX21hcC5kbWFtYXApOwogCQlhaGRfZG1hbWFwX2Rlc3Ryb3koYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsCi0JCQkJICAgYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXApOworCQkJCSAgIGFoZC0+c2hhcmVkX2RhdGFfbWFwLmRtYW1hcCk7CiAJCS8qIEZBTExUSFJPVUdIICovCiAJY2FzZSAyOgogCQlhaGRfZG1hX3RhZ19kZXN0cm95KGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0KTsKQEAgLTU5NzUsMTYgKzYwNDUsMTMgQEAKIAluZXdjb3VudCA9IE1JTihzY2JfZGF0YS0+c2Vuc2VfbGVmdCwgc2NiX2RhdGEtPnNjYnNfbGVmdCk7CiAJbmV3Y291bnQgPSBNSU4obmV3Y291bnQsIHNjYl9kYXRhLT5zZ3NfbGVmdCk7CiAJbmV3Y291bnQgPSBNSU4obmV3Y291bnQsIChBSERfU0NCX01BWF9BTExPQyAtIHNjYl9kYXRhLT5udW1zY2JzKSk7Ci0Jc2NiX2RhdGEtPnNlbnNlX2xlZnQgLT0gbmV3Y291bnQ7Ci0Jc2NiX2RhdGEtPnNjYnNfbGVmdCAtPSBuZXdjb3VudDsKLQlzY2JfZGF0YS0+c2dzX2xlZnQgLT0gbmV3Y291bnQ7CiAJZm9yIChpID0gMDsgaSA8IG5ld2NvdW50OyBpKyspIHsKLQkJdV9pbnQgY29sX3RhZzsKLQogCQlzdHJ1Y3Qgc2NiX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCQl1X2ludCBjb2xfdGFnOwogI2lmbmRlZiBfX2xpbnV4X18KIAkJaW50IGVycm9yOwogI2VuZGlmCisKIAkJbmV4dF9zY2IgPSAoc3RydWN0IHNjYiAqKW1hbGxvYyhzaXplb2YoKm5leHRfc2NiKSwKIAkJCQkJCU1fREVWQlVGLCBNX05PV0FJVCk7CiAJCWlmIChuZXh0X3NjYiA9PSBOVUxMKQpAQCAtNjA0MSw2ICs2MTA4LDkgQEAKIAkJc2Vuc2VfZGF0YSArPSBBSERfU0VOU0VfQlVGU0laRTsKIAkJc2Vuc2VfYnVzYWRkciArPSBBSERfU0VOU0VfQlVGU0laRTsKIAkJc2NiX2RhdGEtPm51bXNjYnMrKzsKKwkJc2NiX2RhdGEtPnNlbnNlX2xlZnQtLTsKKwkJc2NiX2RhdGEtPnNjYnNfbGVmdC0tOworCQlzY2JfZGF0YS0+c2dzX2xlZnQtLTsKIAl9CiB9CiAKQEAgLTYwODgsNyArNjE1OCw2IEBACiBpbnQKIGFoZF9pbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKLQl1aW50OF90CQkqYmFzZV92YWRkcjsKIAl1aW50OF90CQkqbmV4dF92YWRkcjsKIAlkbWFfYWRkcl90CSBuZXh0X2JhZGRyOwogCXNpemVfdAkJIGRyaXZlcl9kYXRhX3NpemU7CkBAIC02MTU2LDcgKzYyMjUsNyBAQAogCSAqIGZvciB0aGUgdGFyZ2V0IG1vZGUgcm9sZSwgd2UgbXVzdCBhZGRpdGlvbmFsbHkgcHJvdmlkZSBzcGFjZSBmb3IKIAkgKiB0aGUgaW5jb21pbmcgdGFyZ2V0IGNvbW1hbmQgZmlmby4KIAkgKi8KLQlkcml2ZXJfZGF0YV9zaXplID0gQUhEX1NDQl9NQVggKiBzaXplb2YodWludDE2X3QpCisJZHJpdmVyX2RhdGFfc2l6ZSA9IEFIRF9TQ0JfTUFYICogc2l6ZW9mKCphaGQtPnFvdXRmaWZvKQogCQkJICsgc2l6ZW9mKHN0cnVjdCBoYXJkd2FyZV9zY2IpOwogCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9UQVJHRVRNT0RFKSAhPSAwKQogCQlkcml2ZXJfZGF0YV9zaXplICs9IEFIRF9UTU9ERV9DTURTICogc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKTsKQEAgLTYxNzgsMjAgKzYyNDcsMjMgQEAKIAogCS8qIEFsbG9jYXRpb24gb2YgZHJpdmVyIGRhdGEgKi8KIAlpZiAoYWhkX2RtYW1lbV9hbGxvYyhhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwKLQkJCSAgICAgKHZvaWQgKiopJmJhc2VfdmFkZHIsCi0JCQkgICAgIEJVU19ETUFfTk9XQUlULCAmYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXApICE9IDApIHsKKwkJCSAgICAgKHZvaWQgKiopJmFoZC0+c2hhcmVkX2RhdGFfbWFwLnZhZGRyLAorCQkJICAgICBCVVNfRE1BX05PV0FJVCwKKwkJCSAgICAgJmFoZC0+c2hhcmVkX2RhdGFfbWFwLmRtYW1hcCkgIT0gMCkgewogCQlyZXR1cm4gKEVOT01FTSk7CiAJfQogCiAJYWhkLT5pbml0X2xldmVsKys7CiAKIAkvKiBBbmQgcGVybWFuZW50bHkgbWFwIGl0IGluICovCi0JYWhkX2RtYW1hcF9sb2FkKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LCBhaGQtPnNoYXJlZF9kYXRhX2RtYW1hcCwKLQkJCWJhc2VfdmFkZHIsIGRyaXZlcl9kYXRhX3NpemUsIGFoZF9kbWFtYXBfY2IsCi0JCQkmYWhkLT5zaGFyZWRfZGF0YV9idXNhZGRyLCAvKmZsYWdzKi8wKTsKLQlhaGQtPnFvdXRmaWZvID0gKHVpbnQxNl90ICopYmFzZV92YWRkcjsKKwlhaGRfZG1hbWFwX2xvYWQoYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsIGFoZC0+c2hhcmVkX2RhdGFfbWFwLmRtYW1hcCwKKwkJCWFoZC0+c2hhcmVkX2RhdGFfbWFwLnZhZGRyLCBkcml2ZXJfZGF0YV9zaXplLAorCQkJYWhkX2RtYW1hcF9jYiwgJmFoZC0+c2hhcmVkX2RhdGFfbWFwLnBoeXNhZGRyLAorCQkJLypmbGFncyovMCk7CisJYWhkLT5xb3V0ZmlmbyA9IChzdHJ1Y3QgYWhkX2NvbXBsZXRpb24gKilhaGQtPnNoYXJlZF9kYXRhX21hcC52YWRkcjsKIAluZXh0X3ZhZGRyID0gKHVpbnQ4X3QgKikmYWhkLT5xb3V0Zmlmb1tBSERfUU9VVF9TSVpFXTsKLQluZXh0X2JhZGRyID0gYWhkLT5zaGFyZWRfZGF0YV9idXNhZGRyICsgQUhEX1FPVVRfU0laRSpzaXplb2YodWludDE2X3QpOworCW5leHRfYmFkZHIgPSBhaGQtPnNoYXJlZF9kYXRhX21hcC5waHlzYWRkcgorCQkgICArIEFIRF9RT1VUX1NJWkUqc2l6ZW9mKHN0cnVjdCBhaGRfY29tcGxldGlvbik7CiAJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1RBUkdFVE1PREUpICE9IDApIHsKIAkJYWhkLT50YXJnZXRjbWRzID0gKHN0cnVjdCB0YXJnZXRfY21kICopbmV4dF92YWRkcjsKIAkJbmV4dF92YWRkciArPSBBSERfVE1PREVfQ01EUyAqIHNpemVvZihzdHJ1Y3QgdGFyZ2V0X2NtZCk7CkBAIC02MjEyLDYgKzYyODQsNyBAQAogCSAqIHNwZWNpYWxseSBmcm9tIHRoZSBETUEgc2FmZSBtZW1vcnkgY2h1bmsgdXNlZCBmb3IgdGhlIFFPVVRGSUZPLgogCSAqLwogCWFoZC0+bmV4dF9xdWV1ZWRfaHNjYiA9IChzdHJ1Y3QgaGFyZHdhcmVfc2NiICopbmV4dF92YWRkcjsKKwlhaGQtPm5leHRfcXVldWVkX2hzY2JfbWFwID0gJmFoZC0+c2hhcmVkX2RhdGFfbWFwOwogCWFoZC0+bmV4dF9xdWV1ZWRfaHNjYi0+aHNjYl9idXNhZGRyID0gYWhkX2h0b2xlMzIobmV4dF9iYWRkcik7CiAKIAlhaGQtPmluaXRfbGV2ZWwrKzsKQEAgLTY1MTcsMTAgKzY1OTAsMTAgQEAKIAogCS8qIEFsbCBvZiBvdXIgcXVldWVzIGFyZSBlbXB0eSAqLwogCWFoZC0+cW91dGZpZm9uZXh0ID0gMDsKLQlhaGQtPnFvdXRmaWZvbmV4dF92YWxpZF90YWcgPSBRT1VURklGT19FTlRSWV9WQUxJRF9MRTsKLQlhaGRfb3V0YihhaGQsIFFPVVRGSUZPX0VOVFJZX1ZBTElEX1RBRywgUU9VVEZJRk9fRU5UUllfVkFMSUQgPj4gOCk7CisJYWhkLT5xb3V0Zmlmb25leHRfdmFsaWRfdGFnID0gUU9VVEZJRk9fRU5UUllfVkFMSUQ7CisJYWhkX291dGIoYWhkLCBRT1VURklGT19FTlRSWV9WQUxJRF9UQUcsIFFPVVRGSUZPX0VOVFJZX1ZBTElEKTsKIAlmb3IgKGkgPSAwOyBpIDwgQUhEX1FPVVRfU0laRTsgaSsrKQotCQlhaGQtPnFvdXRmaWZvW2ldID0gMDsKKwkJYWhkLT5xb3V0Zmlmb1tpXS52YWxpZF90YWcgPSAwOwogCWFoZF9zeW5jX3FvdXRmaWZvKGFoZCwgQlVTX0RNQVNZTkNfUFJFUkVBRCk7CiAKIAlhaGQtPnFpbmZpZm9uZXh0ID0gMDsKQEAgLTY1NTMsMjQgKzY2MjYsMjIgQEAKIAlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX1NDQl9IRUFELCBTQ0JfTElTVF9OVUxMKTsKIAlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX1NDQl9ETUFJTlBST0dfSEVBRCwgU0NCX0xJU1RfTlVMTCk7CiAJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsIFNDQl9MSVNUX05VTEwpOworCWFoZF9vdXR3KGFoZCwgQ09NUExFVEVfRE1BX1NDQl9UQUlMLCBTQ0JfTElTVF9OVUxMKTsKKwlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX09OX1FGUkVFWkVfSEVBRCwgU0NCX0xJU1RfTlVMTCk7CiAKIAkvKgogCSAqIFRoZSBGcmVlemUgQ291bnQgaXMgMC4KIAkgKi8KKwlhaGQtPnFmcmVlemVfY250ID0gMDsKIAlhaGRfb3V0dyhhaGQsIFFGUkVFWkVfQ09VTlQsIDApOworCWFoZF9vdXR3KGFoZCwgS0VSTkVMX1FGUkVFWkVfQ09VTlQsIDApOwogCiAJLyoKIAkgKiBUZWxsIHRoZSBzZXF1ZW5jZXIgd2hlcmUgaXQgY2FuIGZpbmQgb3VyIGFycmF5cyBpbiBtZW1vcnkuCiAJICovCi0JYnVzYWRkciA9IGFoZC0+c2hhcmVkX2RhdGFfYnVzYWRkcjsKLQlhaGRfb3V0YihhaGQsIFNIQVJFRF9EQVRBX0FERFIsIGJ1c2FkZHIgJiAweEZGKTsKLQlhaGRfb3V0YihhaGQsIFNIQVJFRF9EQVRBX0FERFIgKyAxLCAoYnVzYWRkciA+PiA4KSAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwgU0hBUkVEX0RBVEFfQUREUiArIDIsIChidXNhZGRyID4+IDE2KSAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwgU0hBUkVEX0RBVEFfQUREUiArIDMsIChidXNhZGRyID4+IDI0KSAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwgUU9VVEZJRk9fTkVYVF9BRERSLCBidXNhZGRyICYgMHhGRik7Ci0JYWhkX291dGIoYWhkLCBRT1VURklGT19ORVhUX0FERFIgKyAxLCAoYnVzYWRkciA+PiA4KSAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwgUU9VVEZJRk9fTkVYVF9BRERSICsgMiwgKGJ1c2FkZHIgPj4gMTYpICYgMHhGRik7Ci0JYWhkX291dGIoYWhkLCBRT1VURklGT19ORVhUX0FERFIgKyAzLCAoYnVzYWRkciA+PiAyNCkgJiAweEZGKTsKKwlidXNhZGRyID0gYWhkLT5zaGFyZWRfZGF0YV9tYXAucGh5c2FkZHI7CisJYWhkX291dGwoYWhkLCBTSEFSRURfREFUQV9BRERSLCBidXNhZGRyKTsKKwlhaGRfb3V0bChhaGQsIFFPVVRGSUZPX05FWFRfQUREUiwgYnVzYWRkcik7CiAKIAkvKgogCSAqIFNldHVwIHRoZSBhbGxvd2VkIFNDU0kgU2VxdWVuY2VzIGJhc2VkIG9uIG9wZXJhdGlvbmFsIG1vZGUuCkBAIC02NjE5LDEwICs2NjkwLDcgQEAKIAkgKiBUZWxsIHRoZSBzZXF1ZW5jZXIgd2hpY2ggU0NCIHdpbGwgYmUgdGhlIG5leHQgb25lIGl0IHJlY2VpdmVzLgogCSAqLwogCWJ1c2FkZHIgPSBhaGRfbGUzMnRvaChhaGQtPm5leHRfcXVldWVkX2hzY2ItPmhzY2JfYnVzYWRkcik7Ci0JYWhkX291dGIoYWhkLCBORVhUX1FVRVVFRF9TQ0JfQUREUiArIDAsIGJ1c2FkZHIgJiAweEZGKTsKLQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMSwgKGJ1c2FkZHIgPj4gOCkgJiAweEZGKTsKLQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMiwgKGJ1c2FkZHIgPj4gMTYpICYgMHhGRik7Ci0JYWhkX291dGIoYWhkLCBORVhUX1FVRVVFRF9TQ0JfQUREUiArIDMsIChidXNhZGRyID4+IDI0KSAmIDB4RkYpOworCWFoZF9vdXRsKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIsIGJ1c2FkZHIpOwogCiAJLyoKIAkgKiBEZWZhdWx0IHRvIGNvYWxlc2NpbmcgZGlzYWJsZWQuCkBAIC02OTI2LDQzICs2OTk0LDM0IEBACiB7CiAJdV9pbnQgaW50c3RhdDsKIAl1X2ludCBtYXhsb29wczsKLQl1X2ludCBxZnJlZXplX2NudDsKIAogCW1heGxvb3BzID0gMTAwMDsKIAlhaGQtPmZsYWdzIHw9IEFIRF9BTExfSU5URVJSVVBUUzsKIAlhaGRfcGF1c2UoYWhkKTsKIAkvKgotCSAqIEluY3JlbWVudCB0aGUgUUZyZWV6ZSBDb3VudCBzbyB0aGF0IHRoZSBzZXF1ZW5jZXIKLQkgKiB3aWxsIG5vdCBzdGFydCBuZXcgc2VsZWN0aW9ucy4gIFdlIGRvIHRoaXMgb25seQorCSAqIEZyZWV6ZSB0aGUgb3V0Z29pbmcgc2VsZWN0aW9ucy4gIFdlIGRvIHRoaXMgb25seQogCSAqIHVudGlsIHdlIGFyZSBzYWZlbHkgcGF1c2VkIHdpdGhvdXQgZnVydGhlciBzZWxlY3Rpb25zCiAJICogcGVuZGluZy4KIAkgKi8KLQlhaGRfb3V0dyhhaGQsIFFGUkVFWkVfQ09VTlQsIGFoZF9pbncoYWhkLCBRRlJFRVpFX0NPVU5UKSArIDEpOworCWFoZC0+cWZyZWV6ZV9jbnQtLTsKKwlhaGRfb3V0dyhhaGQsIEtFUk5FTF9RRlJFRVpFX0NPVU5ULCBhaGQtPnFmcmVlemVfY250KTsKIAlhaGRfb3V0YihhaGQsIFNFUV9GTEFHUzIsIGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MyKSB8IFNFTEVDVE9VVF9RRlJPWkVOKTsKIAlkbyB7Ci0JCXN0cnVjdCBzY2IgKndhaXRpbmdfc2NiOwogCiAJCWFoZF91bnBhdXNlKGFoZCk7CisJCS8qCisJCSAqIEdpdmUgdGhlIHNlcXVlbmNlciBzb21lIHRpbWUgdG8gc2VydmljZQorCQkgKiBhbnkgYWN0aXZlIHNlbGVjdGlvbnMuCisJCSAqLworCQlhaGRfZGVsYXkoNTAwKTsKKwogCQlhaGRfaW50cihhaGQpOwogCQlhaGRfcGF1c2UoYWhkKTsKLQkJYWhkX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oYWhkKTsKIAkJaW50c3RhdCA9IGFoZF9pbmIoYWhkLCBJTlRTVEFUKTsKLQkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOwotCQlpZiAoKGFoZF9pbmIoYWhkLCBTU1RBVDApICYgKFNFTERPfFNFTElOR08pKSA9PSAwKQotCQkJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwKLQkJCQkgYWhkX2luYihhaGQsIFNDU0lTRVEwKSAmIH5FTlNFTE8pOwotCQkvKgotCQkgKiBJbiB0aGUgbm9uLXBhY2tldGl6ZWQgY2FzZSwgdGhlIHNlcXVlbmNlciAoZm9yIFJldiBBKSwKLQkJICogcmVsaWVzIG9uIEVOU0VMTyByZW1haW5pbmcgc2V0IGFmdGVyIFNFTERPLiAgVGhlIGhhcmR3YXJlCi0JCSAqIGF1dG8tY2xlYXJzIEVOU0VMTyBpbiB0aGUgcGFja2V0aXplZCBjYXNlLgotCQkgKi8KLQkJd2FpdGluZ19zY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsCi0JCQkJCSAgICAgYWhkX2ludyhhaGQsIFdBSVRJTkdfVElEX0hFQUQpKTsKLQkJaWYgKHdhaXRpbmdfc2NiICE9IE5VTEwKLQkJICYmICh3YWl0aW5nX3NjYi0+ZmxhZ3MgJiBTQ0JfUEFDS0VUSVpFRCkgPT0gMAotCQkgJiYgKGFoZF9pbmIoYWhkLCBTU1RBVDApICYgKFNFTERPfFNFTElOR08pKSAhPSAwKQotCQkJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwKLQkJCQkgYWhkX2luYihhaGQsIFNDU0lTRVEwKSB8IEVOU0VMTyk7CisJCWlmICgoaW50c3RhdCAmIElOVF9QRU5EKSA9PSAwKSB7CisJCQlhaGRfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihhaGQpOworCQkJaW50c3RhdCA9IGFoZF9pbmIoYWhkLCBJTlRTVEFUKTsKKwkJfQogCX0gd2hpbGUgKC0tbWF4bG9vcHMKIAkgICAgICAmJiAoaW50c3RhdCAhPSAweEZGIHx8IChhaGQtPmZlYXR1cmVzICYgQUhEX1JFTU9WQUJMRSkgPT0gMCkKIAkgICAgICAmJiAoKGludHN0YXQgJiBJTlRfUEVORCkgIT0gMApAQCAtNjk3MywxNyArNzAzMiw4IEBACiAJCXByaW50ZigiSW5maW5pdGUgaW50ZXJydXB0IGxvb3AsIElOVFNUQVQgPSAleCIsCiAJCSAgICAgIGFoZF9pbmIoYWhkLCBJTlRTVEFUKSk7CiAJfQotCXFmcmVlemVfY250ID0gYWhkX2ludyhhaGQsIFFGUkVFWkVfQ09VTlQpOwotCWlmIChxZnJlZXplX2NudCA9PSAwKSB7Ci0JCXByaW50ZigiJXM6IGFoZF9wYXVzZV9hbmRfZmx1c2h3b3JrIHdpdGggMCBxZnJlZXplIGNvdW50IVxuIiwKLQkJICAgICAgIGFoZF9uYW1lKGFoZCkpOwotCX0gZWxzZSB7Ci0JCXFmcmVlemVfY250LS07Ci0JfQotCWFoZF9vdXR3KGFoZCwgUUZSRUVaRV9DT1VOVCwgcWZyZWV6ZV9jbnQpOwotCWlmIChxZnJlZXplX2NudCA9PSAwKQotCQlhaGRfb3V0YihhaGQsIFNFUV9GTEFHUzIsCi0JCQkgYWhkX2luYihhaGQsIFNFUV9GTEFHUzIpICYgflNFTEVDVE9VVF9RRlJPWkVOKTsKKwlhaGQtPnFmcmVlemVfY250Kys7CisJYWhkX291dHcoYWhkLCBLRVJORUxfUUZSRUVaRV9DT1VOVCwgYWhkLT5xZnJlZXplX2NudCk7CiAKIAlhaGRfZmx1c2hfcW91dGZpZm8oYWhkKTsKIApAQCAtNzE1NSwxMCArNzIwNSw3IEBACiAJCXVpbnQzMl90IGJ1c2FkZHI7CiAKIAkJYnVzYWRkciA9IGFoZF9sZTMydG9oKHNjYi0+aHNjYi0+aHNjYl9idXNhZGRyKTsKLQkJYWhkX291dGIoYWhkLCBORVhUX1FVRVVFRF9TQ0JfQUREUiArIDAsIGJ1c2FkZHIgJiAweEZGKTsKLQkJYWhkX291dGIoYWhkLCBORVhUX1FVRVVFRF9TQ0JfQUREUiArIDEsIChidXNhZGRyID4+IDgpICYgMHhGRik7Ci0JCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAyLCAoYnVzYWRkciA+PiAxNikgJiAweEZGKTsKLQkJYWhkX291dGIoYWhkLCBORVhUX1FVRVVFRF9TQ0JfQUREUiArIDMsIChidXNhZGRyID4+IDI0KSAmIDB4RkYpOworCQlhaGRfb3V0bChhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSLCBidXNhZGRyKTsKIAl9IGVsc2UgewogCQlwcmV2X3NjYi0+aHNjYi0+bmV4dF9oc2NiX2J1c2FkZHIgPSBzY2ItPmhzY2ItPmhzY2JfYnVzYWRkcjsKIAkJYWhkX3N5bmNfc2NiKGFoZCwgcHJldl9zY2IsIApAQCAtNzI2NSwxMCArNzMxMiw3IEBACiAJICovCiAJYWhkLT5xaW5maWZvbmV4dCA9IHFpbnN0YXJ0OwogCWJ1c2FkZHIgPSBhaGRfbGUzMnRvaChhaGQtPm5leHRfcXVldWVkX2hzY2ItPmhzY2JfYnVzYWRkcik7Ci0JYWhkX291dGIoYWhkLCBORVhUX1FVRVVFRF9TQ0JfQUREUiArIDAsIGJ1c2FkZHIgJiAweEZGKTsKLQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMSwgKGJ1c2FkZHIgPj4gOCkgJiAweEZGKTsKLQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMiwgKGJ1c2FkZHIgPj4gMTYpICYgMHhGRik7Ci0JYWhkX291dGIoYWhkLCBORVhUX1FVRVVFRF9TQ0JfQUREUiArIDMsIChidXNhZGRyID4+IDI0KSAmIDB4RkYpOworCWFoZF9vdXRsKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIsIGJ1c2FkZHIpOwogCiAJd2hpbGUgKHFpbnBvcyAhPSBxaW50YWlsKSB7CiAJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgYWhkLT5xaW5maWZvW3FpbnBvc10pOwpAQCAtNzMzMCw2ICs3Mzc0LDcgQEAKIAkgKiBhcHByb3ByaWF0ZSwgdHJhdmVyc2UgdGhlIFNDQnMgb2YgZWFjaCAidGhlaXIgaWQiCiAJICogbG9va2luZyBmb3IgbWF0Y2hlcy4KIAkgKi8KKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CiAJc2F2ZWRzY2JwdHIgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOwogCXRpZF9uZXh0ID0gYWhkX2ludyhhaGQsIFdBSVRJTkdfVElEX0hFQUQpOwogCXRpZF9wcmV2ID0gU0NCX0xJU1RfTlVMTDsKQEAgLTczOTksNyArNzQ0NCw3IEBACiAJdV9pbnQJcHJldjsKIAlpbnQJZm91bmQ7CiAKLQlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfQ0NIQU5fTVNLLCBBSERfTU9ERV9DQ0hBTl9NU0spOworCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9TQ1NJX01TSywgQUhEX01PREVfU0NTSV9NU0spOwogCWZvdW5kID0gMDsKIAlwcmV2ID0gU0NCX0xJU1RfTlVMTDsKIAluZXh0ID0gKmxpc3RfaGVhZDsKQEAgLTc0NjYsNyArNzUxMSw3IEBACiBhaGRfc3RpdGNoX3RpZF9saXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGlkX3ByZXYsCiAJCSAgICB1X2ludCB0aWRfY3VyLCB1X2ludCB0aWRfbmV4dCkKIHsKLQlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfQ0NIQU5fTVNLLCBBSERfTU9ERV9DQ0hBTl9NU0spOworCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9TQ1NJX01TSywgQUhEX01PREVfU0NTSV9NU0spOwogCiAJaWYgKFNDQklEX0lTX05VTEwodGlkX2N1cikpIHsKIApAQCAtNzUwNiw3ICs3NTUxLDcgQEAKIHsKIAl1X2ludCB0YWlsX29mZnNldDsKIAotCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9DQ0hBTl9NU0ssIEFIRF9NT0RFX0NDSEFOX01TSyk7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CiAJaWYgKCFTQ0JJRF9JU19OVUxMKHByZXYpKSB7CiAJCWFoZF9zZXRfc2NicHRyKGFoZCwgcHJldik7CiAJCWFoZF9vdXR3KGFoZCwgU0NCX05FWFQsIG5leHQpOwpAQCAtNzczOSw3ICs3Nzg0LDcgQEAKIAkgKi8KIAlhaGRfY2xlYXJfbXNnX3N0YXRlKGFoZCk7CiAJYWhkX291dGIoYWhkLCBTSU1PREUxLAotCQkgYWhkX2luYihhaGQsIFNJTU9ERTEpICYgfihFTkJVU0ZSRUV8RU5TQ1NJUlNUfEVOQlVTRlJFRSkpOworCQkgYWhkX2luYihhaGQsIFNJTU9ERTEpICYgfihFTkJVU0ZSRUV8RU5TQ1NJUlNUKSk7CiAKIAlpZiAoaW5pdGlhdGVfcmVzZXQpCiAJCWFoZF9yZXNldF9jdXJyZW50X2J1cyhhaGQpOwpAQCAtNzkxMCwzMCArNzk1NSwzNSBAQAogdm9pZAogYWhkX2hhbmRsZV9zY3NpX3N0YXR1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKIHsKLQlzdHJ1Y3QgaGFyZHdhcmVfc2NiICpoc2NiOwotCXVfaW50ICBxZnJlZXplX2NudDsKKwlzdHJ1Y3QJaGFyZHdhcmVfc2NiICpoc2NiOworCWludAlwYXVzZWQ7CiAKIAkvKgogCSAqIFRoZSBzZXF1ZW5jZXIgZnJlZXplcyBpdHMgc2VsZWN0LW91dCBxdWV1ZQogCSAqIGFueXRpbWUgYSBTQ1NJIHN0YXR1cyBlcnJvciBvY2N1cnMuICBXZSBtdXN0Ci0JICogaGFuZGxlIHRoZSBlcnJvciBhbmQgZGVjcmVtZW50IHRoZSBRRlJFRVpFIGNvdW50Ci0JICogdG8gYWxsb3cgdGhlIHNlcXVlbmNlciB0byBjb250aW51ZS4KKwkgKiBoYW5kbGUgdGhlIGVycm9yIGFuZCBpbmNyZW1lbnQgb3VyIHFmcmVlemUgY291bnQKKwkgKiB0byBhbGxvdyB0aGUgc2VxdWVuY2VyIHRvIGNvbnRpbnVlLiAgV2UgZG9uJ3QKKwkgKiBib3RoZXIgY2xlYXJpbmcgY3JpdGljYWwgc2VjdGlvbnMgaGVyZSBzaW5jZSBhbGwKKwkgKiBvcGVyYXRpb25zIGFyZSBvbiBkYXRhIHN0cnVjdHVyZXMgdGhhdCB0aGUgc2VxdWVuY2VyCisJICogaXMgbm90IHRvdWNoaW5nIG9uY2UgdGhlIHF1ZXVlIGlzIGZyb3plbi4KIAkgKi8KIAloc2NiID0gc2NiLT5oc2NiOyAKIAorCWlmIChhaGRfaXNfcGF1c2VkKGFoZCkpIHsKKwkJcGF1c2VkID0gMTsKKwl9IGVsc2UgeworCQlwYXVzZWQgPSAwOworCQlhaGRfcGF1c2UoYWhkKTsKKwl9CisKIAkvKiBGcmVlemUgdGhlIHF1ZXVlIHVudGlsIHRoZSBjbGllbnQgc2VlcyB0aGUgZXJyb3IuICovCiAJYWhkX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKIAlhaGRfZnJlZXplX3NjYihzY2IpOwotCXFmcmVlemVfY250ID0gYWhkX2ludyhhaGQsIFFGUkVFWkVfQ09VTlQpOwotCWlmIChxZnJlZXplX2NudCA9PSAwKSB7Ci0JCXByaW50ZigiJXM6IEJhZCBzdGF0dXMgd2l0aCAwIHFmcmVlemUgY291bnQhXG4iLCBhaGRfbmFtZShhaGQpKTsKLQl9IGVsc2UgewotCQlxZnJlZXplX2NudC0tOwotCQlhaGRfb3V0dyhhaGQsIFFGUkVFWkVfQ09VTlQsIHFmcmVlemVfY250KTsKLQl9Ci0JaWYgKHFmcmVlemVfY250ID09IDApCi0JCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTMiwKLQkJCSBhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTMikgJiB+U0VMRUNUT1VUX1FGUk9aRU4pOworCWFoZC0+cWZyZWV6ZV9jbnQrKzsKKwlhaGRfb3V0dyhhaGQsIEtFUk5FTF9RRlJFRVpFX0NPVU5ULCBhaGQtPnFmcmVlemVfY250KTsKKworCWlmIChwYXVzZWQgPT0gMCkKKwkJYWhkX3VucGF1c2UoYWhkKTsKIAogCS8qIERvbid0IHdhbnQgdG8gY2xvYmJlciB0aGUgb3JpZ2luYWwgc2Vuc2UgY29kZSAqLwogCWlmICgoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkgIT0gMCkgewpAQCAtODMxNyw4ICs4MzY3LDcgQEAKIAltYXhfcHJvZyA9IDIwNDg7CiAKIAlhaGRfb3V0YihhaGQsIFNFUUNUTDAsIFBFUlJPUkRJU3xGQUlMRElTfEZBU1RNT0RFfExPQURSQU0pOwotCWFoZF9vdXRiKGFoZCwgUFJHTUNOVCwgMCk7Ci0JYWhkX291dGIoYWhkLCBQUkdNQ05UKzEsIDApOworCWFoZF9vdXR3KGFoZCwgUFJHTUNOVCwgMCk7CiAJZm9yIChpID0gMDsgaSA8IG1heF9wcm9nOyBpKyspIHsKIAkJdWludDhfdCBpbnNfYnl0ZXNbNF07CiAKQEAgLTgzNDcsMTMgKzgzOTYsMTQgQEAKIAl1X2ludAlzZ19wcmVmZXRjaF9jbnRfbGltaXQ7CiAJdV9pbnQJc2dfcHJlZmV0Y2hfYWxpZ247CiAJdV9pbnQJc2dfc2l6ZTsKKwl1X2ludAljYWNoZWxpbmVfbWFzazsKIAl1aW50OF90CWRvd25sb2FkX2NvbnN0c1tET1dOTE9BRF9DT05TVF9DT1VOVF07CiAKIAlpZiAoYm9vdHZlcmJvc2UpCiAJCXByaW50ZigiJXM6IERvd25sb2FkaW5nIFNlcXVlbmNlciBQcm9ncmFtLi4uIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCkpOwogCi0jaWYgRE9XTkxPQURfQ09OU1RfQ09VTlQgIT0gNworI2lmIERPV05MT0FEX0NPTlNUX0NPVU5UICE9IDgKICNlcnJvciAiRG93bmxvYWQgQ29uc3QgTWlzbWF0Y2giCiAjZW5kaWYKIAkvKgpAQCAtODM4OSw2ICs4NDM5LDkgQEAKIAkvKiBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIuICovCiAJd2hpbGUgKHBvd2Vyb2YyKHNnX3ByZWZldGNoX2FsaWduKSA9PSAwKQogCQlzZ19wcmVmZXRjaF9hbGlnbi0tOworCisJY2FjaGVsaW5lX21hc2sgPSBzZ19wcmVmZXRjaF9hbGlnbiAtIDE7CisKIAkvKgogCSAqIElmIHRoZSBjYWNoZWxpbmUgYm91bmRhcnkgaXMgZ3JlYXRlciB0aGFuIGhhbGYgb3VyIHByZWZldGNoIFJBTQogCSAqIHdlIHJpc2sgbm90IGJlaW5nIGFibGUgdG8gZmV0Y2ggZXZlbiBhIHNpbmdsZSBjb21wbGV0ZSBTL0cKQEAgLTg0MjksMTIgKzg0ODIsMTIgQEAKIAlkb3dubG9hZF9jb25zdHNbUEtUX09WRVJSVU5fQlVGT0ZGU0VUXSA9CiAJCShhaGQtPm92ZXJydW5fYnVmIC0gKHVpbnQ4X3QgKilhaGQtPnFvdXRmaWZvKSAvIDI1NjsKIAlkb3dubG9hZF9jb25zdHNbU0NCX1RSQU5TRkVSX1NJWkVdID0gU0NCX1RSQU5TRkVSX1NJWkVfMUJZVEVfTFVOOworCWRvd25sb2FkX2NvbnN0c1tDQUNIRUxJTkVfTUFTS10gPSBjYWNoZWxpbmVfbWFzazsKIAljdXJfcGF0Y2ggPSBwYXRjaGVzOwogCWRvd25sb2FkZWQgPSAwOwogCXNraXBfYWRkciA9IDA7CiAJYWhkX291dGIoYWhkLCBTRVFDVEwwLCBQRVJST1JESVN8RkFJTERJU3xGQVNUTU9ERXxMT0FEUkFNKTsKLQlhaGRfb3V0YihhaGQsIFBSR01DTlQsIDApOwotCWFoZF9vdXRiKGFoZCwgUFJHTUNOVCsxLCAwKTsKKwlhaGRfb3V0dyhhaGQsIFBSR01DTlQsIDApOwogCiAJZm9yIChpID0gMDsgaSA8IHNpemVvZihzZXFwcm9nKS80OyBpKyspIHsKIAkJaWYgKGFoZF9jaGVja19wYXRjaChhaGQsICZjdXJfcGF0Y2gsIGksICZza2lwX2FkZHIpID09IDApIHsKQEAgLTg3MjcsNyArODc4MCw3IEBACiAJcHJpbnRmKCI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4gRHVtcCBDYXJkIFN0YXRlIEJlZ2lucyA8PDw8PDw8PDw8PDw8PDw8PFxuIgogCSAgICAgICAiJXM6IER1bXBpbmcgQ2FyZCBTdGF0ZSBhdCBwcm9ncmFtIGFkZHJlc3MgMHgleCBNb2RlIDB4JXhcbiIsCiAJICAgICAgIGFoZF9uYW1lKGFoZCksIAotCSAgICAgICBhaGRfaW5iKGFoZCwgQ1VSQUREUikgfCAoYWhkX2luYihhaGQsIENVUkFERFIrMSkgPDwgOCksCisJICAgICAgIGFoZF9pbncoYWhkLCBDVVJBRERSKSwKIAkgICAgICAgYWhkX2J1aWxkX21vZGVfc3RhdGUoYWhkLCBhaGQtPnNhdmVkX3NyY19tb2RlLAogCQkJCSAgICBhaGQtPnNhdmVkX2RzdF9tb2RlKSk7CiAJaWYgKHBhdXNlZCkKQEAgLTg4NDMsNiArODg5NiwxNSBAQAogCQlzY2JfaW5kZXggPSBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUX0NPTVBMRVRFKTsKIAl9CiAJcHJpbnRmKCJcbiIpOworCXByaW50ZigiU2VxdWVuY2VyIE9uIFFGcmVlemUgYW5kIENvbXBsZXRlIGxpc3Q6ICIpOworCXNjYl9pbmRleCA9IGFoZF9pbncoYWhkLCBDT01QTEVURV9PTl9RRlJFRVpFX0hFQUQpOworCWkgPSAwOworCXdoaWxlICghU0NCSURfSVNfTlVMTChzY2JfaW5kZXgpICYmIGkrKyA8IEFIRF9TQ0JfTUFYKSB7CisJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2NiX2luZGV4KTsKKwkJcHJpbnRmKCIlZCAiLCBzY2JfaW5kZXgpOworCQlzY2JfaW5kZXggPSBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUX0NPTVBMRVRFKTsKKwl9CisJcHJpbnRmKCJcbiIpOwogCWFoZF9zZXRfc2NicHRyKGFoZCwgc2F2ZWRfc2NiX2luZGV4KTsKIAlkZmZzdGF0ID0gYWhkX2luYihhaGQsIERGRlNUQVQpOwogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKQEAgLTkwNzcsNyArOTEzOSw3IEBACiB7CiAJaW50IGNudDsKIAotCWNudCA9IDIwOworCWNudCA9IDUwMDA7CiAJd2hpbGUgKChhaGRfaW5iKGFoZCwgU0VFU1RBVCkgJiAoU0VFQVJCQUNLfFNFRUJVU1kpKSAhPSAwICYmIC0tY250KQogCQlhaGRfZGVsYXkoNSk7CiAKQEAgLTk0MjMsMTMgKzk0ODUsOSBAQAogCQkJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX01VTFRJX1RJRCkgIT0gMCkgewogCQkJCXVfaW50IHRhcmdpZF9tYXNrOwogCi0JCQkJdGFyZ2lkX21hc2sgPSBhaGRfaW5iKGFoZCwgVEFSR0lEKQotCQkJCQkgICAgfCAoYWhkX2luYihhaGQsIFRBUkdJRCArIDEpIDw8IDgpOwotCisJCQkJdGFyZ2lkX21hc2sgPSBhaGRfaW53KGFoZCwgVEFSR0lEKTsKIAkJCQl0YXJnaWRfbWFzayB8PSB0YXJnZXRfbWFzazsKLQkJCQlhaGRfb3V0YihhaGQsIFRBUkdJRCwgdGFyZ2lkX21hc2spOwotCQkJCWFoZF9vdXRiKGFoZCwgVEFSR0lEKzEsICh0YXJnaWRfbWFzayA+PiA4KSk7Ci0JCQkJCisJCQkJYWhkX291dHcoYWhkLCBUQVJHSUQsIHRhcmdpZF9tYXNrKTsKIAkJCQlhaGRfdXBkYXRlX3Njc2lpZChhaGQsIHRhcmdpZF9tYXNrKTsKIAkJCX0gZWxzZSB7CiAJCQkJdV9pbnQgb3VyX2lkOwpAQCAtOTU0MywxNCArOTYwMSw5IEBACiAJCQkJaWYgKGFoZC0+ZmVhdHVyZXMgJiBBSERfTVVMVElfVElEKSB7CiAJCQkJCXVfaW50IHRhcmdpZF9tYXNrOwogCi0JCQkJCXRhcmdpZF9tYXNrID0gYWhkX2luYihhaGQsIFRBUkdJRCkKLQkJCQkJCSAgICB8IChhaGRfaW5iKGFoZCwgVEFSR0lEICsgMSkKLQkJCQkJCSAgICAgICA8PCA4KTsKLQorCQkJCQl0YXJnaWRfbWFzayA9IGFoZF9pbncoYWhkLCBUQVJHSUQpOwogCQkJCQl0YXJnaWRfbWFzayAmPSB+dGFyZ2V0X21hc2s7Ci0JCQkJCWFoZF9vdXRiKGFoZCwgVEFSR0lELCB0YXJnaWRfbWFzayk7Ci0JCQkJCWFoZF9vdXRiKGFoZCwgVEFSR0lEKzEsCi0JCQkJCSAJICh0YXJnaWRfbWFzayA+PiA4KSk7CisJCQkJCWFoZF9vdXR3KGFoZCwgVEFSR0lELCB0YXJnaWRfbWFzayk7CiAJCQkJCWFoZF91cGRhdGVfc2NzaWlkKGFoZCwgdGFyZ2lkX21hc2spOwogCQkJCX0KIAkJCX0KQEAgLTk2NTEsNyArOTcwNCw3IEBACiAKIAkJY21kLT5jbWRfdmFsaWQgPSAwOwogCQlhaGRfZG1hbWFwX3N5bmMoYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsCi0JCQkJYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkJYWhkLT5zaGFyZWRfZGF0YV9tYXAuZG1hbWFwLAogCQkJCWFoZF90YXJnZXRjbWRfb2Zmc2V0KGFoZCwgYWhkLT50cWluZmlmb25leHQpLAogCQkJCXNpemVvZihzdHJ1Y3QgdGFyZ2V0X2NtZCksCiAJCQkJQlVTX0RNQVNZTkNfUFJFUkVBRCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2lubGluZS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9pbmxpbmUuaAppbmRleCBkODBiYzUxLi45MWM0ZjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2lubGluZS5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmgKQEAgLTM3LDcgKzM3LDcgQEAKICAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICoKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eF9pbmxpbmUuaCM1MSAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmgjNTggJAogICoKICAqICRGcmVlQlNEJAogICovCkBAIC01MjIsMTIgKzUyMiwyMSBAQAogc3RhdGljIF9faW5saW5lIHVpbnQxNl90CiBhaGRfaW53KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCkKIHsKKwkvKgorCSAqIFJlYWQgaGlnaCBieXRlIGZpcnN0IGFzIHNvbWUgcmVnaXN0ZXJzIGluY3JlbWVudAorCSAqIG9yIGhhdmUgb3RoZXIgc2lkZSBlZmZlY3RzIHdoZW4gdGhlIGxvdyBieXRlIGlzCisJICogcmVhZC4KKwkgKi8KIAlyZXR1cm4gKChhaGRfaW5iKGFoZCwgcG9ydCsxKSA8PCA4KSB8IGFoZF9pbmIoYWhkLCBwb3J0KSk7CiB9CiAKIHN0YXRpYyBfX2lubGluZSB2b2lkCiBhaGRfb3V0dyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQsIHVfaW50IHZhbHVlKQogeworCS8qCisJICogV3JpdGUgbG93IGJ5dGUgZmlyc3QgdG8gYWNjb21vZGF0ZSByZWdpc3RlcnMKKwkgKiBzdWNoIGFzIFBSR01DTlQgd2hlcmUgdGhlIG9yZGVyIG1hdGVycy4KKwkgKi8KIAlhaGRfb3V0YihhaGQsIHBvcnQsIHZhbHVlICYgMHhGRik7CiAJYWhkX291dGIoYWhkLCBwb3J0KzEsICh2YWx1ZSA+PiA4KSAmIDB4RkYpOwogfQpAQCAtNjg0LDcgKzY5Myw3IEBACiAJICogUmF6b3IgIzUyOAogCSAqLwogCXZhbHVlID0gYWhkX2luYihhaGQsIG9mZnNldCk7Ci0JaWYgKChhaGQtPmZsYWdzICYgQUhEX1BDSVhfU0NCUkFNX1JEX0JVRykgIT0gMCkKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9QQ0lYX1NDQlJBTV9SRF9CVUcpICE9IDApCiAJCWFoZF9pbmIoYWhkLCBNT0RFX1BUUik7CiAJcmV0dXJuICh2YWx1ZSk7CiB9CkBAIC03MjcsNyArNzM2LDggQEAKIHN0YXRpYyBfX2lubGluZSB2b2lkCiBhaGRfc3dhcF93aXRoX25leHRfaHNjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKIHsKLQlzdHJ1Y3QgaGFyZHdhcmVfc2NiICpxX2hzY2I7CisJc3RydWN0CSBoYXJkd2FyZV9zY2IgKnFfaHNjYjsKKwlzdHJ1Y3QJIG1hcF9ub2RlICpxX2hzY2JfbWFwOwogCXVpbnQzMl90IHNhdmVkX2hzY2JfYnVzYWRkcjsKIAogCS8qCkBAIC03NDMsNiArNzUzLDcgQEAKIAkgKiBsb2NhdGUgdGhlIGNvcnJlY3QgU0NCIGJ5IFNDQl9UQUcuCiAJICovCiAJcV9oc2NiID0gYWhkLT5uZXh0X3F1ZXVlZF9oc2NiOworCXFfaHNjYl9tYXAgPSBhaGQtPm5leHRfcXVldWVkX2hzY2JfbWFwOwogCXNhdmVkX2hzY2JfYnVzYWRkciA9IHFfaHNjYi0+aHNjYl9idXNhZGRyOwogCW1lbWNweShxX2hzY2IsIHNjYi0+aHNjYiwgc2l6ZW9mKCpzY2ItPmhzY2IpKTsKIAlxX2hzY2ItPmhzY2JfYnVzYWRkciA9IHNhdmVkX2hzY2JfYnVzYWRkcjsKQEAgLTc1MCw3ICs3NjEsOSBAQAogCiAJLyogTm93IHN3YXAgSFNDQiBwb2ludGVycy4gKi8KIAlhaGQtPm5leHRfcXVldWVkX2hzY2IgPSBzY2ItPmhzY2I7CisJYWhkLT5uZXh0X3F1ZXVlZF9oc2NiX21hcCA9IHNjYi0+aHNjYl9tYXA7CiAJc2NiLT5oc2NiID0gcV9oc2NiOworCXNjYi0+aHNjYl9tYXAgPSBxX2hzY2JfbWFwOwogCiAJLyogTm93IGRlZmluZSB0aGUgbWFwcGluZyBmcm9tIHRhZyB0byBTQ0IgaW4gdGhlIHNjYmluZGV4ICovCiAJYWhkLT5zY2JfZGF0YS5zY2JpbmRleFtTQ0JfR0VUX1RBRyhzY2IpXSA9IHNjYjsKQEAgLTgyNCw4ICs4MzcsOSBAQAogc3RhdGljIF9faW5saW5lIHZvaWQKIGFoZF9zeW5jX3FvdXRmaWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IG9wKQogewotCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwgYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXAsCi0JCQkvKm9mZnNldCovMCwgLypsZW4qL0FIQ19TQ0JfTUFYICogc2l6ZW9mKHVpbnQxNl90KSwgb3ApOworCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwgYWhkLT5zaGFyZWRfZGF0YV9tYXAuZG1hbWFwLAorCQkJLypvZmZzZXQqLzAsCisJCQkvKmxlbiovQUhEX1NDQl9NQVggKiBzaXplb2Yoc3RydWN0IGFoZF9jb21wbGV0aW9uKSwgb3ApOwogfQogCiBzdGF0aWMgX19pbmxpbmUgdm9pZApAQCAtODM0LDcgKzg0OCw3IEBACiAjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCiAJaWYgKChhaGQtPmZsYWdzICYgQUhEX1RBUkdFVFJPTEUpICE9IDApIHsKIAkJYWhkX2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LAotCQkJCWFoZC0+c2hhcmVkX2RhdGFfZG1hbWFwLAorCQkJCWFoZC0+c2hhcmVkX2RhdGFfbWFwLmRtYW1hcCwKIAkJCQlhaGRfdGFyZ2V0Y21kX29mZnNldChhaGQsIDApLAogCQkJCXNpemVvZihzdHJ1Y3QgdGFyZ2V0X2NtZCkgKiBBSERfVE1PREVfQ01EUywKIAkJCQlvcCk7CkBAIC04NTQsMTcgKzg2OCwxNyBAQAogCXVfaW50IHJldHZhbDsKIAogCXJldHZhbCA9IDA7Ci0JYWhkX2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LCBhaGQtPnNoYXJlZF9kYXRhX2RtYW1hcCwKLQkJCS8qb2Zmc2V0Ki9haGQtPnFvdXRmaWZvbmV4dCwgLypsZW4qLzIsCi0JCQlCVVNfRE1BU1lOQ19QT1NUUkVBRCk7Ci0JaWYgKChhaGQtPnFvdXRmaWZvW2FoZC0+cW91dGZpZm9uZXh0XQotCSAgICAgJiBRT1VURklGT19FTlRSWV9WQUxJRF9MRSkgPT0gYWhkLT5xb3V0Zmlmb25leHRfdmFsaWRfdGFnKQorCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwgYWhkLT5zaGFyZWRfZGF0YV9tYXAuZG1hbWFwLAorCQkJLypvZmZzZXQqL2FoZC0+cW91dGZpZm9uZXh0ICogc2l6ZW9mKCphaGQtPnFvdXRmaWZvKSwKKwkJCS8qbGVuKi9zaXplb2YoKmFoZC0+cW91dGZpZm8pLCBCVVNfRE1BU1lOQ19QT1NUUkVBRCk7CisJaWYgKGFoZC0+cW91dGZpZm9bYWhkLT5xb3V0Zmlmb25leHRdLnZhbGlkX3RhZworCSAgPT0gYWhkLT5xb3V0Zmlmb25leHRfdmFsaWRfdGFnKQogCQlyZXR2YWwgfD0gQUhEX1JVTl9RT1VURklGTzsKICNpZmRlZiBBSERfVEFSR0VUX01PREUKIAlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfVEFSR0VUUk9MRSkgIT0gMAogCSAmJiAoYWhkLT5mbGFncyAmIEFIRF9UUUlORklGT19CTE9DS0VEKSA9PSAwKSB7CiAJCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwKLQkJCQlhaGQtPnNoYXJlZF9kYXRhX2RtYW1hcCwKKwkJCQlhaGQtPnNoYXJlZF9kYXRhX21hcC5kbWFtYXAsCiAJCQkJYWhkX3RhcmdldGNtZF9vZmZzZXQoYWhkLCBhaGQtPnRxaW5maWZvZm5leHQpLAogCQkJCS8qbGVuKi9zaXplb2Yoc3RydWN0IHRhcmdldF9jbWQpLAogCQkJCUJVU19ETUFTWU5DX1BPU1RSRUFEKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jCmluZGV4IDFjOGY4NzIuLjI1NjdlMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYwpAQCAtMTQ2OCw2ICsxNDY4LDMwIEBACiAJaWYgKCh0c3RhdGUtPmF1dG9fbmVnb3RpYXRlICYgbWFzaykgIT0gMCkgewogCQlzY2ItPmZsYWdzIHw9IFNDQl9BVVRPX05FR09USUFURTsKIAkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CisJCX0gZWxzZSBpZiAoY21kLT5jbW5kWzBdID09IElOUVVJUlkKKwkJCSYmICh0aW5mby0+Y3Vyci5vZmZzZXQgIT0gMAorCQkJIHx8IHRpbmZvLT5jdXJyLndpZHRoICE9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQKKwkJCSB8fCB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAhPSAwKQorCQkJJiYgKHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKT09MCkgeworCQkJLyoKKwkJCSAqIFRoZSBTQ1NJIHNwZWMgcmVxdWlyZXMgaW5xdWlyeQorCQkJICogY29tbWFuZHMgdG8gY29tcGxldGUgd2l0aG91dAorCQkJICogcmVwb3J0aW5nIHVuaXQgYXR0ZW50aW9uIGNvbmRpdGlvbnMuCisJCQkgKiBCZWNhdXNlIG9mIHRoaXMsIGFuIGlucXVpcnkgY29tbWFuZAorCQkJICogdGhhdCBvY2N1cnMganVzdCBhZnRlciBhIGRldmljZSBpcworCQkJICogcmVzZXQgd2lsbCByZXN1bHQgaW4gYSBkYXRhIHBoYXNlCisJCQkgKiB3aXRoIG1pc21hdGNoZWQgbmVnb3RpYXRlZCByYXRlcy4KKwkJCSAqIFRoZSBjb3JlIGFscmVhZHkgZm9yY2VzIGEgcmVuZWdvdGlhdGlvbgorCQkJICogZm9yIHJlc2V0IGV2ZW50cyB0aGF0IGFyZSB2aXNpYmxlIHRvCisJCQkgKiBvdXIgY29udHJvbGxlciBvciB0aGF0IHdlIGluaXRpYXRlLAorCQkJICogYnV0IGEgdGhpcmQgcGFydHkgZGV2aWNlIHJlc2V0IG9yIGEKKwkJCSAqIGhvdC1wbHVnIGluc2VydGlvbiBjYW4gc3RpbGwgY2F1c2UgdGhpcworCQkJICogaXNzdWUuICBUaGVyZWZvcmUsIHdlIGZvcmNlIGEgcmUtbmVnb3RpYXRpb24KKwkJCSAqIGZvciBldmVyeSBpbnF1aXJ5IGNvbW1hbmQgdW5sZXNzIHdlCisJCQkgKiBhcmUgYXN5bmMuCisJCQkgKi8KKwkJCXNjYi0+ZmxhZ3MgfD0gU0NCX05FR09USUFURTsKKwkJCXNjYi0+aHNjYi0+Y29udHJvbCB8PSBNS19NRVNTQUdFOwogCX0KIAogCWlmICgoZGV2LT5mbGFncyAmIChBSERfREVWX1FfVEFHR0VEfEFIRF9ERVZfUV9CQVNJQykpICE9IDApIHsKQEAgLTIwNTgsNiArMjA4Miw3IEBACiAJaW50ICAgIHBhdXNlZDsKIAlpbnQgICAgd2FpdDsKIAlpbnQgICAgZGlzY29ubmVjdGVkOworCWludCAgICBmb3VuZDsKIAlhaGRfbW9kZV9zdGF0ZSBzYXZlZF9tb2RlczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yMTc2LDcgKzIyMDEsOCBAQAogCWxhc3RfcGhhc2UgPSBhaGRfaW5iKGFoZCwgTEFTVFBIQVNFKTsKIAlzYXZlZF9zY2JwdHIgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOwogCWFjdGl2ZV9zY2JwdHIgPSBzYXZlZF9zY2JwdHI7Ci0JaWYgKGRpc2Nvbm5lY3RlZCAmJiAoYWhkX2luYihhaGQsIFNFUV9GTEFHUykgJiBOT1RfSURFTlRJRklFRCkgPT0gMCkgeworCWlmIChkaXNjb25uZWN0ZWQgJiYgKChsYXN0X3BoYXNlICE9IFBfQlVTRlJFRSkgfHwgCisJCQkgICAgIChhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTKSAmIE5PVF9JREVOVElGSUVEKSA9PSAwKSkgewogCQlzdHJ1Y3Qgc2NiICpidXNfc2NiOwogCiAJCWJ1c19zY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIGFjdGl2ZV9zY2JwdHIpOwpAQCAtMjE5NCwyOCArMjIyMCw0MSBAQAogCSAqIGJ1cyBvciBpcyBpbiB0aGUgZGlzY29ubmVjdGVkIHN0YXRlLgogCSAqLwogCXNhdmVkX3Njc2lpZCA9IGFoZF9pbmIoYWhkLCBTQVZFRF9TQ1NJSUQpOwotCWlmIChsYXN0X3BoYXNlICE9IFBfQlVTRlJFRQotCSAmJiAoU0NCX0dFVF9UQUcocGVuZGluZ19zY2IpID09IGFjdGl2ZV9zY2JwdHIKKwlpZiAoU0NCX0dFVF9UQUcocGVuZGluZ19zY2IpID09IGFjdGl2ZV9zY2JwdHIKIAkgICAgIHx8IChmbGFnID09IFNDQl9ERVZJQ0VfUkVTRVQKLQkJICYmIFNDU0lJRF9UQVJHRVQoYWhkLCBzYXZlZF9zY3NpaWQpID09IHNjbWRfaWQoY21kKSkpKSB7CisJCSAmJiBTQ1NJSURfVEFSR0VUKGFoZCwgc2F2ZWRfc2NzaWlkKSA9PSBzY21kX2lkKGNtZCkpKSB7CiAKIAkJLyoKIAkJICogV2UncmUgYWN0aXZlIG9uIHRoZSBidXMsIHNvIGFzc2VydCBBVE4KIAkJICogYW5kIGhvcGUgdGhhdCB0aGUgdGFyZ2V0IHJlc3BvbmRzLgogCQkgKi8KIAkJcGVuZGluZ19zY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIGFjdGl2ZV9zY2JwdHIpOwotCQlwZW5kaW5nX3NjYi0+ZmxhZ3MgfD0gU0NCX1JFQ09WRVJZX1NDQnxmbGFnOworCQlwZW5kaW5nX3NjYi0+ZmxhZ3MgfD0gU0NCX1JFQ09WRVJZX1NDQnxTQ0JfREVWSUNFX1JFU0VUOwogCQlhaGRfb3V0YihhaGQsIE1TR19PVVQsIEhPU1RfTVNHKTsKIAkJYWhkX291dGIoYWhkLCBTQ1NJU0lHTywgbGFzdF9waGFzZXxBVE5PKTsKLQkJc2NtZF9wcmludGsoS0VSTl9JTkZPLCBjbWQsICJEZXZpY2UgaXMgYWN0aXZlLCBhc3NlcnRpbmcgQVROXG4iKTsKKwkJc2NtZF9wcmludGsoS0VSTl9JTkZPLCBjbWQsICJCRFIgbWVzc2FnZSBpbiBtZXNzYWdlIGJ1ZmZlclxuIik7CiAJCXdhaXQgPSBUUlVFOworCX0gZWxzZSBpZiAobGFzdF9waGFzZSAhPSBQX0JVU0ZSRUUKKwkJICAgJiYgYWhkX2luYihhaGQsIFNDU0lQSEFTRSkgPT0gMCkgeworCQkvKgorCQkgKiBTQ0IgaXMgbm90IGlkZW50aWZpZWQsIHRoZXJlCisJCSAqIGlzIG5vIHBlbmRpbmcgUkVRLCBhbmQgdGhlIHNlcXVlbmNlcgorCQkgKiBoYXMgbm90IHNlZW4gYSBidXNmcmVlLiAgTG9va3MgbGlrZQorCQkgKiBhIHN0dWNrIGNvbm5lY3Rpb24gd2FpdGluZyB0bworCQkgKiBnbyBidXNmcmVlLiAgUmVzZXQgdGhlIGJ1cy4KKwkJICovCisJCWZvdW5kID0gYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKKwkJCQkJICAvKkluaXRpYXRlIFJlc2V0Ki9UUlVFKTsKKwkJcHJpbnRmKCIlczogSXNzdWVkIENoYW5uZWwgJWMgQnVzIFJlc2V0LiAiCisJCSAgICAgICAiJWQgU0NCcyBhYm9ydGVkXG4iLCBhaGRfbmFtZShhaGQpLAorCQkgICAgICAgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsIGZvdW5kKTsKIAl9IGVsc2UgaWYgKGRpc2Nvbm5lY3RlZCkgewogCiAJCS8qCiAJCSAqIEFjdHVhbGx5IHJlLXF1ZXVlIHRoaXMgU0NCIGluIGFuIGF0dGVtcHQKIAkJICogdG8gc2VsZWN0IHRoZSBkZXZpY2UgYmVmb3JlIGl0IHJlY29ubmVjdHMuCiAJCSAqLwotCQlwZW5kaW5nX3NjYi0+ZmxhZ3MgfD0gU0NCX1JFQ09WRVJZX1NDQnxTQ0JfQUJPUlQ7CisJCXBlbmRpbmdfc2NiLT5mbGFncyB8PSBTQ0JfUkVDT1ZFUllfU0NCfGZsYWc7CiAJCWFoZF9zZXRfc2NicHRyKGFoZCwgU0NCX0dFVF9UQUcocGVuZGluZ19zY2IpKTsKIAkJcGVuZGluZ19zY2ItPmhzY2ItPmNkYl9sZW4gPSAwOwogCQlwZW5kaW5nX3NjYi0+aHNjYi0+dGFza19hdHRyaWJ1dGUgPSAwOwpAQCAtMjI5NiwxNiArMjMzNSwxNyBAQAogCQl0aW1lci5leHBpcmVzID0gamlmZmllcyArICg1ICogSFopOwogCQl0aW1lci5mdW5jdGlvbiA9IGFoZF9saW51eF9zZW1fdGltZW91dDsKIAkJYWRkX3RpbWVyKCZ0aW1lcik7Ci0JCXByaW50ZigiUmVjb3ZlcnkgY29kZSBzbGVlcGluZ1xuIik7CisJCXByaW50ZigiJXM6IFJlY292ZXJ5IGNvZGUgc2xlZXBpbmdcbiIsIGFoZF9uYW1lKGFoZCkpOwogCQlkb3duKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7Ci0JCXByaW50ZigiUmVjb3ZlcnkgY29kZSBhd2FrZVxuIik7CisJCXByaW50ZigiJXM6IFJlY292ZXJ5IGNvZGUgYXdha2VcbiIsIGFoZF9uYW1lKGFoZCkpOwogICAgICAgICAJcmV0ID0gZGVsX3RpbWVyX3N5bmMoJnRpbWVyKTsKIAkJaWYgKHJldCA9PSAwKSB7Ci0JCQlwcmludGYoIlRpbWVyIEV4cGlyZWRcbiIpOworCQkJcHJpbnRmKCIlczogVGltZXIgRXhwaXJlZCAoYWN0aXZlICVkKVxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXYtPmFjdGl2ZSk7CiAJCQlyZXR2YWwgPSBGQUlMRUQ7CiAJCX0KIAl9Ci0JCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOworCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOwogCXJldHVybiAocmV0dmFsKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmgKaW5kZXggYmM0NDIyMi4uY2I3NGZjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oCkBAIC0yNTIsNyArMjUyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTTVAgc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAotI2RlZmluZSBBSUM3OVhYX0RSSVZFUl9WRVJTSU9OICIxLjMuMTEiCisjZGVmaW5lIEFJQzc5WFhfRFJJVkVSX1ZFUlNJT04gIjMuMCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXZpY2UgRGF0YSBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wY2kuYwppbmRleCAyMTMxZGI2Li4xOTZhNjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmMKQEAgLTM4LDkgKzM4LDcgQEAKICAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICoKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eF9wY2kuYyM3NyAkCi0gKgotICogJEZyZWVCU0QkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHhfcGNpLmMjODkgJAogICovCiAKICNpZmRlZiBfX2xpbnV4X18KQEAgLTExNCw2ICsxMTIsMTMgQEAKIAkJIkFkYXB0ZWMgMjkzMjBBTFAgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKIAkJYWhkX2FpYzc5MDFfc2V0dXAKIAl9LAorCS8qIGFpYzc5MDFBIGJhc2VkIGNvbnRyb2xsZXJzICovCisJeworCQlJRF9BSEFfMjkzMjBMUCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDI5MzIwTFAgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhkX2FpYzc5MDFBX3NldHVwCisJfSwKIAkvKiBhaWM3OTAyIGJhc2VkIGNvbnRyb2xsZXJzICovCQogCXsKIAkJSURfQUhBXzI5MzIwLApAQCAtMTI4LDEyICsxMzMsNiBAQAogCQlhaGRfYWljNzkwMl9zZXR1cAogCX0sCiAJewotCQlJRF9BSEFfMjkzMjBMUCwKLQkJSURfQUxMX01BU0ssCi0JCSJBZGFwdGVjIDI5MzIwTFAgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKLQkJYWhkX2FpYzc5MDFBX3NldHVwCi0JfSwKLQl7CiAJCUlEX0FIQV8zOTMyMCwKIAkJSURfQUxMX01BU0ssCiAJCSJBZGFwdGVjIDM5MzIwIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCkBAIC0xNDYsNiArMTQ1LDEyIEBACiAJCWFoZF9haWM3OTAyX3NldHVwCiAJfSwKIAl7CisJCUlEX0FIQV8zOTMyMF9CX0RFTEwsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAoRGVsbCBPRU0pIDM5MzIwIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCisJCWFoZF9haWM3OTAyX3NldHVwCisJfSwKKwl7CiAJCUlEX0FIQV8zOTMyMEEsCiAJCUlEX0FMTF9NQVNLLAogCQkiQWRhcHRlYyAzOTMyMEEgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKQEAgLTY2OCw2ICs2NzMsNyBAQAogCSAqIE5vdyBzZXQgdGhlIHRlcm1pbmF0aW9uIGJhc2VkIG9uIHdoYXQgd2UgZm91bmQuCiAJICovCiAJc3hmcmN0bDEgPSBhaGRfaW5iKGFoZCwgU1hGUkNUTDEpICYgflNUUFdFTjsKKwlhaGQtPmZsYWdzICY9IH5BSERfVEVSTV9FTkJfQTsKIAlpZiAoKHRlcm1jdGwgJiBGTFhfVEVSTUNUTF9FTlBSSUxPVykgIT0gMCkgewogCQlhaGQtPmZsYWdzIHw9IEFIRF9URVJNX0VOQl9BOwogCQlzeGZyY3RsMSB8PSBTVFBXRU47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wY2kuaAppbmRleCBiNWNmZWFiLi5kYTQ1MTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmgKQEAgLTUzLDE0ICs1MywxNSBAQAogI2RlZmluZSBJRF9BSEFfMjkzMjBBTFAJCQkweDgwMTc5MDA1MDA0NDkwMDV1bGwKIAogI2RlZmluZSBJRF9BSUM3OTAxQQkJCTB4ODAxRTkwMDVGRkZGOTAwNXVsbAotI2RlZmluZSBJRF9BSEFfMjkzMjAJCQkweDgwMTI5MDA1MDA0MjkwMDV1bGwKLSNkZWZpbmUgSURfQUhBXzI5MzIwQgkJCTB4ODAxMzkwMDUwMDQzOTAwNXVsbAogI2RlZmluZSBJRF9BSEFfMjkzMjBMUAkJCTB4ODAxNDkwMDUwMDQ0OTAwNXVsbAogCiAjZGVmaW5lIElEX0FJQzc5MDIJCQkweDgwMUY5MDA1RkZGRjkwMDV1bGwKICNkZWZpbmUgSURfQUlDNzkwMl9CCQkJMHg4MDFEOTAwNUZGRkY5MDA1dWxsCiAjZGVmaW5lIElEX0FIQV8zOTMyMAkJCTB4ODAxMDkwMDUwMDQwOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMjkzMjAJCQkweDgwMTI5MDA1MDA0MjkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5MzIwQgkJCTB4ODAxMzkwMDUwMDQzOTAwNXVsbAogI2RlZmluZSBJRF9BSEFfMzkzMjBfQgkJCTB4ODAxNTkwMDUwMDQwOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzkzMjBfQl9ERUxMCQkweDgwMTU5MDA1MDE2ODEwMjh1bGwKICNkZWZpbmUgSURfQUhBXzM5MzIwQQkJCTB4ODAxNjkwMDUwMDQwOTAwNXVsbAogI2RlZmluZSBJRF9BSEFfMzkzMjBECQkJMHg4MDExOTAwNTAwNDE5MDA1dWxsCiAjZGVmaW5lIElEX0FIQV8zOTMyMERfQgkJCTB4ODAxQzkwMDUwMDQxOTAwNXVsbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9yZWcuaF9zaGlwcGVkIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9yZWcuaF9zaGlwcGVkCmluZGV4IGMwMWFjMzkuLjg3NjNiMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcmVnLmhfc2hpcHBlZAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3JlZy5oX3NoaXBwZWQKQEAgLTIsOCArMiw4IEBACiAgKiBETyBOT1QgRURJVCAtIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAogICoJCSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlIGZpbGVzOgogICoKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5zZXEjOTQgJAotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnJlZyM3MCAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguc2VxIzExOSAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHgucmVnIzc2ICQKICAqLwogdHlwZWRlZiBpbnQgKGFoZF9yZWdfcHJpbnRfdCkodV9pbnQsIHVfaW50ICosIHVfaW50KTsKIHR5cGVkZWYgc3RydWN0IGFoZF9yZWdfcGFyc2VfZW50cnkgewpAQCAtODMsMTMgKzgzLDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9jbHJzZXFpbnRzdGF0X3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX2NscnNlcWludHN0YXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNMUlNFUUlOVFNUQVQiLCAweDBjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9zZXFpbnRzdGF0X3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX3NlcWludHN0YXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTk3LDYgKzkwLDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfY2xyc2VxaW50c3RhdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbHJzZXFpbnRzdGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTRVFJTlRTVEFUIiwgMHgwYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfc3d0aW1lcl9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9zd3RpbWVyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC00MTIsMTMgKzQxMiw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfYnVzaW5pdGlkX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX2J1c2luaXRpZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQlVTSU5JVElEIiwgMHgzYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfZGxjb3VudF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9kbGNvdW50X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC00MjYsNiArNDE5LDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfYnVzaW5pdGlkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2J1c2luaXRpZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQlVTSU5JVElEIiwgMHgzYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfc3hmcmN0bDFfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfc3hmcmN0bDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTUxNywxMyArNTE3LDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9zYmxrY3RsX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX3NibGtjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNCTEtDVEwiLCAweDRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9vcHRpb25tb2RlX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX29wdGlvbm1vZGVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTUzMSwxMCArNTI0LDEwIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfc3N0YXQwX3ByaW50OworYWhkX3JlZ19wcmludF90IGFoZF9zYmxrY3RsX3ByaW50OwogI2Vsc2UKLSNkZWZpbmUgYWhkX3NzdGF0MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU1NUQVQwIiwgMHg0YiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZGVmaW5lIGFoZF9zYmxrY3RsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQkxLQ1RMIiwgMHg0YSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKQEAgLTU0NSw2ICs1MzgsMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zc3RhdDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc3N0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTU1RBVDAiLCAweDRiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9zaW1vZGUwX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX3NpbW9kZTBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTU3MywxMyArNTczLDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9jbHJzaW50Ml9wcmludDsKLSNlbHNlCi0jZGVmaW5lIGFoZF9jbHJzaW50Ml9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSU0lOVDIiLCAweDRkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9zaW1vZGUyX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX3NpbW9kZTJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTU4Nyw2ICs1ODAsMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9jbHJzaW50Ml9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbHJzaW50Ml9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSU0lOVDIiLCAweDRkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9wZXJyZGlhZ19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9wZXJyZGlhZ19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtNjg1LDEzICs2ODUsNiBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX2xxb21vZGUwX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX2xxb21vZGUwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9NT0RFMCIsIDB4NTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQotI2VuZGlmCi0KLSNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2xxb3N0YXQwX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2xxb3N0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC03MDYsNiArNjk5LDIwIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfbHFvbW9kZTBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbHFvbW9kZTBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRT01PREUwIiwgMHg1NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfbHFvbW9kZTFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbHFvbW9kZTFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRT01PREUxIiwgMHg1NSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfbHFvc3RhdDFfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfbHFvc3RhdDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTcyMCwxMyArNzI3LDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9scW9tb2RlMV9wcmludDsKLSNlbHNlCi0jZGVmaW5lIGFoZF9scW9tb2RlMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTFFPTU9ERTEiLCAweDU1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9scW9zdGF0Ml9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9scW9zdGF0Ml9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtOTA5LDEzICs5MDksNiBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX3Njc2Noa25fcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfc2NzY2hrbl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTQ0hLTiIsIDB4NjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQotI2VuZGlmCi0KLSNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2FubmV4ZGF0X3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2FubmV4ZGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC05MjMsNiArOTE2LDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NzY2hrbl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY3NjaGtuX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NDSEtOIiwgMHg2NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfaW93bmlkX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2lvd25pZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTAwMCwxMyArMTAwMCw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfcGxsNDAwY250MF9wcmludDsKLSNlbHNlCi0jZGVmaW5lIGFoZF9wbGw0MDBjbnQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJQTEw0MDBDTlQwIiwgMHg2ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfdW5mYWlybmVzc19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF91bmZhaXJuZXNzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMDE0LDYgKzEwMDcsMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9wbGw0MDBjbnQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3BsbDQwMGNudDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlBMTDQwMENOVDAiLCAweDZlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9oYWRkcl9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9oYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTA1NiwxMyArMTA1Niw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfc2doYWRkcl9wcmludDsKLSNlbHNlCi0jZGVmaW5lIGFoZF9zZ2hhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR0hBRERSIiwgMHg3YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfc2NiaGFkZHJfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfc2NiaGFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTEwNzAsMTAgKzEwNjMsMTAgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9zZ2hjbnRfcHJpbnQ7CithaGRfcmVnX3ByaW50X3QgYWhkX3NnaGFkZHJfcHJpbnQ7CiAjZWxzZQotI2RlZmluZSBhaGRfc2doY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR0hDTlQiLCAweDg0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNkZWZpbmUgYWhkX3NnaGFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHSEFERFIiLCAweDdjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwpAQCAtMTA4NCw2ICsxMDc3LDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2doY250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NnaGNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0dIQ05UIiwgMHg4NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfZGZmX3RocnNoX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2RmZl90aHJzaF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTE1NCwxMyArMTE1NCw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfZGNocnhtc2cxX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX2RjaHJ4bXNnMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRENIUlhNU0cxIiwgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfY21jcnhtc2cxX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2NtY3J4bXNnMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTE2OCw2ICsxMTYxLDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfZGNocnhtc2cxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2RjaHJ4bXNnMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRENIUlhNU0cxIiwgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfZGNocnhtc2cyX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2RjaHJ4bXNnMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTE3NSwxMyArMTE3NSw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfb3ZseXJ4bXNnMl9wcmludDsKLSNlbHNlCi0jZGVmaW5lIGFoZF9vdmx5cnhtc2cyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJPVkxZUlhNU0cyIiwgMHg5MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfY21jcnhtc2cyX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2NtY3J4bXNnMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTE5Niw2ICsxMTg5LDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfb3ZseXJ4bXNnMl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9vdmx5cnhtc2cyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJPVkxZUlhNU0cyIiwgMHg5MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfZGNocnhtc2czX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2RjaHJ4bXNnM19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTIwMyw2ICsxMjAzLDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfb3ZseXJ4bXNnM19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9vdmx5cnhtc2czX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJPVkxZUlhNU0czIiwgMHg5MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfY21jcnhtc2czX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2NtY3J4bXNnM19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTIxNywxMyArMTIyNCw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfb3ZseXJ4bXNnM19wcmludDsKLSNlbHNlCi0jZGVmaW5lIGFoZF9vdmx5cnhtc2czX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJPVkxZUlhNU0czIiwgMHg5MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfb3ZseXNlcWJjbnRfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfb3ZseXNlcWJjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTEyMzEsMTMgKzEyMzEsNiBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX2NtY3NlcWJjbnRfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfY21jc2VxYmNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01DU0VRQkNOVCIsIDB4OTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQotI2VuZGlmCi0KLSNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2RjaHNlcWJjbnRfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfZGNoc2VxYmNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTI0NSw2ICsxMjM4LDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfY21jc2VxYmNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNzZXFiY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTUNTRVFCQ05UIiwgMHg5NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfY21jc3BsdHN0YXQwX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2NtY3NwbHRzdGF0MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTI1MiwxMyArMTI1Miw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfb3ZseXNwbHRzdGF0MF9wcmludDsKLSNlbHNlCi0jZGVmaW5lIGFoZF9vdmx5c3BsdHN0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJPVkxZU1BMVFNUQVQwIiwgMHg5NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfZGNoc3BsdHN0YXQwX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2RjaHNwbHRzdGF0MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTI2NiwxMCArMTI1OSwxMCBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX2RjaHNwbHRzdGF0MV9wcmludDsKK2FoZF9yZWdfcHJpbnRfdCBhaGRfb3ZseXNwbHRzdGF0MF9wcmludDsKICNlbHNlCi0jZGVmaW5lIGFoZF9kY2hzcGx0c3RhdDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFNQTFRTVEFUMSIsIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2RlZmluZSBhaGRfb3ZseXNwbHRzdGF0MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVNQTFRTVEFUMCIsIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCkBAIC0xMjg3LDYgKzEyODAsMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9kY2hzcGx0c3RhdDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGNoc3BsdHN0YXQxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJEQ0hTUExUU1RBVDEiLCAweDk3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9zZ3J4bXNnMF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9zZ3J4bXNnMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTM3OCwxMyArMTM3OCw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfc2Z1bmN0X3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX3NmdW5jdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0ZVTkNUIiwgMHg5ZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfc2dzcGx0c3RhdDFfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfc2dzcGx0c3RhdDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTEzOTIsNiArMTM4NSwxMyBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NmdW5jdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZnVuY3RfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNGVU5DVCIsIDB4OWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2RmMHBjaXN0YXRfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfZGYwcGNpc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTUwNCwxMyArMTUwNCw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfY2NzY2JhZGRyX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX2Njc2NiYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTQ0JBRERSIiwgMHhhYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfY2NzY2JhZHJfYmtfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfY2NzY2JhZHJfYmtfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTE1MTgsNiArMTUxMSwxMyBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2NiYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jY3NjYmFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQUREUiIsIDB4YWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2NtY19yYW1iaXN0X3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2NtY19yYW1iaXN0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xNTI1LDEzICsxNTI1LDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9jY3NnY3RsX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX2Njc2djdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0dDVEwiLCAweGFkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9jY3NjYmN0bF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9jY3NjYmN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTUzOSw2ICsxNTMyLDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfY2NzZ2N0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jY3NnY3RsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NHQ1RMIiwgMHhhZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfY2NzZ3JhbV9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9jY3NncmFtX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xNzA3LDEzICsxNzA3LDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9kZnB0cnNfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfZGZwdHJzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERlBUUlMiLCAweGM4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9yY3ZyYmlhc2NhbGNfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfcmN2cmJpYXNjYWxjX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xNzIxLDEwICsxNzE0LDEwIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfZGZia3B0cl9wcmludDsKK2FoZF9yZWdfcHJpbnRfdCBhaGRfZGZwdHJzX3ByaW50OwogI2Vsc2UKLSNkZWZpbmUgYWhkX2RmYmtwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGQktQVFIiLCAweGM5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNkZWZpbmUgYWhkX2RmcHRyc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZQVFJTIiwgMHhjOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKQEAgLTE3MzUsNiArMTcyOCwxMyBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmYmtwdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZia3B0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZCS1BUUiIsIDB4YzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2RmZGJjdGxfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfZGZkYmN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTgyNiwxMyArMTgyNiw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfYnJrYWRkcjFfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfYnJrYWRkcjFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSS0FERFIxIiwgMHhlNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfYnJrYWRkcjBfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfYnJrYWRkcjBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTE4NDAsNiArMTgzMywxMyBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Jya2FkZHIxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Jya2FkZHIxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJCUktBRERSMSIsIDB4ZTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2FsbG9uZXNfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfYWxsb25lc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTg4OSwxMyArMTg4OSw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfY3VyYWRkcl9wcmludDsKLSNlbHNlCi0jZGVmaW5lIGFoZF9jdXJhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDVVJBRERSIiwgMHhmNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfaW50dmVjMV9hZGRyX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2ludHZlYzFfYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTkwMywxMCArMTg5NiwxMCBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX2ludHZlYzJfYWRkcl9wcmludDsKK2FoZF9yZWdfcHJpbnRfdCBhaGRfY3VyYWRkcl9wcmludDsKICNlbHNlCi0jZGVmaW5lIGFoZF9pbnR2ZWMyX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVFZFQzJfQUREUiIsIDB4ZjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2RlZmluZSBhaGRfY3VyYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ1VSQUREUiIsIDB4ZjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCkBAIC0xOTE3LDYgKzE5MTAsMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9pbnR2ZWMyX2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaW50dmVjMl9hZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRWRUMyX0FERFIiLCAweGY2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9sb25nam1wX2FkZHJfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfbG9uZ2ptcF9hZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xOTk0LDE5MiArMTk5NCwyMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9jb21wbGV0ZV9kbWFfc2NiX3RhaWxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY29tcGxldGVfZG1hX3NjYl90YWlsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDT01QTEVURV9ETUFfU0NCX1RBSUwiLCAweDEyZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfY29tcGxldGVfb25fcWZyZWV6ZV9oZWFkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NvbXBsZXRlX29uX3FmcmVlemVfaGVhZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfT05fUUZSRUVaRV9IRUFEIiwgMHgxMzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3FmcmVlemVfY291bnRfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfcWZyZWV6ZV9jb3VudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUUZSRUVaRV9DT1VOVCIsIDB4MTJlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlFGUkVFWkVfQ09VTlQiLCAweDEzMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfa2VybmVsX3FmcmVlemVfY291bnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfa2VybmVsX3FmcmVlemVfY291bnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIktFUk5FTF9RRlJFRVpFX0NPVU5UIiwgMHgxMzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3NhdmVkX21vZGVfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfc2F2ZWRfbW9kZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0FWRURfTU9ERSIsIDB4MTMwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX01PREUiLCAweDEzNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfbXNnX291dF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9tc2dfb3V0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNU0dfT1VUIiwgMHgxMzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTVNHX09VVCIsIDB4MTM3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9kbWFwYXJhbXNfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfZG1hcGFyYW1zX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJETUFQQVJBTVMiLCAweDEzMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJETUFQQVJBTVMiLCAweDEzOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfc2VxX2ZsYWdzX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX3NlcV9mbGFnc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRX0ZMQUdTIiwgMHgxMzMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRX0ZMQUdTIiwgMHgxMzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3NhdmVkX3Njc2lpZF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9zYXZlZF9zY3NpaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX1NDU0lJRCIsIDB4MTM0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX1NDU0lJRCIsIDB4MTNhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9zYXZlZF9sdW5fcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfc2F2ZWRfbHVuX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQVZFRF9MVU4iLCAweDEzNSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQVZFRF9MVU4iLCAweDEzYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfbGFzdHBoYXNlX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2xhc3RwaGFzZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTEFTVFBIQVNFIiwgMHgxMzYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTEFTVFBIQVNFIiwgMHgxM2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3FvdXRmaWZvX2VudHJ5X3ZhbGlkX3RhZ19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9xb3V0Zmlmb19lbnRyeV92YWxpZF90YWdfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlFPVVRGSUZPX0VOVFJZX1ZBTElEX1RBRyIsIDB4MTM3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9zaGFyZWRfZGF0YV9hZGRyX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX3NoYXJlZF9kYXRhX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNIQVJFRF9EQVRBX0FERFIiLCAweDEzOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfcW91dGZpZm9fbmV4dF9hZGRyX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX3FvdXRmaWZvX25leHRfYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVEZJRk9fTkVYVF9BRERSIiwgMHgxM2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHIiwgMHgxM2QsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2tlcm5lbF90cWlucG9zX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2tlcm5lbF90cWlucG9zX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJLRVJORUxfVFFJTlBPUyIsIDB4MTQwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIktFUk5FTF9UUUlOUE9TIiwgMHgxM2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3RxaW5wb3NfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfdHFpbnBvc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVFFJTlBPUyIsIDB4MTQxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRRSU5QT1MiLCAweDEzZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2hhcmVkX2RhdGFfYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zaGFyZWRfZGF0YV9hZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSEFSRURfREFUQV9BRERSIiwgMHgxNDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3FvdXRmaWZvX25leHRfYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9xb3V0Zmlmb19uZXh0X2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlFPVVRGSUZPX05FWFRfQUREUiIsIDB4MTQ0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9hcmdfMV9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9hcmdfMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQVJHXzEiLCAweDE0MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBUkdfMSIsIDB4MTQ4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9hcmdfMl9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9hcmdfMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQVJHXzIiLCAweDE0MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBUkdfMiIsIDB4MTQ5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9sYXN0X21zZ19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9sYXN0X21zZ19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTEFTVF9NU0ciLCAweDE0NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUX01TRyIsIDB4MTRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9zY3Npc2VxX3RlbXBsYXRlX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX3Njc2lzZXFfdGVtcGxhdGVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lTRVFfVEVNUExBVEUiLCAweDE0NSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0VRX1RFTVBMQVRFIiwgMHgxNGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2luaXRpYXRvcl90YWdfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfaW5pdGlhdG9yX3RhZ19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5JVElBVE9SX1RBRyIsIDB4MTQ2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOSVRJQVRPUl9UQUciLCAweDE0YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfc2VxX2ZsYWdzMl9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9zZXFfZmxhZ3MyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFfRkxBR1MyIiwgMHgxNDcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRX0ZMQUdTMiIsIDB4MTRkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9hbGxvY2ZpZm9fc2NicHRyX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2FsbG9jZmlmb19zY2JwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFMTE9DRklGT19TQ0JQVFIiLCAweDE0OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTExPQ0ZJRk9fU0NCUFRSIiwgMHgxNGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2ludF9jb2FsZXNjaW5nX3RpbWVyX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2ludF9jb2FsZXNjaW5nX3RpbWVyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19USU1FUiIsIDB4MTRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVF9DT0FMRVNDSU5HX1RJTUVSIiwgMHgxNTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2ludF9jb2FsZXNjaW5nX21heGNtZHNfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfaW50X2NvYWxlc2NpbmdfbWF4Y21kc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfTUFYQ01EUyIsIDB4MTRjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVF9DT0FMRVNDSU5HX01BWENNRFMiLCAweDE1MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfaW50X2NvYWxlc2NpbmdfbWluY21kc19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9pbnRfY29hbGVzY2luZ19taW5jbWRzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19NSU5DTURTIiwgMHgxNGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfTUlOQ01EUyIsIDB4MTUzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9jbWRzX3BlbmRpbmdfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfY21kc19wZW5kaW5nX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTURTX1BFTkRJTkciLCAweDE0ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTURTX1BFTkRJTkciLCAweDE1NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfaW50X2NvYWxlc2NpbmdfY21kY291bnRfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfaW50X2NvYWxlc2NpbmdfY21kY291bnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVF9DT0FMRVNDSU5HX0NNRENPVU5UIiwgMHgxNTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfQ01EQ09VTlQiLCAweDE1NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfbG9jYWxfaHNfbWFpbGJveF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9sb2NhbF9oc19tYWlsYm94X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMT0NBTF9IU19NQUlMQk9YIiwgMHgxNTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTE9DQUxfSFNfTUFJTEJPWCIsIDB4MTU3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9jbWRzaXplX3RhYmxlX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2NtZHNpemVfdGFibGVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRFNJWkVfVEFCTEUiLCAweDE1MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTURTSVpFX1RBQkxFIiwgMHgxNTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCkBAIC0yNDM0LDEzICsyNDU1LDYgQEAKICNkZWZpbmUJCUhPU1RfVFFJTlBPUyAgICAJMHg4MAogI2RlZmluZQkJRU5JTlRfQ09BTEVTQ0UgIAkweDQwCiAKLSNkZWZpbmUJQ0xSU0VRSU5UU1RBVCAgIAkJMHgwYwotI2RlZmluZQkJQ0xSU0VRX1NXVE1SVE8gIAkweDEwCi0jZGVmaW5lCQlDTFJTRVFfU0VRSU5UICAgCTB4MDgKLSNkZWZpbmUJCUNMUlNFUV9TQ1NJSU5UICAJMHgwNAotI2RlZmluZQkJQ0xSU0VRX1BDSUlOVCAgIAkweDAyCi0jZGVmaW5lCQlDTFJTRVFfU1BMVElOVCAgCTB4MDEKLQogI2RlZmluZQlTRVFJTlRTVEFUICAgICAgCQkweDBjCiAjZGVmaW5lCQlTRVFfU1dUTVJUTyAgICAgCTB4MTAKICNkZWZpbmUJCVNFUV9TRVFJTlQgICAgICAJMHgwOApAQCAtMjQ0OCw2ICsyNDYyLDEzIEBACiAjZGVmaW5lCQlTRVFfUENJSU5UICAgICAgCTB4MDIKICNkZWZpbmUJCVNFUV9TUExUSU5UICAgICAJMHgwMQogCisjZGVmaW5lCUNMUlNFUUlOVFNUQVQgICAJCTB4MGMKKyNkZWZpbmUJCUNMUlNFUV9TV1RNUlRPICAJMHgxMAorI2RlZmluZQkJQ0xSU0VRX1NFUUlOVCAgIAkweDA4CisjZGVmaW5lCQlDTFJTRVFfU0NTSUlOVCAgCTB4MDQKKyNkZWZpbmUJCUNMUlNFUV9QQ0lJTlQgICAJMHgwMgorI2RlZmluZQkJQ0xSU0VRX1NQTFRJTlQgIAkweDAxCisKICNkZWZpbmUJU1dUSU1FUiAgICAgICAgIAkJMHgwZQogCiAjZGVmaW5lCVNOU0NCX1FPRkYgICAgICAJCTB4MTAKQEAgLTI2MjMsMTAgKzI2NDQsMTAgQEAKICNkZWZpbmUJCUJJT1NDQU5DRUxFTiAgICAJMHgxMAogI2RlZmluZQkJU1BJT0VOICAgICAgICAgIAkweDA4CiAKLSNkZWZpbmUJQlVTSU5JVElEICAgICAgIAkJMHgzYwotCiAjZGVmaW5lCURMQ09VTlQgICAgICAgICAJCTB4M2MKIAorI2RlZmluZQlCVVNJTklUSUQgICAgICAgCQkweDNjCisKICNkZWZpbmUJU1hGUkNUTDEgICAgICAgIAkJMHgzZAogI2RlZmluZQkJQklUQlVDS0VUICAgICAgIAkweDgwCiAjZGVmaW5lCQlFTlNBQ0hLICAgICAgICAgCTB4NDAKQEAgLTI2OTMsMTMgKzI3MTQsNiBAQAogI2RlZmluZQkJU0VMSURfTUFTSyAgICAgIAkweGYwCiAjZGVmaW5lCQlPTkVCSVQgICAgICAgICAgCTB4MDgKIAotI2RlZmluZQlTQkxLQ1RMICAgICAgICAgCQkweDRhCi0jZGVmaW5lCQlESUFHTEVERU4gICAgICAgCTB4ODAKLSNkZWZpbmUJCURJQUdMRURPTiAgICAgICAJMHg0MAotI2RlZmluZQkJRU5BQjQwICAgICAgICAgIAkweDA4Ci0jZGVmaW5lCQlFTkFCMjAgICAgICAgICAgCTB4MDQKLSNkZWZpbmUJCVNFTFdJREUgICAgICAgICAJMHgwMgotCiAjZGVmaW5lCU9QVElPTk1PREUgICAgICAJCTB4NGEKICNkZWZpbmUJCU9QVElPTk1PREVfREVGQVVMVFMJMHgwMgogI2RlZmluZQkJQklPU0NBTkNUTCAgICAgIAkweDgwCkBAIC0yNzA5LDYgKzI3MjMsMjIgQEAKICNkZWZpbmUJCUVOREdGT1JNQ0hLICAgICAJMHgwNAogI2RlZmluZQkJQVVUT19NU0dPVVRfREUgIAkweDAyCiAKKyNkZWZpbmUJU0JMS0NUTCAgICAgICAgIAkJMHg0YQorI2RlZmluZQkJRElBR0xFREVOICAgICAgIAkweDgwCisjZGVmaW5lCQlESUFHTEVET04gICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOQUI0MCAgICAgICAgICAJMHgwOAorI2RlZmluZQkJRU5BQjIwICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlTRUxXSURFICAgICAgICAgCTB4MDIKKworI2RlZmluZQlDTFJTSU5UMCAgICAgICAgCQkweDRiCisjZGVmaW5lCQlDTFJTRUxETyAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUNMUlNFTERJICAgICAgICAJMHgyMAorI2RlZmluZQkJQ0xSU0VMSU5HTyAgICAgIAkweDEwCisjZGVmaW5lCQlDTFJJT0VSUiAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUNMUk9WRVJSVU4gICAgICAJMHgwNAorI2RlZmluZQkJQ0xSU1BJT1JEWSAgICAgIAkweDAyCisjZGVmaW5lCQlDTFJBUkJETyAgICAgICAgCTB4MDEKKwogI2RlZmluZQlTU1RBVDAgICAgICAgICAgCQkweDRiCiAjZGVmaW5lCQlUQVJHRVQgICAgICAgICAgCTB4ODAKICNkZWZpbmUJCVNFTERPICAgICAgICAgICAJMHg0MApAQCAtMjcxOSwxNSArMjc0OSw2IEBACiAjZGVmaW5lCQlTUElPUkRZICAgICAgICAgCTB4MDIKICNkZWZpbmUJCUFSQkRPICAgICAgICAgICAJMHgwMQogCi0jZGVmaW5lCUNMUlNJTlQwICAgICAgICAJCTB4NGIKLSNkZWZpbmUJCUNMUlNFTERPICAgICAgICAJMHg0MAotI2RlZmluZQkJQ0xSU0VMREkgICAgICAgIAkweDIwCi0jZGVmaW5lCQlDTFJTRUxJTkdPICAgICAgCTB4MTAKLSNkZWZpbmUJCUNMUklPRVJSICAgICAgICAJMHgwOAotI2RlZmluZQkJQ0xST1ZFUlJVTiAgICAgIAkweDA0Ci0jZGVmaW5lCQlDTFJTUElPUkRZICAgICAgCTB4MDIKLSNkZWZpbmUJCUNMUkFSQkRPICAgICAgICAJMHgwMQotCiAjZGVmaW5lCVNJTU9ERTAgICAgICAgICAJCTB4NGIKICNkZWZpbmUJCUVOU0VMRE8gICAgICAgICAJMHg0MAogI2RlZmluZQkJRU5TRUxESSAgICAgICAgIAkweDIwCkBAIC0yNzY4LDE3ICsyNzg5LDE3IEBACiAjZGVmaW5lCQlCVVNGUkVFX0RGRjAgICAgCTB4ODAKICNkZWZpbmUJCUJVU0ZSRUVfTFFPICAgICAJMHg0MAogCisjZGVmaW5lCVNJTU9ERTIgICAgICAgICAJCTB4NGQKKyNkZWZpbmUJCUVOV0lERV9SRVMgICAgICAJMHgwNAorI2RlZmluZQkJRU5TRE9ORSAgICAgICAgIAkweDAyCisjZGVmaW5lCQlFTkRNQURPTkUgICAgICAgCTB4MDEKKwogI2RlZmluZQlDTFJTSU5UMiAgICAgICAgCQkweDRkCiAjZGVmaW5lCQlDTFJOT05QQUNLUkVRICAgCTB4MjAKICNkZWZpbmUJCUNMUldJREVfUkVTICAgICAJMHgwNAogI2RlZmluZQkJQ0xSU0RPTkUgICAgICAgIAkweDAyCiAjZGVmaW5lCQlDTFJETUFET05FICAgICAgCTB4MDEKIAotI2RlZmluZQlTSU1PREUyICAgICAgICAgCQkweDRkCi0jZGVmaW5lCQlFTldJREVfUkVTICAgICAgCTB4MDQKLSNkZWZpbmUJCUVOU0RPTkUgICAgICAgICAJMHgwMgotI2RlZmluZQkJRU5ETUFET05FICAgICAgIAkweDAxCi0KICNkZWZpbmUJUEVSUkRJQUcgICAgICAgIAkJMHg0ZQogI2RlZmluZQkJSElaRVJPICAgICAgICAgIAkweDgwCiAjZGVmaW5lCQlISVBFUlIgICAgICAgICAgCTB4NDAKQEAgLTI4NzEsMTMgKzI4OTIsNiBAQAogI2RlZmluZQkJQ0xSTlRSQU1QRVJSICAgIAkweDAyCiAjZGVmaW5lCQlDTFJPU1JBTVBFUlIgICAgCTB4MDEKIAotI2RlZmluZQlMUU9NT0RFMCAgICAgICAgCQkweDU0Ci0jZGVmaW5lCQlFTkxRT1RBUkdTQ0JQRVJSCTB4MTAKLSNkZWZpbmUJCUVOTFFPU1RPUFQyICAgICAJMHgwOAotI2RlZmluZQkJRU5MUU9BVE5MUSAgICAgIAkweDA0Ci0jZGVmaW5lCQlFTkxRT0FUTlBLVCAgICAgCTB4MDIKLSNkZWZpbmUJCUVOTFFPVENSQyAgICAgICAJMHgwMQotCiAjZGVmaW5lCUxRT1NUQVQwICAgICAgICAJCTB4NTQKICNkZWZpbmUJCUxRT1RBUkdTQ0JQRVJSICAJMHgxMAogI2RlZmluZQkJTFFPU1RPUFQyICAgICAgIAkweDA4CkBAIC0yODkyLDYgKzI5MDYsMjAgQEAKICNkZWZpbmUJCUNMUkxRT0FUTlBLVCAgICAJMHgwMgogI2RlZmluZQkJQ0xSTFFPVENSQyAgICAgIAkweDAxCiAKKyNkZWZpbmUJTFFPTU9ERTAgICAgICAgIAkJMHg1NAorI2RlZmluZQkJRU5MUU9UQVJHU0NCUEVSUgkweDEwCisjZGVmaW5lCQlFTkxRT1NUT1BUMiAgICAgCTB4MDgKKyNkZWZpbmUJCUVOTFFPQVROTFEgICAgICAJMHgwNAorI2RlZmluZQkJRU5MUU9BVE5QS1QgICAgIAkweDAyCisjZGVmaW5lCQlFTkxRT1RDUkMgICAgICAgCTB4MDEKKworI2RlZmluZQlMUU9NT0RFMSAgICAgICAgCQkweDU1CisjZGVmaW5lCQlFTkxRT0lOSVRTQ0JQRVJSCTB4MTAKKyNkZWZpbmUJCUVOTFFPU1RPUEkyICAgICAJMHgwOAorI2RlZmluZQkJRU5MUU9CQURRQVMgICAgIAkweDA0CisjZGVmaW5lCQlFTkxRT0JVU0ZSRUUgICAgCTB4MDIKKyNkZWZpbmUJCUVOTFFPUEhBQ0hHSU5QS1QJMHgwMQorCiAjZGVmaW5lCUxRT1NUQVQxICAgICAgICAJCTB4NTUKICNkZWZpbmUJCUxRT0lOSVRTQ0JQRVJSICAJMHgxMAogI2RlZmluZQkJTFFPU1RPUEkyICAgICAgIAkweDA4CkBAIC0yOTA2LDEzICsyOTM0LDYgQEAKICNkZWZpbmUJCUNMUkxRT0JVU0ZSRUUgICAJMHgwMgogI2RlZmluZQkJQ0xSTFFPUEhBQ0hHSU5QS1QJMHgwMQogCi0jZGVmaW5lCUxRT01PREUxICAgICAgICAJCTB4NTUKLSNkZWZpbmUJCUVOTFFPSU5JVFNDQlBFUlIJMHgxMAotI2RlZmluZQkJRU5MUU9TVE9QSTIgICAgIAkweDA4Ci0jZGVmaW5lCQlFTkxRT0JBRFFBUyAgICAgCTB4MDQKLSNkZWZpbmUJCUVOTFFPQlVTRlJFRSAgICAJMHgwMgotI2RlZmluZQkJRU5MUU9QSEFDSEdJTlBLVAkweDAxCi0KICNkZWZpbmUJTFFPU1RBVDIgICAgICAgIAkJMHg1NgogI2RlZmluZQkJTFFPUEtUICAgICAgICAgIAkweGUwCiAjZGVmaW5lCQlMUU9XQUlURklGTyAgICAgCTB4MTAKQEAgLTMwMjgsNiArMzA0OSw4IEBACiAKICNkZWZpbmUJQU5ORVhDT0wgICAgICAgIAkJMHg2NQogCisjZGVmaW5lCUFOTkVYREFUICAgICAgICAJCTB4NjYKKwogI2RlZmluZQlTQ1NDSEtOICAgICAgICAgCQkweDY2CiAjZGVmaW5lCQlTVFNFTFNLSURESVMgICAgCTB4NDAKICNkZWZpbmUJCUNVUlJGSUZPREVGICAgICAJMHgyMApAQCAtMzAzNyw4ICszMDYwLDYgQEAKICNkZWZpbmUJCVNIVkFMSURTVERJUyAgICAJMHgwMgogI2RlZmluZQkJTFNUU0dDTFJESVMgICAgIAkweDAxCiAKLSNkZWZpbmUJQU5ORVhEQVQgICAgICAgIAkJMHg2NgotCiAjZGVmaW5lCUlPV05JRCAgICAgICAgICAJCTB4NjcKIAogI2RlZmluZQlQTEw5NjBDVEwwICAgICAgCQkweDY4CkBAIC0zMDcxLDEwICszMDkyLDEwIEBACiAjZGVmaW5lCQlQTExfQ05UQ0xSICAgICAgCTB4NDAKICNkZWZpbmUJCVBMTF9SU1QgICAgICAgICAJMHgwMQogCi0jZGVmaW5lCVBMTDQwMENOVDAgICAgICAJCTB4NmUKLQogI2RlZmluZQlVTkZBSVJORVNTICAgICAgCQkweDZlCiAKKyNkZWZpbmUJUExMNDAwQ05UMCAgICAgIAkJMHg2ZQorCiAjZGVmaW5lCUhBRERSICAgICAgICAgICAJCTB4NzAKIAogI2RlZmluZQlQTExERUxBWSAgICAgICAgCQkweDcwCkBAIC0zMDg4LDE0ICszMTA5LDE0IEBACiAKICNkZWZpbmUJSE9ETUFFTiAgICAgICAgIAkJMHg3YQogCi0jZGVmaW5lCVNHSEFERFIgICAgICAgICAJCTB4N2MKLQogI2RlZmluZQlTQ0JIQUREUiAgICAgICAgCQkweDdjCiAKLSNkZWZpbmUJU0dIQ05UICAgICAgICAgIAkJMHg4NAorI2RlZmluZQlTR0hBRERSICAgICAgICAgCQkweDdjCiAKICNkZWZpbmUJU0NCSENOVCAgICAgICAgIAkJMHg4NAogCisjZGVmaW5lCVNHSENOVCAgICAgICAgICAJCTB4ODQKKwogI2RlZmluZQlERkZfVEhSU0ggICAgICAgCQkweDg4CiAjZGVmaW5lCQlXUl9ERlRIUlNIICAgICAgCTB4NzAKICNkZWZpbmUJCVJEX0RGVEhSU0ggICAgICAJMHgwNwpAQCAtMzExMyw4ICszMTM0LDggQEAKICNkZWZpbmUJCVJEX0RGVEhSU0hfNjMgICAJMHgwMwogI2RlZmluZQkJUkRfREZUSFJTSF81MCAgIAkweDAyCiAjZGVmaW5lCQlSRF9ERlRIUlNIXzI1ICAgCTB4MDEKLSNkZWZpbmUJCVdSX0RGVEhSU0hfTUlOICAJMHgwMAogI2RlZmluZQkJUkRfREZUSFJTSF9NSU4gIAkweDAwCisjZGVmaW5lCQlXUl9ERlRIUlNIX01JTiAgCTB4MDAKIAogI2RlZmluZQlST01BRERSICAgICAgICAgCQkweDhhCiAKQEAgLTMxNTAsMjAgKzMxNzEsMjIgQEAKICNkZWZpbmUJCURDSDFOU0VOICAgICAgICAJMHgwMgogI2RlZmluZQkJRENIME5TRU4gICAgICAgIAkweDAxCiAKLSNkZWZpbmUJRENIUlhNU0cxICAgICAgIAkJMHg5MQotCiAjZGVmaW5lCUNNQ1JYTVNHMSAgICAgICAJCTB4OTEKIAotI2RlZmluZQlEQ0hSWE1TRzIgICAgICAgCQkweDkyCisjZGVmaW5lCURDSFJYTVNHMSAgICAgICAJCTB4OTEKIAotI2RlZmluZQlPVkxZUlhNU0cyICAgICAgCQkweDkyCisjZGVmaW5lCURDSFJYTVNHMiAgICAgICAJCTB4OTIKIAogI2RlZmluZQlDTUNSWE1TRzIgICAgICAgCQkweDkyCiAKICNkZWZpbmUJT1NUICAgICAgICAgICAgIAkJMHg5MgogCisjZGVmaW5lCU9WTFlSWE1TRzIgICAgICAJCTB4OTIKKwogI2RlZmluZQlEQ0hSWE1TRzMgICAgICAgCQkweDkzCiAKKyNkZWZpbmUJT1ZMWVJYTVNHMyAgICAgIAkJMHg5MworCiAjZGVmaW5lCUNNQ1JYTVNHMyAgICAgICAJCTB4OTMKIAogI2RlZmluZQlQQ0lYQ1RMICAgICAgICAgCQkweDkzCkBAIC0zMTc1LDI2ICszMTk4LDI0IEBACiAjZGVmaW5lCQlUU0NTRVJSRU4gICAgICAgCTB4MDIKICNkZWZpbmUJCUNNUEFCQ0RJUyAgICAgICAJMHgwMQogCi0jZGVmaW5lCU9WTFlSWE1TRzMgICAgICAJCTB4OTMKLQogI2RlZmluZQlPVkxZU0VRQkNOVCAgICAgCQkweDk0CiAKLSNkZWZpbmUJQ01DU0VRQkNOVCAgICAgIAkJMHg5NAotCiAjZGVmaW5lCURDSFNFUUJDTlQgICAgICAJCTB4OTQKIAotI2RlZmluZQlDTUNTUExUU1RBVDAgICAgCQkweDk2CisjZGVmaW5lCUNNQ1NFUUJDTlQgICAgICAJCTB4OTQKIAotI2RlZmluZQlPVkxZU1BMVFNUQVQwICAgCQkweDk2CisjZGVmaW5lCUNNQ1NQTFRTVEFUMCAgICAJCTB4OTYKIAogI2RlZmluZQlEQ0hTUExUU1RBVDAgICAgCQkweDk2CiAKLSNkZWZpbmUJRENIU1BMVFNUQVQxICAgIAkJMHg5NworI2RlZmluZQlPVkxZU1BMVFNUQVQwICAgCQkweDk2CiAKICNkZWZpbmUJQ01DU1BMVFNUQVQxICAgIAkJMHg5NwogCiAjZGVmaW5lCU9WTFlTUExUU1RBVDEgICAJCTB4OTcKIAorI2RlZmluZQlEQ0hTUExUU1RBVDEgICAgCQkweDk3CisKICNkZWZpbmUJU0dSWE1TRzAgICAgICAgIAkJMHg5OAogI2RlZmluZQkJQ0ROVU0gICAgICAgICAgIAkweGY4CiAjZGVmaW5lCQlDRk5VTSAgICAgICAgICAgCTB4MDcKQEAgLTMyNDQsMTMgKzMyNjUsMTMgQEAKICNkZWZpbmUJCVJYU0NFTVNHICAgICAgICAJMHgwMgogI2RlZmluZQkJUlhTUExUUlNQICAgICAgIAkweDAxCiAKKyNkZWZpbmUJU0dTUExUU1RBVDEgICAgIAkJMHg5ZgorI2RlZmluZQkJUlhEQVRBQlVDS0VUICAgIAkweDAxCisKICNkZWZpbmUJU0ZVTkNUICAgICAgICAgIAkJMHg5ZgogI2RlZmluZQkJVEVTVF9HUk9VUCAgICAgIAkweGYwCiAjZGVmaW5lCQlURVNUX05VTSAgICAgICAgCTB4MGYKIAotI2RlZmluZQlTR1NQTFRTVEFUMSAgICAgCQkweDlmCi0jZGVmaW5lCQlSWERBVEFCVUNLRVQgICAgCTB4MDEKLQogI2RlZmluZQlERjBQQ0lTVEFUICAgICAgCQkweGEwCiAKICNkZWZpbmUJUkVHMCAgICAgICAgICAgIAkJMHhhMApAQCAtMzI5OSwxMCArMzMyMCwxMCBAQAogCiAjZGVmaW5lCUNDU0dBRERSICAgICAgICAJCTB4YWMKIAotI2RlZmluZQlDQ1NDQkFERFIgICAgICAgCQkweGFjCi0KICNkZWZpbmUJQ0NTQ0JBRFJfQksgICAgIAkJMHhhYwogCisjZGVmaW5lCUNDU0NCQUREUiAgICAgICAJCTB4YWMKKwogI2RlZmluZQlDTUNfUkFNQklTVCAgICAgCQkweGFkCiAjZGVmaW5lCQlTR19FTEVNRU5UX1NJWkUgCTB4ODAKICNkZWZpbmUJCVNDQlJBTUJJU1RfRkFJTCAJMHg0MApAQCAtMzMxMSwxNCArMzMzMiw2IEBACiAjZGVmaW5lCQlDTUNfQlVGRkVSX0JJU1RfRkFJTAkweDAyCiAjZGVmaW5lCQlDTUNfQlVGRkVSX0JJU1RfRU4JMHgwMQogCi0jZGVmaW5lCUNDU0dDVEwgICAgICAgICAJCTB4YWQKLSNkZWZpbmUJCUNDU0dFTiAgICAgICAgICAJMHgwYwotI2RlZmluZQkJQ0NTR0RPTkUgICAgICAgIAkweDgwCi0jZGVmaW5lCQlTR19DQUNIRV9BVkFJTCAgCTB4MTAKLSNkZWZpbmUJCUNDU0dFTkFDSyAgICAgICAJMHgwOAotI2RlZmluZQkJU0dfRkVUQ0hfUkVRICAgIAkweDAyCi0jZGVmaW5lCQlDQ1NHUkVTRVQgICAgICAgCTB4MDEKLQogI2RlZmluZQlDQ1NDQkNUTCAgICAgICAgCQkweGFkCiAjZGVmaW5lCQlDQ1NDQkRPTkUgICAgICAgCTB4ODAKICNkZWZpbmUJCUFSUkRPTkUgICAgICAgICAJMHg0MApAQCAtMzMyNyw2ICszMzQwLDE0IEBACiAjZGVmaW5lCQlDQ1NDQkRJUiAgICAgICAgCTB4MDQKICNkZWZpbmUJCUNDU0NCUkVTRVQgICAgICAJMHgwMQogCisjZGVmaW5lCUNDU0dDVEwgICAgICAgICAJCTB4YWQKKyNkZWZpbmUJCUNDU0dFTiAgICAgICAgICAJMHgwYworI2RlZmluZQkJQ0NTR0RPTkUgICAgICAgIAkweDgwCisjZGVmaW5lCQlTR19DQUNIRV9BVkFJTCAgCTB4MTAKKyNkZWZpbmUJCUNDU0dFTkFDSyAgICAgICAJMHgwOAorI2RlZmluZQkJU0dfRkVUQ0hfUkVRICAgIAkweDAyCisjZGVmaW5lCQlDQ1NHUkVTRVQgICAgICAgCTB4MDEKKwogI2RlZmluZQlDQ1NHUkFNICAgICAgICAgCQkweGIwCiAKICNkZWZpbmUJRkxFWEFEUiAgICAgICAgIAkJMHhiMApAQCAtMzM1Niw4ICszMzc3LDggQEAKICNkZWZpbmUJU0VFREFUICAgICAgICAgIAkJMHhiYwogCiAjZGVmaW5lCVNFRUNUTCAgICAgICAgICAJCTB4YmUKLSNkZWZpbmUJCVNFRU9QX0VXRU4gICAgICAJMHg0MAogI2RlZmluZQkJU0VFT1BfV0FMTCAgICAgIAkweDQwCisjZGVmaW5lCQlTRUVPUF9FV0VOICAgICAgCTB4NDAKICNkZWZpbmUJCVNFRU9QX0VXRFMgICAgICAJMHg0MAogI2RlZmluZQkJU0VFT1BDT0RFICAgICAgIAkweDcwCiAjZGVmaW5lCQlTRUVSU1QgICAgICAgICAgCTB4MDIKQEAgLTM0MTQsMTQgKzM0MzUsMTQgQEAKIAogI2RlZmluZQlXUlRCSUFTQ0FMQyAgICAgCQkweGM3CiAKLSNkZWZpbmUJREZQVFJTICAgICAgICAgIAkJMHhjOAotCiAjZGVmaW5lCVJDVlJCSUFTQ0FMQyAgICAJCTB4YzgKIAotI2RlZmluZQlERkJLUFRSICAgICAgICAgCQkweGM5CisjZGVmaW5lCURGUFRSUyAgICAgICAgICAJCTB4YzgKIAogI2RlZmluZQlTS0VXQ0FMQyAgICAgICAgCQkweGM5CiAKKyNkZWZpbmUJREZCS1BUUiAgICAgICAgIAkJMHhjOQorCiAjZGVmaW5lCURGREJDVEwgICAgICAgICAJCTB4Y2IKICNkZWZpbmUJCURGRl9DSU9fV1JfUkRZICAJMHgyMAogI2RlZmluZQkJREZGX0NJT19SRF9SRFkgIAkweDEwCkBAIC0zNDc1LDExICszNDk2LDExIEBACiAKICNkZWZpbmUJRElOREVYICAgICAgICAgIAkJMHhlNAogCisjZGVmaW5lCUJSS0FERFIwICAgICAgICAJCTB4ZTYKKwogI2RlZmluZQlCUktBRERSMSAgICAgICAgCQkweGU2CiAjZGVmaW5lCQlCUktESVMgICAgICAgICAgCTB4ODAKIAotI2RlZmluZQlCUktBRERSMCAgICAgICAgCQkweGU2Ci0KICNkZWZpbmUJQUxMT05FUyAgICAgICAgIAkJMHhlOAogCiAjZGVmaW5lCUFMTFpFUk9TICAgICAgICAJCTB4ZWEKQEAgLTM0OTQsMTQgKzM1MTUsMTQgQEAKIAogI2RlZmluZQlTVEFDSyAgICAgICAgICAgCQkweGYyCiAKLSNkZWZpbmUJQ1VSQUREUiAgICAgICAgIAkJMHhmNAotCiAjZGVmaW5lCUlOVFZFQzFfQUREUiAgICAJCTB4ZjQKIAotI2RlZmluZQlJTlRWRUMyX0FERFIgICAgCQkweGY2CisjZGVmaW5lCUNVUkFERFIgICAgICAgICAJCTB4ZjQKIAogI2RlZmluZQlMQVNUQUREUiAgICAgICAgCQkweGY2CiAKKyNkZWZpbmUJSU5UVkVDMl9BRERSICAgIAkJMHhmNgorCiAjZGVmaW5lCUxPTkdKTVBfQUREUiAgICAJCTB4ZjgKIAogI2RlZmluZQlBQ0NVTV9TQVZFICAgICAgCQkweGZhCkBAIC0zNTI0LDI1ICszNTQ1LDMxIEBACiAKICNkZWZpbmUJQ09NUExFVEVfRE1BX1NDQl9IRUFECQkweDEyYwogCi0jZGVmaW5lCVFGUkVFWkVfQ09VTlQgICAJCTB4MTJlCisjZGVmaW5lCUNPTVBMRVRFX0RNQV9TQ0JfVEFJTAkJMHgxMmUKIAotI2RlZmluZQlTQVZFRF9NT0RFICAgICAgCQkweDEzMAorI2RlZmluZQlDT01QTEVURV9PTl9RRlJFRVpFX0hFQUQJCTB4MTMwCiAKLSNkZWZpbmUJTVNHX09VVCAgICAgICAgIAkJMHgxMzEKKyNkZWZpbmUJUUZSRUVaRV9DT1VOVCAgIAkJMHgxMzIKIAotI2RlZmluZQlETUFQQVJBTVMgICAgICAgCQkweDEzMgorI2RlZmluZQlLRVJORUxfUUZSRUVaRV9DT1VOVAkJMHgxMzQKKworI2RlZmluZQlTQVZFRF9NT0RFICAgICAgCQkweDEzNgorCisjZGVmaW5lCU1TR19PVVQgICAgICAgICAJCTB4MTM3CisKKyNkZWZpbmUJRE1BUEFSQU1TICAgICAgIAkJMHgxMzgKICNkZWZpbmUJCVBSRUxPQURFTiAgICAgICAJMHg4MAogI2RlZmluZQkJV0lERU9ERCAgICAgICAgIAkweDQwCiAjZGVmaW5lCQlTQ1NJRU4gICAgICAgICAgCTB4MjAKICNkZWZpbmUJCVNETUFFTiAgICAgICAgICAJMHgxMAogI2RlZmluZQkJU0RNQUVOQUNLICAgICAgIAkweDEwCi0jZGVmaW5lCQlIRE1BRU5BQ0sgICAgICAgCTB4MDgKICNkZWZpbmUJCUhETUFFTiAgICAgICAgICAJMHgwOAorI2RlZmluZQkJSERNQUVOQUNLICAgICAgIAkweDA4CiAjZGVmaW5lCQlESVJFQ1RJT04gICAgICAgCTB4MDQKICNkZWZpbmUJCUZJRk9GTFVTSCAgICAgICAJMHgwMgogI2RlZmluZQkJRklGT1JFU0VUICAgICAgIAkweDAxCiAKLSNkZWZpbmUJU0VRX0ZMQUdTICAgICAgIAkJMHgxMzMKKyNkZWZpbmUJU0VRX0ZMQUdTICAgICAgIAkJMHgxMzkKICNkZWZpbmUJCU5PVF9JREVOVElGSUVEICAJMHg4MAogI2RlZmluZQkJTk9fQ0RCX1NFTlQgICAgIAkweDQwCiAjZGVmaW5lCQlUQVJHRVRfQ01EX0lTX1RBR0dFRAkweDQwCkBAIC0zNTUzLDExICszNTgwLDExIEBACiAjZGVmaW5lCQlTUEhBU0VfUEVORElORyAgCTB4MDIKICNkZWZpbmUJCU5PX0RJU0NPTk5FQ1QgICAJMHgwMQogCi0jZGVmaW5lCVNBVkVEX1NDU0lJRCAgICAJCTB4MTM0CisjZGVmaW5lCVNBVkVEX1NDU0lJRCAgICAJCTB4MTNhCiAKLSNkZWZpbmUJU0FWRURfTFVOICAgICAgIAkJMHgxMzUKKyNkZWZpbmUJU0FWRURfTFVOICAgICAgIAkJMHgxM2IKIAotI2RlZmluZQlMQVNUUEhBU0UgICAgICAgCQkweDEzNgorI2RlZmluZQlMQVNUUEhBU0UgICAgICAgCQkweDEzYwogI2RlZmluZQkJUEhBU0VfTUFTSyAgICAgIAkweGUwCiAjZGVmaW5lCQlDREkgICAgICAgICAgICAgCTB4ODAKICNkZWZpbmUJCUlPSSAgICAgICAgICAgICAJMHg0MApAQCAtMzU3MiwxOCArMzU5OSwxOCBAQAogI2RlZmluZQkJUF9EQVRBT1VUX0RUICAgIAkweDIwCiAjZGVmaW5lCQlQX0RBVEFPVVQgICAgICAgCTB4MDAKIAotI2RlZmluZQlRT1VURklGT19FTlRSWV9WQUxJRF9UQUcJCTB4MTM3CisjZGVmaW5lCVFPVVRGSUZPX0VOVFJZX1ZBTElEX1RBRwkJMHgxM2QKIAotI2RlZmluZQlTSEFSRURfREFUQV9BRERSCQkweDEzOAorI2RlZmluZQlLRVJORUxfVFFJTlBPUyAgCQkweDEzZQogCi0jZGVmaW5lCVFPVVRGSUZPX05FWFRfQUREUgkJMHgxM2MKKyNkZWZpbmUJVFFJTlBPUyAgICAgICAgIAkJMHgxM2YKIAotI2RlZmluZQlLRVJORUxfVFFJTlBPUyAgCQkweDE0MAorI2RlZmluZQlTSEFSRURfREFUQV9BRERSCQkweDE0MAogCi0jZGVmaW5lCVRRSU5QT1MgICAgICAgICAJCTB4MTQxCisjZGVmaW5lCVFPVVRGSUZPX05FWFRfQUREUgkJMHgxNDQKIAotI2RlZmluZQlBUkdfMSAgICAgICAgICAgCQkweDE0MgotI2RlZmluZQlSRVRVUk5fMSAgICAgICAgCQkweDE0MgorI2RlZmluZQlBUkdfMSAgICAgICAgICAgCQkweDE0OAorI2RlZmluZQlSRVRVUk5fMSAgICAgICAgCQkweDE0OAogI2RlZmluZQkJU0VORF9NU0cgICAgICAgIAkweDgwCiAjZGVmaW5lCQlTRU5EX1NFTlNFICAgICAgCTB4NDAKICNkZWZpbmUJCVNFTkRfUkVKICAgICAgICAJMHgyMApAQCAtMzU5MywxMiArMzYyMCwxMiBAQAogI2RlZmluZQkJQ09OVF9NU0dfTE9PUF9SRUFECTB4MDMKICNkZWZpbmUJCUNPTlRfTVNHX0xPT1BfVEFSRwkweDAyCiAKLSNkZWZpbmUJQVJHXzIgICAgICAgICAgIAkJMHgxNDMKLSNkZWZpbmUJUkVUVVJOXzIgICAgICAgIAkJMHgxNDMKKyNkZWZpbmUJQVJHXzIgICAgICAgICAgIAkJMHgxNDkKKyNkZWZpbmUJUkVUVVJOXzIgICAgICAgIAkJMHgxNDkKIAotI2RlZmluZQlMQVNUX01TRyAgICAgICAgCQkweDE0NAorI2RlZmluZQlMQVNUX01TRyAgICAgICAgCQkweDE0YQogCi0jZGVmaW5lCVNDU0lTRVFfVEVNUExBVEUJCTB4MTQ1CisjZGVmaW5lCVNDU0lTRVFfVEVNUExBVEUJCTB4MTRiCiAjZGVmaW5lCQlNQU5VQUxDVEwgICAgICAgCTB4NDAKICNkZWZpbmUJCUVOU0VMSSAgICAgICAgICAJMHgyMAogI2RlZmluZQkJRU5SU0VMSSAgICAgICAgIAkweDEwCkBAIC0zNjA2LDI3ICszNjMzLDI3IEBACiAjZGVmaW5lCQlFTkFVVE9BVE5QICAgICAgCTB4MDIKICNkZWZpbmUJCUFMVFNUSU0gICAgICAgICAJMHgwMQogCi0jZGVmaW5lCUlOSVRJQVRPUl9UQUcgICAJCTB4MTQ2CisjZGVmaW5lCUlOSVRJQVRPUl9UQUcgICAJCTB4MTRjCiAKLSNkZWZpbmUJU0VRX0ZMQUdTMiAgICAgIAkJMHgxNDcKKyNkZWZpbmUJU0VRX0ZMQUdTMiAgICAgIAkJMHgxNGQKICNkZWZpbmUJCVNFTEVDVE9VVF9RRlJPWkVOCTB4MDQKICNkZWZpbmUJCVRBUkdFVF9NU0dfUEVORElORwkweDAyCiAKLSNkZWZpbmUJQUxMT0NGSUZPX1NDQlBUUgkJMHgxNDgKKyNkZWZpbmUJQUxMT0NGSUZPX1NDQlBUUgkJMHgxNGUKIAotI2RlZmluZQlJTlRfQ09BTEVTQ0lOR19USU1FUgkJMHgxNGEKKyNkZWZpbmUJSU5UX0NPQUxFU0NJTkdfVElNRVIJCTB4MTUwCiAKLSNkZWZpbmUJSU5UX0NPQUxFU0NJTkdfTUFYQ01EUwkJMHgxNGMKKyNkZWZpbmUJSU5UX0NPQUxFU0NJTkdfTUFYQ01EUwkJMHgxNTIKIAotI2RlZmluZQlJTlRfQ09BTEVTQ0lOR19NSU5DTURTCQkweDE0ZAorI2RlZmluZQlJTlRfQ09BTEVTQ0lOR19NSU5DTURTCQkweDE1MwogCi0jZGVmaW5lCUNNRFNfUEVORElORyAgICAJCTB4MTRlCisjZGVmaW5lCUNNRFNfUEVORElORyAgICAJCTB4MTU0CiAKLSNkZWZpbmUJSU5UX0NPQUxFU0NJTkdfQ01EQ09VTlQJCTB4MTUwCisjZGVmaW5lCUlOVF9DT0FMRVNDSU5HX0NNRENPVU5UCQkweDE1NgogCi0jZGVmaW5lCUxPQ0FMX0hTX01BSUxCT1gJCTB4MTUxCisjZGVmaW5lCUxPQ0FMX0hTX01BSUxCT1gJCTB4MTU3CiAKLSNkZWZpbmUJQ01EU0laRV9UQUJMRSAgIAkJMHgxNTIKKyNkZWZpbmUJQ01EU0laRV9UQUJMRSAgIAkJMHgxNTgKIAogI2RlZmluZQlTQ0JfQkFTRSAgICAgICAgCQkweDE4MAogCkBAIC0zNzAxLDYgKzM3MjgsMTYgQEAKICNkZWZpbmUJU0NCX0RJU0NPTk5FQ1RFRF9MSVNUUwkJMHgxYjgKIAogCisjZGVmaW5lCUFIRF9USU1FUl9NQVhfVVMJMHgxOGZmZTcKKyNkZWZpbmUJQUhEX1RJTUVSX01BWF9USUNLUwkweGZmZmYKKyNkZWZpbmUJQUhEX1NFTlNFX0JVRlNJWkUJMHgxMDAKKyNkZWZpbmUJQlVTXzhfQklUCTB4MDAKKyNkZWZpbmUJVEFSR0VUX0NNRF9DTVBMVAkweGZlCisjZGVmaW5lCVNFRU9QX1dSQUxfQUREUgkweDQwCisjZGVmaW5lCUFIRF9BTVBMSVRVREVfREVGCTB4MDcKKyNkZWZpbmUJQUhEX1BSRUNPTVBfQ1VUQkFDS18zNwkweDA3CisjZGVmaW5lCUFIRF9QUkVDT01QX1NISUZUCTB4MDAKKyNkZWZpbmUJQUhEX0FOTkVYQ09MX1BSRUNPTVBfU0xFVwkweDA0CiAjZGVmaW5lCUFIRF9USU1FUl9VU19QRVJfVElDSwkweDE5CiAjZGVmaW5lCVNDQl9UUkFOU0ZFUl9TSVpFX0ZVTExfTFVOCTB4MzgKICNkZWZpbmUJU1RBVFVTX1FVRVVFX0ZVTEwJMHgyOApAQCAtMzcyNCwyOCArMzc2MSwxOCBAQAogI2RlZmluZQlCX0NVUlJGSUZPXzAJMHgwMgogI2RlZmluZQlMVU5MRU5fU0lOR0xFX0xFVkVMX0xVTgkweDBmCiAjZGVmaW5lCU5WUkFNX1NDQl9PRkZTRVQJMHgyYwotI2RlZmluZQlBSERfVElNRVJfTUFYX1VTCTB4MThmZmU3Ci0jZGVmaW5lCUFIRF9USU1FUl9NQVhfVElDS1MJMHhmZmZmCiAjZGVmaW5lCVNUQVRVU19QS1RfU0VOU0UJMHhmZgogI2RlZmluZQlDTURfR1JPVVBfQ09ERV9TSElGVAkweDA1Ci0jZGVmaW5lCUFIRF9TRU5TRV9CVUZTSVpFCTB4MTAwCiAjZGVmaW5lCU1BWF9PRkZTRVRfUEFDRURfQlVHCTB4N2YKLSNkZWZpbmUJQlVTXzhfQklUCTB4MDAKICNkZWZpbmUJU1RJTUVTRUxfQlVHX0FESgkweDA4CiAjZGVmaW5lCVNUSU1FU0VMX01JTgkweDE4CiAjZGVmaW5lCVNUSU1FU0VMX1NISUZUCTB4MDMKICNkZWZpbmUJQ0NTR1JBTV9NQVhTRUdTCTB4MTAKICNkZWZpbmUJSU5WQUxJRF9BRERSCTB4ODAKLSNkZWZpbmUJVEFSR0VUX0NNRF9DTVBMVAkweGZlCi0jZGVmaW5lCVNFRU9QX1dSQUxfQUREUgkweDQwCiAjZGVmaW5lCVNFRU9QX0VSQUxfQUREUgkweDgwCi0jZGVmaW5lCUFIRF9BTVBMSVRVREVfREVGCTB4MDcKICNkZWZpbmUJQUhEX1NMRVdSQVRFX0RFRl9SRVZCCTB4MDgKLSNkZWZpbmUJQUhEX1BSRUNPTVBfQ1VUQkFDS18zNwkweDA3CiAjZGVmaW5lCUFIRF9QUkVDT01QX0NVVEJBQ0tfMTcJMHgwNAotI2RlZmluZQlBSERfUFJFQ09NUF9TSElGVAkweDAwCiAjZGVmaW5lCUFIRF9QUkVDT01QX01BU0sJMHgwNwotI2RlZmluZQlBSERfQU5ORVhDT0xfUFJFQ09NUF9TTEVXCTB4MDQKICNkZWZpbmUJU1JDX01PREVfU0hJRlQJMHgwMAogI2RlZmluZQlQS1RfT1ZFUlJVTl9CVUZTSVpFCTB4MjAwCiAjZGVmaW5lCVNDQl9UUkFOU0ZFUl9TSVpFXzFCWVRFX0xVTgkweDMwCkBAIC0zNzYxLDYgKzM3ODgsNyBAQAogCiAKIC8qIERvd25sb2FkZWQgQ29uc3RhbnQgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJQ0FDSEVMSU5FX01BU0sJMHgwNwogI2RlZmluZQlTQ0JfVFJBTlNGRVJfU0laRQkweDA2CiAjZGVmaW5lCVBLVF9PVkVSUlVOX0JVRk9GRlNFVAkweDA1CiAjZGVmaW5lCVNHX1NJWkVPRgkweDA0CkBAIC0zNzY4LDkgKzM3OTYsOSBAQAogI2RlZmluZQlTR19QUkVGRVRDSF9BTElHTl9NQVNLCTB4MDIKICNkZWZpbmUJU0dfUFJFRkVUQ0hfQ05UX0xJTUlUCTB4MDEKICNkZWZpbmUJU0dfUFJFRkVUQ0hfQ05UCTB4MDAKLSNkZWZpbmUJRE9XTkxPQURfQ09OU1RfQ09VTlQJMHgwNworI2RlZmluZQlET1dOTE9BRF9DT05TVF9DT1VOVAkweDA4CiAKIAogLyogRXhwb3J0ZWQgTGFiZWxzICovCi0jZGVmaW5lCUxBQkVMX3NlcV9pc3IgCTB4MjY5Ci0jZGVmaW5lCUxBQkVMX3RpbWVyX2lzcgkweDI2NQorI2RlZmluZQlMQUJFTF9zZXFfaXNyIAkweDI4NQorI2RlZmluZQlMQUJFTF90aW1lcl9pc3IJMHgyODEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcmVnX3ByaW50LmNfc2hpcHBlZCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcmVnX3ByaW50LmNfc2hpcHBlZAppbmRleCAzMDk4YTc1Li5hNDEzN2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3JlZ19wcmludC5jX3NoaXBwZWQKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9yZWdfcHJpbnQuY19zaGlwcGVkCkBAIC0yLDggKzIsOCBAQAogICogRE8gTk9UIEVESVQgLSBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKICAqCQkgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZSBmaWxlczoKICAqCi0gKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguc2VxIzk0ICQKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5yZWcjNzAgJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnNlcSMxMTggJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnJlZyM3NSAkCiAgKi8KIAogI2luY2x1ZGUgImFpYzc5eHhfb3NtLmgiCkBAIC0xNzIsMjEgKzE3Miw2IEBACiAJICAgIDB4MGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKLXN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0VRSU5UU1RBVF9wYXJzZV90YWJsZVtdID0gewotCXsgIkNMUlNFUV9TUExUSU5UIiwJMHgwMSwgMHgwMSB9LAotCXsgIkNMUlNFUV9QQ0lJTlQiLAkweDAyLCAweDAyIH0sCi0JeyAiQ0xSU0VRX1NDU0lJTlQiLAkweDA0LCAweDA0IH0sCi0JeyAiQ0xSU0VRX1NFUUlOVCIsCTB4MDgsIDB4MDggfSwKLQl7ICJDTFJTRVFfU1dUTVJUTyIsCTB4MTAsIDB4MTAgfQotfTsKLQotaW50Ci1haGRfY2xyc2VxaW50c3RhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCi17Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSU0VRSU5UU1RBVF9wYXJzZV90YWJsZSwgNSwgIkNMUlNFUUlOVFNUQVQiLAotCSAgICAweDBjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNFUUlOVFNUQVRfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJTRVFfU1BMVElOVCIsCTB4MDEsIDB4MDEgfSwKIAl7ICJTRVFfUENJSU5UIiwJCTB4MDIsIDB4MDIgfSwKQEAgLTIwMiw2ICsxODcsMjEgQEAKIAkgICAgMHgwYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAorc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTFJTRVFJTlRTVEFUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0xSU0VRX1NQTFRJTlQiLAkweDAxLCAweDAxIH0sCisJeyAiQ0xSU0VRX1BDSUlOVCIsCTB4MDIsIDB4MDIgfSwKKwl7ICJDTFJTRVFfU0NTSUlOVCIsCTB4MDQsIDB4MDQgfSwKKwl7ICJDTFJTRVFfU0VRSU5UIiwJMHgwOCwgMHgwOCB9LAorCXsgIkNMUlNFUV9TV1RNUlRPIiwJMHgxMCwgMHgxMCB9Cit9OworCitpbnQKK2FoZF9jbHJzZXFpbnRzdGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihDTFJTRVFJTlRTVEFUX3BhcnNlX3RhYmxlLCA1LCAiQ0xSU0VRSU5UU1RBVCIsCisJICAgIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIGludAogYWhkX3N3dGltZXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewpAQCAtNjcwLDE2ICs2NzAsMTYgQEAKIH0KIAogaW50Ci1haGRfYnVzaW5pdGlkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK2FoZF9kbGNvdW50X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQlVTSU5JVElEIiwKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRExDT1VOVCIsCiAJICAgIDB4M2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludAotYWhkX2RsY291bnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQorYWhkX2J1c2luaXRpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRMQ09VTlQiLAorCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJCVVNJTklUSUQiLAogCSAgICAweDNjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCkBAIC04NTksMjEgKzg1OSw2IEBACiAJICAgIDB4NDksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKLXN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0JMS0NUTF9wYXJzZV90YWJsZVtdID0gewotCXsgIlNFTFdJREUiLAkJMHgwMiwgMHgwMiB9LAotCXsgIkVOQUIyMCIsCQkweDA0LCAweDA0IH0sCi0JeyAiRU5BQjQwIiwJCTB4MDgsIDB4MDggfSwKLQl7ICJESUFHTEVET04iLAkJMHg0MCwgMHg0MCB9LAotCXsgIkRJQUdMRURFTiIsCQkweDgwLCAweDgwIH0KLX07Ci0KLWludAotYWhkX3NibGtjdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQotewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNCTEtDVExfcGFyc2VfdGFibGUsIDUsICJTQkxLQ1RMIiwKLQkgICAgMHg0YSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBPUFRJT05NT0RFX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiQVVUT19NU0dPVVRfREUiLAkweDAyLCAweDAyIH0sCiAJeyAiRU5ER0ZPUk1DSEsiLAkweDA0LCAweDA0IH0sCkBAIC04OTEsMjIgKzg3NiwxOSBAQAogCSAgICAweDRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCi1zdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNTVEFUMF9wYXJzZV90YWJsZVtdID0gewotCXsgIkFSQkRPIiwJCTB4MDEsIDB4MDEgfSwKLQl7ICJTUElPUkRZIiwJCTB4MDIsIDB4MDIgfSwKLQl7ICJPVkVSUlVOIiwJCTB4MDQsIDB4MDQgfSwKLQl7ICJJT0VSUiIsCQkweDA4LCAweDA4IH0sCi0JeyAiU0VMSU5HTyIsCQkweDEwLCAweDEwIH0sCi0JeyAiU0VMREkiLAkJMHgyMCwgMHgyMCB9LAotCXsgIlNFTERPIiwJCTB4NDAsIDB4NDAgfSwKLQl7ICJUQVJHRVQiLAkJMHg4MCwgMHg4MCB9CitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNCTEtDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTRUxXSURFIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJFTkFCMjAiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkVOQUI0MCIsCQkweDA4LCAweDA4IH0sCisJeyAiRElBR0xFRE9OIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJESUFHTEVERU4iLAkJMHg4MCwgMHg4MCB9CiB9OwogCiBpbnQKLWFoZF9zc3RhdDBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQorYWhkX3NibGtjdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNTVEFUMF9wYXJzZV90YWJsZSwgOCwgIlNTVEFUMCIsCi0JICAgIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0JMS0NUTF9wYXJzZV90YWJsZSwgNSwgIlNCTEtDVEwiLAorCSAgICAweDRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENMUlNJTlQwX3BhcnNlX3RhYmxlW10gPSB7CkBAIC05MjYsNiArOTA4LDI0IEBACiAJICAgIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU1NUQVQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQVJCRE8iLAkJMHgwMSwgMHgwMSB9LAorCXsgIlNQSU9SRFkiLAkJMHgwMiwgMHgwMiB9LAorCXsgIk9WRVJSVU4iLAkJMHgwNCwgMHgwNCB9LAorCXsgIklPRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJTRUxJTkdPIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTRUxESSIsCQkweDIwLCAweDIwIH0sCisJeyAiU0VMRE8iLAkJMHg0MCwgMHg0MCB9LAorCXsgIlRBUkdFVCIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3NzdGF0MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU1NUQVQwX3BhcnNlX3RhYmxlLCA4LCAiU1NUQVQwIiwKKwkgICAgMHg0YiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKwogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTSU1PREUwX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiRU5BUkJETyIsCQkweDAxLCAweDAxIH0sCiAJeyAiRU5TUElPUkRZIiwJCTB4MDIsIDB4MDIgfSwKQEAgLTk5OCw2ICs5OTgsMTkgQEAKIAkgICAgMHg0ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAorc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTSU1PREUyX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRU5ETUFET05FIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJFTlNET05FIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJFTldJREVfUkVTIiwJCTB4MDQsIDB4MDQgfQorfTsKKworaW50CithaGRfc2ltb2RlMl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0lNT0RFMl9wYXJzZV90YWJsZSwgMywgIlNJTU9ERTIiLAorCSAgICAweDRkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENMUlNJTlQyX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiQ0xSRE1BRE9ORSIsCQkweDAxLCAweDAxIH0sCiAJeyAiQ0xSU0RPTkUiLAkJMHgwMiwgMHgwMiB9LApAQCAtMTAxMiwxOSArMTAyNSw2IEBACiAJICAgIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKLXN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFMl9wYXJzZV90YWJsZVtdID0gewotCXsgIkVORE1BRE9ORSIsCQkweDAxLCAweDAxIH0sCi0JeyAiRU5TRE9ORSIsCQkweDAyLCAweDAyIH0sCi0JeyAiRU5XSURFX1JFUyIsCQkweDA0LCAweDA0IH0KLX07Ci0KLWludAotYWhkX3NpbW9kZTJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQotewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNJTU9ERTJfcGFyc2VfdGFibGUsIDMsICJTSU1PREUyIiwKLQkgICAgMHg0ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBQRVJSRElBR19wYXJzZV90YWJsZVtdID0gewogCXsgIkRURVJSIiwJCTB4MDEsIDB4MDEgfSwKIAl7ICJER0ZPUk1FUlIiLAkJMHgwMiwgMHgwMiB9LApAQCAtMTIyMCwyMSArMTIyMCw2IEBACiAJICAgIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKLXN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTFFPTU9ERTBfcGFyc2VfdGFibGVbXSA9IHsKLQl7ICJFTkxRT1RDUkMiLAkJMHgwMSwgMHgwMSB9LAotCXsgIkVOTFFPQVROUEtUIiwJMHgwMiwgMHgwMiB9LAotCXsgIkVOTFFPQVROTFEiLAkJMHgwNCwgMHgwNCB9LAotCXsgIkVOTFFPU1RPUFQyIiwJMHgwOCwgMHgwOCB9LAotCXsgIkVOTFFPVEFSR1NDQlBFUlIiLAkweDEwLCAweDEwIH0KLX07Ci0KLWludAotYWhkX2xxb21vZGUwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihMUU9NT0RFMF9wYXJzZV90YWJsZSwgNSwgIkxRT01PREUwIiwKLQkgICAgMHg1NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUU9TVEFUMF9wYXJzZV90YWJsZVtdID0gewogCXsgIkxRT1RDUkMiLAkJMHgwMSwgMHgwMSB9LAogCXsgIkxRT0FUTlBLVCIsCQkweDAyLCAweDAyIH0sCkBAIC0xMjY1LDYgKzEyNTAsMzYgQEAKIAkgICAgMHg1NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAorc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUU9NT0RFMF9wYXJzZV90YWJsZVtdID0geworCXsgIkVOTFFPVENSQyIsCQkweDAxLCAweDAxIH0sCisJeyAiRU5MUU9BVE5QS1QiLAkweDAyLCAweDAyIH0sCisJeyAiRU5MUU9BVE5MUSIsCQkweDA0LCAweDA0IH0sCisJeyAiRU5MUU9TVE9QVDIiLAkweDA4LCAweDA4IH0sCisJeyAiRU5MUU9UQVJHU0NCUEVSUiIsCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfbHFvbW9kZTBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExRT01PREUwX3BhcnNlX3RhYmxlLCA1LCAiTFFPTU9ERTAiLAorCSAgICAweDU0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT01PREUxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRU5MUU9QSEFDSEdJTlBLVCIsCTB4MDEsIDB4MDEgfSwKKwl7ICJFTkxRT0JVU0ZSRUUiLAkweDAyLCAweDAyIH0sCisJeyAiRU5MUU9CQURRQVMiLAkweDA0LCAweDA0IH0sCisJeyAiRU5MUU9TVE9QSTIiLAkweDA4LCAweDA4IH0sCisJeyAiRU5MUU9JTklUU0NCUEVSUiIsCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfbHFvbW9kZTFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExRT01PREUxX3BhcnNlX3RhYmxlLCA1LCAiTFFPTU9ERTEiLAorCSAgICAweDU1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT1NUQVQxX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiTFFPUEhBQ0hHSU5QS1QiLAkweDAxLCAweDAxIH0sCiAJeyAiTFFPQlVTRlJFRSIsCQkweDAyLCAweDAyIH0sCkBAIC0xMjk1LDIxICsxMzEwLDYgQEAKIAkgICAgMHg1NSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAotc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUU9NT0RFMV9wYXJzZV90YWJsZVtdID0gewotCXsgIkVOTFFPUEhBQ0hHSU5QS1QiLAkweDAxLCAweDAxIH0sCi0JeyAiRU5MUU9CVVNGUkVFIiwJMHgwMiwgMHgwMiB9LAotCXsgIkVOTFFPQkFEUUFTIiwJMHgwNCwgMHgwNCB9LAotCXsgIkVOTFFPU1RPUEkyIiwJMHgwOCwgMHgwOCB9LAotCXsgIkVOTFFPSU5JVFNDQlBFUlIiLAkweDEwLCAweDEwIH0KLX07Ci0KLWludAotYWhkX2xxb21vZGUxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihMUU9NT0RFMV9wYXJzZV90YWJsZSwgNSwgIkxRT01PREUxIiwKLQkgICAgMHg1NSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUU9TVEFUMl9wYXJzZV90YWJsZVtdID0gewogCXsgIkxRT1NUT1AwIiwJCTB4MDEsIDB4MDEgfSwKIAl7ICJMUU9QSEFDSEdPVVRQS1QiLAkweDAyLCAweDAyIH0sCkBAIC0xNTk0LDYgKzE1OTQsMTMgQEAKIAkgICAgMHg2NSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAoraW50CithaGRfYW5uZXhkYXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTk5FWERBVCIsCisJICAgIDB4NjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NTQ0hLTl9wYXJzZV90YWJsZVtdID0gewogCXsgIkxTVFNHQ0xSRElTIiwJMHgwMSwgMHgwMSB9LAogCXsgIlNIVkFMSURTVERJUyIsCTB4MDIsIDB4MDIgfSwKQEAgLTE2MTIsMTMgKzE2MTksNiBAQAogfQogCiBpbnQKLWFoZF9hbm5leGRhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCi17Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFOTkVYREFUIiwKLQkgICAgMHg2NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQotaW50CiBhaGRfaW93bmlkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU9XTklEIiwKQEAgLTE3MjgsMTYgKzE3MjgsMTYgQEAKIH0KIAogaW50Ci1haGRfcGxsNDAwY250MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCithaGRfdW5mYWlybmVzc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlBMTDQwMENOVDAiLAorCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJVTkZBSVJORVNTIiwKIAkgICAgMHg2ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50Ci1haGRfdW5mYWlybmVzc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCithaGRfcGxsNDAwY250MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlVORkFJUk5FU1MiLAorCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJQTEw0MDBDTlQwIiwKIAkgICAgMHg2ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIApAQCAtMTc4OCwxMyArMTc4OCw2IEBACiB9CiAKIGludAotYWhkX3NnaGFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQotewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR0hBRERSIiwKLQkgICAgMHg3YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQotaW50CiBhaGRfc2NiaGFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JIQUREUiIsCkBAIC0xODAyLDEwICsxNzk1LDEwIEBACiB9CiAKIGludAotYWhkX3NnaGNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCithaGRfc2doYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHSENOVCIsCi0JICAgIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHSEFERFIiLAorCSAgICAweDdjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKQEAgLTE4MTUsNiArMTgwOCwxMyBAQAogCSAgICAweDg0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCitpbnQKK2FoZF9zZ2hjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR0hDTlQiLAorCSAgICAweDg0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERGRl9USFJTSF9wYXJzZV90YWJsZVtdID0gewogCXsgIldSX0RGVEhSU0hfTUlOIiwJMHgwMCwgMHg3MCB9LAogCXsgIlJEX0RGVEhSU0hfTUlOIiwJMHgwMCwgMHgwNyB9LApAQCAtMTk1MCwxNyArMTk1MCw2IEBACiAJICAgIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKLXN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIUlhNU0cxX3BhcnNlX3RhYmxlW10gPSB7Ci0JeyAiQ0JOVU0iLAkJMHhmZiwgMHhmZiB9Ci19OwotCi1pbnQKLWFoZF9kY2hyeG1zZzFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQotewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERDSFJYTVNHMV9wYXJzZV90YWJsZSwgMSwgIkRDSFJYTVNHMSIsCi0JICAgIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Ci19Ci0KIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ01DUlhNU0cxX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiQ0JOVU0iLAkJMHhmZiwgMHhmZiB9CiB9OwpAQCAtMTk3Miw2ICsxOTYxLDE3IEBACiAJICAgIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIUlhNU0cxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0JOVU0iLAkJMHhmZiwgMHhmZiB9Cit9OworCitpbnQKK2FoZF9kY2hyeG1zZzFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERDSFJYTVNHMV9wYXJzZV90YWJsZSwgMSwgIkRDSFJYTVNHMSIsCisJICAgIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIUlhNU0cyX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiTUlOREVYIiwJCTB4ZmYsIDB4ZmYgfQogfTsKQEAgLTE5ODMsMTcgKzE5ODMsNiBAQAogCSAgICAweDkyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCi1zdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IE9WTFlSWE1TRzJfcGFyc2VfdGFibGVbXSA9IHsKLQl7ICJNSU5ERVgiLAkJMHhmZiwgMHhmZiB9Ci19OwotCi1pbnQKLWFoZF9vdmx5cnhtc2cyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihPVkxZUlhNU0cyX3BhcnNlX3RhYmxlLCAxLCAiT1ZMWVJYTVNHMiIsCi0JICAgIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Ci19Ci0KIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ01DUlhNU0cyX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiTUlOREVYIiwJCTB4ZmYsIDB4ZmYgfQogfTsKQEAgLTIwMTIsNiArMjAwMSwxNyBAQAogCSAgICAweDkyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IE9WTFlSWE1TRzJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNSU5ERVgiLAkJMHhmZiwgMHhmZiB9Cit9OworCitpbnQKK2FoZF9vdmx5cnhtc2cyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihPVkxZUlhNU0cyX3BhcnNlX3RhYmxlLCAxLCAiT1ZMWVJYTVNHMiIsCisJICAgIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIUlhNU0czX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiTUNMQVNTIiwJCTB4MGYsIDB4MGYgfQogfTsKQEAgLTIwMjMsNiArMjAyMywxNyBAQAogCSAgICAweDkzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IE9WTFlSWE1TRzNfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNQ0xBU1MiLAkJMHgwZiwgMHgwZiB9Cit9OworCitpbnQKK2FoZF9vdmx5cnhtc2czX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihPVkxZUlhNU0czX3BhcnNlX3RhYmxlLCAxLCAiT1ZMWVJYTVNHMyIsCisJICAgIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ01DUlhNU0czX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiTUNMQVNTIiwJCTB4MGYsIDB4MGYgfQogfTsKQEAgLTIwNTEsMTcgKzIwNjIsNiBAQAogCSAgICAweDkzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCi1zdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IE9WTFlSWE1TRzNfcGFyc2VfdGFibGVbXSA9IHsKLQl7ICJNQ0xBU1MiLAkJMHgwZiwgMHgwZiB9Ci19OwotCi1pbnQKLWFoZF9vdmx5cnhtc2czX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihPVkxZUlhNU0czX3BhcnNlX3RhYmxlLCAxLCAiT1ZMWVJYTVNHMyIsCi0JICAgIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Ci19Ci0KIGludAogYWhkX292bHlzZXFiY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKQEAgLTIwNzAsMTYgKzIwNzAsMTYgQEAKIH0KIAogaW50Ci1haGRfY21jc2VxYmNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCithaGRfZGNoc2VxYmNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1NFUUJDTlQiLAorCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJEQ0hTRVFCQ05UIiwKIAkgICAgMHg5NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50Ci1haGRfZGNoc2VxYmNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCithaGRfY21jc2VxYmNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFNFUUJDTlQiLAorCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTUNTRVFCQ05UIiwKIAkgICAgMHg5NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIApAQCAtMjEwMSwyNCArMjEwMSw2IEBACiAJICAgIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKLXN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgT1ZMWVNQTFRTVEFUMF9wYXJzZV90YWJsZVtdID0gewotCXsgIlJYU1BMVFJTUCIsCQkweDAxLCAweDAxIH0sCi0JeyAiUlhTQ0VNU0ciLAkJMHgwMiwgMHgwMiB9LAotCXsgIlJYT1ZSVU4iLAkJMHgwNCwgMHgwNCB9LAotCXsgIkNOVE5PVENNUExUIiwJMHgwOCwgMHgwOCB9LAotCXsgIlNDREFUQlVDS0VUIiwJMHgxMCwgMHgxMCB9LAotCXsgIlNDQURFUlIiLAkJMHgyMCwgMHgyMCB9LAotCXsgIlNDQkNFUlIiLAkJMHg0MCwgMHg0MCB9LAotCXsgIlNUQUVURVJNIiwJCTB4ODAsIDB4ODAgfQotfTsKLQotaW50Ci1haGRfb3ZseXNwbHRzdGF0MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCi17Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoT1ZMWVNQTFRTVEFUMF9wYXJzZV90YWJsZSwgOCwgIk9WTFlTUExUU1RBVDAiLAotCSAgICAweDk2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERDSFNQTFRTVEFUMF9wYXJzZV90YWJsZVtdID0gewogCXsgIlJYU1BMVFJTUCIsCQkweDAxLCAweDAxIH0sCiAJeyAiUlhTQ0VNU0ciLAkJMHgwMiwgMHgwMiB9LApAQCAtMjEzNywxNSArMjExOSwyMiBAQAogCSAgICAweDk2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCi1zdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERDSFNQTFRTVEFUMV9wYXJzZV90YWJsZVtdID0gewotCXsgIlJYREFUQUJVQ0tFVCIsCTB4MDEsIDB4MDEgfQorc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBPVkxZU1BMVFNUQVQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUlhTUExUUlNQIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJSWFNDRU1TRyIsCQkweDAyLCAweDAyIH0sCisJeyAiUlhPVlJVTiIsCQkweDA0LCAweDA0IH0sCisJeyAiQ05UTk9UQ01QTFQiLAkweDA4LCAweDA4IH0sCisJeyAiU0NEQVRCVUNLRVQiLAkweDEwLCAweDEwIH0sCisJeyAiU0NBREVSUiIsCQkweDIwLCAweDIwIH0sCisJeyAiU0NCQ0VSUiIsCQkweDQwLCAweDQwIH0sCisJeyAiU1RBRVRFUk0iLAkJMHg4MCwgMHg4MCB9CiB9OwogCiBpbnQKLWFoZF9kY2hzcGx0c3RhdDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQorYWhkX292bHlzcGx0c3RhdDBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERDSFNQTFRTVEFUMV9wYXJzZV90YWJsZSwgMSwgIkRDSFNQTFRTVEFUMSIsCi0JICAgIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoT1ZMWVNQTFRTVEFUMF9wYXJzZV90YWJsZSwgOCwgIk9WTFlTUExUU1RBVDAiLAorCSAgICAweDk2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENNQ1NQTFRTVEFUMV9wYXJzZV90YWJsZVtdID0gewpAQCAtMjE3MCw2ICsyMTU5LDE3IEBACiAJICAgIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIU1BMVFNUQVQxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUlhEQVRBQlVDS0VUIiwJMHgwMSwgMHgwMSB9Cit9OworCitpbnQKK2FoZF9kY2hzcGx0c3RhdDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERDSFNQTFRTVEFUMV9wYXJzZV90YWJsZSwgMSwgIkRDSFNQTFRTVEFUMSIsCisJICAgIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0dSWE1TRzBfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJDRk5VTSIsCQkweDA3LCAweDA3IH0sCiAJeyAiQ0ROVU0iLAkJMHhmOCwgMHhmOCB9CkBAIC0yMzIwLDYgKzIzMjAsMTcgQEAKIAkgICAgMHg5ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAorc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR1NQTFRTVEFUMV9wYXJzZV90YWJsZVtdID0geworCXsgIlJYREFUQUJVQ0tFVCIsCTB4MDEsIDB4MDEgfQorfTsKKworaW50CithaGRfc2dzcGx0c3RhdDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNHU1BMVFNUQVQxX3BhcnNlX3RhYmxlLCAxLCAiU0dTUExUU1RBVDEiLAorCSAgICAweDlmLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNGVU5DVF9wYXJzZV90YWJsZVtdID0gewogCXsgIlRFU1RfTlVNIiwJCTB4MGYsIDB4MGYgfSwKIAl7ICJURVNUX0dST1VQIiwJCTB4ZjAsIDB4ZjAgfQpAQCAtMjMzMiwxNyArMjM0Myw2IEBACiAJICAgIDB4OWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKLXN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0dTUExUU1RBVDFfcGFyc2VfdGFibGVbXSA9IHsKLQl7ICJSWERBVEFCVUNLRVQiLAkweDAxLCAweDAxIH0KLX07Ci0KLWludAotYWhkX3Nnc3BsdHN0YXQxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTR1NQTFRTVEFUMV9wYXJzZV90YWJsZSwgMSwgIlNHU1BMVFNUQVQxIiwKLQkgICAgMHg5ZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBERjBQQ0lTVEFUX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiRFBSIiwJCTB4MDEsIDB4MDEgfSwKIAl7ICJUV0FURVJSIiwJCTB4MDIsIDB4MDIgfSwKQEAgLTI1MzcsMTYgKzI1MzcsMTYgQEAKIH0KIAogaW50Ci1haGRfY2NzY2JhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK2FoZF9jY3NjYmFkcl9ia19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQUREUiIsCisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQURSX0JLIiwKIAkgICAgMHhhYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50Ci1haGRfY2NzY2JhZHJfYmtfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQorYWhkX2Njc2NiYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQURSX0JLIiwKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTQ0JBRERSIiwKIAkgICAgMHhhYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIApAQCAtMjU2NiwyMiArMjU2Niw2IEBACiAJICAgIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKLXN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0NTR0NUTF9wYXJzZV90YWJsZVtdID0gewotCXsgIkNDU0dSRVNFVCIsCQkweDAxLCAweDAxIH0sCi0JeyAiU0dfRkVUQ0hfUkVRIiwJMHgwMiwgMHgwMiB9LAotCXsgIkNDU0dFTkFDSyIsCQkweDA4LCAweDA4IH0sCi0JeyAiU0dfQ0FDSEVfQVZBSUwiLAkweDEwLCAweDEwIH0sCi0JeyAiQ0NTR0RPTkUiLAkJMHg4MCwgMHg4MCB9LAotCXsgIkNDU0dFTiIsCQkweDBjLCAweDBjIH0KLX07Ci0KLWludAotYWhkX2Njc2djdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQotewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENDU0dDVExfcGFyc2VfdGFibGUsIDYsICJDQ1NHQ1RMIiwKLQkgICAgMHhhZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDQ1NDQkNUTF9wYXJzZV90YWJsZVtdID0gewogCXsgIkNDU0NCUkVTRVQiLAkJMHgwMSwgMHgwMSB9LAogCXsgIkNDU0NCRElSIiwJCTB4MDQsIDB4MDQgfSwKQEAgLTI1OTgsNiArMjU4MiwyMiBAQAogCSAgICAweGFkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENDU0dDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDQ1NHUkVTRVQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlNHX0ZFVENIX1JFUSIsCTB4MDIsIDB4MDIgfSwKKwl7ICJDQ1NHRU5BQ0siLAkJMHgwOCwgMHgwOCB9LAorCXsgIlNHX0NBQ0hFX0FWQUlMIiwJMHgxMCwgMHgxMCB9LAorCXsgIkNDU0dET05FIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJDQ1NHRU4iLAkJMHgwYywgMHgwYyB9Cit9OworCitpbnQKK2FoZF9jY3NnY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihDQ1NHQ1RMX3BhcnNlX3RhYmxlLCA2LCAiQ0NTR0NUTCIsCisJICAgIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIGludAogYWhkX2Njc2dyYW1fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewpAQCAtMjg0MSwxMyArMjg0MSw2IEBACiB9CiAKIGludAotYWhkX2RmcHRyc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCi17Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGUFRSUyIsCi0JICAgIDB4YzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Ci19Ci0KLWludAogYWhkX3JjdnJiaWFzY2FsY19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlJDVlJCSUFTQ0FMQyIsCkBAIC0yODU1LDEwICsyODQ4LDEwIEBACiB9CiAKIGludAotYWhkX2RmYmtwdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQorYWhkX2RmcHRyc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGQktQVFIiLAotCSAgICAweGM5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERlBUUlMiLAorCSAgICAweGM4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKQEAgLTI4NjgsNiArMjg2MSwxMyBAQAogCSAgICAweGM5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCitpbnQKK2FoZF9kZmJrcHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZCS1BUUiIsCisJICAgIDB4YzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgREZEQkNUTF9wYXJzZV90YWJsZVtdID0gewogCXsgIkRGRl9SQU1CSVNUX0VOIiwJMHgwMSwgMHgwMSB9LAogCXsgIkRGRl9SQU1CSVNUX0RPTkUiLAkweDAyLCAweDAyIH0sCkBAIC0zMDAxLDYgKzMwMDEsMTMgQEAKIAkgICAgMHhlNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAoraW50CithaGRfYnJrYWRkcjBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJCUktBRERSMCIsCisJICAgIDB4ZTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQlJLQUREUjFfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJCUktESVMiLAkJMHg4MCwgMHg4MCB9CiB9OwpAQCAtMzAxMywxMyArMzAyMCw2IEBACiB9CiAKIGludAotYWhkX2Jya2FkZHIwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQlJLQUREUjAiLAotCSAgICAweGU2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCi1pbnQKIGFoZF9hbGxvbmVzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUxMT05FUyIsCkBAIC0zMDY5LDEzICszMDY5LDYgQEAKIH0KIAogaW50Ci1haGRfY3VyYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCi17Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNVUkFERFIiLAotCSAgICAweGY0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCi1pbnQKIGFoZF9pbnR2ZWMxX2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRWRUMxX0FERFIiLApAQCAtMzA4MywxMCArMzA3NiwxMCBAQAogfQogCiBpbnQKLWFoZF9pbnR2ZWMyX2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQorYWhkX2N1cmFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRWRUMyX0FERFIiLAotCSAgICAweGY2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDVVJBRERSIiwKKwkgICAgMHhmNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50CkBAIC0zMDk3LDYgKzMwOTAsMTMgQEAKIH0KIAogaW50CithaGRfaW50dmVjMl9hZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UVkVDMl9BRERSIiwKKwkgICAgMHhmNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CiBhaGRfbG9uZ2ptcF9hZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTE9OR0pNUF9BRERSIiwKQEAgLTMxNzQsMjQgKzMxNzQsNDUgQEAKIH0KIAogaW50CithaGRfY29tcGxldGVfZG1hX3NjYl90YWlsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfRE1BX1NDQl9UQUlMIiwKKwkgICAgMHgxMmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2NvbXBsZXRlX29uX3FmcmVlemVfaGVhZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNPTVBMRVRFX09OX1FGUkVFWkVfSEVBRCIsCisJICAgIDB4MTMwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKIGFoZF9xZnJlZXplX2NvdW50X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUUZSRUVaRV9DT1VOVCIsCi0JICAgIDB4MTJlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDEzMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfa2VybmVsX3FmcmVlemVfY291bnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJLRVJORUxfUUZSRUVaRV9DT1VOVCIsCisJICAgIDB4MTM0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9zYXZlZF9tb2RlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0FWRURfTU9ERSIsCi0JICAgIDB4MTMwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDEzNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50CiBhaGRfbXNnX291dF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1TR19PVVQiLAotCSAgICAweDEzMSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxMzcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRE1BUEFSQU1TX3BhcnNlX3RhYmxlW10gPSB7CkBAIC0zMjExLDcgKzMyMzIsNyBAQAogYWhkX2RtYXBhcmFtc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRE1BUEFSQU1TX3BhcnNlX3RhYmxlLCAxMCwgIkRNQVBBUkFNUyIsCi0JICAgIDB4MTMyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDEzOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTRVFfRkxBR1NfcGFyc2VfdGFibGVbXSA9IHsKQEAgLTMyMzAsMjEgKzMyNTEsMjEgQEAKIGFoZF9zZXFfZmxhZ3NfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNFUV9GTEFHU19wYXJzZV90YWJsZSwgOSwgIlNFUV9GTEFHUyIsCi0JICAgIDB4MTMzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDEzOSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50CiBhaGRfc2F2ZWRfc2NzaWlkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0FWRURfU0NTSUlEIiwKLQkgICAgMHgxMzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTNhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9zYXZlZF9sdW5fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQVZFRF9MVU4iLAotCSAgICAweDEzNSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxM2IsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTEFTVFBIQVNFX3BhcnNlX3RhYmxlW10gPSB7CkBAIC0zMjY3LDQyICszMjg4LDQyIEBACiBhaGRfbGFzdHBoYXNlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihMQVNUUEhBU0VfcGFyc2VfdGFibGUsIDEzLCAiTEFTVFBIQVNFIiwKLQkgICAgMHgxMzYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTNjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9xb3V0Zmlmb19lbnRyeV92YWxpZF90YWdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGT19FTlRSWV9WQUxJRF9UQUciLAotCSAgICAweDEzNywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQotaW50Ci1haGRfc2hhcmVkX2RhdGFfYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCi17Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNIQVJFRF9EQVRBX0FERFIiLAotCSAgICAweDEzOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQotaW50Ci1haGRfcW91dGZpZm9fbmV4dF9hZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVEZJRk9fTkVYVF9BRERSIiwKLQkgICAgMHgxM2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTNkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9rZXJuZWxfdHFpbnBvc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIktFUk5FTF9UUUlOUE9TIiwKLQkgICAgMHgxNDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTNlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF90cWlucG9zX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVFFJTlBPUyIsCi0JICAgIDB4MTQxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDEzZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2hhcmVkX2RhdGFfYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNIQVJFRF9EQVRBX0FERFIiLAorCSAgICAweDE0MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcW91dGZpZm9fbmV4dF9hZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVEZJRk9fTkVYVF9BRERSIiwKKwkgICAgMHgxNDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQVJHXzFfcGFyc2VfdGFibGVbXSA9IHsKQEAgLTMzMjAsMjEgKzMzNDEsMjEgQEAKIGFoZF9hcmdfMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQVJHXzFfcGFyc2VfdGFibGUsIDgsICJBUkdfMSIsCi0JICAgIDB4MTQyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDE0OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50CiBhaGRfYXJnXzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBUkdfMiIsCi0JICAgIDB4MTQzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDE0OSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50CiBhaGRfbGFzdF9tc2dfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUX01TRyIsCi0JICAgIDB4MTQ0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDE0YSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQ1NJU0VRX1RFTVBMQVRFX3BhcnNlX3RhYmxlW10gPSB7CkBAIC0zMzUwLDE0ICszMzcxLDE0IEBACiBhaGRfc2NzaXNlcV90ZW1wbGF0ZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NTSVNFUV9URU1QTEFURV9wYXJzZV90YWJsZSwgNiwgIlNDU0lTRVFfVEVNUExBVEUiLAotCSAgICAweDE0NSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxNGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludAogYWhkX2luaXRpYXRvcl90YWdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTklUSUFUT1JfVEFHIiwKLQkgICAgMHgxNDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTRjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNFUV9GTEFHUzJfcGFyc2VfdGFibGVbXSA9IHsKQEAgLTMzNjksNjMgKzMzOTAsNjMgQEAKIGFoZF9zZXFfZmxhZ3MyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTRVFfRkxBR1MyX3BhcnNlX3RhYmxlLCAyLCAiU0VRX0ZMQUdTMiIsCi0JICAgIDB4MTQ3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDE0ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50CiBhaGRfYWxsb2NmaWZvX3NjYnB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFMTE9DRklGT19TQ0JQVFIiLAotCSAgICAweDE0OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxNGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludAogYWhkX2ludF9jb2FsZXNjaW5nX3RpbWVyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfVElNRVIiLAotCSAgICAweDE0YSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxNTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludAogYWhkX2ludF9jb2FsZXNjaW5nX21heGNtZHNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19NQVhDTURTIiwKLQkgICAgMHgxNGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTUyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9pbnRfY29hbGVzY2luZ19taW5jbWRzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfTUlOQ01EUyIsCi0JICAgIDB4MTRkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDE1MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50CiBhaGRfY21kc19wZW5kaW5nX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01EU19QRU5ESU5HIiwKLQkgICAgMHgxNGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTU0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9pbnRfY29hbGVzY2luZ19jbWRjb3VudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVF9DT0FMRVNDSU5HX0NNRENPVU5UIiwKLQkgICAgMHgxNTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTU2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9sb2NhbF9oc19tYWlsYm94X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTE9DQUxfSFNfTUFJTEJPWCIsCi0JICAgIDB4MTUxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDE1NywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50CiBhaGRfY21kc2l6ZV90YWJsZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRFNJWkVfVEFCTEUiLAotCSAgICAweDE1MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxNTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9zZXEuaF9zaGlwcGVkIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9zZXEuaF9zaGlwcGVkCmluZGV4IDc3YzQ3MWYuLmIxZTUzNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfc2VxLmhfc2hpcHBlZAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3NlcS5oX3NoaXBwZWQKQEAgLTIsMjE1ICsyLDIyOCBAQAogICogRE8gTk9UIEVESVQgLSBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKICAqCQkgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZSBmaWxlczoKICAqCi0gKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguc2VxIzk0ICQKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5yZWcjNzAgJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnNlcSMxMTkgJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnJlZyM3NiAkCiAgKi8KIHN0YXRpYyB1aW50OF90IHNlcXByb2dbXSA9IHsKIAkweGZmLCAweDAyLCAweDA2LCAweDc4LAotCTB4MDAsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwMCwgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDAxLCAweGVhLCAweDA0LCAweDMwLAogCTB4ZmYsIDB4MDQsIDB4MGMsIDB4NzgsCi0JMHgxOSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDE5LCAweGVhLCAweDY0LCAweDU5LAogCTB4MTksIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgzMywgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDMzLCAweGVhLCAweDVlLCAweDU5LAogCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCi0JMHg2MCwgMHgzYSwgMHgxYSwgMHg2OCwKLQkweDA0LCAweDQ3LCAweDFiLCAweDY4LAotCTB4ZmYsIDB4MjEsIDB4MWIsIDB4NzAsCi0JMHg0MCwgMHg0YiwgMHg5MiwgMHg2OSwKLQkweDAwLCAweGUyLCAweDU0LCAweDU5LAotCTB4NDAsIDB4NGIsIDB4OTIsIDB4NjksCi0JMHgyMCwgMHg0YiwgMHg4MiwgMHg2OSwKLQkweGZjLCAweDQyLCAweDI0LCAweDc4LAotCTB4MTAsIDB4NDAsIDB4MjQsIDB4NzgsCi0JMHgwMCwgMHhlMiwgMHhjNCwgMHg1ZCwKLQkweDIwLCAweDRkLCAweDI4LCAweDc4LAotCTB4MDAsIDB4ZTIsIDB4YzQsIDB4NWQsCisJMHg2MCwgMHgzYSwgMHgzYSwgMHg2OCwKKwkweDA0LCAweDRkLCAweDM1LCAweDc4LAorCTB4MDEsIDB4MzQsIDB4YzEsIDB4MzEsCisJMHgwMCwgMHgzMiwgMHgyMSwgMHg2MCwKKwkweDAxLCAweDM1LCAweGMxLCAweDMxLAorCTB4MDAsIDB4MzMsIDB4MjEsIDB4NjAsCisJMHhmYiwgMHg0ZCwgMHg5YiwgMHgwYSwKKwkweDAwLCAweGUyLCAweDM0LCAweDQwLAorCTB4NTAsIDB4NGIsIDB4M2EsIDB4NjgsCisJMHhmZiwgMHgzMSwgMHgzYiwgMHg3MCwKKwkweDAyLCAweDMwLCAweDUxLCAweDMxLAorCTB4ZmYsIDB4OGQsIDB4MmQsIDB4NzAsCisJMHgwMiwgMHg4YywgMHg1MSwgMHgzMSwKKwkweGZmLCAweDhkLCAweDI5LCAweDYwLAorCTB4MDIsIDB4MjgsIDB4MTksIDB4MzMsCisJMHgwMiwgMHgzMCwgMHg1MSwgMHgzMiwKKwkweGZmLCAweGVhLCAweDYyLCAweDAyLAorCTB4MDAsIDB4ZTIsIDB4M2EsIDB4NDAsCisJMHhmZiwgMHgyMSwgMHgzYiwgMHg3MCwKKwkweDQwLCAweDRiLCAweGFhLCAweDY5LAorCTB4MDAsIDB4ZTIsIDB4NjgsIDB4NTksCisJMHg0MCwgMHg0YiwgMHhhYSwgMHg2OSwKKwkweDIwLCAweDRiLCAweDk2LCAweDY5LAorCTB4ZmMsIDB4NDIsIDB4NDQsIDB4NzgsCisJMHgxMCwgMHg0MCwgMHg0NCwgMHg3OCwKKwkweDAwLCAweGUyLCAweGZjLCAweDVkLAorCTB4MjAsIDB4NGQsIDB4NDgsIDB4NzgsCisJMHgwMCwgMHhlMiwgMHhmYywgMHg1ZCwKIAkweDMwLCAweDNmLCAweGMwLCAweDA5LAotCTB4MzAsIDB4ZTAsIDB4MzAsIDB4NjAsCisJMHgzMCwgMHhlMCwgMHg1MCwgMHg2MCwKIAkweDdmLCAweDRhLCAweDk0LCAweDA4LAotCTB4MDAsIDB4ZTIsIDB4MzIsIDB4NDAsCisJMHgwMCwgMHhlMiwgMHg1MiwgMHg0MCwKIAkweGMwLCAweDRhLCAweDk0LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NTgsCi0JMHgwMCwgMHhlMiwgMHg1NiwgMHg1OCwKLQkweDAwLCAweGUyLCAweDY2LCAweDU4LAorCTB4MDAsIDB4ZTIsIDB4NWUsIDB4NTgsCisJMHgwMCwgMHhlMiwgMHg3NiwgMHg1OCwKKwkweDAwLCAweGUyLCAweDg2LCAweDU4LAogCTB4MDAsIDB4ZTIsIDB4MDYsIDB4NDAsCi0JMHgzMywgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDMzLCAweGVhLCAweDVlLCAweDU5LAogCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCi0JMHgwMSwgMHg1MiwgMHg2NCwgMHg3OCwKKwkweDAxLCAweDUyLCAweDg0LCAweDc4LAogCTB4MDIsIDB4NTgsIDB4NTAsIDB4MzEsCiAJMHhmZiwgMHhlYSwgMHgxMCwgMHgwYiwKLQkweGZmLCAweDk3LCAweDRmLCAweDc4LAotCTB4NTAsIDB4NGIsIDB4NGEsIDB4NjgsCisJMHhmZiwgMHg5NywgMHg2ZiwgMHg3OCwKKwkweDUwLCAweDRiLCAweDZhLCAweDY4LAogCTB4YmYsIDB4M2EsIDB4NzQsIDB4MDgsCi0JMHgxNCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDE0LCAweGVhLCAweDY0LCAweDU5LAogCTB4MTQsIDB4ZWEsIDB4MDQsIDB4MDAsCiAJMHgwOCwgMHg5MiwgMHgyNSwgMHgwMywKLQkweGZmLCAweDkwLCAweDNmLCAweDY4LAotCTB4MDAsIDB4ZTIsIDB4NTYsIDB4NWIsCi0JMHgwMCwgMHhlMiwgMHgzZSwgMHg0MCwKLQkweDAwLCAweGVhLCAweDQ0LCAweDU5LAorCTB4ZmYsIDB4OTAsIDB4NWYsIDB4NjgsCisJMHgwMCwgMHhlMiwgMHg3NiwgMHg1YiwKKwkweDAwLCAweGUyLCAweDVlLCAweDQwLAorCTB4MDAsIDB4ZWEsIDB4NWUsIDB4NTksCiAJMHgwMSwgMHhlYSwgMHgwMCwgMHgzMCwKLQkweDgwLCAweGY5LCAweDVlLCAweDY4LAotCTB4MDAsIDB4ZTIsIDB4NDIsIDB4NTksCi0JMHgxMSwgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDgwLCAweGY5LCAweDdlLCAweDY4LAorCTB4MDAsIDB4ZTIsIDB4NWMsIDB4NTksCisJMHgxMSwgMHhlYSwgMHg1ZSwgMHg1OSwKIAkweDExLCAweGVhLCAweDAwLCAweDAwLAotCTB4ODAsIDB4ZjksIDB4NDIsIDB4NzksCisJMHg4MCwgMHhmOSwgMHg1YywgMHg3OSwKIAkweGZmLCAweGVhLCAweGQ0LCAweDBkLAotCTB4MjIsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgyMiwgMHhlYSwgMHg1ZSwgMHg1OSwKIAkweDIyLCAweGVhLCAweDAwLCAweDAwLAotCTB4MTAsIDB4MTYsIDB4NzAsIDB4NzgsCi0JMHgwMSwgMHgwYiwgMHhhMiwgMHgzMiwKKwkweDEwLCAweDE2LCAweDkwLCAweDc4LAogCTB4MTAsIDB4MTYsIDB4MmMsIDB4MDAsCi0JMHgxOCwgMHhhZCwgMHgwMCwgMHg3OSwKLQkweDA0LCAweGFkLCAweGNhLCAweDY4LAotCTB4ODAsIDB4YWQsIDB4NjQsIDB4NzgsCi0JMHgxMCwgMHhhZCwgMHg5OCwgMHg3OCwKLQkweGZmLCAweDg4LCAweDgzLCAweDY4LAorCTB4MDEsIDB4MGIsIDB4YWUsIDB4MzIsCisJMHgxOCwgMHhhZCwgMHgxMiwgMHg3OSwKKwkweDA0LCAweGFkLCAweGRjLCAweDY4LAorCTB4ODAsIDB4YWQsIDB4ODQsIDB4NzgsCisJMHgxMCwgMHhhZCwgMHhhYSwgMHg3OCwKIAkweGU3LCAweGFkLCAweDVhLCAweDA5LAogCTB4MDIsIDB4OGMsIDB4NTksIDB4MzIsCisJMHhmZiwgMHg4ZCwgMHhhMSwgMHg2MCwKKwkweGZmLCAweGVhLCAweDVlLCAweDAyLAorCTB4ZmYsIDB4ODgsIDB4YTcsIDB4NzgsCisJMHgwMiwgMHgzMCwgMHgxOSwgMHgzMywKKwkweDAyLCAweGE4LCAweDYwLCAweDM2LAogCTB4MDIsIDB4MjgsIDB4MTksIDB4MzMsCiAJMHgwMiwgMHhhOCwgMHg1MCwgMHgzNiwKLQkweDMzLCAweGVhLCAweDQ0LCAweDU5LAotCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCi0JMHg0MCwgMHgzYSwgMHg2NCwgMHg2OCwKLQkweDUwLCAweDRiLCAweDY0LCAweDY4LAotCTB4MjIsIDB4ZWEsIDB4NDQsIDB4NTksCi0JMHgyMiwgMHhlYSwgMHgwMCwgMHgwMCwKIAkweGU3LCAweGFkLCAweDVhLCAweDA5LAotCTB4MDIsIDB4OGMsIDB4NTksIDB4MzIsCi0JMHgxYSwgMHhlYSwgMHg1MCwgMHg1OSwKLQkweDFhLCAweGVhLCAweDA0LCAweDAwLAotCTB4ZmYsIDB4ZWEsIDB4ZDQsIDB4MGQsCi0JMHhlNywgMHhhZCwgMHg1YSwgMHgwOSwKLQkweDAwLCAweGUyLCAweGE2LCAweDU4LAorCTB4MDAsIDB4ZTIsIDB4YjgsIDB4NTgsCiAJMHhmZiwgMHhlYSwgMHg1NiwgMHgwMiwKLQkweDA0LCAweDdjLCAweDc4LCAweDMyLAotCTB4MjAsIDB4MTYsIDB4NjQsIDB4NzgsCi0JMHgwNCwgMHgzOCwgMHg3OSwgMHgzMiwKLQkweDgwLCAweDM3LCAweDZmLCAweDE2LAotCTB4ZmYsIDB4MmQsIDB4YjUsIDB4NjAsCi0JMHhmZiwgMHgyOSwgMHhiNSwgMHg2MCwKLQkweDQwLCAweDUxLCAweGM1LCAweDc4LAotCTB4ZmYsIDB4NGYsIDB4YjUsIDB4NjgsCi0JMHhmZiwgMHg0ZCwgMHhjMSwgMHgxOSwKLQkweDAwLCAweDRlLCAweGQ1LCAweDE5LAotCTB4MDAsIDB4ZTIsIDB4YzQsIDB4NTAsCi0JMHgwMSwgMHg0YywgMHhjMSwgMHgzMSwKLQkweDAwLCAweDUwLCAweGQ1LCAweDE5LAotCTB4MDAsIDB4ZTIsIDB4YzQsIDB4NDgsCi0JMHg4MCwgMHgxOCwgMHg2NCwgMHg3OCwKLQkweDAyLCAweDRhLCAweDFkLCAweDMwLAorCTB4MDQsIDB4N2MsIDB4ODgsIDB4MzIsCisJMHgyMCwgMHgxNiwgMHg4NCwgMHg3OCwKKwkweDA0LCAweDQwLCAweDg5LCAweDMyLAorCTB4ODAsIDB4M2QsIDB4N2IsIDB4MTYsCisJMHhmZiwgMHgyZCwgMHhjNywgMHg2MCwKKwkweGZmLCAweDI5LCAweGM3LCAweDYwLAorCTB4NDAsIDB4NTcsIDB4ZDcsIDB4NzgsCisJMHhmZiwgMHg1NSwgMHhjNywgMHg2OCwKKwkweGZmLCAweDUzLCAweGMxLCAweDE5LAorCTB4MDAsIDB4NTQsIDB4ZDUsIDB4MTksCisJMHgwMCwgMHhlMiwgMHhkNiwgMHg1MCwKKwkweDAxLCAweDUyLCAweGMxLCAweDMxLAorCTB4MDAsIDB4NTYsIDB4ZDUsIDB4MTksCisJMHgwMCwgMHhlMiwgMHhkNiwgMHg0OCwKKwkweDgwLCAweDE4LCAweDg0LCAweDc4LAorCTB4MDIsIDB4NTAsIDB4MWQsIDB4MzAsCiAJMHgxMCwgMHhlYSwgMHgxOCwgMHgwMCwKIAkweDYwLCAweDE4LCAweDMwLCAweDAwLAogCTB4N2YsIDB4MTgsIDB4MzAsIDB4MGMsCiAJMHgwMiwgMHhlYSwgMHgwMiwgMHgwMCwKLQkweGZmLCAweGVhLCAweGEwLCAweDBhLAorCTB4ZmYsIDB4ZWEsIDB4YWMsIDB4MGEsCiAJMHg4MCwgMHgxOCwgMHgzMCwgMHgwNCwKLQkweDQwLCAweGFkLCAweDY0LCAweDc4LAorCTB4NDAsIDB4YWQsIDB4ODQsIDB4NzgsCiAJMHhlNywgMHhhZCwgMHg1YSwgMHgwOSwKIAkweDAyLCAweGE4LCAweDQwLCAweDMxLAogCTB4ZmYsIDB4ZWEsIDB4YzAsIDB4MDksCi0JMHgwMSwgMHg0ZSwgMHg5ZCwgMHgxYSwKLQkweDAwLCAweDRmLCAweDlmLCAweDIyLAorCTB4MDEsIDB4NTQsIDB4YTksIDB4MWEsCisJMHgwMCwgMHg1NSwgMHhhYiwgMHgyMiwKIAkweDAxLCAweDk0LCAweDZkLCAweDMzLAotCTB4MDEsIDB4ZWEsIDB4MjAsIDB4MzMsCisJMHhmZiwgMHhlYSwgMHgyMCwgMHgwYiwKIAkweDA0LCAweGFjLCAweDQ5LCAweDMyLAogCTB4ZmYsIDB4ZWEsIDB4NWEsIDB4MDMsCiAJMHhmZiwgMHhlYSwgMHg1ZSwgMHgwMywKIAkweDAxLCAweDEwLCAweGQ0LCAweDMxLAotCTB4MTAsIDB4OTIsIDB4ZjUsIDB4NjgsCisJMHgxMCwgMHg5MiwgMHgwNywgMHg2OSwKIAkweDNkLCAweDkzLCAweGM1LCAweDI5LAogCTB4ZmUsIDB4ZTIsIDB4YzQsIDB4MDksCiAJMHgwMSwgMHhlYSwgMHhjNiwgMHgwMSwKIAkweDAyLCAweGUyLCAweGM4LCAweDMxLAogCTB4MDIsIDB4ZWMsIDB4NTAsIDB4MzEsCiAJMHgwMiwgMHhhMCwgMHhkYSwgMHgzMSwKLQkweGZmLCAweGE5LCAweGY0LCAweDcwLAorCTB4ZmYsIDB4YTksIDB4MDYsIDB4NzEsCiAJMHgwMiwgMHhhMCwgMHg1OCwgMHgzNywKLQkweGZmLCAweDIxLCAweGZkLCAweDcwLAorCTB4ZmYsIDB4MjEsIDB4MGYsIDB4NzEsCiAJMHgwMiwgMHgyMiwgMHg1MSwgMHgzMSwKIAkweDAyLCAweGEwLCAweDVjLCAweDMzLAogCTB4MDIsIDB4YTAsIDB4NDQsIDB4MzYsCiAJMHgwMiwgMHhhMCwgMHg0MCwgMHgzMiwKIAkweDAyLCAweGEwLCAweDQ0LCAweDM2LAotCTB4MDQsIDB4NDcsIDB4MDUsIDB4NjksCi0JMHg0MCwgMHgxNiwgMHgzMCwgMHg2OSwKLQkweGZmLCAweDJkLCAweDM1LCAweDYxLAotCTB4ZmYsIDB4MjksIDB4NjUsIDB4NzAsCi0JMHgwMSwgMHgzNywgMHhjMSwgMHgzMSwKKwkweDA0LCAweDRkLCAweDE3LCAweDY5LAorCTB4NDAsIDB4MTYsIDB4NDgsIDB4NjksCisJMHhmZiwgMHgyZCwgMHg0ZCwgMHg2MSwKKwkweGZmLCAweDI5LCAweDg1LCAweDcwLAogCTB4MDIsIDB4MjgsIDB4NTUsIDB4MzIsCiAJMHgwMSwgMHhlYSwgMHg1YSwgMHgwMSwKLQkweDA0LCAweDNjLCAweGY5LCAweDMwLAorCTB4MDQsIDB4NDQsIDB4ZjksIDB4MzAsCisJMHgwMSwgMHg0NCwgMHhjMSwgMHgzMSwKIAkweDAyLCAweDI4LCAweDUxLCAweDMxLAotCTB4MDEsIDB4YTgsIDB4NjAsIDB4MzEsCi0JMHgwMCwgMHhhOSwgMHg2MCwgMHgwMSwKKwkweDAyLCAweGE4LCAweDYwLCAweDMxLAorCTB4MDEsIDB4YTQsIDB4NjEsIDB4MzEsCisJMHgwMSwgMHgzZCwgMHg2MSwgMHgzMSwKIAkweDAxLCAweDE0LCAweGQ0LCAweDMxLAotCTB4MDEsIDB4NTAsIDB4YTEsIDB4MWEsCi0JMHhmZiwgMHg0ZSwgMHg5ZCwgMHgxYSwKLQkweGZmLCAweDRmLCAweDlmLCAweDIyLAotCTB4ZmYsIDB4OGQsIDB4MjksIDB4NzEsCi0JMHg4MCwgMHhhYywgMHgyOCwgMHg3MSwKLQkweDIwLCAweDE2LCAweDI4LCAweDY5LAorCTB4MDEsIDB4NTYsIDB4YWQsIDB4MWEsCisJMHhmZiwgMHg1NCwgMHhhOSwgMHgxYSwKKwkweGZmLCAweDU1LCAweGFiLCAweDIyLAorCTB4ZmYsIDB4OGQsIDB4NDEsIDB4NzEsCisJMHg4MCwgMHhhYywgMHg0MCwgMHg3MSwKKwkweDIwLCAweDE2LCAweDQwLCAweDY5LAorCTB4MDAsIDB4YWMsIDB4YzQsIDB4MTksCisJMHgwNywgMHhlMiwgMHg0MCwgMHhmOSwKIAkweDAyLCAweDhjLCAweDUxLCAweDMxLAotCTB4MDAsIDB4ZTIsIDB4MTIsIDB4NDEsCisJMHgwMCwgMHhlMiwgMHgyNCwgMHg0MSwKIAkweDAxLCAweGFjLCAweDA4LCAweDMxLAogCTB4MDksIDB4ZWEsIDB4NWEsIDB4MDEsCiAJMHgwMiwgMHg4YywgMHg1MSwgMHgzMiwKIAkweGZmLCAweGVhLCAweDFhLCAweDA3LAogCTB4MDQsIDB4MjQsIDB4ZjksIDB4MzAsCi0JMHgxZCwgMHhlYSwgMHgzYSwgMHg0MSwKKwkweDFkLCAweGVhLCAweDUyLCAweDQxLAogCTB4MDIsIDB4MmMsIDB4NTEsIDB4MzEsCiAJMHgwNCwgMHhhOCwgMHhmOSwgMHgzMCwKLQkweDE5LCAweGVhLCAweDNhLCAweDQxLAorCTB4MTksIDB4ZWEsIDB4NTIsIDB4NDEsCiAJMHgwNiwgMHhlYSwgMHgwOCwgMHg4MSwKIAkweDAxLCAweGUyLCAweDVhLCAweDM1LAotCTB4MDIsIDB4ZjIsIDB4ZjAsIDB4MzUsCisJMHgwMiwgMHhmMiwgMHhmMCwgMHgzMSwKKwkweGZmLCAweGVhLCAweGQ0LCAweDBkLAogCTB4MDIsIDB4ZjIsIDB4ZjAsIDB4MzEsCiAJMHgwMiwgMHhmOCwgMHhlNCwgMHgzNSwKIAkweDgwLCAweGVhLCAweGIyLCAweDAxLAogCTB4MDEsIDB4ZTIsIDB4MDAsIDB4MzAsCiAJMHhmZiwgMHhlYSwgMHhiMiwgMHgwZCwKLQkweDgwLCAweGVhLCAweGIyLCAweDAxLAotCTB4MTEsIDB4MDAsIDB4MDAsIDB4MTAsCi0JMHhmZiwgMHhlYSwgMHhiMiwgMHgwZCwKIAkweDAxLCAweGUyLCAweDA0LCAweDMwLAogCTB4MDEsIDB4ZWEsIDB4MDQsIDB4MzQsCiAJMHgwMiwgMHgyMCwgMHhiZCwgMHgzMCwKIAkweDAyLCAweDIwLCAweGI5LCAweDMwLAogCTB4MDIsIDB4MjAsIDB4NTEsIDB4MzEsCiAJMHg0YywgMHg5MywgMHhkNywgMHgyOCwKLQkweDEwLCAweDkyLCAweDYzLCAweDc5LAorCTB4MTAsIDB4OTIsIDB4NzcsIDB4NzksCiAJMHgwMSwgMHg2YiwgMHhjMCwgMHgzMCwKIAkweDAyLCAweDY0LCAweGM4LCAweDAwLAogCTB4NDAsIDB4M2EsIDB4NzQsIDB4MDQsCi0JMHgwMCwgMHhlMiwgMHg1NiwgMHg1OCwKLQkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MDAsIDB4ZTIsIDB4NzYsIDB4NTgsCisJMHgzMywgMHhlYSwgMHg1ZSwgMHg1OSwKIAkweDMzLCAweGVhLCAweDAwLCAweDAwLAogCTB4MzAsIDB4M2YsIDB4YzAsIDB4MDksCi0JMHgzMCwgMHhlMCwgMHg2NCwgMHg2MSwKLQkweDIwLCAweDNmLCAweDdhLCAweDY5LAotCTB4MTAsIDB4M2YsIDB4NjQsIDB4NzksCisJMHgzMCwgMHhlMCwgMHg3OCwgMHg2MSwKKwkweDIwLCAweDNmLCAweDhlLCAweDY5LAorCTB4MTAsIDB4M2YsIDB4NzgsIDB4NzksCiAJMHgwMiwgMHhlYSwgMHg3ZSwgMHgwMCwKLQkweDAwLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MDAsIDB4ZWEsIDB4NWUsIDB4NTksCiAJMHgwMSwgMHhlYSwgMHgwMCwgMHgzMCwKLQkweDAyLCAweDQ4LCAweDUxLCAweDM1LAorCTB4MDIsIDB4NGUsIDB4NTEsIDB4MzUsCiAJMHgwMSwgMHhlYSwgMHg3ZSwgMHgwMCwKLQkweDExLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MTEsIDB4ZWEsIDB4NWUsIDB4NTksCiAJMHgxMSwgMHhlYSwgMHgwMCwgMHgwMCwKLQkweDAyLCAweDQ4LCAweDUxLCAweDM1LAorCTB4MDIsIDB4NGUsIDB4NTEsIDB4MzUsCisJMHhjMCwgMHg0YSwgMHg5NCwgMHgwMCwKKwkweDA0LCAweDQxLCAweDljLCAweDc5LAogCTB4MDgsIDB4ZWEsIDB4OTgsIDB4MDAsCiAJMHgwOCwgMHg1NywgMHhhZSwgMHgwMCwKIAkweDA4LCAweDNjLCAweDc4LCAweDAwLAotCTB4ZjAsIDB4NDksIDB4NjgsIDB4MGEsCisJMHhmMCwgMHg0OSwgMHg3NCwgMHgwYSwKIAkweDBmLCAweDY3LCAweGMwLCAweDA5LAotCTB4MDAsIDB4MzQsIDB4NjksIDB4MDIsCisJMHgwMCwgMHgzYSwgMHg3NSwgMHgwMiwKIAkweDIwLCAweGVhLCAweDk2LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCi0JMHg0MCwgMHgzYSwgMHhhZSwgMHg2OSwKKwkweDAwLCAweGUyLCAweDE0LCAweDQyLAorCTB4YzAsIDB4NGEsIDB4OTQsIDB4MDAsCisJMHg0MCwgMHgzYSwgMHhjOCwgMHg2OSwKIAkweDAyLCAweDU1LCAweDA2LCAweDY4LAotCTB4MDIsIDB4NTYsIDB4YWUsIDB4NjksCi0JMHhmZiwgMHg1YiwgMHhhZSwgMHg2MSwKKwkweDAyLCAweDU2LCAweGM4LCAweDY5LAorCTB4ZmYsIDB4NWIsIDB4YzgsIDB4NjEsCiAJMHgwMiwgMHgyMCwgMHg1MSwgMHgzMSwKIAkweDgwLCAweGVhLCAweGIyLCAweDAxLAogCTB4NDQsIDB4ZWEsIDB4MDAsIDB4MDAsCkBAIC0yMTgsMjM3ICsyMzEsMjQ2IEBACiAJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKIAkweGZmLCAweGVhLCAweGIyLCAweDA5LAogCTB4ZmYsIDB4ZTAsIDB4YzAsIDB4MTksCi0JMHhmZiwgMHhlMCwgMHhiMCwgMHg3OSwKKwkweGZmLCAweGUwLCAweGNhLCAweDc5LAogCTB4MDIsIDB4YWMsIDB4NTEsIDB4MzEsCi0JMHgwMCwgMHhlMiwgMHhhNiwgMHg0MSwKKwkweDAwLCAweGUyLCAweGMwLCAweDQxLAogCTB4MDIsIDB4NWUsIDB4NTAsIDB4MzEsCiAJMHgwMiwgMHhhOCwgMHhiOCwgMHgzMCwKIAkweDAyLCAweDVjLCAweDUwLCAweDMxLAotCTB4ZmYsIDB4YWQsIDB4YzEsIDB4NzEsCisJMHhmZiwgMHhhZCwgMHhkYiwgMHg3MSwKIAkweDAyLCAweGFjLCAweDQxLCAweDMxLAogCTB4MDIsIDB4MjIsIDB4NTEsIDB4MzEsCiAJMHgwMiwgMHhhMCwgMHg1YywgMHgzMywKIAkweDAyLCAweGEwLCAweDQ0LCAweDMyLAotCTB4MDAsIDB4ZTIsIDB4Y2EsIDB4NDEsCi0JMHgxMCwgMHg5MiwgMHhjYiwgMHg2OSwKKwkweDAwLCAweGUyLCAweGU0LCAweDQxLAorCTB4MTAsIDB4OTIsIDB4ZTUsIDB4NjksCiAJMHgzZCwgMHg5MywgMHhjOSwgMHgyOSwKIAkweDAxLCAweGU0LCAweGM4LCAweDAxLAogCTB4MDEsIDB4ZWEsIDB4Y2EsIDB4MDEsCiAJMHhmZiwgMHhlYSwgMHhkYSwgMHgwMSwKIAkweDAyLCAweDIwLCAweDUxLCAweDMxLAogCTB4MDIsIDB4YWUsIDB4NDEsIDB4MzIsCi0JMHhmZiwgMHgyMSwgMHhkMywgMHg2MSwKKwkweGZmLCAweDIxLCAweGVkLCAweDYxLAogCTB4ZmYsIDB4ZWEsIDB4NDYsIDB4MDIsCiAJMHgwMiwgMHg1YywgMHg1MCwgMHgzMSwKIAkweDQwLCAweGVhLCAweDk2LCAweDAwLAotCTB4MDIsIDB4NTYsIDB4Y2MsIDB4NmQsCi0JMHgwMSwgMHg1NSwgMHhjYywgMHg2ZCwKLQkweDEwLCAweDkyLCAweGRmLCAweDc5LAotCTB4MTAsIDB4NDAsIDB4ZTgsIDB4NjksCi0JMHgwMSwgMHg1NiwgMHhlOCwgMHg3OSwKKwkweDAyLCAweDU2LCAweDA0LCAweDZlLAorCTB4MDEsIDB4NTUsIDB4MDQsIDB4NmUsCisJMHgxMCwgMHg5MiwgMHhmOSwgMHg3OSwKKwkweDEwLCAweDQwLCAweDAyLCAweDZhLAorCTB4MDEsIDB4NTYsIDB4MDIsIDB4N2EsCiAJMHhmZiwgMHg5NywgMHgwNywgMHg3OCwKLQkweDEzLCAweGVhLCAweDUwLCAweDU5LAorCTB4MTMsIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgxMywgMHhlYSwgMHgwNCwgMHgwMCwKIAkweDAwLCAweGUyLCAweDA2LCAweDQwLAogCTB4YmYsIDB4M2EsIDB4NzQsIDB4MDgsCisJMHgwNCwgMHg0MSwgMHgwOCwgMHg3YSwKIAkweDA4LCAweGVhLCAweDk4LCAweDAwLAogCTB4MDgsIDB4NTcsIDB4YWUsIDB4MDAsCi0JMHgwMSwgMHg5MywgMHg2OSwgMHgzMiwKLQkweDAxLCAweDk0LCAweDZiLCAweDMyLAotCTB4NDAsIDB4ZWEsIDB4NjYsIDB4MDIsCisJMHgwMSwgMHg5MywgMHg3NSwgMHgzMiwKKwkweDAxLCAweDk0LCAweDc3LCAweDMyLAorCTB4NDAsIDB4ZWEsIDB4NzIsIDB4MDIsCiAJMHgwOCwgMHgzYywgMHg3OCwgMHgwMCwKLQkweDgwLCAweGVhLCAweDYyLCAweDAyLAotCTB4MDAsIDB4ZTIsIDB4YjgsIDB4NWIsCi0JMHgwMSwgMHgzNiwgMHhjMSwgMHgzMSwKLQkweDlmLCAweGUwLCAweDRjLCAweDdjLAotCTB4ODAsIDB4ZTAsIDB4MGMsIDB4NzIsCi0JMHhhMCwgMHhlMCwgMHg0NCwgMHg3MiwKLQkweGMwLCAweGUwLCAweDNhLCAweDcyLAotCTB4ZTAsIDB4ZTAsIDB4NzQsIDB4NzIsCi0JMHgwMSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDgwLCAweGVhLCAweDZlLCAweDAyLAorCTB4MDAsIDB4ZTIsIDB4ZTIsIDB4NWIsCisJMHgwMSwgMHgzYywgMHhjMSwgMHgzMSwKKwkweDlmLCAweGUwLCAweDg0LCAweDdjLAorCTB4ODAsIDB4ZTAsIDB4MjgsIDB4NzIsCisJMHhhMCwgMHhlMCwgMHg2NCwgMHg3MiwKKwkweGMwLCAweGUwLCAweDVhLCAweDcyLAorCTB4ZTAsIDB4ZTAsIDB4OTQsIDB4NzIsCisJMHgwMSwgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDAxLCAweGVhLCAweDA0LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCi0JMHg4MCwgMHgzMywgMHgxMywgMHg3YSwKLQkweDAzLCAweGVhLCAweDUwLCAweDU5LAorCTB4MDAsIDB4ZTIsIDB4MTQsIDB4NDIsCisJMHg4MCwgMHgzOSwgMHgyZiwgMHg3YSwKKwkweDAzLCAweGVhLCAweDY0LCAweDU5LAogCTB4MDMsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHhlZSwgMHgwMCwgMHgxYSwgMHg2YSwKKwkweGVlLCAweDAwLCAweDM2LCAweDZhLAogCTB4MDUsIDB4ZWEsIDB4YjQsIDB4MDAsCi0JMHgzMywgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDMzLCAweGVhLCAweDVlLCAweDU5LAogCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCi0JMHgwMiwgMHhhOCwgMHg5MCwgMHgzMiwKLQkweDAwLCAweGUyLCAweDZhLCAweDU5LAorCTB4MDIsIDB4YTgsIDB4OWMsIDB4MzIsCisJMHgwMCwgMHhlMiwgMHg3ZSwgMHg1OSwKIAkweGVmLCAweDk2LCAweGQ1LCAweDE5LAotCTB4MDAsIDB4ZTIsIDB4MmEsIDB4NTIsCisJMHgwMCwgMHhlMiwgMHg0NiwgMHg1MiwKIAkweDA5LCAweDgwLCAweGUxLCAweDMwLAogCTB4MDIsIDB4ZWEsIDB4MzYsIDB4MDAsCiAJMHhhOCwgMHhlYSwgMHgzMiwgMHgwMCwKLQkweDAwLCAweGUyLCAweDMwLCAweDQyLAorCTB4MDAsIDB4ZTIsIDB4NGMsIDB4NDIsCiAJMHgwMSwgMHg5NiwgMHhkMSwgMHgzMCwKIAkweDEwLCAweDgwLCAweDg5LCAweDMxLAogCTB4MjAsIDB4ZWEsIDB4MzIsIDB4MDAsCi0JMHhiZiwgMHgzMywgMHg2NywgMHgwYSwKLQkweDIwLCAweDE5LCAweDMyLCAweDZhLAotCTB4MDIsIDB4NGQsIDB4ZjgsIDB4NjksCi0JMHg0MCwgMHgzMywgMHg2NywgMHgwMiwKLQkweDAwLCAweGUyLCAweGY4LCAweDQxLAotCTB4ODAsIDB4MzMsIDB4YjUsIDB4NmEsCisJMHhiZiwgMHgzOSwgMHg3MywgMHgwYSwKKwkweDEwLCAweDRjLCAweDU2LCAweDZhLAorCTB4MjAsIDB4MTksIDB4NGUsIDB4NmEsCisJMHgyMCwgMHgxOSwgMHg1MiwgMHg2YSwKKwkweDAyLCAweDRkLCAweDE0LCAweDZhLAorCTB4NDAsIDB4MzksIDB4NzMsIDB4MDIsCisJMHgwMCwgMHhlMiwgMHgxNCwgMHg0MiwKKwkweDgwLCAweDM5LCAweGQ1LCAweDZhLAogCTB4MDEsIDB4NDQsIDB4MTAsIDB4MzMsCiAJMHgwOCwgMHg5MiwgMHgyNSwgMHgwMywKLQkweDAwLCAweGUyLCAweGY4LCAweDQxLAorCTB4MDAsIDB4ZTIsIDB4MTQsIDB4NDIsCiAJMHgxMCwgMHhlYSwgMHg4MCwgMHgwMCwKLQkweDAxLCAweDMxLCAweGM1LCAweDMxLAotCTB4ODAsIDB4ZTIsIDB4NjAsIDB4NjIsCi0JMHgxMCwgMHg5MiwgMHg4NSwgMHg2YSwKKwkweDAxLCAweDM3LCAweGM1LCAweDMxLAorCTB4ODAsIDB4ZTIsIDB4ODAsIDB4NjIsCisJMHgxMCwgMHg5MiwgMHhhNSwgMHg2YSwKIAkweGMwLCAweDk0LCAweGM1LCAweDAxLAotCTB4NDAsIDB4OTIsIDB4NTEsIDB4NmEsCisJMHg0MCwgMHg5MiwgMHg3MSwgMHg2YSwKIAkweGJmLCAweGUyLCAweGM0LCAweDA5LAotCTB4MjAsIDB4OTIsIDB4NjUsIDB4N2EsCisJMHgyMCwgMHg5MiwgMHg4NSwgMHg3YSwKIAkweDAxLCAweGUyLCAweDg4LCAweDMwLAotCTB4MDAsIDB4ZTIsIDB4YjgsIDB4NWIsCi0JMHhhMCwgMHgzNiwgMHg2ZCwgMHg2MiwKKwkweDAwLCAweGUyLCAweGUyLCAweDViLAorCTB4YTAsIDB4M2MsIDB4OGQsIDB4NjIsCiAJMHgyMywgMHg5MiwgMHg4OSwgMHgwOCwKLQkweDAwLCAweGUyLCAweGI4LCAweDViLAotCTB4YTAsIDB4MzYsIDB4NmQsIDB4NjIsCi0JMHgwMCwgMHhhOCwgMHg2NCwgMHg0MiwKLQkweGZmLCAweGUyLCAweDY0LCAweDYyLAotCTB4MDAsIDB4ZTIsIDB4ODQsIDB4NDIsCisJMHgwMCwgMHhlMiwgMHhlMiwgMHg1YiwKKwkweGEwLCAweDNjLCAweDhkLCAweDYyLAorCTB4MDAsIDB4YTgsIDB4ODQsIDB4NDIsCisJMHhmZiwgMHhlMiwgMHg4NCwgMHg2MiwKKwkweDAwLCAweGUyLCAweGE0LCAweDQyLAogCTB4NDAsIDB4ZWEsIDB4OTgsIDB4MDAsCiAJMHgwMSwgMHhlMiwgMHg4OCwgMHgzMCwKLQkweDAwLCAweGUyLCAweGI4LCAweDViLAotCTB4YTAsIDB4MzYsIDB4NDMsIDB4NzIsCisJMHgwMCwgMHhlMiwgMHhlMiwgMHg1YiwKKwkweGEwLCAweDNjLCAweDYzLCAweDcyLAogCTB4NDAsIDB4ZWEsIDB4OTgsIDB4MDAsCi0JMHgwMSwgMHgzMSwgMHg4OSwgMHgzMiwKLQkweDA4LCAweGVhLCAweDYyLCAweDAyLAotCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCi0JMHhlMCwgMHhlYSwgMHhkNCwgMHg1YiwKLQkweDgwLCAweGUwLCAweGMwLCAweDZhLAotCTB4MDQsIDB4ZTAsIDB4NjYsIDB4NzMsCi0JMHgwMiwgMHhlMCwgMHg5NiwgMHg3MywKLQkweDAwLCAweGVhLCAweDFlLCAweDczLAotCTB4MDMsIDB4ZTAsIDB4YTYsIDB4NzMsCi0JMHgyMywgMHhlMCwgMHg5NiwgMHg3MiwKLQkweDA4LCAweGUwLCAweGJjLCAweDcyLAotCTB4MDAsIDB4ZTIsIDB4YjgsIDB4NWIsCi0JMHgwNywgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDAxLCAweDM3LCAweDk1LCAweDMyLAorCTB4MDgsIDB4ZWEsIDB4NmUsIDB4MDIsCisJMHgwMCwgMHhlMiwgMHgxNCwgMHg0MiwKKwkweGUwLCAweGVhLCAweGZlLCAweDViLAorCTB4ODAsIDB4ZTAsIDB4ZTAsIDB4NmEsCisJMHgwNCwgMHhlMCwgMHg5MiwgMHg3MywKKwkweDAyLCAweGUwLCAweGM0LCAweDczLAorCTB4MDAsIDB4ZWEsIDB4M2UsIDB4NzMsCisJMHgwMywgMHhlMCwgMHhkNCwgMHg3MywKKwkweDIzLCAweGUwLCAweGI2LCAweDcyLAorCTB4MDgsIDB4ZTAsIDB4ZGMsIDB4NzIsCisJMHgwMCwgMHhlMiwgMHhlMiwgMHg1YiwKKwkweDA3LCAweGVhLCAweDY0LCAweDU5LAogCTB4MDcsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgwOCwgMHg0MiwgMHhmOSwgMHg3MSwKLQkweDA0LCAweDQyLCAweDkzLCAweDYyLAotCTB4MDEsIDB4NDMsIDB4ODksIDB4MzAsCi0JMHgwMCwgMHhlMiwgMHg4NCwgMHg0MiwKKwkweDA4LCAweDQ4LCAweDE1LCAweDcyLAorCTB4MDQsIDB4NDgsIDB4YjMsIDB4NjIsCisJMHgwMSwgMHg0OSwgMHg4OSwgMHgzMCwKKwkweDAwLCAweGUyLCAweGE0LCAweDQyLAogCTB4MDEsIDB4NDQsIDB4ZDQsIDB4MzEsCi0JMHgwMCwgMHhlMiwgMHg4NCwgMHg0MiwKLQkweDAxLCAweDAwLCAweDYwLCAweDMyLAotCTB4MzMsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgwMCwgMHhlMiwgMHhhNCwgMHg0MiwKKwkweDAxLCAweDAwLCAweDZjLCAweDMyLAorCTB4MzMsIDB4ZWEsIDB4NWUsIDB4NTksCiAJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKLQkweDRjLCAweDM0LCAweGMxLCAweDI4LAorCTB4NGMsIDB4M2EsIDB4YzEsIDB4MjgsCiAJMHgwMSwgMHg2NCwgMHhjMCwgMHgzMSwKLQkweDAwLCAweDMwLCAweDQ1LCAweDU5LAotCTB4MDEsIDB4MzAsIDB4MDEsIDB4MzAsCi0JMHgwMSwgMHhlMCwgMHhiYSwgMHg3YSwKLQkweGEwLCAweGVhLCAweGNhLCAweDViLAotCTB4MDEsIDB4YTAsIDB4YmEsIDB4NjIsCi0JMHgwMSwgMHg4NCwgMHhhZiwgMHg3YSwKLQkweDAxLCAweDk1LCAweGJkLCAweDZhLAotCTB4MDUsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwMCwgMHgzNiwgMHg1ZiwgMHg1OSwKKwkweDAxLCAweDM2LCAweDAxLCAweDMwLAorCTB4MDEsIDB4ZTAsIDB4ZGEsIDB4N2EsCisJMHhhMCwgMHhlYSwgMHhmNCwgMHg1YiwKKwkweDAxLCAweGEwLCAweGRhLCAweDYyLAorCTB4MDEsIDB4ODQsIDB4Y2YsIDB4N2EsCisJMHgwMSwgMHg5NSwgMHhkZCwgMHg2YSwKKwkweDA1LCAweGVhLCAweDY0LCAweDU5LAogCTB4MDUsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHhiYywgMHg0MiwKLQkweDAzLCAweGVhLCAweDUwLCAweDU5LAorCTB4MDAsIDB4ZTIsIDB4ZGMsIDB4NDIsCisJMHgwMywgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDAzLCAweGVhLCAweDA0LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4YmMsIDB4NDIsCi0JMHgwNywgMHhlYSwgMHhkYywgMHg1YiwKKwkweDAwLCAweGUyLCAweGRjLCAweDQyLAorCTB4MDcsIDB4ZWEsIDB4MDYsIDB4NWMsCiAJMHgwMSwgMHg0NCwgMHhkNCwgMHgzMSwKLQkweDAwLCAweGUyLCAweGY4LCAweDQxLAotCTB4M2YsIDB4ZTAsIDB4NmEsIDB4MGEsCi0JMHhjMCwgMHgzNCwgMHhjMSwgMHgwOSwKLQkweDAwLCAweDM1LCAweDUxLCAweDAxLAorCTB4MDAsIDB4ZTIsIDB4MTQsIDB4NDIsCisJMHgzZiwgMHhlMCwgMHg3NiwgMHgwYSwKKwkweGMwLCAweDNhLCAweGMxLCAweDA5LAorCTB4MDAsIDB4M2IsIDB4NTEsIDB4MDEsCiAJMHhmZiwgMHhlYSwgMHg1MiwgMHgwOSwKLQkweDMwLCAweDM0LCAweGM1LCAweDA5LAorCTB4MzAsIDB4M2EsIDB4YzUsIDB4MDksCiAJMHgzZCwgMHhlMiwgMHhjNCwgMHgyOSwKIAkweGI4LCAweGUyLCAweGM0LCAweDE5LAogCTB4MDEsIDB4ZWEsIDB4YzYsIDB4MDEsCiAJMHgwMiwgMHhlMiwgMHhjOCwgMHgzMSwKIAkweDAyLCAweGVjLCAweDQwLCAweDMxLAotCTB4ZmYsIDB4YTEsIDB4ZGMsIDB4NzIsCisJMHhmZiwgMHhhMSwgMHhmYywgMHg3MiwKIAkweDAyLCAweGU4LCAweGRhLCAweDMxLAogCTB4MDIsIDB4YTAsIDB4NTAsIDB4MzEsCi0JMHgwMCwgMHhlMiwgMHhmZSwgMHg0MiwKLQkweDgwLCAweDMzLCAweDY3LCAweDAyLAorCTB4MDAsIDB4ZTIsIDB4MWUsIDB4NDMsCisJMHg4MCwgMHgzOSwgMHg3MywgMHgwMiwKIAkweDAxLCAweDQ0LCAweGQ0LCAweDMxLAotCTB4MDAsIDB4ZTIsIDB4YjgsIDB4NWIsCi0JMHgwMSwgMHgzMywgMHg2NywgMHgwMiwKLQkweGUwLCAweDM2LCAweDE5LCAweDYzLAotCTB4MDIsIDB4MzMsIDB4NjcsIDB4MDIsCi0JMHgyMCwgMHg0NiwgMHgxMiwgMHg2MywKKwkweDAwLCAweGUyLCAweGUyLCAweDViLAorCTB4MDEsIDB4MzksIDB4NzMsIDB4MDIsCisJMHhlMCwgMHgzYywgMHgzOSwgMHg2MywKKwkweDAyLCAweDM5LCAweDczLCAweDAyLAorCTB4MjAsIDB4NDYsIDB4MzIsIDB4NjMsCiAJMHhmZiwgMHhlYSwgMHg1MiwgMHgwOSwKLQkweGE4LCAweGVhLCAweGNhLCAweDViLAotCTB4MDQsIDB4OTIsIDB4ZjksIDB4N2EsCi0JMHgwMSwgMHgzNCwgMHhjMSwgMHgzMSwKLQkweDAwLCAweDkzLCAweGY5LCAweDYyLAotCTB4MDEsIDB4MzUsIDB4YzEsIDB4MzEsCi0JMHgwMCwgMHg5NCwgMHgwMywgMHg3MywKKwkweGE4LCAweGVhLCAweGY0LCAweDViLAorCTB4MDQsIDB4OTIsIDB4MTksIDB4N2IsCisJMHgwMSwgMHgzYSwgMHhjMSwgMHgzMSwKKwkweDAwLCAweDkzLCAweDE5LCAweDYzLAorCTB4MDEsIDB4M2IsIDB4YzEsIDB4MzEsCisJMHgwMCwgMHg5NCwgMHgyMywgMHg3MywKIAkweDAxLCAweGE5LCAweDUyLCAweDExLAotCTB4ZmYsIDB4YTksIDB4ZWUsIDB4NmEsCi0JMHgwMCwgMHhlMiwgMHgxMiwgMHg0MywKLQkweDEwLCAweDMzLCAweDY3LCAweDAyLAotCTB4MDQsIDB4OTIsIDB4MTMsIDB4N2IsCisJMHhmZiwgMHhhOSwgMHgwZSwgMHg2YiwKKwkweDAwLCAweGUyLCAweDMyLCAweDQzLAorCTB4MTAsIDB4MzksIDB4NzMsIDB4MDIsCisJMHgwNCwgMHg5MiwgMHgzMywgMHg3YiwKIAkweGZiLCAweDkyLCAweDI1LCAweDBiLAotCTB4ZmYsIDB4ZWEsIDB4NjYsIDB4MGEsCi0JMHgwMSwgMHhhNCwgMHgwZCwgMHg2YiwKLQkweDAyLCAweGE4LCAweDkwLCAweDMyLAotCTB4MDAsIDB4ZTIsIDB4NmEsIDB4NTksCi0JMHgxMCwgMHg5MiwgMHhiZCwgMHg3YSwKLQkweGZmLCAweGVhLCAweGRjLCAweDViLAotCTB4MDAsIDB4ZTIsIDB4YmMsIDB4NDIsCi0JMHgwNCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweGZmLCAweGVhLCAweDcyLCAweDBhLAorCTB4MDEsIDB4YTQsIDB4MmQsIDB4NmIsCisJMHgwMiwgMHhhOCwgMHg5YywgMHgzMiwKKwkweDAwLCAweGUyLCAweDdlLCAweDU5LAorCTB4MTAsIDB4OTIsIDB4ZGQsIDB4N2EsCisJMHhmZiwgMHhlYSwgMHgwNiwgMHg1YywKKwkweDAwLCAweGUyLCAweGRjLCAweDQyLAorCTB4MDQsIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgwNCwgMHhlYSwgMHgwNCwgMHgwMCwKLQkweDAwLCAweGUyLCAweGJjLCAweDQyLAotCTB4MDQsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwMCwgMHhlMiwgMHhkYywgMHg0MiwKKwkweDA0LCAweGVhLCAweDY0LCAweDU5LAogCTB4MDQsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHhmOCwgMHg0MSwKLQkweDA4LCAweDkyLCAweGI1LCAweDdhLAotCTB4YzAsIDB4MzMsIDB4MjksIDB4N2IsCi0JMHg4MCwgMHgzMywgMHhiNSwgMHg2YSwKLQkweGZmLCAweDg4LCAweDI5LCAweDZiLAotCTB4NDAsIDB4MzMsIDB4YjUsIDB4NmEsCi0JMHgxMCwgMHg5MiwgMHgyZiwgMHg3YiwKLQkweDBhLCAweGVhLCAweDUwLCAweDU5LAorCTB4MDAsIDB4ZTIsIDB4MTQsIDB4NDIsCisJMHgwOCwgMHg5MiwgMHhkNSwgMHg3YSwKKwkweGMwLCAweDM5LCAweDQ5LCAweDdiLAorCTB4ODAsIDB4MzksIDB4ZDUsIDB4NmEsCisJMHhmZiwgMHg4OCwgMHg0OSwgMHg2YiwKKwkweDQwLCAweDM5LCAweGQ1LCAweDZhLAorCTB4MTAsIDB4OTIsIDB4NGYsIDB4N2IsCisJMHgwYSwgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDBhLCAweGVhLCAweDA0LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4NGUsIDB4NWIsCi0JMHgwMCwgMHhlMiwgMHg4MiwgMHg0MywKLQkweDUwLCAweDRiLCAweDM2LCAweDZiLAorCTB4MDAsIDB4ZTIsIDB4NmUsIDB4NWIsCisJMHgwMCwgMHhlMiwgMHhhZSwgMHg0MywKKwkweDUwLCAweDRiLCAweDU2LCAweDZiLAogCTB4YmYsIDB4M2EsIDB4NzQsIDB4MDgsCiAJMHgwMSwgMHhlMCwgMHhmNCwgMHgzMSwKIAkweGZmLCAweGVhLCAweGMwLCAweDA5LAotCTB4MDEsIDB4MmUsIDB4NWQsIDB4MWEsCi0JMHgwMCwgMHgyZiwgMHg1ZiwgMHgyMiwKLQkweDA0LCAweDQ3LCAweDhmLCAweDAyLAorCTB4MDEsIDB4MzIsIDB4NjUsIDB4MWEsCisJMHgwMCwgMHgzMywgMHg2NywgMHgyMiwKKwkweDA0LCAweDRkLCAweDliLCAweDAyLAogCTB4MDEsIDB4ZmEsIDB4YzAsIDB4MzUsCi0JMHgwMiwgMHhhOCwgMHg4NCwgMHgzMiwKKwkweDAyLCAweGE4LCAweDkwLCAweDMyLAogCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDAsCi0JMHgzMywgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDMzLCAweGVhLCAweDVlLCAweDU5LAogCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCi0JMHgwMiwgMHg0MiwgMHg1MSwgMHgzMSwKLQkweGZmLCAweDkwLCAweDY1LCAweDY4LAotCTB4ZmYsIDB4ODgsIDB4NWIsIDB4NmIsCi0JMHgwMSwgMHhhNCwgMHg1NywgMHg2YiwKLQkweDAyLCAweGE0LCAweDVmLCAweDZiLAotCTB4MDEsIDB4ODQsIDB4NWYsIDB4N2IsCisJMHgwMiwgMHg0OCwgMHg1MSwgMHgzMSwKKwkweGZmLCAweDkwLCAweDg1LCAweDY4LAorCTB4ZmYsIDB4ODgsIDB4N2IsIDB4NmIsCisJMHgwMSwgMHhhNCwgMHg3NywgMHg2YiwKKwkweDAyLCAweGE0LCAweDdmLCAweDZiLAorCTB4MDEsIDB4ODQsIDB4N2YsIDB4N2IsCiAJMHgwMiwgMHgyOCwgMHgxOSwgMHgzMywKIAkweDAyLCAweGE4LCAweDUwLCAweDM2LAotCTB4ZmYsIDB4ODgsIDB4NWYsIDB4NzMsCi0JMHgwMCwgMHhlMiwgMHgzMiwgMHg1YiwKKwkweGZmLCAweDg4LCAweDdmLCAweDczLAorCTB4MDAsIDB4ZTIsIDB4NTIsIDB4NWIsCiAJMHgwMiwgMHhhOCwgMHgyMCwgMHgzMywKLQkweDAyLCAweDJjLCAweDE5LCAweDMzLAorCTB4MDQsIDB4YTQsIDB4NDksIDB4MDMsCisJMHhmZiwgMHhlYSwgMHgxYSwgMHgwMywKKwkweGZmLCAweDJkLCAweDhiLCAweDYzLAogCTB4MDIsIDB4YTgsIDB4NTgsIDB4MzIsCi0JMHgwNCwgMHhhNCwgMHg0OSwgMHgwNywKLQkweGMwLCAweDMzLCAweGI1LCAweDZhLAotCTB4MDQsIDB4OTIsIDB4MjUsIDB4MDMsCi0JMHgyMCwgMHg5MiwgMHg4MywgMHg2YiwKKwkweDAyLCAweGE4LCAweDVjLCAweDM2LAogCTB4MDIsIDB4YTgsIDB4NDAsIDB4MzEsCi0JMHhjMCwgMHgzNCwgMHhjMSwgMHgwOSwKLQkweDAwLCAweDM1LCAweDUxLCAweDAxLAorCTB4MDIsIDB4MmUsIDB4NTEsIDB4MzEsCisJMHgwMiwgMHhhMCwgMHgxOCwgMHgzMywKKwkweDAyLCAweGEwLCAweDVjLCAweDM2LAorCTB4YzAsIDB4MzksIDB4ZDUsIDB4NmEsCisJMHgwNCwgMHg5MiwgMHgyNSwgMHgwMywKKwkweDIwLCAweDkyLCAweGFmLCAweDZiLAorCTB4MDIsIDB4YTgsIDB4NDAsIDB4MzEsCisJMHhjMCwgMHgzYSwgMHhjMSwgMHgwOSwKKwkweDAwLCAweDNiLCAweDUxLCAweDAxLAogCTB4ZmYsIDB4ZWEsIDB4NTIsIDB4MDksCi0JMHgzMCwgMHgzNCwgMHhjNSwgMHgwOSwKKwkweDMwLCAweDNhLCAweGM1LCAweDA5LAogCTB4M2QsIDB4ZTIsIDB4YzQsIDB4MjksCiAJMHhiOCwgMHhlMiwgMHhjNCwgMHgxOSwKIAkweDAxLCAweGVhLCAweGM2LCAweDAxLApAQCAtNDU4LDY5ICs0ODAsNzUgQEAKIAkweGY3LCAweDU3LCAweGFlLCAweDA4LAogCTB4MDgsIDB4ZWEsIDB4OTgsIDB4MDAsCiAJMHgwMSwgMHg0NCwgMHhkNCwgMHgzMSwKLQkweGVlLCAweDAwLCAweDhjLCAweDZiLAorCTB4ZWUsIDB4MDAsIDB4YjgsIDB4NmIsCiAJMHgwMiwgMHhlYSwgMHhiNCwgMHgwMCwKLQkweDAwLCAweGUyLCAweGI0LCAweDViLAotCTB4MDksIDB4NGMsIDB4OGUsIDB4N2IsCisJMHhjMCwgMHhlYSwgMHg3MiwgMHgwMiwKKwkweDA5LCAweDRjLCAweGJhLCAweDdiLAorCTB4MDEsIDB4ZWEsIDB4NzgsIDB4MDIsCiAJMHgwOCwgMHg0YywgMHgwNiwgMHg2OCwKLQkweDBiLCAweGVhLCAweDUwLCAweDU5LAorCTB4MGIsIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgwYiwgMHhlYSwgMHgwNCwgMHgwMCwKIAkweDAxLCAweDQ0LCAweGQ0LCAweDMxLAotCTB4MjAsIDB4MzMsIDB4ZjksIDB4NzksCi0JMHgwMCwgMHhlMiwgMHg5ZSwgMHg1YiwKLQkweDAwLCAweGUyLCAweGY4LCAweDQxLAotCTB4MDEsIDB4ODQsIDB4YTMsIDB4N2IsCisJMHgyMCwgMHgzOSwgMHgxNSwgMHg3YSwKKwkweDAwLCAweGUyLCAweGNjLCAweDViLAorCTB4MDAsIDB4ZTIsIDB4MTQsIDB4NDIsCisJMHgwMSwgMHg4NCwgMHhkMSwgMHg3YiwKIAkweDAxLCAweGE0LCAweDQ5LCAweDA3LAogCTB4MDgsIDB4NjAsIDB4MzAsIDB4MzMsCiAJMHgwOCwgMHg4MCwgMHg0MSwgMHgzNywKLQkweGRmLCAweDMzLCAweDY3LCAweDBhLAotCTB4ZWUsIDB4MDAsIDB4YjAsIDB4NmIsCisJMHhkZiwgMHgzOSwgMHg3MywgMHgwYSwKKwkweGVlLCAweDAwLCAweGRlLCAweDZiLAogCTB4MDUsIDB4ZWEsIDB4YjQsIDB4MDAsCi0JMHgzMywgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDMzLCAweGVhLCAweDVlLCAweDU5LAogCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHg2YSwgMHg1OSwKLQkweDAwLCAweGUyLCAweGJjLCAweDQyLAotCTB4MDEsIDB4ZWEsIDB4NmMsIDB4MDIsCi0JMHhjMCwgMHhlYSwgMHg2NiwgMHgwNiwKLQkweGZmLCAweDQyLCAweGM0LCAweDZiLAotCTB4MDEsIDB4NDEsIDB4YjgsIDB4NmIsCi0JMHgwMiwgMHg0MSwgMHhiOCwgMHg3YiwKLQkweGZmLCAweDQyLCAweGM0LCAweDZiLAotCTB4MDEsIDB4NDEsIDB4YjgsIDB4NmIsCi0JMHgwMiwgMHg0MSwgMHhiOCwgMHg3YiwKLQkweGZmLCAweDQyLCAweGM0LCAweDdiLAotCTB4MDQsIDB4NGMsIDB4YjgsIDB4NmIsCi0JMHhlMCwgMHg0MSwgMHg2YywgMHgwZSwKKwkweDAwLCAweGUyLCAweDdlLCAweDU5LAorCTB4MDAsIDB4ZTIsIDB4ZGMsIDB4NDIsCisJMHhmZiwgMHg0MiwgMHhlZSwgMHg2YiwKKwkweDAxLCAweDQxLCAweGUyLCAweDZiLAorCTB4MDIsIDB4NDEsIDB4ZTIsIDB4N2IsCisJMHhmZiwgMHg0MiwgMHhlZSwgMHg2YiwKKwkweDAxLCAweDQxLCAweGUyLCAweDZiLAorCTB4MDIsIDB4NDEsIDB4ZTIsIDB4N2IsCisJMHhmZiwgMHg0MiwgMHhlZSwgMHg3YiwKKwkweDA0LCAweDRjLCAweGUyLCAweDZiLAorCTB4ZTAsIDB4NDEsIDB4NzgsIDB4MGUsCiAJMHgwMSwgMHg0NCwgMHhkNCwgMHgzMSwKLQkweGZmLCAweDQyLCAweGNjLCAweDdiLAotCTB4MDQsIDB4NGMsIDB4Y2MsIDB4NmIsCi0JMHhlMCwgMHg0MSwgMHg2YywgMHgwYSwKLQkweGUwLCAweDM2LCAweGY5LCAweDYxLAorCTB4ZmYsIDB4NDIsIDB4ZjYsIDB4N2IsCisJMHgwNCwgMHg0YywgMHhmNiwgMHg2YiwKKwkweGUwLCAweDQxLCAweDc4LCAweDBhLAorCTB4ZTAsIDB4M2MsIDB4MTUsIDB4NjIsCiAJMHhmZiwgMHhlYSwgMHhjYSwgMHgwOSwKIAkweDAxLCAweGUyLCAweGM4LCAweDMxLAogCTB4MDEsIDB4NDYsIDB4ZGEsIDB4MzUsCiAJMHgwMSwgMHg0NCwgMHhkNCwgMHgzNSwKIAkweDEwLCAweGVhLCAweDgwLCAweDAwLAotCTB4MDEsIDB4ZTIsIDB4NjIsIDB4MzYsCi0JMHgwNCwgMHhhNiwgMHhlNCwgMHg3YiwKKwkweDAxLCAweGUyLCAweDZlLCAweDM2LAorCTB4MDQsIDB4YTYsIDB4MGUsIDB4N2MsCiAJMHhmZiwgMHhlYSwgMHg1YSwgMHgwOSwKIAkweGZmLCAweGVhLCAweDRjLCAweDBkLAotCTB4MDEsIDB4YTYsIDB4MDIsIDB4NmMsCi0JMHgxMCwgMHhhZCwgMHg2NCwgMHg3OCwKLQkweDgwLCAweGFkLCAweGZhLCAweDZiLAotCTB4MDgsIDB4YWQsIDB4NjQsIDB4NjgsCisJMHgwMSwgMHhhNiwgMHgzYSwgMHg2YywKKwkweDEwLCAweGFkLCAweDg0LCAweDc4LAorCTB4ODAsIDB4YWQsIDB4MzIsIDB4NmMsCisJMHgwOCwgMHhhZCwgMHg4NCwgMHg2OCwKKwkweDIwLCAweDE5LCAweDI2LCAweDdjLAorCTB4ODAsIDB4ZWEsIDB4YjIsIDB4MDEsCisJMHgxMSwgMHgwMCwgMHgwMCwgMHgxMCwKKwkweDAyLCAweGE2LCAweDIyLCAweDdjLAorCTB4ZmYsIDB4ZWEsIDB4YjIsIDB4MGQsCisJMHgxMSwgMHgwMCwgMHgwMCwgMHgxMCwKKwkweGZmLCAweGVhLCAweGIyLCAweDA5LAogCTB4MDQsIDB4ODQsIDB4ZjksIDB4MzAsCiAJMHgwMCwgMHhlYSwgMHgwOCwgMHg4MSwKIAkweGZmLCAweGVhLCAweGQ0LCAweDA5LAogCTB4MDIsIDB4ODQsIDB4ZjksIDB4ODgsCiAJMHgwZCwgMHhlYSwgMHg1YSwgMHgwMSwKIAkweDA0LCAweGE2LCAweDRjLCAweDA1LAotCTB4MDQsIDB4YTYsIDB4NjQsIDB4NzgsCisJMHgwNCwgMHhhNiwgMHg4NCwgMHg3OCwKIAkweGZmLCAweGVhLCAweDVhLCAweDA5LAogCTB4MDMsIDB4ODQsIDB4NTksIDB4ODksCiAJMHgwMywgMHhlYSwgMHg0YywgMHgwMSwKLQkweDgwLCAweDFhLCAweDY0LCAweDc4LAotCTB4MDgsIDB4MTksIDB4NjQsIDB4NzgsCisJMHg4MCwgMHgxYSwgMHg4NCwgMHg3OCwKKwkweDA4LCAweDE5LCAweDg0LCAweDc4LAogCTB4MDgsIDB4YjAsIDB4ZTAsIDB4MzAsCiAJMHgwNCwgMHhiMCwgMHhlMCwgMHgzMCwKIAkweDAzLCAweGIwLCAweGYwLCAweDMwLApAQCAtNTMzLDI1OSArNTYxLDI1OSBAQAogCTB4MDAsIDB4ODYsIDB4MGQsIDB4MjMsCiAJMHgwMCwgMHg4NywgMHgwZiwgMHgyMywKIAkweDAxLCAweDg0LCAweGM1LCAweDMxLAotCTB4ODAsIDB4ODMsIDB4MjUsIDB4N2MsCisJMHg4MCwgMHg4MywgMHg1ZCwgMHg3YywKIAkweDAyLCAweGUyLCAweGM0LCAweDAxLAogCTB4ZmYsIDB4ZWEsIDB4NGMsIDB4MDksCiAJMHgwMSwgMHhlMiwgMHgzNiwgMHgzMCwKIAkweGM4LCAweDE5LCAweDMyLCAweDAwLAogCTB4ODgsIDB4MTksIDB4MzIsIDB4MDAsCiAJMHgwMSwgMHhhYywgMHhkNCwgMHg5OSwKLQkweDAwLCAweGUyLCAweDY0LCAweDUwLAorCTB4MDAsIDB4ZTIsIDB4ODQsIDB4NTAsCiAJMHhmZSwgMHhhNiwgMHg0YywgMHgwZCwKIAkweDBiLCAweDk4LCAweGUxLCAweDMwLAogCTB4ZmQsIDB4YTQsIDB4NDksIDB4MDksCi0JMHg4MCwgMHhhMywgMHgzOSwgMHg3YywKKwkweDgwLCAweGEzLCAweDcxLCAweDdjLAogCTB4MDIsIDB4YTQsIDB4NDgsIDB4MDEsCiAJMHgwMSwgMHhhNCwgMHgzNiwgMHgzMCwKIAkweGE4LCAweGVhLCAweDMyLCAweDAwLAogCTB4ZmQsIDB4YTQsIDB4NDksIDB4MGIsCiAJMHgwNSwgMHhhMywgMHgwNywgMHgzMywKLQkweDgwLCAweDgzLCAweDQ1LCAweDZjLAorCTB4ODAsIDB4ODMsIDB4N2QsIDB4NmMsCiAJMHgwMiwgMHhlYSwgMHg0YywgMHgwNSwKIAkweGZmLCAweGVhLCAweDRjLCAweDBkLAotCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NTksCi0JMHgwMiwgMHhhNiwgMHhlNiwgMHg2YiwKKwkweDAwLCAweGUyLCAweDU2LCAweDU5LAorCTB4MDIsIDB4YTYsIDB4MTAsIDB4NmMsCiAJMHg4MCwgMHhmOSwgMHhmMiwgMHgwNSwKLQkweGMwLCAweDMzLCAweDUzLCAweDdjLAotCTB4MDMsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHhjMCwgMHgzOSwgMHg4YiwgMHg3YywKKwkweDAzLCAweGVhLCAweDY0LCAweDU5LAogCTB4MDMsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgyMCwgMHgzMywgMHg3NywgMHg3YywKLQkweDAxLCAweDg0LCAweDVkLCAweDZjLAotCTB4MDYsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgyMCwgMHgzOSwgMHhhZiwgMHg3YywKKwkweDAxLCAweDg0LCAweDk1LCAweDZjLAorCTB4MDYsIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgwNiwgMHhlYSwgMHgwNCwgMHgwMCwKLQkweDAwLCAweGUyLCAweDdhLCAweDQ0LAotCTB4MDEsIDB4MDAsIDB4NjAsIDB4MzIsCi0JMHhlZSwgMHgwMCwgMHg2NiwgMHg2YywKKwkweDAwLCAweGUyLCAweGIyLCAweDQ0LAorCTB4MDEsIDB4MDAsIDB4NmMsIDB4MzIsCisJMHhlZSwgMHgwMCwgMHg5ZSwgMHg2YywKIAkweDA1LCAweGVhLCAweGI0LCAweDAwLAotCTB4MzMsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgzMywgMHhlYSwgMHg1ZSwgMHg1OSwKIAkweDMzLCAweGVhLCAweDAwLCAweDAwLAogCTB4ODAsIDB4M2QsIDB4N2EsIDB4MDAsCi0JMHhmYywgMHg0MiwgMHg2OCwgMHg3YywKKwkweGZjLCAweDQyLCAweGEwLCAweDdjLAogCTB4N2YsIDB4M2QsIDB4N2EsIDB4MDgsCi0JMHgwMCwgMHgzMCwgMHg0NSwgMHg1OSwKLQkweDAxLCAweDMwLCAweDAxLCAweDMwLAotCTB4MDksIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwMCwgMHgzNiwgMHg1ZiwgMHg1OSwKKwkweDAxLCAweDM2LCAweDAxLCAweDMwLAorCTB4MDksIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgwOSwgMHhlYSwgMHgwNCwgMHgwMCwKLQkweDAwLCAweGUyLCAweGY4LCAweDQxLAotCTB4MDEsIDB4YTQsIDB4NWQsIDB4NmMsCi0JMHgwMCwgMHhlMiwgMHgzMCwgMHg1YywKLQkweDIwLCAweDMzLCAweDY3LCAweDAyLAotCTB4MDEsIDB4MDAsIDB4NjAsIDB4MzIsCi0JMHgwMiwgMHhhNiwgMHg4MiwgMHg3YywKLQkweDAwLCAweGUyLCAweDQ2LCAweDVjLAotCTB4MDAsIDB4ZTIsIDB4NTYsIDB4NTgsCi0JMHgwMCwgMHhlMiwgMHg2NiwgMHg1OCwKLQkweDAwLCAweGUyLCAweDNhLCAweDU4LAotCTB4MDAsIDB4MzAsIDB4NDUsIDB4NTksCi0JMHgwMSwgMHgzMCwgMHgwMSwgMHgzMCwKLQkweDIwLCAweDE5LCAweDgyLCAweDZjLAotCTB4MDAsIDB4ZTIsIDB4YjIsIDB4NWMsCi0JMHgwNCwgMHgxOSwgMHg5YywgMHg2YywKKwkweDAwLCAweGUyLCAweDE0LCAweDQyLAorCTB4MDEsIDB4YTQsIDB4OTUsIDB4NmMsCisJMHgwMCwgMHhlMiwgMHg2OCwgMHg1YywKKwkweDIwLCAweDM5LCAweDczLCAweDAyLAorCTB4MDEsIDB4MDAsIDB4NmMsIDB4MzIsCisJMHgwMiwgMHhhNiwgMHhiYSwgMHg3YywKKwkweDAwLCAweGUyLCAweDdlLCAweDVjLAorCTB4MDAsIDB4ZTIsIDB4NzYsIDB4NTgsCisJMHgwMCwgMHhlMiwgMHg4NiwgMHg1OCwKKwkweDAwLCAweGUyLCAweDVhLCAweDU4LAorCTB4MDAsIDB4MzYsIDB4NWYsIDB4NTksCisJMHgwMSwgMHgzNiwgMHgwMSwgMHgzMCwKKwkweDIwLCAweDE5LCAweGJhLCAweDZjLAorCTB4MDAsIDB4ZTIsIDB4ZWEsIDB4NWMsCisJMHgwNCwgMHgxOSwgMHhkNCwgMHg2YywKIAkweDAyLCAweDE5LCAweDMyLCAweDAwLAotCTB4MDEsIDB4ODQsIDB4OWQsIDB4N2MsCi0JMHgwMSwgMHgxYiwgMHg5NiwgMHg3YywKLQkweDAxLCAweDFhLCAweDljLCAweDZjLAotCTB4MDAsIDB4ZTIsIDB4NGMsIDB4NDQsCi0JMHg4MCwgMHg0YiwgMHhhMiwgMHg2YywKLQkweDAxLCAweDRjLCAweDllLCAweDdjLAotCTB4MDMsIDB4NDIsIDB4NGMsIDB4NmMsCi0JMHgwMCwgMHhlMiwgMHhlMCwgMHg1YiwKKwkweDAxLCAweDg0LCAweGQ1LCAweDdjLAorCTB4MDEsIDB4MWIsIDB4Y2UsIDB4N2MsCisJMHgwMSwgMHgxYSwgMHhkNCwgMHg2YywKKwkweDAwLCAweGUyLCAweDg0LCAweDQ0LAorCTB4ODAsIDB4NGIsIDB4ZGEsIDB4NmMsCisJMHgwMSwgMHg0YywgMHhkNiwgMHg3YywKKwkweDAzLCAweDQyLCAweDg0LCAweDZjLAorCTB4MDAsIDB4ZTIsIDB4MGEsIDB4NWMsCiAJMHg4MCwgMHhmOSwgMHhmMiwgMHgwMSwKLQkweDA0LCAweDMzLCAweGY5LCAweDc5LAotCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCi0JMHgwOCwgMHg1ZCwgMHhiYSwgMHg2YywKLQkweDAwLCAweGUyLCAweDU2LCAweDU4LAotCTB4MDAsIDB4MzAsIDB4NDUsIDB4NTksCi0JMHgwMSwgMHgzMCwgMHgwMSwgMHgzMCwKLQkweDAyLCAweDFiLCAweGFhLCAweDdjLAotCTB4MDgsIDB4NWQsIDB4YjgsIDB4N2MsCisJMHgwNCwgMHgzOSwgMHgxNSwgMHg3YSwKKwkweDAwLCAweGUyLCAweDE0LCAweDQyLAorCTB4MDgsIDB4NWQsIDB4ZjIsIDB4NmMsCisJMHgwMCwgMHhlMiwgMHg3NiwgMHg1OCwKKwkweDAwLCAweDM2LCAweDVmLCAweDU5LAorCTB4MDEsIDB4MzYsIDB4MDEsIDB4MzAsCisJMHgwMiwgMHgxYiwgMHhlMiwgMHg3YywKKwkweDA4LCAweDVkLCAweGYwLCAweDdjLAogCTB4MDMsIDB4NjgsIDB4MDAsIDB4MzcsCiAJMHgwMSwgMHg4NCwgMHgwOSwgMHgwNywKLQkweDgwLCAweDFiLCAweGM0LCAweDdjLAotCTB4ODAsIDB4ODQsIDB4YzUsIDB4NmMsCisJMHg4MCwgMHgxYiwgMHhmYywgMHg3YywKKwkweDgwLCAweDg0LCAweGZkLCAweDZjLAogCTB4ZmYsIDB4ODUsIDB4MGIsIDB4MWIsCiAJMHhmZiwgMHg4NiwgMHgwZCwgMHgyMywKIAkweGZmLCAweDg3LCAweDBmLCAweDIzLAogCTB4ZjgsIDB4MWIsIDB4MDgsIDB4MGIsCiAJMHhmZiwgMHhlYSwgMHgwNiwgMHgwYiwKIAkweDAzLCAweDY4LCAweDAwLCAweDM3LAotCTB4MDAsIDB4ZTIsIDB4YzQsIDB4NTgsCisJMHgwMCwgMHhlMiwgMHhkNiwgMHg1OCwKIAkweDEwLCAweGVhLCAweDE4LCAweDAwLAogCTB4ZjksIDB4ZDksIDB4YjIsIDB4MGQsCiAJMHgwMSwgMHhkOSwgMHhiMiwgMHgwNSwKIAkweDAxLCAweDUyLCAweDQ4LCAweDMxLAotCTB4MjAsIDB4YTQsIDB4ZWUsIDB4N2MsCi0JMHgyMCwgMHg1YiwgMHhlZSwgMHg3YywKLQkweDgwLCAweGY5LCAweGZjLCAweDdjLAorCTB4MjAsIDB4YTQsIDB4MjYsIDB4N2QsCisJMHgyMCwgMHg1YiwgMHgyNiwgMHg3ZCwKKwkweDgwLCAweGY5LCAweDM0LCAweDdkLAogCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDAsCiAJMHgxMSwgMHgwMCwgMHgwMCwgMHgxMCwKLQkweDA0LCAweDE5LCAweDA4LCAweDdkLAorCTB4MDQsIDB4MTksIDB4NDAsIDB4N2QsCiAJMHhkZiwgMHgxOSwgMHgzMiwgMHgwOCwKLQkweDYwLCAweDViLCAweGU2LCAweDZjLAotCTB4MDEsIDB4NGMsIDB4ZTIsIDB4N2MsCisJMHg2MCwgMHg1YiwgMHg0MCwgMHg2ZCwKKwkweDAxLCAweDRjLCAweDFhLCAweDdkLAogCTB4MjAsIDB4MTksIDB4MzIsIDB4MDAsCiAJMHgwMSwgMHhkOSwgMHhiMiwgMHgwNSwKIAkweDAyLCAweGVhLCAweGI0LCAweDAwLAogCTB4MDEsIDB4ZDksIDB4YjIsIDB4MDUsCi0JMHgxMCwgMHg1YiwgMHgwMCwgMHg2ZCwKLQkweDA4LCAweDViLCAweDBhLCAweDZkLAotCTB4MjAsIDB4NWIsIDB4ZmEsIDB4NmMsCi0JMHgwMiwgMHg1YiwgMHgyYSwgMHg2ZCwKLQkweDBlLCAweGVhLCAweDUwLCAweDU5LAorCTB4MTAsIDB4NWIsIDB4MzgsIDB4NmQsCisJMHgwOCwgMHg1YiwgMHg0MiwgMHg2ZCwKKwkweDIwLCAweDViLCAweDMyLCAweDZkLAorCTB4MDIsIDB4NWIsIDB4NjIsIDB4NmQsCisJMHgwZSwgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDBlLCAweGVhLCAweDA0LCAweDAwLAotCTB4ODAsIDB4ZjksIDB4ZWEsIDB4NmMsCisJMHg4MCwgMHhmOSwgMHgyMiwgMHg2ZCwKIAkweGRmLCAweDVjLCAweGI4LCAweDA4LAogCTB4MDEsIDB4ZDksIDB4YjIsIDB4MDUsCi0JMHgwMSwgMHhhNCwgMHhlNSwgMHg2ZCwKLQkweDAwLCAweGUyLCAweDMwLCAweDVjLAotCTB4MDAsIDB4ZTIsIDB4MzQsIDB4NWQsCisJMHgwMSwgMHhhNCwgMHgxZCwgMHg2ZSwKKwkweDAwLCAweGUyLCAweDY4LCAweDVjLAorCTB4MDAsIDB4ZTIsIDB4NmMsIDB4NWQsCiAJMHgwMSwgMHg5MCwgMHgyMSwgMHgxYiwKIAkweDAxLCAweGQ5LCAweGIyLCAweDA1LAotCTB4MDAsIDB4ZTIsIDB4MzIsIDB4NWIsCisJMHgwMCwgMHhlMiwgMHg1MiwgMHg1YiwKIAkweGYzLCAweDk2LCAweGQ1LCAweDE5LAotCTB4MDAsIDB4ZTIsIDB4MTgsIDB4NTUsCi0JMHg4MCwgMHg5NiwgMHgxOSwgMHg2ZCwKLQkweDBmLCAweGVhLCAweDUwLCAweDU5LAorCTB4MDAsIDB4ZTIsIDB4NTAsIDB4NTUsCisJMHg4MCwgMHg5NiwgMHg1MSwgMHg2ZCwKKwkweDBmLCAweGVhLCAweDY0LCAweDU5LAogCTB4MGYsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHgyMCwgMHg0NSwKKwkweDAwLCAweGUyLCAweDU4LCAweDQ1LAogCTB4MDQsIDB4OGMsIDB4ZTEsIDB4MzAsCiAJMHgwMSwgMHhlYSwgMHhmMiwgMHgwMCwKIAkweDAyLCAweGVhLCAweDM2LCAweDAwLAogCTB4YTgsIDB4ZWEsIDB4MzIsIDB4MDAsCi0JMHhmZiwgMHg5NywgMHgyNywgMHg3ZCwKLQkweDE0LCAweGVhLCAweDUwLCAweDU5LAorCTB4ZmYsIDB4OTcsIDB4NWYsIDB4N2QsCisJMHgxNCwgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDE0LCAweGVhLCAweDA0LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4OTYsIDB4NWQsCisJMHgwMCwgMHhlMiwgMHhjZSwgMHg1ZCwKIAkweDAxLCAweGQ5LCAweGIyLCAweDA1LAogCTB4MDksIDB4ODAsIDB4ZTEsIDB4MzAsCiAJMHgwMiwgMHhlYSwgMHgzNiwgMHgwMCwKIAkweGE4LCAweGVhLCAweDMyLCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4OGUsIDB4NWQsCisJMHgwMCwgMHhlMiwgMHhjNiwgMHg1ZCwKIAkweDAxLCAweGQ5LCAweGIyLCAweDA1LAotCTB4MDIsIDB4YTYsIDB4NDQsIDB4N2QsCi0JMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKLQkweDIwLCAweDViLCAweDUyLCAweDZkLAotCTB4ZmMsIDB4NDIsIDB4M2UsIDB4N2QsCi0JMHgxMCwgMHg0MCwgMHg0MCwgMHg2ZCwKLQkweDIwLCAweDRkLCAweDQyLCAweDdkLAotCTB4MDgsIDB4NWQsIDB4NTIsIDB4NmQsCi0JMHgwMiwgMHhhNiwgMHhlNiwgMHg2YiwKLQkweDAwLCAweGUyLCAweDNlLCAweDU5LAotCTB4MjAsIDB4NWIsIDB4NTIsIDB4NmQsCi0JMHgwMSwgMHgxYiwgMHg3MiwgMHg2ZCwKLQkweGZjLCAweDQyLCAweDRlLCAweDdkLAotCTB4MTAsIDB4NDAsIDB4NTAsIDB4NmQsCi0JMHgyMCwgMHg0ZCwgMHg2NCwgMHg3OCwKLQkweDA4LCAweDVkLCAweDY0LCAweDc4LAorCTB4MDIsIDB4YTYsIDB4N2MsIDB4N2QsCisJMHgwMCwgMHhlMiwgMHg1NiwgMHg1OSwKKwkweDIwLCAweDViLCAweDhhLCAweDZkLAorCTB4ZmMsIDB4NDIsIDB4NzYsIDB4N2QsCisJMHgxMCwgMHg0MCwgMHg3OCwgMHg2ZCwKKwkweDIwLCAweDRkLCAweDdhLCAweDdkLAorCTB4MDgsIDB4NWQsIDB4OGEsIDB4NmQsCisJMHgwMiwgMHhhNiwgMHgxMCwgMHg2YywKKwkweDAwLCAweGUyLCAweDU2LCAweDU5LAorCTB4MjAsIDB4NWIsIDB4OGEsIDB4NmQsCisJMHgwMSwgMHgxYiwgMHhhYSwgMHg2ZCwKKwkweGZjLCAweDQyLCAweDg2LCAweDdkLAorCTB4MTAsIDB4NDAsIDB4ODgsIDB4NmQsCisJMHgyMCwgMHg0ZCwgMHg4NCwgMHg3OCwKKwkweDA4LCAweDVkLCAweDg0LCAweDc4LAogCTB4MDIsIDB4MTksIDB4MzIsIDB4MDAsCiAJMHgwMSwgMHg1YiwgMHg0MCwgMHgzMSwKLQkweDAwLCAweGUyLCAweGIyLCAweDVjLAotCTB4MDAsIDB4ZTIsIDB4OWUsIDB4NWIsCisJMHgwMCwgMHhlMiwgMHhlYSwgMHg1YywKKwkweDAwLCAweGUyLCAweGNjLCAweDViLAogCTB4MjAsIDB4ZWEsIDB4YjYsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHhlMCwgMHg1YiwKKwkweDAwLCAweGUyLCAweDBhLCAweDVjLAogCTB4MjAsIDB4NWMsIDB4YjgsIDB4MDAsCi0JMHgwNCwgMHgxOSwgMHg2OCwgMHg2ZCwKLQkweDAxLCAweDFhLCAweDY4LCAweDZkLAotCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NTksCi0JMHgwMSwgMHgxYSwgMHg2NCwgMHg3OCwKKwkweDA0LCAweDE5LCAweGEwLCAweDZkLAorCTB4MDEsIDB4MWEsIDB4YTAsIDB4NmQsCisJMHgwMCwgMHhlMiwgMHg1NiwgMHg1OSwKKwkweDAxLCAweDFhLCAweDg0LCAweDc4LAogCTB4ODAsIDB4ZjksIDB4ZjIsIDB4MDEsCi0JMHgyMCwgMHhhMCwgMHhjYywgMHg3ZCwKKwkweDIwLCAweGEwLCAweDA0LCAweDdlLAogCTB4ZmYsIDB4OTAsIDB4MjEsIDB4MWIsCi0JMHgwOCwgMHg5MiwgMHg0MywgMHg2YiwKKwkweDA4LCAweDkyLCAweDYzLCAweDZiLAogCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDQsCiAJMHgwMSwgMHhhNCwgMHg0OSwgMHgwMywKLQkweDQwLCAweDViLCAweDgyLCAweDZkLAotCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NTksCi0JMHg0MCwgMHg1YiwgMHg4MiwgMHg2ZCwKLQkweDA0LCAweDVkLCAweGU2LCAweDdkLAotCTB4MDEsIDB4MWEsIDB4ZTYsIDB4N2QsCi0JMHgyMCwgMHg0ZCwgMHg2NCwgMHg3OCwKLQkweDQwLCAweDViLCAweGNjLCAweDdkLAotCTB4MDQsIDB4NWQsIDB4ZTYsIDB4N2QsCi0JMHgwMSwgMHgxYSwgMHhlNiwgMHg3ZCwKKwkweDQwLCAweDViLCAweGJhLCAweDZkLAorCTB4MDAsIDB4ZTIsIDB4NTYsIDB4NTksCisJMHg0MCwgMHg1YiwgMHhiYSwgMHg2ZCwKKwkweDA0LCAweDVkLCAweDFlLCAweDdlLAorCTB4MDEsIDB4MWEsIDB4MWUsIDB4N2UsCisJMHgyMCwgMHg0ZCwgMHg4NCwgMHg3OCwKKwkweDQwLCAweDViLCAweDA0LCAweDdlLAorCTB4MDQsIDB4NWQsIDB4MWUsIDB4N2UsCisJMHgwMSwgMHgxYSwgMHgxZSwgMHg3ZSwKIAkweDgwLCAweGY5LCAweGYyLCAweDAxLAogCTB4ZmYsIDB4OTAsIDB4MjEsIDB4MWIsCi0JMHgwOCwgMHg5MiwgMHg0MywgMHg2YiwKKwkweDA4LCAweDkyLCAweDYzLCAweDZiLAogCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDQsCi0JMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKLQkweDAxLCAweDFiLCAweDY0LCAweDc4LAorCTB4MDAsIDB4ZTIsIDB4NTYsIDB4NTksCisJMHgwMSwgMHgxYiwgMHg4NCwgMHg3OCwKIAkweDgwLCAweGY5LCAweGYyLCAweDAxLAogCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDQsCi0JMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKLQkweDAxLCAweDFiLCAweGFhLCAweDZkLAotCTB4NDAsIDB4NWIsIDB4YjgsIDB4N2QsCi0JMHgwMSwgMHgxYiwgMHhhYSwgMHg2ZCwKKwkweDAwLCAweGUyLCAweDU2LCAweDU5LAorCTB4MDEsIDB4MWIsIDB4ZTIsIDB4NmQsCisJMHg0MCwgMHg1YiwgMHhmMCwgMHg3ZCwKKwkweDAxLCAweDFiLCAweGUyLCAweDZkLAogCTB4MDIsIDB4MTksIDB4MzIsIDB4MDAsCi0JMHgwMSwgMHgxYSwgMHg2NCwgMHg3OCwKKwkweDAxLCAweDFhLCAweDg0LCAweDc4LAogCTB4ODAsIDB4ZjksIDB4ZjIsIDB4MDEsCiAJMHhmZiwgMHhlYSwgMHgxMCwgMHgwMywKIAkweDA4LCAweDkyLCAweDI1LCAweDAzLAotCTB4MDAsIDB4ZTIsIDB4NDIsIDB4NDMsCi0JMHgwMSwgMHgxYSwgMHhiNCwgMHg3ZCwKLQkweDQwLCAweDViLCAweGIwLCAweDdkLAotCTB4MDEsIDB4MWEsIDB4OWUsIDB4NmQsCi0JMHhmYywgMHg0MiwgMHg2NCwgMHg3OCwKLQkweDAxLCAweDFhLCAweGI4LCAweDZkLAotCTB4MTAsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwMCwgMHhlMiwgMHg2MiwgMHg0MywKKwkweDAxLCAweDFhLCAweGVjLCAweDdkLAorCTB4NDAsIDB4NWIsIDB4ZTgsIDB4N2QsCisJMHgwMSwgMHgxYSwgMHhkNiwgMHg2ZCwKKwkweGZjLCAweDQyLCAweDg0LCAweDc4LAorCTB4MDEsIDB4MWEsIDB4ZjAsIDB4NmQsCisJMHgxMCwgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDEwLCAweGVhLCAweDA0LCAweDAwLAotCTB4ZmMsIDB4NDIsIDB4NjQsIDB4NzgsCi0JMHgxMCwgMHg0MCwgMHhiZSwgMHg2ZCwKLQkweDIwLCAweDRkLCAweDY0LCAweDc4LAotCTB4NDAsIDB4NWIsIDB4OWUsIDB4NmQsCi0JMHgwMSwgMHgxYSwgMHg2NCwgMHg3OCwKKwkweGZjLCAweDQyLCAweDg0LCAweDc4LAorCTB4MTAsIDB4NDAsIDB4ZjYsIDB4NmQsCisJMHgyMCwgMHg0ZCwgMHg4NCwgMHg3OCwKKwkweDQwLCAweDViLCAweGQ2LCAweDZkLAorCTB4MDEsIDB4MWEsIDB4ODQsIDB4NzgsCiAJMHgwMSwgMHg5MCwgMHgyMSwgMHgxYiwKIAkweDMwLCAweDNmLCAweGMwLCAweDA5LAotCTB4MzAsIDB4ZTAsIDB4NjQsIDB4NjAsCi0JMHg0MCwgMHg0YiwgMHg2NCwgMHg2OCwKKwkweDMwLCAweGUwLCAweDg0LCAweDYwLAorCTB4NDAsIDB4NGIsIDB4ODQsIDB4NjgsCiAJMHhmZiwgMHhlYSwgMHg1MiwgMHgwMSwKLQkweGVlLCAweDAwLCAweGQyLCAweDZkLAorCTB4ZWUsIDB4MDAsIDB4MGMsIDB4NmUsCiAJMHg4MCwgMHhmOSwgMHhmMiwgMHgwMSwKIAkweGZmLCAweDkwLCAweDIxLCAweDFiLAogCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDAsCiAJMHgyMCwgMHhlYSwgMHg5YSwgMHgwMCwKLQkweGYzLCAweDQyLCAweGRlLCAweDZkLAotCTB4MTIsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHhmMywgMHg0MiwgMHgxNiwgMHg2ZSwKKwkweDEyLCAweGVhLCAweDY0LCAweDU5LAogCTB4MTIsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHhmOCwgMHg0MSwKLQkweDBkLCAweGVhLCAweDUwLCAweDU5LAorCTB4MDAsIDB4ZTIsIDB4MTQsIDB4NDIsCisJMHgwZCwgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDBkLCAweGVhLCAweDA0LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgwMCwgMHhlMiwgMHgxNCwgMHg0MiwKIAkweDAxLCAweDkwLCAweDIxLCAweDFiLAotCTB4MTEsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgxMSwgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDExLCAweGVhLCAweDA0LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4MzIsIDB4NWIsCisJMHgwMCwgMHhlMiwgMHg1MiwgMHg1YiwKIAkweDA4LCAweDVhLCAweGI0LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4MGMsIDB4NWUsCisJMHgwMCwgMHhlMiwgMHg0NCwgMHg1ZSwKIAkweGE4LCAweGVhLCAweDMyLCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NTksCi0JMHg4MCwgMHgxYSwgMHhmYSwgMHg3ZCwKLQkweDAwLCAweGUyLCAweDBjLCAweDVlLAorCTB4MDAsIDB4ZTIsIDB4NTYsIDB4NTksCisJMHg4MCwgMHgxYSwgMHgzMiwgMHg3ZSwKKwkweDAwLCAweGUyLCAweDQ0LCAweDVlLAogCTB4ODAsIDB4MTksIDB4MzIsIDB4MDAsCi0JMHg0MCwgMHg1YiwgMHgwMCwgMHg2ZSwKLQkweDA4LCAweDVhLCAweDAwLCAweDdlLAotCTB4MjAsIDB4NGQsIDB4NjQsIDB4NzgsCisJMHg0MCwgMHg1YiwgMHgzOCwgMHg2ZSwKKwkweDA4LCAweDVhLCAweDM4LCAweDdlLAorCTB4MjAsIDB4NGQsIDB4ODQsIDB4NzgsCiAJMHgwMiwgMHg4NCwgMHgwOSwgMHgwMywKLQkweDQwLCAweDViLCAweGNjLCAweDdkLAorCTB4NDAsIDB4NWIsIDB4MDQsIDB4N2UsCiAJMHhmZiwgMHg5MCwgMHgyMSwgMHgxYiwKIAkweDgwLCAweGY5LCAweGYyLCAweDAxLAotCTB4MDgsIDB4OTIsIDB4NDMsIDB4NmIsCisJMHgwOCwgMHg5MiwgMHg2MywgMHg2YiwKIAkweDAyLCAweGVhLCAweGI0LCAweDA0LAotCTB4MDEsIDB4MzgsIDB4ZTEsIDB4MzAsCi0JMHgwNSwgMHgzOSwgMHhlMywgMHg5OCwKKwkweDAxLCAweDQwLCAweGUxLCAweDMwLAorCTB4MDUsIDB4NDEsIDB4ZTMsIDB4OTgsCiAJMHgwMSwgMHhlMCwgMHhmNCwgMHgzMSwKIAkweGZmLCAweGVhLCAweGMwLCAweDA5LAotCTB4MDAsIDB4M2EsIDB4ZTUsIDB4MjAsCi0JMHgwMCwgMHgzYiwgMHhlNywgMHgyMCwKKwkweDAwLCAweDQyLCAweGU1LCAweDIwLAorCTB4MDAsIDB4NDMsIDB4ZTcsIDB4MjAsCiAJMHgwMSwgMHhmYSwgMHhjMCwgMHgzMSwKIAkweDA0LCAweGVhLCAweGU4LCAweDMwLAogCTB4ZmYsIDB4ZWEsIDB4ZjAsIDB4MDgsCkBAIC03OTQsMTIgKzgyMiwyMCBAQAogfTsKIAogdHlwZWRlZiBpbnQgYWhkX3BhdGNoX2Z1bmNfdCAoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDIzX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDIzX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9QS1RfQklUQlVDS0VUX0JVRykgIT0gMCk7Cit9CisKIHN0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDIyX2Z1bmM7CiAKIHN0YXRpYyBpbnQKIGFoZF9wYXRjaDIyX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewotCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9QS1RfQklUQlVDS0VUX0JVRykgIT0gMCk7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX1BLVF9CSVRCVUNLRVRfQlVHKSA9PSAwKTsKIH0KIAogc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMjFfZnVuYzsKQEAgLTgwNyw3ICs4NDMsNyBAQAogc3RhdGljIGludAogYWhkX3BhdGNoMjFfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7Ci0JcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX1BLVF9CSVRCVUNLRVRfQlVHKSA9PSAwKTsKKwlyZXR1cm4gKChhaGQtPmZsYWdzICYgQUhEX0lOSVRJQVRPUlJPTEUpICE9IDApOwogfQogCiBzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gyMF9mdW5jOwpAQCAtODE1LDcgKzg1MSw3IEBACiBzdGF0aWMgaW50CiBhaGRfcGF0Y2gyMF9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKLQlyZXR1cm4gKChhaGQtPmZlYXR1cmVzICYgQUhEX1JUSSkgPT0gMCk7CisJcmV0dXJuICgoYWhkLT5mbGFncyAmIEFIRF9UQVJHRVRST0xFKSAhPSAwKTsKIH0KIAogc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTlfZnVuYzsKQEAgLTgyMyw3ICs4NTksNyBAQAogc3RhdGljIGludAogYWhkX3BhdGNoMTlfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7Ci0JcmV0dXJuICgoYWhkLT5mbGFncyAmIEFIRF9JTklUSUFUT1JST0xFKSAhPSAwKTsKKwlyZXR1cm4gKChhaGQtPmJ1Z3MgJiBBSERfQVVUT0ZMVVNIX0JVRykgIT0gMCk7CiB9CiAKIHN0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDE4X2Z1bmM7CkBAIC04MzEsNyArODY3LDcgQEAKIHN0YXRpYyBpbnQKIGFoZF9wYXRjaDE4X2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewotCXJldHVybiAoKGFoZC0+ZmxhZ3MgJiBBSERfVEFSR0VUUk9MRSkgIT0gMCk7CisJcmV0dXJuICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9ORVdfREZDTlRSTF9PUFRTKSAhPSAwKTsKIH0KIAogc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTdfZnVuYzsKQEAgLTgzOSw3ICs4NzUsNyBAQAogc3RhdGljIGludAogYWhkX3BhdGNoMTdfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7Ci0JcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX0FVVE9GTFVTSF9CVUcpICE9IDApOworCXJldHVybiAoKGFoZC0+ZmxhZ3MgJiBBSERfMzlCSVRfQUREUkVTU0lORykgIT0gMCk7CiB9CiAKIHN0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDE2X2Z1bmM7CkBAIC04NDcsNyArODgzLDcgQEAKIHN0YXRpYyBpbnQKIGFoZF9wYXRjaDE2X2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewotCXJldHVybiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTkVXX0RGQ05UUkxfT1BUUykgIT0gMCk7CisJcmV0dXJuICgoYWhkLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKTsKIH0KIAogc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTVfZnVuYzsKQEAgLTg1NSw3ICs4OTEsNyBAQAogc3RhdGljIGludAogYWhkX3BhdGNoMTVfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7Ci0JcmV0dXJuICgoYWhkLT5mbGFncyAmIEFIRF8zOUJJVF9BRERSRVNTSU5HKSAhPSAwKTsKKwlyZXR1cm4gKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19ERkNOVFJMX09QVFMpID09IDApOwogfQogCiBzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxNF9mdW5jOwpAQCAtODYzLDcgKzg5OSw3IEBACiBzdGF0aWMgaW50CiBhaGRfcGF0Y2gxNF9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKLQlyZXR1cm4gKChhaGQtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApOworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9SRUdfU0xPV19TRVRUTEVfQlVHKSAhPSAwKTsKIH0KIAogc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTNfZnVuYzsKQEAgLTg3MSw3ICs5MDcsNyBAQAogc3RhdGljIGludAogYWhkX3BhdGNoMTNfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7Ci0JcmV0dXJuICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9ORVdfREZDTlRSTF9PUFRTKSA9PSAwKTsKKwlyZXR1cm4gKChhaGQtPmZlYXR1cmVzICYgQUhEX1JUSSkgPT0gMCk7CiB9CiAKIHN0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDEyX2Z1bmM7CkBAIC04NzksNyArOTE1LDcgQEAKIHN0YXRpYyBpbnQKIGFoZF9wYXRjaDEyX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewotCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9SRUdfU0xPV19TRVRUTEVfQlVHKSAhPSAwKTsKKwlyZXR1cm4gKChhaGQtPmJ1Z3MgJiBBSERfRUFSTFlfUkVRX0JVRykgIT0gMCk7CiB9CiAKIHN0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDExX2Z1bmM7CkBAIC04ODcsNyArOTIzLDcgQEAKIHN0YXRpYyBpbnQKIGFoZF9wYXRjaDExX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewotCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9FQVJMWV9SRVFfQlVHKSAhPSAwKTsKKwlyZXR1cm4gKChhaGQtPmJ1Z3MgJiBBSERfQlVTRlJFRVJFVl9CVUcpID09IDApOwogfQogCiBzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxMF9mdW5jOwpAQCAtODk1LDcgKzkzMSw3IEBACiBzdGF0aWMgaW50CiBhaGRfcGF0Y2gxMF9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKLQlyZXR1cm4gKChhaGQtPmJ1Z3MgJiBBSERfQlVTRlJFRVJFVl9CVUcpID09IDApOworCXJldHVybiAoKGFoZC0+ZmxhZ3MgJiBBSERfU0VRVUVOQ0VSX0RFQlVHKSAhPSAwKTsKIH0KIAogc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoOV9mdW5jOwpAQCAtOTAzLDcgKzkzOSw3IEBACiBzdGF0aWMgaW50CiBhaGRfcGF0Y2g5X2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewotCXJldHVybiAoKGFoZC0+ZmxhZ3MgJiBBSERfU0VRVUVOQ0VSX0RFQlVHKSAhPSAwKTsKKwlyZXR1cm4gKChhaGQtPmZlYXR1cmVzICYgQUhEX0ZBU1RfQ0RCX0RFTElWRVJZKSAhPSAwKTsKIH0KIAogc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoOF9mdW5jOwpAQCAtOTkyLDE0NyArMTAyOCwxNDkgQEAKIAl7IGFoZF9wYXRjaDBfZnVuYywgNSwgMSwgMSB9LAogCXsgYWhkX3BhdGNoMl9mdW5jLCA2LCAxLCAyIH0sCiAJeyBhaGRfcGF0Y2gwX2Z1bmMsIDcsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDNfZnVuYywgMjAsIDUsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgMjksIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgMzAsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgMzcsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgMzgsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgNDMsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNDQsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgNDcsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNDgsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgNTEsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNTIsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgNjUsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNjYsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgNjksIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNzAsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgNzMsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNzQsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDRfZnVuYywgMTA3LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gyX2Z1bmMsIDE2MiwgNiwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCAxNjgsIDIsIDEgfSwKLQl7IGFoZF9wYXRjaDVfZnVuYywgMTcwLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gyX2Z1bmMsIDE3OSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAxODAsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDZfZnVuYywgMTgxLCAyLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDE4MywgNiwgMyB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCAxODYsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgMTg3LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gyX2Z1bmMsIDE5MCwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAxOTEsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDdfZnVuYywgMTkzLCAyLCAxIH0sCi0JeyBhaGRfcGF0Y2g1X2Z1bmMsIDIwMSwgMTYsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgMjE3LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2g4X2Z1bmMsIDIzNywgMiwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCAyNDEsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgMjQyLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2g3X2Z1bmMsIDI0NSwgMiwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCAyNTksIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgMjYwLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDI2MywgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAyNjQsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgMjY3LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDI2OCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCAzMjMsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgMzI0LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gyX2Z1bmMsIDMzMiwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAzMzMsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgMzM2LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDMzNywgMSwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCAzNDMsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgMzQ0LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDM0NiwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAzNDcsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDlfZnVuYywgMzY2LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2g5X2Z1bmMsIDM2OSwgMSwgMSB9LAotCXsgYWhkX3BhdGNoOV9mdW5jLCAzNzEsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDlfZnVuYywgMzgzLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDM5MywgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAzOTQsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgMzk2LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDM5NywgMSwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCA0MDUsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNDA2LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gyX2Z1bmMsIDQxOSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA0MjAsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDEwX2Z1bmMsIDQ1MCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCA0NTcsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNDU4LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gyX2Z1bmMsIDQ3MCwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA0NzEsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDExX2Z1bmMsIDQ3NiwgNiwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA0ODIsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDEyX2Z1bmMsIDUwNSwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMTNfZnVuYywgNTE0LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxNF9mdW5jLCA1MTUsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNTE2LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxNV9mdW5jLCA1MTksIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDE0X2Z1bmMsIDUyMCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMTZfZnVuYywgNTMxLCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDUzMiwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCA1NTEsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNTUyLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDU1NSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA1NTYsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgNTYxLCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDU2MiwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCA1NjYsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNTY3LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDU2OCwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA1NjksIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgNTgwLCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDU4MSwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMTdfZnVuYywgNTg1LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxOF9mdW5jLCA1OTAsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDE5X2Z1bmMsIDU5MSwgMiwgMSB9LAotCXsgYWhkX3BhdGNoMThfZnVuYywgNTk1LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDU5NiwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCA1OTksIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNjAwLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gyX2Z1bmMsIDYxNSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA2MTYsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDIwX2Z1bmMsIDYxNywgMTQsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgNjM1LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDYzNiwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMjBfZnVuYywgNjM3LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDY0OSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA2NTAsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgNjU3LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDY1OCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMTdfZnVuYywgNjgxLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxN19mdW5jLCA3MTksIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgNzMwLCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDczMSwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCA3NDgsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNzQ5LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDc1MSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA3NTIsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgNzU1LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDc1NiwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMjFfZnVuYywgNzU4LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDc1OSwgMiwgMSB9LAotCXsgYWhkX3BhdGNoMjJfZnVuYywgNzYyLCA0LCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDc2NiwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMjJfZnVuYywgNzc0LCAxMSwgMSB9CisJeyBhaGRfcGF0Y2gzX2Z1bmMsIDM2LCA1LCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDQ1LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQ2LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDUzLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDU0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDU5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDYwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDYzLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDY0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDY3LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDY4LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g0X2Z1bmMsIDExNiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAxNzUsIDMsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMTc4LCAyLCAxIH0sCisJeyBhaGRfcGF0Y2g1X2Z1bmMsIDE4MCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAxODksIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMTkwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g2X2Z1bmMsIDE5MSwgMiwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAxOTMsIDYsIDMgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgMTk2LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDE5NywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAyMDAsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMjAxLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gzX2Z1bmMsIDIwMywgMSwgMSB9LAorCXsgYWhkX3BhdGNoN19mdW5jLCAyMDQsIDMsIDEgfSwKKwl7IGFoZF9wYXRjaDNfZnVuYywgMjEzLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g1X2Z1bmMsIDIxNCwgMTYsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMjMwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g4X2Z1bmMsIDI1MCwgMiwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCAyNTQsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMjU1LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g3X2Z1bmMsIDI1OCwgMywgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCAyNzMsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMjc0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDI3NywgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAyNzgsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgMjgxLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDI4MiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoOV9mdW5jLCAyOTUsIDIsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMjk3LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDMzOSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAzNDAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgMzQ4LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDM0OSwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAzNTIsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMzUzLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDM1OSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAzNjAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMzYyLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDM2MywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTBfZnVuYywgMzgyLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxMF9mdW5jLCAzODUsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDEwX2Z1bmMsIDM4NywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTBfZnVuYywgMzk5LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDQwOSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA0MTAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNDEyLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQxMywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA0MjEsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNDIyLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDQzNSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA0MzYsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDExX2Z1bmMsIDQ3MiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA0ODAsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNDgxLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDQ5MywgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA0OTQsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDEyX2Z1bmMsIDQ5NywgNiwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1MDMsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDEzX2Z1bmMsIDUyNCwgNywgMSB9LAorCXsgYWhkX3BhdGNoMTRfZnVuYywgNTMzLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxNV9mdW5jLCA1NDIsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE2X2Z1bmMsIDU0MywgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1NDQsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE3X2Z1bmMsIDU0NywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTZfZnVuYywgNTQ4LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxOF9mdW5jLCA1NTksIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNTYwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDU3OSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1ODAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNTgzLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDU4NCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCA1ODksIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNTkwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDU5NCwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1OTUsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNTk2LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDU5NywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCA2MDgsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjA5LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxOV9mdW5jLCA2MTMsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDIwX2Z1bmMsIDYxOCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMjFfZnVuYywgNjE5LCAyLCAxIH0sCisJeyBhaGRfcGF0Y2gyMF9mdW5jLCA2MjMsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjI0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDYyNywgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA2MjgsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNjQzLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDY0NCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTNfZnVuYywgNjQ1LCAxNCwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA2NjMsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjY0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxM19mdW5jLCA2NjUsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNjc3LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDY3OCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA2ODUsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjg2LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxOV9mdW5jLCA3MDksIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE5X2Z1bmMsIDc0NywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA3NTgsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNzU5LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDc3NiwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3NzcsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNzc5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDc4MCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA3ODMsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNzg0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyMl9mdW5jLCA3ODYsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNzg3LCAyLCAxIH0sCisJeyBhaGRfcGF0Y2gyM19mdW5jLCA3OTAsIDQsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNzk0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyM19mdW5jLCA4MDIsIDExLCAxIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY3MgewogCXVpbnQxNl90CWJlZ2luOwogCXVpbnQxNl90CWVuZDsKIH0gY3JpdGljYWxfc2VjdGlvbnNbXSA9IHsKLQl7IDExLCAxMiB9LAotCXsgMTMsIDE0IH0sCi0JeyAyOSwgNDIgfSwKLQl7IDU2LCA1OSB9LAotCXsgMTAxLCAxMjggfSwKLQl7IDEyOSwgMTU3IH0sCi0JeyAxNTksIDE2MiB9LAotCXsgMTcwLCAxNzggfSwKLQl7IDIwMSwgMjUwIH0sCi0JeyA2ODEsIDY5NyB9LAotCXsgNjk3LCA3MTEgfSwKLQl7IDcyMSwgNzI1IH0KKwl7IDE3LCAyOCB9LAorCXsgMjksIDMwIH0sCisJeyA0NywgNTggfSwKKwl7IDYxLCA2MyB9LAorCXsgNjUsIDY2IH0sCisJeyA3MiwgOTIgfSwKKwl7IDExMCwgMTM3IH0sCisJeyAxMzgsIDE3NSB9LAorCXsgMTgwLCAxODggfSwKKwl7IDIxMywgMjY0IH0sCisJeyA0MjUsIDQzMyB9LAorCXsgNDQzLCA0NDUgfSwKKwl7IDQ0OCwgNDU3IH0sCisJeyA3MDksIDczOSB9LAorCXsgNzQ5LCA3NTMgfQogfTsKIAogc3RhdGljIGNvbnN0IGludCBudW1fY3JpdGljYWxfc2VjdGlvbnMgPSBzaXplb2YoY3JpdGljYWxfc2VjdGlvbnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYwppbmRleCBmZDM4OWU5Li4wNTE5NzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKQEAgLTM3NSw3ICszNzUsNyBAQAogCQkJCQkgc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIHN0YXRpYyB2b2lkIGFoY19saW51eF9zZW1fdGltZW91dCh1X2xvbmcgYXJnKTsKIHN0YXRpYyB2b2lkIGFoY19saW51eF9mcmVlemVfc2ltcShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwotc3RhdGljIHZvaWQgYWhjX2xpbnV4X3JlbGVhc2Vfc2ltcSh1X2xvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9yZWxlYXNlX3NpbXEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKIHN0YXRpYyBpbnQgIGFoY19saW51eF9xdWV1ZV9yZWNvdmVyeV9jbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBzY2JfZmxhZyBmbGFnKTsKIHN0YXRpYyB2b2lkIGFoY19saW51eF9pbml0aWFsaXplX3Njc2lfYnVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CiBzdGF0aWMgdV9pbnQgYWhjX2xpbnV4X3VzZXJfdGFnZGVwdGgoc3RydWN0IGFoY19zb2Z0YyAqYWhjLApAQCAtMTA3Myw3ICsxMDczLDYgQEAKIAkJcmV0dXJuIChFTk9NRU0pOwogCiAJKigoc3RydWN0IGFoY19zb2Z0YyAqKilob3N0LT5ob3N0ZGF0YSkgPSBhaGM7Ci0JYWhjX2xvY2soYWhjLCAmcyk7CiAJYWhjLT5wbGF0Zm9ybV9kYXRhLT5ob3N0ID0gaG9zdDsKIAlob3N0LT5jYW5fcXVldWUgPSBBSENfTUFYX1FVRVVFOwogCWhvc3QtPmNtZF9wZXJfbHVuID0gMjsKQEAgLTEwODQsNyArMTA4Myw5IEBACiAJaG9zdC0+bWF4X2x1biA9IEFIQ19OVU1fTFVOUzsKIAlob3N0LT5tYXhfY2hhbm5lbCA9IChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pID8gMSA6IDA7CiAJaG9zdC0+c2dfdGFibGVzaXplID0gQUhDX05TRUc7CisJYWhjX2xvY2soYWhjLCAmcyk7CiAJYWhjX3NldF91bml0KGFoYywgYWhjX2xpbnV4X3VuaXQrKyk7CisJYWhjX3VubG9jayhhaGMsICZzKTsKIAlzcHJpbnRmKGJ1ZiwgInNjc2klZCIsIGhvc3QtPmhvc3Rfbm8pOwogCW5ld19uYW1lID0gbWFsbG9jKHN0cmxlbihidWYpICsgMSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKIAlpZiAobmV3X25hbWUgIT0gTlVMTCkgewpAQCAtMTA5NCw3ICsxMDk1LDYgQEAKIAlob3N0LT51bmlxdWVfaWQgPSBhaGMtPnVuaXQ7CiAJYWhjX2xpbnV4X2luaXRpYWxpemVfc2NzaV9idXMoYWhjKTsKIAlhaGNfaW50cl9lbmFibGUoYWhjLCBUUlVFKTsKLQlhaGNfdW5sb2NrKGFoYywgJnMpOwogCiAJaG9zdC0+dHJhbnNwb3J0dCA9IGFoY19saW51eF90cmFuc3BvcnRfdGVtcGxhdGU7CiAKQEAgLTExMjAsMTAgKzExMjAsMTMgQEAKIHsKIAlpbnQgaTsKIAlpbnQgbnVtdGFyZzsKKwl1bnNpZ25lZCBsb25nIHM7CiAKIAlpID0gMDsKIAludW10YXJnID0gMDsKIAorCWFoY19sb2NrKGFoYywgJnMpOworCiAJaWYgKGFpYzd4eHhfbm9fcmVzZXQgIT0gMCkKIAkJYWhjLT5mbGFncyAmPSB+KEFIQ19SRVNFVF9CVVNfQXxBSENfUkVTRVRfQlVTX0IpOwogCkBAIC0xMTcwLDE2ICsxMTczLDEyIEBACiAJCWFoY191cGRhdGVfbmVnX3JlcXVlc3QoYWhjLCAmZGV2aW5mbywgdHN0YXRlLAogCQkJCSAgICAgICB0aW5mbywgQUhDX05FR19BTFdBWVMpOwogCX0KKwlhaGNfdW5sb2NrKGFoYywgJnMpOwogCS8qIEdpdmUgdGhlIGJ1cyBzb21lIHRpbWUgdG8gcmVjb3ZlciAqLwogCWlmICgoYWhjLT5mbGFncyAmIChBSENfUkVTRVRfQlVTX0F8QUhDX1JFU0VUX0JVU19CKSkgIT0gMCkgewogCQlhaGNfbGludXhfZnJlZXplX3NpbXEoYWhjKTsKLQkJaW5pdF90aW1lcigmYWhjLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lcik7Ci0JCWFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZGF0YSA9ICh1X2xvbmcpYWhjOwotCQlhaGMtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyLmV4cGlyZXMgPQotCQkgICAgamlmZmllcyArIChBSUM3WFhYX1JFU0VUX0RFTEFZICogSFopLzEwMDA7Ci0JCWFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZnVuY3Rpb24gPQotCQkgICAgYWhjX2xpbnV4X3JlbGVhc2Vfc2ltcTsKLQkJYWRkX3RpbWVyKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKKwkJbXNsZWVwKEFJQzdYWFhfUkVTRVRfREVMQVkpOworCQlhaGNfbGludXhfcmVsZWFzZV9zaW1xKGFoYyk7CiAJfQogfQogCkBAIC0yMDU5LDYgKzIwNTgsOSBAQAogc3RhdGljIHZvaWQKIGFoY19saW51eF9mcmVlemVfc2ltcShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCiB7CisJdW5zaWduZWQgbG9uZyBzOworCisJYWhjX2xvY2soYWhjLCAmcyk7CiAJYWhjLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuKys7CiAJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA9PSAxKSB7CiAJCXNjc2lfYmxvY2tfcmVxdWVzdHMoYWhjLT5wbGF0Zm9ybV9kYXRhLT5ob3N0KTsKQEAgLTIwNjgsMTcgKzIwNzAsMTUgQEAKIAkJCQkJQ0FNX0xVTl9XSUxEQ0FSRCwgU0NCX0xJU1RfTlVMTCwKIAkJCQkJUk9MRV9JTklUSUFUT1IsIENBTV9SRVFVRVVFX1JFUSk7CiAJfQorCWFoY191bmxvY2soYWhjLCAmcyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1haGNfbGludXhfcmVsZWFzZV9zaW1xKHVfbG9uZyBhcmcpCithaGNfbGludXhfcmVsZWFzZV9zaW1xKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKIHsKLQlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7CiAJdV9sb25nIHM7CiAJaW50ICAgIHVuYmxvY2tfcmVxczsKIAotCWFoYyA9IChzdHJ1Y3QgYWhjX3NvZnRjICopYXJnOwotCiAJdW5ibG9ja19yZXFzID0gMDsKIAlhaGNfbG9jayhhaGMsICZzKTsKIAlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID4gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5oCmluZGV4IGYyYTk1NDQuLmUwZWRhY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uaApAQCAtMjIzLDkgKzIyMyw2IEBACiAgKi8KICNkZWZpbmUgYWhjX2RtYW1hcF9zeW5jKGFoYywgZG1hX3RhZywgZG1hbWFwLCBvZmZzZXQsIGxlbiwgb3ApCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiBUaW1lciBEYXRhU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0IGFoY190aW1lcl90OwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIENPTkZJR19BSUM3WFhYX1JFR19QUkVUVFlfUFJJTlQKICNkZWZpbmUgQUlDX0RFQlVHX1JFR0lTVEVSUyAxCkBAIC0yMzUsMzAgKzIzMiw5IEBACiAjaW5jbHVkZSAiYWljN3h4eC5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVGltZXIgRmFjaWxpdGllcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBhaGNfdGltZXJfaW5pdCBpbml0X3RpbWVyCi0jZGVmaW5lIGFoY190aW1lcl9zdG9wIGRlbF90aW1lcl9zeW5jCi10eXBlZGVmIHZvaWQgYWhjX2xpbnV4X2NhbGxiYWNrX3QgKHVfbG9uZyk7ICAKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoY190aW1lcl9yZXNldChhaGNfdGltZXJfdCAqdGltZXIsIGludCB1c2VjLAotCQkJCSAgICAgYWhjX2NhbGxiYWNrX3QgKmZ1bmMsIHZvaWQgKmFyZyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfc2NiX3RpbWVyX3Jlc2V0KHN0cnVjdCBzY2IgKnNjYiwgdV9pbnQgdXNlYyk7Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGNfdGltZXJfcmVzZXQoYWhjX3RpbWVyX3QgKnRpbWVyLCBpbnQgdXNlYywgYWhjX2NhbGxiYWNrX3QgKmZ1bmMsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7Ci0KLQlhaGMgPSAoc3RydWN0IGFoY19zb2Z0YyAqKWFyZzsKLQlkZWxfdGltZXIodGltZXIpOwotCXRpbWVyLT5kYXRhID0gKHVfbG9uZylhcmc7Ci0JdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgKHVzZWMgKiBIWikvMTAwMDAwMDsKLQl0aW1lci0+ZnVuY3Rpb24gPSAoYWhjX2xpbnV4X2NhbGxiYWNrX3QqKWZ1bmM7Ci0JYWRkX3RpbWVyKHRpbWVyKTsKLX0KLQogc3RhdGljIF9faW5saW5lIHZvaWQKIGFoY19zY2JfdGltZXJfcmVzZXQoc3RydWN0IHNjYiAqc2NiLCB1X2ludCB1c2VjKQogewotCW1vZF90aW1lcigmc2NiLT5pb19jdHgtPmVoX3RpbWVvdXQsIGppZmZpZXMgKyAodXNlYyAqIEhaKS8xMDAwMDAwKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNNUCBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM5Myw3ICszNjksNiBAQAogCiAJc3BpbmxvY2tfdAkJIHNwaW5fbG9jazsKIAl1X2ludAkJCSBxZnJvemVuOwotCXN0cnVjdCB0aW1lcl9saXN0CSByZXNldF90aW1lcjsKIAlzdHJ1Y3Qgc2VtYXBob3JlCSBlaF9zZW07CiAJc3RydWN0IFNjc2lfSG9zdCAgICAgICAgKmhvc3Q7CQkvKiBwb2ludGVyIHRvIHNjc2kgaG9zdCAqLwogI2RlZmluZSBBSENfTElOVVhfTk9JUlEJKCh1aW50MzJfdCl+MCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3BjaS5jCmluZGV4IGIzYjJlMjIuLjVmNTg2MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuYwpAQCAtMzksOSArMzksNyBAQAogICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKgotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4X3BjaS5jIzY5ICQKLSAqCi0gKiAkRnJlZUJTRCQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eF9wY2kuYyM3OSAkCiAgKi8KIAogI2lmZGVmIF9fbGludXhfXwpAQCAtMzkzLDYgKzM5MSwxMiBAQAogCQkiQWRhcHRlYyBhaWM3ODkyIFVsdHJhMTYwIFNDU0kgYWRhcHRlciAoQVJPKSIsCiAJCWFoY19haWM3ODkyX3NldHVwCiAJfSwKKwl7CisJCUlEX0FIQV8yOTE1XzMwTFAsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAyOTE1LzMwTFAgVWx0cmExNjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTJfc2V0dXAKKwl9LAogCS8qIGFpYzc4OTUgYmFzZWQgY29udHJvbGxlcnMgKi8JCiAJewogCQlJRF9BSEFfMjk0MFVfRFVBTCwKQEAgLTExOTMsOSArMTE5NywxOSBAQAogCSAqIHVzZSBmb3IgdGhpcyB0ZXN0LgogCSAqLwogCWhjbnRybCA9IGFoY19pbmIoYWhjLCBIQ05UUkwpOworCiAJaWYgKGhjbnRybCA9PSAweEZGKQogCQlnb3RvIGZhaWw7CiAKKwlpZiAoKGhjbnRybCAmIENISVBSU1QpICE9IDApIHsKKwkJLyoKKwkJICogVGhlIGNoaXAgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHNpbmNlCisJCSAqIFBDSS9FSVNBL1ZMQiBidXMgcmVzZXQuICBEb24ndCB0cnVzdAorCQkgKiAibGVmdCBvdmVyIEJJT1MgZGF0YSIuCisJCSAqLworCQlhaGMtPmZsYWdzIHw9IEFIQ19OT19CSU9TX0lOSVQ7CisJfQorCiAJLyoKIAkgKiBOZXh0IGNyZWF0ZSBhIHNpdHVhdGlvbiB3aGVyZSB3cml0ZSBjb21iaW5pbmcKIAkgKiBvciByZWFkIHByZWZldGNoaW5nIGNvdWxkIGJlIGluaXRpYXRlZCBieSB0aGUKQEAgLTEzMDcsNiArMTMyMSwxMCBAQAogCQkJc2Quc2RfY2hpcCA9IEM1Nl82NjsKIAkJfQogCQlhaGNfcmVsZWFzZV9zZWVwcm9tKCZzZCk7CisKKwkJLyogUmVtZW1iZXIgdGhlIFNFRVBST00gdHlwZSBmb3IgbGF0ZXIgKi8KKwkJaWYgKHNkLnNkX2NoaXAgPT0gQzU2XzY2KQorCQkJYWhjLT5mbGFncyB8PSBBSENfTEFSR0VfU0VFUFJPTTsKIAl9CiAKIAlpZiAoIWhhdmVfc2VlcHJvbSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmgKaW5kZXggYmUyN2ZjYi4uMjYzZjg1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3BjaS5oCkBAIC0xMDUsNiArMTA1LDcgQEAKICNkZWZpbmUgSURfQUhBXzI5MTYwQwkJCTB4MDA4MDkwMDU2MjIwOTAwNXVsbAogI2RlZmluZSBJRF9BSEFfMjkxNjBCCQkJMHgwMDgwOTAwNUUyMjA5MDA1dWxsCiAjZGVmaW5lIElEX0FIQV8xOTE2MEIJCQkweDAwODE5MDA1NjJBMTkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5MTVfMzBMUAkJMHgwMDgyOTAwNTAyMTA5MDA1dWxsCiAKICNkZWZpbmUgSURfQUlDNzg5NgkJCTB4MDA1RjkwMDVGRkZGOTAwNXVsbAogI2RlZmluZSBJRF9BSUM3ODk2X0FSTwkJCTB4MDA1MzkwMDVGRkZGOTAwNXVsbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQuYwppbmRleCAzM2Q1NmMzLi43NzBmMTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQuYwpAQCAtMTI5MCw3ICsxMjkwLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCiBhaWNfaW5iKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIGxvbmcgcG9ydCkKIHsKICNpZmRlZiBNTUFQSU8KQEAgLTEzMDksNyArMTMwOSw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogYWljX291dGIoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgdW5zaWduZWQgY2hhciB2YWwsIGxvbmcgcG9ydCkKIHsKICNpZmRlZiBNTUFQSU8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jaC5jIGIvZHJpdmVycy9zY3NpL2NoLmMKaW5kZXggNDI5OWZhYi4uYzNmMjcyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2NoLmMKKysrIGIvZHJpdmVycy9zY3NpL2NoLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2hpby5oPgkJCS8qIGhlcmUgYXJlIGFsbCB0aGUgaW9jdGxzICovCisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CkBAIC0xMTEsNyArMTEyLDcgQEAKIAl1X2ludCAgICAgICAgICAgICAgIGNvdW50c1tDSF9UWVBFU107CiAJdV9pbnQgICAgICAgICAgICAgICB1bml0X2F0dGVudGlvbjsKIAl1X2ludAkJICAgIHZvbHRhZ3M7Ci0Jc3RydWN0IHNlbWFwaG9yZSAgICBsb2NrOworCXN0cnVjdCBtdXRleAkgICAgbG9jazsKIH0gc2NzaV9jaGFuZ2VyOwogCiBzdGF0aWMgTElTVF9IRUFEKGNoX2Rldmxpc3QpOwpAQCAtNTY1LDcgKzU2Niw3IEBACiAJdV9jaGFyIGRhdGFbMTZdOwogCXVuc2lnbmVkIGludCBpOwogCQotCWRvd24oJmNoLT5sb2NrKTsKKwltdXRleF9sb2NrKCZjaC0+bG9jayk7CiAJZm9yIChpID0gMDsgaSA8IGNoLT5jb3VudHNbdHlwZV07IGkrKykgewogCQlpZiAoMCAhPSBjaF9yZWFkX2VsZW1lbnRfc3RhdHVzCiAJCSAgICAoY2gsIGNoLT5maXJzdHNbdHlwZV0raSxkYXRhKSkgewpAQCAtNTgyLDcgKzU4Myw3IEBACiAJCWlmICgwICE9IHJldHZhbCkKIAkJCWJyZWFrOwogCX0KLQl1cCgmY2gtPmxvY2spOworCW11dGV4X3VubG9jaygmY2gtPmxvY2spOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTY4NywxMSArNjg4LDExIEBACiAJCQlkcHJpbnRrKCJDSElPUE9TSVRJT046IGludmFsaWQgcGFyYW1ldGVyXG4iKTsKIAkJCXJldHVybiAtRUJBRFNMVDsKIAkJfQotCQlkb3duKCZjaC0+bG9jayk7CisJCW11dGV4X2xvY2soJmNoLT5sb2NrKTsKIAkJcmV0dmFsID0gY2hfcG9zaXRpb24oY2gsMCwKIAkJCQkgICAgIGNoLT5maXJzdHNbcG9zLmNwX3R5cGVdICsgcG9zLmNwX3VuaXQsCiAJCQkJICAgICBwb3MuY3BfZmxhZ3MgJiBDUF9JTlZFUlQpOwotCQl1cCgmY2gtPmxvY2spOworCQltdXRleF91bmxvY2soJmNoLT5sb2NrKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAJCkBAIC03MDgsMTIgKzcwOSwxMiBAQAogCQkJcmV0dXJuIC1FQkFEU0xUOwogCQl9CiAJCQotCQlkb3duKCZjaC0+bG9jayk7CisJCW11dGV4X2xvY2soJmNoLT5sb2NrKTsKIAkJcmV0dmFsID0gY2hfbW92ZShjaCwwLAogCQkJCSBjaC0+Zmlyc3RzW212LmNtX2Zyb210eXBlXSArIG12LmNtX2Zyb211bml0LAogCQkJCSBjaC0+Zmlyc3RzW212LmNtX3RvdHlwZV0gICArIG12LmNtX3RvdW5pdCwKIAkJCQkgbXYuY21fZmxhZ3MgJiBDTV9JTlZFUlQpOwotCQl1cCgmY2gtPmxvY2spOworCQltdXRleF91bmxvY2soJmNoLT5sb2NrKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKQEAgLTczMSwxNCArNzMyLDE0IEBACiAJCQlyZXR1cm4gLUVCQURTTFQ7CiAJCX0KIAkJCi0JCWRvd24oJmNoLT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmY2gtPmxvY2spOwogCQlyZXR2YWwgPSBjaF9leGNoYW5nZQogCQkJKGNoLDAsCiAJCQkgY2gtPmZpcnN0c1ttdi5jZV9zcmN0eXBlXSAgKyBtdi5jZV9zcmN1bml0LAogCQkJIGNoLT5maXJzdHNbbXYuY2VfZmRzdHR5cGVdICsgbXYuY2VfZmRzdHVuaXQsCiAJCQkgY2gtPmZpcnN0c1ttdi5jZV9zZHN0dHlwZV0gKyBtdi5jZV9zZHN0dW5pdCwKIAkJCSBtdi5jZV9mbGFncyAmIENFX0lOVkVSVDEsIG12LmNlX2ZsYWdzICYgQ0VfSU5WRVJUMik7Ci0JCXVwKCZjaC0+bG9jayk7CisJCW11dGV4X3VubG9jaygmY2gtPmxvY2spOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIApAQCAtNzcyLDcgKzc3Myw3IEBACiAJCWJ1ZmZlciA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJCWlmICghYnVmZmVyKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWRvd24oJmNoLT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmY2gtPmxvY2spOwogCQkKIAl2b2x0YWdfcmV0cnk6CiAJCW1lbXNldChjbWQsMCxzaXplb2YoY21kKSk7CkBAIC04MjMsNyArODI0LDcgQEAKIAkJCWdvdG8gdm9sdGFnX3JldHJ5OwogCQl9CiAJCWtmcmVlKGJ1ZmZlcik7Ci0JCXVwKCZjaC0+bG9jayk7CisJCW11dGV4X3VubG9jaygmY2gtPmxvY2spOwogCQkKIAkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2dlLCBzaXplb2YgKGNnZSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC04MzIsOSArODMzLDkgQEAKIAogCWNhc2UgQ0hJT0lOSVRFTEVNOgogCXsKLQkJZG93bigmY2gtPmxvY2spOworCQltdXRleF9sb2NrKCZjaC0+bG9jayk7CiAJCXJldHZhbCA9IGNoX2luaXRfZWxlbShjaCk7Ci0JCXVwKCZjaC0+bG9jayk7CisJCW11dGV4X3VubG9jaygmY2gtPmxvY2spOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAkJCkBAIC04NTEsMTIgKzg1MiwxMiBAQAogCQkJcmV0dXJuIC1FQkFEU0xUOwogCQl9CiAJCWVsZW0gPSBjaC0+Zmlyc3RzW2Nzdi5jc3ZfdHlwZV0gKyBjc3YuY3N2X3VuaXQ7Ci0JCWRvd24oJmNoLT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmY2gtPmxvY2spOwogCQlyZXR2YWwgPSBjaF9zZXRfdm9sdGFnKGNoLCBlbGVtLAogCQkJCSAgICAgICBjc3YuY3N2X2ZsYWdzICYgQ1NWX0FWT0xUQUcsCiAJCQkJICAgICAgIGNzdi5jc3ZfZmxhZ3MgJiBDU1ZfQ0xFQVJUQUcsCiAJCQkJICAgICAgIGNzdi5jc3Zfdm9sdGFnKTsKLQkJdXAoJmNoLT5sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZjaC0+bG9jayk7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCkBAIC05MjksNyArOTMwLDcgQEAKIAltZW1zZXQoY2gsMCxzaXplb2YoKmNoKSk7CiAJY2gtPm1pbm9yID0gY2hfZGV2Y291bnQ7CiAJc3ByaW50ZihjaC0+bmFtZSwiY2glZCIsY2gtPm1pbm9yKTsKLQlpbml0X01VVEVYKCZjaC0+bG9jayk7CisJbXV0ZXhfaW5pdCgmY2gtPmxvY2spOwogCWNoLT5kZXZpY2UgPSBzZDsKIAljaF9yZWFkY29uZmlnKGNoKTsKIAlpZiAoaW5pdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kcHRfaTJvLmMgYi9kcml2ZXJzL3Njc2kvZHB0X2kyby5jCmluZGV4IDYyNTJiOWQuLjZlNmIyOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kcHRfaTJvLmMKKysrIGIvZHJpdmVycy9zY3NpL2RwdF9pMm8uYwpAQCAtNjEsNiArNjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JLyogZm9yIGJvb3RfY3B1X2RhdGEgKi8KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtMTA2LDcgKzEwNyw3IEBACiAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwogCi1zdGF0aWMgREVDTEFSRV9NVVRFWChhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CitzdGF0aWMgREVGSU5FX01VVEVYKGFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAogc3RhdGljIHN0cnVjdCBpMm9fc3lzX3RibCAqc3lzX3RibCA9IE5VTEw7CiBzdGF0aWMgaW50IHN5c190YmxfaW5kID0gMDsKQEAgLTUzNywxMyArNTM4LDEzIEBACiAJICovCiAKIAkvLyBGaW5kIEhCQSAoaG9zdCBidXMgYWRhcHRlcikgd2UgYXJlIGxvb2tpbmcgZm9yCi0JZG93bigmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCW11dGV4X2xvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAlmb3IgKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwSGJhLT5uZXh0KSB7CiAJCWlmIChwSGJhLT5ob3N0ID09IGhvc3QpIHsKIAkJCWJyZWFrOwkvKiBmb3VuZCBhZGFwdGVyICovCiAJCX0KIAl9Ci0JdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwltdXRleF91bmxvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAlpZiAocEhiYSA9PSBOVUxMKSB7CiAJCXJldHVybiAwOwogCX0KQEAgLTg5OCw2ICs4OTksMTIgQEAKIAlpZihwY2lfZW5hYmxlX2RldmljZShwRGV2KSkgewogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwRGV2LCAiZHB0X2kybyIpKSB7CisJCVBFUlJPUigiZHB0aTogYWRwdF9jb25maWdfaGJhOiBwY2kgcmVxdWVzdCByZWdpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJcGNpX3NldF9tYXN0ZXIocERldik7CiAJaWYgKHBjaV9zZXRfZG1hX21hc2socERldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSAmJgogCSAgICBwY2lfc2V0X2RtYV9tYXNrKHBEZXYsIDB4ZmZmZmZmZmZVTEwpKQpAQCAtOTIzLDEwICs5MzAsNiBAQAogCQlyYXB0b3JGbGFnID0gVFJVRTsKIAl9CiAKLQlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwRGV2LCAiZHB0X2kybyIpKSB7Ci0JCVBFUlJPUigiZHB0aTogYWRwdF9jb25maWdfaGJhOiBwY2kgcmVxdWVzdCByZWdpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCWJhc2VfYWRkcl92aXJ0ID0gaW9yZW1hcChiYXNlX2FkZHIwX3BoeXMsaGJhX21hcDBfYXJlYV9zaXplKTsKIAlpZiAoIWJhc2VfYWRkcl92aXJ0KSB7CiAJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocERldik7CkBAIC05NTgsNyArOTYxLDcgQEAKIAl9CiAJbWVtc2V0KHBIYmEsIDAsIHNpemVvZihhZHB0X2hiYSkpOwogCi0JZG93bigmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCW11dGV4X2xvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAogCWlmKGhiYV9jaGFpbiAhPSBOVUxMKXsKIAkJZm9yKHAgPSBoYmFfY2hhaW47IHAtPm5leHQ7IHAgPSBwLT5uZXh0KTsKQEAgLTk3MSw3ICs5NzQsNyBAQAogCXNwcmludGYocEhiYS0+bmFtZSwgImRwdGklZCIsIGhiYV9jb3VudCk7CiAJaGJhX2NvdW50Kys7CiAJCi0JdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwltdXRleF91bmxvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAogCXBIYmEtPnBEZXYgPSBwRGV2OwogCXBIYmEtPmJhc2VfYWRkcl9waHlzID0gYmFzZV9hZGRyMF9waHlzOwpAQCAtMTAyNyw3ICsxMDMwLDcgQEAKIAlzdHJ1Y3QgYWRwdF9kZXZpY2UqIHBOZXh0OwogCiAKLQlkb3duKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJbXV0ZXhfbG9jaygmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOwogCS8vIHNjc2lfdW5yZWdpc3RlciBjYWxscyBvdXIgYWRwdF9yZWxlYXNlIHdoaWNoCiAJLy8gZG9lcyBhIHF1aWVzZQogCWlmKHBIYmEtPmhvc3QpewpAQCAtMTA0Niw3ICsxMDQ5LDcgQEAKIAl9CiAKIAloYmFfY291bnQtLTsKLQl1cCgmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCW11dGV4X3VubG9jaygmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOwogCiAJaW91bm1hcChwSGJhLT5iYXNlX2FkZHJfdmlydCk7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwSGJhLT5wRGV2KTsKQEAgLTE1NDksNyArMTU1Miw3IEBACiAgCiBzdGF0aWMgaW50IGFkcHRfaTJvX2luc3RhbGxfZGV2aWNlKGFkcHRfaGJhKiBwSGJhLCBzdHJ1Y3QgaTJvX2RldmljZSAqZCkKIHsKLQlkb3duKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJbXV0ZXhfbG9jaygmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOwogCWQtPmNvbnRyb2xsZXI9cEhiYTsKIAlkLT5vd25lcj1OVUxMOwogCWQtPm5leHQ9cEhiYS0+ZGV2aWNlczsKQEAgLTE1NjAsNyArMTU2Myw3IEBACiAJcEhiYS0+ZGV2aWNlcz1kOwogCSpkLT5kZXZfbmFtZSA9IDA7CiAKLQl1cCgmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCW11dGV4X3VubG9jaygmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xNTc1LDI0ICsxNTc4LDI0IEBACiAJaWYgKG1pbm9yID49IGhiYV9jb3VudCkgewogCQlyZXR1cm4gLUVOWElPOwogCX0KLQlkb3duKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJbXV0ZXhfbG9jaygmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOwogCWZvciAocEhiYSA9IGhiYV9jaGFpbjsgcEhiYTsgcEhiYSA9IHBIYmEtPm5leHQpIHsKIAkJaWYgKHBIYmEtPnVuaXQgPT0gbWlub3IpIHsKIAkJCWJyZWFrOwkvKiBmb3VuZCBhZGFwdGVyICovCiAJCX0KIAl9CiAJaWYgKHBIYmEgPT0gTlVMTCkgewotCQl1cCgmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCQltdXRleF91bmxvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKIC8vCWlmKHBIYmEtPmluX3VzZSl7Ci0JLy8JdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwkvLwltdXRleF91bmxvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIC8vCQlyZXR1cm4gLUVCVVNZOwogLy8JfQogCiAJcEhiYS0+aW5fdXNlID0gMTsKLQl1cCgmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCW11dGV4X3VubG9jaygmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjA2LDEzICsxNjA5LDEzIEBACiAJaWYgKG1pbm9yID49IGhiYV9jb3VudCkgewogCQlyZXR1cm4gLUVOWElPOwogCX0KLQlkb3duKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJbXV0ZXhfbG9jaygmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOwogCWZvciAocEhiYSA9IGhiYV9jaGFpbjsgcEhiYTsgcEhiYSA9IHBIYmEtPm5leHQpIHsKIAkJaWYgKHBIYmEtPnVuaXQgPT0gbWlub3IpIHsKIAkJCWJyZWFrOwkvKiBmb3VuZCBhZGFwdGVyICovCiAJCX0KIAl9Ci0JdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwltdXRleF91bmxvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAlpZiAocEhiYSA9PSBOVUxMKSB7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtMTkxMCwxMyArMTkxMywxMyBAQAogCWlmIChtaW5vciA+PSBEUFRJX01BWF9IQkEpewogCQlyZXR1cm4gLUVOWElPOwogCX0KLQlkb3duKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJbXV0ZXhfbG9jaygmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOwogCWZvciAocEhiYSA9IGhiYV9jaGFpbjsgcEhiYTsgcEhiYSA9IHBIYmEtPm5leHQpIHsKIAkJaWYgKHBIYmEtPnVuaXQgPT0gbWlub3IpIHsKIAkJCWJyZWFrOwkvKiBmb3VuZCBhZGFwdGVyICovCiAJCX0KIAl9Ci0JdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwltdXRleF91bmxvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAlpZihwSGJhID09IE5VTEwpewogCQlyZXR1cm4gLUVOWElPOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ob3N0cy5jIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKaW5kZXggNjY3ODNjOC4uNTg4MTA3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hvc3RzLmMKKysrIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKQEAgLTE1NiwxNiArMTU2LDE2IEBACiB2b2lkIHNjc2lfcmVtb3ZlX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlkb3duKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisJbXV0ZXhfbG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlpZiAoc2NzaV9ob3N0X3NldF9zdGF0ZShzaG9zdCwgU0hPU1RfQ0FOQ0VMKSkKIAkJaWYgKHNjc2lfaG9zdF9zZXRfc3RhdGUoc2hvc3QsIFNIT1NUX0NBTkNFTF9SRUNPVkVSWSkpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCQkJdXAoJnNob3N0LT5zY2FuX211dGV4KTsKKwkJCW11dGV4X3VubG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCQkJcmV0dXJuOwogCQl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JdXAoJnNob3N0LT5zY2FuX211dGV4KTsKKwltdXRleF91bmxvY2soJnNob3N0LT5zY2FuX211dGV4KTsKIAlzY3NpX2ZvcmdldF9ob3N0KHNob3N0KTsKIAlzY3NpX3Byb2NfaG9zdF9ybShzaG9zdCk7CiAKQEAgLTMyMCw3ICszMjAsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZzaG9zdC0+c3RhcnZlZF9saXN0KTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzaG9zdC0+aG9zdF93YWl0KTsKIAotCWluaXRfTVVURVgoJnNob3N0LT5zY2FuX211dGV4KTsKKwltdXRleF9pbml0KCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAKIAlzaG9zdC0+aG9zdF9ubyA9IHNjc2lfaG9zdF9uZXh0X2huKys7IC8qIFhYWChoY2gpOiBzdGlsbCByYWN5ICovCiAJc2hvc3QtPmRtYV9jaGFubmVsID0gMHhmZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHMuYyBiL2RyaXZlcnMvc2NzaS9pcHMuYwppbmRleCAzODgyZDQ4Li5lNWUxY2E0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXBzLmMKKysrIGIvZHJpdmVycy9zY3NpL2lwcy5jCkBAIC0xMzE5LDYgKzEzMTksOSBAQAogCQkJbWluID0gaGEtPm1heF9jbWRzIC0gMTsKIAkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoU0RwdHIsIE1TR19PUkRFUkVEX1RBRywgbWluKTsKIAl9CisKKwlTRHB0ci0+c2tpcF9tc19wYWdlXzggPSAxOworCVNEcHRyLT5za2lwX21zX3BhZ2VfM2YgPSAxOwogCXJldHVybiAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMgYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKaW5kZXggMTBiY2Y0Mi4uNzgwYmZjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgpAQCAtODYsMzUgKzg3LDMyIEBACiB7CiAJc2dfaW5pdF9vbmUoJmlidWYtPnNnLCAodTggKil2YnVmLCBzaXplKTsKIAlpYnVmLT5zZW50ID0gMDsKKwlpYnVmLT51c2Vfc2VuZG1zZyA9IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogaXNjc2lfYnVmX2luaXRfaW92KHN0cnVjdCBpc2NzaV9idWYgKmlidWYsIGNoYXIgKnZidWYsIGludCBzaXplKQogewotCWlidWYtPnNnLnBhZ2UgPSAodm9pZCopdmJ1ZjsKLQlpYnVmLT5zZy5vZmZzZXQgPSAodW5zaWduZWQgaW50KS0xOworCWlidWYtPnNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UodmJ1Zik7CisJaWJ1Zi0+c2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UodmJ1Zik7CiAJaWJ1Zi0+c2cubGVuZ3RoID0gc2l6ZTsKIAlpYnVmLT5zZW50ID0gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkKgotaXNjc2lfYnVmX2lvdl9iYXNlKHN0cnVjdCBpc2NzaV9idWYgKmlidWYpCi17Ci0JcmV0dXJuIChjaGFyKilpYnVmLT5zZy5wYWdlICsgaWJ1Zi0+c2VudDsKKwlpYnVmLT51c2Vfc2VuZG1zZyA9IDE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogaXNjc2lfYnVmX2luaXRfc2coc3RydWN0IGlzY3NpX2J1ZiAqaWJ1Ziwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKIHsKKwlpYnVmLT5zZy5wYWdlID0gc2ctPnBhZ2U7CisJaWJ1Zi0+c2cub2Zmc2V0ID0gc2ctPm9mZnNldDsKKwlpYnVmLT5zZy5sZW5ndGggPSBzZy0+bGVuZ3RoOwogCS8qCiAJICogRmFzdHBhdGg6IHNnIGVsZW1lbnQgZml0cyBpbnRvIHNpbmdsZSBwYWdlCiAJICovCi0JaWYgKHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0IDw9IFBBR0VfU0laRSAmJiBwYWdlX2NvdW50KHNnLT5wYWdlKSA+PSAyKSB7Ci0JCWlidWYtPnNnLnBhZ2UgPSBzZy0+cGFnZTsKLQkJaWJ1Zi0+c2cub2Zmc2V0ID0gc2ctPm9mZnNldDsKLQkJaWJ1Zi0+c2cubGVuZ3RoID0gc2ctPmxlbmd0aDsKLQl9IGVsc2UKLQkJaXNjc2lfYnVmX2luaXRfaW92KGlidWYsIHBhZ2VfYWRkcmVzcyhzZy0+cGFnZSksIHNnLT5sZW5ndGgpOworCWlmIChzZy0+bGVuZ3RoICsgc2ctPm9mZnNldCA8PSBQQUdFX1NJWkUgJiYgIVBhZ2VTbGFiKHNnLT5wYWdlKSkKKwkJaWJ1Zi0+dXNlX3NlbmRtc2cgPSAwOworCWVsc2UKKwkJaWJ1Zi0+dXNlX3NlbmRtc2cgPSAxOwogCWlidWYtPnNlbnQgPSAwOwogfQogCkBAIC0zNTYsNyArMzU0LDcgQEAKIAkJc3RydWN0IHNjc2lfY21uZCAqc2MgPSBjdGFzay0+c2M7CiAKIAkJY29ubi0+ZXhwX3N0YXRzbiA9IGJlMzJfdG9fY3B1KHJoZHItPnN0YXRzbikgKyAxOwotCQlpZiAocmhkci0+ZmxhZ3MgJiBJU0NTSV9GTEFHX0NNRF9VTkRFUkZMT1cpIHsKKwkJaWYgKHJoZHItPmZsYWdzICYgSVNDU0lfRkxBR19EQVRBX1VOREVSRkxPVykgewogCQkJaW50IHJlc19jb3VudCA9IGJlMzJfdG9fY3B1KHJoZHItPnJlc2lkdWFsX2NvdW50KTsKIAogCQkJaWYgKHJlc19jb3VudCA+IDAgJiYKQEAgLTM2Niw5ICszNjQsNyBAQAogCQkJfSBlbHNlCiAJCQkJc2MtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNikgfAogCQkJCQlyaGRyLT5jbWRfc3RhdHVzOwotCQl9IGVsc2UgaWYgKHJoZHItPmZsYWdzICYgSVNDU0lfRkxBR19DTURfQklESV9VTkRFUkZMT1cpCi0JCQlzYy0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KSB8IHJoZHItPmNtZF9zdGF0dXM7Ci0JCWVsc2UgaWYgKHJoZHItPmZsYWdzICYgSVNDU0lfRkxBR19DTURfT1ZFUkZMT1cpIHsKKwkJfSBlbHNlIGlmIChyaGRyLT5mbGFncyAmIElTQ1NJX0ZMQUdfREFUQV9PVkVSRkxPVykgewogCQkJc2MtPnJlc2lkID0gYmUzMl90b19jcHUocmhkci0+cmVzaWR1YWxfY291bnQpOwogCQkJc2MtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgcmhkci0+Y21kX3N0YXR1czsKIAkJfSBlbHNlCkBAIC01MjksNyArNTI1LDcgQEAKIAlfX2tmaWZvX3B1dChjdGFzay0+cjJ0cXVldWUsICh2b2lkKikmcjJ0LCBzaXplb2Yodm9pZCopKTsKIAlfX2tmaWZvX3B1dChjb25uLT53cml0ZXF1ZXVlLCAodm9pZCopJmN0YXNrLCBzaXplb2Yodm9pZCopKTsKIAotCXNjaGVkdWxlX3dvcmsoJmNvbm4tPnhtaXR3b3JrKTsKKwlzY3NpX3F1ZXVlX3dvcmsoc2Vzc2lvbi0+aG9zdCwgJmNvbm4tPnhtaXR3b3JrKTsKIAljb25uLT5yMnRfcGR1c19jbnQrKzsKIAlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CiAKQEAgLTY4Niw3ICs2ODIsNyBAQAogCQlzd2l0Y2goY29ubi0+aW4ub3Bjb2RlKSB7CiAJCWNhc2UgSVNDU0lfT1BfTE9HSU5fUlNQOgogCQljYXNlIElTQ1NJX09QX1RFWFRfUlNQOgotCQljYXNlIElTQ1NJX09QX0xPR09VVF9SU1A6IAorCQljYXNlIElTQ1NJX09QX0xPR09VVF9SU1A6CiAJCQlyYyA9IGlzY3NpX2NoZWNrX2Fzc2lnbl9jbWRzbihzZXNzaW9uLAogCQkJCQkJIChzdHJ1Y3QgaXNjc2lfbm9waW4qKWhkcik7CiAJCQlpZiAocmMpCkBAIC03MjcsMTIgKzcyMywxMiBAQAogCQkJfQogCQkJc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOwogCQkJYnJlYWs7Ci0JCWNhc2UgSVNDU0lfT1BfTk9PUF9JTjogCisJCWNhc2UgSVNDU0lfT1BfTk9PUF9JTjoKIAkJCWlmIChoZHItPnR0dCAhPSBJU0NTSV9SRVNFUlZFRF9UQUcpIHsKIAkJCQlyYyA9IElTQ1NJX0VSUl9QUk9UTzsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXJjID0gaXNjc2lfY2hlY2tfYXNzaWduX2NtZHNuKHNlc3Npb24sIAorCQkJcmMgPSBpc2NzaV9jaGVja19hc3NpZ25fY21kc24oc2Vzc2lvbiwKIAkJCQkJCShzdHJ1Y3QgaXNjc2lfbm9waW4qKWhkcik7CiAJCQlpZiAocmMpCiAJCQkJYnJlYWs7CkBAIC03NjcsNyArNzYzLDcgQEAKIAkJCQlpZiAoIXJjICYmIGhkci0+dHR0ICE9IElTQ1NJX1JFU0VSVkVEX1RBRykKIAkJCQkJcmMgPSBpc2NzaV9yZWN2X3BkdShpc2NzaV9oYW5kbGUoY29ubiksCiAJCQkJCQkJICAgIGhkciwgTlVMTCwgMCk7Ci0JCQl9IGVsc2UgCisJCQl9IGVsc2UKIAkJCQlyYyA9IElTQ1NJX0VSUl9QUk9UTzsKIAkJCWJyZWFrOwogCQljYXNlIElTQ1NJX09QX1JFSkVDVDoKQEAgLTkyOSw3ICs5MjUsNyBAQAogCQkJCSAgICAgIHNjLT5yZXF1ZXN0X2J1ZmZsZW4sIGN0YXNrLT5kYXRhX29mZnNldCk7CiAJCWlmIChyYyA9PSAtRUFHQUlOKQogCQkJcmV0dXJuIHJjOwotCQlpZiAoY29ubi0+ZGF0YWRnc3RfZW4pIAorCQlpZiAoY29ubi0+ZGF0YWRnc3RfZW4pCiAJCQlpc2NzaV9yZWN2X2RpZ2VzdF91cGRhdGUoY29ubiwgc2MtPnJlcXVlc3RfYnVmZmVyLCBpKTsKIAkJcmMgPSAwOwogCQlnb3RvIGRvbmU7CkBAIC0xMDI0LDcgKzEwMjAsNyBAQAogCQljb25uLT5pbi5oZHIgPSAmY29ubi0+aGRyOwogCQljb25uLT5zZW5zZWxlbiA9IChjb25uLT5kYXRhWzBdIDw8IDgpIHwgY29ubi0+ZGF0YVsxXTsKIAkJcmMgPSBpc2NzaV9jbWRfcnNwKGNvbm4sIGNvbm4tPmluLmN0YXNrKTsKLQkJaWYgKCFyYyAmJiBjb25uLT5kYXRhZGdzdF9lbikgCisJCWlmICghcmMgJiYgY29ubi0+ZGF0YWRnc3RfZW4pCiAJCQlpc2NzaV9yZWN2X2RpZ2VzdF91cGRhdGUoY29ubiwgY29ubi0+ZGF0YSwKIAkJCQkJCSBjb25uLT5pbi5kYXRhbGVuKTsKIAl9CkBAIC0xMDUxLDcgKzEwNDcsNyBAQAogCQlyYyA9IGlzY3NpX3JlY3ZfcGR1KGlzY3NpX2hhbmRsZShjb25uKSwgY29ubi0+aW4uaGRyLAogCQkJCSAgICBjb25uLT5kYXRhLCBjb25uLT5pbi5kYXRhbGVuKTsKIAotCQlpZiAoIXJjICYmIGNvbm4tPmRhdGFkZ3N0X2VuICYmIAorCQlpZiAoIXJjICYmIGNvbm4tPmRhdGFkZ3N0X2VuICYmCiAJCQljb25uLT5pbi5vcGNvZGUgIT0gSVNDU0lfT1BfTE9HSU5fUlNQKQogCQkJaXNjc2lfcmVjdl9kaWdlc3RfdXBkYXRlKGNvbm4sIGNvbm4tPmRhdGEsCiAJCQkgIAkJCWNvbm4tPmluLmRhdGFsZW4pOwpAQCAtMTI3MSw3ICsxMjY3LDcgQEAKIAljb25uLT5vbGRfd3JpdGVfc3BhY2Uoc2spOwogCWRlYnVnX3RjcCgiaXNjc2lfd3JpdGVfc3BhY2U6IGNpZCAlZFxuIiwgY29ubi0+aWQpOwogCWNsZWFyX2JpdChTVVNQRU5EX0JJVCwgJmNvbm4tPnN1c3BlbmRfdHgpOwotCXNjaGVkdWxlX3dvcmsoJmNvbm4tPnhtaXR3b3JrKTsKKwlzY3NpX3F1ZXVlX3dvcmsoY29ubi0+c2Vzc2lvbi0+aG9zdCwgJmNvbm4tPnhtaXR3b3JrKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEzMTIsMzUgKzEzMDgsMjUgQEAKICAqIEBidWY6IGJ1ZmZlciB0byB3cml0ZSBmcm9tCiAgKiBAc2l6ZTogYWN0dWFsIHNpemUgdG8gd3JpdGUKICAqIEBmbGFnczogc29ja2V0J3MgZmxhZ3MKLSAqCi0gKiBOb3RlczoKLSAqCWRlcGVuZGluZyBvbiBidWZmZXIgd2lsbCB1c2UgdGNwX3NlbmRwYWdlKCkgb3IgdGNwX3NlbmRtc2coKS4KLSAqCWJ1Zi0+c2cub2Zmc2V0ID09IC0xIHRlbGxzIHVzIHRoYXQgYnVmZmVyIGlzIG5vbiBTL0cgYW5kIGZvcmNlcwotICoJdG8gdXNlIHRjcF9zZW5kbXNnKCkuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50Ci1pc2NzaV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNrLCBzdHJ1Y3QgaXNjc2lfYnVmICpidWYsIGludCBzaXplLCBpbnQgZmxhZ3MpCitpc2NzaV9zZW5kKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfYnVmICpidWYsIGludCBzaXplLCBpbnQgZmxhZ3MpCiB7Ci0JaW50IHJlczsKKwlzdHJ1Y3Qgc29ja2V0ICpzayA9IGNvbm4tPnNvY2s7CisJaW50IG9mZnNldCA9IGJ1Zi0+c2cub2Zmc2V0ICsgYnVmLT5zZW50OwogCi0JaWYgKChpbnQpYnVmLT5zZy5vZmZzZXQgPj0gMCkgewotCQlpbnQgb2Zmc2V0ID0gYnVmLT5zZy5vZmZzZXQgKyBidWYtPnNlbnQ7Ci0KLQkJLyogdGNwX3NlbmRwYWdlICovCi0JCXJlcyA9IHNrLT5vcHMtPnNlbmRwYWdlKHNrLCBidWYtPnNnLnBhZ2UsIG9mZnNldCwgc2l6ZSwgZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBtc2doZHIgbXNnOwotCi0JCWJ1Zi0+aW92Lmlvdl9iYXNlID0gaXNjc2lfYnVmX2lvdl9iYXNlKGJ1Zik7Ci0JCWJ1Zi0+aW92Lmlvdl9sZW4gPSBzaXplOwotCi0JCW1lbXNldCgmbXNnLCAwLCBzaXplb2Yoc3RydWN0IG1zZ2hkcikpOwotCi0JCS8qIHRjcF9zZW5kbXNnICovCi0JCXJlcyA9IGtlcm5lbF9zZW5kbXNnKHNrLCAmbXNnLCAmYnVmLT5pb3YsIDEsIHNpemUpOwotCX0KLQotCXJldHVybiByZXM7CisJLyoKKwkgKiBpZiB3ZSBnb3QgdXNlX3NnPTAgb3IgYXJlIHNlbmRpbmcgc29tZXRoaW5nIHdlIGttYWxsb2NkCisJICogdGhlbiB3ZSBkaWQgbm90IGhhdmUgdG8gZG8ga21hcCAoa21hcCByZXR1cm5zIHBhZ2VfYWRkcmVzcykKKwkgKgorCSAqIGlmIHdlIGdvdCB1c2Vfc2cgPiAwLCBidXQgaGFkIHRvIGRyb3AgZG93biwgd2UgZG8gbm90CisJICogc2V0IGNsdXN0ZXJpbmcgc28gdGhpcyBzaG91bGQgb25seSBoYXBwZW4gZm9yIHRoYXQKKwkgKiBzbGFiIGNhc2UuCisJICovCisJaWYgKGJ1Zi0+dXNlX3NlbmRtc2cpCisJCXJldHVybiBzb2NrX25vX3NlbmRwYWdlKHNrLCBidWYtPnNnLnBhZ2UsIG9mZnNldCwgc2l6ZSwgZmxhZ3MpOworCWVsc2UKKwkJcmV0dXJuIGNvbm4tPnNlbmRwYWdlKHNrLCBidWYtPnNnLnBhZ2UsIG9mZnNldCwgc2l6ZSwgZmxhZ3MpOwogfQogCiAvKioKQEAgLTEzNTUsNyArMTM0MSw2IEBACiBzdGF0aWMgaW5saW5lIGludAogaXNjc2lfc2VuZGhkcihzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX2J1ZiAqYnVmLCBpbnQgZGF0YWxlbikKIHsKLQlzdHJ1Y3Qgc29ja2V0ICpzayA9IGNvbm4tPnNvY2s7CiAJaW50IGZsYWdzID0gMDsgLyogTVNHX0RPTlRXQUlUOyAqLwogCWludCByZXMsIHNpemU7CiAKQEAgLTEzNjQsNyArMTM0OSw3IEBACiAJaWYgKGJ1Zi0+c2VudCArIHNpemUgIT0gYnVmLT5zZy5sZW5ndGggfHwgZGF0YWxlbikKIAkJZmxhZ3MgfD0gTVNHX01PUkU7CiAKLQlyZXMgPSBpc2NzaV9zZW5kKHNrLCBidWYsIHNpemUsIGZsYWdzKTsKKwlyZXMgPSBpc2NzaV9zZW5kKGNvbm4sIGJ1Ziwgc2l6ZSwgZmxhZ3MpOwogCWRlYnVnX3RjcCgic2VuZGhkciAlZCBieXRlcywgc2VudCAlZCByZXMgJWRcbiIsIHNpemUsIGJ1Zi0+c2VudCwgcmVzKTsKIAlpZiAocmVzID49IDApIHsKIAkJY29ubi0+dHhkYXRhX29jdGV0cyArPSByZXM7CkBAIC0xMzk1LDcgKzEzODAsNiBAQAogaXNjc2lfc2VuZHBhZ2Uoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHN0cnVjdCBpc2NzaV9idWYgKmJ1ZiwKIAkgICAgICAgaW50ICpjb3VudCwgaW50ICpzZW50KQogewotCXN0cnVjdCBzb2NrZXQgKnNrID0gY29ubi0+c29jazsKIAlpbnQgZmxhZ3MgPSAwOyAvKiBNU0dfRE9OVFdBSVQ7ICovCiAJaW50IHJlcywgc2l6ZTsKIApAQCAtMTQwNiw3ICsxMzkwLDcgQEAKIAlpZiAoYnVmLT5zZW50ICsgc2l6ZSAhPSBidWYtPnNnLmxlbmd0aCB8fCAqY291bnQgIT0gc2l6ZSkKIAkJZmxhZ3MgfD0gTVNHX01PUkU7CiAKLQlyZXMgPSBpc2NzaV9zZW5kKHNrLCBidWYsIHNpemUsIGZsYWdzKTsKKwlyZXMgPSBpc2NzaV9zZW5kKGNvbm4sIGJ1Ziwgc2l6ZSwgZmxhZ3MpOwogCWRlYnVnX3RjcCgic2VuZHBhZ2U6ICVkIGJ5dGVzLCBzZW50ICVkIGxlZnQgJWQgc2VudCAlZCByZXMgJWRcbiIsCiAJCSAgc2l6ZSwgYnVmLT5zZW50LCAqY291bnQsICpzZW50LCByZXMpOwogCWlmIChyZXMgPj0gMCkgewpAQCAtMTQzNCwyMCArMTQxOCw3IEBACiAJY3Rhc2stPmRpZ2VzdF9jb3VudCA9IDQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotaXNjc2lfYnVmX2RhdGFfZGlnZXN0X3VwZGF0ZShzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX2J1ZiAqYnVmKQotewotCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKLQotCWlmIChidWYtPnNnLm9mZnNldCAhPSAtMSkKLQkJY3J5cHRvX2RpZ2VzdF91cGRhdGUoY29ubi0+ZGF0YV90eF90Zm0sICZidWYtPnNnLCAxKTsKLQllbHNlIHsKLQkJc2dfaW5pdF9vbmUoJnNnLCAoY2hhciAqKWJ1Zi0+c2cucGFnZSwgYnVmLT5zZy5sZW5ndGgpOwotCQljcnlwdG9fZGlnZXN0X3VwZGF0ZShjb25uLT5kYXRhX3R4X3RmbSwgJnNnLCAxKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBpc2NzaV9kaWdlc3RfZmluYWxfc2VuZChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX2NtZF90YXNrICpjdGFzaywKIAkJCXN0cnVjdCBpc2NzaV9idWYgKmJ1ZiwgdWludDMyX3QgKmRpZ2VzdCwgaW50IGZpbmFsKQogewpAQCAtMTY4MCw3ICsxNjUxLDcgQEAKIAkJemVyb19kYXRhKGN0YXNrLT5oZHIuZGxlbmd0aCk7CiAJfQogCi0JaXNjc2lfYnVmX2luaXRfdmlydCgmY3Rhc2stPmhlYWRidWYsIChjaGFyKikmY3Rhc2stPmhkciwgCisJaXNjc2lfYnVmX2luaXRfdmlydCgmY3Rhc2stPmhlYWRidWYsIChjaGFyKikmY3Rhc2stPmhkciwKIAkJCSAgICBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpOwogCWNvbm4tPnNjc2ljbWRfcGR1c19jbnQrKzsKIH0KQEAgLTE3NDYsNyArMTcxNyw3IEBACiBoYW5kbGVfeG1zdGF0ZV9yX2hkcihzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX2NtZF90YXNrICpjdGFzaykKIHsKIAljdGFzay0+eG1zdGF0ZSAmPSB+WE1TVEFURV9SX0hEUjsKLQlpZiAoY29ubi0+aGRyZGdzdF9lbikgCisJaWYgKGNvbm4tPmhkcmRnc3RfZW4pCiAJCWlzY3NpX2hkcl9kaWdlc3QoY29ubiwgJmN0YXNrLT5oZWFkYnVmLCAodTgqKWN0YXNrLT5oZHJleHQpOwogCWlmICghaXNjc2lfc2VuZGhkcihjb25uLCAmY3Rhc2stPmhlYWRidWYsIDApKSB7CiAJCUJVR19PTihjdGFzay0+eG1zdGF0ZSAhPSBYTVNUQVRFX0lETEUpOwpAQCAtMTc2MCw3ICsxNzMxLDcgQEAKIGhhbmRsZV94bXN0YXRlX3dfaGRyKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfY21kX3Rhc2sgKmN0YXNrKQogewogCWN0YXNrLT54bXN0YXRlICY9IH5YTVNUQVRFX1dfSERSOwotCWlmIChjb25uLT5oZHJkZ3N0X2VuKSAKKwlpZiAoY29ubi0+aGRyZGdzdF9lbikKIAkJaXNjc2lfaGRyX2RpZ2VzdChjb25uLCAmY3Rhc2stPmhlYWRidWYsICh1OCopY3Rhc2stPmhkcmV4dCk7CiAJaWYgKGlzY3NpX3NlbmRoZHIoY29ubiwgJmN0YXNrLT5oZWFkYnVmLCBjdGFzay0+aW1tX2NvdW50KSkgewogCQljdGFzay0+eG1zdGF0ZSB8PSBYTVNUQVRFX1dfSERSOwpAQCAtMTgwOSw3ICsxNzgwLDggQEAKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CiAJCWlmIChjb25uLT5kYXRhZGdzdF9lbikKLQkJCWlzY3NpX2J1Zl9kYXRhX2RpZ2VzdF91cGRhdGUoY29ubiwgJmN0YXNrLT5zZW5kYnVmKTsKKwkJCWNyeXB0b19kaWdlc3RfdXBkYXRlKGNvbm4tPmRhdGFfdHhfdGZtLAorCQkJCQkgICAgICZjdGFzay0+c2VuZGJ1Zi5zZywgMSk7CiAKIAkJaWYgKCFjdGFzay0+aW1tX2NvdW50KQogCQkJYnJlYWs7CkBAIC0xODk0LDcgKzE4NjYsOCBAQAogCQkgKiBzbyBwYXNzIGl0CiAJCSAqLwogCQlpZiAoY29ubi0+ZGF0YWRnc3RfZW4gJiYgY3Rhc2stPnNlbnQgLSBzdGFydCA+IDApCi0JCQlpc2NzaV9idWZfZGF0YV9kaWdlc3RfdXBkYXRlKGNvbm4sICZjdGFzay0+c2VuZGJ1Zik7CisJCQljcnlwdG9fZGlnZXN0X3VwZGF0ZShjb25uLT5kYXRhX3R4X3RmbSwKKwkJCQkJICAgICAmY3Rhc2stPnNlbmRidWYuc2csIDEpOwogCiAJCWlmICghY3Rhc2stPmRhdGFfY291bnQpCiAJCQlicmVhazsKQEAgLTE5NzIsNyArMTk0NSw3IEBACiAKIAlCVUdfT04ocjJ0LT5kYXRhX2NvdW50IDwgMCk7CiAJaWYgKGNvbm4tPmRhdGFkZ3N0X2VuKQotCQlpc2NzaV9idWZfZGF0YV9kaWdlc3RfdXBkYXRlKGNvbm4sICZyMnQtPnNlbmRidWYpOworCQljcnlwdG9fZGlnZXN0X3VwZGF0ZShjb25uLT5kYXRhX3R4X3RmbSwgJnIydC0+c2VuZGJ1Zi5zZywgMSk7CiAKIAlpZiAocjJ0LT5kYXRhX2NvdW50KSB7CiAJCUJVR19PTihjdGFzay0+c2MtPnVzZV9zZyA9PSAwKTsKQEAgLTIwNTQsNyArMjAyNyw3IEBACiAJfQogCiAJaWYgKGNvbm4tPmRhdGFkZ3N0X2VuKSB7Ci0JCWlzY3NpX2J1Zl9kYXRhX2RpZ2VzdF91cGRhdGUoY29ubiwgJmN0YXNrLT5zZW5kYnVmKTsKKwkJY3J5cHRvX2RpZ2VzdF91cGRhdGUoY29ubi0+ZGF0YV90eF90Zm0sICZjdGFzay0+c2VuZGJ1Zi5zZywgMSk7CiAJCS8qIGltbSBkYXRhPyAqLwogCQlpZiAoIWR0YXNrKSB7CiAJCQlpZiAoaXNjc2lfZGlnZXN0X2ZpbmFsX3NlbmQoY29ubiwgY3Rhc2ssICZjdGFzay0+aW1tYnVmLApAQCAtMjE0OCw3ICsyMTIxLDcgQEAKIHNvbGljaXRfaGVhZF9hZ2FpbjoKIAkJcjJ0ID0gY3Rhc2stPnIydDsKIAkJaWYgKGNvbm4tPmhkcmRnc3RfZW4pCi0JCQlpc2NzaV9oZHJfZGlnZXN0KGNvbm4sICZyMnQtPmhlYWRidWYsIAorCQkJaXNjc2lfaGRyX2RpZ2VzdChjb25uLCAmcjJ0LT5oZWFkYnVmLAogCQkJCQkodTgqKXIydC0+ZHRhc2stPmhkcmV4dCk7CiAJCWlmIChpc2NzaV9zZW5kaGRyKGNvbm4sICZyMnQtPmhlYWRidWYsIHIydC0+ZGF0YV9jb3VudCkpIHsKIAkJCWN0YXNrLT54bXN0YXRlICY9IH5YTVNUQVRFX1NPTF9EQVRBOwpAQCAtMjMwMCwxMCArMjI3MywxMCBAQAogCS8qCiAJICogc2VyaWFsaXplIFhtaXQgd29ya2VyIG9uIGEgcGVyLWNvbm5lY3Rpb24gYmFzaXMuCiAJICovCi0JZG93bigmY29ubi0+eG1pdHNlbWEpOworCW11dGV4X2xvY2soJmNvbm4tPnhtaXRtdXRleCk7CiAJaWYgKGlzY3NpX2RhdGFfeG1pdChjb25uKSkKLQkJc2NoZWR1bGVfd29yaygmY29ubi0+eG1pdHdvcmspOwotCXVwKCZjb25uLT54bWl0c2VtYSk7CisJCXNjc2lfcXVldWVfd29yayhjb25uLT5zZXNzaW9uLT5ob3N0LCAmY29ubi0+eG1pdHdvcmspOworCW11dGV4X3VubG9jaygmY29ubi0+eG1pdG11dGV4KTsKIH0KIAogI2RlZmluZSBGQUlMVVJFX0JBRF9IT1NUCQkxCkBAIC0yMzY3LDE1ICsyMzQwLDcgQEAKIAkJc2Vzc2lvbi0+Y21kc24sIHNlc3Npb24tPm1heF9jbWRzbiAtIHNlc3Npb24tPmV4cF9jbWRzbiArIDEpOwogCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKIAotICAgICAgICBpZiAoIWluX2ludGVycnVwdCgpICYmICFkb3duX3RyeWxvY2soJmNvbm4tPnhtaXRzZW1hKSkgewotCQlzcGluX3VubG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKLQkJaWYgKGlzY3NpX2RhdGFfeG1pdChjb25uKSkKLQkJCXNjaGVkdWxlX3dvcmsoJmNvbm4tPnhtaXR3b3JrKTsKLQkJdXAoJmNvbm4tPnhtaXRzZW1hKTsKLQkJc3Bpbl9sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOwotCX0gZWxzZQotCQlzY2hlZHVsZV93b3JrKCZjb25uLT54bWl0d29yayk7Ci0KKwlzY3NpX3F1ZXVlX3dvcmsoaG9zdCwgJmNvbm4tPnhtaXR3b3JrKTsKIAlyZXR1cm4gMDsKIAogcmVqZWN0OgpAQCAtMjQ2MiwxNyArMjQyNywyMCBAQAogCWtmcmVlKGl0ZW1zKTsKIH0KIAotc3RhdGljIGlzY3NpX2Nvbm5oX3QKLWlzY3NpX2Nvbm5fY3JlYXRlKGlzY3NpX3Nlc3Npb25oX3Qgc2Vzc2lvbmgsIHVpbnQzMl90IGNvbm5faWR4KQorc3RhdGljIHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqCitpc2NzaV9jb25uX2NyZWF0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdWludDMyX3QgY29ubl9pZHgpCiB7Ci0Jc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBpc2NzaV9wdHIoc2Vzc2lvbmgpOwotCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gTlVMTDsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGlzY3NpX2hvc3RkYXRhKHNob3N0LT5ob3N0ZGF0YSk7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47CisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubjsKIAotCWNvbm4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXNjc2lfY29ubiksIEdGUF9LRVJORUwpOwotCWlmIChjb25uID09IE5VTEwpCi0JCWdvdG8gY29ubl9hbGxvY19mYWlsOworCWNsc19jb25uID0gaXNjc2lfY3JlYXRlX2Nvbm4oaG9zdGRhdGFfc2Vzc2lvbihzaG9zdC0+aG9zdGRhdGEpLAorCQkJCSAgICAgY29ubl9pZHgpOworCWlmICghY2xzX2Nvbm4pCisJCXJldHVybiBOVUxMOworCWNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKKwogCW1lbXNldChjb25uLCAwLCBzaXplb2Yoc3RydWN0IGlzY3NpX2Nvbm4pKTsKLQogCWNvbm4tPmNfc3RhZ2UgPSBJU0NTSV9DT05OX0lOSVRJQUxfU1RBR0U7CiAJY29ubi0+aW5fcHJvZ3Jlc3MgPSBJTl9QUk9HUkVTU19XQUlUX0hFQURFUjsKIAljb25uLT5pZCA9IGNvbm5faWR4OwpAQCAtMjUzMSwxMCArMjQ5OSwxMCBAQAogCQlnb3RvIG1heF9yZWN2X2RsZW5naHRfYWxsb2NfZmFpbDsKIAogCWluaXRfdGltZXIoJmNvbm4tPnRtYWJvcnRfdGltZXIpOwotCWluaXRfTVVURVgoJmNvbm4tPnhtaXRzZW1hKTsKKwltdXRleF9pbml0KCZjb25uLT54bWl0bXV0ZXgpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbm4tPmVod2FpdCk7CiAKLQlyZXR1cm4gaXNjc2lfaGFuZGxlKGNvbm4pOworCXJldHVybiBjbHNfY29ubjsKIAogbWF4X3JlY3ZfZGxlbmdodF9hbGxvY19mYWlsOgogCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CkBAIC0yNTUwLDE4ICsyNTE4LDE4IEBACiB3cml0ZXF1ZXVlX2FsbG9jX2ZhaWw6CiAJa2ZpZm9fZnJlZShjb25uLT54bWl0cXVldWUpOwogeG1pdHF1ZXVlX2FsbG9jX2ZhaWw6Ci0Ja2ZyZWUoY29ubik7Ci1jb25uX2FsbG9jX2ZhaWw6Ci0JcmV0dXJuIGlzY3NpX2hhbmRsZShOVUxMKTsKKwlpc2NzaV9kZXN0cm95X2Nvbm4oY2xzX2Nvbm4pOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAotaXNjc2lfY29ubl9kZXN0cm95KGlzY3NpX2Nvbm5oX3QgY29ubmgpCitpc2NzaV9jb25uX2Rlc3Ryb3koc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubikKIHsKLQlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGlzY3NpX3B0cihjb25uaCk7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRvd24oJmNvbm4tPnhtaXRzZW1hKTsKKwltdXRleF9sb2NrKCZjb25uLT54bWl0bXV0ZXgpOwogCXNldF9iaXQoU1VTUEVORF9CSVQsICZjb25uLT5zdXNwZW5kX3R4KTsKIAlpZiAoY29ubi0+Y19zdGFnZSA9PSBJU0NTSV9DT05OX0lOSVRJQUxfU1RBR0UgJiYgY29ubi0+c29jaykgewogCQlzdHJ1Y3Qgc29jayAqc2sgPSBjb25uLT5zb2NrLT5zazsKQEAgLTI1OTIsMTkgKzI1NjAsMTkgQEAKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCi0JdXAoJmNvbm4tPnhtaXRzZW1hKTsKKwltdXRleF91bmxvY2soJmNvbm4tPnhtaXRtdXRleCk7CiAKIAkvKgogCSAqIEJsb2NrIHVudGlsIGFsbCBpbi1wcm9ncmVzcyBjb21tYW5kcyBmb3IgdGhpcyBjb25uZWN0aW9uCiAJICogdGltZSBvdXQgb3IgZmFpbC4KIAkgKi8KIAlmb3IgKDs7KSB7Ci0JCXNwaW5fbG9ja19iaCgmY29ubi0+bG9jayk7CisJCXNwaW5fbG9ja19pcnFzYXZlKHNlc3Npb24tPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCQlpZiAoIXNlc3Npb24tPmhvc3QtPmhvc3RfYnVzeSkgeyAvKiBPSyBmb3IgRVJMID09IDAgKi8KLQkJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2Vzc2lvbi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKIAkJfQotCQlzcGluX3VubG9ja19iaCgmY29ubi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2Vzc2lvbi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDUwMCk7CiAJCXByaW50aygiY29ubl9kZXN0cm95KCk6IGhvc3RfYnVzeSAlZCBob3N0X2ZhaWxlZCAlZFxuIiwKIAkJCXNlc3Npb24tPmhvc3QtPmhvc3RfYnVzeSwgc2Vzc2lvbi0+aG9zdC0+aG9zdF9mYWlsZWQpOwpAQCAtMjY1Miw3ICsyNjIwLDggQEAKIAlrZmlmb19mcmVlKGNvbm4tPndyaXRlcXVldWUpOwogCWtmaWZvX2ZyZWUoY29ubi0+aW1tcXVldWUpOwogCWtmaWZvX2ZyZWUoY29ubi0+bWdtdHF1ZXVlKTsKLQlrZnJlZShjb25uKTsKKworCWlzY3NpX2Rlc3Ryb3lfY29ubihjbHNfY29ubik7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTI3MTMsNiArMjY4Miw4IEBACiAJCSAqLwogCQlpc2NzaV9jb25uX3NldF9jYWxsYmFja3MoY29ubik7CiAKKwkJY29ubi0+c2VuZHBhZ2UgPSBjb25uLT5zb2NrLT5vcHMtPnNlbmRwYWdlOworCiAJCS8qCiAJCSAqIHNldCByZWNlaXZlIHN0YXRlIG1hY2hpbmUgaW50byBpbml0aWFsIHN0YXRlCiAJCSAqLwpAQCAtMjc5Niw3ICsyNzY3LDcgQEAKIAlzZXRfYml0KFNVU1BFTkRfQklULCAmY29ubi0+c3VzcGVuZF9yeCk7CiAJd3JpdGVfdW5sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CiAKLQlkb3duKCZjb25uLT54bWl0c2VtYSk7CisJbXV0ZXhfbG9jaygmY29ubi0+eG1pdG11dGV4KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKHNlc3Npb24tPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CkBAIC0yODc4LDcgKzI4NDksNyBAQAogCQkJY29ubi0+ZGF0YWRnc3RfZW4gPSAwOwogCQl9CiAJfQotCXVwKCZjb25uLT54bWl0c2VtYSk7CisJbXV0ZXhfdW5sb2NrKCZjb25uLT54bWl0bXV0ZXgpOwogfQogCiBzdGF0aWMgaW50CkBAIC0yOTYzLDggKzI5MzQsNyBAQAogCWVsc2UKIAkgICAgICAgIF9fa2ZpZm9fcHV0KGNvbm4tPm1nbXRxdWV1ZSwgKHZvaWQqKSZtdGFzaywgc2l6ZW9mKHZvaWQqKSk7CiAKLQlzY2hlZHVsZV93b3JrKCZjb25uLT54bWl0d29yayk7Ci0KKwlzY3NpX3F1ZXVlX3dvcmsoc2Vzc2lvbi0+aG9zdCwgJmNvbm4tPnhtaXR3b3JrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzAyOSwxMiArMjk5OSwxMiBAQAogCSAqIDEpIGNvbm5lY3Rpb24tbGV2ZWwgZmFpbHVyZTsKIAkgKiAyKSByZWNvdmVyeSBkdWUgcHJvdG9jb2wgZXJyb3I7CiAJICovCi0JZG93bigmY29ubi0+eG1pdHNlbWEpOworCW11dGV4X2xvY2soJmNvbm4tPnhtaXRtdXRleCk7CiAJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKIAlpZiAoc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKSB7CiAJCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9URVJNSU5BVEUpIHsKIAkJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKLQkJCXVwKCZjb25uLT54bWl0c2VtYSk7CisJCQltdXRleF91bmxvY2soJmNvbm4tPnhtaXRtdXRleCk7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQogCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CkBAIC0zMDUyLDcgKzMwMjIsNyBAQAogCQkJICogMikgc2Vzc2lvbiB3YXMgcmUtb3BlbiBkdXJpbmcgdGltZSBvdXQgb2YgY3Rhc2suCiAJCQkgKi8KIAkJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKLQkJCXVwKCZjb25uLT54bWl0c2VtYSk7CisJCQltdXRleF91bmxvY2soJmNvbm4tPnhtaXRtdXRleCk7CiAJCQlnb3RvIHN1Y2Nlc3M7CiAJCX0KIAkJY29ubi0+dG1hYm9ydF9zdGF0ZSA9IFRNQUJPUlRfSU5JVElBTDsKQEAgLTMxMDcsNyArMzA3Nyw3IEBACiAJCQkJICAgIGNvbm4tPnRtYWJvcnRfc3RhdGUgPT0gVE1BQk9SVF9TVUNDRVNTKSB7CiAJCQkJCWNvbm4tPnRtYWJvcnRfc3RhdGUgPSBUTUFCT1JUX0lOSVRJQUw7CiAJCQkJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKLQkJCQkJdXAoJmNvbm4tPnhtaXRzZW1hKTsKKwkJCQkJbXV0ZXhfdW5sb2NrKCZjb25uLT54bWl0bXV0ZXgpOwogCQkJCQlnb3RvIHN1Y2Nlc3M7CiAJCQkJfQogCQkJCWNvbm4tPnRtYWJvcnRfc3RhdGUgPSBUTUFCT1JUX0lOSVRJQUw7CkBAIC0zMTE2LDcgKzMwODYsNyBAQAogCQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCQl9CiAJfQotCXVwKCZjb25uLT54bWl0c2VtYSk7CisJbXV0ZXhfdW5sb2NrKCZjb25uLT54bWl0bXV0ZXgpOwogCiAKIAkvKgpAQCAtMzE4Miw3ICszMTUyLDcgQEAKIGV4aXQ6CiAJZGVsX3RpbWVyX3N5bmMoJmNvbm4tPnRtYWJvcnRfdGltZXIpOwogCi0JZG93bigmY29ubi0+eG1pdHNlbWEpOworCW11dGV4X2xvY2soJmNvbm4tPnhtaXRtdXRleCk7CiAJaWYgKGNvbm4tPnNvY2spIHsKIAkJc3RydWN0IHNvY2sgKnNrID0gY29ubi0+c29jay0+c2s7CiAKQEAgLTMxOTAsNyArMzE2MCw3IEBACiAJCWlzY3NpX2N0YXNrX2NsZWFudXAoY29ubiwgY3Rhc2spOwogCQl3cml0ZV91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKIAl9Ci0JdXAoJmNvbm4tPnhtaXRzZW1hKTsKKwltdXRleF91bmxvY2soJmNvbm4tPnhtaXRtdXRleCk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0zMjgxLDE3ICszMjUxLDIzIEBACiAJLnRoaXNfaWQJCT0gLTEsCiB9OwogCi1zdGF0aWMgaXNjc2lfc2Vzc2lvbmhfdAotaXNjc2lfc2Vzc2lvbl9jcmVhdGUodWludDMyX3QgaW5pdGlhbF9jbWRzbiwgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0IGlzY3NpX3RjcF90cmFuc3BvcnQ7CisKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICoKK2lzY3NpX3Nlc3Npb25fY3JlYXRlKHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqc2NzaXQsCisJCSAgICAgdWludDMyX3QgaW5pdGlhbF9jbWRzbikKIHsKLQlpbnQgY21kX2k7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb247CisJaW50IGNtZF9pOwogCi0Jc2Vzc2lvbiA9IGlzY3NpX2hvc3RkYXRhKGhvc3QtPmhvc3RkYXRhKTsKKwlzaG9zdCA9IGlzY3NpX3RyYW5zcG9ydF9jcmVhdGVfc2Vzc2lvbihzY3NpdCwgJmlzY3NpX3RjcF90cmFuc3BvcnQpOworCWlmICghc2hvc3QpCisJCXJldHVybiBOVUxMOyAKKworCXNlc3Npb24gPSBpc2NzaV9ob3N0ZGF0YShzaG9zdC0+aG9zdGRhdGEpOwogCW1lbXNldChzZXNzaW9uLCAwLCBzaXplb2Yoc3RydWN0IGlzY3NpX3Nlc3Npb24pKTsKLQotCXNlc3Npb24tPmhvc3QgPSBob3N0OwotCXNlc3Npb24tPmlkID0gaG9zdC0+aG9zdF9ubzsKKwlzZXNzaW9uLT5ob3N0ID0gc2hvc3Q7CiAJc2Vzc2lvbi0+c3RhdGUgPSBJU0NTSV9TVEFURV9MT0dHRURfSU47CiAJc2Vzc2lvbi0+bWdtdHBvb2xfbWF4ID0gSVNDU0lfTUdNVF9DTURTX01BWDsKIAlzZXNzaW9uLT5jbWRzX21heCA9IElTQ1NJX1hNSVRfQ01EU19NQVg7CkBAIC0zMzM1LDcgKzMzMTEsNyBAQAogCWlmIChpc2NzaV9yMnRwb29sX2FsbG9jKHNlc3Npb24pKQogCQlnb3RvIHIydHBvb2xfYWxsb2NfZmFpbDsKIAotCXJldHVybiBpc2NzaV9oYW5kbGUoc2Vzc2lvbik7CisJcmV0dXJuIHNob3N0OwogCiByMnRwb29sX2FsbG9jX2ZhaWw6CiAJZm9yIChjbWRfaSA9IDA7IGNtZF9pIDwgc2Vzc2lvbi0+bWdtdHBvb2xfbWF4OyBjbWRfaSsrKQpAQCAtMzM0NSwxNSArMzMyMSwxNSBAQAogbWdtdHBvb2xfYWxsb2NfZmFpbDoKIAlpc2NzaV9wb29sX2ZyZWUoJnNlc3Npb24tPmNtZHBvb2wsICh2b2lkKiopc2Vzc2lvbi0+Y21kcyk7CiBjbWRwb29sX2FsbG9jX2ZhaWw6Ci0JcmV0dXJuIGlzY3NpX2hhbmRsZShOVUxMKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQKLWlzY3NpX3Nlc3Npb25fZGVzdHJveShpc2NzaV9zZXNzaW9uaF90IHNlc3Npb25oKQoraXNjc2lfc2Vzc2lvbl9kZXN0cm95KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogeworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gaXNjc2lfaG9zdGRhdGEoc2hvc3QtPmhvc3RkYXRhKTsKIAlpbnQgY21kX2k7CiAJc3RydWN0IGlzY3NpX2RhdGFfdGFzayAqZHRhc2ssICpuOwotCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gaXNjc2lfcHRyKHNlc3Npb25oKTsKIAogCWZvciAoY21kX2kgPSAwOyBjbWRfaSA8IHNlc3Npb24tPmNtZHNfbWF4OyBjbWRfaSsrKSB7CiAJCXN0cnVjdCBpc2NzaV9jbWRfdGFzayAqY3Rhc2sgPSBzZXNzaW9uLT5jbWRzW2NtZF9pXTsKQEAgLTMzNjksNiArMzM0NSw4IEBACiAJaXNjc2lfcjJ0cG9vbF9mcmVlKHNlc3Npb24pOwogCWlzY3NpX3Bvb2xfZnJlZSgmc2Vzc2lvbi0+bWdtdHBvb2wsICh2b2lkKiopc2Vzc2lvbi0+bWdtdF9jbWRzKTsKIAlpc2NzaV9wb29sX2ZyZWUoJnNlc3Npb24tPmNtZHBvb2wsICh2b2lkKiopc2Vzc2lvbi0+Y21kcyk7CisKKwlpc2NzaV90cmFuc3BvcnRfZGVzdHJveV9zZXNzaW9uKHNob3N0KTsKIH0KIAogc3RhdGljIGludApAQCAtMzQ2Nyw2ICszNDQ1LDggQEAKIAkJCWlmIChjb25uLT5kYXRhX3J4X3RmbSkKIAkJCQljcnlwdG9fZnJlZV90Zm0oY29ubi0+ZGF0YV9yeF90Zm0pOwogCQl9CisJCWNvbm4tPnNlbmRwYWdlID0gY29ubi0+ZGF0YWRnc3RfZW4gPworCQkJc29ja19ub19zZW5kcGFnZSA6IGNvbm4tPnNvY2stPm9wcy0+c2VuZHBhZ2U7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfUEFSQU1fSU5JVElBTF9SMlRfRU46CiAJCXNlc3Npb24tPmluaXRpYWxfcjJ0X2VuID0gdmFsdWU7CkBAIC0zNTE1LDI1ICszNDk1LDEyIEBACiB9CiAKIHN0YXRpYyBpbnQKLWlzY3NpX2Nvbm5fZ2V0X3BhcmFtKGlzY3NpX2Nvbm5oX3QgY29ubmgsIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sCi0JCSAgICAgdWludDMyX3QgKnZhbHVlKQoraXNjc2lfc2Vzc2lvbl9nZXRfcGFyYW0oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCQllbnVtIGlzY3NpX3BhcmFtIHBhcmFtLCB1aW50MzJfdCAqdmFsdWUpCiB7Ci0Jc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBpc2NzaV9wdHIoY29ubmgpOwotCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGlzY3NpX2hvc3RkYXRhKHNob3N0LT5ob3N0ZGF0YSk7CiAKIAlzd2l0Y2gocGFyYW0pIHsKLQljYXNlIElTQ1NJX1BBUkFNX01BWF9SRUNWX0RMRU5HVEg6Ci0JCSp2YWx1ZSA9IGNvbm4tPm1heF9yZWN2X2RsZW5ndGg7Ci0JCWJyZWFrOwotCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1hNSVRfRExFTkdUSDoKLQkJKnZhbHVlID0gY29ubi0+bWF4X3htaXRfZGxlbmd0aDsKLQkJYnJlYWs7Ci0JY2FzZSBJU0NTSV9QQVJBTV9IRFJER1NUX0VOOgotCQkqdmFsdWUgPSBjb25uLT5oZHJkZ3N0X2VuOwotCQlicmVhazsKLQljYXNlIElTQ1NJX1BBUkFNX0RBVEFER1NUX0VOOgotCQkqdmFsdWUgPSBjb25uLT5kYXRhZGdzdF9lbjsKLQkJYnJlYWs7CiAJY2FzZSBJU0NTSV9QQVJBTV9JTklUSUFMX1IyVF9FTjoKIAkJKnZhbHVlID0gc2Vzc2lvbi0+aW5pdGlhbF9yMnRfZW47CiAJCWJyZWFrOwpAQCAtMzU3MSw2ICszNTM4LDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK2lzY3NpX2Nvbm5fZ2V0X3BhcmFtKHZvaWQgKmRhdGEsIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sIHVpbnQzMl90ICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGRhdGE7CisKKwlzd2l0Y2gocGFyYW0pIHsKKwljYXNlIElTQ1NJX1BBUkFNX01BWF9SRUNWX0RMRU5HVEg6CisJCSp2YWx1ZSA9IGNvbm4tPm1heF9yZWN2X2RsZW5ndGg7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1hNSVRfRExFTkdUSDoKKwkJKnZhbHVlID0gY29ubi0+bWF4X3htaXRfZGxlbmd0aDsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9IRFJER1NUX0VOOgorCQkqdmFsdWUgPSBjb25uLT5oZHJkZ3N0X2VuOworCQlicmVhazsKKwljYXNlIElTQ1NJX1BBUkFNX0RBVEFER1NUX0VOOgorCQkqdmFsdWUgPSBjb25uLT5kYXRhZGdzdF9lbjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIElTQ1NJX0VSUl9QQVJBTV9OT1RfRk9VTkQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkCiBpc2NzaV9jb25uX2dldF9zdGF0cyhpc2NzaV9jb25uaF90IGNvbm5oLCBzdHJ1Y3QgaXNjc2lfc3RhdHMgKnN0YXRzKQogewpAQCAtMzYwMSw5ICszNTkzLDkgQEAKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGlzY3NpX3B0cihjb25uaCk7CiAJaW50IHJjOwogCi0JZG93bigmY29ubi0+eG1pdHNlbWEpOworCW11dGV4X2xvY2soJmNvbm4tPnhtaXRtdXRleCk7CiAJcmMgPSBpc2NzaV9jb25uX3NlbmRfZ2VuZXJpYyhjb25uLCBoZHIsIGRhdGEsIGRhdGFfc2l6ZSk7Ci0JdXAoJmNvbm4tPnhtaXRzZW1hKTsKKwltdXRleF91bmxvY2soJmNvbm4tPnhtaXRtdXRleCk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0zNjE1LDYgKzM2MDcsNyBAQAogCQkJCSAgfCBDQVBfREFUQURHU1QsCiAJLmhvc3RfdGVtcGxhdGUJCT0gJmlzY3NpX3NodCwKIAkuaG9zdGRhdGFfc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGlzY3NpX3Nlc3Npb24pLAorCS5jb25uZGF0YV9zaXplCQk9IHNpemVvZihzdHJ1Y3QgaXNjc2lfY29ubiksCiAJLm1heF9jb25uCQk9IDEsCiAJLm1heF9jbWRfbGVuCQk9IElTQ1NJX1RDUF9NQVhfQ01EX0xFTiwKIAkuY3JlYXRlX3Nlc3Npb24JCT0gaXNjc2lfc2Vzc2lvbl9jcmVhdGUsCkBAIC0zNjIzLDcgKzM2MTYsOCBAQAogCS5iaW5kX2Nvbm4JCT0gaXNjc2lfY29ubl9iaW5kLAogCS5kZXN0cm95X2Nvbm4JCT0gaXNjc2lfY29ubl9kZXN0cm95LAogCS5zZXRfcGFyYW0JCT0gaXNjc2lfY29ubl9zZXRfcGFyYW0sCi0JLmdldF9wYXJhbQkJPSBpc2NzaV9jb25uX2dldF9wYXJhbSwKKwkuZ2V0X2Nvbm5fcGFyYW0JCT0gaXNjc2lfY29ubl9nZXRfcGFyYW0sCisJLmdldF9zZXNzaW9uX3BhcmFtCT0gaXNjc2lfc2Vzc2lvbl9nZXRfcGFyYW0sCiAJLnN0YXJ0X2Nvbm4JCT0gaXNjc2lfY29ubl9zdGFydCwKIAkuc3RvcF9jb25uCQk9IGlzY3NpX2Nvbm5fc3RvcCwKIAkuc2VuZF9wZHUJCT0gaXNjc2lfY29ubl9zZW5kX3BkdSwKQEAgLTM2MzMsOCArMzYyNyw2IEBACiBzdGF0aWMgaW50IF9faW5pdAogaXNjc2lfdGNwX2luaXQodm9pZCkKIHsKLQlpbnQgZXJyb3I7Ci0KIAlpZiAoaXNjc2lfbWF4X2x1biA8IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIG1heF9sdW4gdmFsdWUgb2YgJXVcbiIsIGlzY3NpX21heF9sdW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM2NDcsMTEgKzM2MzksMTAgQEAKIAlpZiAoIXRhc2tjYWNoZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQllcnJvciA9IGlzY3NpX3JlZ2lzdGVyX3RyYW5zcG9ydCgmaXNjc2lfdGNwX3RyYW5zcG9ydCk7Ci0JaWYgKGVycm9yKQorCWlmICghaXNjc2lfcmVnaXN0ZXJfdHJhbnNwb3J0KCZpc2NzaV90Y3BfdHJhbnNwb3J0KSkKIAkJa21lbV9jYWNoZV9kZXN0cm95KHRhc2tjYWNoZSk7CiAKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5oIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5oCmluZGV4IDg1NWYyZGYuLmY5NWU2MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuaAorKysgYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmgKQEAgLTE1OCw3ICsxNTgsNyBAQAogCXN0cnVjdCBrZmlmbwkJKm1nbXRxdWV1ZTsJLyogbWdtdCAoY29udHJvbCkgeG1pdCBxdWV1ZSAqLwogCXN0cnVjdCBrZmlmbwkJKnhtaXRxdWV1ZTsJLyogZGF0YS1wYXRoIGNtZCBxdWV1ZSAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdAl4bWl0d29yazsJLyogcGVyLWNvbm4uIHhtaXQgd29ya3F1ZXVlICovCi0Jc3RydWN0IHNlbWFwaG9yZQl4bWl0c2VtYTsJLyogc2VyaWFsaXplcyBjb25uZWN0aW9uIHhtaXQsCisJc3RydWN0IG11dGV4CQl4bWl0bXV0ZXg7CS8qIHNlcmlhbGl6ZXMgY29ubmVjdGlvbiB4bWl0LAogCQkJCQkJICogYWNjZXNzIHRvIGtmaWZvczoJICAqCiAJCQkJCQkgKiB4bWl0cXVldWUsIHdyaXRlcXVldWUsICoKIAkJCQkJCSAqIGltbXF1ZXVlLCBtZ210cXVldWUgICAgKi8KQEAgLTE5MSw2ICsxOTEsOCBAQAogCXVpbnQzMl90CQlzZW5kcGFnZV9mYWlsdXJlc19jbnQ7CiAJdWludDMyX3QJCWRpc2NvbnRpZ3VvdXNfaGRyX2NudDsKIAl1aW50MzJfdAkJZWhfYWJvcnRfY250OworCisJc3NpemVfdCAoKnNlbmRwYWdlKShzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBwYWdlICosIGludCwgc2l6ZV90LCBpbnQpOwogfTsKIAogc3RydWN0IGlzY3NpX3Nlc3Npb24gewpAQCAtMjQwLDggKzI0Miw4IEBACiAKIHN0cnVjdCBpc2NzaV9idWYgewogCXN0cnVjdCBzY2F0dGVybGlzdAlzZzsKLQlzdHJ1Y3Qga3ZlYwkJaW92OwogCXVuc2lnbmVkIGludAkJc2VudDsKKwljaGFyCQkJdXNlX3NlbmRtc2c7CiB9OwogCiBzdHJ1Y3QgaXNjc2lfZGF0YV90YXNrIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJhdGEtY29yZS5jIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKaW5kZXggZjU1YjliMy4uOTliYWU4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKQEAgLTE3NDcsNyArMTc0Nyw3IEBACiAJeyBBVEFfU0hJRlRfUElPLAlYRkVSX1BJT18wIH0sCiB9OwogCi1zdGF0aWMgaW5saW5lIHU4IGJhc2VfZnJvbV9zaGlmdCh1bnNpZ25lZCBpbnQgc2hpZnQpCitzdGF0aWMgdTggYmFzZV9mcm9tX3NoaWZ0KHVuc2lnbmVkIGludCBzaGlmdCkKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwppbmRleCA5ZWU4MjE4Li5kYWZhYmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJcmV0dXJuIHBzYjsKIH0KIAotc3RydWN0ICBscGZjX3Njc2lfYnVmKgorc3RhdGljIHN0cnVjdCBscGZjX3Njc2lfYnVmKgogbHBmY19nZXRfc2NzaV9idWYoc3RydWN0IGxwZmNfaGJhICogcGhiYSkKIHsKIAlzdHJ1Y3QgIGxwZmNfc2NzaV9idWYgKiBscGZjX2NtZCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCmluZGV4IDRhNmZlYjEuLmQxMDFhOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCkBAIC00NDc5LDcgKzQ0NzksNyBAQAogCSAqIHNlcmlhbGl6ZWQuIFRoaXMgaXMgc28gYmVjYXVzZSB3ZSB3YW50IHRvIHJlc2VydmUgbWF4aW11bSBudW1iZXIgb2YKIAkgKiBhdmFpbGFibGUgY29tbWFuZCBpZHMgZm9yIHRoZSBJL08gY29tbWFuZHMuCiAJICovCi0JZG93bigmYWRhcHRlci0+aW50X210eCk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+aW50X210eCk7CiAKIAlzY2IgPSAmYWRhcHRlci0+aW50X3NjYjsKIAltZW1zZXQoc2NiLCAwLCBzaXplb2Yoc2NiX3QpKTsKQEAgLTQ1MjcsNyArNDUyNyw3IEBACiAJCQltYy0+Y21kLCBtYy0+b3Bjb2RlLCBtYy0+c3Vib3Bjb2RlLCBzY21kLT5yZXN1bHQpOwogCX0KIAotCXVwKCZhZGFwdGVyLT5pbnRfbXR4KTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPmludF9tdHgpOwogCiAJcmV0dXJuIHJ2YWw7CiB9CkBAIC00ODY2LDcgKzQ4NjYsNyBAQAogCQlhZGFwdGVyLT5oYXNfNjRiaXRfYWRkciA9IDA7CiAJfQogCQkKLQlpbml0X01VVEVYKCZhZGFwdGVyLT5pbnRfbXR4KTsKKwltdXRleF9pbml0KCZhZGFwdGVyLT5pbnRfbXR4KTsKIAlpbml0X2NvbXBsZXRpb24oJmFkYXB0ZXItPmludF93YWl0cSk7CiAKIAlhZGFwdGVyLT50aGlzX2lkID0gREVGQVVMVF9JTklUSUFUT1JfSUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuaCBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCmluZGV4IDZmOTA3ODAuLjRiM2UwZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCkBAIC0yLDcgKzIsNyBAQAogI2RlZmluZSBfX01FR0FSQUlEX0hfXwogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNkZWZpbmUgTUVHQVJBSURfVkVSU0lPTglcCiAJInYyLjAwLjMgKFJlbGVhc2UgRGF0ZTogV2VkIEZlYiAxOSAwODo1MTozMCBFU1QgMjAwMylcbiIKQEAgLTg4OSw3ICs4ODksNyBAQAogCiAJc2NiX3QJCQlpbnRfc2NiOwogCVNjc2lfQ21uZAkJaW50X3NjbWQ7Ci0Jc3RydWN0IHNlbWFwaG9yZQlpbnRfbXR4OwkvKiBUbyBzeW5jaHJvbml6ZSB0aGUgaW50ZXJuYWwKKwlzdHJ1Y3QgbXV0ZXgJCWludF9tdHg7CS8qIFRvIHN5bmNocm9uaXplIHRoZSBpbnRlcm5hbAogCQkJCQkJY29tbWFuZHMgKi8KIAlzdHJ1Y3QgY29tcGxldGlvbglpbnRfd2FpdHE7CS8qIHdhaXQgcXVldWUgZm9yIGludGVybmFsCiAJCQkJCQkgY21kcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMKaW5kZXggZDE4YTRiYy4uYmY5ZjdmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jCkBAIC0xMjY2LDcgKzEyNjYsNyBAQAogICogcmV0dXJuIHRoZSBzY2IgZnJvbSB0aGUgaGVhZCBvZiB0aGUgZnJlZSBsaXN0LiBOVUxMIGlmIHRoZXJlIGFyZSBub25lCiAgKiBhdmFpbGFibGUKICAqKi8KLXN0YXRpYyBpbmxpbmUgc2NiX3QgKgorc3RhdGljIHNjYl90ICoKIG1lZ2FyYWlkX2FsbG9jX3NjYihhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpoZWFkID0gJmFkYXB0ZXItPmtzY2JfcG9vbDsKQEAgLTEzMjksNyArMTMyOSw3IEBACiAgKgogICogcHJlcGFyZSB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdAogICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogbWVnYXJhaWRfbWJveF9ta3NnbChhZGFwdGVyX3QgKmFkYXB0ZXIsIHNjYl90ICpzY2IpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZ2w7CkBAIC0xNDAyLDcgKzE0MDIsNyBAQAogICoKICAqIHBvc3QgdGhlIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIgaWYgbWFpbGJveCBpcyBhdmFpbGJsZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIG1ib3hfcG9zdF9jbWQoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiKQogewogCW1yYWlkX2RldmljZV90CSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKQEAgLTIwNzAsNyArMjA3MCw3IEBACiAgKgogICogUmV0dXJuczoJMSBpZiB0aGUgaW50ZXJydXB0IGlzIHZhbGlkLCAwIG90aGVyd2lzZQogICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogbWVnYXJhaWRfYWNrX3NlcXVlbmNlKGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAltcmFpZF9kZXZpY2VfdAkJKnJhaWRfZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOwpAQCAtMjIwOCw3ICsyMjA4LDcgQEAKICAqCiAgKiBETUEgc3luYyBpZiByZXF1aXJlZC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogbWVnYXJhaWRfbWJveF9zeW5jX3NjYihhZGFwdGVyX3QgKmFkYXB0ZXIsIHNjYl90ICpzY2IpCiB7CiAJbWJveF9jY2JfdAkqY2NiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5jCmluZGV4IDNjMzJlNjkuLjUxMWVkNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CkBAIC03Miw3ICs3Myw3IEBACiBzdGF0aWMgaW50IG1lZ2FzYXNfbWdtdF9tYWpvcm5vOwogc3RhdGljIHN0cnVjdCBtZWdhc2FzX21nbXRfaW5mbyBtZWdhc2FzX21nbXRfaW5mbzsKIHN0YXRpYyBzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqbWVnYXNhc19hc3luY19xdWV1ZTsKLXN0YXRpYyBERUNMQVJFX01VVEVYKG1lZ2FzYXNfYXN5bmNfcXVldWVfbXV0ZXgpOworc3RhdGljIERFRklORV9NVVRFWChtZWdhc2FzX2FzeW5jX3F1ZXVlX211dGV4KTsKIAogLyoqCiAgKiBtZWdhc2FzX2dldF9jbWQgLQlHZXQgYSBjb21tYW5kIGZyb20gdGhlIGZyZWUgcG9vbApAQCAtODAsNyArODEsNyBAQAogICoKICAqIFJldHVybnMgYSBmcmVlIGNvbW1hbmQgZnJvbSB0aGUgcG9vbAogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtZWdhc2FzX2NtZCAqbWVnYXNhc19nZXRfY21kKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlCitzdGF0aWMgc3RydWN0IG1lZ2FzYXNfY21kICptZWdhc2FzX2dldF9jbWQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UKIAkJCQkJCSAgKmluc3RhbmNlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNjIsNyArMjYzLDcgQEAKICAqIElmIHN1Y2Nlc3NmdWwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIFNHIGVsZW1lbnRzLiBPdGhlcndpc2UsCiAgKiBpdCByZXR1cm5lcyAtMS4KICAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIG1lZ2FzYXNfbWFrZV9zZ2wzMihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwKIAkJICAgdW5pb24gbWVnYXNhc19zZ2wgKm1maV9zZ2wpCiB7CkBAIC0zMTAsNyArMzExLDcgQEAKICAqIElmIHN1Y2Nlc3NmdWwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIFNHIGVsZW1lbnRzLiBPdGhlcndpc2UsCiAgKiBpdCByZXR1cm5lcyAtMS4KICAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIG1lZ2FzYXNfbWFrZV9zZ2w2NChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwKIAkJICAgdW5pb24gbWVnYXNhc19zZ2wgKm1maV9zZ2wpCiB7CkBAIC0zNTksNyArMzYwLDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgQ0RCIGNvbW1hbmRzLiBUaGVzZSBhcmUgdHlwY2lhbGx5IHBhc3MtdGhyb3VnaAogICogY29tbWFuZHMgdG8gdGhlIGRldmljZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBtZWdhc2FzX2J1aWxkX2RjZGIoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsCiAJCSAgIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kKQogewpAQCAtNDQwLDcgKzQ0MSw3IEBACiAgKgogICogRnJhbWVzIChhbmQgYWNjb21wYW55aW5nIFNHTHMpIGZvciByZWd1bGFyIFNDU0kgSU9zIHVzZSB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogbWVnYXNhc19idWlsZF9sZGlvKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IHNjc2lfY21uZCAqc2NwLAogCQkgICBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCkKIHsKQEAgLTU2Miw3ICs1NjMsNyBAQAogICogQHNjcDoJCVNDU0kgY29tbWFuZAogICogQGZyYW1lX2NvdW50OglbT1VUXSBOdW1iZXIgb2YgZnJhbWVzIHVzZWQgdG8gcHJlcGFyZSB0aGlzIGNvbW1hbmQKICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgbWVnYXNhc19jbWQgKm1lZ2FzYXNfYnVpbGRfY21kKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlCitzdGF0aWMgc3RydWN0IG1lZ2FzYXNfY21kICptZWdhc2FzX2J1aWxkX2NtZChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZQogCQkJCQkJICAgICppbnN0YW5jZSwKIAkJCQkJCSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsCiAJCQkJCQkgICAgaW50ICpmcmFtZV9jb3VudCkKQEAgLTkxMyw3ICs5MTQsNyBAQAogICogQGluc3RhbmNlOgkJCUFkYXB0ZXIgc29mdCBzdGF0ZQogICogQGNtZDoJCQlDb21wbGV0ZWQgY29tbWFuZAogICovCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBtZWdhc2FzX3VubWFwX3NnYnVmKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQpCiB7CiAJZG1hX2FkZHJfdCBidWZfaDsKQEAgLTk1Nyw3ICs5NTgsNyBAQAogICogCQkJCWFuIGFsdGVybmF0ZSBzdGF0dXMgKGFzIGluIHRoZSBjYXNlIG9mIGFib3J0ZWQKICAqIAkJCQljb21tYW5kcykKICAqLwotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogbWVnYXNhc19jb21wbGV0ZV9jbWQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCwKIAkJICAgICB1OCBhbHRfc3RhdHVzKQogewpAQCAtMTEwNCw3ICsxMTA1LDcgQEAKICAqIAkJCQkJU0NTSSBtaWQtbGF5ZXIgaW5zdGVhZCBvZiB0aGUgc3RhdHVzCiAgKiAJCQkJCXJldHVybmVkIGJ5IHRoZSBGVwogICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogbWVnYXNhc19kZXBsZXRlX3JlcGx5X3F1ZXVlKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgdTggYWx0X3N0YXR1cykKIHsKIAl1MzIgc3RhdHVzOwpAQCAtMjM2MiwxMSArMjM2MywxMSBAQAogewogCWludCByYzsKIAotCWRvd24oJm1lZ2FzYXNfYXN5bmNfcXVldWVfbXV0ZXgpOworCW11dGV4X2xvY2soJm1lZ2FzYXNfYXN5bmNfcXVldWVfbXV0ZXgpOwogCiAJcmMgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxlcCwgbW9kZSwgJm1lZ2FzYXNfYXN5bmNfcXVldWUpOwogCi0JdXAoJm1lZ2FzYXNfYXN5bmNfcXVldWVfbXV0ZXgpOworCW11dGV4X3VubG9jaygmbWVnYXNhc19hc3luY19xdWV1ZV9tdXRleCk7CiAKIAlpZiAocmMgPj0gMCkgewogCQkvKiBGb3Igc2FuaXR5IGNoZWNrIHdoZW4gd2UgZ2V0IGlvY3RsICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9LY29uZmlnIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvS2NvbmZpZwppbmRleCA1MjA1YzRlLi41NzU4YjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L0tjb25maWcKQEAgLTEsNCArMSw0IEBACi1jb25maWcgU0NTSV9RTEEyWFhYCitjb25maWcgU0NTSV9RTEFfRkMKIAl0cmlzdGF0ZSAiUUxvZ2ljIFFMQTJYWFggRmlicmUgQ2hhbm5lbCBTdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIFNDU0kKIAlzZWxlY3QgU0NTSV9GQ19BVFRSUwpAQCAtMjIsNDkgKzIyLDU3IEBACiAJVXBvbiByZXF1ZXN0LCB0aGUgZHJpdmVyIGNhY2hlcyB0aGUgZmlybXdhcmUgaW1hZ2UgdW50aWwKIAl0aGUgZHJpdmVyIGlzIHVubG9hZGVkLgogCisJRmlybXdhcmUgaW1hZ2VzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbToKKworCQlmdHA6Ly9mdHAucWxvZ2ljLmNvbS9vdXRnb2luZy9saW51eC9maXJtd2FyZS8KKwogCU5PVEU6IFRoZSBvcmlnaW5hbCBtZXRob2Qgb2YgYnVpbGRpbmcgZmlybXdhcmUtbG9hZGVyCiAJbW9kdWxlcyBoYXMgYmVlbiBkZXByZWNhdGVkIGFzIHRoZSBmaXJtd2FyZS1pbWFnZXMgd2lsbAogCWJlIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsIHNvdXJjZXMuCiAKIGNvbmZpZyBTQ1NJX1FMQTJYWFhfRU1CRURERURfRklSTVdBUkUKIAlib29sICIgIFVzZSBmaXJtd2FyZS1sb2FkZXIgbW9kdWxlcyAoREVQUkVDQVRFRCkiCi0JZGVwZW5kcyBvbiBTQ1NJX1FMQTJYWFgKKwlkZXBlbmRzIG9uIFNDU0lfUUxBX0ZDCisJaGVscAorCSAgVGhpcyBvcHRpb24gb2ZmZXJzIHlvdSB0aGUgZGVwcmVjYXRlZCBmaXJtd2FyZS1sb2FkZXIKKwkgIG1vZHVsZXMgdGhhdCBoYXZlIGJlZW4gb2Jzb2xldGVkIGJ5IHRoZSB1c2FnZSBvZiB0aGUKKwkgIEZpcm13YXJlIExvYWRlciBpbnRlcmZhY2UgaW4gdGhlIHFsYTJ4eHggZHJpdmVyLgogCiBjb25maWcgU0NTSV9RTEEyMVhYCiAJdHJpc3RhdGUgIiAgQnVpbGQgUUxvZ2ljIElTUDIxMDAgZmlybXdhcmUtbW9kdWxlIgotCWRlcGVuZHMgb24gU0NTSV9RTEEyWFhYX0VNQkVEREVEX0ZJUk1XQVJFCisJZGVwZW5kcyBvbiBTQ1NJX1FMQV9GQyAmJiBTQ1NJX1FMQTJYWFhfRU1CRURERURfRklSTVdBUkUKIAktLS1oZWxwLS0tCiAJVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFFMb2dpYyAyMXh4IChJU1AyMTAwKSBob3N0IGFkYXB0ZXIgZmFtaWx5LgogCiBjb25maWcgU0NTSV9RTEEyMlhYCiAJdHJpc3RhdGUgIiAgQnVpbGQgUUxvZ2ljIElTUDIyMDAgZmlybXdhcmUtbW9kdWxlIgotCWRlcGVuZHMgb24gU0NTSV9RTEEyWFhYX0VNQkVEREVEX0ZJUk1XQVJFCisJZGVwZW5kcyBvbiBTQ1NJX1FMQV9GQyAmJiBTQ1NJX1FMQTJYWFhfRU1CRURERURfRklSTVdBUkUKIAktLS1oZWxwLS0tCiAJVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFFMb2dpYyAyMnh4IChJU1AyMjAwKSBob3N0IGFkYXB0ZXIgZmFtaWx5LgogCiBjb25maWcgU0NTSV9RTEEyMzAwCiAJdHJpc3RhdGUgIiAgQnVpbGQgUUxvZ2ljIElTUDIzMDAgZmlybXdhcmUtbW9kdWxlIgotCWRlcGVuZHMgb24gU0NTSV9RTEEyWFhYX0VNQkVEREVEX0ZJUk1XQVJFCisJZGVwZW5kcyBvbiBTQ1NJX1FMQV9GQyAmJiBTQ1NJX1FMQTJYWFhfRU1CRURERURfRklSTVdBUkUKIAktLS1oZWxwLS0tCiAJVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFFMb2dpYyAyMzAwIChJU1AyMzAwIGFuZCBJU1AyMzEyKSBob3N0CiAJYWRhcHRlciBmYW1pbHkuCiAKIGNvbmZpZyBTQ1NJX1FMQTIzMjIKIAl0cmlzdGF0ZSAiICBCdWlsZCBRTG9naWMgSVNQMjMyMiBmaXJtd2FyZS1tb2R1bGUiCi0JZGVwZW5kcyBvbiBTQ1NJX1FMQTJYWFhfRU1CRURERURfRklSTVdBUkUKKwlkZXBlbmRzIG9uIFNDU0lfUUxBX0ZDICYmIFNDU0lfUUxBMlhYWF9FTUJFRERFRF9GSVJNV0FSRQogCS0tLWhlbHAtLS0KIAlUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgUUxvZ2ljIDIzMjIgKElTUDIzMjIpIGhvc3QgYWRhcHRlciBmYW1pbHkuCiAKIGNvbmZpZyBTQ1NJX1FMQTYzMTIKIAl0cmlzdGF0ZSAiICBCdWlsZCBRTG9naWMgSVNQNjN4eCBmaXJtd2FyZS1tb2R1bGUiCi0JZGVwZW5kcyBvbiBTQ1NJX1FMQTJYWFhfRU1CRURERURfRklSTVdBUkUKKwlkZXBlbmRzIG9uIFNDU0lfUUxBX0ZDICYmIFNDU0lfUUxBMlhYWF9FTUJFRERFRF9GSVJNV0FSRQogCS0tLWhlbHAtLS0KIAlUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgUUxvZ2ljIDYzeHggKElTUDYzMTIgYW5kIElTUDYzMjIpIGhvc3QKIAlhZGFwdGVyIGZhbWlseS4KIAogY29uZmlnIFNDU0lfUUxBMjRYWAogCXRyaXN0YXRlICIgIEJ1aWxkIFFMb2dpYyBJU1AyNHh4IGZpcm13YXJlLW1vZHVsZSIKLQlkZXBlbmRzIG9uIFNDU0lfUUxBMlhYWF9FTUJFRERFRF9GSVJNV0FSRQorCWRlcGVuZHMgb24gU0NTSV9RTEFfRkMgJiYgU0NTSV9RTEEyWFhYX0VNQkVEREVEX0ZJUk1XQVJFCiAJLS0taGVscC0tLQogCVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBRTG9naWMgMjR4eCAoSVNQMjQyMiBhbmQgSVNQMjQzMikgaG9zdAogCWFkYXB0ZXIgZmFtaWx5LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9NYWtlZmlsZQppbmRleCA0MGMwZGUxLi5kMDI4YmM1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvTWFrZWZpbGUKQEAgLTMsNyArMyw3IEBACiBxbGEyeHh4LXkgOj0gcWxhX29zLm8gcWxhX2luaXQubyBxbGFfbWJ4Lm8gcWxhX2lvY2IubyBxbGFfaXNyLm8gcWxhX2dzLm8gXAogCQlxbGFfZGJnLm8gcWxhX3N1cC5vIHFsYV9yc2NuLm8gcWxhX2F0dHIubwogCi1vYmotJChDT05GSUdfU0NTSV9RTEEyWFhYKSArPSBxbGEyeHh4Lm8KK29iai0kKENPTkZJR19TQ1NJX1FMQV9GQykgKz0gcWxhMnh4eC5vCiAKIHFsYTIxMDAteSA6PSBxbDIxMDAubyBxbDIxMDBfZncubwogcWxhMjIwMC15IDo9IHFsMjIwMC5vIHFsMjIwMF9mdy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwppbmRleCAyZWZjYTUyLi5iMTdlZTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKQEAgLTU0MSw3ICs1NDEsNyBAQAogdm9pZAogcWxhMngwMF9pbml0X2hvc3RfYXR0cihzY3NpX3FsYV9ob3N0X3QgKmhhKQogewotCWZjX2hvc3Rfbm9kZV9uYW1lKGhhLT5ob3N0KSA9IHd3bl90b191NjQoaGEtPmluaXRfY2ItPm5vZGVfbmFtZSk7Ci0JZmNfaG9zdF9wb3J0X25hbWUoaGEtPmhvc3QpID0gd3duX3RvX3U2NChoYS0+aW5pdF9jYi0+cG9ydF9uYW1lKTsKKwlmY19ob3N0X25vZGVfbmFtZShoYS0+aG9zdCkgPSB3d25fdG9fdTY0KGhhLT5ub2RlX25hbWUpOworCWZjX2hvc3RfcG9ydF9uYW1lKGhhLT5ob3N0KSA9IHd3bl90b191NjQoaGEtPnBvcnRfbmFtZSk7CiAJZmNfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlcyhoYS0+aG9zdCkgPSBGQ19DT1NfQ0xBU1MzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCmluZGV4IDVjNWQyMzEuLjJkOWIxMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKQEAgLTEwMDMsMTAgKzEwMDMsMTAgQEAKIAlmdyA9IChzdHJ1Y3QgcWxhMjR4eF9md19kdW1wICopIGhhLT5md19kdW1wMjQ7CiAKIAlydmFsID0gUUxBX1NVQ0NFU1M7Ci0JZnctPmhjY3IgPSBSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CisJZnctPmhvc3Rfc3RhdHVzID0gUkRfUkVHX0RXT1JEKCZyZWctPmhvc3Rfc3RhdHVzKTsKIAogCS8qIFBhdXNlIFJJU0MuICovCi0JaWYgKChmdy0+aGNjciAmIEhDQ1JYX1JJU0NfUEFVU0UpID09IDApIHsKKwlpZiAoKFJEX1JFR19EV09SRCgmcmVnLT5oY2NyKSAmIEhDQ1JYX1JJU0NfUEFVU0UpID09IDApIHsKIAkJV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9TRVRfUklTQ19SRVNFVCB8CiAJCSAgICBIQ0NSWF9DTFJfSE9TVF9JTlQpOwogCQlSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CQkvKiBQQ0kgUG9zdGluZy4gKi8KQEAgLTEwMjEsMTYgKzEwMjEsNTQgQEAKIAkJfQogCX0KIAotCS8qIERpc2FibGUgaW50ZXJydXB0cy4gKi8KLQlXUlRfUkVHX0RXT1JEKCZyZWctPmljdHJsLCAwKTsKLQlSRF9SRUdfRFdPUkQoJnJlZy0+aWN0cmwpOwotCiAJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJLyogSG9zdCBpbnRlcmZhY2UgcmVnaXN0ZXJzLiAqLwogCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikocmVnICsgMCk7CiAJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5ob3N0X3JlZykgLyA0OyBjbnQrKykKIAkJCWZ3LT5ob3N0X3JlZ1tjbnRdID0gUkRfUkVHX0RXT1JEKGRtcF9yZWcrKyk7CiAKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLiAqLworCQlXUlRfUkVHX0RXT1JEKCZyZWctPmljdHJsLCAwKTsKKwkJUkRfUkVHX0RXT1JEKCZyZWctPmljdHJsKTsKKworCQkvKiBTaGFkb3cgcmVnaXN0ZXJzLiAqLworCQlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9hZGRyLCAweDBGNzApOworCQlSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX2FkZHIpOworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOworCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjAwMDAwMDApOworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOworCQlmdy0+c2hhZG93X3JlZ1swXSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKKworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOworCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjAxMDAwMDApOworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOworCQlmdy0+c2hhZG93X3JlZ1sxXSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKKworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOworCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjAyMDAwMDApOworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOworCQlmdy0+c2hhZG93X3JlZ1syXSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKKworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOworCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjAzMDAwMDApOworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOworCQlmdy0+c2hhZG93X3JlZ1szXSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKKworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOworCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjA0MDAwMDApOworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOworCQlmdy0+c2hhZG93X3JlZ1s0XSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKKworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOworCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjA1MDAwMDApOworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOworCQlmdy0+c2hhZG93X3JlZ1s1XSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKKworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOworCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjA2MDAwMDApOworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOworCQlmdy0+c2hhZG93X3JlZ1s2XSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKKwogCQkvKiBNYWlsYm94IHJlZ2lzdGVycy4gKi8KIAkJbWJ4X3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKIAkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPm1haWxib3hfcmVnKSAvIDI7IGNudCsrKQpAQCAtMTMwOCw0MyArMTM0Niw2IEBACiAJCWZvciAoY250ID0gMDsgY250IDwgMTY7IGNudCsrKQogCQkJKml0ZXJfcmVnKysgPSBSRF9SRUdfRFdPUkQoZG1wX3JlZysrKTsKIAotCQlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9hZGRyLCAweDBGNzApOwotCQlSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX2FkZHIpOwotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOwotCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjAwMDAwMDApOwotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOwotCQlmdy0+c2hhZG93X3JlZ1swXSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKLQotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOwotCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjAxMDAwMDApOwotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOwotCQlmdy0+c2hhZG93X3JlZ1sxXSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKLQotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOwotCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjAyMDAwMDApOwotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOwotCQlmdy0+c2hhZG93X3JlZ1syXSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKLQotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOwotCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjAzMDAwMDApOwotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOwotCQlmdy0+c2hhZG93X3JlZ1szXSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKLQotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOwotCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjA0MDAwMDApOwotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOwotCQlmdy0+c2hhZG93X3JlZ1s0XSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKLQotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOwotCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjA1MDAwMDApOwotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOwotCQlmdy0+c2hhZG93X3JlZ1s1XSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKLQotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOwotCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjA2MDAwMDApOwotCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOwotCQlmdy0+c2hhZG93X3JlZ1s2XSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKLQogCQkvKiBMb2NhbCBtZW1vcnkgY29udHJvbGxlciByZWdpc3RlcnMuICovCiAJCWl0ZXJfcmVnID0gZnctPmxtY19yZWc7CiAJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX2FkZHIsIDB4MzAwMCk7CkBAIC0xNjc3LDcgKzE2NzgsNyBAQAogCSAgICBoYS0+ZndfbWFqb3JfdmVyc2lvbiwgaGEtPmZ3X21pbm9yX3ZlcnNpb24sCiAJICAgIGhhLT5md19zdWJtaW5vcl92ZXJzaW9uLCBoYS0+ZndfYXR0cmlidXRlcyk7CiAKLQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbkhDQ1IgUmVnaXN0ZXJcbiUwNHhcbiIsIGZ3LT5oY2NyKTsKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblIySCBTdGF0dXMgUmVnaXN0ZXJcbiUwNHhcbiIsIGZ3LT5ob3N0X3N0YXR1cyk7CiAKIAlxbGFfdXByaW50ZigmdWl0ZXIsICJcbkhvc3QgSW50ZXJmYWNlIFJlZ2lzdGVycyIpOwogCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5ob3N0X3JlZykgLyA0OyBjbnQrKykgewpAQCAtMTY4Nyw2ICsxNjg4LDE0IEBACiAJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwOHggIiwgZnctPmhvc3RfcmVnW2NudF0pOwogCX0KIAorCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5TaGFkb3cgUmVnaXN0ZXJzIik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnNoYWRvd19yZWcpIC8gNDsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisKKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA4eCAiLCBmdy0+c2hhZG93X3JlZ1tjbnRdKTsKKwl9CisKIAlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuTWFpbGJveCBSZWdpc3RlcnMiKTsKIAlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+bWFpbGJveF9yZWcpIC8gMjsgY250KyspIHsKIAkJaWYgKGNudCAlIDggPT0gMCkKQEAgLTE4NTUsMTQgKzE4NjQsNiBAQAogCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDh4ICIsIGZ3LT5yaXNjX2dwX3JlZ1tjbnRdKTsKIAl9CiAKLQlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuU2hhZG93IFJlZ2lzdGVycyIpOwotCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5zaGFkb3dfcmVnKSAvIDQ7IGNudCsrKSB7Ci0JCWlmIChjbnQgJSA4ID09IDApCi0JCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOwotCi0JCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwOHggIiwgZnctPnNoYWRvd19yZWdbY250XSk7Ci0JfQotCiAJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cbkxNQyBSZWdpc3RlcnMiKTsKIAlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+bG1jX3JlZykgLyA0OyBjbnQrKykgewogCQlpZiAoY250ICUgOCA9PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCmluZGV4IDkzNWE1OWEuLmFiNmFmZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKQEAgLTIyNyw4ICsyMjcsOSBAQAogI2RlZmluZSBGV19EVU1QX1NJWkVfMjRYWAkweDJCMDAwMAogCiBzdHJ1Y3QgcWxhMjR4eF9md19kdW1wIHsKLQl1aW50MzJfdCBoY2NyOworCXVpbnQzMl90IGhvc3Rfc3RhdHVzOwogCXVpbnQzMl90IGhvc3RfcmVnWzMyXTsKKwl1aW50MzJfdCBzaGFkb3dfcmVnWzddOwogCXVpbnQxNl90IG1haWxib3hfcmVnWzMyXTsKIAl1aW50MzJfdCB4c2VxX2dwX3JlZ1sxMjhdOwogCXVpbnQzMl90IHhzZXFfMF9yZWdbMTZdOwpAQCAtMjUwLDcgKzI1MSw2IEBACiAJdWludDMyX3QgcmN2dDBfZGF0YV9kbWFfcmVnWzMyXTsKIAl1aW50MzJfdCByY3Z0MV9kYXRhX2RtYV9yZWdbMzJdOwogCXVpbnQzMl90IHJpc2NfZ3BfcmVnWzEyOF07Ci0JdWludDMyX3Qgc2hhZG93X3JlZ1s3XTsKIAl1aW50MzJfdCBsbWNfcmVnWzExMl07CiAJdWludDMyX3QgZnBtX2hkd19yZWdbMTkyXTsKIAl1aW50MzJfdCBmYl9oZHdfcmVnWzE3Nl07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKaW5kZXggYmVjODFhZC4uMzJiZTRjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtNjIsNiArNjIsNyBAQAogZXh0ZXJuIGludCBxbDJ4cGxvZ2lhYnNlbnRkZXZpY2U7CiBleHRlcm4gaW50IHFsMnhsb2dpbnJldHJ5Y291bnQ7CiBleHRlcm4gaW50IHFsMnhmZG1pZW5hYmxlOworZXh0ZXJuIGludCBxbDJ4cHJvY2Vzc3JzY247CiAKIGV4dGVybiB2b2lkIHFsYTJ4MDBfc3BfY29tcGwoc2NzaV9xbGFfaG9zdF90ICosIHNyYl90ICopOwogCkBAIC05NiwxMCArOTcsNyBAQAogICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX21ieC5jIHNvdXJjZSBmaWxlLgogICovCiBleHRlcm4gaW50Ci1xbGEyeDAwX2xvYWRfcmFtKHNjc2lfcWxhX2hvc3RfdCAqLCBkbWFfYWRkcl90LCB1aW50MTZfdCwgdWludDE2X3QpOwotCi1leHRlcm4gaW50Ci1xbGEyeDAwX2xvYWRfcmFtX2V4dChzY3NpX3FsYV9ob3N0X3QgKiwgZG1hX2FkZHJfdCwgdWludDMyX3QsIHVpbnQzMl90KTsKK3FsYTJ4MDBfbG9hZF9yYW0oc2NzaV9xbGFfaG9zdF90ICosIGRtYV9hZGRyX3QsIHVpbnQzMl90LCB1aW50MzJfdCk7CiAKIGV4dGVybiBpbnQKIHFsYTJ4MDBfZXhlY3V0ZV9mdyhzY3NpX3FsYV9ob3N0X3QgKiwgdWludDMyX3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYwppbmRleCBjZDZmN2MzLi5kNjIwYThlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKQEAgLTUzOCw2ICs1MzgsNyBAQAogCWN0X3JlcS0+cmVxLnJmZl9pZC5wb3J0X2lkWzFdID0gaGEtPmRfaWQuYi5hcmVhOwogCWN0X3JlcS0+cmVxLnJmZl9pZC5wb3J0X2lkWzJdID0gaGEtPmRfaWQuYi5hbF9wYTsKIAorCWN0X3JlcS0+cmVxLnJmZl9pZC5mYzRfZmVhdHVyZSA9IEJJVF8xOwogCWN0X3JlcS0+cmVxLnJmZl9pZC5mYzRfdHlwZSA9IDB4MDg7CQkvKiBTQ1NJIC0gRkNQICovCiAKIAkvKiBFeGVjdXRlIE1TIElPQ0IgKi8KQEAgLTE1MjksOSArMTUzMCw5IEBACiAJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfUE9SVF9TVVBQT1JUX1NQRUVEKTsKIAllaXRlci0+bGVuID0gX19jb25zdGFudF9jcHVfdG9fYmUxNig0ICsgNCk7CiAJaWYgKElTX1FMQTI1WFgoaGEpKQotCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDQpOwotCWVsc2UgaWYgKElTX1FMQTI0WFgoaGEpKQogCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDgpOworCWVsc2UgaWYgKElTX1FMQTI0WFgoaGEpKQorCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDQpOwogCWVsc2UgaWYgKElTX1FMQTIzWFgoaGEpKQogCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDIpOwogCWVsc2UKQEAgLTE1NTMsOSArMTU1NCw2IEBACiAJCWVpdGVyLT5hLmN1cl9zcGVlZCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMik7CiAJCWJyZWFrOwogCWNhc2UgMzoKLQkJZWl0ZXItPmEuY3VyX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMig4KTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgogCQllaXRlci0+YS5jdXJfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDQpOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwppbmRleCA3ZDk3M2JkLi5hOTFmZWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKQEAgLTEwMTQsMTEgKzEwMTQsMTMgQEAKIAlpbnQgcnZhbDsKIAogCS8qIFVwZGF0ZSBTZXJpYWwgTGluayBvcHRpb25zLiAqLwotCWlmICgoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uczI0WzBdICYgQklUXzApID09IDApCisJaWYgKChsZTE2X3RvX2NwdShoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zMjRbMF0pICYgQklUXzApID09IDApCiAJCXJldHVybjsKIAotCXJ2YWwgPSBxbGEyeDAwX3NldF9zZXJkZXNfcGFyYW1zKGhhLCBoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zMjRbMV0sCi0JICAgIGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMyNFsyXSwgaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uczI0WzNdKTsKKwlydmFsID0gcWxhMngwMF9zZXRfc2VyZGVzX3BhcmFtcyhoYSwKKwkgICAgbGUxNl90b19jcHUoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uczI0WzFdKSwKKwkgICAgbGUxNl90b19jcHUoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uczI0WzJdKSwKKwkgICAgbGUxNl90b19jcHUoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uczI0WzNdKSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkgICAgIlVuYWJsZSB0byB1cGRhdGUgU2VyaWFsIExpbmsgb3B0aW9ucyAoJXgpLlxuIiwgcnZhbCk7CkBAIC0xOTM5LDYgKzE5NDEsOSBAQAogCQkJICAgICJpbmZvcm1hdGlvbiAtLSBnZXRfcG9ydF9kYXRhYmFzZT0leCwgIgogCQkJICAgICJsb29wX2lkPTB4JTA0eFxuIiwKIAkJCSAgICBoYS0+aG9zdF9ubywgcnZhbDIsIG5ld19mY3BvcnQtPmxvb3BfaWQpKTsKKwkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogU2NoZWR1bGluZyByZXN5bmMuLi5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJCXNldF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0yNjQ4LDcgKzI2NTMsOCBAQAogCiAJCXN3aXRjaCAoZm9ybWF0KSB7CiAJCWNhc2UgMDoKLQkJCWlmICghSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpICYmCisJCQlpZiAocWwyeHByb2Nlc3Nyc2NuICYmCisJCQkgICAgIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSAmJgogCQkJICAgICFJU19RTEE2MzEyKGhhKSAmJiAhSVNfUUxBNjMyMihoYSkgJiYKIAkJCSAgICAhSVNfUUxBMjRYWChoYSkgJiYgIUlTX1FMQTI1WFgoaGEpICYmCiAJCQkgICAgaGEtPmZsYWdzLmluaXRfZG9uZSkgewpAQCAtMzQwMiw2ICszNDA4LDggQEAKIAloYS0+bm9kZV9uYW1lID0gaWNiLT5ub2RlX25hbWU7CiAJaGEtPnBvcnRfbmFtZSA9IGljYi0+cG9ydF9uYW1lOwogCisJaWNiLT5leGVjdXRpb25fdGhyb3R0bGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4RkZGRik7CisKIAloYS0+cmV0cnlfY291bnQgPSBsZTE2X3RvX2NwdShudi0+bG9naW5fcmV0cnlfY291bnQpOwogCiAJLyogU2V0IG1pbmltdW0gbG9naW5fdGltZW91dCB0byA0IHNlY29uZHMuICovCkBAIC0zNjY3LDggKzM2NzUsOCBAQAogCQkJZm9yIChpID0gMDsgaSA8IGRsZW47IGkrKykKIAkJCQlkY29kZVtpXSA9IHN3YWIzMihkY29kZVtpXSk7CiAKLQkJCXJ2YWwgPSBxbGEyeDAwX2xvYWRfcmFtX2V4dChoYSwgaGEtPnJlcXVlc3RfZG1hLAotCQkJICAgIHJpc2NfYWRkciwgZGxlbik7CisJCQlydmFsID0gcWxhMngwMF9sb2FkX3JhbShoYSwgaGEtPnJlcXVlc3RfZG1hLCByaXNjX2FkZHIsCisJCQkgICAgZGxlbik7CiAJCQlpZiAocnZhbCkgewogCQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOltFUlJPUl0gRmFpbGVkIHRvIGxvYWQgIgogCQkJCSAgICAic2VnbWVudCAlZCBvZiBmaXJtd2FyZVxuIiwgaGEtPmhvc3Rfbm8sCkBAIC0zODY4LDggKzM4NzYsOCBAQAogCQkJZm9yIChpID0gMDsgaSA8IGRsZW47IGkrKykKIAkJCQlkY29kZVtpXSA9IHN3YWIzMihmd2NvZGVbaV0pOwogCi0JCQlydmFsID0gcWxhMngwMF9sb2FkX3JhbV9leHQoaGEsIGhhLT5yZXF1ZXN0X2RtYSwKLQkJCSAgICByaXNjX2FkZHIsIGRsZW4pOworCQkJcnZhbCA9IHFsYTJ4MDBfbG9hZF9yYW0oaGEsIGhhLT5yZXF1ZXN0X2RtYSwgcmlzY19hZGRyLAorCQkJICAgIGRsZW4pOwogCQkJaWYgKHJ2YWwpIHsKIAkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTpbRVJST1JdIEZhaWxlZCB0byBsb2FkICIKIAkJCQkgICAgInNlZ21lbnQgJWQgb2YgZmlybXdhcmVcbiIsIGhhLT5ob3N0X25vLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCmluZGV4IDUxODFkOTYuLmY2M2FmMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKQEAgLTUxOSw3ICs1MTksOCBAQAogCQkgKiB1cywgY3JlYXRlIGEgbmV3IGVudHJ5IGluIG91ciByc2NuIGZjcG9ydHMgbGlzdCBhbmQgaGFuZGxlCiAJCSAqIHRoZSBldmVudCBsaWtlIGFuIFJTQ04uCiAJCSAqLwotCQlpZiAoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSAmJiAhSVNfUUxBNjMxMihoYSkgJiYKKwkJaWYgKHFsMnhwcm9jZXNzcnNjbiAmJgorCQkgICAgIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSAmJiAhSVNfUUxBNjMxMihoYSkgJiYKIAkJICAgICFJU19RTEE2MzIyKGhhKSAmJiAhSVNfUUxBMjRYWChoYSkgJiYgIUlTX1FMQTI1WFgoaGEpICYmCiAJCSAgICBoYS0+ZmxhZ3MuaW5pdF9kb25lICYmIG1iWzFdICE9IDB4ZmZmZiAmJgogCQkgICAgKChoYS0+b3BlcmF0aW5nX21vZGUgPT0gUDJQICYmIG1iWzFdICE9IDApIHx8CkBAIC05NjMsMTUgKzk2NCwxNiBAQAogCQlicmVhazsKIAogCWNhc2UgQ1NfREFUQV9VTkRFUlJVTjoKLQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KLQkJICAgICJzY3NpKCVsZDolZDolZCkgVU5ERVJSVU4gc3RhdHVzIGRldGVjdGVkIDB4JXgtMHgleC5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+aWQsIGNwLT5kZXZpY2UtPmx1biwgY29tcF9zdGF0dXMsCi0JCSAgICBzY3NpX3N0YXR1cykpOwotCiAJCXJlc2lkID0gcmVzaWRfbGVuOwogCQlpZiAoc2NzaV9zdGF0dXMgJiBTU19SRVNJRFVBTF9VTkRFUikgewogCQkJY3AtPnJlc2lkID0gcmVzaWQ7CiAJCQlDTURfUkVTSURfTEVOKGNwKSA9IHJlc2lkOworCQl9IGVsc2UgeworCQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KKwkJCSAgICAic2NzaSglbGQ6JWQ6JWQpIFVOREVSUlVOIHN0YXR1cyBkZXRlY3RlZCAiCisJCQkgICAgIjB4JXgtMHgleC5cbiIsIGhhLT5ob3N0X25vLCBjcC0+ZGV2aWNlLT5pZCwKKwkJCSAgICBjcC0+ZGV2aWNlLT5sdW4sIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cykpOworCiAJCX0KIAogCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCmluZGV4IDk3NDZjZDEuLjMwOTliMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKQEAgLTE5Niw3ICsxOTYsOSBAQAogCQkJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KIAkJCXFsYTJ4MDBfcG9sbChoYSk7CiAKLQkJCXVkZWxheSgxMCk7IC8qIHY0LjI3ICovCisJCQlpZiAoY29tbWFuZCAhPSBNQkNfTE9BRF9SSVNDX1JBTV9FWFRFTkRFRCAmJgorCQkJICAgICFoYS0+ZmxhZ3MubWJveF9pbnQpCisJCQkJbXNsZWVwKDEwKTsKIAkJfSAvKiB3aGlsZSAqLwogCX0KIApAQCAtMzI1LDk4ICszMjcsOSBAQAogCXJldHVybiBydmFsOwogfQogCi0vKgotICogcWxhMngwMF9sb2FkX3JhbQotICoJTG9hZCBhZGFwdGVyIFJBTSB1c2luZyBETUEuCi0gKgotICogSW5wdXQ6Ci0gKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KLSAqCi0gKiBSZXR1cm5zOgotICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCi0gKgotICogQ29udGV4dDoKLSAqCUtlcm5lbCBjb250ZXh0LgotICovCiBpbnQKLXFsYTJ4MDBfbG9hZF9yYW0oc2NzaV9xbGFfaG9zdF90ICpoYSwgZG1hX2FkZHJfdCByZXFfZG1hLCB1aW50MTZfdCByaXNjX2FkZHIsCi0gICAgdWludDE2X3QgcmlzY19jb2RlX3NpemUpCi17Ci0JaW50IHJ2YWw7Ci0JbWJ4X2NtZF90IG1jOwotCW1ieF9jbWRfdCAqbWNwID0gJm1jOwotCXVpbnQzMl90CXJlcV9sZW47Ci0JZG1hX2FkZHJfdAlubWxfZG1hOwotCXVpbnQzMl90CW5tbF9sZW47Ci0JdWludDMyX3QJbm9ybWFsaXplZDsKLQotCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2xvYWRfcmFtKCVsZCk6IGVudGVyZWQuXG4iLAotCSAgICBoYS0+aG9zdF9ubyk7KQotCi0JcmVxX2xlbiA9IHJpc2NfY29kZV9zaXplOwotCW5tbF9kbWEgPSAwOwotCW5tbF9sZW4gPSAwOwotCi0Jbm9ybWFsaXplZCA9IHFsYTJ4MDBfbm9ybWFsaXplX2RtYV9hZGRyKCZyZXFfZG1hLCAmcmVxX2xlbiwgJm5tbF9kbWEsCi0JICAgICZubWxfbGVuKTsKLQotCS8qIExvYWQgZmlyc3Qgc2VnbWVudCAqLwotCW1jcC0+bWJbMF0gPSBNQkNfTE9BRF9SSVNDX1JBTTsKLQltY3AtPm1iWzFdID0gcmlzY19hZGRyOwotCW1jcC0+bWJbMl0gPSBNU1cocmVxX2RtYSk7Ci0JbWNwLT5tYlszXSA9IExTVyhyZXFfZG1hKTsKLQltY3AtPm1iWzRdID0gKHVpbnQxNl90KXJlcV9sZW47Ci0JbWNwLT5tYls2XSA9IE1TVyhNU0QocmVxX2RtYSkpOwotCW1jcC0+bWJbN10gPSBMU1coTVNEKHJlcV9kbWEpKTsKLQltY3AtPm91dF9tYiA9IE1CWF83fE1CWF82fE1CWF80fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOwotCW1jcC0+aW5fbWIgPSBNQlhfMDsKLQltY3AtPnRvdiA9IDMwOwotCW1jcC0+ZmxhZ3MgPSAwOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKLQotCS8qIExvYWQgc2Vjb25kIHNlZ21lbnQgLSBpZiBuZWNlc3NhcnkgKi8KLQlpZiAobm9ybWFsaXplZCAmJiAocnZhbCA9PSBRTEFfU1VDQ0VTUykpIHsKLQkJbWNwLT5tYlswXSA9IE1CQ19MT0FEX1JJU0NfUkFNOwotCQltY3AtPm1iWzFdID0gcmlzY19hZGRyICsgKHVpbnQxNl90KXJlcV9sZW47Ci0JCW1jcC0+bWJbMl0gPSBNU1cobm1sX2RtYSk7Ci0JCW1jcC0+bWJbM10gPSBMU1cobm1sX2RtYSk7Ci0JCW1jcC0+bWJbNF0gPSAodWludDE2X3Qpbm1sX2xlbjsKLQkJbWNwLT5tYls2XSA9IE1TVyhNU0Qobm1sX2RtYSkpOwotCQltY3AtPm1iWzddID0gTFNXKE1TRChubWxfZG1hKSk7Ci0JCW1jcC0+b3V0X21iID0gTUJYXzd8TUJYXzZ8TUJYXzR8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7Ci0JCW1jcC0+aW5fbWIgPSBNQlhfMDsKLQkJbWNwLT50b3YgPSAzMDsKLQkJbWNwLT5mbGFncyA9IDA7Ci0JCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKLQl9Ci0KLQlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgewotCQkvKiBFbXB0eSAqLwotCQlERUJVRzExKHByaW50aygicWxhMngwMF9sb2FkX3JhbSglbGQpOiBkb25lLlxuIiwgaGEtPmhvc3Rfbm8pOykKLQl9IGVsc2UgewotCQkvKiBFbXB0eSAqLwotCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfbG9hZF9yYW0oJWxkKTogZmFpbGVkLiBydmFsPSV4ICIKLQkJICAgICJtYlswXT0leC5cbiIsIGhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKTspCi0JfQotCXJldHVybiBydmFsOwotfQotCi0vKgotICogcWxhMngwMF9sb2FkX3JhbV9leHQKLSAqCUxvYWQgYWRhcHRlciBleHRlbmRlZCBSQU0gdXNpbmcgRE1BLgotICoKLSAqIElucHV0OgotICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCi0gKgotICogUmV0dXJuczoKLSAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgotICoKLSAqIENvbnRleHQ6Ci0gKglLZXJuZWwgY29udGV4dC4KLSAqLwotaW50Ci1xbGEyeDAwX2xvYWRfcmFtX2V4dChzY3NpX3FsYV9ob3N0X3QgKmhhLCBkbWFfYWRkcl90IHJlcV9kbWEsCi0gICAgdWludDMyX3QgcmlzY19hZGRyLCB1aW50MzJfdCByaXNjX2NvZGVfc2l6ZSkKK3FsYTJ4MDBfbG9hZF9yYW0oc2NzaV9xbGFfaG9zdF90ICpoYSwgZG1hX2FkZHJfdCByZXFfZG1hLCB1aW50MzJfdCByaXNjX2FkZHIsCisgICAgdWludDMyX3QgcmlzY19jb2RlX3NpemUpCiB7CiAJaW50IHJ2YWw7CiAJbWJ4X2NtZF90IG1jOwpAQCAtNDI0LDE0ICszMzcsMjAgQEAKIAogCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CiAKLQltY3AtPm1iWzBdID0gTUJDX0xPQURfUklTQ19SQU1fRVhURU5ERUQ7CisJaWYgKE1TVyhyaXNjX2FkZHIpIHx8IElTX1FMQTI0WFgoaGEpIHx8IElTX1FMQTI1WFgoaGEpKSB7CisJCW1jcC0+bWJbMF0gPSBNQkNfTE9BRF9SSVNDX1JBTV9FWFRFTkRFRDsKKwkJbWNwLT5tYls4XSA9IE1TVyhyaXNjX2FkZHIpOworCQltY3AtPm91dF9tYiA9IE1CWF84fE1CWF8wOworCX0gZWxzZSB7CisJCW1jcC0+bWJbMF0gPSBNQkNfTE9BRF9SSVNDX1JBTTsKKwkJbWNwLT5vdXRfbWIgPSBNQlhfMDsKKwl9CiAJbWNwLT5tYlsxXSA9IExTVyhyaXNjX2FkZHIpOwogCW1jcC0+bWJbMl0gPSBNU1cocmVxX2RtYSk7CiAJbWNwLT5tYlszXSA9IExTVyhyZXFfZG1hKTsKIAltY3AtPm1iWzZdID0gTVNXKE1TRChyZXFfZG1hKSk7CiAJbWNwLT5tYls3XSA9IExTVyhNU0QocmVxX2RtYSkpOwotCW1jcC0+bWJbOF0gPSBNU1cocmlzY19hZGRyKTsKLQltY3AtPm91dF9tYiA9IE1CWF84fE1CWF83fE1CWF82fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+b3V0X21iIHw9IE1CWF83fE1CWF82fE1CWF8zfE1CWF8yfE1CWF8xOwogCWlmIChJU19RTEEyNFhYKGhhKSB8fCBJU19RTEEyNVhYKGhhKSkgewogCQltY3AtPm1iWzRdID0gTVNXKHJpc2NfY29kZV9zaXplKTsKIAkJbWNwLT5tYls1XSA9IExTVyhyaXNjX2NvZGVfc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCmluZGV4IDI0MzA0MzAuLjQ5MTY4NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCkBAIC03MSw2ICs3MSwxMiBAQAogCQkiRW5hYmxlcyBGRE1JIHJlZ2lzdHJhdG9ucyAiCiAJCSJEZWZhdWx0IGlzIDAgLSBubyBGRE1JLiAxIC0gcGVyZm9tIEZETUkuIik7CiAKK2ludCBxbDJ4cHJvY2Vzc3JzY247Cittb2R1bGVfcGFyYW0ocWwyeHByb2Nlc3Nyc2NuLCBpbnQsIFNfSVJVR098U19JUlVTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsMnhwcm9jZXNzcnNjbiwKKwkJIk9wdGlvbiB0byBlbmFibGUgcG9ydCBSU0NOIGhhbmRsaW5nIHZpYSBhIHNlcmllcyBvZiBsZXNzIgorCQkiZmFicmljIGludHJ1c2l2ZSBBRElTQ3MgYW5kIFBMT0dJcy4iKTsKKwogLyoKICAqIFNDU0kgaG9zdCB0ZW1wbGF0ZSBlbnRyeSBwb2ludHMKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCmluZGV4IGQ1NGQyYTkuLmY0ZDc1NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKQEAgLTU3Myw2ICs1NzMsOSBAQAogCQl9CiAJfSB3aGlsZSAoMCk7CiAKKwkvKiBFbmFibGUgZmxhc2ggd3JpdGUtcHJvdGVjdGlvbi4gKi8KKwlxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLCBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MTAxKSwgMHg5Yyk7CisKIAkvKiBEaXNhYmxlIGZsYXNoIHdyaXRlLiAqLwogCVdSVF9SRUdfRFdPUkQoJnJlZy0+Y3RybF9zdGF0dXMsCiAJICAgIFJEX1JFR19EV09SRCgmcmVnLT5jdHJsX3N0YXR1cykgJiB+Q1NSWF9GTEFTSF9FTkFCTEUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKaW5kZXggZjc5MzdmNy4uZDUzNzE5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCkBAIC03LDkgKzcsOSBAQAogLyoKICAqIERyaXZlciB2ZXJzaW9uCiAgKi8KLSNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDEuMDMtayIKKyNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDEuMDQtayIKIAogI2RlZmluZSBRTEFfRFJJVkVSX01BSk9SX1ZFUgk4CiAjZGVmaW5lIFFMQV9EUklWRVJfTUlOT1JfVkVSCTEKLSNkZWZpbmUgUUxBX0RSSVZFUl9QQVRDSF9WRVIJMworI2RlZmluZSBRTEFfRFJJVkVSX1BBVENIX1ZFUgk0CiAjZGVmaW5lIFFMQV9EUklWRVJfQkVUQV9WRVIJMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3JhaWRfY2xhc3MuYyBiL2RyaXZlcnMvc2NzaS9yYWlkX2NsYXNzLmMKaW5kZXggNWVjNWY0NC4uNTBjMzk4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3JhaWRfY2xhc3MuYworKysgYi9kcml2ZXJzL3Njc2kvcmFpZF9jbGFzcy5jCkBAIC0xNDgsOSArMTQ4LDExIEBACiAJeyBSQUlEX0xFVkVMX0xJTkVBUiwgImxpbmVhciIgfSwKIAl7IFJBSURfTEVWRUxfMCwgInJhaWQwIiB9LAogCXsgUkFJRF9MRVZFTF8xLCAicmFpZDEiIH0sCisJeyBSQUlEX0xFVkVMXzEwLCAicmFpZDEwIiB9LAogCXsgUkFJRF9MRVZFTF8zLCAicmFpZDMiIH0sCiAJeyBSQUlEX0xFVkVMXzQsICJyYWlkNCIgfSwKIAl7IFJBSURfTEVWRUxfNSwgInJhaWQ1IiB9LAorCXsgUkFJRF9MRVZFTF81MCwgInJhaWQ1MCIgfSwKIAl7IFJBSURfTEVWRUxfNiwgInJhaWQ2IiB9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKaW5kZXggZWU1ZjRkZi4uMjQ1Y2E5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KQEAgLTIwOSw3ICsyMTAsNyBAQAogCS5nZnBfbWFzawk9IF9fR0ZQX0RNQSwKIH07CiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKGhvc3RfY21kX3Bvb2xfbXV0ZXgpOworc3RhdGljIERFRklORV9NVVRFWChob3N0X2NtZF9wb29sX211dGV4KTsKIAogc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgKl9fc2NzaV9nZXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKIAkJCQkJICAgIGdmcF90IGdmcF9tYXNrKQpAQCAtMzMwLDcgKzMzMSw3IEBACiAJICogU2VsZWN0IGEgY29tbWFuZCBzbGFiIGZvciB0aGlzIGhvc3QgYW5kIGNyZWF0ZSBpdCBpZiBub3QKIAkgKiB5ZXQgZXhpc3RhbnQuCiAJICovCi0JZG93bigmaG9zdF9jbWRfcG9vbF9tdXRleCk7CisJbXV0ZXhfbG9jaygmaG9zdF9jbWRfcG9vbF9tdXRleCk7CiAJcG9vbCA9IChzaG9zdC0+dW5jaGVja2VkX2lzYV9kbWEgPyAmc2NzaV9jbWRfZG1hX3Bvb2wgOiAmc2NzaV9jbWRfcG9vbCk7CiAJaWYgKCFwb29sLT51c2VycykgewogCQlwb29sLT5zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUocG9vbC0+bmFtZSwKQEAgLTM0Miw3ICszNDMsNyBAQAogCiAJcG9vbC0+dXNlcnMrKzsKIAlzaG9zdC0+Y21kX3Bvb2wgPSBwb29sOwotCXVwKCZob3N0X2NtZF9wb29sX211dGV4KTsKKwltdXRleF91bmxvY2soJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOwogCiAJLyoKIAkgKiBHZXQgb25lIGJhY2t1cCBjb21tYW5kIGZvciB0aGlzIGhvc3QuCkBAIC0zNTksNyArMzYwLDcgQEAKIAkJa21lbV9jYWNoZV9kZXN0cm95KHBvb2wtPnNsYWIpOwogCXJldHVybiAtRU5PTUVNOwogIGZhaWw6Ci0JdXAoJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaG9zdF9jbWRfcG9vbF9tdXRleCk7CiAJcmV0dXJuIC1FTk9NRU07CiAKIH0KQEAgLTM4MSwxMCArMzgyLDEwIEBACiAJCWttZW1fY2FjaGVfZnJlZShzaG9zdC0+Y21kX3Bvb2wtPnNsYWIsIGNtZCk7CiAJfQogCi0JZG93bigmaG9zdF9jbWRfcG9vbF9tdXRleCk7CisJbXV0ZXhfbG9jaygmaG9zdF9jbWRfcG9vbF9tdXRleCk7CiAJaWYgKCEtLXNob3N0LT5jbWRfcG9vbC0+dXNlcnMpCiAJCWttZW1fY2FjaGVfZGVzdHJveShzaG9zdC0+Y21kX3Bvb2wtPnNsYWIpOwotCXVwKCZob3N0X2NtZF9wb29sX211dGV4KTsKKwltdXRleF91bmxvY2soJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOwogfQogCiAjaWZkZWYgQ09ORklHX1NDU0lfTE9HR0lORwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKaW5kZXggM2RlZDlkYS4uMGU1MjlmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCkBAIC0yMjEsOCArMjIxLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzZGVidWdfZHJpdmVyZnNfZHJpdmVyID0gewogCS5uYW1lIAkJPSBzZGVidWdfcHJvY19uYW1lLAogCS5idXMJCT0gJnBzZXVkb19sbGRfYnVzLAotCS5wcm9iZSAgICAgICAgICA9IHNkZWJ1Z19kcml2ZXJfcHJvYmUsCi0JLnJlbW92ZSAgICAgICAgID0gc2RlYnVnX2RyaXZlcl9yZW1vdmUsCiB9OwogCiBzdGF0aWMgY29uc3QgaW50IGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQgPQpAQCAtMTc5Niw2ICsxNzk0LDggQEAKIHN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgcHNldWRvX2xsZF9idXMgPSB7CiAgICAgICAgIC5uYW1lID0gInBzZXVkbyIsCiAgICAgICAgIC5tYXRjaCA9IHBzZXVkb19sbGRfYnVzX21hdGNoLAorCS5wcm9iZSA9IHNkZWJ1Z19kcml2ZXJfcHJvYmUsCisJLnJlbW92ZSA9IHNkZWJ1Z19kcml2ZXJfcmVtb3ZlLAogfTsKIAogc3RhdGljIHZvaWQgc2RlYnVnX3JlbGVhc2VfYWRhcHRlcihzdHJ1Y3QgZGV2aWNlICogZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwppbmRleCAwMGM5YmYzLi4zNTc0YmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwpAQCAtMTIxMiw3ICsxMjEyLDcgQEAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKLXN0YXRpYyB2b2lkIHNjc2lfZ2VuZXJpY19kb25lKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3N0YXRpYyB2b2lkIHNjc2lfYmxrX3BjX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCUJVR19PTighYmxrX3BjX3JlcXVlc3QoY21kLT5yZXF1ZXN0KSk7CiAJLyoKQEAgLTEyMjQsNyArMTIyNCw3IEBACiAJc2NzaV9pb19jb21wbGV0aW9uKGNtZCwgY21kLT5idWZmbGVuLCAwKTsKIH0KIAotdm9pZCBzY3NpX3NldHVwX2Jsa19wY19jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3N0YXRpYyB2b2lkIHNjc2lfc2V0dXBfYmxrX3BjX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBjbWQtPnJlcXVlc3Q7CiAKQEAgLTEyNDEsOCArMTI0MSw4IEBACiAJY21kLT50cmFuc2ZlcnNpemUgPSByZXEtPmRhdGFfbGVuOwogCWNtZC0+YWxsb3dlZCA9IHJlcS0+cmV0cmllczsKIAljbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgPSByZXEtPnRpbWVvdXQ7CisJY21kLT5kb25lID0gc2NzaV9ibGtfcGNfZG9uZTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHNjc2lfc2V0dXBfYmxrX3BjX2NtbmQpOwogCiBzdGF0aWMgaW50IHNjc2lfcHJlcF9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKQEAgLTEzMzksNyArMTMzOSw2IEBACiAJICogaGFwcGVuaW5nIG5vdy4KIAkgKi8KIAlpZiAocmVxLT5mbGFncyAmIChSRVFfQ01EIHwgUkVRX0JMT0NLX1BDKSkgewotCQlzdHJ1Y3Qgc2NzaV9kcml2ZXIgKmRydjsKIAkJaW50IHJldDsKIAogCQkvKgpAQCAtMTM3MSwxNiArMTM3MCwxNyBAQAogCQkvKgogCQkgKiBJbml0aWFsaXplIHRoZSBhY3R1YWwgU0NTSSBjb21tYW5kIGZvciB0aGlzIHJlcXVlc3QuCiAJCSAqLwotCQlpZiAocmVxLT5ycV9kaXNrKSB7CisJCWlmIChyZXEtPmZsYWdzICYgUkVRX0JMT0NLX1BDKSB7CisJCQlzY3NpX3NldHVwX2Jsa19wY19jbW5kKGNtZCk7CisJCX0gZWxzZSBpZiAocmVxLT5ycV9kaXNrKSB7CisJCQlzdHJ1Y3Qgc2NzaV9kcml2ZXIgKmRydjsKKwogCQkJZHJ2ID0gKihzdHJ1Y3Qgc2NzaV9kcml2ZXIgKiopcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CiAJCQlpZiAodW5saWtlbHkoIWRydi0+aW5pdF9jb21tYW5kKGNtZCkpKSB7CiAJCQkJc2NzaV9yZWxlYXNlX2J1ZmZlcnMoY21kKTsKIAkJCQlzY3NpX3B1dF9jb21tYW5kKGNtZCk7CiAJCQkJZ290byBraWxsOwogCQkJfQotCQl9IGVsc2UgewotCQkJc2NzaV9zZXR1cF9ibGtfcGNfY21uZChjbWQpOwotCQkJY21kLT5kb25lID0gc2NzaV9nZW5lcmljX2RvbmU7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaCBiL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaAppbmRleCAxNGE2MTk4Li4yN2M0ODI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCkBAIC0yNiwxMiArMjYsNiBAQAogI2RlZmluZSBTQ1NJX1NFTlNFX1ZBTElEKHNjbWQpIFwKIAkoKChzY21kKS0+c2Vuc2VfYnVmZmVyWzBdICYgMHg3MCkgPT0gMHg3MCkKIAotLyoKLSAqIFNwZWNpYWwgdmFsdWUgZm9yIHNjYW5uaW5nIHRvIHNwZWNpZnkgc2Nhbm5pbmcgb3IgcmVzY2FubmluZyBvZiBhbGwKLSAqIHBvc3NpYmxlIGNoYW5uZWxzLCAodGFyZ2V0KSBpZHMsIG9yIGx1bnMgb24gYSBnaXZlbiBzaG9zdC4KLSAqLwotI2RlZmluZSBTQ0FOX1dJTERfQ0FSRAl+MAotCiAvKiBob3N0cy5jICovCiBleHRlcm4gaW50IHNjc2lfaW5pdF9ob3N0cyh2b2lkKTsKIGV4dGVybiB2b2lkIHNjc2lfZXhpdF9ob3N0cyh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3Byb2MuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3Byb2MuYwppbmRleCBhNTA5NThiLi4wN2JlNjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9wcm9jLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJvYy5jCkBAIC0yNSwxMSArMjUsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgogCiAjaW5jbHVkZSAic2NzaV9wcml2LmgiCiAjaW5jbHVkZSAic2NzaV9sb2dnaW5nLmgiCkBAIC00MSw3ICs0Myw3IEBACiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3Njc2k7CiAKIC8qIFByb3RlY3Qgc2h0LT5wcmVzZW50IGFuZCBzaHQtPnByb2NfZGlyICovCi1zdGF0aWMgREVDTEFSRV9NVVRFWChnbG9iYWxfaG9zdF90ZW1wbGF0ZV9zZW0pOworc3RhdGljIERFRklORV9NVVRFWChnbG9iYWxfaG9zdF90ZW1wbGF0ZV9tdXRleCk7CiAKIHN0YXRpYyBpbnQgcHJvY19zY3NpX3JlYWQoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKIAkJCSAgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCkBAIC04Myw3ICs4NSw3IEBACiAJaWYgKCFzaHQtPnByb2NfaW5mbykKIAkJcmV0dXJuOwogCi0JZG93bigmZ2xvYmFsX2hvc3RfdGVtcGxhdGVfc2VtKTsKKwltdXRleF9sb2NrKCZnbG9iYWxfaG9zdF90ZW1wbGF0ZV9tdXRleCk7CiAJaWYgKCFzaHQtPnByZXNlbnQrKykgewogCQlzaHQtPnByb2NfZGlyID0gcHJvY19ta2RpcihzaHQtPnByb2NfbmFtZSwgcHJvY19zY3NpKTsKICAgICAgICAgCWlmICghc2h0LT5wcm9jX2RpcikKQEAgLTkyLDcgKzk0LDcgQEAKIAkJZWxzZQogCQkJc2h0LT5wcm9jX2Rpci0+b3duZXIgPSBzaHQtPm1vZHVsZTsKIAl9Ci0JdXAoJmdsb2JhbF9ob3N0X3RlbXBsYXRlX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZnbG9iYWxfaG9zdF90ZW1wbGF0ZV9tdXRleCk7CiB9CiAKIHZvaWQgc2NzaV9wcm9jX2hvc3RkaXJfcm0oc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0KQpAQCAtMTAwLDEyICsxMDIsMTIgQEAKIAlpZiAoIXNodC0+cHJvY19pbmZvKQogCQlyZXR1cm47CiAKLQlkb3duKCZnbG9iYWxfaG9zdF90ZW1wbGF0ZV9zZW0pOworCW11dGV4X2xvY2soJmdsb2JhbF9ob3N0X3RlbXBsYXRlX211dGV4KTsKIAlpZiAoIS0tc2h0LT5wcmVzZW50ICYmIHNodC0+cHJvY19kaXIpIHsKIAkJcmVtb3ZlX3Byb2NfZW50cnkoc2h0LT5wcm9jX25hbWUsIHByb2Nfc2NzaSk7CiAJCXNodC0+cHJvY19kaXIgPSBOVUxMOwogCX0KLQl1cCgmZ2xvYmFsX2hvc3RfdGVtcGxhdGVfc2VtKTsKKwltdXRleF91bmxvY2soJmdsb2JhbF9ob3N0X3RlbXBsYXRlX211dGV4KTsKIH0KIAogdm9pZCBzY3NpX3Byb2NfaG9zdF9hZGQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCkBAIC0xOTksNyArMjAxLDEwIEBACiAJaWYgKElTX0VSUihzaG9zdCkpCiAJCXJldHVybiBQVFJfRVJSKHNob3N0KTsKIAotCWVycm9yID0gc2NzaV9zY2FuX2hvc3Rfc2VsZWN0ZWQoc2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4sIDEpOworCWlmIChzaG9zdC0+dHJhbnNwb3J0dC0+dXNlcl9zY2FuKQorCQllcnJvciA9IHNob3N0LT50cmFuc3BvcnR0LT51c2VyX3NjYW4oc2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4pOworCWVsc2UKKwkJZXJyb3IgPSBzY3NpX3NjYW5faG9zdF9zZWxlY3RlZChzaG9zdCwgY2hhbm5lbCwgaWQsIGx1biwgMSk7CiAJc2NzaV9ob3N0X3B1dChzaG9zdCk7CiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCmluZGV4IDA1ZWJiOWMuLjc1MmZiNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKQEAgLTMzNCwxOSArMzM0LDYgQEAKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQ7CiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpmb3VuZF90YXJnZXQ7CiAKLQkvKgotCSAqIE9idGFpbiB0aGUgcmVhbCBwYXJlbnQgZnJvbSB0aGUgdHJhbnNwb3J0LiBUaGUgdHJhbnNwb3J0Ci0JICogaXMgYWxsb3dlZCB0byBmYWlsIChubyBlcnJvcikgaWYgdGhlcmUgaXMgbm90aGluZyBhdCB0aGF0Ci0JICogdGFyZ2V0IGlkLgotCSAqLwotCWlmIChzaG9zdC0+dHJhbnNwb3J0dC0+dGFyZ2V0X3BhcmVudCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JCXBhcmVudCA9IHNob3N0LT50cmFuc3BvcnR0LT50YXJnZXRfcGFyZW50KHNob3N0LCBjaGFubmVsLCBpZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCQlpZiAoIXBhcmVudCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQogCXN0YXJnZXQgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghc3RhcmdldCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC0xMjgzLDIwICsxMjcwLDIxIEBACiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwogCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9ICZzaG9zdC0+c2hvc3RfZ2VuZGV2OwogCWludCByZXM7Ci0Jc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2NzaV9hbGxvY190YXJnZXQocGFyZW50LCBjaGFubmVsLCBpZCk7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OwogCisJc3RhcmdldCA9IHNjc2lfYWxsb2NfdGFyZ2V0KHBhcmVudCwgY2hhbm5lbCwgaWQpOwogCWlmICghc3RhcmdldCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlnZXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOwotCWRvd24oJnNob3N0LT5zY2FuX211dGV4KTsKKwltdXRleF9sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAJaWYgKHNjc2lfaG9zdF9zY2FuX2FsbG93ZWQoc2hvc3QpKSB7CiAJCXJlcyA9IHNjc2lfcHJvYmVfYW5kX2FkZF9sdW4oc3RhcmdldCwgbHVuLCBOVUxMLCAmc2RldiwgMSwKIAkJCQkJICAgICBob3N0ZGF0YSk7CiAJCWlmIChyZXMgIT0gU0NTSV9TQ0FOX0xVTl9QUkVTRU5UKQogCQkJc2RldiA9IEVSUl9QVFIoLUVOT0RFVik7CiAJfQotCXVwKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAJc2NzaV90YXJnZXRfcmVhcChzdGFyZ2V0KTsKIAlwdXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOwogCkBAIC0xNDA0LDEwICsxMzkyLDEwIEBACiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3QocGFyZW50KTsKIAotCWRvd24oJnNob3N0LT5zY2FuX211dGV4KTsKKwltdXRleF9sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAJaWYgKHNjc2lfaG9zdF9zY2FuX2FsbG93ZWQoc2hvc3QpKQogCQlfX3Njc2lfc2Nhbl90YXJnZXQocGFyZW50LCBjaGFubmVsLCBpZCwgbHVuLCByZXNjYW4pOwotCXVwKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfc2Nhbl90YXJnZXQpOwogCkBAIC0xNDU0LDcgKzE0NDIsNyBAQAogCSAgICAoKGx1biAhPSBTQ0FOX1dJTERfQ0FSRCkgJiYgKGx1biA+IHNob3N0LT5tYXhfbHVuKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZG93bigmc2hvc3QtPnNjYW5fbXV0ZXgpOworCW11dGV4X2xvY2soJnNob3N0LT5zY2FuX211dGV4KTsKIAlpZiAoc2NzaV9ob3N0X3NjYW5fYWxsb3dlZChzaG9zdCkpIHsKIAkJaWYgKGNoYW5uZWwgPT0gU0NBTl9XSUxEX0NBUkQpCiAJCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDw9IHNob3N0LT5tYXhfY2hhbm5lbDsKQEAgLTE0NjQsNyArMTQ1Miw3IEBACiAJCWVsc2UKIAkJCXNjc2lfc2Nhbl9jaGFubmVsKHNob3N0LCBjaGFubmVsLCBpZCwgbHVuLCByZXNjYW4pOwogCX0KLQl1cCgmc2hvc3QtPnNjYW5fbXV0ZXgpOworCW11dGV4X3VubG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTIyLDcgKzE1MTAsNyBAQAogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IE5VTEw7CiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OwogCi0JZG93bigmc2hvc3QtPnNjYW5fbXV0ZXgpOworCW11dGV4X2xvY2soJnNob3N0LT5zY2FuX211dGV4KTsKIAlpZiAoIXNjc2lfaG9zdF9zY2FuX2FsbG93ZWQoc2hvc3QpKQogCQlnb3RvIG91dDsKIAlzdGFyZ2V0ID0gc2NzaV9hbGxvY190YXJnZXQoJnNob3N0LT5zaG9zdF9nZW5kZXYsIDAsIHNob3N0LT50aGlzX2lkKTsKQEAgLTE1MzYsNyArMTUyNCw3IEBACiAJfQogCXB1dF9kZXZpY2UoJnN0YXJnZXQtPmRldik7CiAgb3V0OgotCXVwKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAJcmV0dXJuIHNkZXY7CiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfZ2V0X2hvc3RfZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCmluZGV4IGVhN2YzYTQuLmE3N2IzMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwpAQCAtMTA2LDcgKzEwNiwxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoY2hlY2tfc2V0KCZsdW4sIHMzKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcmVzID0gc2NzaV9zY2FuX2hvc3Rfc2VsZWN0ZWQoc2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4sIDEpOworCWlmIChzaG9zdC0+dHJhbnNwb3J0dC0+dXNlcl9zY2FuKQorCQlyZXMgPSBzaG9zdC0+dHJhbnNwb3J0dC0+dXNlcl9zY2FuKHNob3N0LCBjaGFubmVsLCBpZCwgbHVuKTsKKwllbHNlCisJCXJlcyA9IHNjc2lfc2Nhbl9ob3N0X3NlbGVjdGVkKHNob3N0LCBjaGFubmVsLCBpZCwgbHVuLCAxKTsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC03NDUsOSArNzQ4LDkgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHNkZXYtPmhvc3Q7CiAKLQlkb3duKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisJbXV0ZXhfbG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCV9fc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYpOwotCXVwKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfcmVtb3ZlX2RldmljZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKaW5kZXggNjg1Yjk5Ny4uZjJjOWFjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKQEAgLTI5NSw2ICsyOTUsNyBAQAogCSAqLwogCWZjX2hvc3Rfbm9kZV9uYW1lKHNob3N0KSA9IC0xOwogCWZjX2hvc3RfcG9ydF9uYW1lKHNob3N0KSA9IC0xOworCWZjX2hvc3RfcGVybWFuZW50X3BvcnRfbmFtZShzaG9zdCkgPSAtMTsKIAlmY19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzKHNob3N0KSA9IEZDX0NPU19VTlNQRUNJRklFRDsKIAltZW1zZXQoZmNfaG9zdF9zdXBwb3J0ZWRfZmM0cyhzaG9zdCksIDAsCiAJCXNpemVvZihmY19ob3N0X3N1cHBvcnRlZF9mYzRzKHNob3N0KSkpOwpAQCAtNzk1LDYgKzc5Niw4IEBACiAKIGZjX3ByaXZhdGVfaG9zdF9yZF9hdHRyX2Nhc3Qobm9kZV9uYW1lLCAiMHglbGx4XG4iLCAyMCwgdW5zaWduZWQgbG9uZyBsb25nKTsKIGZjX3ByaXZhdGVfaG9zdF9yZF9hdHRyX2Nhc3QocG9ydF9uYW1lLCAiMHglbGx4XG4iLCAyMCwgdW5zaWduZWQgbG9uZyBsb25nKTsKK2ZjX3ByaXZhdGVfaG9zdF9yZF9hdHRyX2Nhc3QocGVybWFuZW50X3BvcnRfbmFtZSwgIjB4JWxseFxuIiwgMjAsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyk7CiBmY19wcml2YXRlX2hvc3RfcmRfYXR0cihzeW1ib2xpY19uYW1lLCAiJXNcbiIsIChGQ19TWU1CT0xJQ19OQU1FX1NJWkUgKzEpKTsKIGZjX3ByaXZhdGVfaG9zdF9yZF9hdHRyKG1heGZyYW1lX3NpemUsICIldSBieXRlc1xuIiwgMjApOwogZmNfcHJpdmF0ZV9ob3N0X3JkX2F0dHIoc2VyaWFsX251bWJlciwgIiVzXG4iLCAoRkNfU0VSSUFMX05VTUJFUl9TSVpFICsxKSk7CkBAIC0xMDkwLDE3ICsxMDkzLDIzIEBACiAvKgogICogTXVzdCBiZSBjYWxsZWQgd2l0aCBzaG9zdC0+aG9zdF9sb2NrIGhlbGQKICAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2UgKmZjX3RhcmdldF9wYXJlbnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCi0JCQkJCWludCBjaGFubmVsLCB1aW50IGlkKQorc3RhdGljIGludCBmY191c2VyX3NjYW4oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVpbnQgY2hhbm5lbCwKKwkJdWludCBpZCwgdWludCBsdW4pCiB7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocnBvcnQsICZmY19ob3N0X3Jwb3J0cyhzaG9zdCksIHBlZXJzKQotCQlpZiAoKHJwb3J0LT5jaGFubmVsID09IGNoYW5uZWwpICYmCi0JCSAgICAocnBvcnQtPnNjc2lfdGFyZ2V0X2lkID09IGlkKSkKLQkJCXJldHVybiAmcnBvcnQtPmRldjsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJwb3J0LCAmZmNfaG9zdF9ycG9ydHMoc2hvc3QpLCBwZWVycykgeworCQlpZiAocnBvcnQtPnNjc2lfdGFyZ2V0X2lkID09IC0xKQorCQkJY29udGludWU7CiAKLQlyZXR1cm4gTlVMTDsKKwkJaWYgKChjaGFubmVsID09IFNDQU5fV0lMRF9DQVJEIHx8IGNoYW5uZWwgPT0gcnBvcnQtPmNoYW5uZWwpICYmCisJCSAgICAoaWQgPT0gU0NBTl9XSUxEX0NBUkQgfHwgaWQgPT0gcnBvcnQtPnNjc2lfdGFyZ2V0X2lkKSkgeworCQkJc2NzaV9zY2FuX3RhcmdldCgmcnBvcnQtPmRldiwgcnBvcnQtPmNoYW5uZWwsCisJCQkJCSBycG9ydC0+c2NzaV90YXJnZXRfaWQsIGx1biwgMSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICoKQEAgLTExMzksNyArMTE0OCw3IEBACiAJLyogVHJhbnNwb3J0IHVzZXMgdGhlIHNob3N0IHdvcmtxIGZvciBzY3NpIHNjYW5uaW5nICovCiAJaS0+dC5jcmVhdGVfd29ya19xdWV1ZSA9IDE7CiAKLQlpLT50LnRhcmdldF9wYXJlbnQgPSBmY190YXJnZXRfcGFyZW50OworCWktPnQudXNlcl9zY2FuID0gZmNfdXNlcl9zY2FuOwogCQogCS8qCiAJICogU2V0dXAgU0NTSSBUYXJnZXQgQXR0cmlidXRlcy4KQEAgLTExNjAsNiArMTE2OSw3IEBACiAJY291bnQ9MDsKIAlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChub2RlX25hbWUpOwogCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKHBvcnRfbmFtZSk7CisJU0VUVVBfSE9TVF9BVFRSSUJVVEVfUkQocGVybWFuZW50X3BvcnRfbmFtZSk7CiAJU0VUVVBfSE9TVF9BVFRSSUJVVEVfUkQoc3VwcG9ydGVkX2NsYXNzZXMpOwogCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKHN1cHBvcnRlZF9mYzRzKTsKIAlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChzeW1ib2xpY19uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKaW5kZXggZTA4NDYyZC4uNTlhMWM5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKQEAgLTIxLDExICsyMSw5IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KLQogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgpAQCAtNDUsMTEgKzQzLDYgQEAKIAkgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHNlc3Npb25zOwogCS8qCi0JICogbG9jayB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBzZXNzaW9ucyBsaXN0IHdoaWNoIG11c3QKLQkgKiBiZSB0YWtlbiBhZnRlciB0aGUgcnhfcXVldWVfc2VtYQotCSAqLwotCXNwaW5sb2NrX3Qgc2Vzc2lvbl9sb2NrOwotCS8qCiAJICogYmFzZWQgb24gdHJhbnNwb3J0IGNhcGFiaWxpdGllcywgYXQgcmVnaXN0ZXIgdGltZSB3ZSBzZXQgdGhlc2UKIAkgKiBiaXRzIHRvIHRlbGwgdGhlIHRyYW5zcG9ydCBjbGFzcyBpdCB3YW50cyBhdHRyaWJ1dGVzIGRpc3BsYXllZAogCSAqIGluIHN5c2ZzIG9yIHRoYXQgaXQgY2FuIHN1cHBvcnQgZGlmZmVyZW50IGlTQ1NJIERhdGEtUGF0aApAQCAtNzAsNyArNjMsNyBAQAogLyoKICAqIGxpc3Qgb2YgcmVnaXN0ZXJlZCB0cmFuc3BvcnRzIGFuZCBsb2NrIHRoYXQgbXVzdAogICogYmUgaGVsZCB3aGlsZSBhY2Nlc3NpbmcgbGlzdC4gVGhlIGlzY3NpX3RyYW5zcG9ydF9sb2NrIG11c3QKLSAqIGJlIGFjcXVpcmVkIGFmdGVyIHRoZSByeF9xdWV1ZV9zZW1hLgorICogYmUgYWNxdWlyZWQgYWZ0ZXIgdGhlIHJ4X3F1ZXVlX211dGV4LgogICovCiBzdGF0aWMgTElTVF9IRUFEKGlzY3NpX3RyYW5zcG9ydHMpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhpc2NzaV90cmFuc3BvcnRfbG9jayk7CkBAIC0xNDUsNyArMTM4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBzb2NrICpubHM7CiBzdGF0aWMgaW50IGRhZW1vbl9waWQ7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChyeF9xdWV1ZV9zZW1hKTsKK3N0YXRpYyBERUZJTkVfTVVURVgocnhfcXVldWVfbXV0ZXgpOwogCiBzdHJ1Y3QgbWVtcG9vbF96b25lIHsKIAltZW1wb29sX3QgKnBvb2w7CkBAIC0xNTYsNyArMTQ5LDcgQEAKIAlzcGlubG9ja190IGZyZWVsb2NrOwogfTsKIAotc3RhdGljIHN0cnVjdCBtZW1wb29sX3pvbmUgel9yZXBseTsKK3N0YXRpYyBzdHJ1Y3QgbWVtcG9vbF96b25lICp6X3JlcGx5OwogCiAvKgogICogWl9NQVhfKiAtIGFjdHVhbCBtZW1wb29sIHNpemUgYWxsb2NhdGVkIGF0IHRoZSBtZW1wb29sX3pvbmVfaW5pdCgpIHRpbWUKQEAgLTE3MSw1MCArMTY0LDI3MSBAQAogI2RlZmluZSBaX01BWF9FUlJPUgkxNgogI2RlZmluZSBaX0hJV0FUX0VSUk9SCTEyCiAKLXN0cnVjdCBpc2NzaV9pZl9jb25uIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGNvbm5fbGlzdDsJLyogaXRlbSBpbiBjb25ubGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgc2Vzc2lvbl9saXN0OwkvKiBpdGVtIGluIHNlc3Npb24tPmNvbm5lY3Rpb25zICovCi0JaXNjc2lfY29ubmhfdCBjb25uaDsKLQlpbnQgYWN0aXZlOwkJCS8qIG11c3QgYmUgYWNjZXNzZWQgd2l0aCB0aGUgY29ubmxvY2sgKi8KLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwkJLyogb3JpZ2luYXRlZCBzaG9zdCAqLwotCXN0cnVjdCBkZXZpY2UgZGV2OwkJLyogc3lzZnMgdHJhbnNwb3J0L2NvbnRhaW5lciBkZXZpY2UgKi8KLQlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7Ci0Jc3RydWN0IG1lbXBvb2xfem9uZSB6X2Vycm9yOwotCXN0cnVjdCBtZW1wb29sX3pvbmUgel9wZHU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlcXVldWU7Ci19OwotCi0jZGVmaW5lIGlzY3NpX2Rldl90b19pZl9jb25uKF9kZXYpIFwKLQljb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGlzY3NpX2lmX2Nvbm4sIGRldikKLQotI2RlZmluZSBpc2NzaV9jZGV2X3RvX2lmX2Nvbm4oX2NkZXYpIFwKLQlpc2NzaV9kZXZfdG9faWZfY29ubihfY2Rldi0+ZGV2KQotCiBzdGF0aWMgTElTVF9IRUFEKGNvbm5saXN0KTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY29ubmxvY2spOwogCi1zdHJ1Y3QgaXNjc2lfaWZfc2Vzc2lvbiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBpdGVtIGluIHNlc3Npb25fbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgY29ubmVjdGlvbnM7Ci0JaXNjc2lfc2Vzc2lvbmhfdCBzZXNzaW9uaDsKLQlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7Ci0Jc3RydWN0IGRldmljZSBkZXY7CS8qIHN5c2ZzIHRyYW5zcG9ydC9jb250YWluZXIgZGV2aWNlICovCi19OworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGJ5IExMRHMgdGhhdCBhbGxvY2F0ZQorICogdGhlaXIgb3duIHNjc2lfaG9zdHMgb3IgYnkgc29mdHdhcmUgaXNjc2kgTExEcworICovCitzdGF0aWMgdm9pZCBpc2NzaV9zZXNzaW9uX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbiA9IGlzY3NpX2Rldl90b19zZXNzaW9uKGRldik7CisJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gc2Vzc2lvbi0+dHJhbnNwb3J0OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwogCi0jZGVmaW5lIGlzY3NpX2Rldl90b19pZl9zZXNzaW9uKF9kZXYpIFwKLQljb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGlzY3NpX2lmX3Nlc3Npb24sIGRldikKKwlzaG9zdCA9IGlzY3NpX3Nlc3Npb25fdG9fc2hvc3Qoc2Vzc2lvbik7CisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CisJa2ZyZWUoc2Vzc2lvbik7CisJbW9kdWxlX3B1dCh0cmFuc3BvcnQtPm93bmVyKTsKK30KIAotI2RlZmluZSBpc2NzaV9jZGV2X3RvX2lmX3Nlc3Npb24oX2NkZXYpIFwKLQlpc2NzaV9kZXZfdG9faWZfc2Vzc2lvbihfY2Rldi0+ZGV2KQorc3RhdGljIGludCBpc2NzaV9pc19zZXNzaW9uX2Rldihjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+cmVsZWFzZSA9PSBpc2NzaV9zZXNzaW9uX3JlbGVhc2U7Cit9CiAKLSNkZWZpbmUgaXNjc2lfaWZfc2Vzc2lvbl90b19zaG9zdChfc2Vzc2lvbikgXAotCWRldl90b19zaG9zdChfc2Vzc2lvbi0+ZGV2LnBhcmVudCkKKy8qKgorICogaXNjc2lfY3JlYXRlX3Nlc3Npb24gLSBjcmVhdGUgaXNjc2kgY2xhc3Mgc2Vzc2lvbgorICogQHNob3N0OiBzY3NpIGhvc3QKKyAqIEB0cmFuc3BvcnQ6IGlzY3NpIHRyYW5zcG9ydAorICoKKyAqIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIGEgTExEIG9yIGlzY3NpX3RyYW5zcG9ydAorICoqLworc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICoKK2lzY3NpX2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uOworCWludCBlcnI7CiAKLXN0YXRpYyBzdHJ1Y3QgaXNjc2lfaWZfY29ubioKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHRyYW5zcG9ydC0+b3duZXIpKQorCQlyZXR1cm4gTlVMTDsKKworCXNlc3Npb24gPSBremFsbG9jKHNpemVvZigqc2Vzc2lvbiksIEdGUF9LRVJORUwpOworCWlmICghc2Vzc2lvbikKKwkJZ290byBtb2R1bGVfcHV0OworCXNlc3Npb24tPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKworCS8qIHRoaXMgaXMgcmVsZWFzZWQgaW4gdGhlIGRldidzIHJlbGVhc2UgZnVuY3Rpb24gKi8KKwlzY3NpX2hvc3RfZ2V0KHNob3N0KTsKKwlzbnByaW50ZihzZXNzaW9uLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgInNlc3Npb24ldSIsIHNob3N0LT5ob3N0X25vKTsKKwlzZXNzaW9uLT5kZXYucGFyZW50ID0gJnNob3N0LT5zaG9zdF9nZW5kZXY7CisJc2Vzc2lvbi0+ZGV2LnJlbGVhc2UgPSBpc2NzaV9zZXNzaW9uX3JlbGVhc2U7CisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZzZXNzaW9uLT5kZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnNlc3Npb24tPmRldiwgImlzY3NpOiBjb3VsZCBub3QgIgorCQkJICAgInJlZ2lzdGVyIHNlc3Npb24ncyBkZXZcbiIpOworCQlnb3RvIGZyZWVfc2Vzc2lvbjsKKwl9CisJdHJhbnNwb3J0X3JlZ2lzdGVyX2RldmljZSgmc2Vzc2lvbi0+ZGV2KTsKKworCXJldHVybiBzZXNzaW9uOworCitmcmVlX3Nlc3Npb246CisJa2ZyZWUoc2Vzc2lvbik7Cittb2R1bGVfcHV0OgorCW1vZHVsZV9wdXQodHJhbnNwb3J0LT5vd25lcik7CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2NyZWF0ZV9zZXNzaW9uKTsKKworLyoqCisgKiBpc2NzaV9kZXN0cm95X3Nlc3Npb24gLSBkZXN0cm95IGlzY3NpIHNlc3Npb24KKyAqIEBzZXNzaW9uOiBpc2NzaV9zZXNzaW9uCisgKgorICogQ2FuIGJlIGNhbGxlZCBieSBhIExMRCBvciBpc2NzaV90cmFuc3BvcnQuIFRoZXJlIG11c3Qgbm90IGJlCisgKiBhbnkgcnVubmluZyBjb25uZWN0aW9ucy4KKyAqKi8KK2ludCBpc2NzaV9kZXN0cm95X3Nlc3Npb24oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uKQoreworCXRyYW5zcG9ydF91bnJlZ2lzdGVyX2RldmljZSgmc2Vzc2lvbi0+ZGV2KTsKKwlkZXZpY2VfdW5yZWdpc3Rlcigmc2Vzc2lvbi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfZGVzdHJveV9zZXNzaW9uKTsKKworc3RhdGljIHZvaWQgaXNjc2lfY29ubl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm4gPSBpc2NzaV9kZXZfdG9fY29ubihkZXYpOworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IGNvbm4tPmRldi5wYXJlbnQ7CisKKwlrZnJlZShjb25uKTsKKwlwdXRfZGV2aWNlKHBhcmVudCk7Cit9CisKK3N0YXRpYyBpbnQgaXNjc2lfaXNfY29ubl9kZXYoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPnJlbGVhc2UgPT0gaXNjc2lfY29ubl9yZWxlYXNlOworfQorCisvKioKKyAqIGlzY3NpX2NyZWF0ZV9jb25uIC0gY3JlYXRlIGlzY3NpIGNsYXNzIGNvbm5lY3Rpb24KKyAqIEBzZXNzaW9uOiBpc2NzaSBjbHMgc2Vzc2lvbgorICogQGNpZDogY29ubmVjdGlvbiBpZAorICoKKyAqIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIGEgTExEIG9yIGlzY3NpX3RyYW5zcG9ydC4gVGhlIGNvbm5lY3Rpb24KKyAqIGlzIGNoaWxkIG9mIHRoZSBzZXNzaW9uIHNvIGNpZCBtdXN0IGJlIHVuaXF1ZSBmb3IgYWxsIGNvbm5lY3Rpb25zCisgKiBvbiB0aGUgc2Vzc2lvbi4KKyAqKi8KK3N0cnVjdCBpc2NzaV9jbHNfY29ubiAqCitpc2NzaV9jcmVhdGVfY29ubihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24sIHVpbnQzMl90IGNpZCkKK3sKKwlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBzZXNzaW9uLT50cmFuc3BvcnQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KHNlc3Npb24pOworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubjsKKwlpbnQgZXJyOworCisJY29ubiA9IGt6YWxsb2Moc2l6ZW9mKCpjb25uKSArIHRyYW5zcG9ydC0+Y29ubmRhdGFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb25uKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh0cmFuc3BvcnQtPmNvbm5kYXRhX3NpemUpCisJCWNvbm4tPmRkX2RhdGEgPSAmY29ublsxXTsKKworCUlOSVRfTElTVF9IRUFEKCZjb25uLT5jb25uX2xpc3QpOworCWNvbm4tPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKworCS8qIHRoaXMgaXMgcmVsZWFzZWQgaW4gdGhlIGRldidzIHJlbGVhc2UgZnVuY3Rpb24gKi8KKwlpZiAoIWdldF9kZXZpY2UoJnNlc3Npb24tPmRldikpCisJCWdvdG8gZnJlZV9jb25uOworCXNucHJpbnRmKGNvbm4tPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiY29ubmVjdGlvbiVkOiV1IiwKKwkJIHNob3N0LT5ob3N0X25vLCBjaWQpOworCWNvbm4tPmRldi5wYXJlbnQgPSAmc2Vzc2lvbi0+ZGV2OworCWNvbm4tPmRldi5yZWxlYXNlID0gaXNjc2lfY29ubl9yZWxlYXNlOworCWVyciA9IGRldmljZV9yZWdpc3RlcigmY29ubi0+ZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsICZjb25uLT5kZXYsICJpc2NzaTogY291bGQgbm90IHJlZ2lzdGVyICIKKwkJCSAgICJjb25uZWN0aW9uJ3MgZGV2XG4iKTsKKwkJZ290byByZWxlYXNlX3BhcmVudF9yZWY7CisJfQorCXRyYW5zcG9ydF9yZWdpc3Rlcl9kZXZpY2UoJmNvbm4tPmRldik7CisJcmV0dXJuIGNvbm47CisKK3JlbGVhc2VfcGFyZW50X3JlZjoKKwlwdXRfZGV2aWNlKCZzZXNzaW9uLT5kZXYpOworZnJlZV9jb25uOgorCWtmcmVlKGNvbm4pOworCXJldHVybiBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9jcmVhdGVfY29ubik7CisKKy8qKgorICogaXNjc2lfZGVzdHJveV9jb25uIC0gZGVzdHJveSBpc2NzaSBjbGFzcyBjb25uZWN0aW9uCisgKiBAc2Vzc2lvbjogaXNjc2kgY2xzIHNlc3Npb24KKyAqCisgKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBhIExMRCBvciBpc2NzaV90cmFuc3BvcnQuCisgKiovCitpbnQgaXNjc2lfZGVzdHJveV9jb25uKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubikKK3sKKwl0cmFuc3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoJmNvbm4tPmRldik7CisJZGV2aWNlX3VucmVnaXN0ZXIoJmNvbm4tPmRldik7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2Rlc3Ryb3lfY29ubik7CisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgb25seSBieSBzb2Z0d2FyZSBpc2NzaV90cmFuc3BvcnRzCisgKiB3aGljaCBkbyBub3QgYWxsb2NhdGUgYW5kIG1vcmUgdGhlaXIgc2NzaV9ob3N0cyBzaW5jZSB0aGlzCisgKiBpcyBpbml0aWF0ZWQgZnJvbSB1c2Vyc3BhY2UuCisgKi8KKworLyoKKyAqIGlTQ1NJIFNlc3Npb24ncyBob3N0ZGF0YSBvcmdhbml6YXRpb246CisgKgorICogICAgKi0tLS0tLS0tLS0tLS0tLS0tLSogPD09IGhvc3RkYXRhX3Nlc3Npb24oaG9zdC0+aG9zdGRhdGEpCisgKiAgICB8IHB0ciB0byBjbGFzcyBzZXNzfAorICogICAgfC0tLS0tLS0tLS0tLS0tLS0tLXwgPD09IGlzY3NpX2hvc3RkYXRhKGhvc3QtPmhvc3RkYXRhKQorICogICAgfCB0cmFuc3BvcnQncyBkYXRhIHwKKyAqICAgICotLS0tLS0tLS0tLS0tLS0tLS0qCisgKi8KKworI2RlZmluZSBob3N0ZGF0YV9wcml2c2l6ZShfdCkJKHNpemVvZih1bnNpZ25lZCBsb25nKSArIF90LT5ob3N0ZGF0YV9zaXplICsgXAorCQkJCSBfdC0+aG9zdGRhdGFfc2l6ZSAlIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKworI2RlZmluZSBob3N0ZGF0YV9zZXNzaW9uKF9ob3N0ZGF0YSkgKGlzY3NpX3B0cigqKHVuc2lnbmVkIGxvbmcgKilfaG9zdGRhdGEpKQorCisvKioKKyAqIGlzY3NpX3RyYW5zcG9ydF9jcmVhdGVfc2Vzc2lvbiAtIGNyZWF0ZSBpc2NzaSBjbHMgc2Vzc2lvbiBhbmQgaG9zdAorICogc2NzaXQ6IHNjc2kgdHJhbnNwb3J0IHRlbXBsYXRlCisgKiB0cmFuc3BvcnQ6IGlzY3NpIHRyYW5zcG9ydCB0ZW1wbGF0ZQorICoKKyAqIFRoaXMgY2FuIGJlIHVzZWQgYnkgc29mdHdhcmUgaXNjc2lfdHJhbnNwb3J0cyB0aGF0IGFsbG9jYXRlCisgKiBhIHNlc3Npb24gcGVyIHNjc2kgaG9zdC4KKyAqKi8KK3N0cnVjdCBTY3NpX0hvc3QgKgoraXNjc2lfdHJhbnNwb3J0X2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqc2NzaXQsCisJCQkgICAgICAgc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKworCXNob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRyYW5zcG9ydC0+aG9zdF90ZW1wbGF0ZSwKKwkJCQlob3N0ZGF0YV9wcml2c2l6ZSh0cmFuc3BvcnQpKTsKKwlpZiAoIXNob3N0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXNjc2k6IGNhbiBub3QgYWxsb2NhdGUgU0NTSSBob3N0IGZvciAiCisJCQkic2Vzc2lvblxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNob3N0LT5tYXhfaWQgPSAxOworCXNob3N0LT5tYXhfY2hhbm5lbCA9IDA7CisJc2hvc3QtPm1heF9sdW4gPSB0cmFuc3BvcnQtPm1heF9sdW47CisJc2hvc3QtPm1heF9jbWRfbGVuID0gdHJhbnNwb3J0LT5tYXhfY21kX2xlbjsKKwlzaG9zdC0+dHJhbnNwb3J0dCA9IHNjc2l0OworCXNob3N0LT50cmFuc3BvcnR0LT5jcmVhdGVfd29ya19xdWV1ZSA9IDE7CisKKwlpZiAoc2NzaV9hZGRfaG9zdChzaG9zdCwgTlVMTCkpCisJCWdvdG8gZnJlZV9ob3N0OworCisJc2Vzc2lvbiA9IGlzY3NpX2NyZWF0ZV9zZXNzaW9uKHNob3N0LCB0cmFuc3BvcnQpOworCWlmICghc2Vzc2lvbikKKwkJZ290byByZW1vdmVfaG9zdDsKKworCSoodW5zaWduZWQgbG9uZyopc2hvc3QtPmhvc3RkYXRhID0gKHVuc2lnbmVkIGxvbmcpc2Vzc2lvbjsKKwlyZXR1cm4gc2hvc3Q7CisKK3JlbW92ZV9ob3N0OgorCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOworZnJlZV9ob3N0OgorCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworCXJldHVybiBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV90cmFuc3BvcnRfY3JlYXRlX3Nlc3Npb24pOworCisvKioKKyAqIGlzY3NpX3RyYW5zcG9ydF9kZXN0cm95X3Nlc3Npb24gLSBkZXN0cm95IHNlc3Npb24gYW5kIHNjc2kgaG9zdAorICogc2hvc3Q6IHNjc2kgaG9zdAorICoKKyAqIFRoaXMgY2FuIGJlIHVzZWQgYnkgc29mdHdhcmUgaXNjc2lfdHJhbnNwb3J0cyB0aGF0IGFsbG9jYXRlCisgKiBhIHNlc3Npb24gcGVyIHNjc2kgaG9zdC4KKyAqKi8KK2ludCBpc2NzaV90cmFuc3BvcnRfZGVzdHJveV9zZXNzaW9uKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbjsKKworCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOworCXNlc3Npb24gPSBob3N0ZGF0YV9zZXNzaW9uKHNob3N0LT5ob3N0ZGF0YSk7CisJaXNjc2lfZGVzdHJveV9zZXNzaW9uKHNlc3Npb24pOworCS8qIHJlZiBmcm9tIGhvc3QgYWxsb2MgKi8KKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfdHJhbnNwb3J0X2Rlc3Ryb3lfc2Vzc2lvbik7CisKKy8qCisgKiBpc2NzaSBpbnRlcmZhY2UgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4qCiBpc2NzaV9pZl9maW5kX2Nvbm4odWludDY0X3Qga2V5KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGlzY3NpX2lmX2Nvbm4gKmNvbm47CisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbm5sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmY29ubmxpc3QsIGNvbm5fbGlzdCkKQEAgLTI0OSw3ICs0NjMsNyBAQAogfQogCiBzdGF0aWMgdm9pZCoKLW1lbXBvb2xfem9uZV9hbGxvY19za2IoZ2ZwX3QgZ2ZwX21hc2ssIHZvaWQgKnBvb2xfZGF0YSkKK21lbXBvb2xfem9uZV9hbGxvY19za2IodW5zaWduZWQgaW50IGdmcF9tYXNrLCB2b2lkICpwb29sX2RhdGEpCiB7CiAJc3RydWN0IG1lbXBvb2xfem9uZSAqem9uZSA9IHBvb2xfZGF0YTsKIApAQCAtMjgxLDE0ICs0OTUsMjEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6b25lLT5mcmVlbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW50Ci1tZW1wb29sX3pvbmVfaW5pdChzdHJ1Y3QgbWVtcG9vbF96b25lICp6cCwgdW5zaWduZWQgbWF4LCB1bnNpZ25lZCBzaXplLAotCQl1bnNpZ25lZCBoaXdhdCkKK3N0YXRpYyBzdHJ1Y3QgbWVtcG9vbF96b25lICoKK21lbXBvb2xfem9uZV9pbml0KHVuc2lnbmVkIG1heCwgdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgaGl3YXQpCiB7CisJc3RydWN0IG1lbXBvb2xfem9uZSAqenA7CisKKwl6cCA9IGt6YWxsb2Moc2l6ZW9mKCp6cCksIEdGUF9LRVJORUwpOworCWlmICghenApCisJCXJldHVybiBOVUxMOworCiAJenAtPnBvb2wgPSBtZW1wb29sX2NyZWF0ZShtYXgsIG1lbXBvb2xfem9uZV9hbGxvY19za2IsCiAJCQkJICBtZW1wb29sX3pvbmVfZnJlZV9za2IsIHpwKTsKLQlpZiAoIXpwLT5wb29sKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIXpwLT5wb29sKSB7CisJCWtmcmVlKHpwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJenAtPnNpemUgPSBzaXplOwogCXpwLT5oaXdhdCA9IGhpd2F0OwpAQCAtMjk3LDkgKzUxOCwxNCBAQAogCXNwaW5fbG9ja19pbml0KCZ6cC0+ZnJlZWxvY2spOwogCWF0b21pY19zZXQoJnpwLT5hbGxvY2F0ZWQsIDApOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHpwOwogfQogCitzdGF0aWMgdm9pZCBtZW1wb29sX3pvbmVfZGVzdHJveShzdHJ1Y3QgbWVtcG9vbF96b25lICp6cCkKK3sKKwltZW1wb29sX2Rlc3Ryb3koenAtPnBvb2wpOworCWtmcmVlKHpwKTsKK30KIAogc3RhdGljIHN0cnVjdCBza19idWZmKgogbWVtcG9vbF96b25lX2dldF9za2Ioc3RydWN0IG1lbXBvb2xfem9uZSAqem9uZSkKQEAgLTMzOSw3ICs1NjUsNyBAQAogCXN0cnVjdCBubG1zZ2hkcgkqbmxoOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGlzY3NpX3VldmVudCAqZXY7Ci0Jc3RydWN0IGlzY3NpX2lmX2Nvbm4gKmNvbm47CisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uOwogCWNoYXIgKnBkdTsKIAlpbnQgbGVuID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCpldikgKyBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikgKwogCQkJICAgICAgZGF0YV9zaXplKTsKQEAgLTM0NywxMyArNTczLDEzIEBACiAJY29ubiA9IGlzY3NpX2lmX2ZpbmRfY29ubihjb25uaCk7CiAJQlVHX09OKCFjb25uKTsKIAotCW1lbXBvb2xfem9uZV9jb21wbGV0ZSgmY29ubi0+el9wZHUpOworCW1lbXBvb2xfem9uZV9jb21wbGV0ZShjb25uLT56X3BkdSk7CiAKLQlza2IgPSBtZW1wb29sX3pvbmVfZ2V0X3NrYigmY29ubi0+el9wZHUpOworCXNrYiA9IG1lbXBvb2xfem9uZV9nZXRfc2tiKGNvbm4tPnpfcGR1KTsKIAlpZiAoIXNrYikgewogCQlpc2NzaV9jb25uX2Vycm9yKGNvbm5oLCBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOwotCQlwcmludGsoS0VSTl9FUlIgImlzY3NpJWQ6IGNhbiBub3QgZGVsaXZlciBjb250cm9sIFBEVTogT09NXG4iLAotCQkgICAgICAgY29ubi0+aG9zdC0+aG9zdF9ubyk7CisJCWRldl9wcmludGsoS0VSTl9FUlIsICZjb25uLT5kZXYsICJpc2NzaTogY2FuIG5vdCBkZWxpdmVyICIKKwkJCSAgICJjb250cm9sIFBEVTogT09NXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0zNjIsMTQgKzU4OCwxNCBAQAogCW1lbXNldChldiwgMCwgc2l6ZW9mKCpldikpOwogCWV2LT50cmFuc3BvcnRfaGFuZGxlID0gaXNjc2lfaGFuZGxlKGNvbm4tPnRyYW5zcG9ydCk7CiAJZXYtPnR5cGUgPSBJU0NTSV9LRVZFTlRfUkVDVl9QRFU7Ci0JaWYgKGF0b21pY19yZWFkKCZjb25uLT56X3BkdS5hbGxvY2F0ZWQpID49IGNvbm4tPnpfcGR1Lmhpd2F0KQorCWlmIChhdG9taWNfcmVhZCgmY29ubi0+el9wZHUtPmFsbG9jYXRlZCkgPj0gY29ubi0+el9wZHUtPmhpd2F0KQogCQlldi0+aWZlcnJvciA9IC1FTk9NRU07CiAJZXYtPnIucmVjdl9yZXEuY29ubl9oYW5kbGUgPSBjb25uaDsKIAlwZHUgPSAoY2hhciopZXYgKyBzaXplb2YoKmV2KTsKIAltZW1jcHkocGR1LCBoZHIsIHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSk7CiAJbWVtY3B5KHBkdSArIHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSwgZGF0YSwgZGF0YV9zaXplKTsKIAotCXJldHVybiBpc2NzaV91bmljYXN0X3NrYigmY29ubi0+el9wZHUsIHNrYik7CisJcmV0dXJuIGlzY3NpX3VuaWNhc3Rfc2tiKGNvbm4tPnpfcGR1LCBza2IpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfcmVjdl9wZHUpOwogCkBAIC0zNzgsMTggKzYwNCwxOCBAQAogCXN0cnVjdCBubG1zZ2hkcgkqbmxoOwogCXN0cnVjdCBza19idWZmCSpza2I7CiAJc3RydWN0IGlzY3NpX3VldmVudCAqZXY7Ci0Jc3RydWN0IGlzY3NpX2lmX2Nvbm4gKmNvbm47CisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uOwogCWludCBsZW4gPSBOTE1TR19TUEFDRShzaXplb2YoKmV2KSk7CiAKIAljb25uID0gaXNjc2lfaWZfZmluZF9jb25uKGNvbm5oKTsKIAlCVUdfT04oIWNvbm4pOwogCi0JbWVtcG9vbF96b25lX2NvbXBsZXRlKCZjb25uLT56X2Vycm9yKTsKKwltZW1wb29sX3pvbmVfY29tcGxldGUoY29ubi0+el9lcnJvcik7CiAKLQlza2IgPSBtZW1wb29sX3pvbmVfZ2V0X3NrYigmY29ubi0+el9lcnJvcik7CisJc2tiID0gbWVtcG9vbF96b25lX2dldF9za2IoY29ubi0+el9lcnJvcik7CiAJaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaSVkOiBncmFjZWZ1bGx5IGlnbm9yZWQgY29ubiBlcnJvciAoJWQpXG4iLAotCQkgICAgICAgY29ubi0+aG9zdC0+aG9zdF9ubywgZXJyb3IpOworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGdyYWNlZnVsbHkgaWdub3JlZCAiCisJCQkgICJjb25uIGVycm9yICglZClcbiIsIGVycm9yKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzk3LDE1ICs2MjMsMTUgQEAKIAlldiA9IE5MTVNHX0RBVEEobmxoKTsKIAlldi0+dHJhbnNwb3J0X2hhbmRsZSA9IGlzY3NpX2hhbmRsZShjb25uLT50cmFuc3BvcnQpOwogCWV2LT50eXBlID0gSVNDU0lfS0VWRU5UX0NPTk5fRVJST1I7Ci0JaWYgKGF0b21pY19yZWFkKCZjb25uLT56X2Vycm9yLmFsbG9jYXRlZCkgPj0gY29ubi0+el9lcnJvci5oaXdhdCkKKwlpZiAoYXRvbWljX3JlYWQoJmNvbm4tPnpfZXJyb3ItPmFsbG9jYXRlZCkgPj0gY29ubi0+el9lcnJvci0+aGl3YXQpCiAJCWV2LT5pZmVycm9yID0gLUVOT01FTTsKIAlldi0+ci5jb25uZXJyb3IuZXJyb3IgPSBlcnJvcjsKIAlldi0+ci5jb25uZXJyb3IuY29ubl9oYW5kbGUgPSBjb25uaDsKIAotCWlzY3NpX3VuaWNhc3Rfc2tiKCZjb25uLT56X2Vycm9yLCBza2IpOworCWlzY3NpX3VuaWNhc3Rfc2tiKGNvbm4tPnpfZXJyb3IsIHNrYik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJpc2NzaSVkOiBkZXRlY3RlZCBjb25uIGVycm9yICglZClcbiIsCi0JICAgICAgIGNvbm4tPmhvc3QtPmhvc3Rfbm8sIGVycm9yKTsKKwlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJmNvbm4tPmRldiwgImlzY3NpOiBkZXRlY3RlZCBjb25uIGVycm9yICglZClcbiIsCisJCSAgIGVycm9yKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2Nvbm5fZXJyb3IpOwogCkBAIC00MTksOSArNjQ1LDkgQEAKIAlpbnQgZmxhZ3MgPSBtdWx0aSA/IE5MTV9GX01VTFRJIDogMDsKIAlpbnQgdCA9IGRvbmUgPyBOTE1TR19ET05FIDogdHlwZTsKIAotCW1lbXBvb2xfem9uZV9jb21wbGV0ZSgmel9yZXBseSk7CisJbWVtcG9vbF96b25lX2NvbXBsZXRlKHpfcmVwbHkpOwogCi0Jc2tiID0gbWVtcG9vbF96b25lX2dldF9za2IoJnpfcmVwbHkpOworCXNrYiA9IG1lbXBvb2xfem9uZV9nZXRfc2tiKHpfcmVwbHkpOwogCS8qCiAJICogRklYTUU6CiAJICogdXNlciBpcyBzdXBwb3NlZCB0byByZWFjdCBvbiBpZmVycm9yID09IC1FTk9NRU07CkBAIC00MzIsMzA0ICs2NTgsNyBAQAogCW5saCA9IF9fbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIHQsIChsZW4gLSBzaXplb2YoKm5saCkpLCAwKTsKIAlubGgtPm5sbXNnX2ZsYWdzID0gZmxhZ3M7CiAJbWVtY3B5KE5MTVNHX0RBVEEobmxoKSwgcGF5bG9hZCwgc2l6ZSk7Ci0JcmV0dXJuIGlzY3NpX3VuaWNhc3Rfc2tiKCZ6X3JlcGx5LCBza2IpOwotfQotCi0vKgotICogaVNDU0kgU2Vzc2lvbidzIGhvc3RkYXRhIG9yZ2FuaXphdGlvbjoKLSAqCi0gKiAgICAqLS0tLS0tLS0tLS0tLS0tLS0tKiA8PT0gaG9zdC0+aG9zdGRhdGEKLSAqICAgIHwgdHJhbnNwb3J0ICAgICAgICB8Ci0gKiAgICB8LS0tLS0tLS0tLS0tLS0tLS0tfCA8PT0gaXNjc2lfaG9zdGRhdGEoaG9zdC0+aG9zdGRhdGEpCi0gKiAgICB8IHRyYW5zcG9ydCdzIGRhdGEgfAotICogICAgfC0tLS0tLS0tLS0tLS0tLS0tLXwgPD09IGhvc3RkYXRhX3Nlc3Npb24oaG9zdC0+aG9zdGRhdGEpCi0gKiAgICB8IGludGVyZmFjZSdzIGRhdGEgfAotICogICAgKi0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqLwotCi0jZGVmaW5lIGhvc3RkYXRhX3ByaXZzaXplKF90KQkoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICsgX3QtPmhvc3RkYXRhX3NpemUgKyBcCi0JCQkJIF90LT5ob3N0ZGF0YV9zaXplICUgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICsgXAotCQkJCSBzaXplb2Yoc3RydWN0IGlzY3NpX2lmX3Nlc3Npb24pKQotCi0jZGVmaW5lIGhvc3RkYXRhX3Nlc3Npb24oX2hvc3RkYXRhKSAoKHZvaWQqKV9ob3N0ZGF0YSArIHNpemVvZih1bnNpZ25lZCBsb25nKSArIFwKLQkJCSgoc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqKSBcCi0JCQkgaXNjc2lfcHRyKCoodWludDY0X3QgKilfaG9zdGRhdGEpKS0+aG9zdGRhdGFfc2l6ZSkKLQotc3RhdGljIHZvaWQgaXNjc2lfaWZfc2Vzc2lvbl9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGlzY3NpX2lmX3Nlc3Npb24gKnNlc3Npb24gPSBpc2NzaV9kZXZfdG9faWZfc2Vzc2lvbihkZXYpOwotCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnRyYW5zcG9ydCA9IHNlc3Npb24tPnRyYW5zcG9ydDsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGlzY3NpX2lmX3Nlc3Npb25fdG9fc2hvc3Qoc2Vzc2lvbik7Ci0Jc3RydWN0IGlzY3NpX2lmX2Nvbm4gKmNvbm4sICp0bXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIG5vdyBmcmVlIGNvbm5lY3Rpb25zICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvbm5sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbm4sIHRtcCwgJnNlc3Npb24tPmNvbm5lY3Rpb25zLAotCQkJCSBzZXNzaW9uX2xpc3QpIHsKLQkJbGlzdF9kZWwoJmNvbm4tPnNlc3Npb25fbGlzdCk7Ci0JCW1lbXBvb2xfZGVzdHJveShjb25uLT56X3BkdS5wb29sKTsKLQkJbWVtcG9vbF9kZXN0cm95KGNvbm4tPnpfZXJyb3IucG9vbCk7Ci0JCWtmcmVlKGNvbm4pOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25ubG9jaywgZmxhZ3MpOwotCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwotCW1vZHVsZV9wdXQodHJhbnNwb3J0LT5vd25lcik7Ci19Ci0KLXN0YXRpYyBpbnQKLWlzY3NpX2lmX2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqcHJpdiwgc3RydWN0IGlzY3NpX3VldmVudCAqZXYpCi17Ci0Jc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gcHJpdi0+aXNjc2lfdHJhbnNwb3J0OwotCXN0cnVjdCBpc2NzaV9pZl9zZXNzaW9uICpzZXNzaW9uOwotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVycm9yOwotCi0JaWYgKCF0cnlfbW9kdWxlX2dldCh0cmFuc3BvcnQtPm93bmVyKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCXNob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRyYW5zcG9ydC0+aG9zdF90ZW1wbGF0ZSwKLQkJCQlob3N0ZGF0YV9wcml2c2l6ZSh0cmFuc3BvcnQpKTsKLQlpZiAoIXNob3N0KSB7Ci0JCWV2LT5yLmNfc2Vzc2lvbl9yZXQuc2Vzc2lvbl9oYW5kbGUgPSBpc2NzaV9oYW5kbGUoTlVMTCk7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXNjc2k6IGNhbiBub3QgYWxsb2NhdGUgU0NTSSBob3N0IGZvciAiCi0JCSAgICAgICAic2Vzc2lvblxuIik7Ci0JCWVycm9yID0gLUVOT01FTTsKLQkJZ290byBvdXRfbW9kdWxlX3B1dDsKLQl9Ci0Jc2hvc3QtPm1heF9pZCA9IDE7Ci0Jc2hvc3QtPm1heF9jaGFubmVsID0gMDsKLQlzaG9zdC0+bWF4X2x1biA9IHRyYW5zcG9ydC0+bWF4X2x1bjsKLQlzaG9zdC0+bWF4X2NtZF9sZW4gPSB0cmFuc3BvcnQtPm1heF9jbWRfbGVuOwotCXNob3N0LT50cmFuc3BvcnR0ID0gJnByaXYtPnQ7Ci0KLQkvKiBzdG9yZSBzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0IGluIGhvc3RkYXRhICovCi0JKih1aW50NjRfdCopc2hvc3QtPmhvc3RkYXRhID0gZXYtPnRyYW5zcG9ydF9oYW5kbGU7Ci0KLQlldi0+ci5jX3Nlc3Npb25fcmV0LnNlc3Npb25faGFuZGxlID0gdHJhbnNwb3J0LT5jcmVhdGVfc2Vzc2lvbigKLQkJCQkJZXYtPnUuY19zZXNzaW9uLmluaXRpYWxfY21kc24sIHNob3N0KTsKLQlpZiAoZXYtPnIuY19zZXNzaW9uX3JldC5zZXNzaW9uX2hhbmRsZSA9PSBpc2NzaV9oYW5kbGUoTlVMTCkpIHsKLQkJZXJyb3IgPSAwOwotCQlnb3RvIG91dF9ob3N0X3B1dDsKLQl9Ci0KLQkvKiBob3N0X25vIGJlY29tZXMgYXNzaWduZWQgU0lEICovCi0JZXYtPnIuY19zZXNzaW9uX3JldC5zaWQgPSBzaG9zdC0+aG9zdF9ubzsKLQkvKiBpbml0aWFsaXplIHNlc3Npb24gKi8KLQlzZXNzaW9uID0gaG9zdGRhdGFfc2Vzc2lvbihzaG9zdC0+aG9zdGRhdGEpOwotCUlOSVRfTElTVF9IRUFEKCZzZXNzaW9uLT5jb25uZWN0aW9ucyk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNlc3Npb24tPmxpc3QpOwotCXNlc3Npb24tPnNlc3Npb25oID0gZXYtPnIuY19zZXNzaW9uX3JldC5zZXNzaW9uX2hhbmRsZTsKLQlzZXNzaW9uLT50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0KLQllcnJvciA9IHNjc2lfYWRkX2hvc3Qoc2hvc3QsIE5VTEwpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfZGVzdHJveV9zZXNzaW9uOwotCi0JLyoKLQkgKiB0aGlzIGlzIHJlbGVhc2VkIGluIHRoZSBkZXYncyByZWxlYXNlIGZ1bmN0aW9uKQotCSAqLwotCXNjc2lfaG9zdF9nZXQoc2hvc3QpOwotCXNucHJpbnRmKHNlc3Npb24tPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAic2Vzc2lvbiV1Iiwgc2hvc3QtPmhvc3Rfbm8pOwotCXNlc3Npb24tPmRldi5wYXJlbnQgPSAmc2hvc3QtPnNob3N0X2dlbmRldjsKLQlzZXNzaW9uLT5kZXYucmVsZWFzZSA9IGlzY3NpX2lmX3Nlc3Npb25fZGV2X3JlbGVhc2U7Ci0JZXJyb3IgPSBkZXZpY2VfcmVnaXN0ZXIoJnNlc3Npb24tPmRldik7Ci0JaWYgKGVycm9yKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXNjc2k6IGNvdWxkIG5vdCByZWdpc3RlciBzZXNzaW9uJWQncyBkZXZcbiIsCi0JCSAgICAgICBzaG9zdC0+aG9zdF9ubyk7Ci0JCWdvdG8gb3V0X3JlbW92ZV9ob3N0OwotCX0KLQl0cmFuc3BvcnRfcmVnaXN0ZXJfZGV2aWNlKCZzZXNzaW9uLT5kZXYpOwotCi0JLyogYWRkIHRoaXMgc2Vzc2lvbiB0byB0aGUgbGlzdCBvZiBhY3RpdmUgc2Vzc2lvbnMgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2Vzc2lvbl9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGQoJnNlc3Npb24tPmxpc3QsICZwcml2LT5zZXNzaW9ucyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2Vzc2lvbl9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLQotb3V0X3JlbW92ZV9ob3N0OgotCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOwotb3V0X2Rlc3Ryb3lfc2Vzc2lvbjoKLQl0cmFuc3BvcnQtPmRlc3Ryb3lfc2Vzc2lvbihldi0+ci5jX3Nlc3Npb25fcmV0LnNlc3Npb25faGFuZGxlKTsKLQlldi0+ci5jX3Nlc3Npb25fcmV0LnNlc3Npb25faGFuZGxlID0gaXNjc2lfaGFuZGxlKE5VTEwpOwotb3V0X2hvc3RfcHV0OgotCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwotb3V0X21vZHVsZV9wdXQ6Ci0JbW9kdWxlX3B1dCh0cmFuc3BvcnQtPm93bmVyKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQKLWlzY3NpX2lmX2Rlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKnByaXYsIHN0cnVjdCBpc2NzaV91ZXZlbnQgKmV2KQotewotCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnRyYW5zcG9ydCA9IHByaXYtPmlzY3NpX3RyYW5zcG9ydDsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKLQlzdHJ1Y3QgaXNjc2lfaWZfc2Vzc2lvbiAqc2Vzc2lvbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpc2NzaV9pZl9jb25uICpjb25uOwotCWludCBlcnJvciA9IDA7Ci0KLQlzaG9zdCA9IHNjc2lfaG9zdF9sb29rdXAoZXYtPnUuZF9zZXNzaW9uLnNpZCk7Ci0JaWYgKHNob3N0ID09IEVSUl9QVFIoLUVOWElPKSkKLQkJcmV0dXJuIC1FRVhJU1Q7Ci0Jc2Vzc2lvbiA9IGhvc3RkYXRhX3Nlc3Npb24oc2hvc3QtPmhvc3RkYXRhKTsKLQotCS8qIGNoZWNrIGlmIHdlIGhhdmUgYWN0aXZlIGNvbm5lY3Rpb25zICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvbm5sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmc2Vzc2lvbi0+Y29ubmVjdGlvbnMsIHNlc3Npb25fbGlzdCkgewotCQlpZiAoY29ubi0+YWN0aXZlKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImlzY3NpJWQ6IGNhbiBub3QgZGVzdHJveSBzZXNzaW9uOiAiCi0JCQkgICAgICAgImhhcyBhY3RpdmUgY29ubmVjdGlvbiAoJXApXG4iLAotCQkJICAgICAgIHNob3N0LT5ob3N0X25vLCBpc2NzaV9wdHIoY29ubi0+Y29ubmgpKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbm5sb2NrLCBmbGFncyk7Ci0JCQllcnJvciA9IEVJTzsKLQkJCWdvdG8gb3V0X3JlbGVhc2VfcmVmOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbm5sb2NrLCBmbGFncyk7Ci0KLQlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKLQl0cmFuc3BvcnQtPmRlc3Ryb3lfc2Vzc2lvbihldi0+dS5kX3Nlc3Npb24uc2Vzc2lvbl9oYW5kbGUpOwotCXRyYW5zcG9ydF91bnJlZ2lzdGVyX2RldmljZSgmc2Vzc2lvbi0+ZGV2KTsKLQlkZXZpY2VfdW5yZWdpc3Rlcigmc2Vzc2lvbi0+ZGV2KTsKLQotCS8qIHJlbW92ZSB0aGlzIHNlc3Npb24gZnJvbSB0aGUgbGlzdCBvZiBhY3RpdmUgc2Vzc2lvbnMgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2Vzc2lvbl9sb2NrLCBmbGFncyk7Ci0JbGlzdF9kZWwoJnNlc3Npb24tPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNlc3Npb25fbG9jaywgZmxhZ3MpOwotCi0JLyogcmVmIGZyb20gaG9zdCBhbGxvYyAqLwotCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwotb3V0X3JlbGVhc2VfcmVmOgotCS8qIHJlZiBmcm9tIGhvc3QgbG9va3VwICovCi0Jc2NzaV9ob3N0X3B1dChzaG9zdCk7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgdm9pZCBpc2NzaV9pZl9jb25uX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaXNjc2lfaWZfY29ubiAqY29ubiA9IGlzY3NpX2Rldl90b19pZl9jb25uKGRldik7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjb25uLT5ob3N0OwotCi0Jc2NzaV9ob3N0X3B1dChzaG9zdCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWlzY3NpX2lmX2NyZWF0ZV9jb25uKHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnRyYW5zcG9ydCwgc3RydWN0IGlzY3NpX3VldmVudCAqZXYpCi17Ci0Jc3RydWN0IGlzY3NpX2lmX3Nlc3Npb24gKnNlc3Npb247Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7Ci0Jc3RydWN0IGlzY3NpX2lmX2Nvbm4gKmNvbm47Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZXJyb3I7Ci0KLQlzaG9zdCA9IHNjc2lfaG9zdF9sb29rdXAoZXYtPnUuY19jb25uLnNpZCk7Ci0JaWYgKHNob3N0ID09IEVSUl9QVFIoLUVOWElPKSkKLQkJcmV0dXJuIC1FRVhJU1Q7Ci0Jc2Vzc2lvbiA9IGhvc3RkYXRhX3Nlc3Npb24oc2hvc3QtPmhvc3RkYXRhKTsKLQotCWNvbm4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXNjc2lfaWZfY29ubiksIEdGUF9LRVJORUwpOwotCWlmICghY29ubikgewotCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVmOwotCX0KLQltZW1zZXQoY29ubiwgMCwgc2l6ZW9mKHN0cnVjdCBpc2NzaV9pZl9jb25uKSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNvbm4tPnNlc3Npb25fbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNvbm4tPmNvbm5fbGlzdCk7Ci0JY29ubi0+aG9zdCA9IHNob3N0OwotCWNvbm4tPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKLQotCWVycm9yID0gbWVtcG9vbF96b25lX2luaXQoJmNvbm4tPnpfcGR1LCBaX01BWF9QRFUsCi0JCQlOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IGlzY3NpX3VldmVudCkgKwotCQkJCSAgICBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikgKwotCQkJCSAgICBERUZBVUxUX01BWF9SRUNWX0RBVEFfU0VHTUVOVF9MRU5HVEgpLAotCQkJWl9ISVdBVF9QRFUpOwotCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIgImlzY3NpJWQ6IGNhbiBub3QgYWxsb2NhdGUgcGR1IHpvbmUgZm9yIG5ldyAiCi0JCSAgICAgICAiY29ublxuIiwgc2hvc3QtPmhvc3Rfbm8pOwotCQlnb3RvIG91dF9mcmVlX2Nvbm47Ci0JfQotCWVycm9yID0gbWVtcG9vbF96b25lX2luaXQoJmNvbm4tPnpfZXJyb3IsIFpfTUFYX0VSUk9SLAotCQkJTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpc2NzaV91ZXZlbnQpKSwKLQkJCVpfSElXQVRfRVJST1IpOwotCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIgImlzY3NpJWQ6IGNhbiBub3QgYWxsb2NhdGUgZXJyb3Igem9uZSBmb3IgIgotCQkgICAgICAgIm5ldyBjb25uXG4iLCBzaG9zdC0+aG9zdF9ubyk7Ci0JCWdvdG8gb3V0X2ZyZWVfcGR1X3Bvb2w7Ci0JfQotCi0JZXYtPnIuaGFuZGxlID0gdHJhbnNwb3J0LT5jcmVhdGVfY29ubihldi0+dS5jX2Nvbm4uc2Vzc2lvbl9oYW5kbGUsCi0JCQkJCWV2LT51LmNfY29ubi5jaWQpOwotCWlmICghZXYtPnIuaGFuZGxlKSB7Ci0JCWVycm9yID0gLUVOT0RFVjsKLQkJZ290byBvdXRfZnJlZV9lcnJvcl9wb29sOwotCX0KLQotCWNvbm4tPmNvbm5oID0gZXYtPnIuaGFuZGxlOwotCi0JLyoKLQkgKiB0aGlzIGlzIHJlbGVhc2VkIGluIHRoZSBkZXYncyByZWxlYXNlIGZ1bmN0aW9uCi0JICovCi0JaWYgKCFzY3NpX2hvc3RfZ2V0KHNob3N0KSkKLQkJZ290byBvdXRfZGVzdHJveV9jb25uOwotCXNucHJpbnRmKGNvbm4tPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiY29ubmVjdGlvbiVkOiV1IiwKLQkJIHNob3N0LT5ob3N0X25vLCBldi0+dS5jX2Nvbm4uY2lkKTsKLQljb25uLT5kZXYucGFyZW50ID0gJnNlc3Npb24tPmRldjsKLQljb25uLT5kZXYucmVsZWFzZSA9IGlzY3NpX2lmX2Nvbm5fZGV2X3JlbGVhc2U7Ci0JZXJyb3IgPSBkZXZpY2VfcmVnaXN0ZXIoJmNvbm4tPmRldik7Ci0JaWYgKGVycm9yKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXNjc2klZDogY291bGQgbm90IHJlZ2lzdGVyIGNvbm5lY3Rpb25zJXUgIgotCQkgICAgICAgImRldlxuIiwgc2hvc3QtPmhvc3Rfbm8sIGV2LT51LmNfY29ubi5jaWQpOwotCQlnb3RvIG91dF9yZWxlYXNlX3BhcmVudF9yZWY7Ci0JfQotCXRyYW5zcG9ydF9yZWdpc3Rlcl9kZXZpY2UoJmNvbm4tPmRldik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY29ubmxvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZCgmY29ubi0+Y29ubl9saXN0LCAmY29ubmxpc3QpOwotCWxpc3RfYWRkKCZjb25uLT5zZXNzaW9uX2xpc3QsICZzZXNzaW9uLT5jb25uZWN0aW9ucyk7Ci0JY29ubi0+YWN0aXZlID0gMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25ubG9jaywgZmxhZ3MpOwotCi0Jc2NzaV9ob3N0X3B1dChzaG9zdCk7Ci0JcmV0dXJuIDA7Ci0KLW91dF9yZWxlYXNlX3BhcmVudF9yZWY6Ci0Jc2NzaV9ob3N0X3B1dChzaG9zdCk7Ci1vdXRfZGVzdHJveV9jb25uOgotCXRyYW5zcG9ydC0+ZGVzdHJveV9jb25uKGV2LT5yLmhhbmRsZSk7Ci1vdXRfZnJlZV9lcnJvcl9wb29sOgotCW1lbXBvb2xfZGVzdHJveShjb25uLT56X2Vycm9yLnBvb2wpOwotb3V0X2ZyZWVfcGR1X3Bvb2w6Ci0JbWVtcG9vbF9kZXN0cm95KGNvbm4tPnpfcGR1LnBvb2wpOwotb3V0X2ZyZWVfY29ubjoKLQlrZnJlZShjb25uKTsKLW91dF9yZWxlYXNlX3JlZjoKLQlzY3NpX2hvc3RfcHV0KHNob3N0KTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQKLWlzY3NpX2lmX2Rlc3Ryb3lfY29ubihzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQsIHN0cnVjdCBpc2NzaV91ZXZlbnQgKmV2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGlzY3NpX2lmX2Nvbm4gKmNvbm47Ci0KLQljb25uID0gaXNjc2lfaWZfZmluZF9jb25uKGV2LT51LmRfY29ubi5jb25uX2hhbmRsZSk7Ci0JaWYgKCFjb25uKQotCQlyZXR1cm4gLUVFWElTVDsKLQotCXRyYW5zcG9ydC0+ZGVzdHJveV9jb25uKGV2LT51LmRfY29ubi5jb25uX2hhbmRsZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY29ubmxvY2ssIGZsYWdzKTsKLQljb25uLT5hY3RpdmUgPSAwOwotCWxpc3RfZGVsKCZjb25uLT5jb25uX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbm5sb2NrLCBmbGFncyk7Ci0KLQl0cmFuc3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoJmNvbm4tPmRldik7Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJmNvbm4tPmRldik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGlzY3NpX3VuaWNhc3Rfc2tiKHpfcmVwbHksIHNrYik7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTczOSw3ICs2NjgsNyBAQAogCXN0cnVjdCBpc2NzaV91ZXZlbnQgKmV2ID0gTkxNU0dfREFUQShubGgpOwogCXN0cnVjdCBpc2NzaV9zdGF0cyAqc3RhdHM7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYnN0YXQ7Ci0Jc3RydWN0IGlzY3NpX2lmX2Nvbm4gKmNvbm47CisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uOwogCXN0cnVjdCBubG1zZ2hkcgkqbmxoc3RhdDsKIAlzdHJ1Y3QgaXNjc2lfdWV2ZW50ICpldnN0YXQ7CiAJaW50IGxlbiA9IE5MTVNHX1NQQUNFKHNpemVvZigqZXYpICsKQEAgLTc1NSwxMiArNjg0LDEyIEBACiAJZG8gewogCQlpbnQgYWN0dWFsX3NpemU7CiAKLQkJbWVtcG9vbF96b25lX2NvbXBsZXRlKCZjb25uLT56X3BkdSk7CisJCW1lbXBvb2xfem9uZV9jb21wbGV0ZShjb25uLT56X3BkdSk7CiAKLQkJc2tic3RhdCA9IG1lbXBvb2xfem9uZV9nZXRfc2tiKCZjb25uLT56X3BkdSk7CisJCXNrYnN0YXQgPSBtZW1wb29sX3pvbmVfZ2V0X3NrYihjb25uLT56X3BkdSk7CiAJCWlmICghc2tic3RhdCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaSVkOiBjYW4gbm90IGRlbGl2ZXIgc3RhdHM6IE9PTVxuIiwKLQkJCSAgICAgICBjb25uLT5ob3N0LT5ob3N0X25vKTsKKwkJCWRldl9wcmludGsoS0VSTl9FUlIsICZjb25uLT5kZXYsICJpc2NzaTogY2FuIG5vdCAiCisJCQkJICAgImRlbGl2ZXIgc3RhdHM6IE9PTVxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCkBAIC03NzAsNyArNjk5LDcgQEAKIAkJbWVtc2V0KGV2c3RhdCwgMCwgc2l6ZW9mKCpldnN0YXQpKTsKIAkJZXZzdGF0LT50cmFuc3BvcnRfaGFuZGxlID0gaXNjc2lfaGFuZGxlKGNvbm4tPnRyYW5zcG9ydCk7CiAJCWV2c3RhdC0+dHlwZSA9IG5saC0+bmxtc2dfdHlwZTsKLQkJaWYgKGF0b21pY19yZWFkKCZjb25uLT56X3BkdS5hbGxvY2F0ZWQpID49IGNvbm4tPnpfcGR1Lmhpd2F0KQorCQlpZiAoYXRvbWljX3JlYWQoJmNvbm4tPnpfcGR1LT5hbGxvY2F0ZWQpID49IGNvbm4tPnpfcGR1LT5oaXdhdCkKIAkJCWV2c3RhdC0+aWZlcnJvciA9IC1FTk9NRU07CiAJCWV2c3RhdC0+dS5nZXRfc3RhdHMuY29ubl9oYW5kbGUgPQogCQkJZXYtPnUuZ2V0X3N0YXRzLmNvbm5faGFuZGxlOwpAQCAtNzg4LDEzICs3MTcsMTQxIEBACiAJCXNrYl90cmltKHNrYiwgTkxNU0dfQUxJR04oYWN0dWFsX3NpemUpKTsKIAkJbmxoc3RhdC0+bmxtc2dfbGVuID0gYWN0dWFsX3NpemU7CiAKLQkJZXJyID0gaXNjc2lfdW5pY2FzdF9za2IoJmNvbm4tPnpfcGR1LCBza2JzdGF0KTsKKwkJZXJyID0gaXNjc2lfdW5pY2FzdF9za2IoY29ubi0+el9wZHUsIHNrYnN0YXQpOwogCX0gd2hpbGUgKGVyciA8IDAgJiYgZXJyICE9IC1FQ09OTlJFRlVTRUQpOwogCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludAoraXNjc2lfaWZfY3JlYXRlX3Nlc3Npb24oc3RydWN0IGlzY3NpX2ludGVybmFsICpwcml2LCBzdHJ1Y3QgaXNjc2lfdWV2ZW50ICpldikKK3sKKwlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBwcml2LT5pc2NzaV90cmFuc3BvcnQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisKKwlpZiAoIXRyYW5zcG9ydC0+Y3JlYXRlX3Nlc3Npb24pCisJCXJldHVybiAtRUlOVkFMOworCisJc2hvc3QgPSB0cmFuc3BvcnQtPmNyZWF0ZV9zZXNzaW9uKCZwcml2LT50LAorCQkJCQkgIGV2LT51LmNfc2Vzc2lvbi5pbml0aWFsX2NtZHNuKTsKKwlpZiAoIXNob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWV2LT5yLmNfc2Vzc2lvbl9yZXQuc2Vzc2lvbl9oYW5kbGUgPSBpc2NzaV9oYW5kbGUoaXNjc2lfaG9zdGRhdGEoc2hvc3QtPmhvc3RkYXRhKSk7CisJZXYtPnIuY19zZXNzaW9uX3JldC5zaWQgPSBzaG9zdC0+aG9zdF9ubzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNjc2lfaWZfZGVzdHJveV9zZXNzaW9uKHN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqcHJpdiwgc3RydWN0IGlzY3NpX3VldmVudCAqZXYpCit7CisJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gcHJpdi0+aXNjc2lfdHJhbnNwb3J0OworCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisKKwlpZiAoIXRyYW5zcG9ydC0+ZGVzdHJveV9zZXNzaW9uKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNob3N0ID0gc2NzaV9ob3N0X2xvb2t1cChldi0+dS5kX3Nlc3Npb24uc2lkKTsKKwlpZiAoc2hvc3QgPT0gRVJSX1BUUigtRU5YSU8pKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWlmICh0cmFuc3BvcnQtPmRlc3Ryb3lfc2Vzc2lvbikKKwkJdHJhbnNwb3J0LT5kZXN0cm95X3Nlc3Npb24oc2hvc3QpOworICAgICAgICAvKiByZWYgZnJvbSBob3N0IGxvb2t1cCAqLworICAgICAgICBzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNjc2lfaWZfY3JlYXRlX2Nvbm4oc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0LCBzdHJ1Y3QgaXNjc2lfdWV2ZW50ICpldil7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXRyYW5zcG9ydC0+Y3JlYXRlX2Nvbm4pCisJCXJldHVybiAtRUlOVkFMOworCisJc2hvc3QgPSBzY3NpX2hvc3RfbG9va3VwKGV2LT51LmNfY29ubi5zaWQpOworCWlmIChzaG9zdCA9PSBFUlJfUFRSKC1FTlhJTykpCisJCXJldHVybiAtRUVYSVNUOworCisJY29ubiA9IHRyYW5zcG9ydC0+Y3JlYXRlX2Nvbm4oc2hvc3QsIGV2LT51LmNfY29ubi5jaWQpOworCWlmICghY29ubikKKwkJZ290byByZWxlYXNlX3JlZjsKKworCWNvbm4tPnpfcGR1ID0gbWVtcG9vbF96b25lX2luaXQoWl9NQVhfUERVLAorCQkJTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpc2NzaV91ZXZlbnQpICsKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpICsKKwkJCQkgICAgREVGQVVMVF9NQVhfUkVDVl9EQVRBX1NFR01FTlRfTEVOR1RIKSwKKwkJCVpfSElXQVRfUERVKTsKKwlpZiAoIWNvbm4tPnpfcGR1KSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsICZjb25uLT5kZXYsICJpc2NzaTogY2FuIG5vdCBhbGxvY2F0ZSAiCisJCQkgICAicGR1IHpvbmUgZm9yIG5ldyBjb25uXG4iKTsKKwkJZ290byBkZXN0cm95X2Nvbm47CisJfQorCisJY29ubi0+el9lcnJvciA9IG1lbXBvb2xfem9uZV9pbml0KFpfTUFYX0VSUk9SLAorCQkJTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpc2NzaV91ZXZlbnQpKSwKKwkJCVpfSElXQVRfRVJST1IpOworCWlmICghY29ubi0+el9lcnJvcikgeworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGNhbiBub3QgYWxsb2NhdGUgIgorCQkJICAgImVycm9yIHpvbmUgZm9yIG5ldyBjb25uXG4iKTsKKwkJZ290byBmcmVlX3BkdV9wb29sOworCX0KKworCWV2LT5yLmhhbmRsZSA9IGNvbm4tPmNvbm5oID0gaXNjc2lfaGFuZGxlKGNvbm4tPmRkX2RhdGEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbm5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJmNvbm4tPmNvbm5fbGlzdCwgJmNvbm5saXN0KTsKKwljb25uLT5hY3RpdmUgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbm5sb2NrLCBmbGFncyk7CisKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwlyZXR1cm4gMDsKKworZnJlZV9wZHVfcG9vbDoKKwltZW1wb29sX3pvbmVfZGVzdHJveShjb25uLT56X3BkdSk7CitkZXN0cm95X2Nvbm46CisJaWYgKHRyYW5zcG9ydC0+ZGVzdHJveV9jb25uKQorCQl0cmFuc3BvcnQtPmRlc3Ryb3lfY29ubihjb25uLT5kZF9kYXRhKTsKK3JlbGVhc2VfcmVmOgorCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50Citpc2NzaV9pZl9kZXN0cm95X2Nvbm4oc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0LCBzdHJ1Y3QgaXNjc2lfdWV2ZW50ICpldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubjsKKwlzdHJ1Y3QgbWVtcG9vbF96b25lICp6X2Vycm9yLCAqel9wZHU7CisKKwljb25uID0gaXNjc2lfaWZfZmluZF9jb25uKGV2LT51LmRfY29ubi5jb25uX2hhbmRsZSk7CisJaWYgKCFjb25uKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWlmICghdHJhbnNwb3J0LT5kZXN0cm95X2Nvbm4pCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbm5sb2NrLCBmbGFncyk7CisJY29ubi0+YWN0aXZlID0gMDsKKwlsaXN0X2RlbCgmY29ubi0+Y29ubl9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25ubG9jaywgZmxhZ3MpOworCisJel9wZHUgPSBjb25uLT56X3BkdTsKKwl6X2Vycm9yID0gY29ubi0+el9lcnJvcjsKKworCWlmICh0cmFuc3BvcnQtPmRlc3Ryb3lfY29ubikKKwkJdHJhbnNwb3J0LT5kZXN0cm95X2Nvbm4oY29ubik7CisKKwltZW1wb29sX3pvbmVfZGVzdHJveSh6X3BkdSk7CisJbWVtcG9vbF96b25lX2Rlc3Ryb3koel9lcnJvcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAogaXNjc2lfaWZfcmVjdl9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgpCiB7CiAJaW50IGVyciA9IDA7CkBAIC04ODEsNyArOTM4LDcgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JZG93bigmcnhfcXVldWVfc2VtYSk7CisJbXV0ZXhfbG9jaygmcnhfcXVldWVfbXV0ZXgpOwogCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgIT0gTlVMTCkgewogCQl3aGlsZSAoc2tiLT5sZW4gPj0gTkxNU0dfU1BBQ0UoMCkpIHsKIAkJCWludCBlcnI7CkBAIC05MTUsMTcgKzk3MiwyMCBAQAogCQkJCWVyciA9IGlzY3NpX2lmX3NlbmRfcmVwbHkoCiAJCQkJCU5FVExJTktfQ1JFRFMoc2tiKS0+cGlkLCBubGgtPm5sbXNnX3NlcSwKIAkJCQkJbmxoLT5ubG1zZ190eXBlLCAwLCAwLCBldiwgc2l6ZW9mKCpldikpOwotCQkJCWlmIChhdG9taWNfcmVhZCgmel9yZXBseS5hbGxvY2F0ZWQpID49Ci0JCQkJCQl6X3JlcGx5Lmhpd2F0KQorCQkJCWlmIChhdG9taWNfcmVhZCgmel9yZXBseS0+YWxsb2NhdGVkKSA+PQorCQkJCQkJel9yZXBseS0+aGl3YXQpCiAJCQkJCWV2LT5pZmVycm9yID0gLUVOT01FTTsKIAkJCX0gd2hpbGUgKGVyciA8IDAgJiYgZXJyICE9IC1FQ09OTlJFRlVTRUQpOwogCQkJc2tiX3B1bGwoc2tiLCBybGVuKTsKIAkJfQogCQlrZnJlZV9za2Ioc2tiKTsKIAl9Ci0JdXAoJnJ4X3F1ZXVlX3NlbWEpOworCW11dGV4X3VubG9jaygmcnhfcXVldWVfbXV0ZXgpOwogfQogCisjZGVmaW5lIGlzY3NpX2NkZXZfdG9fY29ubihfY2RldikgXAorCWlzY3NpX2Rldl90b19jb25uKF9jZGV2LT5kZXYpCisKIC8qCiAgKiBpU0NTSSBjb25uZWN0aW9uIGF0dHJzCiAgKi8KQEAgLTkzNCwxMiArOTk0LDEwIEBACiBzaG93X2Nvbm5faW50X3BhcmFtXyMjcGFyYW0oc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQlcCiB7CQkJCQkJCQkJXAogCXVpbnQzMl90IHZhbHVlID0gMDsJCQkJCQlcCi0Jc3RydWN0IGlzY3NpX2lmX2Nvbm4gKmNvbm4gPSBpc2NzaV9jZGV2X3RvX2lmX2Nvbm4oY2Rldik7CVwKLQlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKnByaXY7CQkJCQlcCisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uID0gaXNjc2lfY2Rldl90b19jb25uKGNkZXYpOwkJXAorCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnQgPSBjb25uLT50cmFuc3BvcnQ7CQkJXAogCQkJCQkJCQkJXAotCXByaXYgPSB0b19pc2NzaV9pbnRlcm5hbChjb25uLT5ob3N0LT50cmFuc3BvcnR0KTsJCVwKLQlpZiAocHJpdi0+cGFyYW1fbWFzayAmICgxIDw8IHBhcmFtKSkJCQkJXAotCQlwcml2LT5pc2NzaV90cmFuc3BvcnQtPmdldF9wYXJhbShjb25uLT5jb25uaCwgcGFyYW0sICZ2YWx1ZSk7IFwKKwl0LT5nZXRfY29ubl9wYXJhbShjb25uLT5kZF9kYXRhLCBwYXJhbSwgJnZhbHVlKTsJCVwKIAlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgZm9ybWF0IlxuIiwgdmFsdWUpOwkJCVwKIH0KIApAQCAtOTU0LDYgKzEwMTIsOSBAQAogaXNjc2lfY29ubl9pbnRfYXR0cihpZm1hcmtlciwgSVNDU0lfUEFSQU1fSUZNQVJLRVJfRU4sICIlZCIpOwogaXNjc2lfY29ubl9pbnRfYXR0cihvZm1hcmtlciwgSVNDU0lfUEFSQU1fT0ZNQVJLRVJfRU4sICIlZCIpOwogCisjZGVmaW5lIGlzY3NpX2NkZXZfdG9fc2Vzc2lvbihfY2RldikgXAorCWlzY3NpX2Rldl90b19zZXNzaW9uKF9jZGV2LT5kZXYpCisKIC8qCiAgKiBpU0NTSSBzZXNzaW9uIGF0dHJzCiAgKi8KQEAgLTk2MiwyMCArMTAyMywxMSBAQAogc2hvd19zZXNzaW9uX2ludF9wYXJhbV8jI3BhcmFtKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikJXAogewkJCQkJCQkJCVwKIAl1aW50MzJfdCB2YWx1ZSA9IDA7CQkJCQkJXAotCXN0cnVjdCBpc2NzaV9pZl9zZXNzaW9uICpzZXNzaW9uID0gaXNjc2lfY2Rldl90b19pZl9zZXNzaW9uKGNkZXYpOyBcCi0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9pZl9zZXNzaW9uX3RvX3Nob3N0KHNlc3Npb24pOwlcCi0Jc3RydWN0IGlzY3NpX2ludGVybmFsICpwcml2ID0gdG9faXNjc2lfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOyBcCi0Jc3RydWN0IGlzY3NpX2lmX2Nvbm4gKmNvbm4gPSBOVUxMOwkJCQlcCi0JdW5zaWduZWQgbG9uZyAgZmxhZ3M7CQkJCQkJXAorCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbiA9IGlzY3NpX2NkZXZfdG9fc2Vzc2lvbihjZGV2KTsJXAorCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gaXNjc2lfc2Vzc2lvbl90b19zaG9zdChzZXNzaW9uKTsJXAorCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnQgPSBzZXNzaW9uLT50cmFuc3BvcnQ7CQkJXAogCQkJCQkJCQkJXAotCXNwaW5fbG9ja19pcnFzYXZlKCZjb25ubG9jaywgZmxhZ3MpOwkJCQlcCi0JaWYgKCFsaXN0X2VtcHR5KCZzZXNzaW9uLT5jb25uZWN0aW9ucykpCQkJCVwKLQkJY29ubiA9IGxpc3RfZW50cnkoc2Vzc2lvbi0+Y29ubmVjdGlvbnMubmV4dCwJCVwKLQkJCQkgIHN0cnVjdCBpc2NzaV9pZl9jb25uLCBzZXNzaW9uX2xpc3QpOwlcCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29ubmxvY2ssIGZsYWdzKTsJCQlcCi0JCQkJCQkJCQlcCi0JaWYgKGNvbm4gJiYgKHByaXYtPnBhcmFtX21hc2sgJiAoMSA8PCBwYXJhbSkpKQkJCVwKLQkJcHJpdi0+aXNjc2lfdHJhbnNwb3J0LT5nZXRfcGFyYW0oY29ubi0+Y29ubmgsIHBhcmFtLCAmdmFsdWUpO1wKKwl0LT5nZXRfc2Vzc2lvbl9wYXJhbShzaG9zdCwgcGFyYW0sICZ2YWx1ZSk7CQkJXAogCXJldHVybiBzbnByaW50ZihidWYsIDIwLCBmb3JtYXQiXG4iLCB2YWx1ZSk7CQkJXAogfQogCkBAIC0xMDA0LDIzICsxMDU2LDE4IEBACiAJCWNvdW50Kys7CQkJCQkJXAogCX0KIAotc3RhdGljIGludCBpc2NzaV9pc19zZXNzaW9uX2Rldihjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGRldi0+cmVsZWFzZSA9PSBpc2NzaV9pZl9zZXNzaW9uX2Rldl9yZWxlYXNlOwotfQotCiBzdGF0aWMgaW50IGlzY3NpX3Nlc3Npb25fbWF0Y2goc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQsCiAJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGlzY3NpX2lmX3Nlc3Npb24gKnNlc3Npb247CisJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uOwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwogCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqcHJpdjsKIAogCWlmICghaXNjc2lfaXNfc2Vzc2lvbl9kZXYoZGV2KSkKIAkJcmV0dXJuIDA7CiAKLQlzZXNzaW9uID0gaXNjc2lfZGV2X3RvX2lmX3Nlc3Npb24oZGV2KTsKLQlzaG9zdCA9IGlzY3NpX2lmX3Nlc3Npb25fdG9fc2hvc3Qoc2Vzc2lvbik7CisJc2Vzc2lvbiA9IGlzY3NpX2Rldl90b19zZXNzaW9uKGRldik7CisJc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KHNlc3Npb24pOwogCWlmICghc2hvc3QtPnRyYW5zcG9ydHQpCiAJCXJldHVybiAwOwogCkBAIC0xMDMxLDIzICsxMDc4LDIxIEBACiAJcmV0dXJuICZwcml2LT5zZXNzaW9uX2NvbnQuYWMgPT0gY29udDsKIH0KIAotc3RhdGljIGludCBpc2NzaV9pc19jb25uX2Rldihjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGRldi0+cmVsZWFzZSA9PSBpc2NzaV9pZl9jb25uX2Rldl9yZWxlYXNlOwotfQotCiBzdGF0aWMgaW50IGlzY3NpX2Nvbm5fbWF0Y2goc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQsCiAJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGlzY3NpX2lmX2Nvbm4gKmNvbm47CisJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uOworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubjsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKIAlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKnByaXY7CiAKIAlpZiAoIWlzY3NpX2lzX2Nvbm5fZGV2KGRldikpCiAJCXJldHVybiAwOwogCi0JY29ubiA9IGlzY3NpX2Rldl90b19pZl9jb25uKGRldik7Ci0Jc2hvc3QgPSBjb25uLT5ob3N0OworCWNvbm4gPSBpc2NzaV9kZXZfdG9fY29ubihkZXYpOworCXNlc3Npb24gPSBpc2NzaV9kZXZfdG9fc2Vzc2lvbihjb25uLT5kZXYucGFyZW50KTsKKwlzaG9zdCA9IGlzY3NpX3Nlc3Npb25fdG9fc2hvc3Qoc2Vzc2lvbik7CisKIAlpZiAoIXNob3N0LT50cmFuc3BvcnR0KQogCQlyZXR1cm4gMDsKIApAQCAtMTA1OCw3ICsxMTAzLDggQEAKIAlyZXR1cm4gJnByaXYtPmNvbm5fY29udC5hYyA9PSBjb250OwogfQogCi1pbnQgaXNjc2lfcmVnaXN0ZXJfdHJhbnNwb3J0KHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnR0KQorc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICoKK2lzY3NpX3JlZ2lzdGVyX3RyYW5zcG9ydChzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0dCkKIHsKIAlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKnByaXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEwNjgsMTUgKzExMTQsMTQgQEAKIAogCXByaXYgPSBpc2NzaV9pZl90cmFuc3BvcnRfbG9va3VwKHR0KTsKIAlpZiAocHJpdikKLQkJcmV0dXJuIC1FRVhJU1Q7CisJCXJldHVybiBOVUxMOwogCiAJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KQotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CiAJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOwogCUlOSVRfTElTVF9IRUFEKCZwcml2LT5saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmcHJpdi0+c2Vzc2lvbnMpOwotCXNwaW5fbG9ja19pbml0KCZwcml2LT5zZXNzaW9uX2xvY2spOwogCXByaXYtPmlzY3NpX3RyYW5zcG9ydCA9IHR0OwogCiAJcHJpdi0+Y2Rldi5jbGFzcyA9ICZpc2NzaV90cmFuc3BvcnRfY2xhc3M7CkBAIC0xMTQyLDEzICsxMTg3LDEzIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjc2lfdHJhbnNwb3J0X2xvY2ssIGZsYWdzKTsKIAogCXByaW50ayhLRVJOX05PVElDRSAiaXNjc2k6IHJlZ2lzdGVyZWQgdHJhbnNwb3J0ICglcylcbiIsIHR0LT5uYW1lKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gJnByaXYtPnQ7CiAKIHVucmVnaXN0ZXJfY2RldjoKIAljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmcHJpdi0+Y2Rldik7CiBmcmVlX3ByaXY6CiAJa2ZyZWUocHJpdik7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3JlZ2lzdGVyX3RyYW5zcG9ydCk7CiAKQEAgLTExNTksMTkgKzEyMDQsMTEgQEAKIAogCUJVR19PTighdHQpOwogCi0JZG93bigmcnhfcXVldWVfc2VtYSk7CisJbXV0ZXhfbG9jaygmcnhfcXVldWVfbXV0ZXgpOwogCiAJcHJpdiA9IGlzY3NpX2lmX3RyYW5zcG9ydF9sb29rdXAodHQpOwogCUJVR19PTiAoIXByaXYpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNlc3Npb25fbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmcHJpdi0+c2Vzc2lvbnMpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNlc3Npb25fbG9jaywgZmxhZ3MpOwotCQl1cCgmcnhfcXVldWVfc2VtYSk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNlc3Npb25fbG9jaywgZmxhZ3MpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY3NpX3RyYW5zcG9ydF9sb2NrLCBmbGFncyk7CiAJbGlzdF9kZWwoJnByaXYtPmxpc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY3NpX3RyYW5zcG9ydF9sb2NrLCBmbGFncyk7CkBAIC0xMTgxLDcgKzEyMTgsNyBAQAogCiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwcml2LT5jZGV2LmtvYmosICZpc2NzaV90cmFuc3BvcnRfZ3JvdXApOwogCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZwcml2LT5jZGV2KTsKLQl1cCgmcnhfcXVldWVfc2VtYSk7CisJbXV0ZXhfdW5sb2NrKCZyeF9xdWV1ZV9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExOTQsMTQgKzEyMzEsMTQgQEAKIAogCWlmIChldmVudCA9PSBORVRMSU5LX1VSRUxFQVNFICYmCiAJICAgIG4tPnByb3RvY29sID09IE5FVExJTktfSVNDU0kgJiYgbi0+cGlkKSB7Ci0JCXN0cnVjdCBpc2NzaV9pZl9jb25uICpjb25uOworCQlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm47CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkJbWVtcG9vbF96b25lX2NvbXBsZXRlKCZ6X3JlcGx5KTsKKwkJbWVtcG9vbF96b25lX2NvbXBsZXRlKHpfcmVwbHkpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY29ubmxvY2ssIGZsYWdzKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmY29ubmxpc3QsIGNvbm5fbGlzdCkgewotCQkJbWVtcG9vbF96b25lX2NvbXBsZXRlKCZjb25uLT56X2Vycm9yKTsKLQkJCW1lbXBvb2xfem9uZV9jb21wbGV0ZSgmY29ubi0+el9wZHUpOworCQkJbWVtcG9vbF96b25lX2NvbXBsZXRlKGNvbm4tPnpfZXJyb3IpOworCQkJbWVtcG9vbF96b25lX2NvbXBsZXRlKGNvbm4tPnpfcGR1KTsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25ubG9jaywgZmxhZ3MpOwogCX0KQEAgLTEyMzQsMTUgKzEyNzEsMTUgQEAKIAkJZ290byB1bnJlZ2lzdGVyX3Nlc3Npb25fY2xhc3M7CiAKIAlubHMgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19JU0NTSSwgMSwgaXNjc2lfaWZfcngsCi0JCQkJICAgIFRISVNfTU9EVUxFKTsKKwkJCVRISVNfTU9EVUxFKTsKIAlpZiAoIW5scykgewogCQllcnIgPSAtRU5PQlVGUzsKIAkJZ290byB1bnJlZ2lzdGVyX25vdGlmaWVyOwogCX0KIAotCWVyciA9IG1lbXBvb2xfem9uZV9pbml0KCZ6X3JlcGx5LCBaX01BWF9SRVBMWSwKKwl6X3JlcGx5ID0gbWVtcG9vbF96b25lX2luaXQoWl9NQVhfUkVQTFksCiAJCU5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaXNjc2lfdWV2ZW50KSksIFpfSElXQVRfUkVQTFkpOwotCWlmICghZXJyKQorCWlmICh6X3JlcGx5KQogCQlyZXR1cm4gMDsKIAogCXNvY2tfcmVsZWFzZShubHMtPnNrX3NvY2tldCk7CkBAIC0xMjU5LDcgKzEyOTYsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXNjc2lfdHJhbnNwb3J0X2V4aXQodm9pZCkKIHsKLQltZW1wb29sX2Rlc3Ryb3koel9yZXBseS5wb29sKTsKKwltZW1wb29sX3pvbmVfZGVzdHJveSh6X3JlcGx5KTsKIAlzb2NrX3JlbGVhc2UobmxzLT5za19zb2NrZXQpOwogCW5ldGxpbmtfdW5yZWdpc3Rlcl9ub3RpZmllcigmaXNjc2lfbmxfbm90aWZpZXIpOwogCXRyYW5zcG9ydF9jbGFzc191bnJlZ2lzdGVyKCZpc2NzaV9jb25uZWN0aW9uX2NsYXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYwppbmRleCBlZGFiYmQwLi5hM2UwYjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgpAQCAtNjIsNyArNjMsNyBAQAogCiBzdHJ1Y3Qgc2FzX2hvc3RfYXR0cnMgewogCXN0cnVjdCBsaXN0X2hlYWQgcnBoeV9saXN0OwotCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKIAl1MzIgbmV4dF90YXJnZXRfaWQ7CiB9OwogI2RlZmluZSB0b19zYXNfaG9zdF9hdHRycyhob3N0KQkoKHN0cnVjdCBzYXNfaG9zdF9hdHRycyAqKShob3N0KS0+c2hvc3RfZGF0YSkKQEAgLTE2NSw3ICsxNjYsNyBAQAogCXN0cnVjdCBzYXNfaG9zdF9hdHRycyAqc2FzX2hvc3QgPSB0b19zYXNfaG9zdF9hdHRycyhzaG9zdCk7CiAKIAlJTklUX0xJU1RfSEVBRCgmc2FzX2hvc3QtPnJwaHlfbGlzdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnNhc19ob3N0LT5sb2NrKTsKKwltdXRleF9pbml0KCZzYXNfaG9zdC0+bG9jayk7CiAJc2FzX2hvc3QtPm5leHRfdGFyZ2V0X2lkID0gMDsKIAlyZXR1cm4gMDsKIH0KQEAgLTYyNiw3ICs2MjcsNyBAQAogCXRyYW5zcG9ydF9hZGRfZGV2aWNlKCZycGh5LT5kZXYpOwogCXRyYW5zcG9ydF9jb25maWd1cmVfZGV2aWNlKCZycGh5LT5kZXYpOwogCi0Jc3Bpbl9sb2NrKCZzYXNfaG9zdC0+bG9jayk7CisJbXV0ZXhfbG9jaygmc2FzX2hvc3QtPmxvY2spOwogCWxpc3RfYWRkX3RhaWwoJnJwaHktPmxpc3QsICZzYXNfaG9zdC0+cnBoeV9saXN0KTsKIAlpZiAoaWRlbnRpZnktPmRldmljZV90eXBlID09IFNBU19FTkRfREVWSUNFICYmCiAJICAgIChpZGVudGlmeS0+dGFyZ2V0X3BvcnRfcHJvdG9jb2xzICYKQEAgLTYzNCwxMCArNjM1LDEwIEBACiAJCXJwaHktPnNjc2lfdGFyZ2V0X2lkID0gc2FzX2hvc3QtPm5leHRfdGFyZ2V0X2lkKys7CiAJZWxzZQogCQlycGh5LT5zY3NpX3RhcmdldF9pZCA9IC0xOwotCXNwaW5fdW5sb2NrKCZzYXNfaG9zdC0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZzYXNfaG9zdC0+bG9jayk7CiAKIAlpZiAocnBoeS0+c2NzaV90YXJnZXRfaWQgIT0gLTEpIHsKLQkJc2NzaV9zY2FuX3RhcmdldCgmcnBoeS0+ZGV2LCBwYXJlbnQtPm51bWJlciwKKwkJc2NzaV9zY2FuX3RhcmdldCgmcnBoeS0+ZGV2LCBwYXJlbnQtPnBvcnRfaWRlbnRpZmllciwKIAkJCQlycGh5LT5zY3NpX3RhcmdldF9pZCwgfjAsIDApOwogCX0KIApAQCAtNjYxLDkgKzY2Miw5IEBACiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3QocnBoeS0+ZGV2LnBhcmVudC0+cGFyZW50KTsKIAlzdHJ1Y3Qgc2FzX2hvc3RfYXR0cnMgKnNhc19ob3N0ID0gdG9fc2FzX2hvc3RfYXR0cnMoc2hvc3QpOwogCi0Jc3Bpbl9sb2NrKCZzYXNfaG9zdC0+bG9jayk7CisJbXV0ZXhfbG9jaygmc2FzX2hvc3QtPmxvY2spOwogCWxpc3RfZGVsKCZycGh5LT5saXN0KTsKLQlzcGluX3VubG9jaygmc2FzX2hvc3QtPmxvY2spOworCW11dGV4X3VubG9jaygmc2FzX2hvc3QtPmxvY2spOwogCiAJdHJhbnNwb3J0X2Rlc3Ryb3lfZGV2aWNlKCZycGh5LT5kZXYpOwogCXB1dF9kZXZpY2UocnBoeS0+ZGV2LnBhcmVudCk7CkBAIC02ODcsMTUgKzY4OCwyNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHBhcmVudC0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHNhc19ob3N0X2F0dHJzICpzYXNfaG9zdCA9IHRvX3Nhc19ob3N0X2F0dHJzKHNob3N0KTsKIAotCXNjc2lfcmVtb3ZlX3RhcmdldChkZXYpOworCXN3aXRjaCAocnBoeS0+aWRlbnRpZnkuZGV2aWNlX3R5cGUpIHsKKwljYXNlIFNBU19FTkRfREVWSUNFOgorCQlzY3NpX3JlbW92ZV90YXJnZXQoZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBTQVNfRURHRV9FWFBBTkRFUl9ERVZJQ0U6CisJY2FzZSBTQVNfRkFOT1VUX0VYUEFOREVSX0RFVklDRToKKwkJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKGRldiwgTlVMTCwgZG9fc2FzX3BoeV9kZWxldGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKIAl0cmFuc3BvcnRfcmVtb3ZlX2RldmljZShkZXYpOwogCWRldmljZV9kZWwoZGV2KTsKIAl0cmFuc3BvcnRfZGVzdHJveV9kZXZpY2UoZGV2KTsKIAotCXNwaW5fbG9jaygmc2FzX2hvc3QtPmxvY2spOworCW11dGV4X2xvY2soJnNhc19ob3N0LT5sb2NrKTsKIAlsaXN0X2RlbCgmcnBoeS0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnNhc19ob3N0LT5sb2NrKTsKKwltdXRleF91bmxvY2soJnNhc19ob3N0LT5sb2NrKTsKKworCXBhcmVudC0+cnBoeSA9IE5VTEw7CiAKIAlwdXRfZGV2aWNlKCZwYXJlbnQtPmRldik7CiB9CkBAIC03MTksMjMgKzczMiwyOCBAQAogICogU0NTSSBzY2FuIGhlbHBlcgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpzYXNfdGFyZ2V0X3BhcmVudChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKLQkJCQkJaW50IGNoYW5uZWwsIHVpbnQgaWQpCitzdGF0aWMgaW50IHNhc191c2VyX3NjYW4oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVpbnQgY2hhbm5lbCwKKwkJdWludCBpZCwgdWludCBsdW4pCiB7CiAJc3RydWN0IHNhc19ob3N0X2F0dHJzICpzYXNfaG9zdCA9IHRvX3Nhc19ob3N0X2F0dHJzKHNob3N0KTsKIAlzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKIAotCXNwaW5fbG9jaygmc2FzX2hvc3QtPmxvY2spOworCW11dGV4X2xvY2soJnNhc19ob3N0LT5sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJwaHksICZzYXNfaG9zdC0+cnBoeV9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBzYXNfcGh5ICpwYXJlbnQgPSBkZXZfdG9fcGh5KHJwaHktPmRldi5wYXJlbnQpOwotCQlpZiAocGFyZW50LT5udW1iZXIgPT0gY2hhbm5lbCAmJgotCQkgICAgcnBoeS0+c2NzaV90YXJnZXRfaWQgPT0gaWQpCi0JCQlkZXYgPSAmcnBoeS0+ZGV2OwotCX0KLQlzcGluX3VubG9jaygmc2FzX2hvc3QtPmxvY2spOwogCi0JcmV0dXJuIGRldjsKKwkJaWYgKHJwaHktPnNjc2lfdGFyZ2V0X2lkID09IC0xKQorCQkJY29udGludWU7CisKKwkJaWYgKChjaGFubmVsID09IFNDQU5fV0lMRF9DQVJEIHx8IGNoYW5uZWwgPT0gcGFyZW50LT5wb3J0X2lkZW50aWZpZXIpICYmCisJCSAgICAoaWQgPT0gU0NBTl9XSUxEX0NBUkQgfHwgaWQgPT0gcnBoeS0+c2NzaV90YXJnZXRfaWQpKSB7CisJCQlzY3NpX3NjYW5fdGFyZ2V0KCZycGh5LT5kZXYsIHBhcmVudC0+cG9ydF9pZGVudGlmaWVyLAorCQkJCQkgcnBoeS0+c2NzaV90YXJnZXRfaWQsIGx1biwgMSk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZzYXNfaG9zdC0+bG9jayk7CisKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC03ODAsNyArNzk4LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJbWVtc2V0KGksIDAsIHNpemVvZihzdHJ1Y3Qgc2FzX2ludGVybmFsKSk7CiAKLQlpLT50LnRhcmdldF9wYXJlbnQgPSBzYXNfdGFyZ2V0X3BhcmVudDsKKwlpLT50LnVzZXJfc2NhbiA9IHNhc191c2VyX3NjYW47CiAKIAlpLT50Lmhvc3RfYXR0cnMuYWMuYXR0cnMgPSAmaS0+aG9zdF9hdHRyc1swXTsKIAlpLT50Lmhvc3RfYXR0cnMuYWMuY2xhc3MgPSAmc2FzX2hvc3RfY2xhc3MuY2xhc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMKaW5kZXggNDZkYTZmZS4uN2VlOTVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgInNjc2lfcHJpdi5oIgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KQEAgLTQ4LDcgKzQ4LDcgQEAKIAogLyogUHJpdmF0ZSBkYXRhIGFjY2Vzc29ycyAoa2VlcCB0aGVzZSBvdXQgb2YgdGhlIGhlYWRlciBmaWxlKSAqLwogI2RlZmluZSBzcGlfZHZfcGVuZGluZyh4KSAoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPmR2X3BlbmRpbmcpCi0jZGVmaW5lIHNwaV9kdl9zZW0oeCkgKCgoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmKHgpLT5zdGFyZ2V0X2RhdGEpLT5kdl9zZW0pCisjZGVmaW5lIHNwaV9kdl9tdXRleCh4KSAoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPmR2X211dGV4KQogCiBzdHJ1Y3Qgc3BpX2ludGVybmFsIHsKIAlzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgdDsKQEAgLTI0Miw3ICsyNDIsNyBAQAogCXNwaV9ob2xkX21jcyhzdGFyZ2V0KSA9IDA7CiAJc3BpX2R2X3BlbmRpbmcoc3RhcmdldCkgPSAwOwogCXNwaV9pbml0aWFsX2R2KHN0YXJnZXQpID0gMDsKLQlpbml0X01VVEVYKCZzcGlfZHZfc2VtKHN0YXJnZXQpKTsKKwltdXRleF9pbml0KCZzcGlfZHZfbXV0ZXgoc3RhcmdldCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MTUsNyArOTE1LDcgQEAKIAlzY3NpX3RhcmdldF9xdWllc2NlKHN0YXJnZXQpOwogCiAJc3BpX2R2X3BlbmRpbmcoc3RhcmdldCkgPSAxOwotCWRvd24oJnNwaV9kdl9zZW0oc3RhcmdldCkpOworCW11dGV4X2xvY2soJnNwaV9kdl9tdXRleChzdGFyZ2V0KSk7CiAKIAlzdGFyZ2V0X3ByaW50ayhLRVJOX0lORk8sIHN0YXJnZXQsICJCZWdpbm5pbmcgRG9tYWluIFZhbGlkYXRpb25cbiIpOwogCkBAIC05MjMsNyArOTIzLDcgQEAKIAogCXN0YXJnZXRfcHJpbnRrKEtFUk5fSU5GTywgc3RhcmdldCwgIkVuZGluZyBEb21haW4gVmFsaWRhdGlvblxuIik7CiAKLQl1cCgmc3BpX2R2X3NlbShzdGFyZ2V0KSk7CisJbXV0ZXhfdW5sb2NrKCZzcGlfZHZfbXV0ZXgoc3RhcmdldCkpOwogCXNwaV9kdl9wZW5kaW5nKHN0YXJnZXQpID0gMDsKIAogCXNjc2lfdGFyZ2V0X3Jlc3VtZShzdGFyZ2V0KTsKQEAgLTEwNzUsNyArMTA3NSw3IEBACiAvKiAweDA0ICovICJQYXJhbGxlbCBQcm90b2NvbCBSZXF1ZXN0IgogfTsKIAotdm9pZCBwcmludF9uZWdvKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZywgaW50IHBlciwgaW50IG9mZiwgaW50IHdpZHRoKQorc3RhdGljIHZvaWQgcHJpbnRfbmVnbyhjb25zdCB1bnNpZ25lZCBjaGFyICptc2csIGludCBwZXIsIGludCBvZmYsIGludCB3aWR0aCkKIHsKIAlpZiAocGVyKSB7CiAJCWNoYXIgYnVmWzIwXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZC5jIGIvZHJpdmVycy9zY3NpL3NkLmMKaW5kZXggNGM1MTI3ZS4uOTMwZGIzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkLmMKKysrIGIvZHJpdmVycy9zY3NpL3NkLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgpAQCAtMTExLDcgKzExMiw3IEBACiAvKiBUaGlzIHNlbWFwaG9yZSBpcyB1c2VkIHRvIG1lZGlhdGUgdGhlIDAtPjEgcmVmZXJlbmNlIGdldCBpbiB0aGUKICAqIGZhY2Ugb2Ygb2JqZWN0IGRlc3RydWN0aW9uIChpLmUuIHdlIGNhbid0IGFsbG93IGEgZ2V0IG9uIGFuCiAgKiBvYmplY3QgYWZ0ZXIgbGFzdCBwdXQpICovCi1zdGF0aWMgREVDTEFSRV9NVVRFWChzZF9yZWZfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoc2RfcmVmX211dGV4KTsKIAogc3RhdGljIGludCBzZF9yZXZhbGlkYXRlX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spOwogc3RhdGljIHZvaWQgc2RfcndfaW50cihzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpOwpAQCAtMTkzLDkgKzE5NCw5IEBACiB7CiAJc3RydWN0IHNjc2lfZGlzayAqc2RrcDsKIAotCWRvd24oJnNkX3JlZl9zZW0pOworCW11dGV4X2xvY2soJnNkX3JlZl9tdXRleCk7CiAJc2RrcCA9IF9fc2NzaV9kaXNrX2dldChkaXNrKTsKLQl1cCgmc2RfcmVmX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzZF9yZWZfbXV0ZXgpOwogCXJldHVybiBzZGtwOwogfQogCkBAIC0yMDMsMTEgKzIwNCwxMSBAQAogewogCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3A7CiAKLQlkb3duKCZzZF9yZWZfc2VtKTsKKwltdXRleF9sb2NrKCZzZF9yZWZfbXV0ZXgpOwogCXNka3AgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpZiAoc2RrcCkKIAkJc2RrcCA9IF9fc2NzaV9kaXNrX2dldChzZGtwLT5kaXNrKTsKLQl1cCgmc2RfcmVmX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzZF9yZWZfbXV0ZXgpOwogCXJldHVybiBzZGtwOwogfQogCkBAIC0yMTUsMTAgKzIxNiwxMCBAQAogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNka3AtPmRldmljZTsKIAotCWRvd24oJnNkX3JlZl9zZW0pOworCW11dGV4X2xvY2soJnNkX3JlZl9tdXRleCk7CiAJa3JlZl9wdXQoJnNka3AtPmtyZWYsIHNjc2lfZGlza19yZWxlYXNlKTsKIAlzY3NpX2RldmljZV9wdXQoc2Rldik7Ci0JdXAoJnNkX3JlZl9zZW0pOworCW11dGV4X3VubG9jaygmc2RfcmVmX211dGV4KTsKIH0KIAogLyoqCkBAIC0yMzEsMzQgKzIzMiwxMiBAQAogICoqLwogc3RhdGljIGludCBzZF9pbml0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQogewotCXVuc2lnbmVkIGludCB0aGlzX2NvdW50LCB0aW1lb3V0OwotCXN0cnVjdCBnZW5kaXNrICpkaXNrOwotCXNlY3Rvcl90IGJsb2NrOwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gU0NwbnQtPmRldmljZTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBTQ3BudC0+cmVxdWVzdDsKLQotCXRpbWVvdXQgPSBzZHAtPnRpbWVvdXQ7Ci0KLQkvKgotCSAqIFNHX0lPIGZyb20gYmxvY2sgbGF5ZXIgYWxyZWFkeSBzZXR1cCwganVzdCBjb3B5IGNkYiBiYXNpY2FsbHkKLQkgKi8KLQlpZiAoYmxrX3BjX3JlcXVlc3QocnEpKSB7Ci0JCXNjc2lfc2V0dXBfYmxrX3BjX2NtbmQoU0NwbnQpOwotCQlpZiAocnEtPnRpbWVvdXQpCi0JCQl0aW1lb3V0ID0gcnEtPnRpbWVvdXQ7Ci0KLQkJZ290byBxdWV1ZTsKLQl9Ci0KLQkvKgotCSAqIHdlIG9ubHkgZG8gUkVRX0NNRCBhbmQgUkVRX0JMT0NLX1BDCi0JICovCi0JaWYgKCFibGtfZnNfcmVxdWVzdChycSkpCi0JCXJldHVybiAwOwotCi0JZGlzayA9IHJxLT5ycV9kaXNrOwotCWJsb2NrID0gcnEtPnNlY3RvcjsKLQl0aGlzX2NvdW50ID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA+PiA5OworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gcnEtPnJxX2Rpc2s7CisJc2VjdG9yX3QgYmxvY2sgPSBycS0+c2VjdG9yOworCXVuc2lnbmVkIGludCB0aGlzX2NvdW50ID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA+PiA5OworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gc2RwLT50aW1lb3V0OwogCiAJU0NTSV9MT0dfSExRVUVVRSgxLCBwcmludGsoInNkX2luaXRfY29tbWFuZDogZGlzaz0lcywgYmxvY2s9JWxsdSwgIgogCQkJICAgICJjb3VudD0lZFxuIiwgZGlzay0+ZGlza19uYW1lLApAQCAtNDAxLDggKzM4MCw2IEBACiAJU0NwbnQtPnRyYW5zZmVyc2l6ZSA9IHNkcC0+c2VjdG9yX3NpemU7CiAJU0NwbnQtPnVuZGVyZmxvdyA9IHRoaXNfY291bnQgPDwgOTsKIAlTQ3BudC0+YWxsb3dlZCA9IFNEX01BWF9SRVRSSUVTOwotCi1xdWV1ZToKIAlTQ3BudC0+dGltZW91dF9wZXJfY29tbWFuZCA9IHRpbWVvdXQ7CiAKIAkvKgpAQCAtODM2LDE1ICs4MTMsNyBAQAogCSAgIHJlbGF0aXZlbHkgcmFyZSBlcnJvciBjb25kaXRpb24sIG5vIGNhcmUgaXMgdGFrZW4gdG8gYXZvaWQKIAkgICB1bm5lY2Vzc2FyeSBhZGRpdGlvbmFsIHdvcmsgc3VjaCBhcyBtZW1jcHkncyB0aGF0IGNvdWxkIGJlIGF2b2lkZWQuCiAJICovCi0KLQkvKiAKLQkgKiBJZiBTR19JTyBmcm9tIGJsb2NrIGxheWVyIHRoZW4gc2V0IGdvb2RfYnl0ZXMgdG8gc3RvcCByZXRyaWVzOwotCSAqIGVsc2UgaWYgZXJyb3JzLCBjaGVjayB0aGVtLCBhbmQgaWYgbmVjZXNzYXJ5IHByZXBhcmUgZm9yCi0JICogKHBhcnRpYWwpIHJldHJpZXMuCi0JICovCi0JaWYgKGJsa19wY19yZXF1ZXN0KFNDcG50LT5yZXF1ZXN0KSkKLQkJZ29vZF9ieXRlcyA9IHRoaXNfY291bnQ7Ci0JZWxzZSBpZiAoZHJpdmVyX2J5dGUocmVzdWx0KSAhPSAwICYmCisJaWYgKGRyaXZlcl9ieXRlKHJlc3VsdCkgIT0gMCAmJgogCQkgc2Vuc2VfdmFsaWQgJiYgIXNlbnNlX2RlZmVycmVkKSB7CiAJCXN3aXRjaCAoc3NoZHIuc2Vuc2Vfa2V5KSB7CiAJCWNhc2UgTUVESVVNX0VSUk9SOgpAQCAtMTYzNSwxMCArMTYwNCwxMCBAQAogCWRlbF9nZW5kaXNrKHNka3AtPmRpc2spOwogCXNkX3NodXRkb3duKGRldik7CiAKLQlkb3duKCZzZF9yZWZfc2VtKTsKKwltdXRleF9sb2NrKCZzZF9yZWZfbXV0ZXgpOwogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogCWtyZWZfcHV0KCZzZGtwLT5rcmVmLCBzY3NpX2Rpc2tfcmVsZWFzZSk7Ci0JdXAoJnNkX3JlZl9zZW0pOworCW11dGV4X3VubG9jaygmc2RfcmVmX211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTY0Nyw3ICsxNjE2LDcgQEAKICAqCXNjc2lfZGlza19yZWxlYXNlIC0gQ2FsbGVkIHRvIGZyZWUgdGhlIHNjc2lfZGlzayBzdHJ1Y3R1cmUKICAqCUBrcmVmOiBwb2ludGVyIHRvIGVtYmVkZGVkIGtyZWYKICAqCi0gKglzZF9yZWZfc2VtIG11c3QgYmUgaGVsZCBlbnRlcmluZyB0aGlzIHJvdXRpbmUuICBCZWNhdXNlIGl0IGlzCisgKglzZF9yZWZfbXV0ZXggbXVzdCBiZSBoZWxkIGVudGVyaW5nIHRoaXMgcm91dGluZS4gIEJlY2F1c2UgaXQgaXMKICAqCWNhbGxlZCBvbiBsYXN0IHB1dCwgeW91IHNob3VsZCBhbHdheXMgdXNlIHRoZSBzY3NpX2Rpc2tfZ2V0KCkKICAqCXNjc2lfZGlza19wdXQoKSBoZWxwZXJzIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHNlbWFwaG9yZSBkaXJlY3RseQogICoJYW5kIG5ldmVyIGRvIGEgZGlyZWN0IGtyZWZfcHV0KCkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3IuYyBiL2RyaXZlcnMvc2NzaS9zci5jCmluZGV4IGE0ZDliZTcuLjk5N2Y4ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zci5jCisrKyBiL2RyaXZlcnMvc2NzaS9zci5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgpAQCAtOTAsNyArOTEsNyBAQAogLyogVGhpcyBzZW1hcGhvcmUgaXMgdXNlZCB0byBtZWRpYXRlIHRoZSAwLT4xIHJlZmVyZW5jZSBnZXQgaW4gdGhlCiAgKiBmYWNlIG9mIG9iamVjdCBkZXN0cnVjdGlvbiAoaS5lLiB3ZSBjYW4ndCBhbGxvdyBhIGdldCBvbiBhbgogICogb2JqZWN0IGFmdGVyIGxhc3QgcHV0KSAqLwotc3RhdGljIERFQ0xBUkVfTVVURVgoc3JfcmVmX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKHNyX3JlZl9tdXRleCk7CiAKIHN0YXRpYyBpbnQgc3Jfb3BlbihzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKiwgaW50KTsKIHN0YXRpYyB2b2lkIHNyX3JlbGVhc2Uoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICopOwpAQCAtMTMzLDcgKzEzNCw3IEBACiB7CiAJc3RydWN0IHNjc2lfY2QgKmNkID0gTlVMTDsKIAotCWRvd24oJnNyX3JlZl9zZW0pOworCW11dGV4X2xvY2soJnNyX3JlZl9tdXRleCk7CiAJaWYgKGRpc2stPnByaXZhdGVfZGF0YSA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAljZCA9IHNjc2lfY2QoZGlzayk7CkBAIC0xNDYsMTggKzE0NywxOCBAQAogCWtyZWZfcHV0KCZjZC0+a3JlZiwgc3Jfa3JlZl9yZWxlYXNlKTsKIAljZCA9IE5VTEw7CiAgb3V0OgotCXVwKCZzcl9yZWZfc2VtKTsKKwltdXRleF91bmxvY2soJnNyX3JlZl9tdXRleCk7CiAJcmV0dXJuIGNkOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2NzaV9jZF9wdXQoc3RydWN0IHNjc2lfY2QgKmNkKQorc3RhdGljIHZvaWQgc2NzaV9jZF9wdXQoc3RydWN0IHNjc2lfY2QgKmNkKQogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNkLT5kZXZpY2U7CiAKLQlkb3duKCZzcl9yZWZfc2VtKTsKKwltdXRleF9sb2NrKCZzcl9yZWZfbXV0ZXgpOwogCWtyZWZfcHV0KCZjZC0+a3JlZiwgc3Jfa3JlZl9yZWxlYXNlKTsKIAlzY3NpX2RldmljZV9wdXQoc2Rldik7Ci0JdXAoJnNyX3JlZl9zZW0pOworCW11dGV4X3VubG9jaygmc3JfcmVmX211dGV4KTsKIH0KIAogLyoKQEAgLTIzNyw4ICsyMzgsNiBAQAogCQljYXNlIElMTEVHQUxfUkVRVUVTVDoKIAkJCWlmICghKFNDcG50LT5zZW5zZV9idWZmZXJbMF0gJiAweDkwKSkKIAkJCQlicmVhazsKLQkJCWlmICghYmxrX2ZzX3JlcXVlc3QoU0NwbnQtPnJlcXVlc3QpKQotCQkJCWJyZWFrOwogCQkJZXJyb3Jfc2VjdG9yID0gKFNDcG50LT5zZW5zZV9idWZmZXJbM10gPDwgMjQpIHwKIAkJCQkoU0NwbnQtPnNlbnNlX2J1ZmZlcls0XSA8PCAxNikgfAogCQkJCShTQ3BudC0+c2Vuc2VfYnVmZmVyWzVdIDw8IDgpIHwKQEAgLTMxNywyMyArMzE2LDYgQEAKIAl9CiAKIAkvKgotCSAqIHRoZXNlIGFyZSBhbHJlYWR5IHNldHVwLCBqdXN0IGNvcHkgY2RiIGJhc2ljYWxseQotCSAqLwotCWlmIChTQ3BudC0+cmVxdWVzdC0+ZmxhZ3MgJiBSRVFfQkxPQ0tfUEMpIHsKLQkJc2NzaV9zZXR1cF9ibGtfcGNfY21uZChTQ3BudCk7Ci0KLQkJaWYgKFNDcG50LT50aW1lb3V0X3Blcl9jb21tYW5kKQotCQkJdGltZW91dCA9IFNDcG50LT50aW1lb3V0X3Blcl9jb21tYW5kOwotCi0JCWdvdG8gcXVldWU7Ci0JfQotCi0JaWYgKCEoU0NwbnQtPnJlcXVlc3QtPmZsYWdzICYgUkVRX0NNRCkpIHsKLQkJYmxrX2R1bXBfcnFfZmxhZ3MoU0NwbnQtPnJlcXVlc3QsICJzciB1bnN1cCBjb21tYW5kIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCiAJICogd2UgZG8gbGF6eSBibG9ja3NpemUgc3dpdGNoaW5nICh3aGVuIHJlYWRpbmcgWEEgc2VjdG9ycywKIAkgKiBzZWUgQ0RST01SRUFETU9ERTIgaW9jdGwpIAogCSAqLwpAQCAtNDIxLDggKzQwMyw2IEBACiAJICovCiAJU0NwbnQtPnRyYW5zZmVyc2l6ZSA9IGNkLT5kZXZpY2UtPnNlY3Rvcl9zaXplOwogCVNDcG50LT51bmRlcmZsb3cgPSB0aGlzX2NvdW50IDw8IDk7Ci0KLXF1ZXVlOgogCVNDcG50LT5hbGxvd2VkID0gTUFYX1JFVFJJRVM7CiAJU0NwbnQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgPSB0aW1lb3V0OwogCkBAIC03NjIsOCArNzQyLDkgQEAKIAkJLyogZmFpbGVkLCBkcml2ZSBkb2Vzbid0IGhhdmUgY2FwYWJpbGl0aWVzIG1vZGUgcGFnZSAqLwogCQljZC0+Y2RpLnNwZWVkID0gMTsKIAkJY2QtPmNkaS5tYXNrIHw9IChDRENfQ0RfUiB8IENEQ19DRF9SVyB8IENEQ19EVkRfUiB8Ci0JCQkJCSBDRENfRFZEIHwgQ0RDX0RWRF9SQU0gfAotCQkJCQkgQ0RDX1NFTEVDVF9ESVNDIHwgQ0RDX1NFTEVDVF9TUEVFRCk7CisJCQkJIENEQ19EVkQgfCBDRENfRFZEX1JBTSB8CisJCQkJIENEQ19TRUxFQ1RfRElTQyB8IENEQ19TRUxFQ1RfU1BFRUQgfAorCQkJCSBDRENfTVJXIHwgQ0RDX01SV19XIHwgQ0RDX1JBTSk7CiAJCWtmcmVlKGJ1ZmZlcik7CiAJCXByaW50aygiJXM6IHNjc2ktMSBkcml2ZVxuIiwgY2QtPmNkaS5uYW1lKTsKIAkJcmV0dXJuOwpAQCAtODQ1LDcgKzgyNiw3IEBACiAgKglzcl9rcmVmX3JlbGVhc2UgLSBDYWxsZWQgdG8gZnJlZSB0aGUgc2NzaV9jZCBzdHJ1Y3R1cmUKICAqCUBrcmVmOiBwb2ludGVyIHRvIGVtYmVkZGVkIGtyZWYKICAqCi0gKglzcl9yZWZfc2VtIG11c3QgYmUgaGVsZCBlbnRlcmluZyB0aGlzIHJvdXRpbmUuICBCZWNhdXNlIGl0IGlzCisgKglzcl9yZWZfbXV0ZXggbXVzdCBiZSBoZWxkIGVudGVyaW5nIHRoaXMgcm91dGluZS4gIEJlY2F1c2UgaXQgaXMKICAqCWNhbGxlZCBvbiBsYXN0IHB1dCwgeW91IHNob3VsZCBhbHdheXMgdXNlIHRoZSBzY3NpX2NkX2dldCgpCiAgKglzY3NpX2NkX3B1dCgpIGhlbHBlcnMgd2hpY2ggbWFuaXB1bGF0ZSB0aGUgc2VtYXBob3JlIGRpcmVjdGx5CiAgKglhbmQgbmV2ZXIgZG8gYSBkaXJlY3Qga3JlZl9wdXQoKS4KQEAgLTg3NCw5ICs4NTUsOSBAQAogCiAJZGVsX2dlbmRpc2soY2QtPmRpc2spOwogCi0JZG93bigmc3JfcmVmX3NlbSk7CisJbXV0ZXhfbG9jaygmc3JfcmVmX211dGV4KTsKIAlrcmVmX3B1dCgmY2QtPmtyZWYsIHNyX2tyZWZfcmVsZWFzZSk7Ci0JdXAoJnNyX3JlZl9zZW0pOworCW11dGV4X3VubG9jaygmc3JfcmVmX211dGV4KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMgYi9kcml2ZXJzL3Njc2kvc3JfaW9jdGwuYwppbmRleCA2ZTQ1YWMzLi41ZDAyZmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3JfaW9jdGwuYworKysgYi9kcml2ZXJzL3Njc2kvc3JfaW9jdGwuYwpAQCAtMzEsNiArMzEsNzkgQEAKIAogbW9kdWxlX3BhcmFtKHhhX3Rlc3QsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwogCisvKiBwcmltaXRpdmUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBoYXZlIEdGUF9ETUEgc2V0IGJhc2VkIG9uCisgKiB0aGUgc3RhdHVzIG9mIHRoZSB1bmNoZWNrZWRfaXNhX2RtYSBmbGFnIGluIHRoZSBob3N0IHN0cnVjdHVyZSAqLworI2RlZmluZSBTUl9HRlBfRE1BKGNkKSAoKChjZCktPmRldmljZS0+aG9zdC0+dW5jaGVja2VkX2lzYV9kbWEpID8gR0ZQX0RNQSA6IDApCisKKworc3RhdGljIGludCBzcl9yZWFkX3RvY2hkcihzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJc3RydWN0IGNkcm9tX3RvY2hkciAqdG9jaGRyKQoreworCXN0cnVjdCBzY3NpX2NkICpjZCA9IGNkaS0+aGFuZGxlOworCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisKKwlidWZmZXIgPSBrbWFsbG9jKDMyLCBHRlBfS0VSTkVMIHwgU1JfR0ZQX0RNQShjZCkpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCgmY2djLCAwLCBzaXplb2Yoc3RydWN0IHBhY2tldF9jb21tYW5kKSk7CisJY2djLnRpbWVvdXQgPSBJT0NUTF9USU1FT1VUOworCWNnYy5jbWRbMF0gPSBHUENNRF9SRUFEX1RPQ19QTUFfQVRJUDsKKwljZ2MuY21kWzhdID0gMTI7CQkvKiBMU0Igb2YgbGVuZ3RoICovCisJY2djLmJ1ZmZlciA9IGJ1ZmZlcjsKKwljZ2MuYnVmbGVuID0gMTI7CisJY2djLnF1aWV0ID0gMTsKKwljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisKKwlyZXN1bHQgPSBzcl9kb19pb2N0bChjZCwgJmNnYyk7CisKKwl0b2NoZHItPmNkdGhfdHJrMCA9IGJ1ZmZlclsyXTsKKwl0b2NoZHItPmNkdGhfdHJrMSA9IGJ1ZmZlclszXTsKKworCWtmcmVlKGJ1ZmZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBzcl9yZWFkX3RvY2VudHJ5KHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQlzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgKnRvY2VudHJ5KQoreworCXN0cnVjdCBzY3NpX2NkICpjZCA9IGNkaS0+aGFuZGxlOworCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisKKwlidWZmZXIgPSBrbWFsbG9jKDMyLCBHRlBfS0VSTkVMIHwgU1JfR0ZQX0RNQShjZCkpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCgmY2djLCAwLCBzaXplb2Yoc3RydWN0IHBhY2tldF9jb21tYW5kKSk7CisJY2djLnRpbWVvdXQgPSBJT0NUTF9USU1FT1VUOworCWNnYy5jbWRbMF0gPSBHUENNRF9SRUFEX1RPQ19QTUFfQVRJUDsKKwljZ2MuY21kWzFdIHw9ICh0b2NlbnRyeS0+Y2R0ZV9mb3JtYXQgPT0gQ0RST01fTVNGKSA/IDB4MDIgOiAwOworCWNnYy5jbWRbNl0gPSB0b2NlbnRyeS0+Y2R0ZV90cmFjazsKKwljZ2MuY21kWzhdID0gMTI7CQkvKiBMU0Igb2YgbGVuZ3RoICovCisJY2djLmJ1ZmZlciA9IGJ1ZmZlcjsKKwljZ2MuYnVmbGVuID0gMTI7CisJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCisJcmVzdWx0ID0gc3JfZG9faW9jdGwoY2QsICZjZ2MpOworCisJdG9jZW50cnktPmNkdGVfY3RybCA9IGJ1ZmZlcls1XSAmIDB4ZjsKKwl0b2NlbnRyeS0+Y2R0ZV9hZHIgPSBidWZmZXJbNV0gPj4gNDsKKwl0b2NlbnRyeS0+Y2R0ZV9kYXRhbW9kZSA9ICh0b2NlbnRyeS0+Y2R0ZV9jdHJsICYgMHgwNCkgPyAxIDogMDsKKwlpZiAodG9jZW50cnktPmNkdGVfZm9ybWF0ID09IENEUk9NX01TRikgeworCQl0b2NlbnRyeS0+Y2R0ZV9hZGRyLm1zZi5taW51dGUgPSBidWZmZXJbOV07CisJCXRvY2VudHJ5LT5jZHRlX2FkZHIubXNmLnNlY29uZCA9IGJ1ZmZlclsxMF07CisJCXRvY2VudHJ5LT5jZHRlX2FkZHIubXNmLmZyYW1lID0gYnVmZmVyWzExXTsKKwl9IGVsc2UKKwkJdG9jZW50cnktPmNkdGVfYWRkci5sYmEgPSAoKCgoKGJ1ZmZlcls4XSA8PCA4KSArIGJ1ZmZlcls5XSkgPDwgOCkKKwkJCSsgYnVmZmVyWzEwXSkgPDwgOCkgKyBidWZmZXJbMTFdOworCisJa2ZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQogCiAjZGVmaW5lIElPQ1RMX1JFVFJJRVMgMwogCkBAIC00NSw3ICsxMTgsOCBAQAogCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CiAJaW50IG50cmFja3MsIHJldDsKIAotCWlmICgocmV0ID0gc3JfYXVkaW9faW9jdGwoY2RpLCBDRFJPTVJFQURUT0NIRFIsICZ0b2NoZHIpKSkKKwlyZXQgPSBzcl9yZWFkX3RvY2hkcihjZGksICZ0b2NoZHIpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAludHJhY2tzID0gdG9jaGRyLmNkdGhfdHJrMSAtIHRvY2hkci5jZHRoX3RyazAgKyAxOwpAQCAtNjAsOSArMTM0LDExIEBACiAJdHJrMV90ZS5jZHRlX3RyYWNrID0gdGktPmNkdGlfdHJrMTsKIAl0cmsxX3RlLmNkdGVfZm9ybWF0ID0gQ0RST01fTVNGOwogCQotCWlmICgocmV0ID0gc3JfYXVkaW9faW9jdGwoY2RpLCBDRFJPTVJFQURUT0NFTlRSWSwgJnRyazBfdGUpKSkKKwlyZXQgPSBzcl9yZWFkX3RvY2VudHJ5KGNkaSwgJnRyazBfdGUpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JaWYgKChyZXQgPSBzcl9hdWRpb19pb2N0bChjZGksIENEUk9NUkVBRFRPQ0VOVFJZLCAmdHJrMV90ZSkpKQorCXJldCA9IHNyX3JlYWRfdG9jZW50cnkoY2RpLCAmdHJrMV90ZSk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCW1lbXNldCgmY2djLCAwLCBzaXplb2Yoc3RydWN0IHBhY2tldF9jb21tYW5kKSk7CkBAIC03OCw2ICsxNTQsMzAgQEAKIAlyZXR1cm4gc3JfZG9faW9jdGwoY2RpLT5oYW5kbGUsICZjZ2MpOwogfQogCitzdGF0aWMgaW50IHNyX3BsYXlfdHJraW5kKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQlzdHJ1Y3QgY2Ryb21fdGkgKnRpKQorCit7CisJc3RydWN0IHNjc2lfY2QgKmNkID0gY2RpLT5oYW5kbGU7CisJc3RydWN0IHBhY2tldF9jb21tYW5kIGNnYzsKKwlpbnQgcmVzdWx0OworCisJbWVtc2V0KCZjZ2MsIDAsIHNpemVvZihzdHJ1Y3QgcGFja2V0X2NvbW1hbmQpKTsKKwljZ2MudGltZW91dCA9IElPQ1RMX1RJTUVPVVQ7CisJY2djLmNtZFswXSA9IEdQQ01EX1BMQVlBVURJT19USTsKKwljZ2MuY21kWzRdID0gdGktPmNkdGlfdHJrMDsKKwljZ2MuY21kWzVdID0gdGktPmNkdGlfaW5kMDsKKwljZ2MuY21kWzddID0gdGktPmNkdGlfdHJrMTsKKwljZ2MuY21kWzhdID0gdGktPmNkdGlfaW5kMTsKKwljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKworCXJlc3VsdCA9IHNyX2RvX2lvY3RsKGNkLCAmY2djKTsKKwlpZiAocmVzdWx0ID09IC1FRFJJVkVfQ0FOVF9ET19USElTKQorCQlyZXN1bHQgPSBzcl9mYWtlX3BsYXl0cmtpbmQoY2RpLCB0aSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCiAvKiBXZSBkbyBvdXIgb3duIHJldHJpZXMgYmVjYXVzZSB3ZSB3YW50IHRvIGtub3cgd2hhdCB0aGUgc3BlY2lmaWMKICAgIGVycm9yIGNvZGUgaXMuICBOb3JtYWxseSB0aGUgVU5JVF9BVFRFTlRJT04gY29kZSB3aWxsIGF1dG9tYXRpY2FsbHkKICAgIGNsZWFyIGFmdGVyIG9uZSBlcnJvciAqLwpAQCAtMjI5LDEzICszMjksMTQgQEAKIAlpbnQgaSwgcmMsIGhhdmVfZGF0YXRyYWNrcyA9IDA7CiAKIAkvKiBsb29rIGZvciBkYXRhIHRyYWNrcyAqLwotCWlmICgwICE9IChyYyA9IHNyX2F1ZGlvX2lvY3RsKGNkaSwgQ0RST01SRUFEVE9DSERSLCAmdG9jX2gpKSkKKwlyYyA9IHNyX3JlYWRfdG9jaGRyKGNkaSwgJnRvY19oKTsKKwlpZiAocmMpCiAJCXJldHVybiAocmMgPT0gLUVOT01FRElVTSkgPyBDRFNfTk9fRElTQyA6IENEU19OT19JTkZPOwogCiAJZm9yIChpID0gdG9jX2guY2R0aF90cmswOyBpIDw9IHRvY19oLmNkdGhfdHJrMTsgaSsrKSB7CiAJCXRvY19lLmNkdGVfdHJhY2sgPSBpOwogCQl0b2NfZS5jZHRlX2Zvcm1hdCA9IENEUk9NX0xCQTsKLQkJaWYgKHNyX2F1ZGlvX2lvY3RsKGNkaSwgQ0RST01SRUFEVE9DRU5UUlksICZ0b2NfZSkpCisJCWlmIChzcl9yZWFkX3RvY2VudHJ5KGNkaSwgJnRvY19lKSkKIAkJCXJldHVybiBDRFNfTk9fSU5GTzsKIAkJaWYgKHRvY19lLmNkdGVfY3RybCAmIENEUk9NX0RBVEFfVFJBQ0spIHsKIAkJCWhhdmVfZGF0YXRyYWNrcyA9IDE7CkBAIC0yNjIsMTAgKzM2Myw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIHByaW1pdGl2ZSB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIGhhdmUgR0ZQX0RNQSBzZXQgYmFzZWQgb24KLSAqIHRoZSBzdGF0dXMgb2YgdGhlIHVuY2hlY2tlZF9pc2FfZG1hIGZsYWcgaW4gdGhlIGhvc3Qgc3RydWN0dXJlICovCi0jZGVmaW5lIFNSX0dGUF9ETUEoY2QpICgoKGNkKS0+ZGV2aWNlLT5ob3N0LT51bmNoZWNrZWRfaXNhX2RtYSkgPyBHRlBfRE1BIDogMCkKLQogaW50IHNyX2dldF9tY24oc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIHN0cnVjdCBjZHJvbV9tY24gKm1jbikKIHsKIAlTY3NpX0NEICpjZCA9IGNkaS0+aGFuZGxlOwpAQCAtMzI5LDkzICs0MjYsMTYgQEAKIAogaW50IHNyX2F1ZGlvX2lvY3RsKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7Ci0JU2NzaV9DRCAqY2QgPSBjZGktPmhhbmRsZTsKLQlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgY2djOwotCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyID0ga21hbGxvYygzMiwgR0ZQX0tFUk5FTCB8IFNSX0dGUF9ETUEoY2QpKTsKLQotCWlmICghYnVmZmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbXNldCgmY2djLCAwLCBzaXplb2Yoc3RydWN0IHBhY2tldF9jb21tYW5kKSk7Ci0JY2djLnRpbWVvdXQgPSBJT0NUTF9USU1FT1VUOwotCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIENEUk9NUkVBRFRPQ0hEUjoKLQkJewotCQkJc3RydWN0IGNkcm9tX3RvY2hkciAqdG9jaGRyID0gKHN0cnVjdCBjZHJvbV90b2NoZHIgKikgYXJnOwotCi0JCQljZ2MuY21kWzBdID0gR1BDTURfUkVBRF9UT0NfUE1BX0FUSVA7Ci0JCQljZ2MuY21kWzhdID0gMTI7CQkvKiBMU0Igb2YgbGVuZ3RoICovCi0JCQljZ2MuYnVmZmVyID0gYnVmZmVyOwotCQkJY2djLmJ1ZmxlbiA9IDEyOwotCQkJY2djLnF1aWV0ID0gMTsKLQkJCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKLQotCQkJcmVzdWx0ID0gc3JfZG9faW9jdGwoY2QsICZjZ2MpOwotCi0JCQl0b2NoZHItPmNkdGhfdHJrMCA9IGJ1ZmZlclsyXTsKLQkJCXRvY2hkci0+Y2R0aF90cmsxID0gYnVmZmVyWzNdOwotCi0JCQlicmVhazsKLQkJfQotCisJCXJldHVybiBzcl9yZWFkX3RvY2hkcihjZGksIGFyZyk7CiAJY2FzZSBDRFJPTVJFQURUT0NFTlRSWToKLQkJewotCQkJc3RydWN0IGNkcm9tX3RvY2VudHJ5ICp0b2NlbnRyeSA9IChzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgKikgYXJnOwotCi0JCQljZ2MuY21kWzBdID0gR1BDTURfUkVBRF9UT0NfUE1BX0FUSVA7Ci0JCQljZ2MuY21kWzFdIHw9ICh0b2NlbnRyeS0+Y2R0ZV9mb3JtYXQgPT0gQ0RST01fTVNGKSA/IDB4MDIgOiAwOwotCQkJY2djLmNtZFs2XSA9IHRvY2VudHJ5LT5jZHRlX3RyYWNrOwotCQkJY2djLmNtZFs4XSA9IDEyOwkJLyogTFNCIG9mIGxlbmd0aCAqLwotCQkJY2djLmJ1ZmZlciA9IGJ1ZmZlcjsKLQkJCWNnYy5idWZsZW4gPSAxMjsKLQkJCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKLQotCQkJcmVzdWx0ID0gc3JfZG9faW9jdGwoY2QsICZjZ2MpOwotCi0JCQl0b2NlbnRyeS0+Y2R0ZV9jdHJsID0gYnVmZmVyWzVdICYgMHhmOwotCQkJdG9jZW50cnktPmNkdGVfYWRyID0gYnVmZmVyWzVdID4+IDQ7Ci0JCQl0b2NlbnRyeS0+Y2R0ZV9kYXRhbW9kZSA9ICh0b2NlbnRyeS0+Y2R0ZV9jdHJsICYgMHgwNCkgPyAxIDogMDsKLQkJCWlmICh0b2NlbnRyeS0+Y2R0ZV9mb3JtYXQgPT0gQ0RST01fTVNGKSB7Ci0JCQkJdG9jZW50cnktPmNkdGVfYWRkci5tc2YubWludXRlID0gYnVmZmVyWzldOwotCQkJCXRvY2VudHJ5LT5jZHRlX2FkZHIubXNmLnNlY29uZCA9IGJ1ZmZlclsxMF07Ci0JCQkJdG9jZW50cnktPmNkdGVfYWRkci5tc2YuZnJhbWUgPSBidWZmZXJbMTFdOwotCQkJfSBlbHNlCi0JCQkJdG9jZW50cnktPmNkdGVfYWRkci5sYmEgPSAoKCgoKGJ1ZmZlcls4XSA8PCA4KSArIGJ1ZmZlcls5XSkgPDwgOCkKLQkJCQkJKyBidWZmZXJbMTBdKSA8PCA4KSArIGJ1ZmZlclsxMV07Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQljYXNlIENEUk9NUExBWVRSS0lORDogewotCQlzdHJ1Y3QgY2Ryb21fdGkqIHRpID0gKHN0cnVjdCBjZHJvbV90aSopYXJnOwotCi0JCWNnYy5jbWRbMF0gPSBHUENNRF9QTEFZQVVESU9fVEk7Ci0JCWNnYy5jbWRbNF0gPSB0aS0+Y2R0aV90cmswOwotCQljZ2MuY21kWzVdID0gdGktPmNkdGlfaW5kMDsKLQkJY2djLmNtZFs3XSA9IHRpLT5jZHRpX3RyazE7Ci0JCWNnYy5jbWRbOF0gPSB0aS0+Y2R0aV9pbmQxOwotCQljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKLQotCQlyZXN1bHQgPSBzcl9kb19pb2N0bChjZCwgJmNnYyk7Ci0JCWlmIChyZXN1bHQgPT0gLUVEUklWRV9DQU5UX0RPX1RISVMpCi0JCQlyZXN1bHQgPSBzcl9mYWtlX3BsYXl0cmtpbmQoY2RpLCB0aSk7Ci0KLQkJYnJlYWs7Ci0JfQotCisJCXJldHVybiBzcl9yZWFkX3RvY2VudHJ5KGNkaSwgYXJnKTsKKwljYXNlIENEUk9NUExBWVRSS0lORDoKKwkJcmV0dXJuIHNyX3BsYXlfdHJraW5kKGNkaSwgYXJnKTsKIAlkZWZhdWx0OgotCQlyZXN1bHQgPSAtRUlOVkFMOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0KLSNpZiAwCi0JaWYgKHJlc3VsdCkKLQkJcHJpbnRrKCJERUJVRzogc3JfYXVkaW86IHJlc3VsdCBmb3IgaW9jdGwgJXg6ICV4XG4iLCBjbWQsIHJlc3VsdCk7Ci0jZW5kaWYKLQotCWtmcmVlKGJ1ZmZlcik7Ci0JcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdC5jIGIvZHJpdmVycy9zY3NpL3N0LmMKaW5kZXggYzRhYWRlOC4uMTNiMWQzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL3N0LmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CkBAIC0xOTMsNyArMTk0LDYgQEAKIAogc3RhdGljIGludCBzdF9wcm9iZShzdHJ1Y3QgZGV2aWNlICopOwogc3RhdGljIGludCBzdF9yZW1vdmUoc3RydWN0IGRldmljZSAqKTsKLXN0YXRpYyBpbnQgc3RfaW5pdF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKik7CiAKIHN0YXRpYyB2b2lkIGRvX2NyZWF0ZV9kcml2ZXJmc19maWxlcyh2b2lkKTsKIHN0YXRpYyB2b2lkIGRvX3JlbW92ZV9kcml2ZXJmc19maWxlcyh2b2lkKTsKQEAgLTIwNiw3ICsyMDYsNiBAQAogCQkucHJvYmUJCT0gc3RfcHJvYmUsCiAJCS5yZW1vdmUJCT0gc3RfcmVtb3ZlLAogCX0sCi0JLmluaXRfY29tbWFuZAkJPSBzdF9pbml0X2NvbW1hbmQsCiB9OwogCiBzdGF0aWMgaW50IHN0X2NvbXByZXNzaW9uKHN0cnVjdCBzY3NpX3RhcGUgKiwgaW50KTsKQEAgLTIyMCw3ICsyMTksNyBAQAogCiAjZGVmaW5lIHRvX3Njc2lfdGFwZShvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBzY3NpX3RhcGUsIGtyZWYpCiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKHN0X3JlZl9zZW0pOworc3RhdGljIERFRklORV9NVVRFWChzdF9yZWZfbXV0ZXgpOwogCiAMCiAjaW5jbHVkZSAib3NzdF9kZXRlY3QuaCIKQEAgLTIzNyw3ICsyMzYsNyBAQAogewogCXN0cnVjdCBzY3NpX3RhcGUgKlNUcCA9IE5VTEw7CiAKLQlkb3duKCZzdF9yZWZfc2VtKTsKKwltdXRleF9sb2NrKCZzdF9yZWZfbXV0ZXgpOwogCXdyaXRlX2xvY2soJnN0X2Rldl9hcnJfbG9jayk7CiAKIAlpZiAoZGV2IDwgc3RfZGV2X21heCAmJiBzY3NpX3RhcGVzICE9IE5VTEwpCkBAIC0yNTksNyArMjU4LDcgQEAKIAlTVHAgPSBOVUxMOwogb3V0OgogCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKLQl1cCgmc3RfcmVmX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdF9yZWZfbXV0ZXgpOwogCXJldHVybiBTVHA7CiB9CiAKQEAgLTI2NywxMCArMjY2LDEwIEBACiB7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gU1RwLT5kZXZpY2U7CiAKLQlkb3duKCZzdF9yZWZfc2VtKTsKKwltdXRleF9sb2NrKCZzdF9yZWZfbXV0ZXgpOwogCWtyZWZfcHV0KCZTVHAtPmtyZWYsIHNjc2lfdGFwZV9yZWxlYXNlKTsKIAlzY3NpX2RldmljZV9wdXQoc2Rldik7Ci0JdXAoJnN0X3JlZl9zZW0pOworCW11dGV4X3VubG9jaygmc3RfcmVmX211dGV4KTsKIH0KIAogc3RydWN0IHN0X3JlamVjdF9kYXRhIHsKQEAgLTQxNDEsOSArNDE0MCw5IEBACiAJCQkJfQogCQkJfQogCi0JCQlkb3duKCZzdF9yZWZfc2VtKTsKKwkJCW11dGV4X2xvY2soJnN0X3JlZl9tdXRleCk7CiAJCQlrcmVmX3B1dCgmdHBudC0+a3JlZiwgc2NzaV90YXBlX3JlbGVhc2UpOwotCQkJdXAoJnN0X3JlZl9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZzdF9yZWZfbXV0ZXgpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC00MTU2LDcgKzQxNTUsNyBAQAogICogICAgICBzY3NpX3RhcGVfcmVsZWFzZSAtIENhbGxlZCB0byBmcmVlIHRoZSBTY3NpX1RhcGUgc3RydWN0dXJlCiAgKiAgICAgIEBrcmVmOiBwb2ludGVyIHRvIGVtYmVkZGVkIGtyZWYKICAqCi0gKiAgICAgIHN0X3JlZl9zZW0gbXVzdCBiZSBoZWxkIGVudGVyaW5nIHRoaXMgcm91dGluZS4gIEJlY2F1c2UgaXQgaXMKKyAqICAgICAgc3RfcmVmX211dGV4IG11c3QgYmUgaGVsZCBlbnRlcmluZyB0aGlzIHJvdXRpbmUuICBCZWNhdXNlIGl0IGlzCiAgKiAgICAgIGNhbGxlZCBvbiBsYXN0IHB1dCwgeW91IHNob3VsZCBhbHdheXMgdXNlIHRoZSBzY3NpX3RhcGVfZ2V0KCkKICAqICAgICAgc2NzaV90YXBlX3B1dCgpIGhlbHBlcnMgd2hpY2ggbWFuaXB1bGF0ZSB0aGUgc2VtYXBob3JlIGRpcmVjdGx5CiAgKiAgICAgIGFuZCBuZXZlciBkbyBhIGRpcmVjdCBrcmVmX3B1dCgpLgpAQCAtNDE4MCwyOSArNDE3OSw2IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBzdF9pbnRyKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQotewotCS8qCi0JICogVGhlIGNhbGxlciBzaG91bGQgYmUgY2hlY2tpbmcgdGhlIHJlcXVlc3QncyBlcnJvcnMKLQkgKiB2YWx1ZS4KLQkgKi8KLQlzY3NpX2lvX2NvbXBsZXRpb24oU0NwbnQsIFNDcG50LT5idWZmbGVuLCAwKTsKLX0KLQotLyoKLSAqIHN0X2luaXRfY29tbWFuZDogb25seSBjYWxsZWQgdmlhIHRoZSBzY3NpX2NtZF9pb2N0bCAoYmxvY2sgU0dfSU8pCi0gKiBpbnRlcmZhY2UgZm9yIFJFUV9CTE9DS19QQyBjb21tYW5kcy4KLSAqLwotc3RhdGljIGludCBzdF9pbml0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCi17Ci0JaWYgKCEoU0NwbnQtPnJlcXVlc3QtPmZsYWdzICYgUkVRX0JMT0NLX1BDKSkKLQkJcmV0dXJuIDA7Ci0KLQlzY3NpX3NldHVwX2Jsa19wY19jbW5kKFNDcG50KTsKLQlTQ3BudC0+ZG9uZSA9IHN0X2ludHI7Ci0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IGluaXRfc3Qodm9pZCkKIHsKIAl2YWxpZGF0ZV9vcHRpb25zKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYwppbmRleCA0ZGQ1YzNmLi44Y2JmMGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzY4MzI4c2VyaWFsLmMKQEAgLTE0Myw3ICsxNDMsNiBAQAogICogbWVtb3J5IGlmIGxhcmdlIG51bWJlcnMgb2Ygc2VyaWFsIHBvcnRzIGFyZSBvcGVuLgogICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciB0bXBfYnVmW1NFUklBTF9YTUlUX1NJWkVdOyAvKiBUaGlzIGlzIGNoZWF0aW5nICovCi1ERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogc3RhdGljIGlubGluZSBpbnQgc2VyaWFsX3BhcmFub2lhX2NoZWNrKHN0cnVjdCBtNjhrX3NlcmlhbCAqaW5mbywKIAkJCQkJY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcm91dGluZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCmluZGV4IDg0MzcxNzIuLmUwNjg1YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwpAQCAtMTkwLDcgKzE5MCw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCA4MjUwX2JvY2EuCiAKLQogY29uZmlnIFNFUklBTF84MjUwX0hVQjYKIAl0cmlzdGF0ZSAiU3VwcG9ydCBIdWI2IGNhcmRzIgogCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgIT0gbiAmJiBJU0EgJiYgU0VSSUFMXzgyNTBfTUFOWV9QT1JUUwpAQCAtOTE3LDQgKzkxNiwxMiBAQAogCQlhbmQgd2lzaCB0byB1c2UgdGhlIHNlcmlhbCBwb3J0cyBvbiB0aGlzIGNhcmQsIHNheSBZLgogCQlPdGhlcndpc2UsIHNheSBOLgogCitjb25maWcgU0VSSUFMX1NHSV9JT0MzCisJdHJpc3RhdGUgIlNHSSBBbHRpeCBJT0MzIHNlcmlhbCBzdXBwb3J0IgorCWRlcGVuZHMgb24gKElBNjRfR0VORVJJQyB8fCBJQTY0X1NHSV9TTjIpICYmIFNHSV9JT0MzCisJc2VsZWN0IFNFUklBTF9DT1JFCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gU0dJIEFsdGl4IHdpdGggYW4gSU9DMyBzZXJpYWwgY2FyZCwKKwkgIHNheSBZIG9yIE0uICBPdGhlcndpc2UsIHNheSBOLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZSBiL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCmluZGV4IDI0YTU4M2UuLmVhZjhlMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCkBAIC01Niw0ICs1Niw1IEBACiBvYmotJChDT05GSUdfU0VSSUFMX1RYWDkpICs9IHNlcmlhbF90eHg5Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfVlI0MVhYKSArPSB2cjQxeHhfc2l1Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfU0dJX0lPQzQpICs9IGlvYzRfc2VyaWFsLm8KK29iai0kKENPTkZJR19TRVJJQUxfU0dJX0lPQzMpICs9IGlvYzNfc2VyaWFsLm8KIG9iai0kKENPTkZJR19TRVJJQUxfQVQ5MSkgKz0gYXQ5MV9zZXJpYWwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvaW9jM19zZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL2lvYzNfc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5N2NkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2VyaWFsL2lvYzNfc2VyaWFsLmMKQEAgLTAsMCArMSwyMTk3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIG1vZHVsZSB2ZXJzaW9uIG9mIHRoZSBpb2MzIHNlcmlhbCBkcml2ZXIuIFRoaXMKKyAqIGluY2x1ZGVzIGFsbCB0aGUgc3VwcG9ydCBmdW5jdGlvbnMgbmVlZGVkIChzdXBwb3J0IGZ1bmN0aW9ucywgZXRjLikKKyAqIGFuZCB0aGUgc2VyaWFsIGRyaXZlciBpdHNlbGYuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW9jMy5oPgorCisvKgorICogSW50ZXJlc3RpbmcgdGhpbmdzIGFib3V0IHRoZSBpb2MzCisgKi8KKworI2RlZmluZSBMT0dJQ0FMX1BPUlRTCQkyCS8qIHJzMjMyKDApIGFuZCByczQyMigxKSAqLworI2RlZmluZSBQT1JUU19QRVJfQ0FSRAkJMgorI2RlZmluZSBMT0dJQ0FMX1BPUlRTX1BFUl9DQVJEIChQT1JUU19QRVJfQ0FSRCAqIExPR0lDQUxfUE9SVFMpCisjZGVmaW5lIE1BWF9DQVJEUwkJOAorI2RlZmluZSBNQVhfTE9HSUNBTF9QT1JUUwkoTE9HSUNBTF9QT1JUU19QRVJfQ0FSRCAqIE1BWF9DQVJEUykKKworLyogZGV0ZXJtaW5lIGdpdmVuIHRoZSBzaW9faXIgd2hhdCBwb3J0IGl0IGFwcGxpZXMgdG8gKi8KKyNkZWZpbmUgR0VUX1BPUlRfRlJPTV9TSU9fSVIoX3gpCShfeCAmIFNJT19JUl9TQSkgPyAwIDogMQorCisKKy8qCisgKiB3ZSBoYXZlIDIgbG9naWNhbCBwb3J0cyAocnMyMzIsIHJzNDIyKSBmb3IgZWFjaCBwaHlzaWNhbCBwb3J0CisgKiBldmVucyBhcmUgcnMyMzIsIG9kZHMgYXJlIHJzNDIyCisgKi8KKyNkZWZpbmUgR0VUX1BIWVNJQ0FMX1BPUlQoX3gpCSgoX3gpID4+IDEpCisjZGVmaW5lIEdFVF9MT0dJQ0FMX1BPUlQoX3gpCSgoX3gpICYgMSkKKyNkZWZpbmUgSVNfUEhZU0lDQUxfUE9SVChfeCkJISgoX3gpICYgMSkKKyNkZWZpbmUgSVNfUlMyMzIoX3gpCQkhKChfeCkgJiAxKQorCitzdGF0aWMgdW5zaWduZWQgaW50IE51bV9vZl9pb2MzX2NhcmRzOworc3RhdGljIHVuc2lnbmVkIGludCBTdWJtb2R1bGVfc2xvdDsKKworLyogZGVmaW5pbmcgdGhpcyB3aWxsIGdldCB5b3UgTE9UUyBvZiBncmVhdCBkZWJ1ZyBpbmZvICovCisvLyNkZWZpbmUgREVCVUdfSU5URVJSVVBUUworI2RlZmluZSBEUFJJTlRfQ09ORklHKF94Li4uKQk7CisvLyNkZWZpbmUgRFBSSU5UX0NPTkZJRyhfeC4uLikgIHByaW50ayBfeAorI2RlZmluZSBOT1RfUFJPR1JFU1MoKQk7CisvLyNkZWZpbmUgTk9UX1BST0dSRVNTKCkJcHJpbnRrKCIlcyA6IGZhaWxzICVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKQorCisvKiBudW1iZXIgb2YgY2hhcmFjdGVycyB3ZSB3YW50IHRvIHRyYW5zbWl0IHRvIHRoZSBsb3dlciBsZXZlbCBhdCBhIHRpbWUgKi8KKyNkZWZpbmUgTUFYX0NIQVJTCQkyNTYKKyNkZWZpbmUgRklGT19TSVpFCQkoTUFYX0NIQVJTLTEpCS8qIGl0J3MgYSB1Y2hhciAqLworCisvKiBEZXZpY2UgbmFtZSB3ZSdyZSB1c2luZyAqLworI2RlZmluZSBERVZJQ0VfTkFNRQkJInR0eVNJT0MiCisjZGVmaW5lIERFVklDRV9NQUpPUgkJMjA0CisjZGVmaW5lIERFVklDRV9NSU5PUgkJMTE2CisKKy8qIGZsYWdzIGZvciBuZXh0X2NoYXJfc3RhdGUgKi8KKyNkZWZpbmUgTkNTX0JSRUFLCQkweDEKKyNkZWZpbmUgTkNTX1BBUklUWQkJMHgyCisjZGVmaW5lIE5DU19GUkFNSU5HCQkweDQKKyNkZWZpbmUgTkNTX09WRVJSVU4JCTB4OAorCisvKiBjYXVzZSB3ZSBuZWVkIFNPTUUgcGFyYW1ldGVycyAuLi4gKi8KKyNkZWZpbmUgTUlOX0JBVURfU1VQUE9SVEVECTEyMDAKKyNkZWZpbmUgTUFYX0JBVURfU1VQUE9SVEVECTExNTIwMAorCisvKiBwcm90b2NvbCB0eXBlcyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUFJPVE9fUlMyMzIJCTAKKyNkZWZpbmUgUFJPVE9fUlM0MjIJCTEKKworLyogTm90aWZpY2F0aW9uIHR5cGVzICovCisjZGVmaW5lIE5fREFUQV9SRUFEWQkJMHgwMQorI2RlZmluZSBOX09VVFBVVF9MT1dBVAkJMHgwMgorI2RlZmluZSBOX0JSRUFLCQkJMHgwNAorI2RlZmluZSBOX1BBUklUWV9FUlJPUgkJMHgwOAorI2RlZmluZSBOX0ZSQU1JTkdfRVJST1IJCTB4MTAKKyNkZWZpbmUgTl9PVkVSUlVOX0VSUk9SCQkweDIwCisjZGVmaW5lIE5fRERDRAkJCTB4NDAKKyNkZWZpbmUgTl9EQ1RTCQkJMHg4MAorCisjZGVmaW5lIE5fQUxMX0lOUFVUCQkoTl9EQVRBX1JFQURZIHwgTl9CUkVBSwkJCSAgIFwKKwkJCQkJfCBOX1BBUklUWV9FUlJPUiB8IE5fRlJBTUlOR19FUlJPUiBcCisJCQkJCXwgTl9PVkVSUlVOX0VSUk9SIHwgTl9ERENEIHwgTl9EQ1RTKQorCisjZGVmaW5lIE5fQUxMX09VVFBVVAkJTl9PVVRQVVRfTE9XQVQKKworI2RlZmluZSBOX0FMTF9FUlJPUlMJCShOX1BBUklUWV9FUlJPUiB8IE5fRlJBTUlOR19FUlJPUiBcCisJCQkJCQl8IE5fT1ZFUlJVTl9FUlJPUikKKworI2RlZmluZSBOX0FMTAkJCShOX0RBVEFfUkVBRFkgfCBOX09VVFBVVF9MT1dBVCB8IE5fQlJFQUsgICAgXAorCQkJCQl8IE5fUEFSSVRZX0VSUk9SIHwgTl9GUkFNSU5HX0VSUk9SICBcCisJCQkJCXwgTl9PVkVSUlVOX0VSUk9SIHwgTl9ERENEIHwgTl9EQ1RTKQorCisjZGVmaW5lIFNFUl9DTEtfU1BFRUQocHJlZGl2KQkoKDIyMDAwMDAwIDw8IDEpIC8gcHJlZGl2KQorI2RlZmluZSBTRVJfRElWSVNPUih4LCBjbGspCSgoKGNsaykgKyAoeCkgKiA4KSAvICgoeCkgKiAxNikpCisjZGVmaW5lIERJVklTT1JfVE9fQkFVRChkaXYsIGNsaykgKChjbGspIC8gMTYgLyAoZGl2KSkKKworLyogU29tZSBtYXNrcyAqLworI2RlZmluZSBMQ1JfTUFTS19CSVRTX0NIQVIJKFVBUlRfTENSX1dMRU41IHwgVUFSVF9MQ1JfV0xFTjYgXAorCQkJCQl8IFVBUlRfTENSX1dMRU43IHwgVUFSVF9MQ1JfV0xFTjgpCisjZGVmaW5lIExDUl9NQVNLX1NUT1BfQklUUwkoVUFSVF9MQ1JfU1RPUCkKKworI2RlZmluZSBQRU5ESU5HKF9hLCBfcCkJCShyZWFkbCgmKF9wKS0+dm1hLT5zaW9faXIpICYgKF9hKS0+aWNfZW5hYmxlKQorCisjZGVmaW5lIFJJTkdfQlVGX1NJWkUJCTQwOTYKKyNkZWZpbmUgQlVGX1NJWkVfQklUCQlTQkJSX0xfU0laRQorI2RlZmluZSBQUk9EX0NPTlNfTUFTSwkJUFJPRF9DT05TX1BUUl80SworCisjZGVmaW5lIFRPVEFMX1JJTkdfQlVGX1NJWkUJKFJJTkdfQlVGX1NJWkUgKiA0KQorCisvKiBkcml2ZXIgc3BlY2lmaWMgLSBvbmUgcGVyIGNhcmQgKi8KK3N0cnVjdCBpb2MzX2NhcmQgeworCXN0cnVjdCB7CisJCS8qIHVhcnQgcG9ydHMgYXJlIGFsbG9jYXRlZCBoZXJlICovCisJCXN0cnVjdCB1YXJ0X3BvcnQgaWNwX3VhcnRfcG9ydFtMT0dJQ0FMX1BPUlRTXTsKKwkJLyogdGhlIGlvYzNfcG9ydCB1c2VkIGZvciB0aGlzIHBvcnQgKi8KKwkJc3RydWN0IGlvYzNfcG9ydCAqaWNwX3BvcnQ7CisJfSBpY19wb3J0W1BPUlRTX1BFUl9DQVJEXTsKKwkvKiBjdXJyZW50bHkgZW5hYmxlZCBpbnRlcnJ1cHRzICovCisJdWludDMyX3QgaWNfZW5hYmxlOworfTsKKworLyogTG9jYWwgcG9ydCBpbmZvIGZvciBlYWNoIElPQzMgc2VyaWFsIHBvcnQgKi8KK3N0cnVjdCBpb2MzX3BvcnQgeworCS8qIGhhbmR5IHJlZmVyZW5jZSBtYXRlcmlhbCAqLworCXN0cnVjdCB1YXJ0X3BvcnQgKmlwX3BvcnQ7CisJc3RydWN0IGlvYzNfY2FyZCAqaXBfY2FyZDsKKwlzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaXBfaWRkOworCXN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqaXBfaXM7CisKKwkvKiBwY2kgbWVtIGFkZHJlc3NlcyBmb3IgdGhpcyBwb3J0ICovCisJc3RydWN0IGlvYzNfc2VyaWFscmVncyBfX2lvbWVtICppcF9zZXJpYWxfcmVnczsKKwlzdHJ1Y3QgaW9jM191YXJ0cmVncyBfX2lvbWVtICppcF91YXJ0X3JlZ3M7CisKKwkvKiBSaW5nIGJ1ZmZlciBwYWdlIGZvciB0aGlzIHBvcnQgKi8KKwlkbWFfYWRkcl90IGlwX2RtYV9yaW5nYnVmOworCS8qIHZhZGRyIG9mIHJpbmcgYnVmZmVyICovCisJc3RydWN0IHJpbmdfYnVmZmVyICppcF9jcHVfcmluZ2J1ZjsKKworCS8qIFJpbmdzIGZvciB0aGlzIHBvcnQgKi8KKwlzdHJ1Y3QgcmluZyAqaXBfaW5yaW5nOworCXN0cnVjdCByaW5nICppcF9vdXRyaW5nOworCisJLyogSG9vayB0byBwb3J0IHNwZWNpZmljIHZhbHVlcyAqLworCXN0cnVjdCBwb3J0X2hvb2tzICppcF9ob29rczsKKworCXNwaW5sb2NrX3QgaXBfbG9jazsKKworCS8qIFZhcmlvdXMgcngvdHggcGFyYW1ldGVycyAqLworCWludCBpcF9iYXVkOworCWludCBpcF90eF9sb3dhdDsKKwlpbnQgaXBfcnhfdGltZW91dDsKKworCS8qIENvcHkgb2Ygbm90aWZpY2F0aW9uIGJpdHMgKi8KKwlpbnQgaXBfbm90aWZ5OworCisJLyogU2hhZG93IGNvcGllcyBvZiB2YXJpb3VzIHJlZ2lzdGVycyBzbyB3ZSBkb24ndCBuZWVkIHRvIFBJTworCSAqIHJlYWQgdGhlbSBjb25zdGFudGx5CisJICovCisJdWludDMyX3QgaXBfc3NjcjsKKwl1aW50MzJfdCBpcF90eF9wcm9kOworCXVpbnQzMl90IGlwX3J4X2NvbnM7CisJdW5zaWduZWQgY2hhciBpcF9mbGFnczsKK307CisKKy8qIHR4IGxvdyB3YXRlciBtYXJrLiAgV2UgbmVlZCB0byBub3RpZnkgdGhlIGRyaXZlciB3aGVuZXZlciB0eCBpcyBnZXR0aW5nCisgKiBjbG9zZSB0byBlbXB0eSBzbyBpdCBjYW4gcmVmaWxsIHRoZSB0eCBidWZmZXIgYW5kIGtlZXAgdGhpbmdzIGdvaW5nLgorICogTGV0J3MgYXNzdW1lIHRoYXQgaWYgd2UgaW50ZXJydXB0IDEgbXMgYmVmb3JlIHRoZSB0eCBnb2VzIGlkbGUsIHdlJ2xsCisgKiBoYXZlIG5vIHRyb3VibGUgZ2V0dGluZyBpbiBtb3JlIGNoYXJzIGluIHRpbWUgKEkgY2VydGFpbmx5IGhvcGUgc28pLgorICovCisjZGVmaW5lIFRYX0xPV0FUX0xBVEVOQ1kgICAgICAxMDAwCisjZGVmaW5lIFRYX0xPV0FUX0haICAgICAgICAgICgxMDAwMDAwIC8gVFhfTE9XQVRfTEFURU5DWSkKKyNkZWZpbmUgVFhfTE9XQVRfQ0hBUlMoYmF1ZCkgKGJhdWQgLyAxMCAvIFRYX0xPV0FUX0haKQorCisvKiBGbGFncyBwZXIgcG9ydCAqLworI2RlZmluZSBJTlBVVF9ISUdICQkweDAxCisJLyogdXNlZCB0byBzaWduaWZ5IHRoYXQgd2UgaGF2ZSB0dXJuZWQgb2ZmIHRoZSByeF9oaWdoCisJICogdGVtcG9yYXJpbHkgLSB3ZSBuZWVkIHRvIGRyYWluIHRoZSBmaWZvIGFuZCBkb24ndAorCSAqIHdhbnQgdG8gZ2V0IGJsYXN0ZWQgd2l0aCBpbnRlcnJ1cHRzLgorCSAqLworI2RlZmluZSBEQ0RfT04JCQkweDAyCisJLyogRENEIHN0YXRlIGlzIG9uICovCisjZGVmaW5lIExPV0FUX1dSSVRURU4JCTB4MDQKKyNkZWZpbmUgUkVBRF9BQk9SVEVECQkweDA4CisJLyogdGhlIHJlYWQgd2FzIGFib3J0ZWQgLSB1c2VkIHRvIGF2YW9pZCBpbmZpbmF0ZSBsb29waW5nCisJICogaW4gdGhlIGludGVycnVwdCBoYW5kbGVyCisJICovCisjZGVmaW5lIElOUFVUX0VOQUJMRQkJMHgxMAorCisvKiBTaW5jZSBlYWNoIHBvcnQgaGFzIGRpZmZlcmVudCByZWdpc3RlciBvZmZzZXRzIGFuZCBiaXRtYXNrcworICogZm9yIGV2ZXJ5dGhpbmcsIHdlJ2xsIHN0b3JlIHRob3NlIHRoYXQgd2UgbmVlZCBpbiB0YWJsZXMgc28gd2UKKyAqIGRvbid0IGhhdmUgdG8gYmUgY29uc3RhbnRseSBjaGVja2luZyB0aGUgcG9ydCB3ZSBhcmUgZGVhbGluZyB3aXRoLgorICovCitzdHJ1Y3QgcG9ydF9ob29rcyB7CisJdWludDMyX3QgaW50cl9kZWx0YV9kY2Q7CisJdWludDMyX3QgaW50cl9kZWx0YV9jdHM7CisJdWludDMyX3QgaW50cl90eF9tdDsKKwl1aW50MzJfdCBpbnRyX3J4X3RpbWVyOworCXVpbnQzMl90IGludHJfcnhfaGlnaDsKKwl1aW50MzJfdCBpbnRyX3R4X2V4cGxpY2l0OworCXVpbnQzMl90IGludHJfY2xlYXI7CisJdWludDMyX3QgaW50cl9hbGw7CisJY2hhciByczQyMl9zZWxlY3RfcGluOworfTsKKworc3RhdGljIHN0cnVjdCBwb3J0X2hvb2tzIGhvb2tzX2FycmF5W1BPUlRTX1BFUl9DQVJEXSA9IHsKKwkvKiB2YWx1ZXMgZm9yIHBvcnQgQSAqLworCXsKKwkuaW50cl9kZWx0YV9kY2QgPSBTSU9fSVJfU0FfREVMVEFfRENELAorCS5pbnRyX2RlbHRhX2N0cyA9IFNJT19JUl9TQV9ERUxUQV9DVFMsCisJLmludHJfdHhfbXQgPSBTSU9fSVJfU0FfVFhfTVQsCisJLmludHJfcnhfdGltZXIgPSBTSU9fSVJfU0FfUlhfVElNRVIsCisJLmludHJfcnhfaGlnaCA9IFNJT19JUl9TQV9SWF9ISUdILAorCS5pbnRyX3R4X2V4cGxpY2l0ID0gU0lPX0lSX1NBX1RYX0VYUExJQ0lULAorCS5pbnRyX2NsZWFyID0gKFNJT19JUl9TQV9UWF9NVCB8IFNJT19JUl9TQV9SWF9GVUxMCisJCQkJfCBTSU9fSVJfU0FfUlhfSElHSAorCQkJCXwgU0lPX0lSX1NBX1JYX1RJTUVSCisJCQkJfCBTSU9fSVJfU0FfREVMVEFfRENECisJCQkJfCBTSU9fSVJfU0FfREVMVEFfQ1RTCisJCQkJfCBTSU9fSVJfU0FfSU5UCisJCQkJfCBTSU9fSVJfU0FfVFhfRVhQTElDSVQKKwkJCQl8IFNJT19JUl9TQV9NRU1FUlIpLAorCS5pbnRyX2FsbCA9ICBTSU9fSVJfU0EsCisJLnJzNDIyX3NlbGVjdF9waW4gPSBHUFBSX1VBUlRBX01PREVTRUxfUElOLAorCSB9LAorCisJLyogdmFsdWVzIGZvciBwb3J0IEIgKi8KKwl7CisJLmludHJfZGVsdGFfZGNkID0gU0lPX0lSX1NCX0RFTFRBX0RDRCwKKwkuaW50cl9kZWx0YV9jdHMgPSBTSU9fSVJfU0JfREVMVEFfQ1RTLAorCS5pbnRyX3R4X210ID0gU0lPX0lSX1NCX1RYX01ULAorCS5pbnRyX3J4X3RpbWVyID0gU0lPX0lSX1NCX1JYX1RJTUVSLAorCS5pbnRyX3J4X2hpZ2ggPSBTSU9fSVJfU0JfUlhfSElHSCwKKwkuaW50cl90eF9leHBsaWNpdCA9IFNJT19JUl9TQl9UWF9FWFBMSUNJVCwKKwkuaW50cl9jbGVhciA9IChTSU9fSVJfU0JfVFhfTVQgfCBTSU9fSVJfU0JfUlhfRlVMTAorCQkJCXwgU0lPX0lSX1NCX1JYX0hJR0gKKwkJCQl8IFNJT19JUl9TQl9SWF9USU1FUgorCQkJCXwgU0lPX0lSX1NCX0RFTFRBX0RDRAorCQkJCXwgU0lPX0lSX1NCX0RFTFRBX0NUUworCQkJCXwgU0lPX0lSX1NCX0lOVAorCQkJCXwgU0lPX0lSX1NCX1RYX0VYUExJQ0lUCisJCQkJfCBTSU9fSVJfU0JfTUVNRVJSKSwKKwkuaW50cl9hbGwgPSBTSU9fSVJfU0IsCisJLnJzNDIyX3NlbGVjdF9waW4gPSBHUFBSX1VBUlRCX01PREVTRUxfUElOLAorCSB9Cit9OworCitzdHJ1Y3QgcmluZ19lbnRyeSB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgYWxsZGF0YTsKKwkJCXVpbnQzMl90IGFsbHNjOworCQl9IGFsbDsKKwkJc3RydWN0IHsKKwkJCWNoYXIgZGF0YVs0XTsJLyogZGF0YSBieXRlcyAqLworCQkJY2hhciBzY1s0XTsJLyogc3RhdHVzL2NvbnRyb2wgKi8KKwkJfSBzOworCX0gdTsKK307CisKKy8qIFRlc3QgdGhlIHZhbGlkIGJpdHMgaW4gYW55IG9mIHRoZSA0IHNjIGNoYXJzIHVzaW5nICJhbGxzYyIgbWVtYmVyICovCisjZGVmaW5lIFJJTkdfQU5ZX1ZBTElEIFwKKwkoKHVpbnQzMl90KShSWFNCX01PREVNX1ZBTElEIHwgUlhTQl9EQVRBX1ZBTElEKSAqIDB4MDEwMTAxMDEpCisKKyNkZWZpbmUgcmluZ19zYwkJdS5zLnNjCisjZGVmaW5lIHJpbmdfZGF0YQl1LnMuZGF0YQorI2RlZmluZSByaW5nX2FsbHNjCXUuYWxsLmFsbHNjCisKKy8qIE51bWJlciBvZiBlbnRyaWVzIHBlciByaW5nIGJ1ZmZlci4gKi8KKyNkZWZpbmUgRU5UUklFU19QRVJfUklORyAoUklOR19CVUZfU0laRSAvIChpbnQpIHNpemVvZihzdHJ1Y3QgcmluZ19lbnRyeSkpCisKKy8qIEFuIGluZGl2aWR1YWwgcmluZyAqLworc3RydWN0IHJpbmcgeworCXN0cnVjdCByaW5nX2VudHJ5IGVudHJpZXNbRU5UUklFU19QRVJfUklOR107Cit9OworCisvKiBUaGUgd2hvbGUgZW5jaGlsYWRhICovCitzdHJ1Y3QgcmluZ19idWZmZXIgeworCXN0cnVjdCByaW5nIFRYX0E7CisJc3RydWN0IHJpbmcgUlhfQTsKKwlzdHJ1Y3QgcmluZyBUWF9COworCXN0cnVjdCByaW5nIFJYX0I7Cit9OworCisvKiBHZXQgYSByaW5nIGZyb20gYSBwb3J0IHN0cnVjdCAqLworI2RlZmluZSBSSU5HKF9wLCBfd2gpCSYoKChzdHJ1Y3QgcmluZ19idWZmZXIgKikoKF9wKS0+aXBfY3B1X3JpbmdidWYpKS0+X3doKQorCisvKiBmb3IgSW5maW5pdGUgbG9vcCBkZXRlY3Rpb24gICovCisjZGVmaW5lIE1BWElURVIJCTEwMDAwMDAwCisKKworLyoqCisgKiBzZXRfYmF1ZCAtIEJhdWQgcmF0ZSBzZXR0aW5nIGNvZGUKKyAqIEBwb3J0OiBwb3J0IHRvIHNldAorICogQGJhdWQ6IGJhdWQgcmF0ZSB0byB1c2UKKyAqLworc3RhdGljIGludCBzZXRfYmF1ZChzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0LCBpbnQgYmF1ZCkKK3sKKwlpbnQgZGl2aXNvcjsKKwlpbnQgYWN0dWFsX2JhdWQ7CisJaW50IGRpZmY7CisJaW50IGxjciwgcHJlZGl2OworCXN0cnVjdCBpb2MzX3VhcnRyZWdzIF9faW9tZW0gKnVhcnQ7CisKKwlmb3IgKHByZWRpdiA9IDY7IHByZWRpdiA8IDY0OyBwcmVkaXYrKykgeworCQlkaXZpc29yID0gU0VSX0RJVklTT1IoYmF1ZCwgU0VSX0NMS19TUEVFRChwcmVkaXYpKTsKKwkJaWYgKCFkaXZpc29yKQorCQkJY29udGludWU7CS8qIGludmFsaWQgZGl2aXNvciAqLworCQlhY3R1YWxfYmF1ZCA9IERJVklTT1JfVE9fQkFVRChkaXZpc29yLCBTRVJfQ0xLX1NQRUVEKHByZWRpdikpOworCisJCWRpZmYgPSBhY3R1YWxfYmF1ZCAtIGJhdWQ7CisJCWlmIChkaWZmIDwgMCkKKwkJCWRpZmYgPSAtZGlmZjsKKworCQkvKiBpZiB3ZSdyZSB3aXRoaW4gMSUgd2UndmUgZm91bmQgYSBtYXRjaCAqLworCQlpZiAoZGlmZiAqIDEwMCA8PSBhY3R1YWxfYmF1ZCkKKwkJCWJyZWFrOworCX0KKworCS8qIGlmIHRoZSBhYm92ZSBsb29wIGNvbXBsZXRlZCwgd2UgZGlkbid0IG1hdGNoCisJICogdGhlIGJhdWQgcmF0ZS4gIGdpdmUgdXAuCisJICovCisJaWYgKHByZWRpdiA9PSA2NCkgeworCQlOT1RfUFJPR1JFU1MoKTsKKwkJcmV0dXJuIDE7CisJfQorCisJdWFydCA9IHBvcnQtPmlwX3VhcnRfcmVnczsKKwlsY3IgPSByZWFkYigmdWFydC0+aXVfbGNyKTsKKworCXdyaXRlYihsY3IgfCBVQVJUX0xDUl9ETEFCLCAmdWFydC0+aXVfbGNyKTsKKwl3cml0ZWIoKHVuc2lnbmVkIGNoYXIpZGl2aXNvciwgJnVhcnQtPml1X2RsbCk7CisJd3JpdGViKCh1bnNpZ25lZCBjaGFyKShkaXZpc29yID4+IDgpLCAmdWFydC0+aXVfZGxtKTsKKwl3cml0ZWIoKHVuc2lnbmVkIGNoYXIpcHJlZGl2LCAmdWFydC0+aXVfc2NyKTsKKwl3cml0ZWIoKHVuc2lnbmVkIGNoYXIpbGNyLCAmdWFydC0+aXVfbGNyKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGdldF9pb2MzX3BvcnQgLSBnaXZlbiBhIHVhcnQgcG9ydCwgcmV0dXJuIHRoZSBjb250cm9sIHN0cnVjdHVyZQorICogQHRoZV9wb3J0OiB1YXJ0IHBvcnQgdG8gZmluZAorICovCitzdGF0aWMgc3RydWN0IGlvYzNfcG9ydCAqZ2V0X2lvYzNfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCkKK3sKKwlzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkID0gZGV2X2dldF9kcnZkYXRhKHRoZV9wb3J0LT5kZXYpOworCXN0cnVjdCBpb2MzX2NhcmQgKmNhcmRfcHRyID0gaWRkLT5kYXRhW1N1Ym1vZHVsZV9zbG90XTsKKwlpbnQgaWksIGpqOworCisJaWYgKCFjYXJkX3B0cikgeworCQlOT1RfUFJPR1JFU1MoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZvciAoaWkgPSAwOyBpaSA8IFBPUlRTX1BFUl9DQVJEOyBpaSsrKSB7CisJCWZvciAoamogPSAwOyBqaiA8IExPR0lDQUxfUE9SVFM7IGpqKyspIHsKKwkJCWlmICh0aGVfcG9ydCA9PSAmY2FyZF9wdHItPmljX3BvcnRbaWldLmljcF91YXJ0X3BvcnRbampdKQorCQkJCXJldHVybiBjYXJkX3B0ci0+aWNfcG9ydFtpaV0uaWNwX3BvcnQ7CisJCX0KKwl9CisJTk9UX1BST0dSRVNTKCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogcG9ydF9pbml0IC0gSW5pdGlhbGl6ZSB0aGUgc2lvIGFuZCBpb2MzIGhhcmR3YXJlIGZvciBhIGdpdmVuIHBvcnQKKyAqCQkJY2FsbGVkIHBlciBwb3J0IGZyb20gYXR0YWNoLi4uCisgKiBAcG9ydDogcG9ydCB0byBpbml0aWFsaXplCisgKi8KK3N0YXRpYyBpbnQgaW5saW5lIHBvcnRfaW5pdChzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0KQoreworCXVpbnQzMl90IHNpb19jcjsKKwlzdHJ1Y3QgcG9ydF9ob29rcyAqaG9va3MgPSBwb3J0LT5pcF9ob29rczsKKwlzdHJ1Y3QgaW9jM191YXJ0cmVncyBfX2lvbWVtICp1YXJ0OworCWludCByZXNldF9sb29wX2NvdW50ZXIgPSAweGZmZmZmOworCXN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQgPSBwb3J0LT5pcF9pZGQ7CisKKwkvKiBJZGxlIHRoZSBJT0MzIHNlcmlhbCBpbnRlcmZhY2UgKi8KKwl3cml0ZWwoU1NDUl9SRVNFVCwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKworCS8qIFdhaXQgdW50aWwgYW55IHBlbmRpbmcgYnVzIGFjdGl2aXR5IGZvciB0aGlzIHBvcnQgaGFzIGNlYXNlZCAqLworCWRvIHsKKwkJc2lvX2NyID0gcmVhZGwoJmlkZC0+dm1hLT5zaW9fY3IpOworCQlpZiAocmVzZXRfbG9vcF9jb3VudGVyLS0gPD0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJJT0MzIHVuYWJsZSB0byBjb21lIG91dCBvZiByZXNldCIKKwkJCQkiIHNjciAweCV4XG4iLCBzaW9fY3IpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSB3aGlsZSAoIShzaW9fY3IgJiBTSU9fQ1JfQVJCX0RJQUdfSURMRSkgJiYKKwkgICAgICAgKCgoc2lvX2NyICY9IFNJT19DUl9BUkJfRElBRykgPT0gU0lPX0NSX0FSQl9ESUFHX1RYQSkKKwkJfHwgc2lvX2NyID09IFNJT19DUl9BUkJfRElBR19UWEIKKwkJfHwgc2lvX2NyID09IFNJT19DUl9BUkJfRElBR19SWEEKKwkJfHwgc2lvX2NyID09IFNJT19DUl9BUkJfRElBR19SWEIpKTsKKworCS8qIEZpbmlzaCByZXNldCBzZXF1ZW5jZSAqLworCXdyaXRlbCgwLCAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNzY3IpOworCisJLyogT25jZSBSRVNFVCBpcyBkb25lLCByZWxvYWQgY2FjaGVkIHR4X3Byb2QgYW5kIHJ4X2NvbnMgdmFsdWVzCisJICogYW5kIHNldCByaW5ncyB0byBlbXB0eSBieSBtYWtpbmcgcHJvZCA9PSBjb25zCisJICovCisJcG9ydC0+aXBfdHhfcHJvZCA9IHJlYWRsKCZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3RjaXIpICYgUFJPRF9DT05TX01BU0s7CisJd3JpdGVsKHBvcnQtPmlwX3R4X3Byb2QsICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3RwaXIpOworCXBvcnQtPmlwX3J4X2NvbnMgPSByZWFkbCgmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNycGlyKSAmIFBST0RfQ09OU19NQVNLOworCXdyaXRlbChwb3J0LT5pcF9yeF9jb25zIHwgU1JDSVJfQVJNLCAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNyY2lyKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBmb3IgdGhpcyAxNjU1MCAqLworCXVhcnQgPSBwb3J0LT5pcF91YXJ0X3JlZ3M7CisJd3JpdGViKDAsICZ1YXJ0LT5pdV9sY3IpOworCXdyaXRlYigwLCAmdWFydC0+aXVfaWVyKTsKKworCS8qIFNldCB0aGUgZGVmYXVsdCBiYXVkICovCisJc2V0X2JhdWQocG9ydCwgcG9ydC0+aXBfYmF1ZCk7CisKKwkvKiBTZXQgbGluZSBjb250cm9sIHRvIDggYml0cyBubyBwYXJpdHkgKi8KKwl3cml0ZWIoVUFSVF9MQ1JfV0xFTjggfCAwLCAmdWFydC0+aXVfbGNyKTsKKwkvKiBVQVJUX0xDUl9TVE9QID09IDEgc3RvcCAqLworCisJLyogRW5hYmxlIHRoZSBGSUZPcyAqLworCXdyaXRlYihVQVJUX0ZDUl9FTkFCTEVfRklGTywgJnVhcnQtPml1X2Zjcik7CisJLyogdGhlbiByZXNldCAxNjU1MCBGSUZPcyAqLworCXdyaXRlYihVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlULAorCSAgICAgICAmdWFydC0+aXVfZmNyKTsKKworCS8qIENsZWFyIG1vZGVtIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl3cml0ZWIoMCwgJnVhcnQtPml1X21jcik7CisKKwkvKiBDbGVhciBkZWx0YXMgaW4gbW9kZW0gc3RhdHVzIHJlZ2lzdGVyICovCisJd3JpdGVsKDAsICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c2hhZG93KTsKKworCS8qIE9ubHkgZG8gdGhpcyBvbmNlIHBlciBwb3J0IHBhaXIgKi8KKwlpZiAocG9ydC0+aXBfaG9va3MgPT0gJmhvb2tzX2FycmF5WzBdKSB7CisJCXVuc2lnbmVkIGxvbmcgcmluZ19wY2lfYWRkcjsKKwkJdWludDMyX3QgX19pb21lbSAqc2Jicl9sLCAqc2Jicl9oOworCisJCXNiYnJfbCA9ICZpZGQtPnZtYS0+c2Jicl9sOworCQlzYmJyX2ggPSAmaWRkLT52bWEtPnNiYnJfaDsKKwkJcmluZ19wY2lfYWRkciA9ICh1bnNpZ25lZCBsb25nIF9faW9tZW0pcG9ydC0+aXBfZG1hX3JpbmdidWY7CisJCURQUklOVF9DT05GSUcoKCIlczogcmluZ19wY2lfYWRkciAweCVwXG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgKHZvaWQgKilyaW5nX3BjaV9hZGRyKSk7CisKKwkJd3JpdGVsKCh1bnNpZ25lZCBpbnQpKCh1aW50NjRfdCkgcmluZ19wY2lfYWRkciA+PiAzMiksIHNiYnJfaCk7CisJCXdyaXRlbCgodW5zaWduZWQgaW50KXJpbmdfcGNpX2FkZHIgfCBCVUZfU0laRV9CSVQsIHNiYnJfbCk7CisJfQorCisJLyogU2V0IHRoZSByZWNlaXZlIHRpbWVvdXQgdmFsdWUgdG8gMTAgbXNlYyAqLworCXdyaXRlbChTUlRSX0haIC8gMTAwLCAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNydHIpOworCisJLyogU2V0IHJ4IHRocmVzaG9sZCwgZW5hYmxlIERNQSAqLworCS8qIFNldCBoaWdoIHdhdGVyIG1hcmsgYXQgMy80IG9mIGZ1bGwgcmluZyAqLworCXBvcnQtPmlwX3NzY3IgPSAoRU5UUklFU19QRVJfUklORyAqIDMgLyA0KTsKKworCS8qIHVhcnQgZXhwZXJpZW5jZXMgcGF1c2VzIGF0IGhpZ2ggYmF1ZCByYXRlIHJlZHVjaW5nIGFjdHVhbAorCSAqIHRocm91Z2hwdXQgYnkgMTAlIG9yIHNvIHVubGVzcyB3ZSBlbmFibGUgaGlnaCBzcGVlZCBwb2xsaW5nCisJICogWFhYIHdoZW4gdGhpcyBoYXJkd2FyZSBidWcgaXMgcmVzb2x2ZWQgd2Ugc2hvdWxkIHJldmVydCB0bworCSAqIG5vcm1hbCBwb2xsaW5nIHNwZWVkCisJICovCisJcG9ydC0+aXBfc3NjciB8PSBTU0NSX0hJR0hfU1BEOworCisJd3JpdGVsKHBvcnQtPmlwX3NzY3IsICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3Njcik7CisKKwkvKiBEaXNhYmxlIGFuZCBjbGVhciBhbGwgc2VyaWFsIHJlbGF0ZWQgaW50ZXJydXB0IGJpdHMgKi8KKwlwb3J0LT5pcF9jYXJkLT5pY19lbmFibGUgJj0gfmhvb2tzLT5pbnRyX2NsZWFyOworCWlvYzNfZGlzYWJsZShwb3J0LT5pcF9pcywgaWRkLCBob29rcy0+aW50cl9jbGVhcik7CisJaW9jM19hY2socG9ydC0+aXBfaXMsIGlkZCwgaG9va3MtPmludHJfY2xlYXIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGVuYWJsZV9pbnRycyAtIGVuYWJsZSBpbnRlcnJ1cHRzCisgKiBAcG9ydDogcG9ydCB0byBlbmFibGUKKyAqIEBtYXNrOiBtYXNrIHRvIHVzZQorICovCitzdGF0aWMgdm9pZCBlbmFibGVfaW50cnMoc3RydWN0IGlvYzNfcG9ydCAqcG9ydCwgdWludDMyX3QgbWFzaykKK3sKKwlpZiAoKHBvcnQtPmlwX2NhcmQtPmljX2VuYWJsZSAmIG1hc2spICE9IG1hc2spIHsKKwkJcG9ydC0+aXBfY2FyZC0+aWNfZW5hYmxlIHw9IG1hc2s7CisJCWlvYzNfZW5hYmxlKHBvcnQtPmlwX2lzLCBwb3J0LT5pcF9pZGQsIG1hc2spOworCX0KK30KKworLyoqCisgKiBsb2NhbF9vcGVuIC0gbG9jYWwgb3BlbiBhIHBvcnQKKyAqIEBwb3J0OiBwb3J0IHRvIG9wZW4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbG9jYWxfb3BlbihzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0KQoreworCWludCBzcGluaXRlciA9IDA7CisKKwlwb3J0LT5pcF9mbGFncyA9IElOUFVUX0VOQUJMRTsKKworCS8qIFBhdXNlIHRoZSBETUEgaW50ZXJmYWNlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChwb3J0LT5pcF9zc2NyICYgU1NDUl9ETUFfRU4pIHsKKwkJd3JpdGVsKHBvcnQtPmlwX3NzY3IgfCBTU0NSX0RNQV9QQVVTRSwKKwkJICAgICAgICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3Njcik7CisJCXdoaWxlICgocmVhZGwoJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKQorCQkJJiBTU0NSX1BBVVNFX1NUQVRFKSA9PSAwKSB7CisJCQlzcGluaXRlcisrOworCQkJaWYgKHNwaW5pdGVyID4gTUFYSVRFUikgeworCQkJCU5PVF9QUk9HUkVTUygpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFJlc2V0IHRoZSBpbnB1dCBmaWZvLiAgSWYgdGhlIHVhcnQgcmVjZWl2ZWQgY2hhcnMgd2hpbGUgdGhlIHBvcnQKKwkgKiB3YXMgY2xvc2VkIGFuZCBETUEgaXMgbm90IGVuYWJsZWQsIHRoZSB1YXJ0IG1heSBoYXZlIGEgYnVuY2ggb2YKKwkgKiBjaGFycyBoYW5naW5nIGFyb3VuZCBpbiBpdHMgcnggZmlmbyB3aGljaCB3aWxsIG5vdCBiZSBkaXNjYXJkZWQKKwkgKiBieSByY2xyIGluIHRoZSB1cHBlciBsYXllci4gV2UgbXVzdCBnZXQgcmlkIG9mIHRoZW0gaGVyZS4KKwkgKi8KKwl3cml0ZWIoVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfCBVQVJUX0ZDUl9DTEVBUl9SQ1ZSLAorCSAgICAgICAmcG9ydC0+aXBfdWFydF9yZWdzLT5pdV9mY3IpOworCisJd3JpdGViKFVBUlRfTENSX1dMRU44LCAmcG9ydC0+aXBfdWFydF9yZWdzLT5pdV9sY3IpOworCS8qIFVBUlRfTENSX1NUT1AgPT0gMSBzdG9wICovCisKKwkvKiBSZS1lbmFibGUgRE1BLCBzZXQgZGVmYXVsdCB0aHJlc2hvbGQgdG8gaW50ciB3aGVuZXZlciB0aGVyZSBpcworCSAqIGRhdGEgYXZhaWxhYmxlLgorCSAqLworCXBvcnQtPmlwX3NzY3IgJj0gflNTQ1JfUlhfVEhSRVNIT0xEOworCXBvcnQtPmlwX3NzY3IgfD0gMTsJLyogZGVmYXVsdCB0aHJlc2hvbGQgKi8KKworCS8qIFBsdWcgaW4gdGhlIG5ldyBzc2NyLiAgVGhpcyBpbXBsaWNpdGx5IGNsZWFycyB0aGUgRE1BX1BBVVNFCisJICogZmxhZyBpZiBpdCB3YXMgc2V0IGFib3ZlCisJICovCisJd3JpdGVsKHBvcnQtPmlwX3NzY3IsICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3Njcik7CisJcG9ydC0+aXBfdHhfbG93YXQgPSAxOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNldF9yeF90aW1lb3V0IC0gU2V0IHJ4IHRpbWVvdXQgYW5kIHRocmVzaG9sZCB2YWx1ZXMuCisgKiBAcG9ydDogcG9ydCB0byB1c2UKKyAqIEB0aW1lb3V0OiB0aW1lb3V0IHZhbHVlIGluIHRpY2tzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNldF9yeF90aW1lb3V0KHN0cnVjdCBpb2MzX3BvcnQgKnBvcnQsIGludCB0aW1lb3V0KQoreworCWludCB0aHJlc2hvbGQ7CisKKwlwb3J0LT5pcF9yeF90aW1lb3V0ID0gdGltZW91dDsKKworCS8qIFRpbWVvdXQgaXMgaW4gdGlja3MuICBMZXQncyBmaWd1cmUgb3V0IGhvdyBtYW55IGNoYXJzIHdlCisJICogY2FuIHJlY2VpdmUgYXQgdGhlIGN1cnJlbnQgYmF1ZCByYXRlIGluIHRoYXQgaW50ZXJ2YWwKKwkgKiBhbmQgc2V0IHRoZSByeCB0aHJlc2hvbGQgdG8gdGhhdCBhbW91bnQuICBUaGVyZSBhcmUgNCBjaGFycworCSAqIHBlciByaW5nIGVudHJ5LCBzbyB3ZSdsbCBkaXZpZGUgdGhlIG51bWJlciBvZiBjaGFycyB0aGF0IHdpbGwKKwkgKiBhcnJpdmUgaW4gdGltZW91dCBieSA0LgorCSAqIFNvIC4uLi4gdGltZW91dCAqIGJhdWQgLyAxMCAvIEhaIC8gNCwgd2l0aCBIWiA9IDEwMC4KKwkgKi8KKwl0aHJlc2hvbGQgPSB0aW1lb3V0ICogcG9ydC0+aXBfYmF1ZCAvIDQwMDA7CisJaWYgKHRocmVzaG9sZCA9PSAwKQorCQl0aHJlc2hvbGQgPSAxOwkvKiBvdGhlcndpc2Ugd2UnbGwgaW50ciBhbGwgdGhlIHRpbWUhICovCisKKwlpZiAoKHVuc2lnbmVkKXRocmVzaG9sZCA+ICh1bnNpZ25lZClTU0NSX1JYX1RIUkVTSE9MRCkKKwkJcmV0dXJuIDE7CisKKwlwb3J0LT5pcF9zc2NyICY9IH5TU0NSX1JYX1RIUkVTSE9MRDsKKwlwb3J0LT5pcF9zc2NyIHw9IHRocmVzaG9sZDsKKwl3cml0ZWwocG9ydC0+aXBfc3NjciwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKworCS8qIE5vdyBzZXQgdGhlIHJ4IHRpbWVvdXQgdG8gdGhlIGdpdmVuIHZhbHVlCisJICogYWdhaW4gdGltZW91dCAqIFNSVFJfSFogLyBIWgorCSAqLworCXRpbWVvdXQgPSB0aW1lb3V0ICogU1JUUl9IWiAvIDEwMDsKKwlpZiAodGltZW91dCA+IFNSVFJfQ05UKQorCQl0aW1lb3V0ID0gU1JUUl9DTlQ7CisJd3JpdGVsKHRpbWVvdXQsICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3J0cik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY29uZmlnX3BvcnQgLSBjb25maWcgdGhlIGhhcmR3YXJlCisgKiBAcG9ydDogcG9ydCB0byBjb25maWcKKyAqIEBiYXVkOiBiYXVkIHJhdGUgZm9yIHRoZSBwb3J0CisgKiBAYnl0ZV9zaXplOiBkYXRhIHNpemUKKyAqIEBzdG9wX2JpdHM6IG51bWJlciBvZiBzdG9wIGJpdHMKKyAqIEBwYXJlbmI6IHBhcml0eSBlbmFibGUgPworICogQHBhcm9kZDogb2RkIHBhcml0eSA/CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citjb25maWdfcG9ydChzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0LAorCSAgICBpbnQgYmF1ZCwgaW50IGJ5dGVfc2l6ZSwgaW50IHN0b3BfYml0cywgaW50IHBhcmVuYiwgaW50IHBhcm9kZCkKK3sKKwljaGFyIGxjciwgc2l6ZWJpdHM7CisJaW50IHNwaW5pdGVyID0gMDsKKworCURQUklOVF9DT05GSUcoKCIlczogbGluZSAlZCBiYXVkICVkIGJ5dGVfc2l6ZSAlZCBzdG9wICVkIHBhcmVuYiAlZCAiCisJCQkicGFyb2RkICVkXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCAoKHN0cnVjdCB1YXJ0X3BvcnQgKilwb3J0LT5pcF9wb3J0KS0+bGluZSwKKwkJCWJhdWQsIGJ5dGVfc2l6ZSwgc3RvcF9iaXRzLCBwYXJlbmIsIHBhcm9kZCkpOworCisJaWYgKHNldF9iYXVkKHBvcnQsIGJhdWQpKQorCQlyZXR1cm4gMTsKKworCXN3aXRjaCAoYnl0ZV9zaXplKSB7CisJY2FzZSA1OgorCQlzaXplYml0cyA9IFVBUlRfTENSX1dMRU41OworCQlicmVhazsKKwljYXNlIDY6CisJCXNpemViaXRzID0gVUFSVF9MQ1JfV0xFTjY7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJc2l6ZWJpdHMgPSBVQVJUX0xDUl9XTEVONzsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlzaXplYml0cyA9IFVBUlRfTENSX1dMRU44OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBQYXVzZSB0aGUgRE1BIGludGVyZmFjZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAocG9ydC0+aXBfc3NjciAmIFNTQ1JfRE1BX0VOKSB7CisJCXdyaXRlbChwb3J0LT5pcF9zc2NyIHwgU1NDUl9ETUFfUEFVU0UsCisJCSAgICAgICAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNzY3IpOworCQl3aGlsZSAoKHJlYWRsKCZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3NjcikKKwkJCSYgU1NDUl9QQVVTRV9TVEFURSkgPT0gMCkgeworCQkJc3Bpbml0ZXIrKzsKKwkJCWlmIChzcGluaXRlciA+IE1BWElURVIpCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJLyogQ2xlYXIgcmVsZXZhbnQgZmllbGRzIGluIGxjciAqLworCWxjciA9IHJlYWRiKCZwb3J0LT5pcF91YXJ0X3JlZ3MtPml1X2xjcik7CisJbGNyICY9IH4oTENSX01BU0tfQklUU19DSEFSIHwgVUFSVF9MQ1JfRVBBUiB8CisJCSBVQVJUX0xDUl9QQVJJVFkgfCBMQ1JfTUFTS19TVE9QX0JJVFMpOworCisJLyogU2V0IGJ5dGUgc2l6ZSBpbiBsY3IgKi8KKwlsY3IgfD0gc2l6ZWJpdHM7CisKKwkvKiBTZXQgcGFyaXR5ICovCisJaWYgKHBhcmVuYikgeworCQlsY3IgfD0gVUFSVF9MQ1JfUEFSSVRZOworCQlpZiAoIXBhcm9kZCkKKwkJCWxjciB8PSBVQVJUX0xDUl9FUEFSOworCX0KKworCS8qIFNldCBzdG9wIGJpdHMgKi8KKwlpZiAoc3RvcF9iaXRzKQorCQlsY3IgfD0gVUFSVF9MQ1JfU1RPUCAvKiAyIHN0b3AgYml0cyAqLyA7CisKKwl3cml0ZWIobGNyLCAmcG9ydC0+aXBfdWFydF9yZWdzLT5pdV9sY3IpOworCisJLyogUmUtZW5hYmxlIHRoZSBETUEgaW50ZXJmYWNlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChwb3J0LT5pcF9zc2NyICYgU1NDUl9ETUFfRU4pIHsKKwkJd3JpdGVsKHBvcnQtPmlwX3NzY3IsICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3Njcik7CisJfQorCXBvcnQtPmlwX2JhdWQgPSBiYXVkOworCisJLyogV2hlbiB3ZSBnZXQgd2l0aGluIHRoaXMgbnVtYmVyIG9mIHJpbmcgZW50cmllcyBvZiBmaWxsaW5nIHRoZQorCSAqIGVudGlyZSByaW5nIG9uIHR4LCBwbGFjZSBhbiBFWFBMSUNJVCBpbnRyIHRvIGdlbmVyYXRlIGEgbG93YXQKKwkgKiBub3RpZmljYXRpb24gd2hlbiBvdXRwdXQgaGFzIGRyYWluZWQuCisJICovCisJcG9ydC0+aXBfdHhfbG93YXQgPSAoVFhfTE9XQVRfQ0hBUlMoYmF1ZCkgKyAzKSAvIDQ7CisJaWYgKHBvcnQtPmlwX3R4X2xvd2F0ID09IDApCisJCXBvcnQtPmlwX3R4X2xvd2F0ID0gMTsKKworCXNldF9yeF90aW1lb3V0KHBvcnQsIDIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGRvX3dyaXRlIC0gV3JpdGUgYnl0ZXMgdG8gdGhlIHBvcnQuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqCQkJYWN0dWFsbHkgd3JpdHRlbi4gQ2FsbGVkIGZyb20gdHJhbnNtaXRfY2hhcnMKKyAqIEBwb3J0OiBwb3J0IHRvIHVzZQorICogQGJ1ZjogdGhlIHN0dWZmIHRvIHdyaXRlCisgKiBAbGVuOiBob3cgbWFueSBieXRlcyBpbiAnYnVmJworICovCitzdGF0aWMgaW5saW5lIGludCBkb193cml0ZShzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0LCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IHByb2RfcHRyLCBjb25zX3B0ciwgdG90YWwgPSAwOworCXN0cnVjdCByaW5nICpvdXRyaW5nOworCXN0cnVjdCByaW5nX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgcG9ydF9ob29rcyAqaG9va3MgPSBwb3J0LT5pcF9ob29rczsKKworCUJVR19PTighKGxlbiA+PSAwKSk7CisKKwlwcm9kX3B0ciA9IHBvcnQtPmlwX3R4X3Byb2Q7CisJY29uc19wdHIgPSByZWFkbCgmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnN0Y2lyKSAmIFBST0RfQ09OU19NQVNLOworCW91dHJpbmcgPSBwb3J0LT5pcF9vdXRyaW5nOworCisJLyogTWFpbnRhaW4gYSAxLWVudHJ5IHJlZC16b25lLiAgVGhlIHJpbmcgYnVmZmVyIGlzIGZ1bGwgd2hlbgorCSAqIChjb25zIC0gcHJvZCkgJSByaW5nX3NpemUgaXMgMS4gIFJhdGhlciB0aGFuIGRvIHRoaXMgc3VidHJhY3Rpb24KKwkgKiBpbiB0aGUgYm9keSBvZiB0aGUgbG9vcCwgSSdsbCBkbyBpdCBub3cuCisJICovCisJY29uc19wdHIgPSAoY29uc19wdHIgLSAoaW50KXNpemVvZihzdHJ1Y3QgcmluZ19lbnRyeSkpICYgUFJPRF9DT05TX01BU0s7CisKKwkvKiBTdHVmZiB0aGUgYnl0ZXMgaW50byB0aGUgb3V0cHV0ICovCisJd2hpbGUgKChwcm9kX3B0ciAhPSBjb25zX3B0cikgJiYgKGxlbiA+IDApKSB7CisJCWludCB4eDsKKworCQkvKiBHZXQgNCBieXRlcyAob25lIHJpbmcgZW50cnkpIGF0IGEgdGltZSAqLworCQllbnRyeSA9IChzdHJ1Y3QgcmluZ19lbnRyeSAqKSgoY2FkZHJfdCkgb3V0cmluZyArIHByb2RfcHRyKTsKKworCQkvKiBJbnZhbGlkYXRlIGFsbCBlbnRyaWVzICovCisJCWVudHJ5LT5yaW5nX2FsbHNjID0gMDsKKworCQkvKiBDb3B5IGluIHNvbWUgYnl0ZXMgKi8KKwkJZm9yICh4eCA9IDA7ICh4eCA8IDQpICYmIChsZW4gPiAwKTsgeHgrKykgeworCQkJZW50cnktPnJpbmdfZGF0YVt4eF0gPSAqYnVmKys7CisJCQllbnRyeS0+cmluZ19zY1t4eF0gPSBUWENCX1ZBTElEOworCQkJbGVuLS07CisJCQl0b3RhbCsrOworCQl9CisKKwkJLyogSWYgd2UgYXJlIHdpdGhpbiBzb21lIHNtYWxsIHRocmVzaG9sZCBvZiBmaWxsaW5nIHVwIHRoZQorCQkgKiBlbnRpcmUgcmluZyBidWZmZXIsIHdlIG11c3QgcGxhY2UgYW4gRVhQTElDSVQgaW50ciBoZXJlCisJCSAqIHRvIGdlbmVyYXRlIGEgbG93YXQgaW50ZXJydXB0IGluIGNhc2Ugd2Ugc3Vic2VxdWVudGx5CisJCSAqIHJlYWxseSBkbyBmaWxsIHVwIHRoZSByaW5nIGFuZCB0aGUgY2FsbGVyIGdvZXMgdG8gc2xlZXAuCisJCSAqIE5vIG5lZWQgdG8gcGxhY2UgbW9yZSB0aGFuIG9uZSB0aG91Z2guCisJCSAqLworCQlpZiAoIShwb3J0LT5pcF9mbGFncyAmIExPV0FUX1dSSVRURU4pICYmCisJCSAgICAoKGNvbnNfcHRyIC0gcHJvZF9wdHIpICYgUFJPRF9DT05TX01BU0spCisJCSAgICA8PSBwb3J0LT5pcF90eF9sb3dhdCAqIChpbnQpc2l6ZW9mKHN0cnVjdCByaW5nX2VudHJ5KSkgeworCQkJcG9ydC0+aXBfZmxhZ3MgfD0gTE9XQVRfV1JJVFRFTjsKKwkJCWVudHJ5LT5yaW5nX3NjWzBdIHw9IFRYQ0JfSU5UX1dIRU5fRE9ORTsKKwkJfQorCisJCS8qIEdvIG9uIHRvIG5leHQgZW50cnkgKi8KKwkJcHJvZF9wdHIgKz0gc2l6ZW9mKHN0cnVjdCByaW5nX2VudHJ5KTsKKwkJcHJvZF9wdHIgJj0gUFJPRF9DT05TX01BU0s7CisJfQorCisJLyogSWYgd2Ugc2VudCBzb21ldGhpbmcsIHN0YXJ0IERNQSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAodG90YWwgPiAwICYmICEocG9ydC0+aXBfc3NjciAmIFNTQ1JfRE1BX0VOKSkgeworCQlwb3J0LT5pcF9zc2NyIHw9IFNTQ1JfRE1BX0VOOworCQl3cml0ZWwocG9ydC0+aXBfc3NjciwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKwl9CisKKwkvKiBTdG9yZSB0aGUgbmV3IHByb2R1Y2VyIHBvaW50ZXIuICBJZiB0eCBpcyBkaXNhYmxlZCwgd2Ugc3R1ZmYgdGhlCisJICogZGF0YSBpbnRvIHRoZSByaW5nIGJ1ZmZlciwgYnV0IHdlIGRvbid0IGFjdHVhbGx5IHN0YXJ0IHR4LgorCSAqLworCWlmICghdWFydF90eF9zdG9wcGVkKHBvcnQtPmlwX3BvcnQpKSB7CisJCXdyaXRlbChwcm9kX3B0ciwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zdHBpcik7CisKKwkJLyogSWYgd2UgYXJlIG5vdyB0cmFuc21pdHRpbmcsIGVuYWJsZSB0eF9tdCBpbnRlcnJ1cHQgc28gd2UKKwkJICogY2FuIGRpc2FibGUgRE1BIGlmIG5lY2Vzc2FyeSB3aGVuIHRoZSB0eCBmaW5pc2hlcy4KKwkJICovCisJCWlmICh0b3RhbCA+IDApCisJCQllbmFibGVfaW50cnMocG9ydCwgaG9va3MtPmludHJfdHhfbXQpOworCX0KKwlwb3J0LT5pcF90eF9wcm9kID0gcHJvZF9wdHI7CisKKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qKgorICogZGlzYWJsZV9pbnRycyAtIGRpc2FibGUgaW50ZXJydXB0cworICogQHBvcnQ6IHBvcnQgdG8gZW5hYmxlCisgKiBAbWFzazogbWFzayB0byB1c2UKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfaW50cnMoc3RydWN0IGlvYzNfcG9ydCAqcG9ydCwgdWludDMyX3QgbWFzaykKK3sKKwlpZiAocG9ydC0+aXBfY2FyZC0+aWNfZW5hYmxlICYgbWFzaykgeworCQlpb2MzX2Rpc2FibGUocG9ydC0+aXBfaXMsIHBvcnQtPmlwX2lkZCwgbWFzayk7CisJCXBvcnQtPmlwX2NhcmQtPmljX2VuYWJsZSAmPSB+bWFzazsKKwl9Cit9CisKKy8qKgorICogc2V0X25vdGlmaWNhdGlvbiAtIE1vZGlmeSBldmVudCBub3RpZmljYXRpb24KKyAqIEBwb3J0OiBwb3J0IHRvIHVzZQorICogQG1hc2s6IGV2ZW50cyBtYXNrCisgKiBAc2V0X29uOiBzZXQgPworICovCitzdGF0aWMgaW50IHNldF9ub3RpZmljYXRpb24oc3RydWN0IGlvYzNfcG9ydCAqcG9ydCwgaW50IG1hc2ssIGludCBzZXRfb24pCit7CisJc3RydWN0IHBvcnRfaG9va3MgKmhvb2tzID0gcG9ydC0+aXBfaG9va3M7CisJdWludDMyX3QgaW50cmJpdHMsIHNzY3JiaXRzOworCisJQlVHX09OKCFtYXNrKTsKKworCWludHJiaXRzID0gc3NjcmJpdHMgPSAwOworCisJaWYgKG1hc2sgJiBOX0RBVEFfUkVBRFkpCisJCWludHJiaXRzIHw9IChob29rcy0+aW50cl9yeF90aW1lciB8IGhvb2tzLT5pbnRyX3J4X2hpZ2gpOworCWlmIChtYXNrICYgTl9PVVRQVVRfTE9XQVQpCisJCWludHJiaXRzIHw9IGhvb2tzLT5pbnRyX3R4X2V4cGxpY2l0OworCWlmIChtYXNrICYgTl9ERENEKSB7CisJCWludHJiaXRzIHw9IGhvb2tzLT5pbnRyX2RlbHRhX2RjZDsKKwkJc3NjcmJpdHMgfD0gU1NDUl9SWF9SSU5HX0RDRDsKKwl9CisJaWYgKG1hc2sgJiBOX0RDVFMpCisJCWludHJiaXRzIHw9IGhvb2tzLT5pbnRyX2RlbHRhX2N0czsKKworCWlmIChzZXRfb24pIHsKKwkJZW5hYmxlX2ludHJzKHBvcnQsIGludHJiaXRzKTsKKwkJcG9ydC0+aXBfbm90aWZ5IHw9IG1hc2s7CisJCXBvcnQtPmlwX3NzY3IgfD0gc3NjcmJpdHM7CisJfSBlbHNlIHsKKwkJZGlzYWJsZV9pbnRycyhwb3J0LCBpbnRyYml0cyk7CisJCXBvcnQtPmlwX25vdGlmeSAmPSB+bWFzazsKKwkJcG9ydC0+aXBfc3NjciAmPSB+c3NjcmJpdHM7CisJfQorCisJLyogV2UgcmVxdWlyZSBETUEgaWYgZWl0aGVyIERBVEFfUkVBRFkgb3IgRERDRCBub3RpZmljYXRpb24gaXMKKwkgKiBjdXJyZW50bHkgcmVxdWVzdGVkLiBJZiBuZWl0aGVyIG9mIHRoZXNlIGlzIHJlcXVlc3RlZCBhbmQKKwkgKiB0aGVyZSBpcyBjdXJyZW50bHkgbm8gdHggaW4gcHJvZ3Jlc3MsIERNQSBtYXkgYmUgZGlzYWJsZWQuCisJICovCisJaWYgKHBvcnQtPmlwX25vdGlmeSAmIChOX0RBVEFfUkVBRFkgfCBOX0REQ0QpKQorCQlwb3J0LT5pcF9zc2NyIHw9IFNTQ1JfRE1BX0VOOworCWVsc2UgaWYgKCEocG9ydC0+aXBfY2FyZC0+aWNfZW5hYmxlICYgaG9va3MtPmludHJfdHhfbXQpKQorCQlwb3J0LT5pcF9zc2NyICY9IH5TU0NSX0RNQV9FTjsKKworCXdyaXRlbChwb3J0LT5pcF9zc2NyLCAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNzY3IpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNldF9tY3IgLSBzZXQgdGhlIG1hc3RlciBjb250cm9sIHJlZworICogQHRoZV9wb3J0OiBwb3J0IHRvIHVzZQorICogQG1hc2sxOiBtY3IgbWFzaworICogQG1hc2syOiBzaGFkb3cgbWFzaworICovCitzdGF0aWMgaW5saW5lIGludCBzZXRfbWNyKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0LAorCQkJICBpbnQgbWFzazEsIGludCBtYXNrMikKK3sKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0ID0gZ2V0X2lvYzNfcG9ydCh0aGVfcG9ydCk7CisJdWludDMyX3Qgc2hhZG93OworCWludCBzcGluaXRlciA9IDA7CisJY2hhciBtY3I7CisKKwlpZiAoIXBvcnQpCisJCXJldHVybiAtMTsKKworCS8qIFBhdXNlIHRoZSBETUEgaW50ZXJmYWNlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChwb3J0LT5pcF9zc2NyICYgU1NDUl9ETUFfRU4pIHsKKwkJd3JpdGVsKHBvcnQtPmlwX3NzY3IgfCBTU0NSX0RNQV9QQVVTRSwKKwkJICAgICAgICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3Njcik7CisJCXdoaWxlICgocmVhZGwoJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKQorCQkJJiBTU0NSX1BBVVNFX1NUQVRFKSA9PSAwKSB7CisJCQlzcGluaXRlcisrOworCQkJaWYgKHNwaW5pdGVyID4gTUFYSVRFUikKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJc2hhZG93ID0gcmVhZGwoJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zaGFkb3cpOworCW1jciA9IChzaGFkb3cgJiAweGZmMDAwMDAwKSA+PiAyNDsKKworCS8qIFNldCBuZXcgdmFsdWUgKi8KKwltY3IgfD0gbWFzazE7CisJc2hhZG93IHw9IG1hc2syOworCXdyaXRlYihtY3IsICZwb3J0LT5pcF91YXJ0X3JlZ3MtPml1X21jcik7CisJd3JpdGVsKHNoYWRvdywgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zaGFkb3cpOworCisJLyogUmUtZW5hYmxlIHRoZSBETUEgaW50ZXJmYWNlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChwb3J0LT5pcF9zc2NyICYgU1NDUl9ETUFfRU4pIHsKKwkJd3JpdGVsKHBvcnQtPmlwX3NzY3IsICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3Njcik7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGlvYzNfc2V0X3Byb3RvIC0gc2V0IHRoZSBwcm90b2NvbCBmb3IgdGhlIHBvcnQKKyAqIEBwb3J0OiBwb3J0IHRvIHVzZQorICogQHByb3RvOiBwcm90b2NvbCB0byB1c2UKKyAqLworc3RhdGljIGludCBpb2MzX3NldF9wcm90byhzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0LCBpbnQgcHJvdG8pCit7CisJc3RydWN0IHBvcnRfaG9va3MgKmhvb2tzID0gcG9ydC0+aXBfaG9va3M7CisKKwlzd2l0Y2ggKHByb3RvKSB7CisJZGVmYXVsdDoKKwljYXNlIFBST1RPX1JTMjMyOgorCQkvKiBDbGVhciB0aGUgYXBwcm9wcmlhdGUgR0lPIHBpbiAqLworCQlEUFJJTlRfQ09ORklHKCgiJXM6IHJzMjMyXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJd3JpdGVsKDAsICgmcG9ydC0+aXBfaWRkLT52bWEtPmdwcHJbMF0KKwkJCQkJKyBob29rcy0+cnM0MjJfc2VsZWN0X3BpbikpOworCQlicmVhazsKKworCWNhc2UgUFJPVE9fUlM0MjI6CisJCS8qIFNldCB0aGUgYXBwcm9wcmlhdGUgR0lPIHBpbiAqLworCQlEUFJJTlRfQ09ORklHKCgiJXM6IHJzNDIyXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJd3JpdGVsKDEsICgmcG9ydC0+aXBfaWRkLT52bWEtPmdwcHJbMF0KKwkJCQkJKyBob29rcy0+cnM0MjJfc2VsZWN0X3BpbikpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdHJhbnNtaXRfY2hhcnMgLSB1cHBlciBsZXZlbCB3cml0ZSwgY2FsbGVkIHdpdGggdGhlX3BvcnQtPmxvY2sKKyAqIEB0aGVfcG9ydDogcG9ydCB0byB3cml0ZQorICovCitzdGF0aWMgdm9pZCB0cmFuc21pdF9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCkKK3sKKwlpbnQgeG1pdF9jb3VudCwgdGFpbCwgaGVhZDsKKwlpbnQgcmVzdWx0OworCWNoYXIgKnN0YXJ0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJc3RydWN0IGlvYzNfcG9ydCAqcG9ydCA9IGdldF9pb2MzX3BvcnQodGhlX3BvcnQpOworCXN0cnVjdCB1YXJ0X2luZm8gKmluZm87CisKKwlpZiAoIXRoZV9wb3J0KQorCQlyZXR1cm47CisJaWYgKCFwb3J0KQorCQlyZXR1cm47CisKKwlpbmZvID0gdGhlX3BvcnQtPmluZm87CisJdHR5ID0gaW5mby0+dHR5OworCisJaWYgKHVhcnRfY2lyY19lbXB0eSgmaW5mby0+eG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKHRoZV9wb3J0KSkgeworCQkvKiBOb3RoaW5nIHRvIGRvIG9yIGh3IHN0b3BwZWQgKi8KKwkJc2V0X25vdGlmaWNhdGlvbihwb3J0LCBOX0FMTF9PVVRQVVQsIDApOworCQlyZXR1cm47CisJfQorCisJaGVhZCA9IGluZm8tPnhtaXQuaGVhZDsKKwl0YWlsID0gaW5mby0+eG1pdC50YWlsOworCXN0YXJ0ID0gKGNoYXIgKikmaW5mby0+eG1pdC5idWZbdGFpbF07CisKKwkvKiB3cml0ZSBvdXQgYWxsIHRoZSBkYXRhIG9yIHVudGlsIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworCXhtaXRfY291bnQgPSAoaGVhZCA8IHRhaWwpID8gKFVBUlRfWE1JVF9TSVpFIC0gdGFpbCkgOiAoaGVhZCAtIHRhaWwpOworCWlmICh4bWl0X2NvdW50ID4gMCkgeworCQlyZXN1bHQgPSBkb193cml0ZShwb3J0LCBzdGFydCwgeG1pdF9jb3VudCk7CisJCWlmIChyZXN1bHQgPiAwKSB7CisJCQkvKiBib29raW5nICovCisJCQl4bWl0X2NvdW50IC09IHJlc3VsdDsKKwkJCXRoZV9wb3J0LT5pY291bnQudHggKz0gcmVzdWx0OworCQkJLyogYWR2YW5jZSB0aGUgcG9pbnRlcnMgKi8KKwkJCXRhaWwgKz0gcmVzdWx0OworCQkJdGFpbCAmPSBVQVJUX1hNSVRfU0laRSAtIDE7CisJCQlpbmZvLT54bWl0LnRhaWwgPSB0YWlsOworCQkJc3RhcnQgPSAoY2hhciAqKSZpbmZvLT54bWl0LmJ1Zlt0YWlsXTsKKwkJfQorCX0KKwlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoJmluZm8tPnhtaXQpIDwgV0FLRVVQX0NIQVJTKQorCQl1YXJ0X3dyaXRlX3dha2V1cCh0aGVfcG9ydCk7CisKKwlpZiAodWFydF9jaXJjX2VtcHR5KCZpbmZvLT54bWl0KSkgeworCQlzZXRfbm90aWZpY2F0aW9uKHBvcnQsIE5fT1VUUFVUX0xPV0FULCAwKTsKKwl9IGVsc2UgeworCQlzZXRfbm90aWZpY2F0aW9uKHBvcnQsIE5fT1VUUFVUX0xPV0FULCAxKTsKKwl9Cit9CisKKy8qKgorICogaW9jM19jaGFuZ2Vfc3BlZWQgLSBjaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBwb3J0CisgKiBAdGhlX3BvcnQ6IHBvcnQgdG8gY2hhbmdlCisgKiBAbmV3X3Rlcm1pb3M6IG5ldyB0ZXJtaW9zIHNldHRpbmdzCisgKiBAb2xkX3Rlcm1pb3M6IG9sZCB0ZXJtaW9zIHNldHRpbmdzCisgKi8KK3N0YXRpYyB2b2lkCitpb2MzX2NoYW5nZV9zcGVlZChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCwKKwkJICBzdHJ1Y3QgdGVybWlvcyAqbmV3X3Rlcm1pb3MsIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0ID0gZ2V0X2lvYzNfcG9ydCh0aGVfcG9ydCk7CisJdW5zaWduZWQgaW50IGNmbGFnOworCWludCBiYXVkOworCWludCBuZXdfcGFyaXR5ID0gMCwgbmV3X3Bhcml0eV9lbmFibGUgPSAwLCBuZXdfc3RvcCA9IDAsIG5ld19kYXRhID0gODsKKwlzdHJ1Y3QgdWFydF9pbmZvICppbmZvID0gdGhlX3BvcnQtPmluZm87CisKKwljZmxhZyA9IG5ld190ZXJtaW9zLT5jX2NmbGFnOworCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCW5ld19kYXRhID0gNTsKKwkJYnJlYWs7CisJY2FzZSBDUzY6CisJCW5ld19kYXRhID0gNjsKKwkJYnJlYWs7CisJY2FzZSBDUzc6CisJCW5ld19kYXRhID0gNzsKKwkJYnJlYWs7CisJY2FzZSBDUzg6CisJCW5ld19kYXRhID0gODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogY3V6IHdlIGFsd2F5cyBuZWVkIGEgZGVmYXVsdCAuLi4gKi8KKwkJbmV3X2RhdGEgPSA1OworCQlicmVhazsKKwl9CisJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CisJCW5ld19zdG9wID0gMTsKKwl9CisJaWYgKGNmbGFnICYgUEFSRU5CKSB7CisJCW5ld19wYXJpdHlfZW5hYmxlID0gMTsKKwkJaWYgKGNmbGFnICYgUEFST0REKQorCQkJbmV3X3Bhcml0eSA9IDE7CisJfQorCWJhdWQgPSB1YXJ0X2dldF9iYXVkX3JhdGUodGhlX3BvcnQsIG5ld190ZXJtaW9zLCBvbGRfdGVybWlvcywKKwkJCQkgIE1JTl9CQVVEX1NVUFBPUlRFRCwgTUFYX0JBVURfU1VQUE9SVEVEKTsKKwlEUFJJTlRfQ09ORklHKCgiJXM6IHJldHVybmVkIGJhdWQgJWQgZm9yIGxpbmUgJWRcbiIsIF9fRlVOQ1RJT05fXywgYmF1ZCwKKwkJCQl0aGVfcG9ydC0+bGluZSkpOworCisJaWYgKCF0aGVfcG9ydC0+Zmlmb3NpemUpCisJCXRoZV9wb3J0LT5maWZvc2l6ZSA9IEZJRk9fU0laRTsKKwl1YXJ0X3VwZGF0ZV90aW1lb3V0KHRoZV9wb3J0LCBjZmxhZywgYmF1ZCk7CisKKwl0aGVfcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrID0gTl9BTExfSU5QVVQ7CisKKwlpbmZvLT50dHktPmxvd19sYXRlbmN5ID0gMTsKKworCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKQorCQl0aGVfcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrICY9IH4oTl9QQVJJVFlfRVJST1IKKwkJCQkJCSAgfCBOX0ZSQU1JTkdfRVJST1IpOworCWlmIChJX0lHTkJSSyhpbmZvLT50dHkpKSB7CisJCXRoZV9wb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgJj0gfk5fQlJFQUs7CisJCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKQorCQkJdGhlX3BvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayAmPSB+Tl9PVkVSUlVOX0VSUk9SOworCX0KKwlpZiAoIShjZmxhZyAmIENSRUFEKSkgeworCQkvKiBpZ25vcmUgZXZlcnl0aGluZyAqLworCQl0aGVfcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrICY9IH5OX0RBVEFfUkVBRFk7CisJfQorCisJaWYgKGNmbGFnICYgQ1JUU0NUUykgeworCQkvKiBlbmFibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sICovCisJCXBvcnQtPmlwX3NzY3IgfD0gU1NDUl9IRkNfRU47CisJfQorCWVsc2UgeworCQkvKiBkaXNhYmxlIGhhcmR3YXJlIGZsb3cgY29udHJvbCAqLworCQlwb3J0LT5pcF9zc2NyICY9IH5TU0NSX0hGQ19FTjsKKwl9CisJd3JpdGVsKHBvcnQtPmlwX3NzY3IsICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3Njcik7CisKKwkvKiBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHByb3BlciBub3RpZmljYXRpb24gY2FsbCAqLworCURQUklOVF9DT05GSUcoKCIlcyA6IHBvcnQgMHglcCBsaW5lICVkIGNmbGFnIDAlbyAiCisJCSAgICAgICAiY29uZmlnX3BvcnQoYmF1ZCAlZCBkYXRhICVkIHN0b3AgJWQgcGVuYWJsZSAlZCAiCisJCQkiIHBhcml0eSAlZCksIG5vdGlmaWNhdGlvbiAweCV4XG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCAodm9pZCAqKXBvcnQsIHRoZV9wb3J0LT5saW5lLCBjZmxhZywgYmF1ZCwKKwkJICAgICAgIG5ld19kYXRhLCBuZXdfc3RvcCwgbmV3X3Bhcml0eV9lbmFibGUsIG5ld19wYXJpdHksCisJCSAgICAgICB0aGVfcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrKSk7CisKKwlpZiAoKGNvbmZpZ19wb3J0KHBvcnQsIGJhdWQsCS8qIGJhdWQgKi8KKwkJCSBuZXdfZGF0YSwJLyogYnl0ZSBzaXplICovCisJCQkgbmV3X3N0b3AsCS8qIHN0b3AgYml0cyAqLworCQkJIG5ld19wYXJpdHlfZW5hYmxlLAkvKiBzZXQgcGFyaXR5ICovCisJCQkgbmV3X3Bhcml0eSkpID49IDApIHsJLyogcGFyaXR5IDE9PW9kZCAqLworCQlzZXRfbm90aWZpY2F0aW9uKHBvcnQsIHRoZV9wb3J0LT5pZ25vcmVfc3RhdHVzX21hc2ssIDEpOworCX0KK30KKworLyoqCisgKiBpYzNfc3RhcnR1cF9sb2NhbCAtIFN0YXJ0IHVwIHRoZSBzZXJpYWwgcG9ydCAtIHJldHVybnMgPj0gMCBpZiBubyBlcnJvcnMKKyAqIEB0aGVfcG9ydDogUG9ydCB0byBvcGVyYXRlIG9uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGljM19zdGFydHVwX2xvY2FsKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0KQoreworCXN0cnVjdCBpb2MzX3BvcnQgKnBvcnQ7CisKKwlpZiAoIXRoZV9wb3J0KSB7CisJCU5PVF9QUk9HUkVTUygpOworCQlyZXR1cm4gLTE7CisJfQorCisJcG9ydCA9IGdldF9pb2MzX3BvcnQodGhlX3BvcnQpOworCWlmICghcG9ydCkgeworCQlOT1RfUFJPR1JFU1MoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWxvY2FsX29wZW4ocG9ydCk7CisKKwkvKiBzZXQgdGhlIHByb3RvY29sICovCisJaW9jM19zZXRfcHJvdG8ocG9ydCwgSVNfUlMyMzIodGhlX3BvcnQtPmxpbmUpID8gUFJPVE9fUlMyMzIgOgorCQkJCQkJCVBST1RPX1JTNDIyKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGlvYzNfY2Jfb3V0cHV0X2xvd2F0IC0gY2FsbGVkIHdoZW4gdGhlIG91dHB1dCBsb3cgd2F0ZXIgbWFyayBpcyBoaXQKKyAqIEBwb3J0OiBwb3J0IHRvIG91dHB1dAorICovCitzdGF0aWMgdm9pZCBpb2MzX2NiX291dHB1dF9sb3dhdChzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgcGZsYWdzOworCisJLyogdGhlX3BvcnQtPmxvY2sgaXMgc2V0IG9uIHRoZSBjYWxsIGhlcmUgKi8KKwlpZiAocG9ydC0+aXBfcG9ydCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+aXBfcG9ydC0+bG9jaywgcGZsYWdzKTsKKwkJdHJhbnNtaXRfY2hhcnMocG9ydC0+aXBfcG9ydCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmlwX3BvcnQtPmxvY2ssIHBmbGFncyk7CisJfQorfQorCisvKgorICogaW9jM19jYl9wb3N0X25jcyAtIGNhbGxlZCBmb3Igc29tZSBiYXNpYyBlcnJvcnMKKyAqIEBwb3J0OiBwb3J0IHRvIHVzZQorICogQG5jczogZXZlbnQKKyAqLworc3RhdGljIHZvaWQgaW9jM19jYl9wb3N0X25jcyhzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCwgaW50IG5jcykKK3sKKwlzdHJ1Y3QgdWFydF9pY291bnQgKmljb3VudDsKKworCWljb3VudCA9ICZ0aGVfcG9ydC0+aWNvdW50OworCisJaWYgKG5jcyAmIE5DU19CUkVBSykKKwkJaWNvdW50LT5icmsrKzsKKwlpZiAobmNzICYgTkNTX0ZSQU1JTkcpCisJCWljb3VudC0+ZnJhbWUrKzsKKwlpZiAobmNzICYgTkNTX09WRVJSVU4pCisJCWljb3VudC0+b3ZlcnJ1bisrOworCWlmIChuY3MgJiBOQ1NfUEFSSVRZKQorCQlpY291bnQtPnBhcml0eSsrOworfQorCisvKioKKyAqIGRvX3JlYWQgLSBSZWFkIGluIGJ5dGVzIGZyb20gdGhlIHBvcnQuICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcworICoJCQlhY3R1YWxseSByZWFkLgorICogQHRoZV9wb3J0OiBwb3J0IHRvIHVzZQorICogQGJ1ZjogcGxhY2UgdG8gcHV0IHRoZSBzdHVmZiB3ZSByZWFkCisgKiBAbGVuOiBob3cgYmlnICdidWYnIGlzCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgZG9fcmVhZChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCBwcm9kX3B0ciwgY29uc19wdHIsIHRvdGFsOworCXN0cnVjdCBpb2MzX3BvcnQgKnBvcnQgPSBnZXRfaW9jM19wb3J0KHRoZV9wb3J0KTsKKwlzdHJ1Y3QgcmluZyAqaW5yaW5nOworCXN0cnVjdCByaW5nX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgcG9ydF9ob29rcyAqaG9va3MgPSBwb3J0LT5pcF9ob29rczsKKwlpbnQgYnl0ZV9udW07CisJY2hhciAqc2M7CisJaW50IGxvb3BfY291bnRlcjsKKworCUJVR19PTighKGxlbiA+PSAwKSk7CisJQlVHX09OKCFwb3J0KTsKKworCS8qIFRoZXJlIGlzIGEgbmFzdHkgdGltaW5nIGlzc3VlIGluIHRoZSBJT0MzLiBXaGVuIHRoZSByeF90aW1lcgorCSAqIGV4cGlyZXMgb3IgdGhlIHJ4X2hpZ2ggY29uZGl0aW9uIGFyaXNlcywgd2UgdGFrZSBhbiBpbnRlcnJ1cHQuCisJICogQXQgc29tZSBwb2ludCB3aGlsZSBzZXJ2aWNpbmcgdGhlIGludGVycnVwdCwgd2UgcmVhZCBieXRlcyBmcm9tCisJICogdGhlIHJpbmcgYnVmZmVyIGFuZCByZS1hcm0gdGhlIHJ4X3RpbWVyLiAgSG93ZXZlciB0aGUgcnhfdGltZXIgaXMKKwkgKiBub3Qgc3RhcnRlZCB1bnRpbCB0aGUgZmlyc3QgYnl0ZSBpcyByZWNlaXZlZCAqYWZ0ZXIqIGl0IGlzIGFybWVkLAorCSAqIGFuZCBhbnkgYnl0ZXMgcGVuZGluZyBpbiB0aGUgcnggY29uc3RydWN0aW9uIGJ1ZmZlcnMgYXJlIG5vdCBkcmFpbmVkCisJICogdG8gbWVtb3J5IHVudGlsIGVpdGhlciB0aGVyZSBhcmUgNCBieXRlcyBhdmFpbGFibGUgb3IgdGhlIHJ4X3RpbWVyCisJICogZXhwaXJlcy4gIFRoaXMgbGVhZHMgdG8gYSBwb3RlbnRpYWwgc2l0dWF0aW9uIHdoZXJlIGRhdGEgaXMgbGVmdAorCSAqIGluIHRoZSBjb25zdHJ1Y3Rpb24gYnVmZmVycyBmb3JldmVyIC0gMSB0byAzIGJ5dGVzIHdlcmUgcmVjZWl2ZWQKKwkgKiBhZnRlciB0aGUgaW50ZXJydXB0IHdhcyBnZW5lcmF0ZWQgYnV0IGJlZm9yZSB0aGUgcnhfdGltZXIgd2FzCisJICogcmUtYXJtZWQuIEF0IHRoYXQgcG9pbnQgYXMgbG9uZyBhcyBubyBzdWJzZXF1ZW50IGJ5dGVzIGFyZSByZWNlaXZlZAorCSAqIHRoZSB0aW1lciB3aWxsIG5ldmVyIGJlIHN0YXJ0ZWQgYW5kIHRoZSBieXRlcyB3aWxsIHJlbWFpbiBpbiB0aGUKKwkgKiBjb25zdHJ1Y3Rpb24gYnVmZmVyIGZvcmV2ZXIuICBUaGUgc29sdXRpb24gaXMgdG8gZXhlY3V0ZSBhIERSQUlOCisJICogY29tbWFuZCBhZnRlciByZWFybWluZyB0aGUgdGltZXIuICBUaGlzIHdheSBhbnkgYnl0ZXMgcmVjZWl2ZWQgYmVmb3JlCisJICogdGhlIERSQUlOIHdpbGwgYmUgZHJhaW5lZCB0byBtZW1vcnksIGFuZCBhbnkgYnl0ZXMgcmVjZWl2ZWQgYWZ0ZXIKKwkgKiB0aGUgRFJBSU4gd2lsbCBzdGFydCB0aGUgVElNRVIgYW5kIGJlIGRyYWluZWQgd2hlbiBpdCBleHBpcmVzLgorCSAqIEx1Y2tpbHksIHRoaXMgb25seSBuZWVkcyB0byBiZSBkb25lIHdoZW4gdGhlIERNQSBidWZmZXIgaXMgZW1wdHkKKwkgKiBzaW5jZSB0aGVyZSBpcyBubyByZXF1aXJlbWVudCB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJuIGFsbAorCSAqIGF2YWlsYWJsZSBkYXRhIGFzIGxvbmcgYXMgaXQgcmV0dXJucyBzb21lLgorCSAqLworCS8qIFJlLWFybSB0aGUgdGltZXIgKi8KKworCXdyaXRlbChwb3J0LT5pcF9yeF9jb25zIHwgU1JDSVJfQVJNLCAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNyY2lyKTsKKworCXByb2RfcHRyID0gcmVhZGwoJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zcnBpcikgJiBQUk9EX0NPTlNfTUFTSzsKKwljb25zX3B0ciA9IHBvcnQtPmlwX3J4X2NvbnM7CisKKwlpZiAocHJvZF9wdHIgPT0gY29uc19wdHIpIHsKKwkJaW50IHJlc2V0X2RtYSA9IDA7CisKKwkJLyogSW5wdXQgYnVmZmVyIGFwcGVhcnMgZW1wdHksIGRvIGEgZmx1c2guICovCisKKwkJLyogRE1BIG11c3QgYmUgZW5hYmxlZCBmb3IgdGhpcyB0byB3b3JrLiAqLworCQlpZiAoIShwb3J0LT5pcF9zc2NyICYgU1NDUl9ETUFfRU4pKSB7CisJCQlwb3J0LT5pcF9zc2NyIHw9IFNTQ1JfRE1BX0VOOworCQkJcmVzZXRfZG1hID0gMTsKKwkJfQorCisJCS8qIFBvdGVudGlhbCByYWNlIGNvbmRpdGlvbjogd2UgbXVzdCByZWxvYWQgdGhlIHNycGlyIGFmdGVyCisJCSAqIGlzc3VpbmcgdGhlIGRyYWluIGNvbW1hbmQsIG90aGVyd2lzZSB3ZSBjb3VsZCB0aGluayB0aGUgcngKKwkJICogYnVmZmVyIGlzIGVtcHR5LCB0aGVuIHRha2UgYSB2ZXJ5IGxvbmcgaW50ZXJydXB0LCBhbmQgd2hlbgorCQkgKiB3ZSBjb21lIGJhY2sgaXQncyBmdWxsIGFuZCB3ZSB3YWl0IGZvcmV2ZXIgZm9yIHRoZSBkcmFpbiB0bworCQkgKiBjb21wbGV0ZS4KKwkJICovCisJCXdyaXRlbChwb3J0LT5pcF9zc2NyIHwgU1NDUl9SWF9EUkFJTiwKKwkJICAgICAgICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3Njcik7CisJCXByb2RfcHRyID0gcmVhZGwoJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zcnBpcikgJiBQUk9EX0NPTlNfTUFTSzsKKworCQkvKiBXZSBtdXN0IG5vdCB3YWl0IGZvciB0aGUgRFJBSU4gdG8gY29tcGxldGUgdW5sZXNzIHRoZXJlIGFyZQorCQkgKiBhdCBsZWFzdCA4IGJ5dGVzICgyIHJpbmcgZW50cmllcykgYXZhaWxhYmxlIHRvIHJlY2VpdmUgdGhlCisJCSAqIGRhdGEgb3RoZXJ3aXNlIHRoZSBEUkFJTiB3aWxsIG5ldmVyIGNvbXBsZXRlIGFuZCB3ZSdsbAorCQkgKiBkZWFkbG9jayBoZXJlLgorCQkgKiBJbiBmYWN0LCB0byBtYWtlIHRoaW5ncyBlYXNpZXIsIEknbGwganVzdCBpZ25vcmUgdGhlIGZsdXNoIGlmCisJCSAqIHRoZXJlIGlzIGFueSBkYXRhIGF0IGFsbCBub3cgYXZhaWxhYmxlLgorCQkgKi8KKwkJaWYgKHByb2RfcHRyID09IGNvbnNfcHRyKSB7CisJCQlsb29wX2NvdW50ZXIgPSAwOworCQkJd2hpbGUgKHJlYWRsKCZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3NjcikgJgorCQkJICAgICAgIFNTQ1JfUlhfRFJBSU4pIHsKKwkJCQlsb29wX2NvdW50ZXIrKzsKKwkJCQlpZiAobG9vcF9jb3VudGVyID4gTUFYSVRFUikKKwkJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQkvKiBTSUdILiBXZSBoYXZlIHRvIHJlbG9hZCB0aGUgcHJvZF9wdHIgKmFnYWluKiBzaW5jZQorCQkJICogdGhlIGRyYWluIG1heSBoYXZlIGNhdXNlZCBpdCB0byBjaGFuZ2UKKwkJCSAqLworCQkJcHJvZF9wdHIgPSByZWFkbCgmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNycGlyKQorCQkJICAgICYgUFJPRF9DT05TX01BU0s7CisJCX0KKwkJaWYgKHJlc2V0X2RtYSkgeworCQkJcG9ydC0+aXBfc3NjciAmPSB+U1NDUl9ETUFfRU47CisJCQl3cml0ZWwocG9ydC0+aXBfc3NjciwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKwkJfQorCX0KKwlpbnJpbmcgPSBwb3J0LT5pcF9pbnJpbmc7CisJcG9ydC0+aXBfZmxhZ3MgJj0gflJFQURfQUJPUlRFRDsKKworCXRvdGFsID0gMDsKKwlsb29wX2NvdW50ZXIgPSAweGZmZmZmOwkvKiB0byBhdm9pZCBoYW5ncyAqLworCisJLyogR3JhYiBieXRlcyBmcm9tIHRoZSBoYXJkd2FyZSAqLworCXdoaWxlICgocHJvZF9wdHIgIT0gY29uc19wdHIpICYmIChsZW4gPiAwKSkgeworCQllbnRyeSA9IChzdHJ1Y3QgcmluZ19lbnRyeSAqKSgoY2FkZHJfdCkgaW5yaW5nICsgY29uc19wdHIpOworCisJCWlmIChsb29wX2NvdW50ZXItLSA8PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJT0MzIHNlcmlhbDogIgorCQkJICAgICAgICJwb3NzaWJsZSBoYW5nIGNvbmRpdGlvbi8iCisJCQkgICAgICAgInBvcnQgc3R1Y2sgb24gcmVhZCAobGluZSAlZCkuXG4iLAorCQkJCXRoZV9wb3J0LT5saW5lKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQWNjb3JkaW5nIHRvIHRoZSBwcm9kdWNlciBwb2ludGVyLCB0aGlzIHJpbmcgZW50cnkKKwkJICogbXVzdCBjb250YWluIHNvbWUgZGF0YS4gIEJ1dCBpZiB0aGUgUElPIGhhcHBlbmVkIGZhc3RlcgorCQkgKiB0aGFuIHRoZSBETUEsIHRoZSBkYXRhIG1heSBub3QgYmUgYXZhaWxhYmxlIHlldCwgc28gbGV0J3MKKwkJICogd2FpdCB1bnRpbCBpdCBhcnJpdmVzLgorCQkgKi8KKwkJaWYgKChlbnRyeS0+cmluZ19hbGxzYyAmIFJJTkdfQU5ZX1ZBTElEKSA9PSAwKSB7CisJCQkvKiBJbmRpY2F0ZSB0aGUgcmVhZCBpcyBhYm9ydGVkIHNvIHdlIGRvbid0IGRpc2FibGUKKwkJCSAqIHRoZSBpbnRlcnJ1cHQgdGhpbmtpbmcgdGhhdCB0aGUgY29uc3VtZXIgaXMKKwkJCSAqIGNvbmdlc3RlZC4KKwkJCSAqLworCQkJcG9ydC0+aXBfZmxhZ3MgfD0gUkVBRF9BQk9SVEVEOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTG9hZCB0aGUgYnl0ZXMvc3RhdHVzIG91dCBvZiB0aGUgcmluZyBlbnRyeSAqLworCQlmb3IgKGJ5dGVfbnVtID0gMDsgYnl0ZV9udW0gPCA0ICYmIGxlbiA+IDA7IGJ5dGVfbnVtKyspIHsKKwkJCXNjID0gJihlbnRyeS0+cmluZ19zY1tieXRlX251bV0pOworCisJCQkvKiBDaGVjayBmb3IgY2hhbmdlIGluIG1vZGVtIHN0YXRlIG9yIG92ZXJydW4gKi8KKwkJCWlmICgoKnNjICYgUlhTQl9NT0RFTV9WQUxJRCkKKwkJCSAgICAmJiAocG9ydC0+aXBfbm90aWZ5ICYgTl9ERENEKSkgeworCQkJCS8qIE5vdGlmeSB1cHBlciBsYXllciBpZiBEQ0QgZHJvcHBlZCAqLworCQkJCWlmICgocG9ydC0+aXBfZmxhZ3MgJiBEQ0RfT04pCisJCQkJICAgICYmICEoKnNjICYgUlhTQl9EQ0QpKSB7CisJCQkJCS8qIElmIHdlIGhhdmUgYWxyZWFkeSBjb3BpZWQgc29tZSBkYXRhLAorCQkJCQkgKiByZXR1cm4gaXQuICBXZSdsbCBwaWNrIHVwIHRoZSBjYXJyaWVyCisJCQkJCSAqIGRyb3Agb24gdGhlIG5leHQgcGFzcy4gIFRoYXQgd2F5IHdlCisJCQkJCSAqIGRvbid0IHRocm93IGF3YXkgdGhlIGRhdGEgdGhhdCBoYXMKKwkJCQkJICogYWxyZWFkeSBiZWVuIGNvcGllZCBiYWNrIHRvCisJCQkJCSAqIHRoZSBjYWxsZXIncyBidWZmZXIuCisJCQkJCSAqLworCQkJCQlpZiAodG90YWwgPiAwKSB7CisJCQkJCQlsZW4gPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJcG9ydC0+aXBfZmxhZ3MgJj0gfkRDRF9PTjsKKworCQkJCQkvKiBUdXJuIG9mZiB0aGlzIG5vdGlmaWNhdGlvbiBzbyB0aGUKKwkJCQkJICogY2FycmllciBkcm9wIHByb3RvY29sIHdvbid0IHNlZSBpdAorCQkJCQkgKiBhZ2FpbiB3aGVuIGl0IGRvZXMgYSByZWFkLgorCQkJCQkgKi8KKwkJCQkJKnNjICY9IH5SWFNCX01PREVNX1ZBTElEOworCisJCQkJCS8qIFRvIGtlZXAgdGhpbmdzIGNvbnNpc3RlbnQsIHdlIG5lZWQKKwkJCQkJICogdG8gdXBkYXRlIHRoZSBjb25zdW1lciBwb2ludGVyIHNvCisJCQkJCSAqIHRoZSBuZXh0IHJlYWRlciB3b24ndCBjb21lIGluIGFuZAorCQkJCQkgKiB0cnkgdG8gcmVhZCB0aGUgc2FtZSByaW5nIGVudHJpZXMKKwkJCQkJICogYWdhaW4uIFRoaXMgbXVzdCBiZSBkb25lIGhlcmUgYmVmb3JlCisJCQkJCSAqIHRoZSBkY2QgY2hhbmdlLgorCQkJCQkgKi8KKworCQkJCQlpZiAoKGVudHJ5LT5yaW5nX2FsbHNjICYgUklOR19BTllfVkFMSUQpCisJCQkJCSAgICA9PSAwKSB7CisJCQkJCQljb25zX3B0ciArPSAoaW50KXNpemVvZgorCQkJCQkJICAgIChzdHJ1Y3QgcmluZ19lbnRyeSk7CisJCQkJCQljb25zX3B0ciAmPSBQUk9EX0NPTlNfTUFTSzsKKwkJCQkJfQorCQkJCQl3cml0ZWwoY29uc19wdHIsCisJCQkJCSAgICAgICAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNyY2lyKTsKKwkJCQkJcG9ydC0+aXBfcnhfY29ucyA9IGNvbnNfcHRyOworCisJCQkJCS8qIE5vdGlmeSB1cHBlciBsYXllciBvZiBjYXJyaWVyIGRyb3AgKi8KKwkJCQkJaWYgKChwb3J0LT5pcF9ub3RpZnkgJiBOX0REQ0QpCisJCQkJCSAgICAmJiBwb3J0LT5pcF9wb3J0KSB7CisJCQkJCQl1YXJ0X2hhbmRsZV9kY2RfY2hhbmdlCisJCQkJCQkJKHBvcnQtPmlwX3BvcnQsIDApOworCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlCisJCQkJCQkgICAgKCZ0aGVfcG9ydC0+aW5mby0+CisJCQkJCQkgICAgIGRlbHRhX21zcl93YWl0KTsKKwkJCQkJfQorCisJCQkJCS8qIElmIHdlIGhhZCBhbnkgZGF0YSB0byByZXR1cm4sIHdlCisJCQkJCSAqIHdvdWxkIGhhdmUgcmV0dXJuZWQgaXQgYWJvdmUuCisJCQkJCSAqLworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCQlpZiAoKnNjICYgUlhTQl9NT0RFTV9WQUxJRCkgeworCQkJCS8qIE5vdGlmeSB0aGF0IGFuIGlucHV0IG92ZXJydW4gb2NjdXJyZWQgKi8KKwkJCQlpZiAoKCpzYyAmIFJYU0JfT1ZFUlJVTikKKwkJCQkgICAgJiYgKHBvcnQtPmlwX25vdGlmeSAmIE5fT1ZFUlJVTl9FUlJPUikpIHsKKwkJCQkJaW9jM19jYl9wb3N0X25jcyh0aGVfcG9ydCwgTkNTX09WRVJSVU4pOworCQkJCX0KKwkJCQkvKiBEb24ndCBsb29rIGF0IHRoaXMgYnl0ZSBhZ2FpbiAqLworCQkJCSpzYyAmPSB+UlhTQl9NT0RFTV9WQUxJRDsKKwkJCX0KKworCQkJLyogQ2hlY2sgZm9yIHZhbGlkIGRhdGEgb3IgUlggZXJyb3JzICovCisJCQlpZiAoKCpzYyAmIFJYU0JfREFUQV9WQUxJRCkgJiYKKwkJCSAgICAoKCpzYyAmIChSWFNCX1BBUl9FUlIKKwkJCQkgICAgIHwgUlhTQl9GUkFNRV9FUlIgfCBSWFNCX0JSRUFLKSkKKwkJCSAgICAgJiYgKHBvcnQtPmlwX25vdGlmeSAmIChOX1BBUklUWV9FUlJPUgorCQkJCQkJICAgIHwgTl9GUkFNSU5HX0VSUk9SCisJCQkJCQkgICAgfCBOX0JSRUFLKSkpKSB7CisJCQkJLyogVGhlcmUgaXMgYW4gZXJyb3IgY29uZGl0aW9uIG9uIHRoZSBuZXh0IGJ5dGUuCisJCQkJICogSWYgd2UgaGF2ZSBhbHJlYWR5IHRyYW5zZmVycmVkIHNvbWUgYnl0ZXMsCisJCQkJICogd2UnbGwgc3RvcCBoZXJlLiBPdGhlcndpc2UgaWYgdGhpcyBpcyB0aGUKKwkJCQkgKiBmaXJzdCBieXRlIHRvIGJlIHJlYWQsIHdlJ2xsIGp1c3QgdHJhbnNmZXIKKwkJCQkgKiBpdCBhbG9uZSBhZnRlciBub3RpZnlpbmcgdGhlCisJCQkJICogdXBwZXIgbGF5ZXIgb2YgaXRzIHN0YXR1cy4KKwkJCQkgKi8KKwkJCQlpZiAodG90YWwgPiAwKSB7CisJCQkJCWxlbiA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgoKnNjICYgUlhTQl9QQVJfRVJSKSAmJgorCQkJCQkgICAgKHBvcnQtPgorCQkJCQkgICAgIGlwX25vdGlmeSAmIE5fUEFSSVRZX0VSUk9SKSkgeworCQkJCQkJaW9jM19jYl9wb3N0X25jcyh0aGVfcG9ydCwKKwkJCQkJCQkJIE5DU19QQVJJVFkpOworCQkJCQl9CisJCQkJCWlmICgoKnNjICYgUlhTQl9GUkFNRV9FUlIpICYmCisJCQkJCSAgICAocG9ydC0+CisJCQkJCSAgICAgaXBfbm90aWZ5ICYgTl9GUkFNSU5HX0VSUk9SKSkgeworCQkJCQkJaW9jM19jYl9wb3N0X25jcyh0aGVfcG9ydCwKKwkJCQkJCQkJIE5DU19GUkFNSU5HKTsKKwkJCQkJfQorCQkJCQlpZiAoKCpzYyAmIFJYU0JfQlJFQUspCisJCQkJCSAgICAmJiAocG9ydC0+aXBfbm90aWZ5ICYgTl9CUkVBSykpIHsKKwkJCQkJCWlvYzNfY2JfcG9zdF9uY3MKKwkJCQkJCSAgICAodGhlX3BvcnQsIE5DU19CUkVBSyk7CisJCQkJCX0KKwkJCQkJbGVuID0gMTsKKwkJCQl9CisJCQl9CisJCQlpZiAoKnNjICYgUlhTQl9EQVRBX1ZBTElEKSB7CisJCQkJKnNjICY9IH5SWFNCX0RBVEFfVkFMSUQ7CisJCQkJKmJ1ZiA9IGVudHJ5LT5yaW5nX2RhdGFbYnl0ZV9udW1dOworCQkJCWJ1ZisrOworCQkJCWxlbi0tOworCQkJCXRvdGFsKys7CisJCQl9CisJCX0KKworCQkvKiBJZiB3ZSB1c2VkIHVwIHRoaXMgZW50cnkgZW50aXJlbHksIGdvIG9uIHRvIHRoZSBuZXh0IG9uZSwKKwkJICogb3RoZXJ3aXNlIHdlIG11c3QgaGF2ZSBydW4gb3V0IG9mIGJ1ZmZlciBzcGFjZSwgc28KKwkJICogbGVhdmUgdGhlIGNvbnN1bWVyIHBvaW50ZXIgaGVyZSBmb3IgdGhlIG5leHQgcmVhZCBpbiBjYXNlCisJCSAqIHRoZXJlIGFyZSBzdGlsbCB1bnJlYWQgYnl0ZXMgaW4gdGhpcyBlbnRyeS4KKwkJICovCisJCWlmICgoZW50cnktPnJpbmdfYWxsc2MgJiBSSU5HX0FOWV9WQUxJRCkgPT0gMCkgeworCQkJY29uc19wdHIgKz0gKGludClzaXplb2Yoc3RydWN0IHJpbmdfZW50cnkpOworCQkJY29uc19wdHIgJj0gUFJPRF9DT05TX01BU0s7CisJCX0KKwl9CisKKwkvKiBVcGRhdGUgY29uc3VtZXIgcG9pbnRlciBhbmQgcmUtYXJtIHJ4IHRpbWVyIGludGVycnVwdCAqLworCXdyaXRlbChjb25zX3B0ciwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zcmNpcik7CisJcG9ydC0+aXBfcnhfY29ucyA9IGNvbnNfcHRyOworCisJLyogSWYgd2UgaGF2ZSBub3cgZGlwcGVkIGJlbG93IHRoZSByeCBoaWdoIHdhdGVyIG1hcmsgYW5kIHdlIGhhdmUKKwkgKiByeF9oaWdoIGludGVycnVwdCB0dXJuZWQgb2ZmLCB3ZSBjYW4gbm93IHR1cm4gaXQgYmFjayBvbiBhZ2Fpbi4KKwkgKi8KKwlpZiAoKHBvcnQtPmlwX2ZsYWdzICYgSU5QVVRfSElHSCkgJiYgKCgocHJvZF9wdHIgLSBjb25zX3B0cikKKwkJCQkJICAgICAgICYgUFJPRF9DT05TX01BU0spIDwKKwkJCQkJICAgICAgKChwb3J0LT4KKwkJCQkJCWlwX3NzY3IgJgorCQkJCQkJU1NDUl9SWF9USFJFU0hPTEQpCisJCQkJCSAgICAgICA8PCBQUk9EX0NPTlNfUFRSX09GRikpKSB7CisJCXBvcnQtPmlwX2ZsYWdzICY9IH5JTlBVVF9ISUdIOworCQllbmFibGVfaW50cnMocG9ydCwgaG9va3MtPmludHJfcnhfaGlnaCk7CisJfQorCXJldHVybiB0b3RhbDsKK30KKworLyoqCisgKiByZWNlaXZlX2NoYXJzIC0gdXBwZXIgbGV2ZWwgcmVhZC4KKyAqIEB0aGVfcG9ydDogcG9ydCB0byByZWFkIGZyb20KKyAqLworc3RhdGljIGludCByZWNlaXZlX2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgY2hhciBjaFtNQVhfQ0hBUlNdOworCWludCByZWFkX2NvdW50ID0gMCwgcmVhZF9yb29tLCBmbGlwID0gMDsKKwlzdHJ1Y3QgdWFydF9pbmZvICppbmZvID0gdGhlX3BvcnQtPmluZm87CisJc3RydWN0IGlvYzNfcG9ydCAqcG9ydCA9IGdldF9pb2MzX3BvcnQodGhlX3BvcnQpOworCXVuc2lnbmVkIGxvbmcgcGZsYWdzOworCisJLyogTWFrZSBzdXJlIGFsbCB0aGUgcG9pbnRlcnMgYXJlICJnb29kIiBvbmVzICovCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gMDsKKwlpZiAoIWluZm8tPnR0eSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShwb3J0LT5pcF9mbGFncyAmIElOUFVUX0VOQUJMRSkpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9wb3J0LT5sb2NrLCBwZmxhZ3MpOworCXR0eSA9IGluZm8tPnR0eTsKKworCXJlYWRfY291bnQgPSBkb19yZWFkKHRoZV9wb3J0LCBjaCwgTUFYX0NIQVJTKTsKKwlpZiAocmVhZF9jb3VudCA+IDApIHsKKwkJZmxpcCA9IDE7CisJCXJlYWRfcm9vbSA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgcmVhZF9jb3VudCk7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBjaCwgcmVhZF9yb29tKTsKKwkJdGhlX3BvcnQtPmljb3VudC5yeCArPSByZWFkX2NvdW50OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfcG9ydC0+bG9jaywgcGZsYWdzKTsKKworCWlmIChmbGlwKQorCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCisJcmV0dXJuIHJlYWRfY291bnQ7Cit9CisKKy8qKgorICogaW9jM3VhcnRfaW50cl9vbmUgLSBsb3dlc3QgbGV2ZWwgKHBlciBwb3J0KSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqIEBpcyA6IHN1Ym1vZHVsZQorICogQGlkZDogZHJpdmVyIGRhdGEKKyAqIEBwZW5kaW5nOiBpbnRlcnJ1cHRzIHRvIGhhbmRsZQorICogQHJlZ3M6IHB0X3JlZ3MKKyAqLworCitzdGF0aWMgaW50IGlubGluZQoraW9jM3VhcnRfaW50cl9vbmUoc3RydWN0IGlvYzNfc3VibW9kdWxlICppcywKKwkJCXN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQsCisJCQl1bnNpZ25lZCBpbnQgcGVuZGluZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHBvcnRfbnVtID0gR0VUX1BPUlRfRlJPTV9TSU9fSVIocGVuZGluZyk7CisJc3RydWN0IHBvcnRfaG9va3MgKmhvb2tzOworCXVuc2lnbmVkIGludCByeF9oaWdoX3JkX2Fib3J0ZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQ7CisJc3RydWN0IGlvYzNfcG9ydCAqcG9ydDsKKwlpbnQgbG9vcF9jb3VudGVyOworCXN0cnVjdCBpb2MzX2NhcmQgKmNhcmRfcHRyOworCXVuc2lnbmVkIGludCBzaW9faXI7CisKKwljYXJkX3B0ciA9IGlkZC0+ZGF0YVtpcy0+aWRdOworCXBvcnQgPSBjYXJkX3B0ci0+aWNfcG9ydFtwb3J0X251bV0uaWNwX3BvcnQ7CisJaG9va3MgPSBwb3J0LT5pcF9ob29rczsKKworCS8qIFBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGhlcmU6IFRoZSB0eF9tdCBpbnRlcnJ1cHQgYml0IG1heSBiZQorCSAqIGNsZWFyZWQgd2l0aG91dCB0aGUgaW50ZXJ2ZW50aW9uIG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwKKwkgKiBlLmcuIGJ5IGEgd3JpdGUuICBJZiB0aGUgdG9wIGxldmVsIGludGVycnVwdCBoYW5kbGVyIHJlYWRzIGEKKwkgKiB0eF9tdCwgdGhlbiBzb21lIG90aGVyIHByb2Nlc3NvciBkb2VzIGEgd3JpdGUsIHN0YXJ0aW5nIHVwCisJICogb3V0cHV0LCB0aGVuIHdlIGNvbWUgaW4gaGVyZSwgc2VlIHRoZSB0eF9tdCBhbmQgc3RvcCBETUEsIHRoZQorCSAqIG91dHB1dCBzdGFydGVkIGJ5IHRoZSBvdGhlciBwcm9jZXNzb3Igd2lsbCBoYW5nLiAgVGh1cyB3ZSBjYW4KKwkgKiBvbmx5IHJlbHkgb24gdHhfbXQgYmVpbmcgbGVnaXRpbWF0ZSBpZiBpdCBpcyByZWFkIHdoaWxlIHRoZQorCSAqIHBvcnQgbG9jayBpcyBoZWxkLiAgVGhlcmVmb3JlIHRoaXMgYml0IG11c3QgYmUgaWdub3JlZCBpbiB0aGUKKwkgKiBwYXNzZWQgaW4gaW50ZXJydXB0IG1hc2sgd2hpY2ggd2FzIHJlYWQgYnkgdGhlIHRvcCBsZXZlbAorCSAqIGludGVycnVwdCBoYW5kbGVyIHNpbmNlIHRoZSBwb3J0IGxvY2sgd2FzIG5vdCBoZWxkIGF0IHRoZSB0aW1lCisJICogaXQgd2FzIHJlYWQuICBXZSBjYW4gb25seSByZWx5IG9uIHRoaXMgYml0IGJlaW5nIGFjY3VyYXRlIGlmIGl0CisJICogaXMgcmVhZCB3aGlsZSB0aGUgcG9ydCBsb2NrIGlzIGhlbGQuICBTbyB3ZSdsbCBjbGVhciBpdCBmb3Igbm93LAorCSAqIGFuZCByZWxvYWQgaXQgbGF0ZXIgb25jZSB3ZSBoYXZlIHRoZSBwb3J0IGxvY2suCisJICovCisKKwlzaW9faXIgPSBwZW5kaW5nICYgfihob29rcy0+aW50cl90eF9tdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmlwX2xvY2ssIGZsYWdzKTsKKworCWxvb3BfY291bnRlciA9IE1BWElURVI7CS8qIHRvIGF2b2lkIGhhbmdzICovCisKKwlkbyB7CisJCXVpbnQzMl90IHNoYWRvdzsKKworCQlpZiAobG9vcF9jb3VudGVyLS0gPD0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSU9DMyBzZXJpYWw6ICIKKwkJCSAgICAgICAicG9zc2libGUgaGFuZyBjb25kaXRpb24vIgorCQkJICAgICAgICJwb3J0IHN0dWNrIG9uIGludGVycnVwdCAobGluZSAlZCkuXG4iLAorCQkJCSgoc3RydWN0IHVhcnRfcG9ydCAqKXBvcnQtPmlwX3BvcnQpLT5saW5lKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEhhbmRsZSBhIERDRCBjaGFuZ2UgKi8KKwkJaWYgKHNpb19pciAmIGhvb2tzLT5pbnRyX2RlbHRhX2RjZCkgeworCQkJaW9jM19hY2soaXMsIGlkZCwgaG9va3MtPmludHJfZGVsdGFfZGNkKTsKKwkJCXNoYWRvdyA9IHJlYWRsKCZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c2hhZG93KTsKKworCQkJaWYgKChwb3J0LT5pcF9ub3RpZnkgJiBOX0REQ0QpCisJCQkgICAgJiYgKHNoYWRvdyAmIFNIQURPV19EQ0QpCisJCQkgICAgJiYgKHBvcnQtPmlwX3BvcnQpKSB7CisJCQkJdGhlX3BvcnQgPSBwb3J0LT5pcF9wb3J0OworCQkJCXVhcnRfaGFuZGxlX2RjZF9jaGFuZ2UodGhlX3BvcnQsCisJCQkJCQlzaGFkb3cgJiBTSEFET1dfRENEKTsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUKKwkJCQkgICAgKCZ0aGVfcG9ydC0+aW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCQkJfSBlbHNlIGlmICgocG9ydC0+aXBfbm90aWZ5ICYgTl9ERENEKQorCQkJCSAgICYmICEoc2hhZG93ICYgU0hBRE9XX0RDRCkpIHsKKwkJCQkvKiBGbGFnIGRlbHRhIERDRC9ubyBEQ0QgKi8KKwkJCQl1YXJ0X2hhbmRsZV9kY2RfY2hhbmdlKHBvcnQtPmlwX3BvcnQsCisJCQkJCQlzaGFkb3cgJiBTSEFET1dfRENEKTsKKwkJCQlwb3J0LT5pcF9mbGFncyB8PSBEQ0RfT047CisJCQl9CisJCX0KKworCQkvKiBIYW5kbGUgYSBDVFMgY2hhbmdlICovCisJCWlmIChzaW9faXIgJiBob29rcy0+aW50cl9kZWx0YV9jdHMpIHsKKwkJCWlvYzNfYWNrKGlzLCBpZGQsIGhvb2tzLT5pbnRyX2RlbHRhX2N0cyk7CisJCQlzaGFkb3cgPSByZWFkbCgmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNoYWRvdyk7CisKKwkJCWlmICgocG9ydC0+aXBfbm90aWZ5ICYgTl9EQ1RTKSAmJiAocG9ydC0+aXBfcG9ydCkpIHsKKwkJCQl0aGVfcG9ydCA9IHBvcnQtPmlwX3BvcnQ7CisJCQkJdWFydF9oYW5kbGVfY3RzX2NoYW5nZSh0aGVfcG9ydCwgc2hhZG93CisJCQkJCQkmIFNIQURPV19DVFMpOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZQorCQkJCSAgICAoJnRoZV9wb3J0LT5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJCQl9CisJCX0KKworCQkvKiByeCB0aW1lb3V0IGludGVycnVwdC4gIE11c3QgYmUgc29tZSBkYXRhIGF2YWlsYWJsZS4gIFB1dCB0aGlzCisJCSAqIGJlZm9yZSB0aGUgY2hlY2sgZm9yIHJ4X2hpZ2ggc2luY2Ugc2VydmljaW5nIHRoaXMgY29uZGl0aW9uCisJCSAqIG1heSBjYXVzZSB0aGF0IGNvbmRpdGlvbiB0byBjbGVhci4KKwkJICovCisJCWlmIChzaW9faXIgJiBob29rcy0+aW50cl9yeF90aW1lcikgeworCQkJaW9jM19hY2soaXMsIGlkZCwgaG9va3MtPmludHJfcnhfdGltZXIpOworCQkJaWYgKChwb3J0LT5pcF9ub3RpZnkgJiBOX0RBVEFfUkVBRFkpCisJCQkJCQkmJiAocG9ydC0+aXBfcG9ydCkpIHsKKwkJCQlyZWNlaXZlX2NoYXJzKHBvcnQtPmlwX3BvcnQpOworCQkJfQorCQl9CisKKwkJLyogcnggaGlnaCBpbnRlcnJ1cHQuIE11c3QgYmUgYWZ0ZXIgcnhfdGltZXIuICAqLworCQllbHNlIGlmIChzaW9faXIgJiBob29rcy0+aW50cl9yeF9oaWdoKSB7CisJCQkvKiBEYXRhIGF2YWlsYWJsZSwgbm90aWZ5IHVwcGVyIGxheWVyICovCisJCQlpZiAoKHBvcnQtPmlwX25vdGlmeSAmIE5fREFUQV9SRUFEWSkgJiYgcG9ydC0+aXBfcG9ydCkgeworCQkJCXJlY2VpdmVfY2hhcnMocG9ydC0+aXBfcG9ydCk7CisJCQl9CisKKwkJCS8qIFdlIGNhbid0IEFDSyB0aGlzIGludGVycnVwdC4gIElmIHJlY2VpdmVfY2hhcnMgZGlkbid0CisJCQkgKiBjYXVzZSB0aGUgY29uZGl0aW9uIHRvIGNsZWFyLCB3ZSdsbCBoYXZlIHRvIGRpc2FibGUKKwkJCSAqIHRoZSBpbnRlcnJ1cHQgdW50aWwgdGhlIGRhdGEgaXMgZHJhaW5lZC4KKwkJCSAqIElmIHRoZSByZWFkIHdhcyBhYm9ydGVkLCBkb24ndCBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQKKwkJCSAqIGFzIHRoaXMgbWF5IGNhdXNlIHVzIHRvIGhhbmcgaW5kZWZpbml0ZWx5LiAgQW4KKwkJCSAqIGFib3J0ZWQgcmVhZCBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGlzIGludGVycnVwdAorCQkJICogaGFzbid0IGJlZW4gZGVsaXZlcmVkIHRvIHRoZSBjcHUgeWV0IGFueXdheSwgZXZlbgorCQkJICogdGhvdWdoIHdlIHNlZSBpdCBhcyBhc3NlcnRlZCB3aGVuIHdlIHJlYWQgdGhlIHNpb19pci4KKwkJCSAqLworCQkJaWYgKChzaW9faXIgPSBQRU5ESU5HKGNhcmRfcHRyLCBpZGQpKQorCQkJCQkmIGhvb2tzLT5pbnRyX3J4X2hpZ2gpIHsKKwkJCQlpZiAocG9ydC0+aXBfZmxhZ3MgJiBSRUFEX0FCT1JURUQpIHsKKwkJCQkJcnhfaGlnaF9yZF9hYm9ydGVkKys7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQljYXJkX3B0ci0+aWNfZW5hYmxlICY9IH5ob29rcy0+aW50cl9yeF9oaWdoOworCQkJCQlwb3J0LT5pcF9mbGFncyB8PSBJTlBVVF9ISUdIOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIFdlIGdvdCBhIGxvdyB3YXRlciBpbnRlcnJ1cHQ6IG5vdGlmeSB1cHBlciBsYXllciB0bworCQkgKiBzZW5kIG1vcmUgZGF0YS4gIE11c3QgY29tZSBiZWZvcmUgdHhfbXQgc2luY2Ugc2VydmljaW5nCisJCSAqIHRoaXMgY29uZGl0aW9uIG1heSBjYXVzZSB0aGF0IGNvbmRpdGlvbiB0byBjbGVhci4KKwkJICovCisJCWlmIChzaW9faXIgJiBob29rcy0+aW50cl90eF9leHBsaWNpdCkgeworCQkJcG9ydC0+aXBfZmxhZ3MgJj0gfkxPV0FUX1dSSVRURU47CisJCQlpb2MzX2FjayhpcywgaWRkLCBob29rcy0+aW50cl90eF9leHBsaWNpdCk7CisJCQlpZiAocG9ydC0+aXBfbm90aWZ5ICYgTl9PVVRQVVRfTE9XQVQpCisJCQkJaW9jM19jYl9vdXRwdXRfbG93YXQocG9ydCk7CisJCX0KKworCQkvKiBIYW5kbGUgdHhfbXQuICBNdXN0IGNvbWUgYWZ0ZXIgdHhfZXhwbGljaXQuICAqLworCQllbHNlIGlmIChzaW9faXIgJiBob29rcy0+aW50cl90eF9tdCkgeworCQkJLyogSWYgd2UgYXJlIGV4cGVjdGluZyBhIGxvd2F0IG5vdGlmaWNhdGlvbgorCQkJICogYW5kIHdlIGdldCB0byB0aGlzIHBvaW50IGl0IHByb2JhYmx5IG1lYW5zIHRoYXQgZm9yCisJCQkgKiBzb21lIHJlYXNvbiB0aGUgdHhfZXhwbGljaXQgZGlkbid0IHdvcmsgYXMgZXhwZWN0ZWQKKwkJCSAqICh0aGF0IGNhbiBsZWdpdGltYXRlbHkgaGFwcGVuIGlmIHRoZSBvdXRwdXQgYnVmZmVyIGlzCisJCQkgKiBmaWxsZWQgdXAgaW4ganVzdCB0aGUgcmlnaHQgd2F5KS4KKwkJCSAqIFNvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBub3cuCisJCQkgKi8KKwkJCWlmIChwb3J0LT5pcF9ub3RpZnkgJiBOX09VVFBVVF9MT1dBVCkgeworCQkJCWlvYzNfY2Jfb3V0cHV0X2xvd2F0KHBvcnQpOworCisJCQkJLyogV2UgbmVlZCB0byByZWxvYWQgdGhlIHNpb19pciBzaW5jZSB0aGUgbG93YXQKKwkJCQkgKiBjYWxsIG1heSBoYXZlIGNhdXNlZCBhbm90aGVyIHdyaXRlIHRvIG9jY3VyLAorCQkJCSAqIGNsZWFyaW5nIHRoZSB0eF9tdCBjb25kaXRpb24uCisJCQkJICovCisJCQkJc2lvX2lyID0gUEVORElORyhjYXJkX3B0ciwgaWRkKTsKKwkJCX0KKworCQkJLyogSWYgdGhlIHR4X210IGNvbmRpdGlvbiBzdGlsbCBwZXJzaXN0cyBldmVuIGFmdGVyIHRoZQorCQkJICogbG93YXQgY2FsbCwgd2UndmUgZ290IHNvbWUgd29yayB0byBkby4KKwkJCSAqLworCQkJaWYgKHNpb19pciAmIGhvb2tzLT5pbnRyX3R4X210KSB7CisJCQkJLyogSWYgd2UgYXJlIG5vdCBjdXJyZW50bHkgZXhwZWN0aW5nIERNQSBpbnB1dCwKKwkJCQkgKiBhbmQgdGhlIHRyYW5zbWl0dGVyIGhhcyBqdXN0IGdvbmUgaWRsZSwKKwkJCQkgKiB0aGVyZSBpcyBubyBsb25nZXIgYW55IHJlYXNvbiBmb3IgRE1BLCBzbworCQkJCSAqIGRpc2FibGUgaXQuCisJCQkJICovCisJCQkJaWYgKCEocG9ydC0+aXBfbm90aWZ5CisJCQkJICAgICAgJiAoTl9EQVRBX1JFQURZIHwgTl9ERENEKSkpIHsKKwkJCQkJQlVHX09OKCEocG9ydC0+aXBfc3NjcgorCQkJCQkJICYgU1NDUl9ETUFfRU4pKTsKKwkJCQkJcG9ydC0+aXBfc3NjciAmPSB+U1NDUl9ETUFfRU47CisJCQkJCXdyaXRlbChwb3J0LT5pcF9zc2NyLAorCQkJCQkgICAgICAgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKwkJCQl9CisJCQkJLyogUHJldmVudCBpbmZpbml0ZSB0eF9tdCBpbnRlcnJ1cHQgKi8KKwkJCQljYXJkX3B0ci0+aWNfZW5hYmxlICY9IH5ob29rcy0+aW50cl90eF9tdDsKKwkJCX0KKwkJfQorCQlzaW9faXIgPSBQRU5ESU5HKGNhcmRfcHRyLCBpZGQpOworCisJCS8qIGlmIHRoZSByZWFkIHdhcyBhYm9ydGVkIGFuZCBvbmx5IGhvb2tzLT5pbnRyX3J4X2hpZ2gsCisJCSAqIGNsZWFyIGhvb2tzLT5pbnRyX3J4X2hpZ2gsIHNvIHdlIGRvIG5vdCBsb29wIGZvcmV2ZXIuCisJCSAqLworCisJCWlmIChyeF9oaWdoX3JkX2Fib3J0ZWQgJiYgKHNpb19pciA9PSBob29rcy0+aW50cl9yeF9oaWdoKSkgeworCQkJc2lvX2lyICY9IH5ob29rcy0+aW50cl9yeF9oaWdoOworCQl9CisJfSB3aGlsZSAoc2lvX2lyICYgaG9va3MtPmludHJfYWxsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmlwX2xvY2ssIGZsYWdzKTsKKwlpb2MzX2VuYWJsZShpcywgaWRkLCBjYXJkX3B0ci0+aWNfZW5hYmxlKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpb2MzdWFydF9pbnRyIC0gZmllbGQgYWxsIHNlcmlhbCBpbnRlcnJ1cHRzCisgKiBAaXMgOiBzdWJtb2R1bGUKKyAqIEBpZGQ6IGRyaXZlciBkYXRhCisgKiBAcGVuZGluZzogaW50ZXJydXB0cyB0byBoYW5kbGUKKyAqIEByZWdzOiBwdF9yZWdzCisgKgorICovCisKK3N0YXRpYyBpbnQgaW9jM3VhcnRfaW50cihzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKmlzLAorCQkJc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCwKKwkJCXVuc2lnbmVkIGludCBwZW5kaW5nLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJICogVGhlIHVwcGVyIGxldmVsIGludGVycnVwdCBoYW5kbGVyIHNlbmRzIGludGVycnVwdHMgZm9yIGJvdGggcG9ydHMKKwkgKiBoZXJlLiBTbyB3ZSBuZWVkIHRvIGNhbGwgZm9yIGVhY2ggcG9ydCB3aXRoIGl0cyBpbnRlcnJ1cHRzLgorCSAqLworCisJaWYgKHBlbmRpbmcgJiBTSU9fSVJfU0EpCisJCXJldCB8PSBpb2MzdWFydF9pbnRyX29uZShpcywgaWRkLCBwZW5kaW5nICYgU0lPX0lSX1NBLCByZWdzKTsKKwlpZiAocGVuZGluZyAmIFNJT19JUl9TQikKKwkJcmV0IHw9IGlvYzN1YXJ0X2ludHJfb25lKGlzLCBpZGQsIHBlbmRpbmcgJiBTSU9fSVJfU0IsIHJlZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpYzNfdHlwZQorICogQHBvcnQ6IFBvcnQgdG8gb3BlcmF0ZSB3aXRoICh3ZSBpZ25vcmUgc2luY2Ugd2Ugb25seSBoYXZlIG9uZSBwb3J0KQorICoKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmljM190eXBlKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0KQoreworCWlmIChJU19SUzIzMih0aGVfcG9ydC0+bGluZSkpCisJCXJldHVybiAiU0dJIElPQzMgU2VyaWFsIFtyczIzMl0iOworCWVsc2UKKwkJcmV0dXJuICJTR0kgSU9DMyBTZXJpYWwgW3JzNDIyXSI7Cit9CisKKy8qKgorICogaWMzX3R4X2VtcHR5IC0gSXMgdGhlIHRyYW5zbWl0dGVyIGVtcHR5PworICogQHBvcnQ6IFBvcnQgdG8gb3BlcmF0ZSBvbgorICoKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBpYzNfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQpCit7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisJc3RydWN0IGlvYzNfcG9ydCAqcG9ydCA9IGdldF9pb2MzX3BvcnQodGhlX3BvcnQpOworCisJaWYgKHJlYWRsKCZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c2hhZG93KSAmIFNIQURPV19URU1UKQorCQlyZXQgPSBUSU9DU0VSX1RFTVQ7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpYzNfc3RvcF90eCAtIHN0b3AgdGhlIHRyYW5zbWl0dGVyCisgKiBAcG9ydDogUG9ydCB0byBvcGVyYXRlIG9uCisgKgorICovCitzdGF0aWMgdm9pZCBpYzNfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCkKK3sKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0ID0gZ2V0X2lvYzNfcG9ydCh0aGVfcG9ydCk7CisKKwlpZiAocG9ydCkKKwkJc2V0X25vdGlmaWNhdGlvbihwb3J0LCBOX09VVFBVVF9MT1dBVCwgMCk7Cit9CisKKy8qKgorICogaWMzX3N0b3BfcnggLSBzdG9wIHRoZSByZWNlaXZlcgorICogQHBvcnQ6IFBvcnQgdG8gb3BlcmF0ZSBvbgorICoKKyAqLworc3RhdGljIHZvaWQgaWMzX3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQpCit7CisJc3RydWN0IGlvYzNfcG9ydCAqcG9ydCA9IGdldF9pb2MzX3BvcnQodGhlX3BvcnQpOworCisJaWYgKHBvcnQpCisJCXBvcnQtPmlwX2ZsYWdzICY9IH5JTlBVVF9FTkFCTEU7Cit9CisKKy8qKgorICogbnVsbF92b2lkX2Z1bmN0aW9uCisgKiBAcG9ydDogUG9ydCB0byBvcGVyYXRlIG9uCisgKgorICovCitzdGF0aWMgdm9pZCBudWxsX3ZvaWRfZnVuY3Rpb24oc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQpCit7Cit9CisKKy8qKgorICogaWMzX3NodXRkb3duIC0gc2h1dCBkb3duIHRoZSBwb3J0IC0gZnJlZSBpcnEgYW5kIGRpc2FibGUKKyAqIEBwb3J0OiBwb3J0IHRvIHNodXQgZG93bgorICoKKyAqLworc3RhdGljIHZvaWQgaWMzX3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0KQoreworCXVuc2lnbmVkIGxvbmcgcG9ydF9mbGFnczsKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0OworCXN0cnVjdCB1YXJ0X2luZm8gKmluZm87CisKKwlwb3J0ID0gZ2V0X2lvYzNfcG9ydCh0aGVfcG9ydCk7CisJaWYgKCFwb3J0KQorCQlyZXR1cm47CisKKwlpbmZvID0gdGhlX3BvcnQtPmluZm87CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhlX3BvcnQtPmxvY2ssIHBvcnRfZmxhZ3MpOworCXNldF9ub3RpZmljYXRpb24ocG9ydCwgTl9BTEwsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9wb3J0LT5sb2NrLCBwb3J0X2ZsYWdzKTsKK30KKworLyoqCisgKiBpYzNfc2V0X21jdHJsIC0gc2V0IGNvbnRyb2wgbGluZXMgKGR0ciwgcnRzLCBldGMpCisgKiBAcG9ydDogUG9ydCB0byBvcGVyYXRlIG9uCisgKiBAbWN0cmw6IExpbmVzIHRvIHNldC91bnNldAorICoKKyAqLworc3RhdGljIHZvaWQgaWMzX3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQoreworCXVuc2lnbmVkIGNoYXIgbWNyID0gMDsKKworCWlmIChtY3RybCAmIFRJT0NNX1JUUykKKwkJbWNyIHw9IFVBUlRfTUNSX1JUUzsKKwlpZiAobWN0cmwgJiBUSU9DTV9EVFIpCisJCW1jciB8PSBVQVJUX01DUl9EVFI7CisJaWYgKG1jdHJsICYgVElPQ01fT1VUMSkKKwkJbWNyIHw9IFVBUlRfTUNSX09VVDE7CisJaWYgKG1jdHJsICYgVElPQ01fT1VUMikKKwkJbWNyIHw9IFVBUlRfTUNSX09VVDI7CisJaWYgKG1jdHJsICYgVElPQ01fTE9PUCkKKwkJbWNyIHw9IFVBUlRfTUNSX0xPT1A7CisKKwlzZXRfbWNyKHRoZV9wb3J0LCBtY3IsIFNIQURPV19EVFIpOworfQorCisvKioKKyAqIGljM19nZXRfbWN0cmwgLSBnZXQgY29udHJvbCBsaW5lIGluZm8KKyAqIEBwb3J0OiBwb3J0IHRvIG9wZXJhdGUgb24KKyAqCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaWMzX2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCkKK3sKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0ID0gZ2V0X2lvYzNfcG9ydCh0aGVfcG9ydCk7CisJdWludDMyX3Qgc2hhZG93OworCXVuc2lnbmVkIGludCByZXQgPSAwOworCisJaWYgKCFwb3J0KQorCQlyZXR1cm4gMDsKKworCXNoYWRvdyA9IHJlYWRsKCZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c2hhZG93KTsKKwlpZiAoc2hhZG93ICYgU0hBRE9XX0RDRCkKKwkJcmV0IHw9IFRJT0NNX0NEOworCWlmIChzaGFkb3cgJiBTSEFET1dfRFIpCisJCXJldCB8PSBUSU9DTV9EU1I7CisJaWYgKHNoYWRvdyAmIFNIQURPV19DVFMpCisJCXJldCB8PSBUSU9DTV9DVFM7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpYzNfc3RhcnRfdHggLSBTdGFydCB0cmFuc21pdHRlci4gQ2FsbGVkIHdpdGggdGhlX3BvcnQtPmxvY2sKKyAqIEBwb3J0OiBQb3J0IHRvIG9wZXJhdGUgb24KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGljM19zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCkKK3sKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0ID0gZ2V0X2lvYzNfcG9ydCh0aGVfcG9ydCk7CisKKwlpZiAocG9ydCkgeworCQlzZXRfbm90aWZpY2F0aW9uKHBvcnQsIE5fT1VUUFVUX0xPV0FULCAxKTsKKwkJZW5hYmxlX2ludHJzKHBvcnQsIHBvcnQtPmlwX2hvb2tzLT5pbnRyX3R4X210KTsKKwl9Cit9CisKKy8qKgorICogaWMzX2JyZWFrX2N0bCAtIGhhbmRsZSBicmVha3MKKyAqIEBwb3J0OiBQb3J0IHRvIG9wZXJhdGUgb24KKyAqIEBicmVha19zdGF0ZTogQnJlYWsgc3RhdGUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGljM19icmVha19jdGwoc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQsIGludCBicmVha19zdGF0ZSkKK3sKK30KKworLyoqCisgKiBpYzNfc3RhcnR1cCAtIFN0YXJ0IHVwIHRoZSBzZXJpYWwgcG9ydCAtIGFsd2F5cyByZXR1cm4gMCAoV2UncmUgYWx3YXlzIG9uKQorICogQHBvcnQ6IFBvcnQgdG8gb3BlcmF0ZSBvbgorICoKKyAqLworc3RhdGljIGludCBpYzNfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpb2MzX3BvcnQgKnBvcnQ7CisJc3RydWN0IGlvYzNfY2FyZCAqY2FyZF9wdHI7CisJdW5zaWduZWQgbG9uZyBwb3J0X2ZsYWdzOworCisJaWYgKCF0aGVfcG9ydCkgeworCQlOT1RfUFJPR1JFU1MoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXBvcnQgPSBnZXRfaW9jM19wb3J0KHRoZV9wb3J0KTsKKwlpZiAoIXBvcnQpIHsKKwkJTk9UX1BST0dSRVNTKCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwljYXJkX3B0ciA9IHBvcnQtPmlwX2NhcmQ7CisJcG9ydC0+aXBfcG9ydCA9IHRoZV9wb3J0OworCisJaWYgKCFjYXJkX3B0cikgeworCQlOT1RfUFJPR1JFU1MoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogU3RhcnQgdXAgdGhlIHNlcmlhbCBwb3J0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9wb3J0LT5sb2NrLCBwb3J0X2ZsYWdzKTsKKwlyZXR2YWwgPSBpYzNfc3RhcnR1cF9sb2NhbCh0aGVfcG9ydCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX3BvcnQtPmxvY2ssIHBvcnRfZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogaWMzX3NldF90ZXJtaW9zIC0gc2V0IHRlcm1pb3Mgc3R1ZmYKKyAqIEBwb3J0OiBwb3J0IHRvIG9wZXJhdGUgb24KKyAqIEB0ZXJtaW9zOiBOZXcgc2V0dGluZ3MKKyAqIEB0ZXJtaW9zOiBPbGQKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitpYzNfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQsCisJCXN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJdW5zaWduZWQgbG9uZyBwb3J0X2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9wb3J0LT5sb2NrLCBwb3J0X2ZsYWdzKTsKKwlpb2MzX2NoYW5nZV9zcGVlZCh0aGVfcG9ydCwgdGVybWlvcywgb2xkX3Rlcm1pb3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9wb3J0LT5sb2NrLCBwb3J0X2ZsYWdzKTsKK30KKworLyoqCisgKiBpYzNfcmVxdWVzdF9wb3J0IC0gYWxsb2NhdGUgcmVzb3VyY2VzIGZvciBwb3J0IC0gbm8gb3AuLi4uCisgKiBAcG9ydDogcG9ydCB0byBvcGVyYXRlIG9uCisgKgorICovCitzdGF0aWMgaW50IGljM19yZXF1ZXN0X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogQXNzb2NpYXRlIHRoZSB1YXJ0IGZ1bmN0aW9ucyBhYm92ZSAtIGdpdmVuIHRvIHNlcmlhbCBjb3JlICovCitzdGF0aWMgc3RydWN0IHVhcnRfb3BzIGlvYzNfb3BzID0geworCS50eF9lbXB0eSA9IGljM190eF9lbXB0eSwKKwkuc2V0X21jdHJsID0gaWMzX3NldF9tY3RybCwKKwkuZ2V0X21jdHJsID0gaWMzX2dldF9tY3RybCwKKwkuc3RvcF90eCA9IGljM19zdG9wX3R4LAorCS5zdGFydF90eCA9IGljM19zdGFydF90eCwKKwkuc3RvcF9yeCA9IGljM19zdG9wX3J4LAorCS5lbmFibGVfbXMgPSBudWxsX3ZvaWRfZnVuY3Rpb24sCisJLmJyZWFrX2N0bCA9IGljM19icmVha19jdGwsCisJLnN0YXJ0dXAgPSBpYzNfc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBpYzNfc2h1dGRvd24sCisJLnNldF90ZXJtaW9zID0gaWMzX3NldF90ZXJtaW9zLAorCS50eXBlID0gaWMzX3R5cGUsCisJLnJlbGVhc2VfcG9ydCA9IG51bGxfdm9pZF9mdW5jdGlvbiwKKwkucmVxdWVzdF9wb3J0ID0gaWMzX3JlcXVlc3RfcG9ydCwKK307CisKKy8qCisgKiBCb290LXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgaW9jM191YXJ0ID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZSA9ICJpb2MzX3NlcmlhbCIsCisJLmRldl9uYW1lID0gREVWSUNFX05BTUUsCisJLm1ham9yID0gREVWSUNFX01BSk9SLAorCS5taW5vciA9IERFVklDRV9NSU5PUiwKKwkubnIgPSBNQVhfTE9HSUNBTF9QT1JUUworfTsKKworLyoqCisgKiBpb2MzX3NlcmlhbF9jb3JlX2F0dGFjaCAtIHJlZ2lzdGVyIHdpdGggc2VyaWFsIGNvcmUKKyAqCQlUaGlzIGlzIGRvbmUgZHVyaW5nIHBjaSBwcm9iaW5nCisgKiBAaXM6IHN1Ym1vZHVsZSBzdHJ1Y3QgZm9yIHRoaXMKKyAqIEBpZGQ6IGhhbmRsZSBmb3IgdGhpcyBjYXJkCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlvYzNfc2VyaWFsX2NvcmVfYXR0YWNoKCBzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKmlzLAorCQkJCXN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQpCit7CisJc3RydWN0IGlvYzNfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydDsKKwlzdHJ1Y3QgaW9jM19jYXJkICpjYXJkX3B0ciA9IGlkZC0+ZGF0YVtpcy0+aWRdOworCWludCBpaSwgcGh5c19wb3J0OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaWRkLT5wZGV2OworCisJRFBSSU5UX0NPTkZJRygoIiVzOiBhdHRhY2ggcGRldiAweCVwIC0gY2FyZF9wdHIgMHglcFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcGRldiwgKHZvaWQgKiljYXJkX3B0cikpOworCisJaWYgKCFjYXJkX3B0cikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBvbmNlIGFyb3VuZCBmb3IgZWFjaCBsb2dpY2FsIHBvcnQgb24gdGhpcyBjYXJkICovCisJZm9yIChpaSA9IDA7IGlpIDwgTE9HSUNBTF9QT1JUU19QRVJfQ0FSRDsgaWkrKykgeworCQlwaHlzX3BvcnQgPSBHRVRfUEhZU0lDQUxfUE9SVChpaSk7CisJCXRoZV9wb3J0ID0gJmNhcmRfcHRyLT5pY19wb3J0W3BoeXNfcG9ydF0uCisJCQkJaWNwX3VhcnRfcG9ydFtHRVRfTE9HSUNBTF9QT1JUKGlpKV07CisJCXBvcnQgPSBjYXJkX3B0ci0+aWNfcG9ydFtwaHlzX3BvcnRdLmljcF9wb3J0OworCQlwb3J0LT5pcF9wb3J0ID0gdGhlX3BvcnQ7CisKKwkJRFBSSU5UX0NPTkZJRygoIiVzOiBhdHRhY2ggdGhlX3BvcnQgMHglcCAvIHBvcnQgMHglcCBbJWQvJWRdXG4iLAorCQkJX19GVU5DVElPTl9fLCAodm9pZCAqKXRoZV9wb3J0LCAodm9pZCAqKXBvcnQsCisJCQkJcGh5c19wb3J0LCBpaSkpOworCisJCS8qIG1lbWJhc2UsIGlvYmFzZSBhbmQgbWFwYmFzZSBqdXN0IG5lZWQgdG8gYmUgbm9uLTAgKi8KKwkJdGhlX3BvcnQtPm1lbWJhc2UgPSAodW5zaWduZWQgY2hhciBfX2lvbWVtICopMTsKKwkJdGhlX3BvcnQtPmlvYmFzZSA9IChwZGV2LT5idXMtPm51bWJlciA8PCAxNikgfCAgaWk7CisJCXRoZV9wb3J0LT5saW5lID0gKE51bV9vZl9pb2MzX2NhcmRzIDw8IDIpIHwgaWk7CisJCXRoZV9wb3J0LT5tYXBiYXNlID0gMTsKKwkJdGhlX3BvcnQtPnR5cGUgPSBQT1JUXzE2NTUwQTsKKwkJdGhlX3BvcnQtPmZpZm9zaXplID0gRklGT19TSVpFOworCQl0aGVfcG9ydC0+b3BzID0gJmlvYzNfb3BzOworCQl0aGVfcG9ydC0+aXJxID0gaWRkLT5pcnFfaW87CisJCXRoZV9wb3J0LT5kZXYgPSAmcGRldi0+ZGV2OworCisJCWlmICh1YXJ0X2FkZF9vbmVfcG9ydCgmaW9jM191YXJ0LCB0aGVfcG9ydCkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAgICAiJXM6IHVuYWJsZSB0byBhZGQgcG9ydCAlZCBidXMgJWRcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCB0aGVfcG9ydC0+bGluZSwgcGRldi0+YnVzLT5udW1iZXIpOworCQl9IGVsc2UgeworCQkJRFBSSU5UX0NPTkZJRygoIklPQzMgc2VyaWFsIHBvcnQgJWQgaXJxICVkIGJ1cyAlZFxuIiwKKwkJICAgICAgICAgIHRoZV9wb3J0LT5saW5lLCB0aGVfcG9ydC0+aXJxLCBwZGV2LT5idXMtPm51bWJlcikpOworCQl9CisKKwkJLyogYWxsIHBvcnRzIGFyZSByczIzMiBmb3Igbm93ICovCisJCWlmIChJU19QSFlTSUNBTF9QT1JUKGlpKSkKKwkJCWlvYzNfc2V0X3Byb3RvKHBvcnQsIFBST1RPX1JTMjMyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW9jM3VhcnRfcmVtb3ZlIC0gcmVnaXN0ZXIgZGV0YWNoIGZ1bmN0aW9uCisgKiBAaXM6IHN1Ym1vZHVsZSBzdHJ1Y3QgZm9yIHRoaXMgc3VibW9kdWxlCisgKiBAaWRkOiBpb2MzIGRyaXZlciBkYXRhIGZvciB0aGlzIHN1Ym1vZHVsZQorICovCisKK3N0YXRpYyBpbnQgaW9jM3VhcnRfcmVtb3ZlKHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqaXMsCisJCQlzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkKQoreworCXN0cnVjdCBpb2MzX2NhcmQgKmNhcmRfcHRyID0gaWRkLT5kYXRhW2lzLT5pZF07CisJc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQ7CisJc3RydWN0IGlvYzNfcG9ydCAqcG9ydDsKKwlpbnQgaWk7CisKKwlpZiAoY2FyZF9wdHIpIHsKKwkJZm9yIChpaSA9IDA7IGlpIDwgTE9HSUNBTF9QT1JUU19QRVJfQ0FSRDsgaWkrKykgeworCQkJdGhlX3BvcnQgPSAmY2FyZF9wdHItPmljX3BvcnRbR0VUX1BIWVNJQ0FMX1BPUlQoaWkpXS4KKwkJCQkJaWNwX3VhcnRfcG9ydFtHRVRfTE9HSUNBTF9QT1JUKGlpKV07CisJCQlpZiAodGhlX3BvcnQpCisJCQkJdWFydF9yZW1vdmVfb25lX3BvcnQoJmlvYzNfdWFydCwgdGhlX3BvcnQpOworCQkJcG9ydCA9IGNhcmRfcHRyLT5pY19wb3J0W0dFVF9QSFlTSUNBTF9QT1JUKGlpKV0uaWNwX3BvcnQ7CisJCQlpZiAocG9ydCAmJiBJU19QSFlTSUNBTF9QT1JUKGlpKQorCQkJCQkmJiAoR0VUX1BIWVNJQ0FMX1BPUlQoaWkpID09IDApKSB7CisJCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwb3J0LT5pcF9pZGQtPnBkZXYsCisJCQkJCVRPVEFMX1JJTkdfQlVGX1NJWkUsCisJCQkJCSh2b2lkICopcG9ydC0+aXBfY3B1X3JpbmdidWYsCisJCQkJCXBvcnQtPmlwX2RtYV9yaW5nYnVmKTsKKwkJCQlrZnJlZShwb3J0KTsKKwkJCQljYXJkX3B0ci0+aWNfcG9ydFtHRVRfUEhZU0lDQUxfUE9SVChpaSldLgorCQkJCQkJCWljcF9wb3J0ID0gTlVMTDsKKwkJCX0KKwkJfQorCQlrZnJlZShjYXJkX3B0cik7CisJCWlkZC0+ZGF0YVtpcy0+aWRdID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW9jM3VhcnRfcHJvYmUgLSBjYXJkIHByb2JlIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIHNoaW0gZHJpdmVyCisgKiBAaXM6IHN1Ym1vZHVsZSBzdHJ1Y3QgZm9yIHRoaXMgc3VibW9kdWxlCisgKiBAaWRkOiBpb2MzIGRyaXZlciBkYXRhIGZvciB0aGlzIGNhcmQKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdAoraW9jM3VhcnRfcHJvYmUoc3RydWN0IGlvYzNfc3VibW9kdWxlICppcywgc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGlkZC0+cGRldjsKKwlzdHJ1Y3QgaW9jM19jYXJkICpjYXJkX3B0cjsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0OworCXN0cnVjdCBpb2MzX3BvcnQgKnBvcnRzW1BPUlRTX1BFUl9DQVJEXTsKKwlpbnQgcGh5c19wb3J0OworCisJRFBSSU5UX0NPTkZJRygoIiVzICgweCVwLCAweCVwKVxuIiwgX19GVU5DVElPTl9fLCBpcywgaWRkKSk7CisKKwljYXJkX3B0ciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb2MzX2NhcmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhcmRfcHRyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlvYzNfYXR0YWNoX29uZSIKKwkJICAgICAgICI6IHVuYWJsZSB0byBnZXQgbWVtb3J5IGZvciB0aGUgSU9DM1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoY2FyZF9wdHIsIDAsIHNpemVvZihzdHJ1Y3QgaW9jM19jYXJkKSk7CisJaWRkLT5kYXRhW2lzLT5pZF0gPSBjYXJkX3B0cjsKKwlTdWJtb2R1bGVfc2xvdCA9IGlzLT5pZDsKKworCXdyaXRlbCgoKFVBUlRBX0JBU0UgPj4gMykgPDwgU0lPX0NSX1NFUl9BX0JBU0VfU0hJRlQpIHwKKwkJKChVQVJUQl9CQVNFID4+IDMpIDw8IFNJT19DUl9TRVJfQl9CQVNFX1NISUZUKSB8CisJCSgweGYgPDwgU0lPX0NSX0NNRF9QVUxTRV9TSElGVCksICZpZGQtPnZtYS0+c2lvX2NyKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJX0xBVCwgMHhmZjAwKTsKKworCS8qIEVuYWJsZSBzZXJpYWwgcG9ydCBtb2RlIHNlbGVjdCBnZW5lcmljIFBJTyBwaW5zIGFzIG91dHB1dHMgKi8KKwlpb2MzX2dwY3Jfc2V0KGlkZCwgR1BDUl9VQVJUQV9NT0RFU0VMIHwgR1BDUl9VQVJUQl9NT0RFU0VMKTsKKworCS8qIENyZWF0ZSBwb3J0IHN0cnVjdHVyZXMgZm9yIGVhY2ggcG9ydCAqLworCWZvciAocGh5c19wb3J0ID0gMDsgcGh5c19wb3J0IDwgUE9SVFNfUEVSX0NBUkQ7IHBoeXNfcG9ydCsrKSB7CisJCXBvcnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW9jM19wb3J0KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcG9ydCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJJT0MzIHNlcmlhbCBtZW1vcnkgbm90IGF2YWlsYWJsZSBmb3IgcG9ydFxuIik7CisJCQlnb3RvIG91dDQ7CisJCX0KKwkJbWVtc2V0KHBvcnQsIDAsIHNpemVvZihzdHJ1Y3QgaW9jM19wb3J0KSk7CisJCXNwaW5fbG9ja19pbml0KCZwb3J0LT5pcF9sb2NrKTsKKworCQkvKiB3ZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwcmV2aW91cyBvbmVzLCB0byBwb2ludCBiYWNrIHRvCisJCSAqIHRoZW0gZmFydGhlciBkb3duIC0gc2V0dGluZyB1cCB0aGUgcmluZyBidWZmZXJzLgorCQkgKi8KKwkJcG9ydHNbcGh5c19wb3J0XSA9IHBvcnQ7CisKKwkJLyogaW5pdCB0byBzb21ldGhpbmcgdXNlZnVsICovCisJCWNhcmRfcHRyLT5pY19wb3J0W3BoeXNfcG9ydF0uaWNwX3BvcnQgPSBwb3J0OworCQlwb3J0LT5pcF9pcyA9IGlzOworCQlwb3J0LT5pcF9pZGQgPSBpZGQ7CisJCXBvcnQtPmlwX2JhdWQgPSA5NjAwOworCQlwb3J0LT5pcF9jYXJkID0gY2FyZF9wdHI7CisJCXBvcnQtPmlwX2hvb2tzID0gJmhvb2tzX2FycmF5W3BoeXNfcG9ydF07CisKKwkJLyogU2V0dXAgZWFjaCBwb3J0ICovCisJCWlmIChwaHlzX3BvcnQgPT0gMCkgeworCQkJcG9ydC0+aXBfc2VyaWFsX3JlZ3MgPSAmaWRkLT52bWEtPnBvcnRfYTsKKwkJCXBvcnQtPmlwX3VhcnRfcmVncyA9ICZpZGQtPnZtYS0+c3JlZ3MudWFydGE7CisKKwkJCURQUklOVF9DT05GSUcoKCIlcyA6IFBvcnQgQSBpcF9zZXJpYWxfcmVncyAweCVwICIKKwkJCQkgICAgICAgImlwX3VhcnRfcmVncyAweCVwXG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sCisJCQkJICAgICAgICh2b2lkICopcG9ydC0+aXBfc2VyaWFsX3JlZ3MsCisJCQkJICAgICAgICh2b2lkICopcG9ydC0+aXBfdWFydF9yZWdzKSk7CisKKwkJCS8qIHNldHVwIHJpbmcgYnVmZmVycyAqLworCQkJcG9ydC0+aXBfY3B1X3JpbmdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAorCQkJCVRPVEFMX1JJTkdfQlVGX1NJWkUsICZwb3J0LT5pcF9kbWFfcmluZ2J1Zik7CisKKwkJCUJVR19PTighKCgoKGludDY0X3QpIHBvcnQtPmlwX2RtYV9yaW5nYnVmKSAmCisJCQkJICAoVE9UQUxfUklOR19CVUZfU0laRSAtIDEpKSA9PSAwKSk7CisJCQlwb3J0LT5pcF9pbnJpbmcgPSBSSU5HKHBvcnQsIFJYX0EpOworCQkJcG9ydC0+aXBfb3V0cmluZyA9IFJJTkcocG9ydCwgVFhfQSk7CisJCQlEUFJJTlRfQ09ORklHKCgiJXMgOiBQb3J0IEEgaXBfY3B1X3JpbmdidWYgMHglcCAiCisJCQkJICAgICAgICJpcF9kbWFfcmluZ2J1ZiAweCVwLCBpcF9pbnJpbmcgMHglcCAiCisJCQkJCSJpcF9vdXRyaW5nIDB4JXBcbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF9jcHVfcmluZ2J1ZiwKKwkJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF9kbWFfcmluZ2J1ZiwKKwkJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF9pbnJpbmcsCisJCQkJICAgICAgICh2b2lkICopcG9ydC0+aXBfb3V0cmluZykpOworCQl9CisJCWVsc2UgeworCQkJcG9ydC0+aXBfc2VyaWFsX3JlZ3MgPSAmaWRkLT52bWEtPnBvcnRfYjsKKwkJCXBvcnQtPmlwX3VhcnRfcmVncyA9ICZpZGQtPnZtYS0+c3JlZ3MudWFydGI7CisKKwkJCURQUklOVF9DT05GSUcoKCIlcyA6IFBvcnQgQiBpcF9zZXJpYWxfcmVncyAweCVwICIKKwkJCQkgICAgICAgImlwX3VhcnRfcmVncyAweCVwXG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sCisJCQkJICAgICAgICh2b2lkICopcG9ydC0+aXBfc2VyaWFsX3JlZ3MsCisJCQkJICAgICAgICh2b2lkICopcG9ydC0+aXBfdWFydF9yZWdzKSk7CisKKwkJCS8qIHNoYXJlIHRoZSByaW5nIGJ1ZmZlcnMgKi8KKwkJCXBvcnQtPmlwX2RtYV9yaW5nYnVmID0KKwkJCSAgICBwb3J0c1twaHlzX3BvcnQgLSAxXS0+aXBfZG1hX3JpbmdidWY7CisJCQlwb3J0LT5pcF9jcHVfcmluZ2J1ZiA9CisJCQkgICAgcG9ydHNbcGh5c19wb3J0IC0gMV0tPmlwX2NwdV9yaW5nYnVmOworCQkJcG9ydC0+aXBfaW5yaW5nID0gUklORyhwb3J0LCBSWF9CKTsKKwkJCXBvcnQtPmlwX291dHJpbmcgPSBSSU5HKHBvcnQsIFRYX0IpOworCQkJRFBSSU5UX0NPTkZJRygoIiVzIDogUG9ydCBCIGlwX2NwdV9yaW5nYnVmIDB4JXAgIgorCQkJCSAgICAgICAiaXBfZG1hX3JpbmdidWYgMHglcCwgaXBfaW5yaW5nIDB4JXAgIgorCQkJCQkiaXBfb3V0cmluZyAweCVwXG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sCisJCQkJICAgICAgICh2b2lkICopcG9ydC0+aXBfY3B1X3JpbmdidWYsCisJCQkJICAgICAgICh2b2lkICopcG9ydC0+aXBfZG1hX3JpbmdidWYsCisJCQkJICAgICAgICh2b2lkICopcG9ydC0+aXBfaW5yaW5nLAorCQkJCSAgICAgICAodm9pZCAqKXBvcnQtPmlwX291dHJpbmcpKTsKKwkJfQorCisJCURQUklOVF9DT05GSUcoKCIlcyA6IHBvcnQgJWQgW2FkZHIgMHglcF0gY2FyZF9wdHIgMHglcCIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLAorCQkJICAgICAgIHBoeXNfcG9ydCwgKHZvaWQgKilwb3J0LCAodm9pZCAqKWNhcmRfcHRyKSk7CisJCURQUklOVF9DT05GSUcoKCIgaXBfc2VyaWFsX3JlZ3MgMHglcCBpcF91YXJ0X3JlZ3MgMHglcFxuIiwKKwkJCSAgICAgICAodm9pZCAqKXBvcnQtPmlwX3NlcmlhbF9yZWdzLAorCQkJICAgICAgICh2b2lkICopcG9ydC0+aXBfdWFydF9yZWdzKSk7CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgZm9yIElPQzMgKi8KKwkJcG9ydF9pbml0KHBvcnQpOworCisJCURQUklOVF9DT05GSUcoKCIlczogcGh5c19wb3J0ICVkIHBvcnQgMHglcCBpbnJpbmcgMHglcCAiCisJCQkgICAgICAgIm91dHJpbmcgMHglcFxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sCisJCQkgICAgICAgcGh5c19wb3J0LCAodm9pZCAqKXBvcnQsCisJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF9pbnJpbmcsCisJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF9vdXRyaW5nKSk7CisKKwl9CisKKwkvKiByZWdpc3RlciBwb3J0IHdpdGggdGhlIHNlcmlhbCBjb3JlICovCisKKwlpZiAoKHJldCA9IGlvYzNfc2VyaWFsX2NvcmVfYXR0YWNoKGlzLCBpZGQpKSkKKwkJZ290byBvdXQ0OworCisJTnVtX29mX2lvYzNfY2FyZHMrKzsKKworCXJldHVybiByZXQ7CisKKwkvKiBlcnJvciBleGl0cyB0aGF0IGdpdmUgYmFjayByZXNvdXJjZXMgKi8KK291dDQ6CisJa2ZyZWUoY2FyZF9wdHIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgaW9jM3VhcnRfc3VibW9kdWxlID0geworCS5uYW1lID0gIklPQzN1YXJ0IiwKKwkucHJvYmUgPSBpb2MzdWFydF9wcm9iZSwKKwkucmVtb3ZlID0gaW9jM3VhcnRfcmVtb3ZlLAorCS8qIGNhbGwgLmludHIgZm9yIGJvdGggcG9ydHMgaW5pdGlhbGx5ICovCisJLmlycV9tYXNrID0gU0lPX0lSX1NBIHwgU0lPX0lSX1NCLAorCS5pbnRyID0gaW9jM3VhcnRfaW50ciwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKKy8qKgorICogaW9jM19kZXRlY3QgLSBtb2R1bGUgaW5pdCBjYWxsZWQsCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGlvYzN1YXJ0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogcmVnaXN0ZXIgd2l0aCBzZXJpYWwgY29yZSAqLworCWlmICgocmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJmlvYzNfdWFydCkpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IENvdWxkbid0IHJlZ2lzdGVyIElPQzMgdWFydCBzZXJpYWwgZHJpdmVyXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gaW9jM19yZWdpc3Rlcl9zdWJtb2R1bGUoJmlvYzN1YXJ0X3N1Ym1vZHVsZSk7CisJaWYgKHJldCkKKwkJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmaW9jM191YXJ0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaW9jM3VhcnRfZXhpdCh2b2lkKQoreworCWlvYzNfdW5yZWdpc3Rlcl9zdWJtb2R1bGUoJmlvYzN1YXJ0X3N1Ym1vZHVsZSk7CisJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmaW9jM191YXJ0KTsKK30KKworbW9kdWxlX2luaXQoaW9jM3VhcnRfaW5pdCk7Cittb2R1bGVfZXhpdChpb2MzdWFydF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUGF0IEdlZnJlIC0gU2lsaWNvbiBHcmFwaGljcyBJbmMuIChTR0kpIDxwZmdAc2dpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2VyaWFsIFBDSSBkcml2ZXIgbW9kdWxlIGZvciBTR0kgSU9DMyBjYXJkIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL3N1cGVyaHl3YXkvc3VwZXJoeXdheS5jIGIvZHJpdmVycy9zaC9zdXBlcmh5d2F5L3N1cGVyaHl3YXkuYwppbmRleCA3YmRhYjJhLi45NGIyMjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NoL3N1cGVyaHl3YXkvc3VwZXJoeXdheS5jCisrKyBiL2RyaXZlcnMvc2gvc3VwZXJoeXdheS9zdXBlcmh5d2F5LmMKQEAgLTE3NSw4ICsxNzUsNiBAQAogewogCWRydi0+ZHJ2Lm5hbWUJPSBkcnYtPm5hbWU7CiAJZHJ2LT5kcnYuYnVzCT0gJnN1cGVyaHl3YXlfYnVzX3R5cGU7Ci0JZHJ2LT5kcnYucHJvYmUJPSBzdXBlcmh5d2F5X2RldmljZV9wcm9iZTsKLQlkcnYtPmRydi5yZW1vdmUJPSBzdXBlcmh5d2F5X2RldmljZV9yZW1vdmU7CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRydik7CiB9CkBAIC0yMTMsNiArMjExLDggQEAKICNpZmRlZiBDT05GSUdfU1lTRlMKIAkuZGV2X2F0dHJzCT0gc3VwZXJoeXdheV9kZXZfYXR0cnMsCiAjZW5kaWYKKwkucHJvYmUJCT0gc3VwZXJoeXdheV9kZXZpY2VfcHJvYmUsCisJLnJlbW92ZQkJPSBzdXBlcmh5d2F5X2RldmljZV9yZW1vdmUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzdXBlcmh5d2F5X2J1c19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NuL0tjb25maWcgYi9kcml2ZXJzL3NuL0tjb25maWcKaW5kZXggMTNiOGQyNC4uZDk1MjY1YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc24vS2NvbmZpZworKysgYi9kcml2ZXJzL3NuL0tjb25maWcKQEAgLTE3LDQgKzE3LDE4IEBACiAJSWYgeW91IGhhdmUgYW4gU0dJIEFsdGl4IHdpdGggYW4gSU9DNC1iYXNlZAogCUkvTyBjb250cm9sbGVyIHNheSBZLiAgT3RoZXJ3aXNlIHNheSBOLgogCitjb25maWcgU0dJX0lPQzMKKwl0cmlzdGF0ZSAiU0dJIElPQzMgQmFzZSBJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gKElBNjRfR0VORVJJQyB8fCBJQTY0X1NHSV9TTjIpCisJZGVmYXVsdCBtCisJLS0taGVscC0tLQorCVRoaXMgb3B0aW9uIGVuYWJsZXMgYmFzaWMgc3VwcG9ydCBmb3IgdGhlIFNHSSBJT0MzLWJhc2VkIEJhc2UgSU8KKwljb250cm9sbGVyIGNhcmQuICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBlbmFibGUgYW55IHNwZWNpZmljCisJZnVuY3Rpb25zIG9uIHN1Y2ggYSBjYXJkLCBidXQgcHJvdmlkZXMgbmVjZXNzYXJ5IGluZnJhc3RydWN0dXJlCisJZm9yIG90aGVyIGRyaXZlcnMgdG8gdXRpbGl6ZS4KKworCUlmIHlvdSBoYXZlIGFuIFNHSSBBbHRpeCB3aXRoIGFuIElPQzMtYmFzZWQKKwlJL08gY29udHJvbGxlciBvciBhIFBDSSBJT0MzIHNlcmlhbCBjYXJkIHNheSBZLgorCU90aGVyd2lzZSBzYXkgTi4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zbi9NYWtlZmlsZSBiL2RyaXZlcnMvc24vTWFrZWZpbGUKaW5kZXggYzJhMjg0MS4uMmNkYTAxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NuL01ha2VmaWxlCkBAIC00LDMgKzQsNCBAQAogIwogCiBvYmotJChDT05GSUdfU0dJX0lPQzQpICs9IGlvYzQubworb2JqLSQoQ09ORklHX1NHSV9JT0MzKSArPSBpb2MzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc24vaW9jMy5jIGIvZHJpdmVycy9zbi9pb2MzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhMDA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc24vaW9jMy5jCkBAIC0wLDAgKzEsODUxIEBACisvKgorICogU0dJIElPQzMgbWFzdGVyIGRyaXZlciBhbmQgSVJRIGRlbXV4ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU3RhbmlzbGF3IFNrb3dyb25layA8c2t5bGFya0BsaW51eC1taXBzLm9yZz4KKyAqIEhlYXZpbHkgYmFzZWQgb24gc2ltaWxhciB3b3JrIGJ5OgorICogICBCcmVudCBDYXNhdmFudCA8YmNhc2F2YW5Ac2dpLmNvbT4gLSBJT0M0IG1hc3RlciBkcml2ZXIKKyAqICAgUGF0IEdlZnJlIDxwZmdAc2dpLmNvbT4gLSBJT0MzIHNlcmlhbCBwb3J0IElSUSBkZW11eGVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvYzMuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorCisjZGVmaW5lIElPQzNfUENJX1NJWkUgMHgxMDAwMDAKKworc3RhdGljIExJU1RfSEVBRChpb2MzX2RldmljZXMpOworc3RhdGljIGludCBpb2MzX2NvdW50ZXI7CitzdGF0aWMgREVDTEFSRV9SV1NFTShpb2MzX2RldmljZXNfcndzZW0pOworCitzdGF0aWMgc3RydWN0IGlvYzNfc3VibW9kdWxlICppb2MzX3N1Ym1vZHVsZXNbSU9DM19NQVhfU1VCTU9EVUxFU107CitzdGF0aWMgc3RydWN0IGlvYzNfc3VibW9kdWxlICppb2MzX2V0aGVybmV0Oworc3RhdGljIHJ3bG9ja190IGlvYzNfc3VibW9kdWxlc19sb2NrID0gUldfTE9DS19VTkxPQ0tFRDsKKworLyogTklDIHByb2JpbmcgY29kZSAqLworCisjZGVmaW5lIEdQQ1JfTUxBTl9FTiAgICAweDAwMjAwMDAwICAgICAgLyogZW5hYmxlIE1DUiB0byBwaW4gOCAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIG1jcl9wYWNrKHVuc2lnbmVkIHB1bHNlLCB1bnNpZ25lZCBzYW1wbGUpCit7CisJcmV0dXJuIChwdWxzZSA8PCAxMCkgfCAoc2FtcGxlIDw8IDIpOworfQorCitzdGF0aWMgaW50IG5pY193YWl0KHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgbWNyOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBtY3IgPSAodm9sYXRpbGUgdW5zaWduZWQpaWRkLT52bWEtPm1jcjsKKyAgICAgICAgfSB3aGlsZSAoIShtY3IgJiAyKSk7CisKKyAgICAgICAgcmV0dXJuIG1jciAmIDE7Cit9CisKK3N0YXRpYyBpbnQgbmljX3Jlc2V0KHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQpCit7CisgICAgICAgIGludCBwcmVzZW5jZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlkZC0+dm1hLT5tY3IgPSBtY3JfcGFjayg1MDAsIDY1KTsKKwlwcmVzZW5jZSA9IG5pY193YWl0KGlkZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJdWRlbGF5KDUwMCk7CisKKyAgICAgICAgcmV0dXJuIHByZXNlbmNlOworfQorCitzdGF0aWMgaW5saW5lIGludCBuaWNfcmVhZF9iaXQoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWRkLT52bWEtPm1jciA9IG1jcl9wYWNrKDYsIDEzKTsKKwlyZXN1bHQgPSBuaWNfd2FpdChpZGQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXVkZWxheSg1MDApOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5pY193cml0ZV9iaXQoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCwgaW50IGJpdCkKK3sKKwlpZiAoYml0KQorCQlpZGQtPnZtYS0+bWNyID0gbWNyX3BhY2soNiwgMTEwKTsKKwllbHNlCisJCWlkZC0+dm1hLT5tY3IgPSBtY3JfcGFjayg4MCwgMzApOworCisJbmljX3dhaXQoaWRkKTsKK30KKworc3RhdGljIHVuc2lnbmVkIG5pY19yZWFkX2J5dGUoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCkKK3sKKwl1bnNpZ25lZCByZXN1bHQgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcmVzdWx0ID0gKHJlc3VsdCA+PiAxKSB8IChuaWNfcmVhZF9iaXQoaWRkKSA8PCA3KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIG5pY193cml0ZV9ieXRlKHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQsIGludCBieXRlKQoreworCWludCBpLCBiaXQ7CisKKwlmb3IgKGkgPSA4OyBpOyBpLS0pIHsKKwkJYml0ID0gYnl0ZSAmIDE7CisJCWJ5dGUgPj49IDE7CisKKwkJbmljX3dyaXRlX2JpdChpZGQsIGJpdCk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworbmljX2ZpbmQoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCwgaW50ICpsYXN0LCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaW50IGEsIGIsIGluZGV4LCBkaXNjOworCisJbmljX3Jlc2V0KGlkZCk7CisKKwkvKiBTZWFyY2ggUk9NLiAgKi8KKwluaWNfd3JpdGVfYnl0ZShpZGQsIDB4RjApOworCisJLyogQWxnb3JpdGhtIGZyb20gYGBCb29rIG9mIGlCdXR0b24gU3RhbmRhcmRzJycuICAqLworCWZvciAoaW5kZXggPSAwLCBkaXNjID0gMDsgaW5kZXggPCA2NDsgaW5kZXgrKykgeworCQlhID0gbmljX3JlYWRfYml0KGlkZCk7CisJCWIgPSBuaWNfcmVhZF9iaXQoaWRkKTsKKworCQlpZiAoYSAmJiBiKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJT0MzIE5JQyBzZWFyY2ggZmFpbGVkLlxuIik7CisJCQkqbGFzdCA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghYSAmJiAhYikgeworCQkJaWYgKGluZGV4ID09ICpsYXN0KSB7CisJCQkJYWRkciB8PSAxVUwgPDwgaW5kZXg7CisJCQl9IGVsc2UgaWYgKGluZGV4ID4gKmxhc3QpIHsKKwkJCQlhZGRyICY9IH4oMVVMIDw8IGluZGV4KTsKKwkJCQlkaXNjID0gaW5kZXg7CisJCQl9IGVsc2UgaWYgKChhZGRyICYgKDFVTCA8PCBpbmRleCkpID09IDApCisJCQkJZGlzYyA9IGluZGV4OworCQkJbmljX3dyaXRlX2JpdChpZGQsIChhZGRyPj5pbmRleCkmMSk7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChhKQorCQkJCWFkZHIgfD0gMVVMIDw8IGluZGV4OworCQkJZWxzZQorCQkJCWFkZHIgJj0gfigxVUwgPDwgaW5kZXgpOworCQkJbmljX3dyaXRlX2JpdChpZGQsIGEpOworCQkJY29udGludWU7CisJCX0KKwl9CisJKmxhc3QgPSBkaXNjOworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgdm9pZCBuaWNfYWRkcihzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaW50IGluZGV4OworCisJbmljX3Jlc2V0KGlkZCk7CisJbmljX3dyaXRlX2J5dGUoaWRkLCAweEYwKTsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA2NDsgaW5kZXgrKykgeworCQluaWNfcmVhZF9iaXQoaWRkKTsKKwkJbmljX3JlYWRfYml0KGlkZCk7CisJCW5pY193cml0ZV9iaXQoaWRkLCAoYWRkcj4+aW5kZXgpJjEpOworCX0KK30KKworc3RhdGljIHZvaWQgY3JjMTZfYnl0ZSh1bnNpZ25lZCBpbnQgKmNyYywgdW5zaWduZWQgY2hhciBkYikKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7aTw4O2krKykgeworCQkqY3JjIDw8PSAxOworCQlpZigoZGJeKCpjcmM+PjE2KSkgJiAxKQorCQkJKmNyYyBePSAweDgwMDU7CisJCWRiID4+PSAxOworCX0KKwkqY3JjICY9IDB4RkZGRjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjcmMxNl9hcmVhKHVuc2lnbmVkIGNoYXIgKmRicywgaW50IHNpemUsIHVuc2lnbmVkIGludCBjcmMpCit7CisJd2hpbGUoc2l6ZS0tKQorCQljcmMxNl9ieXRlKCZjcmMsICooZGJzKyspKTsKKwlyZXR1cm4gY3JjOworfQorCitzdGF0aWMgdm9pZCBjcmM4X2J5dGUodW5zaWduZWQgaW50ICpjcmMsIHVuc2lnbmVkIGNoYXIgZGIpCit7CisJaW50IGksZjsKKworCWZvcihpPTA7aTw4O2krKykgeworCQlmID0gKCpjcmMgXiBkYikgJiAxOworCQkqY3JjID4+PSAxOworCQlkYiA+Pj0gMTsKKwkJaWYoZikKKwkJCSpjcmMgXj0gMHg4YzsKKwl9CisJKmNyYyAmPSAweGZmOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNyYzhfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGNyYyA9IDB4MDA7CisKKwlmb3IoaT0wO2k8ODtpKyspCisJCWNyYzhfYnl0ZSgmY3JjLCBhZGRyPj4oaTw8MykpOworCXJldHVybiBjcmM7Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX3JlZGlyX3BhZ2Uoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgcGFnZSwKKwkJCXVuc2lnbmVkIGNoYXIgKnJlZGlyLCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCWludCBsb29wcyA9IDE2LCBpOworCisJd2hpbGUocmVkaXJbcGFnZV0gIT0gMHhGRikgeworCQlwYWdlID0gcmVkaXJbcGFnZV1eMHhGRjsKKwkJbG9vcHMtLTsKKwkJaWYobG9vcHM8MCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJJT0MzOiBOSUMgY2lyY3VsYXIgcmVkaXJlY3Rpb25cbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCWxvb3BzID0gMzsKKwl3aGlsZShsb29wcz4wKSB7CisJCW5pY19hZGRyKGlkZCwgYWRkcik7CisJCW5pY193cml0ZV9ieXRlKGlkZCwgMHhGMCk7CisJCW5pY193cml0ZV9ieXRlKGlkZCwgKHBhZ2UgPDwgNSkgJiAweEUwKTsKKwkJbmljX3dyaXRlX2J5dGUoaWRkLCAocGFnZSA+PiAzKSAmIDB4MUYpOworCQlmb3IoaT0wO2k8MHgyMDtpKyspCisJCQlkYXRhW2ldID0gbmljX3JlYWRfYnl0ZShpZGQpOworCQlpZihjcmMxNl9hcmVhKGRhdGEsIDB4MjAsIDB4MDAwMCkgPT0gMHg4MDBkKQorCQkJcmV0dXJuOworCQlsb29wcy0tOworCX0KKwlwcmludGsoS0VSTl9FUlIgIklPQzM6IENSQyBlcnJvciBpbiBkYXRhIHBhZ2VcbiIpOworCWZvcihpPTA7aTwweDIwO2krKykKKwkJZGF0YVtpXSA9IDB4MDA7Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX3JlZGlyX21hcChzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJCSB1bnNpZ25lZCBjaGFyICpyZWRpcikKK3sKKwlpbnQgaSxqLGxvb3BzID0gMyxjcmNfb2s7CisJdW5zaWduZWQgaW50IGNyYzsKKworCXdoaWxlKGxvb3BzPjApIHsKKwkJY3JjX29rID0gMTsKKwkJbmljX2FkZHIoaWRkLCBhZGRyKTsKKwkJbmljX3dyaXRlX2J5dGUoaWRkLCAweEFBKTsKKwkJbmljX3dyaXRlX2J5dGUoaWRkLCAweDAwKTsKKwkJbmljX3dyaXRlX2J5dGUoaWRkLCAweDAxKTsKKwkJZm9yKGk9MDtpPDY0O2krPTgpIHsKKwkJCWZvcihqPTA7ajw4O2orKykKKwkJCQlyZWRpcltpK2pdID0gbmljX3JlYWRfYnl0ZShpZGQpOworCQkJY3JjID0gY3JjMTZfYXJlYShyZWRpcitpLCA4LCAoaT09MCk/MHg4NzA3OjB4MDAwMCk7CisJCQljcmMxNl9ieXRlKCZjcmMsIG5pY19yZWFkX2J5dGUoaWRkKSk7CisJCQljcmMxNl9ieXRlKCZjcmMsIG5pY19yZWFkX2J5dGUoaWRkKSk7CisJCQlpZihjcmMgIT0gMHg4MDBkKQorCQkJCWNyY19vayA9IDA7CisJCX0KKwkJaWYoY3JjX29rKQorCQkJcmV0dXJuOworCQlsb29wcy0tOworCX0KKwlwcmludGsoS0VSTl9FUlIgIklPQzM6IENSQyBlcnJvciBpbiByZWRpcmVjdGlvbiBwYWdlXG4iKTsKKwlmb3IoaT0wO2k8NjQ7aSsrKQorCQlyZWRpcltpXSA9IDB4RkY7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfbmljKHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwl1bnNpZ25lZCBjaGFyIHJlZGlyWzY0XTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbNjRdLHBhcnRbMzJdOworCWludCBpLGo7CisKKwkvKiByZWFkIHJlZGlyZWN0aW9ucyAqLworCXJlYWRfcmVkaXJfbWFwKGlkZCwgYWRkciwgcmVkaXIpOworCS8qIHJlYWQgZGF0YSBwYWdlcyAqLworCXJlYWRfcmVkaXJfcGFnZShpZGQsIGFkZHIsIDAsIHJlZGlyLCBkYXRhKTsKKwlyZWFkX3JlZGlyX3BhZ2UoaWRkLCBhZGRyLCAxLCByZWRpciwgZGF0YSszMik7CisJLyogYXNzZW1ibGUgdGhlIHBhcnQgIyAqLworCWo9MDsKKwlmb3IoaT0wO2k8MTk7aSsrKQorCQlpZihkYXRhW2krMTFdICE9ICcgJykKKwkJCXBhcnRbaisrXSA9IGRhdGFbaSsxMV07CisJZm9yKGk9MDtpPDY7aSsrKQorCQlpZihkYXRhW2krMzJdICE9ICcgJykKKwkJCXBhcnRbaisrXSA9IGRhdGFbaSszMl07CisJcGFydFtqXSA9IDA7CisJLyogc2tpcCBPY3RhbmUgcG93ZXIgc3VwcGxpZXMgKi8KKwlpZighc3RybmNtcChwYXJ0LCAiMDYwLTAwMzUtIiwgOSkpCisJCXJldHVybjsKKwlpZighc3RybmNtcChwYXJ0LCAiMDYwLTAwMzgtIiwgOSkpCisJCXJldHVybjsKKwlzdHJjcHkoaWRkLT5uaWNfcGFydCwgcGFydCk7CisJLyogYXNzZW1ibGUgdGhlIHNlcmlhbCAjICovCisJaj0wOworCWZvcihpPTA7aTwxMDtpKyspCisJCWlmKGRhdGFbaSsxXSAhPSAnICcpCisJCQlpZGQtPm5pY19zZXJpYWxbaisrXSA9IGRhdGFbaSsxXTsKKwlpZGQtPm5pY19zZXJpYWxbal0gPSAwOworfQorCitzdGF0aWMgdm9pZCByZWFkX21hYyhzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaW50IGksIGxvb3BzID0gMzsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMTNdOworCisJd2hpbGUobG9vcHM+MCkgeworCQluaWNfYWRkcihpZGQsIGFkZHIpOworCQluaWNfd3JpdGVfYnl0ZShpZGQsIDB4RjApOworCQluaWNfd3JpdGVfYnl0ZShpZGQsIDB4MDApOworCQluaWNfd3JpdGVfYnl0ZShpZGQsIDB4MDApOworCQluaWNfcmVhZF9ieXRlKGlkZCk7CisJCWZvcihpPTA7aTwxMztpKyspCisJCQlkYXRhW2ldID0gbmljX3JlYWRfYnl0ZShpZGQpOworCQlpZihjcmMxNl9hcmVhKGRhdGEsIDEzLCAweDAwMDApID09IDB4ODAwZCkgeworCQkJZm9yKGk9MTA7aT40O2ktLSkKKwkJCQlpZGQtPm5pY19tYWNbMTAtaV0gPSBkYXRhW2ldOworCQkJcmV0dXJuOworCQl9CisJCWxvb3BzLS07CisJfQorCXByaW50ayhLRVJOX0VSUiAiSU9DMzogQ1JDIGVycm9yIGluIE1BQyBhZGRyZXNzXG4iKTsKKwlmb3IoaT0wO2k8NjtpKyspCisJCWlkZC0+bmljX21hY1tpXSA9IDB4MDA7Cit9CisKK3N0YXRpYyB2b2lkIHByb2JlX25pYyhzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkKQoreworICAgICAgICBpbnQgc2F2ZSA9IDAsIGxvb3BzID0gMzsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmaXJzdCwgYWRkcjsKKworICAgICAgICBpZGQtPnZtYS0+Z3Bjcl9zID0gR1BDUl9NTEFOX0VOOworCisgICAgICAgIHdoaWxlKGxvb3BzPjApIHsKKyAgICAgICAgICAgICAgICBpZGQtPm5pY19wYXJ0WzBdID0gMDsKKyAgICAgICAgICAgICAgICBpZGQtPm5pY19zZXJpYWxbMF0gPSAwOworICAgICAgICAgICAgICAgIGFkZHIgPSBmaXJzdCA9IG5pY19maW5kKGlkZCwgJnNhdmUsIDApOworICAgICAgICAgICAgICAgIGlmKCFmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB3aGlsZSgxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihjcmM4X2FkZHIoYWRkcikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChhZGRyICYgMHhGRikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MEI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9uaWMoaWRkLCBhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ODk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg5MToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX21hYyhpZGQsIGFkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyID0gbmljX2ZpbmQoaWRkLCAmc2F2ZSwgYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihhZGRyID09IGZpcnN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvb3BzLS07CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJJT0MzOiBDUkMgZXJyb3IgaW4gTklDIGFkZHJlc3NcbiIpOworfQorCisvKiBJbnRlcnJ1cHRzICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAord3JpdGVfaXJlZyhzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkLCB1aW50MzJfdCB2YWwsIGludCB3aGljaCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZC0+aXJfbG9jaywgZmxhZ3MpOworCXN3aXRjaCAod2hpY2gpIHsKKwljYXNlIElPQzNfV19JRVM6CisJCXdyaXRlbCh2YWwsICZpZGQtPnZtYS0+c2lvX2llcyk7CisJCWJyZWFrOworCWNhc2UgSU9DM19XX0lFQzoKKwkJd3JpdGVsKHZhbCwgJmlkZC0+dm1hLT5zaW9faWVjKTsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZC0+aXJfbG9jaywgZmxhZ3MpOworfQorc3RhdGljIGlubGluZSB1aW50MzJfdCBnZXRfcGVuZGluZ19pbnRycyhzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKwl1aW50MzJfdCBpbnRycyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRkLT5pcl9sb2NrLCBmbGFnKTsKKwlpbnRycyA9IHJlYWRsKCZpZGQtPnZtYS0+c2lvX2lyKTsKKwlpbnRycyAmPSByZWFkbCgmaWRkLT52bWEtPnNpb19pZXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZC0+aXJfbG9jaywgZmxhZyk7CisJcmV0dXJuIGludHJzOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaW9jM19pbnRyX2lvKGludCBpcnEsIHZvaWQgKmFyZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkID0gKHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICopYXJnOworCWludCBoYW5kbGVkID0gMSwgaWQ7CisJdW5zaWduZWQgaW50IHBlbmRpbmc7CisKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmaW9jM19zdWJtb2R1bGVzX2xvY2ssIGZsYWdzKTsKKworCWlmKGlkZC0+ZHVhbF9pcnEgJiYgaWRkLT52bWEtPmVpc3IpIHsKKwkJLyogc2VuZCBFdGhlcm5ldCBJUlEgdG8gdGhlIGRyaXZlciAqLworCQlpZihpb2MzX2V0aGVybmV0ICYmIGlkZC0+YWN0aXZlW2lvYzNfZXRoZXJuZXQtPmlkXSAmJgorCQkJCQkJaW9jM19ldGhlcm5ldC0+aW50cikgeworCQkJaGFuZGxlZCA9IGhhbmRsZWQgJiYgIWlvYzNfZXRoZXJuZXQtPmludHIoaW9jM19ldGhlcm5ldCwKKwkJCQkJCQlpZGQsIDAsIHJlZ3MpOworCQl9CisJfQorCXBlbmRpbmcgPSBnZXRfcGVuZGluZ19pbnRycyhpZGQpOwkvKiBsb29rIGF0IHRoZSBJTyBJUlFzICovCisKKwlmb3IoaWQ9MDtpZDxJT0MzX01BWF9TVUJNT0RVTEVTO2lkKyspIHsKKwkJaWYoaWRkLT5hY3RpdmVbaWRdICYmIGlvYzNfc3VibW9kdWxlc1tpZF0KKwkJCQkmJiAocGVuZGluZyAmIGlvYzNfc3VibW9kdWxlc1tpZF0tPmlycV9tYXNrKQorCQkJCSYmIGlvYzNfc3VibW9kdWxlc1tpZF0tPmludHIpIHsKKwkJCXdyaXRlX2lyZWcoaWRkLCBpb2MzX3N1Ym1vZHVsZXNbaWRdLT5pcnFfbWFzaywKKwkJCQkJCQlJT0MzX1dfSUVDKTsKKwkJCWlmKCFpb2MzX3N1Ym1vZHVsZXNbaWRdLT5pbnRyKGlvYzNfc3VibW9kdWxlc1tpZF0sCisJCQkJICAgaWRkLCBwZW5kaW5nICYgaW9jM19zdWJtb2R1bGVzW2lkXS0+aXJxX21hc2ssCisJCQkJCXJlZ3MpKQorCQkJCXBlbmRpbmcgJj0gfmlvYzNfc3VibW9kdWxlc1tpZF0tPmlycV9tYXNrOworCQkJaWYgKGlvYzNfc3VibW9kdWxlc1tpZF0tPnJlc2V0X21hc2spCisJCQkJd3JpdGVfaXJlZyhpZGQsIGlvYzNfc3VibW9kdWxlc1tpZF0tPmlycV9tYXNrLAorCQkJCQkJCUlPQzNfV19JRVMpOworCQl9CisJfQorCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmlvYzNfc3VibW9kdWxlc19sb2NrLCBmbGFncyk7CisJaWYocGVuZGluZykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgIklPQzM6IFBlbmRpbmcgSVJRcyAweCUwOHggZGlzY2FyZGVkIGFuZCBkaXNhYmxlZFxuIixwZW5kaW5nKTsKKwkJd3JpdGVfaXJlZyhpZGQsIHBlbmRpbmcsIElPQzNfV19JRUMpOworCQloYW5kbGVkID0gMTsKKwl9CisJcmV0dXJuIGhhbmRsZWQ/SVJRX0hBTkRMRUQ6SVJRX05PTkU7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpb2MzX2ludHJfZXRoKGludCBpcnEsIHZvaWQgKmFyZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkID0gKHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICopYXJnOworCWludCBoYW5kbGVkID0gMTsKKworCWlmKCFpZGQtPmR1YWxfaXJxKQorCQlyZXR1cm4gSVJRX05PTkU7CisJcmVhZF9sb2NrX2lycXNhdmUoJmlvYzNfc3VibW9kdWxlc19sb2NrLCBmbGFncyk7CisJaWYoaW9jM19ldGhlcm5ldCAmJiBpZGQtPmFjdGl2ZVtpb2MzX2V0aGVybmV0LT5pZF0KKwkJCQkmJiBpb2MzX2V0aGVybmV0LT5pbnRyKQorCQloYW5kbGVkID0gaGFuZGxlZCAmJiAhaW9jM19ldGhlcm5ldC0+aW50cihpb2MzX2V0aGVybmV0LCBpZGQsIDAsCisJCQkJCQkJCXJlZ3MpOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmlvYzNfc3VibW9kdWxlc19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGhhbmRsZWQ/SVJRX0hBTkRMRUQ6SVJRX05PTkU7Cit9CisKK3ZvaWQgaW9jM19lbmFibGUoc3RydWN0IGlvYzNfc3VibW9kdWxlICppcywKKwkJCQlzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkLCB1bnNpZ25lZCBpbnQgaXJxcykKK3sKKwl3cml0ZV9pcmVnKGlkZCwgaXJxcyAmIGlzLT5pcnFfbWFzaywgSU9DM19XX0lFUyk7Cit9CisKK3ZvaWQgaW9jM19hY2soc3RydWN0IGlvYzNfc3VibW9kdWxlICppcywgc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCwKKwkJCQl1bnNpZ25lZCBpbnQgaXJxcykKK3sKKwl3cml0ZWwoaXJxcyAmIGlzLT5pcnFfbWFzaywgJmlkZC0+dm1hLT5zaW9faXIpOworfQorCit2b2lkIGlvYzNfZGlzYWJsZShzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKmlzLAorCQkJCXN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQsIHVuc2lnbmVkIGludCBpcnFzKQoreworCXdyaXRlX2lyZWcoaWRkLCBpcnFzICYgaXMtPmlycV9tYXNrLCBJT0MzX1dfSUVDKTsKK30KKwordm9pZCBpb2MzX2dwY3Jfc2V0KHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQsIHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRkLT5ncGlvX2xvY2ssIGZsYWdzKTsKKwl3cml0ZWwodmFsLCAmaWRkLT52bWEtPmdwY3Jfcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRkLT5ncGlvX2xvY2ssIGZsYWdzKTsKK30KKworLyogS2VlcCBpdCBzaW1wbGUsIHN0dXBpZCEgKi8KK3N0YXRpYyBpbnQgZmluZF9zbG90KHZvaWQgKip0YWIsIGludCBtYXgpCit7CisJaW50IGk7CisJZm9yKGk9MDtpPG1heDtpKyspCisJCWlmKCEodGFiW2ldKSkKKwkJCXJldHVybiBpOworCXJldHVybiAtMTsKK30KKworLyogUmVnaXN0ZXIgYW4gSU9DMyBzdWJtb2R1bGUgKi8KK2ludCBpb2MzX3JlZ2lzdGVyX3N1Ym1vZHVsZShzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKmlzKQoreworCXN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQ7CisJaW50IGFsbG9jX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmlvYzNfc3VibW9kdWxlc19sb2NrLCBmbGFncyk7CisJYWxsb2NfaWQgPSBmaW5kX3Nsb3QoKHZvaWQgKiopaW9jM19zdWJtb2R1bGVzLCBJT0MzX01BWF9TVUJNT0RVTEVTKTsKKwlpZihhbGxvY19pZCAhPSAtMSkgeworCQlpb2MzX3N1Ym1vZHVsZXNbYWxsb2NfaWRdID0gaXM7CisJCWlmKGlzLT5ldGhlcm5ldCkgeworCQkJaWYoaW9jM19ldGhlcm5ldD09TlVMTCkKKwkJCQlpb2MzX2V0aGVybmV0PWlzOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICJJT0MzIEV0aGVybmV0IG1vZHVsZSBhbHJlYWR5IHJlZ2lzdGVyZWQhXG4iKTsKKwkJfQorCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmaW9jM19zdWJtb2R1bGVzX2xvY2ssIGZsYWdzKTsKKworCWlmKGFsbG9jX2lkID09IC0xKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkluY3JlYXNlIElPQzNfTUFYX1NVQk1PRFVMRVMhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaXMtPmlkPWFsbG9jX2lkOworCisJLyogSW5pdGlhbGl6ZSBzdWJtb2R1bGUgZm9yIGVhY2ggSU9DMyAqLworCWlmICghaXMtPnByb2JlKQorCQlyZXR1cm4gMDsKKworCWRvd25fcmVhZCgmaW9jM19kZXZpY2VzX3J3c2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlkZCwgJmlvYzNfZGV2aWNlcywgbGlzdCkgeworCQkvKiBzZXQgdG8gMSBmb3IgSVJRcyBpbiBwcm9iZSAqLworCQlpZGQtPmFjdGl2ZVthbGxvY19pZF0gPSAxOworCQlpZGQtPmFjdGl2ZVthbGxvY19pZF0gPSAhaXMtPnByb2JlKGlzLCBpZGQpOworCX0KKwl1cF9yZWFkKCZpb2MzX2RldmljZXNfcndzZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFVucmVnaXN0ZXIgYW4gSU9DMyBzdWJtb2R1bGUgKi8KK3ZvaWQgaW9jM191bnJlZ2lzdGVyX3N1Ym1vZHVsZShzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKmlzKQoreworCXN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmaW9jM19zdWJtb2R1bGVzX2xvY2ssIGZsYWdzKTsKKwlpZihpb2MzX3N1Ym1vZHVsZXNbaXMtPmlkXT09aXMpCisJCWlvYzNfc3VibW9kdWxlc1tpcy0+aWRdPU5VTEw7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiSU9DMyBzdWJtb2R1bGUgJXMgaGFzIHdyb25nIElELlxuIixpcy0+bmFtZSk7CisJaWYoaW9jM19ldGhlcm5ldD09aXMpCisJCWlvYzNfZXRoZXJuZXQgPSBOVUxMOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZpb2MzX3N1Ym1vZHVsZXNfbG9jaywgZmxhZ3MpOworCisJLyogUmVtb3ZlIHN1Ym1vZHVsZSBmb3IgZWFjaCBJT0MzICovCisJZG93bl9yZWFkKCZpb2MzX2RldmljZXNfcndzZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaWRkLCAmaW9jM19kZXZpY2VzLCBsaXN0KQorCQlpZihpZGQtPmFjdGl2ZVtpcy0+aWRdKSB7CisJCQlpZihpcy0+cmVtb3ZlKQorCQkJCWlmKGlzLT5yZW1vdmUoaXMsIGlkZCkpCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJICAgICAgICIlczogSU9DMyBzdWJtb2R1bGUgJXMgcmVtb3ZlIGZhaWxlZCAiCisJCQkJCSAgICAgICAiZm9yIHBjaV9kZXYgJXMuXG4iLAorCQkJCQkgICAgICAgX19GVU5DVElPTl9fLCBtb2R1bGVfbmFtZShpcy0+b3duZXIpLAorCQkJCQkgICAgICAgcGNpX25hbWUoaWRkLT5wZGV2KSk7CisJCQlpZGQtPmFjdGl2ZVtpcy0+aWRdID0gMDsKKwkJCWlmKGlzLT5pcnFfbWFzaykKKwkJCQl3cml0ZV9pcmVnKGlkZCwgaXMtPmlycV9tYXNrLCBJT0MzX1dfSUVDKTsKKwkJfQorCXVwX3JlYWQoJmlvYzNfZGV2aWNlc19yd3NlbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioKKyAqIERldmljZSBtYW5hZ2VtZW50ICoKKyAqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjaGFyICoKK2lvYzNfY2xhc3NfbmFtZXNbXT17InVua25vd24iLCAiSVAyNyBCYXNlSU8iLCAiSVAzMCBzeXN0ZW0iLCAiTUVORVQgMS8yLzMiLAorCQkJIk1FTkVUIDQiLCAiQ0FEZHVvIiwgIkFsdGl4IFNlcmlhbCJ9OworCitzdGF0aWMgaW50IGlvYzNfY2xhc3Moc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCkKK3sKKwlpbnQgcmVzID0gSU9DM19DTEFTU19OT05FOworCS8qIE5JQy1iYXNlZCBsb2dpYyAqLworCWlmKCFzdHJuY21wKGlkZC0+bmljX3BhcnQsICIwMzAtMDg5MS0iLCA5KSkKKwkJcmVzID0gSU9DM19DTEFTU19CQVNFX0lQMzA7CisJaWYoIXN0cm5jbXAoaWRkLT5uaWNfcGFydCwgIjAzMC0xMTU1LSIsIDkpKQorCQlyZXMgPSBJT0MzX0NMQVNTX0NBRERVTzsKKwlpZighc3RybmNtcChpZGQtPm5pY19wYXJ0LCAiMDMwLTE2NTctIiwgOSkpCisJCXJlcyA9IElPQzNfQ0xBU1NfU0VSSUFMOworCWlmKCFzdHJuY21wKGlkZC0+bmljX3BhcnQsICIwMzAtMTY2NC0iLCA5KSkKKwkJcmVzID0gSU9DM19DTEFTU19TRVJJQUw7CisJLyogdG90YWwgcmFuZG9tIGhldXJpc3RpY3MgKi8KKyNpZmRlZiBDT05GSUdfU0dJX0lQMjcKKwlpZighaWRkLT5uaWNfcGFydFswXSkKKwkJcmVzID0gSU9DM19DTEFTU19CQVNFX0lQMjc7CisjZW5kaWYKKwkvKiBwcmludCBlZHVjYXRpb25hbCBtZXNzYWdlICovCisJcHJpbnRrKEtFUk5fSU5GTyAiSU9DMyBwYXJ0OiBbJXNdLCBzZXJpYWw6IFslc10gPT4gY2xhc3MgJXNcbiIsCisJCQlpZGQtPm5pY19wYXJ0LCBpZGQtPm5pY19zZXJpYWwsIGlvYzNfY2xhc3NfbmFtZXNbcmVzXSk7CisJcmV0dXJuIHJlczsKK30KKy8qIEFkZHMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gSU9DMyBjYXJkICovCitzdGF0aWMgaW50IGlvYzNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZDsKKwl1aW50MzJfdCBwY21kOworCWludCByZXQsIGlkOworCisJLyogRW5hYmxlIElPQzMgYW5kIHRha2Ugb3duZXJzaGlwIG9mIGl0ICovCisJaWYgKChyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBGYWlsZWQgdG8gZW5hYmxlIElPQzMgZGV2aWNlIGZvciBwY2lfZGV2ICVzLlxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcGNpX25hbWUocGRldikpOworCQlnb3RvIG91dDsKKwl9CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKyNpZmRlZiBVU0VfNjRCSVRfRE1BCisgICAgICAgIHJldCA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKTsKKyAgICAgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBvYnRhaW4gNjQgYml0IERNQSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBjb25zaXN0ZW50IGFsbG9jYXRpb25zXG4iLAorCQkJCV9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgfQorCX0KKyNlbmRpZgorCisJLyogU2V0IHVwIHBlci1JT0MzIGRhdGEgKi8KKwlpZGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghaWRkKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIElPQzMgZGF0YSBmb3IgcGNpX2RldiAlcy5cbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfaWRkOworCX0KKwltZW1zZXQoaWRkLCAwLCBzaXplb2Yoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEpKTsKKwlzcGluX2xvY2tfaW5pdCgmaWRkLT5pcl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWRkLT5ncGlvX2xvY2spOworCWlkZC0+cGRldiA9IHBkZXY7CisKKwkvKiBNYXAgYWxsIElPQzMgcmVnaXN0ZXJzLiAgVGhlc2UgYXJlIHNoYXJlZCBiZXR3ZWVuIHN1YmRldmljZXMKKwkgKiBzbyB0aGUgbWFpbiBJT0MzIG1vZHVsZSBtYW5hZ2VzIHRoZW0uCisJICovCisJaWRkLT5wbWEgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJaWYgKCFpZGQtPnBtYSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IFVuYWJsZSB0byBmaW5kIElPQzMgcmVzb3VyY2UgIgorCQkgICAgICAgImZvciBwY2lfZGV2ICVzLlxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcGNpX25hbWUocGRldikpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9wY2k7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24oaWRkLT5wbWEsIElPQzNfUENJX1NJWkUsICJpb2MzIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmVxdWVzdCBJT0MzIHJlZ2lvbiAiCisJCSAgICAgICAiZm9yIHBjaV9kZXYgJXMuXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBwY2lfbmFtZShwZGV2KSk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3BjaTsKKwl9CisJaWRkLT52bWEgPSBpb3JlbWFwKGlkZC0+cG1hLCBJT0MzX1BDSV9TSVpFKTsKKwlpZiAoIWlkZC0+dm1hKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogVW5hYmxlIHRvIHJlbWFwIElPQzMgcmVnaW9uICIKKwkJICAgICAgICJmb3IgcGNpX2RldiAlcy5cbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfbWlzY19yZWdpb247CisJfQorCisJLyogVHJhY2sgUENJLWRldmljZSBzcGVjaWZpYyBkYXRhICovCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGlkZCk7CisJZG93bl93cml0ZSgmaW9jM19kZXZpY2VzX3J3c2VtKTsKKwlsaXN0X2FkZCgmaWRkLT5saXN0LCAmaW9jM19kZXZpY2VzKTsKKwlpZGQtPmlkID0gaW9jM19jb3VudGVyKys7CisJdXBfd3JpdGUoJmlvYzNfZGV2aWNlc19yd3NlbSk7CisKKwlpZGQtPmdwZHJfc2hhZG93ID0gaWRkLT52bWEtPmdwZHI7CisKKwkvKiBSZWFkIElPQzMgTklDIGNvbnRlbnRzICovCisJcHJvYmVfbmljKGlkZCk7CisKKwkvKiBEZXRlY3QgSU9DMyBjbGFzcyAqLworCWlkZC0+Y2xhc3MgPSBpb2MzX2NsYXNzKGlkZCk7CisKKwkvKiBJbml0aWFsaXplIElPQzMgKi8KKyAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY21kKTsKKyAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9DT01NQU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbWQgfCBQQ0lfQ09NTUFORF9NRU1PUlkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9DT01NQU5EX1BBUklUWSB8IFBDSV9DT01NQU5EX1NFUlIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9TQ1JfRFJPUF9NT0RFX0VOKTsKKworCXdyaXRlX2lyZWcoaWRkLCB+MCwgSU9DM19XX0lFQyk7CisJd3JpdGVsKH4wLCAmaWRkLT52bWEtPnNpb19pcik7CisKKwkvKiBTZXQgdXAgSVJRcyAqLworCWlmKGlkZC0+Y2xhc3MgPT0gSU9DM19DTEFTU19CQVNFX0lQMzAKKwkJCQl8fCBpZGQtPmNsYXNzID09IElPQzNfQ0xBU1NfQkFTRV9JUDI3KSB7CisJCXdyaXRlbCgwLCAmaWRkLT52bWEtPmVpZXIpOworCQl3cml0ZWwofjAsICZpZGQtPnZtYS0+ZWlzcik7CisKKwkJaWRkLT5kdWFsX2lycSA9IDE7CisJCWlmICghcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpb2MzX2ludHJfZXRoLCBTQV9TSElSUSwKKwkJCQkgImlvYzMtZXRoIiwgKHZvaWQgKilpZGQpKSB7CisJCQlpZGQtPmlycV9ldGggPSBwZGV2LT5pcnE7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzIDogcmVxdWVzdF9pcnEgZmFpbHMgZm9yIElSUSAweCV4XG4gIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHBkZXYtPmlycSk7CisJCX0KKwkJaWYgKCFyZXF1ZXN0X2lycShwZGV2LT5pcnErMiwgaW9jM19pbnRyX2lvLCBTQV9TSElSUSwKKwkJCQkgImlvYzMtaW8iLCAodm9pZCAqKWlkZCkpIHsKKwkJCWlkZC0+aXJxX2lvID0gcGRldi0+aXJxKzI7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzIDogcmVxdWVzdF9pcnEgZmFpbHMgZm9yIElSUSAweCV4XG4gIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHBkZXYtPmlycSsyKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpb2MzX2ludHJfaW8sIFNBX1NISVJRLAorCQkJCSAiaW9jMyIsICh2b2lkICopaWRkKSkgeworCQkJaWRkLT5pcnFfaW8gPSBwZGV2LT5pcnE7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzIDogcmVxdWVzdF9pcnEgZmFpbHMgZm9yIElSUSAweCV4XG4gIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHBkZXYtPmlycSk7CisJCX0KKwl9CisKKwkvKiBBZGQgdGhpcyBJT0MzIHRvIGFsbCBzdWJtb2R1bGVzICovCisJcmVhZF9sb2NrKCZpb2MzX3N1Ym1vZHVsZXNfbG9jayk7CisJZm9yKGlkPTA7aWQ8SU9DM19NQVhfU1VCTU9EVUxFUztpZCsrKQorCQlpZihpb2MzX3N1Ym1vZHVsZXNbaWRdICYmIGlvYzNfc3VibW9kdWxlc1tpZF0tPnByb2JlKSB7CisJCQlpZGQtPmFjdGl2ZVtpZF0gPSAxOworCQkJaWRkLT5hY3RpdmVbaWRdID0gIWlvYzNfc3VibW9kdWxlc1tpZF0tPnByb2JlCisJCQkJCQkoaW9jM19zdWJtb2R1bGVzW2lkXSwgaWRkKTsKKwkJfQorCXJlYWRfdW5sb2NrKCZpb2MzX3N1Ym1vZHVsZXNfbG9jayk7CisKKwlwcmludGsoS0VSTl9JTkZPICJJT0MzIE1hc3RlciBEcml2ZXIgbG9hZGVkIGZvciAlc1xuIiwgcGNpX25hbWUocGRldikpOworCisJcmV0dXJuIDA7CisKK291dF9taXNjX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihpZGQtPnBtYSwgSU9DM19QQ0lfU0laRSk7CitvdXRfcGNpOgorCWtmcmVlKGlkZCk7CitvdXRfaWRkOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZW1vdmVzIGEgcGFydGljdWxhciBpbnN0YW5jZSBvZiBhbiBJT0MzIGNhcmQuICovCitzdGF0aWMgdm9pZCBpb2MzX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgaWQ7CisJc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZDsKKworCWlkZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCS8qIFJlbW92ZSB0aGlzIElPQzMgZnJvbSBhbGwgc3VibW9kdWxlcyAqLworCXJlYWRfbG9jaygmaW9jM19zdWJtb2R1bGVzX2xvY2spOworCWZvcihpZD0wO2lkPElPQzNfTUFYX1NVQk1PRFVMRVM7aWQrKykKKwkJaWYoaWRkLT5hY3RpdmVbaWRdKSB7CisJCQlpZihpb2MzX3N1Ym1vZHVsZXNbaWRdICYmIGlvYzNfc3VibW9kdWxlc1tpZF0tPnJlbW92ZSkKKwkJCQlpZihpb2MzX3N1Ym1vZHVsZXNbaWRdLT5yZW1vdmUoaW9jM19zdWJtb2R1bGVzW2lkXSwKKwkJCQkJCQkJaWRkKSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkgICAgICAgIiVzOiBJT0MzIHN1Ym1vZHVsZSAweCVzIHJlbW92ZSBmYWlsZWQgIgorCQkJCQkgICAgICAgImZvciBwY2lfZGV2ICVzLlxuIiwKKwkJCQkJICAgICAgICBfX0ZVTkNUSU9OX18sCisJCQkJCQltb2R1bGVfbmFtZShpb2MzX3N1Ym1vZHVsZXNbaWRdLT5vd25lciksCisJCQkJCSAgICAgICAgcGNpX25hbWUocGRldikpOworCQkJaWRkLT5hY3RpdmVbaWRdID0gMDsKKwkJfQorCXJlYWRfdW5sb2NrKCZpb2MzX3N1Ym1vZHVsZXNfbG9jayk7CisKKwkvKiBDbGVhciBhbmQgZGlzYWJsZSBhbGwgSVJRcyAqLworCXdyaXRlX2lyZWcoaWRkLCB+MCwgSU9DM19XX0lFQyk7CisJd3JpdGVsKH4wLCAmaWRkLT52bWEtPnNpb19pcik7CisKKwkvKiBSZWxlYXNlIHJlc291cmNlcyAqLworCWZyZWVfaXJxKGlkZC0+aXJxX2lvLCAodm9pZCAqKWlkZCk7CisJaWYoaWRkLT5kdWFsX2lycSkKKwkJZnJlZV9pcnEoaWRkLT5pcnFfZXRoLCAodm9pZCAqKWlkZCk7CisJaW91bm1hcChpZGQtPnZtYSk7CisJcmVsZWFzZV9yZWdpb24oaWRkLT5wbWEsIElPQzNfUENJX1NJWkUpOworCisJLyogRGlzYWJsZSBJT0MzIGFuZCByZWxpbnF1aXNoICovCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJLyogUmVtb3ZlIGFuZCBmcmVlIGRyaXZlciBkYXRhICovCisJZG93bl93cml0ZSgmaW9jM19kZXZpY2VzX3J3c2VtKTsKKwlsaXN0X2RlbCgmaWRkLT5saXN0KTsKKwl1cF93cml0ZSgmaW9jM19kZXZpY2VzX3J3c2VtKTsKKwlrZnJlZShpZGQpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaW9jM19pZF90YWJsZVtdID0geworCXtQQ0lfVkVORE9SX0lEX1NHSSwgUENJX0RFVklDRV9JRF9TR0lfSU9DMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCisJezB9Cit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaW9jM19kcml2ZXIgPSB7CisJLm5hbWUgPSAiSU9DMyIsCisJLmlkX3RhYmxlID0gaW9jM19pZF90YWJsZSwKKwkucHJvYmUgPSBpb2MzX3Byb2JlLAorCS5yZW1vdmUgPSBpb2MzX3JlbW92ZSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpb2MzX2lkX3RhYmxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKgorICogTW9kdWxlIG1hbmFnZW1lbnQgKgorICoqKioqKioqKioqKioqKioqKioqKi8KKworLyogTW9kdWxlIGxvYWQgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGlvYzNfaW5pdCh2b2lkKQoreworCWlmIChpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSkKKwkJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmlvYzNfZHJpdmVyKTsKKwlyZXR1cm4gMDsKK30KKworLyogTW9kdWxlIHVubG9hZCAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IGlvYzNfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaW9jM19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpb2MzX2luaXQpOworbW9kdWxlX2V4aXQoaW9jM19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU3RhbmlzbGF3IFNrb3dyb25layA8c2t5bGFya0BsaW51eC1taXBzLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBmb3IgU0dJIElPQzMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChpb2MzX3JlZ2lzdGVyX3N1Ym1vZHVsZSk7CitFWFBPUlRfU1lNQk9MKGlvYzNfdW5yZWdpc3Rlcl9zdWJtb2R1bGUpOworRVhQT1JUX1NZTUJPTChpb2MzX2Fjayk7CitFWFBPUlRfU1lNQk9MKGlvYzNfZ3Bjcl9zZXQpOworRVhQT1JUX1NZTUJPTChpb2MzX2Rpc2FibGUpOworRVhQT1JUX1NZTUJPTChpb2MzX2VuYWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9LY29uZmlnIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzdkYmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpAQCAtMCwwICsxLDEwOSBAQAorIworIyBTUEkgZHJpdmVyIGNvbmZpZ3VyYXRpb24KKyMKKyMgTk9URTogIHRoZSByZWFzb24gdGhpcyBkb2Vzbid0IHNob3cgU1BJIHNsYXZlIHN1cHBvcnQgaXMgbW9zdGx5IHRoYXQKKyMgbm9ib2R5J3MgbmVlZGVkIGEgc2xhdmUgc2lkZSBBUEkgeWV0LiAgVGhlIG1hc3Rlci1yb2xlIEFQSSBpcyBub3QKKyMgZnVsbHkgYXBwcm9wcmlhdGUgdGhlcmUsIHNvIGl0J2QgbmVlZCBzb21lIHRob3VnaHQgdG8gZG8gd2VsbC4KKyMKK21lbnUgIlNQSSBzdXBwb3J0IgorCitjb25maWcgU1BJCisJYm9vbCAiU1BJIHN1cHBvcnQiCisJaGVscAorCSAgVGhlICJTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UiIGlzIGEgbG93IGxldmVsIHN5bmNocm9ub3VzCisJICBwcm90b2NvbC4gIENoaXBzIHRoYXQgc3VwcG9ydCBTUEkgY2FuIGhhdmUgZGF0YSB0cmFuc2ZlciByYXRlcworCSAgdXAgdG8gc2V2ZXJhbCB0ZW5zIG9mIE1iaXQvc2VjLiAgQ2hpcHMgYXJlIGFkZHJlc3NlZCB3aXRoIGEKKwkgIGNvbnRyb2xsZXIgYW5kIGEgY2hpcHNlbGVjdC4gIE1vc3QgU1BJIHNsYXZlcyBkb24ndCBzdXBwb3J0CisJICBkeW5hbWljIGRldmljZSBkaXNjb3Zlcnk7IHNvbWUgYXJlIGV2ZW4gd3JpdGUtb25seSBvciByZWFkLW9ubHkuCisKKwkgIFNQSSBpcyB3aWRlbHkgdXNlZCBieSBtaWNyb2NvbnRvbGxlcnMgdG8gdGFsayB3aXRoIHNlbnNvcnMsCisJICBlZXByb20gYW5kIGZsYXNoIG1lbW9yeSwgY29kZWNzIGFuZCB2YXJpb3VzIG90aGVyIGNvbnRyb2xsZXIKKwkgIGNoaXBzLCBhbmFsb2cgdG8gZGlnaXRhbCAoYW5kIGQtdG8tYSkgY29udmVydGVycywgYW5kIG1vcmUuCisJICBNTUMgYW5kIFNEIGNhcmRzIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyBTUEkgcHJvdG9jb2w7IGFuZCBmb3IKKwkgIERhdGFGbGFzaCBjYXJkcyB1c2VkIGluIE1NQyBzb2NrZXRzLCBTUEkgbXVzdCBhbHdheXMgYmUgdXNlZC4KKworCSAgU1BJIGlzIG9uZSBvZiBhIGZhbWlseSBvZiBzaW1pbGFyIHByb3RvY29scyB1c2luZyBhIGZvdXIgd2lyZQorCSAgaW50ZXJmYWNlIChzZWxlY3QsIGNsb2NrLCBkYXRhIGluLCBkYXRhIG91dCkgaW5jbHVkaW5nIE1pY3Jvd2lyZQorCSAgKGhhbGYgZHVwbGV4KSwgU1NQLCBTU0ksIGFuZCBQU1AuICBUaGlzIGRyaXZlciBmcmFtZXdvcmsgc2hvdWxkCisJICB3b3JrIHdpdGggbW9zdCBzdWNoIGRldmljZXMgYW5kIGNvbnRyb2xsZXJzLgorCitjb25maWcgU1BJX0RFQlVHCisJYm9vbGVhbiAiRGVidWcgc3VwcG9ydCBmb3IgU1BJIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBTUEkgJiYgREVCVUdfS0VSTkVMCisJaGVscAorCSAgU2F5ICJ5ZXMiIHRvIGVuYWJsZSBkZWJ1ZyBtZXNzYWdpbmcgKGxpa2UgZGV2X2RiZyBhbmQgcHJfZGVidWcpLAorCSAgc3lzZnMsIGFuZCBkZWJ1Z2ZzIHN1cHBvcnQgaW4gU1BJIGNvbnRyb2xsZXIgYW5kIHByb3RvY29sIGRyaXZlcnMuCisKKyMKKyMgTUFTVEVSIHNpZGUgLi4uIHRhbGtpbmcgdG8gZGlzY3JldGUgU1BJIHNsYXZlIGNoaXBzIGluY2x1ZGluZyBtaWNyb2NvbnRyb2xsZXJzCisjCisKK2NvbmZpZyBTUElfTUFTVEVSCisjCWJvb2xlYW4gIlNQSSBNYXN0ZXIgU3VwcG9ydCIKKwlib29sZWFuCisJZGVmYXVsdCBTUEkKKwloZWxwCisJICBJZiB5b3VyIHN5c3RlbSBoYXMgYW4gbWFzdGVyLWNhcGFibGUgU1BJIGNvbnRyb2xsZXIgKHdoaWNoCisJICBwcm92aWRlcyB0aGUgY2xvY2sgYW5kIGNoaXBzZWxlY3QpLCB5b3UgY2FuIGVuYWJsZSB0aGF0CisJICBjb250cm9sbGVyIGFuZCB0aGUgcHJvdG9jb2wgZHJpdmVycyBmb3IgdGhlIFNQSSBzbGF2ZSBjaGlwcworCSAgdGhhdCBhcmUgY29ubmVjdGVkLgorCitjb21tZW50ICJTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycyIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIKKworY29uZmlnIFNQSV9CSVRCQU5HCisJdHJpc3RhdGUgIkJpdGJhbmdpbmcgU1BJIG1hc3RlciIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgV2l0aCBhIGZldyBHUElPIHBpbnMsIHlvdXIgc3lzdGVtIGNhbiBiaXRiYW5nIHRoZSBTUEkgcHJvdG9jb2wuCisJICBTZWxlY3QgdGhpcyB0byBnZXQgU1BJIHN1cHBvcnQgdGhyb3VnaCBJL08gcGlucyAoR1BJTywgcGFyYWxsZWwKKwkgIHBvcnQsIGV0YykuICBPciwgc29tZSBzeXN0ZW1zJyBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVycyB1c2UKKwkgIHRoaXMgY29kZSB0byBtYW5hZ2UgdGhlIHBlci13b3JkIG9yIHBlci10cmFuc2ZlciBhY2Nlc3NlcyB0byB0aGUKKwkgIGhhcmR3YXJlIHNoaWZ0IHJlZ2lzdGVycy4KKworCSAgVGhpcyBpcyBsaWJyYXJ5IGNvZGUsIGFuZCBpcyBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIGJ5IGRyaXZlcnMgdGhhdAorCSAgbmVlZCBpdC4gIFlvdSBvbmx5IG5lZWQgdG8gc2VsZWN0IHRoaXMgZXhwbGljaXRseSB0byBzdXBwb3J0IGRyaXZlcgorCSAgbW9kdWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoaXMga2VybmVsIHRyZWUuCisKK2NvbmZpZyBTUElfQlVUVEVSRkxZCisJdHJpc3RhdGUgIlBhcmFsbGVsIHBvcnQgYWRhcHRlciBmb3IgQVZSIEJ1dHRlcmZseSAoREVWRUxPUE1FTlQpIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBQQVJQT1JUICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTUElfQklUQkFORworCWhlbHAKKwkgIFRoaXMgdXNlcyBhIGN1c3RvbSBwYXJhbGxlbCBwb3J0IGNhYmxlIHRvIGNvbm5lY3QgdG8gYW4gQVZSCisJICBCdXR0ZXJmbHkgPGh0dHA6Ly93d3cuYXRtZWwuY29tL3Byb2R1Y3RzL2F2ci9idXR0ZXJmbHk+LCBhbgorCSAgaW5leHBlbnNpdmUgYmF0dGVyeSBwb3dlcmVkIG1pY3JvY29udHJvbGxlciBldmFsdWF0aW9uIGJvYXJkLgorCSAgVGhpcyBzYW1lIGNhYmxlIGNhbiBiZSB1c2VkIHRvIGZsYXNoIG5ldyBmaXJtd2FyZS4KKworY29uZmlnIFNQSV9CVVRURVJGTFkKKwl0cmlzdGF0ZSAiUGFyYWxsZWwgcG9ydCBhZGFwdGVyIGZvciBBVlIgQnV0dGVyZmx5IChERVZFTE9QTUVOVCkiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIFBBUlBPUlQgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFNQSV9CSVRCQU5HCisJaGVscAorCSAgVGhpcyB1c2VzIGEgY3VzdG9tIHBhcmFsbGVsIHBvcnQgY2FibGUgdG8gY29ubmVjdCB0byBhbiBBVlIKKwkgIEJ1dHRlcmZseSA8aHR0cDovL3d3dy5hdG1lbC5jb20vcHJvZHVjdHMvYXZyL2J1dHRlcmZseT4sIGFuCisJICBpbmV4cGVuc2l2ZSBiYXR0ZXJ5IHBvd2VyZWQgbWljcm9jb250cm9sbGVyIGV2YWx1YXRpb24gYm9hcmQuCisJICBUaGlzIHNhbWUgY2FibGUgY2FuIGJlIHVzZWQgdG8gZmxhc2ggbmV3IGZpcm13YXJlLgorCisjCisjIEFkZCBuZXcgU1BJIG1hc3RlciBjb250cm9sbGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIgYWJvdmUgdGhpcyBsaW5lCisjCisKKworIworIyBUaGVyZSBhcmUgbG90cyBvZiBTUEkgZGV2aWNlIHR5cGVzLCB3aXRoIHNlbnNvcnMgYW5kIG1lbW9yeQorIyBiZWluZyBwcm9iYWJseSB0aGUgbW9zdCB3aWRlbHkgdXNlZCBvbmVzLgorIworY29tbWVudCAiU1BJIFByb3RvY29sIE1hc3RlcnMiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSCisKKworIworIyBBZGQgbmV3IFNQSSBwcm90b2NvbCBtYXN0ZXJzIGluIGFscGhhYmV0aWNhbCBvcmRlciBhYm92ZSB0aGlzIGxpbmUKKyMKKworCisjIChzbGF2ZSBzdXBwb3J0IHdvdWxkIGdvIGhlcmUpCisKK2VuZG1lbnUgIyAiU1BJIHN1cHBvcnQiCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL01ha2VmaWxlIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjODdlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGtlcm5lbCBTUEkgZHJpdmVycy4KKyMKKworaWZlcSAoJChDT05GSUdfU1BJX0RFQlVHKSx5KQorRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKK2VuZGlmCisKKyMgc21hbGwgY29yZSwgbW9zdGx5IHRyYW5zbGF0aW5nIGJvYXJkLXNwZWNpZmljCisjIGNvbmZpZyBkZWNsYXJhdGlvbnMgaW50byBkcml2ZXIgbW9kZWwgY29kZQorb2JqLSQoQ09ORklHX1NQSV9NQVNURVIpCQkrPSBzcGkubworCisjIFNQSSBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXJzIChidXMpCitvYmotJChDT05GSUdfU1BJX0JJVEJBTkcpCQkrPSBzcGlfYml0YmFuZy5vCitvYmotJChDT05GSUdfU1BJX0JVVFRFUkZMWSkJCSs9IHNwaV9idXR0ZXJmbHkubworIyAJLi4uIGFkZCBhYm92ZSB0aGlzIGxpbmUgLi4uCisKKyMgU1BJIHByb3RvY29sIGRyaXZlcnMgKGRldmljZS9saW5rIG9uIGJ1cykKKyMgCS4uLiBhZGQgYWJvdmUgdGhpcyBsaW5lIC4uLgorCisjIFNQSSBzbGF2ZSBjb250cm9sbGVyIGRyaXZlcnMgKHVwc3RyZWFtIGxpbmspCisjIAkuLi4gYWRkIGFib3ZlIHRoaXMgbGluZSAuLi4KKworIyBTUEkgc2xhdmUgZHJpdmVycyAocHJvdG9jb2wgZm9yIHRoYXQgbGluaykKKyMgCS4uLiBhZGQgYWJvdmUgdGhpcyBsaW5lIC4uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTFjNGRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTAsMCArMSw2NDIgQEAKKy8qCisgKiBzcGkuYyAtIFNQSSBpbml0L2NvcmUgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hdXRvY29uZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworCisvKiBTUEkgYnVzdHlwZSBhbmQgc3BpX21hc3RlciBjbGFzcyBhcmUgcmVnaXN0ZXJlZCBhZnRlciBib2FyZCBpbml0IGNvZGUKKyAqIHByb3ZpZGVzIHRoZSBTUEkgZGV2aWNlIHRhYmxlcywgZW5zdXJpbmcgdGhhdCBib3RoIGFyZSBwcmVzZW50IGJ5IHRoZQorICogdGltZSBjb250cm9sbGVyIGRyaXZlciByZWdpc3RyYXRpb24gY2F1c2VzIHNwaV9kZXZpY2VzIHRvICJlbnVtZXJhdGUiLgorICovCitzdGF0aWMgdm9pZCBzcGlkZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKworCS8qIHNwaSBtYXN0ZXJzIG1heSBjbGVhbnVwIGZvciByZWxlYXNlZCBkZXZpY2VzICovCisJaWYgKHNwaS0+bWFzdGVyLT5jbGVhbnVwKQorCQlzcGktPm1hc3Rlci0+Y2xlYW51cChzcGkpOworCisJc3BpX21hc3Rlcl9wdXQoc3BpLT5tYXN0ZXIpOworCWtmcmVlKGRldik7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cittb2RhbGlhc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmEsIGNoYXIgKmJ1ZikKK3sKKwljb25zdCBzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgQlVTX0lEX1NJWkUgKyAxLCAiJXNcbiIsIHNwaS0+bW9kYWxpYXMpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc3BpX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhtb2RhbGlhcyksCisJX19BVFRSX05VTEwsCit9OworCisvKiBtb2RhbGlhcyBzdXBwb3J0IG1ha2VzICJtb2Rwcm9iZSAkTU9EQUxJQVMiIG5ldy1zdHlsZSBob3RwbHVnIHdvcmssCisgKiBhbmQgdGhlIHN5c2ZzIHZlcnNpb24gbWFrZXMgY29sZHBsdWcgd29yayB0b28uCisgKi8KKworc3RhdGljIGludCBzcGlfbWF0Y2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwljb25zdCBzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCisJcmV0dXJuIHN0cm5jbXAoc3BpLT5tb2RhbGlhcywgZHJ2LT5uYW1lLCBCVVNfSURfU0laRSkgPT0gMDsKK30KKworc3RhdGljIGludCBzcGlfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwKKwkJY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCit7CisJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UJCSpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisKKwllbnZwWzBdID0gYnVmZmVyOworCXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICJNT0RBTElBUz0lcyIsIHNwaS0+bW9kYWxpYXMpOworCWVudnBbMV0gPSBOVUxMOworCXJldHVybiAwOworfQorCisjaWZkZWYJQ09ORklHX1BNCisKKy8qCisgKiBOT1RFOiAgdGhlIHN1c3BlbmQoKSBtZXRob2QgZm9yIGFuIHNwaV9tYXN0ZXIgY29udHJvbGxlciBkcml2ZXIKKyAqIHNob3VsZCB2ZXJpZnkgdGhhdCBhbGwgaXRzIGNoaWxkIGRldmljZXMgYXJlIG1hcmtlZCBhcyBzdXNwZW5kZWQ7CisgKiBzdXNwZW5kIHJlcXVlc3RzIGRlbGl2ZXJlZCB0aHJvdWdoIHN5c2ZzIHBvd2VyL3N0YXRlIGZpbGVzIGRvbid0CisgKiBlbmZvcmNlIHN1Y2ggY29uc3RyYWludHMuCisgKi8KK3N0YXRpYyBpbnQgc3BpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlpbnQJCQl2YWx1ZTsKKwlzdHJ1Y3Qgc3BpX2RyaXZlcgkqZHJ2ID0gdG9fc3BpX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlpZiAoIWRydi0+c3VzcGVuZCkKKwkJcmV0dXJuIDA7CisKKwkvKiBzdXNwZW5kIHdpbGwgc3RvcCBpcnFzIGFuZCBkbWE7IG5vIG1vcmUgaS9vICovCisJdmFsdWUgPSBkcnYtPnN1c3BlbmQodG9fc3BpX2RldmljZShkZXYpLCBtZXNzYWdlKTsKKwlpZiAodmFsdWUgPT0gMCkKKwkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IG1lc3NhZ2U7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IHNwaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludAkJCXZhbHVlOworCXN0cnVjdCBzcGlfZHJpdmVyCSpkcnYgPSB0b19zcGlfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKworCWlmICghZHJ2LT5yZXN1bWUpCisJCXJldHVybiAwOworCisJLyogcmVzdW1lIG1heSByZXN0YXJ0IHRoZSBpL28gcXVldWUgKi8KKwl2YWx1ZSA9IGRydi0+cmVzdW1lKHRvX3NwaV9kZXZpY2UoZGV2KSk7CisJaWYgKHZhbHVlID09IDApCisJCWRldi0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOworCXJldHVybiB2YWx1ZTsKK30KKworI2Vsc2UKKyNkZWZpbmUgc3BpX3N1c3BlbmQJTlVMTAorI2RlZmluZSBzcGlfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitzdHJ1Y3QgYnVzX3R5cGUgc3BpX2J1c190eXBlID0geworCS5uYW1lCQk9ICJzcGkiLAorCS5kZXZfYXR0cnMJPSBzcGlfZGV2X2F0dHJzLAorCS5tYXRjaAkJPSBzcGlfbWF0Y2hfZGV2aWNlLAorCS51ZXZlbnQJCT0gc3BpX3VldmVudCwKKwkuc3VzcGVuZAk9IHNwaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc3BpX3Jlc3VtZSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfYnVzX3R5cGUpOworCisKK3N0YXRpYyBpbnQgc3BpX2Rydl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IHNwaV9kcml2ZXIJCSpzZHJ2ID0gdG9fc3BpX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlyZXR1cm4gc2Rydi0+cHJvYmUodG9fc3BpX2RldmljZShkZXYpKTsKK30KKworc3RhdGljIGludCBzcGlfZHJ2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IHNwaV9kcml2ZXIJCSpzZHJ2ID0gdG9fc3BpX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlyZXR1cm4gc2Rydi0+cmVtb3ZlKHRvX3NwaV9kZXZpY2UoZGV2KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNwaV9kcnZfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBzcGlfZHJpdmVyCQkqc2RydiA9IHRvX3NwaV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJc2Rydi0+c2h1dGRvd24odG9fc3BpX2RldmljZShkZXYpKTsKK30KKworaW50IHNwaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNwaV9kcml2ZXIgKnNkcnYpCit7CisJc2Rydi0+ZHJpdmVyLmJ1cyA9ICZzcGlfYnVzX3R5cGU7CisJaWYgKHNkcnYtPnByb2JlKQorCQlzZHJ2LT5kcml2ZXIucHJvYmUgPSBzcGlfZHJ2X3Byb2JlOworCWlmIChzZHJ2LT5yZW1vdmUpCisJCXNkcnYtPmRyaXZlci5yZW1vdmUgPSBzcGlfZHJ2X3JlbW92ZTsKKwlpZiAoc2Rydi0+c2h1dGRvd24pCisJCXNkcnYtPmRyaXZlci5zaHV0ZG93biA9IHNwaV9kcnZfc2h1dGRvd247CisJcmV0dXJuIGRyaXZlcl9yZWdpc3Rlcigmc2Rydi0+ZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9yZWdpc3Rlcl9kcml2ZXIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTUEkgZGV2aWNlcyBzaG91bGQgbm9ybWFsbHkgbm90IGJlIGNyZWF0ZWQgYnkgU1BJIGRldmljZSBkcml2ZXJzOyB0aGF0CisgKiB3b3VsZCBtYWtlIHRoZW0gYm9hcmQtc3BlY2lmaWMuICBTaW1pbGFybHkgd2l0aCBTUEkgbWFzdGVyIGRyaXZlcnMuCisgKiBEZXZpY2UgcmVnaXN0cmF0aW9uIG5vcm1hbGx5IGdvZXMgaW50byBsaWtlIGFyY2gvLi4uL21hY2guLi4vYm9hcmQtWVlZLmMKKyAqIHdpdGggb3RoZXIgcmVhZG9ubHkgKGZsYXNoYWJsZSkgaW5mb3JtYXRpb24gYWJvdXQgbWFpbmJvYXJkIGRldmljZXMuCisgKi8KKworc3RydWN0IGJvYXJkaW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXVuc2lnbmVkCQluX2JvYXJkX2luZm87CisJc3RydWN0IHNwaV9ib2FyZF9pbmZvCWJvYXJkX2luZm9bMF07Cit9OworCitzdGF0aWMgTElTVF9IRUFEKGJvYXJkX2xpc3QpOworc3RhdGljIERFQ0xBUkVfTVVURVgoYm9hcmRfbG9jayk7CisKKworLyogT24gdHlwaWNhbCBtYWluYm9hcmRzLCB0aGlzIGlzIHB1cmVseSBpbnRlcm5hbDsgYW5kIGl0J3Mgbm90IG5lZWRlZAorICogYWZ0ZXIgYm9hcmQgaW5pdCBjcmVhdGVzIHRoZSBoYXJkLXdpcmVkIGRldmljZXMuICBTb21lIGRldmVsb3BtZW50CisgKiBwbGF0Zm9ybXMgbWF5IG5vdCBiZSBhYmxlIHRvIHVzZSBzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyB0aG91Z2gsIGFuZAorICogdGhpcyBpcyBleHBvcnRlZCBzbyB0aGF0IGZvciBleGFtcGxlIGEgVVNCIG9yIHBhcnBvcnQgYmFzZWQgYWRhcHRlcgorICogZHJpdmVyIGNvdWxkIGFkZCBkZXZpY2VzICh3aGljaCBpdCB3b3VsZCBsZWFybiBhYm91dCBvdXQtb2YtYmFuZCkuCisgKi8KK3N0cnVjdCBzcGlfZGV2aWNlICpfX2luaXRfb3JfbW9kdWxlCitzcGlfbmV3X2RldmljZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKmNoaXApCit7CisJc3RydWN0IHNwaV9kZXZpY2UJKnByb3h5OworCXN0cnVjdCBkZXZpY2UJCSpkZXYgPSBtYXN0ZXItPmNkZXYuZGV2OworCWludAkJCXN0YXR1czsKKworCS8qIE5PVEU6ICBjYWxsZXIgZGlkIGFueSBjaGlwLT5idXNfbnVtIGNoZWNrcyBuZWNlc3NhcnkgKi8KKworCWlmICghc3BpX21hc3Rlcl9nZXQobWFzdGVyKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwcm94eSA9IGt6YWxsb2Moc2l6ZW9mICpwcm94eSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcm94eSkgeworCQlkZXZfZXJyKGRldiwgImNhbid0IGFsbG9jIGRldiBmb3IgY3MlZFxuIiwKKwkJCWNoaXAtPmNoaXBfc2VsZWN0KTsKKwkJZ290byBmYWlsOworCX0KKwlwcm94eS0+bWFzdGVyID0gbWFzdGVyOworCXByb3h5LT5jaGlwX3NlbGVjdCA9IGNoaXAtPmNoaXBfc2VsZWN0OworCXByb3h5LT5tYXhfc3BlZWRfaHogPSBjaGlwLT5tYXhfc3BlZWRfaHo7CisJcHJveHktPmlycSA9IGNoaXAtPmlycTsKKwlwcm94eS0+bW9kYWxpYXMgPSBjaGlwLT5tb2RhbGlhczsKKworCXNucHJpbnRmKHByb3h5LT5kZXYuYnVzX2lkLCBzaXplb2YgcHJveHktPmRldi5idXNfaWQsCisJCQkiJXMuJXUiLCBtYXN0ZXItPmNkZXYuY2xhc3NfaWQsCisJCQljaGlwLT5jaGlwX3NlbGVjdCk7CisJcHJveHktPmRldi5wYXJlbnQgPSBkZXY7CisJcHJveHktPmRldi5idXMgPSAmc3BpX2J1c190eXBlOworCXByb3h5LT5kZXYucGxhdGZvcm1fZGF0YSA9ICh2b2lkICopIGNoaXAtPnBsYXRmb3JtX2RhdGE7CisJcHJveHktPmNvbnRyb2xsZXJfZGF0YSA9IGNoaXAtPmNvbnRyb2xsZXJfZGF0YTsKKwlwcm94eS0+Y29udHJvbGxlcl9zdGF0ZSA9IE5VTEw7CisJcHJveHktPmRldi5yZWxlYXNlID0gc3BpZGV2X3JlbGVhc2U7CisKKwkvKiBkcml2ZXJzIG1heSBtb2RpZnkgdGhpcyBkZWZhdWx0IGkvbyBzZXR1cCAqLworCXN0YXR1cyA9IG1hc3Rlci0+c2V0dXAocHJveHkpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRldl9kYmcoZGV2LCAiY2FuJ3QgJXMgJXMsIHN0YXR1cyAlZFxuIiwKKwkJCQkic2V0dXAiLCBwcm94eS0+ZGV2LmJ1c19pZCwgc3RhdHVzKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIGRyaXZlciBjb3JlIGNhdGNoZXMgY2FsbGVycyB0aGF0IG1pc2JlaGF2ZSBieSBkZWZpbmluZworCSAqIGRldmljZXMgdGhhdCBhbHJlYWR5IGV4aXN0LgorCSAqLworCXN0YXR1cyA9IGRldmljZV9yZWdpc3RlcigmcHJveHktPmRldik7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJZGV2X2RiZyhkZXYsICJjYW4ndCAlcyAlcywgc3RhdHVzICVkXG4iLAorCQkJCSJhZGQiLCBwcm94eS0+ZGV2LmJ1c19pZCwgc3RhdHVzKTsKKwkJZ290byBmYWlsOworCX0KKwlkZXZfZGJnKGRldiwgInJlZ2lzdGVyZWQgY2hpbGQgJXNcbiIsIHByb3h5LT5kZXYuYnVzX2lkKTsKKwlyZXR1cm4gcHJveHk7CisKK2ZhaWw6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlrZnJlZShwcm94eSk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfbmV3X2RldmljZSk7CisKKy8qCisgKiBCb2FyZC1zcGVjaWZpYyBlYXJseSBpbml0IGNvZGUgY2FsbHMgdGhpcyAocHJvYmFibHkgZHVyaW5nIGFyY2hfaW5pdGNhbGwpCisgKiB3aXRoIHNlZ21lbnRzIG9mIHRoZSBTUEkgZGV2aWNlIHRhYmxlLiAgQW55IGRldmljZSBub2RlcyBhcmUgY3JlYXRlZCBsYXRlciwKKyAqIGFmdGVyIHRoZSByZWxldmFudCBwYXJlbnQgU1BJIGNvbnRyb2xsZXIgKGJ1c19udW0pIGlzIGRlZmluZWQuICBXZSBrZWVwCisgKiB0aGlzIHRhYmxlIG9mIGRldmljZXMgZm9yZXZlciwgc28gdGhhdCByZWxvYWRpbmcgYSBjb250cm9sbGVyIGRyaXZlciB3aWxsCisgKiBub3QgbWFrZSBMaW51eCBmb3JnZXQgYWJvdXQgdGhlc2UgaGFyZC13aXJlZCBkZXZpY2VzLgorICoKKyAqIE90aGVyIGNvZGUgY2FuIGFsc28gY2FsbCB0aGlzLCBlLmcuIGEgcGFydGljdWxhciBhZGQtb24gYm9hcmQgbWlnaHQgcHJvdmlkZQorICogU1BJIGRldmljZXMgdGhyb3VnaCBpdHMgZXhwYW5zaW9uIGNvbm5lY3Rvciwgc28gY29kZSBpbml0aWFsaXppbmcgdGhhdCBib2FyZAorICogd291bGQgbmF0dXJhbGx5IGRlY2xhcmUgaXRzIFNQSSBkZXZpY2VzLgorICoKKyAqIFRoZSBib2FyZCBpbmZvIHBhc3NlZCBjYW4gc2FmZWx5IGJlIF9faW5pdGRhdGEgLi4uIGJ1dCBiZSBjYXJlZnVsIG9mCisgKiBhbnkgZW1iZWRkZWQgcG9pbnRlcnMgKHBsYXRmb3JtX2RhdGEsIGV0YyksIHRoZXkncmUgY29waWVkIGFzLWlzLgorICovCitpbnQgX19pbml0CitzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gY29uc3QgKmluZm8sIHVuc2lnbmVkIG4pCit7CisJc3RydWN0IGJvYXJkaW5mbwkqYmk7CisKKwliaSA9IGttYWxsb2Moc2l6ZW9mKCpiaSkgKyBuICogc2l6ZW9mICppbmZvLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJpKQorCQlyZXR1cm4gLUVOT01FTTsKKwliaS0+bl9ib2FyZF9pbmZvID0gbjsKKwltZW1jcHkoYmktPmJvYXJkX2luZm8sIGluZm8sIG4gKiBzaXplb2YgKmluZm8pOworCisJZG93bigmYm9hcmRfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmYmktPmxpc3QsICZib2FyZF9saXN0KTsKKwl1cCgmYm9hcmRfbG9jayk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyk7CisKKy8qIEZJWE1FIHNvbWVvbmUgc2hvdWxkIGFkZCBzdXBwb3J0IGZvciBhIF9fc2V0dXAoInNwaSIsIC4uLikgdGhhdAorICogY3JlYXRlcyBib2FyZCBpbmZvIGZyb20ga2VybmVsIGNvbW1hbmQgbGluZXMKKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXRfb3JfbW9kdWxlCitzY2FuX2JvYXJkaW5mbyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCXN0cnVjdCBib2FyZGluZm8JKmJpOworCXN0cnVjdCBkZXZpY2UJCSpkZXYgPSBtYXN0ZXItPmNkZXYuZGV2OworCisJZG93bigmYm9hcmRfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShiaSwgJmJvYXJkX2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IHNwaV9ib2FyZF9pbmZvCSpjaGlwID0gYmktPmJvYXJkX2luZm87CisJCXVuc2lnbmVkCQluOworCisJCWZvciAobiA9IGJpLT5uX2JvYXJkX2luZm87IG4gPiAwOyBuLS0sIGNoaXArKykgeworCQkJaWYgKGNoaXAtPmJ1c19udW0gIT0gbWFzdGVyLT5idXNfbnVtKQorCQkJCWNvbnRpbnVlOworCQkJLyogc29tZSBjb250cm9sbGVycyBvbmx5IGhhdmUgb25lIGNoaXAsIHNvIHRoZXkKKwkJCSAqIG1pZ2h0IG5vdCB1c2UgY2hpcHNlbGVjdHMuICBvdGhlcndpc2UsIHRoZQorCQkJICogY2hpcHNlbGVjdHMgYXJlIG51bWJlcmVkIDAuLm1heC4KKwkJCSAqLworCQkJaWYgKGNoaXAtPmNoaXBfc2VsZWN0ID49IG1hc3Rlci0+bnVtX2NoaXBzZWxlY3QKKwkJCQkJJiYgbWFzdGVyLT5udW1fY2hpcHNlbGVjdCkgeworCQkJCWRldl9kYmcoZGV2LCAiY3MlZCA+IG1heCAlZFxuIiwKKwkJCQkJY2hpcC0+Y2hpcF9zZWxlY3QsCisJCQkJCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJKHZvaWQpIHNwaV9uZXdfZGV2aWNlKG1hc3RlciwgY2hpcCk7CisJCX0KKwl9CisJdXAoJmJvYXJkX2xvY2spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBzcGlfbWFzdGVyX3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCisJbWFzdGVyID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCBzcGlfbWFzdGVyLCBjZGV2KTsKKwlrZnJlZShtYXN0ZXIpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzIHNwaV9tYXN0ZXJfY2xhc3MgPSB7CisJLm5hbWUJCT0gInNwaV9tYXN0ZXIiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVsZWFzZQk9IHNwaV9tYXN0ZXJfcmVsZWFzZSwKK307CisKKworLyoqCisgKiBzcGlfYWxsb2NfbWFzdGVyIC0gYWxsb2NhdGUgU1BJIG1hc3RlciBjb250cm9sbGVyCisgKiBAZGV2OiB0aGUgY29udHJvbGxlciwgcG9zc2libHkgdXNpbmcgdGhlIHBsYXRmb3JtX2J1cworICogQHNpemU6IGhvdyBtdWNoIGRyaXZlci1wcml2YXRlIGRhdGEgdG8gcHJlYWxsb2NhdGU7IHRoZSBwb2ludGVyIHRvIHRoaXMKKyAqIAltZW1vcnkgaXMgaW4gdGhlIGNsYXNzX2RhdGEgZmllbGQgb2YgdGhlIHJldHVybmVkIGNsYXNzX2RldmljZSwKKyAqCWFjY2Vzc2libGUgd2l0aCBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKCkuCisgKgorICogVGhpcyBjYWxsIGlzIHVzZWQgb25seSBieSBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVycywgd2hpY2ggYXJlIHRoZQorICogb25seSBvbmVzIGRpcmVjdGx5IHRvdWNoaW5nIGNoaXAgcmVnaXN0ZXJzLiAgSXQncyBob3cgdGhleSBhbGxvY2F0ZQorICogYW4gc3BpX21hc3RlciBzdHJ1Y3R1cmUsIHByaW9yIHRvIGNhbGxpbmcgc3BpX2FkZF9tYXN0ZXIoKS4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGZyb20gY29udGV4dCB0aGF0IGNhbiBzbGVlcC4gIEl0IHJldHVybnMgdGhlIFNQSQorICogbWFzdGVyIHN0cnVjdHVyZSBvbiBzdWNjZXNzLCBlbHNlIE5VTEwuCisgKgorICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYXNzaWduaW5nIHRoZSBidXMgbnVtYmVyIGFuZCBpbml0aWFsaXppbmcKKyAqIHRoZSBtYXN0ZXIncyBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHNwaV9hZGRfbWFzdGVyKCk7IGFuZCAoYWZ0ZXIgZXJyb3JzCisgKiBhZGRpbmcgdGhlIGRldmljZSkgY2FsbGluZyBzcGlfbWFzdGVyX3B1dCgpIHRvIHByZXZlbnQgYSBtZW1vcnkgbGVhay4KKyAqLworc3RydWN0IHNwaV9tYXN0ZXIgKiBfX2luaXRfb3JfbW9kdWxlCitzcGlfYWxsb2NfbWFzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJbWFzdGVyID0ga3phbGxvYyhzaXplICsgc2l6ZW9mICptYXN0ZXIsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuIE5VTEw7CisKKwljbGFzc19kZXZpY2VfaW5pdGlhbGl6ZSgmbWFzdGVyLT5jZGV2KTsKKwltYXN0ZXItPmNkZXYuY2xhc3MgPSAmc3BpX21hc3Rlcl9jbGFzczsKKwltYXN0ZXItPmNkZXYuZGV2ID0gZ2V0X2RldmljZShkZXYpOworCXNwaV9tYXN0ZXJfc2V0X2RldmRhdGEobWFzdGVyLCAmbWFzdGVyWzFdKTsKKworCXJldHVybiBtYXN0ZXI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfYWxsb2NfbWFzdGVyKTsKKworLyoqCisgKiBzcGlfcmVnaXN0ZXJfbWFzdGVyIC0gcmVnaXN0ZXIgU1BJIG1hc3RlciBjb250cm9sbGVyCisgKiBAbWFzdGVyOiBpbml0aWFsaXplZCBtYXN0ZXIsIG9yaWdpbmFsbHkgZnJvbSBzcGlfYWxsb2NfbWFzdGVyKCkKKyAqCisgKiBTUEkgbWFzdGVyIGNvbnRyb2xsZXJzIGNvbm5lY3QgdG8gdGhlaXIgZHJpdmVycyB1c2luZyBzb21lIG5vbi1TUEkgYnVzLAorICogc3VjaCBhcyB0aGUgcGxhdGZvcm0gYnVzLiAgVGhlIGZpbmFsIHN0YWdlIG9mIHByb2JlKCkgaW4gdGhhdCBjb2RlCisgKiBpbmNsdWRlcyBjYWxsaW5nIHNwaV9yZWdpc3Rlcl9tYXN0ZXIoKSB0byBob29rIHVwIHRvIHRoaXMgU1BJIGJ1cyBnbHVlLgorICoKKyAqIFNQSSBjb250cm9sbGVycyB1c2UgYm9hcmQgc3BlY2lmaWMgKG9mdGVuIFNPQyBzcGVjaWZpYykgYnVzIG51bWJlcnMsCisgKiBhbmQgYm9hcmQtc3BlY2lmaWMgYWRkcmVzc2luZyBmb3IgU1BJIGRldmljZXMgY29tYmluZXMgdGhvc2UgbnVtYmVycworICogd2l0aCBjaGlwIHNlbGVjdCBudW1iZXJzLiAgU2luY2UgU1BJIGRvZXMgbm90IGRpcmVjdGx5IHN1cHBvcnQgZHluYW1pYworICogZGV2aWNlIGlkZW50aWZpY2F0aW9uLCBib2FyZHMgbmVlZCBjb25maWd1cmF0aW9uIHRhYmxlcyB0ZWxsaW5nIHdoaWNoCisgKiBjaGlwIGlzIGF0IHdoaWNoIGFkZHJlc3MuCisgKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIGNvbnRleHQgdGhhdCBjYW4gc2xlZXAuICBJdCByZXR1cm5zIHplcm8gb24KKyAqIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIChkcm9wcGluZyB0aGUgbWFzdGVyJ3MgcmVmY291bnQpLgorICogQWZ0ZXIgYSBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZworICogc3BpX3VucmVnaXN0ZXJfbWFzdGVyKCkuCisgKi8KK2ludCBfX2luaXRfb3JfbW9kdWxlCitzcGlfcmVnaXN0ZXJfbWFzdGVyKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJc3RhdGljIGF0b21pY190CQlkeW5fYnVzX2lkID0gQVRPTUlDX0lOSVQoMCk7CisJc3RydWN0IGRldmljZQkJKmRldiA9IG1hc3Rlci0+Y2Rldi5kZXY7CisJaW50CQkJc3RhdHVzID0gLUVOT0RFVjsKKwlpbnQJCQlkeW5hbWljID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGNvbnZlbnRpb246ICBkeW5hbWljYWxseSBhc3NpZ25lZCBidXMgSURzIGNvdW50IGRvd24gZnJvbSB0aGUgbWF4ICovCisJaWYgKG1hc3Rlci0+YnVzX251bSA9PSAwKSB7CisJCW1hc3Rlci0+YnVzX251bSA9IGF0b21pY19kZWNfcmV0dXJuKCZkeW5fYnVzX2lkKTsKKwkJZHluYW1pYyA9IDE7CisJfQorCisJLyogcmVnaXN0ZXIgdGhlIGRldmljZSwgdGhlbiB1c2Vyc3BhY2Ugd2lsbCBzZWUgaXQuCisJICogcmVnaXN0cmF0aW9uIGZhaWxzIGlmIHRoZSBidXMgSUQgaXMgaW4gdXNlLgorCSAqLworCXNucHJpbnRmKG1hc3Rlci0+Y2Rldi5jbGFzc19pZCwgc2l6ZW9mIG1hc3Rlci0+Y2Rldi5jbGFzc19pZCwKKwkJInNwaSV1IiwgbWFzdGVyLT5idXNfbnVtKTsKKwlzdGF0dXMgPSBjbGFzc19kZXZpY2VfYWRkKCZtYXN0ZXItPmNkZXYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGRvbmU7CisJZGV2X2RiZyhkZXYsICJyZWdpc3RlcmVkIG1hc3RlciAlcyVzXG4iLCBtYXN0ZXItPmNkZXYuY2xhc3NfaWQsCisJCQlkeW5hbWljID8gIiAoZHluYW1pYykiIDogIiIpOworCisJLyogcG9wdWxhdGUgY2hpbGRyZW4gZnJvbSBhbnkgc3BpIGRldmljZSB0YWJsZXMgKi8KKwlzY2FuX2JvYXJkaW5mbyhtYXN0ZXIpOworCXN0YXR1cyA9IDA7Citkb25lOgorCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfcmVnaXN0ZXJfbWFzdGVyKTsKKworCitzdGF0aWMgaW50IF9fdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnVudXNlZCkKK3sKKwkvKiBub3RlOiBiZWZvcmUgYWJvdXQgMi42LjE0LXJjMSB0aGlzIHdvdWxkIGNvcnJ1cHQgbWVtb3J5OiAqLworCXNwaV91bnJlZ2lzdGVyX2RldmljZSh0b19zcGlfZGV2aWNlKGRldikpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNwaV91bnJlZ2lzdGVyX21hc3RlciAtIHVucmVnaXN0ZXIgU1BJIG1hc3RlciBjb250cm9sbGVyCisgKiBAbWFzdGVyOiB0aGUgbWFzdGVyIGJlaW5nIHVucmVnaXN0ZXJlZAorICoKKyAqIFRoaXMgY2FsbCBpcyB1c2VkIG9ubHkgYnkgU1BJIG1hc3RlciBjb250cm9sbGVyIGRyaXZlcnMsIHdoaWNoIGFyZSB0aGUKKyAqIG9ubHkgb25lcyBkaXJlY3RseSB0b3VjaGluZyBjaGlwIHJlZ2lzdGVycy4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGZyb20gY29udGV4dCB0aGF0IGNhbiBzbGVlcC4KKyAqLwordm9pZCBzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwkodm9pZCkgZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKG1hc3Rlci0+Y2Rldi5kZXYsIE5VTEwsIF9fdW5yZWdpc3Rlcik7CisJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJm1hc3Rlci0+Y2Rldik7CisJbWFzdGVyLT5jZGV2LmRldiA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIpOworCisvKioKKyAqIHNwaV9idXNudW1fdG9fbWFzdGVyIC0gbG9vayB1cCBtYXN0ZXIgYXNzb2NpYXRlZCB3aXRoIGJ1c19udW0KKyAqIEBidXNfbnVtOiB0aGUgbWFzdGVyJ3MgYnVzIG51bWJlcgorICoKKyAqIFRoaXMgY2FsbCBtYXkgYmUgdXNlZCB3aXRoIGRldmljZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBhZnRlcgorICogYXJjaCBpbml0IHRpbWUuICBJdCByZXR1cm5zIGEgcmVmY291bnRlZCBwb2ludGVyIHRvIHRoZSByZWxldmFudAorICogc3BpX21hc3RlciAod2hpY2ggdGhlIGNhbGxlciBtdXN0IHJlbGVhc2UpLCBvciBOVUxMIGlmIHRoZXJlIGlzCisgKiBubyBzdWNoIG1hc3RlciByZWdpc3RlcmVkLgorICovCitzdHJ1Y3Qgc3BpX21hc3RlciAqc3BpX2J1c251bV90b19tYXN0ZXIodTE2IGJ1c19udW0pCit7CisJaWYgKGJ1c19udW0pIHsKKwkJY2hhcgkJCW5hbWVbOF07CisJCXN0cnVjdCBrb2JqZWN0CQkqYnVzOworCisJCXNucHJpbnRmKG5hbWUsIHNpemVvZiBuYW1lLCAic3BpJXUiLCBidXNfbnVtKTsKKwkJYnVzID0ga3NldF9maW5kX29iaigmc3BpX21hc3Rlcl9jbGFzcy5zdWJzeXMua3NldCwgbmFtZSk7CisJCWlmIChidXMpCisJCQlyZXR1cm4gY29udGFpbmVyX29mKGJ1cywgc3RydWN0IHNwaV9tYXN0ZXIsIGNkZXYua29iaik7CisJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2J1c251bV90b19tYXN0ZXIpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNwaV9jb21wbGV0ZSh2b2lkICphcmcpCit7CisJY29tcGxldGUoYXJnKTsKK30KKworLyoqCisgKiBzcGlfc3luYyAtIGJsb2NraW5nL3N5bmNocm9ub3VzIFNQSSBkYXRhIHRyYW5zZmVycworICogQHNwaTogZGV2aWNlIHdpdGggd2hpY2ggZGF0YSB3aWxsIGJlIGV4Y2hhbmdlZAorICogQG1lc3NhZ2U6IGRlc2NyaWJlcyB0aGUgZGF0YSB0cmFuc2ZlcnMKKyAqCisgKiBUaGlzIGNhbGwgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgY29udGV4dCB0aGF0IG1heSBzbGVlcC4gIFRoZSBzbGVlcAorICogaXMgbm9uLWludGVycnVwdGlibGUsIGFuZCBoYXMgbm8gdGltZW91dC4gIExvdy1vdmVyaGVhZCBjb250cm9sbGVyCisgKiBkcml2ZXJzIG1heSBETUEgZGlyZWN0bHkgaW50byBhbmQgb3V0IG9mIHRoZSBtZXNzYWdlIGJ1ZmZlcnMuCisgKgorICogTm90ZSB0aGF0IHRoZSBTUEkgZGV2aWNlJ3MgY2hpcCBzZWxlY3QgaXMgYWN0aXZlIGR1cmluZyB0aGUgbWVzc2FnZSwKKyAqIGFuZCB0aGVuIGlzIG5vcm1hbGx5IGRpc2FibGVkIGJldHdlZW4gbWVzc2FnZXMuICBEcml2ZXJzIGZvciBzb21lCisgKiBmcmVxdWVudGx5LXVzZWQgZGV2aWNlcyBtYXkgd2FudCB0byBtaW5pbWl6ZSBjb3N0cyBvZiBzZWxlY3RpbmcgYSBjaGlwLAorICogYnkgbGVhdmluZyBpdCBzZWxlY3RlZCBpbiBhbnRpY2lwYXRpb24gdGhhdCB0aGUgbmV4dCBtZXNzYWdlIHdpbGwgZ28KKyAqIHRvIHRoZSBzYW1lIGNoaXAuICAoVGhhdCBtYXkgaW5jcmVhc2UgcG93ZXIgdXNhZ2UuKQorICoKKyAqIEFsc28sIHRoZSBjYWxsZXIgaXMgZ3VhcmFudGVlaW5nIHRoYXQgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiBtZXNzYWdlIHdpbGwgbm90IGJlIGZyZWVkIGJlZm9yZSB0aGlzIGNhbGwgcmV0dXJucy4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiB0aGUgbWVzc2FnZSBjb3VsZCBub3QgYmUKKyAqIHN1Ym1pdHRlZCwgZWxzZSB6ZXJvLiAgV2hlbiB0aGUgdmFsdWUgaXMgemVybywgdGhlbiBtZXNzYWdlLT5zdGF0dXMgaXMKKyAqIGFsc28gZGVmaW5lZDogIGl0J3MgdGhlIGNvbXBsZXRpb24gY29kZSBmb3IgdGhlIHRyYW5zZmVyLCBlaXRoZXIgemVybworICogb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGZyb20gdGhlIGNvbnRyb2xsZXIgZHJpdmVyLgorICovCitpbnQgc3BpX3N5bmMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptZXNzYWdlKQoreworCURFQ0xBUkVfQ09NUExFVElPTihkb25lKTsKKwlpbnQgc3RhdHVzOworCisJbWVzc2FnZS0+Y29tcGxldGUgPSBzcGlfY29tcGxldGU7CisJbWVzc2FnZS0+Y29udGV4dCA9ICZkb25lOworCXN0YXR1cyA9IHNwaV9hc3luYyhzcGksIG1lc3NhZ2UpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmZG9uZSk7CisJbWVzc2FnZS0+Y29udGV4dCA9IE5VTEw7CisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9zeW5jKTsKKworI2RlZmluZQlTUElfQlVGU0laCShTTVBfQ0FDSEVfQllURVMpCisKK3N0YXRpYyB1OAkqYnVmOworCisvKioKKyAqIHNwaV93cml0ZV90aGVuX3JlYWQgLSBTUEkgc3luY2hyb25vdXMgd3JpdGUgZm9sbG93ZWQgYnkgcmVhZAorICogQHNwaTogZGV2aWNlIHdpdGggd2hpY2ggZGF0YSB3aWxsIGJlIGV4Y2hhbmdlZAorICogQHR4YnVmOiBkYXRhIHRvIGJlIHdyaXR0ZW4gKG5lZWQgbm90IGJlIGRtYS1zYWZlKQorICogQG5fdHg6IHNpemUgb2YgdHhidWYsIGluIGJ5dGVzCisgKiBAcnhidWY6IGJ1ZmZlciBpbnRvIHdoaWNoIGRhdGEgd2lsbCBiZSByZWFkCisgKiBAbl9yeDogc2l6ZSBvZiByeGJ1ZiwgaW4gYnl0ZXMgKG5lZWQgbm90IGJlIGRtYS1zYWZlKQorICoKKyAqIFRoaXMgcGVyZm9ybXMgYSBoYWxmIGR1cGxleCBNaWNyb1dpcmUgc3R5bGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUKKyAqIGRldmljZSwgc2VuZGluZyB0eGJ1ZiBhbmQgdGhlbiByZWFkaW5nIHJ4YnVmLiAgVGhlIHJldHVybiB2YWx1ZQorICogaXMgemVybyBmb3Igc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm5vIHN0YXR1cyBjb2RlLgorICogVGhpcyBjYWxsIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIGNvbnRleHQgdGhhdCBtYXkgc2xlZXAuCisgKgorICogUGFyYW1ldGVycyB0byB0aGlzIHJvdXRpbmUgYXJlIGFsd2F5cyBjb3BpZWQgdXNpbmcgYSBzbWFsbCBidWZmZXI7CisgKiBwZXJmb3JtYW5jZS1zZW5zaXRpdmUgb3IgYnVsayB0cmFuc2ZlciBjb2RlIHNob3VsZCBpbnN0ZWFkIHVzZQorICogc3BpX3thc3luYyxzeW5jfSgpIGNhbGxzIHdpdGggZG1hLXNhZmUgYnVmZmVycy4KKyAqLworaW50IHNwaV93cml0ZV90aGVuX3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJY29uc3QgdTggKnR4YnVmLCB1bnNpZ25lZCBuX3R4LAorCQl1OCAqcnhidWYsIHVuc2lnbmVkIG5fcngpCit7CisJc3RhdGljIERFQ0xBUkVfTVVURVgobG9jayk7CisKKwlpbnQJCQlzdGF0dXM7CisJc3RydWN0IHNwaV9tZXNzYWdlCW1lc3NhZ2U7CisJc3RydWN0IHNwaV90cmFuc2Zlcgl4WzJdOworCXU4CQkJKmxvY2FsX2J1ZjsKKworCS8qIFVzZSBwcmVhbGxvY2F0ZWQgRE1BLXNhZmUgYnVmZmVyLiAgV2UgY2FuJ3QgYXZvaWQgY29weWluZyBoZXJlLAorCSAqIChhcyBhIHB1cmUgY29udmVuaWVuY2UgdGhpbmcpLCBidXQgd2UgY2FuIGtlZXAgaGVhcCBjb3N0cworCSAqIG91dCBvZiB0aGUgaG90IHBhdGggLi4uCisJICovCisJaWYgKChuX3R4ICsgbl9yeCkgPiBTUElfQlVGU0laKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1lc3NhZ2UpOworCW1lbXNldCh4LCAwLCBzaXplb2YgeCk7CisJaWYgKG5fdHgpIHsKKwkJeFswXS5sZW4gPSBuX3R4OworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeFswXSwgJm1lc3NhZ2UpOworCX0KKwlpZiAobl9yeCkgeworCQl4WzFdLmxlbiA9IG5fcng7CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4WzFdLCAmbWVzc2FnZSk7CisJfQorCisJLyogLi4uIHVubGVzcyBzb21lb25lIGVsc2UgaXMgdXNpbmcgdGhlIHByZS1hbGxvY2F0ZWQgYnVmZmVyICovCisJaWYgKGRvd25fdHJ5bG9jaygmbG9jaykpIHsKKwkJbG9jYWxfYnVmID0ga21hbGxvYyhTUElfQlVGU0laLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFsb2NhbF9idWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UKKwkJbG9jYWxfYnVmID0gYnVmOworCisJbWVtY3B5KGxvY2FsX2J1ZiwgdHhidWYsIG5fdHgpOworCXhbMF0udHhfYnVmID0gbG9jYWxfYnVmOworCXhbMV0ucnhfYnVmID0gbG9jYWxfYnVmICsgbl90eDsKKworCS8qIGRvIHRoZSBpL28gKi8KKwlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJbWVtY3B5KHJ4YnVmLCB4WzFdLnJ4X2J1Ziwgbl9yeCk7CisJCXN0YXR1cyA9IG1lc3NhZ2Uuc3RhdHVzOworCX0KKworCWlmICh4WzBdLnR4X2J1ZiA9PSBidWYpCisJCXVwKCZsb2NrKTsKKwllbHNlCisJCWtmcmVlKGxvY2FsX2J1Zik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX3dyaXRlX3RoZW5fcmVhZCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19pbml0IHNwaV9pbml0KHZvaWQpCit7CisJaW50CXN0YXR1czsKKworCWJ1ZiA9IGttYWxsb2MoU1BJX0JVRlNJWiwgU0xBQl9LRVJORUwpOworCWlmICghYnVmKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZXJyMDsKKwl9CisKKwlzdGF0dXMgPSBidXNfcmVnaXN0ZXIoJnNwaV9idXNfdHlwZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyMTsKKworCXN0YXR1cyA9IGNsYXNzX3JlZ2lzdGVyKCZzcGlfbWFzdGVyX2NsYXNzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnIyOworCXJldHVybiAwOworCitlcnIyOgorCWJ1c191bnJlZ2lzdGVyKCZzcGlfYnVzX3R5cGUpOworZXJyMToKKwlrZnJlZShidWYpOworCWJ1ZiA9IE5VTEw7CitlcnIwOgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIGJvYXJkX2luZm8gaXMgbm9ybWFsbHkgcmVnaXN0ZXJlZCBpbiBhcmNoX2luaXRjYWxsKCksCisgKiBidXQgZXZlbiBlc3NlbnRpYWwgZHJpdmVycyB3YWl0IHRpbGwgbGF0ZXIKKyAqCisgKiBSRVZJU0lUIG9ubHkgYm9hcmRpbmZvIHJlYWxseSBuZWVkcyBzdGF0aWMgbGlua2luZy4gdGhlIHJlc3QgKGRldmljZSBhbmQKKyAqIGRyaXZlciByZWdpc3RyYXRpb24pIF9jb3VsZF8gYmUgZHluYW1pY2FsbHkgbGlua2VkIChtb2R1bGFyKSAuLi4gY29zdHMKKyAqIGluY2x1ZGUgbmVlZGluZyB0byBoYXZlIGJvYXJkaW5mbyBkYXRhIHN0cnVjdHVyZXMgYmUgbXVjaCBtb3JlIHB1YmxpYy4KKyAqLworc3Vic3lzX2luaXRjYWxsKHNwaV9pbml0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYyBiL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzN2U1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKQEAgLTAsMCArMSw0NzIgQEAKKy8qCisgKiBzcGlfYml0YmFuZy5jIC0gcG9sbGluZy9iaXRiYW5naW5nIFNQSSBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXIgdXRpbGl0aWVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEZJUlNUIFBBUlQgKE9QVElPTkFMKTogIHdvcmQtYXQtYS10aW1lIHNwaV90cmFuc2ZlciBzdXBwb3J0LgorICogVXNlIHRoaXMgZm9yIEdQSU8gb3Igc2hpZnQtcmVnaXN0ZXIgbGV2ZWwgaGFyZHdhcmUgQVBJcy4KKyAqCisgKiBzcGlfYml0YmFuZ19jcyBpcyBpbiBzcGlfZGV2aWNlLT5jb250cm9sbGVyX3N0YXRlLCB3aGljaCBpcyB1bmF2YWlsYWJsZQorICogdG8gZ2x1ZSBjb2RlLiAgVGhlc2UgYml0YmFuZyBzZXR1cCgpIGFuZCBjbGVhbnVwKCkgcm91dGluZXMgYXJlIGFsd2F5cworICogdXNlZCwgdGhvdWdoIG1heWJlIHRoZXkncmUgY2FsbGVkIGZyb20gY29udHJvbGxlci1hd2FyZSBjb2RlLgorICoKKyAqIGNoaXBzZWxlY3QoKSBhbmQgZnJpZW5kcyBtYXkgdXNlIHVzZSBzcGlfZGV2aWNlLT5jb250cm9sbGVyX2RhdGEgYW5kCisgKiBjb250cm9sbGVyIHJlZ2lzdGVycyBhcyBhcHByb3ByaWF0ZS4KKyAqCisgKgorICogTk9URTogIFNQSSBjb250cm9sbGVyIHBpbnMgY2FuIG9mdGVuIGJlIHVzZWQgYXMgR1BJTyBwaW5zIGluc3RlYWQsCisgKiB3aGljaCBtZWFucyB5b3UgY291bGQgdXNlIGEgYml0YmFuZyBkcml2ZXIgZWl0aGVyIHRvIGdldCBoYXJkd2FyZQorICogd29ya2luZyBxdWlja2x5LCBvciB0ZXN0aW5nIGZvciBkaWZmZXJlbmNlcyB0aGF0IGFyZW4ndCBzcGVlZCByZWxhdGVkLgorICovCisKK3N0cnVjdCBzcGlfYml0YmFuZ19jcyB7CisJdW5zaWduZWQJbnNlY3M7CS8qIChjbG9jayBjeWNsZSB0aW1lKS8yICovCisJdTMyCQkoKnR4cnhfd29yZCkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdW5zaWduZWQgbnNlY3MsCisJCQkJCXUzMiB3b3JkLCB1OCBiaXRzKTsKKwl1bnNpZ25lZAkoKnR4cnhfYnVmcykoc3RydWN0IHNwaV9kZXZpY2UgKiwKKwkJCQkJdTMyICgqdHhyeF93b3JkKSgKKwkJCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJCQl1bnNpZ25lZCBuc2VjcywKKwkJCQkJCXUzMiB3b3JkLCB1OCBiaXRzKSwKKwkJCQkJdW5zaWduZWQsIHN0cnVjdCBzcGlfdHJhbnNmZXIgKik7Cit9OworCitzdGF0aWMgdW5zaWduZWQgYml0YmFuZ190eHJ4XzgoCisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSwKKwl1MzIJCQkoKnR4cnhfd29yZCkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkJdW5zaWduZWQgbnNlY3MsCisJCQkJCXUzMiB3b3JkLCB1OCBiaXRzKSwKKwl1bnNpZ25lZAkJbnMsCisJc3RydWN0IHNwaV90cmFuc2ZlcgkqdAorKSB7CisJdW5zaWduZWQJCWJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7CisJdW5zaWduZWQJCWNvdW50ID0gdC0+bGVuOworCWNvbnN0IHU4CQkqdHggPSB0LT50eF9idWY7CisJdTgJCQkqcnggPSB0LT5yeF9idWY7CisKKwl3aGlsZSAobGlrZWx5KGNvdW50ID4gMCkpIHsKKwkJdTgJCXdvcmQgPSAwOworCisJCWlmICh0eCkKKwkJCXdvcmQgPSAqdHgrKzsKKwkJd29yZCA9IHR4cnhfd29yZChzcGksIG5zLCB3b3JkLCBiaXRzKTsKKwkJaWYgKHJ4KQorCQkJKnJ4KysgPSB3b3JkOworCQljb3VudCAtPSAxOworCX0KKwlyZXR1cm4gdC0+bGVuIC0gY291bnQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBiaXRiYW5nX3R4cnhfMTYoCisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSwKKwl1MzIJCQkoKnR4cnhfd29yZCkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkJdW5zaWduZWQgbnNlY3MsCisJCQkJCXUzMiB3b3JkLCB1OCBiaXRzKSwKKwl1bnNpZ25lZAkJbnMsCisJc3RydWN0IHNwaV90cmFuc2ZlcgkqdAorKSB7CisJdW5zaWduZWQJCWJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7CisJdW5zaWduZWQJCWNvdW50ID0gdC0+bGVuOworCWNvbnN0IHUxNgkJKnR4ID0gdC0+dHhfYnVmOworCXUxNgkJCSpyeCA9IHQtPnJ4X2J1ZjsKKworCXdoaWxlIChsaWtlbHkoY291bnQgPiAxKSkgeworCQl1MTYJCXdvcmQgPSAwOworCisJCWlmICh0eCkKKwkJCXdvcmQgPSAqdHgrKzsKKwkJd29yZCA9IHR4cnhfd29yZChzcGksIG5zLCB3b3JkLCBiaXRzKTsKKwkJaWYgKHJ4KQorCQkJKnJ4KysgPSB3b3JkOworCQljb3VudCAtPSAyOworCX0KKwlyZXR1cm4gdC0+bGVuIC0gY291bnQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBiaXRiYW5nX3R4cnhfMzIoCisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSwKKwl1MzIJCQkoKnR4cnhfd29yZCkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkJdW5zaWduZWQgbnNlY3MsCisJCQkJCXUzMiB3b3JkLCB1OCBiaXRzKSwKKwl1bnNpZ25lZAkJbnMsCisJc3RydWN0IHNwaV90cmFuc2ZlcgkqdAorKSB7CisJdW5zaWduZWQJCWJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7CisJdW5zaWduZWQJCWNvdW50ID0gdC0+bGVuOworCWNvbnN0IHUzMgkJKnR4ID0gdC0+dHhfYnVmOworCXUzMgkJCSpyeCA9IHQtPnJ4X2J1ZjsKKworCXdoaWxlIChsaWtlbHkoY291bnQgPiAzKSkgeworCQl1MzIJCXdvcmQgPSAwOworCisJCWlmICh0eCkKKwkJCXdvcmQgPSAqdHgrKzsKKwkJd29yZCA9IHR4cnhfd29yZChzcGksIG5zLCB3b3JkLCBiaXRzKTsKKwkJaWYgKHJ4KQorCQkJKnJ4KysgPSB3b3JkOworCQljb3VudCAtPSA0OworCX0KKwlyZXR1cm4gdC0+bGVuIC0gY291bnQ7Cit9CisKKy8qKgorICogc3BpX2JpdGJhbmdfc2V0dXAgLSBkZWZhdWx0IHNldHVwIGZvciBwZXItd29yZCBJL08gbG9vcHMKKyAqLworaW50IHNwaV9iaXRiYW5nX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHNwaV9iaXRiYW5nX2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcJKmJpdGJhbmc7CisKKwlpZiAoIXNwaS0+bWF4X3NwZWVkX2h6KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghY3MpIHsKKwkJY3MgPSBremFsbG9jKHNpemVvZiAqY3MsIFNMQUJfS0VSTkVMKTsKKwkJaWYgKCFjcykKKwkJCXJldHVybiAtRU5PTUVNOworCQlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBjczsKKwl9CisJYml0YmFuZyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJaWYgKCFzcGktPmJpdHNfcGVyX3dvcmQpCisJCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisKKwkvKiBzcGlfdHJhbnNmZXIgbGV2ZWwgY2FsbHMgdGhhdCB3b3JrIHBlci13b3JkICovCisJaWYgKHNwaS0+Yml0c19wZXJfd29yZCA8PSA4KQorCQljcy0+dHhyeF9idWZzID0gYml0YmFuZ190eHJ4Xzg7CisJZWxzZSBpZiAoc3BpLT5iaXRzX3Blcl93b3JkIDw9IDE2KQorCQljcy0+dHhyeF9idWZzID0gYml0YmFuZ190eHJ4XzE2OworCWVsc2UgaWYgKHNwaS0+Yml0c19wZXJfd29yZCA8PSAzMikKKwkJY3MtPnR4cnhfYnVmcyA9IGJpdGJhbmdfdHhyeF8zMjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJLyogcGVyLXdvcmQgc2hpZnQgcmVnaXN0ZXIgYWNjZXNzLCBpbiBoYXJkd2FyZSBvciBiaXRiYW5naW5nICovCisJY3MtPnR4cnhfd29yZCA9IGJpdGJhbmctPnR4cnhfd29yZFtzcGktPm1vZGUgJiAoU1BJX0NQT0x8U1BJX0NQSEEpXTsKKwlpZiAoIWNzLT50eHJ4X3dvcmQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogbnNlY3MgPSAoY2xvY2sgcGVyaW9kKS8yICovCisJY3MtPm5zZWNzID0gKDEwMDAwMDAwMDAvMikgLyAoc3BpLT5tYXhfc3BlZWRfaHopOworCWlmIChjcy0+bnNlY3MgPiBNQVhfVURFTEFZX01TICogMTAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgIiVzLCBtb2RlICVkLCAldSBiaXRzL3csICV1IG5zZWNcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHNwaS0+bW9kZSAmIChTUElfQ1BPTCB8IFNQSV9DUEhBKSwKKwkJCXNwaS0+Yml0c19wZXJfd29yZCwgMiAqIGNzLT5uc2Vjcyk7CisKKwkvKiBOT1RFIHdlIF9uZWVkXyB0byBjYWxsIGNoaXBzZWxlY3QoKSBlYXJseSwgaWRlYWxseSB3aXRoIGFkYXB0ZXIKKwkgKiBzZXR1cCwgdW5sZXNzIHRoZSBoYXJkd2FyZSBkZWZhdWx0cyBjb29wZXJhdGUgdG8gYXZvaWQgY29uZnVzaW9uCisJICogYmV0d2VlbiBub3JtYWwgKGFjdGl2ZSBsb3cpIGFuZCBpbnZlcnRlZCBjaGlwc2VsZWN0cy4KKwkgKi8KKworCS8qIGRlc2VsZWN0IGNoaXAgKGxvdyBvciBoaWdoKSAqLworCXNwaW5fbG9jaygmYml0YmFuZy0+bG9jayk7CisJaWYgKCFiaXRiYW5nLT5idXN5KSB7CisJCWJpdGJhbmctPmNoaXBzZWxlY3Qoc3BpLCBCSVRCQU5HX0NTX0lOQUNUSVZFKTsKKwkJbmRlbGF5KGNzLT5uc2Vjcyk7CisJfQorCXNwaW5fdW5sb2NrKCZiaXRiYW5nLT5sb2NrKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2JpdGJhbmdfc2V0dXApOworCisvKioKKyAqIHNwaV9iaXRiYW5nX2NsZWFudXAgLSBkZWZhdWx0IGNsZWFudXAgZm9yIHBlci13b3JkIEkvTyBsb29wcworICovCit2b2lkIHNwaV9iaXRiYW5nX2NsZWFudXAoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlrZnJlZShzcGktPmNvbnRyb2xsZXJfc3RhdGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2JpdGJhbmdfY2xlYW51cCk7CisKK3N0YXRpYyBpbnQgc3BpX2JpdGJhbmdfYnVmcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBzcGlfYml0YmFuZ19jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJdW5zaWduZWQJCW5zZWNzID0gY3MtPm5zZWNzOworCisJcmV0dXJuIGNzLT50eHJ4X2J1ZnMoc3BpLCBjcy0+dHhyeF93b3JkLCBuc2VjcywgdCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTRUNPTkQgUEFSVCAuLi4gc2ltcGxlIHRyYW5zZmVyIHF1ZXVlIHJ1bm5lci4KKyAqCisgKiBUaGlzIGNvc3RzIGEgdGFzayBjb250ZXh0IHBlciBjb250cm9sbGVyLCBydW5uaW5nIHRoZSBxdWV1ZSBieQorICogcGVyZm9ybWluZyBlYWNoIHRyYW5zZmVyIGluIHNlcXVlbmNlLiAgU21hcnRlciBoYXJkd2FyZSBjYW4gcXVldWUKKyAqIHNldmVyYWwgRE1BIHRyYW5zZmVycyBhdCBvbmNlLCBhbmQgcHJvY2VzcyBzZXZlcmFsIGNvbnRyb2xsZXIgcXVldWVzCisgKiBpbiBwYXJhbGxlbDsgdGhpcyBkcml2ZXIgZG9lc24ndCBtYXRjaCBzdWNoIGhhcmR3YXJlIHZlcnkgd2VsbC4KKyAqCisgKiBEcml2ZXJzIGNhbiBwcm92aWRlIHdvcmQtYXQtYS10aW1lIGkvbyBwcmltaXRpdmVzLCBvciBwcm92aWRlCisgKiB0cmFuc2Zlci1hdC1hLXRpbWUgb25lcyB0byBsZXZlcmFnZSBkbWEgb3IgZmlmbyBoYXJkd2FyZS4KKyAqLworc3RhdGljIHZvaWQgYml0YmFuZ193b3JrKHZvaWQgKl9iaXRiYW5nKQoreworCXN0cnVjdCBzcGlfYml0YmFuZwkqYml0YmFuZyA9IF9iaXRiYW5nOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJpdGJhbmctPmxvY2ssIGZsYWdzKTsKKwliaXRiYW5nLT5idXN5ID0gMTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmJpdGJhbmctPnF1ZXVlKSkgeworCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UJKm07CisJCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CisJCXVuc2lnbmVkCQluc2VjczsKKwkJc3RydWN0IHNwaV90cmFuc2ZlcgkqdCA9IE5VTEw7CisJCXVuc2lnbmVkCQl0bXA7CisJCXVuc2lnbmVkCQljc19jaGFuZ2U7CisJCWludAkJCXN0YXR1czsKKworCQltID0gY29udGFpbmVyX29mKGJpdGJhbmctPnF1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwKKwkJCQlxdWV1ZSk7CisJCWxpc3RfZGVsX2luaXQoJm0tPnF1ZXVlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0YmFuZy0+bG9jaywgZmxhZ3MpOworCisJCS8qIEZJWE1FIHRoaXMgaXMgbWFkZS11cCAuLi4gdGhlIGNvcnJlY3QgdmFsdWUgaXMga25vd24gdG8KKwkJICogd29yZC1hdC1hLXRpbWUgYml0YmFuZyBjb2RlLCBhbmQgcHJlc3VtYWJseSBjaGlwc2VsZWN0KCkKKwkJICogc2hvdWxkIGVuZm9yY2UgdGhlc2UgcmVxdWlyZW1lbnRzIHRvbz8KKwkJICovCisJCW5zZWNzID0gMTAwOworCisJCXNwaSA9IG0tPnNwaTsKKwkJdG1wID0gMDsKKwkJY3NfY2hhbmdlID0gMTsKKwkJc3RhdHVzID0gMDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5ICh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCQlpZiAoYml0YmFuZy0+c2h1dGRvd24pIHsKKwkJCQlzdGF0dXMgPSAtRVNIVVRET1dOOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBzZXQgdXAgZGVmYXVsdCBjbG9jayBwb2xhcml0eSwgYW5kIGFjdGl2YXRlIGNoaXA7CisJCQkgKiB0aGlzIGltcGxpY2l0bHkgdXBkYXRlcyBjbG9jayBhbmQgc3BpIG1vZGVzIGFzCisJCQkgKiBwcmV2aW91c2x5IHJlY29yZGVkIGZvciB0aGlzIGRldmljZSB2aWEgc2V0dXAoKS4KKwkJCSAqIChhbmQgYWxzbyBkZXNlbGVjdHMgYW55IG90aGVyIGNoaXAgdGhhdCBtaWdodCBiZQorCQkJICogc2VsZWN0ZWQgLi4uKQorCQkJICovCisJCQlpZiAoY3NfY2hhbmdlKSB7CisJCQkJYml0YmFuZy0+Y2hpcHNlbGVjdChzcGksIEJJVEJBTkdfQ1NfQUNUSVZFKTsKKwkJCQluZGVsYXkobnNlY3MpOworCQkJfQorCQkJY3NfY2hhbmdlID0gdC0+Y3NfY2hhbmdlOworCQkJaWYgKCF0LT50eF9idWYgJiYgIXQtPnJ4X2J1ZiAmJiB0LT5sZW4pIHsKKwkJCQlzdGF0dXMgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiB0cmFuc2ZlciBkYXRhLiAgdGhlIGxvd2VyIGxldmVsIGNvZGUgaGFuZGxlcyBhbnkKKwkJCSAqIG5ldyBkbWEgbWFwcGluZ3MgaXQgbmVlZHMuIG91ciBjYWxsZXIgYWx3YXlzIGdhdmUKKwkJCSAqIHVzIGRtYS1zYWZlIGJ1ZmZlcnMuCisJCQkgKi8KKwkJCWlmICh0LT5sZW4pIHsKKwkJCQkvKiBSRVZJU0lUIGRtYSBBUEkgc3RpbGwgbmVlZHMgYSBkZXNpZ25hdGVkCisJCQkJICogRE1BX0FERFJfSU5WQUxJRDsgfjAgbWlnaHQgYmUgYmV0dGVyLgorCQkJCSAqLworCQkJCWlmICghbS0+aXNfZG1hX21hcHBlZCkKKwkJCQkJdC0+cnhfZG1hID0gdC0+dHhfZG1hID0gMDsKKwkJCQlzdGF0dXMgPSBiaXRiYW5nLT50eHJ4X2J1ZnMoc3BpLCB0KTsKKwkJCX0KKwkJCWlmIChzdGF0dXMgIT0gdC0+bGVuKSB7CisJCQkJaWYgKHN0YXR1cyA+IDApCisJCQkJCXN0YXR1cyA9IC1FTVNHU0laRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW0tPmFjdHVhbF9sZW5ndGggKz0gc3RhdHVzOworCQkJc3RhdHVzID0gMDsKKworCQkJLyogcHJvdG9jb2wgdHdlYWtzIGJlZm9yZSBuZXh0IHRyYW5zZmVyICovCisJCQlpZiAodC0+ZGVsYXlfdXNlY3MpCisJCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKKworCQkJaWYgKCFjc19jaGFuZ2UpCisJCQkJY29udGludWU7CisJCQlpZiAodC0+dHJhbnNmZXJfbGlzdC5uZXh0ID09ICZtLT50cmFuc2ZlcnMpCisJCQkJYnJlYWs7CisKKwkJCS8qIHNvbWV0aW1lcyBhIHNob3J0IG1pZC1tZXNzYWdlIGRlc2VsZWN0IG9mIHRoZSBjaGlwCisJCQkgKiBtYXkgYmUgbmVlZGVkIHRvIHRlcm1pbmF0ZSBhIG1vZGUgb3IgY29tbWFuZAorCQkJICovCisJCQluZGVsYXkobnNlY3MpOworCQkJYml0YmFuZy0+Y2hpcHNlbGVjdChzcGksIEJJVEJBTkdfQ1NfSU5BQ1RJVkUpOworCQkJbmRlbGF5KG5zZWNzKTsKKwkJfQorCisJCW0tPnN0YXR1cyA9IHN0YXR1czsKKwkJbS0+Y29tcGxldGUobS0+Y29udGV4dCk7CisKKwkJLyogbm9ybWFsbHkgZGVhY3RpdmF0ZSBjaGlwc2VsZWN0IC4uLiB1bmxlc3Mgbm8gZXJyb3IgYW5kCisJCSAqIGNzX2NoYW5nZSBoYXMgaGludGVkIHRoYXQgdGhlIG5leHQgbWVzc2FnZSB3aWxsIHByb2JhYmx5CisJCSAqIGJlIGZvciB0aGlzIGNoaXAgdG9vLgorCQkgKi8KKwkJaWYgKCEoc3RhdHVzID09IDAgJiYgY3NfY2hhbmdlKSkgeworCQkJbmRlbGF5KG5zZWNzKTsKKwkJCWJpdGJhbmctPmNoaXBzZWxlY3Qoc3BpLCBCSVRCQU5HX0NTX0lOQUNUSVZFKTsKKwkJCW5kZWxheShuc2Vjcyk7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYml0YmFuZy0+bG9jaywgZmxhZ3MpOworCX0KKwliaXRiYW5nLT5idXN5ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogc3BpX2JpdGJhbmdfdHJhbnNmZXIgLSBkZWZhdWx0IHN1Ym1pdCB0byB0cmFuc2ZlciBxdWV1ZQorICovCitpbnQgc3BpX2JpdGJhbmdfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBzcGlfYml0YmFuZwkqYml0YmFuZzsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCW0tPmFjdHVhbF9sZW5ndGggPSAwOworCW0tPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKworCWJpdGJhbmcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlpZiAoYml0YmFuZy0+c2h1dGRvd24pCisJCXJldHVybiAtRVNIVVRET1dOOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJpdGJhbmctPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZtLT5xdWV1ZSwgJmJpdGJhbmctPnF1ZXVlKTsKKwlxdWV1ZV93b3JrKGJpdGJhbmctPndvcmtxdWV1ZSwgJmJpdGJhbmctPndvcmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdGJhbmctPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2JpdGJhbmdfdHJhbnNmZXIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIHNwaV9iaXRiYW5nX3N0YXJ0IC0gc3RhcnQgdXAgYSBwb2xsZWQvYml0YmFuZ2luZyBTUEkgbWFzdGVyIGRyaXZlcgorICogQGJpdGJhbmc6IGRyaXZlciBoYW5kbGUKKyAqCisgKiBDYWxsZXIgc2hvdWxkIGhhdmUgemVyby1pbml0aWFsaXplZCBhbGwgcGFydHMgb2YgdGhlIHN0cnVjdHVyZSwgYW5kIHRoZW4KKyAqIHByb3ZpZGVkIGNhbGxiYWNrcyBmb3IgY2hpcCBzZWxlY3Rpb24gYW5kIEkvTyBsb29wcy4gIElmIHRoZSBtYXN0ZXIgaGFzCisgKiBhIHRyYW5zZmVyIG1ldGhvZCwgaXRzIGZpbmFsIHN0ZXAgc2hvdWxkIGNhbGwgc3BpX2JpdGJhbmdfdHJhbnNmZXI7IG9yLAorICogdGhhdCdzIHRoZSBkZWZhdWx0IGlmIHRoZSB0cmFuc2ZlciByb3V0aW5lIGlzIG5vdCBpbml0aWFsaXplZC4gIEl0IHNob3VsZAorICogYWxzbyBzZXQgdXAgdGhlIGJ1cyBudW1iZXIgYW5kIG51bWJlciBvZiBjaGlwc2VsZWN0cy4KKyAqCisgKiBGb3IgaS9vIGxvb3BzLCBwcm92aWRlIGNhbGxiYWNrcyBlaXRoZXIgcGVyLXdvcmQgKGZvciBiaXRiYW5naW5nLCBvciBmb3IKKyAqIGhhcmR3YXJlIHRoYXQgYmFzaWNhbGx5IGV4cG9zZXMgYSBzaGlmdCByZWdpc3Rlcikgb3IgcGVyLXNwaV90cmFuc2ZlcgorICogKHdoaWNoIHRha2VzIGJldHRlciBhZHZhbnRhZ2Ugb2YgaGFyZHdhcmUgbGlrZSBmaWZvcyBvciBETUEgZW5naW5lcykuCisgKgorICogRHJpdmVycyB1c2luZyBwZXItd29yZCBJL08gbG9vcHMgc2hvdWxkIHVzZSAob3IgY2FsbCkgc3BpX2JpdGJhbmdfc2V0dXAgYW5kCisgKiBzcGlfYml0YmFuZ19jbGVhbnVwIHRvIGhhbmRsZSB0aG9zZSBzcGkgbWFzdGVyIG1ldGhvZHMuICBUaG9zZSBtZXRob2RzIGFyZQorICogdGhlIGRlZmF1bHRzIGlmIHRoZSBiaXRiYW5nLT50eHJ4X2J1ZnMgcm91dGluZSBpc24ndCBpbml0aWFsaXplZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgcmVnaXN0ZXJzIHRoZSBzcGlfbWFzdGVyLCB3aGljaCB3aWxsIHByb2Nlc3MgcmVxdWVzdHMgaW4gYQorICogZGVkaWNhdGVkIHRhc2ssIGtlZXBpbmcgSVJRcyB1bmJsb2NrZWQgbW9zdCBvZiB0aGUgdGltZS4gIFRvIHN0b3AKKyAqIHByb2Nlc3NpbmcgdGhvc2UgcmVxdWVzdHMsIGNhbGwgc3BpX2JpdGJhbmdfc3RvcCgpLgorICovCitpbnQgc3BpX2JpdGJhbmdfc3RhcnQoc3RydWN0IHNwaV9iaXRiYW5nICpiaXRiYW5nKQoreworCWludAlzdGF0dXM7CisKKwlpZiAoIWJpdGJhbmctPm1hc3RlciB8fCAhYml0YmFuZy0+Y2hpcHNlbGVjdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlJTklUX1dPUksoJmJpdGJhbmctPndvcmssIGJpdGJhbmdfd29yaywgYml0YmFuZyk7CisJc3Bpbl9sb2NrX2luaXQoJmJpdGJhbmctPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZiaXRiYW5nLT5xdWV1ZSk7CisKKwlpZiAoIWJpdGJhbmctPm1hc3Rlci0+dHJhbnNmZXIpCisJCWJpdGJhbmctPm1hc3Rlci0+dHJhbnNmZXIgPSBzcGlfYml0YmFuZ190cmFuc2ZlcjsKKwlpZiAoIWJpdGJhbmctPnR4cnhfYnVmcykgeworCQliaXRiYW5nLT51c2VfZG1hID0gMDsKKwkJYml0YmFuZy0+dHhyeF9idWZzID0gc3BpX2JpdGJhbmdfYnVmczsKKwkJaWYgKCFiaXRiYW5nLT5tYXN0ZXItPnNldHVwKSB7CisJCQliaXRiYW5nLT5tYXN0ZXItPnNldHVwID0gc3BpX2JpdGJhbmdfc2V0dXA7CisJCQliaXRiYW5nLT5tYXN0ZXItPmNsZWFudXAgPSBzcGlfYml0YmFuZ19jbGVhbnVwOworCQl9CisJfSBlbHNlIGlmICghYml0YmFuZy0+bWFzdGVyLT5zZXR1cCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiB0aGlzIHRhc2sgaXMgdGhlIG9ubHkgdGhpbmcgdG8gdG91Y2ggdGhlIFNQSSBiaXRzICovCisJYml0YmFuZy0+YnVzeSA9IDA7CisJYml0YmFuZy0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCisJCQliaXRiYW5nLT5tYXN0ZXItPmNkZXYuZGV2LT5idXNfaWQpOworCWlmIChiaXRiYW5nLT53b3JrcXVldWUgPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRUJVU1k7CisJCWdvdG8gZXJyMTsKKwl9CisKKwkvKiBkcml2ZXIgbWF5IGdldCBidXN5IGJlZm9yZSByZWdpc3RlcigpIHJldHVybnMsIGVzcGVjaWFsbHkKKwkgKiBpZiBzb21lb25lIHJlZ2lzdGVyZWQgYm9hcmRpbmZvIGZvciBkZXZpY2VzCisJICovCisJc3RhdHVzID0gc3BpX3JlZ2lzdGVyX21hc3RlcihiaXRiYW5nLT5tYXN0ZXIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycjI7CisKKwlyZXR1cm4gc3RhdHVzOworCitlcnIyOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGJpdGJhbmctPndvcmtxdWV1ZSk7CitlcnIxOgorCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfYml0YmFuZ19zdGFydCk7CisKKy8qKgorICogc3BpX2JpdGJhbmdfc3RvcCAtIHN0b3BzIHRoZSB0YXNrIHByb3ZpZGluZyBzcGkgY29tbXVuaWNhdGlvbgorICovCitpbnQgc3BpX2JpdGJhbmdfc3RvcChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKmJpdGJhbmcpCit7CisJdW5zaWduZWQJbGltaXQgPSA1MDA7CisKKwlzcGluX2xvY2tfaXJxKCZiaXRiYW5nLT5sb2NrKTsKKwliaXRiYW5nLT5zaHV0ZG93biA9IDA7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZiaXRiYW5nLT5xdWV1ZSkgJiYgbGltaXQtLSkgeworCQlzcGluX3VubG9ja19pcnEoJmJpdGJhbmctPmxvY2spOworCisJCWRldl9kYmcoYml0YmFuZy0+bWFzdGVyLT5jZGV2LmRldiwgIndhaXQgZm9yIHF1ZXVlXG4iKTsKKwkJbXNsZWVwKDEwKTsKKworCQlzcGluX2xvY2tfaXJxKCZiaXRiYW5nLT5sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZiaXRiYW5nLT5sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmJpdGJhbmctPnF1ZXVlKSkgeworCQlkZXZfZXJyKGJpdGJhbmctPm1hc3Rlci0+Y2Rldi5kZXYsICJxdWV1ZSBkaWRuJ3QgZW1wdHlcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWRlc3Ryb3lfd29ya3F1ZXVlKGJpdGJhbmctPndvcmtxdWV1ZSk7CisKKwlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIoYml0YmFuZy0+bWFzdGVyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2JpdGJhbmdfc3RvcCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2J1dHRlcmZseS5jIGIvZHJpdmVycy9zcGkvc3BpX2J1dHRlcmZseS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YTNjNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMKQEAgLTAsMCArMSw0MjMgQEAKKy8qCisgKiBzcGlfYnV0dGVyZmx5LmMgLSBwYXJwb3J0LXRvLWJ1dHRlcmZseSBhZGFwdGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisKKy8qCisgKiBUaGlzIHVzZXMgU1BJIHRvIHRhbGsgd2l0aCBhbiAiQVZSIEJ1dHRlcmZseSIsIHdoaWNoIGlzIGEgJFVTMjAgY2FyZAorICogd2l0aCBhIGJhdHRlcnkgcG93ZXJlZCBBVlIgbWljcm9jb250cm9sbGVyIGFuZCBsb3RzIG9mIGdvb2RpZXMuICBZb3UKKyAqIGNhbiB1c2UgR0NDIHRvIGRldmVsb3AgZmlybXdhcmUgZm9yIHRoaXMuCisgKgorICogU2VlIERvY3VtZW50YXRpb24vc3BpL2J1dHRlcmZseSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGJ1aWxkCisgKiBhbmQgdXNlIHRoaXMgY3VzdG9tIHBhcmFsbGVsIHBvcnQgY2FibGUuCisgKi8KKworI3VuZGVmCUhBVkVfVVNJCS8qIG55ZXQgKi8KKworCisvKiBEQVRBIG91dHB1dCBiaXRzIChwaW5zIDIuLjkgPT0gRDAuLkQ3KSAqLworI2RlZmluZQlidXR0ZXJmbHlfbnJlc2V0ICgxIDw8IDEpCQkvKiBwaW4gMyAqLworCisjZGVmaW5lCXNwaV9zY2tfYml0CSgxIDw8IDApCQkvKiBwaW4gMiAqLworI2RlZmluZQlzcGlfbW9zaV9iaXQJKDEgPDwgNykJCS8qIHBpbiA5ICovCisKKyNkZWZpbmUJdXNpX3Nja19iaXQJKDEgPDwgMykJCS8qIHBpbiA1ICovCisjZGVmaW5lCXVzaV9tb3NpX2JpdAkoMSA8PCA0KQkJLyogcGluIDYgKi8KKworI2RlZmluZQl2Y2NfYml0cwkoKDEgPDwgNikgfCAoMSA8PCA1KSkJLyogcGlucyA3LCA4ICovCisKKy8qIFNUQVRVUyBpbnB1dCBiaXRzICovCisjZGVmaW5lCXNwaV9taXNvX2JpdAlQQVJQT1JUX1NUQVRVU19CVVNZCS8qIHBpbiAxMSAqLworCisjZGVmaW5lCXVzaV9taXNvX2JpdAlQQVJQT1JUX1NUQVRVU19QQVBFUk9VVAkvKiBwaW4gMTIgKi8KKworLyogQ09OVFJPTCBvdXRwdXQgYml0cyAqLworI2RlZmluZQlzcGlfY3NfYml0CVBBUlBPUlRfQ09OVFJPTF9TRUxFQ1QJLyogcGluIDE3ICovCisvKiBVU0kgdXNlcyBubyBjaGlwc2VsZWN0ICovCisKKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBidXR0ZXJmbHkgKnNwaWRldl90b19wcChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiBzcGktPmNvbnRyb2xsZXJfZGF0YTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfdXNpZGV2KHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisjaWZkZWYJSEFWRV9VU0kKKwlyZXR1cm4gc3BpLT5jaGlwX3NlbGVjdCAhPSAxOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisKK3N0cnVjdCBidXR0ZXJmbHkgeworCS8qIFJFVklTSVQgLi4uIGZvciBub3csIHRoaXMgbXVzdCBiZSBmaXJzdCAqLworCXN0cnVjdCBzcGlfYml0YmFuZwliaXRiYW5nOworCisJc3RydWN0IHBhcnBvcnQJCSpwb3J0OworCXN0cnVjdCBwYXJkZXZpY2UJKnBkOworCisJdTgJCQlsYXN0Ynl0ZTsKKworCXN0cnVjdCBzcGlfZGV2aWNlCSpkYXRhZmxhc2g7CisJc3RydWN0IHNwaV9kZXZpY2UJKmJ1dHRlcmZseTsKKwlzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8JaW5mb1syXTsKKworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIHRoZXNlIHJvdXRpbmVzIG1heSBiZSBzbG93ZXIgdGhhbiBuZWNlc3NhcnkgYmVjYXVzZSB0aGV5J3JlIGhpZGluZworICogdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgdHdvIGRpZmZlcmVudCBTUEkgYnVzc2VzIG9uIHRoaXMgY2FibGU6IG9uZQorICogdG8gdGhlIERhdGFGbGFzaCBjaGlwIChvciBBVlIgU1BJIGNvbnRyb2xsZXIpLCB0aGUgb3RoZXIgdG8gdGhlCisgKiBBVlIgVVNJIGNvbnRyb2xsZXIuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzZXRzY2soc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQoreworCXN0cnVjdCBidXR0ZXJmbHkJKnBwID0gc3BpZGV2X3RvX3BwKHNwaSk7CisJdTgJCQliaXQsIGJ5dGUgPSBwcC0+bGFzdGJ5dGU7CisKKwlpZiAoaXNfdXNpZGV2KHNwaSkpCisJCWJpdCA9IHVzaV9zY2tfYml0OworCWVsc2UKKwkJYml0ID0gc3BpX3Nja19iaXQ7CisKKwlpZiAoaXNfb24pCisJCWJ5dGUgfD0gYml0OworCWVsc2UKKwkJYnl0ZSAmPSB+Yml0OworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgYnl0ZSk7CisJcHAtPmxhc3RieXRlID0gYnl0ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzZXRtb3NpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19vbikKK3sKKwlzdHJ1Y3QgYnV0dGVyZmx5CSpwcCA9IHNwaWRldl90b19wcChzcGkpOworCXU4CQkJYml0LCBieXRlID0gcHAtPmxhc3RieXRlOworCisJaWYgKGlzX3VzaWRldihzcGkpKQorCQliaXQgPSB1c2lfbW9zaV9iaXQ7CisJZWxzZQorCQliaXQgPSBzcGlfbW9zaV9iaXQ7CisKKwlpZiAoaXNfb24pCisJCWJ5dGUgfD0gYml0OworCWVsc2UKKwkJYnl0ZSAmPSB+Yml0OworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgYnl0ZSk7CisJcHAtPmxhc3RieXRlID0gYnl0ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0bWlzbyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBidXR0ZXJmbHkJKnBwID0gc3BpZGV2X3RvX3BwKHNwaSk7CisJaW50CQkJdmFsdWU7CisJdTgJCQliaXQ7CisKKwlpZiAoaXNfdXNpZGV2KHNwaSkpCisJCWJpdCA9IHVzaV9taXNvX2JpdDsKKwllbHNlCisJCWJpdCA9IHNwaV9taXNvX2JpdDsKKworCS8qIG9ubHkgU1RBVFVTX0JVU1kgaXMgTk9UIG5lZ2F0ZWQgKi8KKwl2YWx1ZSA9ICEocGFycG9ydF9yZWFkX3N0YXR1cyhwcC0+cG9ydCkgJiBiaXQpOworCXJldHVybiAoYml0ID09IFBBUlBPUlRfU1RBVFVTX0JVU1kpID8gdmFsdWUgOiAhdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGJ1dHRlcmZseV9jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYnV0dGVyZmx5CSpwcCA9IHNwaWRldl90b19wcChzcGkpOworCisJLyogc2V0IGRlZmF1bHQgY2xvY2sgcG9sYXJpdHkgKi8KKwlpZiAodmFsdWUpCisJCXNldHNjayhzcGksIHNwaS0+bW9kZSAmIFNQSV9DUE9MKTsKKworCS8qIG5vIGNoaXBzZWxlY3Qgb24gdGhpcyBVU0kgbGluayBjb25maWcgKi8KKwlpZiAoaXNfdXNpZGV2KHNwaSkpCisJCXJldHVybjsKKworCS8qIGhlcmUsIHZhbHVlID09ICJhY3RpdmF0ZSBvciBub3QiICovCisKKwkvKiBtb3N0IFBBUlBPUlRfQ09OVFJPTF8qIGJpdHMgYXJlIG5lZ2F0ZWQgKi8KKwlpZiAoc3BpX2NzX2JpdCA9PSBQQVJQT1JUX0NPTlRST0xfSU5JVCkKKwkJdmFsdWUgPSAhdmFsdWU7CisKKwkvKiBoZXJlLCB2YWx1ZSA9PSAiYml0IHZhbHVlIHRvIHdyaXRlIGluIGNvbnRyb2wgcmVnaXN0ZXIiICAqLworCisJcGFycG9ydF9mcm9iX2NvbnRyb2wocHAtPnBvcnQsIHNwaV9jc19iaXQsIHZhbHVlID8gc3BpX2NzX2JpdCA6IDApOworfQorCisKKy8qIHdlIG9ubHkgbmVlZGVkIHRvIGltcGxlbWVudCBvbmUgbW9kZSBoZXJlLCBhbmQgY2hvb3NlIFNQSV9NT0RFXzAgKi8KKworI2RlZmluZQlzcGlkZWxheShYKQlkb3t9d2hpbGUoMCkKKy8vI2RlZmluZQlzcGlkZWxheQluZGVsYXkKKworI2RlZmluZQlFWFBBTkRfQklUQkFOR19UWFJYCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisKK3N0YXRpYyB1MzIKK2J1dHRlcmZseV90eHJ4X3dvcmRfbW9kZTAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJdW5zaWduZWQgbnNlY3MsCisJCXUzMiB3b3JkLCB1OCBiaXRzKQoreworCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMCwgd29yZCwgYml0cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG92ZXJyaWRlIGRlZmF1bHQgcGFydGl0aW9uaW5nIHdpdGggY21kbGluZXBhcnQgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25zW10gPSB7IHsKKwkvKiBKRkZTMiB3YW50cyBwYXJ0aXRpb25zIG9mIDQqTiBibG9ja3MgZm9yIHRoaXMgZGV2aWNlIC4uLiAqLworCisJLyogc2VjdG9yIDAgPSA4IHBhZ2VzICogMjY0IGJ5dGVzL3BhZ2UgKDEgYmxvY2spCisJICogc2VjdG9yIDEgPSAyNDggcGFnZXMgKiAyNjQgYnl0ZXMvcGFnZQorCSAqLworCS5uYW1lCQk9ICJib29ra2VlcGluZyIsCS8vIDY2IEtCCisJLm9mZnNldAkJPSAwLAorCS5zaXplCQk9ICg4ICsgMjQ4KSAqIDI2NCwKKy8vCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwKK30sIHsKKwkvKiBzZWN0b3IgMiA9IDI1NiBwYWdlcyAqIDI2NCBieXRlcy9wYWdlCisJICogc2VjdG9ycyAzLTUgPSA1MTIgcGFnZXMgKiAyNjQgYnl0ZXMvcGFnZQorCSAqLworCS5uYW1lCQk9ICJmaWxlc3lzdGVtIiwJCS8vIDQ2MiBLQgorCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCit9IH07CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBmbGFzaCA9IHsKKwkubmFtZQkJPSAiYnV0dGVyZmxhc2giLAorCS5wYXJ0cwkJPSBwYXJ0aXRpb25zLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUocGFydGl0aW9ucyksCit9OworCisKKy8qIFJFVklTSVQgcmVtb3ZlIHRoaXMgdWdseSBnbG9iYWwgYW5kIGl0cyAib25seSBvbmUiIGxpbWl0YXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgYnV0dGVyZmx5ICpidXR0ZXJmbHk7CisKK3N0YXRpYyB2b2lkIGJ1dHRlcmZseV9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IHBhcmRldmljZQkqcGQ7CisJaW50CQkJc3RhdHVzOworCXN0cnVjdCBidXR0ZXJmbHkJKnBwOworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKKworCWlmIChidXR0ZXJmbHkpCisJCXJldHVybjsKKworCS8qIFJFVklTSVQ6ICB0aGlzIGp1c3QgX2Fzc3VtZXNfIGEgYnV0dGVyZmx5IGlzIHRoZXJlIC4uLiBubyBwcm9iZSwKKwkgKiBhbmQgbm8gd2F5IHRvIGJlIHNlbGVjdGl2ZSBhYm91dCB3aGF0IGl0IGJpbmRzIHRvLgorCSAqLworCisJLyogRklYTUUgd2hlcmUgc2hvdWxkIG1hc3Rlci0+Y2Rldi5kZXYgY29tZSBmcm9tPworCSAqIGUuZy4gL3N5cy9idXMvcG5wMC8wMDowYiwgc29tZSBQQ0kgdGhpbmcsIGV0YworCSAqIHNldHRpbmcgdXAgYSBwbGF0Zm9ybSBkZXZpY2UgbGlrZSB0aGlzIGlzIGFuIHVnbHkga2x1Z2UuLi4KKwkgKi8KKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiYnV0dGVyZmx5IiwgLTEsIE5VTEwsIDApOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YgKnBwKTsKKwlpZiAoIW1hc3RlcikgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCXBwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJLyoKKwkgKiBTUEkgYW5kIGJpdGJhbmcgaG9va3VwCisJICoKKwkgKiB1c2UgZGVmYXVsdCBzZXR1cCgpLCBjbGVhbnVwKCksIGFuZCB0cmFuc2ZlcigpIG1ldGhvZHM7IGFuZAorCSAqIG9ubHkgYm90aGVyIGltcGxlbWVudGluZyBtb2RlIDAuICBTdGFydCBpdCBsYXRlci4KKwkgKi8KKwltYXN0ZXItPmJ1c19udW0gPSA0MjsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gMjsKKworCXBwLT5iaXRiYW5nLm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CisJcHAtPmJpdGJhbmcuY2hpcHNlbGVjdCA9IGJ1dHRlcmZseV9jaGlwc2VsZWN0OworCXBwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8wXSA9IGJ1dHRlcmZseV90eHJ4X3dvcmRfbW9kZTA7CisKKwkvKgorCSAqIHBhcnBvcnQgaG9va3VwCisJICovCisJcHAtPnBvcnQgPSBwOworCXBkID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocCwgInNwaV9idXR0ZXJmbHkiLAorCQkJTlVMTCwgTlVMTCwgTlVMTCwKKwkJCTAgLyogRkxBR1MgKi8sIHBwKTsKKwlpZiAoIXBkKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW4wOworCX0KKwlwcC0+cGQgPSBwZDsKKworCXN0YXR1cyA9IHBhcnBvcnRfY2xhaW0ocGQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGNsZWFuMTsKKworCS8qCisJICogQnV0dGVyZmx5IHJlc2V0LCBwb3dlcnVwLCBydW4gZmlybXdhcmUKKwkgKi8KKwlwcl9kZWJ1ZygiJXM6IHBvd2VydXAvcmVzZXQgQnV0dGVyZmx5XG4iLCBwLT5uYW1lKTsKKworCS8qIG5DUyBmb3IgZGF0YWZsYXNoICh0aGlzIGJpdCBpcyBpbnZlcnRlZCBvbiBvdXRwdXQpICovCisJcGFycG9ydF9mcm9iX2NvbnRyb2wocHAtPnBvcnQsIHNwaV9jc19iaXQsIDApOworCisJLyogc3RhYmlsaXplIHBvd2VyIHdpdGggY2hpcCBpbiByZXNldCAoblJFU0VUKSwgYW5kCisJICogYm90aCBzcGlfc2NrX2JpdCBhbmQgdXNpX3Nja19iaXQgY2xlYXIgKENQT0w9MCkKKwkgKi8KKwlwcC0+bGFzdGJ5dGUgfD0gdmNjX2JpdHM7CisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBwcC0+bGFzdGJ5dGUpOworCW1zbGVlcCg1KTsKKworCS8qIHRha2UgaXQgb3V0IG9mIHJlc2V0OyBhc3N1bWUgbG9uZyByZXNldCBkZWxheSAqLworCXBwLT5sYXN0Ynl0ZSB8PSBidXR0ZXJmbHlfbnJlc2V0OworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgcHAtPmxhc3RieXRlKTsKKwltc2xlZXAoMTAwKTsKKworCisJLyoKKwkgKiBTdGFydCBTUEkgLi4uIGZvciBub3csIGhpZGUgdGhhdCB3ZSdyZSB0d28gcGh5c2ljYWwgYnVzc2VzLgorCSAqLworCXN0YXR1cyA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZwcC0+Yml0YmFuZyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gY2xlYW4yOworCisJLyogQnVzIDEgbGV0cyB1cyB0YWxrIHRvIGF0NDVkYjA0MWIgKGZpcm13YXJlIGRpc2FibGVzIEFWUikKKwkgKiBvciBBVlIgKGZpcm13YXJlIHJlc2V0cyBhdDQ1LCBhY3RzIGFzIHNwaSBzbGF2ZSkKKwkgKi8KKwlwcC0+aW5mb1swXS5tYXhfc3BlZWRfaHogPSAxNSAqIDEwMDAgKiAxMDAwOworCXN0cmNweShwcC0+aW5mb1swXS5tb2RhbGlhcywgIm10ZF9kYXRhZmxhc2giKTsKKwlwcC0+aW5mb1swXS5wbGF0Zm9ybV9kYXRhID0gJmZsYXNoOworCXBwLT5pbmZvWzBdLmNoaXBfc2VsZWN0ID0gMTsKKwlwcC0+aW5mb1swXS5jb250cm9sbGVyX2RhdGEgPSBwcDsKKwlwcC0+ZGF0YWZsYXNoID0gc3BpX25ld19kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLCAmcHAtPmluZm9bMF0pOworCWlmIChwcC0+ZGF0YWZsYXNoKQorCQlwcl9kZWJ1ZygiJXM6IGRhdGFmbGFzaCBhdCAlc1xuIiwgcC0+bmFtZSwKKwkJCQlwcC0+ZGF0YWZsYXNoLT5kZXYuYnVzX2lkKTsKKworI2lmZGVmCUhBVkVfVVNJCisJLyogZXZlbiBtb3JlIGN1c3RvbSBBVlIgZmlybXdhcmUgKi8KKwlwcC0+aW5mb1sxXS5tYXhfc3BlZWRfaHogPSAxMCAvKiA/PyAqLyAqIDEwMDAgKiAxMDAwOworCXN0cmNweShwcC0+aW5mb1sxXS5tb2RhbGlhcywgImJ1dHRlcmZseSIpOworCS8vIHBwLT5pbmZvWzFdLnBsYXRmb3JtX2RhdGEgPSAuLi4gVEJEIC4uLiA7CisJcHAtPmluZm9bMV0uY2hpcF9zZWxlY3QgPSAyLAorCXBwLT5pbmZvWzFdLmNvbnRyb2xsZXJfZGF0YSA9IHBwOworCXBwLT5idXR0ZXJmbHkgPSBzcGlfbmV3X2RldmljZShwcC0+Yml0YmFuZy5tYXN0ZXIsICZwcC0+aW5mb1sxXSk7CisJaWYgKHBwLT5idXR0ZXJmbHkpCisJCXByX2RlYnVnKCIlczogYnV0dGVyZmx5IGF0ICVzXG4iLCBwLT5uYW1lLAorCQkJCXBwLT5idXR0ZXJmbHktPmRldi5idXNfaWQpOworCisJLyogRklYTUUgc2V0dXAgQUNLIGZvciB0aGUgSVJRIGxpbmUgLi4uICAqLworI2VuZGlmCisKKwkvLyBkZXZfaW5mbyhfd2hhdD9fLCAuLi4pCisJcHJfaW5mbygiJXM6IEFWUiBCdXR0ZXJmbHlcbiIsIHAtPm5hbWUpOworCWJ1dHRlcmZseSA9IHBwOworCXJldHVybjsKKworY2xlYW4yOgorCS8qIHR1cm4gb2ZmIFZDQyAqLworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgMCk7CisKKwlwYXJwb3J0X3JlbGVhc2UocHAtPnBkKTsKK2NsZWFuMToKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBkKTsKK2NsZWFuMDoKKwkodm9pZCkgc3BpX21hc3Rlcl9wdXQocHAtPmJpdGJhbmcubWFzdGVyKTsKK2RvbmU6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CisJcHJfZGVidWcoIiVzOiBidXR0ZXJmbHkgcHJvYmUsIGZhaWwgJWRcbiIsIHAtPm5hbWUsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1dHRlcmZseV9kZXRhY2goc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IGJ1dHRlcmZseQkqcHA7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKKwlpbnQJCQlzdGF0dXM7CisKKwkvKiBGSVhNRSB0aGlzIGdsb2JhbCBpcyB1Z2x5IC4uLiBidXQsIGhvdyB0byBxdWlja2x5IGdldCBmcm9tCisJICogdGhlIHBhcnBvcnQgdG8gdGhlICJzdHJ1Y3QgYnV0dGVyZmx5IiBhc3NvY2lhdGVkIHdpdGggaXQ/CisJICogIm9sZCBzY2hvb2wiIGRyaXZlci1pbnRlcm5hbCBkZXZpY2UgbGlzdHM/CisJICovCisJaWYgKCFidXR0ZXJmbHkgfHwgYnV0dGVyZmx5LT5wb3J0ICE9IHApCisJCXJldHVybjsKKwlwcCA9IGJ1dHRlcmZseTsKKwlidXR0ZXJmbHkgPSBOVUxMOworCisjaWZkZWYJSEFWRV9VU0kKKwlzcGlfdW5yZWdpc3Rlcl9kZXZpY2UocHAtPmJ1dHRlcmZseSk7CisJcHAtPmJ1dHRlcmZseSA9IE5VTEw7CisjZW5kaWYKKwlzcGlfdW5yZWdpc3Rlcl9kZXZpY2UocHAtPmRhdGFmbGFzaCk7CisJcHAtPmRhdGFmbGFzaCA9IE5VTEw7CisKKwlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdG9wKCZwcC0+Yml0YmFuZyk7CisKKwkvKiB0dXJuIG9mZiBWQ0MgKi8KKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIDApOworCW1zbGVlcCgxMCk7CisKKwlwYXJwb3J0X3JlbGVhc2UocHAtPnBkKTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBwLT5wZCk7CisKKwlwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKHBwLT5iaXRiYW5nLm1hc3Rlci0+Y2Rldi5kZXYpOworCisJKHZvaWQpIHNwaV9tYXN0ZXJfcHV0KHBwLT5iaXRiYW5nLm1hc3Rlcik7CisKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBidXR0ZXJmbHlfZHJpdmVyID0geworCS5uYW1lID0JCSJzcGlfYnV0dGVyZmx5IiwKKwkuYXR0YWNoID0JYnV0dGVyZmx5X2F0dGFjaCwKKwkuZGV0YWNoID0JYnV0dGVyZmx5X2RldGFjaCwKK307CisKKworc3RhdGljIGludCBfX2luaXQgYnV0dGVyZmx5X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGFycG9ydF9yZWdpc3Rlcl9kcml2ZXIoJmJ1dHRlcmZseV9kcml2ZXIpOworfQorZGV2aWNlX2luaXRjYWxsKGJ1dHRlcmZseV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGJ1dHRlcmZseV9leGl0KHZvaWQpCit7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmYnV0dGVyZmx5X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChidXR0ZXJmbHlfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwppbmRleCA5YmFhNjI5Li43YWYxODgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCkBAIC0yMDcsNyArMjA3LDcgQEAKICoqICB1cmJzICAqKgogKioqKioqKioqKioqLwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB1cmIgKnVzYmF0bV9wb3BfdXJiKHN0cnVjdCB1c2JhdG1fY2hhbm5lbCAqY2hhbm5lbCkKK3N0YXRpYyBzdHJ1Y3QgdXJiICp1c2JhdG1fcG9wX3VyYihzdHJ1Y3QgdXNiYXRtX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJc3RydWN0IHVyYiAqdXJiOwogCkBAIC0yMjQsNyArMjI0LDcgQEAKIAlyZXR1cm4gdXJiOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB1c2JhdG1fc3VibWl0X3VyYihzdHJ1Y3QgdXJiICp1cmIpCitzdGF0aWMgaW50IHVzYmF0bV9zdWJtaXRfdXJiKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3QgdXNiYXRtX2NoYW5uZWwgKmNoYW5uZWwgPSB1cmItPmNvbnRleHQ7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKaW5kZXggOGY0MDJmOC4uYWZjODRjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKQEAgLTI1MzQsOSArMjUzNCw2IEBACiAJLmRyaXZlciAJPSB7CiAJCS5uYW1lCQk9IChjaGFyICopIHNob3J0bmFtZSwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkvLyAuc2h1dGRvd24gPSAuLi4KLQkJLy8gLnN1c3BlbmQgPSAuLi4KLQkJLy8gLnJlc3VtZSA9IC4uLgogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCmluZGV4IGM2YzI3OWQuLjlhNGVkYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCkBAIC0xNzM4LDkgKzE3MzgsNiBAQAogCiAJLmRyaXZlciAJPSB7CiAJCS5uYW1lCQk9IChjaGFyICopIHNob3J0bmFtZSwKLQkJLy8gLnNodXRkb3duID0gLi4uCi0JCS8vIC5zdXNwZW5kID0gLi4uCi0JCS8vIC5yZXN1bWUgPSAuLi4KIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCmluZGV4IDJlNjkyNmIuLmJhOWFjZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKQEAgLTM3NCw5ICszNzQsNiBAQAogCS5kaXNjb25uZWN0ID0JCWdzX2Rpc2Nvbm5lY3QsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPQkJR1NfU0hPUlRfTkFNRSwKLQkJLyogLnNodXRkb3duID0gLi4uICovCi0JCS8qIC5zdXNwZW5kID0gLi4uICAqLwotCQkvKiAucmVzdW1lID0gLi4uICAgKi8KIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMKaW5kZXggNmM1ODYzNi4uMmZjMTEwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCkBAIC0xMzAzLDkgKzEzMDMsNiBAQAogCS5kcml2ZXIgCT0gewogCQkubmFtZQkJPSAoY2hhciAqKSBzaG9ydG5hbWUsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLy8gLnNodXRkb3duID0gLi4uCi0JCS8vIC5zdXNwZW5kID0gLi4uCi0JCS8vIC5yZXN1bWUgPSAuLi4KIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKaW5kZXggNTA5ZGQwYS4uNTI0NmIzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCkBAIC0zNyw2ICszNywxNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCitjb25maWcgVVNCX0hJRElOUFVUX1BPV0VSQk9PSworCWJvb2wgIkVuYWJsZSBzdXBwb3J0IGZvciBpQm9vay9Qb3dlckJvb2sgc3BlY2lhbCBrZXlzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVVNCX0hJRElOUFVUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgc3BlY2lhbCBrZXlzIChGbiwgTnVtbG9jaykgb24KKwkgIEFwcGxlIGlCb29rcyBhbmQgUG93ZXJCb29rcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIEhJRF9GRgogCWJvb2wgIkZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBVU0JfSElESU5QVVQgJiYgRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYwppbmRleCA1ZjUyOTc5Li5hOTFlNzJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMKQEAgLTE0NTAsNiArMTQ1MCw5IEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQVBQTEUJCTB4MDVhYwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1BPV0VSTU9VU0UJMHgwMzA0CiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSEVSUlkJCTB4MDQ2YQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTgkweDAwMjMKKwogLyoKICAqIEFscGhhYmV0aWNhbGx5IHNvcnRlZCBibGFja2xpc3QgYnkgcXVpcmsgdHlwZS4KICAqLwpAQCAtMTU4MCw2ICsxNTgzLDE2IEBACiAJeyBVU0JfVkVORE9SX0lEX1NBSVRFSywgVVNCX0RFVklDRV9JRF9TQUlURUtfUlVNQkxFUEFELCBISURfUVVJUktfQkFEUEFEIH0sCiAJeyBVU0JfVkVORE9SX0lEX1RPUE1BWCwgVVNCX0RFVklDRV9JRF9UT1BNQVhfQ09CUkFQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKIAorCXsgVVNCX1ZFTkRPUl9JRF9DSEVSUlksIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OLCBISURfUVVJUktfQ1lNT1RJT04gfSwKKworCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjBFLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjBGLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjE0LCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjE1LCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjE2LCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMzBBLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMzBCLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCiAJeyAwLCAwIH0KIH07CiAKQEAgLTE2MjYsNiArMTYzOSwyMCBAQAogCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBoaWQtPmJ1ZnNpemUsIGhpZC0+Y3RybGJ1ZiwgaGlkLT5jdHJsYnVmX2RtYSk7CiB9CiAKKy8qCisgKiBDaGVycnkgQ3ltb3Rpb24ga2V5Ym9hcmQgaGF2ZSBhbiBpbnZhbGlkIEhJRCByZXBvcnQgZGVzY3JpcHRvciwKKyAqIHRoYXQgbmVlZHMgZml4aW5nIGJlZm9yZSB3ZSBjYW4gcGFyc2UgaXQuCisgKi8KKworc3RhdGljIHZvaWQgaGlkX2ZpeHVwX2N5bW90aW9uX2Rlc2NyaXB0b3IoY2hhciAqcmRlc2MsIGludCByc2l6ZSkKK3sKKwlpZiAocnNpemUgPj0gMTcgJiYgcmRlc2NbMTFdID09IDB4M2MgJiYgcmRlc2NbMTJdID09IDB4MDIpIHsKKwkJaW5mbygiRml4aW5nIHVwIENoZXJyeSBDeW1vdGlvbiByZXBvcnQgZGVzY3JpcHRvciIpOworCQlyZGVzY1sxMV0gPSByZGVzY1sxNl0gPSAweGZmOworCQlyZGVzY1sxMl0gPSByZGVzY1sxN10gPSAweDAzOworCX0KK30KKwogc3RhdGljIHN0cnVjdCBoaWRfZGV2aWNlICp1c2JfaGlkX2NvbmZpZ3VyZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKQEAgLTE2NzMsNiArMTcwMCw5IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAorCWlmICgocXVpcmtzICYgSElEX1FVSVJLX0NZTU9USU9OKSkKKwkJaGlkX2ZpeHVwX2N5bW90aW9uX2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKKwogI2lmZGVmIERFQlVHX0RBVEEKIAlwcmludGsoS0VSTl9ERUJVRyBfX0ZJTEVfXyAiOiByZXBvcnQgZGVzY3JpcHRvciAoc2l6ZSAldSwgcmVhZCAlZCkgPSAiLCByc2l6ZSwgbik7CiAJZm9yIChuID0gMDsgbiA8IHJzaXplOyBuKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jCmluZGV4IDE5MmEwM2IuLmNiMGQ4MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jCkBAIC03Myw2ICs3MywxNjAgQEAKICNkZWZpbmUgbWFwX2tleV9jbGVhcihjKQlkbyB7IG1hcF9rZXkoYyk7IGNsZWFyX2JpdChjLCBiaXQpOyB9IHdoaWxlICgwKQogI2RlZmluZSBtYXBfZmZfZWZmZWN0KGMpCWRvIHsgc2V0X2JpdChjLCBpbnB1dC0+ZmZiaXQpOyB9IHdoaWxlICgwKQogCisjaWZkZWYgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sKKworc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiB7CisJdTE2IGZyb207CisJdTE2IHRvOworCXU4IGZsYWdzOworfTsKKworI2RlZmluZSBQT1dFUkJPT0tfRkxBR19GS0VZIDB4MDEKKworc3RhdGljIHN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gcG93ZXJib29rX2ZuX2tleXNbXSA9IHsKKwl7IEtFWV9CQUNLU1BBQ0UsIEtFWV9ERUxFVEUgfSwKKwl7IEtFWV9GMSwJS0VZX0JSSUdIVE5FU1NET1dOLAlQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfRjIsCUtFWV9CUklHSFRORVNTVVAsCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMywJS0VZX01VVEUsCQlQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfRjQsCUtFWV9WT0xVTUVET1dOLAkJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y1LAlLRVlfVk9MVU1FVVAsCQlQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfRjYsCUtFWV9OVU1MT0NLLAkJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y3LAlLRVlfU1dJVENIVklERU9NT0RFLAlQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfRjgsCUtFWV9LQkRJTExVTVRPR0dMRSwJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y5LAlLRVlfS0JESUxMVU1ET1dOLAlQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfRjEwLAlLRVlfS0JESUxMVU1VUCwJCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9VUCwJS0VZX1BBR0VVUCB9LAorCXsgS0VZX0RPV04sCUtFWV9QQUdFRE9XTiB9LAorCXsgS0VZX0xFRlQsCUtFWV9IT01FIH0sCisJeyBLRVlfUklHSFQsCUtFWV9FTkQgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uIHBvd2VyYm9va19udW1sb2NrX2tleXNbXSA9IHsKKwl7IEtFWV9KLAlLRVlfS1AxIH0sCisJeyBLRVlfSywJS0VZX0tQMiB9LAorCXsgS0VZX0wsCUtFWV9LUDMgfSwKKwl7IEtFWV9VLAlLRVlfS1A0IH0sCisJeyBLRVlfSSwJS0VZX0tQNSB9LAorCXsgS0VZX08sCUtFWV9LUDYgfSwKKwl7IEtFWV83LAlLRVlfS1A3IH0sCisJeyBLRVlfOCwJS0VZX0tQOCB9LAorCXsgS0VZXzksCUtFWV9LUDkgfSwKKwl7IEtFWV9NLAlLRVlfS1AwIH0sCisJeyBLRVlfRE9ULAlLRVlfS1BET1QgfSwKKwl7IEtFWV9TTEFTSCwJS0VZX0tQUExVUyB9LAorCXsgS0VZX1NFTUlDT0xPTiwgS0VZX0tQTUlOVVMgfSwKKwl7IEtFWV9QLAlLRVlfS1BBU1RFUklTSyB9LAorCXsgS0VZX01JTlVTLAlLRVlfS1BFUVVBTCB9LAorCXsgS0VZXzAsCUtFWV9LUFNMQVNIIH0sCisJeyBLRVlfRjYsCUtFWV9OVU1MT0NLIH0sCisJeyBLRVlfS1BFTlRFUiwJS0VZX0tQRU5URVIgfSwKKwl7IEtFWV9CQUNLU1BBQ0UsIEtFWV9CQUNLU1BBQ0UgfSwKKwl7IH0KK307CisKK3N0YXRpYyBpbnQgdXNiaGlkX3BiX2ZubW9kZSA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQocGJfZm5tb2RlLCB1c2JoaWRfcGJfZm5tb2RlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhwYl9mbm1vZGUsCisJIk1vZGUgb2YgZm4ga2V5IG9uIFBvd2VyQm9va3MgKDAgPSBkaXNhYmxlZCwgMSA9IGZrZXlzbGFzdCwgMiA9IGZrZXlzZmlyc3QpIik7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICpmaW5kX3RyYW5zbGF0aW9uKHN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gKnRhYmxlLCB1MTYgZnJvbSkKK3sKKwlzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICp0cmFuczsKKworCS8qIExvb2sgZm9yIHRoZSB0cmFuc2xhdGlvbiAqLworCWZvciAodHJhbnMgPSB0YWJsZTsgdHJhbnMtPmZyb207IHRyYW5zKyspCisJCWlmICh0cmFucy0+ZnJvbSA9PSBmcm9tKQorCQkJcmV0dXJuIHRyYW5zOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaGlkaW5wdXRfcGJfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCisJCQkgICAgIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICp0cmFuczsKKworCWlmICh1c2FnZS0+Y29kZSA9PSBLRVlfRk4pIHsKKwkJaWYgKHZhbHVlKSBoaWQtPnF1aXJrcyB8PSAgSElEX1FVSVJLX1BPV0VSQk9PS19GTl9PTjsKKwkJZWxzZSAgICAgICBoaWQtPnF1aXJrcyAmPSB+SElEX1FVSVJLX1BPV0VSQk9PS19GTl9PTjsKKworCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHVzYWdlLT5jb2RlLCB2YWx1ZSk7CisKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHVzYmhpZF9wYl9mbm1vZGUpIHsKKwkJaW50IGRvX3RyYW5zbGF0ZTsKKworCQl0cmFucyA9IGZpbmRfdHJhbnNsYXRpb24ocG93ZXJib29rX2ZuX2tleXMsIHVzYWdlLT5jb2RlKTsKKwkJaWYgKHRyYW5zKSB7CisJCQlpZiAodGVzdF9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9mbikpCisJCQkJZG9fdHJhbnNsYXRlID0gMTsKKwkJCWVsc2UgaWYgKHRyYW5zLT5mbGFncyAmIFBPV0VSQk9PS19GTEFHX0ZLRVkpCisJCQkJZG9fdHJhbnNsYXRlID0KKwkJCQkJKHVzYmhpZF9wYl9mbm1vZGUgPT0gMiAmJiAgKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX1BPV0VSQk9PS19GTl9PTikpIHx8CisJCQkJCSh1c2JoaWRfcGJfZm5tb2RlID09IDEgJiYgIShoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19QT1dFUkJPT0tfRk5fT04pKTsKKwkJCWVsc2UKKwkJCQlkb190cmFuc2xhdGUgPSAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfUE9XRVJCT09LX0ZOX09OKTsKKworCQkJaWYgKGRvX3RyYW5zbGF0ZSkgeworCQkJCWlmICh2YWx1ZSkKKwkJCQkJc2V0X2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX2ZuKTsKKwkJCQllbHNlCisJCQkJCWNsZWFyX2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX2ZuKTsKKworCQkJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdHJhbnMtPnRvLCB2YWx1ZSk7CisKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCisJCWlmICh0ZXN0X2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX251bWxvY2spIHx8CisJCSAgICB0ZXN0X2JpdChMRURfTlVNTCwgaW5wdXQtPmxlZCkpIHsKKwkJCXRyYW5zID0gZmluZF90cmFuc2xhdGlvbihwb3dlcmJvb2tfbnVtbG9ja19rZXlzLCB1c2FnZS0+Y29kZSk7CisKKwkJCWlmICh0cmFucykgeworCQkJCWlmICh2YWx1ZSkKKwkJCQkJc2V0X2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX251bWxvY2spOworCQkJCWVsc2UKKwkJCQkJY2xlYXJfYml0KHVzYWdlLT5jb2RlLCBoaWQtPnBiX3ByZXNzZWRfbnVtbG9jayk7CisKKwkJCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHRyYW5zLT50bywgdmFsdWUpOworCQkJfQorCisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoaWRpbnB1dF9wYl9zZXR1cChzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKKwlzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICp0cmFuczsKKworCXNldF9iaXQoS0VZX05VTUxPQ0ssIGlucHV0LT5rZXliaXQpOworCisJLyogRW5hYmxlIGFsbCBuZWVkZWQga2V5cyAqLworCWZvciAodHJhbnMgPSBwb3dlcmJvb2tfZm5fa2V5czsgdHJhbnMtPmZyb207IHRyYW5zKyspCisJCXNldF9iaXQodHJhbnMtPnRvLCBpbnB1dC0+a2V5Yml0KTsKKworCWZvciAodHJhbnMgPSBwb3dlcmJvb2tfbnVtbG9ja19rZXlzOyB0cmFucy0+ZnJvbTsgdHJhbnMrKykKKwkJc2V0X2JpdCh0cmFucy0+dG8sIGlucHV0LT5rZXliaXQpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGhpZGlucHV0X3BiX2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAorCQkJCSAgICBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRpbnB1dF9wYl9zZXR1cChzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBoaWRpbnB1dF9jb25maWd1cmVfdXNhZ2Uoc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAogCQkJCSAgICAgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UpCiB7CkBAIC0xMzUsOCArMjg5LDExIEBACiAJCWNhc2UgSElEX1VQX1NJTVVMQVRJT046CiAKIAkJCXN3aXRjaCAodXNhZ2UtPmhpZCAmIDB4ZmZmZikgewotCQkJCWNhc2UgMHhiYTogbWFwX2FicyhBQlNfUlVEREVSKTsgYnJlYWs7CisJCQkJY2FzZSAweGJhOiBtYXBfYWJzKEFCU19SVURERVIpOyAgIGJyZWFrOwogCQkJCWNhc2UgMHhiYjogbWFwX2FicyhBQlNfVEhST1RUTEUpOyBicmVhazsKKwkJCQljYXNlIDB4YzQ6IG1hcF9hYnMoQUJTX0dBUyk7ICAgICAgYnJlYWs7CisJCQkJY2FzZSAweGM1OiBtYXBfYWJzKEFCU19CUkFLRSk7ICAgIGJyZWFrOworCQkJCWNhc2UgMHhjODogbWFwX2FicyhBQlNfV0hFRUwpOyAgICBicmVhazsKIAkJCQlkZWZhdWx0OiAgIGdvdG8gaWdub3JlOwogCQkJfQogCQkJYnJlYWs7CkBAIC0yODksMTEgKzQ0NiwxOSBAQAogCQkJCWNhc2UgMHgyMjY6IG1hcF9rZXlfY2xlYXIoS0VZX1NUT1ApOwkJYnJlYWs7CiAJCQkJY2FzZSAweDIyNzogbWFwX2tleV9jbGVhcihLRVlfUkVGUkVTSCk7CQlicmVhazsKIAkJCQljYXNlIDB4MjJhOiBtYXBfa2V5X2NsZWFyKEtFWV9CT09LTUFSS1MpOwlicmVhazsKKwkJCQljYXNlIDB4MjMzOiBtYXBfa2V5X2NsZWFyKEtFWV9TQ1JPTExVUCk7CWJyZWFrOworCQkJCWNhc2UgMHgyMzQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NDUk9MTERPV04pOwlicmVhazsKIAkJCQljYXNlIDB4MjM4OiBtYXBfcmVsKFJFTF9IV0hFRUwpOwkJYnJlYWs7CiAJCQkJY2FzZSAweDI3OTogbWFwX2tleV9jbGVhcihLRVlfUkVETyk7CQlicmVhazsKIAkJCQljYXNlIDB4Mjg5OiBtYXBfa2V5X2NsZWFyKEtFWV9SRVBMWSk7CQlicmVhazsKIAkJCQljYXNlIDB4MjhiOiBtYXBfa2V5X2NsZWFyKEtFWV9GT1JXQVJETUFJTCk7CWJyZWFrOwogCQkJCWNhc2UgMHgyOGM6IG1hcF9rZXlfY2xlYXIoS0VZX1NFTkQpOwkJYnJlYWs7CisKKwkJCQkvKiBSZXBvcnRlZCBvbiBhIENoZXJyeSBDeW1vdGlvbiBrZXlib2FyZCAqLworCQkJCWNhc2UgMHgzMDE6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0cxKTsJCWJyZWFrOworCQkJCWNhc2UgMHgzMDI6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0cyKTsJCWJyZWFrOworCQkJCWNhc2UgMHgzMDM6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0czKTsJCWJyZWFrOworCiAJCQkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7CiAJCQl9CiAJCQlicmVhazsKQEAgLTMyNSw3ICs0OTAsMTIgQEAKIAogCQkJc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7CiAJCQlzd2l0Y2godXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQkJCWNhc2UgMHgwMDM6IG1hcF9rZXlfY2xlYXIoS0VZX0ZOKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwMDM6CisJCQkJCS8qIFRoZSBmbiBrZXkgb24gQXBwbGUgUG93ZXJCb29rcyAqLworCQkJCQltYXBfa2V5X2NsZWFyKEtFWV9GTik7CisJCQkJCWhpZGlucHV0X3BiX3NldHVwKGlucHV0KTsKKwkJCQkJYnJlYWs7CisKIAkJCQlkZWZhdWx0OiAgICBnb3RvIGlnbm9yZTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtNDgyLDYgKzY1Miw5IEBACiAJCXJldHVybjsKIAl9CiAKKwlpZiAoKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4pICYmIGhpZGlucHV0X3BiX2V2ZW50KGhpZCwgaW5wdXQsIHVzYWdlLCB2YWx1ZSkpCisJCXJldHVybjsKKwogCWlmICh1c2FnZS0+aGF0X21pbiA8IHVzYWdlLT5oYXRfbWF4IHx8IHVzYWdlLT5oYXRfZGlyKSB7CiAJCWludCBoYXRfZGlyID0gdXNhZ2UtPmhhdF9kaXI7CiAJCWlmICghaGF0X2RpcikKQEAgLTUyNCw3ICs2OTcsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYoKHVzYWdlLT50eXBlID09IEVWX0tFWSkgJiYgKHVzYWdlLT5jb2RlID09IDApKSAvKiBLZXkgMCBpcyAidW5hc3NpZ25lZCIsIG5vdCBLRVlfVU5LTk9XTiAqLworCWlmICgodXNhZ2UtPnR5cGUgPT0gRVZfS0VZKSAmJiAodXNhZ2UtPmNvZGUgPT0gMCkpIC8qIEtleSAwIGlzICJ1bmFzc2lnbmVkIiwgbm90IEtFWV9VTktOT1dOICovCiAJCXJldHVybjsKIAogCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUsIHZhbHVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLmgKaW5kZXggZWU0OGEyMi4uOGIwZDQzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLmgKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLmgKQEAgLTIzNSwxNyArMjM1LDIwIEBACiAgKiBISUQgZGV2aWNlIHF1aXJrcy4KICAqLwogCi0jZGVmaW5lIEhJRF9RVUlSS19JTlZFUlQJCQkweDAwMQotI2RlZmluZSBISURfUVVJUktfTk9UT1VDSAkJCTB4MDAyCi0jZGVmaW5lIEhJRF9RVUlSS19JR05PUkUJCQkweDAwNAotI2RlZmluZSBISURfUVVJUktfTk9HRVQJCQkJMHgwMDgKLSNkZWZpbmUgSElEX1FVSVJLX0hJRERFVgkJCTB4MDEwCi0jZGVmaW5lIEhJRF9RVUlSS19CQURQQUQJCQkweDAyMAotI2RlZmluZSBISURfUVVJUktfTVVMVElfSU5QVVQJCQkweDA0MAotI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNwkJMHgwODAKLSNkZWZpbmUgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzUJCTB4MTAwCi0jZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS19PTgkJMHgyMDAKLSNkZWZpbmUgSElEX1FVSVJLXzJXSEVFTF9QT1dFUk1PVVNFCQkweDQwMAorI2RlZmluZSBISURfUVVJUktfSU5WRVJUCQkJMHgwMDAwMDAwMQorI2RlZmluZSBISURfUVVJUktfTk9UT1VDSAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgSElEX1FVSVJLX0lHTk9SRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgSElEX1FVSVJLX05PR0VUCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgSElEX1FVSVJLX0hJRERFVgkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgSElEX1FVSVJLX0JBRFBBRAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgSElEX1FVSVJLX01VTFRJX0lOUFVUCQkJMHgwMDAwMDA0MAorI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNwkJMHgwMDAwMDA4MAorI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNQkJMHgwMDAwMDEwMAorI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfT04JCTB4MDAwMDAyMDAKKyNkZWZpbmUgSElEX1FVSVJLXzJXSEVFTF9QT1dFUk1PVVNFCQkweDAwMDAwNDAwCisjZGVmaW5lIEhJRF9RVUlSS19DWU1PVElPTgkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4JCTB4MDAwMDEwMDAKKyNkZWZpbmUgSElEX1FVSVJLX1BPV0VSQk9PS19GTl9PTgkJMHgwMDAwMjAwMAogCiAvKgogICogVGhpcyBpcyB0aGUgZ2xvYmFsIGVudmlyb25tZW50IG9mIHRoZSBwYXJzZXIuIFRoaXMgaW5mb3JtYXRpb24gaXMKQEAgLTQzMSw2ICs0MzQsMTEgQEAKIAl2b2lkICgqZmZfZXhpdCkoc3RydWN0IGhpZF9kZXZpY2UqKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbGVkIGJ5IGhpZF9leGl0X2ZmKGhpZCkgKi8KIAlpbnQgKCpmZl9ldmVudCkoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCiAJCQl1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSk7CisKKyNpZmRlZiBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSworCXVuc2lnbmVkIGxvbmcgcGJfcHJlc3NlZF9mbltOQklUUyhLRVlfTUFYKV07CisJdW5zaWduZWQgbG9uZyBwYl9wcmVzc2VkX251bWxvY2tbTkJJVFMoS0VZX01BWCldOworI2VuZGlmCiB9OwogCiAjZGVmaW5lIEhJRF9HTE9CQUxfU1RBQ0tfU0laRSA0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9waWQuYyBiL2RyaXZlcnMvdXNiL2lucHV0L3BpZC5jCmluZGV4IDE5ZTAxNWQuLmQ5ZDlmNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3BpZC5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3BpZC5jCkBAIC0yNTksNyArMjU5LDcgQEAKIGludCBoaWRfcGlkX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKIAlzdHJ1Y3QgaGlkX2ZmX3BpZCAqcHJpdmF0ZTsKLQlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IGxpc3RfZW50cnkoJmhpZC0+aW5wdXRzLCBzdHJ1Y3QgaGlkX2lucHV0LCBsaXN0KTsKKwlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IGxpc3RfZW50cnkoaGlkLT5pbnB1dHMubmV4dCwgc3RydWN0IGhpZF9pbnB1dCwgbGlzdCk7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0gaGlkaW5wdXQtPmlucHV0OwogCiAJcHJpdmF0ZSA9IGhpZC0+ZmZfcHJpdmF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRfZmZfcGlkKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5jIGIvZHJpdmVycy91c2IvaW5wdXQvd2Fjb20uYwppbmRleCA0OGRmNGNmLi5kM2UxNWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmMKQEAgLTk1LDcgKzk1LDcgQEAKIGVudW0gewogCVBFTlBBUlRORVIgPSAwLAogCUdSQVBISVJFLAotCUc0LAorCVdBQ09NX0c0LAogCVBMLAogCUlOVFVPUywKIAlJTlRVT1MzLApAQCAtMzczLDcgKzM3Myw3IEBACiAKIAkJCWNhc2UgMjogLyogTW91c2Ugd2l0aCB3aGVlbCAqLwogCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBkYXRhWzFdICYgMHgwNCk7Ci0JCQkJaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBHNCkgeworCQkJCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gV0FDT01fRzQpIHsKIAkJCQkJcncgPSBkYXRhWzddICYgMHgwNCA/IC0oZGF0YVs3XSAmIDB4MDMpIDogKGRhdGFbN10gJiAweDAzKTsKIAkJCQkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9XSEVFTCwgcncpOwogCQkJCX0gZWxzZQpAQCAtMzg1LDcgKzM4NSw3IEBACiAJCQkJaWQgPSBDVVJTT1JfREVWSUNFX0lEOwogCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgZGF0YVsxXSAmIDB4MDEpOwogCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGRhdGFbMV0gJiAweDAyKTsKLQkJCQlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IEc0KQorCQkJCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gV0FDT01fRzQpCiAJCQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfRElTVEFOQ0UsIGRhdGFbNl0pOwogCQkJCWVsc2UKIAkJCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ESVNUQU5DRSwgZGF0YVs3XSk7CkBAIC00MTAsNyArNDEwLDcgQEAKIAlpbnB1dF9zeW5jKGRldik7CiAKIAkvKiBzZW5kIHBhZCBkYXRhICovCi0JaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBHNCkgeworCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gV0FDT01fRzQpIHsKIAkJLyogZmlzdCB0aW1lIHNlbmRpbmcgcGFkIGRhdGEgKi8KIAkJaWYgKHdhY29tLT50b29sWzFdICE9IEJUTl9UT09MX0ZJTkdFUikgewogCQkJd2Fjb20tPmlkWzFdID0gMDsKQEAgLTcxMyw4ICs3MTMsOCBAQAogCXsgIldhY29tIEdyYXBoaXJlMiA1eDciLCA4LCAgMTM5MTgsIDEwMjA2LCAgNTExLCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCiAJeyAiV2Fjb20gR3JhcGhpcmUzIiwgICAgIDgsICAxMDIwOCwgIDc0MjQsICA1MTEsIDMyLCBHUkFQSElSRSwgICB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKIAl7ICJXYWNvbSBHcmFwaGlyZTMgNng4IiwgOCwgIDE2NzA0LCAxMjA2NCwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAotCXsgIldhY29tIEdyYXBoaXJlNCA0eDUiLCA4LCAgMTAyMDgsICA3NDI0LCAgNTExLCAzMiwgRzQsCSB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKLQl7ICJXYWNvbSBHcmFwaGlyZTQgNng4IiwgOCwgIDE2NzA0LCAxMjA2NCwgIDUxMSwgMzIsIEc0LAkgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCisJeyAiV2Fjb20gR3JhcGhpcmU0IDR4NSIsIDgsICAxMDIwOCwgIDc0MjQsICA1MTEsIDMyLCBXQUNPTV9HNCwJIHdhY29tX2dyYXBoaXJlX2lycSB9LAorCXsgIldhY29tIEdyYXBoaXJlNCA2eDgiLCA4LCAgMTY3MDQsIDEyMDY0LCAgNTExLCAzMiwgV0FDT01fRzQsCSB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKIAl7ICJXYWNvbSBWb2xpdG8iLCAgICAgICAgOCwgICA1MTA0LCAgMzcxMiwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAogCXsgIldhY29tIFBlblN0YXRpb24yIiwgICA4LCAgIDMyNTAsICAyMzIwLCAgMjU1LCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCiAJeyAiV2Fjb20gVm9saXRvMiA0eDUiLCAgIDgsICAgNTEwNCwgIDM3MTIsICA1MTEsIDMyLCBHUkFQSElSRSwgICB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKQEAgLTg1OSw3ICs4NTksNyBAQAogCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1BSRVNTVVJFLCAwLCB3YWNvbS0+ZmVhdHVyZXMtPnByZXNzdXJlX21heCwgMCwgMCk7CiAKIAlzd2l0Y2ggKHdhY29tLT5mZWF0dXJlcy0+dHlwZSkgewotCQljYXNlIEc0OgorCQljYXNlIFdBQ09NX0c0OgogCQkJaW5wdXRfZGV2LT5ldmJpdFswXSB8PSBCSVQoRVZfTVNDKTsKIAkJCWlucHV0X2Rldi0+bXNjYml0WzBdIHw9IEJJVChNU0NfU0VSSUFMKTsKIAkJCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1RPT0xfRklOR0VSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9idXMuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9idXMuYwppbmRleCA2NjQxMzlhLi5lOWY5ZjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvYnVzLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2J1cy5jCkBAIC0zNywxMSArMzcsNiBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgYnVzX3R5cGUgdXNiX3NlcmlhbF9idXNfdHlwZSA9IHsKLQkubmFtZSA9CQkidXNiLXNlcmlhbCIsCi0JLm1hdGNoID0JdXNiX3NlcmlhbF9kZXZpY2VfbWF0Y2gsCi19OwotCiBzdGF0aWMgaW50IHVzYl9zZXJpYWxfZGV2aWNlX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyICpkcml2ZXI7CkBAIC0xMDksMTQgKzEwNCwxOCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKK3N0cnVjdCBidXNfdHlwZSB1c2Jfc2VyaWFsX2J1c190eXBlID0geworCS5uYW1lID0JCSJ1c2Itc2VyaWFsIiwKKwkubWF0Y2ggPQl1c2Jfc2VyaWFsX2RldmljZV9tYXRjaCwKKwkucHJvYmUgPQl1c2Jfc2VyaWFsX2RldmljZV9wcm9iZSwKKwkucmVtb3ZlID0JdXNiX3NlcmlhbF9kZXZpY2VfcmVtb3ZlLAorfTsKKwogaW50IHVzYl9zZXJpYWxfYnVzX3JlZ2lzdGVyKHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciAqZHJpdmVyKQogewogCWludCByZXR2YWw7CiAKIAlkcml2ZXItPmRyaXZlci5idXMgPSAmdXNiX3NlcmlhbF9idXNfdHlwZTsKLQlkcml2ZXItPmRyaXZlci5wcm9iZSA9IHVzYl9zZXJpYWxfZGV2aWNlX3Byb2JlOwotCWRyaXZlci0+ZHJpdmVyLnJlbW92ZSA9IHVzYl9zZXJpYWxfZGV2aWNlX3JlbW92ZTsKLQogCXJldHZhbCA9IGRyaXZlcl9yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOwogCiAJcmV0dXJuIHJldHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYwppbmRleCA5ZmZmZjE5Li4wZWI4ODNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCkBAIC00Myw4ICs0Myw2IEBACiAjZGVmaW5lIFBMMjMwM19CVUZfU0laRQkJMTAyNAogI2RlZmluZSBQTDIzMDNfVE1QX0JVRl9TSVpFCTEwMjQKIAotc3RhdGljIERFQ0xBUkVfTVVURVgocGwyMzAzX3RtcF9idWZfc2VtKTsKLQogc3RydWN0IHBsMjMwM19idWYgewogCXVuc2lnbmVkIGludAlidWZfc2l6ZTsKIAljaGFyCQkqYnVmX2J1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vNjgzMjhmYi5jIGIvZHJpdmVycy92aWRlby82ODMyOGZiLmMKaW5kZXggM2IwZGRjNS4uNzg0ODhiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby82ODMyOGZiLmMKKysrIGIvZHJpdmVycy92aWRlby82ODMyOGZiLmMKQEAgLTEwMiw4ICsxMDIsNyBAQAogCQkJIHVfaW50IHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pOwogc3RhdGljIGludCBtYzY4eDMyOGZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBtYzY4eDMyOGZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworc3RhdGljIGludCBtYzY4eDMyOGZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIAogc3RhdGljIHN0cnVjdCBmYl9vcHMgbWM2OHgzMjhmYl9vcHMgPSB7CiAJLmZiX2NoZWNrX3Zhcgk9IG1jNjh4MzI4ZmJfY2hlY2tfdmFyLApAQCAtMzk4LDggKzM5Nyw3IEBACiAgICAgICogIE1vc3QgZHJpdmVycyBkb24ndCBuZWVkIHRoZWlyIG93biBtbWFwIGZ1bmN0aW9uIAogICAgICAqLwogCi1zdGF0aWMgaW50IG1jNjh4MzI4ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbnQgbWM2OHgzMjhmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKICNpZm5kZWYgTU1VCiAJLyogdGhpcyBpcyB1Q2xpbnV4IChubyBNTVUpIHNwZWNpZmljIGNvZGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYWNvcm5mYi5jIGIvZHJpdmVycy92aWRlby9hY29ybmZiLmMKaW5kZXggNzUwY2ViYi4uYjA1ODI3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hY29ybmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hY29ybmZiLmMKQEAgLTg4Myw3ICs4ODMsNyBAQAogICogTm90ZSB0aGF0IHdlIGFyZSBlbnRlcmVkIHdpdGggdGhlIGtlcm5lbCBsb2NrZWQuCiAgKi8KIHN0YXRpYyBpbnQKLWFjb3JuZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorYWNvcm5mYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAl1bnNpZ25lZCBsb25nIG9mZiwgc3RhcnQ7CiAJdTMyIGxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMgYi9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jCmluZGV4IDBkYTQwODMuLmIyMTg3MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMKKysrIGIvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2xjZGZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLAorc3RhdGljIGludCBjbGNkZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJICAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBjbGNkX2ZiICpmYiA9IHRvX2NsY2QoaW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2FtaWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2FtaWZiLmMKaW5kZXggMmM0MmE4MS4uMzAzM2M3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hbWlmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYW1pZmIuYwpAQCAtMTEzMSw5ICsxMTMxLDcgQEAKIAkJCSAgIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqcmVnaW9uKTsKIHN0YXRpYyB2b2lkIGFtaWZiX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJCSAgICBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKTsKLXN0YXRpYyBpbnQgYW1pZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKLQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgYW1pZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogCiAJLyoKQEAgLTIxNzIsOSArMjE3MCw4IEBACiAJICogQW1pZ2EgRnJhbWUgQnVmZmVyIFNwZWNpZmljIGlvY3RscwogCSAqLwogCi1zdGF0aWMgaW50IGFtaWZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCi0JCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgYW1pZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAl1bmlvbiB7CiAJCXN0cnVjdCBmYl9maXhfY3Vyc29yaW5mbyBmaXg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2FyY2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2FyY2ZiLmMKaW5kZXggODkwNjBiMi4uZGY4ZTU2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hcmNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXJjZmIuYwpAQCAtMzk5LDkgKzM5OSw4IEBACiAJCQkJaW1hZ2UtPmhlaWdodCk7CiB9CiAKLXN0YXRpYyBpbnQgYXJjZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAotCQkJICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgYXJjZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCXN0cnVjdCBhcmNmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXRhZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXRhZmIuYwppbmRleCAxNWVjMTI5Li5lNjlhYjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0YWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdGFmYi5jCkBAIC0yNTcxLDggKzI1NzEsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1hdGFmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcsIGludCBjb24sIHN0cnVjdCBmYl9pbmZvICppbmZvKQorYXRhZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN3aXRjaCAoY21kKSB7CiAjaWZkZWYgRkJDTURfR0VUX0NVUlJFTlRQQVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCmluZGV4IGU2ODYxODUuLmJmYzhhOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYwpAQCAtNDMxLDggKzQzMSw3IEBACiBzdGF0aWMgaW50IGF0eTEyOGZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogCQkJICAgc3RydWN0IGZiX2luZm8gKmZiKTsKIHN0YXRpYyBpbnQgYXR5MTI4ZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqZmIpOwotc3RhdGljIGludCBhdHkxMjhmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdV9pbnQgY21kLAotCQkJICB1X2xvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGF0eTEyOGZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1X2ludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbnQgYXR5MTI4ZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAKICAgICAvKgpAQCAtMjEwOCw4ICsyMTA3LDcgQEAKIC8qIGluIHBhcmFtOiB1MzIqCWJhY2tsaWdodCB2YWx1ZTogMCB0byAxNSAqLwogI2RlZmluZSBGQklPX0FUWTEyOF9TRVRfTUlSUk9SCV9JT1coJ0AnLCAyLCBfX3UzMikKIAotc3RhdGljIGludCBhdHkxMjhmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdV9pbnQgY21kLAotCQkJICB1X2xvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgYXR5MTI4ZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVfaW50IGNtZCwgdV9sb25nIGFyZykKIHsKIAlzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdTMyIHZhbHVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCmluZGV4IGVkODEwMDUuLjQ4NWJlMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKQEAgLTIzOCwxMyArMjM4LDEyIEBACiAJdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBzdGF0aWMgaW50IGF0eWZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBzdGF0aWMgaW50IGF0eWZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBhdHlmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdV9pbnQgY21kLAotCXVfbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgYXR5ZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVfaW50IGNtZCwgdV9sb25nIGFyZyk7CiBleHRlcm4gdm9pZCBhdHlmYl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KTsKIGV4dGVybiB2b2lkIGF0eWZiX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKmFyZWEpOwogZXh0ZXJuIHZvaWQgYXR5ZmJfaW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKTsKICNpZmRlZiBfX3NwYXJjX18KLXN0YXRpYyBpbnQgYXR5ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK3N0YXRpYyBpbnQgYXR5ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogI2VuZGlmCiBzdGF0aWMgaW50IGF0eWZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pOwogCkBAIC0xNzM5LDggKzE3MzgsNyBAQAogI2RlZmluZSBGQklPX1dBSVRGT1JWU1lOQyBfSU9XKCdGJywgMHgyMCwgX191MzIpCiAjZW5kaWYKIAotc3RhdGljIGludCBhdHlmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdV9pbnQgY21kLAotCXVfbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCBhdHlmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQogewogCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKICNpZmRlZiBfX3NwYXJjX18KQEAgLTE4NDUsNyArMTg0Myw3IEBACiB9CiAKICNpZmRlZiBfX3NwYXJjX18KLXN0YXRpYyBpbnQgYXR5ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBhdHlmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CiAJdW5zaWduZWQgaW50IHNpemUsIHBhZ2UsIG1hcF9zaXplID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCmluZGV4IDE1NmRiODQuLmM5ZjBjNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYwpAQCAtODY0LDggKzg2NCw4IEBACiB9CiAKIAotc3RhdGljIGludCByYWRlb25mYl9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IHJhZGVvbmZiX2lvY3RsIChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogICAgICAgICBzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8gPSBpbmZvLT5wYXI7CiAJdW5zaWduZWQgaW50IHRtcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXUxMTAwZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXUxMTAwZmIuYwppbmRleCBhNTEyOTgwLi4yNDA2ODk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdTExMDBmYi5jCkBAIC0zNzksNyArMzc5LDcgQEAKICAqIE1hcCB2aWRlbyBtZW1vcnkgaW4gdXNlciBzcGFjZS4gV2UgZG9uJ3QgdXNlIHRoZSBnZW5lcmljIGZiX21tYXAgbWV0aG9kIG1haW5seQogICogdG8gYWxsb3cgdGhlIHVzZSBvZiB0aGUgVExCIHN0cmVhbWluZyBmbGFnIChDQ0E9NikKICAqLwotaW50IGF1MTEwMGZiX2ZiX21tYXAoc3RydWN0IGZiX2luZm8gKmZiaSwgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoraW50IGF1MTEwMGZiX2ZiX21tYXAoc3RydWN0IGZiX2luZm8gKmZiaSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGF1MTEwMGZiX2RldmljZSAqZmJkZXYgPSB0b19hdTExMDBmYl9kZXZpY2UoZmJpKTsKIAl1bnNpZ25lZCBpbnQgbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9idzIuYyBiL2RyaXZlcnMvdmlkZW8vYncyLmMKaW5kZXggOTI0OGZlMS4uYzAyOWRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9idzIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2J3Mi5jCkBAIC0zNSw5ICszNSw4IEBACiAKIHN0YXRpYyBpbnQgYncyX2JsYW5rKGludCwgc3RydWN0IGZiX2luZm8gKik7CiAKLXN0YXRpYyBpbnQgYncyX21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwotc3RhdGljIGludCBidzJfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKLQkJICAgICB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKK3N0YXRpYyBpbnQgYncyX21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworc3RhdGljIGludCBidzJfaW9jdGwoc3RydWN0IGZiX2luZm8gKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIAogLyoKICAqICBGcmFtZSBidWZmZXIgb3BlcmF0aW9ucwpAQCAtMTY5LDcgKzE2OCw3IEBACiAJeyAuc2l6ZSA9IDAgfQogfTsKIAotc3RhdGljIGludCBidzJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBidzJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGJ3Ml9wYXIgKnBhciA9IChzdHJ1Y3QgYncyX3BhciAqKWluZm8tPnBhcjsKIApAQCAtMTgxLDggKzE4MCw3IEBACiAJCQkJICB2bWEpOwogfQogCi1zdGF0aWMgaW50IGJ3Ml9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGJ3Ml9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGJ3Ml9wYXIgKnBhciA9IChzdHJ1Y3QgYncyX3BhciAqKSBpbmZvLT5wYXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY2cxNC5jIGIvZHJpdmVycy92aWRlby9jZzE0LmMKaW5kZXggYTU2MTQ3MS4uNjNiNmM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jZzE0LmMKKysrIGIvZHJpdmVycy92aWRlby9jZzE0LmMKQEAgLTMxLDkgKzMxLDggQEAKIHN0YXRpYyBpbnQgY2cxNF9zZXRjb2xyZWcodW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQsCiAJCQkgdW5zaWduZWQsIHN0cnVjdCBmYl9pbmZvICopOwogCi1zdGF0aWMgaW50IGNnMTRfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqLCBzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7Ci1zdGF0aWMgaW50IGNnMTRfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKLQkJICAgICAgdW5zaWduZWQgbG9uZywgc3RydWN0IGZiX2luZm8gKik7CitzdGF0aWMgaW50IGNnMTRfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IGNnMTRfaW9jdGwoc3RydWN0IGZiX2luZm8gKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyBpbnQgY2cxNF9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKiwgc3RydWN0IGZiX2luZm8gKik7CiAKIC8qCkBAIC0yNjgsNyArMjY3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjZzE0X21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbnQgY2cxNF9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgY2cxNF9wYXIgKnBhciA9IChzdHJ1Y3QgY2cxNF9wYXIgKikgaW5mby0+cGFyOwogCkBAIC0yNzcsOCArMjc2LDcgQEAKIAkJCQkgIHBhci0+aW9zcGFjZSwgdm1hKTsKIH0KIAotc3RhdGljIGludCBjZzE0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGNnMTRfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBjZzE0X3BhciAqcGFyID0gKHN0cnVjdCBjZzE0X3BhciAqKSBpbmZvLT5wYXI7CiAJc3RydWN0IGNnMTRfcmVncyBfX2lvbWVtICpyZWdzID0gcGFyLT5yZWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jZzMuYyBiL2RyaXZlcnMvdmlkZW8vY2czLmMKaW5kZXggOWZjZDg5Ni4uM2RlNmUxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jZzMuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NnMy5jCkBAIC0zMyw5ICszMyw4IEBACiAJCQkgdW5zaWduZWQsIHN0cnVjdCBmYl9pbmZvICopOwogc3RhdGljIGludCBjZzNfYmxhbmsoaW50LCBzdHJ1Y3QgZmJfaW5mbyAqKTsKIAotc3RhdGljIGludCBjZzNfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqLCBzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7Ci1zdGF0aWMgaW50IGNnM19pb2N0bChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LAotCQkgICAgIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBmYl9pbmZvICopOworc3RhdGljIGludCBjZzNfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IGNnM19pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCiAvKgogICogIEZyYW1lIGJ1ZmZlciBvcGVyYXRpb25zCkBAIC0yMzAsNyArMjI5LDcgQEAKIAl7IC5zaXplID0gMCB9CiB9OwogCi1zdGF0aWMgaW50IGNnM19tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgaW50IGNnM19tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgY2czX3BhciAqcGFyID0gKHN0cnVjdCBjZzNfcGFyICopaW5mby0+cGFyOwogCkBAIC0yNDAsOCArMjM5LDcgQEAKIAkJCQkgIHZtYSk7CiB9CiAKLXN0YXRpYyBpbnQgY2czX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgY2czX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgY2czX3BhciAqcGFyID0gKHN0cnVjdCBjZzNfcGFyICopIGluZm8tPnBhcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jZzYuYyBiL2RyaXZlcnMvdmlkZW8vY2c2LmMKaW5kZXggMDUwODM1ZTMuLjdhYWI5MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2c2LmMKKysrIGIvZHJpdmVycy92aWRlby9jZzYuYwpAQCAtMzYsOSArMzYsOCBAQAogc3RhdGljIHZvaWQgY2c2X2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKik7CiBzdGF0aWMgdm9pZCBjZzZfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKiwgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICopOwogc3RhdGljIGludCBjZzZfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqKTsKLXN0YXRpYyBpbnQgY2c2X21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwotc3RhdGljIGludCBjZzZfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKLQkJICAgICB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKK3N0YXRpYyBpbnQgY2c2X21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworc3RhdGljIGludCBjZzZfaW9jdGwoc3RydWN0IGZiX2luZm8gKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIAogLyoKICAqICBGcmFtZSBidWZmZXIgb3BlcmF0aW9ucwpAQCAtNTI0LDcgKzUyMyw3IEBACiAJeyAuc2l6ZQk9IDAgfQogfTsKIAotc3RhdGljIGludCBjZzZfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBjZzZfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGNnNl9wYXIgKnBhciA9IChzdHJ1Y3QgY2c2X3BhciAqKWluZm8tPnBhcjsKIApAQCAtNTM0LDggKzUzMyw3IEBACiAJCQkJICB2bWEpOwogfQogCi1zdGF0aWMgaW50IGNnNl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGNnNl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGNnNl9wYXIgKnBhciA9IChzdHJ1Y3QgY2c2X3BhciAqKSBpbmZvLT5wYXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jCmluZGV4IDAzNzk4ZTkuLjY1NTMwMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jb250cm9sZmIuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiBzdGF0aWMgaW50IGNvbnRyb2xmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUsCiAJdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBzdGF0aWMgaW50IGNvbnRyb2xmYl9ibGFuayhpbnQgYmxhbmtfbW9kZSwgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBjb250cm9sZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsCitzdGF0aWMgaW50IGNvbnRyb2xmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLAogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIHN0YXRpYyBpbnQgY29udHJvbGZiX3NldF9wYXIgKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyBpbnQgY29udHJvbGZiX2NoZWNrX3ZhciAoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKQEAgLTI4MCw3ICsyODAsNyBAQAogICogZm9yIGNvbnRyb2xmYi4KICAqIE5vdGUgdGhlcmUncyBubyBsb2NraW5nIGluIGhlcmU7IGl0J3MgZG9uZSBpbiBmYl9tbWFwKCkgaW4gZmJtZW0uYy4KICAqLwotc3RhdGljIGludCBjb250cm9sZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsCitzdGF0aWMgaW50IGNvbnRyb2xmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKICAgICAgICB1bnNpZ25lZCBsb25nIG9mZiwgc3RhcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKaW5kZXggMzJhOWI2OS4uZDJkZWRlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYm1lbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwpAQCAtOTU3LDcgKzk1Nyw3IEBACiAJZGVmYXVsdDoKIAkJaWYgKGZiLT5mYl9pb2N0bCA9PSBOVUxMKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiBmYi0+ZmJfaW9jdGwoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBpbmZvKTsKKwkJcmV0dXJuIGZiLT5mYl9pb2N0bChpbmZvLCBjbWQsIGFyZyk7CiAJfQogfQogCkBAIC0xMTA3LDcgKzExMDcsNyBAQAogCiAJZGVmYXVsdDoKIAkJaWYgKGZiLT5mYl9jb21wYXRfaW9jdGwpCi0JCQlyZXQgPSBmYi0+ZmJfY29tcGF0X2lvY3RsKGZpbGUsIGNtZCwgYXJnLCBpbmZvKTsKKwkJCXJldCA9IGZiLT5mYl9jb21wYXRfaW9jdGwoaW5mbywgY21kLCBhcmcpOwogCQlicmVhazsKIAl9CiAJdW5sb2NrX2tlcm5lbCgpOwpAQCAtMTEzNSw3ICsxMTM1LDcgQEAKIAlpZiAoZmItPmZiX21tYXApIHsKIAkJaW50IHJlczsKIAkJbG9ja19rZXJuZWwoKTsKLQkJcmVzID0gZmItPmZiX21tYXAoaW5mbywgZmlsZSwgdm1hKTsKKwkJcmVzID0gZmItPmZiX21tYXAoaW5mbywgdm1hKTsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gcmVzOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmZiLmMgYi9kcml2ZXJzL3ZpZGVvL2ZmYi5jCmluZGV4IGM0ODcwZDUuLjljOWIyMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9mZmIuYwpAQCAtMzcsOSArMzcsOCBAQAogc3RhdGljIHZvaWQgZmZiX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICosIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqKTsKIHN0YXRpYyB2b2lkIGZmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKik7CiBzdGF0aWMgaW50IGZmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICopOwotc3RhdGljIGludCBmZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqLCBzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7Ci1zdGF0aWMgaW50IGZmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LAotCQkgICAgIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBmYl9pbmZvICopOworc3RhdGljIGludCBmZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IGZmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogc3RhdGljIGludCBmZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICosIHN0cnVjdCBmYl9pbmZvICopOwogCiAvKgpAQCAtODM5LDcgKzgzOCw3IEBACiAJeyAuc2l6ZSA9IDAgfQogfTsKIAotc3RhdGljIGludCBmZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBmZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGZmYl9wYXIgKnBhciA9IChzdHJ1Y3QgZmZiX3BhciAqKWluZm8tPnBhcjsKIApAQCAtODQ4LDggKzg0Nyw3IEBACiAJCQkJICAwLCB2bWEpOwogfQogCi1zdGF0aWMgaW50IGZmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGZmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGZmYl9wYXIgKnBhciA9IChzdHJ1Y3QgZmZiX3BhciAqKSBpbmZvLT5wYXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYyBiL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYwppbmRleCBkNzQ0YzUxLi4zOGQyMjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9nYmVmYi5jCkBAIC05NzksNyArOTc5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnYmVmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBpbnQgZ2JlZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKQEAgLTEwMDAsNyArMTAwMCw2IEBACiAJCXBncHJvdF9mYihwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSk7CiAKIAl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPIHwgVk1fUkVTRVJWRUQ7Ci0Jdm1hLT52bV9maWxlID0gZmlsZTsKIAogCS8qIGxvb2sgZm9yIHRoZSBzdGFydGluZyB0aWxlICovCiAJdGlsZSA9ICZnYmVfdGlsZXMuY3B1W29mZnNldCA+PiBUSUxFX1NISUZUXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKaW5kZXggOGU4ZGE3NC4uMjBlNjkxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKQEAgLTIxNSwxMSArMjE1LDExIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24oZGV2LCAxLCAiZ3gxZmIgKHZpZGVvKSIpOworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDAsICJneDFmYiAodmlkZW8pIik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcGFyLT52aWRfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSksCi0JCQkJcGNpX3Jlc291cmNlX2xlbihkZXYsIDEpKTsKKwlwYXItPnZpZF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwKKwkJCQlwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCkpOwogCWlmICghcGFyLT52aWRfcmVncykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTIyOSwxMiArMjI5LDkgQEAKIAlpZiAoIXBhci0+ZGNfcmVncykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24oZGV2LCAwLCAiZ3gxZmIgKGZyYW1lIGJ1ZmZlcikiKTsKLQlpZiAocmV0IDwgMCApCi0JCXJldHVybiAtRUJVU1k7CiAJaWYgKChmYl9sZW4gPSBneDFfZnJhbWVfYnVmZmVyX3NpemUoKSkgPCAwKQogCQlyZXR1cm4gLUVOT01FTTsKLQlpbmZvLT5maXguc21lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOworCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gZ3hfYmFzZSArIDB4ODAwMDAwOwogCWluZm8tPmZpeC5zbWVtX2xlbiA9IGZiX2xlbjsKIAlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXAoaW5mby0+Zml4LnNtZW1fc3RhcnQsIGluZm8tPmZpeC5zbWVtX2xlbik7CiAJaWYgKCFpbmZvLT5zY3JlZW5fYmFzZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaWdhZmIuYyBiL2RyaXZlcnMvdmlkZW8vaWdhZmIuYwppbmRleCBlMzI2ZjQ0Li42Yjg4MDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2lnYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9pZ2FmYi5jCkBAIC0yMTksNyArMjE5LDcgQEAKIH0KIAogI2lmZGVmIF9fc3BhcmNfXwotc3RhdGljIGludCBpZ2FmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBpbnQgaWdhZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGlnYV9wYXIgKnBhciA9IChzdHJ1Y3QgaWdhX3BhciAqKWluZm8tPnBhcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW1zdHRmYi5jIGIvZHJpdmVycy92aWRlby9pbXN0dGZiLmMKaW5kZXggYTVkODEzMC4uYWQ0MTZhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbXN0dGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9pbXN0dGZiLmMKQEAgLTEyNjcsOCArMTI2Nyw3IEBACiAjZGVmaW5lIEZCSU1TVFRfR0VUSURYUkVHCTB4NTQ1NDA2CiAKIHN0YXRpYyBpbnQKLWltc3R0ZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVfaW50IGNtZCwKLQkgICAgICB1X2xvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK2ltc3R0ZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVfaW50IGNtZCwgdV9sb25nIGFyZykKIHsKIAlzdHJ1Y3QgaW1zdHRfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYwppbmRleCAwMDkwNTQ0Li42YjhiZDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMKQEAgLTE1Nyw5ICsxNTcsOCBAQAogCiBzdGF0aWMgaW50IGludGVsZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAKLXN0YXRpYyBpbnQgaW50ZWxmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKLQkJCSBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGludGVsZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpbnRlbGZiX3BjaV9yZWdpc3RlcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKQEAgLTEzODAsOCArMTM3OSw3IEBACiAKIC8qIFdoZW4vaWYgd2UgaGF2ZSBvdXIgb3duIGlvY3Rscy4gKi8KIHN0YXRpYyBpbnQKLWludGVsZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JICAgICAgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoraW50ZWxmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJaW50IHJldHZhbCA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8va3lyby9mYmRldi5jIGIvZHJpdmVycy92aWRlby9reXJvL2ZiZGV2LmMKaW5kZXggYmNkMzU5Yi4uNDc3YWQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9reXJvL2ZiZGV2LmMKKysrIGIvZHJpdmVycy92aWRlby9reXJvL2ZiZGV2LmMKQEAgLTU4Niw5ICs1ODYsOCBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQga3lyb2ZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCi0JCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQga3lyb2ZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJb3ZlcmxheV9jcmVhdGUgb2xfY3JlYXRlOwogCW92ZXJsYXlfdmlld3BvcnRfc2V0IG9sX3ZpZXdwb3J0X3NldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbGVvLmMgYi9kcml2ZXJzL3ZpZGVvL2xlby5jCmluZGV4IDQ5NDI4N2YuLmEyM2NmZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbGVvLmMKKysrIGIvZHJpdmVycy92aWRlby9sZW8uYwpAQCAtMzIsOSArMzIsOCBAQAogCQkJIHVuc2lnbmVkLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKIHN0YXRpYyBpbnQgbGVvX2JsYW5rKGludCwgc3RydWN0IGZiX2luZm8gKik7CiAKLXN0YXRpYyBpbnQgbGVvX21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwotc3RhdGljIGludCBsZW9faW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKLQkJICAgICB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKK3N0YXRpYyBpbnQgbGVvX21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworc3RhdGljIGludCBsZW9faW9jdGwoc3RydWN0IGZiX2luZm8gKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyBpbnQgbGVvX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKIAogLyoKQEAgLTM2Myw3ICszNjIsNyBAQAogCXsgLnNpemUgPSAwIH0KIH07CiAKLXN0YXRpYyBpbnQgbGVvX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbnQgbGVvX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBsZW9fcGFyICpwYXIgPSAoc3RydWN0IGxlb19wYXIgKilpbmZvLT5wYXI7CiAKQEAgLTM3Myw4ICszNzIsNyBAQAogCQkJCSAgdm1hKTsKIH0KIAotc3RhdGljIGludCBsZW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCBsZW9faW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBsZW9fcGFyICpwYXIgPSAoc3RydWN0IGxlb19wYXIgKikgaW5mby0+cGFyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMKaW5kZXggMWU3NGY0Yy4uNDA1NWZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYwpAQCAtODY1LDkgKzg2NSw4IEBACiAJLm5hbWUJID0gIlBhbmVsbGluayBvdXRwdXQiLAogfTsKIAotc3RhdGljIGludCBtYXRyb3hmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCi0JCQkgIHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCBtYXRyb3hmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJTUlORk9fRlJPTV9JTkZPKGluZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuYyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmMKaW5kZXggZDUyZDdkOC4uMjdlYjRiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5jCkBAIC00MTksMTEgKzQxOSwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1hdHJveGZiX2RoX2lvY3RsKHN0cnVjdCBpbm9kZSogaW5vZGUsCi0JCXN0cnVjdCBmaWxlKiBmaWxlLAorc3RhdGljIGludCBtYXRyb3hmYl9kaF9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJdW5zaWduZWQgaW50IGNtZCwKLQkJdW5zaWduZWQgbG9uZyBhcmcsCi0JCXN0cnVjdCBmYl9pbmZvKiBpbmZvKSB7CisJCXVuc2lnbmVkIGxvbmcgYXJnKQorewogI2RlZmluZSBtMmluZm8gKGNvbnRhaW5lcl9vZihpbmZvLCBzdHJ1Y3QgbWF0cm94ZmJfZGhfZmJfaW5mbywgZmJjb24pKQogCU1JTkZPX0ZST00obTJpbmZvLT5wcmltYXJ5X2Rldik7CiAKQEAgLTQ1Nyw3ICs0NTYsNyBAQAogCQljYXNlIE1BVFJPWEZCX0dFVF9PVVRQVVRfTU9ERToKIAkJY2FzZSBNQVRST1hGQl9HRVRfQUxMX09VVFBVVFM6CiAJCQl7Ci0JCQkJcmV0dXJuIEFDQ0VTU19GQklORk8oZmJjb24uZmJvcHMpLT5mYl9pb2N0bChpbm9kZSwgZmlsZSwgY21kLCBhcmcsICZBQ0NFU1NfRkJJTkZPKGZiY29uKSk7CisJCQkJcmV0dXJuIEFDQ0VTU19GQklORk8oZmJjb24uZmJvcHMpLT5mYl9pb2N0bCgmQUNDRVNTX0ZCSU5GTyhmYmNvbiksIGNtZCwgYXJnKTsKIAkJCX0KIAkJY2FzZSBNQVRST1hGQl9TRVRfT1VUUFVUX0NPTk5FQ1RJT046CiAJCQl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9tYXZlbi5jIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfbWF2ZW4uYwppbmRleCBhMWYyYzVlLi42MDE5NzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9tYXZlbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX21hdmVuLmMKQEAgLTk2OCw3ICs5NjgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtYXZlbl9wcm9ncmFtX3RpbW1pbmcoc3RydWN0IG1hdmVuX2RhdGEqIG1kLAorc3RhdGljIGludCBtYXZlbl9wcm9ncmFtX3RpbW1pbmcoc3RydWN0IG1hdmVuX2RhdGEqIG1kLAogCQljb25zdCBzdHJ1Y3QgbWF2ZW5yZWdzKiBtKSB7CiAJc3RydWN0IGkyY19jbGllbnQqIGMgPSBtZC0+Y2xpZW50OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMKaW5kZXggZTE4YzlmOS4uNzQ3NjAyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9uZW9mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbmVvZmIuYwpAQCAtODUzLDcgKzg1Myw3IEBACiAJLyogSWYgdGhlIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IGFueSBkaXNwbGF5IGRldmljZXMsIHRoZW4uLi4gKi8KIAlpZiAocGFyLT5QYW5lbERpc3BDbnRsUmVnMSA9PSAweDAwKSB7CiAJCS8qIERlZmF1bHQgdG8gaW50ZXJuYWwgKGkuZS4sIExDRCkgb25seS4gKi8KLQkJcGFyLT5QYW5lbERpc3BDbnRsUmVnMSB8PSAweDAyOworCQlwYXItPlBhbmVsRGlzcENudGxSZWcxID0gdmdhX3JnZngoTlVMTCwgMHgyMCkgJiAweDAzOwogCX0KIAogCS8qIElmIHdlIGFyZSB1c2luZyBhIGZpeGVkIG1vZGUsIHRoZW4gdGVsbCB0aGUgY2hpcCB3ZSBhcmUuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3A5MTAwLmMgYi9kcml2ZXJzL3ZpZGVvL3A5MTAwLmMKaW5kZXggYjI1MWU3NS4uMGQxOTU3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wOTEwMC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcDkxMDAuYwpAQCAtMzEsOSArMzEsOCBAQAogCQkJICAgdW5zaWduZWQsIHN0cnVjdCBmYl9pbmZvICopOwogc3RhdGljIGludCBwOTEwMF9ibGFuayhpbnQsIHN0cnVjdCBmYl9pbmZvICopOwogCi1zdGF0aWMgaW50IHA5MTAwX21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwotc3RhdGljIGludCBwOTEwMF9pb2N0bChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LAotCQkgICAgICAgdW5zaWduZWQgbG9uZywgc3RydWN0IGZiX2luZm8gKik7CitzdGF0aWMgaW50IHA5MTAwX21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworc3RhdGljIGludCBwOTEwMF9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCiAvKgogICogIEZyYW1lIGJ1ZmZlciBvcGVyYXRpb25zCkBAIC0yMjIsNyArMjIxLDcgQEAKIAl7IDAsCQkJMCwJCTAJCSAgICB9CiB9OwogCi1zdGF0aWMgaW50IHA5MTAwX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbnQgcDkxMDBfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IHA5MTAwX3BhciAqcGFyID0gKHN0cnVjdCBwOTEwMF9wYXIgKilpbmZvLT5wYXI7CiAKQEAgLTIzMiw4ICsyMzEsOCBAQAogCQkJCSAgdm1hKTsKIH0KIAotc3RhdGljIGludCBwOTEwMF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgcDkxMDBfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgcDkxMDBfcGFyICpwYXIgPSAoc3RydWN0IHA5MTAwX3BhciAqKSBpbmZvLT5wYXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG0zZmIuYyBiL2RyaXZlcnMvdmlkZW8vcG0zZmIuYwppbmRleCAyZTExYjYwLi4wZTc4ZGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbTNmYi5jCkBAIC02NTcsOSArNjU3LDcgQEAKIHN0YXRpYyB2b2lkIHBtM2ZiX2RldGVjdCh2b2lkKTsKIHN0YXRpYyBpbnQgcG0zZmJfcGFuX2Rpc3BsYXkoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCiAJCQkgICAgIHN0cnVjdCBmYl9pbmZvX2dlbiAqaW5mbyk7Ci1zdGF0aWMgaW50IHBtM2ZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICB1X2ludCBjbWQsIHVfbG9uZyBhcmcsIGludCBjb24sCi0JCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IHBtM2ZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1X2ludCBjbWQsIHVfbG9uZyBhcmcpOwogCiAKIC8qIHRoZSBzdHJ1Y3QgdGhhdCBob2xkIHRoZW0gdG9nZXRoZXIgKi8KQEAgLTM0MzgsOSArMzQzNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcG0zZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVfaW50IGNtZCwgdV9sb25nIGFyZywgaW50IGNvbiwKLQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCBwbTNmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQogewogCXN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8gPSAoc3RydWN0IHBtM2ZiX2luZm8gKikgaW5mbzsKIAl1MzIgY20sIGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BtYWctYWEtZmIuYyBiL2RyaXZlcnMvdmlkZW8vcG1hZy1hYS1mYi5jCmluZGV4IDI4ZDFmZTUuLmQ5MmYzNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcG1hZy1hYS1mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcG1hZy1hYS1mYi5jCkBAIC0yOTksOCArMjk5LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgYWFmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdTMyIGNtZCwKLQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcsIGludCBjb24sIHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCBhYWZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1MzIgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAkvKiBUT0RPOiBOb3QgeWV0IGltcGxlbWVudGVkICovCiAJcmV0dXJuIC1FTk9JT0NUTENNRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcHhhZmIuYyBiL2RyaXZlcnMvdmlkZW8vcHhhZmIuYwppbmRleCA5ZmMxMGI5Li41M2FkNjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9weGFmYi5jCkBAIC0zOTUsNyArMzk1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBweGFmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBpbnQgcHhhZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IHB4YWZiX2luZm8gKmZiaSA9IChzdHJ1Y3QgcHhhZmJfaW5mbyAqKWluZm87CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3JhZGVvbmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3JhZGVvbmZiLmMKaW5kZXggNjAwMzE4Zi4uZGI5ZmI5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9yYWRlb25mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcmFkZW9uZmIuYwpAQCAtMTQ5Nyw4ICsxNDk3LDggQEAKIH0KIAogCi1zdGF0aWMgaW50IHJhZGVvbmZiX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgcmFkZW9uZmJfaW9jdGwgKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAgICAgICAgIHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbyA9IChzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqKSBpbmZvOwogCXVuc2lnbmVkIGludCB0bXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NhMTEwMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3NhMTEwMGZiLmMKaW5kZXggMDg3ZTU4Ni4uOGE4OTNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zYTExMDBmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2ExMTAwZmIuYwpAQCAtODE1LDcgKzgxNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2ExMTAwZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsCitzdGF0aWMgaW50IHNhMTEwMGZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCQkgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IHNhMTEwMGZiX2luZm8gKmZiaSA9IChzdHJ1Y3Qgc2ExMTAwZmJfaW5mbyAqKWluZm87CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCmluZGV4IDcwNTQ2NjAuLjJlNmRmMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIHN0YXRpYyBpbnQgc2dpdndmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sCiAJCQkgICAgIHVfaW50IGJsdWUsIHVfaW50IHRyYW5zcCwKIAkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBzZ2l2d2ZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLAorc3RhdGljIGludCBzZ2l2d2ZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHNnaXZ3ZmJfb3BzID0gewpAQCAtNzA2LDcgKzcwNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2dpdndmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBpbnQgc2dpdndmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJdW5zaWduZWQgbG9uZyBzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwpAQCAtNzIzLDcgKzcyMyw2IEBACiAJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIG9mZnNldCA+PiBQQUdFX1NISUZULAogCQkJCQkJc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQogCQlyZXR1cm4gLUVBR0FJTjsKLQl2bWEtPnZtX2ZpbGUgPSBmaWxlOwogCXByaW50ayhLRVJOX0RFQlVHICJzZ2l2d2ZiOiBtbWFwIGZyYW1lYnVmZmVyIFAoJWx4KS0+ViglbHgpXG4iLAogCSAgICAgICBvZmZzZXQsIHZtYS0+dm1fc3RhcnQpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMKaW5kZXggZGVhMWE0Ni4uOGFkZjViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYworKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jCkBAIC0xNzQzLDEzICsxNzQzLDE0IEBACiAKIC8qIC0tLS0tLS0tLS0tIEZCRGV2IHJlbGF0ZWQgcm91dGluZXMgZm9yIGFsbCBzZXJpZXMgLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50Ci1zaXNmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCSAgICBpbnQgY29uLAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTUpCitzdGF0aWMgaW50CXNpc2ZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQorI2Vsc2UKK3N0YXRpYyBpbnQJc2lzZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pCiAjZW5kaWYKLQkgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHNpc192aWRlb19pbmZvCSppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopaW5mby0+cGFyOwogCXN0cnVjdCBzaXNfbWVtcmVxCXNpc21lbXJlcTsKQEAgLTE5MjQsMTkgKzE5MjUsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgU0lTX05FV19DT05GSUdfQ09NUEFUCi1zdGF0aWMgbG9uZwotc2lzZmJfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0JaW50IHJldDsKLQotCWxvY2tfa2VybmVsKCk7Ci0JcmV0ID0gc2lzZmJfaW9jdGwoTlVMTCwgZiwgY21kLCBhcmcsIGluZm8pOwotCXVubG9ja19rZXJuZWwoKTsKLQlyZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbnQKIHNpc2ZiX2dldF9maXgoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsIGludCBjb24sIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewpAQCAtMjAwNyw3ICsxOTk1LDcgQEAKICNlbmRpZgogCS5mYl9zeW5jCT0gZmJjb25fc2lzX3N5bmMsCiAjaWZkZWYgU0lTX05FV19DT05GSUdfQ09NUEFUCi0JLmZiX2NvbXBhdF9pb2N0bD0gc2lzZmJfY29tcGF0X2lvY3RsLAorCS5mYl9jb21wYXRfaW9jdGw9IHNpc2ZiX2lvY3RsLAogI2VuZGlmCiAJLmZiX2lvY3RsCT0gc2lzZmJfaW9jdGwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5oIGIvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uaAppbmRleCA0NDViY2JiLi43MGI2ZGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmgKQEAgLTcyNyw5ICs3MjcsMTQgQEAKICNlbmRpZgogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTUpCitzdGF0aWMgaW50CXNpc2ZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyNlbHNlCiBzdGF0aWMgaW50CXNpc2ZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAogCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKKyNlbmRpZgogc3RhdGljIGludAlzaXNmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyBpbnQJc2lzZmJfYmxhbmsoaW50IGJsYW5rLAogCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc3N0ZmIuYyBiL2RyaXZlcnMvdmlkZW8vc3N0ZmIuYwppbmRleCA4YTVjZTIxLi45OTkyMWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NzdGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zc3RmYi5jCkBAIC03NzEsOCArNzcxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzc3RmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQgY21kLCB1X2xvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyApCitzdGF0aWMgaW50IHNzdGZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1X2ludCBjbWQsIHVfbG9uZyBhcmcpCiB7CiAJc3RydWN0IHNzdGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXN0cnVjdCBwY2lfZGV2ICpzc3RfZGV2ID0gcGFyLT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3RjeC5jIGIvZHJpdmVycy92aWRlby90Y3guYwppbmRleCAyYjI3YjQ0Li45NWI5MTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3RjeC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdGN4LmMKQEAgLTMzLDkgKzMzLDggQEAKIAkJCSB1bnNpZ25lZCwgc3RydWN0IGZiX2luZm8gKik7CiBzdGF0aWMgaW50IHRjeF9ibGFuayhpbnQsIHN0cnVjdCBmYl9pbmZvICopOwogCi1zdGF0aWMgaW50IHRjeF9tbWFwKHN0cnVjdCBmYl9pbmZvICosIHN0cnVjdCBmaWxlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKLXN0YXRpYyBpbnQgdGN4X2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsCi0JCSAgICAgdW5zaWduZWQgbG9uZywgc3RydWN0IGZiX2luZm8gKik7CitzdGF0aWMgaW50IHRjeF9tbWFwKHN0cnVjdCBmYl9pbmZvICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgdGN4X2lvY3RsKHN0cnVjdCBmYl9pbmZvICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgaW50IHRjeF9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKiwgc3RydWN0IGZiX2luZm8gKik7CiAKIC8qCkBAIC0zMDIsNyArMzAxLDcgQEAKIAl7IC5zaXplID0gMCB9CiB9OwogCi1zdGF0aWMgaW50IHRjeF9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgaW50IHRjeF9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgdGN4X3BhciAqcGFyID0gKHN0cnVjdCB0Y3hfcGFyICopaW5mby0+cGFyOwogCkBAIC0zMTIsOCArMzExLDggQEAKIAkJCQkgIHZtYSk7CiB9CiAKLXN0YXRpYyBpbnQgdGN4X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgdGN4X2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCB0Y3hfcGFyICpwYXIgPSAoc3RydWN0IHRjeF9wYXIgKikgaW5mby0+cGFyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZmYi5jIGIvZHJpdmVycy92aWRlby92ZmIuYwppbmRleCBmZmExYWQ0Li41MzIwOGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmZiLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAkJCSB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyBpbnQgdmZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCB2ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsCitzdGF0aWMgaW50IHZmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogCiBzdGF0aWMgc3RydWN0IGZiX29wcyB2ZmJfb3BzID0gewpAQCAtMzY4LDcgKzM2OCw3IEBACiAgICAgICogIE1vc3QgZHJpdmVycyBkb24ndCBuZWVkIHRoZWlyIG93biBtbWFwIGZ1bmN0aW9uIAogICAgICAqLwogCi1zdGF0aWMgaW50IHZmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBpbnQgdmZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCSAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvem9ycm8vem9ycm8tZHJpdmVyLmMgYi9kcml2ZXJzL3pvcnJvL3pvcnJvLWRyaXZlci5jCmluZGV4IGNjYmEyMjcuLmZjYmVlNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvem9ycm8vem9ycm8tZHJpdmVyLmMKKysrIGIvZHJpdmVycy96b3Jyby96b3Jyby1kcml2ZXIuYwpAQCAtNzcsNyArNzcsNiBAQAogCS8qIGluaXRpYWxpemUgY29tbW9uIGRyaXZlciBmaWVsZHMgKi8KIAlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZ6b3Jyb19idXNfdHlwZTsKLQlkcnYtPmRyaXZlci5wcm9iZSA9IHpvcnJvX2RldmljZV9wcm9iZTsKIAogCS8qIHJlZ2lzdGVyIHdpdGggY29yZSAqLwogCWNvdW50ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CkBAIC0xMzIsNyArMTMxLDggQEAKIAogc3RydWN0IGJ1c190eXBlIHpvcnJvX2J1c190eXBlID0gewogCS5uYW1lCT0gInpvcnJvIiwKLQkubWF0Y2gJPSB6b3Jyb19idXNfbWF0Y2gKKwkubWF0Y2gJPSB6b3Jyb19idXNfbWF0Y2gsCisJLnByb2JlCT0gem9ycm9fZGV2aWNlX3Byb2JlLAogfTsKIAogCmRpZmYgLS1naXQgYS9mcy85cC9jb252LmMgYi9mcy85cC9jb252LmMKaW5kZXggNTVjY2ZhMS4uMzJhOWY5OSAxMDA2NDQKLS0tIGEvZnMvOXAvY29udi5jCisrKyBiL2ZzLzlwL2NvbnYuYwpAQCAtNTYsNyArNTYsNyBAQAogCXJldHVybiBidWYtPnAgPiBidWYtPmVwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBidWZfY2hlY2tfc2l6ZShzdHJ1Y3QgY2J1ZiAqYnVmLCBpbnQgbGVuKQorc3RhdGljIGludCBidWZfY2hlY2tfc2l6ZShzdHJ1Y3QgY2J1ZiAqYnVmLCBpbnQgbGVuKQogewogCWlmIChidWYtPnAgKyBsZW4gPiBidWYtPmVwKSB7CiAJCWlmIChidWYtPnAgPCBidWYtPmVwKSB7CkBAIC03Miw3ICs3Miw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqYnVmX2FsbG9jKHN0cnVjdCBjYnVmICpidWYsIGludCBsZW4pCitzdGF0aWMgdm9pZCAqYnVmX2FsbG9jKHN0cnVjdCBjYnVmICpidWYsIGludCBsZW4pCiB7CiAJdm9pZCAqcmV0ID0gTlVMTDsKIApAQCAtODQsNyArODQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBidWZfcHV0X2ludDgoc3RydWN0IGNidWYgKmJ1ZiwgdTggdmFsKQorc3RhdGljIHZvaWQgYnVmX3B1dF9pbnQ4KHN0cnVjdCBjYnVmICpidWYsIHU4IHZhbCkKIHsKIAlpZiAoYnVmX2NoZWNrX3NpemUoYnVmLCAxKSkgewogCQlidWYtPnBbMF0gPSB2YWw7CkBAIC05Miw3ICs5Miw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYnVmX3B1dF9pbnQxNihzdHJ1Y3QgY2J1ZiAqYnVmLCB1MTYgdmFsKQorc3RhdGljIHZvaWQgYnVmX3B1dF9pbnQxNihzdHJ1Y3QgY2J1ZiAqYnVmLCB1MTYgdmFsKQogewogCWlmIChidWZfY2hlY2tfc2l6ZShidWYsIDIpKSB7CiAJCSooX19sZTE2ICopIGJ1Zi0+cCA9IGNwdV90b19sZTE2KHZhbCk7CkBAIC0xMDAsNyArMTAwLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBidWZfcHV0X2ludDMyKHN0cnVjdCBjYnVmICpidWYsIHUzMiB2YWwpCitzdGF0aWMgdm9pZCBidWZfcHV0X2ludDMyKHN0cnVjdCBjYnVmICpidWYsIHUzMiB2YWwpCiB7CiAJaWYgKGJ1Zl9jaGVja19zaXplKGJ1ZiwgNCkpIHsKIAkJKihfX2xlMzIgKilidWYtPnAgPSBjcHVfdG9fbGUzMih2YWwpOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYnVmX3B1dF9pbnQ2NChzdHJ1Y3QgY2J1ZiAqYnVmLCB1NjQgdmFsKQorc3RhdGljIHZvaWQgYnVmX3B1dF9pbnQ2NChzdHJ1Y3QgY2J1ZiAqYnVmLCB1NjQgdmFsKQogewogCWlmIChidWZfY2hlY2tfc2l6ZShidWYsIDgpKSB7CiAJCSooX19sZTY0ICopYnVmLT5wID0gY3B1X3RvX2xlNjQodmFsKTsKQEAgLTExNiw3ICsxMTYsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGJ1Zl9wdXRfc3RyaW5nbihzdHJ1Y3QgY2J1ZiAqYnVmLCBjb25zdCBjaGFyICpzLCB1MTYgc2xlbikKK3N0YXRpYyB2b2lkIGJ1Zl9wdXRfc3RyaW5nbihzdHJ1Y3QgY2J1ZiAqYnVmLCBjb25zdCBjaGFyICpzLCB1MTYgc2xlbikKIHsKIAlpZiAoYnVmX2NoZWNrX3NpemUoYnVmLCBzbGVuICsgMikpIHsKIAkJYnVmX3B1dF9pbnQxNihidWYsIHNsZW4pOwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJYnVmX3B1dF9zdHJpbmduKGJ1Ziwgcywgc3RybGVuKHMpKTsKIH0KIAotc3RhdGljIGlubGluZSB1OCBidWZfZ2V0X2ludDgoc3RydWN0IGNidWYgKmJ1ZikKK3N0YXRpYyB1OCBidWZfZ2V0X2ludDgoc3RydWN0IGNidWYgKmJ1ZikKIHsKIAl1OCByZXQgPSAwOwogCkBAIC0xNDIsNyArMTQyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHUxNiBidWZfZ2V0X2ludDE2KHN0cnVjdCBjYnVmICpidWYpCitzdGF0aWMgdTE2IGJ1Zl9nZXRfaW50MTYoc3RydWN0IGNidWYgKmJ1ZikKIHsKIAl1MTYgcmV0ID0gMDsKIApAQCAtMTU0LDcgKzE1NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgYnVmX2dldF9pbnQzMihzdHJ1Y3QgY2J1ZiAqYnVmKQorc3RhdGljIHUzMiBidWZfZ2V0X2ludDMyKHN0cnVjdCBjYnVmICpidWYpCiB7CiAJdTMyIHJldCA9IDA7CiAKQEAgLTE2Niw3ICsxNjYsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTY0IGJ1Zl9nZXRfaW50NjQoc3RydWN0IGNidWYgKmJ1ZikKK3N0YXRpYyB1NjQgYnVmX2dldF9pbnQ2NChzdHJ1Y3QgY2J1ZiAqYnVmKQogewogCXU2NCByZXQgPSAwOwogCkBAIC0xNzgsNyArMTc4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYnVmX2dldF9zdHIoc3RydWN0IGNidWYgKmJ1Ziwgc3RydWN0IHY5ZnNfc3RyICp2c3RyKQorc3RhdGljIHZvaWQgYnVmX2dldF9zdHIoc3RydWN0IGNidWYgKmJ1Ziwgc3RydWN0IHY5ZnNfc3RyICp2c3RyKQogewogCXZzdHItPmxlbiA9IGJ1Zl9nZXRfaW50MTYoYnVmKTsKIAlpZiAoIWJ1Zl9jaGVja19vdmVyZmxvdyhidWYpICYmIGJ1Zl9jaGVja19zaXplKGJ1ZiwgdnN0ci0+bGVuKSkgewpAQCAtMTkwLDcgKzE5MCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYnVmX2dldF9xaWQoc3RydWN0IGNidWYgKmJ1ZnAsIHN0cnVjdCB2OWZzX3FpZCAqcWlkKQorc3RhdGljIHZvaWQgYnVmX2dldF9xaWQoc3RydWN0IGNidWYgKmJ1ZnAsIHN0cnVjdCB2OWZzX3FpZCAqcWlkKQogewogCXFpZC0+dHlwZSA9IGJ1Zl9nZXRfaW50OChidWZwKTsKIAlxaWQtPnZlcnNpb24gPSBidWZfZ2V0X2ludDMyKGJ1ZnApOwpAQCAtMjU0LDcgKzI1NCw3IEBACiAgKgogICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIGJ1Zl9nZXRfc3RhdChzdHJ1Y3QgY2J1ZiAqYnVmcCwgc3RydWN0IHY5ZnNfc3RhdCAqc3RhdCwgaW50IGV4dGVuZGVkKQogewogCXN0YXQtPnNpemUgPSBidWZfZ2V0X2ludDE2KGJ1ZnApOwpAQCAtNDI3LDcgKzQyNyw3IEBACiAJYnVmX3B1dF9pbnQ2NChidWZwLCB2YWwpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiB2OWZzX3B1dF9zdHIoc3RydWN0IGNidWYgKmJ1ZnAsIGNoYXIgKmRhdGEsIHN0cnVjdCB2OWZzX3N0ciAqc3RyKQogewogCWlmIChkYXRhKSB7CkBAIC00NDEsNyArNDQxLDcgQEAKIAlidWZfcHV0X3N0cmluZ24oYnVmcCwgZGF0YSwgc3RyLT5sZW4pOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogdjlmc19wdXRfdXNlcl9kYXRhKHN0cnVjdCBjYnVmICpidWZwLCBjb25zdCBjaGFyIF9fdXNlciAqIGRhdGEsIGludCBjb3VudCwKIAkJICAgdW5zaWduZWQgY2hhciAqKnBkYXRhKQogewpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9yb290LmMgYi9mcy9hdXRvZnM0L3Jvb3QuYwppbmRleCBlOTNhN2FlLi42MmQ4ZDRhIDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L3Jvb3QuYworKysgYi9mcy9hdXRvZnM0L3Jvb3QuYwpAQCAtMTk1LDYgKzE5NSw4IEBACiAJCWlmICghZW1wdHkpCiAJCQlkX2ludmFsaWRhdGUoZGVudHJ5KTsKIAorCQluZC5kZW50cnkgPSBkZW50cnk7CisJCW5kLm1udCA9IG1udDsKIAkJbmQuZmxhZ3MgPSBMT09LVVBfRElSRUNUT1JZOwogCQlzdGF0dXMgPSAoZGVudHJ5LT5kX29wLT5kX3JldmFsaWRhdGUpKGRlbnRyeSwgJm5kKTsKIApkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2VsZi5jIGIvZnMvYmluZm10X2VsZi5jCmluZGV4IGY5NzllYmIuLjFiMTE3YTQgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9lbGYuYworKysgYi9mcy9iaW5mbXRfZWxmLmMKQEAgLTEyMTgsNyArMTIxOCw3IEBACiAJaWYgKCFkdW1wX3NlZWsoZmlsZSwgKG9mZikpKSBcCiAJCWdvdG8gZW5kX2NvcmVkdW1wOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9lbGZfaGVhZGVyKHN0cnVjdCBlbGZoZHIgKmVsZiwgaW50IHNlZ3MpCitzdGF0aWMgdm9pZCBmaWxsX2VsZl9oZWFkZXIoc3RydWN0IGVsZmhkciAqZWxmLCBpbnQgc2VncykKIHsKIAltZW1jcHkoZWxmLT5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpOwogCWVsZi0+ZV9pZGVudFtFSV9DTEFTU10gPSBFTEZfQ0xBU1M7CkBAIC0xMjQzLDcgKzEyNDMsNyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZpbGxfZWxmX25vdGVfcGhkcihzdHJ1Y3QgZWxmX3BoZHIgKnBoZHIsIGludCBzeiwgb2ZmX3Qgb2Zmc2V0KQorc3RhdGljIHZvaWQgZmlsbF9lbGZfbm90ZV9waGRyKHN0cnVjdCBlbGZfcGhkciAqcGhkciwgaW50IHN6LCBvZmZfdCBvZmZzZXQpCiB7CiAJcGhkci0+cF90eXBlID0gUFRfTk9URTsKIAlwaGRyLT5wX29mZnNldCA9IG9mZnNldDsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9taXNjLmMgYi9mcy9iaW5mbXRfbWlzYy5jCmluZGV4IDljY2M3ZDguLjZhN2I3MzAgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9taXNjLmMKKysrIGIvZnMvYmluZm10X21pc2MuYwpAQCAtMjY0LDcgKzI2NCw3IEBACiAJcmV0dXJuIHAgLSBmcm9tOwogfQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKiBjaGVja19zcGVjaWFsX2ZsYWdzIChjaGFyICogc2ZzLCBOb2RlICogZSkKK3N0YXRpYyBjaGFyICogY2hlY2tfc3BlY2lhbF9mbGFncyAoY2hhciAqIHNmcywgTm9kZSAqIGUpCiB7CiAJY2hhciAqIHAgPSBzZnM7CiAJaW50IGNvbnQgPSAxOwpkaWZmIC0tZ2l0IGEvZnMvYmlvLmMgYi9mcy9iaW8uYwppbmRleCA3YjMwNjk1Li5iYmM0NDJiIDEwMDY0NAotLS0gYS9mcy9iaW8uYworKysgYi9mcy9iaW8uYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJYmlvX2ZyZWUoYmlvLCBmc19iaW9fc2V0KTsKIH0KIAotaW5saW5lIHZvaWQgYmlvX2luaXQoc3RydWN0IGJpbyAqYmlvKQordm9pZCBiaW9faW5pdChzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJYmlvLT5iaV9uZXh0ID0gTlVMTDsKIAliaW8tPmJpX2JkZXYgPSBOVUxMOwpAQCAtMjUzLDcgKzI1Myw3IEBACiAgKgl0aGUgYWN0dWFsIGRhdGEgaXQgcG9pbnRzIHRvLiBSZWZlcmVuY2UgY291bnQgb2YgcmV0dXJuZWQKICAqIAliaW8gd2lsbCBiZSBvbmUuCiAgKi8KLWlubGluZSB2b2lkIF9fYmlvX2Nsb25lKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpbyAqYmlvX3NyYykKK3ZvaWQgX19iaW9fY2xvbmUoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgYmlvICpiaW9fc3JjKQogewogCXJlcXVlc3RfcXVldWVfdCAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGJpb19zcmMtPmJpX2JkZXYpOwogCmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IGI5YmI3YWQuLjdjZGY0OGEgMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC0xMTY1LDcgKzExNjUsNyBAQAogICogc29tZSBvZiB0aG9zZSBidWZmZXJzIG1heSBiZSBhbGlhc2VzIG9mIGZpbGVzeXN0ZW0gZGF0YS4KICAqIGdyb3dfZGV2X3BhZ2UoKSB3aWxsIGdvIEJVRygpIGlmIHRoaXMgaGFwcGVucy4KICAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIGdyb3dfYnVmZmVycyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHNpemUpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC0xMzkxLDcgKzEzOTEsNyBAQAogLyoKICAqIExvb2sgdXAgdGhlIGJoIGluIHRoaXMgY3B1J3MgTFJVLiAgSWYgaXQncyB0aGVyZSwgbW92ZSBpdCB0byB0aGUgaGVhZC4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqCiBsb29rdXBfYmhfbHJ1KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGJsb2NrLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJldCA9IE5VTEw7CkBAIC0xNTQxLDcgKzE1NDEsNyBAQAogLyoKICAqIENhbGxlZCB3aGVuIHRydW5jYXRpbmcgYSBidWZmZXIgb24gYSBwYWdlIGNvbXBsZXRlbHkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXNjYXJkX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3N0YXRpYyB2b2lkIGRpc2NhcmRfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQogewogCWxvY2tfYnVmZmVyKGJoKTsKIAljbGVhcl9idWZmZXJfZGlydHkoYmgpOwpkaWZmIC0tZ2l0IGEvZnMvY2hhcl9kZXYuYyBiL2ZzL2NoYXJfZGV2LmMKaW5kZXggM2IxYjFlZS4uMjExOTVjNCAxMDA2NDQKLS0tIGEvZnMvY2hhcl9kZXYuYworKysgYi9mcy9jaGFyX2Rldi5jCkBAIC0zNSw3ICszNSw3IEBACiAJdW5zaWduZWQgaW50IG1ham9yOwogCXVuc2lnbmVkIGludCBiYXNlbWlub3I7CiAJaW50IG1pbm9yY3Q7Ci0JY29uc3QgY2hhciAqbmFtZTsKKwljaGFyIG5hbWVbNjRdOwogCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHM7CiAJc3RydWN0IGNkZXYgKmNkZXY7CQkvKiB3aWxsIGRpZSAqLwogfSAqY2hyZGV2c1tNQVhfUFJPQkVfSEFTSF07CkBAIC00NiwzNCArNDYsODQgQEAKIAlyZXR1cm4gbWFqb3IgJSBNQVhfUFJPQkVfSEFTSDsKIH0KIAotLyogZ2V0IGNoYXIgZGV2aWNlIG5hbWVzIGluIHNvbWV3aGF0IHJhbmRvbSBvcmRlciAqLwotaW50IGdldF9jaHJkZXZfbGlzdChjaGFyICpwYWdlKQorc3RydWN0IGNocmRldl9pbmZvIHsKKwlpbnQgaW5kZXg7CisJc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqY2Q7Cit9OworCit2b2lkICpnZXRfbmV4dF9jaHJkZXYodm9pZCAqZGV2KQoreworCXN0cnVjdCBjaHJkZXZfaW5mbyAqaW5mbzsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbmZvKQorCQkJZ290byBvdXQ7CisJCWluZm8tPmluZGV4PTA7CisJCWluZm8tPmNkID0gY2hyZGV2c1tpbmZvLT5pbmRleF07CisJCWlmIChpbmZvLT5jZCkKKwkJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCWluZm8gPSBkZXY7CisJfQorCisJd2hpbGUgKGluZm8tPmluZGV4IDwgQVJSQVlfU0laRShjaHJkZXZzKSkgeworCQlpZiAoaW5mby0+Y2QpCisJCQlpbmZvLT5jZCA9IGluZm8tPmNkLT5uZXh0OworCQlpZiAoaW5mby0+Y2QpCisJCQlnb3RvIG91dDsKKwkJLyoKKwkJICogTm8gZGV2aWNlcyBvbiB0aGlzIGNoYWluLCBtb3ZlIHRvIHRoZSBuZXh0CisJCSAqLworCQlpbmZvLT5pbmRleCsrOworCQlpbmZvLT5jZCA9IChpbmZvLT5pbmRleCA8IEFSUkFZX1NJWkUoY2hyZGV2cykpID8KKwkJCWNocmRldnNbaW5mby0+aW5kZXhdIDogTlVMTDsKKwkJaWYgKGluZm8tPmNkKQorCQkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJcmV0dXJuIGluZm87Cit9CisKK3ZvaWQgKmFjcXVpcmVfY2hyZGV2X2xpc3Qodm9pZCkKK3sKKwlkb3duKCZjaHJkZXZzX2xvY2spOworCXJldHVybiBnZXRfbmV4dF9jaHJkZXYoTlVMTCk7Cit9CisKK3ZvaWQgcmVsZWFzZV9jaHJkZXZfbGlzdCh2b2lkICpkZXYpCit7CisJdXAoJmNocmRldnNfbG9jayk7CisJa2ZyZWUoZGV2KTsKK30KKworCitpbnQgY291bnRfY2hyZGV2X2xpc3Qodm9pZCkKIHsKIAlzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0ICpjZDsKLQlpbnQgaSwgbGVuOworCWludCBpLCBjb3VudDsKIAotCWxlbiA9IHNwcmludGYocGFnZSwgIkNoYXJhY3RlciBkZXZpY2VzOlxuIik7CisJY291bnQgPSAwOwogCi0JZG93bigmY2hyZGV2c19sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaHJkZXZzKSA7IGkrKykgewotCQlmb3IgKGNkID0gY2hyZGV2c1tpXTsgY2Q7IGNkID0gY2QtPm5leHQpIHsKLQkJCS8qCi0JCQkgKiBpZiB0aGUgY3VycmVudCBuYW1lLCBwbHVzIHRoZSA1IGV4dHJhIGNoYXJhY3RlcnMKLQkJCSAqIGluIHRoZSBkZXZpY2UgbGluZSBmb3IgdGhpcyBlbnRyeQotCQkJICogd291bGQgcnVuIHVzIG9mZiB0aGUgcGFnZSwgd2UncmUgZG9uZQotCQkJICovCi0JCQlpZiAoKGxlbitzdHJsZW4oY2QtPm5hbWUpICsgNSkgPj0gUEFHRV9TSVpFKQotCQkJCWdvdG8gcGFnZV9mdWxsOwotCi0KLQkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiJTNkICVzXG4iLAotCQkJCSAgICAgICBjZC0+bWFqb3IsIGNkLT5uYW1lKTsKLQkJfQorCQlmb3IgKGNkID0gY2hyZGV2c1tpXTsgY2Q7IGNkID0gY2QtPm5leHQpCisJCQljb3VudCsrOwogCX0KLXBhZ2VfZnVsbDoKLQl1cCgmY2hyZGV2c19sb2NrKTsKIAotCXJldHVybiBsZW47CisJcmV0dXJuIGNvdW50OworfQorCitpbnQgZ2V0X2NocmRldl9pbmZvKHZvaWQgKmRldiwgaW50ICptYWpvciwgY2hhciAqKm5hbWUpCit7CisJc3RydWN0IGNocmRldl9pbmZvICppbmZvID0gZGV2OworCisJaWYgKGluZm8tPmNkID09IE5VTEwpCisJCXJldHVybiAxOworCisJKm1ham9yID0gaW5mby0+Y2QtPm1ham9yOworCSpuYW1lID0gaW5mby0+Y2QtPm5hbWU7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xMjEsNyArMTcxLDcgQEAKIAljZC0+bWFqb3IgPSBtYWpvcjsKIAljZC0+YmFzZW1pbm9yID0gYmFzZW1pbm9yOwogCWNkLT5taW5vcmN0ID0gbWlub3JjdDsKLQljZC0+bmFtZSA9IG5hbWU7CisJc3RybmNweShjZC0+bmFtZSxuYW1lLCA2NCk7CiAKIAlpID0gbWFqb3JfdG9faW5kZXgobWFqb3IpOwogCmRpZmYgLS1naXQgYS9mcy9jb21wYXQuYyBiL2ZzL2NvbXBhdC5jCmluZGV4IDI3MWI3NWQuLjI0NjhhYzEgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdC5jCisrKyBiL2ZzL2NvbXBhdC5jCkBAIC0xNTM3LDcgKzE1MzcsNyBAQAogICogT29vLCBuYXN0eS4gIFdlIG5lZWQgaGVyZSB0byBmcm9iIDMyLWJpdCB1bnNpZ25lZCBsb25ncyB0bwogICogNjQtYml0IHVuc2lnbmVkIGxvbmdzLgogICovCi1zdGF0aWMgaW5saW5lCitzdGF0aWMKIGludCBjb21wYXRfZ2V0X2ZkX3NldCh1bnNpZ25lZCBsb25nIG5yLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKnVmZHNldCwKIAkJCXVuc2lnbmVkIGxvbmcgKmZkc2V0KQogewpAQCAtMTU3MCw3ICsxNTcwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZQorc3RhdGljCiB2b2lkIGNvbXBhdF9zZXRfZmRfc2V0KHVuc2lnbmVkIGxvbmcgbnIsIGNvbXBhdF91bG9uZ190IF9fdXNlciAqdWZkc2V0LAogCQkJdW5zaWduZWQgbG9uZyAqZmRzZXQpCiB7CmRpZmYgLS1naXQgYS9mcy9kY2FjaGUuYyBiL2ZzL2RjYWNoZS5jCmluZGV4IDEzNGQ2NzcuLjg2YmRiOTMgMTAwNjQ0Ci0tLSBhL2ZzL2RjYWNoZS5jCisrKyBiL2ZzL2RjYWNoZS5jCkBAIC05NCw3ICs5NCw3IEBACiAgKiBkX2lwdXQoKSBvcGVyYXRpb24gaWYgZGVmaW5lZC4KICAqIENhbGxlZCB3aXRoIGRjYWNoZV9sb2NrIGFuZCBwZXIgZGVudHJ5IGxvY2sgaGVsZCwgZHJvcHMgYm90aC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGRlbnRyeV9pcHV0KHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCitzdGF0aWMgdm9pZCBkZW50cnlfaXB1dChzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJaWYgKGlub2RlKSB7CmRpZmYgLS1naXQgYS9mcy9leGVjLmMgYi9mcy9leGVjLmMKaW5kZXggYjViY2YxYS4uNjJiNDBhZiAxMDA2NDQKLS0tIGEvZnMvZXhlYy5jCisrKyBiL2ZzL2V4ZWMuYwpAQCAtNTc1LDcgKzU3NSw3IEBACiAgKiBkaXN0dXJiaW5nIG90aGVyIHByb2Nlc3Nlcy4gIChPdGhlciBwcm9jZXNzZXMgbWlnaHQgc2hhcmUgdGhlIHNpZ25hbAogICogdGFibGUgdmlhIHRoZSBDTE9ORV9TSUdIQU5EIG9wdGlvbiB0byBjbG9uZSgpLikKICAqLwotc3RhdGljIGlubGluZSBpbnQgZGVfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQorc3RhdGljIGludCBkZV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZyA9IHRzay0+c2lnbmFsOwogCXN0cnVjdCBzaWdoYW5kX3N0cnVjdCAqbmV3c2lnaGFuZCwgKm9sZHNpZ2hhbmQgPSB0c2stPnNpZ2hhbmQ7CkBAIC03ODAsNyArNzgwLDcgQEAKICAqIHNvIHRoYXQgYSBuZXcgb25lIGNhbiBiZSBzdGFydGVkCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX29sZF9maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMpCitzdGF0aWMgdm9pZCBmbHVzaF9vbGRfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKQogewogCWxvbmcgaiA9IC0xOwogCXN0cnVjdCBmZHRhYmxlICpmZHQ7CkBAIC05NjQsNyArOTY0LDcgQEAKIAogRVhQT1JUX1NZTUJPTChwcmVwYXJlX2JpbnBybSk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IHVuc2FmZV9leGVjKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3N0YXRpYyBpbnQgdW5zYWZlX2V4ZWMoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCWludCB1bnNhZmUgPSAwOwogCWlmIChwLT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSB7CmRpZmYgLS1naXQgYS9mcy9leHQyL25hbWVpLmMgYi9mcy9leHQyL25hbWVpLmMKaW5kZXggYzU1MTM5NS4uYWQxNDMyYSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9uYW1laS5jCisrKyBiL2ZzL2V4dDIvbmFtZWkuYwpAQCAtODMsMTAgKzgzLDcgQEAKIAkJaWYgKCFpbm9kZSkKIAkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCX0KLQlpZiAoaW5vZGUpCi0JCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKLQlkX2FkZChkZW50cnksIGlub2RlKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiB9CiAKIHN0cnVjdCBkZW50cnkgKmV4dDJfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvbmFtZWkuYyBiL2ZzL2V4dDMvbmFtZWkuYwppbmRleCBhZjE5M2EzLi44YmQ4YWMwIDEwMDY0NAotLS0gYS9mcy9leHQzL25hbWVpLmMKKysrIGIvZnMvZXh0My9uYW1laS5jCkBAIC0xMDA1LDEwICsxMDA1LDcgQEAKIAkJaWYgKCFpbm9kZSkKIAkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCX0KLQlpZiAoaW5vZGUpCi0JCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKLQlkX2FkZChkZW50cnksIGlub2RlKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZnMvZmNudGwuYyBiL2ZzL2ZjbnRsLmMKaW5kZXggZDA3NjdmZS4uNWY5Njc4NiAxMDA2NDQKLS0tIGEvZnMvZmNudGwuYworKysgYi9mcy9mY250bC5jCkBAIC0zNiw3ICszNiw3IEBACiAJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBnZXRfY2xvc2Vfb25fZXhlYyh1bnNpZ25lZCBpbnQgZmQpCitzdGF0aWMgaW50IGdldF9jbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCkKIHsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwogCXN0cnVjdCBmZHRhYmxlICpmZHQ7CmRpZmYgLS1naXQgYS9mcy9odWdldGxiZnMvaW5vZGUuYyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCmluZGV4IGFiNGMzYTkuLmY1NjgxMDIgMTAwNjQ0Ci0tLSBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCisrKyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCkBAIC00MDIsNyArNDAyLDcgQEAKIAkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9Jmh1Z2V0bGJmc19iYWNraW5nX2Rldl9pbmZvOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCWluZm8gPSBIVUdFVExCRlNfSShpbm9kZSk7Ci0JCW1wb2xfc2hhcmVkX3BvbGljeV9pbml0KCZpbmZvLT5wb2xpY3kpOworCQltcG9sX3NoYXJlZF9wb2xpY3lfaW5pdCgmaW5mby0+cG9saWN5LCBNUE9MX0RFRkFVTFQsIE5VTEwpOwogCQlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKIAkJZGVmYXVsdDoKIAkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgbW9kZSwgZGV2KTsKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL25hbWVpLmMgYi9mcy9pc29mcy9uYW1laS5jCmluZGV4IGUzN2U4MmIuLmU3YmEwYzMgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL25hbWVpLmMKKysrIGIvZnMvaXNvZnMvbmFtZWkuYwpAQCAtMTg1LDggKzE4NSw1IEBACiAJCX0KIAl9CiAJdW5sb2NrX2tlcm5lbCgpOwotCWlmIChpbm9kZSkKLQkJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwotCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwotCXJldHVybiBOVUxMOworCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2J1aWxkLmMgYi9mcy9qZmZzMi9idWlsZC5jCmluZGV4IGZmZjEwOGIuLjcwZjdhODkgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2J1aWxkLmMKKysrIGIvZnMvamZmczIvYnVpbGQuYwpAQCAtNDcsNyArNDcsNyBAQAogCSAgICAgaWMgPSBuZXh0X2lub2RlKCZpLCBpYywgKGMpKSkKIAogCi1zdGF0aWMgaW5saW5lIHZvaWQgamZmczJfYnVpbGRfaW5vZGVfcGFzczEoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsCitzdGF0aWMgdm9pZCBqZmZzMl9idWlsZF9pbm9kZV9wYXNzMShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKIAkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICppYykKIHsKIAlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvbm9kZWxpc3QuYyBiL2ZzL2pmZnMyL25vZGVsaXN0LmMKaW5kZXggYzc5ZWViYi4uYjYzNWUxNiAxMDA2NDQKLS0tIGEvZnMvamZmczIvbm9kZWxpc3QuYworKysgYi9mcy9qZmZzMi9ub2RlbGlzdC5jCkBAIC0xMzQsNyArMTM0LDcgQEAKIC8qCiAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZXMgYSBuZXcgZnJhZ21lbnQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqIG5ld19mcmFnbWVudChzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4sIHVpbnQzMl90IG9mcywgdWludDMyX3Qgc2l6ZSkKK3N0YXRpYyBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICogbmV3X2ZyYWdtZW50KHN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbiwgdWludDMyX3Qgb2ZzLCB1aW50MzJfdCBzaXplKQogewogCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKm5ld2ZyYWc7CiAKQEAgLTUxMyw3ICs1MTMsNyBAQAogICoKICAqIENoZWNrcyB0aGUgbm9kZSBpZiB3ZSBhcmUgaW4gdGhlIGNoZWNraW5nIHN0YWdlLgogICovCi1zdGF0aWMgaW5saW5lIGludCBjaGVja19ub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0bikKK3N0YXRpYyBpbnQgY2hlY2tfbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG4pCiB7CiAJaW50IHJldDsKIApkaWZmIC0tZ2l0IGEvZnMvbG9ja2QveGRyLmMgYi9mcy9sb2NrZC94ZHIuYwppbmRleCBmMDFlOWMwLi4yMDBmYmRhIDEwMDY0NAotLS0gYS9mcy9sb2NrZC94ZHIuYworKysgYi9mcy9sb2NrZC94ZHIuYwpAQCAtNDQsNyArNDQsNyBAQAogLyoKICAqIFhEUiBmdW5jdGlvbnMgZm9yIGJhc2ljIE5MTSB0eXBlcwogICovCi1zdGF0aWMgaW5saW5lIHUzMiAqbmxtX2RlY29kZV9jb29raWUodTMyICpwLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYykKK3N0YXRpYyB1MzIgKm5sbV9kZWNvZGVfY29va2llKHUzMiAqcCwgc3RydWN0IG5sbV9jb29raWUgKmMpCiB7CiAJdW5zaWduZWQgaW50CWxlbjsKIApAQCAtNzksNyArNzksNyBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCitzdGF0aWMgdTMyICoKIG5sbV9kZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmKQogewogCXVuc2lnbmVkIGludAlsZW47CkBAIC0xMTksNyArMTE5LDcgQEAKIAlyZXR1cm4geGRyX2VuY29kZV9uZXRvYmoocCwgb2gpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCitzdGF0aWMgdTMyICoKIG5sbV9kZWNvZGVfbG9jayh1MzIgKnAsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKIHsKIAlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZsb2NrLT5mbDsKZGlmZiAtLWdpdCBhL2ZzL21iY2FjaGUuYyBiL2ZzL21iY2FjaGUuYwppbmRleCAwZjFlNDUzLi5mNWJiZTRjIDEwMDY0NAotLS0gYS9mcy9tYmNhY2hlLmMKKysrIGIvZnMvbWJjYWNoZS5jCkBAIC0xMjYsNyArMTI2LDcgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBfX21iX2NhY2hlX2VudHJ5X3VuaGFzaChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlKQogewogCWludCBuOwpAQCAtMTM5LDcgKzEzOSw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogX19tYl9jYWNoZV9lbnRyeV9mb3JnZXQoc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IG1iX2NhY2hlICpjYWNoZSA9IGNlLT5lX2NhY2hlOwpAQCAtMTU4LDcgKzE1OCw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogX19tYl9jYWNoZV9lbnRyeV9yZWxlYXNlX3VubG9jayhzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlKQogewogCS8qIFdha2UgdXAgYWxsIHByb2Nlc3NlcyBxdWV1aW5nIGZvciB0aGlzIGNhY2hlIGVudHJ5LiAqLwpkaWZmIC0tZ2l0IGEvZnMvbmFtZWkuYyBiL2ZzL25hbWVpLmMKaW5kZXggMWU1NzQ2ZS4uMzNmYjViZCAxMDA2NDQKLS0tIGEvZnMvbmFtZWkuYworKysgYi9mcy9uYW1laS5jCkBAIC0xMTMsNyArMTEzLDcgQEAKICAqIFBPU0lYLjEgMi40OiBhbiBlbXB0eSBwYXRobmFtZSBpcyBpbnZhbGlkIChFTk9FTlQpLgogICogUEFUSF9NQVggaW5jbHVkZXMgdGhlIG51bCB0ZXJtaW5hdG9yIC0tUlIuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGRvX2dldG5hbWUoY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBjaGFyICpwYWdlKQorc3RhdGljIGludCBkb19nZXRuYW1lKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgY2hhciAqcGFnZSkKIHsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGxvbmcgbGVuID0gUEFUSF9NQVg7CkBAIC0zOTYsNyArMzk2LDcgQEAKICAqIHNob3J0LWN1dCBEQUMgZmFpbHMsIHRoZW4gY2FsbCBwZXJtaXNzaW9uKCkgdG8gZG8gbW9yZQogICogY29tcGxldGUgcGVybWlzc2lvbiBjaGVjay4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZXhlY19wZXJtaXNzaW9uX2xpdGUoc3RydWN0IGlub2RlICppbm9kZSwKK3N0YXRpYyBpbnQgZXhlY19wZXJtaXNzaW9uX2xpdGUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJdW1vZGVfdAltb2RlID0gaW5vZGUtPmlfbW9kZTsKQEAgLTQ4Niw3ICs0ODYsNyBAQAogc3RhdGljIGludCBfX2VtdWxfbG9va3VwX2RlbnRyeShjb25zdCBjaGFyICosIHN0cnVjdCBuYW1laWRhdGEgKik7CiAKIC8qIFNNUC1zYWZlICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQKIHdhbGtfaW5pdF9yb290KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCXJlYWRfbG9jaygmY3VycmVudC0+ZnMtPmxvY2spOwpAQCAtNTA0LDcgKzUwNCw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9fdmZzX2ZvbGxvd19saW5rKHN0cnVjdCBuYW1laWRhdGEgKm5kLCBjb25zdCBjaGFyICpsaW5rKQorc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX192ZnNfZm9sbG93X2xpbmsoc3RydWN0IG5hbWVpZGF0YSAqbmQsIGNvbnN0IGNoYXIgKmxpbmspCiB7CiAJaW50IHJlcyA9IDA7CiAJY2hhciAqbmFtZTsKQEAgLTU0NCw3ICs1NDQsNyBAQAogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9fZG9fZm9sbG93X2xpbmsoc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQorc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19kb19mb2xsb3dfbGluayhzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJaW50IGVycm9yOwogCXZvaWQgKmNvb2tpZTsKQEAgLTY5MCw3ICs2OTAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZm9sbG93X2RvdGRvdChzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBmb2xsb3dfZG90ZG90KHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCXdoaWxlKDEpIHsKIAkJc3RydWN0IHZmc21vdW50ICpwYXJlbnQ7CkBAIC0xMjk0LDcgKzEyOTQsNyBAQAogICogMTAuIFdlIGRvbid0IGFsbG93IHJlbW92YWwgb2YgTkZTIHNpbGx5cmVuYW1lZCBmaWxlczsgaXQncyBoYW5kbGVkIGJ5CiAgKiAgICAgbmZzX2FzeW5jX3VubGluaygpLgogICovCi1zdGF0aWMgaW5saW5lIGludCBtYXlfZGVsZXRlKHN0cnVjdCBpbm9kZSAqZGlyLHN0cnVjdCBkZW50cnkgKnZpY3RpbSxpbnQgaXNkaXIpCitzdGF0aWMgaW50IG1heV9kZWxldGUoc3RydWN0IGlub2RlICpkaXIsc3RydWN0IGRlbnRyeSAqdmljdGltLGludCBpc2RpcikKIHsKIAlpbnQgZXJyb3I7CiAKQEAgLTIzMTUsNyArMjMxNSw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBkb19yZW5hbWUoY29uc3QgY2hhciAqIG9sZG5hbWUsIGNvbnN0IGNoYXIgKiBuZXduYW1lKQorc3RhdGljIGludCBkb19yZW5hbWUoY29uc3QgY2hhciAqIG9sZG5hbWUsIGNvbnN0IGNoYXIgKiBuZXduYW1lKQogewogCWludCBlcnJvciA9IDA7CiAJc3RydWN0IGRlbnRyeSAqIG9sZF9kaXIsICogbmV3X2RpcjsKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2lub2RlLmMgYi9mcy9uY3Bmcy9pbm9kZS5jCmluZGV4IDhjODgzOTIuLmQyNzdhNTggMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL2lub2RlLmMKKysrIGIvZnMvbmNwZnMvaW5vZGUuYwpAQCAtNzE2LDEwICs3MTYsOCBAQAogCWZwdXQoc2VydmVyLT5uY3BfZmlscCk7CiAJa2lsbF9wcm9jKHNlcnZlci0+bS53ZG9nX3BpZCwgU0lHVEVSTSwgMSk7CiAKLQlpZiAoc2VydmVyLT5wcml2LmRhdGEpIAotCQluY3Bfa2ZyZWVfcyhzZXJ2ZXItPnByaXYuZGF0YSwgc2VydmVyLT5wcml2Lmxlbik7Ci0JaWYgKHNlcnZlci0+YXV0aC5vYmplY3RfbmFtZSkKLQkJbmNwX2tmcmVlX3Moc2VydmVyLT5hdXRoLm9iamVjdF9uYW1lLCBzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWVfbGVuKTsKKwlrZnJlZShzZXJ2ZXItPnByaXYuZGF0YSk7CisJa2ZyZWUoc2VydmVyLT5hdXRoLm9iamVjdF9uYW1lKTsKIAl2ZnJlZShzZXJ2ZXItPnBhY2tldCk7CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CiAJa2ZyZWUoc2VydmVyKTsKQEAgLTk1OCwxMSArOTU2LDYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0jaWZkZWYgREVCVUdfTkNQX01BTExPQwotaW50IG5jcF9tYWxsb2NlZDsKLWludCBuY3BfY3VycmVudF9tYWxsb2NlZDsKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpuY3BfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAogCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCiB7CkBAIC05ODEsMTAgKzk3NCw2IEBACiAJaW50IGVycjsKIAlEUFJJTlRLKCJuY3BmczogaW5pdF9tb2R1bGUgY2FsbGVkXG4iKTsKIAotI2lmZGVmIERFQlVHX05DUF9NQUxMT0MKLQluY3BfbWFsbG9jZWQgPSAwOwotCW5jcF9jdXJyZW50X21hbGxvY2VkID0gMDsKLSNlbmRpZgogCWVyciA9IGluaXRfaW5vZGVjYWNoZSgpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0MTsKQEAgLTEwMDMsMTAgKzk5Miw2IEBACiAJRFBSSU5USygibmNwZnM6IGNsZWFudXBfbW9kdWxlIGNhbGxlZFxuIik7CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZuY3BfZnNfdHlwZSk7CiAJZGVzdHJveV9pbm9kZWNhY2hlKCk7Ci0jaWZkZWYgREVCVUdfTkNQX01BTExPQwotCVBSSU5USygibmNwX21hbGxvY2VkOiAlZFxuIiwgbmNwX21hbGxvY2VkKTsKLQlQUklOVEsoIm5jcF9jdXJyZW50X21hbGxvY2VkOiAlZFxuIiwgbmNwX2N1cnJlbnRfbWFsbG9jZWQpOwotI2VuZGlmCiB9CiAKIG1vZHVsZV9pbml0KGluaXRfbmNwX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvaW9jdGwuYyBiL2ZzL25jcGZzL2lvY3RsLmMKaW5kZXggZDZlMGMwOC4uZWIzODEzYSAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvaW9jdGwuYworKysgYi9mcy9uY3Bmcy9pb2N0bC5jCkBAIC01MTgsMTAgKzUxOCwxMSBAQAogCQkJaWYgKHVzZXIub2JqZWN0X25hbWVfbGVuID4gTkNQX09CSkVDVF9OQU1FX01BWF9MRU4pCiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQlpZiAodXNlci5vYmplY3RfbmFtZV9sZW4pIHsKLQkJCQluZXduYW1lID0gbmNwX2ttYWxsb2ModXNlci5vYmplY3RfbmFtZV9sZW4sIEdGUF9VU0VSKTsKLQkJCQlpZiAoIW5ld25hbWUpIHJldHVybiAtRU5PTUVNOworCQkJCW5ld25hbWUgPSBrbWFsbG9jKHVzZXIub2JqZWN0X25hbWVfbGVuLCBHRlBfVVNFUik7CisJCQkJaWYgKCFuZXduYW1lKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCQlpZiAoY29weV9mcm9tX3VzZXIobmV3bmFtZSwgdXNlci5vYmplY3RfbmFtZSwgdXNlci5vYmplY3RfbmFtZV9sZW4pKSB7Ci0JCQkJCW5jcF9rZnJlZV9zKG5ld25hbWUsIHVzZXIub2JqZWN0X25hbWVfbGVuKTsKKwkJCQkJa2ZyZWUobmV3bmFtZSk7CiAJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCX0KIAkJCX0gZWxzZSB7CkBAIC01NDAsOCArNTQxLDggQEAKIAkJCXNlcnZlci0+cHJpdi5sZW4gPSAwOwogCQkJc2VydmVyLT5wcml2LmRhdGEgPSBOVUxMOwogCQkJLyogbGVhdmUgY3JpdGljYWwgc2VjdGlvbiAqLwotCQkJaWYgKG9sZHByaXZhdGUpIG5jcF9rZnJlZV9zKG9sZHByaXZhdGUsIG9sZHByaXZhdGVsZW4pOwotCQkJaWYgKG9sZG5hbWUpIG5jcF9rZnJlZV9zKG9sZG5hbWUsIG9sZG5hbWVsZW4pOworCQkJa2ZyZWUob2xkcHJpdmF0ZSk7CisJCQlrZnJlZShvbGRuYW1lKTsKIAkJCXJldHVybiAwOwogCQl9CiAJY2FzZSBOQ1BfSU9DX0dFVFBSSVZBVEVEQVRBOgpAQCAtNTgxLDEwICs1ODIsMTEgQEAKIAkJCWlmICh1c2VyLmxlbiA+IE5DUF9QUklWQVRFX0RBVEFfTUFYX0xFTikKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCWlmICh1c2VyLmxlbikgewotCQkJCW5ldyA9IG5jcF9rbWFsbG9jKHVzZXIubGVuLCBHRlBfVVNFUik7Ci0JCQkJaWYgKCFuZXcpIHJldHVybiAtRU5PTUVNOworCQkJCW5ldyA9IGttYWxsb2ModXNlci5sZW4sIEdGUF9VU0VSKTsKKwkJCQlpZiAoIW5ldykKKwkJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQkJaWYgKGNvcHlfZnJvbV91c2VyKG5ldywgdXNlci5kYXRhLCB1c2VyLmxlbikpIHsKLQkJCQkJbmNwX2tmcmVlX3MobmV3LCB1c2VyLmxlbik7CisJCQkJCWtmcmVlKG5ldyk7CiAJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCX0KIAkJCX0gZWxzZSB7CkBAIC01OTYsNyArNTk4LDcgQEAKIAkJCXNlcnZlci0+cHJpdi5sZW4gPSB1c2VyLmxlbjsKIAkJCXNlcnZlci0+cHJpdi5kYXRhID0gbmV3OwogCQkJLyogbGVhdmUgY3JpdGljYWwgc2VjdGlvbiAqLwotCQkJaWYgKG9sZCkgbmNwX2tmcmVlX3Mob2xkLCBvbGRsZW4pOworCQkJa2ZyZWUob2xkKTsKIAkJCXJldHVybiAwOwogCQl9CiAKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzeGRyLmMgYi9mcy9uZnNkL25mc3hkci5jCmluZGV4IGFhN2JiNDEuLmUzYTA3OTcgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzeGRyLmMKKysrIGIvZnMvbmZzZC9uZnN4ZHIuYwpAQCAtMzcsNyArMzcsNyBAQAogLyoKICAqIFhEUiBmdW5jdGlvbnMgZm9yIGJhc2ljIE5GUyB0eXBlcwogICovCi1zdGF0aWMgaW5saW5lIHUzMiAqCitzdGF0aWMgdTMyICoKIGRlY29kZV9maCh1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKIHsKIAlmaF9pbml0KGZocCwgTkZTX0ZIU0laRSk7CkBAIC0xNTEsNyArMTUxLDcgQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgorc3RhdGljIHUzMiAqCiBlbmNvZGVfZmF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCiAJICAgICBzdHJ1Y3Qga3N0YXQgKnN0YXQpCiB7CmRpZmYgLS1naXQgYS9mcy9waXBlLmMgYi9mcy9waXBlLmMKaW5kZXggZWVmMGYyOS4uZDcyMjU3OSAxMDA2NDQKLS0tIGEvZnMvcGlwZS5jCisrKyBiL2ZzL3BpcGUuYwpAQCAtNTAsNyArNTAsNyBAQAogCW11dGV4X2xvY2soUElQRV9NVVRFWCgqaW5vZGUpKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIHBpcGVfaW92X2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBjb3B5OwpAQCAtNzAsNyArNzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogcGlwZV9pb3ZfY29weV90b191c2VyKHN0cnVjdCBpb3ZlYyAqaW92LCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIGNvcHk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfZGV2dHJlZS5jIGIvZnMvcHJvYy9wcm9jX2RldnRyZWUuYwppbmRleCBmYjExN2I3Li45YmRkMDc3IDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfZGV2dHJlZS5jCisrKyBiL2ZzL3Byb2MvcHJvY19kZXZ0cmVlLmMKQEAgLTgxLDYgKzgxLDMwIEBACiAJX19wcm9jX2RldmljZV90cmVlX2FkZF9wcm9wKHBkZSwgcHJvcCk7CiB9CiAKK3ZvaWQgcHJvY19kZXZpY2VfdHJlZV9yZW1vdmVfcHJvcChzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSwKKwkJCQkgIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeShwcm9wLT5uYW1lLCBwZGUpOworfQorCit2b2lkIHByb2NfZGV2aWNlX3RyZWVfdXBkYXRlX3Byb3Aoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUsCisJCQkJICBzdHJ1Y3QgcHJvcGVydHkgKm5ld3Byb3AsCisJCQkJICBzdHJ1Y3QgcHJvcGVydHkgKm9sZHByb3ApCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisKKwlmb3IgKGVudCA9IHBkZS0+c3ViZGlyOyBlbnQgIT0gTlVMTDsgZW50ID0gZW50LT5uZXh0KQorCQlpZiAoZW50LT5kYXRhID09IG9sZHByb3ApCisJCQlicmVhazsKKwlpZiAoZW50ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZGV2aWNlLXRyZWU6IHByb3BlcnR5IFwiJXNcIiAiCisJCSAgICAgICAiIGRvZXMgbm90IGV4aXN0XG4iLCBvbGRwcm9wLT5uYW1lKTsKKwl9IGVsc2UgeworCQllbnQtPmRhdGEgPSBuZXdwcm9wOworCQllbnQtPnNpemUgPSBuZXdwcm9wLT5sZW5ndGg7CisJfQorfQorCiAvKgogICogUHJvY2VzcyBhIG5vZGUsIGFkZGluZyBlbnRyaWVzIGZvciBpdHMgY2hpbGRyZW4gYW5kIGl0cyBwcm9wZXJ0aWVzLgogICovCmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfbWlzYy5jIGIvZnMvcHJvYy9wcm9jX21pc2MuYwppbmRleCA2M2JmNmMwLi44ZjgwMTQyIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfbWlzYy5jCisrKyBiL2ZzL3Byb2MvcHJvY19taXNjLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KQEAgLTYyLDcgKzYzLDYgQEAKICAqLwogZXh0ZXJuIGludCBnZXRfaGFyZHdhcmVfbGlzdChjaGFyICopOwogZXh0ZXJuIGludCBnZXRfc3RyYW1fbGlzdChjaGFyICopOwotZXh0ZXJuIGludCBnZXRfY2hyZGV2X2xpc3QoY2hhciAqKTsKIGV4dGVybiBpbnQgZ2V0X2ZpbGVzeXN0ZW1fbGlzdChjaGFyICopOwogZXh0ZXJuIGludCBnZXRfZXhlY19kb21haW5fbGlzdChjaGFyICopOwogZXh0ZXJuIGludCBnZXRfZG1hX2xpc3QoY2hhciAqKTsKQEAgLTI0OCw2ICsyNDgsMTU0IEBACiB7CiAJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZjcHVpbmZvX29wKTsKIH0KKworZW51bSBkZXZpbmZvX3N0YXRlcyB7CisJQ0hSX0hEUiwKKwlDSFJfTElTVCwKKwlCTEtfSERSLAorCUJMS19MSVNULAorCURFVklORk9fRE9ORQorfTsKKworc3RydWN0IGRldmluZm9fc3RhdGUgeworCXZvaWQgKmNocmRldjsKKwl2b2lkICpibGtkZXY7CisJdW5zaWduZWQgaW50IG51bV9yZWNvcmRzOworCXVuc2lnbmVkIGludCBjdXJfcmVjb3JkOworCWVudW0gZGV2aW5mb19zdGF0ZXMgc3RhdGU7Cit9OworCitzdGF0aWMgdm9pZCAqZGV2aW5mb19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBkZXZpbmZvX3N0YXRlICppbmZvID0gZi0+cHJpdmF0ZTsKKworCWlmICgqcG9zKSB7CisJCWlmICgoaW5mbykgJiYgKCpwb3MgPD0gaW5mby0+bnVtX3JlY29yZHMpKQorCQkJcmV0dXJuIGluZm87CisJCXJldHVybiBOVUxMOworCX0KKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlmLT5wcml2YXRlID0gaW5mbzsKKwlpbmZvLT5jaHJkZXYgPSBhY3F1aXJlX2NocmRldl9saXN0KCk7CisJaW5mby0+YmxrZGV2ID0gYWNxdWlyZV9ibGtkZXZfbGlzdCgpOworCWluZm8tPnN0YXRlID0gQ0hSX0hEUjsKKwlpbmZvLT5udW1fcmVjb3JkcyA9IGNvdW50X2NocmRldl9saXN0KCk7CisJaW5mby0+bnVtX3JlY29yZHMgKz0gY291bnRfYmxrZGV2X2xpc3QoKTsKKwlpbmZvLT5udW1fcmVjb3JkcyArPSAyOyAvKiBDaGFyYWN0ZXIgYW5kIEJsb2NrIGhlYWRlcnMgKi8KKwkqcG9zID0gMTsKKwlpbmZvLT5jdXJfcmVjb3JkID0gKnBvczsKKwlyZXR1cm4gaW5mbzsKK30KKworc3RhdGljIHZvaWQgKmRldmluZm9fbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCWludCBpZHVtbXk7CisJY2hhciAqbmR1bW15OworCXN0cnVjdCBkZXZpbmZvX3N0YXRlICppbmZvID0gZi0+cHJpdmF0ZTsKKworCXN3aXRjaCAoaW5mby0+c3RhdGUpIHsKKwkJY2FzZSBDSFJfSERSOgorCQkJaW5mby0+c3RhdGUgPSBDSFJfTElTVDsKKwkJCSgqcG9zKSsrOworCQkJLypmYWxsdGhyb3VnaCovCisJCWNhc2UgQ0hSX0xJU1Q6CisJCQlpZiAoZ2V0X2NocmRldl9pbmZvKGluZm8tPmNocmRldiwmaWR1bW15LCZuZHVtbXkpKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgY2hhcmFjdGVyIGRldiBsaXN0IGlzIGNvbXBsZXRlCisJCQkJICovCisJCQkJaW5mby0+c3RhdGUgPSBCTEtfSERSOworCQkJfSBlbHNlIHsKKwkJCQlpbmZvLT5jaHJkZXYgPSBnZXRfbmV4dF9jaHJkZXYoaW5mby0+Y2hyZGV2KTsKKwkJCX0KKwkJCSgqcG9zKSsrOworCQkJYnJlYWs7CisJCWNhc2UgQkxLX0hEUjoKKwkJCWluZm8tPnN0YXRlID0gQkxLX0xJU1Q7CisJCQkoKnBvcykrKzsKKwkJCWJyZWFrOworCQljYXNlIEJMS19MSVNUOgorCQkJaWYgKGdldF9ibGtkZXZfaW5mbyhpbmZvLT5ibGtkZXYsJmlkdW1teSwmbmR1bW15KSkgeworCQkJCS8qCisJCQkJICogVGhlIGJsb2NrIGRldiBsaXN0IGlzIGNvbXBsZXRlCisJCQkJICovCisJCQkJaW5mby0+c3RhdGUgPSBERVZJTkZPX0RPTkU7CisJCQl9IGVsc2UgeworCQkJCWluZm8tPmJsa2RldiA9IGdldF9uZXh0X2Jsa2RldihpbmZvLT5ibGtkZXYpOworCQkJfQorCQkJKCpwb3MpKys7CisJCQlicmVhazsKKwkJY2FzZSBERVZJTkZPX0RPTkU6CisJCQkoKnBvcykrKzsKKwkJCWluZm8tPmN1cl9yZWNvcmQgPSAqcG9zOworCQkJaW5mbyA9IE5VTEw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKwlpZiAoaW5mbykKKwkJaW5mby0+Y3VyX3JlY29yZCA9ICpwb3M7CisJcmV0dXJuIGluZm87Cit9CisKK3N0YXRpYyB2b2lkIGRldmluZm9fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpCit7CisJc3RydWN0IGRldmluZm9fc3RhdGUgKmluZm8gPSBmLT5wcml2YXRlOworCisJaWYgKGluZm8pIHsKKwkJcmVsZWFzZV9jaHJkZXZfbGlzdChpbmZvLT5jaHJkZXYpOworCQlyZWxlYXNlX2Jsa2Rldl9saXN0KGluZm8tPmJsa2Rldik7CisJCWYtPnByaXZhdGUgPSBOVUxMOworCQlrZnJlZShpbmZvKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZGV2aW5mb19zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqYXJnKQoreworCWludCBtYWpvcjsKKwljaGFyICpuYW1lOworCXN0cnVjdCBkZXZpbmZvX3N0YXRlICppbmZvID0gZi0+cHJpdmF0ZTsKKworCXN3aXRjaChpbmZvLT5zdGF0ZSkgeworCQljYXNlIENIUl9IRFI6CisJCQlzZXFfcHJpbnRmKGYsIkNoYXJhY3RlciBkZXZpY2VzOlxuIik7CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQljYXNlIENIUl9MSVNUOgorCQkJaWYgKCFnZXRfY2hyZGV2X2luZm8oaW5mby0+Y2hyZGV2LCZtYWpvciwmbmFtZSkpCisJCQkJc2VxX3ByaW50ZihmLCIlM2QgJXNcbiIsbWFqb3IsbmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBCTEtfSERSOgorCQkJc2VxX3ByaW50ZihmLCJcbkJsb2NrIGRldmljZXM6XG4iKTsKKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgQkxLX0xJU1Q6CisJCQlpZiAoIWdldF9ibGtkZXZfaW5mbyhpbmZvLT5ibGtkZXYsJm1ham9yLCZuYW1lKSkKKwkJCQlzZXFfcHJpbnRmKGYsIiUzZCAlc1xuIixtYWpvcixuYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRldmluZm9fb3AgPSB7CisJLnN0YXJ0ICA9IGRldmluZm9fc3RhcnQsCisJLm5leHQgICA9IGRldmluZm9fbmV4dCwKKwkuc3RvcCAgID0gZGV2aW5mb19zdG9wLAorCS5zaG93ICAgPSBkZXZpbmZvX3Nob3csCit9OworCitzdGF0aWMgaW50IGRldmluZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmRldmluZm9fb3ApOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2RldmluZm9fb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBkZXZpbmZvX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfY3B1aW5mb19vcGVyYXRpb25zID0gewogCS5vcGVuCQk9IGNwdWluZm9fb3BlbiwKIAkucmVhZAkJPSBzZXFfcmVhZCwKQEAgLTQ1MCwxNCArNTk4LDYgQEAKIAkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotc3RhdGljIGludCBkZXZpY2VzX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgbGVuID0gZ2V0X2NocmRldl9saXN0KHBhZ2UpOwotCWxlbiArPSBnZXRfYmxrZGV2X2xpc3QocGFnZStsZW4sIGxlbik7Ci0JcmV0dXJuIHByb2NfY2FsY19tZXRyaWNzKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7Ci19Ci0KIC8qCiAgKiAvcHJvYy9pbnRlcnJ1cHRzCiAgKi8KQEAgLTU4Miw3ICs3MjIsNiBAQAogI2lmZGVmIENPTkZJR19TVFJBTV9QUk9DCiAJCXsic3RyYW0iLAlzdHJhbV9yZWFkX3Byb2N9LAogI2VuZGlmCi0JCXsiZGV2aWNlcyIsCWRldmljZXNfcmVhZF9wcm9jfSwKIAkJeyJmaWxlc3lzdGVtcyIsCWZpbGVzeXN0ZW1zX3JlYWRfcHJvY30sCiAJCXsiY21kbGluZSIsCWNtZGxpbmVfcmVhZF9wcm9jfSwKIAkJeyJsb2NrcyIsCWxvY2tzX3JlYWRfcHJvY30sCkBAIC01OTgsNiArNzM3LDcgQEAKIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJrbXNnIiwgU19JUlVTUiwgJnByb2Nfcm9vdCk7CiAJaWYgKGVudHJ5KQogCQllbnRyeS0+cHJvY19mb3BzID0gJnByb2Nfa21zZ19vcGVyYXRpb25zOworCWNyZWF0ZV9zZXFfZW50cnkoImRldmljZXMiLCAwLCAmcHJvY19kZXZpbmZvX29wZXJhdGlvbnMpOwogCWNyZWF0ZV9zZXFfZW50cnkoImNwdWluZm8iLCAwLCAmcHJvY19jcHVpbmZvX29wZXJhdGlvbnMpOwogCWNyZWF0ZV9zZXFfZW50cnkoInBhcnRpdGlvbnMiLCAwLCAmcHJvY19wYXJ0aXRpb25zX29wZXJhdGlvbnMpOwogCWNyZWF0ZV9zZXFfZW50cnkoInN0YXQiLCAwLCAmcHJvY19zdGF0X29wZXJhdGlvbnMpOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGFfdjIuYyBiL2ZzL3F1b3RhX3YyLmMKaW5kZXggN2FmY2JiMS4uYTRlZjkxYiAxMDA2NDQKLS0tIGEvZnMvcXVvdGFfdjIuYworKysgYi9mcy9xdW90YV92Mi5jCkBAIC0zNSw3ICszNSw4IEBACiAgCiAJc2l6ZSA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKSZkcWhlYWQsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciksIDApOwogCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlcikpIHsKLQkJcHJpbnRrKCJmYWlsZWQgcmVhZFxuIik7CisJCXByaW50aygicXVvdGFfdjI6IGZhaWxlZCByZWFkIGV4cGVjdGVkPSVkIGdvdD0lZFxuIiwKKwkJCXNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciksIHNpemUpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGxlMzJfdG9fY3B1KGRxaGVhZC5kcWhfbWFnaWMpICE9IHF1b3RhX21hZ2ljc1t0eXBlXSB8fApkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvbmFtZWkuYyBiL2ZzL3JlaXNlcmZzL25hbWVpLmMKaW5kZXggMzU0OTA2Ny4uOGY4ZDhkMCAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvbmFtZWkuYworKysgYi9mcy9yZWlzZXJmcy9uYW1laS5jCkBAIC0zNzUsMTEgKzM3NSw3IEBACiAJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCX0KIAotCWlmIChpbm9kZSkKLQkJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwotCi0JZF9hZGQoZGVudHJ5LCBpbm9kZSk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwogfQogCiAvKiAKZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL01ha2VmaWxlIGIvZnMvc21iZnMvTWFrZWZpbGUKaW5kZXggOTMyNDZiNy4uNjY3M2VlOCAxMDA2NDQKLS0tIGEvZnMvc21iZnMvTWFrZWZpbGUKKysrIGIvZnMvc21iZnMvTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDYgQEAKIEVYVFJBX0NGTEFHUyArPSAtRFNNQkZTX1BBUkFOT0lBCiAjRVhUUkFfQ0ZMQUdTICs9IC1EU01CRlNfREVCVUcKICNFWFRSQV9DRkxBR1MgKz0gLURTTUJGU19ERUJVR19WRVJCT1NFCi0jRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUdfU01CX01BTExPQwogI0VYVFJBX0NGTEFHUyArPSAtRERFQlVHX1NNQl9USU1FU1RBTVAKICNFWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgogCmRpZmYgLS1naXQgYS9mcy9zbWJmcy9pbm9kZS5jIGIvZnMvc21iZnMvaW5vZGUuYwppbmRleCA2ZWM4OGJmLi4wMmUzZTgyIDEwMDY0NAotLS0gYS9mcy9zbWJmcy9pbm9kZS5jCisrKyBiL2ZzL3NtYmZzL2lub2RlLmMKQEAgLTQ4NywxMSArNDg3LDExIEBACiAJaWYgKHNlcnZlci0+Y29ubl9waWQpCiAJCWtpbGxfcHJvYyhzZXJ2ZXItPmNvbm5fcGlkLCBTSUdURVJNLCAxKTsKIAotCXNtYl9rZnJlZShzZXJ2ZXItPm9wcyk7CisJa2ZyZWUoc2VydmVyLT5vcHMpOwogCXNtYl91bmxvYWRfbmxzKHNlcnZlcik7CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CiAJc21iX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKLQlzbWJfa2ZyZWUoc2VydmVyKTsKKwlrZnJlZShzZXJ2ZXIpOwogfQogCiBzdGF0aWMgaW50IHNtYl9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnJhd19kYXRhLCBpbnQgc2lsZW50KQpAQCAtNTE5LDExICs1MTksMTAgQEAKIAlzYi0+c19vcCA9ICZzbWJfc29wczsKIAlzYi0+c190aW1lX2dyYW4gPSAxMDA7CiAKLQlzZXJ2ZXIgPSBzbWJfa21hbGxvYyhzaXplb2Yoc3RydWN0IHNtYl9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJc2VydmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNtYl9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZXJ2ZXIpCiAJCWdvdG8gb3V0X25vX3NlcnZlcjsKIAlzYi0+c19mc19pbmZvID0gc2VydmVyOwotCW1lbXNldChzZXJ2ZXIsIDAsIHNpemVvZihzdHJ1Y3Qgc21iX3NiX2luZm8pKTsKIAogCXNlcnZlci0+c3VwZXJfYmxvY2sgPSBzYjsKIAlzZXJ2ZXItPm1udCA9IE5VTEw7CkBAIC01NDIsOCArNTQxLDggQEAKIAkvKiBGSVhNRTogbW92ZSB0aGVzZSB0byB0aGUgc21iX3NiX2luZm8gc3RydWN0ICovCiAJVkVSQk9TRSgiYWxsb2MgY2h1bmsgPSAlZFxuIiwgc2l6ZW9mKHN0cnVjdCBzbWJfb3BzKSArCiAJCXNpemVvZihzdHJ1Y3Qgc21iX21vdW50X2RhdGFfa2VybmVsKSk7Ci0JbWVtID0gc21iX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWJfb3BzKSArCi0JCQkgIHNpemVvZihzdHJ1Y3Qgc21iX21vdW50X2RhdGFfa2VybmVsKSwgR0ZQX0tFUk5FTCk7CisJbWVtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNtYl9vcHMpICsKKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbWJfbW91bnRfZGF0YV9rZXJuZWwpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbSkKIAkJZ290byBvdXRfbm9fbWVtOwogCkBAIC02MjEsMTIgKzYyMCwxMiBAQAogb3V0X25vX3NtYmlvZDoKIAlzbWJfdW5sb2FkX25scyhzZXJ2ZXIpOwogb3V0X2JhZF9vcHRpb246Ci0Jc21iX2tmcmVlKG1lbSk7CisJa2ZyZWUobWVtKTsKIG91dF9ub19tZW06CiAJaWYgKCFzZXJ2ZXItPm1udCkKIAkJcHJpbnRrKEtFUk5fRVJSICJzbWJfZmlsbF9zdXBlcjogYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKLQlzbWJfa2ZyZWUoc2VydmVyKTsKKwlrZnJlZShzZXJ2ZXIpOwogCWdvdG8gb3V0X2ZhaWw7CiBvdXRfd3JvbmdfZGF0YToKIAlwcmludGsoS0VSTl9FUlIgInNtYmZzOiBtb3VudF9kYXRhIHZlcnNpb24gJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwgdmVyKTsKQEAgLTc4MiwxMiArNzgxLDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLSNpZmRlZiBERUJVR19TTUJfTUFMTE9DCi1pbnQgc21iX21hbGxvY2VkOwotaW50IHNtYl9jdXJyZW50X2ttYWxsb2NlZDsKLWludCBzbWJfY3VycmVudF92bWFsbG9jZWQ7Ci0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqc21iX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKIAlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQogewpAQCAtODA3LDEyICs4MDAsNiBAQAogCWludCBlcnI7CiAJREVCVUcxKCJyZWdpc3RlcmluZyAuLi5cbiIpOwogCi0jaWZkZWYgREVCVUdfU01CX01BTExPQwotCXNtYl9tYWxsb2NlZCA9IDA7Ci0Jc21iX2N1cnJlbnRfa21hbGxvY2VkID0gMDsKLQlzbWJfY3VycmVudF92bWFsbG9jZWQgPSAwOwotI2VuZGlmCi0KIAllcnIgPSBpbml0X2lub2RlY2FjaGUoKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9pbm9kZTsKQEAgLTgzNywxMSArODI0LDYgQEAKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnNtYl9mc190eXBlKTsKIAlzbWJfZGVzdHJveV9yZXF1ZXN0X2NhY2hlKCk7CiAJZGVzdHJveV9pbm9kZWNhY2hlKCk7Ci0jaWZkZWYgREVCVUdfU01CX01BTExPQwotCXByaW50ayhLRVJOX0RFQlVHICJzbWJfbWFsbG9jZWQ6ICVkXG4iLCBzbWJfbWFsbG9jZWQpOwotCXByaW50ayhLRVJOX0RFQlVHICJzbWJfY3VycmVudF9rbWFsbG9jZWQ6ICVkXG4iLHNtYl9jdXJyZW50X2ttYWxsb2NlZCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgInNtYl9jdXJyZW50X3ZtYWxsb2NlZDogJWRcbiIsc21iX2N1cnJlbnRfdm1hbGxvY2VkKTsKLSNlbmRpZgogfQogCiBtb2R1bGVfaW5pdChpbml0X3NtYl9mcykKZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3JlcXVlc3QuYyBiL2ZzL3NtYmZzL3JlcXVlc3QuYwppbmRleCBhMGYyOTZkLi5jNzFjMzc1IDEwMDY0NAotLS0gYS9mcy9zbWJmcy9yZXF1ZXN0LmMKKysrIGIvZnMvc21iZnMvcmVxdWVzdC5jCkBAIC02OCw3ICs2OCw3IEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKGJ1ZnNpemUgPiAwKSB7Ci0JCWJ1ZiA9IHNtYl9rbWFsbG9jKGJ1ZnNpemUsIEdGUF9OT0ZTKTsKKwkJYnVmID0ga21hbGxvYyhidWZzaXplLCBHRlBfTk9GUyk7CiAJCWlmICghYnVmKSB7CiAJCQlrbWVtX2NhY2hlX2ZyZWUocmVxX2NhY2hlcCwgcmVxKTsKIAkJCXJldHVybiBOVUxMOwpAQCAtMTI0LDkgKzEyNCw4IEBACiB7CiAJYXRvbWljX2RlYygmcmVxLT5ycV9zZXJ2ZXItPm5yX3JlcXVlc3RzKTsKIAlpZiAocmVxLT5ycV9idWZmZXIgJiYgIShyZXEtPnJxX2ZsYWdzICYgU01CX1JFUV9TVEFUSUMpKQotCQlzbWJfa2ZyZWUocmVxLT5ycV9idWZmZXIpOwotCWlmIChyZXEtPnJxX3RyYW5zMmJ1ZmZlcikKLQkJc21iX2tmcmVlKHJlcS0+cnFfdHJhbnMyYnVmZmVyKTsKKwkJa2ZyZWUocmVxLT5ycV9idWZmZXIpOworCWtmcmVlKHJlcS0+cnFfdHJhbnMyYnVmZmVyKTsKIAlrbWVtX2NhY2hlX2ZyZWUocmVxX2NhY2hlcCwgcmVxKTsKIH0KIApAQCAtMTgzLDggKzE4Miw3IEBACiAJcmVxLT5ycV9lcnIgPSAwOwogCXJlcS0+cnFfZXJybm8gPSAwOwogCXJlcS0+cnFfZnJhZ21lbnQgPSAwOwotCWlmIChyZXEtPnJxX3RyYW5zMmJ1ZmZlcikKLQkJc21iX2tmcmVlKHJlcS0+cnFfdHJhbnMyYnVmZmVyKTsKKwlrZnJlZShyZXEtPnJxX3RyYW5zMmJ1ZmZlcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY0NywxMCArNjQ1LDkgQEAKIAkJCWdvdG8gb3V0X3Rvb19sb25nOwogCiAJCXJlcS0+cnFfdHJhbnMyYnVmc2l6ZSA9IGJ1Zl9sZW47Ci0JCXJlcS0+cnFfdHJhbnMyYnVmZmVyID0gc21iX2ttYWxsb2MoYnVmX2xlbiwgR0ZQX05PRlMpOworCQlyZXEtPnJxX3RyYW5zMmJ1ZmZlciA9IGt6YWxsb2MoYnVmX2xlbiwgR0ZQX05PRlMpOwogCQlpZiAoIXJlcS0+cnFfdHJhbnMyYnVmZmVyKQogCQkJZ290byBvdXRfbm9fbWVtOwotCQltZW1zZXQocmVxLT5ycV90cmFuczJidWZmZXIsIDAsIGJ1Zl9sZW4pOwogCiAJCXJlcS0+cnFfcGFybSA9IHJlcS0+cnFfdHJhbnMyYnVmZmVyOwogCQlyZXEtPnJxX2RhdGEgPSByZXEtPnJxX3RyYW5zMmJ1ZmZlciArIHBhcm1fdG90OwpkaWZmIC0tZ2l0IGEvZnMvdWZzL2JhbGxvYy5jIGIvZnMvdWZzL2JhbGxvYy5jCmluZGV4IGE5ZjQ0MjEuLjNhZGE5ZGMgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy9iYWxsb2MuYworKysgYi9mcy91ZnMvYmFsbG9jLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAkKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CiAJCiAJVUZTRCgoIkVOVEVSLCBmcmFnbWVudCAldSwgY291bnQgJXVcbiIsIGZyYWdtZW50LCBjb3VudCkpCiAJCkBAIC04MSw4ICs4MSw5IEBACiAJZm9yIChpID0gYml0OyBpIDwgZW5kX2JpdDsgaSsrKSB7CiAJCWlmICh1YmhfaXNjbHIgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGkpKQogCQkJdWJoX3NldGJpdCAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgaSk7Ci0JCWVsc2UgdWZzX2Vycm9yIChzYiwgInVmc19mcmVlX2ZyYWdtZW50cyIsCi0JCQkiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgZnJhZ21lbnQgJXUiLCBpKTsKKwkJZWxzZSAKKwkJCXVmc19lcnJvciAoc2IsICJ1ZnNfZnJlZV9mcmFnbWVudHMiLAorCQkJCSAgICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBmcmFnbWVudCAldSIsIGkpOwogCX0KIAkKIAlEUVVPVF9GUkVFX0JMT0NLIChpbm9kZSwgY291bnQpOwpAQCAtMTQzLDcgKzE0NCw3IEBACiAJCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOwogCiAJVUZTRCgoIkVOVEVSLCBmcmFnbWVudCAldSwgY291bnQgJXVcbiIsIGZyYWdtZW50LCBjb3VudCkpCiAJCkBAIC0yNDcsNyArMjQ4LDcgQEAKIAkKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CiAJKmVyciA9IC1FTk9TUEM7CiAKIAlsb2NrX3N1cGVyIChzYik7CkBAIC00MDcsNyArNDA4LDcgQEAKIAkKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0IChVU1BJX1VCSCk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0ICh1c3BpKTsKIAljb3VudCA9IG5ld2NvdW50IC0gb2xkY291bnQ7CiAJCiAJY2dubyA9IHVmc19kdG9nKGZyYWdtZW50KTsKQEAgLTQ5MCw3ICs0OTEsNyBAQAogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOwogCW9sZGNnID0gY2dubzsKIAkKIAkvKgpAQCAtNjA2LDcgKzYwNyw3IEBACiAKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CiAJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgpOwogCiAJaWYgKGdvYWwgPT0gMCkgewpAQCAtNjYzLDcgKzY2NCw3IEBACiAJVUZTRCgoIkVOVEVSLCBjZyAldSwgZ29hbCAldSwgY291bnQgJXVcbiIsIHVjcGktPmNfY2d4LCBnb2FsLCBjb3VudCkpCiAKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCAoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCAodXNwaSk7CiAJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgpOwogCiAJaWYgKGdvYWwpCmRpZmYgLS1naXQgYS9mcy91ZnMvaWFsbG9jLmMgYi9mcy91ZnMvaWFsbG9jLmMKaW5kZXggMDkzODk0NS4uYzdhNDdlZCAxMDA2NDQKLS0tIGEvZnMvdWZzL2lhbGxvYy5jCisrKyBiL2ZzL3Vmcy9pYWxsb2MuYwpAQCAtNzIsNyArNzIsNyBAQAogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOwogCQogCWlubyA9IGlub2RlLT5pX2lubzsKIApAQCAtMTY3LDcgKzE2Nyw3IEBACiAJdWZzaSA9IFVGU19JKGlub2RlKTsKIAlzYmkgPSBVRlNfU0Ioc2IpOwogCXVzcGkgPSBzYmktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKIAogCWxvY2tfc3VwZXIgKHNiKTsKIApkaWZmIC0tZ2l0IGEvZnMvdWZzL2lub2RlLmMgYi9mcy91ZnMvaW5vZGUuYwppbmRleCA1NWY0YWExLi5lMGMwNGUzIDEwMDY0NAotLS0gYS9mcy91ZnMvaW5vZGUuYworKysgYi9mcy91ZnMvaW5vZGUuYwpAQCAtNjEsNyArNjEsNyBAQAogCWludCBuID0gMDsKIAogCi0JVUZTRCgoInB0cnM9dXNwaS0+c19hcGIgPSAlZCxkb3VibGVfYmxvY2tzPSVkIFxuIixwdHJzLGRvdWJsZV9ibG9ja3MpKTsKKwlVRlNEKCgicHRycz11c3BpLT5zX2FwYiA9ICVkLGRvdWJsZV9ibG9ja3M9JWxkIFxuIixwdHJzLGRvdWJsZV9ibG9ja3MpKTsKIAlpZiAoaV9ibG9jayA8IDApIHsKIAkJdWZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJ1ZnNfYmxvY2tfdG9fcGF0aCIsICJibG9jayA8IDAiKTsKIAl9IGVsc2UgaWYgKGlfYmxvY2sgPCBkaXJlY3RfYmxvY2tzKSB7CkBAIC0xMDQsNyArMTA0LDcgQEAKIAl1bnNpZ25lZCBmbGFncyA9IFVGU19TQihzYiktPnNfZmxhZ3M7CiAJdTY0IHRlbXAgPSAwTDsKIAotCVVGU0QoKCI6IGZyYWcgPSAlbHUgIGRlcHRoID0gJWRcbiIsZnJhZyxkZXB0aCkpOworCVVGU0QoKCI6IGZyYWcgPSAlbGx1ICBkZXB0aCA9ICVkXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWZyYWcsIGRlcHRoKSk7CiAJVUZTRCgoIjogdXNwaS0+c19mcGJzaGlmdCA9ICVkICx1c3BpLT5zX2FwYm1hc2sgPSAleCwgbWFzaz0lbGx4XG4iLHVzcGktPnNfZnBic2hpZnQsdXNwaS0+c19hcGJtYXNrLG1hc2spKTsKIAogCWlmIChkZXB0aCA9PSAwKQpAQCAtMzY1LDkgKzM2NSwxMCBAQAogCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CiAJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCVVGU0QoKCJyZXN1bHQgJXVcbiIsIHRtcCArIGJsb2Nrb2ZmKSk7CiBvdXQ6CiAJYnJlbHNlIChiaCk7Ci0JVUZTRCgoIkVYSVQsIHJlc3VsdCAldVxuIiwgdG1wICsgYmxvY2tvZmYpKQorCVVGU0QoKCJFWElUXG4iKSk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMzg2LDcgKzM4Nyw3IEBACiAJCiAJaWYgKCFjcmVhdGUpIHsKIAkJcGh5czY0ID0gdWZzX2ZyYWdfbWFwKGlub2RlLCBmcmFnbWVudCk7Ci0JCVVGU0QoKCJwaHlzNjQgPSAlbHUgXG4iLHBoeXM2NCkpOworCQlVRlNEKCgicGh5czY0ID0gJWxsdSBcbiIscGh5czY0KSk7CiAJCWlmIChwaHlzNjQpCiAJCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5czY0KTsKIAkJcmV0dXJuIDA7CkBAIC00MDEsNyArNDAyLDcgQEAKIAogCWxvY2tfa2VybmVsKCk7CiAKLQlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGZyYWdtZW50KSkKKwlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICVsbHVcbiIsIGlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFnbWVudCkpCiAJaWYgKGZyYWdtZW50IDwgMCkKIAkJZ290byBhYm9ydF9uZWdhdGl2ZTsKIAlpZiAoZnJhZ21lbnQgPgpkaWZmIC0tZ2l0IGEvZnMvdWZzL3N1cGVyLmMgYi9mcy91ZnMvc3VwZXIuYwppbmRleCBlOWE0MmM3Li5kNGFhY2VlIDEwMDY0NAotLS0gYS9mcy91ZnMvc3VwZXIuYworKysgYi9mcy91ZnMvc3VwZXIuYwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJdmFfbGlzdCBhcmdzOwogCiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKIAkKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJdXNiMS0+ZnNfY2xlYW4gPSBVRlNfRlNCQUQ7CkBAIC0yNTMsNyArMjUzLDcgQEAKIAl2YV9saXN0IGFyZ3M7CiAJCiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKIAkKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJdXNiMS0+ZnNfY2xlYW4gPSBVRlNfRlNCQUQ7CkBAIC00MjAsMjEgKzQyMCwxOCBAQAogCQlpZiAoaSArIHVzcGktPnNfZnBiID4gYmxrcykKIAkJCXNpemUgPSAoYmxrcyAtIGkpICogdXNwaS0+c19mc2l6ZTsKIAotCQlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgeworCQlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgCiAJCQl1YmggPSB1YmhfYnJlYWQoc2IsCiAJCQkJZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2NzYWRkcikgKyBpLCBzaXplKTsKLQkJCWlmICghdWJoKQotCQkJCWdvdG8gZmFpbGVkOwotCQkJdWJoX3ViaGNweW1lbSAoc3BhY2UsIHViaCwgc2l6ZSk7Ci0JCQlzYmktPnNfY3NwW3Vmc19mcmFnc3RvYmxrcyhpKV09KHN0cnVjdCB1ZnNfY3N1bSAqKXNwYWNlOwotCQl9Ci0JCWVsc2UgeworCQllbHNlIAogCQkJdWJoID0gdWJoX2JyZWFkKHNiLCB1c3BpLT5zX2NzYWRkciArIGksIHNpemUpOwotCQkJaWYgKCF1YmgpCi0JCQkJZ290byBmYWlsZWQ7Ci0JCQl1YmhfdWJoY3B5bWVtKHNwYWNlLCB1YmgsIHNpemUpOwotCQkJc2JpLT5zX2NzcFt1ZnNfZnJhZ3N0b2Jsa3MoaSldPShzdHJ1Y3QgdWZzX2NzdW0gKilzcGFjZTsKLQkJfQorCQkKKwkJaWYgKCF1YmgpCisJCQlnb3RvIGZhaWxlZDsKKworCQl1YmhfdWJoY3B5bWVtIChzcGFjZSwgdWJoLCBzaXplKTsKKwkJc2JpLT5zX2NzcFt1ZnNfZnJhZ3N0b2Jsa3MoaSldPShzdHJ1Y3QgdWZzX2NzdW0gKilzcGFjZTsKKwogCQlzcGFjZSArPSBzaXplOwogCQl1YmhfYnJlbHNlICh1YmgpOwogCQl1YmggPSBOVUxMOwpAQCAtNTM5LDYgKzUzNiw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAl1bnNpZ25lZCBibG9ja19zaXplLCBzdXBlcl9ibG9ja19zaXplOwogCXVuc2lnbmVkIGZsYWdzOworCXVuc2lnbmVkIHN1cGVyX2Jsb2NrX29mZnNldDsKIAogCXVzcGkgPSBOVUxMOwogCXViaCA9IE5VTEw7CkBAIC01ODYsMTAgKzU4NCwxMSBAQAogCWlmICghdXNwaSkKIAkJZ290byBmYWlsZWQ7CiAKKwlzdXBlcl9ibG9ja19vZmZzZXQ9VUZTX1NCTE9DSzsKKwogCS8qIEtlZXAgMkdpZyBmaWxlIGxpbWl0LiBTb21lIFVGUyB2YXJpYW50cyBuZWVkIHRvIG92ZXJyaWRlIAogCSAgIHRoaXMgYnV0IGFzIEkgZG9uJ3Qga25vdyB3aGljaCBJJ2xsIGxldCB0aG9zZSBpbiB0aGUga25vdyBsb29zZW4KIAkgICB0aGUgcnVsZXMgKi8KLQkgICAKIAlzd2l0Y2ggKHNiaS0+c19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRSkgewogCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfNDRCU0Q6CiAJCVVGU0QoKCJ1ZnN0eXBlPTQ0YnNkXG4iKSkKQEAgLTYwMSw3ICs2MDAsOCBAQAogCQlmbGFncyB8PSBVRlNfREVfNDRCU0QgfCBVRlNfVUlEXzQ0QlNEIHwgVUZTX1NUXzQ0QlNEIHwgVUZTX0NHXzQ0QlNEOwogCQlicmVhazsKIAljYXNlIFVGU19NT1VOVF9VRlNUWVBFX1VGUzI6Ci0JCVVGU0QoKCJ1ZnN0eXBlPXVmczJcbiIpKQorCQlVRlNEKCgidWZzdHlwZT11ZnMyXG4iKSk7CisJCXN1cGVyX2Jsb2NrX29mZnNldD1TQkxPQ0tfVUZTMjsKIAkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSA1MTI7CiAJCXVzcGktPnNfZm1hc2sgPSB+KDUxMiAtIDEpOwogCQl1c3BpLT5zX2ZzaGlmdCA9IDk7CkBAIC03MjUsMTkgKzcyNSwxNiBAQAogCS8qCiAJICogcmVhZCB1ZnMgc3VwZXIgYmxvY2sgZnJvbSBkZXZpY2UKIAkgKi8KLQlpZiAoIChmbGFncyAmIFVGU19UWVBFX01BU0spID09IFVGU19UWVBFX1VGUzIpIHsKLQkJdWJoID0gdWJoX2JyZWFkX3VzcGkodXNwaSwgc2IsIHVzcGktPnNfc2JiYXNlICsgU0JMT0NLX1VGUzIvYmxvY2tfc2l6ZSwgc3VwZXJfYmxvY2tfc2l6ZSk7Ci0JfQotCWVsc2UgewotCQl1YmggPSB1YmhfYnJlYWRfdXNwaSh1c3BpLCBzYiwgdXNwaS0+c19zYmJhc2UgKyBVRlNfU0JMT0NLL2Jsb2NrX3NpemUsIHN1cGVyX2Jsb2NrX3NpemUpOwotCX0KKworCXViaCA9IHViaF9icmVhZF91c3BpKHVzcGksIHNiLCB1c3BpLT5zX3NiYmFzZSArIHN1cGVyX2Jsb2NrX29mZnNldC9ibG9ja19zaXplLCBzdXBlcl9ibG9ja19zaXplKTsKKwkKIAlpZiAoIXViaCkgCiAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKIAogCQotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7Ci0JdXNiMiA9IHViaF9nZXRfdXNiX3NlY29uZChVU1BJX1VCSCk7Ci0JdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CisJdXNiMiA9IHViaF9nZXRfdXNiX3NlY29uZCh1c3BpKTsKKwl1c2IzID0gdWJoX2dldF91c2JfdGhpcmQodXNwaSk7CiAJdXNiICA9IChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICopCiAJCSgoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKXVzcGkpLT5iaFswXS0+Yl9kYXRhIDsKIApAQCAtMTAwNiw4ICsxMDAzLDggQEAKIAlVRlNEKCgiRU5URVJcbiIpKQogCWZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7Ci0JdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CisJdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKHVzcGkpOwogCiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCXVzYjEtPmZzX3RpbWUgPSBjcHVfdG9fZnMzMihzYiwgZ2V0X3NlY29uZHMoKSk7CkBAIC0xMDQ5LDggKzEwNDYsOCBAQAogCQogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CiAJZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7Ci0JdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CisJdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKHVzcGkpOwogCQogCS8qCiAJICogQWxsb3cgdGhlICJjaGVjayIgb3B0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIHJlbW91bnQgb3B0aW9uLgpAQCAtMTEyNCw3ICsxMTIxLDcgQEAKIAlsb2NrX2tlcm5lbCgpOwogCiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QgKFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QgKHVzcGkpOwogCXVzYiAgPSAoc3RydWN0IHVmc19zdXBlcl9ibG9jayAqKQogCQkoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1c3BpKS0+YmhbMF0tPmJfZGF0YSA7CiAJCmRpZmYgLS1naXQgYS9mcy91ZnMvdXRpbC5oIGIvZnMvdWZzL3V0aWwuaAppbmRleCBiMjY0MDA3Li40OGQ2ZDliIDEwMDY0NAotLS0gYS9mcy91ZnMvdXRpbC5oCisrKyBiL2ZzL3Vmcy91dGlsLmgKQEAgLTI0OSwxOCArMjQ5LDI4IEBACiAKIAogLyoKLSAqIG1hY3JvcyB0byBnZXQgaW1wb3J0YW50IHN0cnVjdHVyZXMgZnJvbSB1ZnNfYnVmZmVyX2hlYWQKKyAqIG1hY3JvcyBhbmQgaW5saW5lIGZ1bmN0aW9uIHRvIGdldCBpbXBvcnRhbnQgc3RydWN0dXJlcyBmcm9tIHVmc19zYl9wcml2YXRlX2luZm8KICAqLwotI2RlZmluZSB1YmhfZ2V0X3VzYl9maXJzdCh1YmgpIFwKLQkoKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKikoKHViaCktPmJoWzBdLT5iX2RhdGEpKQogCi0jZGVmaW5lIHViaF9nZXRfdXNiX3NlY29uZCh1YmgpIFwKLQkoKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfc2Vjb25kICopKHViaCktPiBcCi0JYmhbVUZTX1NFQ1RPUl9TSVpFID4+IHVzcGktPnNfZnNoaWZ0XS0+Yl9kYXRhICsgKFVGU19TRUNUT1JfU0laRSAmIH51c3BpLT5zX2ZtYXNrKSkKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X3VzYl9vZmZzZXQoc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKnVzcGksCisJCQkJICAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJCisJaW5kZXggPSBvZmZzZXQgPj4gdXNwaS0+c19mc2hpZnQ7CisJb2Zmc2V0ICY9IH51c3BpLT5zX2ZtYXNrOworCXJldHVybiB1c3BpLT5zX3ViaC5iaFtpbmRleF0tPmJfZGF0YSArIG9mZnNldDsKK30KIAotI2RlZmluZSB1YmhfZ2V0X3VzYl90aGlyZCh1YmgpIFwKLQkoKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKikoKHViaCktPiBcCi0JYmhbVUZTX1NFQ1RPUl9TSVpFKjIgPj4gdXNwaS0+c19mc2hpZnRdLT5iX2RhdGEgKyAoVUZTX1NFQ1RPUl9TSVpFKjIgJiB+dXNwaS0+c19mbWFzaykpKQorI2RlZmluZSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKSBcCisJKChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICopZ2V0X3VzYl9vZmZzZXQoKHVzcGkpLCAwKSkKKworI2RlZmluZSB1YmhfZ2V0X3VzYl9zZWNvbmQodXNwaSkgXAorCSgoc3RydWN0IHVmc19zdXBlcl9ibG9ja19zZWNvbmQgKilnZXRfdXNiX29mZnNldCgodXNwaSksIFVGU19TRUNUT1JfU0laRSkpCisKKyNkZWZpbmUgdWJoX2dldF91c2JfdGhpcmQodXNwaSkJXAorCSgoc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqKWdldF91c2Jfb2Zmc2V0KCh1c3BpKSwgMipVRlNfU0VDVE9SX1NJWkUpKQorCiAKICNkZWZpbmUgdWJoX2dldF91Y2codWJoKSBcCiAJKChzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICopKCh1YmgpLT5iaFswXS0+Yl9kYXRhKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYml0b3BzLmggYi9pbmNsdWRlL2FzbS1pMzg2L2JpdG9wcy5oCmluZGV4IGZlMDgxOWYuLjg4ZTZjYTI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2JpdG9wcy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvYml0b3BzLmgKQEAgLTI0Nyw3ICsyNDcsNyBAQAogc3RhdGljIGludCB0ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiBhZGRyKTsKICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIGludCBjb25zdGFudF90ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCitzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBjb25zdGFudF90ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCiB7CiAJcmV0dXJuICgoMVVMIDw8IChuciAmIDMxKSkgJiAoYWRkcltuciA+PiA1XSkpICE9IDA7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2N1cnJlbnQuaCBiL2luY2x1ZGUvYXNtLWkzODYvY3VycmVudC5oCmluZGV4IGQ5NzMyODkuLjNjYmJlY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvY3VycmVudC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvY3VycmVudC5oCkBAIC01LDcgKzUsNyBAQAogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICogZ2V0X2N1cnJlbnQodm9pZCkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICogZ2V0X2N1cnJlbnQodm9pZCkKIHsKIAlyZXR1cm4gY3VycmVudF90aHJlYWRfaW5mbygpLT50YXNrOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zdHJpbmcuaCBiL2luY2x1ZGUvYXNtLWkzODYvc3RyaW5nLmgKaW5kZXggMDJjOGY1ZC4uYmI1Zjg4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9zdHJpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3N0cmluZy5oCkBAIC0yMDEsNyArMjAxLDcgQEAKIHJldHVybiBfX3JlczsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICogX19tZW1jcHkodm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgc2l6ZV90IG4pCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKiBfX21lbWNweSh2b2lkICogdG8sIGNvbnN0IHZvaWQgKiBmcm9tLCBzaXplX3QgbikKIHsKIGludCBkMCwgZDEsIGQyOwogX19hc21fXyBfX3ZvbGF0aWxlX18oCkBAIC0yMjMsNyArMjIzLDcgQEAKICAqIFRoaXMgbG9va3MgdWdseSwgYnV0IHRoZSBjb21waWxlciBjYW4gb3B0aW1pemUgaXQgdG90YWxseSwKICAqIGFzIHRoZSBjb3VudCBpcyBjb25zdGFudC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkICogX19jb25zdGFudF9tZW1jcHkodm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgc2l6ZV90IG4pCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKiBfX2NvbnN0YW50X21lbWNweSh2b2lkICogdG8sIGNvbnN0IHZvaWQgKiBmcm9tLCBzaXplX3QgbikKIHsKIAlsb25nIGVzaSwgZWRpOwogCWlmICghbikgcmV0dXJuIHRvOwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAgKiB0aGluZ3MgMzIgYml0cyBhdCBhIHRpbWUgZXZlbiB3aGVuIHdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlCiAgKiBhcmVhIGF0IGNvbXBpbGUtdGltZS4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqIF9fY29uc3RhbnRfY19tZW1zZXQodm9pZCAqIHMsIHVuc2lnbmVkIGxvbmcgYywgc2l6ZV90IGNvdW50KQorc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICogX19jb25zdGFudF9jX21lbXNldCh2b2lkICogcywgdW5zaWduZWQgbG9uZyBjLCBzaXplX3QgY291bnQpCiB7CiBpbnQgZDAsIGQxOwogX19hc21fXyBfX3ZvbGF0aWxlX18oCkBAIC00MTYsNyArNDE2LDcgQEAKICAqIFRoaXMgbG9va3MgaG9ycmlibHkgdWdseSwgYnV0IHRoZSBjb21waWxlciBjYW4gb3B0aW1pemUgaXQgdG90YWxseSwKICAqIGFzIHdlIGJ5IG5vdyBrbm93IHRoYXQgYm90aCBwYXR0ZXJuIGFuZCBjb3VudCBpcyBjb25zdGFudC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqIF9fY29uc3RhbnRfY19hbmRfY291bnRfbWVtc2V0KHZvaWQgKiBzLCB1bnNpZ25lZCBsb25nIHBhdHRlcm4sIHNpemVfdCBjb3VudCkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqIF9fY29uc3RhbnRfY19hbmRfY291bnRfbWVtc2V0KHZvaWQgKiBzLCB1bnNpZ25lZCBsb25nIHBhdHRlcm4sIHNpemVfdCBjb3VudCkKIHsKIAlzd2l0Y2ggKGNvdW50KSB7CiAJCWNhc2UgMDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20taTM4Ni91YWNjZXNzLmgKaW5kZXggODlhYjdlMi4uM2YxMzM3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni91YWNjZXNzLmgKQEAgLTQxMSw3ICs0MTEsNyBAQAogICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY29waWVkLgogICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKIF9fY29weV90b191c2VyX2luYXRvbWljKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkgewpAQCAtNDMyLDcgKzQzMiw3IEBACiAJcmV0dXJuIF9fY29weV90b191c2VyX2xsKHRvLCBmcm9tLCBuKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjaworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAgICAgICAgbWlnaHRfc2xlZXAoKTsKQEAgLTQ1Niw3ICs0NTYsNyBAQAogICogSWYgc29tZSBkYXRhIGNvdWxkIG5vdCBiZSBjb3BpZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBwYWQgdGhlIGNvcGllZAogICogZGF0YSB0byB0aGUgcmVxdWVzdGVkIHNpemUgdXNpbmcgemVybyBieXRlcy4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pKSB7CkBAIC00NzcsNyArNDc3LDcgQEAKIAlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcl9sbCh0bywgZnJvbSwgbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCiBfX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogICAgICAgIG1pZ2h0X3NsZWVwKCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2twcm9iZXMuaCBiL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oCmluZGV4IGE3NGI2ODEuLjhjMGZjMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oCkBAIC02OCwxMCArNjgsMTQgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXR1czsKIH07CiAKKyNkZWZpbmUJTUFYX1BBUkFNX1JTRV9TSVpFCSgweDYwKzB4NjAvMHgzZikKIC8qIHBlci1jcHUga3Byb2JlIGNvbnRyb2wgYmxvY2sgKi8KIHN0cnVjdCBrcHJvYmVfY3RsYmxrIHsKIAl1bnNpZ25lZCBsb25nIGtwcm9iZV9zdGF0dXM7CiAJc3RydWN0IHB0X3JlZ3MganByb2JlX3NhdmVkX3JlZ3M7CisJdW5zaWduZWQgbG9uZyBqcHJvYmVzX3NhdmVkX3N0YWNrZWRfcmVnc1tNQVhfUEFSQU1fUlNFX1NJWkVdOworCXVuc2lnbmVkIGxvbmcgKmJzcDsKKwl1bnNpZ25lZCBsb25nIGNmbTsKIAlzdHJ1Y3QgcHJldl9rcHJvYmUgcHJldl9rcHJvYmU7CiB9OwogCkBAIC0xMTgsNSArMTIyLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBqcHJvYmVfcmV0dXJuKHZvaWQpCiB7CiB9CitleHRlcm4gdm9pZCBpbnZhbGlkYXRlX3N0YWNrZWRfcmVncyh2b2lkKTsKK2V4dGVybiB2b2lkIGZsdXNoX3JlZ2lzdGVyX3N0YWNrKHZvaWQpOwogCiAjZW5kaWYJCQkJLyogX0FTTV9LUFJPQkVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vaW9jMy5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9pb2MzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlZDZjYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vaW9jMy5oCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworI2lmbmRlZiBJQTY0X1NOX0lPQzNfSAorI2RlZmluZSBJQTY0X1NOX0lPQzNfSAorCisvKiBzZXJpYWwgcG9ydCByZWdpc3RlciBtYXAgKi8KK3N0cnVjdCBpb2MzX3NlcmlhbHJlZ3MgeworCXVpbnQzMl90IHNzY3I7CisJdWludDMyX3Qgc3RwaXI7CisJdWludDMyX3Qgc3RjaXI7CisJdWludDMyX3Qgc3JwaXI7CisJdWludDMyX3Qgc3JjaXI7CisJdWludDMyX3Qgc3J0cjsKKwl1aW50MzJfdCBzaGFkb3c7Cit9OworCisvKiBTVVBFUklPIHVhcnQgcmVnaXN0ZXIgbWFwICovCitzdHJ1Y3QgaW9jM191YXJ0cmVncyB7CisJY2hhciBpdV9sY3I7CisJdW5pb24geworCQljaGFyIGlpcjsJLyogcmVhZCBvbmx5ICovCisJCWNoYXIgZmNyOwkvKiB3cml0ZSBvbmx5ICovCisJfSB1MzsKKwl1bmlvbiB7CisJCWNoYXIgaWVyOwkvKiBETEFCID09IDAgKi8KKwkJY2hhciBkbG07CS8qIERMQUIgPT0gMSAqLworCX0gdTI7CisJdW5pb24geworCQljaGFyIHJicjsJLyogcmVhZCBvbmx5LCBETEFCID09IDAgKi8KKwkJY2hhciB0aHI7CS8qIHdyaXRlIG9ubHksIERMQUIgPT0gMCAqLworCQljaGFyIGRsbDsJLyogRExBQiA9PSAxICovCisJfSB1MTsKKwljaGFyIGl1X3NjcjsKKwljaGFyIGl1X21zcjsKKwljaGFyIGl1X2xzcjsKKwljaGFyIGl1X21jcjsKK307CisKKyNkZWZpbmUgaXVfcmJyIHUxLnJicgorI2RlZmluZSBpdV90aHIgdTEudGhyCisjZGVmaW5lIGl1X2RsbCB1MS5kbGwKKyNkZWZpbmUgaXVfaWVyIHUyLmllcgorI2RlZmluZSBpdV9kbG0gdTIuZGxtCisjZGVmaW5lIGl1X2lpciB1My5paXIKKyNkZWZpbmUgaXVfZmNyIHUzLmZjcgorCitzdHJ1Y3QgaW9jM19zaW9yZWdzIHsKKwljaGFyIGZpbGxbMHgxNzBdOworCXN0cnVjdCBpb2MzX3VhcnRyZWdzIHVhcnRiOworCXN0cnVjdCBpb2MzX3VhcnRyZWdzIHVhcnRhOworfTsKKworLyogUENJIElPL21lbSBzcGFjZSByZWdpc3RlciBtYXAgKi8KK3N0cnVjdCBpb2MzIHsKKwl1aW50MzJfdCBwY2lfaWQ7CisJdWludDMyX3QgcGNpX3NjcjsKKwl1aW50MzJfdCBwY2lfcmV2OworCXVpbnQzMl90IHBjaV9sYXQ7CisJdWludDMyX3QgcGNpX2FkZHI7CisJdWludDMyX3QgcGNpX2Vycl9hZGRyX2w7CisJdWludDMyX3QgcGNpX2Vycl9hZGRyX2g7CisKKwl1aW50MzJfdCBzaW9faXI7CisJLyogdGhlc2UgcmVnaXN0ZXJzIGFyZSByZWFkLW9ubHkgZm9yIGdlbmVyYWwga2VybmVsIGNvZGUuIFRvCisJICogbW9kaWZ5IHRoZW0gdXNlIHRoZSBmdW5jdGlvbnMgaW4gaW9jMy5jCisJICovCisJdWludDMyX3Qgc2lvX2llczsKKwl1aW50MzJfdCBzaW9faWVjOworCXVpbnQzMl90IHNpb19jcjsKKwl1aW50MzJfdCBpbnRfb3V0OworCXVpbnQzMl90IG1jcjsKKwl1aW50MzJfdCBncGNyX3M7CisJdWludDMyX3QgZ3Bjcl9jOworCXVpbnQzMl90IGdwZHI7CisJdWludDMyX3QgZ3Bwcls5XTsKKwljaGFyIGZpbGxbMHg0Y107CisKKwkvKiBzZXJpYWwgcG9ydCByZWdpc3RlcnMgKi8KKwl1aW50MzJfdCBzYmJyX2g7CisJdWludDMyX3Qgc2Jicl9sOworCisJc3RydWN0IGlvYzNfc2VyaWFscmVncyBwb3J0X2E7CisJc3RydWN0IGlvYzNfc2VyaWFscmVncyBwb3J0X2I7CisJY2hhciBmaWxsMVsweDFmZjEwXTsKKwkvKiBzdXBlcmlvIHJlZ2lzdGVycyAqLworCXN0cnVjdCBpb2MzX3Npb3JlZ3Mgc3JlZ3M7Cit9OworCisvKiBUaGVzZSBkb24ndCBleGlzdCBvbiB0aGUgaW9jMyBzZXJpYWwgY2FyZC4uLiAqLworI2RlZmluZSBlaWVyCWZpbGwxWzhdCisjZGVmaW5lIGVpc3IJZmlsbDFbNF0KKworI2RlZmluZSBQQ0lfTEFUCQkJMHhjCS8qIExhdGVuY3kgVGltZXIgKi8KKyNkZWZpbmUgUENJX1NDUl9EUk9QX01PREVfRU4JMHgwMDAwODAwMCAvKiBkcm9wIHBpb3Mgb24gcGFyaXR5IGVyciAqLworI2RlZmluZSBVQVJUQV9CQVNFCQkweDE3OAorI2RlZmluZSBVQVJUQl9CQVNFCQkweDE3MAorCisKKy8qIGJpdG1hc2tzIGZvciBzZXJpYWwgUlggc3RhdHVzIGJ5dGUgKi8KKyNkZWZpbmUgUlhTQl9PVkVSUlVOCQkweDAxCS8qIGNoYXIocykgbG9zdCAqLworI2RlZmluZSBSWFNCX1BBUl9FUlIJCTB4MDIJLyogcGFyaXR5IGVycm9yICovCisjZGVmaW5lIFJYU0JfRlJBTUVfRVJSCQkweDA0CS8qIGZyYW1pbmcgZXJyb3IgKi8KKyNkZWZpbmUgUlhTQl9CUkVBSwkJMHgwOAkvKiBicmVhayBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgUlhTQl9DVFMJCTB4MTAJLyogc3RhdGUgb2YgQ1RTICovCisjZGVmaW5lIFJYU0JfRENECQkweDIwCS8qIHN0YXRlIG9mIERDRCAqLworI2RlZmluZSBSWFNCX01PREVNX1ZBTElECTB4NDAJLyogRENELCBDVFMgYW5kIE9WRVJSVU4gYXJlIHZhbGlkICovCisjZGVmaW5lIFJYU0JfREFUQV9WQUxJRAkJMHg4MAkvKiBGUkFNRV9FUlIgUEFSX0VSUiAmIEJSRUFLIHZhbGlkICovCisKKy8qIGJpdG1hc2tzIGZvciBzZXJpYWwgVFggY29udHJvbCBieXRlICovCisjZGVmaW5lIFRYQ0JfSU5UX1dIRU5fRE9ORQkweDIwCS8qIGludGVycnVwdCBhZnRlciB0aGlzIGJ5dGUgaXMgc2VudCAqLworI2RlZmluZSBUWENCX0lOVkFMSUQJCTB4MDAJLyogYnl0ZSBpcyBpbnZhbGlkICovCisjZGVmaW5lIFRYQ0JfVkFMSUQJCTB4NDAJLyogYnl0ZSBpcyB2YWxpZCAqLworI2RlZmluZSBUWENCX01DUgkJMHg4MAkvKiBkYXRhPDc6MD4gdG8gbW9kZW0gY250cmwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVFhDQl9ERUxBWQkJMHhjMAkvKiBkZWxheSBkYXRhPDc6MD4gbVNlYyAqLworCisvKiBiaXRtYXNrcyBmb3IgU0JCUl9MICovCisjZGVmaW5lIFNCQlJfTF9TSVpFCQkweDAwMDAwMDAxCS8qIDAgMUtCIHJpbmdzLCAxIDRLQiByaW5ncyAqLworCisvKiBiaXRtYXNrcyBmb3IgU1NDUl88QTpCPiAqLworI2RlZmluZSBTU0NSX1JYX1RIUkVTSE9MRAkweDAwMDAwMWZmCS8qIGhpd2F0ZXIgbWFyayAqLworI2RlZmluZSBTU0NSX1RYX1RJTUVSX0JVU1kJMHgwMDAxMDAwMAkvKiBUWCB0aW1lciBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBTU0NSX0hGQ19FTgkJMHgwMDAyMDAwMAkvKiBoL3cgZmxvdyBjbnRybCBlbmFibGVkICovCisjZGVmaW5lIFNTQ1JfUlhfUklOR19EQ0QJMHgwMDA0MDAwMAkvKiBwb3N0UlggcmVjb3JkIG9uIGRlbHRhLURDRCAqLworI2RlZmluZSBTU0NSX1JYX1JJTkdfQ1RTCTB4MDAwODAwMDAJLyogcG9zdFJYIHJlY29yZCBvbiBkZWx0YS1DVFMgKi8KKyNkZWZpbmUgU1NDUl9ISUdIX1NQRAkJMHgwMDEwMDAwMAkvKiA0WCBzcGVlZCAqLworI2RlZmluZSBTU0NSX0RJQUcJCTB4MDAyMDAwMDAJLyogYnlwYXNzIGNsb2NrIGRpdmlkZXIgKi8KKyNkZWZpbmUgU1NDUl9SWF9EUkFJTgkJMHgwODAwMDAwMAkvKiBkcmFpbiBSWCBidWZmZXIgdG8gbWVtb3J5ICovCisjZGVmaW5lIFNTQ1JfRE1BX0VOCQkweDEwMDAwMDAwCS8qIGVuYWJsZSByaW5nIGJ1ZmZlciBETUEgKi8KKyNkZWZpbmUgU1NDUl9ETUFfUEFVU0UJCTB4MjAwMDAwMDAJLyogcGF1c2UgRE1BICovCisjZGVmaW5lIFNTQ1JfUEFVU0VfU1RBVEUJMHg0MDAwMDAwMAkvKiBzZXQgd2hlbiBQQVVTRSB0YWtlcyBlZmZlY3QqLworI2RlZmluZSBTU0NSX1JFU0VUCQkweDgwMDAwMDAwCS8qIHJlc2V0IERNQSBjaGFubmVscyAqLworCisvKiBhbGwgcHJvZHVjZXIvY29tc3VtZXIgcG9pbnRlcnMgYXJlIHRoZSBzYW1lIGJpdGZpZWxkICovCisjZGVmaW5lIFBST0RfQ09OU19QVFJfNEsJMHgwMDAwMGZmOAkvKiBmb3IgNEsgYnVmZmVycyAqLworI2RlZmluZSBQUk9EX0NPTlNfUFRSXzFLCTB4MDAwMDAzZjgJLyogZm9yIDFLIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgUFJPRF9DT05TX1BUUl9PRkYJMworCisvKiBiaXRtYXNrcyBmb3IgU1JDSVJfPEE6Qj4gKi8KKyNkZWZpbmUgU1JDSVJfQVJNCQkweDgwMDAwMDAwCS8qIGFybSBSWCB0aW1lciAqLworCisvKiBiaXRtYXNrcyBmb3IgU0hBRE9XXzxBOkI+ICovCisjZGVmaW5lIFNIQURPV19EUgkJMHgwMDAwMDAwMQkvKiBkYXRhIHJlYWR5ICovCisjZGVmaW5lIFNIQURPV19PRQkJMHgwMDAwMDAwMgkvKiBvdmVycnVuIGVycm9yICovCisjZGVmaW5lIFNIQURPV19QRQkJMHgwMDAwMDAwNAkvKiBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgU0hBRE9XX0ZFCQkweDAwMDAwMDA4CS8qIGZyYW1pbmcgZXJyb3IgKi8KKyNkZWZpbmUgU0hBRE9XX0JJCQkweDAwMDAwMDEwCS8qIGJyZWFrIGludGVycnVwdCAqLworI2RlZmluZSBTSEFET1dfVEhSRQkJMHgwMDAwMDAyMAkvKiB0cmFuc21pdCBob2xkaW5nIHJlZyBlbXB0eSAqLworI2RlZmluZSBTSEFET1dfVEVNVAkJMHgwMDAwMDA0MAkvKiB0cmFuc21pdCBzaGlmdCByZWcgZW1wdHkgKi8KKyNkZWZpbmUgU0hBRE9XX1JGQ0UJCTB4MDAwMDAwODAJLyogY2hhciBpbiBSWCBmaWZvIGhhcyBlcnJvciAqLworI2RlZmluZSBTSEFET1dfRENUUwkJMHgwMDAxMDAwMAkvKiBkZWx0YSBjbGVhciB0byBzZW5kICovCisjZGVmaW5lIFNIQURPV19ERENECQkweDAwMDgwMDAwCS8qIGRlbHRhIGRhdGEgY2FycmllciBkZXRlY3QgKi8KKyNkZWZpbmUgU0hBRE9XX0NUUwkJMHgwMDEwMDAwMAkvKiBjbGVhciB0byBzZW5kICovCisjZGVmaW5lIFNIQURPV19EQ0QJCTB4MDA4MDAwMDAJLyogZGF0YSBjYXJyaWVyIGRldGVjdCAqLworI2RlZmluZSBTSEFET1dfRFRSCQkweDAxMDAwMDAwCS8qIGRhdGEgdGVybWluYWwgcmVhZHkgKi8KKyNkZWZpbmUgU0hBRE9XX1JUUwkJMHgwMjAwMDAwMAkvKiByZXF1ZXN0IHRvIHNlbmQgKi8KKyNkZWZpbmUgU0hBRE9XX09VVDEJCTB4MDQwMDAwMDAJLyogMTY1NTAgT1VUMSBiaXQgKi8KKyNkZWZpbmUgU0hBRE9XX09VVDIJCTB4MDgwMDAwMDAJLyogMTY1NTAgT1VUMiBiaXQgKi8KKyNkZWZpbmUgU0hBRE9XX0xPT1AJCTB4MTAwMDAwMDAJLyogbG9vcGJhY2sgZW5hYmxlZCAqLworCisvKiBiaXRtYXNrcyBmb3IgU1JUUl88QTpCPiAqLworI2RlZmluZSBTUlRSX0NOVAkJMHgwMDAwMGZmZgkvKiByZWxvYWQgdmFsdWUgZm9yIFJYIHRpbWVyICovCisjZGVmaW5lIFNSVFJfQ05UX1ZBTAkJMHgwZmZmMDAwMAkvKiBjdXJyZW50IHZhbHVlIG9mIFJYIHRpbWVyICovCisjZGVmaW5lIFNSVFJfQ05UX1ZBTF9TSElGVAkxNgorI2RlZmluZSBTUlRSX0haCQkJMTYwMDAJCS8qIFNSVFIgY2xvY2sgZnJlcXVlbmN5ICovCisKKy8qIGJpdG1hc2tzIGZvciBTSU9fSVIsIFNJT19JRUMgYW5kIFNJT19JRVMgICovCisjZGVmaW5lIFNJT19JUl9TQV9UWF9NVAkJMHgwMDAwMDAwMQkvKiBTZXJpYWwgcG9ydCBBIFRYIGVtcHR5ICovCisjZGVmaW5lIFNJT19JUl9TQV9SWF9GVUxMCTB4MDAwMDAwMDIJLyogcG9ydCBBIFJYIGJ1ZiBmdWxsICovCisjZGVmaW5lIFNJT19JUl9TQV9SWF9ISUdICTB4MDAwMDAwMDQJLyogcG9ydCBBIFJYIGhpd2F0ICovCisjZGVmaW5lIFNJT19JUl9TQV9SWF9USU1FUgkweDAwMDAwMDA4CS8qIHBvcnQgQSBSWCB0aW1lb3V0ICovCisjZGVmaW5lIFNJT19JUl9TQV9ERUxUQV9EQ0QJMHgwMDAwMDAxMAkvKiBwb3J0IEEgZGVsdGEgRENEICovCisjZGVmaW5lIFNJT19JUl9TQV9ERUxUQV9DVFMJMHgwMDAwMDAyMAkvKiBwb3J0IEEgZGVsdGEgQ1RTICovCisjZGVmaW5lIFNJT19JUl9TQV9JTlQJCTB4MDAwMDAwNDAJLyogcG9ydCBBIHBhc3MtdGhydSBpbnRyICovCisjZGVmaW5lIFNJT19JUl9TQV9UWF9FWFBMSUNJVAkweDAwMDAwMDgwCS8qIHBvcnQgQSBleHBsaWNpdCBUWCB0aHJ1ICovCisjZGVmaW5lIFNJT19JUl9TQV9NRU1FUlIJMHgwMDAwMDEwMAkvKiBwb3J0IEEgUENJIGVycm9yICovCisjZGVmaW5lIFNJT19JUl9TQl9UWF9NVAkJMHgwMDAwMDIwMAorI2RlZmluZSBTSU9fSVJfU0JfUlhfRlVMTAkweDAwMDAwNDAwCisjZGVmaW5lIFNJT19JUl9TQl9SWF9ISUdICTB4MDAwMDA4MDAKKyNkZWZpbmUgU0lPX0lSX1NCX1JYX1RJTUVSCTB4MDAwMDEwMDAKKyNkZWZpbmUgU0lPX0lSX1NCX0RFTFRBX0RDRAkweDAwMDAyMDAwCisjZGVmaW5lIFNJT19JUl9TQl9ERUxUQV9DVFMJMHgwMDAwNDAwMAorI2RlZmluZSBTSU9fSVJfU0JfSU5UCQkweDAwMDA4MDAwCisjZGVmaW5lIFNJT19JUl9TQl9UWF9FWFBMSUNJVAkweDAwMDEwMDAwCisjZGVmaW5lIFNJT19JUl9TQl9NRU1FUlIJMHgwMDAyMDAwMAorI2RlZmluZSBTSU9fSVJfUFBfSU5UCQkweDAwMDQwMDAwCS8qIFAgcG9ydCBwYXNzLXRocnUgaW50ciAqLworI2RlZmluZSBTSU9fSVJfUFBfSU5UQQkJMHgwMDA4MDAwMAkvKiBQUCBjb250ZXh0IEEgdGhydSAqLworI2RlZmluZSBTSU9fSVJfUFBfSU5UQgkJMHgwMDEwMDAwMAkvKiBQUCBjb250ZXh0IEIgdGhydSAqLworI2RlZmluZSBTSU9fSVJfUFBfTUVNRVJSCTB4MDAyMDAwMDAJLyogUFAgUENJIGVycm9yICovCisjZGVmaW5lIFNJT19JUl9LQkRfSU5UCQkweDAwNDAwMDAwCS8qIGtiZC9tb3VzZSBpbnRyICovCisjZGVmaW5lIFNJT19JUl9SVF9JTlQJCTB4MDgwMDAwMDAJLyogUlQgb3V0cHV0IHB1bHNlICovCisjZGVmaW5lIFNJT19JUl9HRU5fSU5UMQkJMHgxMDAwMDAwMAkvKiBSVCBpbnB1dCBwdWxzZSAqLworI2RlZmluZSBTSU9fSVJfR0VOX0lOVF9TSElGVAkyOAorCisvKiBwZXIgZGV2aWNlIGludGVycnVwdCBtYXNrcyAqLworI2RlZmluZSBTSU9fSVJfU0EJCShTSU9fSVJfU0FfVFhfTVQgfCBcCisJCQkJIFNJT19JUl9TQV9SWF9GVUxMIHwgXAorCQkJCSBTSU9fSVJfU0FfUlhfSElHSCB8IFwKKwkJCQkgU0lPX0lSX1NBX1JYX1RJTUVSIHwgXAorCQkJCSBTSU9fSVJfU0FfREVMVEFfRENEIHwgXAorCQkJCSBTSU9fSVJfU0FfREVMVEFfQ1RTIHwgXAorCQkJCSBTSU9fSVJfU0FfSU5UIHwgXAorCQkJCSBTSU9fSVJfU0FfVFhfRVhQTElDSVQgfCBcCisJCQkJIFNJT19JUl9TQV9NRU1FUlIpCisKKyNkZWZpbmUgU0lPX0lSX1NCCQkoU0lPX0lSX1NCX1RYX01UIHwgXAorCQkJCSBTSU9fSVJfU0JfUlhfRlVMTCB8IFwKKwkJCQkgU0lPX0lSX1NCX1JYX0hJR0ggfCBcCisJCQkJIFNJT19JUl9TQl9SWF9USU1FUiB8IFwKKwkJCQkgU0lPX0lSX1NCX0RFTFRBX0RDRCB8IFwKKwkJCQkgU0lPX0lSX1NCX0RFTFRBX0NUUyB8IFwKKwkJCQkgU0lPX0lSX1NCX0lOVCB8IFwKKwkJCQkgU0lPX0lSX1NCX1RYX0VYUExJQ0lUIHwgXAorCQkJCSBTSU9fSVJfU0JfTUVNRVJSKQorCisjZGVmaW5lIFNJT19JUl9QUAkJKFNJT19JUl9QUF9JTlQgfCBTSU9fSVJfUFBfSU5UQSB8IFwKKwkJCQkgU0lPX0lSX1BQX0lOVEIgfCBTSU9fSVJfUFBfTUVNRVJSKQorI2RlZmluZSBTSU9fSVJfUlQJCShTSU9fSVJfUlRfSU5UIHwgU0lPX0lSX0dFTl9JTlQxKQorCisvKiBiaXRtYXNrcyBmb3IgU0lPX0NSICovCisjZGVmaW5lIFNJT19DUl9DTURfUFVMU0VfU0hJRlQgMTUKKyNkZWZpbmUgU0lPX0NSX1NFUl9BX0JBU0VfU0hJRlQgMQorI2RlZmluZSBTSU9fQ1JfU0VSX0JfQkFTRV9TSElGVCA4CisjZGVmaW5lIFNJT19DUl9BUkJfRElBRwkJMHgwMDM4MDAwMAkvKiBjdXIgIWVuZXQgUENJIHJlcXVldCAocm8pICovCisjZGVmaW5lIFNJT19DUl9BUkJfRElBR19UWEEJMHgwMDAwMDAwMAorI2RlZmluZSBTSU9fQ1JfQVJCX0RJQUdfUlhBCTB4MDAwODAwMDAKKyNkZWZpbmUgU0lPX0NSX0FSQl9ESUFHX1RYQgkweDAwMTAwMDAwCisjZGVmaW5lIFNJT19DUl9BUkJfRElBR19SWEIJMHgwMDE4MDAwMAorI2RlZmluZSBTSU9fQ1JfQVJCX0RJQUdfUFAJMHgwMDIwMDAwMAorI2RlZmluZSBTSU9fQ1JfQVJCX0RJQUdfSURMRQkweDAwNDAwMDAwCS8qIDAgLT4gYWN0aXZlIHJlcXVlc3QgKHJvKSAqLworCisvKiBkZWZzIGZvciBzb21lIG9mIHRoZSBnZW5lcmljIEkvTyBwaW5zICovCisjZGVmaW5lIEdQQ1JfUEhZX1JFU0VUCQkweDIwCS8qIHBpbiBpcyBvdXRwdXQgdG8gUEhZIHJlc2V0ICovCisjZGVmaW5lIEdQQ1JfVUFSVEJfTU9ERVNFTAkweDQwCS8qIHBpbiBpcyBvdXRwdXQgdG8gcG9ydCBCIG1vZGUgc2VsICovCisjZGVmaW5lIEdQQ1JfVUFSVEFfTU9ERVNFTAkweDgwCS8qIHBpbiBpcyBvdXRwdXQgdG8gcG9ydCBBIG1vZGUgc2VsICovCisKKyNkZWZpbmUgR1BQUl9QSFlfUkVTRVRfUElOCTUJLyogR0lPIHBpbiBjb250cm9sbGluZyBwaHkgcmVzZXQgKi8KKyNkZWZpbmUgR1BQUl9VQVJUQl9NT0RFU0VMX1BJTgk2CS8qIEdJTyBwaW4gY250cmxpbmcgdWFydGIgbW9kZXNlbGVjdCAqLworI2RlZmluZSBHUFBSX1VBUlRBX01PREVTRUxfUElOCTcJLyogR0lPIHBpbiBjbnRybGluZyB1YXJ0YSBtb2Rlc2VsZWN0ICovCisKKyNlbmRpZiAvKiBJQTY0X1NOX0lPQzNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmgKaW5kZXggMmE4YjBkOS4uOGI5ZTEwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX3NhbC5oCkBAIC03NSw3ICs3NSw4IEBACiAjZGVmaW5lICBTTl9TQUxfSU9JRl9HRVRfSFVCREVWX0lORk8JCSAgIDB4MDIwMDAwNTUKICNkZWZpbmUgIFNOX1NBTF9JT0lGX0dFVF9QQ0lCVVNfSU5GTwkJICAgMHgwMjAwMDA1NgogI2RlZmluZSAgU05fU0FMX0lPSUZfR0VUX1BDSURFVl9JTkZPCQkgICAweDAyMDAwMDU3Ci0jZGVmaW5lICBTTl9TQUxfSU9JRl9HRVRfV0lER0VUX0RNQUZMVVNIX0xJU1QJICAgMHgwMjAwMDA1OAorI2RlZmluZSAgU05fU0FMX0lPSUZfR0VUX1dJREdFVF9ETUFGTFVTSF9MSVNUCSAgIDB4MDIwMDAwNTgJLy8gZGVwcmVjYXRlZAorI2RlZmluZSAgU05fU0FMX0lPSUZfR0VUX0RFVklDRV9ETUFGTFVTSF9MSVNUCSAgIDB4MDIwMDAwNWEKIAogI2RlZmluZSBTTl9TQUxfSFVCX0VSUk9SX0lOVEVSUlVQVAkJICAgMHgwMjAwMDA2MAogI2RlZmluZSBTTl9TQUxfQlRFX1JFQ09WRVIJCQkgICAweDAyMDAwMDYxCkBAIC0xMTAwLDcgKzExMDEsNyBAQAogCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcnY7CiAKIAlydi5zdGF0dXMgPSAwOwotCVNBTF9DQUxMX05PTE9DSyhydiwgU05fU0FMX0JURV9SRUNPVkVSLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKwlTQUxfQ0FMTF9OT0xPQ0socnYsIFNOX1NBTF9CVEVfUkVDT1ZFUiwgKHU2NCluYXNpZCwgMCwgMCwgMCwgMCwgMCwgMCk7CiAJaWYgKHJ2LnN0YXR1cyA9PSBTQUxSRVRfTk9UX0lNUExFTUVOVEVEKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gKGludCkgcnYuc3RhdHVzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi94cC5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi94cC5oCmluZGV4IDQ5ZmFmOGYuLjIwMzk0NWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24veHAuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3hwLmgKQEAgLTIyNyw3ICsyMjcsOSBAQAogCiAJeHBjT3BlbkNsb3NlRXJyb3IsCS8qIDUwOiBjaGFubmVsIG9wZW4vY2xvc2UgcHJvdG9jb2wgZXJyb3IgKi8KIAotCXhwY1Vua25vd25SZWFzb24JLyogNTE6IHVua25vd24gcmVhc29uIC0tIG11c3QgYmUgbGFzdCBpbiBsaXN0ICovCisJeHBjRGlzY29ubmVjdGVkLAkvKiA1MTogY2hhbm5lbCBkaXNjb25uZWN0ZWQgKGNsb3NlZCkgKi8KKworCXhwY1Vua25vd25SZWFzb24JLyogNTI6IHVua25vd24gcmVhc29uIC0tIG11c3QgYmUgbGFzdCBpbiBsaXN0ICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3hwYy5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGFyY2gvaWE2NC9zbi9rZXJuZWwveHBjLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLWlhNjQvc24veHBjLmgKaW5kZXggNTQ4M2E5Zi4uODdlOWNkNTggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi94cGMuaApAQCAtMyw3ICszLDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKi8KIAogCkBAIC0xMSw4ICsxMSw4IEBACiAgKiBDcm9zcyBQYXJ0aXRpb24gQ29tbXVuaWNhdGlvbiAoWFBDKSBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MuCiAgKi8KIAotI2lmbmRlZiBfSUE2NF9TTl9LRVJORUxfWFBDX0gKLSNkZWZpbmUgX0lBNjRfU05fS0VSTkVMX1hQQ19ICisjaWZuZGVmIF9BU01fSUE2NF9TTl9YUENfSAorI2RlZmluZSBfQVNNX0lBNjRfU05fWFBDX0gKIAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC02NjMsNiArNjYzLDcgQEAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlICp4cGNfcGFydDsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlICp4cGNfY2hhbjsKIGV4dGVybiBpbnQgeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVsaW1pdDsKK2V4dGVybiBpbnQgeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVkb3V0OwogZXh0ZXJuIGlycXJldHVybl90IHhwY19ub3RpZnlfSVJRX2hhbmRsZXIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwogZXh0ZXJuIHZvaWQgeHBjX2Ryb3BwZWRfSVBJX2NoZWNrKHN0cnVjdCB4cGNfcGFydGl0aW9uICopOwogZXh0ZXJuIHZvaWQgeHBjX2FjdGl2YXRlX3BhcnRpdGlvbihzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqKTsKQEAgLTcwNyw3ICs3MDgsNyBAQAogZXh0ZXJuIHZvaWQgeHBjX2RlbGl2ZXJfbXNnKHN0cnVjdCB4cGNfY2hhbm5lbCAqKTsKIGV4dGVybiB2b2lkIHhwY19kaXNjb25uZWN0X2NoYW5uZWwoY29uc3QgaW50LCBzdHJ1Y3QgeHBjX2NoYW5uZWwgKiwKIAkJCQkJZW51bSB4cGNfcmV0dmFsLCB1bnNpZ25lZCBsb25nICopOwotZXh0ZXJuIHZvaWQgeHBjX2Rpc2Nvbm5lY3RpbmdfY2FsbG91dChzdHJ1Y3QgeHBjX2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCB4cGNfZGlzY29ubmVjdF9jYWxsb3V0KHN0cnVjdCB4cGNfY2hhbm5lbCAqLCBlbnVtIHhwY19yZXR2YWwpOwogZXh0ZXJuIHZvaWQgeHBjX3BhcnRpdGlvbl9nb2luZ19kb3duKHN0cnVjdCB4cGNfcGFydGl0aW9uICosIGVudW0geHBjX3JldHZhbCk7CiBleHRlcm4gdm9pZCB4cGNfdGVhcmRvd25faW5mcmFzdHJ1Y3R1cmUoc3RydWN0IHhwY19wYXJ0aXRpb24gKik7CiAKQEAgLTEyNjksNSArMTI3MCw1IEBACiB9CiAKIAotI2VuZGlmIC8qIF9JQTY0X1NOX0tFUk5FTF9YUENfSCAqLworI2VuZGlmIC8qIF9BU01fSUE2NF9TTl9YUENfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1pYTY0L3RocmVhZF9pbmZvLmgKaW5kZXggNjUzYmI3Zi4uMWQ2NTE4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdGhyZWFkX2luZm8uaApAQCAtOTMsNiArOTMsNyBAQAogI2RlZmluZSBUSUZfUE9MTElOR19OUkZMQUcJMTYJLyogdHJ1ZSBpZiBwb2xsX2lkbGUoKSBpcyBwb2xsaW5nIFRJRl9ORUVEX1JFU0NIRUQgKi8KICNkZWZpbmUgVElGX01FTURJRQkJMTcKICNkZWZpbmUgVElGX01DQV9JTklUCQkxOAkvKiB0aGlzIHRhc2sgaXMgcHJvY2Vzc2luZyBNQ0Egb3IgSU5JVCAqLworI2RlZmluZSBUSUZfREJfRElTQUJMRUQJCTE5CS8qIGRlYnVnIHRyYXAgZGlzYWJsZWQgZm9yIGZzeXNjYWxsICovCiAKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxIDw8IFRJRl9TWVNDQUxMX1RSQUNFKQogI2RlZmluZSBfVElGX1NZU0NBTExfQVVESVQJKDEgPDwgVElGX1NZU0NBTExfQVVESVQpCkBAIC0xMDAsOSArMTAxLDEwIEBACiAjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMSA8PCBUSUZfTk9USUZZX1JFU1VNRSkKICNkZWZpbmUgX1RJRl9TSUdQRU5ESU5HCQkoMSA8PCBUSUZfU0lHUEVORElORykKICNkZWZpbmUgX1RJRl9ORUVEX1JFU0NIRUQJKDEgPDwgVElGX05FRURfUkVTQ0hFRCkKLSNkZWZpbmUgX1RJRl9TSUdERUxBWUVECSgxIDw8IFRJRl9TSUdERUxBWUVEKQorI2RlZmluZSBfVElGX1NJR0RFTEFZRUQJCSgxIDw8IFRJRl9TSUdERUxBWUVEKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxIDw8IFRJRl9QT0xMSU5HX05SRkxBRykKICNkZWZpbmUgX1RJRl9NQ0FfSU5JVAkJKDEgPDwgVElGX01DQV9JTklUKQorI2RlZmluZSBfVElGX0RCX0RJU0FCTEVECSgxIDw8IFRJRl9EQl9ESVNBQkxFRCkKIAogLyogIndvcmsgdG8gZG8gb24gdXNlci1yZXR1cm4iIGJpdHMgKi8KICNkZWZpbmUgVElGX0FMTFdPUktfTUFTSwkoX1RJRl9OT1RJRllfUkVTVU1FfF9USUZfU0lHUEVORElOR3xfVElGX05FRURfUkVTQ0hFRHxfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUfF9USUZfU0lHREVMQVlFRCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2F0b21pYy5oCmluZGV4IDI0OGY5YWUuLjE0N2EzOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9hdG9taWMuaApAQCAtMzYsNyArMzYsNyBAQAogCWludCB0OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6CWx3YXJ4CSUwLDAsJTIJCSMgYXRvbWljX2FkZF9yZXR1cm5cblwKIAlhZGQJJTAsJTEsJTBcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMikKQEAgLTcyLDcgKzcyLDcgQEAKIAlpbnQgdDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsd2FyeAklMCwwLCUyCQkjIGF0b21pY19zdWJfcmV0dXJuXG5cCiAJc3ViZgklMCwlMSwlMFxuIgogCVBQQzQwNV9FUlI3NygwLCUyKQpAQCAtMTA2LDcgKzEwNiw3IEBACiAJaW50IHQ7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbHdhcngJJTAsMCwlMQkJIyBhdG9taWNfaW5jX3JldHVyblxuXAogCWFkZGljCSUwLCUwLDFcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMSkKQEAgLTE1MCw3ICsxNTAsNyBAQAogCWludCB0OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6CWx3YXJ4CSUwLDAsJTEJCSMgYXRvbWljX2RlY19yZXR1cm5cblwKIAlhZGRpYwklMCwlMCwtMVxuIgogCVBQQzQwNV9FUlI3NygwLCUxKQpAQCAtMTc2LDE5ICsxNzYsMTkgQEAKICAqIEF0b21pY2FsbHkgYWRkcyBAYSB0byBAdiwgc28gbG9uZyBhcyBpdCB3YXMgbm90IEB1LgogICogUmV0dXJucyBub24temVybyBpZiBAdiB3YXMgbm90IEB1LCBhbmQgemVybyBvdGhlcndpc2UuCiAgKi8KLSNkZWZpbmUgYXRvbWljX2FkZF91bmxlc3ModiwgYSwgdSkJCQkJCQkJIFwKLSh7CQkJCQkJCQkJCQkJCQkJIFwKLQkgICBpbnQgYywgb2xkOwkJCQkJCQkJCQkJIFwKLQkgICBjID0gYXRvbWljX3JlYWQodik7CQkJCQkJCQkJIFwKLQkgICBmb3IgKDs7KSB7CQkJCQkJCQkJCQkgIFwKLQkJCSAgIGlmICh1bmxpa2VseShjID09ICh1KSkpCQkJCQkJIFwKLQkJCQkJICAgYnJlYWs7CQkJCQkJCQkgIFwKLQkJCSAgIG9sZCA9IGF0b21pY19jbXB4Y2hnKCh2KSwgYywgYyArIChhKSk7CQkgIFwKLQkJCSAgIGlmIChsaWtlbHkob2xkID09IGMpKQkJCQkJCSAgIFwKLQkJCQkJICAgYnJlYWs7CQkJCQkJCQkgIFwKLQkJCSAgIGMgPSBvbGQ7CQkJCQkJCQkJCVwKLQkgICB9CQkJCQkJCQkJCQkJCSAgIFwKLQkgICBjICE9ICh1KTsJCQkJCQkJCQkJCSAgIFwKKyNkZWZpbmUgYXRvbWljX2FkZF91bmxlc3ModiwgYSwgdSkJCQlcCisoewkJCQkJCQlcCisJaW50IGMsIG9sZDsJCQkJCVwKKwljID0gYXRvbWljX3JlYWQodik7CQkJCVwKKwlmb3IgKDs7KSB7CQkJCQlcCisJCWlmICh1bmxpa2VseShjID09ICh1KSkpCQkJXAorCQkJYnJlYWs7CQkJCVwKKwkJb2xkID0gYXRvbWljX2NtcHhjaGcoKHYpLCBjLCBjICsgKGEpKTsJXAorCQlpZiAobGlrZWx5KG9sZCA9PSBjKSkJCQlcCisJCQlicmVhazsJCQkJXAorCQljID0gb2xkOwkJCQlcCisJfQkJCQkJCVwKKwljICE9ICh1KTsJCQkJCVwKIH0pCiAjZGVmaW5lIGF0b21pY19pbmNfbm90X3plcm8odikgYXRvbWljX2FkZF91bmxlc3MoKHYpLCAxLCAwKQogCkBAIC0yMDQsNyArMjA0LDcgQEAKIAlpbnQgdDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsd2FyeAklMCwwLCUxCQkjIGF0b21pY19kZWNfaWZfcG9zaXRpdmVcblwKIAlhZGRpYy4JJTAsJTAsLTFcblwKIAlibHQtCTJmXG4iCkBAIC0yNTMsNyArMjUzLDcgQEAKIAlsb25nIHQ7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbGRhcngJJTAsMCwlMgkJIyBhdG9taWM2NF9hZGRfcmV0dXJuXG5cCiAJYWRkCSUwLCUxLCUwXG5cCiAJc3RkY3guCSUwLDAsJTIgXG5cCkBAIC0yODcsNyArMjg3LDcgQEAKIAlsb25nIHQ7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbGRhcngJJTAsMCwlMgkJIyBhdG9taWM2NF9zdWJfcmV0dXJuXG5cCiAJc3ViZgklMCwlMSwlMFxuXAogCXN0ZGN4LgklMCwwLCUyIFxuXApAQCAtMzE5LDcgKzMxOSw3IEBACiAJbG9uZyB0OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6CWxkYXJ4CSUwLDAsJTEJCSMgYXRvbWljNjRfaW5jX3JldHVyblxuXAogCWFkZGljCSUwLCUwLDFcblwKIAlzdGRjeC4JJTAsMCwlMSBcblwKQEAgLTM2MSw3ICszNjEsNyBAQAogCWxvbmcgdDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsZGFyeAklMCwwLCUxCQkjIGF0b21pYzY0X2RlY19yZXR1cm5cblwKIAlhZGRpYwklMCwlMCwtMVxuXAogCXN0ZGN4LgklMCwwLCUxXG5cCkBAIC0zODYsNyArMzg2LDcgQEAKIAlsb25nIHQ7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbGRhcngJJTAsMCwlMQkJIyBhdG9taWM2NF9kZWNfaWZfcG9zaXRpdmVcblwKIAlhZGRpYy4JJTAsJTAsLTFcblwKIAlibHQtCTJmXG5cCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2JpdG9wcy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9iaXRvcHMuaAppbmRleCAxOTk2ZWFhLi5iZjY5NDFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2JpdG9wcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYml0b3BzLmgKQEAgLTExMiw3ICsxMTIsNyBAQAogCXVuc2lnbmVkIGxvbmcgKnAgPSAoKHVuc2lnbmVkIGxvbmcgKilhZGRyKSArIEJJVE9QX1dPUkQobnIpOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6IglQUENfTExBUlggIiUwLDAsJTMJCSMgdGVzdF9hbmRfc2V0X2JpdFxuIgogCSJvcgklMSwlMCwlMiBcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMykKQEAgLTEzNCw3ICsxMzQsNyBAQAogCXVuc2lnbmVkIGxvbmcgKnAgPSAoKHVuc2lnbmVkIGxvbmcgKilhZGRyKSArIEJJVE9QX1dPUkQobnIpOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6IglQUENfTExBUlggIiUwLDAsJTMJCSMgdGVzdF9hbmRfY2xlYXJfYml0XG4iCiAJImFuZGMJJTEsJTAsJTIgXG4iCiAJUFBDNDA1X0VSUjc3KDAsJTMpCkBAIC0xNTYsNyArMTU2LDcgQEAKIAl1bnNpZ25lZCBsb25nICpwID0gKCh1bnNpZ25lZCBsb25nICopYWRkcikgKyBCSVRPUF9XT1JEKG5yKTsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOiIJUFBDX0xMQVJYICIlMCwwLCUzCQkjIHRlc3RfYW5kX2NoYW5nZV9iaXRcbiIKIAkieG9yCSUxLCUwLCUyIFxuIgogCVBQQzQwNV9FUlI3NygwLCUzKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCmluZGV4IGVmNmVhZDMuLjY0MjEwNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgUFBDX0ZFQVRVUkVfUE9XRVI1CQkweDAwMDQwMDAwCiAjZGVmaW5lIFBQQ19GRUFUVVJFX1BPV0VSNV9QTFVTCQkweDAwMDIwMDAwCiAjZGVmaW5lIFBQQ19GRUFUVVJFX0NFTEwJCTB4MDAwMTAwMDAKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfQk9PS0UJCTB4MDAwMDgwMDAKIAogI2lmZGVmIF9fS0VSTkVMX18KICNpZm5kZWYgX19BU1NFTUJMWV9fCkBAIC0zMSwxMSArMzIsMTEgQEAKIHR5cGVkZWYJdm9pZCAoKmNwdV9zZXR1cF90KSh1bnNpZ25lZCBsb25nIG9mZnNldCwgc3RydWN0IGNwdV9zcGVjKiBzcGVjKTsKIAogZW51bSBwb3dlcnBjX29wcm9maWxlX3R5cGUgewotCUlOVkFMSUQgPSAwLAotCVJTNjQgPSAxLAotCVBPV0VSNCA9IDIsCi0JRzQgPSAzLAotCUJPT0tFID0gNCwKKwlQUENfT1BST0ZJTEVfSU5WQUxJRCA9IDAsCisJUFBDX09QUk9GSUxFX1JTNjQgPSAxLAorCVBQQ19PUFJPRklMRV9QT1dFUjQgPSAyLAorCVBQQ19PUFJPRklMRV9HNCA9IDMsCisJUFBDX09QUk9GSUxFX0JPT0tFID0gNCwKIH07CiAKIHN0cnVjdCBjcHVfc3BlYyB7CkBAIC02NCw2ICs2NSw5IEBACiAKIAkvKiBQcm9jZXNzb3Igc3BlY2lmaWMgb3Byb2ZpbGUgb3BlcmF0aW9ucyAqLwogCWVudW0gcG93ZXJwY19vcHJvZmlsZV90eXBlIG9wcm9maWxlX3R5cGU7CisKKwkvKiBOYW1lIG9mIHByb2Nlc3NvciBjbGFzcywgZm9yIHRoZSBFTEYgQVRfUExBVEZPUk0gZW50cnkgKi8KKwljaGFyCQkqcGxhdGZvcm07CiB9OwogCiBleHRlcm4gc3RydWN0IGNwdV9zcGVjCQkqY3VyX2NwdV9zcGVjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9lbGYuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZWxmLmgKaW5kZXggNDVmMmFmNi4uOTRkMjI4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2VsZi5oCkBAIC0yMjEsMjEgKzIyMSwxOSBAQAogICAgaW5zdHJ1Y3Rpb24gc2V0IHRoaXMgY3B1IHN1cHBvcnRzLiAgVGhpcyBjb3VsZCBiZSBkb25lIGluIHVzZXJzcGFjZSwKICAgIGJ1dCBpdCdzIG5vdCBlYXN5LCBhbmQgd2UndmUgYWxyZWFkeSBkb25lIGl0IGhlcmUuICAqLwogIyBkZWZpbmUgRUxGX0hXQ0FQCShjdXJfY3B1X3NwZWMtPmNwdV91c2VyX2ZlYXR1cmVzKQorCisvKiBUaGlzIHlpZWxkcyBhIHN0cmluZyB0aGF0IGxkLnNvIHdpbGwgdXNlIHRvIGxvYWQgaW1wbGVtZW50YXRpb24KKyAgIHNwZWNpZmljIGxpYnJhcmllcyBmb3Igb3B0aW1pemF0aW9uLiAgVGhpcyBpcyBtb3JlIHNwZWNpZmljIGluCisgICBpbnRlbnQgdGhhbiBwb2tpbmcgYXQgdW5hbWUgb3IgL3Byb2MvY3B1aW5mby4gICovCisKKyNkZWZpbmUgRUxGX1BMQVRGT1JNCShjdXJfY3B1X3NwZWMtPnBsYXRmb3JtKQorCiAjaWZkZWYgX19wb3dlcnBjNjRfXwogIyBkZWZpbmUgRUxGX1BMQVRfSU5JVChfciwgbG9hZF9hZGRyKQlkbyB7CVwKIAlfci0+Z3ByWzJdID0gbG9hZF9hZGRyOyAJCVwKIH0gd2hpbGUgKDApCiAjZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLwogCi0vKiBUaGlzIHlpZWxkcyBhIHN0cmluZyB0aGF0IGxkLnNvIHdpbGwgdXNlIHRvIGxvYWQgaW1wbGVtZW50YXRpb24KLSAgIHNwZWNpZmljIGxpYnJhcmllcyBmb3Igb3B0aW1pemF0aW9uLiAgVGhpcyBpcyBtb3JlIHNwZWNpZmljIGluCi0gICBpbnRlbnQgdGhhbiBwb2tpbmcgYXQgdW5hbWUgb3IgL3Byb2MvY3B1aW5mby4KLQotICAgRm9yIHRoZSBtb21lbnQsIHdlIGhhdmUgb25seSBvcHRpbWl6YXRpb25zIGZvciB0aGUgSW50ZWwgZ2VuZXJhdGlvbnMsCi0gICBidXQgdGhhdCBjb3VsZCBjaGFuZ2UuLi4gKi8KLQotI2RlZmluZSBFTEZfUExBVEZPUk0JKE5VTEwpCi0KICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpZmRlZiBfX3Bvd2VycGM2NF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Z1dGV4LmgKaW5kZXggZjAzMTlkNS4uMzllODVmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9mdXRleC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZnV0ZXguaApAQCAtMTEsNyArMTEsNyBAQAogCiAjZGVmaW5lIF9fZnV0ZXhfYXRvbWljX29wKGluc24sIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpIFwKICAgX19hc21fXyBfX3ZvbGF0aWxlICggXAotCVNZTkNfT05fU01QIFwKKwlMV1NZTkNfT05fU01QIFwKICIxOglsd2FyeAklMCwwLCUyXG4iIFwKIAlpbnNuIFwKIAlQUEM0MDVfRVJSNzcoMCwgJTIpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjYWxsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oCmluZGV4IGRhN2FmNWEuLjM4Y2E5YWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjYWxsLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNhbGwuaApAQCAtNiw3ICs2LDEwIEBACiAKICNkZWZpbmUgSF9TdWNjZXNzCTAKICNkZWZpbmUgSF9CdXN5CQkxCS8qIEhhcmR3YXJlIGJ1c3kgLS0gcmV0cnkgbGF0ZXIgKi8KKyNkZWZpbmUgSF9DbG9zZWQJMgkvKiBSZXNvdXJjZSBjbG9zZWQgKi8KICNkZWZpbmUgSF9Db25zdHJhaW5lZAk0CS8qIFJlc291cmNlIHJlcXVlc3QgY29uc3RyYWluZWQgdG8gbWF4IGFsbG93ZWQgKi8KKyNkZWZpbmUgSF9JblByb2dyZXNzICAgMTQJLyogS2luZCBvZiBsaWtlIGJ1c3kgKi8KKyNkZWZpbmUgSF9Db250aW51ZSAgICAgMTgJLyogUmV0dXJuZWQgZnJvbSBIX0pvaW4gb24gc3VjY2VzcyAqLwogI2RlZmluZSBIX0xvbmdCdXN5U3RhcnRSYW5nZSAgIDk5MDAgIC8qIFN0YXJ0IG9mIGxvbmcgYnVzeSByYW5nZSAqLwogI2RlZmluZSBIX0xvbmdCdXN5T3JkZXIxbXNlYyAgIDk5MDAgIC8qIExvbmcgYnVzeSwgaGludCB0aGF0IDFtc2VjIGlzIGEgZ29vZCB0aW1lIHRvIHJldHJ5ICovCiAjZGVmaW5lIEhfTG9uZ0J1c3lPcmRlcjEwbXNlYyAgOTkwMSAgLyogTG9uZyBidXN5LCBoaW50IHRoYXQgMTBtc2VjIGlzIGEgZ29vZCB0aW1lIHRvIHJldHJ5ICovCkBAIC0xMTQsNiArMTE3LDggQEAKICNkZWZpbmUgSF9SRUdJU1RFUl9WVEVSTQkweDE1NAogI2RlZmluZSBIX0ZSRUVfVlRFUk0JCTB4MTU4CiAjZGVmaW5lIEhfUE9MTF9QRU5ESU5HCSAgICAgICAgMHgxRDgKKyNkZWZpbmUgSF9KT0lOCQkJMHgyOTgKKyNkZWZpbmUgSF9FTkFCTEVfQ1JRCQkweDJCMAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2xwcGFjYS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9scHBhY2EuaAppbmRleCBmZjgyZWE3Li5jZDlmMTFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2xwcGFjYS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbHBwYWNhLmgKQEAgLTI5LDcgKzI5LDkgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCi1zdHJ1Y3QgbHBwYWNhIHsKKy8qIFRoZSBIeXBlcnZpc29yIGJhcmZzIGlmIHRoZSBscHBhY2EgY3Jvc3NlcyBhIHBhZ2UgYm91bmRhcnkuICBBIDFrCisgKiBhbGlnbm1lbnQgaXMgc3VmZmljaWVudCB0byBwcmV2ZW50IHRoaXMgKi8KK3N0cnVjdCBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygweDQwMCkpKSBscHBhY2EgewogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gQ0FDSEVfTElORV8xIDB4MDAwMCAtIDB4MDA3RiBDb250YWlucyByZWFkLW9ubHkgZGF0YQogLy8gTk9URTogVGhlIHhEeW5YeXogZmllbGRzIGFyZSBmaWVsZHMgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5IGNoYW5nZWQgYnkKQEAgLTEyOSw1ICsxMzEsNyBAQAogCXU4CXBtY19zYXZlX2FyZWFbMjU2XTsJLy8gUE1DIGludGVycnVwdCBBcmVhICAgICAgICAgICB4MDAteEZGCiB9OwogCitleHRlcm4gc3RydWN0IGxwcGFjYSBscHBhY2FbXTsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfTFBQQUNBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFjYS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmgKaW5kZXggYTY0YjRkNC4uYzlhZGQ4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmgKQEAgLTIzLDYgKzIzLDcgQEAKIAogcmVnaXN0ZXIgc3RydWN0IHBhY2Ffc3RydWN0ICpsb2NhbF9wYWNhIGFzbSgicjEzIik7CiAjZGVmaW5lIGdldF9wYWNhKCkJbG9jYWxfcGFjYQorI2RlZmluZSBnZXRfbHBwYWNhKCkJKGdldF9wYWNhKCktPmxwcGFjYV9wdHIpCiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIApAQCAtOTUsMTkgKzk2LDYgQEAKIAl1NjQgc2F2ZWRfcjE7CQkJLyogcjEgc2F2ZSBmb3IgUlRBUyBjYWxscyAqLwogCXU2NCBzYXZlZF9tc3I7CQkJLyogTVNSIHNhdmVkIGhlcmUgYnkgZW50ZXJfcnRhcyAqLwogCXU4IHByb2NfZW5hYmxlZDsJCS8qIGlycSBzb2Z0LWVuYWJsZSBmbGFnICovCi0KLQkvKgotCSAqIGlTZXJpZXMgc3RydWN0dXJlIHdoaWNoIHRoZSBoeXBlcnZpc29yIGtub3dzIGFib3V0IC0KLQkgKiB0aGlzIHN0cnVjdHVyZSBzaG91bGQgbm90IGNyb3NzIGEgcGFnZSBib3VuZGFyeS4KLQkgKiBUaGUgdnBhX2luaXQvcmVnaXN0ZXJfdnBhIGNhbGwgaXMgbm93IGtub3duIHRvIGZhaWwgaWYgdGhlCi0JICogbHBwYWNhIHN0cnVjdHVyZSBjcm9zc2VzIGEgcGFnZSBib3VuZGFyeS4KLQkgKiBUaGUgbHBwYWNhIGlzIGFsc28gdXNlZCBvbiBQT1dFUjUgcFNlcmllcyBib3hlcy4KLQkgKiBUaGUgbHBwYWNhIGlzIDY0MCBieXRlcyBsb25nLCBhbmQgY2Fubm90IHJlYWRpbHkgY2hhbmdlCi0JICogc2luY2UgdGhlIGh5cGVydmlzb3Iga25vd3MgaXRzIGxheW91dCwgc28gYSAxa0IKLQkgKiBhbGlnbm1lbnQgd2lsbCBzdWZmaWNlIHRvIGVuc3VyZSB0aGF0IGl0IGRvZXNuJ3QKLQkgKiBjcm9zcyBhIHBhZ2UgYm91bmRhcnkuCi0JICovCi0Jc3RydWN0IGxwcGFjYSBscHBhY2EgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oMHg0MDApKSk7CiB9OwogCiBleHRlcm4gc3RydWN0IHBhY2Ffc3RydWN0IHBhY2FbXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHBjX2FzbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGNfYXNtLmgKaW5kZXggMGRjNzk4ZC4uYWI4Njg4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGNfYXNtLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGNfYXNtLmgKQEAgLTE1Niw1MiArMTU2LDU2IEBACiAjZW5kaWYKIAogLyogCi0gKiBMT0FEQUREUiggcm4sIG5hbWUgKQotICogICBsb2FkcyB0aGUgYWRkcmVzcyBvZiAnbmFtZScgaW50byAncm4nCisgKiBMT0FEX1JFR19JTU1FRElBVEUocm4sIGV4cHIpCisgKiAgIExvYWRzIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgZXhwcmVzc2lvbiAnZXhwcicgaW50byByZWdpc3RlciAncm4nCisgKiAgIHVzaW5nIGltbWVkaWF0ZSBpbnN0cnVjdGlvbnMgb25seS4gIFVzZSB0aGlzIHdoZW4gaXQncyBpbXBvcnRhbnQgbm90CisgKiAgIHRvIHJlZmVyZW5jZSBvdGhlciBkYXRhIChpLmUuIG9uIHBwYzY0IHdoZW4gdGhlIFRPQyBwb2ludGVyIGlzIG5vdAorICogICB2YWxpZCkuCiAgKgotICogTE9BREJBU0UoIHJuLCBuYW1lICkKLSAqICAgbG9hZHMgdGhlIGFkZHJlc3MgKHBvc3NpYmx5IHdpdGhvdXQgdGhlIGxvdyAxNiBiaXRzKSBvZiAnbmFtZScgaW50byAncm4nCi0gKiAgIHN1aXRhYmxlIGZvciBiYXNlK2Rpc3AgYWRkcmVzc2luZworICogTE9BRF9SRUdfQUREUihybiwgbmFtZSkKKyAqICAgTG9hZHMgdGhlIGFkZHJlc3Mgb2YgbGFiZWwgJ25hbWUnIGludG8gcmVnaXN0ZXIgJ3JuJy4gIFVzZSB0aGlzIHdoZW4KKyAqICAgeW91IGRvbid0IHBhcnRpY3VsYXJseSBuZWVkIGltbWVkaWF0ZSBpbnN0cnVjdGlvbnMgb25seSwgYnV0IHlvdSBuZWVkCisgKiAgIHRoZSB3aG9sZSBhZGRyZXNzIGluIG9uZSByZWdpc3RlciAoZS5nLiBpdCdzIGEgc3RydWN0dXJlIGFkZHJlc3MgYW5kCisgKiAgIHlvdSB3YW50IHRvIGFjY2VzcyB2YXJpb3VzIG9mZnNldHMgd2l0aGluIGl0KS4gIE9uIHBwYzMyIHRoaXMgaXMKKyAqICAgaWRlbnRpY2FsIHRvIExPQURfUkVHX0lNTUVESUFURS4KKyAqCisgKiBMT0FEX1JFR19BRERSQkFTRShybiwgbmFtZSkKKyAqIEFERFJPRkYobmFtZSkKKyAqICAgTE9BRF9SRUdfQUREUkJBU0UgbG9hZHMgcGFydCBvZiB0aGUgYWRkcmVzcyBvZiBsYWJlbCAnbmFtZScgaW50bworICogICByZWdpc3RlciAncm4nLiAgQUREUk9GRihuYW1lKSByZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgdGhlIGFkZHJlc3MgYXMKKyAqICAgYSBjb25zdGFudCBleHByZXNzaW9uLiAgQUREUk9GRihuYW1lKSBpcyBhIHNpZ25lZCBleHByZXNzaW9uIDwgMTYgYml0cworICogICBpbiBzaXplLCBzbyBpcyBzdWl0YWJsZSBmb3IgdXNlIGRpcmVjdGx5IGFzIGFuIG9mZnNldCBpbiBsb2FkIGFuZCBzdG9yZQorICogICBpbnN0cnVjdGlvbnMuICBVc2UgdGhpcyB3aGVuIGxvYWRpbmcvc3RvcmluZyBhIHNpbmdsZSB3b3JkIG9yIGxlc3MgYXM6CisgKiAgICAgIExPQURfUkVHX0FERFJCQVNFKHJYLCBuYW1lKQorICogICAgICBsZAlyWSxBRERST0ZGKG5hbWUpKHJYKQogICovCiAjaWZkZWYgX19wb3dlcnBjNjRfXwotI2RlZmluZSBMT0FEQUREUihybixuYW1lKSBcCi0JbGlzCXJuLG5hbWUjI0BoaWdoZXN0OwlcCi0Jb3JpCXJuLHJuLG5hbWUjI0BoaWdoZXI7CVwKLQlybGRpY3IJcm4scm4sMzIsMzE7CQlcCi0Jb3JpcwlybixybixuYW1lIyNAaDsJCVwKLQlvcmkJcm4scm4sbmFtZSMjQGwKKyNkZWZpbmUgTE9BRF9SRUdfSU1NRURJQVRFKHJlZyxleHByKQkJXAorCWxpcyAgICAgKHJlZyksKGV4cHIpQGhpZ2hlc3Q7CQlcCisJb3JpICAgICAocmVnKSwocmVnKSwoZXhwcilAaGlnaGVyOwlcCisJcmxkaWNyICAocmVnKSwocmVnKSwzMiwzMTsJCVwKKwlvcmlzICAgIChyZWcpLChyZWcpLChleHByKUBoOwkJXAorCW9yaSAgICAgKHJlZyksKHJlZyksKGV4cHIpQGw7CiAKLSNkZWZpbmUgTE9BREJBU0Uocm4sbmFtZSkJCVwKLQlsZAlybixuYW1lQGdvdChyMikKKyNkZWZpbmUgTE9BRF9SRUdfQUREUihyZWcsbmFtZSkJCQlcCisJbGQJKHJlZyksbmFtZUBnb3QocjIpCiAKLSNkZWZpbmUgT0ZGKG5hbWUpCTAKLQotI2RlZmluZSBTRVRfUkVHX1RPX0NPTlNUKHJlZywgdmFsdWUpCSAgICAgICAgIAlcCi0JbGlzICAgICByZWcsKCgodmFsdWUpPj40OCkmMHhGRkZGKTsgICAgICAgICAgICAgXAotCW9yaSAgICAgcmVnLHJlZywoKCh2YWx1ZSk+PjMyKSYweEZGRkYpOyAgICAgICAgIFwKLQlybGRpY3IgIHJlZyxyZWcsMzIsMzE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jb3JpcyAgICByZWcscmVnLCgoKHZhbHVlKT4+MTYpJjB4RkZGRik7ICAgICAgICAgXAotCW9yaSAgICAgcmVnLHJlZywoKHZhbHVlKSYweEZGRkYpOwotCi0jZGVmaW5lIFNFVF9SRUdfVE9fTEFCRUwocmVnLCBsYWJlbCkJICAgICAgICAgCVwKLQlsaXMgICAgIHJlZywobGFiZWwpQGhpZ2hlc3Q7ICAgICAgICAgICAgICAgICAgICBcCi0Jb3JpICAgICByZWcscmVnLChsYWJlbClAaGlnaGVyOyAgICAgICAgICAgICAgICAgXAotCXJsZGljciAgcmVnLHJlZywzMiwzMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlvcmlzICAgIHJlZyxyZWcsKGxhYmVsKUBoOyAgICAgICAgICAgICAgICAgICAgICBcCi0Jb3JpICAgICByZWcscmVnLChsYWJlbClAbDsKKyNkZWZpbmUgTE9BRF9SRUdfQUREUkJBU0UocmVnLG5hbWUpCUxPQURfUkVHX0FERFIocmVnLG5hbWUpCisjZGVmaW5lIEFERFJPRkYobmFtZSkJCQkwCiAKIC8qIG9mZnNldHMgZm9yIHN0YWNrIGZyYW1lIGxheW91dCAqLwogI2RlZmluZSBMUlNBVkUJMTYKIAogI2Vsc2UgLyogMzItYml0ICovCi0jZGVmaW5lIExPQURBRERSKHJuLG5hbWUpIFwKLQlsaXMJcm4sbmFtZUBoYTsJXAotCWFkZGkJcm4scm4sbmFtZUBsCiAKLSNkZWZpbmUgTE9BREJBU0Uocm4sbmFtZSkJXAotCWxpcwlybixuYW1lQGhhCisjZGVmaW5lIExPQURfUkVHX0lNTUVESUFURShyZWcsZXhwcikJCVwKKwlsaXMJKHJlZyksKGV4cHIpQGhhOwkJXAorCWFkZGkJKHJlZyksKHJlZyksKGV4cHIpQGw7CiAKLSNkZWZpbmUgT0ZGKG5hbWUpCW5hbWVAbAorI2RlZmluZSBMT0FEX1JFR19BRERSKHJlZyxuYW1lKQkJTE9BRF9SRUdfSU1NRURJQVRFKHJlZywgbmFtZSkKKworI2RlZmluZSBMT0FEX1JFR19BRERSQkFTRShyZWcsIG5hbWUpCWxpcwkocmVnKSxuYW1lQGhhCisjZGVmaW5lIEFERFJPRkYobmFtZSkJCQluYW1lQGwKIAogLyogb2Zmc2V0cyBmb3Igc3RhY2sgZnJhbWUgbGF5b3V0ICovCiAjZGVmaW5lIExSU0FWRQk0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb20uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oCmluZGV4IDMyOWU5YmYuLjViMmJkNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oCkBAIC04Nyw2ICs4Nyw3IEBACiAJY2hhcgkqZnVsbF9uYW1lOwogCiAJc3RydWN0CXByb3BlcnR5ICpwcm9wZXJ0aWVzOworCXN0cnVjdCAgcHJvcGVydHkgKmRlYWRwcm9wczsgLyogcmVtb3ZlZCBwcm9wZXJ0aWVzICovCiAJc3RydWN0CWRldmljZV9ub2RlICpwYXJlbnQ7CiAJc3RydWN0CWRldmljZV9ub2RlICpjaGlsZDsKIAlzdHJ1Y3QJZGV2aWNlX25vZGUgKnNpYmxpbmc7CkBAIC0xMzUsNiArMTM2LDkgQEAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9wYXJlbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9uZXh0X2NoaWxkKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKIAkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpOworZXh0ZXJuIHN0cnVjdCBwcm9wZXJ0eSAqb2ZfZmluZF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJIGludCAqbGVucCk7CiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlX2dldChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOwogZXh0ZXJuIHZvaWQgb2Zfbm9kZV9wdXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKIApAQCAtMTY0LDYgKzE2OCwxMCBAQAogZXh0ZXJuIGludCBwcm9tX25faW50cl9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUqIG5wKTsKIGV4dGVybiB2b2lkIHByb21fZ2V0X2lycV9zZW5zZXModW5zaWduZWQgY2hhciAqc2Vuc2VzLCBpbnQgb2ZmLCBpbnQgbWF4KTsKIGV4dGVybiBpbnQgcHJvbV9hZGRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlKiBucCwgc3RydWN0IHByb3BlcnR5KiBwcm9wKTsKK2V4dGVybiBpbnQgcHJvbV9yZW1vdmVfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IHByb3BlcnR5ICpwcm9wKTsKK2V4dGVybiBpbnQgcHJvbV91cGRhdGVfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQlzdHJ1Y3QgcHJvcGVydHkgKm5ld3Byb3AsCisJCQkJc3RydWN0IHByb3BlcnR5ICpvbGRwcm9wKTsKIAogI2lmZGVmIENPTkZJR19QUEMzMgogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3BpbmxvY2suaAppbmRleCA3NTQ5MDA5Li44OTVjYjZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcGlubG9jay5oCkBAIC00Niw3ICs0Niw3IEBACiAKIAl0b2tlbiA9IExPQ0tfVE9LRU47CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iMToJbHdhcngJCSUwLDAsJTIJCSMgX19zcGluX3RyeWxvY2tcblwKKyIxOglsd2FyeAkJJTAsMCwlMlxuXAogCWNtcHdpCQkwLCUwLDBcblwKIAlibmUtCQkyZlxuXAogCXN0d2N4LgkJJTEsMCwlMlxuXApAQCAtODAsNyArODAsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDX1NQTFBBUikgfHwgZGVmaW5lZChDT05GSUdfUFBDX0lTRVJJRVMpCiAvKiBXZSBvbmx5IHlpZWxkIHRvIHRoZSBoeXBlcnZpc29yIGlmIHdlIGFyZSBpbiBzaGFyZWQgcHJvY2Vzc29yIG1vZGUgKi8KLSNkZWZpbmUgU0hBUkVEX1BST0NFU1NPUiAoZ2V0X3BhY2EoKS0+bHBwYWNhLnNoYXJlZF9wcm9jKQorI2RlZmluZSBTSEFSRURfUFJPQ0VTU09SIChnZXRfbHBwYWNhKCktPnNoYXJlZF9wcm9jKQogZXh0ZXJuIHZvaWQgX19zcGluX3lpZWxkKHJhd19zcGlubG9ja190ICpsb2NrKTsKIGV4dGVybiB2b2lkIF9fcndfeWllbGQocmF3X3J3bG9ja190ICpsb2NrKTsKICNlbHNlIC8qIFNQTFBBUiB8fCBJU0VSSUVTICovCkBAIC0xMjQsOCArMTI0LDggQEAKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyhTWU5DX09OX1NNUCIJIyBfX3Jhd19zcGluX3VubG9jayIKLQkJCSAgICAgOiA6IDoibWVtb3J5Iik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIiMgX19yYXdfc3Bpbl91bmxvY2tcblx0IgorCQkJCUxXU1lOQ19PTl9TTVA6IDogOiJtZW1vcnkiKTsKIAlsb2NrLT5zbG9jayA9IDA7CiB9CiAKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCWxvbmcgdG1wOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iMToJbHdhcngJCSUwLDAsJTEJCSMgcmVhZF90cnlsb2NrXG4iCisiMToJbHdhcngJCSUwLDAsJTFcbiIKIAlfX0RPX1NJR05fRVhURU5ECiAiCWFkZGljLgkJJTAsJTAsMVxuXAogCWJsZS0JCTJmXG4iCkBAIC0xOTIsNyArMTkyLDcgQEAKIAogCXRva2VuID0gV1JMT0NLX1RPS0VOOwogCV9fYXNtX18gX192b2xhdGlsZV9fKAotIjE6CWx3YXJ4CQklMCwwLCUyCSMgd3JpdGVfdHJ5bG9ja1xuXAorIjE6CWx3YXJ4CQklMCwwLCUyXG5cCiAJY21wd2kJCTAsJTAsMFxuXAogCWJuZS0JCTJmXG4iCiAJUFBDNDA1X0VSUjc3KDAsJTEpCkBAIC0yNDksOCArMjQ5LDkgQEAKIAlsb25nIHRtcDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSJlaWVpbwkJCQkjIHJlYWRfdW5sb2NrXG5cCi0xOglsd2FyeAkJJTAsMCwlMVxuXAorCSIjIHJlYWRfdW5sb2NrXG5cdCIKKwlMV1NZTkNfT05fU01QCisiMToJbHdhcngJCSUwLDAsJTFcblwKIAlhZGRpYwkJJTAsJTAsLTFcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMSkKICIJc3R3Y3guCQklMCwwLCUxXG5cCkBAIC0yNjIsOCArMjYzLDggQEAKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpydykKIHsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyhTWU5DX09OX1NNUCIJIyB3cml0ZV91bmxvY2siCi0JCQkgICAgIDogOiA6Im1lbW9yeSIpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCIjIHdyaXRlX3VubG9ja1xuXHQiCisJCQkJTFdTWU5DX09OX1NNUDogOiA6Im1lbW9yeSIpOwogCXJ3LT5sb2NrID0gMDsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeW5jaC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zeW5jaC5oCmluZGV4IDc5NDg3MGEuLmM5MGQ5ZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3luY2guaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5bmNoLmgKQEAgLTIsNiArMiw4IEBACiAjZGVmaW5lIF9BU01fUE9XRVJQQ19TWU5DSF9IIAogI2lmZGVmIF9fS0VSTkVMX18KIAorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorCiAjaWZkZWYgX19wb3dlcnBjNjRfXwogI2RlZmluZSBfX1NVQkFSQ0hfSEFTX0xXU1lOQwogI2VuZGlmCkBAIC0xMiwyMCArMTQsMTIgQEAKICMgICAgZGVmaW5lIExXU1lOQwlzeW5jCiAjZW5kaWYKIAotCi0vKgotICogQXJndWFibHkgdGhlIGJpdG9wcyBhbmQgKnhjaGcgb3BlcmF0aW9ucyBkb24ndCBpbXBseSBhbnkgbWVtb3J5IGJhcnJpZXIKLSAqIG9yIFNNUCBvcmRlcmluZywgYnV0IGluIGZhY3QgYSBsb3Qgb2YgZHJpdmVycyBleHBlY3QgdGhlbSB0byBpbXBseQotICogYm90aCwgc2luY2UgdGhleSBkbyBvbiB4ODYgY3B1cy4KLSAqLwogI2lmZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgRUlFSU9fT05fU01QCSJlaWVpb1xuIgogI2RlZmluZSBJU1lOQ19PTl9TTVAJIlxuXHRpc3luYyIKLSNkZWZpbmUgU1lOQ19PTl9TTVAJX19zdHJpbmdpZnkoTFdTWU5DKSAiXG4iCisjZGVmaW5lIExXU1lOQ19PTl9TTVAJX19zdHJpbmdpZnkoTFdTWU5DKSAiXG4iCiAjZWxzZQotI2RlZmluZSBFSUVJT19PTl9TTVAKICNkZWZpbmUgSVNZTkNfT05fU01QCi0jZGVmaW5lIFNZTkNfT05fU01QCisjZGVmaW5lIExXU1lOQ19PTl9TTVAKICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHZvaWQgZWllaW8odm9pZCkKQEAgLTM4LDE0ICszMiw1IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpc3luYyIgOiA6IDogIm1lbW9yeSIpOwogfQogCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBlaWVpb19vbl9zbXAoKQllaWVpbygpCi0jZGVmaW5lIGlzeW5jX29uX3NtcCgpCWlzeW5jKCkKLSNlbHNlCi0jZGVmaW5lIGVpZWlvX29uX3NtcCgpCV9fYXNtX18gX192b2xhdGlsZV9fKCIiOiA6IDoibWVtb3J5IikKLSNkZWZpbmUgaXN5bmNfb25fc21wKCkJX19hc21fXyBfX3ZvbGF0aWxlX18oIiI6IDogOiJtZW1vcnkiKQotI2VuZGlmCi0KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1NZTkNIX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmgKaW5kZXggOWI4MjJhZi4uZDliZjUzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oCkBAIC0yMTIsNyArMjEyLDcgQEAKIAl1bnNpZ25lZCBsb25nIHByZXY7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbHdhcngJJTAsMCwlMiBcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMikKICIJc3R3Y3guCSUzLDAsJTIgXG5cCkBAIC0yMzIsNyArMjMyLDcgQEAKIAl1bnNpZ25lZCBsb25nIHByZXY7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbGRhcngJJTAsMCwlMiBcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMikKICIJc3RkY3guCSUzLDAsJTIgXG5cCkBAIC0yODcsNyArMjg3LDcgQEAKIAl1bnNpZ25lZCBpbnQgcHJldjsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbHdhcngJJTAsMCwlMgkJIyBfX2NtcHhjaGdfdTMyXG5cCiAJY21wdwkwLCUwLCUzXG5cCiAJYm5lLQkyZlxuIgpAQCAtMzExLDcgKzMxMSw3IEBACiAJdW5zaWduZWQgbG9uZyBwcmV2OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsZGFyeAklMCwwLCUyCQkjIF9fY21weGNoZ191NjRcblwKIAljbXBkCTAsJTAsJTNcblwKIAlibmUtCTJmXG5cCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oCmluZGV4IGQ5Yjg2YTEuLmJhZGRjOWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oCkBAIC0xNzUsMTEgKzE3NSwxMCBAQAogCXNldF9kZWNfY3B1Nih2YWwpOwogI2Vsc2UKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhID0gZ2V0X3BhY2EoKTsKIAlpbnQgY3VyX2RlYzsKIAotCWlmIChscGFjYS0+bHBwYWNhLnNoYXJlZF9wcm9jKSB7Ci0JCWxwYWNhLT5scHBhY2EudmlydHVhbF9kZWNyID0gdmFsOworCWlmIChnZXRfbHBwYWNhKCktPnNoYXJlZF9wcm9jKSB7CisJCWdldF9scHBhY2EoKS0+dmlydHVhbF9kZWNyID0gdmFsOwogCQljdXJfZGVjID0gZ2V0X2RlYygpOwogCQlpZiAoY3VyX2RlYyA+IHZhbCkKIAkJCUh2Q2FsbF9zZXRWaXJ0dWFsRGVjcigpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zMzkwX3JkZXYuaCBiL2luY2x1ZGUvYXNtLXMzOTAvczM5MF9yZGV2LmgKaW5kZXggM2FkNzhmMi4uNmZhMjA0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9zMzkwX3JkZXYuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3MzOTBfcmRldi5oCkBAIC0yLDcgKzIsNyBAQAogICogIGluY2x1ZGUvYXNtLXMzOTAvY2N3ZGV2LmgKICAqCiAgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgPGNvaHVja0BkZS5pYm0uY29tPgorICogICAgQXV0aG9yKHMpOiBDb3JuZWxpYSBIdWNrIDxjb3JuZWxpYS5odWNrQGRlLmlibS5jb20+CiAgKiAgICAgICAgICAgICAgIENhcnN0ZW4gT3R0ZSAgPGNvdHRlQGRlLmlibS5jb20+CiAgKgogICogIEludGVyZmFjZSBmb3IgczM5MCByb290IGRldmljZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zaWdjb250ZXh0LmggYi9pbmNsdWRlL2FzbS1zMzkwL3NpZ2NvbnRleHQuaAppbmRleCA4MDM1NDUzLi5hZWI2ZTBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3NpZ2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3NpZ2NvbnRleHQuaApAQCAtOCw2ICs4LDggQEAKICNpZm5kZWYgX0FTTV9TMzkwX1NJR0NPTlRFWFRfSAogI2RlZmluZSBfQVNNX1MzOTBfU0lHQ09OVEVYVF9ICiAKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCiAjZGVmaW5lIF9fTlVNX0dQUlMgMTYKICNkZWZpbmUgX19OVU1fRlBSUyAxNgogI2RlZmluZSBfX05VTV9BQ1JTIDE2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tczM5MC9zeXN0ZW0uaAppbmRleCBjN2MzYTlhLi5iMmU2NWU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvc3lzdGVtLmgKQEAgLTExNSwxMyArMTE1LDE0IEBACiB9CiAKICNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwotZXh0ZXJuIHZvaWQgYWNjb3VudF91c2VyX3Z0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKK2V4dGVybiB2b2lkIGFjY291bnRfdnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgYWNjb3VudF90aWNrX3Z0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIGFjY291bnRfc3lzdGVtX3Z0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKICNlbmRpZgogCiAjZGVmaW5lIGZpbmlzaF9hcmNoX3N3aXRjaChwcmV2KSBkbyB7CQkJCQkgICAgIFwKIAlzZXRfZnMoY3VycmVudC0+dGhyZWFkLm1tX3NlZ21lbnQpOwkJCQkgICAgIFwKLQlhY2NvdW50X3N5c3RlbV92dGltZShwcmV2KTsJCQkJCSAgICAgXAorCWFjY291bnRfdnRpbWUocHJldik7CQkJCQkJICAgICBcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIG5vcCgpIF9fYXNtX18gX192b2xhdGlsZV9fICgibm9wIikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9maXhtYXAuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9maXhtYXAuaAppbmRleCBhNTgyY2ZjLi43YjI4NmJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvZml4bWFwLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2ZpeG1hcC5oCkBAIC03Niw3ICs3Niw3IEBACiAgKiBkaXJlY3RseSB3aXRob3V0IHRyYW5zbGF0aW9uLCB3ZSBjYXRjaCB0aGUgYnVnIHdpdGggYSBOVUxMLWRlZmVyZW5jZQogICoga2VybmVsIG9vcHMuIElsbGVnYWwgcmFuZ2VzIG9mIGluY29taW5nIGluZGljZXMgYXJlIGNhdWdodCB0b28uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmaXhfdG9fdmlydChjb25zdCB1bnNpZ25lZCBpbnQgaWR4KQorc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIGZpeF90b192aXJ0KGNvbnN0IHVuc2lnbmVkIGludCBpZHgpCiB7CiAJLyoKIAkgKiB0aGlzIGJyYW5jaCBnZXRzIGNvbXBsZXRlbHkgZWxpbWluYXRlZCBhZnRlciBpbmxpbmluZywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdWFjY2Vzcy5oCmluZGV4IDI4OTJjNGIuLmJkZGZmY2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaApAQCAtMjQ0LDcgKzI0NCw3IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxlbik7IAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29weV9pbl91c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxlbik7IAogCi1zdGF0aWMgaW5saW5lIGludCBfX2NvcHlfZnJvbV91c2VyKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdW5zaWduZWQgc2l6ZSkgCitzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBfX2NvcHlfZnJvbV91c2VyKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdW5zaWduZWQgc2l6ZSkKIHsgCiAgICAgICAgaW50IHJldCA9IDA7CiAJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkKQEAgLTI3Myw3ICsyNzMsNyBAQAogCX0KIH0JCiAKLXN0YXRpYyBpbmxpbmUgaW50IF9fY29weV90b191c2VyKHZvaWQgX191c2VyICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgc2l6ZSkgCitzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBfX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIHNpemUpCiB7IAogICAgICAgIGludCByZXQgPSAwOwogCWlmICghX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpCkBAIC0zMDUsNyArMzA1LDcgQEAKIH0JCiAKIAotc3RhdGljIGlubGluZSBpbnQgX19jb3B5X2luX3VzZXIodm9pZCBfX3VzZXIgKmRzdCwgY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdW5zaWduZWQgc2l6ZSkgCitzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBfX2NvcHlfaW5fdXNlcih2b2lkIF9fdXNlciAqZHN0LCBjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBzaXplKQogeyAKICAgICAgICBpbnQgcmV0ID0gMDsKIAlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdXh2ZWMuaCBiL2luY2x1ZGUvbGludXgvYXV4dmVjLmgKaW5kZXggOWE3YjM3NC4uZDJiYzBkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdXh2ZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oCkBAIC0yNiw2ICsyNiw2IEBACiAKICNkZWZpbmUgQVRfU0VDVVJFIDIzICAgLyogc2VjdXJlIG1vZGUgYm9vbGVhbiAqLwogCi0jZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFICA0MiAvKiBTaXplIG9mIGF1eGlsaWFyeSB0YWJsZS4gICovCisjZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFICA0NCAvKiBTaXplIG9mIGF1eGlsaWFyeSB0YWJsZS4gICovCiAKICNlbmRpZiAvKiBfTElOVVhfQVVYVkVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjMy5oIGIvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MzLmgKaW5kZXggNDIwOTA4Mi4uMTY5OGI4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MzLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MzLmgKQEAgLTEzLDMgKzEzLDQgQEAKICNkZWZpbmUgX19tdXN0X2NoZWNrCQlfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKQogI2VuZGlmCiAKKyNkZWZpbmUgX19hbHdheXNfaW5saW5lCQlpbmxpbmUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLWdjYzQuaCBiL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjNC5oCmluZGV4IGU5MTNlOWIuLjZmNWNjNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjNC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjNC5oCkBAIC0zLDcgKzMsMTYgQEAKIC8qIFRoZXNlIGRlZmluaXRpb25zIGFyZSBmb3IgR0NDIHY0LnguICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLWdjYy5oPgogCisjaWZkZWYgQ09ORklHX0ZPUkNFRF9JTkxJTklORworIyB1bmRlZiBpbmxpbmUKKyMgdW5kZWYgX19pbmxpbmVfXworIyB1bmRlZiBfX2lubGluZQorIyBkZWZpbmUgaW5saW5lCQkJaW5saW5lCQlfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyMgZGVmaW5lIF9faW5saW5lX18JCV9faW5saW5lX18JX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCisjIGRlZmluZSBfX2lubGluZQkJX19pbmxpbmUJX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCisjZW5kaWYKKwogI2RlZmluZSBfX2F0dHJpYnV0ZV91c2VkX18JX19hdHRyaWJ1dGVfXygoX191c2VkX18pKQogI2RlZmluZSBfX211c3RfY2hlY2sgCQlfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKQogI2RlZmluZSBfX2NvbXBpbGVyX29mZnNldG9mKGEsYikgX19idWlsdGluX29mZnNldG9mKGEsYikKLQorI2RlZmluZSBfX2Fsd2F5c19pbmxpbmUJCWlubGluZSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1c2V0LmggYi9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCmluZGV4IGM0NzJmOTcuLjNiYzYwNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVzZXQuaApAQCAtNDgsNiArNDgsOSBAQAogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jcHVzZXRfb3BlcmF0aW9uczsKIGV4dGVybiBjaGFyICpjcHVzZXRfdGFza19zdGF0dXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcik7CiAKK2V4dGVybiB2b2lkIGNwdXNldF9sb2NrKHZvaWQpOworZXh0ZXJuIHZvaWQgY3B1c2V0X3VubG9jayh2b2lkKTsKKwogI2Vsc2UgLyogIUNPTkZJR19DUFVTRVRTICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IGNwdXNldF9pbml0X2Vhcmx5KHZvaWQpIHsgcmV0dXJuIDA7IH0KQEAgLTkzLDYgKzk2LDkgQEAKIAlyZXR1cm4gYnVmZmVyOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1c2V0X2xvY2sodm9pZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfdW5sb2NrKHZvaWQpIHt9CisKICNlbmRpZiAvKiAhQ09ORklHX0NQVVNFVFMgKi8KIAogI2VuZGlmIC8qIF9MSU5VWF9DUFVTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKaW5kZXggMGNkZWU3OGUuLjU4ZGYxOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtNDksNiArNDksOSBAQAogCWludAkJKCptYXRjaCkoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpOwogCWludAkJKCp1ZXZlbnQpKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsCiAJCQkJICBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKTsKKwlpbnQJCSgqcHJvYmUpKHN0cnVjdCBkZXZpY2UgKiBkZXYpOworCWludAkJKCpyZW1vdmUpKHN0cnVjdCBkZXZpY2UgKiBkZXYpOworCXZvaWQJCSgqc2h1dGRvd24pKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogCWludAkJKCpzdXNwZW5kKShzdHJ1Y3QgZGV2aWNlICogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwogCWludAkJKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmIuaCBiL2luY2x1ZGUvbGludXgvZmIuaAppbmRleCBhOTczYmUyLi4yY2IxOWU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZiLmgKKysrIGIvaW5jbHVkZS9saW51eC9mYi5oCkBAIC02MDgsMTUgKzYwOCwxNSBAQAogCWludCAoKmZiX3N5bmMpKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAogCS8qIHBlcmZvcm0gZmIgc3BlY2lmaWMgaW9jdGwgKG9wdGlvbmFsKSAqLwotCWludCAoKmZiX2lvY3RsKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCXVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CisJaW50ICgqZmJfaW9jdGwpKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpOwogCiAJLyogSGFuZGxlIDMyYml0IGNvbXBhdCBpb2N0bCAob3B0aW9uYWwpICovCi0JbG9uZyAoKmZiX2NvbXBhdF9pb2N0bCkoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCi0JCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOworCWludCAoKmZiX2NvbXBhdF9pb2N0bCkoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKTsKIAogCS8qIHBlcmZvcm0gZmIgc3BlY2lmaWMgbW1hcCAqLwotCWludCAoKmZiX21tYXApKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCWludCAoKmZiX21tYXApKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiAKIAkvKiBzYXZlIGN1cnJlbnQgaGFyZHdhcmUgc3RhdGUgKi8KIAl2b2lkICgqZmJfc2F2ZV9zdGF0ZSkoc3RydWN0IGZiX2luZm8gKmluZm8pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGQxZTM3MGQuLjU1MmNlZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTEzODMsNiArMTM4MywxMiBAQAogZXh0ZXJuIGludCB1bnJlZ2lzdGVyX2NocmRldih1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2X3QsIHVuc2lnbmVkKTsKIGV4dGVybiBpbnQgY2hyZGV2X29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworZXh0ZXJuIGludCBnZXRfY2hyZGV2X2xpc3QoY2hhciAqKTsKK2V4dGVybiB2b2lkICphY3F1aXJlX2NocmRldl9saXN0KHZvaWQpOworZXh0ZXJuIGludCBjb3VudF9jaHJkZXZfbGlzdCh2b2lkKTsKK2V4dGVybiB2b2lkICpnZXRfbmV4dF9jaHJkZXYodm9pZCAqKTsKK2V4dGVybiBpbnQgZ2V0X2NocmRldl9pbmZvKHZvaWQgKiwgaW50ICosIGNoYXIgKiopOworZXh0ZXJuIHZvaWQgcmVsZWFzZV9jaHJkZXZfbGlzdCh2b2lkICopOwogCiAvKiBmcy9ibG9ja19kZXYuYyAqLwogI2RlZmluZSBCREVWTkFNRV9TSVpFCTMyCS8qIExhcmdlc3Qgc3RyaW5nIGZvciBhIGJsb2NrZGV2IGlkZW50aWZpZXIgKi8KQEAgLTEzOTEsNiArMTM5NywxMSBAQAogZXh0ZXJuIHN0cnVjdCBibG9ja19kZXZpY2UgKmxvb2t1cF9iZGV2KGNvbnN0IGNoYXIgKik7CiBleHRlcm4gc3RydWN0IGJsb2NrX2RldmljZSAqb3Blbl9iZGV2X2V4Y2woY29uc3QgY2hhciAqLCBpbnQsIHZvaWQgKik7CiBleHRlcm4gdm9pZCBjbG9zZV9iZGV2X2V4Y2woc3RydWN0IGJsb2NrX2RldmljZSAqKTsKK2V4dGVybiB2b2lkICphY3F1aXJlX2Jsa2Rldl9saXN0KHZvaWQpOworZXh0ZXJuIGludCBjb3VudF9ibGtkZXZfbGlzdCh2b2lkKTsKK2V4dGVybiB2b2lkICpnZXRfbmV4dF9ibGtkZXYodm9pZCAqKTsKK2V4dGVybiBpbnQgZ2V0X2Jsa2Rldl9pbmZvKHZvaWQgKiwgaW50ICosIGNoYXIgKiopOworZXh0ZXJuIHZvaWQgcmVsZWFzZV9ibGtkZXZfbGlzdCh2b2lkICopOwogCiBleHRlcm4gdm9pZCBpbml0X3NwZWNpYWxfaW5vZGUoc3RydWN0IGlub2RlICosIHVtb2RlX3QsIGRldl90KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oYXJkaXJxLmggYi9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaAppbmRleCA3MWQyYjhhLi5lYWI1MzcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaApAQCAtOTMsMTAgKzkzLDYgQEAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIAogI2lmbmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwotc3RhdGljIGlubGluZSB2b2lkIGFjY291bnRfdXNlcl92dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGFjY291bnRfc3lzdGVtX3Z0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZGUuaCBiL2luY2x1ZGUvbGludXgvaWRlLmgKaW5kZXggZjJlMWI1Yi4uMTEwYjNjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lkZS5oCkBAIC05ODMsOCArOTgzLDEzIEBACiAJaWRlX3N0YXJ0c3RvcF90CSgqYWJvcnQpKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICpycSk7CiAJaWRlX3Byb2NfZW50cnlfdAkqcHJvYzsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglnZW5fZHJpdmVyOworCWludAkJKCpwcm9iZSkoaWRlX2RyaXZlX3QgKik7CisJdm9pZAkJKCpyZW1vdmUpKGlkZV9kcml2ZV90ICopOworCXZvaWQJCSgqc2h1dGRvd24pKGlkZV9kcml2ZV90ICopOwogfSBpZGVfZHJpdmVyX3Q7CiAKKyNkZWZpbmUgdG9faWRlX2RyaXZlcihkcnYpIGNvbnRhaW5lcl9vZihkcnYsIGlkZV9kcml2ZXJfdCwgZ2VuX2RyaXZlcikKKwogaW50IGdlbmVyaWNfaWRlX2lvY3RsKGlkZV9kcml2ZV90ICosIHN0cnVjdCBmaWxlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwgdW5zaWduZWQsIHVuc2lnbmVkIGxvbmcpOwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb2MzLmggYi9pbmNsdWRlL2xpbnV4L2lvYzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzkwNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pb2MzLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBTdGFuaXNsYXcgU2tvd3JvbmVrIDxza3lsYXJrQGxpbnV4LW1pcHMub3JnPgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lPQzNfSAorI2RlZmluZSBfTElOVVhfSU9DM19ICisKKyNpbmNsdWRlIDxhc20vc24vaW9jMy5oPgorCisjZGVmaW5lIElPQzNfTUFYX1NVQk1PRFVMRVMJMzIKKworI2RlZmluZSBJT0MzX0NMQVNTX05PTkUJCTAKKyNkZWZpbmUgSU9DM19DTEFTU19CQVNFX0lQMjcJMQorI2RlZmluZSBJT0MzX0NMQVNTX0JBU0VfSVAzMAkyCisjZGVmaW5lIElPQzNfQ0xBU1NfTUVORVRfMTIzCTMKKyNkZWZpbmUgSU9DM19DTEFTU19NRU5FVF80CTQKKyNkZWZpbmUgSU9DM19DTEFTU19DQUREVU8JNQorI2RlZmluZSBJT0MzX0NMQVNTX1NFUklBTAk2CisKKy8qIE9uZSBvZiB0aGVzZSBwZXIgSU9DMyAqLworc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgaWQ7CQkJCS8qIElPQzMgc2VxdWVuY2UgbnVtYmVyICovCisJLyogUENJIG1hcHBpbmcgKi8KKwl1bnNpZ25lZCBsb25nIHBtYTsJCS8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgX19pb21lbSBpb2MzICp2bWE7CS8qIHBvaW50ZXIgdG8gcmVnaXN0ZXJzICovCisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CQkvKiBQQ0kgZGV2aWNlICovCisJLyogSVJRIHN0dWZmICovCisJaW50IGR1YWxfaXJxOwkJCS8qIHNldCBpZiBzZXBhcmF0ZSBJUlFzIGFyZSB1c2VkICovCisJaW50IGlycV9pbywgaXJxX2V0aDsJCS8qIElSUSBudW1iZXJzICovCisJLyogR1BJTyBtYWdpYyAqLworCXNwaW5sb2NrX3QgZ3Bpb19sb2NrOworCXVuc2lnbmVkIGludCBncGRyX3NoYWRvdzsKKwkvKiBOSUMgaWRlbnRpZmllcnMgKi8KKwljaGFyIG5pY19wYXJ0WzMyXTsKKwljaGFyIG5pY19zZXJpYWxbMTZdOworCWNoYXIgbmljX21hY1s2XTsKKwkvKiBzdWJtb2R1bGUgc2V0ICovCisJaW50IGNsYXNzOworCXZvaWQgKmRhdGFbSU9DM19NQVhfU1VCTU9EVUxFU107CS8qIGZvciBzdWJtb2R1bGUgdXNlICovCisJaW50IGFjdGl2ZVtJT0MzX01BWF9TVUJNT0RVTEVTXTsJLyogc2V0IGlmIHByb2JlIHN1Y2NlZWRzICovCisJLyogaXNfaXJfbG9jayBtdXN0IGJlIGhlbGQgd2hpbGUKKwkgKiBtb2RpZnlpbmcgc2lvX2llIHZhbHVlcywgc28KKwkgKiB3ZSBjYW4gYmUgc3VyZSB0aGF0IHNpb19pZSBpcworCSAqIG5vdCBjaGFuZ2luZyB3aGVuIHdlIHJlYWQgaXQKKwkgKiBhbG9uZyB3aXRoIHNpb19pci4KKwkgKi8KKwlzcGlubG9ja190IGlyX2xvY2s7CS8qIFNJT19JRVtTQ10gbW9kIGxvY2sgKi8KK307CisKKy8qIE9uZSBwZXIgc3VibW9kdWxlICovCitzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgeworCWNoYXIgKm5hbWU7CQkvKiBkZXNjcmlwdGl2ZSBzdWJtb2R1bGUgbmFtZSAqLworCXN0cnVjdCBtb2R1bGUgKm93bmVyOwkvKiBvd25pbmcga2VybmVsIG1vZHVsZSAqLworCWludCBldGhlcm5ldDsJCS8qIHNldCBmb3IgZXRoZXJuZXQgZHJpdmVycyAqLworCWludCAoKnByb2JlKSAoc3RydWN0IGlvYzNfc3VibW9kdWxlICosIHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICopOworCWludCAoKnJlbW92ZSkgKHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqLCBzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqKTsKKwlpbnQgaWQ7CQkJLyogYXNzaWduZWQgYnkgSU9DMywgaW5kZXggZm9yIHRoZSAiZGF0YSIgYXJyYXkgKi8KKwkvKiBJUlEgc3R1ZmYgKi8KKwl1bnNpZ25lZCBpbnQgaXJxX21hc2s7CS8qIElPQzMgSVJRIG1hc2ssIGxlYXZlIGNsZWFyIGZvciBFdGhlcm5ldCAqLworCWludCByZXNldF9tYXNrOwkJLyogbm9uLXplcm8gaWYgeW91IHdhbnQgdGhlIGlvYzMuYyBtb2R1bGUgdG8gcmVzZXQgaW50ZXJydXB0cyAqLworCWludCAoKmludHIpIChzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKiwgc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKTsKKwkvKiBwcml2YXRlIHN1Ym1vZHVsZSBkYXRhICovCisJdm9pZCAqZGF0YTsJCS8qIGFzc2lnbmVkIGJ5IHN1Ym1vZHVsZSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9ucyBuZWVkZWQgYnkgc3VibW9kdWxlcyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJT0MzX1dfSUVTCQkwCisjZGVmaW5lIElPQzNfV19JRUMJCTEKKworLyogcmVnaXN0ZXJzIGEgc3VibW9kdWxlIGZvciBhbGwgZXhpc3RpbmcgYW5kIGZ1dHVyZSBJT0MzIGNoaXBzICovCitleHRlcm4gaW50IGlvYzNfcmVnaXN0ZXJfc3VibW9kdWxlKHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqKTsKKy8qIHVucmVnaXN0ZXJzIGEgc3VibW9kdWxlICovCitleHRlcm4gdm9pZCBpb2MzX3VucmVnaXN0ZXJfc3VibW9kdWxlKHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqKTsKKy8qIGVuYWJsZXMgSVJRcyBpbmRpY2F0ZWQgYnkgaXJxX21hc2sgZm9yIGEgc3BlY2lmaWVkIElPQzMgY2hpcCAqLworZXh0ZXJuIHZvaWQgaW9jM19lbmFibGUoc3RydWN0IGlvYzNfc3VibW9kdWxlICosIHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICosIHVuc2lnbmVkIGludCk7CisvKiBhY2tvd2xlZGdlcyBzcGVjaWZpZWQgSVJRcyAqLworZXh0ZXJuIHZvaWQgaW9jM19hY2soc3RydWN0IGlvYzNfc3VibW9kdWxlICosIHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICosIHVuc2lnbmVkIGludCk7CisvKiBkaXNhYmxlcyBJUlFzIGluZGljYXRlZCBieSBpcnFfbWFzayBmb3IgYSBzcGVjaWZpZWQgSU9DMyBjaGlwICovCitleHRlcm4gdm9pZCBpb2MzX2Rpc2FibGUoc3RydWN0IGlvYzNfc3VibW9kdWxlICosIHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICosIHVuc2lnbmVkIGludCk7CisvKiBhdG9taWNhbGx5IHNldHMgR1BDUiBiaXRzICovCitleHRlcm4gdm9pZCBpb2MzX2dwY3Jfc2V0KHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICosIHVuc2lnbmVkIGludCk7CisvKiBnZW5lcmFsIGlyZWcgd3JpdGVyICovCitleHRlcm4gdm9pZCBpb2MzX3dyaXRlX2lyZWcoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCwgdWludDMyX3QgdmFsdWUsIGludCByZWcpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IGU2ZWUyZDkuLjMyMzkyNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtMjE2LDYgKzIxNiw3IEBACiAJKCh1bnNpZ25lZCBjaGFyICopJmFkZHIpWzFdLCBcCiAJKCh1bnNpZ25lZCBjaGFyICopJmFkZHIpWzJdLCBcCiAJKCh1bnNpZ25lZCBjaGFyICopJmFkZHIpWzNdCisjZGVmaW5lIE5JUFFVQURfRk1UICIldS4ldS4ldS4ldSIKIAogI2RlZmluZSBOSVA2KGFkZHIpIFwKIAludG9ocygoYWRkcikuczZfYWRkcjE2WzBdKSwgXApAQCAtMjI2LDYgKzIyNyw3IEBACiAJbnRvaHMoKGFkZHIpLnM2X2FkZHIxNls1XSksIFwKIAludG9ocygoYWRkcikuczZfYWRkcjE2WzZdKSwgXAogCW50b2hzKChhZGRyKS5zNl9hZGRyMTZbN10pCisjZGVmaW5lIE5JUDZfRk1UICIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHgiCiAKICNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKICNkZWZpbmUgSElQUVVBRChhZGRyKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaAppbmRleCBjN2FjNzdlLi5kNmE1M2VkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKQEAgLTEzMiwxMiArMTMyLDggQEAKIAlzcGlubG9ja190IGxvY2s7CiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKmluZm8pCi17Ci0JaW5mby0+cm9vdCA9IFJCX1JPT1Q7Ci0Jc3Bpbl9sb2NrX2luaXQoJmluZm8tPmxvY2spOwotfQotCit2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICppbmZvLCBpbnQgcG9saWN5LAorCQkJCW5vZGVtYXNrX3QgKm5vZGVzKTsKIGludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICppbmZvLAogCQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCXN0cnVjdCBtZW1wb2xpY3kgKm5ldyk7CkBAIC0yMTEsNyArMjA3LDggQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICppbmZvKQorc3RhdGljIGlubGluZSB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICppbmZvLAorCQkJCQlpbnQgcG9saWN5LCBub2RlbWFza190ICpub2RlcykKIHsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IGM2NDMwMTYuLjg1ODU0YjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTUxMiw3ICs1MTIsNyBAQAogZXh0ZXJuIHN0cnVjdCBwYWdlICptZW1fbWFwOwogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqbG93bWVtX3BhZ2VfYWRkcmVzcyhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqbG93bWVtX3BhZ2VfYWRkcmVzcyhzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlyZXR1cm4gX192YShwYWdlX3RvX3BmbihwYWdlKSA8PCBQQUdFX1NISUZUKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmNwX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCmluZGV4IDcyOTdlNDMuLmUwMTM0MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uY3BfZnMuaApAQCAtMjAxLDM0ICsyMDEsNiBAQAogCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBuY3BfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKIH0KIAotI2lmZGVmIERFQlVHX05DUF9NQUxMT0MKLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotZXh0ZXJuIGludCBuY3BfbWFsbG9jZWQ7Ci1leHRlcm4gaW50IG5jcF9jdXJyZW50X21hbGxvY2VkOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgKgotIG5jcF9rbWFsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQgcHJpb3JpdHkpCi17Ci0JbmNwX21hbGxvY2VkICs9IDE7Ci0JbmNwX2N1cnJlbnRfbWFsbG9jZWQgKz0gMTsKLQlyZXR1cm4ga21hbGxvYyhzaXplLCBwcmlvcml0eSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBuY3Bfa2ZyZWVfcyh2b2lkICpvYmosIGludCBzaXplKQotewotCW5jcF9jdXJyZW50X21hbGxvY2VkIC09IDE7Ci0Ja2ZyZWUob2JqKTsKLX0KLQotI2Vsc2UJCQkJLyogREVCVUdfTkNQX01BTExPQyAqLwotCi0jZGVmaW5lIG5jcF9rbWFsbG9jKHMscCkga21hbGxvYyhzLHApCi0jZGVmaW5lIG5jcF9rZnJlZV9zKG8scykga2ZyZWUobykKLQotI2VuZGlmCQkJCS8qIERFQlVHX05DUF9NQUxMT0MgKi8KLQogLyogbGludXgvZnMvbmNwZnMvaW5vZGUuYyAqLwogaW50IG5jcF9ub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOwogc3RydWN0IGlub2RlICpuY3BfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IG5jcF9lbnRyeV9pbmZvICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCmluZGV4IDZkMzliNTEuLjNmZjg4YzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKQEAgLTE1NCw2ICsxNTQsOSBAQAogCXVuc2lnbmVkIGludCBleHBlY3RfZGVsZXRlOwogfTsKIAorLyogY2FsbCB0byBjcmVhdGUgYW4gZXhwbGljaXQgZGVwZW5kZW5jeSBvbiBuZl9jb25udHJhY2suICovCitleHRlcm4gdm9pZCBuZWVkX2Nvbm50cmFjayh2b2lkKTsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9ORl9DT05OVFJBQ0tfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MmYwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCkBAIC0wLDAgKzEsMjI0IEBACisjaWZuZGVmIF9YX1RBQkxFU19ICisjZGVmaW5lIF9YX1RBQkxFU19ICisKKyNkZWZpbmUgWFRfRlVOQ1RJT05fTUFYTkFNRUxFTiAzMAorI2RlZmluZSBYVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fR0VUX1JFVklTSU9OXyouICBSZXR1cm5zIGhpZ2hlc3QgcmV2aXNpb24KKyAqIGtlcm5lbCBzdXBwb3J0cywgaWYgPj0gcmV2aXNpb24uICovCitzdHJ1Y3QgeHRfZ2V0X3JldmlzaW9uCit7CisJY2hhciBuYW1lW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07CisKKwl1X2ludDhfdCByZXZpc2lvbjsKK307CisKKy8qIENPTlRJTlVFIHZlcmRpY3QgZm9yIHRhcmdldHMgKi8KKyNkZWZpbmUgWFRfQ09OVElOVUUgMHhGRkZGRkZGRgorCisvKiBGb3Igc3RhbmRhcmQgdGFyZ2V0ICovCisjZGVmaW5lIFhUX1JFVFVSTiAoLU5GX1JFUEVBVCAtIDEpCisKKyNkZWZpbmUgWFRfQUxJR04ocykgKCgocykgKyAoX19hbGlnbm9mX18odm9pZCAqKS0xKSkgJiB+KF9fYWxpZ25vZl9fKHZvaWQgKiktMSkpCisKKy8qIFN0YW5kYXJkIHJldHVybiB2ZXJkaWN0LCBvciBkbyBqdW1wLiAqLworI2RlZmluZSBYVF9TVEFOREFSRF9UQVJHRVQgIiIKKy8qIEVycm9yIHZlcmRpY3QuICovCisjZGVmaW5lIFhUX0VSUk9SX1RBUkdFVCAiRVJST1IiCisKKy8qCisgKiBOZXcgSVAgZmlyZXdhbGwgb3B0aW9ucyBmb3IgW2dzXWV0c29ja29wdCBhdCB0aGUgUkFXIElQIGxldmVsLgorICogVW5saWtlIEJTRCBMaW51eCBpbmhlcml0cyBJUCBvcHRpb25zIHNvIHlvdSBkb24ndCBoYXZlIHRvIHVzZSBhIHJhdworICogc29ja2V0IGZvciB0aGlzLiBJbnN0ZWFkIHdlIGNoZWNrIHJpZ2h0cyBpbiB0aGUgY2FsbHMuICovCisjZGVmaW5lIFhUX0JBU0VfQ1RMCQk2NAkvKiBiYXNlIGZvciBmaXJld2FsbCBzb2NrZXQgb3B0aW9ucyAqLworCisjZGVmaW5lIFhUX1NPX1NFVF9SRVBMQUNFCShYVF9CQVNFX0NUTCkKKyNkZWZpbmUgWFRfU09fU0VUX0FERF9DT1VOVEVSUwkoWFRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBYVF9TT19TRVRfTUFYCQlYVF9TT19TRVRfQUREX0NPVU5URVJTCisKKyNkZWZpbmUgWFRfU09fR0VUX0lORk8JCQkoWFRfQkFTRV9DVEwpCisjZGVmaW5lIFhUX1NPX0dFVF9FTlRSSUVTCQkoWFRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBYVF9TT19HRVRfUkVWSVNJT05fTUFUQ0gJKFhUX0JBU0VfQ1RMICsgMikKKyNkZWZpbmUgWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAkoWFRfQkFTRV9DVEwgKyAzKQorI2RlZmluZSBYVF9TT19HRVRfTUFYCQkJWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAorCisjZGVmaW5lIFNFVF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ID0gKGIpOyAoYykucGNudCA9IChwKTsgfSB3aGlsZSgwKQorI2RlZmluZSBBRERfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCArPSAoYik7IChjKS5wY250ICs9IChwKTsgfSB3aGlsZSgwKQorCitzdHJ1Y3QgeHRfY291bnRlcnMKK3sKKwl1X2ludDY0X3QgcGNudCwgYmNudDsJCQkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMgKi8KK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fQUREX0NPVU5URVJTLiAqLworc3RydWN0IHh0X2NvdW50ZXJzX2luZm8KK3sKKwkvKiBXaGljaCB0YWJsZS4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOworCisJLyogVGhlIGNvdW50ZXJzIChhY3R1YWxseSBgbnVtYmVyJyBvZiB0aGVzZSkuICovCisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzWzBdOworfTsKKworI2RlZmluZSBYVF9JTlZfUFJPVE8JCTB4NDAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBQUk9UTy4gKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjZGVmaW5lIEFTU0VSVF9SRUFEX0xPQ0soeCkKKyNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9saXN0aGVscC5oPgorCitzdHJ1Y3QgeHRfbWF0Y2gKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwljb25zdCBjaGFyIG5hbWVbWFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKKworCXVfaW50OF90IHJldmlzaW9uOworCisJLyogUmV0dXJuIHRydWUgb3IgZmFsc2U6IHJldHVybiBGQUxTRSBhbmQgc2V0ICpob3Rkcm9wID0gMSB0bworICAgICAgICAgICBmb3JjZSBpbW1lZGlhdGUgcGFja2V0IGRyb3AuICovCisJLyogQXJndW1lbnRzIGNoYW5nZWQgc2luY2UgMi42LjksIGFzIHRoaXMgbXVzdCBub3cgaGFuZGxlCisJICAgbm9uLWxpbmVhciBza2IsIHVzaW5nIHNrYl9oZWFkZXJfcG9pbnRlciBhbmQKKwkgICBza2JfaXBfbWFrZV93cml0YWJsZS4gKi8KKwlpbnQgKCptYXRjaCkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisJCSAgICAgaW50IG9mZnNldCwKKwkJICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJICAgICBpbnQgKmhvdGRyb3ApOworCisJLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworCS8qIFNob3VsZCByZXR1cm4gdHJ1ZSBvciBmYWxzZS4gKi8KKwlpbnQgKCpjaGVja2VudHJ5KShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCQkgIGNvbnN0IHZvaWQgKmlwLAorCQkJICB2b2lkICptYXRjaGluZm8sCisJCQkgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAorCQkJICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKTsKKworCS8qIENhbGxlZCB3aGVuIGVudHJ5IG9mIHRoaXMgdHlwZSBkZWxldGVkLiAqLworCXZvaWQgKCpkZXN0cm95KSh2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplKTsKKworCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFIGlmIHlvdSBhcmUgYSBtb2R1bGUsIG90aGVyd2lzZSBOVUxMICovCisJc3RydWN0IG1vZHVsZSAqbWU7Cit9OworCisvKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCitzdHJ1Y3QgeHRfdGFyZ2V0Cit7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJY29uc3QgY2hhciBuYW1lW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07CisKKwl1X2ludDhfdCByZXZpc2lvbjsKKworCS8qIFJldHVybnMgdmVyZGljdC4gQXJndW1lbnQgb3JkZXIgY2hhbmdlZCBzaW5jZSAyLjYuOSwgYXMgdGhpcworCSAgIG11c3Qgbm93IGhhbmRsZSBub24tbGluZWFyIHNrYnMsIHVzaW5nIHNrYl9jb3B5X2JpdHMgYW5kCisJICAgc2tiX2lwX21ha2Vfd3JpdGFibGUuICovCisJdW5zaWduZWQgaW50ICgqdGFyZ2V0KShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCQkgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisJCQkgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisJLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlOgorICAgICAgICAgICBob29rX21hc2sgaXMgYSBiaXRtYXNrIG9mIGhvb2tzIGZyb20gd2hpY2ggaXQgY2FuIGJlCisgICAgICAgICAgIGNhbGxlZC4gKi8KKwkvKiBTaG91bGQgcmV0dXJuIHRydWUgb3IgZmFsc2UuICovCisJaW50ICgqY2hlY2tlbnRyeSkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCQkJICBjb25zdCB2b2lkICplbnRyeSwKKwkJCSAgdm9pZCAqdGFyZ2luZm8sCisJCQkgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisJCQkgIHVuc2lnbmVkIGludCBob29rX21hc2spOworCisJLyogQ2FsbGVkIHdoZW4gZW50cnkgb2YgdGhpcyB0eXBlIGRlbGV0ZWQuICovCisJdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKnRhcmdpbmZvLCB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplKTsKKworCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFIGlmIHlvdSBhcmUgYSBtb2R1bGUsIG90aGVyd2lzZSBOVUxMICovCisJc3RydWN0IG1vZHVsZSAqbWU7Cit9OworCisvKiBGdXJuaXR1cmUgc2hvcHBpbmcuLi4gKi8KK3N0cnVjdCB4dF90YWJsZQoreworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCS8qIEEgdW5pcXVlIG5hbWUuLi4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBXaGF0IGhvb2tzIHlvdSB3aWxsIGVudGVyIG9uICovCisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCisJLyogTG9jayBmb3IgdGhlIGN1cnRhaW4gKi8KKwlyd2xvY2tfdCBsb2NrOworCisJLyogTWFuIGJlaGluZCB0aGUgY3VydGFpbi4uLiAqLworCS8vc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKKwl2b2lkICpwcml2YXRlOworCisJLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUgaWYgeW91IGFyZSBhIG1vZHVsZSwgb3RoZXJ3aXNlIE5VTEwgKi8KKwlzdHJ1Y3QgbW9kdWxlICptZTsKKworCWludCBhZjsJCS8qIGFkZHJlc3MvcHJvdG9jb2wgZmFtaWx5ICovCit9OworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKworLyogVGhlIHRhYmxlIGl0c2VsZiAqLworc3RydWN0IHh0X3RhYmxlX2luZm8KK3sKKwkvKiBTaXplIHBlciB0YWJsZSAqLworCXVuc2lnbmVkIGludCBzaXplOworCS8qIE51bWJlciBvZiBlbnRyaWVzOiBGSVhNRS4gLS1SUiAqLworCXVuc2lnbmVkIGludCBudW1iZXI7CisJLyogSW5pdGlhbCBudW1iZXIgb2YgZW50cmllcy4gTmVlZGVkIGZvciBtb2R1bGUgdXNhZ2UgY291bnQgKi8KKwl1bnNpZ25lZCBpbnQgaW5pdGlhbF9lbnRyaWVzOworCisJLyogRW50cnkgcG9pbnRzIGFuZCB1bmRlcmZsb3dzICovCisJdW5zaWduZWQgaW50IGhvb2tfZW50cnlbTkZfSVBfTlVNSE9PS1NdOworCXVuc2lnbmVkIGludCB1bmRlcmZsb3dbTkZfSVBfTlVNSE9PS1NdOworCisJLyogaXB0X2VudHJ5IHRhYmxlczogb25lIHBlciBDUFUgKi8KKwljaGFyICplbnRyaWVzW05SX0NQVVNdOworfTsKKworZXh0ZXJuIGludCB4dF9yZWdpc3Rlcl90YXJnZXQoaW50IGFmLCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQpOworZXh0ZXJuIHZvaWQgeHRfdW5yZWdpc3Rlcl90YXJnZXQoaW50IGFmLCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQpOworZXh0ZXJuIGludCB4dF9yZWdpc3Rlcl9tYXRjaChpbnQgYWYsIHN0cnVjdCB4dF9tYXRjaCAqdGFyZ2V0KTsKK2V4dGVybiB2b2lkIHh0X3VucmVnaXN0ZXJfbWF0Y2goaW50IGFmLCBzdHJ1Y3QgeHRfbWF0Y2ggKnRhcmdldCk7CisKK2V4dGVybiBpbnQgeHRfcmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSwKKwkJCSAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKmJvb3RzdHJhcCwKKwkJCSAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8pOworZXh0ZXJuIHZvaWQgKnh0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSk7CisKK2V4dGVybiBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqeHRfcmVwbGFjZV90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzLAorCQkJCQkgICAgICBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJCQkJICAgICAgaW50ICplcnJvcik7CisKK2V4dGVybiBzdHJ1Y3QgeHRfbWF0Y2ggKnh0X2ZpbmRfbWF0Y2goaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbik7CitleHRlcm4gc3RydWN0IHh0X3RhcmdldCAqeHRfZmluZF90YXJnZXQoaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbik7CitleHRlcm4gc3RydWN0IHh0X3RhcmdldCAqeHRfcmVxdWVzdF9maW5kX3RhcmdldChpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIAorCQkJCQkJdTggcmV2aXNpb24pOworZXh0ZXJuIGludCB4dF9maW5kX3JldmlzaW9uKGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCB0YXJnZXQsCisJCQkgICAgaW50ICplcnIpOworCitleHRlcm4gc3RydWN0IHh0X3RhYmxlICp4dF9maW5kX3RhYmxlX2xvY2soaW50IGFmLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIHh0X3RhYmxlX3VubG9jayhzdHJ1Y3QgeHRfdGFibGUgKnQpOworCitleHRlcm4gaW50IHh0X3Byb3RvX2luaXQoaW50IGFmKTsKK2V4dGVybiB2b2lkIHh0X3Byb3RvX2ZpbmkoaW50IGFmKTsKKworZXh0ZXJuIHN0cnVjdCB4dF90YWJsZV9pbmZvICp4dF9hbGxvY190YWJsZV9pbmZvKHVuc2lnbmVkIGludCBzaXplKTsKK2V4dGVybiB2b2lkIHh0X2ZyZWVfdGFibGVfaW5mbyhzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqaW5mbyk7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfWF9UQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxMTEzNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9YVF9DTEFTU0lGWV9ICisjZGVmaW5lIF9YVF9DTEFTU0lGWV9ICisKK3N0cnVjdCB4dF9jbGFzc2lmeV90YXJnZXRfaW5mbyB7CisJdV9pbnQzMl90IHByaW9yaXR5OworfTsKKworI2VuZGlmIC8qX1hUX0NMQVNTSUZZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzQ0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX1hUX0NPTk5NQVJLX0hfdGFyZ2V0CisjZGVmaW5lIF9YVF9DT05OTUFSS19IX3RhcmdldAorCisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNCBNQVJBIFN5c3RlbXMgQUIgPGh0dHA6Ly93d3cubWFyYXN5c3RlbXMuY29tPgorICogYnkgSGVucmlrIE5vcmRzdHJvbSA8aG5vQG1hcmFzeXN0ZW1zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKK2VudW0geworCVhUX0NPTk5NQVJLX1NFVCA9IDAsCisJWFRfQ09OTk1BUktfU0FWRSwKKwlYVF9DT05OTUFSS19SRVNUT1JFCit9OworCitzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyazsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdV9pbnQ4X3QgbW9kZTsKK307CisKKyNlbmRpZiAvKl9YVF9DT05OTUFSS19IX3RhcmdldCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9NQVJLLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9NQVJLLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyMWU5MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X01BUksuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9YVF9NQVJLX0hfdGFyZ2V0CisjZGVmaW5lIF9YVF9NQVJLX0hfdGFyZ2V0CisKKy8qIFZlcnNpb24gMCAqLworc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyazsKK307CisKKy8qIFZlcnNpb24gMSAqLworZW51bSB7CisJWFRfTUFSS19TRVQ9MCwKKwlYVF9NQVJLX0FORCwKKwlYVF9NQVJLX09SLAorfTsKKworc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm9fdjEgeworCXVuc2lnbmVkIGxvbmcgbWFyazsKKwl1X2ludDhfdCBtb2RlOworfTsKKworI2VuZGlmIC8qX1hUX01BUktfSF90YXJnZXQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTlhZjc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaApAQCAtMCwwICsxLDE2IEBACisvKiBpcHRhYmxlcyBtb2R1bGUgZm9yIHVzaW5nIE5GUVVFVUUgbWVjaGFuaXNtCisgKgorICogKEMpIDIwMDUgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciBHTlUgR1BMIHYyLCAxOTkxCisgKiAKKyovCisjaWZuZGVmIF9YVF9ORlFfVEFSR0VUX0gKKyNkZWZpbmUgX1hUX05GUV9UQVJHRVRfSAorCisvKiB0YXJnZXQgaW5mbyAqLworc3RydWN0IHh0X05GUV9pbmZvIHsKKwl1X2ludDE2X3QgcXVldWVudW07Cit9OworCisjZW5kaWYgLyogX1hUX05GUV9UQVJHRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2ZlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb21tZW50LmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfWFRfQ09NTUVOVF9ICisjZGVmaW5lIF9YVF9DT01NRU5UX0gKKworI2RlZmluZSBYVF9NQVhfQ09NTUVOVF9MRU4gMjU2CisKK3N0cnVjdCB4dF9jb21tZW50X2luZm8geworCXVuc2lnbmVkIGNoYXIgY29tbWVudFtYVF9NQVhfQ09NTUVOVF9MRU5dOworfTsKKworI2VuZGlmIC8qIFhUX0NPTU1FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25uYnl0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDIyYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfWFRfQ09OTkJZVEVTX0gKKyNkZWZpbmUgX1hUX0NPTk5CWVRFU19ICisKK2VudW0geHRfY29ubmJ5dGVzX3doYXQgeworCVhUX0NPTk5CWVRFU19QS1RTLAorCVhUX0NPTk5CWVRFU19CWVRFUywKKwlYVF9DT05OQllURVNfQVZHUEtULAorfTsKKworZW51bSB4dF9jb25uYnl0ZXNfZGlyZWN0aW9uIHsKKwlYVF9DT05OQllURVNfRElSX09SSUdJTkFMLAorCVhUX0NPTk5CWVRFU19ESVJfUkVQTFksCisJWFRfQ09OTkJZVEVTX0RJUl9CT1RILAorfTsKKworc3RydWN0IHh0X2Nvbm5ieXRlc19pbmZvCit7CisJc3RydWN0IHsKKwkJYWxpZ25lZF91NjQgZnJvbTsJLyogY291bnQgdG8gYmUgbWF0Y2hlZCAqLworCQlhbGlnbmVkX3U2NCB0bzsJCS8qIGNvdW50IHRvIGJlIG1hdGNoZWQgKi8KKwl9IGNvdW50OworCXVfaW50OF90IHdoYXQ7CQkvKiBpcHRfY29ubmJ5dGVzX3doYXQgKi8KKwl1X2ludDhfdCBkaXJlY3Rpb247CS8qIGlwdF9jb25uYnl0ZXNfZGlyZWN0aW9uICovCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25ubWFyay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTkyZjZhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9YVF9DT05OTUFSS19ICisjZGVmaW5lIF9YVF9DT05OTUFSS19ICisKKy8qIENvcHlyaWdodCAoQykgMjAwMiwyMDA0IE1BUkEgU3lzdGVtcyBBQiA8aHR0cDovL3d3dy5tYXJhc3lzdGVtcy5jb20+CisgKiBieSBIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5c3RlbXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworc3RydWN0IHh0X2Nvbm5tYXJrX2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyaywgbWFzazsKKwl1X2ludDhfdCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLypfWFRfQ09OTk1BUktfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjYzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaApAQCAtMCwwICsxLDYzIEBACisvKiBIZWFkZXIgZmlsZSBmb3Iga2VybmVsIG1vZHVsZSB0byBtYXRjaCBjb25uZWN0aW9uIHRyYWNraW5nIGluZm9ybWF0aW9uLgorICogR1BMIChDKSAyMDAxICBNYXJjIEJvdWNoZXIgKG1hcmNAbWJzaS5jYSkuCisgKi8KKworI2lmbmRlZiBfWFRfQ09OTlRSQUNLX0gKKyNkZWZpbmUgX1hUX0NPTk5UUkFDS19ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pICgxIDw8ICgoY3RpbmZvKSVJUF9DVF9JU19SRVBMWSsxKSkKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQgKDEgPDwgMCkKKworI2RlZmluZSBYVF9DT05OVFJBQ0tfU1RBVEVfU05BVCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMSkpCisjZGVmaW5lIFhUX0NPTk5UUkFDS19TVEFURV9ETkFUICgxIDw8IChJUF9DVF9OVU1CRVIgKyAyKSkKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMykpCisKKy8qIGZsYWdzLCBpbnZmbGFnczogKi8KKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFCTB4MDEKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1BST1RPCTB4MDIKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX09SSUdTUkMJMHgwNAorI2RlZmluZSBYVF9DT05OVFJBQ0tfT1JJR0RTVAkweDA4CisjZGVmaW5lIFhUX0NPTk5UUkFDS19SRVBMU1JDCTB4MTAKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1JFUExEU1QJMHgyMAorI2RlZmluZSBYVF9DT05OVFJBQ0tfU1RBVFVTCTB4NDAKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX0VYUElSRVMJMHg4MAorCisvKiBUaGlzIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlLCBzbyByZW1haW5zIGZyb3plbiBpbiB0aW1lLiAqLworc3RydWN0IGlwX2Nvbm50cmFja19vbGRfdHVwbGUKK3sKKwlzdHJ1Y3QgeworCQlfX3UzMiBpcDsKKwkJdW5pb24geworCQkJX191MTYgYWxsOworCQl9IHU7CisJfSBzcmM7CisKKwlzdHJ1Y3QgeworCQlfX3UzMiBpcDsKKwkJdW5pb24geworCQkJX191MTYgYWxsOworCQl9IHU7CisKKwkJLyogVGhlIHByb3RvY29sLiAqLworCQl1MTYgcHJvdG9udW07CisJfSBkc3Q7Cit9OworCitzdHJ1Y3QgeHRfY29ubnRyYWNrX2luZm8KK3sKKwl1bnNpZ25lZCBpbnQgc3RhdGVtYXNrLCBzdGF0dXNtYXNrOworCisJc3RydWN0IGlwX2Nvbm50cmFja19vbGRfdHVwbGUgdHVwbGVbSVBfQ1RfRElSX01BWF07CisJc3RydWN0IGluX2FkZHIgc2lwbXNrW0lQX0NUX0RJUl9NQVhdLCBkaXBtc2tbSVBfQ1RfRElSX01BWF07CisKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXNfbWluLCBleHBpcmVzX21heDsKKworCS8qIEZsYWdzIHdvcmQgKi8KKwl1X2ludDhfdCBmbGFnczsKKwkvKiBJbnZlcnNlIGZsYWdzICovCisJdV9pbnQ4X3QgaW52ZmxhZ3M7Cit9OworI2VuZGlmIC8qX1hUX0NPTk5UUkFDS19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2RjY3AuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2RjY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIyMWI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZGNjcC5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX1hUX0RDQ1BfSF8KKyNkZWZpbmUgX1hUX0RDQ1BfSF8KKworI2RlZmluZSBYVF9EQ0NQX1NSQ19QT1JUUwkgICAgICAgIDB4MDEKKyNkZWZpbmUgWFRfRENDUF9ERVNUX1BPUlRTCSAgICAgICAgMHgwMgorI2RlZmluZSBYVF9EQ0NQX1RZUEUJCQkweDA0CisjZGVmaW5lIFhUX0RDQ1BfT1BUSU9OCQkJMHgwOAorCisjZGVmaW5lIFhUX0RDQ1BfVkFMSURfRkxBR1MJCTB4MGYKKworc3RydWN0IHh0X2RjY3BfaW5mbyB7CisJdV9pbnQxNl90IGRwdHNbMl07ICAvKiBNaW4sIE1heCAqLworCXVfaW50MTZfdCBzcHRzWzJdOyAgLyogTWluLCBNYXggKi8KKworCXVfaW50MTZfdCBmbGFnczsKKwl1X2ludDE2X3QgaW52ZmxhZ3M7CisKKwl1X2ludDE2X3QgdHlwZW1hc2s7CisJdV9pbnQ4X3Qgb3B0aW9uOworfTsKKworI2VuZGlmIC8qIF9YVF9EQ0NQX0hfICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0Mjc2MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfWFRfSEVMUEVSX0gKKyNkZWZpbmUgX1hUX0hFTFBFUl9ICisKK3N0cnVjdCB4dF9oZWxwZXJfaW5mbyB7CisJaW50IGludmVydDsKKwljaGFyIG5hbWVbMzBdOworfTsKKyNlbmRpZiAvKiBfWFRfSEVMUEVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2xlbmd0aC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyYjQzOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2xlbmd0aC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfWFRfTEVOR1RIX0gKKyNkZWZpbmUgX1hUX0xFTkdUSF9ICisKK3N0cnVjdCB4dF9sZW5ndGhfaW5mbyB7CisgICAgdV9pbnQxNl90CW1pbiwgbWF4OworICAgIHVfaW50OF90CWludmVydDsKK307CisKKyNlbmRpZiAvKl9YVF9MRU5HVEhfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9saW1pdC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2NlNjUzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9YVF9SQVRFX0gKKyNkZWZpbmUgX1hUX1JBVEVfSAorCisvKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCisjZGVmaW5lIFhUX0xJTUlUX1NDQUxFIDEwMDAwCisKKy8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAorICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLworc3RydWN0IHh0X3JhdGVpbmZvIHsKKwl1X2ludDMyX3QgYXZnOyAgICAvKiBBdmVyYWdlIHNlY3MgYmV0d2VlbiBwYWNrZXRzICogc2NhbGUgKi8KKwl1X2ludDMyX3QgYnVyc3Q7ICAvKiBQZXJpb2QgbXVsdGlwbGllciBmb3IgdXBwZXIgbGltaXQuICovCisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXVuc2lnbmVkIGxvbmcgcHJldjsKKwl1X2ludDMyX3QgY3JlZGl0OworCXVfaW50MzJfdCBjcmVkaXRfY2FwLCBjb3N0OworCisJLyogVWdseSwgdWdseSBmdWNrZXIuICovCisJc3RydWN0IHh0X3JhdGVpbmZvICptYXN0ZXI7Cit9OworI2VuZGlmIC8qX1hUX1JBVEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYWMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X21hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTJjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYWMuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX1hUX01BQ19ICisjZGVmaW5lIF9YVF9NQUNfSAorCitzdHJ1Y3QgeHRfbWFjX2luZm8geworICAgIHVuc2lnbmVkIGNoYXIgc3JjYWRkcltFVEhfQUxFTl07CisgICAgaW50IGludmVydDsKK307CisjZW5kaWYgLypfWFRfTUFDX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbWFyay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbWFyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmRkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYXJrLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9YVF9NQVJLX0gKKyNkZWZpbmUgX1hUX01BUktfSAorCitzdHJ1Y3QgeHRfbWFya19pbmZvIHsKKyAgICB1bnNpZ25lZCBsb25nIG1hcmssIG1hc2s7CisgICAgdV9pbnQ4X3QgaW52ZXJ0OworfTsKKworI2VuZGlmIC8qX1hUX01BUktfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9waHlzZGV2LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9waHlzZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhN2ExOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9YVF9QSFlTREVWX0gKKyNkZWZpbmUgX1hUX1BIWVNERVZfSAorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjZW5kaWYKKworI2RlZmluZSBYVF9QSFlTREVWX09QX0lOCQkweDAxCisjZGVmaW5lIFhUX1BIWVNERVZfT1BfT1VUCQkweDAyCisjZGVmaW5lIFhUX1BIWVNERVZfT1BfQlJJREdFRAkJMHgwNAorI2RlZmluZSBYVF9QSFlTREVWX09QX0lTSU4JCTB4MDgKKyNkZWZpbmUgWFRfUEhZU0RFVl9PUF9JU09VVAkJMHgxMAorI2RlZmluZSBYVF9QSFlTREVWX09QX01BU0sJCSgweDIwIC0gMSkKKworc3RydWN0IHh0X3BoeXNkZXZfaW5mbyB7CisJY2hhciBwaHlzaW5kZXZbSUZOQU1TSVpdOworCWNoYXIgaW5fbWFza1tJRk5BTVNJWl07CisJY2hhciBwaHlzb3V0ZGV2W0lGTkFNU0laXTsKKwljaGFyIG91dF9tYXNrW0lGTkFNU0laXTsKKwl1X2ludDhfdCBpbnZlcnQ7CisJdV9pbnQ4X3QgYml0bWFzazsKK307CisKKyNlbmRpZiAvKl9YVF9QSFlTREVWX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjVjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wa3R0eXBlLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9YVF9QS1RUWVBFX0gKKyNkZWZpbmUgX1hUX1BLVFRZUEVfSAorCitzdHJ1Y3QgeHRfcGt0dHlwZV9pbmZvIHsKKwlpbnQJcGt0dHlwZTsKKwlpbnQJaW52ZXJ0OworfTsKKyNlbmRpZiAvKl9YVF9QS1RUWVBFX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcmVhbG0uaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwZTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfWFRfUkVBTE1fSAorI2RlZmluZSBfWFRfUkVBTE1fSAorCitzdHJ1Y3QgeHRfcmVhbG1faW5mbyB7CisJdV9pbnQzMl90IGlkOworCXVfaW50MzJfdCBtYXNrOworCXVfaW50OF90IGludmVydDsKK307CisKKyNlbmRpZiAvKiBfWFRfUkVBTE1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc2N0cC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc2N0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNTc4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zY3RwLmgKQEAgLTAsMCArMSwxMDcgQEAKKyNpZm5kZWYgX1hUX1NDVFBfSF8KKyNkZWZpbmUgX1hUX1NDVFBfSF8KKworI2RlZmluZSBYVF9TQ1RQX1NSQ19QT1JUUwkgICAgICAgIDB4MDEKKyNkZWZpbmUgWFRfU0NUUF9ERVNUX1BPUlRTCSAgICAgICAgMHgwMgorI2RlZmluZSBYVF9TQ1RQX0NIVU5LX1RZUEVTCQkweDA0CisKKyNkZWZpbmUgWFRfU0NUUF9WQUxJRF9GTEFHUwkJMHgwNworCisjZGVmaW5lIEVMRU1DT1VOVCh4KSAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKworCitzdHJ1Y3QgeHRfc2N0cF9mbGFnX2luZm8geworCXVfaW50OF90IGNodW5rdHlwZTsKKwl1X2ludDhfdCBmbGFnOworCXVfaW50OF90IGZsYWdfbWFzazsKK307CisKKyNkZWZpbmUgWFRfTlVNX1NDVFBfRkxBR1MJNAorCitzdHJ1Y3QgeHRfc2N0cF9pbmZvIHsKKwl1X2ludDE2X3QgZHB0c1syXTsgIC8qIE1pbiwgTWF4ICovCisJdV9pbnQxNl90IHNwdHNbMl07ICAvKiBNaW4sIE1heCAqLworCisJdV9pbnQzMl90IGNodW5rbWFwWzI1NiAvIHNpemVvZiAodV9pbnQzMl90KV07ICAvKiBCaXQgbWFzayBvZiBjaHVua3MgdG8gYmUgbWF0Y2hlZCBhY2NvcmRpbmcgdG8gUkZDIDI5NjAgKi8KKworI2RlZmluZSBTQ1RQX0NIVU5LX01BVENIX0FOWSAgIDB4MDEgIC8qIE1hdGNoIGlmIGFueSBvZiB0aGUgY2h1bmsgdHlwZXMgYXJlIHByZXNlbnQgKi8KKyNkZWZpbmUgU0NUUF9DSFVOS19NQVRDSF9BTEwgICAweDAyICAvKiBNYXRjaCBpZiBhbGwgb2YgdGhlIGNodW5rIHR5cGVzIGFyZSBwcmVzZW50ICovCisjZGVmaW5lIFNDVFBfQ0hVTktfTUFUQ0hfT05MWSAgMHgwNCAgLyogTWF0Y2ggaWYgdGhlc2UgYXJlIHRoZSBvbmx5IGNodW5rIHR5cGVzIHByZXNlbnQgKi8KKworCXVfaW50MzJfdCBjaHVua19tYXRjaF90eXBlOworCXN0cnVjdCB4dF9zY3RwX2ZsYWdfaW5mbyBmbGFnX2luZm9bWFRfTlVNX1NDVFBfRkxBR1NdOworCWludCBmbGFnX2NvdW50OworCisJdV9pbnQzMl90IGZsYWdzOworCXVfaW50MzJfdCBpbnZmbGFnczsKK307CisKKyNkZWZpbmUgYnl0ZXModHlwZSkgKHNpemVvZih0eXBlKSAqIDgpCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9TRVQoY2h1bmttYXAsIHR5cGUpIAkJXAorCWRvIHsgCQkJCQkJXAorCQljaHVua21hcFt0eXBlIC8gYnl0ZXModV9pbnQzMl90KV0gfD0gCVwKKwkJCTEgPDwgKHR5cGUgJSBieXRlcyh1X2ludDMyX3QpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9DTEVBUihjaHVua21hcCwgdHlwZSkJCSAJXAorCWRvIHsJCQkJCQkJXAorCQljaHVua21hcFt0eXBlIC8gYnl0ZXModV9pbnQzMl90KV0gJj0gCQlcCisJCQl+KDEgPDwgKHR5cGUgJSBieXRlcyh1X2ludDMyX3QpKSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfSVNfU0VUKGNodW5rbWFwLCB0eXBlKSAJCQlcCisoewkJCQkJCQkJXAorCShjaHVua21hcFt0eXBlIC8gYnl0ZXMgKHVfaW50MzJfdCldICYgCQkJXAorCQkoMSA8PCAodHlwZSAlIGJ5dGVzICh1X2ludDMyX3QpKSkpID8gMTogMDsJXAorfSkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX1JFU0VUKGNodW5rbWFwKSAJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpbnQgaTsgCQkJCQkJXAorCQlmb3IgKGkgPSAwOyBpIDwgRUxFTUNPVU5UKGNodW5rbWFwKTsgaSsrKQlcCisJCQljaHVua21hcFtpXSA9IDA7CQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9TRVRfQUxMKGNodW5rbWFwKSAJCQlcCisJZG8gewkJCQkJCQlcCisJCWludCBpOyAJCQkJCQlcCisJCWZvciAoaSA9IDA7IGkgPCBFTEVNQ09VTlQoY2h1bmttYXApOyBpKyspIAlcCisJCQljaHVua21hcFtpXSA9IH4wOwkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfQ09QWShkZXN0bWFwLCBzcmNtYXApIAkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaW50IGk7IAkJCQkJCVwKKwkJZm9yIChpID0gMDsgaSA8IEVMRU1DT1VOVChjaHVua21hcCk7IGkrKykgCVwKKwkJCWRlc3RtYXBbaV0gPSBzcmNtYXBbaV07CQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9JU19DTEVBUihjaHVua21hcCkgCQlcCisoewkJCQkJCQlcCisJaW50IGk7IAkJCQkJCVwKKwlpbnQgZmxhZyA9IDE7CQkJCQlcCisJZm9yIChpID0gMDsgaSA8IEVMRU1DT1VOVChjaHVua21hcCk7IGkrKykgewlcCisJCWlmIChjaHVua21hcFtpXSkgewkJCVwKKwkJCWZsYWcgPSAwOwkJCVwKKwkJCWJyZWFrOwkJCQlcCisJCX0JCQkJCVwKKwl9CQkJCQkJXAorICAgICAgICBmbGFnOwkJCQkJCVwKK30pCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9JU19BTExfU0VUKGNodW5rbWFwKSAJCVwKKyh7CQkJCQkJCVwKKwlpbnQgaTsgCQkJCQkJXAorCWludCBmbGFnID0gMTsJCQkJCVwKKwlmb3IgKGkgPSAwOyBpIDwgRUxFTUNPVU5UKGNodW5rbWFwKTsgaSsrKSB7CVwKKwkJaWYgKGNodW5rbWFwW2ldICE9IH4wKSB7CQlcCisJCQlmbGFnID0gMDsJCQlcCisJCQkJYnJlYWs7CQkJXAorCQl9CQkJCQlcCisJfQkJCQkJCVwKKyAgICAgICAgZmxhZzsJCQkJCQlcCit9KQorCisjZW5kaWYgLyogX1hUX1NDVFBfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc3RhdGUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2ZjMyZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfWFRfU1RBVEVfSAorI2RlZmluZSBfWFRfU1RBVEVfSAorCisjZGVmaW5lIFhUX1NUQVRFX0JJVChjdGluZm8pICgxIDw8ICgoY3RpbmZvKSVJUF9DVF9JU19SRVBMWSsxKSkKKyNkZWZpbmUgWFRfU1RBVEVfSU5WQUxJRCAoMSA8PCAwKQorCisjZGVmaW5lIFhUX1NUQVRFX1VOVFJBQ0tFRCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMSkpCisKK3N0cnVjdCB4dF9zdGF0ZV9pbmZvCit7CisJdW5zaWduZWQgaW50IHN0YXRlbWFzazsKK307CisjZW5kaWYgLypfWFRfU1RBVEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdHJpbmcuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzQxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdHJpbmcuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9YVF9TVFJJTkdfSAorI2RlZmluZSBfWFRfU1RSSU5HX0gKKworI2RlZmluZSBYVF9TVFJJTkdfTUFYX1BBVFRFUk5fU0laRSAxMjgKKyNkZWZpbmUgWFRfU1RSSU5HX01BWF9BTEdPX05BTUVfU0laRSAxNgorCitzdHJ1Y3QgeHRfc3RyaW5nX2luZm8KK3sKKwl1X2ludDE2X3QgZnJvbV9vZmZzZXQ7CisJdV9pbnQxNl90IHRvX29mZnNldDsKKwljaGFyCSAgYWxnb1tYVF9TVFJJTkdfTUFYX0FMR09fTkFNRV9TSVpFXTsKKwljaGFyIAkgIHBhdHRlcm5bWFRfU1RSSU5HX01BWF9QQVRURVJOX1NJWkVdOworCXVfaW50OF90ICBwYXRsZW47CisJdV9pbnQ4X3QgIGludmVydDsKKwlzdHJ1Y3QgdHNfY29uZmlnIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKSAqY29uZmlnOworfTsKKworI2VuZGlmIC8qX1hUX1NUUklOR19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcG1zcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwbXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzMjc0YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcG1zcy5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfWFRfVENQTVNTX01BVENIX0gKKyNkZWZpbmUgX1hUX1RDUE1TU19NQVRDSF9ICisKK3N0cnVjdCB4dF90Y3Btc3NfbWF0Y2hfaW5mbyB7CisgICAgdV9pbnQxNl90IG1zc19taW4sIG1zc19tYXg7CisgICAgdV9pbnQ4X3QgaW52ZXJ0OworfTsKKworI2VuZGlmIC8qX1hUX1RDUE1TU19NQVRDSF9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiYzY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX1hUX1RDUFVEUF9ICisjZGVmaW5lIF9YVF9UQ1BVRFBfSAorCisvKiBUQ1AgbWF0Y2hpbmcgc3R1ZmYgKi8KK3N0cnVjdCB4dF90Y3AKK3sKKwl1X2ludDE2X3Qgc3B0c1syXTsJCQkvKiBTb3VyY2UgcG9ydCByYW5nZS4gKi8KKwl1X2ludDE2X3QgZHB0c1syXTsJCQkvKiBEZXN0aW5hdGlvbiBwb3J0IHJhbmdlLiAqLworCXVfaW50OF90IG9wdGlvbjsJCQkvKiBUQ1AgT3B0aW9uIGlmZiBub24temVybyovCisJdV9pbnQ4X3QgZmxnX21hc2s7CQkJLyogVENQIGZsYWdzIG1hc2sgYnl0ZSAqLworCXVfaW50OF90IGZsZ19jbXA7CQkJLyogVENQIGZsYWdzIGNvbXBhcmUgYnl0ZSAqLworCXVfaW50OF90IGludmZsYWdzOwkJCS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKy8qIFZhbHVlcyBmb3IgImludiIgZmllbGQgaW4gc3RydWN0IGlwdF90Y3AuICovCisjZGVmaW5lIFhUX1RDUF9JTlZfU1JDUFQJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNvdXJjZSBwb3J0cy4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9EU1RQVAkweDAyCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgZGVzdCBwb3J0cy4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9GTEFHUwkweDA0CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgVENQIGZsYWdzLiAqLworI2RlZmluZSBYVF9UQ1BfSU5WX09QVElPTgkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygb3B0aW9uIHRlc3QuICovCisjZGVmaW5lIFhUX1RDUF9JTlZfTUFTSwkJMHgwRgkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisKKy8qIFVEUCBtYXRjaGluZyBzdHVmZiAqLworc3RydWN0IHh0X3VkcAoreworCXVfaW50MTZfdCBzcHRzWzJdOwkJCS8qIFNvdXJjZSBwb3J0IHJhbmdlLiAqLworCXVfaW50MTZfdCBkcHRzWzJdOwkJCS8qIERlc3RpbmF0aW9uIHBvcnQgcmFuZ2UuICovCisJdV9pbnQ4X3QgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCBpcHRfdWRwLiAqLworI2RlZmluZSBYVF9VRFBfSU5WX1NSQ1BUCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBzb3VyY2UgcG9ydHMuICovCisjZGVmaW5lIFhUX1VEUF9JTlZfRFNUUFQJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGRlc3QgcG9ydHMuICovCisjZGVmaW5lIFhUX1VEUF9JTlZfTUFTSwkweDAzCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oCmluZGV4IGU5OGE4NzAuLmZkMjE3OTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaApAQCAtMTksOCArMTksMTIgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAuaD4KIAotI2RlZmluZSBBUlBUX0ZVTkNUSU9OX01BWE5BTUVMRU4gMzAKLSNkZWZpbmUgQVJQVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKKyNkZWZpbmUgQVJQVF9GVU5DVElPTl9NQVhOQU1FTEVOIFhUX0ZVTkNUSU9OX01BWE5BTUVMRU4KKyNkZWZpbmUgQVJQVF9UQUJMRV9NQVhOQU1FTEVOIFhUX1RBQkxFX01BWE5BTUVMRU4KKyNkZWZpbmUgYXJwdF90YXJnZXQgeHRfdGFyZ2V0CisjZGVmaW5lIGFycHRfdGFibGUgeHRfdGFibGUKIAogI2RlZmluZSBBUlBUX0RFVl9BRERSX0xFTl9NQVggMTYKIApAQCAtOTEsMTEgKzk1LDYgQEAKIAlpbnQgdmVyZGljdDsKIH07CiAKLXN0cnVjdCBhcnB0X2NvdW50ZXJzCi17Ci0JdV9pbnQ2NF90IHBjbnQsIGJjbnQ7CQkJLyogUGFja2V0IGFuZCBieXRlIGNvdW50ZXJzICovCi19OwotCiAvKiBWYWx1ZXMgZm9yICJmbGFnIiBmaWVsZCBpbiBzdHJ1Y3QgYXJwdF9pcCAoZ2VuZXJhbCBhcnAgc3RydWN0dXJlKS4KICAqIE5vIGZsYWdzIGRlZmluZWQgeWV0LgogICovCkBAIC0xMzAsNyArMTI5LDcgQEAKIAl1bnNpZ25lZCBpbnQgY29tZWZyb207CiAKIAkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMuICovCi0Jc3RydWN0IGFycHRfY291bnRlcnMgY291bnRlcnM7CisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzOwogCiAJLyogVGhlIG1hdGNoZXMgKGlmIGFueSksIHRoZW4gdGhlIHRhcmdldC4gKi8KIAl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdOwpAQCAtMTQxLDIzICsxNDAsMjQgQEAKICAqIFVubGlrZSBCU0QgTGludXggaW5oZXJpdHMgSVAgb3B0aW9ucyBzbyB5b3UgZG9uJ3QgaGF2ZSB0byB1c2UgYSByYXcKICAqIHNvY2tldCBmb3IgdGhpcy4gSW5zdGVhZCB3ZSBjaGVjayByaWdodHMgaW4gdGhlIGNhbGxzLgogICovCi0jZGVmaW5lIEFSUFRfQkFTRV9DVEwJCTk2CS8qIGJhc2UgZm9yIGZpcmV3YWxsIHNvY2tldCBvcHRpb25zICovCisjZGVmaW5lIEFSUFRfQ1RMX09GRlNFVAkJMzIKKyNkZWZpbmUgQVJQVF9CQVNFX0NUTAkJKFhUX0JBU0VfQ1RMK0FSUFRfQ1RMX09GRlNFVCkKIAotI2RlZmluZSBBUlBUX1NPX1NFVF9SRVBMQUNFCQkoQVJQVF9CQVNFX0NUTCkKLSNkZWZpbmUgQVJQVF9TT19TRVRfQUREX0NPVU5URVJTCShBUlBUX0JBU0VfQ1RMICsgMSkKLSNkZWZpbmUgQVJQVF9TT19TRVRfTUFYCQkJQVJQVF9TT19TRVRfQUREX0NPVU5URVJTCisjZGVmaW5lIEFSUFRfU09fU0VUX1JFUExBQ0UJCShYVF9TT19TRVRfUkVQTEFDRStBUlBUX0NUTF9PRkZTRVQpCisjZGVmaW5lIEFSUFRfU09fU0VUX0FERF9DT1VOVEVSUwkoWFRfU09fU0VUX0FERF9DT1VOVEVSUytBUlBUX0NUTF9PRkZTRVQpCisjZGVmaW5lIEFSUFRfU09fU0VUX01BWAkJCShYVF9TT19TRVRfTUFYK0FSUFRfQ1RMX09GRlNFVCkKIAotI2RlZmluZSBBUlBUX1NPX0dFVF9JTkZPCQkoQVJQVF9CQVNFX0NUTCkKLSNkZWZpbmUgQVJQVF9TT19HRVRfRU5UUklFUwkJKEFSUFRfQkFTRV9DVEwgKyAxKQotLyogI2RlZmluZSBBUlBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoQVJQVF9CQVNFX0NUTCArIDIpKi8KLSNkZWZpbmUgQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShBUlBUX0JBU0VfQ1RMICsgMykKLSNkZWZpbmUgQVJQVF9TT19HRVRfTUFYCQkJQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCisjZGVmaW5lIEFSUFRfU09fR0VUX0lORk8JCShYVF9TT19HRVRfSU5GTytBUlBUX0NUTF9PRkZTRVQpCisjZGVmaW5lIEFSUFRfU09fR0VUX0VOVFJJRVMJCShYVF9TT19HRVRfRU5UUklFUytBUlBUX0NUTF9PRkZTRVQpCisvKiAjZGVmaW5lIEFSUFRfU09fR0VUX1JFVklTSU9OX01BVENICVhUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSCAgKi8KKyNkZWZpbmUgQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUK0FSUFRfQ1RMX09GRlNFVCkKKyNkZWZpbmUgQVJQVF9TT19HRVRfTUFYCQkJKFhUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQrQVJQVF9DVExfT0ZGU0VUKQogCiAvKiBDT05USU5VRSB2ZXJkaWN0IGZvciB0YXJnZXRzICovCi0jZGVmaW5lIEFSUFRfQ09OVElOVUUgMHhGRkZGRkZGRgorI2RlZmluZSBBUlBUX0NPTlRJTlVFIFhUX0NPTlRJTlVFCiAKIC8qIEZvciBzdGFuZGFyZCB0YXJnZXQgKi8KLSNkZWZpbmUgQVJQVF9SRVRVUk4gKC1ORl9SRVBFQVQgLSAxKQorI2RlZmluZSBBUlBUX1JFVFVSTiBYVF9SRVRVUk4KIAogLyogVGhlIGFyZ3VtZW50IHRvIEFSUFRfU09fR0VUX0lORk8gKi8KIHN0cnVjdCBhcnB0X2dldGluZm8KQEAgLTIwOCwyMyArMjA4LDE0IEBACiAJLyogTnVtYmVyIG9mIGNvdW50ZXJzIChtdXN0IGJlIGVxdWFsIHRvIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMpLiAqLwogCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CiAJLyogVGhlIG9sZCBlbnRyaWVzJyBjb3VudGVycy4gKi8KLQlzdHJ1Y3QgYXJwdF9jb3VudGVycyBfX3VzZXIgKmNvdW50ZXJzOworCXN0cnVjdCB4dF9jb3VudGVycyBfX3VzZXIgKmNvdW50ZXJzOwogCiAJLyogVGhlIGVudHJpZXMgKGhhbmcgb2ZmIGVuZDogbm90IHJlYWxseSBhbiBhcnJheSkuICovCiAJc3RydWN0IGFycHRfZW50cnkgZW50cmllc1swXTsKIH07CiAKIC8qIFRoZSBhcmd1bWVudCB0byBBUlBUX1NPX0FERF9DT1VOVEVSUy4gKi8KLXN0cnVjdCBhcnB0X2NvdW50ZXJzX2luZm8KLXsKLQkvKiBXaGljaCB0YWJsZS4gKi8KLQljaGFyIG5hbWVbQVJQVF9UQUJMRV9NQVhOQU1FTEVOXTsKLQotCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7Ci0KLQkvKiBUaGUgY291bnRlcnMgKGFjdHVhbGx5IGBudW1iZXInIG9mIHRoZXNlKS4gKi8KLQlzdHJ1Y3QgYXJwdF9jb3VudGVycyBjb3VudGVyc1swXTsKLX07CisjZGVmaW5lIGFycHRfY291bnRlcnNfaW5mbyB4dF9jb3VudGVyc19pbmZvCiAKIC8qIFRoZSBhcmd1bWVudCB0byBBUlBUX1NPX0dFVF9FTlRSSUVTLiAqLwogc3RydWN0IGFycHRfZ2V0X2VudHJpZXMKQEAgLTIzOSwxOSArMjMwLDEwIEBACiAJc3RydWN0IGFycHRfZW50cnkgZW50cnl0YWJsZVswXTsKIH07CiAKLS8qIFRoZSBhcmd1bWVudCB0byBBUlBUX1NPX0dFVF9SRVZJU0lPTl8qLiAgUmV0dXJucyBoaWdoZXN0IHJldmlzaW9uCi0gKiBrZXJuZWwgc3VwcG9ydHMsIGlmID49IHJldmlzaW9uLiAqLwotc3RydWN0IGFycHRfZ2V0X3JldmlzaW9uCi17Ci0JY2hhciBuYW1lW0FSUFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKLQotCXVfaW50OF90IHJldmlzaW9uOwotfTsKLQogLyogU3RhbmRhcmQgcmV0dXJuIHZlcmRpY3QsIG9yIGRvIGp1bXAuICovCi0jZGVmaW5lIEFSUFRfU1RBTkRBUkRfVEFSR0VUICIiCisjZGVmaW5lIEFSUFRfU1RBTkRBUkRfVEFSR0VUIFhUX1NUQU5EQVJEX1RBUkdFVAogLyogRXJyb3IgdmVyZGljdC4gKi8KLSNkZWZpbmUgQVJQVF9FUlJPUl9UQVJHRVQgIkVSUk9SIgorI2RlZmluZSBBUlBUX0VSUk9SX1RBUkdFVCBYVF9FUlJPUl9UQVJHRVQKIAogLyogSGVscGVyIGZ1bmN0aW9ucyAqLwogc3RhdGljIF9faW5saW5lX18gc3RydWN0IGFycHRfZW50cnlfdGFyZ2V0ICphcnB0X2dldF90YXJnZXQoc3RydWN0IGFycHRfZW50cnkgKmUpCkBAIC0yODEsNjMgKzI2Myw4IEBACiAgKi8KICNpZmRlZiBfX0tFUk5FTF9fCiAKLS8qIFJlZ2lzdHJhdGlvbiBob29rcyBmb3IgdGFyZ2V0cy4gKi8KLXN0cnVjdCBhcnB0X3RhcmdldAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCWNvbnN0IGNoYXIgbmFtZVtBUlBUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07Ci0KLQl1X2ludDhfdCByZXZpc2lvbjsKLQotCS8qIFJldHVybnMgdmVyZGljdC4gKi8KLQl1bnNpZ25lZCBpbnQgKCp0YXJnZXQpKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCSAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKLQkJCSAgICAgICB2b2lkICp1c2VyZGF0YSk7Ci0KLQkvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGU6Ci0gICAgICAgICAgIGhvb2tfbWFzayBpcyBhIGJpdG1hc2sgb2YgaG9va3MgZnJvbSB3aGljaCBpdCBjYW4gYmUKLSAgICAgICAgICAgY2FsbGVkLiAqLwotCS8qIFNob3VsZCByZXR1cm4gdHJ1ZSBvciBmYWxzZS4gKi8KLQlpbnQgKCpjaGVja2VudHJ5KShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgIGNvbnN0IHN0cnVjdCBhcnB0X2VudHJ5ICplLAotCQkJICB2b2lkICp0YXJnaW5mbywKLQkJCSAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKLQkJCSAgdW5zaWduZWQgaW50IGhvb2tfbWFzayk7Ci0KLQkvKiBDYWxsZWQgd2hlbiBlbnRyeSBvZiB0aGlzIHR5cGUgZGVsZXRlZC4gKi8KLQl2b2lkICgqZGVzdHJveSkodm9pZCAqdGFyZ2luZm8sIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUpOwotCi0JLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUgaWYgeW91IGFyZSBhIG1vZHVsZSwgb3RoZXJ3aXNlIE5VTEwgKi8KLQlzdHJ1Y3QgbW9kdWxlICptZTsKLX07Ci0KLWV4dGVybiBpbnQgYXJwdF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGFycHRfdGFyZ2V0ICp0YXJnZXQpOwotZXh0ZXJuIHZvaWQgYXJwdF91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgYXJwdF90YXJnZXQgKnRhcmdldCk7Ci0KLS8qIEZ1cm5pdHVyZSBzaG9wcGluZy4uLiAqLwotc3RydWN0IGFycHRfdGFibGUKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQkvKiBBIHVuaXF1ZSBuYW1lLi4uICovCi0JY2hhciBuYW1lW0FSUFRfVEFCTEVfTUFYTkFNRUxFTl07Ci0KLQkvKiBXaGF0IGhvb2tzIHlvdSB3aWxsIGVudGVyIG9uICovCi0JdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOwotCi0JLyogTG9jayBmb3IgdGhlIGN1cnRhaW4gKi8KLQlyd2xvY2tfdCBsb2NrOwotCi0JLyogTWFuIGJlaGluZCB0aGUgY3VydGFpbi4uLiAqLwotCXN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKnByaXZhdGU7Ci0KLQkvKiBTZXQgdGhpcyB0byBUSElTX01PRFVMRSBpZiB5b3UgYXJlIGEgbW9kdWxlLCBvdGhlcndpc2UgTlVMTCAqLwotCXN0cnVjdCBtb2R1bGUgKm1lOwotfTsKKyNkZWZpbmUgYXJwdF9yZWdpc3Rlcl90YXJnZXQodGd0KSB4dF9yZWdpc3Rlcl90YXJnZXQoTkZfQVJQLCB0Z3QpCisjZGVmaW5lIGFycHRfdW5yZWdpc3Rlcl90YXJnZXQodGd0KSB4dF91bnJlZ2lzdGVyX3RhcmdldChORl9BUlAsIHRndCkKIAogZXh0ZXJuIGludCBhcnB0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBhcnB0X3RhYmxlICp0YWJsZSwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYXJwdF9yZXBsYWNlICpyZXBsKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oCmluZGV4IGIzNDMyYWIuLjIxNTc2NWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaApAQCAtMTk5LDkgKzE5OSw2IEBACiAJbmZfY29ubnRyYWNrX3B1dCgmY3QtPmN0X2dlbmVyYWwpOwogfQogCi0vKiBjYWxsIHRvIGNyZWF0ZSBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIGlwX2Nvbm50cmFjay4gKi8KLWV4dGVybiB2b2lkIG5lZWRfaXBfY29ubnRyYWNrKHZvaWQpOwotCiBleHRlcm4gaW50IGludmVydF90dXBsZXByKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKmludmVyc2UsCiAJCQkgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm9yaWcpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaAppbmRleCBkMTlkNjVjLi43NmJhMjRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmgKQEAgLTI1LDggKzI1LDE0IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogCi0jZGVmaW5lIElQVF9GVU5DVElPTl9NQVhOQU1FTEVOIDMwCi0jZGVmaW5lIElQVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKKyNkZWZpbmUgSVBUX0ZVTkNUSU9OX01BWE5BTUVMRU4gWFRfRlVOQ1RJT05fTUFYTkFNRUxFTgorI2RlZmluZSBJUFRfVEFCTEVfTUFYTkFNRUxFTiBYVF9GVU5DVElPTl9NQVhOQU1FTEVOCisjZGVmaW5lIGlwdF9tYXRjaCB4dF9tYXRjaAorI2RlZmluZSBpcHRfdGFyZ2V0IHh0X3RhcmdldAorI2RlZmluZSBpcHRfdGFibGUgeHRfdGFibGUKKyNkZWZpbmUgaXB0X2dldF9yZXZpc2lvbiB4dF9nZXRfcmV2aXNpb24KIAogLyogWWVzLCBWaXJnaW5pYSwgeW91IGhhdmUgdG8gemVybyB0aGUgcGFkZGluZy4gKi8KIHN0cnVjdCBpcHRfaXAgewpAQCAtMTAyLDEwICsxMDgsNyBAQAogCWludCB2ZXJkaWN0OwogfTsKIAotc3RydWN0IGlwdF9jb3VudGVycwotewotCXVfaW50NjRfdCBwY250LCBiY250OwkJCS8qIFBhY2tldCBhbmQgYnl0ZSBjb3VudGVycyAqLwotfTsKKyNkZWZpbmUgaXB0X2NvdW50ZXJzIHh0X2NvdW50ZXJzCiAKIC8qIFZhbHVlcyBmb3IgImZsYWciIGZpZWxkIGluIHN0cnVjdCBpcHRfaXAgKGdlbmVyYWwgaXAgc3RydWN0dXJlKS4gKi8KICNkZWZpbmUgSVBUX0ZfRlJBRwkJMHgwMQkvKiBTZXQgaWYgcnVsZSBpcyBhIGZyYWdtZW50IHJ1bGUgKi8KQEAgLTExOSw3ICsxMjIsNyBAQAogI2RlZmluZSBJUFRfSU5WX1NSQ0lQCQkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgU1JDIElQLiAqLwogI2RlZmluZSBJUFRfSU5WX0RTVElQCQkweDEwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgRFNUIE9QLiAqLwogI2RlZmluZSBJUFRfSU5WX0ZSQUcJCTB4MjAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBGUkFHLiAqLwotI2RlZmluZSBJUFRfSU5WX1BST1RPCQkweDQwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgUFJPVE8uICovCisjZGVmaW5lIElQVF9JTlZfUFJPVE8JCVhUX0lOVl9QUk9UTwogI2RlZmluZSBJUFRfSU5WX01BU0sJCTB4N0YJLyogQWxsIHBvc3NpYmxlIGZsYWcgYml0cyBtYXNrLiAqLwogCiAvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGVhY2ggb2YgdGhlIGZpcmV3YWxsIHJ1bGVzLiAgQ29uc2lzdHMgb2YgMwpAQCAtMTQxLDcgKzE0NCw3IEBACiAJdW5zaWduZWQgaW50IGNvbWVmcm9tOwogCiAJLyogUGFja2V0IGFuZCBieXRlIGNvdW50ZXJzLiAqLwotCXN0cnVjdCBpcHRfY291bnRlcnMgY291bnRlcnM7CisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzOwogCiAJLyogVGhlIG1hdGNoZXMgKGlmIGFueSksIHRoZW4gdGhlIHRhcmdldC4gKi8KIAl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdOwpAQCAtMTUxLDU0ICsxNTQsMzQgQEAKICAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCiAgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlIGEgcmF3CiAgKiBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4gKi8KLSNkZWZpbmUgSVBUX0JBU0VfQ1RMCQk2NAkvKiBiYXNlIGZvciBmaXJld2FsbCBzb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBJUFRfQkFTRV9DVEwJCVhUX0JBU0VfQ1RMCiAKLSNkZWZpbmUgSVBUX1NPX1NFVF9SRVBMQUNFCShJUFRfQkFTRV9DVEwpCi0jZGVmaW5lIElQVF9TT19TRVRfQUREX0NPVU5URVJTCShJUFRfQkFTRV9DVEwgKyAxKQotI2RlZmluZSBJUFRfU09fU0VUX01BWAkJSVBUX1NPX1NFVF9BRERfQ09VTlRFUlMKKyNkZWZpbmUgSVBUX1NPX1NFVF9SRVBMQUNFCVhUX1NPX1NFVF9SRVBMQUNFCisjZGVmaW5lIElQVF9TT19TRVRfQUREX0NPVU5URVJTCVhUX1NPX1NFVF9BRERfQ09VTlRFUlMKKyNkZWZpbmUgSVBUX1NPX1NFVF9NQVgJCVhUX1NPX1NFVF9NQVgKIAotI2RlZmluZSBJUFRfU09fR0VUX0lORk8JCQkoSVBUX0JBU0VfQ1RMKQotI2RlZmluZSBJUFRfU09fR0VUX0VOVFJJRVMJCShJUFRfQkFTRV9DVEwgKyAxKQotI2RlZmluZSBJUFRfU09fR0VUX1JFVklTSU9OX01BVENICShJUFRfQkFTRV9DVEwgKyAyKQotI2RlZmluZSBJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAkoSVBUX0JBU0VfQ1RMICsgMykKLSNkZWZpbmUgSVBUX1NPX0dFVF9NQVgJCQlJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAorI2RlZmluZSBJUFRfU09fR0VUX0lORk8JCQlYVF9TT19HRVRfSU5GTworI2RlZmluZSBJUFRfU09fR0VUX0VOVFJJRVMJCVhUX1NPX0dFVF9FTlRSSUVTCisjZGVmaW5lIElQVF9TT19HRVRfUkVWSVNJT05fTUFUQ0gJWFRfU09fR0VUX1JFVklTSU9OX01BVENICisjZGVmaW5lIElQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCVhUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKKyNkZWZpbmUgSVBUX1NPX0dFVF9NQVgJCQlYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCiAKLS8qIENPTlRJTlVFIHZlcmRpY3QgZm9yIHRhcmdldHMgKi8KLSNkZWZpbmUgSVBUX0NPTlRJTlVFIDB4RkZGRkZGRkYKKyNkZWZpbmUgSVBUX0NPTlRJTlVFIFhUX0NPTlRJTlVFCisjZGVmaW5lIElQVF9SRVRVUk4gWFRfUkVUVVJOCiAKLS8qIEZvciBzdGFuZGFyZCB0YXJnZXQgKi8KLSNkZWZpbmUgSVBUX1JFVFVSTiAoLU5GX1JFUEVBVCAtIDEpCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oPgorI2RlZmluZSBpcHRfdWRwIHh0X3VkcAorI2RlZmluZSBpcHRfdGNwIHh0X3RjcAogCi0vKiBUQ1AgbWF0Y2hpbmcgc3R1ZmYgKi8KLXN0cnVjdCBpcHRfdGNwCi17Ci0JdV9pbnQxNl90IHNwdHNbMl07CQkJLyogU291cmNlIHBvcnQgcmFuZ2UuICovCi0JdV9pbnQxNl90IGRwdHNbMl07CQkJLyogRGVzdGluYXRpb24gcG9ydCByYW5nZS4gKi8KLQl1X2ludDhfdCBvcHRpb247CQkJLyogVENQIE9wdGlvbiBpZmYgbm9uLXplcm8qLwotCXVfaW50OF90IGZsZ19tYXNrOwkJCS8qIFRDUCBmbGFncyBtYXNrIGJ5dGUgKi8KLQl1X2ludDhfdCBmbGdfY21wOwkJCS8qIFRDUCBmbGFncyBjb21wYXJlIGJ5dGUgKi8KLQl1X2ludDhfdCBpbnZmbGFnczsJCQkvKiBJbnZlcnNlIGZsYWdzICovCi19OworI2RlZmluZSBJUFRfVENQX0lOVl9TUkNQVAlYVF9UQ1BfSU5WX1NSQ1BUCisjZGVmaW5lIElQVF9UQ1BfSU5WX0RTVFBUCVhUX1RDUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVBUX1RDUF9JTlZfRkxBR1MJWFRfVENQX0lOVl9GTEFHUworI2RlZmluZSBJUFRfVENQX0lOVl9PUFRJT04JWFRfVENQX0lOVl9PUFRJT04KKyNkZWZpbmUgSVBUX1RDUF9JTlZfTUFTSwlYVF9UQ1BfSU5WX01BU0sKIAotLyogVmFsdWVzIGZvciAiaW52IiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X3RjcC4gKi8KLSNkZWZpbmUgSVBUX1RDUF9JTlZfU1JDUFQJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNvdXJjZSBwb3J0cy4gKi8KLSNkZWZpbmUgSVBUX1RDUF9JTlZfRFNUUFQJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGRlc3QgcG9ydHMuICovCi0jZGVmaW5lIElQVF9UQ1BfSU5WX0ZMQUdTCTB4MDQJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBUQ1AgZmxhZ3MuICovCi0jZGVmaW5lIElQVF9UQ1BfSU5WX09QVElPTgkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygb3B0aW9uIHRlc3QuICovCi0jZGVmaW5lIElQVF9UQ1BfSU5WX01BU0sJMHgwRgkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCi0KLS8qIFVEUCBtYXRjaGluZyBzdHVmZiAqLwotc3RydWN0IGlwdF91ZHAKLXsKLQl1X2ludDE2X3Qgc3B0c1syXTsJCQkvKiBTb3VyY2UgcG9ydCByYW5nZS4gKi8KLQl1X2ludDE2X3QgZHB0c1syXTsJCQkvKiBEZXN0aW5hdGlvbiBwb3J0IHJhbmdlLiAqLwotCXVfaW50OF90IGludmZsYWdzOwkJCS8qIEludmVyc2UgZmxhZ3MgKi8KLX07Ci0KLS8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X3VkcC4gKi8KLSNkZWZpbmUgSVBUX1VEUF9JTlZfU1JDUFQJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNvdXJjZSBwb3J0cy4gKi8KLSNkZWZpbmUgSVBUX1VEUF9JTlZfRFNUUFQJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGRlc3QgcG9ydHMuICovCi0jZGVmaW5lIElQVF9VRFBfSU5WX01BU0sJMHgwMwkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisjZGVmaW5lIElQVF9VRFBfSU5WX1NSQ1BUCVhUX1VEUF9JTlZfU1JDUFQKKyNkZWZpbmUgSVBUX1VEUF9JTlZfRFNUUFQJWFRfVURQX0lOVl9EU1RQVAorI2RlZmluZSBJUFRfVURQX0lOVl9NQVNLCVhUX1VEUF9JTlZfTUFTSwogCiAvKiBJQ01QIG1hdGNoaW5nIHN0dWZmICovCiBzdHJ1Y3QgaXB0X2ljbXAKQEAgLTI2MCwyMyArMjQzLDE0IEBACiAJLyogTnVtYmVyIG9mIGNvdW50ZXJzIChtdXN0IGJlIGVxdWFsIHRvIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMpLiAqLwogCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CiAJLyogVGhlIG9sZCBlbnRyaWVzJyBjb3VudGVycy4gKi8KLQlzdHJ1Y3QgaXB0X2NvdW50ZXJzIF9fdXNlciAqY291bnRlcnM7CisJc3RydWN0IHh0X2NvdW50ZXJzIF9fdXNlciAqY291bnRlcnM7CiAKIAkvKiBUaGUgZW50cmllcyAoaGFuZyBvZmYgZW5kOiBub3QgcmVhbGx5IGFuIGFycmF5KS4gKi8KIAlzdHJ1Y3QgaXB0X2VudHJ5IGVudHJpZXNbMF07CiB9OwogCiAvKiBUaGUgYXJndW1lbnQgdG8gSVBUX1NPX0FERF9DT1VOVEVSUy4gKi8KLXN0cnVjdCBpcHRfY291bnRlcnNfaW5mbwotewotCS8qIFdoaWNoIHRhYmxlLiAqLwotCWNoYXIgbmFtZVtJUFRfVEFCTEVfTUFYTkFNRUxFTl07Ci0KLQl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOwotCi0JLyogVGhlIGNvdW50ZXJzIChhY3R1YWxseSBgbnVtYmVyJyBvZiB0aGVzZSkuICovCi0Jc3RydWN0IGlwdF9jb3VudGVycyBjb3VudGVyc1swXTsKLX07CisjZGVmaW5lIGlwdF9jb3VudGVyc19pbmZvIHh0X2NvdW50ZXJzX2luZm8KIAogLyogVGhlIGFyZ3VtZW50IHRvIElQVF9TT19HRVRfRU5UUklFUy4gKi8KIHN0cnVjdCBpcHRfZ2V0X2VudHJpZXMKQEAgLTI5MSwxOSArMjY1LDEwIEBACiAJc3RydWN0IGlwdF9lbnRyeSBlbnRyeXRhYmxlWzBdOwogfTsKIAotLyogVGhlIGFyZ3VtZW50IHRvIElQVF9TT19HRVRfUkVWSVNJT05fKi4gIFJldHVybnMgaGlnaGVzdCByZXZpc2lvbgotICoga2VybmVsIHN1cHBvcnRzLCBpZiA+PSByZXZpc2lvbi4gKi8KLXN0cnVjdCBpcHRfZ2V0X3JldmlzaW9uCi17Ci0JY2hhciBuYW1lW0lQVF9GVU5DVElPTl9NQVhOQU1FTEVOLTFdOwotCi0JdV9pbnQ4X3QgcmV2aXNpb247Ci19OwotCiAvKiBTdGFuZGFyZCByZXR1cm4gdmVyZGljdCwgb3IgZG8ganVtcC4gKi8KLSNkZWZpbmUgSVBUX1NUQU5EQVJEX1RBUkdFVCAiIgorI2RlZmluZSBJUFRfU1RBTkRBUkRfVEFSR0VUIFhUX1NUQU5EQVJEX1RBUkdFVAogLyogRXJyb3IgdmVyZGljdC4gKi8KLSNkZWZpbmUgSVBUX0VSUk9SX1RBUkdFVCAiRVJST1IiCisjZGVmaW5lIElQVF9FUlJPUl9UQVJHRVQgWFRfRVJST1JfVEFSR0VUCiAKIC8qIEhlbHBlciBmdW5jdGlvbnMgKi8KIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICoKQEAgLTM1NiwxMDMgKzMyMSwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIGV4dGVybiB2b2lkIGlwdF9pbml0KHZvaWQpIF9faW5pdDsKIAotc3RydWN0IGlwdF9tYXRjaAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKyNkZWZpbmUgaXB0X3JlZ2lzdGVyX3RhcmdldCh0Z3QpIHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCB0Z3QpCisjZGVmaW5lIGlwdF91bnJlZ2lzdGVyX3RhcmdldCh0Z3QpIHh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsIHRndCkKIAotCWNvbnN0IGNoYXIgbmFtZVtJUFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKKyNkZWZpbmUgaXB0X3JlZ2lzdGVyX21hdGNoKG10Y2gpIHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsIG10Y2gpCisjZGVmaW5lIGlwdF91bnJlZ2lzdGVyX21hdGNoKG10Y2gpIHh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgbXRjaCkKIAotCXVfaW50OF90IHJldmlzaW9uOworLy8jZGVmaW5lIGlwdF9yZWdpc3Rlcl90YWJsZSh0YmwsIHJlcGwpIHh0X3JlZ2lzdGVyX3RhYmxlKEFGX0lORVQsIHRibCwgcmVwbCkKKy8vI2RlZmluZSBpcHRfdW5yZWdpc3Rlcl90YWJsZSh0YmwpIHh0X3VucmVnaXN0ZXJfdGFibGUoQUZfSU5FVCwgdGJsKQogCi0JLyogUmV0dXJuIHRydWUgb3IgZmFsc2U6IHJldHVybiBGQUxTRSBhbmQgc2V0ICpob3Rkcm9wID0gMSB0bwotICAgICAgICAgICBmb3JjZSBpbW1lZGlhdGUgcGFja2V0IGRyb3AuICovCi0JLyogQXJndW1lbnRzIGNoYW5nZWQgc2luY2UgMi40LCBhcyB0aGlzIG11c3Qgbm93IGhhbmRsZQotICAgICAgICAgICBub24tbGluZWFyIHNrYnMsIHVzaW5nIHNrYl9jb3B5X2JpdHMgYW5kCi0gICAgICAgICAgIHNrYl9pcF9tYWtlX3dyaXRhYmxlLiAqLwotCWludCAoKm1hdGNoKShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLQkJICAgICBpbnQgb2Zmc2V0LAotCQkgICAgIGludCAqaG90ZHJvcCk7Ci0KLQkvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCi0JLyogU2hvdWxkIHJldHVybiB0cnVlIG9yIGZhbHNlLiAqLwotCWludCAoKmNoZWNrZW50cnkpKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JCQkgIHZvaWQgKm1hdGNoaW5mbywKLQkJCSAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCi0JCQkgIHVuc2lnbmVkIGludCBob29rX21hc2spOwotCi0JLyogQ2FsbGVkIHdoZW4gZW50cnkgb2YgdGhpcyB0eXBlIGRlbGV0ZWQuICovCi0Jdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUpOwotCi0JLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUuICovCi0Jc3RydWN0IG1vZHVsZSAqbWU7Ci19OwotCi0vKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCi1zdHJ1Y3QgaXB0X3RhcmdldAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCWNvbnN0IGNoYXIgbmFtZVtJUFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKLQotCXVfaW50OF90IHJldmlzaW9uOwotCi0JLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlOgotICAgICAgICAgICBob29rX21hc2sgaXMgYSBiaXRtYXNrIG9mIGhvb2tzIGZyb20gd2hpY2ggaXQgY2FuIGJlCi0gICAgICAgICAgIGNhbGxlZC4gKi8KLQkvKiBTaG91bGQgcmV0dXJuIHRydWUgb3IgZmFsc2UuICovCi0JaW50ICgqY2hlY2tlbnRyeSkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkJICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAotCQkJICB2b2lkICp0YXJnaW5mbywKLQkJCSAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKLQkJCSAgdW5zaWduZWQgaW50IGhvb2tfbWFzayk7Ci0KLQkvKiBDYWxsZWQgd2hlbiBlbnRyeSBvZiB0aGlzIHR5cGUgZGVsZXRlZC4gKi8KLQl2b2lkICgqZGVzdHJveSkodm9pZCAqdGFyZ2luZm8sIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUpOwotCi0JLyogUmV0dXJucyB2ZXJkaWN0LiAgQXJndW1lbnQgb3JkZXIgY2hhbmdlZCBzaW5jZSAyLjQsIGFzIHRoaXMKLSAgICAgICAgICAgbXVzdCBub3cgaGFuZGxlIG5vbi1saW5lYXIgc2ticywgdXNpbmcgc2tiX2NvcHlfYml0cyBhbmQKLSAgICAgICAgICAgc2tiX2lwX21ha2Vfd3JpdGFibGUuICovCi0JdW5zaWduZWQgaW50ICgqdGFyZ2V0KShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCi0JCQkgICAgICAgdm9pZCAqdXNlcmRhdGEpOwotCi0JLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUuICovCi0Jc3RydWN0IG1vZHVsZSAqbWU7Ci19OwotCi1leHRlcm4gaW50IGlwdF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldCk7Ci1leHRlcm4gdm9pZCBpcHRfdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldCk7Ci0KLWV4dGVybiBpbnQgaXB0X3JlZ2lzdGVyX21hdGNoKHN0cnVjdCBpcHRfbWF0Y2ggKm1hdGNoKTsKLWV4dGVybiB2b2lkIGlwdF91bnJlZ2lzdGVyX21hdGNoKHN0cnVjdCBpcHRfbWF0Y2ggKm1hdGNoKTsKLQotLyogRnVybml0dXJlIHNob3BwaW5nLi4uICovCi1zdHJ1Y3QgaXB0X3RhYmxlCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCi0JLyogQSB1bmlxdWUgbmFtZS4uLiAqLwotCWNoYXIgbmFtZVtJUFRfVEFCTEVfTUFYTkFNRUxFTl07Ci0KLQkvKiBXaGF0IGhvb2tzIHlvdSB3aWxsIGVudGVyIG9uICovCi0JdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOwotCi0JLyogTG9jayBmb3IgdGhlIGN1cnRhaW4gKi8KLQlyd2xvY2tfdCBsb2NrOwotCi0JLyogTWFuIGJlaGluZCB0aGUgY3VydGFpbi4uLiAqLwotCXN0cnVjdCBpcHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKLQotCS8qIFNldCB0byBUSElTX01PRFVMRS4gKi8KLQlzdHJ1Y3QgbW9kdWxlICptZTsKLX07CitleHRlcm4gaW50IGlwdF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfcmVwbGFjZSAqcmVwbCk7CitleHRlcm4gdm9pZCBpcHRfdW5yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSk7CiAKIC8qIG5ldC9zY2hlZC9pcHQuYzogR2ltbWUgYWNjZXNzIHRvIHlvdXIgdGFyZ2V0cyEgIEdldHMgdGFyZ2V0LT5tZS4gKi8KIGV4dGVybiBzdHJ1Y3QgaXB0X3RhcmdldCAqaXB0X2ZpbmRfdGFyZ2V0KGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKTsKQEAgLTQ3Niw5ICszNTYsNiBAQAogCXN0cnVjdCBpcHRfZXJyb3JfdGFyZ2V0IHRhcmdldDsKIH07CiAKLWV4dGVybiBpbnQgaXB0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGlwdF9yZXBsYWNlICpyZXBsKTsKLWV4dGVybiB2b2lkIGlwdF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgaXB0X2RvX3RhYmxlKHN0cnVjdCBza19idWZmICoqcHNrYiwKIAkJCQkgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKQEAgLTQ4Niw2ICszNjMsNiBAQAogCQkJCSBzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSwKIAkJCQkgdm9pZCAqdXNlcmRhdGEpOwogCi0jZGVmaW5lIElQVF9BTElHTihzKSAoKChzKSArIChfX2FsaWdub2ZfXyhzdHJ1Y3QgaXB0X2VudHJ5KS0xKSkgJiB+KF9fYWxpZ25vZl9fKHN0cnVjdCBpcHRfZW50cnkpLTEpKQorI2RlZmluZSBJUFRfQUxJR04ocykgWFRfQUxJR04ocykKICNlbmRpZiAvKl9fS0VSTkVMX18qLwogI2VuZGlmIC8qIF9JUFRBQkxFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTEFTU0lGWS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xBU1NJRlkuaAppbmRleCA3NTk2ZTNkLi5hNDZkNTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTEFTU0lGWS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NMQVNTSUZZLmgKQEAgLTEsOCArMSw3IEBACiAjaWZuZGVmIF9JUFRfQ0xBU1NJRllfSAogI2RlZmluZSBfSVBUX0NMQVNTSUZZX0gKIAotc3RydWN0IGlwdF9jbGFzc2lmeV90YXJnZXRfaW5mbyB7Ci0JdV9pbnQzMl90IHByaW9yaXR5OwotfTsKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuaD4KKyNkZWZpbmUgaXB0X2NsYXNzaWZ5X3RhcmdldF9pbmZvIHh0X2NsYXNzaWZ5X3RhcmdldF9pbmZvCiAKICNlbmRpZiAvKl9JUFRfQ0xBU1NJRllfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ09OTk1BUksuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NPTk5NQVJLLmgKaW5kZXggZDNjMDI1My4uOWVjZmVlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ09OTk1BUksuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DT05OTUFSSy5oCkBAIC05LDE3ICs5LDExIEBACiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oPgorI2RlZmluZSBJUFRfQ09OTk1BUktfU0VUCVhUX0NPTk5NQVJLX1NFVAorI2RlZmluZSBJUFRfQ09OTk1BUktfU0FWRQlYVF9DT05OTUFSS19TQVZFCisjZGVmaW5lCUlQVF9DT05OTUFSS19SRVNUT1JFCVhUX0NPTk5NQVJLX1JFU1RPUkUKIAotZW51bSB7Ci0JSVBUX0NPTk5NQVJLX1NFVCA9IDAsCi0JSVBUX0NPTk5NQVJLX1NBVkUsCi0JSVBUX0NPTk5NQVJLX1JFU1RPUkUKLX07Ci0KLXN0cnVjdCBpcHRfY29ubm1hcmtfdGFyZ2V0X2luZm8gewotCXVuc2lnbmVkIGxvbmcgbWFyazsKLQl1bnNpZ25lZCBsb25nIG1hc2s7Ci0JdV9pbnQ4X3QgbW9kZTsKLX07CisjZGVmaW5lIGlwdF9jb25ubWFya190YXJnZXRfaW5mbyB4dF9jb25ubWFya190YXJnZXRfaW5mbwogCiAjZW5kaWYgLypfSVBUX0NPTk5NQVJLX0hfdGFyZ2V0Ki8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X01BUksuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X01BUksuaAppbmRleCBmNDc0ODU3Li42OTdhNDg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9NQVJLLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTUFSSy5oCkBAIC0xLDIwICsxLDE4IEBACiAjaWZuZGVmIF9JUFRfTUFSS19IX3RhcmdldAogI2RlZmluZSBfSVBUX01BUktfSF90YXJnZXQKIAorLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG9sZCB1c2Vyc3BhY2UgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9NQVJLLmg+CisKIC8qIFZlcnNpb24gMCAqLwotc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvIHsKLQl1bnNpZ25lZCBsb25nIG1hcms7Ci19OworI2RlZmluZSBpcHRfbWFya190YXJnZXRfaW5mbyB4dF9tYXJrX3RhcmdldF9pbmZvCiAKIC8qIFZlcnNpb24gMSAqLwotZW51bSB7Ci0JSVBUX01BUktfU0VUPTAsCi0JSVBUX01BUktfQU5ELAotCUlQVF9NQVJLX09SCi19OworI2RlZmluZSBJUFRfTUFSS19TRVQJWFRfTUFSS19TRVQKKyNkZWZpbmUgSVBUX01BUktfQU5ECVhUX01BUktfQU5ECisjZGVmaW5lCUlQVF9NQVJLX09SCVhUX01BUktfT1IKIAotc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvX3YxIHsKLQl1bnNpZ25lZCBsb25nIG1hcms7Ci0JdV9pbnQ4X3QgbW9kZTsKLX07CisjZGVmaW5lIGlwdF9tYXJrX3RhcmdldF9pbmZvX3YxIHh0X21hcmtfdGFyZ2V0X2luZm9fdjEKKwogI2VuZGlmIC8qX0lQVF9NQVJLX0hfdGFyZ2V0Ki8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X05GUVVFVUUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X05GUVVFVUUuaAppbmRleCBiNWIyOTQzLi45N2EyYTc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9ORlFVRVVFLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTkZRVUVVRS5oCkBAIC04LDkgKzgsOSBAQAogI2lmbmRlZiBfSVBUX05GUV9UQVJHRVRfSAogI2RlZmluZSBfSVBUX05GUV9UQVJHRVRfSAogCi0vKiB0YXJnZXQgaW5mbyAqLwotc3RydWN0IGlwdF9ORlFfaW5mbyB7Ci0JdV9pbnQxNl90IHF1ZXVlbnVtOwotfTsKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBvbGQgdXNlcnNwYWNlICovCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaD4KKworI2RlZmluZSBpcHRfTkZRX2luZm8geHRfTkZRX2luZm8KIAogI2VuZGlmIC8qIF9JUFRfRFNDUF9UQVJHRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29tbWVudC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29tbWVudC5oCmluZGV4IDg1YzExMjMuLmFlMmFmYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2NvbW1lbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb21tZW50LmgKQEAgLTEsMTAgKzEsMTAgQEAKICNpZm5kZWYgX0lQVF9DT01NRU5UX0gKICNkZWZpbmUgX0lQVF9DT01NRU5UX0gKIAotI2RlZmluZSBJUFRfTUFYX0NPTU1FTlRfTEVOIDI1NgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb21tZW50Lmg+CiAKLXN0cnVjdCBpcHRfY29tbWVudF9pbmZvIHsKLQl1bnNpZ25lZCBjaGFyIGNvbW1lbnRbSVBUX01BWF9DT01NRU5UX0xFTl07Ci19OworI2RlZmluZSBJUFRfTUFYX0NPTU1FTlRfTEVOIFhUX01BWF9DT01NRU5UX0xFTgorCisjZGVmaW5lIGlwdF9jb21tZW50X2luZm8geHRfY29tbWVudF9pbmZvCiAKICNlbmRpZiAvKiBfSVBUX0NPTU1FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubmJ5dGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25uYnl0ZXMuaAppbmRleCA5ZTU1MzJmLi5iMDRkZmEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25uYnl0ZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25uYnl0ZXMuaApAQCAtMSwyNSArMSwxOCBAQAogI2lmbmRlZiBfSVBUX0NPTk5CWVRFU19ICiAjZGVmaW5lIF9JUFRfQ09OTkJZVEVTX0gKIAotZW51bSBpcHRfY29ubmJ5dGVzX3doYXQgewotCUlQVF9DT05OQllURVNfUEtUUywKLQlJUFRfQ09OTkJZVEVTX0JZVEVTLAotCUlQVF9DT05OQllURVNfQVZHUEtULAotfTsKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5oPgorI2RlZmluZSBpcHRfY29ubmJ5dGVzX3doYXQgeHRfY29ubmJ5dGVzX3doYXQKIAotZW51bSBpcHRfY29ubmJ5dGVzX2RpcmVjdGlvbiB7Ci0JSVBUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUwsCi0JSVBUX0NPTk5CWVRFU19ESVJfUkVQTFksCi0JSVBUX0NPTk5CWVRFU19ESVJfQk9USCwKLX07CisjZGVmaW5lIElQVF9DT05OQllURVNfUEtUUwlYVF9DT05OQllURVNfUEFDS0VUUworI2RlZmluZSBJUFRfQ09OTkJZVEVTX0JZVEVTCVhUX0NPTk5CWVRFU19CWVRFUworI2RlZmluZSBJUFRfQ09OTkJZVEVTX0FWR1BLVAlYVF9DT05OQllURVNfQVZHUEtUCiAKLXN0cnVjdCBpcHRfY29ubmJ5dGVzX2luZm8KLXsKLQlzdHJ1Y3QgewotCQlhbGlnbmVkX3U2NCBmcm9tOwkvKiBjb3VudCB0byBiZSBtYXRjaGVkICovCi0JCWFsaWduZWRfdTY0IHRvOwkJLyogY291bnQgdG8gYmUgbWF0Y2hlZCAqLwotCX0gY291bnQ7Ci0JdV9pbnQ4X3Qgd2hhdDsJCS8qIGlwdF9jb25uYnl0ZXNfd2hhdCAqLwotCXVfaW50OF90IGRpcmVjdGlvbjsJLyogaXB0X2Nvbm5ieXRlc19kaXJlY3Rpb24gKi8KLX07CisjZGVmaW5lIGlwdF9jb25uYnl0ZXNfZGlyZWN0aW9uIAl4dF9jb25uYnl0ZXNfZGlyZWN0aW9uCisjZGVmaW5lIElQVF9DT05OQllURVNfRElSX09SSUdJTkFMIAlYVF9DT05OQllURVNfRElSX09SSUdJTkFMCisjZGVmaW5lIElQVF9DT05OQllURVNfRElSX1JFUExZIAlYVF9DT05OQllURVNfRElSX1JFUExZCisjZGVmaW5lIElQVF9DT05OQllURVNfRElSX0JPVEgJCVhUX0NPTk5CWVRFU19ESVJfQk9USAorCisjZGVmaW5lIGlwdF9jb25uYnl0ZXNfaW5mbyB4dF9jb25uYnl0ZXNfaW5mbworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm5tYXJrLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25ubWFyay5oCmluZGV4IDQ2NTczMjcuLmM3YmE2NTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm5tYXJrLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubm1hcmsuaApAQCAtMSwxOCArMSw3IEBACiAjaWZuZGVmIF9JUFRfQ09OTk1BUktfSAogI2RlZmluZSBfSVBUX0NPTk5NQVJLX0gKIAotLyogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDQgTUFSQSBTeXN0ZW1zIEFCIDxodHRwOi8vd3d3Lm1hcmFzeXN0ZW1zLmNvbT4KLSAqIGJ5IEhlbnJpayBOb3Jkc3Ryb20gPGhub0BtYXJhc3lzdGVtcy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi1zdHJ1Y3QgaXB0X2Nvbm5tYXJrX2luZm8gewotCXVuc2lnbmVkIGxvbmcgbWFyaywgbWFzazsKLQl1X2ludDhfdCBpbnZlcnQ7Ci19OworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb25ubWFyay5oPgorI2RlZmluZSBpcHRfY29ubm1hcmtfaW5mbyB4dF9jb25ubWFya19pbmZvCiAKICNlbmRpZiAvKl9JUFRfQ09OTk1BUktfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25udHJhY2suaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm50cmFjay5oCmluZGV4IDQxM2M1NjUuLmNkZTY3NjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm50cmFjay5oCkBAIC01LDU2ICs1LDI0IEBACiAjaWZuZGVmIF9JUFRfQ09OTlRSQUNLX0gKICNkZWZpbmUgX0lQVF9DT05OVFJBQ0tfSAogCi0jZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbykgKDEgPDwgKChjdGluZm8pJUlQX0NUX0lTX1JFUExZKzEpKQotI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQgKDEgPDwgMCkKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmg+CiAKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9TTkFUICgxIDw8IChJUF9DVF9OVU1CRVIgKyAxKSkKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9ETkFUICgxIDw8IChJUF9DVF9OVU1CRVIgKyAyKSkKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQgKDEgPDwgKElQX0NUX05VTUJFUiArIDMpKQorI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pIFhUX0NPTk5UUkFDS19TVEFURV9CSVQoY3RpbmZvKQorI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQgCVhUX0NPTk5UUkFDS19TVEFURV9JTlZBTElECisKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9TTkFUIAlYVF9DT05OVFJBQ0tfU1RBVEVfU05BVAorI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFX0ROQVQJWFRfQ09OTlRSQUNLX1NUQVRFX0ROQVQKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQJWFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRAogCiAvKiBmbGFncywgaW52ZmxhZ3M6ICovCi0jZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVEUJMHgwMQotI2RlZmluZSBJUFRfQ09OTlRSQUNLX1BST1RPCTB4MDIKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19PUklHU1JDCTB4MDQKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19PUklHRFNUCTB4MDgKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19SRVBMU1JDCTB4MTAKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19SRVBMRFNUCTB4MjAKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFUVVMJMHg0MAotI2RlZmluZSBJUFRfQ09OTlRSQUNLX0VYUElSRVMJMHg4MAorI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFCQlYVF9DT05OVFJBQ0tfU1RBVEUKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19QUk9UTwkJWFRfQ09OTlRSQUNLX1BST1RPCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfT1JJR1NSQwkJWFRfQ09OTlRSQUNLX09SSUdTUkMKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19PUklHRFNUCQlYVF9DT05OVFJBQ0tfT1JJR0RTVAorI2RlZmluZSBJUFRfQ09OTlRSQUNLX1JFUExTUkMJCVhUX0NPTk5UUkFDS19SRVBMU1JDCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfUkVQTERTVAkJWFRfQ09OTlRSQUNLX1JFUExEU1QKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFUVVMJCVhUX0NPTk5UUkFDS19TVEFUVVMKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19FWFBJUkVTCQlYVF9DT05OVFJBQ0tfRVhQSVJFUwogCi0vKiBUaGlzIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlLCBzbyByZW1haW5zIGZyb3plbiBpbiB0aW1lLiAqLwotc3RydWN0IGlwX2Nvbm50cmFja19vbGRfdHVwbGUKLXsKLQlzdHJ1Y3QgewotCQlfX3UzMiBpcDsKLQkJdW5pb24gewotCQkJX191MTYgYWxsOwotCQl9IHU7Ci0JfSBzcmM7Ci0KLQlzdHJ1Y3QgewotCQlfX3UzMiBpcDsKLQkJdW5pb24gewotCQkJX191MTYgYWxsOwotCQl9IHU7Ci0KLQkJLyogVGhlIHByb3RvY29sLiAqLwotCQl1MTYgcHJvdG9udW07Ci0JfSBkc3Q7Ci19OwotCi1zdHJ1Y3QgaXB0X2Nvbm50cmFja19pbmZvCi17Ci0JdW5zaWduZWQgaW50IHN0YXRlbWFzaywgc3RhdHVzbWFzazsKLQotCXN0cnVjdCBpcF9jb25udHJhY2tfb2xkX3R1cGxlIHR1cGxlW0lQX0NUX0RJUl9NQVhdOwotCXN0cnVjdCBpbl9hZGRyIHNpcG1za1tJUF9DVF9ESVJfTUFYXSwgZGlwbXNrW0lQX0NUX0RJUl9NQVhdOwotCi0JdW5zaWduZWQgbG9uZyBleHBpcmVzX21pbiwgZXhwaXJlc19tYXg7Ci0KLQkvKiBGbGFncyB3b3JkICovCi0JdV9pbnQ4X3QgZmxhZ3M7Ci0JLyogSW52ZXJzZSBmbGFncyAqLwotCXVfaW50OF90IGludmZsYWdzOwotfTsKKyNkZWZpbmUgaXB0X2Nvbm50cmFja19pbmZvCQl4dF9jb25udHJhY2tfaW5mbwogI2VuZGlmIC8qX0lQVF9DT05OVFJBQ0tfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9kY2NwLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9kY2NwLmgKaW5kZXggM2NiM2E1Mi4uZTcwZDExZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZGNjcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2RjY3AuaApAQCAtMSwyMyArMSwxNSBAQAogI2lmbmRlZiBfSVBUX0RDQ1BfSF8KICNkZWZpbmUgX0lQVF9EQ0NQX0hfCiAKLSNkZWZpbmUgSVBUX0RDQ1BfU1JDX1BPUlRTCSAgICAgICAgMHgwMQotI2RlZmluZSBJUFRfRENDUF9ERVNUX1BPUlRTCSAgICAgICAgMHgwMgotI2RlZmluZSBJUFRfRENDUF9UWVBFCQkJMHgwNAotI2RlZmluZSBJUFRfRENDUF9PUFRJT04JCQkweDA4CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2RjY3AuaD4KKyNkZWZpbmUgSVBUX0RDQ1BfU1JDX1BPUlRTCVhUX0RDQ1BfU1JDX1BPUlRTCisjZGVmaW5lIElQVF9EQ0NQX0RFU1RfUE9SVFMJWFRfRENDUF9ERVNUX1BPUlRTCisjZGVmaW5lIElQVF9EQ0NQX1RZUEUJCVhUX0RDQ1BfVFlQRQorI2RlZmluZSBJUFRfRENDUF9PUFRJT04JCVhUX0RDQ1BfT1BUSU9OCiAKLSNkZWZpbmUgSVBUX0RDQ1BfVkFMSURfRkxBR1MJCTB4MGYKKyNkZWZpbmUgSVBUX0RDQ1BfVkFMSURfRkxBR1MgCVhUX0RDQ1BfVkFMSURfRkxBR1MKIAotc3RydWN0IGlwdF9kY2NwX2luZm8gewotCXVfaW50MTZfdCBkcHRzWzJdOyAgLyogTWluLCBNYXggKi8KLQl1X2ludDE2X3Qgc3B0c1syXTsgIC8qIE1pbiwgTWF4ICovCi0KLQl1X2ludDE2X3QgZmxhZ3M7Ci0JdV9pbnQxNl90IGludmZsYWdzOwotCi0JdV9pbnQxNl90IHR5cGVtYXNrOwotCXVfaW50OF90IG9wdGlvbjsKLX07CisjZGVmaW5lIGlwdF9kY2NwX2luZm8geHRfZGNjcF9pbmZvCiAKICNlbmRpZiAvKiBfSVBUX0RDQ1BfSF8gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaGVscGVyLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oZWxwZXIuaAppbmRleCA2ZjEyZWNiLi44MDQ1MmMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oZWxwZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oZWxwZXIuaApAQCAtMSw4ICsxLDcgQEAKICNpZm5kZWYgX0lQVF9IRUxQRVJfSAogI2RlZmluZSBfSVBUX0hFTFBFUl9ICiAKLXN0cnVjdCBpcHRfaGVscGVyX2luZm8gewotCWludCBpbnZlcnQ7Ci0JY2hhciBuYW1lWzMwXTsKLX07CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oPgorI2RlZmluZSBpcHRfaGVscGVyX2luZm8geHRfaGVscGVyX2luZm8KKwogI2VuZGlmIC8qIF9JUFRfSEVMUEVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xlbmd0aC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGVuZ3RoLmgKaW5kZXggNmUwODg1Mi4uOWI0NTIwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGVuZ3RoLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGVuZ3RoLmgKQEAgLTEsOSArMSw3IEBACiAjaWZuZGVmIF9JUFRfTEVOR1RIX0gKICNkZWZpbmUgX0lQVF9MRU5HVEhfSAogCi1zdHJ1Y3QgaXB0X2xlbmd0aF9pbmZvIHsKLSAgICB1X2ludDE2X3QJbWluLCBtYXg7Ci0gICAgdV9pbnQ4X3QJaW52ZXJ0OwotfTsKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmg+CisjZGVmaW5lIGlwdF9sZW5ndGhfaW5mbyB4dF9sZW5ndGhfaW5mbwogCiAjZW5kaWYgLypfSVBUX0xFTkdUSF9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xpbWl0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9saW1pdC5oCmluZGV4IDI1NjQ1MzQuLjkyZjVjZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xpbWl0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGltaXQuaApAQCAtMSwyMSArMSw4IEBACiAjaWZuZGVmIF9JUFRfUkFURV9ICiAjZGVmaW5lIF9JUFRfUkFURV9ICiAKLS8qIHRpbWluZ3MgYXJlIGluIG1pbGxpc2Vjb25kcy4gKi8KLSNkZWZpbmUgSVBUX0xJTUlUX1NDQUxFIDEwMDAwCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2xpbWl0Lmg+CisjZGVmaW5lIElQVF9MSU1JVF9TQ0FMRSBYVF9MSU1JVF9TQ0FMRQorI2RlZmluZSBpcHRfcmF0ZWluZm8geHRfcmF0ZWluZm8KIAotLyogMS8xMCwwMDAgc2VjIHBlcmlvZCA9PiBtYXggb2YgMTAsMDAwL3NlYy4gIE1pbiByYXRlIGlzIHRoZW4gNDI5NDkwCi0gICBzZWNvbmRzLCBvciBvbmUgZXZlcnkgNTkgaG91cnMuICovCi1zdHJ1Y3QgaXB0X3JhdGVpbmZvIHsKLQl1X2ludDMyX3QgYXZnOyAgICAvKiBBdmVyYWdlIHNlY3MgYmV0d2VlbiBwYWNrZXRzICogc2NhbGUgKi8KLQl1X2ludDMyX3QgYnVyc3Q7ICAvKiBQZXJpb2QgbXVsdGlwbGllciBmb3IgdXBwZXIgbGltaXQuICovCi0KLQkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLwotCXVuc2lnbmVkIGxvbmcgcHJldjsKLQl1X2ludDMyX3QgY3JlZGl0OwotCXVfaW50MzJfdCBjcmVkaXRfY2FwLCBjb3N0OwotCi0JLyogVWdseSwgdWdseSBmdWNrZXIuICovCi0Jc3RydWN0IGlwdF9yYXRlaW5mbyAqbWFzdGVyOwotfTsKICNlbmRpZiAvKl9JUFRfUkFURV9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hYy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFjLmgKaW5kZXggZjhkNWI4ZS4uYjE4NjAwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFjLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFjLmgKQEAgLTEsOCArMSw3IEBACiAjaWZuZGVmIF9JUFRfTUFDX0gKICNkZWZpbmUgX0lQVF9NQUNfSAogCi1zdHJ1Y3QgaXB0X21hY19pbmZvIHsKLSAgICB1bnNpZ25lZCBjaGFyIHNyY2FkZHJbRVRIX0FMRU5dOwotICAgIGludCBpbnZlcnQ7Ci19OworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9tYWMuaD4KKyNkZWZpbmUgaXB0X21hY19pbmZvIHh0X21hY19pbmZvCisKICNlbmRpZiAvKl9JUFRfTUFDX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFyay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFyay5oCmluZGV4IGYzOTUyYjUuLmJmZGU2N2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hcmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9tYXJrLmgKQEAgLTEsOSArMSw5IEBACiAjaWZuZGVmIF9JUFRfTUFSS19ICiAjZGVmaW5lIF9JUFRfTUFSS19ICiAKLXN0cnVjdCBpcHRfbWFya19pbmZvIHsKLSAgICB1bnNpZ25lZCBsb25nIG1hcmssIG1hc2s7Ci0gICAgdV9pbnQ4X3QgaW52ZXJ0OwotfTsKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBvbGQgdXNlcnNwYWNlICovCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X21hcmsuaD4KKworI2RlZmluZSBpcHRfbWFya19pbmZvIHh0X21hcmtfaW5mbwogCiAjZW5kaWYgLypfSVBUX01BUktfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9waHlzZGV2LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9waHlzZGV2LmgKaW5kZXggNzUzOGM4Ni4uMjQwMGU3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGh5c2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BoeXNkZXYuaApAQCAtMSwyNCArMSwxNyBAQAogI2lmbmRlZiBfSVBUX1BIWVNERVZfSAogI2RlZmluZSBfSVBUX1BIWVNERVZfSAogCi0jaWZkZWYgX19LRVJORUxfXwotI2luY2x1ZGUgPGxpbnV4L2lmLmg+Ci0jZW5kaWYKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBvbGQgdXNlcnNwYWNlICovCiAKLSNkZWZpbmUgSVBUX1BIWVNERVZfT1BfSU4JCTB4MDEKLSNkZWZpbmUgSVBUX1BIWVNERVZfT1BfT1VUCQkweDAyCi0jZGVmaW5lIElQVF9QSFlTREVWX09QX0JSSURHRUQJCTB4MDQKLSNkZWZpbmUgSVBUX1BIWVNERVZfT1BfSVNJTgkJMHgwOAotI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9JU09VVAkJMHgxMAotI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9NQVNLCQkoMHgyMCAtIDEpCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuaD4KIAotc3RydWN0IGlwdF9waHlzZGV2X2luZm8gewotCWNoYXIgcGh5c2luZGV2W0lGTkFNU0laXTsKLQljaGFyIGluX21hc2tbSUZOQU1TSVpdOwotCWNoYXIgcGh5c291dGRldltJRk5BTVNJWl07Ci0JY2hhciBvdXRfbWFza1tJRk5BTVNJWl07Ci0JdV9pbnQ4X3QgaW52ZXJ0OwotCXVfaW50OF90IGJpdG1hc2s7Ci19OworI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9JTgkJWFRfUEhZU0RFVl9PUF9JTgorI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9PVVQJCVhUX1BIWVNERVZfT1BfT1VUCisjZGVmaW5lIElQVF9QSFlTREVWX09QX0JSSURHRUQJCVhUX1BIWVNERVZfT1BfQlJJREdFRAorI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9JU0lOCQlYVF9QSFlTREVWX09QX0lTSU4KKyNkZWZpbmUgSVBUX1BIWVNERVZfT1BfSVNPVVQJCVhUX1BIWVNERVZfT1BfSVNPVVQKKyNkZWZpbmUgSVBUX1BIWVNERVZfT1BfTUFTSwkJWFRfUEhZU0RFVl9PUF9NQVNLCisKKyNkZWZpbmUgaXB0X3BoeXNkZXZfaW5mbyB4dF9waHlzZGV2X2luZm8KIAogI2VuZGlmIC8qX0lQVF9QSFlTREVWX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGt0dHlwZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGt0dHlwZS5oCmluZGV4IGQ1M2E2NTguLmZmMWZiYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BrdHR5cGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9wa3R0eXBlLmgKQEAgLTEsOCArMSw3IEBACiAjaWZuZGVmIF9JUFRfUEtUVFlQRV9ICiAjZGVmaW5lIF9JUFRfUEtUVFlQRV9ICiAKLXN0cnVjdCBpcHRfcGt0dHlwZV9pbmZvIHsKLQlpbnQJcGt0dHlwZTsKLQlpbnQJaW52ZXJ0OwotfTsKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5oPgorI2RlZmluZSBpcHRfcGt0dHlwZV9pbmZvIHh0X3BrdHR5cGVfaW5mbworCiAjZW5kaWYgLypfSVBUX1BLVFRZUEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWFsbS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVhbG0uaAppbmRleCBhNGQ2Njk4Li5iMzk5NmVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWFsbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3JlYWxtLmgKQEAgLTEsMTAgKzEsNyBAQAogI2lmbmRlZiBfSVBUX1JFQUxNX0gKICNkZWZpbmUgX0lQVF9SRUFMTV9ICiAKLXN0cnVjdCBpcHRfcmVhbG1faW5mbyB7Ci0JdV9pbnQzMl90IGlkOwotCXVfaW50MzJfdCBtYXNrOwotCXVfaW50OF90IGludmVydDsKLX07CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmg+CisjZGVmaW5lIGlwdF9yZWFsbV9pbmZvIHh0X3JlYWxtX2luZm8KIAogI2VuZGlmIC8qIF9JUFRfUkVBTE1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfc3RhdGUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3N0YXRlLmgKaW5kZXggNWRmMzc4Ni4uYTQ0YTk5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfc3RhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdGF0ZS5oCkBAIC0xLDEzICsxLDE1IEBACiAjaWZuZGVmIF9JUFRfU1RBVEVfSAogI2RlZmluZSBfSVBUX1NUQVRFX0gKIAotI2RlZmluZSBJUFRfU1RBVEVfQklUKGN0aW5mbykgKDEgPDwgKChjdGluZm8pJUlQX0NUX0lTX1JFUExZKzEpKQotI2RlZmluZSBJUFRfU1RBVEVfSU5WQUxJRCAoMSA8PCAwKQorLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG9sZCB1c2Vyc3BhY2UgKi8KIAotI2RlZmluZSBJUFRfU1RBVEVfVU5UUkFDS0VEICgxIDw8IChJUF9DVF9OVU1CRVIgKyAxKSkKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfc3RhdGUuaD4KIAotc3RydWN0IGlwdF9zdGF0ZV9pbmZvCi17Ci0JdW5zaWduZWQgaW50IHN0YXRlbWFzazsKLX07CisjZGVmaW5lIElQVF9TVEFURV9CSVQJCVhUX1NUQVRFX0JJVAorI2RlZmluZSBJUFRfU1RBVEVfSU5WQUxJRAlYVF9TVEFURV9JTlZBTElECisKKyNkZWZpbmUgSVBUX1NUQVRFX1VOVFJBQ0tFRAlYVF9TVEFURV9VTlRSQUNLRUQKKworI2RlZmluZSBpcHRfc3RhdGVfaW5mbwkJeHRfc3RhdGVfaW5mbworCiAjZW5kaWYgLypfSVBUX1NUQVRFX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfc3RyaW5nLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdHJpbmcuaAppbmRleCBhMjY1ZjZlLi5jMjZkZTMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdHJpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdHJpbmcuaApAQCAtMSwxOCArMSwxMCBAQAogI2lmbmRlZiBfSVBUX1NUUklOR19ICiAjZGVmaW5lIF9JUFRfU1RSSU5HX0gKIAotI2RlZmluZSBJUFRfU1RSSU5HX01BWF9QQVRURVJOX1NJWkUgMTI4Ci0jZGVmaW5lIElQVF9TVFJJTkdfTUFYX0FMR09fTkFNRV9TSVpFIDE2CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3N0cmluZy5oPgogCi1zdHJ1Y3QgaXB0X3N0cmluZ19pbmZvCi17Ci0JdV9pbnQxNl90IGZyb21fb2Zmc2V0OwotCXVfaW50MTZfdCB0b19vZmZzZXQ7Ci0JY2hhcgkgIGFsZ29bSVBUX1NUUklOR19NQVhfQUxHT19OQU1FX1NJWkVdOwotCWNoYXIgCSAgcGF0dGVybltJUFRfU1RSSU5HX01BWF9QQVRURVJOX1NJWkVdOwotCXVfaW50OF90ICBwYXRsZW47Ci0JdV9pbnQ4X3QgIGludmVydDsKLQlzdHJ1Y3QgdHNfY29uZmlnIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKSAqY29uZmlnOwotfTsKKyNkZWZpbmUgSVBUX1NUUklOR19NQVhfUEFUVEVSTl9TSVpFIFhUX1NUUklOR19NQVhfUEFUVEVSTl9TSVpFCisjZGVmaW5lIElQVF9TVFJJTkdfTUFYX0FMR09fTkFNRV9TSVpFIFhUX1NUUklOR19NQVhfQUxHT19OQU1FX1NJWkUKKyNkZWZpbmUgaXB0X3N0cmluZ19pbmZvIHh0X3N0cmluZ19pbmZvCiAKICNlbmRpZiAvKl9JUFRfU1RSSU5HX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfdGNwbXNzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90Y3Btc3MuaAppbmRleCBlMmIxNDM5Li4xOGJiYzhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90Y3Btc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90Y3Btc3MuaApAQCAtMSw5ICsxLDcgQEAKICNpZm5kZWYgX0lQVF9UQ1BNU1NfTUFUQ0hfSAogI2RlZmluZSBfSVBUX1RDUE1TU19NQVRDSF9ICiAKLXN0cnVjdCBpcHRfdGNwbXNzX21hdGNoX2luZm8gewotICAgIHVfaW50MTZfdCBtc3NfbWluLCBtc3NfbWF4OwotICAgIHVfaW50OF90IGludmVydDsKLX07CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcG1zcy5oPgorI2RlZmluZSBpcHRfdGNwbXNzX21hdGNoX2luZm8geHRfdGNwbXNzX21hdGNoX2luZm8KIAogI2VuZGlmIC8qX0lQVF9UQ1BNU1NfTUFUQ0hfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oCmluZGV4IGMxNjNiYTMuLmYyNDliNTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oCkBAIC0yNSw4ICsyNSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KIAotI2RlZmluZSBJUDZUX0ZVTkNUSU9OX01BWE5BTUVMRU4gMzAKLSNkZWZpbmUgSVA2VF9UQUJMRV9NQVhOQU1FTEVOIDMyCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKKyNkZWZpbmUgSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOIFhUX0ZVTkNUSU9OX01BWE5BTUVMRU4KKyNkZWZpbmUgSVA2VF9UQUJMRV9NQVhOQU1FTEVOIFhUX1RBQkxFX01BWE5BTUVMRU4KKworI2RlZmluZSBpcDZ0X21hdGNoIHh0X21hdGNoCisjZGVmaW5lIGlwNnRfdGFyZ2V0IHh0X3RhcmdldAorI2RlZmluZSBpcDZ0X3RhYmxlIHh0X3RhYmxlCisjZGVmaW5lIGlwNnRfZ2V0X3JldmlzaW9uIHh0X2dldF9yZXZpc2lvbgogCiAvKiBZZXMsIFZpcmdpbmlhLCB5b3UgaGF2ZSB0byB6ZXJvIHRoZSBwYWRkaW5nLiAqLwogc3RydWN0IGlwNnRfaXA2IHsKQEAgLTEwNCwxMCArMTExLDcgQEAKIAlpbnQgdmVyZGljdDsKIH07CiAKLXN0cnVjdCBpcDZ0X2NvdW50ZXJzCi17Ci0JdV9pbnQ2NF90IHBjbnQsIGJjbnQ7CQkJLyogUGFja2V0IGFuZCBieXRlIGNvdW50ZXJzICovCi19OworI2RlZmluZSBpcDZ0X2NvdW50ZXJzCXh0X2NvdW50ZXJzCiAKIC8qIFZhbHVlcyBmb3IgImZsYWciIGZpZWxkIGluIHN0cnVjdCBpcDZ0X2lwNiAoZ2VuZXJhbCBpcDYgc3RydWN0dXJlKS4gKi8KICNkZWZpbmUgSVA2VF9GX1BST1RPCQkweDAxCS8qIFNldCBpZiBydWxlIGNhcmVzIGFib3V0IHVwcGVyIApAQCAtMTIzLDcgKzEyNyw3IEBACiAjZGVmaW5lIElQNlRfSU5WX1NSQ0lQCQkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgU1JDIElQLiAqLwogI2RlZmluZSBJUDZUX0lOVl9EU1RJUAkJMHgxMAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIERTVCBPUC4gKi8KICNkZWZpbmUgSVA2VF9JTlZfRlJBRwkJMHgyMAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIEZSQUcuICovCi0jZGVmaW5lIElQNlRfSU5WX1BST1RPCQkweDQwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgUFJPVE8uICovCisjZGVmaW5lIElQNlRfSU5WX1BST1RPCQlYVF9JTlZfUFJPVE8KICNkZWZpbmUgSVA2VF9JTlZfTUFTSwkJMHg3RgkvKiBBbGwgcG9zc2libGUgZmxhZyBiaXRzIG1hc2suICovCiAKIC8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgZWFjaCBvZiB0aGUgZmlyZXdhbGwgcnVsZXMuICBDb25zaXN0cyBvZiAzCkBAIC0xNDUsNyArMTQ5LDcgQEAKIAl1bnNpZ25lZCBpbnQgY29tZWZyb207CiAKIAkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMuICovCi0Jc3RydWN0IGlwNnRfY291bnRlcnMgY291bnRlcnM7CisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzOwogCiAJLyogVGhlIG1hdGNoZXMgKGlmIGFueSksIHRoZW4gdGhlIHRhcmdldC4gKi8KIAl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdOwpAQCAtMTU1LDU0ICsxNTksNDEgQEAKICAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCiAgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlCiAgKiBhIHJhdyBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4gKi8KLSNkZWZpbmUgSVA2VF9CQVNFX0NUTAkJCTY0CS8qIGJhc2UgZm9yIGZpcmV3YWxsIHNvY2tldCBvcHRpb25zICovCisjZGVmaW5lIElQNlRfQkFTRV9DVEwJCQlYVF9CQVNFX0NUTAogCi0jZGVmaW5lIElQNlRfU09fU0VUX1JFUExBQ0UJCShJUDZUX0JBU0VfQ1RMKQotI2RlZmluZSBJUDZUX1NPX1NFVF9BRERfQ09VTlRFUlMJKElQNlRfQkFTRV9DVEwgKyAxKQotI2RlZmluZSBJUDZUX1NPX1NFVF9NQVgJCQlJUDZUX1NPX1NFVF9BRERfQ09VTlRFUlMKKyNkZWZpbmUgSVA2VF9TT19TRVRfUkVQTEFDRQkJWFRfU09fU0VUX1JFUExBQ0UKKyNkZWZpbmUgSVA2VF9TT19TRVRfQUREX0NPVU5URVJTCVhUX1NPX1NFVF9BRERfQ09VTlRFUlMKKyNkZWZpbmUgSVA2VF9TT19TRVRfTUFYCQkJWFRfU09fU0VUX01BWAogCi0jZGVmaW5lIElQNlRfU09fR0VUX0lORk8JCShJUDZUX0JBU0VfQ1RMKQotI2RlZmluZSBJUDZUX1NPX0dFVF9FTlRSSUVTCQkoSVA2VF9CQVNFX0NUTCArIDEpCi0jZGVmaW5lCUlQNlRfU09fR0VUX1JFVklTSU9OX01BVENICShJUDZUX0JBU0VfQ1RMICsgMikKLSNkZWZpbmUJSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShJUDZUX0JBU0VfQ1RMICsgMykKLSNkZWZpbmUgSVA2VF9TT19HRVRfTUFYCQkJSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCisjZGVmaW5lIElQNlRfU09fR0VUX0lORk8JCVhUX1NPX0dFVF9JTkZPCisjZGVmaW5lIElQNlRfU09fR0VUX0VOVFJJRVMJCVhUX1NPX0dFVF9FTlRSSUVTCisjZGVmaW5lCUlQNlRfU09fR0VUX1JFVklTSU9OX01BVENICVhUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAorI2RlZmluZQlJUDZUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAorI2RlZmluZSBJUDZUX1NPX0dFVF9NQVgJCQlYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCiAKIC8qIENPTlRJTlVFIHZlcmRpY3QgZm9yIHRhcmdldHMgKi8KLSNkZWZpbmUgSVA2VF9DT05USU5VRSAweEZGRkZGRkZGCisjZGVmaW5lIElQNlRfQ09OVElOVUUgWFRfQ09OVElOVUUKIAogLyogRm9yIHN0YW5kYXJkIHRhcmdldCAqLwotI2RlZmluZSBJUDZUX1JFVFVSTiAoLU5GX1JFUEVBVCAtIDEpCisjZGVmaW5lIElQNlRfUkVUVVJOIFhUX1JFVFVSTgogCi0vKiBUQ1AgbWF0Y2hpbmcgc3R1ZmYgKi8KLXN0cnVjdCBpcDZ0X3RjcAotewotCXVfaW50MTZfdCBzcHRzWzJdOwkJCS8qIFNvdXJjZSBwb3J0IHJhbmdlLiAqLwotCXVfaW50MTZfdCBkcHRzWzJdOwkJCS8qIERlc3RpbmF0aW9uIHBvcnQgcmFuZ2UuICovCi0JdV9pbnQ4X3Qgb3B0aW9uOwkJCS8qIFRDUCBPcHRpb24gaWZmIG5vbi16ZXJvKi8KLQl1X2ludDhfdCBmbGdfbWFzazsJCQkvKiBUQ1AgZmxhZ3MgbWFzayBieXRlICovCi0JdV9pbnQ4X3QgZmxnX2NtcDsJCQkvKiBUQ1AgZmxhZ3MgY29tcGFyZSBieXRlICovCi0JdV9pbnQ4X3QgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLwotfTsKKy8qIFRDUC9VRFAgbWF0Y2hpbmcgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmg+CisKKyNkZWZpbmUgaXA2dF90Y3AgeHRfdGNwCisjZGVmaW5lIGlwNnRfdWRwIHh0X3VkcAogCiAvKiBWYWx1ZXMgZm9yICJpbnYiIGZpZWxkIGluIHN0cnVjdCBpcHRfdGNwLiAqLwotI2RlZmluZSBJUDZUX1RDUF9JTlZfU1JDUFQJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNvdXJjZSBwb3J0cy4gKi8KLSNkZWZpbmUgSVA2VF9UQ1BfSU5WX0RTVFBUCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBkZXN0IHBvcnRzLiAqLwotI2RlZmluZSBJUDZUX1RDUF9JTlZfRkxBR1MJMHgwNAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFRDUCBmbGFncy4gKi8KLSNkZWZpbmUgSVA2VF9UQ1BfSU5WX09QVElPTgkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygb3B0aW9uIHRlc3QuICovCi0jZGVmaW5lIElQNlRfVENQX0lOVl9NQVNLCTB4MEYJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLwotCi0vKiBVRFAgbWF0Y2hpbmcgc3R1ZmYgKi8KLXN0cnVjdCBpcDZ0X3VkcAotewotCXVfaW50MTZfdCBzcHRzWzJdOwkJCS8qIFNvdXJjZSBwb3J0IHJhbmdlLiAqLwotCXVfaW50MTZfdCBkcHRzWzJdOwkJCS8qIERlc3RpbmF0aW9uIHBvcnQgcmFuZ2UuICovCi0JdV9pbnQ4X3QgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLwotfTsKKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX1NSQ1BUCVhUX1RDUF9JTlZfU1JDUFQKKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX0RTVFBUCVhUX1RDUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX0ZMQUdTCVhUX1RDUF9JTlZfRkxBR1MKKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX09QVElPTglYVF9UQ1BfSU5WX09QVElPTgorI2RlZmluZSBJUDZUX1RDUF9JTlZfTUFTSwlYVF9UQ1BfSU5WX01BU0sKIAogLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCBpcHRfdWRwLiAqLwotI2RlZmluZSBJUDZUX1VEUF9JTlZfU1JDUFQJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNvdXJjZSBwb3J0cy4gKi8KLSNkZWZpbmUgSVA2VF9VRFBfSU5WX0RTVFBUCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBkZXN0IHBvcnRzLiAqLwotI2RlZmluZSBJUDZUX1VEUF9JTlZfTUFTSwkweDAzCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKyNkZWZpbmUgSVA2VF9VRFBfSU5WX1NSQ1BUCVhUX1VEUF9JTlZfU1JDUFQKKyNkZWZpbmUgSVA2VF9VRFBfSU5WX0RTVFBUCVhUX1VEUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVA2VF9VRFBfSU5WX01BU0sJWFRfVURQX0lOVl9NQVNLCiAKIC8qIElDTVAgbWF0Y2hpbmcgc3R1ZmYgKi8KIHN0cnVjdCBpcDZ0X2ljbXAKQEAgLTI2NCwyMyArMjU1LDE0IEBACiAJLyogTnVtYmVyIG9mIGNvdW50ZXJzIChtdXN0IGJlIGVxdWFsIHRvIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMpLiAqLwogCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CiAJLyogVGhlIG9sZCBlbnRyaWVzJyBjb3VudGVycy4gKi8KLQlzdHJ1Y3QgaXA2dF9jb3VudGVycyBfX3VzZXIgKmNvdW50ZXJzOworCXN0cnVjdCB4dF9jb3VudGVycyBfX3VzZXIgKmNvdW50ZXJzOwogCiAJLyogVGhlIGVudHJpZXMgKGhhbmcgb2ZmIGVuZDogbm90IHJlYWxseSBhbiBhcnJheSkuICovCiAJc3RydWN0IGlwNnRfZW50cnkgZW50cmllc1swXTsKIH07CiAKIC8qIFRoZSBhcmd1bWVudCB0byBJUDZUX1NPX0FERF9DT1VOVEVSUy4gKi8KLXN0cnVjdCBpcDZ0X2NvdW50ZXJzX2luZm8KLXsKLQkvKiBXaGljaCB0YWJsZS4gKi8KLQljaGFyIG5hbWVbSVA2VF9UQUJMRV9NQVhOQU1FTEVOXTsKLQotCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7Ci0KLQkvKiBUaGUgY291bnRlcnMgKGFjdHVhbGx5IGBudW1iZXInIG9mIHRoZXNlKS4gKi8KLQlzdHJ1Y3QgaXA2dF9jb3VudGVycyBjb3VudGVyc1swXTsKLX07CisjZGVmaW5lIGlwNnRfY291bnRlcnNfaW5mbyB4dF9jb3VudGVyc19pbmZvCiAKIC8qIFRoZSBhcmd1bWVudCB0byBJUDZUX1NPX0dFVF9FTlRSSUVTLiAqLwogc3RydWN0IGlwNnRfZ2V0X2VudHJpZXMKQEAgLTI5NSwxOSArMjc3LDEwIEBACiAJc3RydWN0IGlwNnRfZW50cnkgZW50cnl0YWJsZVswXTsKIH07CiAKLS8qIFRoZSBhcmd1bWVudCB0byBJUDZUX1NPX0dFVF9SRVZJU0lPTl8qLiAgUmV0dXJucyBoaWdoZXN0IHJldmlzaW9uCi0gKiBrZXJuZWwgc3VwcG9ydHMsIGlmID49IHJldmlzaW9uLiAqLwotc3RydWN0IGlwNnRfZ2V0X3JldmlzaW9uCi17Ci0JY2hhciBuYW1lW0lQNlRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKLQotCXVfaW50OF90IHJldmlzaW9uOwotfTsKLQogLyogU3RhbmRhcmQgcmV0dXJuIHZlcmRpY3QsIG9yIGRvIGp1bXAuICovCi0jZGVmaW5lIElQNlRfU1RBTkRBUkRfVEFSR0VUICIiCisjZGVmaW5lIElQNlRfU1RBTkRBUkRfVEFSR0VUIFhUX1NUQU5EQVJEX1RBUkdFVAogLyogRXJyb3IgdmVyZGljdC4gKi8KLSNkZWZpbmUgSVA2VF9FUlJPUl9UQVJHRVQgIkVSUk9SIgorI2RlZmluZSBJUDZUX0VSUk9SX1RBUkdFVCBYVF9FUlJPUl9UQVJHRVQKIAogLyogSGVscGVyIGZ1bmN0aW9ucyAqLwogc3RhdGljIF9faW5saW5lX18gc3RydWN0IGlwNnRfZW50cnlfdGFyZ2V0ICoKQEAgLTM2MSwxMDQgKzMzNCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIGV4dGVybiB2b2lkIGlwNnRfaW5pdCh2b2lkKSBfX2luaXQ7CiAKLXN0cnVjdCBpcDZ0X21hdGNoCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OworI2RlZmluZSBpcDZ0X3JlZ2lzdGVyX3RhcmdldCh0Z3QpIHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgdGd0KQorI2RlZmluZSBpcDZ0X3VucmVnaXN0ZXJfdGFyZ2V0KHRndCkgeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsIHRndCkKIAotCWNvbnN0IGNoYXIgbmFtZVtJUDZUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07Ci0KLQl1X2ludDhfdCByZXZpc2lvbjsKLQotCS8qIFJldHVybiB0cnVlIG9yIGZhbHNlOiByZXR1cm4gRkFMU0UgYW5kIHNldCAqaG90ZHJvcCA9IDEgdG8KLSAgICAgICAgICAgZm9yY2UgaW1tZWRpYXRlIHBhY2tldCBkcm9wLiAqLwotCS8qIEFyZ3VtZW50cyBjaGFuZ2VkIHNpbmNlIDIuNi45LCBhcyB0aGlzIG11c3Qgbm93IGhhbmRsZQotCSAgIG5vbi1saW5lYXIgc2tiLCB1c2luZyBza2JfaGVhZGVyX3BvaW50ZXIgYW5kCi0JICAgc2tiX2lwX21ha2Vfd3JpdGFibGUuICovCi0JaW50ICgqbWF0Y2gpKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCSAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICAgIGludCBvZmZzZXQsCi0JCSAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0JCSAgICAgaW50ICpob3Rkcm9wKTsKLQotCS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KLQkvKiBTaG91bGQgcmV0dXJuIHRydWUgb3IgZmFsc2UuICovCi0JaW50ICgqY2hlY2tlbnRyeSkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkJICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAotCQkJICB2b2lkICptYXRjaGluZm8sCi0JCQkgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAotCQkJICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKTsKLQotCS8qIENhbGxlZCB3aGVuIGVudHJ5IG9mIHRoaXMgdHlwZSBkZWxldGVkLiAqLwotCXZvaWQgKCpkZXN0cm95KSh2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplKTsKLQotCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFIGlmIHlvdSBhcmUgYSBtb2R1bGUsIG90aGVyd2lzZSBOVUxMICovCi0Jc3RydWN0IG1vZHVsZSAqbWU7Ci19OwotCi0vKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCi1zdHJ1Y3QgaXA2dF90YXJnZXQKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQljb25zdCBjaGFyIG5hbWVbSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOLTFdOwotCi0JdV9pbnQ4X3QgcmV2aXNpb247Ci0KLQkvKiBSZXR1cm5zIHZlcmRpY3QuIEFyZ3VtZW50IG9yZGVyIGNoYW5nZWQgc2luY2UgMi42LjksIGFzIHRoaXMKLQkgICBtdXN0IG5vdyBoYW5kbGUgbm9uLWxpbmVhciBza2JzLCB1c2luZyBza2JfY29weV9iaXRzIGFuZAotCSAgIHNrYl9pcF9tYWtlX3dyaXRhYmxlLiAqLwotCXVuc2lnbmVkIGludCAoKnRhcmdldCkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAotCQkJICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKLQotCS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZToKLSAgICAgICAgICAgaG9va19tYXNrIGlzIGEgYml0bWFzayBvZiBob29rcyBmcm9tIHdoaWNoIGl0IGNhbiBiZQotICAgICAgICAgICBjYWxsZWQuICovCi0JLyogU2hvdWxkIHJldHVybiB0cnVlIG9yIGZhbHNlLiAqLwotCWludCAoKmNoZWNrZW50cnkpKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSAgY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUsCi0JCQkgIHZvaWQgKnRhcmdpbmZvLAotCQkJICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAotCQkJICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKTsKLQotCS8qIENhbGxlZCB3aGVuIGVudHJ5IG9mIHRoaXMgdHlwZSBkZWxldGVkLiAqLwotCXZvaWQgKCpkZXN0cm95KSh2b2lkICp0YXJnaW5mbywgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSk7Ci0KLQkvKiBTZXQgdGhpcyB0byBUSElTX01PRFVMRSBpZiB5b3UgYXJlIGEgbW9kdWxlLCBvdGhlcndpc2UgTlVMTCAqLwotCXN0cnVjdCBtb2R1bGUgKm1lOwotfTsKLQotZXh0ZXJuIGludCBpcDZ0X3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgaXA2dF90YXJnZXQgKnRhcmdldCk7Ci1leHRlcm4gdm9pZCBpcDZ0X3VucmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCBpcDZ0X3RhcmdldCAqdGFyZ2V0KTsKLQotZXh0ZXJuIGludCBpcDZ0X3JlZ2lzdGVyX21hdGNoKHN0cnVjdCBpcDZ0X21hdGNoICptYXRjaCk7Ci1leHRlcm4gdm9pZCBpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goc3RydWN0IGlwNnRfbWF0Y2ggKm1hdGNoKTsKLQotLyogRnVybml0dXJlIHNob3BwaW5nLi4uICovCi1zdHJ1Y3QgaXA2dF90YWJsZQotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCS8qIEEgdW5pcXVlIG5hbWUuLi4gKi8KLQljaGFyIG5hbWVbSVA2VF9UQUJMRV9NQVhOQU1FTEVOXTsKLQotCS8qIFdoYXQgaG9va3MgeW91IHdpbGwgZW50ZXIgb24gKi8KLQl1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3M7Ci0KLQkvKiBMb2NrIGZvciB0aGUgY3VydGFpbiAqLwotCXJ3bG9ja190IGxvY2s7Ci0KLQkvKiBNYW4gYmVoaW5kIHRoZSBjdXJ0YWluLi4uICovCi0Jc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKLQotCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFIGlmIHlvdSBhcmUgYSBtb2R1bGUsIG90aGVyd2lzZSBOVUxMICovCi0Jc3RydWN0IG1vZHVsZSAqbWU7Ci19OworI2RlZmluZSBpcDZ0X3JlZ2lzdGVyX21hdGNoKG1hdGNoKSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgbWF0Y2gpCisjZGVmaW5lIGlwNnRfdW5yZWdpc3Rlcl9tYXRjaChtYXRjaCkgeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgbWF0Y2gpCiAKIGV4dGVybiBpbnQgaXA2dF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXA2dF90YWJsZSAqdGFibGUsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfcmVwbGFjZSAqcmVwbCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTUFSSy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X01BUksuaAppbmRleCA3YWRlOGQ4Li43Y2Y2MjlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTUFSSy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9NQVJLLmgKQEAgLTEsOCArMSw5IEBACiAjaWZuZGVmIF9JUDZUX01BUktfSF90YXJnZXQKICNkZWZpbmUgX0lQNlRfTUFSS19IX3RhcmdldAogCi1zdHJ1Y3QgaXA2dF9tYXJrX3RhcmdldF9pbmZvIHsKLQl1bnNpZ25lZCBsb25nIG1hcms7Ci19OworLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG9sZCB1c2Vyc3BhY2UgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfTUFSSy5oPgogCi0jZW5kaWYgLypfSVBUX01BUktfSF90YXJnZXQqLworI2RlZmluZSBpcDZ0X21hcmtfdGFyZ2V0X2luZm8geHRfbWFya190YXJnZXRfaW5mbworCisjZW5kaWYgLypfSVA2VF9NQVJLX0hfdGFyZ2V0Ki8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9sZW5ndGguaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9sZW5ndGguaAppbmRleCA3ZmMwOWY5Li45ZTk2ODlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbGVuZ3RoLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2xlbmd0aC5oCkBAIC0xLDEwICsxLDggQEAKICNpZm5kZWYgX0lQNlRfTEVOR1RIX0gKICNkZWZpbmUgX0lQNlRfTEVOR1RIX0gKIAotc3RydWN0IGlwNnRfbGVuZ3RoX2luZm8gewotCXVfaW50MTZfdCAgbWluLCBtYXg7Ci0JdV9pbnQ4X3QgICBpbnZlcnQ7Ci19OworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9sZW5ndGguaD4KKyNkZWZpbmUgaXA2dF9sZW5ndGhfaW5mbyB4dF9sZW5ndGhfaW5mbwogCiAjZW5kaWYgLypfSVA2VF9MRU5HVEhfSCovCiAJCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbGltaXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9saW1pdC5oCmluZGV4IGYyODY2ZTUuLjQ4N2U1ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9saW1pdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9saW1pdC5oCkBAIC0xLDIxICsxLDggQEAKICNpZm5kZWYgX0lQNlRfUkFURV9ICiAjZGVmaW5lIF9JUDZUX1JBVEVfSAogCi0vKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCi0jZGVmaW5lIElQNlRfTElNSVRfU0NBTEUgMTAwMDAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaD4KKyNkZWZpbmUgSVA2VF9MSU1JVF9TQ0FMRSBYVF9MSU1JVF9TQ0FMRQorI2RlZmluZSBpcDZ0X3JhdGVpbmZvIHh0X3JhdGVpbmZvCiAKLS8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAotICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLwotc3RydWN0IGlwNnRfcmF0ZWluZm8gewotCXVfaW50MzJfdCBhdmc7ICAgIC8qIEF2ZXJhZ2Ugc2VjcyBiZXR3ZWVuIHBhY2tldHMgKiBzY2FsZSAqLwotCXVfaW50MzJfdCBidXJzdDsgIC8qIFBlcmlvZCBtdWx0aXBsaWVyIGZvciB1cHBlciBsaW1pdC4gKi8KLQotCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCi0JdW5zaWduZWQgbG9uZyBwcmV2OwotCXVfaW50MzJfdCBjcmVkaXQ7Ci0JdV9pbnQzMl90IGNyZWRpdF9jYXAsIGNvc3Q7Ci0KLQkvKiBVZ2x5LCB1Z2x5IGZ1Y2tlci4gKi8KLQlzdHJ1Y3QgaXA2dF9yYXRlaW5mbyAqbWFzdGVyOwotfTsKLSNlbmRpZiAvKl9JUFRfUkFURV9IKi8KKyNlbmRpZiAvKl9JUDZUX1JBVEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWFjLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWFjLmgKaW5kZXggODdjMDg4Yy4uYWM1OGU4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tYWMuaApAQCAtMSw4ICsxLDcgQEAKICNpZm5kZWYgX0lQNlRfTUFDX0gKICNkZWZpbmUgX0lQNlRfTUFDX0gKIAotc3RydWN0IGlwNnRfbWFjX2luZm8gewotICAgIHVuc2lnbmVkIGNoYXIgc3JjYWRkcltFVEhfQUxFTl07Ci0gICAgaW50IGludmVydDsKLX07Ci0jZW5kaWYgLypfSVBUX01BQ19IKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbWFjLmg+CisjZGVmaW5lIGlwNnRfbWFjX2luZm8geHRfbWFjX2luZm8KKworI2VuZGlmIC8qX0lQNlRfTUFDX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hcmsuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tYXJrLmgKaW5kZXggYTczNDQ0MS4uZmYyMDQ5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hcmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWFyay5oCkBAIC0xLDkgKzEsOSBAQAogI2lmbmRlZiBfSVA2VF9NQVJLX0gKICNkZWZpbmUgX0lQNlRfTUFSS19ICiAKLXN0cnVjdCBpcDZ0X21hcmtfaW5mbyB7Ci0gICAgdW5zaWduZWQgbG9uZyBtYXJrLCBtYXNrOwotICAgIHVfaW50OF90IGludmVydDsKLX07CisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igb2xkIHVzZXJzcGFjZSAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9tYXJrLmg+CisKKyNkZWZpbmUgaXA2dF9tYXJrX2luZm8geHRfbWFya19pbmZvCiAKICNlbmRpZiAvKl9JUFRfTUFSS19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9waHlzZGV2LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcGh5c2Rldi5oCmluZGV4IGMyMzQ3MzEuLmMxNjFjMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9waHlzZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3BoeXNkZXYuaApAQCAtMSwyNCArMSwxNyBAQAogI2lmbmRlZiBfSVA2VF9QSFlTREVWX0gKICNkZWZpbmUgX0lQNlRfUEhZU0RFVl9ICiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvaWYuaD4KLSNlbmRpZgorLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG9sZCB1c2Vyc3BhY2UgKi8KIAotI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSU4JCTB4MDEKLSNkZWZpbmUgSVA2VF9QSFlTREVWX09QX09VVAkJMHgwMgotI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfQlJJREdFRAkJMHgwNAotI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSVNJTgkJMHgwOAotI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSVNPVVQJCTB4MTAKLSNkZWZpbmUgSVA2VF9QSFlTREVWX09QX01BU0sJCSgweDIwIC0gMSkKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5oPgogCi1zdHJ1Y3QgaXA2dF9waHlzZGV2X2luZm8gewotCWNoYXIgcGh5c2luZGV2W0lGTkFNU0laXTsKLQljaGFyIGluX21hc2tbSUZOQU1TSVpdOwotCWNoYXIgcGh5c291dGRldltJRk5BTVNJWl07Ci0JY2hhciBvdXRfbWFza1tJRk5BTVNJWl07Ci0JdV9pbnQ4X3QgaW52ZXJ0OwotCXVfaW50OF90IGJpdG1hc2s7Ci19OworI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSU4JCVhUX1BIWVNERVZfT1BfSU4KKyNkZWZpbmUgSVA2VF9QSFlTREVWX09QX09VVAkJWFRfUEhZU0RFVl9PUF9PVVQKKyNkZWZpbmUgSVA2VF9QSFlTREVWX09QX0JSSURHRUQJCVhUX1BIWVNERVZfT1BfQlJJREdFRAorI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSVNJTgkJWFRfUEhZU0RFVl9PUF9JU0lOCisjZGVmaW5lIElQNlRfUEhZU0RFVl9PUF9JU09VVAkJWFRfUEhZU0RFVl9PUF9JU09VVAorI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfTUFTSwkJWFRfUEhZU0RFVl9PUF9NQVNLCisKKyNkZWZpbmUgaXA2dF9waHlzZGV2X2luZm8geHRfcGh5c2Rldl9pbmZvCiAKICNlbmRpZiAvKl9JUDZUX1BIWVNERVZfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IDdmYjM5N2UuLjU0MDMyNTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC0xODEsNiArMTgxLDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfRkM5MjlYCTB4MDYyNgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV9GQzkzOVgJMHgwNjQyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJX0ZDOTQ5WAkweDA2NDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfRkM5NDlFUwkweDA2NDYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfRkM5MTlYCTB4MDYyOAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05DUl9ZRUxMT1dGSU4JMHgwNzAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJXzYxQzEwMgkweDA5MDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJvY19mcy5oIGIvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKaW5kZXggNzQ0ODhlNC4uYWE2MzIyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKQEAgLTE0Niw2ICsxNDYsMTEgQEAKIGV4dGVybiB2b2lkIHByb2NfZGV2aWNlX3RyZWVfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHByb2NfZGV2aWNlX3RyZWVfYWRkX25vZGUoc3RydWN0IGRldmljZV9ub2RlICosIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKTsKIGV4dGVybiB2b2lkIHByb2NfZGV2aWNlX3RyZWVfYWRkX3Byb3Aoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUsIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCk7CitleHRlcm4gdm9pZCBwcm9jX2RldmljZV90cmVlX3JlbW92ZV9wcm9wKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlLAorCQkJCQkgc3RydWN0IHByb3BlcnR5ICpwcm9wKTsKK2V4dGVybiB2b2lkIHByb2NfZGV2aWNlX3RyZWVfdXBkYXRlX3Byb3Aoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUsCisJCQkJCSBzdHJ1Y3QgcHJvcGVydHkgKm5ld3Byb3AsCisJCQkJCSBzdHJ1Y3QgcHJvcGVydHkgKm9sZHByb3ApOwogI2VuZGlmIC8qIENPTkZJR19QUk9DX0RFVklDRVRSRUUgKi8KIAogZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19zeW1saW5rKGNvbnN0IGNoYXIgKiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZF9jbGFzcy5oIGIvaW5jbHVkZS9saW51eC9yYWlkX2NsYXNzLmgKaW5kZXggNDg4MzFlYS4uZDBkZDM4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkX2NsYXNzLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkX2NsYXNzLmgKQEAgLTMxLDkgKzMxLDExIEBACiAJUkFJRF9MRVZFTF9MSU5FQVIsCiAJUkFJRF9MRVZFTF8wLAogCVJBSURfTEVWRUxfMSwKKwlSQUlEX0xFVkVMXzEwLAogCVJBSURfTEVWRUxfMywKIAlSQUlEX0xFVkVMXzQsCiAJUkFJRF9MRVZFTF81LAorCVJBSURfTEVWRUxfNTAsCiAJUkFJRF9MRVZFTF82LAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IGE3MmUxNzEuLjJkZjFhMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTE2MCw2ICsxNjAsNyBAQAogI2RlZmluZSBTQ0hFRF9OT1JNQUwJCTAKICNkZWZpbmUgU0NIRURfRklGTwkJMQogI2RlZmluZSBTQ0hFRF9SUgkJMgorI2RlZmluZSBTQ0hFRF9CQVRDSAkJMwogCiBzdHJ1Y3Qgc2NoZWRfcGFyYW0gewogCWludCBzY2hlZF9wcmlvcml0eTsKQEAgLTQ3MCw5ICs0NzEsOSBAQAogCiAvKgogICogUHJpb3JpdHkgb2YgYSBwcm9jZXNzIGdvZXMgZnJvbSAwLi5NQVhfUFJJTy0xLCB2YWxpZCBSVAotICogcHJpb3JpdHkgaXMgMC4uTUFYX1JUX1BSSU8tMSwgYW5kIFNDSEVEX05PUk1BTCB0YXNrcyBhcmUKLSAqIGluIHRoZSByYW5nZSBNQVhfUlRfUFJJTy4uTUFYX1BSSU8tMS4gUHJpb3JpdHkgdmFsdWVzCi0gKiBhcmUgaW52ZXJ0ZWQ6IGxvd2VyIHAtPnByaW8gdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5LgorICogcHJpb3JpdHkgaXMgMC4uTUFYX1JUX1BSSU8tMSwgYW5kIFNDSEVEX05PUk1BTC9TQ0hFRF9CQVRDSAorICogdGFza3MgYXJlIGluIHRoZSByYW5nZSBNQVhfUlRfUFJJTy4uTUFYX1BSSU8tMS4gUHJpb3JpdHkKKyAqIHZhbHVlcyBhcmUgaW52ZXJ0ZWQ6IGxvd2VyIHAtPnByaW8gdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5LgogICoKICAqIFRoZSBNQVhfVVNFUl9SVF9QUklPIHZhbHVlIGFsbG93cyB0aGUgYWN0dWFsIG1heGltdW0KICAqIFJUIHByaW9yaXR5IHRvIGJlIHNlcGFyYXRlIGZyb20gdGhlIHZhbHVlIGV4cG9ydGVkIHRvCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmgKaW5kZXggYzNlNTk4Mi4uYzA1N2YwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc2htZW1fZnMuaApAQCAtMjYsNiArMjYsOCBAQAogCXVuc2lnbmVkIGxvbmcgZnJlZV9ibG9ja3M7ICAvKiBIb3cgbWFueSBhcmUgbGVmdCBmb3IgYWxsb2NhdGlvbiAqLwogCXVuc2lnbmVkIGxvbmcgbWF4X2lub2RlczsgICAvKiBIb3cgbWFueSBpbm9kZXMgYXJlIGFsbG93ZWQgKi8KIAl1bnNpZ25lZCBsb25nIGZyZWVfaW5vZGVzOyAgLyogSG93IG1hbnkgYXJlIGxlZnQgZm9yIGFsbG9jYXRpb24gKi8KKwlpbnQgcG9saWN5OwkJICAgIC8qIERlZmF1bHQgTlVNQSBtZW1vcnkgYWxsb2MgcG9saWN5ICovCisJbm9kZW1hc2tfdCBwb2xpY3lfbm9kZXM7ICAgIC8qIG5vZGVtYXNrIGZvciBwcmVmZXJyZWQgYW5kIGJpbmQgKi8KIAlzcGlubG9ja190ICAgIHN0YXRfbG9jazsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc21iX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3NtYl9mcy5oCmluZGV4IGM0MTUzMTIuLjYyMWEzZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21iX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbWJfZnMuaApAQCAtNTgsNTMgKzU4LDYgQEAKIC8qIHdoZXJlIHRvIGZpbmQgdGhlIGJhc2Ugb2YgdGhlIFNNQiBwYWNrZXQgcHJvcGVyICovCiAjZGVmaW5lIHNtYl9iYXNlKGJ1ZikgKCh1OCAqKSgoKHU4ICopKGJ1ZikpKzQpKQogCi0jaWZkZWYgREVCVUdfU01CX01BTExPQwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi1leHRlcm4gaW50IHNtYl9tYWxsb2NlZDsKLWV4dGVybiBpbnQgc21iX2N1cnJlbnRfdm1hbGxvY2VkOwotZXh0ZXJuIGludCBzbWJfY3VycmVudF9rbWFsbG9jZWQ7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqCi1zbWJfdm1hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLSAgICAgICAgc21iX21hbGxvY2VkICs9IDE7Ci0gICAgICAgIHNtYl9jdXJyZW50X3ZtYWxsb2NlZCArPSAxOwotICAgICAgICByZXR1cm4gdm1hbGxvYyhzaXplKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1zbWJfdmZyZWUodm9pZCAqb2JqKQotewotICAgICAgICBzbWJfY3VycmVudF92bWFsbG9jZWQgLT0gMTsKLSAgICAgICAgdmZyZWUob2JqKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICoKLXNtYl9rbWFsbG9jKHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCi17Ci0Jc21iX21hbGxvY2VkICs9IDE7Ci0Jc21iX2N1cnJlbnRfa21hbGxvY2VkICs9IDE7Ci0JcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNtYl9rZnJlZSh2b2lkICpvYmopCi17Ci0Jc21iX2N1cnJlbnRfa21hbGxvY2VkIC09IDE7Ci0Ja2ZyZWUob2JqKTsKLX0KLQotI2Vsc2UgLyogREVCVUdfU01CX01BTExPQyAqLwotCi0jZGVmaW5lIHNtYl9rbWFsbG9jKHMscCkJa21hbGxvYyhzLHApCi0jZGVmaW5lIHNtYl9rZnJlZShvKQkJa2ZyZWUobykKLSNkZWZpbmUgc21iX3ZtYWxsb2MocykJCXZtYWxsb2MocykKLSNkZWZpbmUgc21iX3ZmcmVlKG8pCQl2ZnJlZShvKQotCi0jZW5kaWYgLyogREVCVUdfU01CX01BTExPQyAqLwotCiAvKgogICogRmxhZ3MgZm9yIHRoZSBpbi1tZW1vcnkgaW5vZGUKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaCBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKaW5kZXggOWY0MDE5MS4uYjAyZGRhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCkBAIC0xODYsNiArMTg2LDcgQEAKICNkZWZpbmUgQUZfUFBQT1gJMjQJLyogUFBQb1ggc29ja2V0cwkJKi8KICNkZWZpbmUgQUZfV0FOUElQRQkyNQkvKiBXYW5waXBlIEFQSSBTb2NrZXRzICovCiAjZGVmaW5lIEFGX0xMQwkJMjYJLyogTGludXggTExDCQkJKi8KKyNkZWZpbmUgQUZfVElQQwkJMzAJLyogVElQQyBzb2NrZXRzCQkJKi8KICNkZWZpbmUgQUZfQkxVRVRPT1RICTMxCS8qIEJsdWV0b290aCBzb2NrZXRzIAkJKi8KICNkZWZpbmUgQUZfTUFYCQkzMgkvKiBGb3Igbm93Li4gKi8KIApAQCAtMjE4LDYgKzIxOSw3IEBACiAjZGVmaW5lIFBGX1BQUE9YCUFGX1BQUE9YCiAjZGVmaW5lIFBGX1dBTlBJUEUJQUZfV0FOUElQRQogI2RlZmluZSBQRl9MTEMJCUFGX0xMQworI2RlZmluZSBQRl9USVBDCQlBRl9USVBDCiAjZGVmaW5lIFBGX0JMVUVUT09USAlBRl9CTFVFVE9PVEgKICNkZWZpbmUgUEZfTUFYCQlBRl9NQVgKIApAQCAtMjc5LDYgKzI4MSw3IEBACiAjZGVmaW5lIFNPTF9MTEMJCTI2OAogI2RlZmluZSBTT0xfRENDUAkyNjkKICNkZWZpbmUgU09MX05FVExJTksJMjcwCisjZGVmaW5lIFNPTF9USVBDCTI3MQogCiAvKiBJUFggb3B0aW9ucyAqLwogI2RlZmluZSBJUFhfVFlQRQkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9hZHM3ODQ2LmggYi9pbmNsdWRlL2xpbnV4L3NwaS9hZHM3ODQ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIyNjFlMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL2Fkczc4NDYuaApAQCAtMCwwICsxLDE4IEBACisvKiBsaW51eC9zcGkvYWRzNzg0Ni5oICovCisKKy8qIFRvdWNoc2NyZWVuIGNoYXJhY3RlcmlzdGljcyB2YXJ5IGJldHdlZW4gYm9hcmRzIGFuZCBtb2RlbHMuICBUaGUKKyAqIHBsYXRmb3JtX2RhdGEgZm9yIHRoZSBkZXZpY2UncyAic3RydWN0IGRldmljZSIgaG9sZHMgdGhpcyBpbmZvcm1hdGlvbi4KKyAqCisgKiBJdCdzIE9LIGlmIHRoZSBtaW4vbWF4IHZhbHVlcyBhcmUgemVyby4KKyAqLworc3RydWN0IGFkczc4NDZfcGxhdGZvcm1fZGF0YSB7CisJdTE2CW1vZGVsOwkJCS8qIDc4NDMsIDc4NDUsIDc4NDYuICovCisJdTE2CXZyZWZfZGVsYXlfdXNlY3M7CS8qIDAgZm9yIGV4dGVybmFsIHZyZWY7IGV0YyAqLworCXUxNgl4X3BsYXRlX29obXM7CisJdTE2CXlfcGxhdGVfb2htczsKKworCXUxNgl4X21pbiwgeF9tYXg7CisJdTE2CXlfbWluLCB5X21heDsKKwl1MTYJcHJlc3N1cmVfbWluLCBwcmVzc3VyZV9tYXg7Cit9OworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9mbGFzaC5oIGIvaW5jbHVkZS9saW51eC9zcGkvZmxhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjIyOTMyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvZmxhc2guaApAQCAtMCwwICsxLDMxIEBACisjaWZuZGVmIExJTlVYX1NQSV9GTEFTSF9ICisjZGVmaW5lIExJTlVYX1NQSV9GTEFTSF9ICisKK3N0cnVjdCBtdGRfcGFydGl0aW9uOworCisvKioKKyAqIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhOiBib2FyZC1zcGVjaWZpYyBmbGFzaCBkYXRhCisgKiBAbmFtZTogb3B0aW9uYWwgZmxhc2ggZGV2aWNlIG5hbWUgKGVnLCBhcyB1c2VkIHdpdGggbXRkcGFydHM9KQorICogQHBhcnRzOiBvcHRpb25hbCBhcnJheSBvZiBtdGRfcGFydGl0aW9ucyBmb3Igc3RhdGljIHBhcnRpdGlvbmluZworICogQG5yX3BhcnRzOiBudW1iZXIgb2YgbXRkX3BhcnRpdGlvbnMgZm9yIHN0YXRpYyBwYXJ0aXRvbmluZworICogQHR5cGU6IG9wdGlvbmFsIGZsYXNoIGRldmljZSB0eXBlIChlLmcuIG0yNXA4MCB2cyBtMjVwNjQpLCBmb3IgdXNlCisgKgl3aXRoIGNoaXBzIHRoYXQgY2FuJ3QgYmUgcXVlcmllZCBmb3IgSkVERUMgb3Igb3RoZXIgSURzCisgKgorICogQm9hcmQgaW5pdCBjb2RlIChpbiBhcmNoLy4uLi9tYWNoLXh4eC9ib2FyZC15eXkuYyBmaWxlcykgY2FuCisgKiBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IFNQSSBmbGFzaCBwYXJ0cyAoc3VjaCBhcyBEYXRhRmxhc2gpIHRvCisgKiBoZWxwIHNldCB1cCB0aGUgZGV2aWNlIGFuZCBpdHMgYXBwcm9wcmlhdGUgZGVmYXVsdCBwYXJ0aXRpb25pbmcuCisgKgorICogTm90ZSB0aGF0IGZvciBEYXRhRmxhc2gsIHNpemVzIGZvciBwYWdlcywgYmxvY2tzLCBhbmQgc2VjdG9ycyBhcmUKKyAqIHJhcmVseSBwb3dlcnMgb2YgdHdvOyBhbmQgcGFydGl0aW9ucyBzaG91bGQgYmUgc2VjdG9yLWFsaWduZWQuCisgKi8KK3N0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIHsKKwljaGFyCQkqbmFtZTsKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CisJdW5zaWduZWQgaW50CW5yX3BhcnRzOworCisJY2hhcgkJKnR5cGU7CisKKwkvKiB3ZSdsbCBsaWtlbHkgYWRkIG1vcmUgLi4uIHVzZSBKRURFQyBJRHMsIGV0YyAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaCBiL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWYxNDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaApAQCAtMCwwICsxLDY2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9TUElfSAorI2RlZmluZSBfX0xJTlVYX1NQSV9ICisKKy8qCisgKiBJTlRFUkZBQ0VTIGJldHdlZW4gU1BJIG1hc3Rlci1zaWRlIGRyaXZlcnMgYW5kIFNQSSBpbmZyYXN0cnVjdHVyZS4KKyAqIChUaGVyZSdzIG5vIFNQSSBzbGF2ZSBzdXBwb3J0IGZvciBMaW51eCB5ZXQuLi4pCisgKi8KK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgc3BpX2J1c190eXBlOworCisvKioKKyAqIHN0cnVjdCBzcGlfZGV2aWNlIC0gTWFzdGVyIHNpZGUgcHJveHkgZm9yIGFuIFNQSSBzbGF2ZSBkZXZpY2UKKyAqIEBkZXY6IERyaXZlciBtb2RlbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGV2aWNlLgorICogQG1hc3RlcjogU1BJIGNvbnRyb2xsZXIgdXNlZCB3aXRoIHRoZSBkZXZpY2UuCisgKiBAbWF4X3NwZWVkX2h6OiBNYXhpbXVtIGNsb2NrIHJhdGUgdG8gYmUgdXNlZCB3aXRoIHRoaXMgY2hpcAorICoJKG9uIHRoaXMgYm9hcmQpOyBtYXkgYmUgY2hhbmdlZCBieSB0aGUgZGV2aWNlJ3MgZHJpdmVyLgorICogQGNoaXAtc2VsZWN0OiBDaGlwc2VsZWN0LCBkaXN0aW5ndWlzaGluZyBjaGlwcyBoYW5kbGVkIGJ5ICJtYXN0ZXIiLgorICogQG1vZGU6IFRoZSBzcGkgbW9kZSBkZWZpbmVzIGhvdyBkYXRhIGlzIGNsb2NrZWQgb3V0IGFuZCBpbi4KKyAqCVRoaXMgbWF5IGJlIGNoYW5nZWQgYnkgdGhlIGRldmljZSdzIGRyaXZlci4KKyAqIEBiaXRzX3Blcl93b3JkOiBEYXRhIHRyYW5zZmVycyBpbnZvbHZlIG9uZSBvciBtb3JlIHdvcmRzOyB3b3JkIHNpemVzCisgKiAJbGlrZSBlaWdodCBvciAxMiBiaXRzIGFyZSBjb21tb24uICBJbi1tZW1vcnkgd29yZHNpemVzIGFyZQorICoJcG93ZXJzIG9mIHR3byBieXRlcyAoZS5nLiAyMCBiaXQgc2FtcGxlcyB1c2UgMzIgYml0cykuCisgKglUaGlzIG1heSBiZSBjaGFuZ2VkIGJ5IHRoZSBkZXZpY2UncyBkcml2ZXIuCisgKiBAaXJxOiBOZWdhdGl2ZSwgb3IgdGhlIG51bWJlciBwYXNzZWQgdG8gcmVxdWVzdF9pcnEoKSB0byByZWNlaXZlCisgKiAJaW50ZXJydXB0cyBmcm9tIHRoaXMgZGV2aWNlLgorICogQGNvbnRyb2xsZXJfc3RhdGU6IENvbnRyb2xsZXIncyBydW50aW1lIHN0YXRlCisgKiBAY29udHJvbGxlcl9kYXRhOiBCb2FyZC1zcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgY29udHJvbGxlciwgc3VjaCBhcworICogCUZJRk8gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyczsgZnJvbSBib2FyZF9pbmZvLmNvbnRyb2xsZXJfZGF0YQorICoKKyAqIEFuIHNwaV9kZXZpY2UgaXMgdXNlZCB0byBpbnRlcmNoYW5nZSBkYXRhIGJldHdlZW4gYW4gU1BJIHNsYXZlCisgKiAodXN1YWxseSBhIGRpc2NyZXRlIGNoaXApIGFuZCBDUFUgbWVtb3J5LgorICoKKyAqIEluICJkZXYiLCB0aGUgcGxhdGZvcm1fZGF0YSBpcyB1c2VkIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcworICogZGV2aWNlIHRoYXQncyBtZWFuaW5nZnVsIHRvIHRoZSBkZXZpY2UncyBwcm90b2NvbCBkcml2ZXIsIGJ1dCBub3QKKyAqIHRvIGl0cyBjb250cm9sbGVyLiAgT25lIGV4YW1wbGUgbWlnaHQgYmUgYW4gaWRlbnRpZmllciBmb3IgYSBjaGlwCisgKiB2YXJpYW50IHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IGZ1bmN0aW9uYWxpdHkuCisgKi8KK3N0cnVjdCBzcGlfZGV2aWNlIHsKKwlzdHJ1Y3QgZGV2aWNlCQlkZXY7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwl1MzIJCQltYXhfc3BlZWRfaHo7CisJdTgJCQljaGlwX3NlbGVjdDsKKwl1OAkJCW1vZGU7CisjZGVmaW5lCVNQSV9DUEhBCTB4MDEJCQkvKiBjbG9jayBwaGFzZSAqLworI2RlZmluZQlTUElfQ1BPTAkweDAyCQkJLyogY2xvY2sgcG9sYXJpdHkgKi8KKyNkZWZpbmUJU1BJX01PREVfMAkoMHwwKQkJCS8qIChvcmlnaW5hbCBNaWNyb1dpcmUpICovCisjZGVmaW5lCVNQSV9NT0RFXzEJKDB8U1BJX0NQSEEpCisjZGVmaW5lCVNQSV9NT0RFXzIJKFNQSV9DUE9MfDApCisjZGVmaW5lCVNQSV9NT0RFXzMJKFNQSV9DUE9MfFNQSV9DUEhBKQorI2RlZmluZQlTUElfQ1NfSElHSAkweDA0CQkJLyogY2hpcHNlbGVjdCBhY3RpdmUgaGlnaD8gKi8KKwl1OAkJCWJpdHNfcGVyX3dvcmQ7CisJaW50CQkJaXJxOworCXZvaWQJCQkqY29udHJvbGxlcl9zdGF0ZTsKKwl2b2lkCQkJKmNvbnRyb2xsZXJfZGF0YTsKKwljb25zdCBjaGFyCQkqbW9kYWxpYXM7CisKKwkvLyBsaWtlbHkgbmVlZCBtb3JlIGhvb2tzIGZvciBtb3JlIHByb3RvY29sIG9wdGlvbnMgYWZmZWN0aW5nIGhvdworCS8vIHRoZSBjb250cm9sbGVyIHRhbGtzIHRvIGVhY2ggY2hpcCwgbGlrZToKKwkvLyAgLSBiaXQgb3JkZXIgKGRlZmF1bHQgaXMgd29yZHdpc2UgbXNiLWZpcnN0KQorCS8vICAtIG1lbW9yeSBwYWNraW5nICgxMiBiaXQgc2FtcGxlcyBpbnRvIGxvdyBiaXRzLCBvdGhlcnMgemVyb2VkKQorCS8vICAtIHByaW9yaXR5CisJLy8gIC0gZHJvcCBjaGlwc2VsZWN0IGFmdGVyIGVhY2ggd29yZAorCS8vICAtIGNoaXBzZWxlY3QgZGVsYXlzCisJLy8gIC0gLi4uCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzcGlfZGV2aWNlICp0b19zcGlfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2ID8gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHNwaV9kZXZpY2UsIGRldikgOiBOVUxMOworfQorCisvKiBtb3N0IGRyaXZlcnMgd29uJ3QgbmVlZCB0byBjYXJlIGFib3V0IGRldmljZSByZWZjb3VudGluZyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2Rldl9nZXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gKHNwaSAmJiBnZXRfZGV2aWNlKCZzcGktPmRldikpID8gc3BpIDogTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNwaV9kZXZfcHV0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaWYgKHNwaSkKKwkJcHV0X2RldmljZSgmc3BpLT5kZXYpOworfQorCisvKiBjdGxkYXRhIGlzIGZvciB0aGUgYnVzX21hc3RlciBkcml2ZXIncyBydW50aW1lIHN0YXRlICovCitzdGF0aWMgaW5saW5lIHZvaWQgKnNwaV9nZXRfY3RsZGF0YShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGlfc2V0X2N0bGRhdGEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdm9pZCAqc3RhdGUpCit7CisJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gc3RhdGU7Cit9CisKKworc3RydWN0IHNwaV9tZXNzYWdlOworCisKKworc3RydWN0IHNwaV9kcml2ZXIgeworCWludAkJCSgqcHJvYmUpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpOworCWludAkJCSgqcmVtb3ZlKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKKwl2b2lkCQkJKCpzaHV0ZG93bikoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7CisJaW50CQkJKCpzdXNwZW5kKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBwbV9tZXNzYWdlX3QgbWVzZyk7CisJaW50CQkJKCpyZXN1bWUpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyCWRyaXZlcjsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwaV9kcml2ZXIgKnRvX3NwaV9kcml2ZXIoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlyZXR1cm4gZHJ2ID8gY29udGFpbmVyX29mKGRydiwgc3RydWN0IHNwaV9kcml2ZXIsIGRyaXZlcikgOiBOVUxMOworfQorCitleHRlcm4gaW50IHNwaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNwaV9kcml2ZXIgKnNkcnYpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzcGlfZHJpdmVyICpzZHJ2KQoreworCWlmICghc2RydikKKwkJcmV0dXJuOworCWRyaXZlcl91bnJlZ2lzdGVyKCZzZHJ2LT5kcml2ZXIpOworfQorCisKKworLyoqCisgKiBzdHJ1Y3Qgc3BpX21hc3RlciAtIGludGVyZmFjZSB0byBTUEkgbWFzdGVyIGNvbnRyb2xsZXIKKyAqIEBjZGV2OiBjbGFzcyBpbnRlcmZhY2UgdG8gdGhpcyBkcml2ZXIKKyAqIEBidXNfbnVtOiBib2FyZC1zcGVjaWZpYyAoYW5kIG9mdGVuIFNPQy1zcGVjaWZpYykgaWRlbnRpZmllciBmb3IgYQorICogCWdpdmVuIFNQSSBjb250cm9sbGVyLgorICogQG51bV9jaGlwc2VsZWN0OiBjaGlwc2VsZWN0cyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCBpbmRpdmlkdWFsCisgKiAJU1BJIHNsYXZlcywgYW5kIGFyZSBudW1iZXJlZCBmcm9tIHplcm8gdG8gbnVtX2NoaXBzZWxlY3RzLgorICogCWVhY2ggc2xhdmUgaGFzIGEgY2hpcHNlbGVjdCBzaWduYWwsIGJ1dCBpdCdzIGNvbW1vbiB0aGF0IG5vdAorICogCWV2ZXJ5IGNoaXBzZWxlY3QgaXMgY29ubmVjdGVkIHRvIGEgc2xhdmUuCisgKiBAc2V0dXA6IHVwZGF0ZXMgdGhlIGRldmljZSBtb2RlIGFuZCBjbG9ja2luZyByZWNvcmRzIHVzZWQgYnkgYQorICogCWRldmljZSdzIFNQSSBjb250cm9sbGVyOyBwcm90b2NvbCBjb2RlIG1heSBjYWxsIHRoaXMuCisgKiBAdHJhbnNmZXI6IGFkZHMgYSBtZXNzYWdlIHRvIHRoZSBjb250cm9sbGVyJ3MgdHJhbnNmZXIgcXVldWUuCisgKiBAY2xlYW51cDogZnJlZXMgY29udHJvbGxlci1zcGVjaWZpYyBzdGF0ZQorICoKKyAqIEVhY2ggU1BJIG1hc3RlciBjb250cm9sbGVyIGNhbiBjb21tdW5pY2F0ZSB3aXRoIG9uZSBvciBtb3JlIHNwaV9kZXZpY2UKKyAqIGNoaWxkcmVuLiAgVGhlc2UgbWFrZSBhIHNtYWxsIGJ1cywgc2hhcmluZyBNT1NJLCBNSVNPIGFuZCBTQ0sgc2lnbmFscworICogYnV0IG5vdCBjaGlwIHNlbGVjdCBzaWduYWxzLiAgRWFjaCBkZXZpY2UgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGEKKyAqIGRpZmZlcmVudCBjbG9jayByYXRlLCBzaW5jZSB0aG9zZSBzaGFyZWQgc2lnbmFscyBhcmUgaWdub3JlZCB1bmxlc3MKKyAqIHRoZSBjaGlwIGlzIHNlbGVjdGVkLgorICoKKyAqIFRoZSBkcml2ZXIgZm9yIGFuIFNQSSBjb250cm9sbGVyIG1hbmFnZXMgYWNjZXNzIHRvIHRob3NlIGRldmljZXMgdGhyb3VnaAorICogYSBxdWV1ZSBvZiBzcGlfbWVzc2FnZSB0cmFuc2FjdGlvbnMsIGNvcHlpbiBkYXRhIGJldHdlZW4gQ1BVIG1lbW9yeSBhbmQKKyAqIGFuIFNQSSBzbGF2ZSBkZXZpY2UpLiAgRm9yIGVhY2ggc3VjaCBtZXNzYWdlIGl0IHF1ZXVlcywgaXQgY2FsbHMgdGhlCisgKiBtZXNzYWdlJ3MgY29tcGxldGlvbiBmdW5jdGlvbiB3aGVuIHRoZSB0cmFuc2FjdGlvbiBjb21wbGV0ZXMuCisgKi8KK3N0cnVjdCBzcGlfbWFzdGVyIHsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlCWNkZXY7CisKKwkvKiBvdGhlciB0aGFuIHplcm8gKD09IGFzc2lnbiBvbmUgZHluYW1pY2FsbHkpLCBidXNfbnVtIGlzIGZ1bGx5CisJICogYm9hcmQtc3BlY2lmaWMuICB1c3VhbGx5IHRoYXQgc2ltcGxpZmllcyB0byBiZWluZyBTT0Mtc3BlY2lmaWMuCisJICogZXhhbXBsZTogIG9uZSBTT0MgaGFzIHRocmVlIFNQSSBjb250cm9sbGVycywgbnVtYmVyZWQgMS4uMywKKwkgKiBhbmQgb25lIGJvYXJkJ3Mgc2NoZW1hdGljcyBtaWdodCBzaG93IGl0IHVzaW5nIFNQSS0yLiAgc29mdHdhcmUKKwkgKiB3b3VsZCBub3JtYWxseSB1c2UgYnVzX251bT0yIGZvciB0aGF0IGNvbnRyb2xsZXIuCisJICovCisJdTE2CQkJYnVzX251bTsKKworCS8qIGNoaXBzZWxlY3RzIHdpbGwgYmUgaW50ZWdyYWwgdG8gbWFueSBjb250cm9sbGVyczsgc29tZSBvdGhlcnMKKwkgKiBtaWdodCB1c2UgYm9hcmQtc3BlY2lmaWMgR1BJT3MuCisJICovCisJdTE2CQkJbnVtX2NoaXBzZWxlY3Q7CisKKwkvKiBzZXR1cCBtb2RlIGFuZCBjbG9jaywgZXRjIChzcGkgZHJpdmVyIG1heSBjYWxsIG1hbnkgdGltZXMpICovCisJaW50CQkJKCpzZXR1cCkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7CisKKwkvKiBiaWRpcmVjdGlvbmFsIGJ1bGsgdHJhbnNmZXJzCisJICoKKwkgKiArIFRoZSB0cmFuc2ZlcigpIG1ldGhvZCBtYXkgbm90IHNsZWVwOyBpdHMgbWFpbiByb2xlIGlzCisJICogICBqdXN0IHRvIGFkZCB0aGUgbWVzc2FnZSB0byB0aGUgcXVldWUuCisJICogKyBGb3Igbm93IHRoZXJlJ3Mgbm8gcmVtb3ZlLWZyb20tcXVldWUgb3BlcmF0aW9uLCBvcgorCSAqICAgYW55IG90aGVyIHJlcXVlc3QgbWFuYWdlbWVudAorCSAqICsgVG8gYSBnaXZlbiBzcGlfZGV2aWNlLCBtZXNzYWdlIHF1ZXVlaW5nIGlzIHB1cmUgZmlmbworCSAqCisJICogKyBUaGUgbWFzdGVyJ3MgbWFpbiBqb2IgaXMgdG8gcHJvY2VzcyBpdHMgbWVzc2FnZSBxdWV1ZSwKKwkgKiAgIHNlbGVjdGluZyBhIGNoaXAgdGhlbiB0cmFuc2ZlcnJpbmcgZGF0YQorCSAqICsgSWYgdGhlcmUgYXJlIG11bHRpcGxlIHNwaV9kZXZpY2UgY2hpbGRyZW4sIHRoZSBpL28gcXVldWUKKwkgKiAgIGFyYml0cmF0aW9uIGFsZ29yaXRobSBpcyB1bnNwZWNpZmllZCAocm91bmQgcm9iaW4sIGZpZm8sCisJICogICBwcmlvcml0eSwgcmVzZXJ2YXRpb25zLCBwcmVlbXB0aW9uLCBldGMpCisJICoKKwkgKiArIENoaXBzZWxlY3Qgc3RheXMgYWN0aXZlIGR1cmluZyB0aGUgZW50aXJlIG1lc3NhZ2UKKwkgKiAgICh1bmxlc3MgbW9kaWZpZWQgYnkgc3BpX3RyYW5zZmVyLmNzX2NoYW5nZSAhPSAwKS4KKwkgKiArIFRoZSBtZXNzYWdlIHRyYW5zZmVycyB1c2UgY2xvY2sgYW5kIFNQSSBtb2RlIHBhcmFtZXRlcnMKKwkgKiAgIHByZXZpb3VzbHkgZXN0YWJsaXNoZWQgYnkgc2V0dXAoKSBmb3IgdGhpcyBkZXZpY2UKKwkgKi8KKwlpbnQJCQkoKnRyYW5zZmVyKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptZXNnKTsKKworCS8qIGNhbGxlZCBvbiByZWxlYXNlKCkgdG8gZnJlZSBtZW1vcnkgcHJvdmlkZWQgYnkgc3BpX21hc3RlciAqLworCXZvaWQJCQkoKmNsZWFudXApKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpOworfTsKKworc3RhdGljIGlubGluZSB2b2lkICpzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJcmV0dXJuIGNsYXNzX2dldF9kZXZkYXRhKCZtYXN0ZXItPmNkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX21hc3Rlcl9zZXRfZGV2ZGF0YShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCB2b2lkICpkYXRhKQoreworCWNsYXNzX3NldF9kZXZkYXRhKCZtYXN0ZXItPmNkZXYsIGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzcGlfbWFzdGVyICpzcGlfbWFzdGVyX2dldChzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCWlmICghbWFzdGVyIHx8ICFjbGFzc19kZXZpY2VfZ2V0KCZtYXN0ZXItPmNkZXYpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gbWFzdGVyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX21hc3Rlcl9wdXQoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlpZiAobWFzdGVyKQorCQljbGFzc19kZXZpY2VfcHV0KCZtYXN0ZXItPmNkZXYpOworfQorCisKKy8qIHRoZSBzcGkgZHJpdmVyIGNvcmUgbWFuYWdlcyBtZW1vcnkgZm9yIHRoZSBzcGlfbWFzdGVyIGNsYXNzZGV2ICovCitleHRlcm4gc3RydWN0IHNwaV9tYXN0ZXIgKgorc3BpX2FsbG9jX21hc3RlcihzdHJ1Y3QgZGV2aWNlICpob3N0LCB1bnNpZ25lZCBzaXplKTsKKworZXh0ZXJuIGludCBzcGlfcmVnaXN0ZXJfbWFzdGVyKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpOworZXh0ZXJuIHZvaWQgc3BpX3VucmVnaXN0ZXJfbWFzdGVyKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpOworCitleHRlcm4gc3RydWN0IHNwaV9tYXN0ZXIgKnNwaV9idXNudW1fdG9fbWFzdGVyKHUxNiBidXNudW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBJL08gSU5URVJGQUNFIGJldHdlZW4gU1BJIGNvbnRyb2xsZXIgYW5kIHByb3RvY29sIGRyaXZlcnMKKyAqCisgKiBQcm90b2NvbCBkcml2ZXJzIHVzZSBhIHF1ZXVlIG9mIHNwaV9tZXNzYWdlcywgZWFjaCB0cmFuc2ZlcnJpbmcgZGF0YQorICogYmV0d2VlbiB0aGUgY29udHJvbGxlciBhbmQgbWVtb3J5IGJ1ZmZlcnMuCisgKgorICogVGhlIHNwaV9tZXNzYWdlcyB0aGVtc2VsdmVzIGNvbnNpc3Qgb2YgYSBzZXJpZXMgb2YgcmVhZCt3cml0ZSB0cmFuc2ZlcgorICogc2VnbWVudHMuICBUaG9zZSBzZWdtZW50cyBhbHdheXMgcmVhZCB0aGUgc2FtZSBudW1iZXIgb2YgYml0cyBhcyB0aGV5CisgKiB3cml0ZTsgYnV0IG9uZSBvciB0aGUgb3RoZXIgaXMgZWFzaWx5IGlnbm9yZWQgYnkgcGFzc2luZyBhIG51bGwgYnVmZmVyCisgKiBwb2ludGVyLiAgKFRoaXMgaXMgdW5saWtlIG1vc3QgdHlwZXMgb2YgSS9PIEFQSSwgYmVjYXVzZSBTUEkgaGFyZHdhcmUKKyAqIGlzIGZ1bGwgZHVwbGV4LikKKyAqCisgKiBOT1RFOiAgQWxsb2NhdGlvbiBvZiBzcGlfdHJhbnNmZXIgYW5kIHNwaV9tZXNzYWdlIG1lbW9yeSBpcyBlbnRpcmVseQorICogdXAgdG8gdGhlIHByb3RvY29sIGRyaXZlciwgd2hpY2ggZ3VhcmFudGVlcyB0aGUgaW50ZWdyaXR5IG9mIGJvdGggKGFzCisgKiB3ZWxsIGFzIHRoZSBkYXRhIGJ1ZmZlcnMpIGZvciBhcyBsb25nIGFzIHRoZSBtZXNzYWdlIGlzIHF1ZXVlZC4KKyAqLworCisvKioKKyAqIHN0cnVjdCBzcGlfdHJhbnNmZXIgLSBhIHJlYWQvd3JpdGUgYnVmZmVyIHBhaXIKKyAqIEB0eF9idWY6IGRhdGEgdG8gYmUgd3JpdHRlbiAoZG1hLXNhZmUgbWVtb3J5KSwgb3IgTlVMTAorICogQHJ4X2J1ZjogZGF0YSB0byBiZSByZWFkIChkbWEtc2FmZSBtZW1vcnkpLCBvciBOVUxMCisgKiBAdHhfZG1hOiBETUEgYWRkcmVzcyBvZiB0eF9idWYsIGlmIHNwaV9tZXNzYWdlLmlzX2RtYV9tYXBwZWQKKyAqIEByeF9kbWE6IERNQSBhZGRyZXNzIG9mIHJ4X2J1ZiwgaWYgc3BpX21lc3NhZ2UuaXNfZG1hX21hcHBlZAorICogQGxlbjogc2l6ZSBvZiByeCBhbmQgdHggYnVmZmVycyAoaW4gYnl0ZXMpCisgKiBAY3NfY2hhbmdlOiBhZmZlY3RzIGNoaXBzZWxlY3QgYWZ0ZXIgdGhpcyB0cmFuc2ZlciBjb21wbGV0ZXMKKyAqIEBkZWxheV91c2VjczogbWljcm9zZWNvbmRzIHRvIGRlbGF5IGFmdGVyIHRoaXMgdHJhbnNmZXIgYmVmb3JlCisgKiAJKG9wdGlvbmFsbHkpIGNoYW5naW5nIHRoZSBjaGlwc2VsZWN0IHN0YXR1cywgdGhlbiBzdGFydGluZworICogCXRoZSBuZXh0IHRyYW5zZmVyIG9yIGNvbXBsZXRpbmcgdGhpcyBzcGlfbWVzc2FnZS4KKyAqIEB0cmFuc2Zlcl9saXN0OiB0cmFuc2ZlcnMgYXJlIHNlcXVlbmNlZCB0aHJvdWdoIHNwaV9tZXNzYWdlLnRyYW5zZmVycworICoKKyAqIFNQSSB0cmFuc2ZlcnMgYWx3YXlzIHdyaXRlIHRoZSBzYW1lIG51bWJlciBvZiBieXRlcyBhcyB0aGV5IHJlYWQuCisgKiBQcm90b2NvbCBkcml2ZXJzIHNob3VsZCBhbHdheXMgcHJvdmlkZSByeF9idWYgYW5kL29yIHR4X2J1Zi4KKyAqIEluIHNvbWUgY2FzZXMsIHRoZXkgbWF5IGFsc28gd2FudCB0byBwcm92aWRlIERNQSBhZGRyZXNzZXMgZm9yCisgKiB0aGUgZGF0YSBiZWluZyB0cmFuc2ZlcnJlZDsgdGhhdCBtYXkgcmVkdWNlIG92ZXJoZWFkLCB3aGVuIHRoZQorICogdW5kZXJseWluZyBkcml2ZXIgdXNlcyBkbWEuCisgKgorICogSWYgdGhlIHRyYW5zbWl0IGJ1ZmZlciBpcyBudWxsLCB1bmRlZmluZWQgZGF0YSB3aWxsIGJlIHNoaWZ0ZWQgb3V0CisgKiB3aGlsZSBmaWxsaW5nIHJ4X2J1Zi4gIElmIHRoZSByZWNlaXZlIGJ1ZmZlciBpcyBudWxsLCB0aGUgZGF0YQorICogc2hpZnRlZCBpbiB3aWxsIGJlIGRpc2NhcmRlZC4gIE9ubHkgImxlbiIgYnl0ZXMgc2hpZnQgb3V0IChvciBpbikuCisgKiBJdCdzIGFuIGVycm9yIHRvIHRyeSB0byBzaGlmdCBvdXQgYSBwYXJ0aWFsIHdvcmQuICAoRm9yIGV4YW1wbGUsIGJ5CisgKiBzaGlmdGluZyBvdXQgdGhyZWUgYnl0ZXMgd2l0aCB3b3JkIHNpemUgb2Ygc2l4dGVlbiBvciB0d2VudHkgYml0czsKKyAqIHRoZSBmb3JtZXIgdXNlcyB0d28gYnl0ZXMgcGVyIHdvcmQsIHRoZSBsYXR0ZXIgdXNlcyBmb3VyIGJ5dGVzLikKKyAqCisgKiBBbGwgU1BJIHRyYW5zZmVycyBzdGFydCB3aXRoIHRoZSByZWxldmFudCBjaGlwc2VsZWN0IGFjdGl2ZS4gIE5vcm1hbGx5CisgKiBpdCBzdGF5cyBzZWxlY3RlZCB1bnRpbCBhZnRlciB0aGUgbGFzdCB0cmFuc2ZlciBpbiBhIG1lc3NhZ2UuICBEcml2ZXJzCisgKiBjYW4gYWZmZWN0IHRoZSBjaGlwc2VsZWN0IHNpZ25hbCB1c2luZyBjc19jaGFuZ2U6CisgKgorICogKGkpIElmIHRoZSB0cmFuc2ZlciBpc24ndCB0aGUgbGFzdCBvbmUgaW4gdGhlIG1lc3NhZ2UsIHRoaXMgZmxhZyBpcworICogdXNlZCB0byBtYWtlIHRoZSBjaGlwc2VsZWN0IGJyaWVmbHkgZ28gaW5hY3RpdmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUKKyAqIG1lc3NhZ2UuICBUb2dnbGluZyBjaGlwc2VsZWN0IGluIHRoaXMgd2F5IG1heSBiZSBuZWVkZWQgdG8gdGVybWluYXRlCisgKiBhIGNoaXAgY29tbWFuZCwgbGV0dGluZyBhIHNpbmdsZSBzcGlfbWVzc2FnZSBwZXJmb3JtIGFsbCBvZiBncm91cCBvZgorICogY2hpcCB0cmFuc2FjdGlvbnMgdG9nZXRoZXIuCisgKgorICogKGlpKSBXaGVuIHRoZSB0cmFuc2ZlciBpcyB0aGUgbGFzdCBvbmUgaW4gdGhlIG1lc3NhZ2UsIHRoZSBjaGlwIG1heQorICogc3RheSBzZWxlY3RlZCB1bnRpbCB0aGUgbmV4dCB0cmFuc2Zlci4gIFRoaXMgaXMgcHVyZWx5IGEgcGVyZm9ybWFuY2UKKyAqIGhpbnQ7IHRoZSBjb250cm9sbGVyIGRyaXZlciBtYXkgbmVlZCB0byBzZWxlY3QgYSBkaWZmZXJlbnQgZGV2aWNlCisgKiBmb3IgdGhlIG5leHQgbWVzc2FnZS4KKyAqCisgKiBUaGUgY29kZSB0aGF0IHN1Ym1pdHMgYW4gc3BpX21lc3NhZ2UgKGFuZCBpdHMgc3BpX3RyYW5zZmVycykKKyAqIHRvIHRoZSBsb3dlciBsYXllcnMgaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIGl0cyBtZW1vcnkuCisgKiBaZXJvLWluaXRpYWxpemUgZXZlcnkgZmllbGQgeW91IGRvbid0IHNldCB1cCBleHBsaWNpdGx5LCB0bworICogaW5zdWxhdGUgYWdhaW5zdCBmdXR1cmUgQVBJIHVwZGF0ZXMuICBBZnRlciB5b3Ugc3VibWl0IGEgbWVzc2FnZQorICogYW5kIGl0cyB0cmFuc2ZlcnMsIGlnbm9yZSB0aGVtIHVudGlsIGl0cyBjb21wbGV0aW9uIGNhbGxiYWNrLgorICovCitzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHsKKwkvKiBpdCdzIG9rIGlmIHR4X2J1ZiA9PSByeF9idWYgKHJpZ2h0PykKKwkgKiBmb3IgTWljcm9XaXJlLCBvbmUgYnVmZmVyIG11c3QgYmUgbnVsbAorCSAqIGJ1ZmZlcnMgbXVzdCB3b3JrIHdpdGggZG1hXyptYXBfc2luZ2xlKCkgY2FsbHMsIHVubGVzcworCSAqICAgc3BpX21lc3NhZ2UuaXNfZG1hX21hcHBlZCByZXBvcnRzIGEgcHJlLWV4aXN0aW5nIG1hcHBpbmcKKwkgKi8KKwljb25zdCB2b2lkCSp0eF9idWY7CisJdm9pZAkJKnJ4X2J1ZjsKKwl1bnNpZ25lZAlsZW47CisKKwlkbWFfYWRkcl90CXR4X2RtYTsKKwlkbWFfYWRkcl90CXJ4X2RtYTsKKworCXVuc2lnbmVkCWNzX2NoYW5nZToxOworCXUxNgkJZGVsYXlfdXNlY3M7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRyYW5zZmVyX2xpc3Q7Cit9OworCisvKioKKyAqIHN0cnVjdCBzcGlfbWVzc2FnZSAtIG9uZSBtdWx0aS1zZWdtZW50IFNQSSB0cmFuc2FjdGlvbgorICogQHRyYW5zZmVyczogbGlzdCBvZiB0cmFuc2ZlciBzZWdtZW50cyBpbiB0aGlzIHRyYW5zYWN0aW9uCisgKiBAc3BpOiBTUEkgZGV2aWNlIHRvIHdoaWNoIHRoZSB0cmFuc2FjdGlvbiBpcyBxdWV1ZWQKKyAqIEBpc19kbWFfbWFwcGVkOiBpZiB0cnVlLCB0aGUgY2FsbGVyIHByb3ZpZGVkIGJvdGggZG1hIGFuZCBjcHUgdmlydHVhbAorICoJYWRkcmVzc2VzIGZvciBlYWNoIHRyYW5zZmVyIGJ1ZmZlcgorICogQGNvbXBsZXRlOiBjYWxsZWQgdG8gcmVwb3J0IHRyYW5zYWN0aW9uIGNvbXBsZXRpb25zCisgKiBAY29udGV4dDogdGhlIGFyZ3VtZW50IHRvIGNvbXBsZXRlKCkgd2hlbiBpdCdzIGNhbGxlZAorICogQGFjdHVhbF9sZW5ndGg6IHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHRyYW5zZmVycmVkIGluIGFsbAorICoJc3VjY2Vzc2Z1bCBzZWdtZW50cworICogQHN0YXR1czogemVybyBmb3Igc3VjY2VzcywgZWxzZSBuZWdhdGl2ZSBlcnJubworICogQHF1ZXVlOiBmb3IgdXNlIGJ5IHdoaWNoZXZlciBkcml2ZXIgY3VycmVudGx5IG93bnMgdGhlIG1lc3NhZ2UKKyAqIEBzdGF0ZTogZm9yIHVzZSBieSB3aGljaGV2ZXIgZHJpdmVyIGN1cnJlbnRseSBvd25zIHRoZSBtZXNzYWdlCisgKgorICogQW4gc3BpX21lc3NhZ2UgaXMgdXNlZCB0byBleGVjdXRlIGFuIGF0b21pYyBzZXF1ZW5jZSBvZiBkYXRhIHRyYW5zZmVycywKKyAqIGVhY2ggcmVwcmVzZW50ZWQgYnkgYSBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLiAgVGhlIHNlcXVlbmNlIGlzICJhdG9taWMiCisgKiBpbiB0aGUgc2Vuc2UgdGhhdCBubyBvdGhlciBzcGlfbWVzc2FnZSBtYXkgdXNlIHRoYXQgU1BJIGJ1cyB1bnRpbCB0aGF0CisgKiBzZXF1ZW5jZSBjb21wbGV0ZXMuICBPbiBzb21lIHN5c3RlbXMsIG1hbnkgc3VjaCBzZXF1ZW5jZXMgY2FuIGV4ZWN1dGUgYXMKKyAqIGFzIHNpbmdsZSBwcm9ncmFtbWVkIERNQSB0cmFuc2Zlci4gIE9uIGFsbCBzeXN0ZW1zLCB0aGVzZSBtZXNzYWdlcyBhcmUKKyAqIHF1ZXVlZCwgYW5kIG1pZ2h0IGNvbXBsZXRlIGFmdGVyIHRyYW5zYWN0aW9ucyB0byBvdGhlciBkZXZpY2VzLiAgTWVzc2FnZXMKKyAqIHNlbnQgdG8gYSBnaXZlbiBzcGlfZGV2aWNlIGFyZSBhbHdheSBleGVjdXRlZCBpbiBGSUZPIG9yZGVyLgorICoKKyAqIFRoZSBjb2RlIHRoYXQgc3VibWl0cyBhbiBzcGlfbWVzc2FnZSAoYW5kIGl0cyBzcGlfdHJhbnNmZXJzKQorICogdG8gdGhlIGxvd2VyIGxheWVycyBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgaXRzIG1lbW9yeS4KKyAqIFplcm8taW5pdGlhbGl6ZSBldmVyeSBmaWVsZCB5b3UgZG9uJ3Qgc2V0IHVwIGV4cGxpY2l0bHksIHRvCisgKiBpbnN1bGF0ZSBhZ2FpbnN0IGZ1dHVyZSBBUEkgdXBkYXRlcy4gIEFmdGVyIHlvdSBzdWJtaXQgYSBtZXNzYWdlCisgKiBhbmQgaXRzIHRyYW5zZmVycywgaWdub3JlIHRoZW0gdW50aWwgaXRzIGNvbXBsZXRpb24gY2FsbGJhY2suCisgKi8KK3N0cnVjdCBzcGlfbWVzc2FnZSB7CisJc3RydWN0IGxpc3RfaGVhZCAJdHJhbnNmZXJzOworCisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKKworCXVuc2lnbmVkCQlpc19kbWFfbWFwcGVkOjE7CisKKwkvKiBSRVZJU0lUOiAgd2UgbWlnaHQgd2FudCBhIGZsYWcgYWZmZWN0aW5nIHRoZSBiZWhhdmlvciBvZiB0aGUKKwkgKiBsYXN0IHRyYW5zZmVyIC4uLiBhbGxvd2luZyB0aGluZ3MgbGlrZSAicmVhZCAxNiBiaXQgbGVuZ3RoIEwiCisJICogaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgInJlYWQgTCBieXRlcyIuICBCYXNpY2FsbHkgaW1wb3NpbmcKKwkgKiBhIHNwZWNpZmljIG1lc3NhZ2Ugc2NoZWR1bGluZyBhbGdvcml0aG0uCisJICoKKwkgKiBTb21lIGNvbnRyb2xsZXIgZHJpdmVycyAobWVzc2FnZS1hdC1hLXRpbWUgcXVldWUgcHJvY2Vzc2luZykKKwkgKiBjb3VsZCBwcm92aWRlIHRoYXQgYXMgdGhlaXIgZGVmYXVsdCBzY2hlZHVsaW5nIGFsZ29yaXRobS4gIEJ1dAorCSAqIG90aGVycyAod2l0aCBtdWx0aS1tZXNzYWdlIHBpcGVsaW5lcykgY291bGQgbmVlZCBhIGZsYWcgdG8KKwkgKiB0ZWxsIHRoZW0gYWJvdXQgc3VjaCBzcGVjaWFsIGNhc2VzLgorCSAqLworCisJLyogY29tcGxldGlvbiBpcyByZXBvcnRlZCB0aHJvdWdoIGEgY2FsbGJhY2sgKi8KKwl2b2lkIAkJCSgqY29tcGxldGUpKHZvaWQgKmNvbnRleHQpOworCXZvaWQJCQkqY29udGV4dDsKKwl1bnNpZ25lZAkJYWN0dWFsX2xlbmd0aDsKKwlpbnQJCQlzdGF0dXM7CisKKwkvKiBmb3Igb3B0aW9uYWwgdXNlIGJ5IHdoYXRldmVyIGRyaXZlciBjdXJyZW50bHkgb3ducyB0aGUKKwkgKiBzcGlfbWVzc2FnZSAuLi4gIGJldHdlZW4gY2FsbHMgdG8gc3BpX2FzeW5jIGFuZCB0aGVuIGxhdGVyCisJICogY29tcGxldGUoKSwgdGhhdCdzIHRoZSBzcGlfbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CisJdm9pZAkJCSpzdGF0ZTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGlfbWVzc2FnZV9pbml0KHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKK3sKKwltZW1zZXQobSwgMCwgc2l6ZW9mICptKTsKKwlJTklUX0xJU1RfSEVBRCgmbS0+dHJhbnNmZXJzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzcGlfbWVzc2FnZV9hZGRfdGFpbChzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCit7CisJbGlzdF9hZGRfdGFpbCgmdC0+dHJhbnNmZXJfbGlzdCwgJm0tPnRyYW5zZmVycyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3BpX3RyYW5zZmVyX2RlbChzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCWxpc3RfZGVsKCZ0LT50cmFuc2Zlcl9saXN0KTsKK30KKworLyogSXQncyBmaW5lIHRvIGVtYmVkIG1lc3NhZ2UgYW5kIHRyYW5zYWN0aW9uIHN0cnVjdHVyZXMgaW4gb3RoZXIgZGF0YQorICogc3RydWN0dXJlcyBzbyBsb25nIGFzIHlvdSBkb24ndCBmcmVlIHRoZW0gd2hpbGUgdGhleSdyZSBpbiB1c2UuCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKnNwaV9tZXNzYWdlX2FsbG9jKHVuc2lnbmVkIG50cmFucywgZ2ZwX3QgZmxhZ3MpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlICptOworCisJbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzcGlfbWVzc2FnZSkKKwkJCSsgbnRyYW5zICogc2l6ZW9mKHN0cnVjdCBzcGlfdHJhbnNmZXIpLAorCQkJZmxhZ3MpOworCWlmIChtKSB7CisJCWludCBpOworCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ID0gKHN0cnVjdCBzcGlfdHJhbnNmZXIgKikobSArIDEpOworCisJCUlOSVRfTElTVF9IRUFEKCZtLT50cmFuc2ZlcnMpOworCQlmb3IgKGkgPSAwOyBpIDwgbnRyYW5zOyBpKyssIHQrKykKKwkJCXNwaV9tZXNzYWdlX2FkZF90YWlsKHQsIG0pOworCX0KKwlyZXR1cm4gbTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNwaV9tZXNzYWdlX2ZyZWUoc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCWtmcmVlKG0pOworfQorCisvKioKKyAqIHNwaV9zZXR1cCAtLSBzZXR1cCBTUEkgbW9kZSBhbmQgY2xvY2sgcmF0ZQorICogQHNwaTogdGhlIGRldmljZSB3aG9zZSBzZXR0aW5ncyBhcmUgYmVpbmcgbW9kaWZpZWQKKyAqCisgKiBTUEkgcHJvdG9jb2wgZHJpdmVycyBtYXkgbmVlZCB0byB1cGRhdGUgdGhlIHRyYW5zZmVyIG1vZGUgaWYgdGhlCisgKiBkZXZpY2UgZG9lc24ndCB3b3JrIHdpdGggdGhlIG1vZGUgMCBkZWZhdWx0LiAgVGhleSBtYXkgbGlrZXdpc2UgbmVlZAorICogdG8gdXBkYXRlIGNsb2NrIHJhdGVzIG9yIHdvcmQgc2l6ZXMgZnJvbSBpbml0aWFsIHZhbHVlcy4gIFRoaXMgZnVuY3Rpb24KKyAqIGNoYW5nZXMgdGhvc2Ugc2V0dGluZ3MsIGFuZCBtdXN0IGJlIGNhbGxlZCBmcm9tIGEgY29udGV4dCB0aGF0IGNhbiBzbGVlcC4KKyAqIFRoZSBjaGFuZ2VzIHRha2UgZWZmZWN0IHRoZSBuZXh0IHRpbWUgdGhlIGRldmljZSBpcyBzZWxlY3RlZCBhbmQgZGF0YQorICogaXMgdHJhbnNmZXJyZWQgdG8gb3IgZnJvbSBpdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiBzcGktPm1hc3Rlci0+c2V0dXAoc3BpKTsKK30KKworCisvKioKKyAqIHNwaV9hc3luYyAtLSBhc3luY2hyb25vdXMgU1BJIHRyYW5zZmVyCisgKiBAc3BpOiBkZXZpY2Ugd2l0aCB3aGljaCBkYXRhIHdpbGwgYmUgZXhjaGFuZ2VkCisgKiBAbWVzc2FnZTogZGVzY3JpYmVzIHRoZSBkYXRhIHRyYW5zZmVycywgaW5jbHVkaW5nIGNvbXBsZXRpb24gY2FsbGJhY2sKKyAqCisgKiBUaGlzIGNhbGwgbWF5IGJlIHVzZWQgaW5faXJxIGFuZCBvdGhlciBjb250ZXh0cyB3aGljaCBjYW4ndCBzbGVlcCwKKyAqIGFzIHdlbGwgYXMgZnJvbSB0YXNrIGNvbnRleHRzIHdoaWNoIGNhbiBzbGVlcC4KKyAqCisgKiBUaGUgY29tcGxldGlvbiBjYWxsYmFjayBpcyBpbnZva2VkIGluIGEgY29udGV4dCB3aGljaCBjYW4ndCBzbGVlcC4KKyAqIEJlZm9yZSB0aGF0IGludm9jYXRpb24sIHRoZSB2YWx1ZSBvZiBtZXNzYWdlLT5zdGF0dXMgaXMgdW5kZWZpbmVkLgorICogV2hlbiB0aGUgY2FsbGJhY2sgaXMgaXNzdWVkLCBtZXNzYWdlLT5zdGF0dXMgaG9sZHMgZWl0aGVyIHplcm8gKHRvCisgKiBpbmRpY2F0ZSBjb21wbGV0ZSBzdWNjZXNzKSBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuICBBZnRlciB0aGF0CisgKiBjYWxsYmFjayByZXR1cm5zLCB0aGUgZHJpdmVyIHdoaWNoIGlzc3VlZCB0aGUgdHJhbnNmZXIgcmVxdWVzdCBtYXkKKyAqIGRlYWxsb2NhdGUgdGhlIGFzc29jaWF0ZWQgbWVtb3J5OyBpdCdzIG5vIGxvbmdlciBpbiB1c2UgYnkgYW55IFNQSQorICogY29yZSBvciBjb250cm9sbGVyIGRyaXZlciBjb2RlLgorICoKKyAqIE5vdGUgdGhhdCBhbHRob3VnaCBhbGwgbWVzc2FnZXMgdG8gYSBzcGlfZGV2aWNlIGFyZSBoYW5kbGVkIGluCisgKiBGSUZPIG9yZGVyLCBtZXNzYWdlcyBtYXkgZ28gdG8gZGlmZmVyZW50IGRldmljZXMgaW4gb3RoZXIgb3JkZXJzLgorICogU29tZSBkZXZpY2UgbWlnaHQgYmUgaGlnaGVyIHByaW9yaXR5LCBvciBoYXZlIHZhcmlvdXMgImhhcmQiIGFjY2VzcworICogdGltZSByZXF1aXJlbWVudHMsIGZvciBleGFtcGxlLgorICoKKyAqIE9uIGRldGVjdGlvbiBvZiBhbnkgZmF1bHQgZHVyaW5nIHRoZSB0cmFuc2ZlciwgcHJvY2Vzc2luZyBvZgorICogdGhlIGVudGlyZSBtZXNzYWdlIGlzIGFib3J0ZWQsIGFuZCB0aGUgZGV2aWNlIGlzIGRlc2VsZWN0ZWQuCisgKiBVbnRpbCByZXR1cm5pbmcgZnJvbSB0aGUgYXNzb2NpYXRlZCBtZXNzYWdlIGNvbXBsZXRpb24gY2FsbGJhY2ssCisgKiBubyBvdGhlciBzcGlfbWVzc2FnZSBxdWV1ZWQgdG8gdGhhdCBkZXZpY2Ugd2lsbCBiZSBwcm9jZXNzZWQuCisgKiAoVGhpcyBydWxlIGFwcGxpZXMgZXF1YWxseSB0byBhbGwgdGhlIHN5bmNocm9ub3VzIHRyYW5zZmVyIGNhbGxzLAorICogd2hpY2ggYXJlIHdyYXBwZXJzIGFyb3VuZCB0aGlzIGNvcmUgYXN5bmNocm9ub3VzIHByaW1pdGl2ZS4pCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzcGlfYXN5bmMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptZXNzYWdlKQoreworCW1lc3NhZ2UtPnNwaSA9IHNwaTsKKwlyZXR1cm4gc3BpLT5tYXN0ZXItPnRyYW5zZmVyKHNwaSwgbWVzc2FnZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQWxsIHRoZXNlIHN5bmNocm9ub3VzIFNQSSB0cmFuc2ZlciByb3V0aW5lcyBhcmUgdXRpbGl0aWVzIGxheWVyZWQKKyAqIG92ZXIgdGhlIGNvcmUgYXN5bmMgdHJhbnNmZXIgcHJpbWl0aXZlLiAgSGVyZSwgInN5bmNocm9ub3VzIiBtZWFucworICogdGhleSB3aWxsIHNsZWVwIHVuaW50ZXJydXB0aWJseSB1bnRpbCB0aGUgYXN5bmMgdHJhbnNmZXIgY29tcGxldGVzLgorICovCisKK2V4dGVybiBpbnQgc3BpX3N5bmMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptZXNzYWdlKTsKKworLyoqCisgKiBzcGlfd3JpdGUgLSBTUEkgc3luY2hyb25vdXMgd3JpdGUKKyAqIEBzcGk6IGRldmljZSB0byB3aGljaCBkYXRhIHdpbGwgYmUgd3JpdHRlbgorICogQGJ1ZjogZGF0YSBidWZmZXIKKyAqIEBsZW46IGRhdGEgYnVmZmVyIHNpemUKKyAqCisgKiBUaGlzIHdyaXRlcyB0aGUgYnVmZmVyIGFuZCByZXR1cm5zIHplcm8gb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICogQ2FsbGFibGUgb25seSBmcm9tIGNvbnRleHRzIHRoYXQgY2FuIHNsZWVwLgorICovCitzdGF0aWMgaW5saW5lIGludAorc3BpX3dyaXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwaV90cmFuc2Zlcgl0ID0geworCQkJLnR4X2J1ZgkJPSBidWYsCisJCQkubGVuCQk9IGxlbiwKKwkJfTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm0pOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0LCAmbSk7CisJcmV0dXJuIHNwaV9zeW5jKHNwaSwgJm0pOworfQorCisvKioKKyAqIHNwaV9yZWFkIC0gU1BJIHN5bmNocm9ub3VzIHJlYWQKKyAqIEBzcGk6IGRldmljZSBmcm9tIHdoaWNoIGRhdGEgd2lsbCBiZSByZWFkCisgKiBAYnVmOiBkYXRhIGJ1ZmZlcgorICogQGxlbjogZGF0YSBidWZmZXIgc2l6ZQorICoKKyAqIFRoaXMgd3JpdGVzIHRoZSBidWZmZXIgYW5kIHJldHVybnMgemVybyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKiBDYWxsYWJsZSBvbmx5IGZyb20gY29udGV4dHMgdGhhdCBjYW4gc2xlZXAuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzcGlfcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIJdCA9IHsKKwkJCS5yeF9idWYJCT0gYnVmLAorCQkJLmxlbgkJPSBsZW4sCisJCX07CisJc3RydWN0IHNwaV9tZXNzYWdlCW07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdCwgJm0pOworCXJldHVybiBzcGlfc3luYyhzcGksICZtKTsKK30KKworLyogdGhpcyBjb3BpZXMgdHhidWYgYW5kIHJ4YnVmIGRhdGE7IGZvciBzbWFsbCB0cmFuc2ZlcnMgb25seSEgKi8KK2V4dGVybiBpbnQgc3BpX3dyaXRlX3RoZW5fcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQljb25zdCB1OCAqdHhidWYsIHVuc2lnbmVkIG5fdHgsCisJCXU4ICpyeGJ1ZiwgdW5zaWduZWQgbl9yeCk7CisKKy8qKgorICogc3BpX3c4cjggLSBTUEkgc3luY2hyb25vdXMgOCBiaXQgd3JpdGUgZm9sbG93ZWQgYnkgOCBiaXQgcmVhZAorICogQHNwaTogZGV2aWNlIHdpdGggd2hpY2ggZGF0YSB3aWxsIGJlIGV4Y2hhbmdlZAorICogQGNtZDogY29tbWFuZCB0byBiZSB3cml0dGVuIGJlZm9yZSBkYXRhIGlzIHJlYWQgYmFjaworICoKKyAqIFRoaXMgcmV0dXJucyB0aGUgKHVuc2lnbmVkKSBlaWdodCBiaXQgbnVtYmVyIHJldHVybmVkIGJ5IHRoZQorICogZGV2aWNlLCBvciBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gIENhbGxhYmxlIG9ubHkgZnJvbQorICogY29udGV4dHMgdGhhdCBjYW4gc2xlZXAuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBzcGlfdzhyOChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBjbWQpCit7CisJc3NpemVfdAkJCXN0YXR1czsKKwl1OAkJCXJlc3VsdDsKKworCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmY21kLCAxLCAmcmVzdWx0LCAxKTsKKworCS8qIHJldHVybiBuZWdhdGl2ZSBlcnJubyBvciB1bnNpZ25lZCB2YWx1ZSAqLworCXJldHVybiAoc3RhdHVzIDwgMCkgPyBzdGF0dXMgOiByZXN1bHQ7Cit9CisKKy8qKgorICogc3BpX3c4cjE2IC0gU1BJIHN5bmNocm9ub3VzIDggYml0IHdyaXRlIGZvbGxvd2VkIGJ5IDE2IGJpdCByZWFkCisgKiBAc3BpOiBkZXZpY2Ugd2l0aCB3aGljaCBkYXRhIHdpbGwgYmUgZXhjaGFuZ2VkCisgKiBAY21kOiBjb21tYW5kIHRvIGJlIHdyaXR0ZW4gYmVmb3JlIGRhdGEgaXMgcmVhZCBiYWNrCisgKgorICogVGhpcyByZXR1cm5zIHRoZSAodW5zaWduZWQpIHNpeHRlZW4gYml0IG51bWJlciByZXR1cm5lZCBieSB0aGUKKyAqIGRldmljZSwgb3IgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuICBDYWxsYWJsZSBvbmx5IGZyb20KKyAqIGNvbnRleHRzIHRoYXQgY2FuIHNsZWVwLgorICoKKyAqIFRoZSBudW1iZXIgaXMgcmV0dXJuZWQgaW4gd2lyZS1vcmRlciwgd2hpY2ggaXMgYXQgbGVhc3Qgc29tZXRpbWVzCisgKiBiaWctZW5kaWFuLgorICovCitzdGF0aWMgaW5saW5lIHNzaXplX3Qgc3BpX3c4cjE2KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IGNtZCkKK3sKKwlzc2l6ZV90CQkJc3RhdHVzOworCXUxNgkJCXJlc3VsdDsKKworCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmY21kLCAxLCAodTggKikgJnJlc3VsdCwgMik7CisKKwkvKiByZXR1cm4gbmVnYXRpdmUgZXJybm8gb3IgdW5zaWduZWQgdmFsdWUgKi8KKwlyZXR1cm4gKHN0YXR1cyA8IDApID8gc3RhdHVzIDogcmVzdWx0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBJTlRFUkZBQ0UgYmV0d2VlbiBib2FyZCBpbml0IGNvZGUgYW5kIFNQSSBpbmZyYXN0cnVjdHVyZS4KKyAqCisgKiBObyBTUEkgZHJpdmVyIGV2ZXIgc2VlcyB0aGVzZSBTUEkgZGV2aWNlIHRhYmxlIHNlZ21lbnRzLCBidXQKKyAqIGl0J3MgaG93IHRoZSBTUEkgY29yZSAob3IgYWRhcHRlcnMgdGhhdCBnZXQgaG90cGx1Z2dlZCkgZ3Jvd3MKKyAqIHRoZSBkcml2ZXIgbW9kZWwgdHJlZS4KKyAqCisgKiBBcyBhIHJ1bGUsIFNQSSBkZXZpY2VzIGNhbid0IGJlIHByb2JlZC4gIEluc3RlYWQsIGJvYXJkIGluaXQgY29kZQorICogcHJvdmlkZXMgYSB0YWJsZSBsaXN0aW5nIHRoZSBkZXZpY2VzIHdoaWNoIGFyZSBwcmVzZW50LCB3aXRoIGVub3VnaAorICogaW5mb3JtYXRpb24gdG8gYmluZCBhbmQgc2V0IHVwIHRoZSBkZXZpY2UncyBkcml2ZXIuICBUaGVyZSdzIGJhc2ljCisgKiBzdXBwb3J0IGZvciBub25zdGF0aWMgY29uZmlndXJhdGlvbnMgdG9vOyBlbm91Z2ggdG8gaGFuZGxlIGFkZGluZworICogcGFycG9ydCBhZGFwdGVycywgb3IgbWljcm9jb250cm9sbGVycyBhY3RpbmcgYXMgVVNCLXRvLVNQSSBicmlkZ2VzLgorICovCisKKy8qIGJvYXJkLXNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggU1BJIGRldmljZSAqLworc3RydWN0IHNwaV9ib2FyZF9pbmZvIHsKKwkvKiB0aGUgZGV2aWNlIG5hbWUgYW5kIG1vZHVsZSBuYW1lIGFyZSBjb3VwbGVkLCBsaWtlIHBsYXRmb3JtX2J1czsKKwkgKiAibW9kYWxpYXMiIGlzIG5vcm1hbGx5IHRoZSBkcml2ZXIgbmFtZS4KKwkgKgorCSAqIHBsYXRmb3JtX2RhdGEgZ29lcyB0byBzcGlfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhLAorCSAqIGNvbnRyb2xsZXJfZGF0YSBnb2VzIHRvIHNwaV9kZXZpY2UuY29udHJvbGxlcl9kYXRhLAorCSAqIGlycSBpcyBjb3BpZWQgdG9vCisJICovCisJY2hhcgkJbW9kYWxpYXNbS09CSl9OQU1FX0xFTl07CisJY29uc3Qgdm9pZAkqcGxhdGZvcm1fZGF0YTsKKwl2b2lkCQkqY29udHJvbGxlcl9kYXRhOworCWludAkJaXJxOworCisJLyogc2xvd2VyIHNpZ25hbGluZyBvbiBub2lzeSBvciBsb3cgdm9sdGFnZSBib2FyZHMgKi8KKwl1MzIJCW1heF9zcGVlZF9oejsKKworCisJLyogYnVzX251bSBpcyBib2FyZCBzcGVjaWZpYyBhbmQgbWF0Y2hlcyB0aGUgYnVzX251bSBvZiBzb21lCisJICogc3BpX21hc3RlciB0aGF0IHdpbGwgcHJvYmFibHkgYmUgcmVnaXN0ZXJlZCBsYXRlci4KKwkgKgorCSAqIGNoaXBfc2VsZWN0IHJlZmxlY3RzIGhvdyB0aGlzIGNoaXAgaXMgd2lyZWQgdG8gdGhhdCBtYXN0ZXI7CisJICogaXQncyBsZXNzIHRoYW4gbnVtX2NoaXBzZWxlY3QuCisJICovCisJdTE2CQlidXNfbnVtOworCXUxNgkJY2hpcF9zZWxlY3Q7CisKKwkvKiAuLi4gbWF5IG5lZWQgYWRkaXRpb25hbCBzcGlfZGV2aWNlIGNoaXAgY29uZmlnIGRhdGEgaGVyZS4KKwkgKiBhdm9pZCBzdHVmZiBwcm90b2NvbCBkcml2ZXJzIGNhbiBzZXQ7IGJ1dCBpbmNsdWRlIHN0dWZmCisJICogbmVlZGVkIHRvIGJlaGF2ZSB3aXRob3V0IGJlaW5nIGJvdW5kIHRvIGEgZHJpdmVyOgorCSAqICAtIGNoaXBzZWxlY3QgcG9sYXJpdHkKKwkgKiAgLSBxdWlya3MgbGlrZSBjbG9jayByYXRlIG1hdHRlcmluZyB3aGVuIG5vdCBzZWxlY3RlZAorCSAqLworfTsKKworI2lmZGVmCUNPTkZJR19TUEkKK2V4dGVybiBpbnQKK3NwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBjb25zdCAqaW5mbywgdW5zaWduZWQgbik7CisjZWxzZQorLyogYm9hcmQgaW5pdCBjb2RlIG1heSBpZ25vcmUgd2hldGhlciBTUEkgaXMgY29uZmlndXJlZCBvciBub3QgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gY29uc3QgKmluZm8sIHVuc2lnbmVkIG4pCisJeyByZXR1cm4gMDsgfQorI2VuZGlmCisKKworLyogSWYgeW91J3JlIGhvdHBsdWdnaW5nIGFuIGFkYXB0ZXIgd2l0aCBkZXZpY2VzIChwYXJwb3J0LCB1c2IsIGV0YykKKyAqIHVzZSBzcGlfbmV3X2RldmljZSgpIHRvIGRlc2NyaWJlIGVhY2ggZGV2aWNlLiAgWW91IGNhbiBhbHNvIGNhbGwKKyAqIHNwaV91bnJlZ2lzdGVyX2RldmljZSgpIHRvIHN0YXJ0IG1ha2luZyB0aGF0IGRldmljZSB2YW5pc2gsIGJ1dAorICogbm9ybWFsbHkgdGhhdCB3b3VsZCBiZSBoYW5kbGVkIGJ5IHNwaV91bnJlZ2lzdGVyX21hc3RlcigpLgorICovCitleHRlcm4gc3RydWN0IHNwaV9kZXZpY2UgKgorc3BpX25ld19kZXZpY2Uoc3RydWN0IHNwaV9tYXN0ZXIgKiwgc3RydWN0IHNwaV9ib2FyZF9pbmZvICopOworCitzdGF0aWMgaW5saW5lIHZvaWQKK3NwaV91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWlmIChzcGkpCisJCWRldmljZV91bnJlZ2lzdGVyKCZzcGktPmRldik7Cit9CisKKyNlbmRpZiAvKiBfX0xJTlVYX1NQSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTYxZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaApAQCAtMCwwICsxLDEzNSBAQAorI2lmbmRlZglfX1NQSV9CSVRCQU5HX0gKKyNkZWZpbmUJX19TUElfQklUQkFOR19ICisKKy8qCisgKiBNaXggdGhpcyB1dGlsaXR5IGNvZGUgd2l0aCBzb21lIGdsdWUgY29kZSB0byBnZXQgb25lIG9mIHNldmVyYWwgdHlwZXMgb2YKKyAqIHNpbXBsZSBTUEkgbWFzdGVyIGRyaXZlci4gIFR3byBkbyBwb2xsZWQgd29yZC1hdC1hLXRpbWUgSS9POgorICoKKyAqICAgLQlHUElPL3BhcnBvcnQgYml0YmFuZ2Vycy4gIFByb3ZpZGUgY2hpcHNlbGVjdCgpIGFuZCB0eHJ4X3dvcmRbXSgpLAorICoJZXhwYW5kaW5nIHRoZSBwZXItd29yZCByb3V0aW5lcyBmcm9tIHRoZSBpbmxpbmUgdGVtcGxhdGVzIGJlbG93LgorICoKKyAqICAgLQlEcml2ZXJzIGZvciBjb250cm9sbGVycyByZXNlbWJsaW5nIGJhcmUgc2hpZnQgcmVnaXN0ZXJzLiAgUHJvdmlkZQorICoJY2hpcHNlbGVjdCgpIGFuZCB0eHJ4X3dvcmRbXSgpLCB3aXRoIGN1c3RvbSBzZXR1cCgpL2NsZWFudXAoKSBtZXRob2RzCisgKgl0aGF0IHVzZSB5b3VyIGNvbnRyb2xsZXIncyBjbG9jayBhbmQgY2hpcHNlbGVjdCByZWdpc3RlcnMuCisgKgorICogU29tZSBoYXJkd2FyZSB3b3JrcyB3ZWxsIHdpdGggcmVxdWVzdHMgYXQgc3BpX3RyYW5zZmVyIHNjb3BlOgorICoKKyAqICAgLQlEcml2ZXJzIGxldmVyYWdpbmcgc21hcnRlciBoYXJkd2FyZSwgd2l0aCBmaWZvcyBvciBETUE7IG9yIGZvciBoYWxmCisgKglkdXBsZXggKE1pY3JvV2lyZSkgY29udHJvbGxlcnMuICBQcm92aWRlIGNoaXBzbGVjdCgpIGFuZCB0eHJ4X2J1ZnMoKSwKKyAqCWFuZCBjdXN0b20gc2V0dXAoKS9jbGVhbnVwKCkgbWV0aG9kcy4KKyAqLworc3RydWN0IHNwaV9iaXRiYW5nIHsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqd29ya3F1ZXVlOworCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOworCisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXF1ZXVlOworCXU4CQkJYnVzeTsKKwl1OAkJCXNodXRkb3duOworCXU4CQkJdXNlX2RtYTsKKworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisKKwl2b2lkCSgqY2hpcHNlbGVjdCkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKTsKKyNkZWZpbmUJQklUQkFOR19DU19BQ1RJVkUJMQkvKiBub3JtYWxseSBuQ1MsIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUJQklUQkFOR19DU19JTkFDVElWRQkwCisKKwkvKiB0eHJ4X2J1ZnMoKSBtYXkgaGFuZGxlIGRtYSBtYXBwaW5nIGZvciB0cmFuc2ZlcnMgdGhhdCBkb24ndAorCSAqIGFscmVhZHkgaGF2ZSBvbmUgKHRyYW5zZmVyLnt0eCxyeH1fZG1hIGlzIHplcm8pLCBvciB1c2UgUElPCisJICovCisJaW50CSgqdHhyeF9idWZzKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KTsKKworCS8qIHR4cnhfd29yZFtTUElfTU9ERV8qXSgpIGp1c3QgbG9va3MgbGlrZSBhIHNoaWZ0IHJlZ2lzdGVyICovCisJdTMyCSgqdHhyeF93b3JkWzRdKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJdW5zaWduZWQgbnNlY3MsCisJCQl1MzIgd29yZCwgdTggYml0cyk7Cit9OworCisvKiB5b3UgY2FuIGNhbGwgdGhlc2UgZGVmYXVsdCBiaXRiYW5nLT5tYXN0ZXIgbWV0aG9kcyBmcm9tIHlvdXIgY3VzdG9tCisgKiBtZXRob2RzLCBpZiB5b3UgbGlrZS4KKyAqLworZXh0ZXJuIGludCBzcGlfYml0YmFuZ19zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKK2V4dGVybiB2b2lkIHNwaV9iaXRiYW5nX2NsZWFudXAoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7CitleHRlcm4gaW50IHNwaV9iaXRiYW5nX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSk7CisKKy8qIHN0YXJ0IG9yIHN0b3AgcXVldWUgcHJvY2Vzc2luZyAqLworZXh0ZXJuIGludCBzcGlfYml0YmFuZ19zdGFydChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKnNwaSk7CitleHRlcm4gaW50IHNwaV9iaXRiYW5nX3N0b3Aoc3RydWN0IHNwaV9iaXRiYW5nICpzcGkpOworCisjZW5kaWYJLyogX19TUElfQklUQkFOR19IICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZglFWFBBTkRfQklUQkFOR19UWFJYCisKKy8qCisgKiBUaGUgY29kZSB0aGF0IGtub3dzIHdoYXQgR1BJTyBwaW5zIGRvIHdoYXQgc2hvdWxkIGhhdmUgZGVjbGFyZWQgZm91cgorICogZnVuY3Rpb25zLCBpZGVhbGx5IGFzIGlubGluZXMsIGJlZm9yZSAjZGVmaW5pbmcgRVhQQU5EX0JJVEJBTkdfVFhSWAorICogYW5kIGluY2x1ZGluZyB0aGlzIGhlYWRlcjoKKyAqCisgKiAgdm9pZCBzZXRzY2soc3RydWN0IHNwaV9kZXZpY2UgKiwgaW50IGlzX29uKTsKKyAqICB2b2lkIHNldG1vc2koc3RydWN0IHNwaV9kZXZpY2UgKiwgaW50IGlzX29uKTsKKyAqICBpbnQgZ2V0bWlzbyhzdHJ1Y3Qgc3BpX2RldmljZSAqKTsKKyAqICB2b2lkIHNwaWRlbGF5KHVuc2lnbmVkKTsKKyAqCisgKiBBIG5vbi1pbmxpbmVkIHJvdXRpbmUgd291bGQgY2FsbCBiaXRiYW5nX3R4cnhfKigpIHJvdXRpbmVzLiAgVGhlCisgKiBtYWluIGxvb3AgY291bGQgZWFzaWx5IGNvbXBpbGUgZG93biB0byBhIGhhbmRmdWwgb2YgaW5zdHJ1Y3Rpb25zLAorICogZXNwZWNpYWxseSBpZiB0aGUgZGVsYXkgaXMgYSBOT1AgKHRvIHJ1biBhdCBwZWFrIHNwZWVkKS4KKyAqCisgKiBTaW5jZSB0aGlzIGlzIHNvZnR3YXJlLCB0aGUgdGltaW5ncyBtYXkgbm90IGJlIGV4YWN0bHkgd2hhdCB5b3VyIGJvYXJkJ3MKKyAqIGNoaXBzIG5lZWQgLi4uIHRoZXJlIG1heSBiZSBzZXZlcmFsIHJlYXNvbnMgeW91J2QgbmVlZCB0byB0d2VhayB0aW1pbmdzCisgKiBpbiB0aGVzZSByb3V0aW5lcywgbm90IGp1c3QgbWFrZSB0byBtYWtlIGl0IGZhc3RlciBvciBzbG93ZXIgdG8gbWF0Y2ggYQorICogcGFydGljdWxhciBDUFUgY2xvY2sgcmF0ZS4KKyAqLworCitzdGF0aWMgaW5saW5lIHUzMgorYml0YmFuZ190eHJ4X2JlX2NwaGEwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLCB1bnNpZ25lZCBjcG9sLAorCQl1MzIgd29yZCwgdTggYml0cykKK3sKKwkvKiBpZiAoY3BvbCA9PSAwKSB0aGlzIGlzIFNQSV9NT0RFXzA7IGVsc2UgdGhpcyBpcyBTUElfTU9ERV8yICovCisKKwkvKiBjbG9jayBzdGFydHMgYXQgaW5hY3RpdmUgcG9sYXJpdHkgKi8KKwlmb3IgKHdvcmQgPDw9ICgzMiAtIGJpdHMpOyBsaWtlbHkoYml0cyk7IGJpdHMtLSkgeworCisJCS8qIHNldHVwIE1TQiAodG8gc2xhdmUpIG9uIHRyYWlsaW5nIGVkZ2UgKi8KKwkJc2V0bW9zaShzcGksIHdvcmQgJiAoMSA8PCAzMSkpOworCQlzcGlkZWxheShuc2Vjcyk7CS8qIFQoc2V0dXApICovCisKKwkJc2V0c2NrKHNwaSwgIWNwb2wpOworCQlzcGlkZWxheShuc2Vjcyk7CisKKwkJLyogc2FtcGxlIE1TQiAoZnJvbSBzbGF2ZSkgb24gbGVhZGluZyBlZGdlICovCisJCXdvcmQgPDw9IDE7CisJCXdvcmQgfD0gZ2V0bWlzbyhzcGkpOworCQlzZXRzY2soc3BpLCBjcG9sKTsKKwl9CisJcmV0dXJuIHdvcmQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitiaXRiYW5nX3R4cnhfYmVfY3BoYTEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJdW5zaWduZWQgbnNlY3MsIHVuc2lnbmVkIGNwb2wsCisJCXUzMiB3b3JkLCB1OCBiaXRzKQoreworCS8qIGlmIChjcG9sID09IDApIHRoaXMgaXMgU1BJX01PREVfMTsgZWxzZSB0aGlzIGlzIFNQSV9NT0RFXzMgKi8KKworCS8qIGNsb2NrIHN0YXJ0cyBhdCBpbmFjdGl2ZSBwb2xhcml0eSAqLworCWZvciAod29yZCA8PD0gKDMyIC0gYml0cyk7IGxpa2VseShiaXRzKTsgYml0cy0tKSB7CisKKwkJLyogc2V0dXAgTVNCICh0byBzbGF2ZSkgb24gbGVhZGluZyBlZGdlICovCisJCXNldHNjayhzcGksICFjcG9sKTsKKwkJc2V0bW9zaShzcGksIHdvcmQgJiAoMSA8PCAzMSkpOworCQlzcGlkZWxheShuc2Vjcyk7IC8qIFQoc2V0dXApICovCisKKwkJc2V0c2NrKHNwaSwgY3BvbCk7CisJCXNwaWRlbGF5KG5zZWNzKTsKKworCQkvKiBzYW1wbGUgTVNCIChmcm9tIHNsYXZlKSBvbiB0cmFpbGluZyBlZGdlICovCisJCXdvcmQgPDw9IDE7CisJCXdvcmQgfD0gZ2V0bWlzbyhzcGkpOworCX0KKwlyZXR1cm4gd29yZDsKK30KKworI2VuZGlmCS8qIEVYUEFORF9CSVRCQU5HX1RYUlggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKaW5kZXggMzg5ZDFjMy4uZTkyMDU0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKQEAgLTE4MCw2ICsxODAsMTEgQEAKIGV4dGVybiBpbnQgcHV0YmFja19scnVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbCk7CiBleHRlcm4gaW50IG1pZ3JhdGVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbCwgc3RydWN0IGxpc3RfaGVhZCAqdCwKIAkJc3RydWN0IGxpc3RfaGVhZCAqbW92ZWQsIHN0cnVjdCBsaXN0X2hlYWQgKmZhaWxlZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcCkgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSBpbnQgcHV0YmFja19scnVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgbWlncmF0ZV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsLCBzdHJ1Y3QgbGlzdF9oZWFkICp0LAorCXN0cnVjdCBsaXN0X2hlYWQgKm1vdmVkLCBzdHJ1Y3QgbGlzdF9oZWFkICpmYWlsZWQpIHsgcmV0dXJuIC1FTk9TWVM7IH0KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01NVQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aXBjLmggYi9pbmNsdWRlL2xpbnV4L3RpcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDNhMTVmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC90aXBjLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3RpcGMuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIHNvY2tldCBpbnRlcmZhY2UKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTElOVVhfVElQQ19IXworI2RlZmluZSBfTElOVVhfVElQQ19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFRJUEMgYWRkcmVzc2luZyBwcmltaXRpdmVzCisgKi8KKyAKK3N0cnVjdCB0aXBjX3BvcnRpZCB7CisJX191MzIgcmVmOworCV9fdTMyIG5vZGU7Cit9OworCitzdHJ1Y3QgdGlwY19uYW1lIHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGluc3RhbmNlOworfTsKKworc3RydWN0IHRpcGNfbmFtZV9zZXEgeworCV9fdTMyIHR5cGU7CisJX191MzIgbG93ZXI7CisJX191MzIgdXBwZXI7Cit9OworCitzdGF0aWMgaW5saW5lIF9fdTMyIHRpcGNfYWRkcih1bnNpZ25lZCBpbnQgem9uZSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBjbHVzdGVyLAorCQkJICAgICAgdW5zaWduZWQgaW50IG5vZGUpCit7CisJcmV0dXJuICh6b25lIDw8IDI0KSB8IChjbHVzdGVyIDw8IDEyKSB8IG5vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRpcGNfem9uZShfX3UzMiBhZGRyKQoreworCXJldHVybiBhZGRyID4+IDI0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0aXBjX2NsdXN0ZXIoX191MzIgYWRkcikKK3sKKwlyZXR1cm4gKGFkZHIgPj4gMTIpICYgMHhmZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRpcGNfbm9kZShfX3UzMiBhZGRyKQoreworCXJldHVybiBhZGRyICYgMHhmZmY7Cit9CisKKy8qCisgKiBBcHBsaWNhdGlvbi1hY2Nlc3NpYmxlIHBvcnQgbmFtZSB0eXBlcworICovCisKKyNkZWZpbmUgVElQQ19DRkdfU1JWCQkwCS8qIGNvbmZpZ3VyYXRpb24gc2VydmljZSBuYW1lIHR5cGUgKi8KKyNkZWZpbmUgVElQQ19UT1BfU1JWCQkxCS8qIHRvcG9sb2d5IHNlcnZpY2UgbmFtZSB0eXBlICovCisjZGVmaW5lIFRJUENfUkVTRVJWRURfVFlQRVMJNjQJLyogbG93ZXN0IHVzZXItcHVibGlzaGFibGUgbmFtZSB0eXBlICovCisKKy8qIAorICogUHVibGljYXRpb24gc2NvcGVzIHdoZW4gYmluZGluZyBwb3J0IG5hbWVzIGFuZCBwb3J0IG5hbWUgc2VxdWVuY2VzCisgKi8KKworI2RlZmluZSBUSVBDX1pPTkVfU0NPUEUJCTEKKyNkZWZpbmUgVElQQ19DTFVTVEVSX1NDT1BFCTIKKyNkZWZpbmUgVElQQ19OT0RFX1NDT1BFCQkzCisKKy8qCisgKiBMaW1pdGluZyB2YWx1ZXMgZm9yIG1lc3NhZ2VzCisgKi8KKworI2RlZmluZSBUSVBDX01BWF9VU0VSX01TR19TSVpFCTY2MDAwCisKKy8qCisgKiBNZXNzYWdlIGltcG9ydGFuY2UgbGV2ZWxzCisgKi8KKworI2RlZmluZSBUSVBDX0xPV19JTVBPUlRBTkNFCQkwICAvKiBkZWZhdWx0ICovCisjZGVmaW5lIFRJUENfTUVESVVNX0lNUE9SVEFOQ0UJCTEKKyNkZWZpbmUgVElQQ19ISUdIX0lNUE9SVEFOQ0UJCTIKKyNkZWZpbmUgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFCTMKKworLyogCisgKiBNc2cgcmVqZWN0aW9uL2Nvbm5lY3Rpb24gc2h1dGRvd24gcmVhc29ucworICovCisKKyNkZWZpbmUgVElQQ19PSwkJCTAKKyNkZWZpbmUgVElQQ19FUlJfTk9fTkFNRQkxCisjZGVmaW5lIFRJUENfRVJSX05PX1BPUlQJMgorI2RlZmluZSBUSVBDX0VSUl9OT19OT0RFCTMKKyNkZWZpbmUgVElQQ19FUlJfT1ZFUkxPQUQJNAorI2RlZmluZSBUSVBDX0NPTk5fU0hVVERPV04JNQorCisvKgorICogVElQQyB0b3BvbG9neSBzdWJzY3JpcHRpb24gc2VydmljZSBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgVElQQ19TVUJfUE9SVFMgICAgIAkweDAxICAJLyogZmlsdGVyIGZvciBwb3J0IGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBUSVBDX1NVQl9TRVJWSUNFICAgICAJMHgwMiAgCS8qIGZpbHRlciBmb3Igc2VydmljZSBhdmFpbGFiaWxpdHkgKi8KKyNpZiAwCisvKiBUaGUgZm9sbG93aW5nIGZpbHRlciBvcHRpb25zIGFyZSBub3QgY3VycmVudGx5IGltcGxlbWVudGVkICovCisjZGVmaW5lIFRJUENfU1VCX05PX0JJTkRfRVZUUwkweDA0CS8qIGZpbHRlciBvdXQgInB1Ymxpc2giIGV2ZW50cyAqLworI2RlZmluZSBUSVBDX1NVQl9OT19VTkJJTkRfRVZUUwkweDA4CS8qIGZpbHRlciBvdXQgIndpdGhkcmF3IiBldmVudHMgKi8KKyNkZWZpbmUgVElQQ19TVUJfU0lOR0xFX0VWVAkweDEwCS8qIGV4cGlyZSBhZnRlciBmaXJzdCBldmVudCAqLworI2VuZGlmCisKKyNkZWZpbmUgVElQQ19XQUlUX0ZPUkVWRVIJfjAJLyogdGltZW91dCBmb3IgcGVybWFuZW50IHN1YnNjcmlwdGlvbiAqLworCitzdHJ1Y3QgdGlwY19zdWJzY3IgeworCXN0cnVjdCB0aXBjX25hbWVfc2VxIHNlcTsJLyogbmFtZSBzZXF1ZW5jZSBvZiBpbnRlcmVzdCAqLworCV9fdTMyIHRpbWVvdXQ7CQkJLyogc3Vic2NyaXB0aW9uIGR1cmF0aW9uIChpbiBtcykgKi8KKyAgICAgICAgX191MzIgZmlsdGVyOyAgIAkJLyogYml0bWFzayBvZiBmaWx0ZXIgb3B0aW9ucyAqLworCWNoYXIgdXNyX2hhbmRsZVs4XTsJCS8qIGF2YWlsYWJsZSBmb3Igc3Vic2NyaWJlciB1c2UgKi8KK307CisKKyNkZWZpbmUgVElQQ19QVUJMSVNIRUQJCTEJLyogcHVibGljYXRpb24gZXZlbnQgKi8KKyNkZWZpbmUgVElQQ19XSVRIRFJBV04JCTIJLyogd2l0aGRyYXcgZXZlbnQgKi8KKyNkZWZpbmUgVElQQ19TVUJTQ1JfVElNRU9VVAkzCS8qIHN1YnNjcmlwdGlvbiB0aW1lb3V0IGV2ZW50ICovCisKK3N0cnVjdCB0aXBjX2V2ZW50IHsKKwlfX3UzMiBldmVudDsJCQkvKiBldmVudCB0eXBlICovCisJX191MzIgZm91bmRfbG93ZXI7CQkvKiBtYXRjaGluZyBuYW1lIHNlcSBpbnN0YW5jZXMgKi8KKwlfX3UzMiBmb3VuZF91cHBlcjsJCS8qICAgICIgICAgICAiICAgICIgICAgICIgICAgICAqLworCXN0cnVjdCB0aXBjX3BvcnRpZCBwb3J0OwkvKiBhc3NvY2lhdGVkIHBvcnQgKi8KKwlzdHJ1Y3QgdGlwY19zdWJzY3IgczsJCS8qIGFzc29jaWF0ZWQgc3Vic2NyaXB0aW9uICovCit9OworCisvKgorICogU29ja2V0IEFQSQorICovCisKKyNpZm5kZWYgQUZfVElQQworI2RlZmluZSBBRl9USVBDCQkzMAorI2VuZGlmCisKKyNpZm5kZWYgUEZfVElQQworI2RlZmluZSBQRl9USVBDCQlBRl9USVBDCisjZW5kaWYKKworI2lmbmRlZiBTT0xfVElQQworI2RlZmluZSBTT0xfVElQQwkyNzEKKyNlbmRpZgorCisjZGVmaW5lIFRJUENfQUREUl9OQU1FU0VRCTEKKyNkZWZpbmUgVElQQ19BRERSX01DQVNUCQkxCisjZGVmaW5lIFRJUENfQUREUl9OQU1FCQkyCisjZGVmaW5lIFRJUENfQUREUl9JRAkJMworCitzdHJ1Y3Qgc29ja2FkZHJfdGlwYyB7CisJdW5zaWduZWQgc2hvcnQgZmFtaWx5OworCXVuc2lnbmVkIGNoYXIgIGFkZHJ0eXBlOworCXNpZ25lZCAgIGNoYXIgIHNjb3BlOworCXVuaW9uIHsKKwkJc3RydWN0IHRpcGNfcG9ydGlkIGlkOworCQlzdHJ1Y3QgdGlwY19uYW1lX3NlcSBuYW1lc2VxOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHRpcGNfbmFtZSBuYW1lOworCQkJX191MzIgZG9tYWluOyAvKiAwOiBvd24gem9uZSAqLworCQl9IG5hbWU7CisJfSBhZGRyOworfTsKKworLyoKKyAqIEFuY2lsbGFyeSBkYXRhIG9iamVjdHMgc3VwcG9ydGVkIGJ5IHJlY3Ztc2coKQorICovCisKKyNkZWZpbmUgVElQQ19FUlJJTkZPCTEJLyogZXJyb3IgaW5mbyAqLworI2RlZmluZSBUSVBDX1JFVERBVEEJMgkvKiByZXR1cm5lZCBkYXRhICovCisjZGVmaW5lIFRJUENfREVTVE5BTUUJMwkvKiBkZXN0aW5hdGlvbiBuYW1lICovCisKKy8qCisgKiBUSVBDLXNwZWNpZmljIHNvY2tldCBvcHRpb24gdmFsdWVzCisgKi8KKworI2RlZmluZSBUSVBDX0lNUE9SVEFOQ0UJCTEyNwkvKiBEZWZhdWx0OiBUSVBDX0xPV19JTVBPUlRBTkNFICovCisjZGVmaW5lIFRJUENfU1JDX0RST1BQQUJMRQkxMjgJLyogRGVmYXVsdDogMCAocmVzZW5kIGNvbmdlc3RlZCBtc2cpICovCisjZGVmaW5lIFRJUENfREVTVF9EUk9QUEFCTEUJMTI5CS8qIERlZmF1bHQ6IGJhc2VkIG9uIHNvY2tldCB0eXBlICovCisjZGVmaW5lIFRJUENfQ09OTl9USU1FT1VUCTEzMAkvKiBEZWZhdWx0OiA4MDAwIChtcykgICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aXBjX2NvbmZpZy5oIGIvaW5jbHVkZS9saW51eC90aXBjX2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MmM4YzYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmgKQEAgLTAsMCArMSw0MDcgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBjb25maWd1cmF0aW9uIGludGVyZmFjZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9USVBDX0NPTkZJR19IXworI2RlZmluZSBfTElOVVhfVElQQ19DT05GSUdfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKgorICogQ29uZmlndXJhdGlvbgorICoKKyAqIEFsbCBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgbWVzc2FnaW5nIGludm9sdmVzIHNlbmRpbmcgYSByZXF1ZXN0IG1lc3NhZ2UKKyAqIHRvIHRoZSBUSVBDIGNvbmZpZ3VyYXRpb24gc2VydmljZSBvbiBhIG5vZGUsIHdoaWNoIHNlbmRzIGEgcmVwbHkgbWVzc2FnZQorICogYmFjay4gIChJbiB0aGUgZnV0dXJlIG11bHRpLW1lc3NhZ2UgcmVwbGllcyBtYXkgYmUgc3VwcG9ydGVkLikKKyAqCisgKiBCb3RoIHJlcXVlc3QgYW5kIHJlcGx5IG1lc3NhZ2VzIGNvbnNpc3Qgb2YgYSB0cmFuc3BvcnQgaGVhZGVyIGFuZCBwYXlsb2FkLgorICogVGhlIHRyYW5zcG9ydCBoZWFkZXIgY29udGFpbnMgaW5mbyBhYm91dCB0aGUgZGVzaXJlZCBvcGVyYXRpb247CisgKiB0aGUgcGF5bG9hZCBjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgdHlwZS9sZW5ndGgvdmFsdWUgKFRMVikgaXRlbXMKKyAqIHdoaWNoIHNwZWNpZnkgcGFyYW1ldGVycyBvciByZXN1bHRzIGZvciB0aGUgb3BlcmF0aW9uLgorICoKKyAqIEZvciBtYW55IG9wZXJhdGlvbnMsIHRoZSByZXF1ZXN0IGFuZCByZXBseSBtZXNzYWdlcyBoYXZlIGEgZml4ZWQgbnVtYmVyCisgKiBvZiBUTFZzICh1c3VhbGx5IHplcm8gb3Igb25lKTsgaG93ZXZlciwgc29tZSByZXBseSBtZXNzYWdlcyBtYXkgcmV0dXJuIAorICogYSB2YXJpYWJsZSBudW1iZXIgb2YgVExWcy4gIEEgZmFpbGVkIHJlcXVlc3QgaXMgZGVub3RlZCBieSB0aGUgcHJlc2VuY2UKKyAqIG9mIGFuICJlcnJvciBzdHJpbmciIFRMViBpbiB0aGUgcmVwbHkgbWVzc2FnZSBpbnN0ZWFkIG9mIHRoZSBUTFYocykgdGhlCisgKiByZXBseSBzaG91bGQgY29udGFpbiBpZiB0aGUgcmVxdWVzdCBzdWNjZWVkcy4KKyAqLworIAorLyogCisgKiBQdWJsaWMgY29tbWFuZHM6CisgKiBNYXkgYmUgaXNzdWVkIGJ5IGFueSBwcm9jZXNzLgorICogQWNjZXB0ZWQgYnkgb3duIG5vZGUsIG9yIGJ5IHJlbW90ZSBub2RlIG9ubHkgaWYgcmVtb3RlIG1hbmFnZW1lbnQgZW5hYmxlZC4gICAgICAgICAgICAgICAgICAgICAgIAorICovCisgCisjZGVmaW5lICBUSVBDX0NNRF9OT09QICAgCSAgICAweDAwMDAgICAgLyogdHggbm9uZSwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX05PREVTICAgICAgICAgMHgwMDAxICAgIC8qIHR4IG5ldF9hZGRyLCByeCBub2RlX2luZm8ocykgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9NRURJQV9OQU1FUyAgIDB4MDAwMiAgICAvKiB0eCBub25lLCByeCBtZWRpYV9uYW1lKHMpICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfQkVBUkVSX05BTUVTICAweDAwMDMgICAgLyogdHggbm9uZSwgcnggYmVhcmVyX25hbWUocykgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9MSU5LUyAgICAgICAgIDB4MDAwNCAgICAvKiB0eCBuZXRfYWRkciwgcnggbGlua19pbmZvKHMpICovCisjZGVmaW5lICBUSVBDX0NNRF9TSE9XX05BTUVfVEFCTEUgICAweDAwMDUgICAgLyogdHggbmFtZV90YmxfcXVlcnksIHJ4IHVsdHJhX3N0cmluZyAqLworI2RlZmluZSAgVElQQ19DTURfU0hPV19QT1JUUyAgICAgICAgMHgwMDA2ICAgIC8qIHR4IG5vbmUsIHJ4IHVsdHJhX3N0cmluZyAqLworI2RlZmluZSAgVElQQ19DTURfU0hPV19MSU5LX1NUQVRTICAgMHgwMDBCICAgIC8qIHR4IGxpbmtfbmFtZSwgcnggdWx0cmFfc3RyaW5nICovCisKKyNpZiAwCisjZGVmaW5lICBUSVBDX0NNRF9TSE9XX1BPUlRfU1RBVFMgICAweDAwMDggICAgLyogdHggcG9ydF9yZWYsIHJ4IHVsdHJhX3N0cmluZyAqLworI2RlZmluZSAgVElQQ19DTURfUkVTRVRfUE9SVF9TVEFUUyAgMHgwMDA5ICAgIC8qIHR4IHBvcnRfcmVmLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfUk9VVEVTICAgICAgICAweDAwMEEgICAgLyogdHggPywgcnggPyAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX0xJTktfUEVFUiAgICAgMHgwMDBEICAgIC8qIHR4IGxpbmtfbmFtZSwgcnggPyAqLworI2VuZGlmCisKKy8qIAorICogUHJvdGVjdGVkIGNvbW1hbmRzOgorICogTWF5IG9ubHkgYmUgaXNzdWVkIGJ5ICJuZXR3b3JrIGFkbWluaXN0cmF0aW9uIGNhcGFibGUiIHByb2Nlc3MuCisgKiBBY2NlcHRlZCBieSBvd24gbm9kZSwgb3IgYnkgcmVtb3RlIG5vZGUgb25seSBpZiByZW1vdGUgbWFuYWdlbWVudCBlbmFibGVkCisgKiBhbmQgdGhpcyBub2RlIGlzIHpvbmUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgIAorICovCisKKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9SRU1PVEVfTU5HICAgIDB4NDAwMyAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9QT1JUUyAgICAgMHg0MDA0ICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX1BVQkwgICAgICAweDQwMDUgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9NQVhfU1VCU0NSICAgIDB4NDAwNiAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9aT05FUyAgICAgMHg0MDA3ICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX0NMVVNURVJTICAweDQwMDggICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9NQVhfTk9ERVMgICAgIDB4NDAwOSAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9TTEFWRVMgICAgMHg0MDBBICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTkVUSUQgICAgICAgICAweDQwMEIgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKworI2RlZmluZSAgVElQQ19DTURfRU5BQkxFX0JFQVJFUiAgICAgMHg0MTAxICAgIC8qIHR4IGJlYXJlcl9jb25maWcsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0RJU0FCTEVfQkVBUkVSICAgIDB4NDEwMiAgICAvKiB0eCBiZWFyZXJfbmFtZSwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX0xJTktfVE9MICAgICAgMHg0MTA3ICAgIC8qIHR4IGxpbmtfY29uZmlnLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTElOS19QUkkgICAgICAweDQxMDggICAgLyogdHggbGlua19jb25maWcsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9MSU5LX1dJTkRPVyAgIDB4NDEwOSAgICAvKiB0eCBsaW5rX2NvbmZpZywgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX0xPR19TSVpFICAgICAgMHg0MTBBICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9EVU1QX0xPRyAgICAgICAgICAweDQxMEIgICAgLyogdHggbm9uZSwgcnggdWx0cmFfc3RyaW5nICovCisjZGVmaW5lICBUSVBDX0NNRF9SRVNFVF9MSU5LX1NUQVRTICAweDQxMEMgICAgLyogdHggbGlua19uYW1lLCByeCBub25lICovCisKKyNpZiAwCisjZGVmaW5lICBUSVBDX0NNRF9DUkVBVEVfTElOSyAgICAgICAweDQxMDMgICAgLyogdHggbGlua19jcmVhdGUsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1JFTU9WRV9MSU5LICAgICAgIDB4NDEwNCAgICAvKiB0eCBsaW5rX25hbWUsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0JMT0NLX0xJTksgICAgICAgIDB4NDEwNSAgICAvKiB0eCBsaW5rX25hbWUsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1VOQkxPQ0tfTElOSyAgICAgIDB4NDEwNiAgICAvKiB0eCBsaW5rX25hbWUsIHJ4IG5vbmUgKi8KKyNlbmRpZgorCisvKiAKKyAqIFByaXZhdGUgY29tbWFuZHM6CisgKiBNYXkgb25seSBiZSBpc3N1ZWQgYnkgIm5ldHdvcmsgYWRtaW5pc3RyYXRpb24gY2FwYWJsZSIgcHJvY2Vzcy4KKyAqIEFjY2VwdGVkIGJ5IG93biBub2RlIG9ubHk7IGNhbm5vdCBiZSB1c2VkIG9uIGEgcmVtb3RlIG5vZGUuICAgICAgICAgICAgICAgICAgICAgICAKKyAqLworCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTk9ERV9BRERSICAgICAweDgwMDEgICAgLyogdHggbmV0X2FkZHIsIHJ4IG5vbmUgKi8KKyNpZiAwCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfWk9ORV9NQVNURVIgICAweDgwMDIgICAgLyogdHggbm9uZSwgcnggbm9uZSAqLworI2VuZGlmCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfUkVNT1RFX01ORyAgICAweDgwMDMgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9NQVhfUE9SVFMgICAgIDB4ODAwNCAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9QVUJMICAgICAgMHg4MDA1ICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX1NVQlNDUiAgICAweDgwMDYgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9NQVhfWk9ORVMgICAgIDB4ODAwNyAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9DTFVTVEVSUyAgMHg4MDA4ICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX05PREVTICAgICAweDgwMDkgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9NQVhfU0xBVkVTICAgIDB4ODAwQSAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX05FVElEICAgICAgICAgMHg4MDBCICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisKKy8qCisgKiBUTFYgdHlwZXMgZGVmaW5lZCBmb3IgVElQQworICovCisKKyNkZWZpbmUgVElQQ19UTFZfTk9ORQkJMAkvKiBubyBUTFYgcHJlc2VudCAqLworI2RlZmluZSBUSVBDX1RMVl9WT0lECQkxCS8qIGVtcHR5IFRMViAoMCBkYXRhIGJ5dGVzKSovCisjZGVmaW5lIFRJUENfVExWX1VOU0lHTkVECTIJLyogMzItYml0IGludGVnZXIgKi8KKyNkZWZpbmUgVElQQ19UTFZfU1RSSU5HCQkzCS8qIGNoYXJbMTI4XSAobWF4KSAqLworI2RlZmluZSBUSVBDX1RMVl9MQVJHRV9TVFJJTkcJNAkvKiBjaGFyWzIwNDhdIChtYXgpICovCisjZGVmaW5lIFRJUENfVExWX1VMVFJBX1NUUklORwk1CS8qIGNoYXJbMzI3NjhdIChtYXgpICovCisKKyNkZWZpbmUgVElQQ19UTFZfRVJST1JfU1RSSU5HCTE2CS8qIGNoYXJbMTI4XSBjb250YWluaW5nICJlcnJvciBjb2RlIiAqLworI2RlZmluZSBUSVBDX1RMVl9ORVRfQUREUiAgIAkxNwkvKiAzMi1iaXQgaW50ZWdlciBkZW5vdGluZyA8Wi5DLk4+ICovCisjZGVmaW5lIFRJUENfVExWX01FRElBX05BTUUJMTgJLyogY2hhcltUSVBDX01BWF9NRURJQV9OQU1FXSAqLworI2RlZmluZSBUSVBDX1RMVl9CRUFSRVJfTkFNRQkxOQkvKiBjaGFyW1RJUENfTUFYX0JFQVJFUl9OQU1FXSAqLworI2RlZmluZSBUSVBDX1RMVl9MSU5LX05BTUUJMjAJLyogY2hhcltUSVBDX01BWF9MSU5LX05BTUVdICovCisjZGVmaW5lIFRJUENfVExWX05PREVfSU5GTwkyMQkvKiBzdHJ1Y3QgdGlwY19ub2RlX2luZm8gKi8KKyNkZWZpbmUgVElQQ19UTFZfTElOS19JTkZPCTIyCS8qIHN0cnVjdCB0aXBjX2xpbmtfaW5mbyAqLworI2RlZmluZSBUSVBDX1RMVl9CRUFSRVJfQ09ORklHICAyMwkvKiBzdHJ1Y3QgdGlwY19iZWFyZXJfY29uZmlnICovCisjZGVmaW5lIFRJUENfVExWX0xJTktfQ09ORklHICAgIDI0CS8qIHN0cnVjdCB0aXBjX2xpbmtfY29uZmlnICovCisjZGVmaW5lIFRJUENfVExWX05BTUVfVEJMX1FVRVJZCTI1CS8qIHN0cnVjdCB0aXBjX25hbWVfdGFibGVfcXVlcnkgKi8KKyNkZWZpbmUgVElQQ19UTFZfUE9SVF9SRUYgICAJMjYJLyogMzItYml0IHBvcnQgcmVmZXJlbmNlICovCisKKy8qCisgKiBNYXhpbXVtIHNpemVzIG9mIFRJUEMgYmVhcmVyLXJlbGF0ZWQgbmFtZXMgKGluY2x1ZGluZyB0ZXJtaW5hdGluZyBOVUwpCisgKi8gCisKKyNkZWZpbmUgVElQQ19NQVhfTUVESUFfTkFNRQkxNgkvKiBmb3JtYXQgPSBtZWRpYSAqLworI2RlZmluZSBUSVBDX01BWF9JRl9OQU1FCTE2CS8qIGZvcm1hdCA9IGludGVyZmFjZSAqLworI2RlZmluZSBUSVBDX01BWF9CRUFSRVJfTkFNRQkzMgkvKiBmb3JtYXQgPSBtZWRpYTppbnRlcmZhY2UgKi8KKyNkZWZpbmUgVElQQ19NQVhfTElOS19OQU1FCTYwCS8qIGZvcm1hdCA9IFouQy5OOmludGVyZmFjZS1aLkMuTjppbnRlcmZhY2UgKi8KKworLyoKKyAqIExpbmsgcHJpb3JpdHkgbGltaXRzIChyYW5nZSBmcm9tIDAgdG8gIyBwcmlvcml0aWVzIC0gMSkKKyAqLworCisjZGVmaW5lIFRJUENfTlVNX0xJTktfUFJJIDMyCisKKy8qCisgKiBMaW5rIHRvbGVyYW5jZSBsaW1pdHMgKG1pbiwgZGVmYXVsdCwgbWF4KSwgaW4gbXMKKyAqLworCisjZGVmaW5lIFRJUENfTUlOX0xJTktfVE9MIDUwCisjZGVmaW5lIFRJUENfREVGX0xJTktfVE9MIDE1MDAKKyNkZWZpbmUgVElQQ19NQVhfTElOS19UT0wgMzAwMDAKKworLyoKKyAqIExpbmsgd2luZG93IGxpbWl0cyAobWluLCBkZWZhdWx0LCBtYXgpLCBpbiBwYWNrZXRzCisgKi8KKworI2RlZmluZSBUSVBDX01JTl9MSU5LX1dJTiAxNgorI2RlZmluZSBUSVBDX0RFRl9MSU5LX1dJTiA1MAorI2RlZmluZSBUSVBDX01BWF9MSU5LX1dJTiAxNTAKKworCitzdHJ1Y3QgdGlwY19ub2RlX2luZm8geworCV9fdTMyIGFkZHI7CQkJLyogbmV0d29yayBhZGRyZXNzIG9mIG5vZGUgKi8KKwlfX3UzMiB1cDsJCQkvKiAwPWRvd24sIDE9IHVwICovCit9OworCitzdHJ1Y3QgdGlwY19saW5rX2luZm8geworCV9fdTMyIGRlc3Q7CQkJLyogbmV0d29yayBhZGRyZXNzIG9mIHBlZXIgbm9kZSAqLworCV9fdTMyIHVwOwkJCS8qIDA9ZG93biwgMT11cCAqLworCWNoYXIgc3RyW1RJUENfTUFYX0xJTktfTkFNRV07CS8qIGxpbmsgbmFtZSAqLworfTsKKworc3RydWN0IHRpcGNfYmVhcmVyX2NvbmZpZyB7CisJX191MzIgcHJpb3JpdHk7CQkJLyogUmFuZ2UgWzEsMzFdLiBPdmVycmlkZSBwZXIgbGluayAgKi8KKwlfX3UzMiBkZXRlY3Rfc2NvcGU7ICAgICAKKwljaGFyIG5hbWVbVElQQ19NQVhfQkVBUkVSX05BTUVdOworfTsKKworc3RydWN0IHRpcGNfbGlua19jb25maWcgeworCV9fdTMyIHZhbHVlOworCWNoYXIgbmFtZVtUSVBDX01BWF9MSU5LX05BTUVdOworfTsKKworI2RlZmluZSBUSVBDX05UUV9BTExUWVBFUyAweDgwMDAwMDAwCisKK3N0cnVjdCB0aXBjX25hbWVfdGFibGVfcXVlcnkgeworCV9fdTMyIGRlcHRoOwkvKiAxOnR5cGUsIDI6K25hbWUgaW5mbywgMzorcG9ydCBpbmZvLCA0KzorZGVidWcgaW5mbyAqLworCV9fdTMyIHR5cGU7CS8qIHt0LGwsdX0gaW5mbyBpZ25vcmVkIGlmIGhpZ2ggYml0IG9mICJkZXB0aCIgaXMgc2V0ICovCisJX191MzIgbG93Ym91bmQ7IC8qIChpLmUuIGRpc3BsYXlzIGFsbCBlbnRyaWVzIG9mIG5hbWUgdGFibGUpICovCisJX191MzIgdXBib3VuZDsKK307CisKKy8qCisgKiBUaGUgZXJyb3Igc3RyaW5nIFRMViBpcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY2F1c2UgCisgKiBvZiB0aGUgcmVxdWVzdCBmYWlsdXJlLiAgVG8gc2ltcGxpZnkgZXJyb3IgcHJvY2Vzc2luZyAoYW5kIHRvIHNhdmUgc3BhY2UpCisgKiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgY2FuIGJlIGEgc3BlY2lhbCBlcnJvciBjb2RlIGNoYXJhY3RlcgorICogKGx5aW5nIGJ5IHRoZSByYW5nZSAweDgwIHRvIDB4RkYpIHdoaWNoIHJlcHJlc2VudHMgYSBwcmUtZGVmaW5lZCByZWFzb24uCisgKi8KKworI2RlZmluZSBUSVBDX0NGR19UTFZfRVJST1IgICAgICAiXHg4MCIgIC8qIHJlcXVlc3QgY29udGFpbnMgaW5jb3JyZWN0IFRMVihzKSAqLworI2RlZmluZSBUSVBDX0NGR19OT1RfTkVUX0FETUlOICAiXHg4MSIJLyogbXVzdCBiZSBuZXR3b3JrIGFkbWluaXN0cmF0b3IgKi8KKyNkZWZpbmUgVElQQ19DRkdfTk9UX1pPTkVfTVNUUgkiXHg4MiIJLyogbXVzdCBiZSB6b25lIG1hc3RlciAqLworI2RlZmluZSBUSVBDX0NGR19OT19SRU1PVEUJIlx4ODMiCS8qIHJlbW90ZSBtYW5hZ2VtZW50IG5vdCBlbmFibGVkICovCisjZGVmaW5lIFRJUENfQ0ZHX05PVF9TVVBQT1JURUQgICJceDg0IgkvKiByZXF1ZXN0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgVElQQyAqLworI2RlZmluZSBUSVBDX0NGR19JTlZBTElEX1ZBTFVFICAiXHg4NSIgIC8qIHJlcXVlc3QgaGFzIGludmFsaWQgYXJndW1lbnQgdmFsdWUgKi8KKworI2lmIDAKKy8qIHByb3RvdHlwZXMgVExWIHN0cnVjdHVyZXMgZm9yIHByb3Bvc2VkIGNvbW1hbmRzICovCitzdHJ1Y3QgdGlwY19saW5rX2NyZWF0ZSB7CisJX191MzIgICBkb21haW47CisJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBwZWVyX2FkZHI7CisJY2hhciBiZWFyZXJfbmFtZVtUSVBDX01BWF9CRUFSRVJfTkFNRV07Cit9OworCitzdHJ1Y3QgdGlwY19yb3V0ZV9pbmZvIHsKKwlfX3UzMiBkZXN0OworCV9fdTMyIHJvdXRlcjsKK307CisjZW5kaWYKKworLyoKKyAqIEEgVExWIGNvbnNpc3RzIG9mIGEgZGVzY3JpcHRvciwgZm9sbG93ZWQgYnkgdGhlIFRMViB2YWx1ZS4KKyAqIFRMViBkZXNjcmlwdG9yIGZpZWxkcyBhcmUgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlcjsgCisgKiBUTFYgdmFsdWVzIG11c3QgYWxzbyBiZSBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyICh3aGVyZSBhcHBsaWNhYmxlKS4KKyAqIFRMViBkZXNjcmlwdG9ycyBtdXN0IGJlIGFsaWduZWQgdG8gYWRkcmVzc2VzIHdoaWNoIGFyZSBtdWx0aXBsZSBvZiA0LAorICogc28gdXAgdG8gMyBieXRlcyBvZiBwYWRkaW5nIG1heSBleGlzdCBhdCB0aGUgZW5kIG9mIHRoZSBUTFYgdmFsdWUgYXJlYS4KKyAqIFRoZXJlIG11c3Qgbm90IGJlIGFueSBwYWRkaW5nIGJldHdlZW4gdGhlIFRMViBkZXNjcmlwdG9yIGFuZCBpdHMgdmFsdWUuCisgKi8KKworc3RydWN0IHRsdl9kZXNjIHsKKwlfX3UxNiB0bHZfbGVuOwkJLyogVExWIGxlbmd0aCAoZGVzY3JpcHRvciArIHZhbHVlKSAqLworCV9fdTE2IHRsdl90eXBlOwkJLyogVExWIGlkZW50aWZpZXIgKi8KK307CisKKyNkZWZpbmUgVExWX0FMSUdOVE8gNAorCisjZGVmaW5lIFRMVl9BTElHTihkYXRhbGVuKSAoKChkYXRhbGVuKSsoVExWX0FMSUdOVE8tMSkpICYgfihUTFZfQUxJR05UTy0xKSkKKyNkZWZpbmUgVExWX0xFTkdUSChkYXRhbGVuKSAoc2l6ZW9mKHN0cnVjdCB0bHZfZGVzYykgKyAoZGF0YWxlbikpCisjZGVmaW5lIFRMVl9TUEFDRShkYXRhbGVuKSAoVExWX0FMSUdOKFRMVl9MRU5HVEgoZGF0YWxlbikpKQorI2RlZmluZSBUTFZfREFUQSh0bHYpICgodm9pZCAqKSgoY2hhciAqKSh0bHYpICsgVExWX0xFTkdUSCgwKSkpCisKK3N0YXRpYyBpbmxpbmUgaW50IFRMVl9PSyhjb25zdCB2b2lkICp0bHYsIF9fdTE2IHNwYWNlKQoreworCS8qCisJICogV291bGQgYWxzbyBsaWtlIHRvIGNoZWNrIHRoYXQgInRsdiIgaXMgYSBtdWx0aXBsZSBvZiA0LAorCSAqIGJ1dCBkb24ndCBrbm93IGhvdyB0byBkbyB0aGlzIGluIGEgcG9ydGFibGUgd2F5LgorCSAqIC0gVHJpZWQgZG9pbmcgKCEodGx2ICYgKFRMVl9BTElHTlRPLTEpKSksIGJ1dCBHQ0MgY29tcGlsZXIKKwkgKiAgIHdvbid0IGFsbG93IGJpbmFyeSAiJiIgd2l0aCBhIHBvaW50ZXIuCisJICogLSBUcmllZCBjYXN0aW5nICJ0bHYiIHRvIGludGVnZXIgdHlwZSwgYnV0IGNhdXNlcyB3YXJuaW5nIGFib3V0IHNpemUKKwkgKiAgIG1pc21hdGNoIHdoZW4gcG9pbnRlciBpcyBiaWdnZXIgdGhhbiBjaG9zZW4gdHlwZSAoaW50LCBsb25nLCAuLi4pLgorCSAqLworCisJcmV0dXJuIChzcGFjZSA+PSBUTFZfU1BBQ0UoMCkpICYmCisJCShudG9ocygoKHN0cnVjdCB0bHZfZGVzYyAqKXRsdiktPnRsdl9sZW4pIDw9IHNwYWNlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgVExWX0NIRUNLKGNvbnN0IHZvaWQgKnRsdiwgX191MTYgc3BhY2UsIF9fdTE2IGV4cF90eXBlKQoreworCXJldHVybiBUTFZfT0sodGx2LCBzcGFjZSkgJiYgCisJCShudG9ocygoKHN0cnVjdCB0bHZfZGVzYyAqKXRsdiktPnRsdl90eXBlKSA9PSBleHBfdHlwZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFRMVl9TRVQodm9pZCAqdGx2LCBfX3UxNiB0eXBlLCB2b2lkICpkYXRhLCBfX3UxNiBsZW4pCit7CisJc3RydWN0IHRsdl9kZXNjICp0bHZfcHRyOworCWludCB0bHZfbGVuOworCisJdGx2X2xlbiA9IFRMVl9MRU5HVEgobGVuKTsKKwl0bHZfcHRyID0gKHN0cnVjdCB0bHZfZGVzYyAqKXRsdjsKKwl0bHZfcHRyLT50bHZfdHlwZSA9IGh0b25zKHR5cGUpOworCXRsdl9wdHItPnRsdl9sZW4gID0gaHRvbnModGx2X2xlbik7CisJaWYgKGxlbiAmJiBkYXRhKQorCQltZW1jcHkoVExWX0RBVEEodGx2X3B0ciksIGRhdGEsIHRsdl9sZW4pOworCXJldHVybiBUTFZfU1BBQ0UobGVuKTsKK30KKworLyoKKyAqIEEgVExWIGxpc3QgZGVzY3JpcHRvciBzaW1wbGlmaWVzIHByb2Nlc3Npbmcgb2YgbWVzc2FnZXMgCisgKiBjb250YWluaW5nIG11bHRpcGxlIFRMVnMuCisgKi8KKworc3RydWN0IHRsdl9saXN0X2Rlc2MgeworCXN0cnVjdCB0bHZfZGVzYyAqdGx2X3B0cjsJLyogcHRyIHRvIGN1cnJlbnQgVExWICovCisJX191MzIgdGx2X3NwYWNlOwkJLyogIyBieXRlcyBmcm9tIGN1cnIgVExWIHRvIGxpc3QgZW5kICovCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgVExWX0xJU1RfSU5JVChzdHJ1Y3QgdGx2X2xpc3RfZGVzYyAqbGlzdCwgCisJCQkJIHZvaWQgKmRhdGEsIF9fdTMyIHNwYWNlKQoreworCWxpc3QtPnRsdl9wdHIgPSAoc3RydWN0IHRsdl9kZXNjICopZGF0YTsKKwlsaXN0LT50bHZfc3BhY2UgPSBzcGFjZTsKK30KKwkgICAgIAorc3RhdGljIGlubGluZSBpbnQgVExWX0xJU1RfRU1QVFkoc3RydWN0IHRsdl9saXN0X2Rlc2MgKmxpc3QpCit7IAorCXJldHVybiAobGlzdC0+dGx2X3NwYWNlID09IDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBUTFZfTElTVF9DSEVDSyhzdHJ1Y3QgdGx2X2xpc3RfZGVzYyAqbGlzdCwgX191MTYgZXhwX3R5cGUpCit7CisJcmV0dXJuIFRMVl9DSEVDSyhsaXN0LT50bHZfcHRyLCBsaXN0LT50bHZfc3BhY2UsIGV4cF90eXBlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpUTFZfTElTVF9EQVRBKHN0cnVjdCB0bHZfbGlzdF9kZXNjICpsaXN0KQoreworCXJldHVybiBUTFZfREFUQShsaXN0LT50bHZfcHRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFRMVl9MSVNUX1NURVAoc3RydWN0IHRsdl9saXN0X2Rlc2MgKmxpc3QpCit7CisJX191MTYgdGx2X3NwYWNlID0gVExWX0FMSUdOKG50b2hzKGxpc3QtPnRsdl9wdHItPnRsdl9sZW4pKTsKKworICAgICAgICBsaXN0LT50bHZfcHRyID0gKHN0cnVjdCB0bHZfZGVzYyAqKSgoY2hhciAqKWxpc3QtPnRsdl9wdHIgKyB0bHZfc3BhY2UpOworCWxpc3QtPnRsdl9zcGFjZSAtPSB0bHZfc3BhY2U7Cit9CisKKy8qCisgKiBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGV4Y2hhbmdlZCB2aWEgTkVUTElOS19HRU5FUklDIHVzZSB0aGUgZm9sbG93aW5nCisgKiBmYW1pbHkgaWQsIG5hbWUsIHZlcnNpb24gYW5kIGNvbW1hbmQuCisgKi8KKyNkZWZpbmUgVElQQ19HRU5MX05BTUUJCSJUSVBDIgorI2RlZmluZSBUSVBDX0dFTkxfVkVSU0lPTgkweDEKKyNkZWZpbmUgVElQQ19HRU5MX0NNRAkJMHgxCisKKy8qCisgKiBUSVBDIHNwZWNpZmljIGhlYWRlciB1c2VkIGluIE5FVExJTktfR0VORVJJQyByZXF1ZXN0cy4KKyAqLworc3RydWN0IHRpcGNfZ2VubG1zZ2hkciB7CisJX191MzIgZGVzdDsJCS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlfX3UxNiBjbWQ7CQkvKiBDb21tYW5kICovCisJX191MTYgcmVzZXJ2ZWQ7CQkvKiBVbnVzZWQgKi8KK307CisKKyNkZWZpbmUgVElQQ19HRU5MX0hEUkxFTglOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHRpcGNfZ2VubG1zZ2hkcikpCisKKy8qCisgKiBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGV4Y2hhbmdlZCB2aWEgVElQQyBzb2NrZXRzIHVzZSB0aGUgVElQQyBjb25maWd1cmF0aW9uIAorICogbWVzc2FnZSBoZWFkZXIsIHdoaWNoIGlzIGRlZmluZWQgYmVsb3cuICBUaGlzIHN0cnVjdHVyZSBpcyBhbmFsb2dvdXMgCisgKiB0byB0aGUgTmV0bGluayBtZXNzYWdlIGhlYWRlciwgYnV0IGZpZWxkcyBhcmUgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAKKyAqIGFuZCBubyBwYWRkaW5nIGlzIHBlcm1pdHRlZCBiZXR3ZWVuIHRoZSBoZWFkZXIgYW5kIHRoZSBtZXNzYWdlIGRhdGEgCisgKiB0aGF0IGZvbGxvd3MuCisgKi8KKworc3RydWN0IHRpcGNfY2ZnX21zZ19oZHIKK3sKKwlfX3UzMiB0Y21fbGVuOwkJLyogTWVzc2FnZSBsZW5ndGggKGluY2x1ZGluZyBoZWFkZXIpICovCisJX191MTYgdGNtX3R5cGU7CQkvKiBDb21tYW5kIHR5cGUgKi8KKwlfX3UxNiB0Y21fZmxhZ3M7CS8qIEFkZGl0aW9uYWwgZmxhZ3MgKi8KKwljaGFyICB0Y21fcmVzZXJ2ZWRbOF07CS8qIFVudXNlZCAqLworfTsKKworI2RlZmluZSBUQ01fRl9SRVFVRVNUCTB4MQkvKiBGbGFnOiBSZXF1ZXN0IG1lc3NhZ2UgKi8KKyNkZWZpbmUgVENNX0ZfTU9SRQkweDIJLyogRmxhZzogTWVzc2FnZSB0byBiZSBjb250aW51ZWQgKi8KKworI2RlZmluZSBUQ01fQUxJR04oZGF0YWxlbikgICgoKGRhdGFsZW4pKzMpICYgfjMpCisjZGVmaW5lIFRDTV9MRU5HVEgoZGF0YWxlbikgKHNpemVvZihzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkcikgKyBkYXRhbGVuKQorI2RlZmluZSBUQ01fU1BBQ0UoZGF0YWxlbikgIChUQ01fQUxJR04oVENNX0xFTkdUSChkYXRhbGVuKSkpCisjZGVmaW5lIFRDTV9EQVRBKHRjbV9oZHIpICAgKCh2b2lkICopKChjaGFyICopKHRjbV9oZHIpICsgVENNX0xFTkdUSCgwKSkpCisKK3N0YXRpYyBpbmxpbmUgaW50IFRDTV9TRVQodm9pZCAqbXNnLCBfX3UxNiBjbWQsIF9fdTE2IGZsYWdzLAorCQkJICB2b2lkICpkYXRhLCBfX3UxNiBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciAqdGNtX2hkcjsKKwlpbnQgbXNnX2xlbjsKKworCW1zZ19sZW4gPSBUQ01fTEVOR1RIKGRhdGFfbGVuKTsKKwl0Y21faGRyID0gKHN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyICopbXNnOworCXRjbV9oZHItPnRjbV9sZW4gICA9IGh0b25sKG1zZ19sZW4pOworCXRjbV9oZHItPnRjbV90eXBlICA9IGh0b25zKGNtZCk7CisJdGNtX2hkci0+dGNtX2ZsYWdzID0gaHRvbnMoZmxhZ3MpOworCWlmIChkYXRhX2xlbiAmJiBkYXRhKQorCQltZW1jcHkoVENNX0RBVEEobXNnKSwgZGF0YSwgZGF0YV9sZW4pOworCXJldHVybiBUQ01fU1BBQ0UoZGF0YV9sZW4pOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2dlbmV0bGluay5oIGIvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKaW5kZXggYzViOTZiMi4uODA1ZGU1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKQEAgLTIyLDcgKzIyLDYgQEAKIAljaGFyCQkJbmFtZVtHRU5MX05BTVNJWl07CiAJdW5zaWduZWQgaW50CQl2ZXJzaW9uOwogCXVuc2lnbmVkIGludAkJbWF4YXR0cjsKLQlzdHJ1Y3QgbW9kdWxlICoJCW93bmVyOwogCXN0cnVjdCBubGF0dHIgKioJYXR0cmJ1ZjsJLyogcHJpdmF0ZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJb3BzX2xpc3Q7CS8qIHByaXZhdGUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWZhbWlseV9saXN0OwkvKiBwcml2YXRlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaXB2NC5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2lwdjQvbmZfY29ubnRyYWNrX2lwdjQuaAppbmRleCAyNWIwODFhLi45MTY4NDQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaXB2NC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9pcHY0L25mX2Nvbm50cmFja19pcHY0LmgKQEAgLTM3LDcgKzM3LDQgQEAKIHN0cnVjdCBza19idWZmICoKIG5mX2N0X2lwdjRfY3RfZ2F0aGVyX2ZyYWdzKHN0cnVjdCBza19idWZmICpza2IpOwogCi0vKiBjYWxsIHRvIGNyZWF0ZSBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIG5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuICovCi1leHRlcm4gdm9pZCBuZWVkX2lwX2Nvbm50cmFjayh2b2lkKTsKLQogI2VuZGlmIC8qX05GX0NPTk5UUkFDS19JUFY0X0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCmluZGV4IDY0YjgyYjcuLjZkMDc1Y2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKQEAgLTIyMSw5ICsyMjEsNiBAQAogZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICoKIF9fbmZfY29ubnRyYWNrX2hlbHBlcl9maW5kX2J5bmFtZShjb25zdCBjaGFyICpuYW1lKTsKIAotLyogY2FsbCB0byBjcmVhdGUgYW4gZXhwbGljaXQgZGVwZW5kZW5jeSBvbiBuZl9jb25udHJhY2suICovCi1leHRlcm4gdm9pZCBuZWVkX25mX2Nvbm50cmFjayh2b2lkKTsKLQogZXh0ZXJuIGludCBuZl9jdF9pbnZlcnRfdHVwbGVwcihzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICppbnZlcnNlLAogCQkJCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKm9yaWcpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmgKaW5kZXggMTRjZTc5MC4uNTMwZWYxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaApAQCAtMTExLDcgKzExMSw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjZGVmaW5lIE5GX0NUX0RVTVBfVFVQTEUodHApCQkJCQkJICAgIFwKLURFQlVHUCgidHVwbGUgJXA6ICV1ICV1ICUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAlaHUgLT4gJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICVodVxuIiwJCQkJCSAgICBcCitERUJVR1AoInR1cGxlICVwOiAldSAldSAiIE5JUDZfRk1UICIgJWh1IC0+ICIgTklQNl9GTVQgIiAlaHVcbiIsCSAgICBcCiAJKHRwKSwgKHRwKS0+c3JjLmwzbnVtLCAodHApLT5kc3QucHJvdG9udW0sCQkJICAgIFwKIAlOSVA2KCooc3RydWN0IGluNl9hZGRyICopKHRwKS0+c3JjLnUzLmFsbCksIG50b2hzKCh0cCktPnNyYy51LmFsbCksIFwKIAlOSVA2KCooc3RydWN0IGluNl9hZGRyICopKHRwKS0+ZHN0LnUzLmFsbCksIG50b2hzKCh0cCktPmRzdC51LmFsbCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaCBiL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCmluZGV4IDhmMjQxMjEuLmE1NTNmMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCkBAIC0yMjUsMTMgKzIyNSwxMyBAQAogCWlmIChzY3RwX2RlYnVnX2ZsYWcpIHsgXAogCQlpZiAoc2FkZHItPnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeyBcCiAJCQlwcmludGsoS0VSTl9ERUJVRyBcCi0JCQkgICAgICAgbGVhZCAiJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4IiB0cmFpbCwgXAorCQkJICAgICAgIGxlYWQgTklQNl9GTVQgdHJhaWwsIFwKIAkJCSAgICAgICBsZWFkcGFybSwgXAogCQkJICAgICAgIE5JUDYoc2FkZHItPnY2LnNpbjZfYWRkciksIFwKIAkJCSAgICAgICBvdGhlcnBhcm1zKTsgXAogCQl9IGVsc2UgeyBcCiAJCQlwcmludGsoS0VSTl9ERUJVRyBcCi0JCQkgICAgICAgbGVhZCAiJXUuJXUuJXUuJXUiIHRyYWlsLCBcCisJCQkgICAgICAgbGVhZCBOSVBRVUFEX0ZNVCB0cmFpbCwgXAogCQkJICAgICAgIGxlYWRwYXJtLCBcCiAJCQkgICAgICAgTklQUVVBRChzYWRkci0+djQuc2luX2FkZHIuc19hZGRyKSwgXAogCQkJICAgICAgIG90aGVycGFybXMpOyBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90aXBjL3RpcGMuaCBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjY2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC90aXBjL3RpcGMuaApAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIGluY2x1ZGUvbmV0L3RpcGMvdGlwYy5oOiBNYWluIGluY2x1ZGUgZmlsZSBmb3IgVElQQyB1c2VycworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9ORVRfVElQQ19IXworI2RlZmluZSBfTkVUX1RJUENfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3RpcGMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworLyogCisgKiBOYXRpdmUgQVBJCisgKi8KKworLyoKKyAqIFRJUEMgb3BlcmF0aW5nIG1vZGUgcm91dGluZXMKKyAqLworCit1MzIgdGlwY19nZXRfYWRkcih2b2lkKTsKKworI2RlZmluZSBUSVBDX05PVF9SVU5OSU5HICAwCisjZGVmaW5lIFRJUENfTk9ERV9NT0RFICAgIDEKKyNkZWZpbmUgVElQQ19ORVRfTU9ERSAgICAgMgorCit0eXBlZGVmIHZvaWQgKCp0aXBjX21vZGVfZXZlbnQpKHZvaWQgKnVzcl9oYW5kbGUsIGludCBtb2RlLCB1MzIgYWRkcik7CisKK2ludCB0aXBjX2F0dGFjaCh1bnNpZ25lZCBpbnQgKnVzZXJyZWYsIHRpcGNfbW9kZV9ldmVudCwgdm9pZCAqdXNyX2hhbmRsZSk7CisKK3ZvaWQgdGlwY19kZXRhY2godW5zaWduZWQgaW50IHVzZXJyZWYpOworCitpbnQgdGlwY19nZXRfbW9kZSh2b2lkKTsKKworLyoKKyAqIFRJUEMgcG9ydCBtYW5pcHVsYXRpb24gcm91dGluZXMKKyAqLworCit0eXBlZGVmIHZvaWQgKCp0aXBjX21zZ19lcnJfZXZlbnQpICh2b2lkICp1c3JfaGFuZGxlLAorCQkJCSAgICB1MzIgcG9ydHJlZiwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKipidWYsCisJCQkJICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgKmRhdGEsCisJCQkJICAgIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgICBpbnQgcmVhc29uLCAKKwkJCQkgICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICphdHRtcHRfZGVzdGlkKTsKKwordHlwZWRlZiB2b2lkICgqdGlwY19uYW1lZF9tc2dfZXJyX2V2ZW50KSAodm9pZCAqdXNyX2hhbmRsZSwKKwkJCQkJICB1MzIgcG9ydHJlZiwKKwkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKmJ1ZiwKKwkJCQkJICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkYXRhLAorCQkJCQkgIHVuc2lnbmVkIGludCBzaXplLAorCQkJCQkgIGludCByZWFzb24sIAorCQkJCQkgIHN0cnVjdCB0aXBjX25hbWVfc2VxIGNvbnN0ICphdHRtcHRfZGVzdCk7CisKK3R5cGVkZWYgdm9pZCAoKnRpcGNfY29ubl9zaHV0ZG93bl9ldmVudCkgKHZvaWQgKnVzcl9oYW5kbGUsCisJCQkJCSAgdTMyIHBvcnRyZWYsCisJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKipidWYsCisJCQkJCSAgdW5zaWduZWQgY2hhciBjb25zdCAqZGF0YSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkJICBpbnQgcmVhc29uKTsKKwordHlwZWRlZiB2b2lkICgqdGlwY19tc2dfZXZlbnQpICh2b2lkICp1c3JfaGFuZGxlLAorCQkJCXUzMiBwb3J0cmVmLAorCQkJCXN0cnVjdCBza19idWZmICoqYnVmLAorCQkJCXVuc2lnbmVkIGNoYXIgY29uc3QgKmRhdGEsCisJCQkJdW5zaWduZWQgaW50IHNpemUsCisJCQkJdW5zaWduZWQgaW50IGltcG9ydGFuY2UsIAorCQkJCXN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZ2luKTsKKwordHlwZWRlZiB2b2lkICgqdGlwY19uYW1lZF9tc2dfZXZlbnQpICh2b2lkICp1c3JfaGFuZGxlLAorCQkJCSAgICAgIHUzMiBwb3J0cmVmLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICoqYnVmLAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgKmRhdGEsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHNpemUsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGltcG9ydGFuY2UsIAorCQkJCSAgICAgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZywKKwkJCQkgICAgICBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqZGVzdCk7CisKK3R5cGVkZWYgdm9pZCAoKnRpcGNfY29ubl9tc2dfZXZlbnQpICh2b2lkICp1c3JfaGFuZGxlLAorCQkJCSAgICAgdTMyIHBvcnRyZWYsCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKmJ1ZiwKKwkJCQkgICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgKmRhdGEsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKK3R5cGVkZWYgdm9pZCAoKnRpcGNfY29udGludWVfZXZlbnQpICh2b2lkICp1c3JfaGFuZGxlLCAKKwkJCQkgICAgIHUzMiBwb3J0cmVmKTsKKworaW50IHRpcGNfY3JlYXRlcG9ydCh1bnNpZ25lZCBpbnQgdGlwY191c2VyLCAKKwkJICAgIHZvaWQgKnVzcl9oYW5kbGUsIAorCQkgICAgdW5zaWduZWQgaW50IGltcG9ydGFuY2UsIAorCQkgICAgdGlwY19tc2dfZXJyX2V2ZW50IGVycm9yX2NiLCAKKwkJICAgIHRpcGNfbmFtZWRfbXNnX2Vycl9ldmVudCBuYW1lZF9lcnJvcl9jYiwgCisJCSAgICB0aXBjX2Nvbm5fc2h1dGRvd25fZXZlbnQgY29ubl9lcnJvcl9jYiwgCisJCSAgICB0aXBjX21zZ19ldmVudCBtZXNzYWdlX2NiLCAKKwkJICAgIHRpcGNfbmFtZWRfbXNnX2V2ZW50IG5hbWVkX21lc3NhZ2VfY2IsIAorCQkgICAgdGlwY19jb25uX21zZ19ldmVudCBjb25uX21lc3NhZ2VfY2IsIAorCQkgICAgdGlwY19jb250aW51ZV9ldmVudCBjb250aW51ZV9ldmVudF9jYiwvKiBNYXkgYmUgemVybyAqLworCQkgICAgdTMyICpwb3J0cmVmKTsKKworaW50IHRpcGNfZGVsZXRlcG9ydCh1MzIgcG9ydHJlZik7CisKK2ludCB0aXBjX293bmlkZW50aXR5KHUzMiBwb3J0cmVmLCBzdHJ1Y3QgdGlwY19wb3J0aWQgKnBvcnQpOworCitpbnQgdGlwY19wb3J0aW1wb3J0YW5jZSh1MzIgcG9ydHJlZiwgdW5zaWduZWQgaW50ICppbXBvcnRhbmNlKTsKK2ludCB0aXBjX3NldF9wb3J0aW1wb3J0YW5jZSh1MzIgcG9ydHJlZiwgdW5zaWduZWQgaW50IGltcG9ydGFuY2UpOworCitpbnQgdGlwY19wb3J0dW5yZWxpYWJsZSh1MzIgcG9ydHJlZiwgdW5zaWduZWQgaW50ICppc3VucmVsaWFibGUpOworaW50IHRpcGNfc2V0X3BvcnR1bnJlbGlhYmxlKHUzMiBwb3J0cmVmLCB1bnNpZ25lZCBpbnQgaXN1bnJlbGlhYmxlKTsKKworaW50IHRpcGNfcG9ydHVucmV0dXJuYWJsZSh1MzIgcG9ydHJlZiwgdW5zaWduZWQgaW50ICppc3VucmV0dXJuYWJsZSk7CitpbnQgdGlwY19zZXRfcG9ydHVucmV0dXJuYWJsZSh1MzIgcG9ydHJlZiwgdW5zaWduZWQgaW50IGlzdW5yZXR1cm5hYmxlKTsKKworaW50IHRpcGNfcHVibGlzaCh1MzIgcG9ydHJlZiwgdW5zaWduZWQgaW50IHNjb3BlLCAKKwkJIHN0cnVjdCB0aXBjX25hbWVfc2VxIGNvbnN0ICpuYW1lX3NlcSk7CitpbnQgdGlwY193aXRoZHJhdyh1MzIgcG9ydHJlZiwgdW5zaWduZWQgaW50IHNjb3BlLAorCQkgIHN0cnVjdCB0aXBjX25hbWVfc2VxIGNvbnN0ICpuYW1lX3NlcSk7IC8qIDA6IGFsbCAqLworCitpbnQgdGlwY19jb25uZWN0MnBvcnQodTMyIHBvcnRyZWYsIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqcG9ydCk7CisKK2ludCB0aXBjX2Rpc2Nvbm5lY3QodTMyIHBvcnRyZWYpOworCitpbnQgdGlwY19zaHV0ZG93bih1MzIgcmVmKTsgLyogU2VuZHMgU0hVVERPV04gbXNnICovCisKK2ludCB0aXBjX2lzY29ubmVjdGVkKHUzMiBwb3J0cmVmLCBpbnQgKmlzY29ubmVjdGVkKTsKKworaW50IHRpcGNfcGVlcih1MzIgcG9ydHJlZiwgc3RydWN0IHRpcGNfcG9ydGlkICpwZWVyKTsKKworaW50IHRpcGNfcmVmX3ZhbGlkKHUzMiBwb3J0cmVmKTsgCisKKy8qCisgKiBUSVBDIG1lc3NhZ2luZyByb3V0aW5lcworICovCisKKyNkZWZpbmUgVElQQ19QT1JUX0lNUE9SVEFOQ0UgMTAwCS8qIHNlbmQgdXNpbmcgY3VycmVudCBwb3J0IHNldHRpbmcgKi8KKworCitpbnQgdGlwY19zZW5kKHUzMiBwb3J0cmVmLAorCSAgICAgIHVuc2lnbmVkIGludCBudW1fc2VjdCwKKwkgICAgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0KTsKKworaW50IHRpcGNfc2VuZF9idWYodTMyIHBvcnRyZWYsCisJCSAgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKKwkJICB1bnNpZ25lZCBpbnQgZHN6KTsKKworaW50IHRpcGNfc2VuZDJuYW1lKHUzMiBwb3J0cmVmLCAKKwkJICAgc3RydWN0IHRpcGNfbmFtZSBjb25zdCAqbmFtZSwgCisJCSAgIHUzMiBkb21haW4sCS8qIDA6b3duIHpvbmUgKi8KKwkJICAgdW5zaWduZWQgaW50IG51bV9zZWN0LAorCQkgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0KTsKKworaW50IHRpcGNfc2VuZF9idWYybmFtZSh1MzIgcG9ydHJlZiwKKwkJICAgICAgIHN0cnVjdCB0aXBjX25hbWUgY29uc3QgKm5hbWUsCisJCSAgICAgICB1MzIgZG9tYWluLAorCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKKwkJICAgICAgIHVuc2lnbmVkIGludCBkc3opOworCitpbnQgdGlwY19mb3J3YXJkMm5hbWUodTMyIHBvcnRyZWYsIAorCQkgICAgICBzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpuYW1lLCAKKwkJICAgICAgdTMyIGRvbWFpbiwgICAvKjA6IG93biB6b25lICovCisJCSAgICAgIHVuc2lnbmVkIGludCBzZWN0aW9uX2NvdW50LAorCQkgICAgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LAorCQkgICAgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWdpbiwKKwkJICAgICAgdW5zaWduZWQgaW50IGltcG9ydGFuY2UpOworCitpbnQgdGlwY19mb3J3YXJkX2J1ZjJuYW1lKHUzMiBwb3J0cmVmLAorCQkJICBzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpuYW1lLAorCQkJICB1MzIgZG9tYWluLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAorCQkJICB1bnNpZ25lZCBpbnQgZHN6LAorCQkJICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWcsCisJCQkgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlKTsKKworaW50IHRpcGNfc2VuZDJwb3J0KHUzMiBwb3J0cmVmLAorCQkgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKmRlc3QsCisJCSAgIHVuc2lnbmVkIGludCBudW1fc2VjdCwKKwkJICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCk7CisKK2ludCB0aXBjX3NlbmRfYnVmMnBvcnQodTMyIHBvcnRyZWYsCisJCSAgICAgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKmRlc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAorCQkgICAgICAgdW5zaWduZWQgaW50IGRzeik7CisKK2ludCB0aXBjX2ZvcndhcmQycG9ydCh1MzIgcG9ydHJlZiwKKwkJICAgICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpkZXN0LAorCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NlY3QsCisJCSAgICAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsCisJCSAgICAgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZ2luLAorCQkgICAgICB1bnNpZ25lZCBpbnQgaW1wb3J0YW5jZSk7CisKK2ludCB0aXBjX2ZvcndhcmRfYnVmMnBvcnQodTMyIHBvcnRyZWYsCisJCQkgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqZGVzdCwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKKwkJCSAgdW5zaWduZWQgaW50IGRzeiwKKwkJCSAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnLAorCQkJICB1bnNpZ25lZCBpbnQgaW1wb3J0YW5jZSk7CisKK2ludCB0aXBjX211bHRpY2FzdCh1MzIgcG9ydHJlZiwgCisJCSAgIHN0cnVjdCB0aXBjX25hbWVfc2VxIGNvbnN0ICpzZXEsIAorCQkgICB1MzIgZG9tYWluLAkvKiAwOm93biB6b25lICovCisJCSAgIHVuc2lnbmVkIGludCBzZWN0aW9uX2NvdW50LAorCQkgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZyk7CisKKyNpZiAwCitpbnQgdGlwY19tdWx0aWNhc3RfYnVmKHUzMiBwb3J0cmVmLCAKKwkJICAgICAgIHN0cnVjdCB0aXBjX25hbWVfc2VxIGNvbnN0ICpzZXEsIAorCQkgICAgICAgdTMyIGRvbWFpbiwJLyogMDpvd24gem9uZSAqLworCQkgICAgICAgdm9pZCAqYnVmLAorCQkgICAgICAgdW5zaWduZWQgaW50IHNpemUpOworI2VuZGlmCisKKy8qCisgKiBUSVBDIHN1YnNjcmlwdGlvbiByb3V0aW5lcworICovCisKK2ludCB0aXBjX2lzcHVibGlzaGVkKHN0cnVjdCB0aXBjX25hbWUgY29uc3QgKm5hbWUpOworCisvKgorICogR2V0IG51bWJlciBvZiBhdmFpbGFibGUgbm9kZXMgd2l0aGluIHNwZWNpZmllZCBkb21haW4gKGV4Y2x1ZGluZyBvd24gbm9kZSkKKyAqLworCit1bnNpZ25lZCBpbnQgdGlwY19hdmFpbGFibGVfbm9kZXMoY29uc3QgdTMyIGRvbWFpbik7CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19iZWFyZXIuaCBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19iZWFyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTg2MDdjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvdGlwYy90aXBjX2JlYXJlci5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogaW5jbHVkZS9uZXQvdGlwYy90aXBjX2JlYXJlci5oOiBJbmNsdWRlIGZpbGUgZm9yIHByaXZpbGVnZWQgYWNjZXNzIHRvIFRJUEMgYmVhcmVycworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9ORVRfVElQQ19CRUFSRVJfSF8KKyNkZWZpbmUgX05FVF9USVBDX0JFQVJFUl9IXworCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvdGlwY19jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisvKgorICogSWRlbnRpZmllcnMgb2Ygc3VwcG9ydGVkIFRJUEMgbWVkaWEgdHlwZXMKKyAqLworCisjZGVmaW5lIFRJUENfTUVESUFfVFlQRV9FVEgJMQorCitzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIHsKKwlfX3UzMiAgdHlwZTsKKwl1bmlvbiB7CisJCV9fdTggICBldGhfYWRkcls2XTsJLyogRXRoZXJuZXQgYmVhcmVyICovIAorI2lmIDAKKwkJLyogUHJvdG90eXBlcyBmb3Igb3RoZXIgcG9zc2libGUgYmVhcmVyIHR5cGVzICovCisKKwkJc3RydWN0IHsKKwkJCV9fdTE2IHNpbl9mYW1pbHk7CisJCQlfX3UxNiBzaW5fcG9ydDsKKwkJCXN0cnVjdCB7CisJCQkJX191MzIgc19hZGRyOworCQkJfSBzaW5fYWRkcjsKKwkJCWNoYXIgcGFkWzRdOworCQl9IGFkZHJfaW47CQkvKiBJUC1iYXNlZCBiZWFyZXIgKi8KKwkJX191MTYgIHNvY2tfZGVzY3I7CS8qIGdlbmVyaWMgc29ja2V0IGJlYXJlciAqLworI2VuZGlmCisJfSBkZXZfYWRkcjsKK307CisKKy8qKgorICogc3RydWN0IHRpcGNfYmVhcmVyIC0gVElQQyBiZWFyZXIgaW5mbyBhdmFpbGFibGUgdG8gcHJpdmlsZWdlZCB1c2VycworICogQHVzcl9oYW5kbGU6IHBvaW50ZXIgdG8gYWRkaXRpb25hbCB1c2VyLWRlZmluZWQgaW5mb3JtYXRpb24gYWJvdXQgYmVhcmVyCisgKiBAbXR1OiBtYXggcGFja2V0IHNpemUgYmVhcmVyIGNhbiBzdXBwb3J0CisgKiBAYmxvY2tlZDogbm9uLXplcm8gaWYgYmVhcmVyIGlzIGJsb2NrZWQKKyAqIEBsb2NrOiBzcGlubG9jayBmb3IgY29udHJvbGxpbmcgYWNjZXNzIHRvIGJlYXJlcgorICogQGFkZHI6IG1lZGlhLXNwZWNpZmljIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGJlYXJlcgorICogQG5hbWU6IGJlYXJlciBuYW1lIChmb3JtYXQgPSBtZWRpYTppbnRlcmZhY2UpCisgKiAKKyAqIE5vdGU6IFRJUEMgaW5pdGlhbGl6ZXMgIm5hbWUiIGFuZCAibG9jayIgZmllbGRzOyB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogaW5pdGlhbGl6YXRpb24gYWxsIG90aGVyIGZpZWxkcyB3aGVuIGEgYmVhcmVyIGlzIGVuYWJsZWQuCisgKi8KKworc3RydWN0IHRpcGNfYmVhcmVyIHsKKwl2b2lkICp1c3JfaGFuZGxlOworCXUzMiBtdHU7CisJaW50IGJsb2NrZWQ7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgYWRkcjsKKwljaGFyIG5hbWVbVElQQ19NQVhfQkVBUkVSX05BTUVdOworfTsKKworCitpbnQgIHRpcGNfcmVnaXN0ZXJfbWVkaWEodTMyIG1lZGlhX3R5cGUsCisJCQkgY2hhciAqbWVkaWFfbmFtZSwgCisJCQkgaW50ICgqZW5hYmxlKShzdHJ1Y3QgdGlwY19iZWFyZXIgKiksIAorCQkJIHZvaWQgKCpkaXNhYmxlKShzdHJ1Y3QgdGlwY19iZWFyZXIgKiksIAorCQkJIGludCAoKnNlbmRfbXNnKShzdHJ1Y3Qgc2tfYnVmZiAqLCAKKwkJCQkJIHN0cnVjdCB0aXBjX2JlYXJlciAqLAorCQkJCQkgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqKSwgCisJCQkgY2hhciAqKCphZGRyMnN0cikoc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSwKKwkJCQkJICAgY2hhciAqc3RyX2J1ZiwKKwkJCQkJICAgaW50IHN0cl9zaXplKSwKKwkJCSBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpiY2FzdF9hZGRyLAorCQkJIGNvbnN0IHUzMiBiZWFyZXJfcHJpb3JpdHksCisJCQkgY29uc3QgdTMyIGxpbmtfdG9sZXJhbmNlLCAgLyogW21zXSAqLworCQkJIGNvbnN0IHUzMiBzZW5kX3dpbmRvd19saW1pdCk7IAorCit2b2lkIHRpcGNfcmVjdl9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IHRpcGNfYmVhcmVyICp0Yl9wdHIpOworCitpbnQgIHRpcGNfYmxvY2tfYmVhcmVyKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCB0aXBjX2NvbnRpbnVlKHN0cnVjdCB0aXBjX2JlYXJlciAqdGJfcHRyKTsgCisKK2ludCB0aXBjX2VuYWJsZV9iZWFyZXIoY29uc3QgY2hhciAqYmVhcmVyX25hbWUsIHUzMiBiY2FzdF9zY29wZSwgdTMyIHByaW9yaXR5KTsKK2ludCB0aXBjX2Rpc2FibGVfYmVhcmVyKGNvbnN0IGNoYXIgKm5hbWUpOworCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19tc2cuaCBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDA5NmVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvdGlwYy90aXBjX21zZy5oCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogaW5jbHVkZS9uZXQvdGlwYy90aXBjX21zZy5oOiBJbmNsdWRlIGZpbGUgZm9yIHByaXZpbGVnZWQgYWNjZXNzIHRvIFRJUEMgbWVzc2FnZSBoZWFkZXJzCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX05FVF9USVBDX01TR19IXworI2RlZmluZSBfTkVUX1RJUENfTVNHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKK3N0cnVjdCB0aXBjX21zZyB7CisJdTMyIGhkclsxNV07Cit9OworCisKKy8qCisJCVRJUEMgdXNlciBkYXRhIG1lc3NhZ2UgaGVhZGVyIGZvcm1hdCwgdmVyc2lvbiAyOgorCisKKyAgICAgICAxIDAgOSA4IDcgNiA1IDR8MyAyIDEgMCA5IDggNyA2fDUgNCAzIDIgMSAwIDkgOHw3IDYgNSA0IDMgMiAxIDAgCisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzA6fHZlcnMgfCB1c2VyICB8aGRyIHN6IHxufGR8c3wtfCAgICAgICAgICBtZXNzYWdlIHNpemUgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3MTp8bXN0eXB8IGVycm9yIHxyZXIgY250fGxzY3xvcHQgcHwgICAgICBicm9hZGNhc3QgYWNrIG5vICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHcyOnwgICAgICAgIGxpbmsgbGV2ZWwgYWNrIG5vICAgICAgfCAgIGJyb2FkY2FzdC9saW5rIGxldmVsIHNlcSBubyB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzM6fCAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3NDp8ICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmF0aW5nIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHc1OnwgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAKKyAgIHc2OnwgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYXRpbmcgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzc6fCAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBub2RlICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3ODp8ICAgICAgICAgICAgbmFtZSB0eXBlIC8gdHJhbnNwb3J0IHNlcXVlbmNlIG51bWJlciAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHc5OnwgICAgICAgICAgICAgIG5hbWUgaW5zdGFuY2UvbXVsdGljYXN0IGxvd2VyIGJvdW5kICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAKKyAgIHdBOnwgICAgICAgICAgICAgICAgICAgIG11bHRpY2FzdCB1cHBlciBib3VuZCAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAKKyAgICAgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCisgICAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKKyovCisKKyNkZWZpbmUgVElQQ19DT05OX01TRwkwCisjZGVmaW5lIFRJUENfTUNBU1RfTVNHCTEKKyNkZWZpbmUgVElQQ19OQU1FRF9NU0cJMgorI2RlZmluZSBUSVBDX0RJUkVDVF9NU0cJMworCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ193b3JkKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIHBvcykKK3sKKwlyZXR1cm4gbnRvaGwobS0+aGRyW3Bvc10pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfYml0cyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiB3LCB1MzIgcG9zLCB1MzIgbWFzaykKK3sKKwlyZXR1cm4gKG1zZ193b3JkKG0sIHcpID4+IHBvcykgJiBtYXNrOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfaW1wb3J0YW5jZShzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDAsIDI1LCAweGYpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfaGRyX3N6KHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMCwgMjEsIDB4ZikgPDwgMjsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXNnX3Nob3J0KHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gKG1zZ19oZHJfc3oobSkgPT0gMjQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfc2l6ZShzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDAsIDAsIDB4MWZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfZGF0YV9zeihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIChtc2dfc2l6ZShtKSAtIG1zZ19oZHJfc3oobSkpOworfQorCitzdGF0aWMgaW5saW5lIHVuY2hhciAqbXNnX2RhdGEoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiAoKHVuY2hhciAqKW0pICsgbXNnX2hkcl9zeihtKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3R5cGUoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAxLCAyOSwgMHg3KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2RpcmVjdChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIChtc2dfdHlwZShtKSA9PSBUSVBDX0RJUkVDVF9NU0cpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbmFtZWQoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiAobXNnX3R5cGUobSkgPT0gVElQQ19OQU1FRF9NU0cpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbWNhc3Qoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiAobXNnX3R5cGUobSkgPT0gVElQQ19NQ0FTVF9NU0cpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfY29ubmVjdGVkKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gKG1zZ190eXBlKG0pID09IFRJUENfQ09OTl9NU0cpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfZXJyY29kZShzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDEsIDI1LCAweGYpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfcHJldm5vZGUoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfd29yZChtLCAzKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX29yaWdwb3J0KHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19kZXN0cG9ydChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDUpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbWNfbmV0aWQoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfd29yZChtLCA1KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX29yaWdub2RlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlpZiAobGlrZWx5KG1zZ19zaG9ydChtKSkpCisJCXJldHVybiBtc2dfcHJldm5vZGUobSk7CisJcmV0dXJuIG1zZ193b3JkKG0sIDYpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfZGVzdG5vZGUoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfd29yZChtLCA3KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX25hbWV0eXBlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19uYW1laW5zdChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbmFtZWxvd2VyKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX25hbWVpbnN0KG0pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbmFtZXVwcGVyKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgMTApOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKm1zZ19vcHRpb25zKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyICpsZW4pCit7CisJdTMyIHBvcyA9IG1zZ19iaXRzKG0sIDEsIDE2LCAweDcpOworCisJaWYgKCFwb3MpCisJCXJldHVybiAwOworCXBvcyA9IChwb3MgKiA0KSArIDI4OworCSpsZW4gPSBtc2dfaGRyX3N6KG0pIC0gcG9zOworCXJldHVybiAoY2hhciAqKSZtLT5oZHJbcG9zLzRdOworfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90aXBjL3RpcGNfcG9ydC5oIGIvaW5jbHVkZS9uZXQvdGlwYy90aXBjX3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzNiYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvdGlwYy90aXBjX3BvcnQuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIGluY2x1ZGUvbmV0L3RpcGMvdGlwY19wb3J0Lmg6IEluY2x1ZGUgZmlsZSBmb3IgcHJpdmlsZWdlZCBhY2Nlc3MgdG8gVElQQyBwb3J0cworICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9ORVRfVElQQ19QT1JUX0hfCisjZGVmaW5lIF9ORVRfVElQQ19QT1JUX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC90aXBjLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3RpcGMvdGlwY19tc2cuaD4KKworI2RlZmluZSBUSVBDX0ZMT1dfQ09OVFJPTF9XSU4gNTEyCisKKy8qKgorICogc3RydWN0IHRpcGNfcG9ydCAtIG5hdGl2ZSBUSVBDIHBvcnQgaW5mbyBhdmFpbGFibGUgdG8gcHJpdmlsZWdlZCB1c2VycworICogQHVzcl9oYW5kbGU6IHBvaW50ZXIgdG8gYWRkaXRpb25hbCB1c2VyLWRlZmluZWQgaW5mb3JtYXRpb24gYWJvdXQgcG9ydAorICogQGxvY2s6IHBvaW50ZXIgdG8gc3BpbmxvY2sgZm9yIGNvbnRyb2xsaW5nIGFjY2VzcyB0byBwb3J0CisgKiBAY29ubmVjdGVkOiBub24temVybyBpZiBwb3J0IGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gYSBwZWVyIHBvcnQKKyAqIEBjb25uX3R5cGU6IFRJUEMgdHlwZSB1c2VkIHdoZW4gY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQKKyAqIEBjb25uX2luc3RhbmNlOiBUSVBDIGluc3RhbmNlIHVzZWQgd2hlbiBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZAorICogQGNvbm5fdW5hY2tlZDogbnVtYmVyIG9mIHVuYWNrbm93bGVkZ2VkIG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gcGVlciBwb3J0CisgKiBAcHVibGlzaGVkOiBub24temVybyBpZiBwb3J0IGhhcyBvbmUgb3IgbW9yZSBhc3NvY2lhdGVkIG5hbWVzCisgKiBAY29uZ2VzdGVkOiBub24temVybyBpZiBjYW5ub3Qgc2VuZCBiZWNhdXNlIG9mIGxpbmsgb3IgcG9ydCBjb25nZXN0aW9uCisgKiBAcmVmOiB1bmlxdWUgcmVmZXJlbmNlIHRvIHBvcnQgaW4gVElQQyBvYmplY3QgcmVnaXN0cnkKKyAqIEBwaGRyOiBwcmVmb3JtYXR0ZWQgbWVzc2FnZSBoZWFkZXIgdXNlZCB3aGVuIHNlbmRpbmcgbWVzc2FnZXMKKyAqLworCitzdHJ1Y3QgdGlwY19wb3J0IHsKKyAgICAgICAgdm9pZCAqdXNyX2hhbmRsZTsKKyAgICAgICAgc3BpbmxvY2tfdCAqbG9jazsKKwlpbnQgY29ubmVjdGVkOworICAgICAgICB1MzIgY29ubl90eXBlOworICAgICAgICB1MzIgY29ubl9pbnN0YW5jZTsKKwl1MzIgY29ubl91bmFja2VkOworCWludCBwdWJsaXNoZWQ7CisJdTMyIGNvbmdlc3RlZDsKKwl1MzIgcmVmOworCXN0cnVjdCB0aXBjX21zZyBwaGRyOworfTsKKworCisvKioKKyAqIHRpcGNfY3JlYXRlcG9ydF9yYXcgLSBjcmVhdGUgYSBuYXRpdmUgVElQQyBwb3J0IGFuZCByZXR1cm4gaXQncyByZWZlcmVuY2UKKyAqCisgKiBOb3RlOiAnZGlzcGF0Y2hlcicgYW5kICd3YWtldXAnIGRlbGl2ZXIgYSBsb2NrZWQgcG9ydC4KKyAqLworCit1MzIgdGlwY19jcmVhdGVwb3J0X3Jhdyh2b2lkICp1c3JfaGFuZGxlLAorCQkJdTMyICgqZGlzcGF0Y2hlcikoc3RydWN0IHRpcGNfcG9ydCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKSwKKwkJCXZvaWQgKCp3YWtldXApKHN0cnVjdCB0aXBjX3BvcnQgKiksCisJCQljb25zdCB1MzIgaW1wb3J0YW5jZSk7CisKKy8qCisgKiB0aXBjX3NldF9tc2dfb3B0aW9uKCk6IHBvcnQgbXVzdCBiZSBsb2NrZWQuCisgKi8KK2ludCB0aXBjX3NldF9tc2dfb3B0aW9uKHN0cnVjdCB0aXBjX3BvcnQgKnRwX3B0ciwKKwkJCWNvbnN0IGNoYXIgKm9wdCwKKwkJCWNvbnN0IHUzMiBsZW4pOworCitpbnQgdGlwY19yZWplY3RfbXNnKHN0cnVjdCBza19idWZmICpidWYsIHUzMiBlcnIpOworCitpbnQgdGlwY19zZW5kX2J1Zl9mYXN0KHN0cnVjdCBza19idWZmICpidWYsIHUzMiBkZXN0bm9kZSk7CisKK3ZvaWQgdGlwY19hY2tub3dsZWRnZSh1MzIgcG9ydF9yZWYsdTMyIGFjayk7CisKK3N0cnVjdCB0aXBjX3BvcnQgKnRpcGNfZ2V0X3BvcnQoY29uc3QgdTMyIHJlZik7CisKK3ZvaWQgKnRpcGNfZ2V0X2hhbmRsZShjb25zdCB1MzIgcmVmKTsKKworCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oIGIvaW5jbHVkZS9yZG1hL2liX3ZlcmJzLmgKaW5kZXggYTdmNGMzNS4uMjJmYzg4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL2liX3ZlcmJzLmgKKysrIGIvaW5jbHVkZS9yZG1hL2liX3ZlcmJzLmgKQEAgLTg4LDcgKzg4LDYgQEAKIAogc3RydWN0IGliX2RldmljZV9hdHRyIHsKIAl1NjQJCQlmd192ZXI7Ci0JX19iZTY0CQkJbm9kZV9ndWlkOwogCV9fYmU2NAkJCXN5c19pbWFnZV9ndWlkOwogCXU2NAkJCW1heF9tcl9zaXplOwogCXU2NAkJCXBhZ2Vfc2l6ZV9jYXA7CkBAIC05NTEsNiArOTUwLDcgQEAKIAl1NjQJCQkgICAgIHV2ZXJic19jbWRfbWFzazsKIAlpbnQJCQkgICAgIHV2ZXJic19hYmlfdmVyOwogCisJX19iZTY0CQkJICAgICBub2RlX2d1aWQ7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlX3R5cGU7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX3BvcnRfY250OwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9pc2NzaV9pZi5oIGIvaW5jbHVkZS9zY3NpL2lzY3NpX2lmLmgKaW5kZXggYmUxYmM3OS4uM2U1Y2I1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2lzY3NpX2lmLmgKKysrIGIvaW5jbHVkZS9zY3NpL2lzY3NpX2lmLmgKQEAgLTE2OCw2ICsxNjgsMTIgQEAKIAogI2RlZmluZSBpc2NzaV9wdHIoX2hhbmRsZSkgKCh2b2lkKikodW5zaWduZWQgbG9uZylfaGFuZGxlKQogI2RlZmluZSBpc2NzaV9oYW5kbGUoX3B0cikgKCh1aW50NjRfdCkodW5zaWduZWQgbG9uZylfcHRyKQorI2RlZmluZSBob3N0ZGF0YV9zZXNzaW9uKF9ob3N0ZGF0YSkgKGlzY3NpX3B0cigqKHVuc2lnbmVkIGxvbmcgKilfaG9zdGRhdGEpKQorCisvKioKKyAqIGlzY3NpX2hvc3RkYXRhIC0gZ2V0IExMRCBob3N0ZGF0YSBmcm9tIHNjc2lfaG9zdAorICogQF9ob3N0ZGF0YTogcG9pbnRlciB0byBzY3NpIGhvc3QncyBob3N0ZGF0YQorICoqLwogI2RlZmluZSBpc2NzaV9ob3N0ZGF0YShfaG9zdGRhdGEpICgodm9pZCopX2hvc3RkYXRhICsgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2kuaCBiL2luY2x1ZGUvc2NzaS9zY3NpLmgKaW5kZXggNmNiMWUyNy4uYzYwYjhmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2kuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaS5oCkBAIC0zMiw2ICszMiwxMiBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHNjc2lfZGV2aWNlX3R5cGVzW01BWF9TQ1NJX0RFVklDRV9DT0RFXTsKIAogLyoKKyAqIFNwZWNpYWwgdmFsdWUgZm9yIHNjYW5uaW5nIHRvIHNwZWNpZnkgc2Nhbm5pbmcgb3IgcmVzY2FubmluZyBvZiBhbGwKKyAqIHBvc3NpYmxlIGNoYW5uZWxzLCAodGFyZ2V0KSBpZHMsIG9yIGx1bnMgb24gYSBnaXZlbiBzaG9zdC4KKyAqLworI2RlZmluZSBTQ0FOX1dJTERfQ0FSRAl+MAorCisvKgogICogICAgICBTQ1NJIG9wY29kZXMKICAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKaW5kZXggNDFjZmMyOS4uNzUyOWY0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaApAQCAtMTUxLDYgKzE1MSw1IEBACiBleHRlcm4gdm9pZCBzY3NpX3B1dF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKik7CiBleHRlcm4gdm9pZCBzY3NpX2lvX2NvbXBsZXRpb24oc3RydWN0IHNjc2lfY21uZCAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBzY3NpX2ZpbmlzaF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7Ci1leHRlcm4gdm9pZCBzY3NpX3NldHVwX2Jsa19wY19jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiAKICNlbmRpZiAvKiBfU0NTSV9TQ1NJX0NNTkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCmluZGV4IDIzMGJjNTUuLjQ2NzI3NGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogc3RydWN0IGJsb2NrX2RldmljZTsKIHN0cnVjdCBjb21wbGV0aW9uOwpAQCAtNDY5LDcgKzQ3MCw3IEBACiAJc3BpbmxvY2tfdAkJZGVmYXVsdF9sb2NrOwogCXNwaW5sb2NrX3QJCSpob3N0X2xvY2s7CiAKLQlzdHJ1Y3Qgc2VtYXBob3JlCXNjYW5fbXV0ZXg7Lyogc2VyaWFsaXplIHNjYW5uaW5nIGFjdGl2aXR5ICovCisJc3RydWN0IG11dGV4CQlzY2FuX211dGV4Oy8qIHNlcmlhbGl6ZSBzY2FubmluZyBhY3Rpdml0eSAqLwogCiAJc3RydWN0IGxpc3RfaGVhZAllaF9jbWRfcTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgICAgKiBlaGFuZGxlcjsgIC8qIEVycm9yIHJlY292ZXJ5IHRocmVhZC4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0LmgKaW5kZXggZjZlMGJiNC4uZTdiMTA1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0LmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0LmgKQEAgLTMwLDEyICszMCw5IEBACiAJc3RydWN0IHRyYW5zcG9ydF9jb250YWluZXIgZGV2aWNlX2F0dHJzOwogCiAJLyoKLQkgKiBJZiBzZXQsIGNhbGwgdGFyZ2V0X3BhcmVudCBwcmlvciB0byBhbGxvY2F0aW5nIGEgc2NzaV90YXJnZXQsCi0JICogc28gd2UgZ2V0IHRoZSBhcHByb3ByaWF0ZSBwYXJlbnQgZm9yIHRoZSB0YXJnZXQuIFRoaXMgZnVuY3Rpb24KLQkgKiBpcyByZXF1aXJlZCBmb3IgdHJhbnNwb3J0cyBsaWtlIEZDIGFuZCBpU0NTSSB0aGF0IGRvIG5vdCBwdXQgdGhlCi0JICogc2NzaV90YXJnZXQgdW5kZXIgc2NzaV9ob3N0LgorCSAqIElmIHNldCwgY2FsbGVkIGZyb20gc3lzZnMgYW5kIGxlZ2FjeSBwcm9jZnMgcmVzY2FubmluZyBjb2RlLgogCSAqLwotCXN0cnVjdCBkZXZpY2UgKigqdGFyZ2V0X3BhcmVudCkoc3RydWN0IFNjc2lfSG9zdCAqLCBpbnQsIHVpbnQpOworCWludCAoKnVzZXJfc2Nhbikoc3RydWN0IFNjc2lfSG9zdCAqLCB1aW50LCB1aW50LCB1aW50KTsKIAogCS8qIFRoZSBzaXplIG9mIHRoZSBzcGVjaWZpYyB0cmFuc3BvcnQgYXR0cmlidXRlIHN0cnVjdHVyZSAoYQogCSAqIHNwYWNlIG9mIHRoaXMgc2l6ZSB3aWxsIGJlIGxlZnQgYXQgdGhlIGVuZCBvZiB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmgKaW5kZXggMzk0ZjE0YS4uY2YzZmVjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmgKQEAgLTMwMyw2ICszMDMsNyBAQAogCS8qIEZpeGVkIEF0dHJpYnV0ZXMgKi8KIAl1NjQgbm9kZV9uYW1lOwogCXU2NCBwb3J0X25hbWU7CisJdTY0IHBlcm1hbmVudF9wb3J0X25hbWU7CiAJdTMyIHN1cHBvcnRlZF9jbGFzc2VzOwogCXU4ICBzdXBwb3J0ZWRfZmM0c1tGQ19GQzRfTElTVF9TSVpFXTsKIAljaGFyIHN5bWJvbGljX25hbWVbRkNfU1lNQk9MSUNfTkFNRV9TSVpFXTsKQEAgLTMzOCw2ICszMzksOCBAQAogCSgoKHN0cnVjdCBmY19ob3N0X2F0dHJzICopKHgpLT5zaG9zdF9kYXRhKS0+bm9kZV9uYW1lKQogI2RlZmluZSBmY19ob3N0X3BvcnRfbmFtZSh4KQlcCiAJKCgoc3RydWN0IGZjX2hvc3RfYXR0cnMgKikoeCktPnNob3N0X2RhdGEpLT5wb3J0X25hbWUpCisjZGVmaW5lIGZjX2hvc3RfcGVybWFuZW50X3BvcnRfbmFtZSh4KQlcCisJKCgoc3RydWN0IGZjX2hvc3RfYXR0cnMgKikoeCktPnNob3N0X2RhdGEpLT5wZXJtYW5lbnRfcG9ydF9uYW1lKQogI2RlZmluZSBmY19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzKHgpCVwKIAkoKChzdHJ1Y3QgZmNfaG9zdF9hdHRycyAqKSh4KS0+c2hvc3RfZGF0YSktPnN1cHBvcnRlZF9jbGFzc2VzKQogI2RlZmluZSBmY19ob3N0X3N1cHBvcnRlZF9mYzRzKHgpCVwKQEAgLTQyNiw2ICs0MjksNyBAQAogCS8qIGhvc3QgZml4ZWQgYXR0cmlidXRlcyAqLwogCXVuc2lnbmVkIGxvbmcJc2hvd19ob3N0X25vZGVfbmFtZToxOwogCXVuc2lnbmVkIGxvbmcJc2hvd19ob3N0X3BvcnRfbmFtZToxOworCXVuc2lnbmVkIGxvbmcJc2hvd19ob3N0X3Blcm1hbmVudF9wb3J0X25hbWU6MTsKIAl1bnNpZ25lZCBsb25nCXNob3dfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlczoxOwogCXVuc2lnbmVkIGxvbmcJc2hvd19ob3N0X3N1cHBvcnRlZF9mYzRzOjE7CiAJdW5zaWduZWQgbG9uZwlzaG93X2hvc3Rfc3ltYm9saWNfbmFtZToxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmggYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaAppbmRleCBmMjUwNDFjLi4xNjYwMmE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaApAQCAtMjMsOCArMjMsMTQgQEAKICNpZm5kZWYgU0NTSV9UUkFOU1BPUlRfSVNDU0lfSAogI2RlZmluZSBTQ1NJX1RSQU5TUE9SVF9JU0NTSV9ICiAKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL2lzY3NpX2lmLmg+CiAKK3N0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKK3N0cnVjdCBTY3NpX0hvc3Q7CitzdHJ1Y3QgbWVtcG9vbF96b25lOworc3RydWN0IGlzY3NpX2Nsc19jb25uOworCiAvKioKICAqIHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgLSBpU0NTSSBUcmFuc3BvcnQgdGVtcGxhdGUKICAqCkBAIC00OCwyMyArNTQsMzEgQEAKIAljaGFyICpuYW1lOwogCXVuc2lnbmVkIGludCBjYXBzOwogCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKmhvc3RfdGVtcGxhdGU7CisJLyogTExEIHNlc3Npb24vc2NzaV9ob3N0IGRhdGEgc2l6ZSAqLwogCWludCBob3N0ZGF0YV9zaXplOworCS8qIExMRCBpc2NzaV9ob3N0IGRhdGEgc2l6ZSAqLworCWludCBpaG9zdGRhdGFfc2l6ZTsKKwkvKiBMTEQgY29ubmVjdGlvbiBkYXRhIHNpemUgKi8KKwlpbnQgY29ubmRhdGFfc2l6ZTsKIAlpbnQgbWF4X2x1bjsKIAl1bnNpZ25lZCBpbnQgbWF4X2Nvbm47CiAJdW5zaWduZWQgaW50IG1heF9jbWRfbGVuOwotCWlzY3NpX3Nlc3Npb25oX3QgKCpjcmVhdGVfc2Vzc2lvbikgKHVpbnQzMl90IGluaXRpYWxfY21kc24sCi0JCQkJCSAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7Ci0Jdm9pZCAoKmRlc3Ryb3lfc2Vzc2lvbikgKGlzY3NpX3Nlc3Npb25oX3Qgc2Vzc2lvbik7Ci0JaXNjc2lfY29ubmhfdCAoKmNyZWF0ZV9jb25uKSAoaXNjc2lfc2Vzc2lvbmhfdCBzZXNzaW9uLCB1aW50MzJfdCBjaWQpOworCXN0cnVjdCBTY3NpX0hvc3QgKigqY3JlYXRlX3Nlc3Npb24pIChzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnQsCisJCQkJCSAgICAgdWludDMyX3QgaW5pdGlhbF9jbWRzbik7CisJdm9pZCAoKmRlc3Ryb3lfc2Vzc2lvbikgKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKKwlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKigqY3JlYXRlX2Nvbm4pIChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCQl1aW50MzJfdCBjaWQpOwogCWludCAoKmJpbmRfY29ubikgKGlzY3NpX3Nlc3Npb25oX3Qgc2Vzc2lvbiwgaXNjc2lfY29ubmhfdCBjb25uLAogCQkJICB1aW50MzJfdCB0cmFuc3BvcnRfZmQsIGludCBpc19sZWFkaW5nKTsKIAlpbnQgKCpzdGFydF9jb25uKSAoaXNjc2lfY29ubmhfdCBjb25uKTsKIAl2b2lkICgqc3RvcF9jb25uKSAoaXNjc2lfY29ubmhfdCBjb25uLCBpbnQgZmxhZyk7Ci0Jdm9pZCAoKmRlc3Ryb3lfY29ubikgKGlzY3NpX2Nvbm5oX3QgY29ubik7CisJdm9pZCAoKmRlc3Ryb3lfY29ubikgKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubik7CiAJaW50ICgqc2V0X3BhcmFtKSAoaXNjc2lfY29ubmhfdCBjb25uLCBlbnVtIGlzY3NpX3BhcmFtIHBhcmFtLAogCQkJICB1aW50MzJfdCB2YWx1ZSk7Ci0JaW50ICgqZ2V0X3BhcmFtKSAoaXNjc2lfY29ubmhfdCBjb25uLCBlbnVtIGlzY3NpX3BhcmFtIHBhcmFtLAotCQkJICB1aW50MzJfdCAqdmFsdWUpOworCWludCAoKmdldF9jb25uX3BhcmFtKSAodm9pZCAqY29ubmRhdGEsIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sCisJCQkgICAgICAgdWludDMyX3QgKnZhbHVlKTsKKwlpbnQgKCpnZXRfc2Vzc2lvbl9wYXJhbSkgKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJCSAgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgdWludDMyX3QgKnZhbHVlKTsKIAlpbnQgKCpzZW5kX3BkdSkgKGlzY3NpX2Nvbm5oX3QgY29ubiwgc3RydWN0IGlzY3NpX2hkciAqaGRyLAogCQkJIGNoYXIgKmRhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSk7CiAJdm9pZCAoKmdldF9zdGF0cykgKGlzY3NpX2Nvbm5oX3QgY29ubiwgc3RydWN0IGlzY3NpX3N0YXRzICpzdGF0cyk7CkBAIC03Myw3ICs4Nyw3IEBACiAvKgogICogdHJhbnNwb3J0IHJlZ2lzdHJhdGlvbiB1cGNhbGxzCiAgKi8KLWV4dGVybiBpbnQgaXNjc2lfcmVnaXN0ZXJfdHJhbnNwb3J0KHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnR0KTsKK2V4dGVybiBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmlzY3NpX3JlZ2lzdGVyX3RyYW5zcG9ydChzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0dCk7CiBleHRlcm4gaW50IGlzY3NpX3VucmVnaXN0ZXJfdHJhbnNwb3J0KHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnR0KTsKIAogLyoKQEAgLTgzLDQgKzk3LDQ5IEBACiBleHRlcm4gaW50IGlzY3NpX3JlY3ZfcGR1KGlzY3NpX2Nvbm5oX3QgY29ubiwgc3RydWN0IGlzY3NpX2hkciAqaGRyLAogCQkJICBjaGFyICpkYXRhLCB1aW50MzJfdCBkYXRhX3NpemUpOwogCitzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4geworCXN0cnVjdCBsaXN0X2hlYWQgY29ubl9saXN0OwkvKiBpdGVtIGluIGNvbm5saXN0ICovCisJdm9pZCAqZGRfZGF0YTsJCQkvKiBMTEQgcHJpdmF0ZSBkYXRhICovCisJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworCWlzY3NpX2Nvbm5oX3QgY29ubmg7CisJaW50IGFjdGl2ZTsJCQkvKiBtdXN0IGJlIGFjY2Vzc2VkIHdpdGggdGhlIGNvbm5sb2NrICovCisJc3RydWN0IGRldmljZSBkZXY7CQkvKiBzeXNmcyB0cmFuc3BvcnQvY29udGFpbmVyIGRldmljZSAqLworCXN0cnVjdCBtZW1wb29sX3pvbmUgKnpfZXJyb3I7CisJc3RydWN0IG1lbXBvb2xfem9uZSAqel9wZHU7CisJc3RydWN0IGxpc3RfaGVhZCBmcmVlcXVldWU7Cit9OworCisjZGVmaW5lIGlzY3NpX2Rldl90b19jb25uKF9kZXYpIFwKKwljb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGlzY3NpX2Nsc19jb25uLCBkZXYpCisKK3N0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBpdGVtIGluIHNlc3Npb25fbGlzdCAqLworCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnRyYW5zcG9ydDsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsJLyogc3lzZnMgdHJhbnNwb3J0L2NvbnRhaW5lciBkZXZpY2UgKi8KK307CisKKyNkZWZpbmUgaXNjc2lfZGV2X3RvX3Nlc3Npb24oX2RldikgXAorCWNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24sIGRldikKKworI2RlZmluZSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KF9zZXNzaW9uKSBcCisJZGV2X3RvX3Nob3N0KF9zZXNzaW9uLT5kZXYucGFyZW50KQorCisvKgorICogc2Vzc2lvbiBhbmQgY29ubmVjdGlvbiBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBieSBIVyBpU0NTSSBMTERzCisgKi8KK2V4dGVybiBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmlzY3NpX2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnQpOworZXh0ZXJuIGludCBpc2NzaV9kZXN0cm95X3Nlc3Npb24oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uKTsKK2V4dGVybiBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmlzY3NpX2NyZWF0ZV9jb25uKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2VzcywKKwkJCQkJICAgIHVpbnQzMl90IGNpZCk7CitleHRlcm4gaW50IGlzY3NpX2Rlc3Ryb3lfY29ubihzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm4pOworCisvKgorICogc2Vzc2lvbiBmdW5jdGlvbnMgdXNlZCBieSBzb2Z0d2FyZSBpc2NzaQorICovCitleHRlcm4gc3RydWN0IFNjc2lfSG9zdCAqCitpc2NzaV90cmFuc3BvcnRfY3JlYXRlX3Nlc3Npb24oc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICpzY3NpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQpOworZXh0ZXJuIGludCBpc2NzaV90cmFuc3BvcnRfZGVzdHJveV9zZXNzaW9uKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmggYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmgKaW5kZXggNTRhODk2MS4uMmI1OTMwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaApAQCAtNTQsNyArNTQsNyBAQAogCXVuc2lnbmVkIGludCBzdXBwb3J0X3FhczsgLyogc3VwcG9ydHMgcXVpY2sgYXJiaXRyYXRpb24gYW5kIHNlbGVjdGlvbiAqLwogCS8qIFByaXZhdGUgRmllbGRzICovCiAJdW5zaWduZWQgaW50IGR2X3BlbmRpbmc6MTsgLyogSW50ZXJuYWwgZmxhZyAqLwotCXN0cnVjdCBzZW1hcGhvcmUgZHZfc2VtOyAvKiBzZW1hcGhvcmUgdG8gc2VyaWFsaXNlIGR2ICovCisJc3RydWN0IG11dGV4IGR2X211dGV4OyAvKiBzZW1hcGhvcmUgdG8gc2VyaWFsaXNlIGR2ICovCiB9OwogCiBlbnVtIHNwaV9zaWduYWxfdHlwZSB7CmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IGUwOTJiMTkuLjdjNzlkYTUgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC01NCwyMCArNTQsMTggQEAKICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCi0vKgotICogVGhpcyBpcyBvbmUgb2YgdGhlIGZpcnN0IC5jIGZpbGVzIGJ1aWx0LiBFcnJvciBvdXQgZWFybHkKLSAqIGlmIHdlIGhhdmUgY29tcGlsZXIgdHJvdWJsZS4uCi0gKi8KLQogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNlbmRpZgogCiAvKgotICogVmVyc2lvbnMgb2YgZ2NjIG9sZGVyIHRoYW4gdGhhdCBsaXN0ZWQgYmVsb3cgbWF5IGFjdHVhbGx5IGNvbXBpbGUKLSAqIGFuZCBsaW5rIG9rYXksIGJ1dCB0aGUgZW5kIHByb2R1Y3QgY2FuIGhhdmUgc3VidGxlIHJ1biB0aW1lIGJ1Z3MuCi0gKiBUbyBhdm9pZCBhc3NvY2lhdGVkIGJvZ3VzIGJ1ZyByZXBvcnRzLCB3ZSBmbGF0bHkgcmVmdXNlIHRvIGNvbXBpbGUKLSAqIHdpdGggYSBnY2MgdGhhdCBpcyBrbm93biB0byBiZSB0b28gb2xkIGZyb20gdGhlIHZlcnkgYmVnaW5uaW5nLgorICogVGhpcyBpcyBvbmUgb2YgdGhlIGZpcnN0IC5jIGZpbGVzIGJ1aWx0LiBFcnJvciBvdXQgZWFybHkgaWYgd2UgaGF2ZSBjb21waWxlcgorICogdHJvdWJsZS4KKyAqCisgKiBWZXJzaW9ucyBvZiBnY2Mgb2xkZXIgdGhhbiB0aGF0IGxpc3RlZCBiZWxvdyBtYXkgYWN0dWFsbHkgY29tcGlsZSBhbmQgbGluaworICogb2theSwgYnV0IHRoZSBlbmQgcHJvZHVjdCBjYW4gaGF2ZSBzdWJ0bGUgcnVuIHRpbWUgYnVncy4gIFRvIGF2b2lkIGFzc29jaWF0ZWQKKyAqIGJvZ3VzIGJ1ZyByZXBvcnRzLCB3ZSBmbGF0bHkgcmVmdXNlIHRvIGNvbXBpbGUgd2l0aCBhIGdjYyB0aGF0IGlzIGtub3duIHRvIGJlCisgKiB0b28gb2xkIGZyb20gdGhlIHZlcnkgYmVnaW5uaW5nLgogICovCiAjaWYgKF9fR05VQ19fIDwgMykgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPCAyKQogI2Vycm9yIFNvcnJ5LCB5b3VyIEdDQyBpcyB0b28gb2xkLiBJdCBidWlsZHMgaW5jb3JyZWN0IGtlcm5lbHMuCmRpZmYgLS1naXQgYS9pcGMvbXF1ZXVlLmMgYi9pcGMvbXF1ZXVlLmMKaW5kZXggNGU3NzZmOS4uNTkzMDJmYyAxMDA2NDQKLS0tIGEvaXBjL21xdWV1ZS5jCisrKyBiL2lwYy9tcXVldWUuYwpAQCAtNTk5LDE1ICs1OTksMTYgQEAKIHN0YXRpYyBzdHJ1Y3QgZmlsZSAqZG9fY3JlYXRlKHN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJaW50IG9mbGFnLCBtb2RlX3QgbW9kZSwgc3RydWN0IG1xX2F0dHIgX191c2VyICp1X2F0dHIpCiB7Ci0Jc3RydWN0IGZpbGUgKmZpbHA7CiAJc3RydWN0IG1xX2F0dHIgYXR0cjsKIAlpbnQgcmV0OwogCi0JaWYgKHVfYXR0ciAhPSBOVUxMKSB7CisJaWYgKHVfYXR0cikgeworCQlyZXQgPSAtRUZBVUxUOwogCQlpZiAoY29weV9mcm9tX3VzZXIoJmF0dHIsIHVfYXR0ciwgc2l6ZW9mKGF0dHIpKSkKLQkJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCQkJZ290byBvdXQ7CisJCXJldCA9IC1FSU5WQUw7CiAJCWlmICghbXFfYXR0cl9vaygmYXR0cikpCi0JCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwkJCWdvdG8gb3V0OwogCQkvKiBzdG9yZSBmb3IgdXNlIGR1cmluZyBjcmVhdGUgKi8KIAkJZGVudHJ5LT5kX2ZzZGF0YSA9ICZhdHRyOwogCX0KQEAgLTYxNiwxMyArNjE3LDE0IEBACiAJcmV0ID0gdmZzX2NyZWF0ZShkaXItPmRfaW5vZGUsIGRlbnRyeSwgbW9kZSwgTlVMTCk7CiAJZGVudHJ5LT5kX2ZzZGF0YSA9IE5VTEw7CiAJaWYgKHJldCkKLQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwkJZ290byBvdXQ7CiAKLQlmaWxwID0gZGVudHJ5X29wZW4oZGVudHJ5LCBtcXVldWVfbW50LCBvZmxhZyk7Ci0JaWYgKCFJU19FUlIoZmlscCkpCi0JCWRnZXQoZGVudHJ5KTsKKwlyZXR1cm4gZGVudHJ5X29wZW4oZGVudHJ5LCBtcXVldWVfbW50LCBvZmxhZyk7CiAKLQlyZXR1cm4gZmlscDsKK291dDoKKwlkcHV0KGRlbnRyeSk7CisJbW50cHV0KG1xdWV1ZV9tbnQpOworCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKIC8qIE9wZW5zIGV4aXN0aW5nIHF1ZXVlICovCkBAIC02MzAsMjAgKzYzMiwyMCBAQAogewogc3RhdGljIGludCBvZmxhZzJhY2NbT19BQ0NNT0RFXSA9IHsgTUFZX1JFQUQsIE1BWV9XUklURSwKIAkJCQkJTUFZX1JFQUQgfCBNQVlfV1JJVEUgfTsKLQlzdHJ1Y3QgZmlsZSAqZmlscDsKIAotCWlmICgob2ZsYWcgJiBPX0FDQ01PREUpID09IChPX1JEV1IgfCBPX1dST05MWSkpCisJaWYgKChvZmxhZyAmIE9fQUNDTU9ERSkgPT0gKE9fUkRXUiB8IE9fV1JPTkxZKSkgeworCQlkcHV0KGRlbnRyeSk7CisJCW1udHB1dChtcXVldWVfbW50KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQogCi0JaWYgKHBlcm1pc3Npb24oZGVudHJ5LT5kX2lub2RlLCBvZmxhZzJhY2Nbb2ZsYWcgJiBPX0FDQ01PREVdLCBOVUxMKSkKKwlpZiAocGVybWlzc2lvbihkZW50cnktPmRfaW5vZGUsIG9mbGFnMmFjY1tvZmxhZyAmIE9fQUNDTU9ERV0sIE5VTEwpKSB7CisJCWRwdXQoZGVudHJ5KTsKKwkJbW50cHV0KG1xdWV1ZV9tbnQpOwogCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwl9CiAKLQlmaWxwID0gZGVudHJ5X29wZW4oZGVudHJ5LCBtcXVldWVfbW50LCBvZmxhZyk7Ci0KLQlpZiAoIUlTX0VSUihmaWxwKSkKLQkJZGdldChkZW50cnkpOwotCi0JcmV0dXJuIGZpbHA7CisJcmV0dXJuIGRlbnRyeV9vcGVuKGRlbnRyeSwgbXF1ZXVlX21udCwgb2ZsYWcpOwogfQogCiBhc21saW5rYWdlIGxvbmcgc3lzX21xX29wZW4oY29uc3QgY2hhciBfX3VzZXIgKnVfbmFtZSwgaW50IG9mbGFnLCBtb2RlX3QgbW9kZSwKQEAgLTY3MSwxNyArNjczLDIwIEBACiAKIAlpZiAob2ZsYWcgJiBPX0NSRUFUKSB7CiAJCWlmIChkZW50cnktPmRfaW5vZGUpIHsJLyogZW50cnkgYWxyZWFkeSBleGlzdHMgKi8KLQkJCWZpbHAgPSAob2ZsYWcgJiBPX0VYQ0wpID8gRVJSX1BUUigtRUVYSVNUKSA6Ci0JCQkJCWRvX29wZW4oZGVudHJ5LCBvZmxhZyk7CisJCQllcnJvciA9IC1FRVhJU1Q7CisJCQlpZiAob2ZsYWcgJiBPX0VYQ0wpCisJCQkJZ290byBvdXQ7CisJCQlmaWxwID0gZG9fb3BlbihkZW50cnksIG9mbGFnKTsKIAkJfSBlbHNlIHsKIAkJCWZpbHAgPSBkb19jcmVhdGUobXF1ZXVlX21udC0+bW50X3Jvb3QsIGRlbnRyeSwKIAkJCQkJCW9mbGFnLCBtb2RlLCB1X2F0dHIpOwogCQl9Ci0JfSBlbHNlCi0JCWZpbHAgPSAoZGVudHJ5LT5kX2lub2RlKSA/IGRvX29wZW4oZGVudHJ5LCBvZmxhZykgOgotCQkJCQlFUlJfUFRSKC1FTk9FTlQpOwotCi0JZHB1dChkZW50cnkpOworCX0gZWxzZSB7CisJCWVycm9yID0gLUVOT0VOVDsKKwkJaWYgKCFkZW50cnktPmRfaW5vZGUpCisJCQlnb3RvIG91dDsKKwkJZmlscCA9IGRvX29wZW4oZGVudHJ5LCBvZmxhZyk7CisJfQogCiAJaWYgKElTX0VSUihmaWxwKSkgewogCQllcnJvciA9IFBUUl9FUlIoZmlscCk7CkBAIC02OTIsOCArNjk3LDEwIEBACiAJZmRfaW5zdGFsbChmZCwgZmlscCk7CiAJZ290byBvdXRfdXBzZW07CiAKLW91dF9wdXRmZDoKK291dDoKKwlkcHV0KGRlbnRyeSk7CiAJbW50cHV0KG1xdWV1ZV9tbnQpOworb3V0X3B1dGZkOgogCXB1dF91bnVzZWRfZmQoZmQpOwogb3V0X2VycjoKIAlmZCA9IGVycm9yOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IDJhNzVlNDQuLmZlMmY3MWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTE1NTQsNyArMTU1NCw3IEBACiAgKiB3aGVuIHJlYWRpbmcgb3V0IHAtPmNwdXNldCwgYXMgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgaWYgaXQgY2hhbmdlcwogICogb24gdGhlIG5leHQgY3ljbGUsIGFuZCB3ZSBhcmUgbm90IGdvaW5nIHRvIHRyeSB0byBkZXJlZmVyZW5jZSBpdC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcGlkX2FycmF5X2xvYWQocGlkX3QgKnBpZGFycmF5LCBpbnQgbnBpZHMsIHN0cnVjdCBjcHVzZXQgKmNzKQorc3RhdGljIGludCBwaWRfYXJyYXlfbG9hZChwaWRfdCAqcGlkYXJyYXksIGludCBucGlkcywgc3RydWN0IGNwdXNldCAqY3MpCiB7CiAJaW50IG4gPSAwOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7CkBAIC0yMTUwLDYgKzIxNTAsMzMgQEAKIH0KIAogLyoqCisgKiBjcHVzZXRfbG9jayAtIGxvY2sgb3V0IGFueSBjaGFuZ2VzIHRvIGNwdXNldCBzdHJ1Y3R1cmVzCisgKgorICogVGhlIG91dCBvZiBtZW1vcnkgKG9vbSkgY29kZSBuZWVkcyB0byBsb2NrIGRvd24gY3B1c2V0cworICogZnJvbSBiZWluZyBjaGFuZ2VkIHdoaWxlIGl0IHNjYW5zIHRoZSB0YXNrbGlzdCBsb29raW5nIGZvciBhCisgKiB0YXNrIGluIGFuIG92ZXJsYXBwaW5nIGNwdXNldC4gIEV4cG9zZSBjYWxsYmFja19zZW0gdmlhIHRoaXMKKyAqIGNwdXNldF9sb2NrKCkgcm91dGluZSwgc28gdGhlIG9vbSBjb2RlIGNhbiBsb2NrIGl0LCBiZWZvcmUKKyAqIGxvY2tpbmcgdGhlIHRhc2sgbGlzdC4gIFRoZSB0YXNrbGlzdF9sb2NrIGlzIGEgc3BpbmxvY2ssIHNvCisgKiBtdXN0IGJlIHRha2VuIGluc2lkZSBjYWxsYmFja19zZW0uCisgKi8KKwordm9pZCBjcHVzZXRfbG9jayh2b2lkKQoreworCWRvd24oJmNhbGxiYWNrX3NlbSk7Cit9CisKKy8qKgorICogY3B1c2V0X3VubG9jayAtIHJlbGVhc2UgbG9jayBvbiBjcHVzZXQgY2hhbmdlcworICoKKyAqIFVuZG8gdGhlIGxvY2sgdGFrZW4gaW4gYSBwcmV2aW91cyBjcHVzZXRfbG9jaygpIGNhbGwuCisgKi8KKwordm9pZCBjcHVzZXRfdW5sb2NrKHZvaWQpCit7CisJdXAoJmNhbGxiYWNrX3NlbSk7Cit9CisKKy8qKgogICogY3B1c2V0X2V4Y2xfbm9kZXNfb3ZlcmxhcCAtIERvIHdlIG92ZXJsYXAgQHAncyBtZW1fZXhjbHVzaXZlIGFuY2VzdG9ycz8KICAqIEBwOiBwb2ludGVyIHRvIHRhc2tfc3RydWN0IG9mIHNvbWUgb3RoZXIgdGFzay4KICAqCkBAIC0yMTU4LDcgKzIxODUsNyBAQAogICogZGV0ZXJtaW5lIGlmIHRhc2sgQHAncyBtZW1vcnkgdXNhZ2UgbWlnaHQgaW1wYWN0IHRoZSBtZW1vcnkKICAqIGF2YWlsYWJsZSB0byB0aGUgY3VycmVudCB0YXNrLgogICoKLSAqIEFjcXVpcmVzIGNhbGxiYWNrX3NlbSAtIG5vdCBzdWl0YWJsZSBmb3IgY2FsbGluZyBmcm9tIGEgZmFzdCBwYXRoLgorICogQ2FsbCB3aGlsZSBob2xkaW5nIGNhbGxiYWNrX3NlbS4KICAqKi8KIAogaW50IGNwdXNldF9leGNsX25vZGVzX292ZXJsYXAoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpwKQpAQCAtMjE2Niw4ICsyMTkzLDYgQEAKIAljb25zdCBzdHJ1Y3QgY3B1c2V0ICpjczEsICpjczI7CS8qIG15IGFuZCBwJ3MgY3B1c2V0IGFuY2VzdG9ycyAqLwogCWludCBvdmVybGFwID0gMDsJCS8qIGRvIGNwdXNldHMgb3ZlcmxhcD8gKi8KIAotCWRvd24oJmNhbGxiYWNrX3NlbSk7Ci0KIAl0YXNrX2xvY2soY3VycmVudCk7CiAJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRVhJVElORykgewogCQl0YXNrX3VubG9jayhjdXJyZW50KTsKQEAgLTIxODYsOCArMjIxMSw2IEBACiAKIAlvdmVybGFwID0gbm9kZXNfaW50ZXJzZWN0cyhjczEtPm1lbXNfYWxsb3dlZCwgY3MyLT5tZW1zX2FsbG93ZWQpOwogZG9uZToKLQl1cCgmY2FsbGJhY2tfc2VtKTsKLQogCXJldHVybiBvdmVybGFwOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCBmOGU2MDlmLi45M2NlZTM2IDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGhhc19zdG9wcGVkX2pvYnMoaW50IHBncnApCitzdGF0aWMgaW50IGhhc19zdG9wcGVkX2pvYnMoaW50IHBncnApCiB7CiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAgKgogICogTk9URSB0aGF0IHJlcGFyZW50X3RvX2luaXQoKSBnaXZlcyB0aGUgY2FsbGVyIGZ1bGwgY2FwYWJpbGl0aWVzLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVwYXJlbnRfdG9faW5pdCh2b2lkKQorc3RhdGljIHZvaWQgcmVwYXJlbnRfdG9faW5pdCh2b2lkKQogewogCXdyaXRlX2xvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKIApAQCAtMjQ0LDcgKzI0NCw5IEBACiAJLyogU2V0IHRoZSBleGl0IHNpZ25hbCB0byBTSUdDSExEIHNvIHdlIHNpZ25hbCBpbml0IG9uIGV4aXQgKi8KIAljdXJyZW50LT5leGl0X3NpZ25hbCA9IFNJR0NITEQ7CiAKLQlpZiAoKGN1cnJlbnQtPnBvbGljeSA9PSBTQ0hFRF9OT1JNQUwpICYmICh0YXNrX25pY2UoY3VycmVudCkgPCAwKSkKKwlpZiAoKGN1cnJlbnQtPnBvbGljeSA9PSBTQ0hFRF9OT1JNQUwgfHwKKwkJCWN1cnJlbnQtPnBvbGljeSA9PSBTQ0hFRF9CQVRDSCkKKwkJCQkmJiAodGFza19uaWNlKGN1cnJlbnQpIDwgMCkpCiAJCXNldF91c2VyX25pY2UoY3VycmVudCwgMCk7CiAJLyogY3B1c19hbGxvd2VkPyAqLwogCS8qIHJ0X3ByaW9yaXR5PyAqLwpAQCAtMzY3LDcgKzM2OSw3IEBACiAKIEVYUE9SVF9TWU1CT0woZGFlbW9uaXplKTsKIAotc3RhdGljIGlubGluZSB2b2lkIGNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKK3N0YXRpYyB2b2lkIGNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKIHsKIAlpbnQgaSwgajsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwpAQCAtNTQxLDcgKzU0Myw3IEBACiAJcC0+cmVhbF9wYXJlbnQgPSByZWFwZXI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByZXBhcmVudF90aHJlYWQodGFza190ICpwLCB0YXNrX3QgKmZhdGhlciwgaW50IHRyYWNlZCkKK3N0YXRpYyB2b2lkIHJlcGFyZW50X3RocmVhZCh0YXNrX3QgKnAsIHRhc2tfdCAqZmF0aGVyLCBpbnQgdHJhY2VkKQogewogCS8qIFdlIGRvbid0IHdhbnQgcGVvcGxlIHNsYXlpbmcgaW5pdC4gICovCiAJaWYgKHAtPmV4aXRfc2lnbmFsICE9IC0xKQpAQCAtNjA1LDcgKzYwNyw3IEBACiAgKiBncm91cCwgYW5kIGlmIG5vIHN1Y2ggbWVtYmVyIGV4aXN0cywgZ2l2ZSBpdCB0bwogICogdGhlIGdsb2JhbCBjaGlsZCByZWFwZXIgcHJvY2VzcyAoaWUgImluaXQiKQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZm9yZ2V0X29yaWdpbmFsX3BhcmVudChzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBmYXRoZXIsCitzdGF0aWMgdm9pZCBmb3JnZXRfb3JpZ2luYWxfcGFyZW50KHN0cnVjdCB0YXNrX3N0cnVjdCAqIGZhdGhlciwKIAkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICp0b19yZWxlYXNlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgKnJlYXBlciA9IGZhdGhlcjsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3NpeC10aW1lcnMuYyBiL2tlcm5lbC9wb3NpeC10aW1lcnMuYwppbmRleCA5ZTY2ZTYxLi4xOTcyMDhiIDEwMDY0NAotLS0gYS9rZXJuZWwvcG9zaXgtdGltZXJzLmMKKysrIGIva2VybmVsL3Bvc2l4LXRpbWVycy5jCkBAIC0xOTIsNyArMTkyLDcgQEAKIAlyZXR1cm4gZG9fc3lzX3NldHRpbWVvZmRheSh0cCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNvbW1vbl90aW1lcl9jcmVhdGUoc3RydWN0IGtfaXRpbWVyICpuZXdfdGltZXIpCitzdGF0aWMgaW50IGNvbW1vbl90aW1lcl9jcmVhdGUoc3RydWN0IGtfaXRpbWVyICpuZXdfdGltZXIpCiB7CiAJaHJ0aW1lcl9pbml0KCZuZXdfdGltZXItPml0LnJlYWwudGltZXIsIG5ld190aW1lci0+aXRfY2xvY2spOwogCW5ld190aW1lci0+aXQucmVhbC50aW1lci5kYXRhID0gbmV3X3RpbWVyOwpAQCAtMzYxLDcgKzM2MSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBnb29kX3NpZ2V2ZW50KHNpZ2V2ZW50X3QgKiBldmVudCkKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBnb29kX3NpZ2V2ZW50KHNpZ2V2ZW50X3QgKiBldmVudCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJ0biA9IGN1cnJlbnQtPmdyb3VwX2xlYWRlcjsKIApAQCAtNjg3LDcgKzY4Nyw3IEBACiAKIC8qIFNldCBhIFBPU0lYLjFiIGludGVydmFsIHRpbWVyLiAqLwogLyogdGltci0+aXRfbG9jayBpcyB0YWtlbi4gKi8KLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBjb21tb25fdGltZXJfc2V0KHN0cnVjdCBrX2l0aW1lciAqdGltciwgaW50IGZsYWdzLAogCQkgc3RydWN0IGl0aW1lcnNwZWMgKm5ld19zZXR0aW5nLCBzdHJ1Y3QgaXRpbWVyc3BlYyAqb2xkX3NldHRpbmcpCiB7CkBAIC04MjksNyArODI5LDcgQEAKIC8qCiAgKiByZXR1cm4gdGltZXIgb3duZWQgYnkgdGhlIHByb2Nlc3MsIHVzZWQgYnkgZXhpdF9pdGltZXJzCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpdGltZXJfZGVsZXRlKHN0cnVjdCBrX2l0aW1lciAqdGltZXIpCitzdGF0aWMgdm9pZCBpdGltZXJfZGVsZXRlKHN0cnVjdCBrX2l0aW1lciAqdGltZXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCBjOWRlYzJhLi43ODhlY2NlIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtNTIxLDcgKzUyMSw3IEBACiAgKiBsb25nIGl0IHdhcyB3YWl0aW5nIHRvIHJ1bi4gIFdlIGFsc28gbm90ZSB3aGVuIGl0IGJlZ2FuIHNvIHRoYXQgd2UKICAqIGNhbiBrZWVwIHN0YXRzIG9uIGhvdyBsb25nIGl0cyB0aW1lc2xpY2UgaXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9pbmZvX2Fycml2ZSh0YXNrX3QgKnQpCitzdGF0aWMgdm9pZCBzY2hlZF9pbmZvX2Fycml2ZSh0YXNrX3QgKnQpCiB7CiAJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzLCBkaWZmID0gMDsKIAlzdHJ1Y3QgcnVucXVldWUgKnJxID0gdGFza19ycSh0KTsKQEAgLTc0OCwxMCArNzQ4LDE0IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIF9fc2xlZXBfdGltZSA9IG5vdyAtIHAtPnRpbWVzdGFtcDsKIAl1bnNpZ25lZCBsb25nIHNsZWVwX3RpbWU7CiAKLQlpZiAoX19zbGVlcF90aW1lID4gTlNfTUFYX1NMRUVQX0FWRykKLQkJc2xlZXBfdGltZSA9IE5TX01BWF9TTEVFUF9BVkc7Ci0JZWxzZQotCQlzbGVlcF90aW1lID0gKHVuc2lnbmVkIGxvbmcpX19zbGVlcF90aW1lOworCWlmICh1bmxpa2VseShwLT5wb2xpY3kgPT0gU0NIRURfQkFUQ0gpKQorCQlzbGVlcF90aW1lID0gMDsKKwllbHNlIHsKKwkJaWYgKF9fc2xlZXBfdGltZSA+IE5TX01BWF9TTEVFUF9BVkcpCisJCQlzbGVlcF90aW1lID0gTlNfTUFYX1NMRUVQX0FWRzsKKwkJZWxzZQorCQkJc2xlZXBfdGltZSA9ICh1bnNpZ25lZCBsb25nKV9fc2xlZXBfdGltZTsKKwl9CiAKIAlpZiAobGlrZWx5KHNsZWVwX3RpbWUgPiAwKSkgewogCQkvKgpAQCAtMTAwMyw3ICsxMDA3LDcgQEAKICAqIFdlIHdhbnQgdG8gdW5kZXItZXN0aW1hdGUgdGhlIGxvYWQgb2YgbWlncmF0aW9uIHNvdXJjZXMsIHRvCiAgKiBiYWxhbmNlIGNvbnNlcnZhdGl2ZWx5LgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19zb3VyY2VfbG9hZChpbnQgY3B1LCBpbnQgdHlwZSwgZW51bSBpZGxlX3R5cGUgaWRsZSkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fc291cmNlX2xvYWQoaW50IGNwdSwgaW50IHR5cGUsIGVudW0gaWRsZV90eXBlIGlkbGUpCiB7CiAJcnVucXVldWVfdCAqcnEgPSBjcHVfcnEoY3B1KTsKIAl1bnNpZ25lZCBsb25nIHJ1bm5pbmcgPSBycS0+bnJfcnVubmluZzsKQEAgLTE4NjYsNyArMTg3MCw3IEBACiAgKiBwdWxsX3Rhc2sgLSBtb3ZlIGEgdGFzayBmcm9tIGEgcmVtb3RlIHJ1bnF1ZXVlIHRvIHRoZSBsb2NhbCBydW5xdWV1ZS4KICAqIEJvdGggcnVucXVldWVzIG11c3QgYmUgbG9ja2VkLgogICovCi1zdGF0aWMgaW5saW5lCitzdGF0aWMKIHZvaWQgcHVsbF90YXNrKHJ1bnF1ZXVlX3QgKnNyY19ycSwgcHJpb19hcnJheV90ICpzcmNfYXJyYXksIHRhc2tfdCAqcCwKIAkgICAgICAgcnVucXVldWVfdCAqdGhpc19ycSwgcHJpb19hcnJheV90ICp0aGlzX2FycmF5LCBpbnQgdGhpc19jcHUpCiB7CkBAIC0xODg4LDcgKzE4OTIsNyBAQAogLyoKICAqIGNhbl9taWdyYXRlX3Rhc2sgLSBtYXkgdGFzayBwIGZyb20gcnVucXVldWUgcnEgYmUgbWlncmF0ZWQgdG8gdGhpc19jcHU/CiAgKi8KLXN0YXRpYyBpbmxpbmUKK3N0YXRpYwogaW50IGNhbl9taWdyYXRlX3Rhc2sodGFza190ICpwLCBydW5xdWV1ZV90ICpycSwgaW50IHRoaXNfY3B1LAogCQkgICAgIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBlbnVtIGlkbGVfdHlwZSBpZGxlLAogCQkgICAgIGludCAqYWxsX3Bpbm5lZCkKQEAgLTIzNzQsNyArMjM3OCw3IEBACiAgKiBpZGxlX2JhbGFuY2UgaXMgY2FsbGVkIGJ5IHNjaGVkdWxlKCkgaWYgdGhpc19jcHUgaXMgYWJvdXQgdG8gYmVjb21lCiAgKiBpZGxlLiBBdHRlbXB0cyB0byBwdWxsIHRhc2tzIGZyb20gb3RoZXIgQ1BVcy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGlkbGVfYmFsYW5jZShpbnQgdGhpc19jcHUsIHJ1bnF1ZXVlX3QgKnRoaXNfcnEpCitzdGF0aWMgdm9pZCBpZGxlX2JhbGFuY2UoaW50IHRoaXNfY3B1LCBydW5xdWV1ZV90ICp0aGlzX3JxKQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwogCkBAIC0yNzU4LDcgKzI3NjIsNyBAQAogCQlyZXNjaGVkX3Rhc2socnEtPmlkbGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgd2FrZV9zbGVlcGluZ19kZXBlbmRlbnQoaW50IHRoaXNfY3B1LCBydW5xdWV1ZV90ICp0aGlzX3JxKQorc3RhdGljIHZvaWQgd2FrZV9zbGVlcGluZ19kZXBlbmRlbnQoaW50IHRoaXNfY3B1LCBydW5xdWV1ZV90ICp0aGlzX3JxKQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnRtcCwgKnNkID0gTlVMTDsKIAljcHVtYXNrX3Qgc2libGluZ19tYXA7CkBAIC0yODEyLDcgKzI4MTYsNyBAQAogCXJldHVybiBwLT50aW1lX3NsaWNlICogKDEwMCAtIHNkLT5wZXJfY3B1X2dhaW4pIC8gMTAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBkZXBlbmRlbnRfc2xlZXBlcihpbnQgdGhpc19jcHUsIHJ1bnF1ZXVlX3QgKnRoaXNfcnEpCitzdGF0aWMgaW50IGRlcGVuZGVudF9zbGVlcGVyKGludCB0aGlzX2NwdSwgcnVucXVldWVfdCAqdGhpc19ycSkKIHsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICp0bXAsICpzZCA9IE5VTEw7CiAJY3B1bWFza190IHNpYmxpbmdfbWFwOwpAQCAtMzU2MCw3ICszNTY0LDcgQEAKIAkgKiBUaGUgUlQgcHJpb3JpdGllcyBhcmUgc2V0IHZpYSBzY2hlZF9zZXRzY2hlZHVsZXIoKSwgYnV0IHdlIHN0aWxsCiAJICogYWxsb3cgdGhlICdub3JtYWwnIG5pY2UgdmFsdWUgdG8gYmUgc2V0IC0gYnV0IGFzIGV4cGVjdGVkCiAJICogaXQgd29udCBoYXZlIGFueSBlZmZlY3Qgb24gc2NoZWR1bGluZyB1bnRpbCB0aGUgdGFzayBpcwotCSAqIG5vdCBTQ0hFRF9OT1JNQUw6CisJICogbm90IFNDSEVEX05PUk1BTC9TQ0hFRF9CQVRDSDoKIAkgKi8KIAlpZiAocnRfdGFzayhwKSkgewogCQlwLT5zdGF0aWNfcHJpbyA9IE5JQ0VfVE9fUFJJTyhuaWNlKTsKQEAgLTM3MDYsMTAgKzM3MTAsMTYgQEAKIAlCVUdfT04ocC0+YXJyYXkpOwogCXAtPnBvbGljeSA9IHBvbGljeTsKIAlwLT5ydF9wcmlvcml0eSA9IHByaW87Ci0JaWYgKHBvbGljeSAhPSBTQ0hFRF9OT1JNQUwpCisJaWYgKHBvbGljeSAhPSBTQ0hFRF9OT1JNQUwgJiYgcG9saWN5ICE9IFNDSEVEX0JBVENIKSB7CiAJCXAtPnByaW8gPSBNQVhfUlRfUFJJTy0xIC0gcC0+cnRfcHJpb3JpdHk7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCXAtPnByaW8gPSBwLT5zdGF0aWNfcHJpbzsKKwkJLyoKKwkJICogU0NIRURfQkFUQ0ggdGFza3MgYXJlIHRyZWF0ZWQgYXMgcGVycGV0dWFsIENQVSBob2dzOgorCQkgKi8KKwkJaWYgKHBvbGljeSA9PSBTQ0hFRF9CQVRDSCkKKwkJCXAtPnNsZWVwX2F2ZyA9IDA7CisJfQogfQogCiAvKioKQEAgLTM3MzMsMjkgKzM3NDMsMzUgQEAKIAlpZiAocG9saWN5IDwgMCkKIAkJcG9saWN5ID0gb2xkcG9saWN5ID0gcC0+cG9saWN5OwogCWVsc2UgaWYgKHBvbGljeSAhPSBTQ0hFRF9GSUZPICYmIHBvbGljeSAhPSBTQ0hFRF9SUiAmJgotCQkJCXBvbGljeSAhPSBTQ0hFRF9OT1JNQUwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXBvbGljeSAhPSBTQ0hFRF9OT1JNQUwgJiYgcG9saWN5ICE9IFNDSEVEX0JBVENIKQorCQlyZXR1cm4gLUVJTlZBTDsKIAkvKgogCSAqIFZhbGlkIHByaW9yaXRpZXMgZm9yIFNDSEVEX0ZJRk8gYW5kIFNDSEVEX1JSIGFyZQotCSAqIDEuLk1BWF9VU0VSX1JUX1BSSU8tMSwgdmFsaWQgcHJpb3JpdHkgZm9yIFNDSEVEX05PUk1BTCBpcyAwLgorCSAqIDEuLk1BWF9VU0VSX1JUX1BSSU8tMSwgdmFsaWQgcHJpb3JpdHkgZm9yIFNDSEVEX05PUk1BTCBhbmQKKwkgKiBTQ0hFRF9CQVRDSCBpcyAwLgogCSAqLwogCWlmIChwYXJhbS0+c2NoZWRfcHJpb3JpdHkgPCAwIHx8CiAJICAgIChwLT5tbSAmJiBwYXJhbS0+c2NoZWRfcHJpb3JpdHkgPiBNQVhfVVNFUl9SVF9QUklPLTEpIHx8CiAJICAgICghcC0+bW0gJiYgcGFyYW0tPnNjaGVkX3ByaW9yaXR5ID4gTUFYX1JUX1BSSU8tMSkpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICgocG9saWN5ID09IFNDSEVEX05PUk1BTCkgIT0gKHBhcmFtLT5zY2hlZF9wcmlvcml0eSA9PSAwKSkKKwlpZiAoKHBvbGljeSA9PSBTQ0hFRF9OT1JNQUwgfHwgcG9saWN5ID09IFNDSEVEX0JBVENIKQorCQkJCQkhPSAocGFyYW0tPnNjaGVkX3ByaW9yaXR5ID09IDApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qCiAJICogQWxsb3cgdW5wcml2aWxlZ2VkIFJUIHRhc2tzIHRvIGRlY3JlYXNlIHByaW9yaXR5OgogCSAqLwogCWlmICghY2FwYWJsZShDQVBfU1lTX05JQ0UpKSB7Ci0JCS8qIGNhbid0IGNoYW5nZSBwb2xpY3kgKi8KLQkJaWYgKHBvbGljeSAhPSBwLT5wb2xpY3kgJiYKLQkJCSFwLT5zaWduYWwtPnJsaW1bUkxJTUlUX1JUUFJJT10ucmxpbV9jdXIpCisJCS8qCisJCSAqIGNhbid0IGNoYW5nZSBwb2xpY3ksIGV4Y2VwdCBiZXR3ZWVuIFNDSEVEX05PUk1BTAorCQkgKiBhbmQgU0NIRURfQkFUQ0g6CisJCSAqLworCQlpZiAoKChwb2xpY3kgIT0gU0NIRURfTk9STUFMICYmIHAtPnBvbGljeSAhPSBTQ0hFRF9CQVRDSCkgJiYKKwkJCShwb2xpY3kgIT0gU0NIRURfQkFUQ0ggJiYgcC0+cG9saWN5ICE9IFNDSEVEX05PUk1BTCkpICYmCisJCQkJIXAtPnNpZ25hbC0+cmxpbVtSTElNSVRfUlRQUklPXS5ybGltX2N1cikKIAkJCXJldHVybiAtRVBFUk07CiAJCS8qIGNhbid0IGluY3JlYXNlIHByaW9yaXR5ICovCi0JCWlmIChwb2xpY3kgIT0gU0NIRURfTk9STUFMICYmCisJCWlmICgocG9saWN5ICE9IFNDSEVEX05PUk1BTCAmJiBwb2xpY3kgIT0gU0NIRURfQkFUQ0gpICYmCiAJCSAgICBwYXJhbS0+c2NoZWRfcHJpb3JpdHkgPiBwLT5ydF9wcmlvcml0eSAmJgogCQkgICAgcGFyYW0tPnNjaGVkX3ByaW9yaXR5ID4KIAkJCQlwLT5zaWduYWwtPnJsaW1bUkxJTUlUX1JUUFJJT10ucmxpbV9jdXIpCkBAIC00MjMzLDYgKzQyNDksNyBAQAogCQlyZXQgPSBNQVhfVVNFUl9SVF9QUklPLTE7CiAJCWJyZWFrOwogCWNhc2UgU0NIRURfTk9STUFMOgorCWNhc2UgU0NIRURfQkFUQ0g6CiAJCXJldCA9IDA7CiAJCWJyZWFrOwogCX0KQEAgLTQyNTYsNiArNDI3Myw3IEBACiAJCXJldCA9IDE7CiAJCWJyZWFrOwogCWNhc2UgU0NIRURfTk9STUFMOgorCWNhc2UgU0NIRURfQkFUQ0g6CiAJCXJldCA9IDA7CiAJfQogCXJldHVybiByZXQ7CkBAIC01OTkwLDcgKzYwMDgsNyBAQAogICogRGV0YWNoIHNjaGVkIGRvbWFpbnMgZnJvbSBhIGdyb3VwIG9mIGNwdXMgc3BlY2lmaWVkIGluIGNwdV9tYXAKICAqIFRoZXNlIGNwdXMgd2lsbCBub3cgYmUgYXR0YWNoZWQgdG8gdGhlIE5VTEwgZG9tYWluCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkZXRhY2hfZGVzdHJveV9kb21haW5zKGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCkKK3N0YXRpYyB2b2lkIGRldGFjaF9kZXN0cm95X2RvbWFpbnMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKQogewogCWludCBpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2lnbmFsLmMgYi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMWRhMmU3NC4uNWRhZmJkMyAxMDA2NDQKLS0tIGEva2VybmVsL3NpZ25hbC5jCisrKyBiL2tlcm5lbC9zaWduYWwuYwpAQCAtNDc2LDcgKzQ3Niw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjb2xsZWN0X3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lncGVuZGluZyAqbGlzdCwgc2lnaW5mb190ICppbmZvKQorc3RhdGljIGludCBjb2xsZWN0X3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lncGVuZGluZyAqbGlzdCwgc2lnaW5mb190ICppbmZvKQogewogCXN0cnVjdCBzaWdxdWV1ZSAqcSwgKmZpcnN0ID0gTlVMTDsKIAlpbnQgc3RpbGxfcGVuZGluZyA9IDA7CkBAIC0xODgxLDcgKzE4ODEsNyBAQAogICogV2UgcmV0dXJuIHplcm8gaWYgd2Ugc3RpbGwgaG9sZCB0aGUgc2lnbG9jayBhbmQgc2hvdWxkIGxvb2sKICAqIGZvciBhbm90aGVyIHNpZ25hbCB3aXRob3V0IGNoZWNraW5nIGdyb3VwX3N0b3BfY291bnQgYWdhaW4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGhhbmRsZV9ncm91cF9zdG9wKHZvaWQpCitzdGF0aWMgaW50IGhhbmRsZV9ncm91cF9zdG9wKHZvaWQpCiB7CiAJaW50IHN0b3BfY291bnQ7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCA2MmQ0ZDk1Li5mNWQ2OWI2IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC02NDgsNyArNjQ4LDcgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAogCX0sCi0jaWYgZGVmaW5lZChDT05GSUdfUzM5MCkKKyNpZiBkZWZpbmVkKENPTkZJR19TMzkwKSAmJiBkZWZpbmVkKENPTkZJR19TTVApCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX1NQSU5fUkVUUlksCiAJCS5wcm9jbmFtZQk9ICJzcGluX3JldHJ5IiwKZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuYwppbmRleCA4MmM0ZmE3Li5iMDUyZTJjIDEwMDY0NAotLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmMKKysrIGIva2VybmVsL3dvcmtxdWV1ZS5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcnVuX3dvcmtxdWV1ZShzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgKmN3cSkKK3N0YXRpYyB2b2lkIHJ1bl93b3JrcXVldWUoc3RydWN0IGNwdV93b3JrcXVldWVfc3RydWN0ICpjd3EpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCBhNjA5MjM1Li5hMzE0ZTY2IDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtMTk1LDYgKzE5NSwyMCBAQAogCSAgc29tZSBhcmNoaXRlY3R1cmVzIG9yIGlmIHlvdSB1c2UgZXh0ZXJuYWwgZGVidWdnZXJzLgogCSAgSWYgeW91IGRvbid0IGRlYnVnIHRoZSBrZXJuZWwsIHlvdSBjYW4gc2F5IE4uCiAKK2NvbmZpZyBGT1JDRURfSU5MSU5JTkcKKwlib29sICJGb3JjZSBnY2MgdG8gaW5saW5lIGZ1bmN0aW9ucyBtYXJrZWQgJ2lubGluZSciCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBrZXJuZWwgZm9yY2VzIGdjYyB0byBpbmxpbmUgdGhlIGZ1bmN0aW9ucworCSAgZGV2ZWxvcGVycyBoYXZlIG1hcmtlZCAnaW5saW5lJy4gRG9pbmcgc28gdGFrZXMgYXdheSBmcmVlZG9tIGZyb20gZ2NjIHRvCisJICBkbyB3aGF0IGl0IHRoaW5rcyBpcyBiZXN0LCB3aGljaCBpcyBkZXNpcmFibGUgZm9yIHRoZSBnY2MgMy54IHNlcmllcyBvZgorCSAgY29tcGlsZXJzLiBUaGUgZ2NjIDQueCBzZXJpZXMgaGF2ZSBhIHJld3JpdHRlbiBpbmxpbmluZyBhbGdvcml0aG0gYW5kCisJICBkaXNhYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBnZW5lcmF0ZSBhIHNtYWxsZXIga2VybmVsIHRoZXJlLiBIb3BlZnVsbHkKKwkgIHRoaXMgYWxnb3JpdGhtIGlzIHNvIGdvb2QgdGhhdCBhbGxvd2luZyBnY2M0IHRvIG1ha2UgdGhlIGRlY2lzaW9uIGNhbgorCSAgYmVjb21lIHRoZSBkZWZhdWx0IGluIHRoZSBmdXR1cmUsIHVudGlsIHRoZW4gdGhpcyBvcHRpb24gaXMgdGhlcmUgdG8KKwkgIHRlc3QgZ2NjIGZvciB0aGlzLgorCiBjb25maWcgUkNVX1RPUlRVUkVfVEVTVAogCXRyaXN0YXRlICJ0b3J0dXJlIHRlc3RzIGZvciBSQ1UiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmMKaW5kZXggYjYyY2FiNS4uMzE3MWY4OCAxMDA2NDQKLS0tIGEvbW0vbWVtcG9saWN5LmMKKysrIGIvbW0vbWVtcG9saWN5LmMKQEAgLTEzNTksNiArMTM1OSwzMCBAQAogCXJldHVybiAwOwogfQogCit2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICppbmZvLCBpbnQgcG9saWN5LAorCQkJCW5vZGVtYXNrX3QgKnBvbGljeV9ub2RlcykKK3sKKwlpbmZvLT5yb290ID0gUkJfUk9PVDsKKwlzcGluX2xvY2tfaW5pdCgmaW5mby0+bG9jayk7CisKKwlpZiAocG9saWN5ICE9IE1QT0xfREVGQVVMVCkgeworCQlzdHJ1Y3QgbWVtcG9saWN5ICpuZXdwb2w7CisKKwkJLyogRmFsbHMgYmFjayB0byBNUE9MX0RFRkFVTFQgb24gYW55IGVycm9yICovCisJCW5ld3BvbCA9IG1wb2xfbmV3KHBvbGljeSwgcG9saWN5X25vZGVzKTsKKwkJaWYgKCFJU19FUlIobmV3cG9sKSkgeworCQkJLyogQ3JlYXRlIHBzZXVkby12bWEgdGhhdCBjb250YWlucyBqdXN0IHRoZSBwb2xpY3kgKi8KKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCBwdm1hOworCisJCQltZW1zZXQoJnB2bWEsIDAsIHNpemVvZihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QpKTsKKwkJCS8qIFBvbGljeSBjb3ZlcnMgZW50aXJlIGZpbGUgKi8KKwkJCXB2bWEudm1fZW5kID0gVEFTS19TSVpFOworCQkJbXBvbF9zZXRfc2hhcmVkX3BvbGljeShpbmZvLCAmcHZtYSwgbmV3cG9sKTsKKwkJCW1wb2xfZnJlZShuZXdwb2wpOworCQl9CisJfQorfQorCiBpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqaW5mbywKIAkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpucG9sKQogewpkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggNDc0OGI5MC4uMTRiZDRlYyAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC0yNzQsNiArMjc0LDcgQEAKIAkJc2hvd19tZW0oKTsKIAl9CiAKKwljcHVzZXRfbG9jaygpOwogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiByZXRyeToKIAlwID0gc2VsZWN0X2JhZF9wcm9jZXNzKCk7CkBAIC0yODQsNiArMjg1LDcgQEAKIAkvKiBGb3VuZCBub3RoaW5nPyE/ISBFaXRoZXIgd2UgaGFuZyBmb3JldmVyLCBvciB3ZSBwYW5pYy4gKi8KIAlpZiAoIXApIHsKIAkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQljcHVzZXRfdW5sb2NrKCk7CiAJCXBhbmljKCJPdXQgb2YgbWVtb3J5IGFuZCBubyBraWxsYWJsZSBwcm9jZXNzZXMuLi5cbiIpOwogCX0KIApAQCAtMjkzLDYgKzI5NSw3IEBACiAKICBvdXQ6CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCWNwdXNldF91bmxvY2soKTsKIAlpZiAobW0pCiAJCW1tcHV0KG1tKTsKIApkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggMzQzYjNjMC4uY2U1MDFiYyAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC0xMzE2LDcgKzEzMTYsOCBAQAogCQljYXNlIFNfSUZSRUc6CiAJCQlpbm9kZS0+aV9vcCA9ICZzaG1lbV9pbm9kZV9vcGVyYXRpb25zOwogCQkJaW5vZGUtPmlfZm9wID0gJnNobWVtX2ZpbGVfb3BlcmF0aW9uczsKLQkJCW1wb2xfc2hhcmVkX3BvbGljeV9pbml0KCZpbmZvLT5wb2xpY3kpOworCQkJbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoJmluZm8tPnBvbGljeSwgc2JpbmZvLT5wb2xpY3ksCisJCQkJCQkJJnNiaW5mby0+cG9saWN5X25vZGVzKTsKIAkJCWJyZWFrOwogCQljYXNlIFNfSUZESVI6CiAJCQlpbm9kZS0+aV9ubGluaysrOwpAQCAtMTMzMCw3ICsxMzMxLDggQEAKIAkJCSAqIE11c3Qgbm90IGxvYWQgYW55dGhpbmcgaW4gdGhlIHJidHJlZSwKIAkJCSAqIG1wb2xfZnJlZV9zaGFyZWRfcG9saWN5IHdpbGwgbm90IGJlIGNhbGxlZC4KIAkJCSAqLwotCQkJbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoJmluZm8tPnBvbGljeSk7CisJCQltcG9sX3NoYXJlZF9wb2xpY3lfaW5pdCgmaW5mby0+cG9saWN5LCBNUE9MX0RFRkFVTFQsCisJCQkJCQlOVUxMKTsKIAkJCWJyZWFrOwogCQl9CiAJfSBlbHNlIGlmIChzYmluZm8tPm1heF9pbm9kZXMpIHsKQEAgLTE4NDMsNyArMTg0NSw5IEBACiAJLnB1dF9saW5rCT0gc2htZW1fcHV0X2xpbmssCiB9OwogCi1zdGF0aWMgaW50IHNobWVtX3BhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgaW50ICptb2RlLCB1aWRfdCAqdWlkLCBnaWRfdCAqZ2lkLCB1bnNpZ25lZCBsb25nICpibG9ja3MsIHVuc2lnbmVkIGxvbmcgKmlub2RlcykKK3N0YXRpYyBpbnQgc2htZW1fcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBpbnQgKm1vZGUsIHVpZF90ICp1aWQsCisJZ2lkX3QgKmdpZCwgdW5zaWduZWQgbG9uZyAqYmxvY2tzLCB1bnNpZ25lZCBsb25nICppbm9kZXMsCisJaW50ICpwb2xpY3ksIG5vZGVtYXNrX3QgKnBvbGljeV9ub2RlcykKIHsKIAljaGFyICp0aGlzX2NoYXIsICp2YWx1ZSwgKnJlc3Q7CiAKQEAgLTE4OTcsNiArMTkwMSwxOSBAQAogCQkJKmdpZCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCZyZXN0LDApOwogCQkJaWYgKCpyZXN0KQogCQkJCWdvdG8gYmFkX3ZhbDsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwibXBvbCIpKSB7CisJCQlpZiAoIXN0cmNtcCh2YWx1ZSwiZGVmYXVsdCIpKQorCQkJCSpwb2xpY3kgPSBNUE9MX0RFRkFVTFQ7CisJCQllbHNlIGlmICghc3RyY21wKHZhbHVlLCJwcmVmZXJyZWQiKSkKKwkJCQkqcG9saWN5ID0gTVBPTF9QUkVGRVJSRUQ7CisJCQllbHNlIGlmICghc3RyY21wKHZhbHVlLCJiaW5kIikpCisJCQkJKnBvbGljeSA9IE1QT0xfQklORDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAodmFsdWUsImludGVybGVhdmUiKSkKKwkJCQkqcG9saWN5ID0gTVBPTF9JTlRFUkxFQVZFOworCQkJZWxzZQorCQkJCWdvdG8gYmFkX3ZhbDsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwibXBvbF9ub2RlbGlzdCIpKSB7CisJCQlub2RlbGlzdF9wYXJzZSh2YWx1ZSwgKnBvbGljeV9ub2Rlcyk7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9FUlIgInRtcGZzOiBCYWQgbW91bnQgb3B0aW9uICVzXG4iLAogCQkJICAgICAgIHRoaXNfY2hhcik7CkBAIC0xOTE3LDEyICsxOTM0LDE0IEBACiAJc3RydWN0IHNobWVtX3NiX2luZm8gKnNiaW5mbyA9IFNITUVNX1NCKHNiKTsKIAl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MgPSBzYmluZm8tPm1heF9ibG9ja3M7CiAJdW5zaWduZWQgbG9uZyBtYXhfaW5vZGVzID0gc2JpbmZvLT5tYXhfaW5vZGVzOworCWludCBwb2xpY3kgPSBzYmluZm8tPnBvbGljeTsKKwlub2RlbWFza190IHBvbGljeV9ub2RlcyA9IHNiaW5mby0+cG9saWN5X25vZGVzOwogCXVuc2lnbmVkIGxvbmcgYmxvY2tzOwogCXVuc2lnbmVkIGxvbmcgaW5vZGVzOwogCWludCBlcnJvciA9IC1FSU5WQUw7CiAKLQlpZiAoc2htZW1fcGFyc2Vfb3B0aW9ucyhkYXRhLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSZtYXhfYmxvY2tzLCAmbWF4X2lub2RlcykpCisJaWYgKHNobWVtX3BhcnNlX29wdGlvbnMoZGF0YSwgTlVMTCwgTlVMTCwgTlVMTCwgJm1heF9ibG9ja3MsCisJCQkJJm1heF9pbm9kZXMsICZwb2xpY3ksICZwb2xpY3lfbm9kZXMpKQogCQlyZXR1cm4gZXJyb3I7CiAKIAlzcGluX2xvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKQEAgLTE5NDgsNiArMTk2Nyw4IEBACiAJc2JpbmZvLT5mcmVlX2Jsb2NrcyA9IG1heF9ibG9ja3MgLSBibG9ja3M7CiAJc2JpbmZvLT5tYXhfaW5vZGVzICA9IG1heF9pbm9kZXM7CiAJc2JpbmZvLT5mcmVlX2lub2RlcyA9IG1heF9pbm9kZXMgLSBpbm9kZXM7CisJc2JpbmZvLT5wb2xpY3kgPSBwb2xpY3k7CisJc2JpbmZvLT5wb2xpY3lfbm9kZXMgPSBwb2xpY3lfbm9kZXM7CiBvdXQ6CiAJc3Bpbl91bmxvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC0xOTcyLDYgKzE5OTMsOCBAQAogCXN0cnVjdCBzaG1lbV9zYl9pbmZvICpzYmluZm87CiAJdW5zaWduZWQgbG9uZyBibG9ja3MgPSAwOwogCXVuc2lnbmVkIGxvbmcgaW5vZGVzID0gMDsKKwlpbnQgcG9saWN5ID0gTVBPTF9ERUZBVUxUOworCW5vZGVtYXNrX3QgcG9saWN5X25vZGVzID0gbm9kZV9vbmxpbmVfbWFwOwogCiAjaWZkZWYgQ09ORklHX1RNUEZTCiAJLyoKQEAgLTE5ODQsOCArMjAwNyw4IEBACiAJCWlub2RlcyA9IHRvdGFscmFtX3BhZ2VzIC0gdG90YWxoaWdoX3BhZ2VzOwogCQlpZiAoaW5vZGVzID4gYmxvY2tzKQogCQkJaW5vZGVzID0gYmxvY2tzOwotCQlpZiAoc2htZW1fcGFyc2Vfb3B0aW9ucyhkYXRhLCAmbW9kZSwgJnVpZCwgJmdpZCwKLQkJCQkJJmJsb2NrcywgJmlub2RlcykpCisJCWlmIChzaG1lbV9wYXJzZV9vcHRpb25zKGRhdGEsICZtb2RlLCAmdWlkLCAmZ2lkLCAmYmxvY2tzLAorCQkJCQkmaW5vZGVzLCAmcG9saWN5LCAmcG9saWN5X25vZGVzKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KICNlbHNlCkBAIC0yMDAzLDYgKzIwMjYsOCBAQAogCXNiaW5mby0+ZnJlZV9ibG9ja3MgPSBibG9ja3M7CiAJc2JpbmZvLT5tYXhfaW5vZGVzID0gaW5vZGVzOwogCXNiaW5mby0+ZnJlZV9pbm9kZXMgPSBpbm9kZXM7CisJc2JpbmZvLT5wb2xpY3kgPSBwb2xpY3k7CisJc2JpbmZvLT5wb2xpY3lfbm9kZXMgPSBwb2xpY3lfbm9kZXM7CiAKIAlzYi0+c19mc19pbmZvID0gc2JpbmZvOwogCXNiLT5zX21heGJ5dGVzID0gU0hNRU1fTUFYX0JZVEVTOwpkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2NvbmZpZwppbmRleCA2MGY2ZjMyLi45Mjk2YjI2OSAxMDA2NDQKLS0tIGEvbmV0L0tjb25maWcKKysrIGIvbmV0L0tjb25maWcKQEAgLTE1OSw2ICsxNTksNyBAQAogc291cmNlICJkcml2ZXJzL25ldC9hcHBsZXRhbGsvS2NvbmZpZyIKIHNvdXJjZSAibmV0L3gyNS9LY29uZmlnIgogc291cmNlICJuZXQvbGFwYi9LY29uZmlnIgorc291cmNlICJuZXQvdGlwYy9LY29uZmlnIgogCiBjb25maWcgTkVUX0RJVkVSVAogCWJvb2wgIkZyYW1lIERpdmVydGVyIChFWFBFUklNRU5UQUwpIgpkaWZmIC0tZ2l0IGEvbmV0L01ha2VmaWxlIGIvbmV0L01ha2VmaWxlCmluZGV4IGY1MTQxYjkuLjA2NTc5NmYgMTAwNjQ0Ci0tLSBhL25ldC9NYWtlZmlsZQorKysgYi9uZXQvTWFrZWZpbGUKQEAgLTQ1LDYgKzQ1LDcgQEAKIG9iai0kKENPTkZJR19JUF9EQ0NQKQkJKz0gZGNjcC8KIG9iai0kKENPTkZJR19JUF9TQ1RQKQkJKz0gc2N0cC8KIG9iai0kKENPTkZJR19JRUVFODAyMTEpCQkrPSBpZWVlODAyMTEvCitvYmotJChDT05GSUdfVElQQykJCSs9IHRpcGMvCiAKIGlmZXEgKCQoQ09ORklHX05FVCkseSkKIG9iai0kKENPTkZJR19TWVNDVEwpCQkrPSBzeXNjdGxfbmV0Lm8KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwppbmRleCA5ZjZlMDE5Li5hMjljMTIzIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpbHRlci5jIGIvbmV0L2NvcmUvZmlsdGVyLmMKaW5kZXggOWViOWQwMC4uYTUyNjY1ZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmlsdGVyLmMKKysrIGIvbmV0L2NvcmUvZmlsdGVyLmMKQEAgLTI4Nyw3ICsyODcsOSBAQAogICogbm8gcmVmZXJlbmNlcyBvciBqdW1wcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UsIG5vIGlsbGVnYWwKICAqIGluc3RydWN0aW9ucywgYW5kIG11c3QgZW5kIHdpdGggYSBSRVQgaW5zdHJ1Y3Rpb24uCiAgKgotICogUmV0dXJucyAwIGlmIHRoZSBydWxlIHNldCBpcyBsZWdhbCBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgaWYgbm90LgorICogQWxsIGp1bXBzIGFyZSBmb3J3YXJkIGFzIHRoZXkgYXJlIG5vdCBzaWduZWQuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBydWxlIHNldCBpcyBsZWdhbCBvciAtRUlOVkFMIGlmIG5vdC4KICAqLwogaW50IHNrX2Noa19maWx0ZXIoc3RydWN0IHNvY2tfZmlsdGVyICpmaWx0ZXIsIGludCBmbGVuKQogewpAQCAtMjk5LDcgKzMwMSw2IEBACiAKIAkvKiBjaGVjayB0aGUgZmlsdGVyIGNvZGUgbm93ICovCiAJZm9yIChwYyA9IDA7IHBjIDwgZmxlbjsgcGMrKykgewotCQkvKiBhbGwganVtcHMgYXJlIGZvcndhcmQgYXMgdGhleSBhcmUgbm90IHNpZ25lZCAqLwogCQlmdGVzdCA9ICZmaWx0ZXJbcGNdOwogCiAJCS8qIE9ubHkgYWxsb3cgdmFsaWQgaW5zdHJ1Y3Rpb25zICovCkBAIC0zODMsMTEgKzM4NCw2IEBACiAJCX0KIAl9CiAKLQkvKgotCSAqIFRoZSBwcm9ncmFtIG11c3QgZW5kIHdpdGggYSByZXR1cm4uIFdlIGRvbid0IGNhcmUgd2hlcmUgdGhleQotCSAqIGp1bXBlZCB3aXRoaW4gdGhlIHNjcmlwdCAoaXRzIGFsd2F5cyBmb3J3YXJkcykgYnV0IGluIHRoZSBlbmQKLQkgKiB0aGV5IF93aWxsXyBoaXQgdGhpcy4KLQkgKi8KICAgICAgICAgcmV0dXJuIChCUEZfQ0xBU1MoZmlsdGVyW2ZsZW4gLSAxXS5jb2RlKSA9PSBCUEZfUkVUKSA/IDAgOiAtRUlOVkFMOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCmluZGV4IDMyMTI4N2IuLjkwZDE4YjcgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCkBAIC02Miw3ICs2Miw3IEBACiBNT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfbmV0d29ya3NfYWxsb2NhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgaW50IGllZWU4MDIxMV9uZXR3b3Jrc19hbGxvY2F0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlpZiAoaWVlZS0+bmV0d29ya3MpCiAJCXJldHVybiAwOwpAQCAtOTAsNyArOTAsNyBAQAogCWllZWUtPm5ldHdvcmtzID0gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9uZXR3b3Jrc19pbml0aWFsaXplKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX25ldHdvcmtzX2luaXRpYWxpemUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IDVlMzM4MDMuLjdhMTIxODAgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMzUsNyArMzUsNyBAQAogCiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgogCi1zdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX21vbml0b3Jfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfbW9uaXRvcl9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpCiB7CkBAIC0xNjUsNyArMTY1LDcgQEAKICAqIFJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBtYW5hZ2VtZW50IGNvbnRyb2wgZnJhbWVzCiAgKgogICogQ2FsbGVkIGJ5IGllZWU4MDIxMV9yeCAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIGllZWU4MDIxMV9yeF9mcmFtZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLAogCQkJdTE2IHN0eXBlKQpAQCAtMjY2LDcgKzI2Niw3IEBACiB9CiAKIC8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSwgYnkgaWVlZTgwMjExX3J4ICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0KQogewpAQCAtMjk3LDcgKzI5Nyw3IEBACiB9CiAKIC8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSwgYnkgaWVlZTgwMjExX3J4ICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHRfbXNkdShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQga2V5aWR4LAogCQkJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQpCkBAIC0xMTU2LDcgKzExNTYsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfbmV0d29ya19pbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlCitzdGF0aWMgaW50IGllZWU4MDIxMV9uZXR3b3JrX2luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UKIAkJCQkJICpiZWFjb24sCiAJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCiAJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKQEAgLTEyMzUsNyArMTIzNSw3IEBACiAJCSFtZW1jbXAoc3JjLT5zc2lkLCBkc3QtPnNzaWQsIHNyYy0+c3NpZF9sZW4pKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9uZXR3b3JrKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqZHN0LAorc3RhdGljIHZvaWQgdXBkYXRlX25ldHdvcmsoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpkc3QsCiAJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnNyYykKIHsKIAlpbnQgcW9zX2FjdGl2ZTsKQEAgLTEyOTQsNyArMTI5NCw3IEBACiAJcmV0dXJuIChXTEFOX0ZDX0dFVF9TVFlQRShsZTE2X3RvX2NwdShmYykpID09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlCiAJCQkJCQkgICAgKmllZWUsIHN0cnVjdAogCQkJCQkJICAgIGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZQogCQkJCQkJICAgICpiZWFjb24sIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCmluZGV4IGU1YjMzYzguLjhmZGQ5NDMgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtMTI3LDcgKzEyNyw3IEBACiBzdGF0aWMgdTggUDgwMl8xSF9PVUlbUDgwMjExX09VSV9MRU5dID0geyAweDAwLCAweDAwLCAweGY4IH07CiBzdGF0aWMgdTggUkZDMTA0Ml9PVUlbUDgwMjExX09VSV9MRU5dID0geyAweDAwLCAweDAwLCAweDAwIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9jb3B5X3NuYXAodTggKiBkYXRhLCB1MTYgaF9wcm90bykKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NvcHlfc25hcCh1OCAqIGRhdGEsIHUxNiBoX3Byb3RvKQogewogCXN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgKnNuYXA7CiAJdTggKm91aTsKQEAgLTE1MCw3ICsxNTAsNyBAQAogCXJldHVybiBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCitzdGF0aWMgaW50IGllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpmcmFnLCBpbnQgaGRyX2xlbikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IDQwNmQ1YjkuLjIzZTE2MzAgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpAQCAtNDIsNyArNDIsNyBAQAogfTsKIAogI2RlZmluZSBNQVhfQ1VTVE9NX0xFTiA2NAotc3RhdGljIGlubGluZSBjaGFyICppcHcyMTAwX3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorc3RhdGljIGNoYXIgKmlwdzIxMDBfdHJhbnNsYXRlX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCiAJCQkJCSAgIGNoYXIgKnN0YXJ0LCBjaGFyICpzdG9wLAogCQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IGE5ODkzZWMuLmRiNzgzMDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCkBAIC0xODIsNiArMTgyLDcgQEAKIAogY29uZmlnIElQX05GX0lQVEFCTEVTCiAJdHJpc3RhdGUgIklQIHRhYmxlcyBzdXBwb3J0IChyZXF1aXJlZCBmb3IgZmlsdGVyaW5nL21hc3EvTkFUKSIKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJaGVscAogCSAgaXB0YWJsZXMgaXMgYSBnZW5lcmFsLCBleHRlbnNpYmxlIHBhY2tldCBpZGVudGlmaWNhdGlvbiBmcmFtZXdvcmsuCiAJICBUaGUgcGFja2V0IGZpbHRlcmluZyBhbmQgZnVsbCBOQVQgKG1hc3F1ZXJhZGluZywgcG9ydCBmb3J3YXJkaW5nLApAQCAtMTkxLDE2ICsxOTIsNiBAQAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKICMgVGhlIG1hdGNoZXMuCi1jb25maWcgSVBfTkZfTUFUQ0hfTElNSVQKLQl0cmlzdGF0ZSAibGltaXQgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgbGltaXQgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBjb250cm9sIHRoZSByYXRlIGF0IHdoaWNoIGEgcnVsZSBjYW4gYmUKLQkgIG1hdGNoZWQ6IG1haW5seSB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgTE9HIHRhcmdldCAoIkxPRwotCSAgdGFyZ2V0IHN1cHBvcnQiLCBiZWxvdykgYW5kIHRvIGF2b2lkIHNvbWUgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrcy4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9NQVRDSF9JUFJBTkdFCiAJdHJpc3RhdGUgIklQIHJhbmdlIG1hdGNoIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwpAQCAtMjEwLDM3ICsyMDEsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQX05GX01BVENIX01BQwotCXRyaXN0YXRlICJNQUMgYWRkcmVzcyBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBNQUMgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZSBzb3VyY2UKLQkgIEV0aGVybmV0IGFkZHJlc3Mgb2YgdGhlIHBhY2tldC4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9QS1RUWVBFCi0JdHJpc3RhdGUgIlBhY2tldCB0eXBlIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIFBhY2tldCB0eXBlIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggYSBwYWNrZXQgYnkKLQkgIGl0cyAiY2xhc3MiLCBlZy4gQlJPQURDQVNULCBNVUxUSUNBU1QsIC4uLgotCi0JICBUeXBpY2FsIHVzYWdlOgotCSAgaXB0YWJsZXMgLUEgSU5QVVQgLW0gcGt0dHlwZSAtLXBrdC10eXBlIGJyb2FkY2FzdCAtaiBMT0cKLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9NQVJLCi0JdHJpc3RhdGUgIm5ldGZpbHRlciBNQVJLIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIE5ldGZpbHRlciBtYXJrIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUKLQkgIGBuZm1hcmsnIHZhbHVlIGluIHRoZSBwYWNrZXQuICBUaGlzIGNhbiBiZSBzZXQgYnkgdGhlIE1BUksgdGFyZ2V0Ci0JICAoc2VlIGJlbG93KS4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9NQVRDSF9NVUxUSVBPUlQKIAl0cmlzdGF0ZSAiTXVsdGlwbGUgcG9ydCBtYXRjaCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKQEAgLTMwMSwxNSArMjYxLDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUF9ORl9NQVRDSF9MRU5HVEgKLQl0cmlzdGF0ZSAiTEVOR1RIIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gbWF0Y2ggdGhlIGxlbmd0aCBvZiBhIHBhY2tldCBhZ2FpbnN0IGEKLQkgIHNwZWNpZmljIHZhbHVlIG9yIHJhbmdlIG9mIHZhbHVlcy4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9NQVRDSF9UVEwKIAl0cmlzdGF0ZSAiVFRMIG1hdGNoIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwpAQCAtMzE5LDUwICsyNzAsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQX05GX01BVENIX1RDUE1TUwotCXRyaXN0YXRlICJ0Y3Btc3MgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGB0Y3Btc3MnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIGV4YW1pbmUgdGhlCi0JICBNU1MgdmFsdWUgb2YgVENQIFNZTiBwYWNrZXRzLCB3aGljaCBjb250cm9sIHRoZSBtYXhpbXVtIHBhY2tldCBzaXplCi0JICBmb3IgdGhhdCBjb25uZWN0aW9uLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX01BVENIX0hFTFBFUgotCXRyaXN0YXRlICJIZWxwZXIgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLX0lQVjQKLQloZWxwCi0JICBIZWxwZXIgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGluIGR5bmFtaWMgY29ubmVjdGlvbnMKLQkgIHRyYWNrZWQgYnkgYSBjb25udHJhY2staGVscGVyLCBpZS4gaXBfY29ubnRyYWNrX2Z0cAotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgWS4KLQotY29uZmlnIElQX05GX01BVENIX1NUQVRFCi0JdHJpc3RhdGUgIkNvbm5lY3Rpb24gc3RhdGUgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLX0lQVjQKLQloZWxwCi0JICBDb25uZWN0aW9uIHN0YXRlIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGVpcgotCSAgcmVsYXRpb25zaGlwIHRvIGEgdHJhY2tlZCBjb25uZWN0aW9uIChpZS4gcHJldmlvdXMgcGFja2V0cykuICBUaGlzCi0JICBpcyBhIHBvd2VyZnVsIHRvb2wgZm9yIHBhY2tldCBjbGFzc2lmaWNhdGlvbi4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9DT05OVFJBQ0sKLQl0cmlzdGF0ZSAiQ29ubmVjdGlvbiB0cmFja2luZyBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0tfSVBWNAotCWhlbHAKLQkgIFRoaXMgaXMgYSBnZW5lcmFsIGNvbm50cmFjayBtYXRjaCBtb2R1bGUsIGEgc3VwZXJzZXQgb2YgdGhlIHN0YXRlIG1hdGNoLgotCi0JICBJdCBhbGxvd3MgbWF0Y2hpbmcgb24gYWRkaXRpb25hbCBjb25udHJhY2sgaW5mb3JtYXRpb24sIHdoaWNoIGlzCi0JICB1c2VmdWwgaW4gY29tcGxleCBjb25maWd1cmF0aW9ucywgc3VjaCBhcyBOQVQgZ2F0ZXdheXMgd2l0aCBtdWx0aXBsZQotCSAgaW50ZXJuZXQgbGlua3Mgb3IgdHVubmVscy4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9NQVRDSF9PV05FUgogCXRyaXN0YXRlICJPd25lciBtYXRjaCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKQEAgLTM3MiwxNSArMjc5LDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUF9ORl9NQVRDSF9QSFlTREVWCi0JdHJpc3RhdGUgIlBoeXNkZXYgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIEJSSURHRV9ORVRGSUxURVIKLQloZWxwCi0JICBQaHlzZGV2IHBhY2tldCBtYXRjaGluZyBtYXRjaGVzIGFnYWluc3QgdGhlIHBoeXNpY2FsIGJyaWRnZSBwb3J0cwotCSAgdGhlIElQIHBhY2tldCBhcnJpdmVkIG9uIG9yIHdpbGwgbGVhdmUgYnkuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgSVBfTkZfTUFUQ0hfQUREUlRZUEUKIAl0cmlzdGF0ZSAgJ2FkZHJlc3MgdHlwZSBtYXRjaCBzdXBwb3J0JwogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKQEAgLTM5MSw3NSArMjg5LDYgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+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+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX0hFTFBFUgorCXRyaXN0YXRlICciaGVscGVyIiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0sKKwloZWxwCisJICBIZWxwZXIgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGluIGR5bmFtaWMgY29ubmVjdGlvbnMKKwkgIHRyYWNrZWQgYnkgYSBjb25udHJhY2staGVscGVyLCBpZS4gaXBfY29ubnRyYWNrX2Z0cAorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEgKKwl0cmlzdGF0ZSAnImxlbmd0aCIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIGEgcGFja2V0IGFnYWluc3QgYQorCSAgc3BlY2lmaWMgdmFsdWUgb3IgcmFuZ2Ugb2YgdmFsdWVzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVAorCXRyaXN0YXRlICcibGltaXQiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWhlbHAKKwkgIGxpbWl0IG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gY29udHJvbCB0aGUgcmF0ZSBhdCB3aGljaCBhIHJ1bGUgY2FuIGJlCisJICBtYXRjaGVkOiBtYWlubHkgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIExPRyB0YXJnZXQgKCJMT0cKKwkgIHRhcmdldCBzdXBwb3J0IiwgYmVsb3cpIGFuZCB0byBhdm9pZCBzb21lIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFja3MuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX01BQworCXRyaXN0YXRlICcibWFjIiBhZGRyZXNzIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWhlbHAKKwkgIE1BQyBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlIHNvdXJjZQorCSAgRXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUgcGFja2V0LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9NQVJLCisJdHJpc3RhdGUgJyJtYXJrIiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBOZXRmaWx0ZXIgbWFyayBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlCisJICBgbmZtYXJrJyB2YWx1ZSBpbiB0aGUgcGFja2V0LiAgVGhpcyBjYW4gYmUgc2V0IGJ5IHRoZSBNQVJLIHRhcmdldAorCSAgKHNlZSBiZWxvdykuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1BIWVNERVYKKwl0cmlzdGF0ZSAnInBoeXNkZXYiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUyAmJiBCUklER0VfTkVURklMVEVSCisJaGVscAorCSAgUGh5c2RldiBwYWNrZXQgbWF0Y2hpbmcgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwaHlzaWNhbCBicmlkZ2UgcG9ydHMKKwkgIHRoZSBJUCBwYWNrZXQgYXJyaXZlZCBvbiBvciB3aWxsIGxlYXZlIGJ5LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFCisJdHJpc3RhdGUgJyJwa3R0eXBlIiBwYWNrZXQgdHlwZSBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBQYWNrZXQgdHlwZSBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIGEgcGFja2V0IGJ5CisJICBpdHMgImNsYXNzIiwgZWcuIEJST0FEQ0FTVCwgTVVMVElDQVNULCAuLi4KKworCSAgVHlwaWNhbCB1c2FnZToKKwkgIGlwdGFibGVzIC1BIElOUFVUIC1tIHBrdHR5cGUgLS1wa3QtdHlwZSBicm9hZGNhc3QgLWogTE9HCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1JFQUxNCisJdHJpc3RhdGUgICcicmVhbG0iIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCXNlbGVjdCBORVRfQ0xTX1JPVVRFCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGByZWFsbScgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gdXNlIHRoZSByZWFsbQorCSAga2V5IGZyb20gdGhlIHJvdXRpbmcgc3Vic3lzdGVtIGluc2lkZSBpcHRhYmxlcy4KKwkKKwkgIFRoaXMgbWF0Y2ggcHJldHR5IG11Y2ggcmVzZW1ibGVzIHRoZSBDT05GSUdfTkVUX0NMU19ST1VURTQgb3B0aW9uIAorCSAgaW4gdGMgd29ybGQuCisJCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TQ1RQCisJdHJpc3RhdGUgICcic2N0cCIgcHJvdG9jb2wgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBlbmFibGVkLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgCisJICBgc2N0cCcgbWF0Y2ggaW4gb3JkZXIgdG8gbWF0Y2ggb24gU0NUUCBzb3VyY2UvZGVzdGluYXRpb24gcG9ydHMKKwkgIGFuZCBTQ1RQIGNodW5rIHR5cGVzLgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TVEFURQorCXRyaXN0YXRlICcic3RhdGUiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLIHx8IE5GX0NPTk5UUkFDSworCWhlbHAKKwkgIENvbm5lY3Rpb24gc3RhdGUgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZWlyCisJICByZWxhdGlvbnNoaXAgdG8gYSB0cmFja2VkIGNvbm5lY3Rpb24gKGllLiBwcmV2aW91cyBwYWNrZXRzKS4gIFRoaXMKKwkgIGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgcGFja2V0IGNsYXNzaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkcKKwl0cmlzdGF0ZSAgJyJzdHJpbmciIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCXNlbGVjdCBURVhUU0VBUkNICisJc2VsZWN0IFRFWFRTRUFSQ0hfS01QCisJc2VsZWN0IFRFWFRTRUFSQ0hfQk0KKwlzZWxlY3QgVEVYVFNFQVJDSF9GU00KKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYHN0cmluZycgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gbG9vayBmb3IKKwkgIHBhdHRlcm4gbWF0Y2hpbmdzIGluIHBhY2tldHMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1RDUE1TUworCXRyaXN0YXRlICcidGNwbXNzIiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYHRjcG1zcycgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gZXhhbWluZSB0aGUKKwkgIE1TUyB2YWx1ZSBvZiBUQ1AgU1lOIHBhY2tldHMsIHdoaWNoIGNvbnRyb2wgdGhlIG1heGltdW0gcGFja2V0IHNpemUKKwkgIGZvciB0aGF0IGNvbm5lY3Rpb24uCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQppbmRleCBjYjIxODMxLi43NDYxNzJlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTEsNCArMSw1IEBACiBuZXRmaWx0ZXItb2JqcyA6PSBjb3JlLm8gbmZfbG9nLm8gbmZfcXVldWUubyBuZl9zb2Nrb3B0Lm8KK25mX2Nvbm50cmFjay1vYmpzCTo9IG5mX2Nvbm50cmFja19jb3JlLm8gbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUubyBuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljLm8gbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMubyBuZl9jb25udHJhY2tfcHJvdG9fdGNwLm8gbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5vCiAKIG9iai0kKENPTkZJR19ORVRGSUxURVIpID0gbmV0ZmlsdGVyLm8KIApAQCAtNiwxMyArNyw0MyBAQAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX1FVRVVFKSArPSBuZm5ldGxpbmtfcXVldWUubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0xPRykgKz0gbmZuZXRsaW5rX2xvZy5vCiAKLW5mX2Nvbm50cmFjay1vYmpzCTo9IG5mX2Nvbm50cmFja19jb3JlLm8gbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUubyBuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljLm8gbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMubyBuZl9jb25udHJhY2tfcHJvdG9fdGNwLm8gbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5vCi0KKyMgY29ubmVjdGlvbiB0cmFja2luZwogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDSykgKz0gbmZfY29ubnRyYWNrLm8KLW9iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfRlRQKSArPSBuZl9jb25udHJhY2tfZnRwLm8KIAogIyBTQ1RQIHByb3RvY29sIGNvbm5lY3Rpb24gdHJhY2tpbmcKIG9iai0kKENPTkZJR19ORl9DVF9QUk9UT19TQ1RQKSArPSBuZl9jb25udHJhY2tfcHJvdG9fc2N0cC5vCiAKICMgbmV0bGluayBpbnRlcmZhY2UgZm9yIG5mX2Nvbm50cmFjawogb2JqLSQoQ09ORklHX05GX0NUX05FVExJTkspICs9IG5mX2Nvbm50cmFja19uZXRsaW5rLm8KKworIyBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlcnMKK29iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfRlRQKSArPSBuZl9jb25udHJhY2tfZnRwLm8KKworIyBnZW5lcmljIFggdGFibGVzIAorb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTKSArPSB4X3RhYmxlcy5vIHh0X3RjcHVkcC5vCisKKyMgdGFyZ2V0cworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlkpICs9IHh0X0NMQVNTSUZZLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLKSArPSB4dF9DT05OTUFSSy5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLKSArPSB4dF9NQVJLLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUUpICs9IHh0X05GUVVFVUUubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTk9UUkFDSykgKz0geHRfTk9UUkFDSy5vCisKKyMgbWF0Y2hlcworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UKSArPSB4dF9jb21tZW50Lm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkJZVEVTKSArPSB4dF9jb25uYnl0ZXMubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTUFSSykgKz0geHRfY29ubm1hcmsubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0spICs9IHh0X2Nvbm50cmFjay5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1ApICs9IHh0X2RjY3Aubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVIpICs9IHh0X2hlbHBlci5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSCkgKz0geHRfbGVuZ3RoLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQpICs9IHh0X2xpbWl0Lm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDKSArPSB4dF9tYWMubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQVJLKSArPSB4dF9tYXJrLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRSkgKz0geHRfcGt0dHlwZS5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNKSArPSB4dF9yZWFsbS5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFApICs9IHh0X3NjdHAubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURSkgKz0geHRfc3RhdGUubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkcpICs9IHh0X3N0cmluZy5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RDUE1TUykgKz0geHRfdGNwbXNzLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEhZU0RFVikgKz0geHRfcGh5c2Rldi5vCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCmluZGV4IGQ1YTZlYWYuLmFiMGM5MjAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCkBAIC01NDUsMTEgKzU0NSwxMSBAQAogICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBJUCBhZGRyZXNzLiAgU2ltcGx5IGRvbid0IHJlY29yZCBpdCBmb3IKICAgICAgICAgICAgICAgICAgICBOQVQuICovCiAJCWlmIChjbWQubDNudW0gPT0gUEZfSU5FVCkgewotICAgICAgICAgICAgICAgIAlERUJVR1AoImNvbm50cmFja19mdHA6IE5PVCBSRUNPUkRJTkc6ICV1LCV1LCV1LCV1ICE9ICV1LiV1LiV1LiV1XG4iLAorICAgICAgICAgICAgICAgIAlERUJVR1AoImNvbm50cmFja19mdHA6IE5PVCBSRUNPUkRJTkc6ICIgTklQUVVBRF9GTVQgIiAhPSAiIE5JUFFVQURfRk1UICJcbiIsCiAJCQkgICAgICAgTklQUVVBRChjbWQudTMuaXApLAogCQkJICAgICAgIE5JUFFVQUQoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51My5pcCkpOwogCQl9IGVsc2UgewotCQkJREVCVUdQKCJjb25udHJhY2tfZnRwOiBOT1QgUkVDT1JESU5HOiAleDoleDoleDoleDoleDoleDoleDoleCAhPSAleDoleDoleDoleDoleDoleDoleDoleFxuIiwKKwkJCURFQlVHUCgiY29ubnRyYWNrX2Z0cDogTk9UIFJFQ09SRElORzogIiBOSVA2X0ZNVCAiICE9ICIgTklQNl9GTVQgIlxuIiwKIAkJCSAgICAgICBOSVA2KCooKHN0cnVjdCBpbjZfYWRkciAqKWNtZC51My5pcDYpKSwKIAkJCSAgICAgICBOSVA2KCooKHN0cnVjdCBpbjZfYWRkciAqKWN0LT50dXBsZWhhc2hbZGlyXQogCQkJCQkJCS50dXBsZS5zcmMudTMuaXA2KSkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCmluZGV4IDM1MzFkMTQuLjYxNzU5OWEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTgyMSw3ICs4MjEsNyBAQAogCiAvKiBTb21lIG1vZHVsZXMgbmVlZCB1cywgYnV0IGRvbid0IGRlcGVuZCBkaXJlY3RseSBvbiBhbnkgc3ltYm9sLgogICAgVGhleSBzaG91bGQgY2FsbCB0aGlzLiAqLwotdm9pZCBuZWVkX25mX2Nvbm50cmFjayh2b2lkKQordm9pZCBuZWVkX2Nvbm50cmFjayh2b2lkKQogewogfQogCkBAIC04NDEsNyArODQxLDcgQEAKIEVYUE9SVF9TWU1CT0wobmZfY3RfaW52ZXJ0X3R1cGxlcHIpOwogRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfYWx0ZXJfcmVwbHkpOwogRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfZGVzdHJveWVkKTsKLUVYUE9SVF9TWU1CT0wobmVlZF9uZl9jb25udHJhY2spOworRVhQT1JUX1NZTUJPTChuZWVkX2Nvbm50cmFjayk7CiBFWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIpOwogRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIpOwogRVhQT1JUX1NZTUJPTChuZl9jdF9pdGVyYXRlX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmsuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmMKaW5kZXggOTVmZGYwNC4uZjYwNjNlOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmsuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGluay5jCkBAIC0yMTIsNyArMjEyLDcgQEAKIH0KIAogLyogUHJvY2VzcyBvbmUgY29tcGxldGUgbmZuZXRsaW5rIG1lc3NhZ2UuICovCi1zdGF0aWMgaW5saW5lIGludCBuZm5ldGxpbmtfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIGludCBuZm5ldGxpbmtfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgaW50ICplcnJwKQogewogCXN0cnVjdCBuZm5sX2NhbGxiYWNrICpuYzsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYyBiL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzgxN2FmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jCkBAIC0wLDAgKzEsNjI0IEBACisvKgorICogeF90YWJsZXMgY29yZSAtIEJhY2tlbmQgZm9yIHtpcCxpcDYsYXJwfV90YWJsZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBCYXNlZCBvbiBleGlzdGluZyBpcF90YWJsZXMgY29kZSB3aGljaCBpcworICogICBDb3B5cmlnaHQgKEMpIDE5OTkgUGF1bCBgUnVzdHknIFJ1c3NlbGwgJiBNaWNoYWVsIEouIE5ldWxpbmcKKyAqICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2FycC5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiW2lwLGlwNixhcnBdX3RhYmxlcyBiYWNrZW5kIG1vZHVsZSIpOworCisjZGVmaW5lIFNNUF9BTElHTih4KSAoKCh4KSArIFNNUF9DQUNIRV9CWVRFUy0xKSAmIH4oU01QX0NBQ0hFX0JZVEVTLTEpKQorCitzdHJ1Y3QgeHRfYWYgeworCXN0cnVjdCBzZW1hcGhvcmUgbXV0ZXg7CisJc3RydWN0IGxpc3RfaGVhZCBtYXRjaDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRhcmdldDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRhYmxlczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfYWYgKnh0OworCisjaWZkZWYgREVCVUdfSVBfRklSRVdBTExfVVNFUgorI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKK2VudW0geworCVRBQkxFLAorCVRBUkdFVCwKKwlNQVRDSCwKK307CisKKy8qIFJlZ2lzdHJhdGlvbiBob29rcyBmb3IgdGFyZ2V0cy4gKi8KK2ludAoreHRfcmVnaXN0ZXJfdGFyZ2V0KGludCBhZiwgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0KQoreworCWludCByZXQ7CisKKwlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJnh0W2FmXS5tdXRleCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCWxpc3RfYWRkKCZ0YXJnZXQtPmxpc3QsICZ4dFthZl0udGFyZ2V0KTsKKwl1cCgmeHRbYWZdLm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh4dF9yZWdpc3Rlcl90YXJnZXQpOworCit2b2lkCit4dF91bnJlZ2lzdGVyX3RhcmdldChpbnQgYWYsIHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCkKK3sKKwlkb3duKCZ4dFthZl0ubXV0ZXgpOworCUxJU1RfREVMRVRFKCZ4dFthZl0udGFyZ2V0LCB0YXJnZXQpOworCXVwKCZ4dFthZl0ubXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTCh4dF91bnJlZ2lzdGVyX3RhcmdldCk7CisKK2ludAoreHRfcmVnaXN0ZXJfbWF0Y2goaW50IGFmLCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoKQoreworCWludCByZXQ7CisKKwlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJnh0W2FmXS5tdXRleCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJbGlzdF9hZGQoJm1hdGNoLT5saXN0LCAmeHRbYWZdLm1hdGNoKTsKKwl1cCgmeHRbYWZdLm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHh0X3JlZ2lzdGVyX21hdGNoKTsKKwordm9pZAoreHRfdW5yZWdpc3Rlcl9tYXRjaChpbnQgYWYsIHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gpCit7CisJZG93bigmeHRbYWZdLm11dGV4KTsKKwlMSVNUX0RFTEVURSgmeHRbYWZdLm1hdGNoLCBtYXRjaCk7CisJdXAoJnh0W2FmXS5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKHh0X3VucmVnaXN0ZXJfbWF0Y2gpOworCisKKy8qCisgKiBUaGVzZSBhcmUgd2VpcmQsIGJ1dCBtb2R1bGUgbG9hZGluZyBtdXN0IG5vdCBiZSBkb25lIHdpdGggbXV0ZXgKKyAqIGhlbGQgKHNpbmNlIHRoZXkgd2lsbCByZWdpc3RlciksIGFuZCB3ZSBoYXZlIHRvIGhhdmUgYSBzaW5nbGUKKyAqIGZ1bmN0aW9uIHRvIHVzZSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSgpLgorICovCisKKy8qIEZpbmQgbWF0Y2gsIGdyYWJzIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLworc3RydWN0IHh0X21hdGNoICp4dF9maW5kX21hdGNoKGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCit7CisJc3RydWN0IHh0X21hdGNoICptOworCWludCBlcnIgPSAwOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmeHRbYWZdLm11dGV4KSAhPSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtLCAmeHRbYWZdLm1hdGNoLCBsaXN0KSB7CisJCWlmIChzdHJjbXAobS0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaWYgKG0tPnJldmlzaW9uID09IHJldmlzaW9uKSB7CisJCQkJaWYgKHRyeV9tb2R1bGVfZ2V0KG0tPm1lKSkgeworCQkJCQl1cCgmeHRbYWZdLm11dGV4KTsKKwkJCQkJcmV0dXJuIG07CisJCQkJfQorCQkJfSBlbHNlCisJCQkJZXJyID0gLUVQUk9UT1RZUEU7IC8qIEZvdW5kIHNvbWV0aGluZy4gKi8KKwkJfQorCX0KKwl1cCgmeHRbYWZdLm11dGV4KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorRVhQT1JUX1NZTUJPTCh4dF9maW5kX21hdGNoKTsKKworLyogRmluZCB0YXJnZXQsIGdyYWJzIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLworc3RydWN0IHh0X3RhcmdldCAqeHRfZmluZF90YXJnZXQoaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKK3sKKwlzdHJ1Y3QgeHRfdGFyZ2V0ICp0OworCWludCBlcnIgPSAwOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmeHRbYWZdLm11dGV4KSAhPSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmeHRbYWZdLnRhcmdldCwgbGlzdCkgeworCQlpZiAoc3RyY21wKHQtPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCWlmICh0LT5yZXZpc2lvbiA9PSByZXZpc2lvbikgeworCQkJCWlmICh0cnlfbW9kdWxlX2dldCh0LT5tZSkpIHsKKwkJCQkJdXAoJnh0W2FmXS5tdXRleCk7CisJCQkJCXJldHVybiB0OworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWVyciA9IC1FUFJPVE9UWVBFOyAvKiBGb3VuZCBzb21ldGhpbmcuICovCisJCX0KKwl9CisJdXAoJnh0W2FmXS5tdXRleCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KK0VYUE9SVF9TWU1CT0woeHRfZmluZF90YXJnZXQpOworCitzdGF0aWMgY29uc3QgY2hhciAqeHRfcHJlZml4W05QUk9UT10gPSB7CisJW0FGX0lORVRdIAk9ICJpcHRfJXMiLAorCVtBRl9JTkVUNl0gCT0gImlwNnRfJXMiLAorCVtORl9BUlBdCT0gImFycHRfJXMiLAorfTsKKworc3RydWN0IHh0X3RhcmdldCAqeHRfcmVxdWVzdF9maW5kX3RhcmdldChpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQoreworCXN0cnVjdCB4dF90YXJnZXQgKnRhcmdldDsKKworCXRhcmdldCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFyZ2V0KGFmLCBuYW1lLCByZXZpc2lvbiksCisJCQkJCSB4dF9wcmVmaXhbYWZdLCBuYW1lKTsKKwlpZiAoSVNfRVJSKHRhcmdldCkgfHwgIXRhcmdldCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHRhcmdldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X3JlcXVlc3RfZmluZF90YXJnZXQpOworCitzdGF0aWMgaW50IG1hdGNoX3JldmZuKGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCAqYmVzdHApCit7CisJc3RydWN0IHh0X21hdGNoICptOworCWludCBoYXZlX3JldiA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZ4dFthZl0ubWF0Y2gsIGxpc3QpIHsKKwkJaWYgKHN0cmNtcChtLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlpZiAobS0+cmV2aXNpb24gPiAqYmVzdHApCisJCQkJKmJlc3RwID0gbS0+cmV2aXNpb247CisJCQlpZiAobS0+cmV2aXNpb24gPT0gcmV2aXNpb24pCisJCQkJaGF2ZV9yZXYgPSAxOworCQl9CisJfQorCXJldHVybiBoYXZlX3JldjsKK30KKworc3RhdGljIGludCB0YXJnZXRfcmV2Zm4oaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50ICpiZXN0cCkKK3sKKwlzdHJ1Y3QgeHRfdGFyZ2V0ICp0OworCWludCBoYXZlX3JldiA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZ4dFthZl0udGFyZ2V0LCBsaXN0KSB7CisJCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaWYgKHQtPnJldmlzaW9uID4gKmJlc3RwKQorCQkJCSpiZXN0cCA9IHQtPnJldmlzaW9uOworCQkJaWYgKHQtPnJldmlzaW9uID09IHJldmlzaW9uKQorCQkJCWhhdmVfcmV2ID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gaGF2ZV9yZXY7Cit9CisKKy8qIFJldHVybnMgdHJ1ZSBvciBmYWxzZSAoaWYgbm8gc3VjaCBleHRlbnNpb24gYXQgYWxsKSAqLworaW50IHh0X2ZpbmRfcmV2aXNpb24oaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50IHRhcmdldCwKKwkJICAgICBpbnQgKmVycikKK3sKKwlpbnQgaGF2ZV9yZXYsIGJlc3QgPSAtMTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnh0W2FmXS5tdXRleCkgIT0gMCkgeworCQkqZXJyID0gLUVJTlRSOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHRhcmdldCA9PSAxKQorCQloYXZlX3JldiA9IHRhcmdldF9yZXZmbihhZiwgbmFtZSwgcmV2aXNpb24sICZiZXN0KTsKKwllbHNlCisJCWhhdmVfcmV2ID0gbWF0Y2hfcmV2Zm4oYWYsIG5hbWUsIHJldmlzaW9uLCAmYmVzdCk7CisJdXAoJnh0W2FmXS5tdXRleCk7CisKKwkvKiBOb3RoaW5nIGF0IGFsbD8gIFJldHVybiAwIHRvIHRyeSBsb2FkaW5nIG1vZHVsZS4gKi8KKwlpZiAoYmVzdCA9PSAtMSkgeworCQkqZXJyID0gLUVOT0VOVDsKKwkJcmV0dXJuIDA7CisJfQorCisJKmVyciA9IGJlc3Q7CisJaWYgKCFoYXZlX3JldikKKwkJKmVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4dF9maW5kX3JldmlzaW9uKTsKKworc3RydWN0IHh0X3RhYmxlX2luZm8gKnh0X2FsbG9jX3RhYmxlX2luZm8odW5zaWduZWQgaW50IHNpemUpCit7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm87CisJaW50IGNwdTsKKworCS8qIFBlZGFudHJ5OiBwcmV2ZW50IHRoZW0gZnJvbSBoaXR0aW5nIEJVRygpIGluIHZtYWxsb2MuYyAtLVJSICovCisJaWYgKChTTVBfQUxJR04oc2l6ZSkgPj4gUEFHRV9TSElGVCkgKyAyID4gbnVtX3BoeXNwYWdlcykKKwkJcmV0dXJuIE5VTEw7CisKKwluZXdpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHh0X3RhYmxlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld2luZm8pCisJCXJldHVybiBOVUxMOworCisJbmV3aW5mby0+c2l6ZSA9IHNpemU7CisKKwlmb3JfZWFjaF9jcHUoY3B1KSB7CisJCWlmIChzaXplIDw9IFBBR0VfU0laRSkKKwkJCW5ld2luZm8tPmVudHJpZXNbY3B1XSA9IGttYWxsb2Nfbm9kZShzaXplLAorCQkJCQkJCUdGUF9LRVJORUwsCisJCQkJCQkJY3B1X3RvX25vZGUoY3B1KSk7CisJCWVsc2UKKwkJCW5ld2luZm8tPmVudHJpZXNbY3B1XSA9IHZtYWxsb2Nfbm9kZShzaXplLAorCQkJCQkJCWNwdV90b19ub2RlKGNwdSkpOworCisJCWlmIChuZXdpbmZvLT5lbnRyaWVzW2NwdV0gPT0gTlVMTCkgeworCQkJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gbmV3aW5mbzsKK30KK0VYUE9SVF9TWU1CT0woeHRfYWxsb2NfdGFibGVfaW5mbyk7CisKK3ZvaWQgeHRfZnJlZV90YWJsZV9pbmZvKHN0cnVjdCB4dF90YWJsZV9pbmZvICppbmZvKQoreworCWludCBjcHU7CisKKwlmb3JfZWFjaF9jcHUoY3B1KSB7CisJCWlmIChpbmZvLT5zaXplIDw9IFBBR0VfU0laRSkKKwkJCWtmcmVlKGluZm8tPmVudHJpZXNbY3B1XSk7CisJCWVsc2UKKwkJCXZmcmVlKGluZm8tPmVudHJpZXNbY3B1XSk7CisJfQorCWtmcmVlKGluZm8pOworfQorRVhQT1JUX1NZTUJPTCh4dF9mcmVlX3RhYmxlX2luZm8pOworCisvKiBGaW5kIHRhYmxlIGJ5IG5hbWUsIGdyYWJzIG11dGV4ICYgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCitzdHJ1Y3QgeHRfdGFibGUgKnh0X2ZpbmRfdGFibGVfbG9jayhpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHh0X3RhYmxlICp0OworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmeHRbYWZdLm11dGV4KSAhPSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmeHRbYWZdLnRhYmxlcywgbGlzdCkKKwkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwICYmIHRyeV9tb2R1bGVfZ2V0KHQtPm1lKSkKKwkJCXJldHVybiB0OworCXVwKCZ4dFthZl0ubXV0ZXgpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeHRfZmluZF90YWJsZV9sb2NrKTsKKwordm9pZCB4dF90YWJsZV91bmxvY2soc3RydWN0IHh0X3RhYmxlICp0YWJsZSkKK3sKKwl1cCgmeHRbdGFibGUtPmFmXS5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4dF90YWJsZV91bmxvY2spOworCisKK3N0cnVjdCB4dF90YWJsZV9pbmZvICoKK3h0X3JlcGxhY2VfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSwKKwkgICAgICB1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzLAorCSAgICAgIHN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLAorCSAgICAgIGludCAqZXJyb3IpCit7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKm9sZGluZm8sICpwcml2YXRlOworCisJLyogRG8gdGhlIHN1YnN0aXR1dGlvbi4gKi8KKwl3cml0ZV9sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CisJcHJpdmF0ZSA9IHRhYmxlLT5wcml2YXRlOworCS8qIENoZWNrIGluc2lkZSBsb2NrOiBpcyB0aGUgb2xkIG51bWJlciBjb3JyZWN0PyAqLworCWlmIChudW1fY291bnRlcnMgIT0gcHJpdmF0ZS0+bnVtYmVyKSB7CisJCWR1cHJpbnRmKCJudW1fY291bnRlcnMgIT0gdGFibGUtPnByaXZhdGUtPm51bWJlciAoJXUvJXUpXG4iLAorCQkJIG51bV9jb3VudGVycywgcHJpdmF0ZS0+bnVtYmVyKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CisJCSplcnJvciA9IC1FQUdBSU47CisJCXJldHVybiBOVUxMOworCX0KKwlvbGRpbmZvID0gcHJpdmF0ZTsKKwl0YWJsZS0+cHJpdmF0ZSA9IG5ld2luZm87CisJbmV3aW5mby0+aW5pdGlhbF9lbnRyaWVzID0gb2xkaW5mby0+aW5pdGlhbF9lbnRyaWVzOworCXdyaXRlX3VubG9ja19iaCgmdGFibGUtPmxvY2spOworCisJcmV0dXJuIG9sZGluZm87Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4dF9yZXBsYWNlX3RhYmxlKTsKKworaW50IHh0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCB4dF90YWJsZSAqdGFibGUsCisJCSAgICAgIHN0cnVjdCB4dF90YWJsZV9pbmZvICpib290c3RyYXAsCisJCSAgICAgIHN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvKQoreworCWludCByZXQ7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGU7CisKKwlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJnh0W3RhYmxlLT5hZl0ubXV0ZXgpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIERvbid0IGF1dG9sb2FkOiB3ZSdkIGVhdCBvdXIgdGFpbC4uLiAqLworCWlmIChsaXN0X25hbWVkX2ZpbmQoJnh0W3RhYmxlLT5hZl0udGFibGVzLCB0YWJsZS0+bmFtZSkpIHsKKwkJcmV0ID0gLUVFWElTVDsKKwkJZ290byB1bmxvY2s7CisJfQorCisJLyogU2ltcGxpZmllcyByZXBsYWNlX3RhYmxlIGNvZGUuICovCisJdGFibGUtPnByaXZhdGUgPSBib290c3RyYXA7CisJaWYgKCF4dF9yZXBsYWNlX3RhYmxlKHRhYmxlLCAwLCBuZXdpbmZvLCAmcmV0KSkKKwkJZ290byB1bmxvY2s7CisKKwlwcml2YXRlID0gdGFibGUtPnByaXZhdGU7CisJZHVwcmludGYoInRhYmxlLT5wcml2YXRlLT5udW1iZXIgPSAldVxuIiwgcHJpdmF0ZS0+bnVtYmVyKTsKKworCS8qIHNhdmUgbnVtYmVyIG9mIGluaXRpYWwgZW50cmllcyAqLworCXByaXZhdGUtPmluaXRpYWxfZW50cmllcyA9IHByaXZhdGUtPm51bWJlcjsKKworCXJ3bG9ja19pbml0KCZ0YWJsZS0+bG9jayk7CisJbGlzdF9wcmVwZW5kKCZ4dFt0YWJsZS0+YWZdLnRhYmxlcywgdGFibGUpOworCisJcmV0ID0gMDsKKyB1bmxvY2s6CisJdXAoJnh0W3RhYmxlLT5hZl0ubXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4dF9yZWdpc3Rlcl90YWJsZSk7CisKK3ZvaWQgKnh0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSkKK3sKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKKworCWRvd24oJnh0W3RhYmxlLT5hZl0ubXV0ZXgpOworCXByaXZhdGUgPSB0YWJsZS0+cHJpdmF0ZTsKKwlMSVNUX0RFTEVURSgmeHRbdGFibGUtPmFmXS50YWJsZXMsIHRhYmxlKTsKKwl1cCgmeHRbdGFibGUtPmFmXS5tdXRleCk7CisKKwlyZXR1cm4gcHJpdmF0ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X3VucmVnaXN0ZXJfdGFibGUpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBjaGFyICp4dF9wcm90b19wcmVmaXhbTlBST1RPXSA9IHsKKwlbQUZfSU5FVF0JPSAiaXAiLAorCVtBRl9JTkVUNl0JPSAiaXA2IiwKKwlbTkZfQVJQXQk9ICJhcnAiLAorfTsKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKnh0X2dldF9pZHgoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9IGxpc3QtPm5leHQ7CisKKwlpZiAoIWhlYWQgfHwgbGlzdF9lbXB0eShsaXN0KSkKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAocG9zICYmIChoZWFkID0gaGVhZC0+bmV4dCkpIHsKKwkJaWYgKGhlYWQgPT0gbGlzdCkKKwkJCXJldHVybiBOVUxMOworCQlwb3MtLTsKKwl9CisJcmV0dXJuIHBvcyA/IE5VTEwgOiBoZWFkOworfQorCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqdHlwZTJsaXN0KHVfaW50MTZfdCBhZiwgdV9pbnQxNl90IHR5cGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgVEFSR0VUOgorCQlsaXN0ID0gJnh0W2FmXS50YXJnZXQ7CisJCWJyZWFrOworCWNhc2UgTUFUQ0g6CisJCWxpc3QgPSAmeHRbYWZdLm1hdGNoOworCQlicmVhazsKKwljYXNlIFRBQkxFOgorCQlsaXN0ID0gJnh0W2FmXS50YWJsZXM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpc3QgPSBOVUxMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gbGlzdDsKK30KKworc3RhdGljIHZvaWQgKnh0X3RndF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKSBzZXEtPnByaXZhdGU7CisJdV9pbnQxNl90IGFmID0gKHVuc2lnbmVkIGxvbmcpcGRlLT5kYXRhICYgMHhmZmZmOworCXVfaW50MTZfdCB0eXBlID0gKHVuc2lnbmVkIGxvbmcpcGRlLT5kYXRhID4+IDE2OworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisKKwlpZiAoYWYgPj0gTlBST1RPKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3QgPSB0eXBlMmxpc3QoYWYsIHR5cGUpOworCWlmICghbGlzdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ4dFthZl0ubXV0ZXgpICE9IDApCisJCXJldHVybiBOVUxMOworCQorCXJldHVybiB4dF9nZXRfaWR4KGxpc3QsIHNlcSwgKnBvcyk7Cit9CisKK3N0YXRpYyB2b2lkICp4dF90Z3Rfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gc2VxLT5wcml2YXRlOworCXVfaW50MTZfdCBhZiA9ICh1bnNpZ25lZCBsb25nKXBkZS0+ZGF0YSAmIDB4ZmZmZjsKKwl1X2ludDE2X3QgdHlwZSA9ICh1bnNpZ25lZCBsb25nKXBkZS0+ZGF0YSA+PiAxNjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJaWYgKGFmID49IE5QUk9UTykKKwkJcmV0dXJuIE5VTEw7CisJCisJbGlzdCA9IHR5cGUybGlzdChhZiwgdHlwZSk7CisJaWYgKCFsaXN0KQorCQlyZXR1cm4gTlVMTDsKKworCSgqcG9zKSsrOworCXJldHVybiB4dF9nZXRfaWR4KGxpc3QsIHNlcSwgKnBvcyk7Cit9CisKK3N0YXRpYyB2b2lkIHh0X3RndF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IHNlcS0+cHJpdmF0ZTsKKwl1X2ludDE2X3QgYWYgPSAodW5zaWduZWQgbG9uZylwZGUtPmRhdGEgJiAweGZmZmY7CisKKwl1cCgmeHRbYWZdLm11dGV4KTsKK30KKworc3RhdGljIGludCB4dF9uYW1lX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWNoYXIgKm5hbWUgPSAoY2hhciAqKXYgKyBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCk7CisKKwlpZiAoc3RybGVuKG5hbWUpKQorCQlyZXR1cm4gc2VxX3ByaW50ZihzZXEsICIlc1xuIiwgbmFtZSk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB4dF90Z3Rfc2VxX29wcyA9IHsKKwkuc3RhcnQJPSB4dF90Z3Rfc2VxX3N0YXJ0LAorCS5uZXh0CT0geHRfdGd0X3NlcV9uZXh0LAorCS5zdG9wCT0geHRfdGd0X3NlcV9zdG9wLAorCS5zaG93CT0geHRfbmFtZV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgeHRfdGd0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldDsKKworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZ4dF90Z3Rfc2VxX29wcyk7CisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IHNlcV9maWxlICpzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGlub2RlKTsKKworCQlzZXEtPnByaXZhdGUgPSBwZGU7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHRfZmlsZV9vcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuCSA9IHh0X3RndF9vcGVuLAorCS5yZWFkCSA9IHNlcV9yZWFkLAorCS5sbHNlZWsJID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCisjZGVmaW5lIEZPUk1BVF9UQUJMRVMJIl90YWJsZXNfbmFtZXMiCisjZGVmaW5lCUZPUk1BVF9NQVRDSEVTCSJfdGFibGVzX21hdGNoZXMiCisjZGVmaW5lIEZPUk1BVF9UQVJHRVRTIAkiX3RhYmxlc190YXJnZXRzIgorCisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworaW50IHh0X3Byb3RvX2luaXQoaW50IGFmKQoreworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJY2hhciBidWZbWFRfRlVOQ1RJT05fTUFYTkFNRUxFTl07CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOworI2VuZGlmCisKKwlpZiAoYWYgPj0gTlBST1RPKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjYXQoYnVmLCBGT1JNQVRfVEFCTEVTLCBzaXplb2YoYnVmKSk7CisJcHJvYyA9IHByb2NfbmV0X2ZvcHNfY3JlYXRlKGJ1ZiwgMDQ0MCwgJnh0X2ZpbGVfb3BzKTsKKwlpZiAoIXByb2MpCisJCWdvdG8gb3V0OworCXByb2MtPmRhdGEgPSAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcpIGFmIHwgKFRBQkxFIDw8IDE2KSk7CisKKworCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNhdChidWYsIEZPUk1BVF9NQVRDSEVTLCBzaXplb2YoYnVmKSk7CisJcHJvYyA9IHByb2NfbmV0X2ZvcHNfY3JlYXRlKGJ1ZiwgMDQ0MCwgJnh0X2ZpbGVfb3BzKTsKKwlpZiAoIXByb2MpCisJCWdvdG8gb3V0X3JlbW92ZV90YWJsZXM7CisJcHJvYy0+ZGF0YSA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZykgYWYgfCAoTUFUQ0ggPDwgMTYpKTsKKworCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNhdChidWYsIEZPUk1BVF9UQVJHRVRTLCBzaXplb2YoYnVmKSk7CisJcHJvYyA9IHByb2NfbmV0X2ZvcHNfY3JlYXRlKGJ1ZiwgMDQ0MCwgJnh0X2ZpbGVfb3BzKTsKKwlpZiAoIXByb2MpCisJCWdvdG8gb3V0X3JlbW92ZV9tYXRjaGVzOworCXByb2MtPmRhdGEgPSAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcpIGFmIHwgKFRBUkdFVCA8PCAxNikpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitvdXRfcmVtb3ZlX21hdGNoZXM6CisJc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY2F0KGJ1ZiwgRk9STUFUX01BVENIRVMsIHNpemVvZihidWYpKTsKKwlwcm9jX25ldF9yZW1vdmUoYnVmKTsKKworb3V0X3JlbW92ZV90YWJsZXM6CisJc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY2F0KGJ1ZiwgRk9STUFUX1RBQkxFUywgc2l6ZW9mKGJ1ZikpOworCXByb2NfbmV0X3JlbW92ZShidWYpOworb3V0OgorCXJldHVybiAtMTsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTF9HUEwoeHRfcHJvdG9faW5pdCk7CisKK3ZvaWQgeHRfcHJvdG9fZmluaShpbnQgYWYpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwljaGFyIGJ1ZltYVF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKKworCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNhdChidWYsIEZPUk1BVF9UQUJMRVMsIHNpemVvZihidWYpKTsKKwlwcm9jX25ldF9yZW1vdmUoYnVmKTsKKworCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNhdChidWYsIEZPUk1BVF9UQVJHRVRTLCBzaXplb2YoYnVmKSk7CisJcHJvY19uZXRfcmVtb3ZlKGJ1Zik7CisKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjYXQoYnVmLCBGT1JNQVRfTUFUQ0hFUywgc2l6ZW9mKGJ1ZikpOworCXByb2NfbmV0X3JlbW92ZShidWYpOworI2VuZGlmIC8qQ09ORklHX1BST0NfRlMqLworfQorRVhQT1JUX1NZTUJPTF9HUEwoeHRfcHJvdG9fZmluaSk7CisKKworc3RhdGljIGludCBfX2luaXQgeHRfaW5pdCh2b2lkKQoreworCWludCBpOworCisJeHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgeHRfYWYpICogTlBST1RPLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXh0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBOUFJPVE87IGkrKykgeworCQlpbml0X01VVEVYKCZ4dFtpXS5tdXRleCk7CisJCUlOSVRfTElTVF9IRUFEKCZ4dFtpXS50YXJnZXQpOworCQlJTklUX0xJU1RfSEVBRCgmeHRbaV0ubWF0Y2gpOworCQlJTklUX0xJU1RfSEVBRCgmeHRbaV0udGFibGVzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4dF9maW5pKHZvaWQpCit7CisJa2ZyZWUoeHQpOworfQorCittb2R1bGVfaW5pdCh4dF9pbml0KTsKK21vZHVsZV9leGl0KHh0X2ZpbmkpOworCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMQVNTSUZZLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmMKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTEFTU0lGWS5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmMKaW5kZXggZGFiNzhkOC4uNzhlZTI2NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTEFTU0lGWS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuYwpAQCAtMTUsMTIgKzE1LDEzIEBACiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTEFTU0lGWS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9DTEFTU0lGWS5oPgogCiBNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgcWRpc2MgY2xhc3NpZmljYXRpb24gdGFyZ2V0IG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfQ0xBU1NJRlkiKTsKIAogc3RhdGljIHVuc2lnbmVkIGludAogdGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKQEAgLTMwLDI1ICszMSwyNSBAQAogICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAogICAgICAgIHZvaWQgKnVzZXJpbmZvKQogewotCWNvbnN0IHN0cnVjdCBpcHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8gKmNsaW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jbGFzc2lmeV90YXJnZXRfaW5mbyAqY2xpbmZvID0gdGFyZ2luZm87CiAKLQlpZigoKnBza2IpLT5wcmlvcml0eSAhPSBjbGluZm8tPnByaW9yaXR5KSAKKwlpZiAoKCpwc2tiKS0+cHJpb3JpdHkgIT0gY2xpbmZvLT5wcmlvcml0eSkKIAkJKCpwc2tiKS0+cHJpb3JpdHkgPSBjbGluZm8tPnByaW9yaXR5OwogCi0JcmV0dXJuIElQVF9DT05USU5VRTsKKwlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorICAgICAgICAgICBjb25zdCB2b2lkICplLAogICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9jbGFzc2lmeV90YXJnZXRfaW5mbykpKXsKKwlpZiAodGFyZ2luZm9zaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8pKSl7CiAJCXByaW50ayhLRVJOX0VSUiAiQ0xBU1NJRlk6IGludmFsaWQgc2l6ZSAoJXUgIT0gJVp1KS5cbiIsCiAJCSAgICAgICB0YXJnaW5mb3NpemUsCi0JCSAgICAgICBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8pKSk7CisJCSAgICAgICBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2NsYXNzaWZ5X3RhcmdldF9pbmZvKSkpOwogCQlyZXR1cm4gMDsKIAl9CiAJCkBAIC02OSwyMSArNzAsMzkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9jbGFzc2lmeV9yZWcgPSB7IAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgY2xhc3NpZnlfcmVnID0geyAKKwkubmFtZSAJCT0gIkNMQVNTSUZZIiwgCisJLnRhcmdldCAJPSB0YXJnZXQsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCS5tZSAJCT0gVEhJU19NT0RVTEUsCit9Oworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgY2xhc3NpZnk2X3JlZyA9IHsgCiAJLm5hbWUgCQk9ICJDTEFTU0lGWSIsIAogCS50YXJnZXQgCT0gdGFyZ2V0LAogCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKIAkubWUgCQk9IFRISVNfTU9EVUxFLAogfTsKIAorCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9jbGFzc2lmeV9yZWcpOworCWludCByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmNsYXNzaWZ5X3JlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmNsYXNzaWZ5Nl9yZWcpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZjbGFzc2lmeV9yZWcpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9jbGFzc2lmeV9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZjbGFzc2lmeV9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmY2xhc3NpZnk2X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DT05OTUFSSy5jIGIvbmV0L25ldGZpbHRlci94dF9DT05OTUFSSy5jCnNpbWlsYXJpdHkgaW5kZXggNzMlCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfQ09OTk1BUksuYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9DT05OTUFSSy5jCmluZGV4IDhhY2FjNWEuLjIyNTA2ZTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ09OTk1BUksuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMKQEAgLTI2LDkgKzI2LDEwIEBACiBNT0RVTEVfQVVUSE9SKCJIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5dGVtcy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBDT05OTUFSSyBtYXRjaGluZyBtb2R1bGUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X0NPTk5NQVJLIik7CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ09OTk1BUksuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KIAogc3RhdGljIHVuc2lnbmVkIGludApAQCAtMzksNyArNDAsNyBAQAogICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAogICAgICAgIHZvaWQgKnVzZXJpbmZvKQogewotCWNvbnN0IHN0cnVjdCBpcHRfY29ubm1hcmtfdGFyZ2V0X2luZm8gKm1hcmtpbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IHh0X2Nvbm5tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOwogCXVfaW50MzJfdCBkaWZmOwogCXVfaW50MzJfdCBuZm1hcms7CiAJdV9pbnQzMl90IG5ld21hcms7CkBAIC00OCwxNyArNDksMTcgQEAKIAogCWlmIChjdG1hcmspIHsKIAkgICAgc3dpdGNoKG1hcmtpbmZvLT5tb2RlKSB7Ci0JICAgIGNhc2UgSVBUX0NPTk5NQVJLX1NFVDoKKwkgICAgY2FzZSBYVF9DT05OTUFSS19TRVQ6CiAJCW5ld21hcmsgPSAoKmN0bWFyayAmIH5tYXJraW5mby0+bWFzaykgfCBtYXJraW5mby0+bWFyazsKIAkJaWYgKG5ld21hcmsgIT0gKmN0bWFyaykKIAkJICAgICpjdG1hcmsgPSBuZXdtYXJrOwogCQlicmVhazsKLQkgICAgY2FzZSBJUFRfQ09OTk1BUktfU0FWRToKKwkgICAgY2FzZSBYVF9DT05OTUFSS19TQVZFOgogCQluZXdtYXJrID0gKCpjdG1hcmsgJiB+bWFya2luZm8tPm1hc2spIHwgKCgqcHNrYiktPm5mbWFyayAmIG1hcmtpbmZvLT5tYXNrKTsKIAkJaWYgKCpjdG1hcmsgIT0gbmV3bWFyaykKIAkJICAgICpjdG1hcmsgPSBuZXdtYXJrOwogCQlicmVhazsKLQkgICAgY2FzZSBJUFRfQ09OTk1BUktfUkVTVE9SRToKKwkgICAgY2FzZSBYVF9DT05OTUFSS19SRVNUT1JFOgogCQluZm1hcmsgPSAoKnBza2IpLT5uZm1hcms7CiAJCWRpZmYgPSAoKmN0bWFyayBeIG5mbWFyaykgJiBtYXJraW5mby0+bWFzazsKIAkJaWYgKGRpZmYgIT0gMCkKQEAgLTY3LDI1ICs2OCwyNSBAQAogCSAgICB9CiAJfQogCi0JcmV0dXJuIElQVF9DT05USU5VRTsKKwlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgY29uc3Qgdm9pZCAqZW50cnksCiAJICAgdm9pZCAqdGFyZ2luZm8sCiAJICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewotCXN0cnVjdCBpcHRfY29ubm1hcmtfdGFyZ2V0X2luZm8gKm1hdGNoaW5mbyA9IHRhcmdpbmZvOwotCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Nvbm5tYXJrX3RhcmdldF9pbmZvKSkpIHsKKwlzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8gKm1hdGNoaW5mbyA9IHRhcmdpbmZvOworCWlmICh0YXJnaW5mb3NpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9jb25ubWFya190YXJnZXRfaW5mbykpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNPTk5NQVJLOiB0YXJnaW5mb3NpemUgJXUgIT0gJVp1XG4iLAogCQkgICAgICAgdGFyZ2luZm9zaXplLAotCQkgICAgICAgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Nvbm5tYXJrX3RhcmdldF9pbmZvKSkpOworCQkgICAgICAgWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9jb25ubWFya190YXJnZXRfaW5mbykpKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKG1hdGNoaW5mby0+bW9kZSA9PSBJUFRfQ09OTk1BUktfUkVTVE9SRSkgeworCWlmIChtYXRjaGluZm8tPm1vZGUgPT0gWFRfQ09OTk1BUktfUkVTVE9SRSkgewogCSAgICBpZiAoc3RyY21wKHRhYmxlbmFtZSwgIm1hbmdsZSIpICE9IDApIHsKIAkJICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIkNPTk5NQVJLOiByZXN0b3JlIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIFwibWFuZ2xlXCIgdGFibGUsIG5vdCBcIiVzXCJcbiIsIHRhYmxlbmFtZSk7CiAJCSAgICByZXR1cm4gMDsKQEAgLTEwMCw3ICsxMDEsMTMgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9jb25ubWFya19yZWcgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBjb25ubWFya19yZWcgPSB7CisJLm5hbWUgPSAiQ09OTk1BUksiLAorCS50YXJnZXQgPSAmdGFyZ2V0LAorCS5jaGVja2VudHJ5ID0gJmNoZWNrZW50cnksCisJLm1lID0gVEhJU19NT0RVTEUKK307CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBjb25ubWFyazZfcmVnID0gewogCS5uYW1lID0gIkNPTk5NQVJLIiwKIAkudGFyZ2V0ID0gJnRhcmdldCwKIAkuY2hlY2tlbnRyeSA9ICZjaGVja2VudHJ5LApAQCAtMTA5LDEzICsxMTYsMjUgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCW5lZWRfaXBfY29ubnRyYWNrKCk7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9jb25ubWFya19yZWcpOworCWludCByZXQ7CisKKwluZWVkX2Nvbm50cmFjaygpOworCisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZjb25ubWFya19yZWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZjb25ubWFyazZfcmVnKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmY29ubm1hcmtfcmVnKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfY29ubm1hcmtfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmY29ubm1hcmtfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmNvbm5tYXJrNl9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFSSy5jIGIvbmV0L25ldGZpbHRlci94dF9NQVJLLmMKc2ltaWxhcml0eSBpbmRleCA2MSUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVJLLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCmluZGV4IDUyYjRmMmMuLjBjMTFlZTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFSSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCkBAIC0xMiwxMiArMTIsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X01BUksuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfTUFSSy5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgTUFSSyBtb2RpZmljYXRpb24gbW9kdWxlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwWzZddGFibGVzIE1BUksgbW9kaWZpY2F0aW9uIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfTUFSSyIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X01BUksiKTsKIAogc3RhdGljIHVuc2lnbmVkIGludAogdGFyZ2V0X3YwKHN0cnVjdCBza19idWZmICoqcHNrYiwKQEAgLTI3LDEyICsyOSwxMiBAQAogCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCiAJICB2b2lkICp1c2VyaW5mbykKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm8gKm1hcmtpbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm8gKm1hcmtpbmZvID0gdGFyZ2luZm87CiAKIAlpZigoKnBza2IpLT5uZm1hcmsgIT0gbWFya2luZm8tPm1hcmspCiAJCSgqcHNrYiktPm5mbWFyayA9IG1hcmtpbmZvLT5tYXJrOwogCi0JcmV0dXJuIElQVF9DT05USU5VRTsKKwlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKQEAgLTQzLDE5ICs0NSwxOSBAQAogCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCiAJICB2b2lkICp1c2VyaW5mbykKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm9fdjEgKm1hcmtpbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm9fdjEgKm1hcmtpbmZvID0gdGFyZ2luZm87CiAJaW50IG1hcmsgPSAwOwogCiAJc3dpdGNoIChtYXJraW5mby0+bW9kZSkgewotCWNhc2UgSVBUX01BUktfU0VUOgorCWNhc2UgWFRfTUFSS19TRVQ6CiAJCW1hcmsgPSBtYXJraW5mby0+bWFyazsKIAkJYnJlYWs7CiAJCQotCWNhc2UgSVBUX01BUktfQU5EOgorCWNhc2UgWFRfTUFSS19BTkQ6CiAJCW1hcmsgPSAoKnBza2IpLT5uZm1hcmsgJiBtYXJraW5mby0+bWFyazsKIAkJYnJlYWs7CiAJCQotCWNhc2UgSVBUX01BUktfT1I6CisJY2FzZSBYVF9NQVJLX09SOgogCQltYXJrID0gKCpwc2tiKS0+bmZtYXJrIHwgbWFya2luZm8tPm1hcms7CiAJCWJyZWFrOwogCX0KQEAgLTYzLDIzICs2NSwyMyBAQAogCWlmKCgqcHNrYiktPm5mbWFyayAhPSBtYXJrKQogCQkoKnBza2IpLT5uZm1hcmsgPSBtYXJrOwogCi0JcmV0dXJuIElQVF9DT05USU5VRTsKKwlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKIAogc3RhdGljIGludAogY2hlY2tlbnRyeV92MChjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkgICAgICBjb25zdCB2b2lkICplbnRyeSwKIAkgICAgICB2b2lkICp0YXJnaW5mbywKIAkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0Jc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOworCXN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOwogCi0JaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mbykpKSB7CisJaWYgKHRhcmdpbmZvc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm8pKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJNQVJLOiB0YXJnaW5mb3NpemUgJXUgIT0gJVp1XG4iLAogCQkgICAgICAgdGFyZ2luZm9zaXplLAotCQkgICAgICAgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm8pKSk7CisJCSAgICAgICBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm8pKSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtOTgsMTcgKzEwMCwxNyBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5X3YxKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCSAgICAgIGNvbnN0IHZvaWQgKmVudHJ5LAogCSAgICAgIHZvaWQgKnRhcmdpbmZvLAogCSAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQlzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm9fdjEgKm1hcmtpbmZvID0gdGFyZ2luZm87CisJc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm9fdjEgKm1hcmtpbmZvID0gdGFyZ2luZm87CiAKLQlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvX3YxKSkpeworCWlmICh0YXJnaW5mb3NpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvX3YxKSkpewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJNQVJLOiB0YXJnaW5mb3NpemUgJXUgIT0gJVp1XG4iLAogCQkgICAgICAgdGFyZ2luZm9zaXplLAotCQkgICAgICAgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm9fdjEpKSk7CisJCSAgICAgICBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm9fdjEpKSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTE3LDkgKzExOSw5IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChtYXJraW5mby0+bW9kZSAhPSBJUFRfTUFSS19TRVQKLQkgICAgJiYgbWFya2luZm8tPm1vZGUgIT0gSVBUX01BUktfQU5ECi0JICAgICYmIG1hcmtpbmZvLT5tb2RlICE9IElQVF9NQVJLX09SKSB7CisJaWYgKG1hcmtpbmZvLT5tb2RlICE9IFhUX01BUktfU0VUCisJICAgICYmIG1hcmtpbmZvLT5tb2RlICE9IFhUX01BUktfQU5ECisJICAgICYmIG1hcmtpbmZvLT5tb2RlICE9IFhUX01BUktfT1IpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogdW5rbm93biBtb2RlICV1XG4iLAogCQkgICAgICAgbWFya2luZm8tPm1vZGUpOwogCQlyZXR1cm4gMDsKQEAgLTEzMyw3ICsxMzUsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X21hcmtfcmVnX3YwID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X21hcmtfcmVnX3YwID0gewogCS5uYW1lCQk9ICJNQVJLIiwKIAkudGFyZ2V0CQk9IHRhcmdldF92MCwKIAkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnlfdjAsCkBAIC0xNDEsNyArMTQzLDcgQEAKIAkucmV2aXNpb24JPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9tYXJrX3JlZ192MSA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF9tYXJrX3JlZ192MSA9IHsKIAkubmFtZQkJPSAiTUFSSyIsCiAJLnRhcmdldAkJPSB0YXJnZXRfdjEsCiAJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5X3YxLApAQCAtMTQ5LDIzICsxNTEsNDAgQEAKIAkucmV2aXNpb24JPSAxLAogfTsKIAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXA2dF9tYXJrX3JlZ192MCA9IHsKKwkubmFtZQkJPSAiTUFSSyIsCisJLnRhcmdldAkJPSB0YXJnZXRfdjAsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5X3YwLAorCS5tZQkJPSBUSElTX01PRFVMRSwKKwkucmV2aXNpb24JPSAwLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewogCWludCBlcnI7CiAKLQllcnIgPSBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbWFya19yZWdfdjApOwotCWlmICghZXJyKSB7Ci0JCWVyciA9IGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9tYXJrX3JlZ192MSk7Ci0JCWlmIChlcnIpCi0JCQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9tYXJrX3JlZ192MCk7CisJZXJyID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfbWFya19yZWdfdjApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9tYXJrX3JlZ192MSk7CisJaWYgKGVycikKKwkJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9tYXJrX3JlZ192MCk7CisKKwllcnIgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X21hcmtfcmVnX3YwKTsKKwlpZiAoZXJyKSB7CisJCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfbWFya19yZWdfdjApOworCQl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X21hcmtfcmVnX3YxKTsKIAl9CisKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X21hcmtfcmVnX3YwKTsKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9tYXJrX3JlZ192MSk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9tYXJrX3JlZ192MCk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9tYXJrX3JlZ192MSk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X21hcmtfcmVnX3YwKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X05GUVVFVUUuYyBiL25ldC9uZXRmaWx0ZXIveHRfTkZRVUVVRS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzZiNmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X05GUVVFVUUuYwpAQCAtMCwwICsxLDEwNyBAQAorLyogaXB0YWJsZXMgbW9kdWxlIGZvciB1c2luZyBuZXcgbmV0ZmlsdGVyIG5ldGxpbmsgcXVldWUKKyAqCisgKiAoQykgMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfTkZRVUVVRS5oPgorCitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiW2lwLGlwNixhcnBdX3RhYmxlcyBORlFVRVVFIHRhcmdldCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcHRfTkZRVUVVRSIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X05GUVVFVUUiKTsKK01PRFVMRV9BTElBUygiYXJwdF9ORlFVRVVFIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3RhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCisgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisgICAgICAgdm9pZCAqdXNlcmluZm8pCit7CisJY29uc3Qgc3RydWN0IHh0X05GUV9pbmZvICp0aW5mbyA9IHRhcmdpbmZvOworCisJcmV0dXJuIE5GX1FVRVVFX05SKHRpbmZvLT5xdWV1ZW51bSk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgIGNvbnN0IHZvaWQgKmVudHJ5LAorICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAodGFyZ2luZm9zaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfTkZRX2luZm8pKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlFVRVVFOiB0YXJnaW5mb3NpemUgJXUgIT0gJVp1XG4iLAorCQkgICAgICAgdGFyZ2luZm9zaXplLAorCQkgICAgICAgWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9ORlFfaW5mbykpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF9ORlFfcmVnID0geworCS5uYW1lCQk9ICJORlFVRVVFIiwKKwkudGFyZ2V0CQk9IHRhcmdldCwKKwkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXA2dF9ORlFfcmVnID0geworCS5uYW1lCQk9ICJORlFVRVVFIiwKKwkudGFyZ2V0CQk9IHRhcmdldCwKKwkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgYXJwdF9ORlFfcmVnID0geworCS5uYW1lCQk9ICJORlFVRVVFIiwKKwkudGFyZ2V0CQk9IHRhcmdldCwKKwkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfTkZRX3JlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X05GUV9yZWcpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2lwOworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChORl9BUlAsICZhcnB0X05GUV9yZWcpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2lwNjsKKworCXJldHVybiByZXQ7CitvdXRfaXA2OgorCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmaXA2dF9ORlFfcmVnKTsKK291dF9pcDoKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X05GUV9yZWcpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChORl9BUlAsICZhcnB0X05GUV9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmaXA2dF9ORlFfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X05GUV9yZWcpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9OT1RSQUNLLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X05PVFJBQ0suYwpzaW1pbGFyaXR5IGluZGV4IDY5JQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05PVFJBQ0suYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9OT1RSQUNLLmMKaW5kZXggZTNjNjlkMC4uMjRkNDc3YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9OT1RSQUNLLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9OT1RSQUNLLmMKQEAgLTQsOSArNCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+CiAKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X05PVFJBQ0siKTsKKwogc3RhdGljIHVuc2lnbmVkIGludAogdGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCkBAIC0xNyw3ICsyMCw3IEBACiB7CiAJLyogUHJldmlvdXNseSBzZWVuIChsb29wYmFjayk/IElnbm9yZS4gKi8KIAlpZiAoKCpwc2tiKS0+bmZjdCAhPSBOVUxMKQotCQlyZXR1cm4gSVBUX0NPTlRJTlVFOworCQlyZXR1cm4gWFRfQ09OVElOVUU7CiAKIAkvKiBBdHRhY2ggZmFrZSBjb25udHJhY2sgZW50cnkuIAogCSAgIElmIHRoZXJlIGlzIGEgcmVhbCBjdCBlbnRyeSBjb3JyZXNwb25kaWcgdG8gdGhpcyBwYWNrZXQsIApAQCAtMjcsMTIgKzMwLDEyIEBACiAJKCpwc2tiKS0+bmZjdGluZm8gPSBJUF9DVF9ORVc7CiAJbmZfY29ubnRyYWNrX2dldCgoKnBza2IpLT5uZmN0KTsKIAotCXJldHVybiBJUFRfQ09OVElOVUU7CisJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCSAgIGNvbnN0IHZvaWQgKmVudHJ5LAogICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKQEAgLTUxLDI2ICs1NCwzOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X25vdHJhY2tfcmVnID0geyAKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IG5vdHJhY2tfcmVnID0geyAKIAkubmFtZSA9ICJOT1RSQUNLIiwgCiAJLnRhcmdldCA9IHRhcmdldCwgCiAJLmNoZWNrZW50cnkgPSBjaGVja2VudHJ5LAotCS5tZSA9IFRISVNfTU9EVUxFIAorCS5tZSA9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IG5vdHJhY2s2X3JlZyA9IHsgCisJLm5hbWUgPSAiTk9UUkFDSyIsIAorCS50YXJnZXQgPSB0YXJnZXQsIAorCS5jaGVja2VudHJ5ID0gY2hlY2tlbnRyeSwKKwkubWUgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQlpZiAoaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X25vdHJhY2tfcmVnKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaW50IHJldDsKIAotCXJldHVybiAwOworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmbm90cmFja19yZWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZub3RyYWNrNl9yZWcpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZub3RyYWNrX3JlZyk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X25vdHJhY2tfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJm5vdHJhY2s2X3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJm5vdHJhY2tfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CiBtb2R1bGVfZXhpdChmaW5pKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfY29tbWVudC5jIGIvbmV0L25ldGZpbHRlci94dF9jb21tZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhNmZkNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29tbWVudC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBJbXBsZW1lbnRzIGEgZHVtbXkgbWF0Y2ggdG8gYWxsb3cgYXR0YWNoaW5nIGNvbW1lbnRzIHRvIHJ1bGVzCisgKgorICogMjAwMy0wNS0xMyBCcmFkIEZpc2hlciAoYnJhZEBpbmZvLWxpbmsubmV0KQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oPgorCitNT0RVTEVfQVVUSE9SKCJCcmFkIEZpc2hlciA8YnJhZEBpbmZvLWxpbmsubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBjb21tZW50IG1hdGNoIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcHRfY29tbWVudCIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X2NvbW1lbnQiKTsKKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3Rvb2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCS8qIFdlIGFsd2F5cyBtYXRjaCAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgICAgICAgY29uc3Qgdm9pZCAqaXAsCisgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwkvKiBDaGVjayB0aGUgc2l6ZSAqLworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9jb21tZW50X2luZm8pKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggY29tbWVudF9tYXRjaCA9IHsKKwkubmFtZQkJPSAiY29tbWVudCIsCisJLm1hdGNoCQk9IG1hdGNoLAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggY29tbWVudDZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImNvbW1lbnQiLAorCS5tYXRjaAkJPSBtYXRjaCwKKwkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZjb21tZW50X21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZjb21tZW50Nl9tYXRjaCk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmY29tbWVudF9tYXRjaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbW1lbnRfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZjb21tZW50Nl9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm5ieXRlcy5jIGIvbmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuYwpzaW1pbGFyaXR5IGluZGV4IDY2JQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm5ieXRlcy5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5jCmluZGV4IGQ2OGEwNDguLjE1MGQyYTQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubmJ5dGVzLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuYwpAQCAtNiwxMyArNiwxNSBAQAogICogCS0gYWRkIGZ1bmN0aW9uYWxpdHkgdG8gbWF0Y2ggbnVtYmVyIG9mIHBhY2tldHMKICAqIAktIGFkZCBmdW5jdGlvbmFsaXR5IHRvIG1hdGNoIGF2ZXJhZ2UgcGFja2V0IHNpemUKICAqIAktIGFkZCBzdXBwb3J0IHRvIG1hdGNoIGRpcmVjdGlvbnMgc2VwZXJhdGVseQorICogMjAwNS0xMC0xNiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KKyAqIAktIFBvcnQgdG8geF90YWJsZXMKICAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubmJ5dGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5oPgogCiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgpAQCAtMjAsNiArMjIsNyBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIG1hdGNoIGZvciBtYXRjaGluZyBudW1iZXIgb2YgcGt0cy9ieXRlcyBwZXIgY29ubmVjdGlvbiIpOworTU9EVUxFX0FMSUFTKCJpcHRfY29ubmJ5dGVzIik7CiAKIC8qIDY0Yml0IGRpdmlzb3IsIGRpdmlkZW5kIGFuZCByZXN1bHQuIGR5bmFtaWMgcHJlY2lzaW9uICovCiBzdGF0aWMgdV9pbnQ2NF90IGRpdjY0XzY0KHVfaW50NjRfdCBkaXZpZGVuZCwgdV9pbnQ2NF90IGRpdmlzb3IpCkBAIC00Myw5ICs0NiwxMCBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2Nvbm5ieXRlc19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY29ubmJ5dGVzX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOwogCXVfaW50NjRfdCB3aGF0ID0gMDsJLyogaW5pdGlhbGl6ZSB0byBtYWtlIGdjYyBoYXBweSAqLwogCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfY291bnRlciAqY291bnRlcnM7CiAKQEAgLTUzLDQ1ICs1Nyw0NSBAQAogCQlyZXR1cm4gMDsgLyogbm8gbWF0Y2ggKi8KIAogCXN3aXRjaCAoc2luZm8tPndoYXQpIHsKLQljYXNlIElQVF9DT05OQllURVNfUEtUUzoKKwljYXNlIFhUX0NPTk5CWVRFU19QS1RTOgogCQlzd2l0Y2ggKHNpbmZvLT5kaXJlY3Rpb24pIHsKLQkJY2FzZSBJUFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTDoKKwkJY2FzZSBYVF9DT05OQllURVNfRElSX09SSUdJTkFMOgogCQkJd2hhdCA9IGNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0ucGFja2V0czsKIAkJCWJyZWFrOwotCQljYXNlIElQVF9DT05OQllURVNfRElSX1JFUExZOgorCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfUkVQTFk6CiAJCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5wYWNrZXRzOwogCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfQk9USDoKKwkJY2FzZSBYVF9DT05OQllURVNfRElSX0JPVEg6CiAJCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzOwogCQkJd2hhdCArPSBjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLnBhY2tldHM7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKLQljYXNlIElQVF9DT05OQllURVNfQllURVM6CisJY2FzZSBYVF9DT05OQllURVNfQllURVM6CiAJCXN3aXRjaCAoc2luZm8tPmRpcmVjdGlvbikgewotCQljYXNlIElQVF9DT05OQllURVNfRElSX09SSUdJTkFMOgorCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUw6CiAJCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5ieXRlczsKIAkJCWJyZWFrOwotCQljYXNlIElQVF9DT05OQllURVNfRElSX1JFUExZOgorCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfUkVQTFk6CiAJCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5ieXRlczsKIAkJCWJyZWFrOwotCQljYXNlIElQVF9DT05OQllURVNfRElSX0JPVEg6CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9CT1RIOgogCQkJd2hhdCA9IGNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0uYnl0ZXM7CiAJCQl3aGF0ICs9IGNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXM7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKLQljYXNlIElQVF9DT05OQllURVNfQVZHUEtUOgorCWNhc2UgWFRfQ09OTkJZVEVTX0FWR1BLVDoKIAkJc3dpdGNoIChzaW5mby0+ZGlyZWN0aW9uKSB7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUw6CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTDoKIAkJCXdoYXQgPSBkaXY2NF82NChjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLmJ5dGVzLAogCQkJCQljb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLnBhY2tldHMpOwogCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfUkVQTFk6CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9SRVBMWToKIAkJCXdoYXQgPSBkaXY2NF82NChjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLmJ5dGVzLAogCQkJCQljb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLnBhY2tldHMpOwogCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfQk9USDoKKwkJY2FzZSBYVF9DT05OQllURVNfRElSX0JPVEg6CiAJCQl7CiAJCQkJdV9pbnQ2NF90IGJ5dGVzOwogCQkJCXVfaW50NjRfdCBwa3RzOwpAQCAtMTE3LDMwICsxMjEsMzYgQEAKIH0KIAogc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJIGNvbnN0IHZvaWQgKmlwLAogCQkgdm9pZCAqbWF0Y2hpbmZvLAogCQkgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9jb25uYnl0ZXNfaW5mbyAqc2luZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2Nvbm5ieXRlc19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKIAotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Nvbm5ieXRlc19pbmZvKSkpCisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2Nvbm5ieXRlc19pbmZvKSkpCiAJCXJldHVybiAwOwogCi0JaWYgKHNpbmZvLT53aGF0ICE9IElQVF9DT05OQllURVNfUEtUUyAmJgotCSAgICBzaW5mby0+d2hhdCAhPSBJUFRfQ09OTkJZVEVTX0JZVEVTICYmCi0JICAgIHNpbmZvLT53aGF0ICE9IElQVF9DT05OQllURVNfQVZHUEtUKQorCWlmIChzaW5mby0+d2hhdCAhPSBYVF9DT05OQllURVNfUEtUUyAmJgorCSAgICBzaW5mby0+d2hhdCAhPSBYVF9DT05OQllURVNfQllURVMgJiYKKwkgICAgc2luZm8tPndoYXQgIT0gWFRfQ09OTkJZVEVTX0FWR1BLVCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoc2luZm8tPmRpcmVjdGlvbiAhPSBJUFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTCAmJgotCSAgICBzaW5mby0+ZGlyZWN0aW9uICE9IElQVF9DT05OQllURVNfRElSX1JFUExZICYmCi0JICAgIHNpbmZvLT5kaXJlY3Rpb24gIT0gSVBUX0NPTk5CWVRFU19ESVJfQk9USCkKKwlpZiAoc2luZm8tPmRpcmVjdGlvbiAhPSBYVF9DT05OQllURVNfRElSX09SSUdJTkFMICYmCisJICAgIHNpbmZvLT5kaXJlY3Rpb24gIT0gWFRfQ09OTkJZVEVTX0RJUl9SRVBMWSAmJgorCSAgICBzaW5mby0+ZGlyZWN0aW9uICE9IFhUX0NPTk5CWVRFU19ESVJfQk9USCkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggc3RhdGVfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbm5ieXRlc19tYXRjaCA9IHsKKwkubmFtZQkJPSAiY29ubmJ5dGVzIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRQorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggY29ubmJ5dGVzNl9tYXRjaCA9IHsKIAkubmFtZQkJPSAiY29ubmJ5dGVzIiwKIAkubWF0Y2gJCT0gJm1hdGNoLAogCS5jaGVja2VudHJ5CT0gJmNoZWNrLApAQCAtMTQ5LDEyICsxNTksMjEgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJnN0YXRlX21hdGNoKTsKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZjb25uYnl0ZXNfbWF0Y2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmNvbm5ieXRlczZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5ieXRlc19tYXRjaCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmc3RhdGVfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5ieXRlc19tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmNvbm5ieXRlczZfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubm1hcmsuYyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuYwpzaW1pbGFyaXR5IGluZGV4IDcwJQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm5tYXJrLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuYwppbmRleCA1MzA2ZWYyLi5kMDZlOTI1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm5tYXJrLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9jb25ubWFyay5jCkBAIC0yNSw5ICsyNSwxMCBAQAogTU9EVUxFX0FVVEhPUigiSGVucmlrIE5vcmRzdHJvbSA8aG5vQG1hcmFzeXRlbXMuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJUCB0YWJsZXMgY29ubm1hcmsgbWF0Y2ggbW9kdWxlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwdF9jb25ubWFyayIpOwogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm5tYXJrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+CiAKIHN0YXRpYyBpbnQKQEAgLTM2LDkgKzM3LDEwIEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewotCWNvbnN0IHN0cnVjdCBpcHRfY29ubm1hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY29ubm1hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAl1X2ludDMyX3QgY3RpbmZvOwogCWNvbnN0IHVfaW50MzJfdCAqY3RtYXJrID0gbmZfY3RfZ2V0X21hcmsoc2tiLCAmY3RpbmZvKTsKIAlpZiAoIWN0bWFyaykKQEAgLTQ5LDE0ICs1MSwxNCBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICBjb25zdCB2b2lkICppcCwKIAkgICB2b2lkICptYXRjaGluZm8sCiAJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewotCXN0cnVjdCBpcHRfY29ubm1hcmtfaW5mbyAqY20gPSAKLQkJCQkoc3RydWN0IGlwdF9jb25ubWFya19pbmZvICopbWF0Y2hpbmZvOwotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Nvbm5tYXJrX2luZm8pKSkKKwlzdHJ1Y3QgeHRfY29ubm1hcmtfaW5mbyAqY20gPSAKKwkJCQkoc3RydWN0IHh0X2Nvbm5tYXJrX2luZm8gKiltYXRjaGluZm87CisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2Nvbm5tYXJrX2luZm8pKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoY20tPm1hcmsgPiAweGZmZmZmZmZmIHx8IGNtLT5tYXNrID4gMHhmZmZmZmZmZikgewpAQCAtNjcsMjEgKzY5LDQwIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGNvbm5tYXJrX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBjb25ubWFya19tYXRjaCA9IHsKKwkubmFtZSA9ICJjb25ubWFyayIsCisJLm1hdGNoID0gJm1hdGNoLAorCS5jaGVja2VudHJ5ID0gJmNoZWNrZW50cnksCisJLm1lID0gVEhJU19NT0RVTEUKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbm5tYXJrNl9tYXRjaCA9IHsKIAkubmFtZSA9ICJjb25ubWFyayIsCiAJLm1hdGNoID0gJm1hdGNoLAogCS5jaGVja2VudHJ5ID0gJmNoZWNrZW50cnksCiAJLm1lID0gVEhJU19NT0RVTEUKIH07CiAKKwogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJmNvbm5tYXJrX21hdGNoKTsKKwlpbnQgcmV0OworCisJbmVlZF9jb25udHJhY2soKTsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZjb25ubWFya19tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmY29ubm1hcms2X21hdGNoKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZjb25ubWFya19tYXRjaCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmY29ubm1hcmtfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZjb25ubWFyazZfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5tYXJrX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm50cmFjay5jIGIvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYwpzaW1pbGFyaXR5IGluZGV4IDYzJQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm50cmFjay5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCmluZGV4IGM4ZDE4NzAuLmZmZGViYzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubnRyYWNrLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYwpAQCAtMTgsMTIgKzE4LDEzIEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KICNlbmRpZgogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIGNvbm5lY3Rpb24gdHJhY2tpbmcgbWF0Y2ggbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9jb25udHJhY2siKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01PRFVMRSkKIApAQCAtMzMsOSArMzQsMTAgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9jb25udHJhY2tfaW5mbyAqc2luZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2Nvbm50cmFja19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAl1bnNpZ25lZCBpbnQgc3RhdGViaXQ7CkBAIC00NSw1OCArNDcsNTggQEAKICNkZWZpbmUgRldJTlYoYm9vbCxpbnZmbGcpICgoYm9vbCkgXiAhIShzaW5mby0+aW52ZmxhZ3MgJiBpbnZmbGcpKQogCiAJaWYgKGN0ID09ICZpcF9jb25udHJhY2tfdW50cmFja2VkKQotCQlzdGF0ZWJpdCA9IElQVF9DT05OVFJBQ0tfU1RBVEVfVU5UUkFDS0VEOworCQlzdGF0ZWJpdCA9IFhUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQ7CiAJZWxzZSBpZiAoY3QpCi0gCQlzdGF0ZWJpdCA9IElQVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbyk7CisgCQlzdGF0ZWJpdCA9IFhUX0NPTk5UUkFDS19TVEFURV9CSVQoY3RpbmZvKTsKICAJZWxzZQotIAkJc3RhdGViaXQgPSBJUFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQ7CisgCQlzdGF0ZWJpdCA9IFhUX0NPTk5UUkFDS19TVEFURV9JTlZBTElEOwogIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfU1RBVEUpIHsKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfU1RBVEUpIHsKIAkJaWYgKGN0KSB7CiAJCQlpZihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwICE9CiAJCQkgICAgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcCkKLQkJCQlzdGF0ZWJpdCB8PSBJUFRfQ09OTlRSQUNLX1NUQVRFX1NOQVQ7CisJCQkJc3RhdGViaXQgfD0gWFRfQ09OTlRSQUNLX1NUQVRFX1NOQVQ7CiAKIAkJCWlmKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QuaXAgIT0KIAkJCSAgICBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLmlwKQotCQkJCXN0YXRlYml0IHw9IElQVF9DT05OVFJBQ0tfU1RBVEVfRE5BVDsKKwkJCQlzdGF0ZWJpdCB8PSBYVF9DT05OVFJBQ0tfU1RBVEVfRE5BVDsKIAkJfQogCi0JCWlmIChGV0lOVigoc3RhdGViaXQgJiBzaW5mby0+c3RhdGVtYXNrKSA9PSAwLCBJUFRfQ09OTlRSQUNLX1NUQVRFKSkKKwkJaWYgKEZXSU5WKChzdGF0ZWJpdCAmIHNpbmZvLT5zdGF0ZW1hc2spID09IDAsIFhUX0NPTk5UUkFDS19TVEFURSkpCiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1BST1RPKSB7Ci0JCWlmICghY3QgfHwgRldJTlYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QucHJvdG9udW0sIElQVF9DT05OVFJBQ0tfUFJPVE8pKQorCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19QUk9UTykgeworCQlpZiAoIWN0IHx8IEZXSU5WKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0gIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uZHN0LnByb3RvbnVtLCBYVF9DT05OVFJBQ0tfUFJPVE8pKQogICAgICAgICAgICAgICAgIAlyZXR1cm4gMDsKIAl9CiAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX09SSUdTUkMpIHsKLQkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5pcCZzaW5mby0+c2lwbXNrW0lQX0NUX0RJUl9PUklHSU5BTF0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5zcmMuaXAsIElQVF9DT05OVFJBQ0tfT1JJR1NSQykpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX09SSUdTUkMpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5pcCZzaW5mby0+c2lwbXNrW0lQX0NUX0RJUl9PUklHSU5BTF0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5zcmMuaXAsIFhUX0NPTk5UUkFDS19PUklHU1JDKSkKIAkJCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfT1JJR0RTVCkgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5pcCwgSVBUX0NPTk5UUkFDS19PUklHRFNUKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfT1JJR0RTVCkgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5pcCwgWFRfQ09OTlRSQUNLX09SSUdEU1QpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19SRVBMU1JDKSB7Ci0JCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXAmc2luZm8tPnNpcG1za1tJUF9DVF9ESVJfUkVQTFldLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9SRVBMWV0uc3JjLmlwLCBJUFRfQ09OTlRSQUNLX1JFUExTUkMpKQorCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19SRVBMU1JDKSB7CisJCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXAmc2luZm8tPnNpcG1za1tJUF9DVF9ESVJfUkVQTFldLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9SRVBMWV0uc3JjLmlwLCBYVF9DT05OVFJBQ0tfUkVQTFNSQykpCiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1JFUExEU1QpIHsKLQkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcCZzaW5mby0+ZGlwbXNrW0lQX0NUX0RJUl9SRVBMWV0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX1JFUExZXS5kc3QuaXAsIElQVF9DT05OVFJBQ0tfUkVQTERTVCkpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1JFUExEU1QpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcCZzaW5mby0+ZGlwbXNrW0lQX0NUX0RJUl9SRVBMWV0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX1JFUExZXS5kc3QuaXAsIFhUX0NPTk5UUkFDS19SRVBMRFNUKSkKIAkJCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfU1RBVFVTKSB7Ci0JCWlmICghY3QgfHwgRldJTlYoKGN0LT5zdGF0dXMgJiBzaW5mby0+c3RhdHVzbWFzaykgPT0gMCwgSVBUX0NPTk5UUkFDS19TVEFUVVMpKQorCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19TVEFUVVMpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnN0YXR1cyAmIHNpbmZvLT5zdGF0dXNtYXNrKSA9PSAwLCBYVF9DT05OVFJBQ0tfU1RBVFVTKSkKIAkJCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfRVhQSVJFUykgeworCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19FWFBJUkVTKSB7CiAJCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKIAogCQlpZighY3QpCkBAIC0xMDQsNyArMTA2LDcgQEAKIAogCQlleHBpcmVzID0gdGltZXJfcGVuZGluZygmY3QtPnRpbWVvdXQpID8gKGN0LT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKS9IWiA6IDA7CiAKLQkJaWYgKEZXSU5WKCEoZXhwaXJlcyA+PSBzaW5mby0+ZXhwaXJlc19taW4gJiYgZXhwaXJlcyA8PSBzaW5mby0+ZXhwaXJlc19tYXgpLCBJUFRfQ09OTlRSQUNLX0VYUElSRVMpKQorCQlpZiAoRldJTlYoIShleHBpcmVzID49IHNpbmZvLT5leHBpcmVzX21pbiAmJiBleHBpcmVzIDw9IHNpbmZvLT5leHBpcmVzX21heCksIFhUX0NPTk5UUkFDS19FWFBJUkVTKSkKIAkJCXJldHVybiAwOwogCX0KIApAQCAtMTE4LDkgKzEyMCwxMCBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2Nvbm50cmFja19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY29ubnRyYWNrX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOwogCXN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAl1bnNpZ25lZCBpbnQgc3RhdGViaXQ7CkBAIC0xMzAsNTggKzEzMyw1OCBAQAogI2RlZmluZSBGV0lOVihib29sLGludmZsZykgKChib29sKSBeICEhKHNpbmZvLT5pbnZmbGFncyAmIGludmZsZykpCiAKIAlpZiAoY3QgPT0gJm5mX2Nvbm50cmFja191bnRyYWNrZWQpCi0JCXN0YXRlYml0ID0gSVBUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQ7CisJCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRDsKIAllbHNlIGlmIChjdCkKLSAJCXN0YXRlYml0ID0gSVBUX0NPTk5UUkFDS19TVEFURV9CSVQoY3RpbmZvKTsKKyAJCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pOwogIAllbHNlCi0gCQlzdGF0ZWJpdCA9IElQVF9DT05OVFJBQ0tfU1RBVEVfSU5WQUxJRDsKKyAJCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQ7CiAgCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19TVEFURSkgeworCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19TVEFURSkgewogCQlpZiAoY3QpIHsKIAkJCWlmKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMudTMuaXAgIT0KIAkJCSAgICBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LnUzLmlwKQotCQkJCXN0YXRlYml0IHw9IElQVF9DT05OVFJBQ0tfU1RBVEVfU05BVDsKKwkJCQlzdGF0ZWJpdCB8PSBYVF9DT05OVFJBQ0tfU1RBVEVfU05BVDsKIAogCQkJaWYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC51My5pcCAhPQogCQkJICAgIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMudTMuaXApCi0JCQkJc3RhdGViaXQgfD0gSVBUX0NPTk5UUkFDS19TVEFURV9ETkFUOworCQkJCXN0YXRlYml0IHw9IFhUX0NPTk5UUkFDS19TVEFURV9ETkFUOwogCQl9CiAKLQkJaWYgKEZXSU5WKChzdGF0ZWJpdCAmIHNpbmZvLT5zdGF0ZW1hc2spID09IDAsIElQVF9DT05OVFJBQ0tfU1RBVEUpKQorCQlpZiAoRldJTlYoKHN0YXRlYml0ICYgc2luZm8tPnN0YXRlbWFzaykgPT0gMCwgWFRfQ09OTlRSQUNLX1NUQVRFKSkKIAkJCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUFJPVE8pIHsKLQkJaWYgKCFjdCB8fCBGV0lOVihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5wcm90b251bSwgSVBUX0NPTk5UUkFDS19QUk9UTykpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1BST1RPKSB7CisJCWlmICghY3QgfHwgRldJTlYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QucHJvdG9udW0sIFhUX0NPTk5UUkFDS19QUk9UTykpCiAgICAgICAgICAgICAgICAgCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfT1JJR1NSQykgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLnUzLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLnNyYy5pcCwgSVBUX0NPTk5UUkFDS19PUklHU1JDKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfT1JJR1NSQykgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLnUzLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLnNyYy5pcCwgWFRfQ09OTlRSQUNLX09SSUdTUkMpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19PUklHRFNUKSB7Ci0JCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QudTMuaXAmc2luZm8tPmRpcG1za1tJUF9DVF9ESVJfT1JJR0lOQUxdLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uZHN0LmlwLCBJUFRfQ09OTlRSQUNLX09SSUdEU1QpKQorCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19PUklHRFNUKSB7CisJCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QudTMuaXAmc2luZm8tPmRpcG1za1tJUF9DVF9ESVJfT1JJR0lOQUxdLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uZHN0LmlwLCBYVF9DT05OVFJBQ0tfT1JJR0RTVCkpCiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1JFUExTUkMpIHsKLQkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy51My5pcCZzaW5mby0+c2lwbXNrW0lQX0NUX0RJUl9SRVBMWV0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX1JFUExZXS5zcmMuaXAsIElQVF9DT05OVFJBQ0tfUkVQTFNSQykpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1JFUExTUkMpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy51My5pcCZzaW5mby0+c2lwbXNrW0lQX0NUX0RJUl9SRVBMWV0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX1JFUExZXS5zcmMuaXAsIFhUX0NPTk5UUkFDS19SRVBMU1JDKSkKIAkJCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUkVQTERTVCkgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LnUzLmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLmRzdC5pcCwgSVBUX0NPTk5UUkFDS19SRVBMRFNUKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUkVQTERTVCkgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LnUzLmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLmRzdC5pcCwgWFRfQ09OTlRSQUNLX1JFUExEU1QpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19TVEFUVVMpIHsKLQkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnN0YXR1cyAmIHNpbmZvLT5zdGF0dXNtYXNrKSA9PSAwLCBJUFRfQ09OTlRSQUNLX1NUQVRVUykpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1NUQVRVUykgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+c3RhdHVzICYgc2luZm8tPnN0YXR1c21hc2spID09IDAsIFhUX0NPTk5UUkFDS19TVEFUVVMpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19FWFBJUkVTKSB7CisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX0VYUElSRVMpIHsKIAkJdW5zaWduZWQgbG9uZyBleHBpcmVzOwogCiAJCWlmKCFjdCkKQEAgLTE4OSw3ICsxOTIsNyBAQAogCiAJCWV4cGlyZXMgPSB0aW1lcl9wZW5kaW5nKCZjdC0+dGltZW91dCkgPyAoY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpL0haIDogMDsKIAotCQlpZiAoRldJTlYoIShleHBpcmVzID49IHNpbmZvLT5leHBpcmVzX21pbiAmJiBleHBpcmVzIDw9IHNpbmZvLT5leHBpcmVzX21heCksIElQVF9DT05OVFJBQ0tfRVhQSVJFUykpCisJCWlmIChGV0lOVighKGV4cGlyZXMgPj0gc2luZm8tPmV4cGlyZXNfbWluICYmIGV4cGlyZXMgPD0gc2luZm8tPmV4cGlyZXNfbWF4KSwgWFRfQ09OTlRSQUNLX0VYUElSRVMpKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC0xOTksMTggKzIwMiwxOCBAQAogI2VuZGlmIC8qIENPTkZJR19ORl9JUF9DT05OVFJBQ0sgKi8KIAogc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJIGNvbnN0IHZvaWQgKmlwLAogCQkgdm9pZCAqbWF0Y2hpbmZvLAogCQkgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY29ubnRyYWNrX2luZm8pKSkKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfY29ubnRyYWNrX2luZm8pKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggY29ubnRyYWNrX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBjb25udHJhY2tfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gImNvbm50cmFjayIsCiAJLm1hdGNoCQk9ICZtYXRjaCwKIAkuY2hlY2tlbnRyeQk9ICZjaGVjaywKQEAgLTIxOSwxMyArMjIyLDE2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQluZWVkX2lwX2Nvbm50cmFjaygpOwotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJmNvbm50cmFja19tYXRjaCk7CisJaW50IHJldDsKKwluZWVkX2Nvbm50cmFjaygpOworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZjb25udHJhY2tfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmY29ubnRyYWNrX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZjb25udHJhY2tfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfZGNjcC5jIGIvbmV0L25ldGZpbHRlci94dF9kY2NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5ZjQyZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfZGNjcC5jCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogaXB0YWJsZXMgbW9kdWxlIGZvciBEQ0NQIHByb3RvY29sIGhlYWRlciBtYXRjaGluZworICoKKyAqIChDKSAyMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bGludXgvZGNjcC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2RjY3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1hdGNoIGZvciBEQ0NQIHByb3RvY29sIHBhY2tldHMiKTsKK01PRFVMRV9BTElBUygiaXB0X2RjY3AiKTsKKworI2RlZmluZSBEQ0NIRUNLKGNvbmQsIG9wdGlvbiwgZmxhZywgaW52ZmxhZykgKCEoKGZsYWcpICYgKG9wdGlvbikpIFwKKwkJICAgICAgICAgICAgICAgICAgfHwgKCEhKChpbnZmbGFnKSAmIChvcHRpb24pKSBeIChjb25kKSkpCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpkY2NwX29wdGJ1ZjsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGNjcF9idWZsb2NrKTsKKworc3RhdGljIGlubGluZSBpbnQKK2RjY3BfZmluZF9vcHRpb24odV9pbnQ4X3Qgb3B0aW9uLAorCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCQkgY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCwKKwkJIGludCAqaG90ZHJvcCkKK3sKKwkvKiB0Y3AuZG9mZiBpcyBvbmx5IDQgYml0cywgaWUuIG1heCAxNSAqIDQgYnl0ZXMgKi8KKwl1bnNpZ25lZCBjaGFyICpvcDsKKwl1bnNpZ25lZCBpbnQgb3B0b2ZmID0gX19kY2NwX2hkcl9sZW4oZGgpOworCXVuc2lnbmVkIGludCBvcHRsZW4gPSBkaC0+ZGNjcGhfZG9mZio0IC0gX19kY2NwX2hkcl9sZW4oZGgpOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGRoLT5kY2NwaF9kb2ZmICogNCA8IF9fZGNjcF9oZHJfbGVuKGRoKSkgeworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworCX0KKworCWlmICghb3B0bGVuKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19iaCgmZGNjcF9idWZsb2NrKTsKKwlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYgKyBvcHRvZmYsIG9wdGxlbiwgZGNjcF9vcHRidWYpOworCWlmIChvcCA9PSBOVUxMKSB7CisJCS8qIElmIHdlIGRvbid0IGhhdmUgdGhlIHdob2xlIGhlYWRlciwgZHJvcCBwYWNrZXQuICovCisJCXNwaW5fdW5sb2NrX2JoKCZkY2NwX2J1ZmxvY2spOworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47ICkgeworCQlpZiAob3BbaV0gPT0gb3B0aW9uKSB7CisJCQlzcGluX3VubG9ja19iaCgmZGNjcF9idWZsb2NrKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKG9wW2ldIDwgMikgCisJCQlpKys7CisJCWVsc2UgCisJCQlpICs9IG9wW2krMV0/OjE7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJmRjY3BfYnVmbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQKK21hdGNoX3R5cGVzKGNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGgsIHVfaW50MTZfdCB0eXBlbWFzaykKK3sKKwlyZXR1cm4gKHR5cGVtYXNrICYgKDEgPDwgZGgtPmRjY3BoX3R5cGUpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK21hdGNoX29wdGlvbih1X2ludDhfdCBvcHRpb24sIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCSAgICAgY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCwgaW50ICpob3Rkcm9wKQoreworCXJldHVybiBkY2NwX2ZpbmRfb3B0aW9uKG9wdGlvbiwgc2tiLCBwcm90b2ZmLCBkaCwgaG90ZHJvcCk7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCB4dF9kY2NwX2luZm8gKmluZm8gPSAKKwkJCQkoY29uc3Qgc3RydWN0IHh0X2RjY3BfaW5mbyAqKW1hdGNoaW5mbzsKKwlzdHJ1Y3QgZGNjcF9oZHIgX2RoLCAqZGg7CisKKwlpZiAob2Zmc2V0KQorCQlyZXR1cm4gMDsKKwkKKwlkaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfZGgpLCAmX2RoKTsKKwlpZiAoZGggPT0gTlVMTCkgeworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworICAgICAgIAl9CisKKwlyZXR1cm4gIERDQ0hFQ0soKChudG9ocyhkaC0+ZGNjcGhfc3BvcnQpID49IGluZm8tPnNwdHNbMF0pIAorCQkJJiYgKG50b2hzKGRoLT5kY2NwaF9zcG9ydCkgPD0gaW5mby0+c3B0c1sxXSkpLCAKKwkJICAgCVhUX0RDQ1BfU1JDX1BPUlRTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCisJCSYmIERDQ0hFQ0soKChudG9ocyhkaC0+ZGNjcGhfZHBvcnQpID49IGluZm8tPmRwdHNbMF0pIAorCQkJJiYgKG50b2hzKGRoLT5kY2NwaF9kcG9ydCkgPD0gaW5mby0+ZHB0c1sxXSkpLCAKKwkJCVhUX0RDQ1BfREVTVF9QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQorCQkmJiBEQ0NIRUNLKG1hdGNoX3R5cGVzKGRoLCBpbmZvLT50eXBlbWFzayksCisJCQkgICBYVF9EQ0NQX1RZUEUsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncykKKwkJJiYgRENDSEVDSyhtYXRjaF9vcHRpb24oaW5mby0+b3B0aW9uLCBza2IsIHByb3RvZmYsIGRoLAorCQkJCQlob3Rkcm9wKSwKKwkJCSAgIFhUX0RDQ1BfT1BUSU9OLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICBjb25zdCB2b2lkICppbmYsCisJICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IGluZjsKKwljb25zdCBzdHJ1Y3QgeHRfZGNjcF9pbmZvICppbmZvOworCisJaW5mbyA9IChjb25zdCBzdHJ1Y3QgeHRfZGNjcF9pbmZvICopbWF0Y2hpbmZvOworCisJcmV0dXJuIGlwLT5wcm90byA9PSBJUFBST1RPX0RDQ1AKKwkJJiYgIShpcC0+aW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pCisJCSYmIG1hdGNoc2l6ZSA9PSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2RjY3BfaW5mbykpCisJCSYmICEoaW5mby0+ZmxhZ3MgJiB+WFRfRENDUF9WQUxJRF9GTEFHUykKKwkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5YVF9EQ0NQX1ZBTElEX0ZMQUdTKQorCQkmJiAhKGluZm8tPmludmZsYWdzICYgfmluZm8tPmZsYWdzKTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeTYoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgIGNvbnN0IHZvaWQgKmluZiwKKwkgICB2b2lkICptYXRjaGluZm8sCisJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAgPSBpbmY7CisJY29uc3Qgc3RydWN0IHh0X2RjY3BfaW5mbyAqaW5mbzsKKworCWluZm8gPSAoY29uc3Qgc3RydWN0IHh0X2RjY3BfaW5mbyAqKW1hdGNoaW5mbzsKKworCXJldHVybiBpcC0+cHJvdG8gPT0gSVBQUk9UT19EQ0NQCisJCSYmICEoaXAtPmludmZsYWdzICYgWFRfSU5WX1BST1RPKQorCQkmJiBtYXRjaHNpemUgPT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9kY2NwX2luZm8pKQorCQkmJiAhKGluZm8tPmZsYWdzICYgflhUX0RDQ1BfVkFMSURfRkxBR1MpCisJCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+WFRfRENDUF9WQUxJRF9GTEFHUykKKwkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5pbmZvLT5mbGFncyk7Cit9CisKKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBkY2NwX21hdGNoID0gCit7IAorCS5uYW1lIAkJPSAiZGNjcCIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZSAJCT0gVEhJU19NT0RVTEUsCit9Oworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBkY2NwNl9tYXRjaCA9IAoreyAKKwkubmFtZSAJCT0gImRjY3AiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeTYsCisJLm1lIAkJPSBUSElTX01PRFVMRSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwkvKiBkb2ZmIGlzIDggYml0cywgc28gdGhlIG1heGltdW0gb3B0aW9uIHNpemUgaXMgKDQqMjU2KS4gIERvbid0IHB1dAorCSAqIHRoaXMgaW4gQlNTIHNpbmNlIERhdmVNIGlzIHdvcnJpZWQgYWJvdXQgbG9ja2VkIFRMQidzIGZvciBrZXJuZWwKKwkgKiBCU1MuICovCisJZGNjcF9vcHRidWYgPSBrbWFsbG9jKDI1NiAqIDQsIEdGUF9LRVJORUwpOworCWlmICghZGNjcF9vcHRidWYpCisJCXJldHVybiAtRU5PTUVNOworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZkY2NwX21hdGNoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9rZnJlZTsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmRjY3A2X21hdGNoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bnJlZzsKKworCXJldHVybiByZXQ7CisKK291dF91bnJlZzoKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZkY2NwX21hdGNoKTsKK291dF9rZnJlZToKKwlrZnJlZShkY2NwX29wdGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZkY2NwNl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmZGNjcF9tYXRjaCk7CisJa2ZyZWUoZGNjcF9vcHRidWYpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9oZWxwZXIuYyBiL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMKc2ltaWxhcml0eSBpbmRleCA3MiUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9oZWxwZXIuYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYwppbmRleCBhZWY2NDllLi4zOGI2NzE1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hlbHBlci5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19NT0RVTEUpCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaD4KQEAgLTIzLDEyICsyMiwxNCBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KICNlbmRpZgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfaGVscGVyLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIk1hcnRpbiBKb3NlZnNzb24gPGdhbmRhbGZAbmV0ZmlsdGVyLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgaGVscGVyIG1hdGNoIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfaGVscGVyIik7CitNT0RVTEVfQUxJQVMoImlwNnRfaGVscGVyIik7CiAKICNpZiAwCiAjZGVmaW5lIERFQlVHUCBwcmludGsKQEAgLTQzLDI3ICs0NCwyOCBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2hlbHBlcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9oZWxwZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAlpbnQgcmV0ID0gaW5mby0+aW52ZXJ0OwogCQogCWN0ID0gaXBfY29ubnRyYWNrX2dldCgoc3RydWN0IHNrX2J1ZmYgKilza2IsICZjdGluZm8pOwogCWlmICghY3QpIHsKLQkJREVCVUdQKCJpcHRfaGVscGVyOiBFZWshIGludmFsaWQgY29ubnRyYWNrP1xuIik7CisJCURFQlVHUCgieHRfaGVscGVyOiBFZWshIGludmFsaWQgY29ubnRyYWNrP1xuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJaWYgKCFjdC0+bWFzdGVyKSB7Ci0JCURFQlVHUCgiaXB0X2hlbHBlcjogY29ubnRyYWNrICVwIGhhcyBubyBtYXN0ZXJcbiIsIGN0KTsKKwkJREVCVUdQKCJ4dF9oZWxwZXI6IGNvbm50cmFjayAlcCBoYXMgbm8gbWFzdGVyXG4iLCBjdCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJcmVhZF9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7CiAJaWYgKCFjdC0+bWFzdGVyLT5oZWxwZXIpIHsKLQkJREVCVUdQKCJpcHRfaGVscGVyOiBtYXN0ZXIgY3QgJXAgaGFzIG5vIGhlbHBlclxuIiwgCisJCURFQlVHUCgieHRfaGVscGVyOiBtYXN0ZXIgY3QgJXAgaGFzIG5vIGhlbHBlclxuIiwgCiAJCQlleHAtPmV4cGVjdGFudCk7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CkBAIC04OSwyNyArOTEsMjggQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9oZWxwZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfaGVscGVyX2luZm8gKmluZm8gPSBtYXRjaGluZm87CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCWludCByZXQgPSBpbmZvLT5pbnZlcnQ7CiAJCiAJY3QgPSBuZl9jdF9nZXQoKHN0cnVjdCBza19idWZmICopc2tiLCAmY3RpbmZvKTsKIAlpZiAoIWN0KSB7Ci0JCURFQlVHUCgiaXB0X2hlbHBlcjogRWVrISBpbnZhbGlkIGNvbm50cmFjaz9cbiIpOworCQlERUJVR1AoInh0X2hlbHBlcjogRWVrISBpbnZhbGlkIGNvbm50cmFjaz9cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCWlmICghY3QtPm1hc3RlcikgewotCQlERUJVR1AoImlwdF9oZWxwZXI6IGNvbm50cmFjayAlcCBoYXMgbm8gbWFzdGVyXG4iLCBjdCk7CisJCURFQlVHUCgieHRfaGVscGVyOiBjb25udHJhY2sgJXAgaGFzIG5vIG1hc3RlclxuIiwgY3QpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCXJlYWRfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogCWlmICghY3QtPm1hc3Rlci0+aGVscGVyKSB7Ci0JCURFQlVHUCgiaXB0X2hlbHBlcjogbWFzdGVyIGN0ICVwIGhhcyBubyBoZWxwZXJcbiIsIAorCQlERUJVR1AoInh0X2hlbHBlcjogbWFzdGVyIGN0ICVwIGhhcyBubyBoZWxwZXJcbiIsIAogCQkJZXhwLT5leHBlY3RhbnQpOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQpAQCAtMTI5LDIzICsxMzIsMjkgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgY29uc3Qgdm9pZCAqaW5mLAogCQkgdm9pZCAqbWF0Y2hpbmZvLAogCQkgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0Jc3RydWN0IGlwdF9oZWxwZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwlzdHJ1Y3QgeHRfaGVscGVyX2luZm8gKmluZm8gPSBtYXRjaGluZm87CiAKIAlpbmZvLT5uYW1lWzI5XSA9ICdcMCc7CiAKIAkvKiB2ZXJpZnkgc2l6ZSAqLwotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2hlbHBlcl9pbmZvKSkpCisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2hlbHBlcl9pbmZvKSkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGhlbHBlcl9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggaGVscGVyX21hdGNoID0geworCS5uYW1lCQk9ICJoZWxwZXIiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggaGVscGVyNl9tYXRjaCA9IHsKIAkubmFtZQkJPSAiaGVscGVyIiwKIAkubWF0Y2gJCT0gJm1hdGNoLAogCS5jaGVja2VudHJ5CT0gJmNoZWNrLApAQCAtMTU0LDEzICsxNjMsMjQgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCW5lZWRfaXBfY29ubnRyYWNrKCk7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmaGVscGVyX21hdGNoKTsKKwlpbnQgcmV0OworCW5lZWRfY29ubnRyYWNrKCk7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaGVscGVyX21hdGNoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmaGVscGVyNl9tYXRjaCk7CisJaWYgKHJldCA8IDApCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmhlbHBlcl9tYXRjaCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZoZWxwZXJfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmhlbHBlcl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmhlbHBlcjZfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2xlbmd0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YzhmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2xlbmd0aC5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggcGFja2V0IGxlbmd0aC4gKi8KKy8qIChDKSAxOTk5LTIwMDEgSmFtZXMgTW9ycmlzIDxqbW9ycm9zQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2xlbmd0aC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCitNT0RVTEVfQVVUSE9SKCJKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIHBhY2tldCBsZW5ndGggbWF0Y2hpbmcgbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwdF9sZW5ndGgiKTsKK01PRFVMRV9BTElBUygiaXA2dF9sZW5ndGgiKTsKKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IHh0X2xlbmd0aF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCXVfaW50MTZfdCBwa3RsZW4gPSBudG9ocyhza2ItPm5oLmlwaC0+dG90X2xlbik7CisJCisJcmV0dXJuIChwa3RsZW4gPj0gaW5mby0+bWluICYmIHBrdGxlbiA8PSBpbmZvLT5tYXgpIF4gaW5mby0+aW52ZXJ0OworfQorCitzdGF0aWMgaW50CittYXRjaDYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICAgaW50IG9mZnNldCwKKyAgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IHh0X2xlbmd0aF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCXVfaW50MTZfdCBwa3RsZW4gPSBudG9ocyhza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbikgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCQorCXJldHVybiAocGt0bGVuID49IGluZm8tPm1pbiAmJiBwa3RsZW4gPD0gaW5mby0+bWF4KSBeIGluZm8tPmludmVydDsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisgICAgICAgICAgIGNvbnN0IHZvaWQgKmlwLAorICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2xlbmd0aF9pbmZvKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggbGVuZ3RoX21hdGNoID0geworCS5uYW1lCQk9ICJsZW5ndGgiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9Oworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBsZW5ndGg2X21hdGNoID0geworCS5uYW1lCQk9ICJsZW5ndGgiLAorCS5tYXRjaAkJPSAmbWF0Y2g2LAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmxlbmd0aF9tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmxlbmd0aDZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmxlbmd0aF9tYXRjaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmxlbmd0aF9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmxlbmd0aDZfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9saW1pdC5jIGIvbmV0L25ldGZpbHRlci94dF9saW1pdC5jCnNpbWlsYXJpdHkgaW5kZXggNzglCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfbGltaXQuYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9saW1pdC5jCmluZGV4IDBjMjRkY2MuLjE1ZTQwNTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbGltaXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2xpbWl0LmMKQEAgLTE4LDEyICsxOCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiSGVydmUgRXljaGVubmUgPHJ2QHdhbGxmaXJlLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgcmF0ZSBsaW1pdCBtYXRjaCIpOworTU9EVUxFX0FMSUFTKCJpcHRfbGltaXQiKTsKK01PRFVMRV9BTElBUygiaXA2dF9saW1pdCIpOwogCiAvKiBUaGUgYWxnb3JpdGhtIHVzZWQgaXMgdGhlIFNpbXBsZSBUb2tlbiBCdWNrZXQgRmlsdGVyIChUQkYpCiAgKiBzZWUgbmV0L3NjaGVkL3NjaF90YmYuYyBpbiB0aGUgbGludXggc291cmNlIHRyZWUKQEAgLTY4LDkgKzcwLDEwIEBACiAJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJCWNvbnN0IHZvaWQgKm1hdGNoaW5mbywKIAkJaW50IG9mZnNldCwKKwkJdW5zaWduZWQgaW50IHByb3RvZmYsCiAJCWludCAqaG90ZHJvcCkKIHsKLQlzdHJ1Y3QgaXB0X3JhdGVpbmZvICpyID0gKChzdHJ1Y3QgaXB0X3JhdGVpbmZvICopbWF0Y2hpbmZvKS0+bWFzdGVyOworCXN0cnVjdCB4dF9yYXRlaW5mbyAqciA9ICgoc3RydWN0IHh0X3JhdGVpbmZvICopbWF0Y2hpbmZvKS0+bWFzdGVyOwogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAogCXNwaW5fbG9ja19iaCgmbGltaXRfbG9jayk7CkBAIC05NiwzMiArOTksMzIgQEAKIAkvKiBJZiBtdWx0aXBseWluZyB3b3VsZCBvdmVyZmxvdy4uLiAqLwogCWlmICh1c2VyID4gMHhGRkZGRkZGRiAvIChIWipDUkVESVRTX1BFUl9KSUZGWSkpCiAJCS8qIERpdmlkZSBmaXJzdC4gKi8KLQkJcmV0dXJuICh1c2VyIC8gSVBUX0xJTUlUX1NDQUxFKSAqIEhaICogQ1JFRElUU19QRVJfSklGRlk7CisJCXJldHVybiAodXNlciAvIFhUX0xJTUlUX1NDQUxFKSAqIEhaICogQ1JFRElUU19QRVJfSklGRlk7CiAKLQlyZXR1cm4gKHVzZXIgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZKSAvIElQVF9MSU1JVF9TQ0FMRTsKKwlyZXR1cm4gKHVzZXIgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZKSAvIFhUX0xJTUlUX1NDQUxFOwogfQogCiBzdGF0aWMgaW50CiBpcHRfbGltaXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJCSAgICAgY29uc3Qgdm9pZCAqaW5mLAogCQkgICAgIHZvaWQgKm1hdGNoaW5mbywKIAkJICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0Jc3RydWN0IGlwdF9yYXRlaW5mbyAqciA9IG1hdGNoaW5mbzsKKwlzdHJ1Y3QgeHRfcmF0ZWluZm8gKnIgPSBtYXRjaGluZm87CiAKLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9yYXRlaW5mbykpKQorCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9yYXRlaW5mbykpKQogCQlyZXR1cm4gMDsKIAogCS8qIENoZWNrIGZvciBvdmVyZmxvdy4gKi8KIAlpZiAoci0+YnVyc3QgPT0gMAogCSAgICB8fCB1c2VyMmNyZWRpdHMoci0+YXZnICogci0+YnVyc3QpIDwgdXNlcjJjcmVkaXRzKHItPmF2ZykpIHsKLQkJcHJpbnRrKCJPdmVyZmxvdyBpbiBpcHRfbGltaXQsIHRyeSBsb3dlcjogJXUvJXVcbiIsCisJCXByaW50aygiT3ZlcmZsb3cgaW4geHRfbGltaXQsIHRyeSBsb3dlcjogJXUvJXVcbiIsCiAJCSAgICAgICByLT5hdmcsIHItPmJ1cnN0KTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JLyogVXNlciBhdmcgaW4gc2Vjb25kcyAqIElQVF9MSU1JVF9TQ0FMRTogY29udmVydCB0byBqaWZmaWVzICoKKwkvKiBVc2VyIGF2ZyBpbiBzZWNvbmRzICogWFRfTElNSVRfU0NBTEU6IGNvbnZlcnQgdG8gamlmZmllcyAqCiAJICAgMTI4LiAqLwogCXItPnByZXYgPSBqaWZmaWVzOwogCXItPmNyZWRpdCA9IHVzZXIyY3JlZGl0cyhyLT5hdmcgKiByLT5idXJzdCk7CSAvKiBDcmVkaXRzIGZ1bGwuICovCkBAIC0xMzQsNyArMTM3LDEzIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGlwdF9saW1pdF9yZWcgPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGlwdF9saW1pdF9yZWcgPSB7CisJLm5hbWUJCT0gImxpbWl0IiwKKwkubWF0Y2gJCT0gaXB0X2xpbWl0X21hdGNoLAorCS5jaGVja2VudHJ5CT0gaXB0X2xpbWl0X2NoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggbGltaXQ2X3JlZyA9IHsKIAkubmFtZQkJPSAibGltaXQiLAogCS5tYXRjaAkJPSBpcHRfbGltaXRfbWF0Y2gsCiAJLmNoZWNrZW50cnkJPSBpcHRfbGltaXRfY2hlY2tlbnRyeSwKQEAgLTE0MywxNCArMTUyLDIzIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQlpZiAoaXB0X3JlZ2lzdGVyX21hdGNoKCZpcHRfbGltaXRfcmVnKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7CisJaW50IHJldDsKKwkKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaXB0X2xpbWl0X3JlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmxpbWl0Nl9yZWcpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmlwdF9saW1pdF9yZWcpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmaXB0X2xpbWl0X3JlZyk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaXB0X2xpbWl0X3JlZyk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmxpbWl0Nl9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbWFjLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X21hYy5jCnNpbWlsYXJpdHkgaW5kZXggNjUlCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfbWFjLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfbWFjLmMKaW5kZXggMWI5YmI0NS4uMDQ2MWRjYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tYWMuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X21hYy5jCkBAIC0xMywxMiArMTMsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFjLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbWFjLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIG1hYyBtYXRjaGluZyBtb2R1bGUiKTsKK01PRFVMRV9BTElBUygiaXB0X21hYyIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X21hYyIpOwogCiBzdGF0aWMgaW50CiBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMjYsOSArMjksMTAgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7Ci0gICAgY29uc3Qgc3RydWN0IGlwdF9tYWNfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKyAgICBjb25zdCBzdHJ1Y3QgeHRfbWFjX2luZm8gKmluZm8gPSBtYXRjaGluZm87CiAKICAgICAvKiBJcyBtYWMgcG9pbnRlciB2YWxpZD8gKi8KICAgICByZXR1cm4gKHNrYi0+bWFjLnJhdyA+PSBza2ItPmhlYWQKQEAgLTQwLDcgKzQ0LDcgQEAKIAogc3RhdGljIGludAogaXB0X21hY19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJCSAgIGNvbnN0IHZvaWQgKmluZiwKIAkJICAgdm9pZCAqbWF0Y2hpbmZvLAogCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpAQCAtNDksMTcgKzUzLDIzIEBACiAJaWYgKGhvb2tfbWFzawogCSAgICAmIH4oKDEgPDwgTkZfSVBfUFJFX1JPVVRJTkcpIHwgKDEgPDwgTkZfSVBfTE9DQUxfSU4pCiAJCXwgKDEgPDwgTkZfSVBfRk9SV0FSRCkpKSB7Ci0JCXByaW50aygiaXB0X21hYzogb25seSB2YWxpZCBmb3IgUFJFX1JPVVRJTkcsIExPQ0FMX0lOIG9yIEZPUldBUkQuXG4iKTsKKwkJcHJpbnRrKCJ4dF9tYWM6IG9ubHkgdmFsaWQgZm9yIFBSRV9ST1VUSU5HLCBMT0NBTF9JTiBvciBGT1JXQVJELlxuIik7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X21hY19pbmZvKSkpCisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X21hY19pbmZvKSkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIG1hY19tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggbWFjX21hdGNoID0geworCS5uYW1lCQk9ICJtYWMiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmaXB0X21hY19jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIG1hYzZfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gIm1hYyIsCiAJLm1hdGNoCQk9ICZtYXRjaCwKIAkuY2hlY2tlbnRyeQk9ICZpcHRfbWFjX2NoZWNrZW50cnksCkBAIC02OCwxMiArNzgsMjIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJm1hY19tYXRjaCk7CisJaW50IHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbWFjX21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZtYWM2X21hdGNoKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZtYWNfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmbWFjX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZtYWNfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZtYWM2X21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X21hcmsuYyBiL25ldC9uZXRmaWx0ZXIveHRfbWFyay5jCnNpbWlsYXJpdHkgaW5kZXggNjAlCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfbWFyay5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X21hcmsuYwppbmRleCAwMGJlZjZjLi4yYTBhYzYyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X21hcmsuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X21hcmsuYwpAQCAtMTAsMTIgKzEwLDE0IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFyay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9tYXJrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBtYXJrIG1hdGNoaW5nIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfbWFyayIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X21hcmsiKTsKIAogc3RhdGljIGludAogbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTIzLDIzICsyNSwyNCBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X21hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfbWFya19pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCiAJcmV0dXJuICgoc2tiLT5uZm1hcmsgJiBpbmZvLT5tYXNrKSA9PSBpbmZvLT5tYXJrKSBeIGluZm8tPmludmVydDsKIH0KIAogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgICAgICBjb25zdCB2b2lkICplbnRyeSwKICAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewotCXN0cnVjdCBpcHRfbWFya19pbmZvICptaW5mbyA9IChzdHJ1Y3QgaXB0X21hcmtfaW5mbyAqKSBtYXRjaGluZm87CisJc3RydWN0IHh0X21hcmtfaW5mbyAqbWluZm8gPSAoc3RydWN0IHh0X21hcmtfaW5mbyAqKSBtYXRjaGluZm87CiAKLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9tYXJrX2luZm8pKSkKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfbWFya19pbmZvKSkpCiAJCXJldHVybiAwOwogCiAJaWYgKG1pbmZvLT5tYXJrID4gMHhmZmZmZmZmZiB8fCBtaW5mby0+bWFzayA+IDB4ZmZmZmZmZmYpIHsKQEAgLTUwLDcgKzUzLDE0IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIG1hcmtfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIG1hcmtfbWF0Y2ggPSB7CisJLm5hbWUJCT0gIm1hcmsiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIG1hcms2X21hdGNoID0gewogCS5uYW1lCQk9ICJtYXJrIiwKIAkubWF0Y2gJCT0gJm1hdGNoLAogCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCkBAIC01OSwxMiArNjksMjIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJm1hcmtfbWF0Y2gpOworCWludCByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJm1hcmtfbWF0Y2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJm1hcms2X21hdGNoKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZtYXJrX21hdGNoKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJm1hcmtfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJm1hcmtfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZtYXJrNl9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9waHlzZGV2LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWJiNTdjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9waHlzZGV2LmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggdGhlIGJyaWRnZSBwb3J0IGluIGFuZAorICogb3V0IGRldmljZSBmb3IgSVAgcGFja2V0cyBjb21pbmcgaW50byBjb250YWN0IHdpdGggYSBicmlkZ2UuICovCisKKy8qIChDKSAyMDAxLTIwMDMgQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KKyNkZWZpbmUgTUFUQ0ggICAxCisjZGVmaW5lIE5PTUFUQ0ggMAorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBicmlkZ2UgcGh5c2ljYWwgZGV2aWNlIG1hdGNoIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfcGh5c2RldiIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X3BoeXNkZXYiKTsKKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJaW50IGk7CisJc3RhdGljIGNvbnN0IGNoYXIgbnVsbGRldm5hbWVbSUZOQU1TSVpdOworCWNvbnN0IHN0cnVjdCB4dF9waHlzZGV2X2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJdW5zaWduZWQgaW50IHJldDsKKwljb25zdCBjaGFyICppbmRldiwgKm91dGRldjsKKwlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZTsKKworCS8qIE5vdCBhIGJyaWRnZWQgSVAgcGFja2V0IG9yIG5vIGluZm8gYXZhaWxhYmxlIHlldDoKKwkgKiBMT0NBTF9PVVQvbWFuZ2xlIGFuZCBMT0NBTF9PVVQvbmF0IGRvbid0IGtub3cgaWYKKwkgKiB0aGUgZGVzdGluYXRpb24gZGV2aWNlIHdpbGwgYmUgYSBicmlkZ2UuICovCisJaWYgKCEobmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2UpKSB7CisJCS8qIFJldHVybiBNQVRDSCBpZiB0aGUgaW52ZXJ0IGZsYWdzIG9mIHRoZSB1c2VkIG9wdGlvbnMgYXJlIG9uICovCisJCWlmICgoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfQlJJREdFRCkgJiYKKwkJICAgICEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9CUklER0VEKSkKKwkJCXJldHVybiBOT01BVENIOworCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX0lTSU4pICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfSVNJTikpCisJCQlyZXR1cm4gTk9NQVRDSDsKKwkJaWYgKChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9JU09VVCkgJiYKKwkJICAgICEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9JU09VVCkpCisJCQlyZXR1cm4gTk9NQVRDSDsKKwkJaWYgKChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9JTikgJiYKKwkJICAgICEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9JTikpCisJCQlyZXR1cm4gTk9NQVRDSDsKKwkJaWYgKChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9PVVQpICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfT1VUKSkKKwkJCXJldHVybiBOT01BVENIOworCQlyZXR1cm4gTUFUQ0g7CisJfQorCisJLyogVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGluIHRoZSBGT1JXQVJEIGFuZCBQT1NUUk9VVElORyBjaGFpbnMgKi8KKwlpZiAoKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX0JSSURHRUQpICYmCisJICAgICghIShuZl9icmlkZ2UtPm1hc2sgJiBCUk5GX0JSSURHRUQpIF4KKwkgICAgIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0JSSURHRUQpKSkKKwkJcmV0dXJuIE5PTUFUQ0g7CisKKwlpZiAoKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX0lTSU4gJiYKKwkgICAgKCFuZl9icmlkZ2UtPnBoeXNpbmRldiBeICEhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfSVNJTikpKSB8fAorCSAgICAoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfSVNPVVQgJiYKKwkgICAgKCFuZl9icmlkZ2UtPnBoeXNvdXRkZXYgXiAhIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0lTT1VUKSkpKQorCQlyZXR1cm4gTk9NQVRDSDsKKworCWlmICghKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX0lOKSkKKwkJZ290byBtYXRjaF9vdXRkZXY7CisJaW5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldiA/IG5mX2JyaWRnZS0+cGh5c2luZGV2LT5uYW1lIDogbnVsbGRldm5hbWU7CisJZm9yIChpID0gMCwgcmV0ID0gMDsgaSA8IElGTkFNU0laL3NpemVvZih1bnNpZ25lZCBpbnQpOyBpKyspIHsKKwkJcmV0IHw9ICgoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZGV2KVtpXQorCQkJXiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPnBoeXNpbmRldilbaV0pCisJCQkmICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+aW5fbWFzaylbaV07CisJfQorCisJaWYgKChyZXQgPT0gMCkgXiAhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfSU4pKQorCQlyZXR1cm4gTk9NQVRDSDsKKworbWF0Y2hfb3V0ZGV2OgorCWlmICghKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX09VVCkpCisJCXJldHVybiBNQVRDSDsKKwlvdXRkZXYgPSBuZl9icmlkZ2UtPnBoeXNvdXRkZXYgPworCQkgbmZfYnJpZGdlLT5waHlzb3V0ZGV2LT5uYW1lIDogbnVsbGRldm5hbWU7CisJZm9yIChpID0gMCwgcmV0ID0gMDsgaSA8IElGTkFNU0laL3NpemVvZih1bnNpZ25lZCBpbnQpOyBpKyspIHsKKwkJcmV0IHw9ICgoKGNvbnN0IHVuc2lnbmVkIGludCAqKW91dGRldilbaV0KKwkJCV4gKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmZvLT5waHlzb3V0ZGV2KVtpXSkKKwkJCSYgKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmZvLT5vdXRfbWFzaylbaV07CisJfQorCisJcmV0dXJuIChyZXQgIT0gMCkgXiAhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfT1VUKTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSAgICAgICBjb25zdCB2b2lkICppcCwKKwkJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCB4dF9waHlzZGV2X2luZm8gKmluZm8gPSBtYXRjaGluZm87CisKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfcGh5c2Rldl9pbmZvKSkpCisJCXJldHVybiAwOworCWlmICghKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX01BU0spIHx8CisJICAgIGluZm8tPmJpdG1hc2sgJiB+WFRfUEhZU0RFVl9PUF9NQVNLKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBwaHlzZGV2X21hdGNoID0geworCS5uYW1lCQk9ICJwaHlzZGV2IiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBwaHlzZGV2Nl9tYXRjaCA9IHsKKwkubmFtZQkJPSAicGh5c2RldiIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnBoeXNkZXZfbWF0Y2gpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZwaHlzZGV2Nl9tYXRjaCk7CisJaWYgKHJldCA8IDApCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnBoeXNkZXZfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZwaHlzZGV2X21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmcGh5c2RldjZfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9wa3R0eXBlLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3BrdHR5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjFiMjYzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9wa3R0eXBlLmMKQEAgLTAsMCArMSw4MiBAQAorLyogKEMpIDE5OTktMjAwMSBNaWNoYWwgTHVkdmlnIDxtaWNoYWxAbG9naXguY3o+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9wa3R0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1pY2hhbCBMdWR2aWcgPG1pY2hhbEBsb2dpeC5jej4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIG1hdGNoIHRvIG1hdGNoIG9uIGxpbmtsYXllciBwYWNrZXQgdHlwZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfcGt0dHlwZSIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X3BrdHR5cGUiKTsKKworc3RhdGljIGludCBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfcGt0dHlwZV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCisJcmV0dXJuIChza2ItPnBrdF90eXBlID09IGluZm8tPnBrdHR5cGUpIF4gaW5mby0+aW52ZXJ0OworfQorCitzdGF0aWMgaW50IGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCQkgICBjb25zdCB2b2lkICppcCwKKwkJICAgdm9pZCAqbWF0Y2hpbmZvLAorCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCQkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9wa3R0eXBlX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBwa3R0eXBlX21hdGNoID0geworCS5uYW1lCQk9ICJwa3R0eXBlIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggcGt0dHlwZTZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInBrdHR5cGUiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZwa3R0eXBlX21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZwa3R0eXBlNl9tYXRjaCk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmcGt0dHlwZV9tYXRjaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnBrdHR5cGVfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZwa3R0eXBlNl9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlYWxtLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3JlYWxtLmMKc2ltaWxhcml0eSBpbmRleCA3MCUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWFsbS5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X3JlYWxtLmMKaW5kZXggNTRhNjg5Ny4uMmI3ZTE3OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWFsbS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcmVhbG0uYwpAQCAtMTQsMTIgKzE0LDE0IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVhbG0uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9yZWFsbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogCiBNT0RVTEVfQVVUSE9SKCJTYW1wc2EgUmFudGEgPHNhbXBzYUBuZXRzb25pYy5maT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgcmVhbG0gbWF0Y2giKTsKK01PRFVMRV9ERVNDUklQVElPTigiWF90YWJsZXMgcmVhbG0gbWF0Y2giKTsKK01PRFVMRV9BTElBUygiaXB0X3JlYWxtIik7CiAKIHN0YXRpYyBpbnQKIG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCkBAIC0yNywxNiArMjksMTcgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9yZWFsbV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9yZWFsbV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYi0+ZHN0OwogICAgIAogCXJldHVybiAoaW5mby0+aWQgPT0gKGRzdC0+dGNsYXNzaWQgJiBpbmZvLT5tYXNrKSkgXiBpbmZvLT5pbnZlcnQ7CiB9CiAKIHN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaXAsCiAgICAgICAgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKQEAgLTQ0LDE4ICs0NywxOCBAQAogCWlmIChob29rX21hc2sKIAkgICAgJiB+KCgxIDw8IE5GX0lQX1BPU1RfUk9VVElORykgfCAoMSA8PCBORl9JUF9GT1JXQVJEKSB8CiAJICAgICAgICAoMSA8PCBORl9JUF9MT0NBTF9PVVQpIHwgKDEgPDwgTkZfSVBfTE9DQUxfSU4pKSkgewotCQlwcmludGsoImlwdF9yZWFsbTogb25seSB2YWxpZCBmb3IgUE9TVF9ST1VUSU5HLCBMT0NBTF9PVVQsICIKKwkJcHJpbnRrKCJ4dF9yZWFsbTogb25seSB2YWxpZCBmb3IgUE9TVF9ST1VUSU5HLCBMT0NBTF9PVVQsICIKIAkJICAgICAgICJMT0NBTF9JTiBvciBGT1JXQVJELlxuIik7CiAJCXJldHVybiAwOwogCX0KLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9yZWFsbV9pbmZvKSkpIHsKLQkJcHJpbnRrKCJpcHRfcmVhbG06IGludmFsaWQgbWF0Y2hzaXplLlxuIik7CisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3JlYWxtX2luZm8pKSkgeworCQlwcmludGsoInh0X3JlYWxtOiBpbnZhbGlkIG1hdGNoc2l6ZS5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHJlYWxtX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCByZWFsbV9tYXRjaCA9IHsKIAkubmFtZQkJPSAicmVhbG0iLAogCS5tYXRjaAkJPSBtYXRjaCwgCiAJLmNoZWNrZW50cnkJPSBjaGVjaywKQEAgLTY0LDEyICs2NywxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmcmVhbG1fbWF0Y2gpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmcmVhbG1fbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZyZWFsbV9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmcmVhbG1fbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc2N0cC5jIGIvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKc2ltaWxhcml0eSBpbmRleCA2MiUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9zY3RwLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfc2N0cC5jCmluZGV4IGZlMmIzMjcuLjEwZmJmYzUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc2N0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jCkBAIC0xLDEwICsxLDE4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9zY3RwLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfc2N0cC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zY3RwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJLaXJhbiBLdW1hciBJbW1pZGkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWF0Y2ggZm9yIFNDVFAgcHJvdG9jb2wgcGFja2V0cyIpOworTU9EVUxFX0FMSUFTKCJpcHRfc2N0cCIpOwogCiAjaWZkZWYgREVCVUdfU0NUUAogI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhmb3JtYXQgLCAjIyBhcmdzKQpAQCAtMTYsNyArMjQsNyBAQAogCQkJCQkgICAgICB8fCAoISEoKGludmZsYWcpICYgKG9wdGlvbikpIF4gKGNvbmQpKSkKIAogc3RhdGljIGludAotbWF0Y2hfZmxhZ3MoY29uc3Qgc3RydWN0IGlwdF9zY3RwX2ZsYWdfaW5mbyAqZmxhZ19pbmZvLAorbWF0Y2hfZmxhZ3MoY29uc3Qgc3RydWN0IHh0X3NjdHBfZmxhZ19pbmZvICpmbGFnX2luZm8sCiAJICAgIGNvbnN0IGludCBmbGFnX2NvdW50LAogCSAgICB1X2ludDhfdCBjaHVua3R5cGUsCiAJICAgIHVfaW50OF90IGNodW5rZmxhZ3MpCkBAIC0zMiwxNSArNDAsMTUgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIGlubGluZSBpbnQKIG1hdGNoX3BhY2tldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICAgdW5zaWduZWQgaW50IG9mZnNldCwKIAkgICAgIGNvbnN0IHVfaW50MzJfdCAqY2h1bmttYXAsCiAJICAgICBpbnQgY2h1bmtfbWF0Y2hfdHlwZSwKLQkgICAgIGNvbnN0IHN0cnVjdCBpcHRfc2N0cF9mbGFnX2luZm8gKmZsYWdfaW5mbywKKwkgICAgIGNvbnN0IHN0cnVjdCB4dF9zY3RwX2ZsYWdfaW5mbyAqZmxhZ19pbmZvLAogCSAgICAgY29uc3QgaW50IGZsYWdfY291bnQsCiAJICAgICBpbnQgKmhvdGRyb3ApCiB7Ci0JaW50IG9mZnNldDsKIAl1X2ludDMyX3QgY2h1bmttYXBjb3B5WzI1NiAvIHNpemVvZiAodV9pbnQzMl90KV07CiAJc2N0cF9jaHVua2hkcl90IF9zY2gsICpzY2g7CiAKQEAgLTUyLDcgKzYwLDYgQEAKIAkJU0NUUF9DSFVOS01BUF9DT1BZKGNodW5rbWFwY29weSwgY2h1bmttYXApOwogCX0KIAotCW9mZnNldCA9IHNrYi0+bmguaXBoLT5paGwgKiA0ICsgc2l6ZW9mIChzY3RwX3NjdHBoZHJfdCk7CiAJZG8gewogCQlzY2ggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfc2NoKSwgJl9zY2gpOwogCQlpZiAoc2NoID09IE5VTEwpIHsKQEAgLTExOCwxOSArMTI1LDIwIEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewotCWNvbnN0IHN0cnVjdCBpcHRfc2N0cF9pbmZvICppbmZvOworCWNvbnN0IHN0cnVjdCB4dF9zY3RwX2luZm8gKmluZm87CiAJc2N0cF9zY3RwaGRyX3QgX3NoLCAqc2g7CiAKLQlpbmZvID0gKGNvbnN0IHN0cnVjdCBpcHRfc2N0cF9pbmZvICopbWF0Y2hpbmZvOworCWluZm8gPSAoY29uc3Qgc3RydWN0IHh0X3NjdHBfaW5mbyAqKW1hdGNoaW5mbzsKIAogCWlmIChvZmZzZXQpIHsKIAkJZHVwcmludGYoIkRyb3BwaW5nIG5vbi1maXJzdCBmcmFnbWVudC4uIEZJWE1FXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCQotCXNoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCo0LCBzaXplb2YoX3NoKSwgJl9zaCk7CisJc2ggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX3NoKSwgJl9zaCk7CiAJaWYgKHNoID09IE5VTEwpIHsKIAkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVENQIG9mZnNldD0wIHRpbnlncmFtLlxuIik7CiAJCSpob3Rkcm9wID0gMTsKQEAgLTE0MCw2NCArMTQ4LDEwMyBAQAogCiAJcmV0dXJuICBTQ0NIRUNLKCgobnRvaHMoc2gtPnNvdXJjZSkgPj0gaW5mby0+c3B0c1swXSkgCiAJCQkmJiAobnRvaHMoc2gtPnNvdXJjZSkgPD0gaW5mby0+c3B0c1sxXSkpLCAKLQkJICAgCUlQVF9TQ1RQX1NSQ19QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQorCQkgICAJWFRfU0NUUF9TUkNfUE9SVFMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncykKIAkJJiYgU0NDSEVDSygoKG50b2hzKHNoLT5kZXN0KSA+PSBpbmZvLT5kcHRzWzBdKSAKIAkJCSYmIChudG9ocyhzaC0+ZGVzdCkgPD0gaW5mby0+ZHB0c1sxXSkpLCAKLQkJCUlQVF9TQ1RQX0RFU1RfUE9SVFMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncykKLQkJJiYgU0NDSEVDSyhtYXRjaF9wYWNrZXQoc2tiLCBpbmZvLT5jaHVua21hcCwgaW5mby0+Y2h1bmtfbWF0Y2hfdHlwZSwKKwkJCVhUX1NDVFBfREVTVF9QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQorCQkmJiBTQ0NIRUNLKG1hdGNoX3BhY2tldChza2IsIHByb3RvZmYsCisJCQkJCWluZm8tPmNodW5rbWFwLCBpbmZvLT5jaHVua19tYXRjaF90eXBlLAogIAkJCQkJaW5mby0+ZmxhZ19pbmZvLCBpbmZvLT5mbGFnX2NvdW50LCAKIAkJCQkJaG90ZHJvcCksCi0JCQkgICBJUFRfU0NUUF9DSFVOS19UWVBFUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKTsKKwkJCSAgIFhUX1NDVFBfQ0hVTktfVFlQRVMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCSAgIGNvbnN0IHZvaWQgKmluZiwKIAkgICB2b2lkICptYXRjaGluZm8sCiAJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewotCWNvbnN0IHN0cnVjdCBpcHRfc2N0cF9pbmZvICppbmZvOworCWNvbnN0IHN0cnVjdCB4dF9zY3RwX2luZm8gKmluZm87CisJY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAgPSBpbmY7CiAKLQlpbmZvID0gKGNvbnN0IHN0cnVjdCBpcHRfc2N0cF9pbmZvICopbWF0Y2hpbmZvOworCWluZm8gPSAoY29uc3Qgc3RydWN0IHh0X3NjdHBfaW5mbyAqKW1hdGNoaW5mbzsKIAogCXJldHVybiBpcC0+cHJvdG8gPT0gSVBQUk9UT19TQ1RQCi0JCSYmICEoaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykKLQkJJiYgbWF0Y2hzaXplID09IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zY3RwX2luZm8pKQotCQkmJiAhKGluZm8tPmZsYWdzICYgfklQVF9TQ1RQX1ZBTElEX0ZMQUdTKQotCQkmJiAhKGluZm8tPmludmZsYWdzICYgfklQVF9TQ1RQX1ZBTElEX0ZMQUdTKQorCQkmJiAhKGlwLT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykKKwkJJiYgbWF0Y2hzaXplID09IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfc2N0cF9pbmZvKSkKKwkJJiYgIShpbmZvLT5mbGFncyAmIH5YVF9TQ1RQX1ZBTElEX0ZMQUdTKQorCQkmJiAhKGluZm8tPmludmZsYWdzICYgflhUX1NDVFBfVkFMSURfRkxBR1MpCiAJCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+aW5mby0+ZmxhZ3MpCi0JCSYmICgoIShpbmZvLT5mbGFncyAmIElQVF9TQ1RQX0NIVU5LX1RZUEVTKSkgfHwgCisJCSYmICgoIShpbmZvLT5mbGFncyAmIFhUX1NDVFBfQ0hVTktfVFlQRVMpKSB8fCAKIAkJCShpbmZvLT5jaHVua19tYXRjaF90eXBlICYKIAkJCQkoU0NUUF9DSFVOS19NQVRDSF9BTEwgCiAJCQkJfCBTQ1RQX0NIVU5LX01BVENIX0FOWQogCQkJCXwgU0NUUF9DSFVOS19NQVRDSF9PTkxZKSkpOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBzY3RwX21hdGNoID0gCitzdGF0aWMgaW50CitjaGVja2VudHJ5Nihjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgdm9pZCAqaW5mLAorCSAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IHh0X3NjdHBfaW5mbyAqaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwID0gaW5mOworCisJaW5mbyA9IChjb25zdCBzdHJ1Y3QgeHRfc2N0cF9pbmZvICopbWF0Y2hpbmZvOworCisJcmV0dXJuIGlwLT5wcm90byA9PSBJUFBST1RPX1NDVFAKKwkJJiYgIShpcC0+aW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pCisJCSYmIG1hdGNoc2l6ZSA9PSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3NjdHBfaW5mbykpCisJCSYmICEoaW5mby0+ZmxhZ3MgJiB+WFRfU0NUUF9WQUxJRF9GTEFHUykKKwkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5YVF9TQ1RQX1ZBTElEX0ZMQUdTKQorCQkmJiAhKGluZm8tPmludmZsYWdzICYgfmluZm8tPmZsYWdzKQorCQkmJiAoKCEoaW5mby0+ZmxhZ3MgJiBYVF9TQ1RQX0NIVU5LX1RZUEVTKSkgfHwgCisJCQkoaW5mby0+Y2h1bmtfbWF0Y2hfdHlwZSAmCisJCQkJKFNDVFBfQ0hVTktfTUFUQ0hfQUxMIAorCQkJCXwgU0NUUF9DSFVOS19NQVRDSF9BTlkKKwkJCQl8IFNDVFBfQ0hVTktfTUFUQ0hfT05MWSkpKTsKK30KKworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHNjdHBfbWF0Y2ggPSAKIHsgCi0JLmxpc3QgPSB7IE5VTEwsIE5VTEx9LAogCS5uYW1lID0gInNjdHAiLAogCS5tYXRjaCA9ICZtYXRjaCwKIAkuY2hlY2tlbnRyeSA9ICZjaGVja2VudHJ5LAotCS5kZXN0cm95ID0gTlVMTCwKKwkubWUgPSBUSElTX01PRFVMRQorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggc2N0cDZfbWF0Y2ggPSAKK3sgCisJLm5hbWUgPSAic2N0cCIsCisJLm1hdGNoID0gJm1hdGNoLAorCS5jaGVja2VudHJ5ID0gJmNoZWNrZW50cnk2LAogCS5tZSA9IFRISVNfTU9EVUxFCiB9OwogCisKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZzY3RwX21hdGNoKTsKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZzY3RwX21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZzY3RwNl9tYXRjaCk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmc2N0cF9tYXRjaCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZzY3RwX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmc2N0cDZfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnNjdHBfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKIG1vZHVsZV9leGl0KGZpbmkpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJLaXJhbiBLdW1hciBJbW1pZGkiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTWF0Y2ggZm9yIFNDVFAgcHJvdG9jb2wgcGFja2V0cyIpOwotCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRlLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljZTgwOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfc3RhdGUuYwpAQCAtMCwwICsxLDk2IEBACisvKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIGNvbm5lY3Rpb24gdHJhY2tpbmcgaW5mb3JtYXRpb24uICovCisKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDUgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfc3RhdGUuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcFs2XV90YWJsZXMgY29ubmVjdGlvbiB0cmFja2luZyBzdGF0ZSBtYXRjaCBtb2R1bGUiKTsKK01PRFVMRV9BTElBUygiaXB0X3N0YXRlIik7CitNT0RVTEVfQUxJQVMoImlwNnRfc3RhdGUiKTsKKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IHh0X3N0YXRlX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOworCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOworCXVuc2lnbmVkIGludCBzdGF0ZWJpdDsKKworCWlmIChuZl9jdF9pc191bnRyYWNrZWQoc2tiKSkKKwkJc3RhdGViaXQgPSBYVF9TVEFURV9VTlRSQUNLRUQ7CisJZWxzZSBpZiAoIW5mX2N0X2dldF9jdGluZm8oc2tiLCAmY3RpbmZvKSkKKwkJc3RhdGViaXQgPSBYVF9TVEFURV9JTlZBTElEOworCWVsc2UKKwkJc3RhdGViaXQgPSBYVF9TVEFURV9CSVQoY3RpbmZvKTsKKworCXJldHVybiAoc2luZm8tPnN0YXRlbWFzayAmIHN0YXRlYml0KTsKK30KKworc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSBjb25zdCB2b2lkICppcCwKKwkJIHZvaWQgKm1hdGNoaW5mbywKKwkJIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJCSB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9zdGF0ZV9pbmZvKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggc3RhdGVfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInN0YXRlIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggc3RhdGU2X21hdGNoID0geworCS5uYW1lCQk9ICJzdGF0ZSIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCW5lZWRfY29ubnRyYWNrKCk7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmc3RhdGVfbWF0Y2gpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZzdGF0ZTZfbWF0Y2gpOworCWlmIChyZXQgPCAwKQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsJnN0YXRlX21hdGNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmc3RhdGVfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZzdGF0ZTZfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9zdHJpbmcuYyBiL25ldC9uZXRmaWx0ZXIveHRfc3RyaW5nLmMKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9zdHJpbmcuYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9zdHJpbmcuYwppbmRleCBiNWRlZjIwLi43YzdkNWM4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3N0cmluZy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfc3RyaW5nLmMKQEAgLTExLDIzICsxMSwyNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdGV4dHNlYXJjaC5oPgogCiBNT0RVTEVfQVVUSE9SKCJQYWJsbyBOZWlyYSBBeXVzbyA8cGFibG9AZXVyb2Rldi5uZXQ+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBzdHJpbmcgbWF0Y2ggbW9kdWxlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwdF9zdHJpbmciKTsKK01PRFVMRV9BTElBUygiaXA2dF9zdHJpbmciKTsKIAogc3RhdGljIGludCBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKIAkJIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKIAkJIGludCBvZmZzZXQsCisJCSB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKIAkJIGludCAqaG90ZHJvcCkKIHsKIAlzdHJ1Y3QgdHNfc3RhdGUgc3RhdGU7Ci0Jc3RydWN0IGlwdF9zdHJpbmdfaW5mbyAqY29uZiA9IChzdHJ1Y3QgaXB0X3N0cmluZ19pbmZvICopIG1hdGNoaW5mbzsKKwlzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKmNvbmYgPSAoc3RydWN0IHh0X3N0cmluZ19pbmZvICopIG1hdGNoaW5mbzsKIAogCW1lbXNldCgmc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgdHNfc3RhdGUpKTsKIApAQCAtMzYsMTggKzM5LDE4IEBACiAJCQkgICAgICE9IFVJTlRfTUFYKSAmJiAhY29uZi0+aW52ZXJ0OwogfQogCi0jZGVmaW5lIFNUUklOR19URVhUX1BSSVYobSkgKChzdHJ1Y3QgaXB0X3N0cmluZ19pbmZvICopIG0pCisjZGVmaW5lIFNUUklOR19URVhUX1BSSVYobSkgKChzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKikgbSkKIAogc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJCSAgICAgIGNvbnN0IHZvaWQgKmlwLAogCQkgICAgICB2b2lkICptYXRjaGluZm8sCiAJCSAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0Jc3RydWN0IGlwdF9zdHJpbmdfaW5mbyAqY29uZiA9IG1hdGNoaW5mbzsKKwlzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKmNvbmYgPSBtYXRjaGluZm87CiAJc3RydWN0IHRzX2NvbmZpZyAqdHNfY29uZjsKIAotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0cmluZ19pbmZvKSkpCisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3N0cmluZ19pbmZvKSkpCiAJCXJldHVybiAwOwogCiAJLyogRGFtbiwgY2FuJ3QgaGFuZGxlIHRoaXMgY2FzZSBwcm9wZXJseSB3aXRoIGlwdGFibGVzLi4uICovCkBAIC02OSw3ICs3MiwxNCBAQAogCXRleHRzZWFyY2hfZGVzdHJveShTVFJJTkdfVEVYVF9QUklWKG1hdGNoaW5mbyktPmNvbmZpZyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHN0cmluZ19tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggc3RyaW5nX21hdGNoID0geworCS5uYW1lIAkJPSAic3RyaW5nIiwKKwkubWF0Y2ggCQk9IG1hdGNoLAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkuZGVzdHJveSAJPSBkZXN0cm95LAorCS5tZSAJCT0gVEhJU19NT0RVTEUKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHN0cmluZzZfbWF0Y2ggPSB7CiAJLm5hbWUgCQk9ICJzdHJpbmciLAogCS5tYXRjaCAJCT0gbWF0Y2gsCiAJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LApAQCAtNzksMTIgKzg5LDIyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZzdHJpbmdfbWF0Y2gpOworCWludCByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmc3RyaW5nX21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmc3RyaW5nNl9tYXRjaCk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmc3RyaW5nX21hdGNoKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnN0cmluZ19tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmc3RyaW5nX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmc3RyaW5nNl9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF90Y3Btc3MuYyBiL25ldC9uZXRmaWx0ZXIveHRfdGNwbXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNmN2Y1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3RjcG1zcy5jCkBAIC0wLDAgKzEsMTcyIEBACisvKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIFRDUCBNU1MgdmFsdWVzLiAqLworCisvKiBDb3B5cmlnaHQgKEMpIDIwMDAgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+CisgKiBQb3J0aW9ucyAoQykgMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfdGNwbXNzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisKKyNkZWZpbmUgVEhfU1lOIDB4MDIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIFRDUCBNU1MgbWF0Y2ggbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF90Y3Btc3MiKTsKKworLyogUmV0dXJucyAxIGlmIHRoZSBtc3Mgb3B0aW9uIGlzIHNldCBhbmQgbWF0Y2hlZCBieSB0aGUgcmFuZ2UsIDAgb3RoZXJ3aXNlICovCitzdGF0aWMgaW5saW5lIGludAorbXNzb3B0aW9uX21hdGNoKHVfaW50MTZfdCBtaW4sIHVfaW50MTZfdCBtYXgsCisJCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCXVuc2lnbmVkIGludCBwcm90b2ZmLAorCQlpbnQgaW52ZXJ0LAorCQlpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOworCS8qIHRjcC5kb2ZmIGlzIG9ubHkgNCBiaXRzLCBpZS4gbWF4IDE1ICogNCBieXRlcyAqLworCXU4IF9vcHRbMTUgKiA0IC0gc2l6ZW9mKF90Y3BoKV0sICpvcDsKKwl1bnNpZ25lZCBpbnQgaSwgb3B0bGVuOworCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgaGVhZGVyLCBkcm9wIHBhY2tldC4gKi8KKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7CisJaWYgKHRoID09IE5VTEwpCisJCWdvdG8gZHJvcGl0OworCisJLyogTWFsZm9ybWVkLiAqLworCWlmICh0aC0+ZG9mZio0IDwgc2l6ZW9mKCp0aCkpCisJCWdvdG8gZHJvcGl0OworCisJb3B0bGVuID0gdGgtPmRvZmYqNCAtIHNpemVvZigqdGgpOworCWlmICghb3B0bGVuKQorCQlnb3RvIG91dDsKKworCS8qIFRydW5jYXRlZCBvcHRpb25zLiAqLworCW9wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiArIHNpemVvZigqdGgpLCBvcHRsZW4sIF9vcHQpOworCWlmIChvcCA9PSBOVUxMKQorCQlnb3RvIGRyb3BpdDsKKworCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47ICkgeworCQlpZiAob3BbaV0gPT0gVENQT1BUX01TUworCQkgICAgJiYgKG9wdGxlbiAtIGkpID49IFRDUE9MRU5fTVNTCisJCSAgICAmJiBvcFtpKzFdID09IFRDUE9MRU5fTVNTKSB7CisJCQl1X2ludDE2X3QgbXNzdmFsOworCisJCQltc3N2YWwgPSAob3BbaSsyXSA8PCA4KSB8IG9wW2krM107CisJCQkKKwkJCXJldHVybiAobXNzdmFsID49IG1pbiAmJiBtc3N2YWwgPD0gbWF4KSBeIGludmVydDsKKwkJfQorCQlpZiAob3BbaV0gPCAyKSBpKys7CisJCWVsc2UgaSArPSBvcFtpKzFdPzoxOworCX0KK291dDoKKwlyZXR1cm4gaW52ZXJ0OworCisgZHJvcGl0OgorCSpob3Rkcm9wID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IHh0X3RjcG1zc19tYXRjaF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCisJcmV0dXJuIG1zc29wdGlvbl9tYXRjaChpbmZvLT5tc3NfbWluLCBpbmZvLT5tc3NfbWF4LCBza2IsIHByb3RvZmYsCisJCQkgICAgICAgaW5mby0+aW52ZXJ0LCBob3Rkcm9wKTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisgICAgICAgICAgIGNvbnN0IHZvaWQgKmlwaW5mbywKKyAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaXBpbmZvOworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF90Y3Btc3NfbWF0Y2hfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCS8qIE11c3Qgc3BlY2lmeSAtcCB0Y3AgKi8KKwlpZiAoaXAtPnByb3RvICE9IElQUFJPVE9fVENQIHx8IChpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkgeworCQlwcmludGsoInRjcG1zczogT25seSB3b3JrcyBvbiBUQ1AgcGFja2V0c1xuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5Nihjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgdm9pZCAqaXBpbmZvLAorICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCA9IGlwaW5mbzsKKworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF90Y3Btc3NfbWF0Y2hfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCS8qIE11c3Qgc3BlY2lmeSAtcCB0Y3AgKi8KKwlpZiAoaXAtPnByb3RvICE9IElQUFJPVE9fVENQIHx8IChpcC0+aW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pKSB7CisJCXByaW50aygidGNwbXNzOiBPbmx5IHdvcmtzIG9uIFRDUCBwYWNrZXRzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdGNwbXNzX21hdGNoID0geworCS5uYW1lCQk9ICJ0Y3Btc3MiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHRjcG1zczZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInRjcG1zcyIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5NiwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ0Y3Btc3NfbWF0Y2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnRjcG1zczZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnRjcG1zc19tYXRjaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZ0Y3Btc3M2X21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ0Y3Btc3NfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF90Y3B1ZHAuYyBiL25ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5YzgxMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmMKQEAgLTAsMCArMSwzMzQgQEAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJ4X3RhYmxlcyBtYXRjaCBmb3IgVENQIGFuZCBVRFAsIHN1cHBvcnRzIElQdjQgYW5kIElQdjYiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygieHRfdGNwIik7CitNT0RVTEVfQUxJQVMoInh0X3VkcCIpOworTU9EVUxFX0FMSUFTKCJpcHRfdWRwIik7CitNT0RVTEVfQUxJQVMoImlwdF90Y3AiKTsKK01PRFVMRV9BTElBUygiaXA2dF91ZHAiKTsKK01PRFVMRV9BTElBUygiaXA2dF90Y3AiKTsKKworI2lmZGVmIERFQlVHX0lQX0ZJUkVXQUxMX1VTRVIKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisKKy8qIFJldHVybnMgMSBpZiB0aGUgcG9ydCBpcyBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citwb3J0X21hdGNoKHVfaW50MTZfdCBtaW4sIHVfaW50MTZfdCBtYXgsIHVfaW50MTZfdCBwb3J0LCBpbnQgaW52ZXJ0KQoreworCWludCByZXQ7CisKKwlyZXQgPSAocG9ydCA+PSBtaW4gJiYgcG9ydCA8PSBtYXgpIF4gaW52ZXJ0OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3RjcF9maW5kX29wdGlvbih1X2ludDhfdCBvcHRpb24sCisJCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCXVuc2lnbmVkIGludCBwcm90b2ZmLAorCQl1bnNpZ25lZCBpbnQgb3B0bGVuLAorCQlpbnQgaW52ZXJ0LAorCQlpbnQgKmhvdGRyb3ApCit7CisJLyogdGNwLmRvZmYgaXMgb25seSA0IGJpdHMsIGllLiBtYXggMTUgKiA0IGJ5dGVzICovCisJdV9pbnQ4X3QgX29wdFs2MCAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKV0sICpvcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWR1cHJpbnRmKCJ0Y3BfbWF0Y2g6IGZpbmRpbmcgb3B0aW9uXG4iKTsKKworCWlmICghb3B0bGVuKQorCQlyZXR1cm4gaW52ZXJ0OworCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgaGVhZGVyLCBkcm9wIHBhY2tldC4gKi8KKwlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYgKyBzaXplb2Yoc3RydWN0IHRjcGhkciksCisJCQkJb3B0bGVuLCBfb3B0KTsKKwlpZiAob3AgPT0gTlVMTCkgeworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47ICkgeworCQlpZiAob3BbaV0gPT0gb3B0aW9uKSByZXR1cm4gIWludmVydDsKKwkJaWYgKG9wW2ldIDwgMikgaSsrOworCQllbHNlIGkgKz0gb3BbaSsxXT86MTsKKwl9CisKKwlyZXR1cm4gaW52ZXJ0OworfQorCitzdGF0aWMgaW50Cit0Y3BfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICBjb25zdCB2b2lkICptYXRjaGluZm8sCisJICBpbnQgb2Zmc2V0LAorCSAgdW5zaWduZWQgaW50IHByb3RvZmYsCisJICBpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOworCWNvbnN0IHN0cnVjdCB4dF90Y3AgKnRjcGluZm8gPSBtYXRjaGluZm87CisKKwlpZiAob2Zmc2V0KSB7CisJCS8qIFRvIHF1b3RlIEFsYW46CisKKwkJICAgRG9uJ3QgYWxsb3cgYSBmcmFnbWVudCBvZiBUQ1AgOCBieXRlcyBpbi4gTm9ib2R5IG5vcm1hbAorCQkgICBjYXVzZXMgdGhpcy4gSXRzIGEgY3JhY2tlciB0cnlpbmcgdG8gYnJlYWsgaW4gYnkgZG9pbmcgYQorCQkgICBmbGFnIG92ZXJ3cml0ZSB0byBwYXNzIHRoZSBkaXJlY3Rpb24gY2hlY2tzLgorCQkqLworCQlpZiAob2Zmc2V0ID09IDEpIHsKKwkJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MSBmcmFnLlxuIik7CisJCQkqaG90ZHJvcCA9IDE7CisJCX0KKwkJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisjZGVmaW5lIEZXSU5WVENQKGJvb2wsaW52ZmxnKSAoKGJvb2wpIF4gISEodGNwaW5mby0+aW52ZmxhZ3MgJiBpbnZmbGcpKQorCisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCWlmICh0aCA9PSBOVUxMKSB7CisJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCisJCSAgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KKwkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVENQIG9mZnNldD0wIHRpbnlncmFtLlxuIik7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFwb3J0X21hdGNoKHRjcGluZm8tPnNwdHNbMF0sIHRjcGluZm8tPnNwdHNbMV0sCisJCQludG9ocyh0aC0+c291cmNlKSwKKwkJCSEhKHRjcGluZm8tPmludmZsYWdzICYgWFRfVENQX0lOVl9TUkNQVCkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXBvcnRfbWF0Y2godGNwaW5mby0+ZHB0c1swXSwgdGNwaW5mby0+ZHB0c1sxXSwKKwkJCW50b2hzKHRoLT5kZXN0KSwKKwkJCSEhKHRjcGluZm8tPmludmZsYWdzICYgWFRfVENQX0lOVl9EU1RQVCkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIUZXSU5WVENQKCgoKHVuc2lnbmVkIGNoYXIgKil0aClbMTNdICYgdGNwaW5mby0+ZmxnX21hc2spCisJCSAgICAgID09IHRjcGluZm8tPmZsZ19jbXAsCisJCSAgICAgIFhUX1RDUF9JTlZfRkxBR1MpKQorCQlyZXR1cm4gMDsKKwlpZiAodGNwaW5mby0+b3B0aW9uKSB7CisJCWlmICh0aC0+ZG9mZiAqIDQgPCBzaXplb2YoX3RjcGgpKSB7CisJCQkqaG90ZHJvcCA9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXRjcF9maW5kX29wdGlvbih0Y3BpbmZvLT5vcHRpb24sIHNrYiwgcHJvdG9mZiwKKwkJCQkgICAgIHRoLT5kb2ZmKjQgLSBzaXplb2YoX3RjcGgpLAorCQkJCSAgICAgdGNwaW5mby0+aW52ZmxhZ3MgJiBYVF9UQ1BfSU5WX09QVElPTiwKKwkJCQkgICAgIGhvdGRyb3ApKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50Cit0Y3BfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgICAgIGNvbnN0IHZvaWQgKmluZm8sCisJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IGluZm87CisJY29uc3Qgc3RydWN0IHh0X3RjcCAqdGNwaW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBUQ1AsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCisJcmV0dXJuIGlwLT5wcm90byA9PSBJUFBST1RPX1RDUAorCQkmJiAhKGlwLT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykKKwkJJiYgbWF0Y2hzaXplID09IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfdGNwKSkKKwkJJiYgISh0Y3BpbmZvLT5pbnZmbGFncyAmIH5YVF9UQ1BfSU5WX01BU0spOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50Cit0Y3A2X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKKwkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NiA9IGVudHJ5OworCWNvbnN0IHN0cnVjdCB4dF90Y3AgKnRjcGluZm8gPSBtYXRjaGluZm87CisKKwkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gVENQLCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLworCXJldHVybiBpcHY2LT5wcm90byA9PSBJUFBST1RPX1RDUAorCQkmJiAhKGlwdjYtPmludmZsYWdzICYgWFRfSU5WX1BST1RPKQorCQkmJiBtYXRjaHNpemUgPT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF90Y3ApKQorCQkmJiAhKHRjcGluZm8tPmludmZsYWdzICYgflhUX1RDUF9JTlZfTUFTSyk7Cit9CisKKworc3RhdGljIGludAordWRwX21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorCSAgaW50IG9mZnNldCwKKwkgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCSAgaW50ICpob3Rkcm9wKQoreworCXN0cnVjdCB1ZHBoZHIgX3VkcGgsICp1aDsKKwljb25zdCBzdHJ1Y3QgeHRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KKwlpZiAob2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCXVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF91ZHBoKSwgJl91ZHBoKTsKKwlpZiAodWggPT0gTlVMTCkgeworCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQorCQkgICBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuICovCisJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFVEUCB0aW55Z3JhbS5cbiIpOworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBwb3J0X21hdGNoKHVkcGluZm8tPnNwdHNbMF0sIHVkcGluZm8tPnNwdHNbMV0sCisJCQkgIG50b2hzKHVoLT5zb3VyY2UpLAorCQkJICAhISh1ZHBpbmZvLT5pbnZmbGFncyAmIFhUX1VEUF9JTlZfU1JDUFQpKQorCQkmJiBwb3J0X21hdGNoKHVkcGluZm8tPmRwdHNbMF0sIHVkcGluZm8tPmRwdHNbMV0sCisJCQkgICAgICBudG9ocyh1aC0+ZGVzdCksCisJCQkgICAgICAhISh1ZHBpbmZvLT5pbnZmbGFncyAmIFhUX1VEUF9JTlZfRFNUUFQpKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAordWRwX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgICAgICBjb25zdCB2b2lkICppbmZvLAorCSAgICAgICB2b2lkICptYXRjaGluZm8sCisJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAorCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IFVEUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KKwlpZiAoaXAtPnByb3RvICE9IElQUFJPVE9fVURQIHx8IChpcC0+aW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pKSB7CisJCWR1cHJpbnRmKCJpcHRfdWRwOiBQcm90b2NvbCAldSAhPSAldVxuIiwgaXAtPnByb3RvLAorCQkJIElQUFJPVE9fVURQKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChtYXRjaGluZm9zaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfdWRwKSkpIHsKKwkJZHVwcmludGYoImlwdF91ZHA6IG1hdGNoc2l6ZSAldSAhPSAldVxuIiwKKwkJCSBtYXRjaGluZm9zaXplLCBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3VkcCkpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh1ZHBpbmZvLT5pbnZmbGFncyAmIH5YVF9VRFBfSU5WX01BU0spIHsKKwkJZHVwcmludGYoImlwdF91ZHA6IHVua25vd24gZmxhZ3MgJVhcbiIsCisJCQkgdWRwaW5mby0+aW52ZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAordWRwNl9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCisJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCisJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2ID0gZW50cnk7CisJY29uc3Qgc3RydWN0IHh0X3VkcCAqdWRwaW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBVRFAsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCisJaWYgKGlwdjYtPnByb3RvICE9IElQUFJPVE9fVURQIHx8IChpcHY2LT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykpIHsKKwkJZHVwcmludGYoImlwNnRfdWRwOiBQcm90b2NvbCAldSAhPSAldVxuIiwgaXB2Ni0+cHJvdG8sCisJCQkgSVBQUk9UT19VRFApOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG1hdGNoaW5mb3NpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF91ZHApKSkgeworCQlkdXByaW50ZigiaXA2dF91ZHA6IG1hdGNoc2l6ZSAldSAhPSAldVxuIiwKKwkJCSBtYXRjaGluZm9zaXplLCBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3VkcCkpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh1ZHBpbmZvLT5pbnZmbGFncyAmIH5YVF9VRFBfSU5WX01BU0spIHsKKwkJZHVwcmludGYoImlwNnRfdWRwOiB1bmtub3duIGZsYWdzICVYXG4iLAorCQkJIHVkcGluZm8tPmludmZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdGNwX21hdGNoc3RydWN0ID0geworCS5uYW1lCQk9ICJ0Y3AiLAorCS5tYXRjaAkJPSAmdGNwX21hdGNoLAorCS5jaGVja2VudHJ5CT0gJnRjcF9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHRjcDZfbWF0Y2hzdHJ1Y3QgPSB7CisJLm5hbWUJCT0gInRjcCIsCisJLm1hdGNoCQk9ICZ0Y3BfbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmdGNwNl9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdWRwX21hdGNoc3RydWN0ID0geworCS5uYW1lCQk9ICJ1ZHAiLAorCS5tYXRjaAkJPSAmdWRwX21hdGNoLAorCS5jaGVja2VudHJ5CT0gJnVkcF9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHVkcDZfbWF0Y2hzdHJ1Y3QgPSB7CisJLm5hbWUJCT0gInVkcCIsCisJLm1hdGNoCQk9ICZ1ZHBfbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmdWRwNl9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ0Y3BfbWF0Y2hzdHJ1Y3QpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnRjcDZfbWF0Y2hzdHJ1Y3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnX3RjcDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ1ZHBfbWF0Y2hzdHJ1Y3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnX3RjcDY7CisJCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZ1ZHA2X21hdGNoc3RydWN0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bnJlZ191ZHA7CisKKwlyZXR1cm4gcmV0OworCitvdXRfdW5yZWdfdWRwOgorCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnRjcF9tYXRjaHN0cnVjdCk7CitvdXRfdW5yZWdfdGNwNjoKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmdGNwNl9tYXRjaHN0cnVjdCk7CitvdXRfdW5yZWdfdGNwOgorCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnRjcF9tYXRjaHN0cnVjdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmdWRwNl9tYXRjaHN0cnVjdCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmdWRwX21hdGNoc3RydWN0KTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmdGNwNl9tYXRjaHN0cnVjdCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmdGNwX21hdGNoc3RydWN0KTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2dlbmV0bGluay5jIGIvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMKaW5kZXggM2IxMzc4NC4uNGFlMTUzOCAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMKQEAgLTIyMiwxMSArMjIyLDYgQEAKIAkJZ290byBlcnJvdXRfbG9ja2VkOwogCX0KIAotCWlmICghdHJ5X21vZHVsZV9nZXQoZmFtaWx5LT5vd25lcikpIHsKLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIGVycm91dF9sb2NrZWQ7Ci0JfQotCiAJaWYgKGZhbWlseS0+aWQgPT0gR0VOTF9JRF9HRU5FUkFURSkgewogCQl1MTYgbmV3aWQgPSBnZW5sX2dlbmVyYXRlX2lkKCk7CiAKQEAgLTI4Myw3ICsyNzgsNiBAQAogCQlJTklUX0xJU1RfSEVBRCgmZmFtaWx5LT5vcHNfbGlzdCk7CiAJCWdlbmxfdW5sb2NrKCk7CiAKLQkJbW9kdWxlX3B1dChmYW1pbHktPm93bmVyKTsKIAkJa2ZyZWUoZmFtaWx5LT5hdHRyYnVmKTsKIAkJZ2VubF9jdHJsX2V2ZW50KENUUkxfQ01EX0RFTEZBTUlMWSwgZmFtaWx5KTsKIAkJcmV0dXJuIDA7CkBAIC01MzUsNyArNTI5LDYgQEAKIAkubmFtZSA9ICJubGN0cmwiLAogCS52ZXJzaW9uID0gMHgxLAogCS5tYXhhdHRyID0gQ1RSTF9BVFRSX01BWCwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGdlbmxfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL0tjb25maWcgYi9uZXQvc2NoZWQvS2NvbmZpZwppbmRleCA4YTI2MGQ0Li43NzhiMWU1IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvS2NvbmZpZworKysgYi9uZXQvc2NoZWQvS2NvbmZpZwpAQCAtNDQsNyArNDQsNyBAQAogCiBjaG9pY2UKIAlwcm9tcHQgIlBhY2tldCBzY2hlZHVsZXIgY2xvY2sgc291cmNlIgotCWRlZmF1bHQgTkVUX1NDSF9DTEtfSklGRklFUworCWRlZmF1bHQgTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZCiAJLS0taGVscC0tLQogCSAgUGFja2V0IHNjaGVkdWxlcnMgbmVlZCBhIG1vbm90b25pYyBjbG9jayB0aGF0IGluY3JlbWVudHMgYXQgYSBzdGF0aWMKIAkgIHJhdGUuIFRoZSBrZXJuZWwgcHJvdmlkZXMgc2V2ZXJhbCBzdWl0YWJsZSBpbnRlcmZhY2VzLCBlYWNoIHdpdGgKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfaXB0LmMgYi9uZXQvc2NoZWQvYWN0X2lwdC5jCmluZGV4IGI1MDAxOTMuLjM5YTIyYTMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfaXB0LmMKKysrIGIvbmV0L3NjaGVkL2FjdF9pcHQuYwpAQCAtNjIsNyArNjIsNyBAQAogCXN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQ7CiAJaW50IHJldCA9IDA7CiAKLQl0YXJnZXQgPSBpcHRfZmluZF90YXJnZXQodC0+dS51c2VyLm5hbWUsIHQtPnUudXNlci5yZXZpc2lvbik7CisJdGFyZ2V0ID0geHRfZmluZF90YXJnZXQoQUZfSU5FVCwgdC0+dS51c2VyLm5hbWUsIHQtPnUudXNlci5yZXZpc2lvbik7CiAJaWYgKCF0YXJnZXQpCiAJCXJldHVybiAtRU5PRU5UOwogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pcHY2LmMgYi9uZXQvc2N0cC9pcHY2LmMKaW5kZXggMDRjN2ZhYi4uMmUyNjYxMiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaXB2Ni5jCisrKyBiL25ldC9zY3RwL2lwdjYuYwpAQCAtMTgwLDggKzE4MCw3IEBACiAJfQogCiAJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBza2I6JXAsIGxlbjolZCwgIgotCQkJICAic3JjOiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAiCi0JCQkgICJkc3Q6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4XG4iLAorCQkJICAic3JjOiIgTklQNl9GTVQgIiBkc3Q6IiBOSVA2X0ZNVCAiXG4iLAogCQkJICBfX0ZVTkNUSU9OX18sIHNrYiwgc2tiLT5sZW4sCiAJCQkgIE5JUDYoZmwuZmw2X3NyYyksIE5JUDYoZmwuZmw2X2RzdCkpOwogCkBAIC0yMDYsMTMgKzIwNSwxMyBAQAogCQlmbC5vaWYgPSBkYWRkci0+djYuc2luNl9zY29wZV9pZDsKIAkKIAotCVNDVFBfREVCVUdfUFJJTlRLKCIlczogRFNUPSUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAiLAorCVNDVFBfREVCVUdfUFJJTlRLKCIlczogRFNUPSIgTklQNl9GTVQgIiAiLAogCQkJICBfX0ZVTkNUSU9OX18sIE5JUDYoZmwuZmw2X2RzdCkpOwogCiAJaWYgKHNhZGRyKSB7CiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmc2FkZHItPnY2LnNpbjZfYWRkcik7CiAJCVNDVFBfREVCVUdfUFJJTlRLKAotCQkJIlNSQz0lMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHggLSAiLAorCQkJIlNSQz0iIE5JUDZfRk1UICIgLSAiLAogCQkJTklQNihmbC5mbDZfc3JjKSk7CiAJfQogCkBAIC0yMjEsOCArMjIwLDcgQEAKIAkJc3RydWN0IHJ0Nl9pbmZvICpydDsKIAkJcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopZHN0OwogCQlTQ1RQX0RFQlVHX1BSSU5USygKLQkJCSJydDZfZHN0OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAiCi0JCQkicnQ2X3NyYzolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJCQkicnQ2X2RzdDoiIE5JUDZfRk1UICIgcnQ2X3NyYzoiIE5JUDZfRk1UICJcbiIsCiAJCQlOSVA2KHJ0LT5ydDZpX2RzdC5hZGRyKSwgTklQNihydC0+cnQ2aV9zcmMuYWRkcikpOwogCX0gZWxzZSB7CiAJCVNDVFBfREVCVUdfUFJJTlRLKCJOTyBST1VURVxuIik7CkBAIC0yNzEsMTMgKzI2OSwxMiBAQAogCV9fdTggYm1hdGNobGVuOwogCiAJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBhc29jOiVwIGRzdDolcCAiCi0JCQkgICJkYWRkcjolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHggIiwKKwkJCSAgImRhZGRyOiIgTklQNl9GTVQgIiAiLAogCQkJICBfX0ZVTkNUSU9OX18sIGFzb2MsIGRzdCwgTklQNihkYWRkci0+djYuc2luNl9hZGRyKSk7CiAKIAlpZiAoIWFzb2MpIHsKIAkJaXB2Nl9nZXRfc2FkZHIoZHN0LCAmZGFkZHItPnY2LnNpbjZfYWRkciwmc2FkZHItPnY2LnNpbjZfYWRkcik7Ci0JCVNDVFBfREVCVUdfUFJJTlRLKCJzYWRkciBmcm9tIGlwdjZfZ2V0X3NhZGRyOiAiCi0JCQkJICAiJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4XG4iLAorCQlTQ1RQX0RFQlVHX1BSSU5USygic2FkZHIgZnJvbSBpcHY2X2dldF9zYWRkcjogIiBOSVA2X0ZNVCAiXG4iLAogCQkJCSAgTklQNihzYWRkci0+djYuc2luNl9hZGRyKSk7CiAJCXJldHVybjsKIAl9CkBAIC0zMDUsMTMgKzMwMiwxMSBAQAogCiAJaWYgKGJhZGRyKSB7CiAJCW1lbWNweShzYWRkciwgYmFkZHIsIHNpemVvZih1bmlvbiBzY3RwX2FkZHIpKTsKLQkJU0NUUF9ERUJVR19QUklOVEsoInNhZGRyOiAiCi0JCQkJICAiJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4XG4iLAorCQlTQ1RQX0RFQlVHX1BSSU5USygic2FkZHI6ICIgTklQNl9GTVQgIlxuIiwKIAkJCQkgIE5JUDYoc2FkZHItPnY2LnNpbjZfYWRkcikpOwogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGFzb2M6JXAgQ291bGQgbm90IGZpbmQgYSB2YWxpZCBzb3VyY2UgIgotCQkgICAgICAgImFkZHJlc3MgZm9yIHRoZSAiCi0JCSAgICAgICAiZGVzdDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJCSAgICAgICAiYWRkcmVzcyBmb3IgdGhlIGRlc3Q6IiBOSVA2X0ZNVCAiXG4iLAogCQkgICAgICAgX19GVU5DVElPTl9fLCBhc29jLCBOSVA2KGRhZGRyLT52Ni5zaW42X2FkZHIpKTsKIAl9CiAKQEAgLTY3NSw4ICs2NzAsNyBAQAogLyogRHVtcCB0aGUgdjYgYWRkciB0byB0aGUgc2VxIGZpbGUuICovCiBzdGF0aWMgdm9pZCBzY3RwX3Y2X3NlcV9kdW1wX2FkZHIoc3RydWN0IHNlcV9maWxlICpzZXEsIHVuaW9uIHNjdHBfYWRkciAqYWRkcikKIHsKLQlzZXFfcHJpbnRmKHNlcSwgIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAiLAotCQkgICBOSVA2KGFkZHItPnY2LnNpbjZfYWRkcikpOworCXNlcV9wcmludGYoc2VxLCBOSVA2X0ZNVCAiICIsIE5JUDYoYWRkci0+djYuc2luNl9hZGRyKSk7CiB9CiAKIC8qIEluaXRpYWxpemUgYSBQRl9JTkVUNiBzb2NrZXQgbXNnX25hbWUuICovCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYyBiL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCmluZGV4IDU1N2E3ZDkuLjQ3N2Q3ZjggMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCisrKyBiL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCkBAIC0xMDM2LDE0ICsxMDM2LDE0IEBACiAJCWlmIChmcm9tX2FkZHIuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkgICAgICAgIiVzIGFzc29jaWF0aW9uICVwIGNvdWxkIG5vdCBmaW5kIGFkZHJlc3MgIgotCQkJICAgICAgICIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJCQkgICAgICAgTklQNl9GTVQgIlxuIiwKIAkJCSAgICAgICBfX0ZVTkNUSU9OX18sCiAJCQkgICAgICAgYXNvYywKIAkJCSAgICAgICBOSVA2KGZyb21fYWRkci52Ni5zaW42X2FkZHIpKTsKIAkJfSBlbHNlIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiJXMgYXNzb2NpYXRpb24gJXAgY291bGQgbm90IGZpbmQgYWRkcmVzcyAiCi0JCQkgICAgICAgIiV1LiV1LiV1LiV1XG4iLAorCQkJICAgICAgIE5JUFFVQURfRk1UICJcbiIsCiAJCQkgICAgICAgX19GVU5DVElPTl9fLAogCQkJICAgICAgIGFzb2MsCiAJCQkgICAgICAgTklQUVVBRChmcm9tX2FkZHIudjQuc2luX2FkZHIuc19hZGRyKSk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9LY29uZmlnIGIvbmV0L3RpcGMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWFiMThlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvS2NvbmZpZwpAQCAtMCwwICsxLDExMiBAQAorIworIyBUSVBDIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gSU5FVCAmJiBFWFBFUklNRU5UQUwKKworY29uZmlnIFRJUEMKKwl0cmlzdGF0ZSAiVGhlIFRJUEMgUHJvdG9jb2wgKEVYUEVSSU1FTlRBTCkiCisJLS0taGVscC0tLQorCSAgVEJELgorCisJICBUaGlzIHByb3RvY29sIHN1cHBvcnQgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2gKKwkgIGNhbiBiZSBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3UKKwkgIHdhbnQpLiBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRpcGMuIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQKKwkgIGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBUSVBDX0FEVkFOQ0VECisJYm9vbCAiVElQQzogQWR2YW5jZWQgY29uZmlndXJhdGlvbiIKKwlkZXBlbmRzIG9uIFRJUEMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXlpbmcgWSBoZXJlIHdpbGwgb3BlbiBzb21lIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICBmb3IgVElQQy4gTW9zdCB1c2VycyBkbyBub3QgbmVlZCB0byBib3RoZXIsIHNvIGlmCisgICAgICAgICAgdW5zdXJlLCBqdXN0IHNheSBOLgorCitjb25maWcgVElQQ19aT05FUworCWludCAiTWF4aW11bSBudW1iZXIgb2Ygem9uZXMgaW4gbmV0d29yayIKKwlkZXBlbmRzIG9uIFRJUEMgJiYgVElQQ19BRFZBTkNFRAorCWRlZmF1bHQgIjMiCisJaGVscAorCSBNYXggbnVtYmVyIG9mIHpvbmVzIGluc2lkZSBUSVBDIG5ldHdvcmsuIE1heCBzdXBwb3J0ZWQgdmFsdWUgCisgICAgICAgICBpcyAyNTUgem9uZXMsIG1pbmltdW0gaXMgMQorCisJIERlZmF1bHQgaXMgMyB6b25lcyBpbiBhIG5ldHdvcms7IHNldHRpbmcgdGhpcyB0byBoaWdoZXIKKwkgYWxsb3dzIG1vcmUgem9uZXMgYnV0IG1pZ2h0IHVzZSBtb3JlIG1lbW9yeS4KKworY29uZmlnIFRJUENfQ0xVU1RFUlMKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIGNsdXN0ZXJzIGluIGEgem9uZSIKKwlkZXBlbmRzIG9uIFRJUEMgJiYgVElQQ19BRFZBTkNFRAorCWRlZmF1bHQgIjEiCisJaGVscAorICAgICAgICAgICoqKk9ubHkgMSAob25lIGNsdXN0ZXIgaW4gYSB6b25lKSBpcyBzdXBwb3J0ZWQgYnkgY3VycmVudCBjb2RlLgorICAgICAgICAgIEFueSB2YWx1ZSBzZXQgaGVyZSB3aWxsIGJlIG92ZXJyaWRkZW4uKioqCisKKyAgICAgICAgICAoTWF4IG51bWJlciBvZiBjbHVzdGVycyBpbnNpZGUgVElQQyB6b25lLiBNYXggc3VwcG9ydGVkIAorICAgICAgICAgIHZhbHVlIGlzIDQwOTUgY2x1c3RlcnMsIG1pbmltdW0gaXMgMS4KKworCSAgRGVmYXVsdCBpcyAxOyBzZXR0aW5nIHRoaXMgdG8gc21hbGxlciB2YWx1ZSBtaWdodCBzYXZlIAorICAgICAgICAgIHNvbWUgbWVtb3J5LCBzZXR0aW5nIGl0IHRvIGhpZ2hlcgorCSAgYWxsb3dzIG1vcmUgY2x1c3RlcnMgYW5kIG1pZ2h0IGNvbnN1bWUgbW9yZSBtZW1vcnkuKQorCitjb25maWcgVElQQ19OT0RFUworCWludCAiTWF4aW11bSBudW1iZXIgb2Ygbm9kZXMgaW4gY2x1c3RlciIKKwlkZXBlbmRzIG9uIFRJUEMgJiYgVElQQ19BRFZBTkNFRAorCWRlZmF1bHQgIjI1NSIKKwloZWxwCisJICBNYXhpbXVtIG51bWJlciBvZiBub2RlcyBpbnNpZGUgYSBUSVBDIGNsdXN0ZXIuIE1heGltdW0gCisgICAgICAgICAgc3VwcG9ydGVkIHZhbHVlIGlzIDIwNDcgbm9kZXMsIG1pbmltdW0gaXMgOC4gCisKKwkgIFNldHRpbmcgdGhpcyB0byBhIHNtYWxsZXIgdmFsdWUgc2F2ZXMgc29tZSBtZW1vcnksIAorCSAgc2V0dGluZyBpdCB0byBoaWdoZXIgYWxsb3dzIG1vcmUgbm9kZXMuCisKK2NvbmZpZyBUSVBDX1NMQVZFX05PREVTCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiBzbGF2ZSBub2RlcyBpbiBjbHVzdGVyIgorCWRlcGVuZHMgb24gVElQQyAmJiBUSVBDX0FEVkFOQ0VECisJZGVmYXVsdCAiMCIKKwloZWxwCisgICAgICAgICAgKioqVGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudCBjb2RlLioqKgorCSAgCisJICBNYXhpbXVtIG51bWJlciBvZiBzbGF2ZSBub2RlcyBpbnNpZGUgYSBUSVBDIGNsdXN0ZXIuIE1heGltdW0gCisgICAgICAgICAgc3VwcG9ydGVkIHZhbHVlIGlzIDIwNDcgbm9kZXMsIG1pbmltdW0gaXMgMC4gCisKKwkgIFNldHRpbmcgdGhpcyB0byBhIHNtYWxsZXIgdmFsdWUgc2F2ZXMgc29tZSBtZW1vcnksIAorCSAgc2V0dGluZyBpdCB0byBoaWdoZXIgYWxsb3dzIG1vcmUgbm9kZXMuCisKK2NvbmZpZyBUSVBDX1BPUlRTCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiBwb3J0cyBpbiBhIG5vZGUiCisJZGVwZW5kcyBvbiBUSVBDICYmIFRJUENfQURWQU5DRUQKKwlkZWZhdWx0ICI4MTkxIgorCWhlbHAKKwkgIE1heGltdW0gbnVtYmVyIG9mIHBvcnRzIHdpdGhpbiBhIG5vZGUuIE1heGltdW0gCisgICAgICAgICAgc3VwcG9ydGVkIHZhbHVlIGlzIDY0NTM1IG5vZGVzLCBtaW5pbXVtIGlzIDEyNy4gCisKKwkgIFNldHRpbmcgdGhpcyB0byBhIHNtYWxsZXIgdmFsdWUgc2F2ZXMgc29tZSBtZW1vcnksIAorCSAgc2V0dGluZyBpdCB0byBoaWdoZXIgYWxsb3dzIG1vcmUgcG9ydHMuCisKK2NvbmZpZyBUSVBDX0xPRworCWludCAiU2l6ZSBvZiBsb2cgYnVmZmVyIgorCWRlcGVuZHMgb24gVElQQyAmJiBUSVBDX0FEVkFOQ0VECisJZGVmYXVsdCAwCisJaGVscAorIAkgIFNpemUgKGluIGJ5dGVzKSBvZiBUSVBDJ3MgaW50ZXJuYWwgbG9nIGJ1ZmZlciwgd2hpY2ggcmVjb3JkcyB0aGUKKwkgIG9jY3VycmVuY2Ugb2Ygc2lnbmlmaWNhbnQgZXZlbnRzLiAgTWF4aW11bSBzdXBwb3J0ZWQgdmFsdWUKKwkgIGlzIDMyNzY4IGJ5dGVzLCBtaW5pbXVtIGlzIDAuCisKKwkgIFRoZXJlIGlzIG5vIG5lZWQgdG8gZW5hYmxlIHRoZSBsb2cgYnVmZmVyIHVubGVzcyB0aGUgbm9kZSB3aWxsIGJlCisJICBtYW5hZ2VkIHJlbW90ZWx5IHZpYSBUSVBDLgorCitjb25maWcgVElQQ19ERUJVRworCWJvb2wgIkVuYWJsZSBkZWJ1Z2dpbmcgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRJUEMKKwlkZWZhdWx0IG4KKwloZWxwCisgCSAgVGhpcyB3aWxsIGVuYWJsZSBkZWJ1Z2dpbmcgb2YgVElQQy4KKworCSAgT25seSBzYXkgWSBoZXJlIGlmIHlvdSBhcmUgaGF2aW5nIHRyb3VibGUgd2l0aCBUSVBDLiAgSXQgd2lsbAorCSAgZW5hYmxlIHRoZSBkaXNwbGF5IG9mIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaXMgZ29pbmcgb24uCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL25ldC90aXBjL01ha2VmaWxlIGIvbmV0L3RpcGMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlYjcwMgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBUSVBDIGxheWVyCisjCisKK29iai0kKENPTkZJR19USVBDKSA6PSB0aXBjLm8KKwordGlwYy15CSs9IGFkZHIubyBiY2FzdC5vIGJlYXJlci5vIGNvbmZpZy5vIGNsdXN0ZXIubyBcCisJICAgY29yZS5vIGhhbmRsZXIubyBsaW5rLm8gZGlzY292ZXIubyBtc2cubyAgXAorCSAgIG5hbWVfZGlzdHIubyAgc3Vic2NyLm8gbmFtZV90YWJsZS5vIG5ldC5vICBcCisJICAgbmV0bGluay5vIG5vZGUubyBub2RlX3N1YnNjci5vIHBvcnQubyByZWYubyAgXAorCSAgIHNvY2tldC5vIHVzZXJfcmVnLm8gem9uZS5vIGRiZy5vIGV0aF9tZWRpYS5vCisKKyMgRW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25ldC90aXBjL2FkZHIuYyBiL25ldC90aXBjL2FkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2EyMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvYWRkci5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBuZXQvdGlwYy9hZGRyLmM6IFRJUEMgYWRkcmVzcyB1dGlsaXR5IHJvdXRpbmVzCisgKiAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgInpvbmUuaCIKKyNpbmNsdWRlICJjbHVzdGVyLmgiCisjaW5jbHVkZSAibmV0LmgiCisKK3UzMiB0aXBjX2dldF9hZGRyKHZvaWQpCit7CisJcmV0dXJuIHRpcGNfb3duX2FkZHI7Cit9CisKKy8qKgorICogYWRkcl9kb21haW5fdmFsaWQgLSB2YWxpZGF0ZXMgYSBuZXR3b3JrIGRvbWFpbiBhZGRyZXNzCisgKiAKKyAqIEFjY2VwdHMgPFouQy5OPiwgPFouQy4wPiwgPFouMC4wPiwgYW5kIDwwLjAuMD4sIAorICogd2hlcmUgWiwgQywgYW5kIE4gYXJlIG5vbi16ZXJvIGFuZCBkbyBub3QgZXhjZWVkIHRoZSBjb25maWd1cmVkIGxpbWl0cy4KKyAqIAorICogUmV0dXJucyAxIGlmIGRvbWFpbiBhZGRyZXNzIGlzIHZhbGlkLCBvdGhlcndpc2UgMAorICovCisKK2ludCBhZGRyX2RvbWFpbl92YWxpZCh1MzIgYWRkcikKK3sKKwl1MzIgbiA9IHRpcGNfbm9kZShhZGRyKTsKKwl1MzIgYyA9IHRpcGNfY2x1c3RlcihhZGRyKTsKKwl1MzIgeiA9IHRpcGNfem9uZShhZGRyKTsKKwl1MzIgbWF4X25vZGVzID0gdGlwY19tYXhfbm9kZXM7CisKKwlpZiAoaXNfc2xhdmUoYWRkcikpCisJCW1heF9ub2RlcyA9IExPV0VTVF9TTEFWRSArIHRpcGNfbWF4X3NsYXZlczsKKwlpZiAobiA+IG1heF9ub2RlcykKKwkJcmV0dXJuIDA7CisJaWYgKGMgPiB0aXBjX21heF9jbHVzdGVycykKKwkJcmV0dXJuIDA7CisJaWYgKHogPiB0aXBjX21heF96b25lcykKKwkJcmV0dXJuIDA7CisKKwlpZiAobiAmJiAoIXogfHwgIWMpKQorCQlyZXR1cm4gMDsKKwlpZiAoYyAmJiAheikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogYWRkcl9ub2RlX3ZhbGlkIC0gdmFsaWRhdGVzIGEgcHJvcG9zZWQgbmV0d29yayBhZGRyZXNzIGZvciB0aGlzIG5vZGUKKyAqIAorICogQWNjZXB0cyA8Wi5DLk4+LCB3aGVyZSBaLCBDLCBhbmQgTiBhcmUgbm9uLXplcm8gYW5kIGRvIG5vdCBleGNlZWQgCisgKiB0aGUgY29uZmlndXJlZCBsaW1pdHMuCisgKiAKKyAqIFJldHVybnMgMSBpZiBhZGRyZXNzIGNhbiBiZSB1c2VkLCBvdGhlcndpc2UgMAorICovCisKK2ludCBhZGRyX25vZGVfdmFsaWQodTMyIGFkZHIpCit7CisJcmV0dXJuIChhZGRyX2RvbWFpbl92YWxpZChhZGRyKSAmJiB0aXBjX25vZGUoYWRkcikpOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9hZGRyLmggYi9uZXQvdGlwYy9hZGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjYTcxNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2FkZHIuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIG5ldC90aXBjL2FkZHIuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIGFkZHJlc3MgdXRpbGl0eSByb3V0aW5lcworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfQUREUl9ICisjZGVmaW5lIF9USVBDX0FERFJfSAorCitzdGF0aWMgaW5saW5lIHUzMiBvd25fbm9kZSh2b2lkKQoreworCXJldHVybiB0aXBjX25vZGUodGlwY19vd25fYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG93bl9jbHVzdGVyKHZvaWQpCit7CisJcmV0dXJuIHRpcGNfY2x1c3Rlcih0aXBjX293bl9hZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgb3duX3pvbmUodm9pZCkKK3sKKwlyZXR1cm4gdGlwY196b25lKHRpcGNfb3duX2FkZHIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbl9vd25fY2x1c3Rlcih1MzIgYWRkcikKK3sKKwlyZXR1cm4gISgoYWRkciBeIHRpcGNfb3duX2FkZHIpID4+IDEyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW5fb3duX3pvbmUodTMyIGFkZHIpCit7CisJcmV0dXJuICEoKGFkZHIgXiB0aXBjX293bl9hZGRyKSA+PiAyNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NsYXZlKHUzMiBhZGRyKQoreworCXJldHVybiBhZGRyICYgMHg4MDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1heV9yb3V0ZSh1MzIgYWRkcikKK3sKKwlyZXR1cm4oYWRkciBeIHRpcGNfb3duX2FkZHIpID4+IDExOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbl9zY29wZSh1MzIgZG9tYWluLCB1MzIgYWRkcikKK3sKKwlpZiAoIWRvbWFpbiB8fCAoZG9tYWluID09IGFkZHIpKQorCQlyZXR1cm4gMTsKKwlpZiAoZG9tYWluID09IChhZGRyICYgMHhmZmZmZjAwMHUpKSAvKiBkb21haW4gPFouQy4wPiAqLworCQlyZXR1cm4gMTsKKwlpZiAoZG9tYWluID09IChhZGRyICYgMHhmZjAwMDAwMHUpKSAvKiBkb21haW4gPFouMC4wPiAqLworCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhZGRyX3Njb3BlIC0gY29udmVydCBtZXNzYWdlIGxvb2t1cCBkb21haW4gdG8gZXF1aXZhbGVudCAyLWJpdCBzY29wZSB2YWx1ZQorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGFkZHJfc2NvcGUodTMyIGRvbWFpbikKK3sKKwlpZiAobGlrZWx5KCFkb21haW4pKQorCQlyZXR1cm4gVElQQ19aT05FX1NDT1BFOworCWlmICh0aXBjX25vZGUoZG9tYWluKSkKKwkJcmV0dXJuIFRJUENfTk9ERV9TQ09QRTsKKwlpZiAodGlwY19jbHVzdGVyKGRvbWFpbikpCisJCXJldHVybiBUSVBDX0NMVVNURVJfU0NPUEU7CisJcmV0dXJuIFRJUENfWk9ORV9TQ09QRTsKK30KKworLyoqCisgKiBhZGRyX2RvbWFpbiAtIGNvbnZlcnQgMi1iaXQgc2NvcGUgdmFsdWUgdG8gZXF1aXZhbGVudCBtZXNzYWdlIGxvb2t1cCBkb21haW4KKyAqICAKKyAqIE5lZWRlZCB3aGVuIGFkZHJlc3Mgb2YgYSBuYW1lZCBtZXNzYWdlIG11c3QgYmUgbG9va2VkIHVwIGEgc2Vjb25kIHRpbWUgCisgKiBhZnRlciBhIG5ldHdvcmsgaG9wLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGFkZHJfZG9tYWluKGludCBzYykKK3sKKwlpZiAobGlrZWx5KHNjID09IFRJUENfTk9ERV9TQ09QRSkpCisJCXJldHVybiB0aXBjX293bl9hZGRyOworCWlmIChzYyA9PSBUSVBDX0NMVVNURVJfU0NPUEUpCisJCXJldHVybiB0aXBjX2FkZHIodGlwY196b25lKHRpcGNfb3duX2FkZHIpLAorCQkJCSB0aXBjX2NsdXN0ZXIodGlwY19vd25fYWRkciksIDApOworCXJldHVybiB0aXBjX2FkZHIodGlwY196b25lKHRpcGNfb3duX2FkZHIpLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICphZGRyX3N0cmluZ19maWxsKGNoYXIgKnN0cmluZywgdTMyIGFkZHIpCit7CisJc25wcmludGYoc3RyaW5nLCAxNiwgIjwldS4ldS4ldT4iLAorCQkgdGlwY196b25lKGFkZHIpLCB0aXBjX2NsdXN0ZXIoYWRkciksIHRpcGNfbm9kZShhZGRyKSk7CisJcmV0dXJuIHN0cmluZzsKK30KKworaW50IGFkZHJfZG9tYWluX3ZhbGlkKHUzMik7CitpbnQgYWRkcl9ub2RlX3ZhbGlkKHUzMiBhZGRyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iY2FzdC5jIGIvbmV0L3RpcGMvYmNhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzEzZDYyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvYmNhc3QuYwpAQCAtMCwwICsxLDgwNiBAQAorLyoKKyAqIG5ldC90aXBjL2JjYXN0LmM6IFRJUEMgYnJvYWRjYXN0IGNvZGUKKyAqICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJub2RlLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgImFkZHIuaCIKKyNpbmNsdWRlICJub2RlX3N1YnNjci5oIgorI2luY2x1ZGUgIm5hbWVfZGlzdHIuaCIKKyNpbmNsdWRlICJiZWFyZXIuaCIKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisjaW5jbHVkZSAiYmNhc3QuaCIKKworCisjZGVmaW5lIE1BWF9QS1RfREVGQVVMVF9NQ0FTVCAxNTAwCS8qIGJjYXN0IGxpbmsgbWF4IHBhY2tldCBzaXplIChmaXhlZCkgKi8KKworI2RlZmluZSBCQ0xJTktfV0lOX0RFRkFVTFQgMjAJCS8qIGJjYXN0IGxpbmsgd2luZG93IHNpemUgKGRlZmF1bHQpICovCisKKyNkZWZpbmUgQkNMSU5LX0xPR19CVUZfU0laRSAwCisKKy8qKgorICogc3RydWN0IGJjYmVhcmVyX3BhaXIgLSBhIHBhaXIgb2YgYmVhcmVycyB1c2VkIGJ5IGJyb2FkY2FzdCBsaW5rCisgKiBAcHJpbWFyeTogcG9pbnRlciB0byBwcmltYXJ5IGJlYXJlcgorICogQHNlY29uZGFyeTogcG9pbnRlciB0byBzZWNvbmRhcnkgYmVhcmVyCisgKiAKKyAqIEJlYXJlcnMgbXVzdCBoYXZlIHNhbWUgcHJpb3JpdHkgYW5kIHNhbWUgc2V0IG9mIHJlYWNoYWJsZSBkZXN0aW5hdGlvbnMgCisgKiB0byBiZSBwYWlyZWQuCisgKi8KKworc3RydWN0IGJjYmVhcmVyX3BhaXIgeworCXN0cnVjdCBiZWFyZXIgKnByaW1hcnk7CisJc3RydWN0IGJlYXJlciAqc2Vjb25kYXJ5OworfTsKKworLyoqCisgKiBzdHJ1Y3QgYmNiZWFyZXIgLSBiZWFyZXIgdXNlZCBieSBicm9hZGNhc3QgbGluaworICogQGJlYXJlcjogKG5vbi1zdGFuZGFyZCkgYnJvYWRjYXN0IGJlYXJlciBzdHJ1Y3R1cmUKKyAqIEBtZWRpYTogKG5vbi1zdGFuZGFyZCkgYnJvYWRjYXN0IG1lZGlhIHN0cnVjdHVyZQorICogQGJwYWlyczogYXJyYXkgb2YgYmVhcmVyIHBhaXJzCisgKiBAYnBhaXJzX3RlbXA6IGFycmF5IG9mIGJlYXJlciBwYWlycyB1c2VkIGR1cmluZyBjcmVhdGlvbiBvZiAiYnBhaXJzIgorICovCisKK3N0cnVjdCBiY2JlYXJlciB7CisJc3RydWN0IGJlYXJlciBiZWFyZXI7CisJc3RydWN0IG1lZGlhIG1lZGlhOworCXN0cnVjdCBiY2JlYXJlcl9wYWlyIGJwYWlyc1tNQVhfQkVBUkVSU107CisJc3RydWN0IGJjYmVhcmVyX3BhaXIgYnBhaXJzX3RlbXBbVElQQ19OVU1fTElOS19QUkldOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYmNsaW5rIC0gbGluayB1c2VkIGZvciBicm9hZGNhc3QgbWVzc2FnZXMKKyAqIEBsaW5rOiAobm9uLXN0YW5kYXJkKSBicm9hZGNhc3QgbGluayBzdHJ1Y3R1cmUKKyAqIEBub2RlOiAobm9uLXN0YW5kYXJkKSBub2RlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYidjYXN0IGxpbmsncyBwZWVyIG5vZGUKKyAqIAorICogSGFuZGxlcyBzZXF1ZW5jZSBudW1iZXJpbmcsIGZyYWdtZW50YXRpb24sIGJ1bmRsaW5nLCBldGMuCisgKi8KKworc3RydWN0IGJjbGluayB7CisJc3RydWN0IGxpbmsgbGluazsKKwlzdHJ1Y3Qgbm9kZSBub2RlOworfTsKKworCitzdGF0aWMgc3RydWN0IGJjYmVhcmVyICpiY2JlYXJlciA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGJjbGluayAqYmNsaW5rID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgbGluayAqYmNsID0gTlVMTDsKK3N0YXRpYyBzcGlubG9ja190IGJjX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKK2NoYXIgYmNfbGlua19uYW1lW10gPSAibXVsdGljYXN0LWxpbmsiOworCisKK3N0YXRpYyBpbmxpbmUgdTMyIGJ1Zl9zZXFubyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXJldHVybiBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKK30gCisKK3N0YXRpYyBpbmxpbmUgdTMyIGJjYnVmX2Fja3Moc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlyZXR1cm4gKHUzMikodW5zaWduZWQgbG9uZylUSVBDX1NLQl9DQihidWYpLT5oYW5kbGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY2J1Zl9zZXRfYWNrcyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgYWNrcykKK3sKKwlUSVBDX1NLQl9DQihidWYpLT5oYW5kbGUgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFja3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY2J1Zl9kZWNyX2Fja3Moc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwliY2J1Zl9zZXRfYWNrcyhidWYsIGJjYnVmX2Fja3MoYnVmKSAtIDEpOworfQorCisKKy8qKiAKKyAqIGJjbGlua19zZXRfZ2FwIC0gc2V0IGdhcCBhY2NvcmRpbmcgdG8gY29udGVudHMgb2YgY3VycmVudCBkZWZlcnJlZCBwa3QgcXVldWUKKyAqIAorICogQ2FsbGVkIHdpdGggJ25vZGUnIGxvY2tlZCwgYmNfbG9jayB1bmxvY2tlZAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY2xpbmtfc2V0X2dhcChzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IG5fcHRyLT5iY2xpbmsuZGVmZXJyZWRfaGVhZDsKKworCW5fcHRyLT5iY2xpbmsuZ2FwX2FmdGVyID0gbl9wdHItPmJjbGluay5nYXBfdG8gPQorCQltb2Qobl9wdHItPmJjbGluay5sYXN0X2luKTsKKwlpZiAodW5saWtlbHkoYnVmICE9IE5VTEwpKQorCQluX3B0ci0+YmNsaW5rLmdhcF90byA9IG1vZChidWZfc2Vxbm8oYnVmKSAtIDEpOworfQorCisvKiogCisgKiBiY2xpbmtfYWNrX2FsbG93ZWQgLSB0ZXN0IGlmIEFDSyBvciBOQUNLIG1lc3NhZ2UgY2FuIGJlIHNlbnQgYXQgdGhpcyBtb21lbnQKKyAqIAorICogVGhpcyBtZWNoYW5pc20gZW5kZWF2b3VycyB0byBwcmV2ZW50IGFsbCBub2RlcyBpbiBuZXR3b3JrIGZyb20gdHJ5aW5nCisgKiB0byBBQ0sgb3IgTkFDSyBhdCB0aGUgc2FtZSB0aW1lLgorICogCisgKiBOb3RlOiBUSVBDIHVzZXMgYSBkaWZmZXJlbnQgdHJpZ2dlciB0byBkaXN0cmlidXRlIEFDS3MgdGhhbiBpdCBkb2VzIHRvCisgKiAgICAgICBkaXN0cmlidXRlIE5BQ0tzLCBidXQgdHJpZXMgdG8gdXNlIHRoZSBzYW1lIHNwYWNpbmcgKGRpdmlkZSBieSAxNikuIAorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGJjbGlua19hY2tfYWxsb3dlZCh1MzIgbikKK3sKKwlyZXR1cm4oKG4gJSBUSVBDX01JTl9MSU5LX1dJTikgPT0gdGlwY19vd25fdGFnKTsKK30KKworCisvKiogCisgKiBiY2xpbmtfcmV0cmFuc21pdF9wa3QgLSByZXRyYW5zbWl0IGJyb2FkY2FzdCBwYWNrZXRzCisgKiBAYWZ0ZXI6IHNlcXVlbmNlIG51bWJlciBvZiBsYXN0IHBhY2tldCB0byAqbm90KiByZXRyYW5zbWl0CisgKiBAdG86IHNlcXVlbmNlIG51bWJlciBvZiBsYXN0IHBhY2tldCB0byByZXRyYW5zbWl0CisgKiAKKyAqIENhbGxlZCB3aXRoICdub2RlJyBsb2NrZWQsIGJjX2xvY2sgdW5sb2NrZWQKKyAqLworCitzdGF0aWMgdm9pZCBiY2xpbmtfcmV0cmFuc21pdF9wa3QodTMyIGFmdGVyLCB1MzIgdG8pCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKworCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisJYnVmID0gYmNsLT5maXJzdF9vdXQ7CisJd2hpbGUgKGJ1ZiAmJiBsZXNzX2VxKGJ1Zl9zZXFubyhidWYpLCBhZnRlcikpIHsKKwkJYnVmID0gYnVmLT5uZXh0OyAgICAgICAgICAgICAgICAKKwl9CisJaWYgKGJ1ZiAhPSBOVUxMKQorCQlsaW5rX3JldHJhbnNtaXQoYmNsLCBidWYsIG1vZCh0byAtIGFmdGVyKSk7CisJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOyAgICAgICAgICAgICAgCit9CisKKy8qKiAKKyAqIGJjbGlua19hY2tub3dsZWRnZSAtIGhhbmRsZSBhY2tub3dsZWRnZW1lbnQgb2YgYnJvYWRjYXN0IHBhY2tldHMKKyAqIEBuX3B0cjogbm9kZSB0aGF0IHNlbnQgYWNrbm93bGVkZ2VtZW50IGluZm8KKyAqIEBhY2tlZDogYnJvYWRjYXN0IHNlcXVlbmNlICMgdGhhdCBoYXMgYmVlbiBhY2tub3dsZWRnZWQKKyAqIAorICogTm9kZSBpcyBsb2NrZWQsIGJjX2xvY2sgdW5sb2NrZWQuCisgKi8KKwordm9pZCBiY2xpbmtfYWNrbm93bGVkZ2Uoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgYWNrZWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKmNyczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dDsKKwl1bnNpZ25lZCBpbnQgcmVsZWFzZWQgPSAwOworCisJaWYgKGxlc3NfZXEoYWNrZWQsIG5fcHRyLT5iY2xpbmsuYWNrZWQpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCisJLyogU2tpcCBvdmVyIHBhY2tldHMgdGhhdCBub2RlIGhhcyBwcmV2aW91c2x5IGFja25vd2xlZGdlZCAqLworCisJY3JzID0gYmNsLT5maXJzdF9vdXQ7CisJd2hpbGUgKGNycyAmJiBsZXNzX2VxKGJ1Zl9zZXFubyhjcnMpLCBuX3B0ci0+YmNsaW5rLmFja2VkKSkgeworCQljcnMgPSBjcnMtPm5leHQ7CisJfQorCisJLyogVXBkYXRlIHBhY2tldHMgdGhhdCBub2RlIGlzIG5vdyBhY2tub3dsZWRnaW5nICovCisKKwl3aGlsZSAoY3JzICYmIGxlc3NfZXEoYnVmX3NlcW5vKGNycyksIGFja2VkKSkgeworCQluZXh0ID0gY3JzLT5uZXh0OworCQliY2J1Zl9kZWNyX2Fja3MoY3JzKTsKKwkJaWYgKGJjYnVmX2Fja3MoY3JzKSA9PSAwKSB7CisJCQliY2wtPmZpcnN0X291dCA9IG5leHQ7CisJCQliY2wtPm91dF9xdWV1ZV9zaXplLS07CisJCQlidWZfZGlzY2FyZChjcnMpOworCQkJcmVsZWFzZWQgPSAxOworCQl9CisJCWNycyA9IG5leHQ7CisJfQorCW5fcHRyLT5iY2xpbmsuYWNrZWQgPSBhY2tlZDsKKworCS8qIFRyeSByZXNvbHZpbmcgYnJvYWRjYXN0IGxpbmsgY29uZ2VzdGlvbiwgaWYgbmVjZXNzYXJ5ICovCisKKwlpZiAodW5saWtlbHkoYmNsLT5uZXh0X291dCkpCisJCWxpbmtfcHVzaF9xdWV1ZShiY2wpOworCWlmICh1bmxpa2VseShyZWxlYXNlZCAmJiAhbGlzdF9lbXB0eSgmYmNsLT53YWl0aW5nX3BvcnRzKSkpCisJCWxpbmtfd2FrZXVwX3BvcnRzKGJjbCwgMCk7CisJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworfQorCisvKiogCisgKiBiY2xpbmtfc2VuZF9hY2sgLSB1bmljYXN0IGFuIEFDSyBtc2cKKyAqIAorICogbmV0X2xvY2sgYW5kIG5vZGUgbG9jayBzZXQKKyAqLworCitzdGF0aWMgdm9pZCBiY2xpbmtfc2VuZF9hY2soc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXN0cnVjdCBsaW5rICpsX3B0ciA9IG5fcHRyLT5hY3RpdmVfbGlua3Nbbl9wdHItPmFkZHIgJiAxXTsKKworCWlmIChsX3B0ciAhPSBOVUxMKQorCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csIDAsIDAsIDAsIDAsIDApOworfQorCisvKiogCisgKiBiY2xpbmtfc2VuZF9uYWNrLSBicm9hZGNhc3QgYSBOQUNLIG1zZworICogCisgKiBuZXRfbG9jayBhbmQgbm9kZSBsb2NrIHNldAorICovCisKK3N0YXRpYyB2b2lkIGJjbGlua19zZW5kX25hY2soc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisKKwlpZiAoIWxlc3Mobl9wdHItPmJjbGluay5nYXBfYWZ0ZXIsIG5fcHRyLT5iY2xpbmsuZ2FwX3RvKSkKKwkJcmV0dXJuOworCisJYnVmID0gYnVmX2FjcXVpcmUoSU5UX0hfU0laRSk7CisJaWYgKGJ1ZikgeworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1zZ19pbml0KG1zZywgQkNBU1RfUFJPVE9DT0wsIFNUQVRFX01TRywKKwkJCSBUSVBDX09LLCBJTlRfSF9TSVpFLCBuX3B0ci0+YWRkcik7CisJCW1zZ19zZXRfbWNfbmV0aWQobXNnLCB0aXBjX25ldF9pZCk7CisJCW1zZ19zZXRfYmNhc3RfYWNrKG1zZywgbW9kKG5fcHRyLT5iY2xpbmsubGFzdF9pbikpOyAKKwkJbXNnX3NldF9iY2dhcF9hZnRlcihtc2csIG5fcHRyLT5iY2xpbmsuZ2FwX2FmdGVyKTsKKwkJbXNnX3NldF9iY2dhcF90byhtc2csIG5fcHRyLT5iY2xpbmsuZ2FwX3RvKTsKKwkJbXNnX3NldF9iY2FzdF90YWcobXNnLCB0aXBjX293bl90YWcpOworCisJCWlmIChiZWFyZXJfc2VuZCgmYmNiZWFyZXItPmJlYXJlciwgYnVmLCAwKSkgeworCQkJYmNsLT5zdGF0cy5zZW50X25hY2tzKys7CisJCQlidWZfZGlzY2FyZChidWYpOworCQl9IGVsc2UgeworCQkJYmVhcmVyX3NjaGVkdWxlKGJjbC0+Yl9wdHIsIGJjbCk7CisJCQliY2wtPnByb3RvX21zZ19xdWV1ZSA9IGJ1ZjsKKwkJCWJjbC0+c3RhdHMuYmVhcmVyX2NvbmdzKys7CisJCX0KKworCQkvKiAKKwkJICogRW5zdXJlIHdlIGRvZXNuJ3Qgc2VuZCBhbm90aGVyIE5BQ0sgbXNnIHRvIHRoZSBub2RlCisJCSAqIHVudGlsIDE2IG1vcmUgZGVmZXJyZWQgbWVzc2FnZXMgYXJyaXZlIGZyb20gaXQKKwkJICogKGkuZS4gaGVscHMgcHJldmVudCBhbGwgbm9kZXMgZnJvbSBOQUNLJ2luZyBhdCBzYW1lIHRpbWUpCisJCSAqLworCQkKKwkJbl9wdHItPmJjbGluay5uYWNrX3N5bmMgPSB0aXBjX293bl90YWc7CisJfQorfQorCisvKiogCisgKiBiY2xpbmtfY2hlY2tfZ2FwIC0gc2VuZCBhIE5BQ0sgaWYgYSBzZXF1ZW5jZSBnYXAgZXhpc3RzCisgKgorICogbmV0X2xvY2sgYW5kIG5vZGUgbG9jayBzZXQKKyAqLworCit2b2lkIGJjbGlua19jaGVja19nYXAoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgbGFzdF9zZW50KQoreworCWlmICghbl9wdHItPmJjbGluay5zdXBwb3J0ZWQgfHwKKwkgICAgbGVzc19lcShsYXN0X3NlbnQsIG1vZChuX3B0ci0+YmNsaW5rLmxhc3RfaW4pKSkKKwkJcmV0dXJuOworCisJYmNsaW5rX3NldF9nYXAobl9wdHIpOworCWlmIChuX3B0ci0+YmNsaW5rLmdhcF9hZnRlciA9PSBuX3B0ci0+YmNsaW5rLmdhcF90bykKKwkJbl9wdHItPmJjbGluay5nYXBfdG8gPSBsYXN0X3NlbnQ7CisJYmNsaW5rX3NlbmRfbmFjayhuX3B0cik7Cit9CisKKy8qKiAKKyAqIGJjbGlua19wZWVrX25hY2sgLSBwcm9jZXNzIGEgTkFDSyBtc2cgbWVhbnQgZm9yIGFub3RoZXIgbm9kZQorICogCisgKiBPbmx5IG5ldF9sb2NrIHNldC4KKyAqLworCit2b2lkIGJjbGlua19wZWVrX25hY2sodTMyIGRlc3QsIHUzMiBzZW5kZXJfdGFnLCB1MzIgZ2FwX2FmdGVyLCB1MzIgZ2FwX3RvKQoreworCXN0cnVjdCBub2RlICpuX3B0ciA9IG5vZGVfZmluZChkZXN0KTsKKwl1MzIgbXlfYWZ0ZXIsIG15X3RvOworCisJaWYgKHVubGlrZWx5KCFuX3B0ciB8fCAhbm9kZV9pc191cChuX3B0cikpKQorCQlyZXR1cm47CisJbm9kZV9sb2NrKG5fcHRyKTsKKwkvKgorCSAqIE1vZGlmeSBnYXAgdG8gc3VwcHJlc3MgdW5uZWNlc3NhcnkgTkFDS3MgZnJvbSB0aGlzIG5vZGUKKwkgKi8KKwlteV9hZnRlciA9IG5fcHRyLT5iY2xpbmsuZ2FwX2FmdGVyOworCW15X3RvID0gbl9wdHItPmJjbGluay5nYXBfdG87CisKKwlpZiAobGVzc19lcShnYXBfYWZ0ZXIsIG15X2FmdGVyKSkgeworCQlpZiAobGVzcyhteV9hZnRlciwgZ2FwX3RvKSAmJiBsZXNzKGdhcF90bywgbXlfdG8pKQorCQkJbl9wdHItPmJjbGluay5nYXBfYWZ0ZXIgPSBnYXBfdG87CisJCWVsc2UgaWYgKGxlc3NfZXEobXlfdG8sIGdhcF90bykpCisJCQluX3B0ci0+YmNsaW5rLmdhcF90byA9IG5fcHRyLT5iY2xpbmsuZ2FwX2FmdGVyOworCX0gZWxzZSBpZiAobGVzc19lcShnYXBfYWZ0ZXIsIG15X3RvKSkgeworCQlpZiAobGVzc19lcShteV90bywgZ2FwX3RvKSkKKwkJCW5fcHRyLT5iY2xpbmsuZ2FwX3RvID0gZ2FwX2FmdGVyOworCX0gZWxzZSB7CisJCS8qIAorCQkgKiBFeHBhbmQgZ2FwIGlmIG1pc3NpbmcgYnVmcyBub3QgaW4gZGVmZXJyZWQgcXVldWU6CisJCSAqLworCQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gbl9wdHItPmJjbGluay5kZWZlcnJlZF9oZWFkOworCQl1MzIgcHJldiA9IG5fcHRyLT5iY2xpbmsuZ2FwX3RvOworCisJCWZvciAoOyBidWY7IGJ1ZiA9IGJ1Zi0+bmV4dCkgeworCQkJdTMyIHNlcW5vID0gYnVmX3NlcW5vKGJ1Zik7CisKKwkJCWlmIChtb2Qoc2Vxbm8gLSBwcmV2KSAhPSAxKQorCQkJCWJ1ZiA9IE5VTEw7CisJCQlpZiAoc2Vxbm8gPT0gZ2FwX2FmdGVyKQorCQkJCWJyZWFrOworCQkJcHJldiA9IHNlcW5vOworCQl9CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCW5fcHRyLT5iY2xpbmsuZ2FwX3RvID0gZ2FwX2FmdGVyOworCX0KKwkvKgorCSAqIFNvbWUgbm9kZXMgbWF5IHNlbmQgYSBjb21wbGVtZW50YXJ5IE5BQ0sgbm93OgorCSAqLyAKKwlpZiAoYmNsaW5rX2Fja19hbGxvd2VkKHNlbmRlcl90YWcgKyAxKSkgeworCQlpZiAobl9wdHItPmJjbGluay5nYXBfdG8gIT0gbl9wdHItPmJjbGluay5nYXBfYWZ0ZXIpIHsKKwkJCWJjbGlua19zZW5kX25hY2sobl9wdHIpOworCQkJYmNsaW5rX3NldF9nYXAobl9wdHIpOworCQl9CisJfQorCW5vZGVfdW5sb2NrKG5fcHRyKTsKK30KKworLyoqCisgKiBiY2xpbmtfc2VuZF9tc2cgLSBicm9hZGNhc3QgYSBwYWNrZXQgdG8gYWxsIG5vZGVzIGluIGNsdXN0ZXIKKyAqLworCitpbnQgYmNsaW5rX3NlbmRfbXNnKHN0cnVjdCBza19idWZmICpidWYpCit7CisJaW50IHJlczsKKworCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisKKwlyZXMgPSBsaW5rX3NlbmRfYnVmKGJjbCwgYnVmKTsKKwlpZiAodW5saWtlbHkocmVzID09IC1FTElOS0NPTkcpKQorCQlidWZfZGlzY2FyZChidWYpOworCWVsc2UKKwkJYmNsLT5zdGF0cy5zZW50X2luZm8rKzsKKworCWlmIChiY2wtPm91dF9xdWV1ZV9zaXplID4gYmNsLT5zdGF0cy5tYXhfcXVldWVfc3opCisJCWJjbC0+c3RhdHMubWF4X3F1ZXVlX3N6ID0gYmNsLT5vdXRfcXVldWVfc2l6ZTsKKwliY2wtPnN0YXRzLnF1ZXVlX3N6X2NvdW50cysrOworCWJjbC0+c3RhdHMuYWNjdV9xdWV1ZV9zeiArPSBiY2wtPm91dF9xdWV1ZV9zaXplOworCisJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogYmNsaW5rX3JlY3ZfcGt0IC0gcmVjZWl2ZSBhIGJyb2FkY2FzdCBwYWNrZXQsIGFuZCBkZWxpdmVyIHVwd2FyZHMKKyAqIAorICogbmV0X2xvY2sgaXMgcmVhZF9sb2NrZWQsIG5vIG90aGVyIGxvY2tzIHNldAorICovCisKK3ZvaWQgYmNsaW5rX3JlY3ZfcGt0KHN0cnVjdCBza19idWZmICpidWYpCit7ICAgICAgICAKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwlzdHJ1Y3Qgbm9kZSogbm9kZSA9IG5vZGVfZmluZChtc2dfcHJldm5vZGUobXNnKSk7CisJdTMyIG5leHRfaW47CisJdTMyIHNlcW5vOworCXN0cnVjdCBza19idWZmICpkZWZlcnJlZDsKKworCW1zZ19kYmcobXNnLCAiPEJDPDw8Iik7CisKKwlpZiAodW5saWtlbHkoIW5vZGUgfHwgIW5vZGVfaXNfdXAobm9kZSkgfHwgIW5vZGUtPmJjbGluay5zdXBwb3J0ZWQgfHwgCisJCSAgICAgKG1zZ19tY19uZXRpZChtc2cpICE9IHRpcGNfbmV0X2lkKSkpIHsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh1bmxpa2VseShtc2dfdXNlcihtc2cpID09IEJDQVNUX1BST1RPQ09MKSkgeworCQltc2dfZGJnKG1zZywgIjxCQ05BQ0s8PDwiKTsKKwkJaWYgKG1zZ19kZXN0bm9kZShtc2cpID09IHRpcGNfb3duX2FkZHIpIHsKKwkJCW5vZGVfbG9jayhub2RlKTsKKwkJCWJjbGlua19hY2tub3dsZWRnZShub2RlLCBtc2dfYmNhc3RfYWNrKG1zZykpOworCQkJbm9kZV91bmxvY2sobm9kZSk7CisJCQliY2wtPnN0YXRzLnJlY3ZfbmFja3MrKzsKKwkJCWJjbGlua19yZXRyYW5zbWl0X3BrdChtc2dfYmNnYXBfYWZ0ZXIobXNnKSwKKwkJCQkJICAgICAgbXNnX2JjZ2FwX3RvKG1zZykpOworCQl9IGVsc2UgeworCQkJYmNsaW5rX3BlZWtfbmFjayhtc2dfZGVzdG5vZGUobXNnKSwKKwkJCQkJIG1zZ19iY2FzdF90YWcobXNnKSwKKwkJCQkJIG1zZ19iY2dhcF9hZnRlcihtc2cpLAorCQkJCQkgbXNnX2JjZ2FwX3RvKG1zZykpOworCQl9CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCXJldHVybjsKKwl9CisKKwlub2RlX2xvY2sobm9kZSk7CityZWNlaXZlOgorCWRlZmVycmVkID0gbm9kZS0+YmNsaW5rLmRlZmVycmVkX2hlYWQ7CisJbmV4dF9pbiA9IG1vZChub2RlLT5iY2xpbmsubGFzdF9pbiArIDEpOworCXNlcW5vID0gbXNnX3NlcW5vKG1zZyk7CisKKwlpZiAobGlrZWx5KHNlcW5vID09IG5leHRfaW4pKSB7CisJCWJjbC0+c3RhdHMucmVjdl9pbmZvKys7CisJCW5vZGUtPmJjbGluay5sYXN0X2luKys7CisJCWJjbGlua19zZXRfZ2FwKG5vZGUpOworCQlpZiAodW5saWtlbHkoYmNsaW5rX2Fja19hbGxvd2VkKHNlcW5vKSkpIHsKKwkJCWJjbGlua19zZW5kX2Fjayhub2RlKTsKKwkJCWJjbC0+c3RhdHMuc2VudF9hY2tzKys7CisJCX0KKwkJaWYgKGxpa2VseShtc2dfaXNkYXRhKG1zZykpKSB7CisJCQlub2RlX3VubG9jayhub2RlKTsKKwkJCXBvcnRfcmVjdl9tY2FzdChidWYsIE5VTEwpOworCQl9IGVsc2UgaWYgKG1zZ191c2VyKG1zZykgPT0gTVNHX0JVTkRMRVIpIHsKKwkJCWJjbC0+c3RhdHMucmVjdl9idW5kbGVzKys7CisJCQliY2wtPnN0YXRzLnJlY3ZfYnVuZGxlZCArPSBtc2dfbXNnY250KG1zZyk7CisJCQlub2RlX3VubG9jayhub2RlKTsKKwkJCWxpbmtfcmVjdl9idW5kbGUoYnVmKTsKKwkJfSBlbHNlIGlmIChtc2dfdXNlcihtc2cpID09IE1TR19GUkFHTUVOVEVSKSB7CisJCQliY2wtPnN0YXRzLnJlY3ZfZnJhZ21lbnRzKys7CisJCQlpZiAobGlua19yZWN2X2ZyYWdtZW50KCZub2RlLT5iY2xpbmsuZGVmcmFnbSwKKwkJCQkJICAgICAgICZidWYsICZtc2cpKQorCQkJCWJjbC0+c3RhdHMucmVjdl9mcmFnbWVudGVkKys7CisJCQlub2RlX3VubG9jayhub2RlKTsKKwkJCW5ldF9yb3V0ZV9tc2coYnVmKTsKKwkJfSBlbHNlIHsKKwkJCW5vZGVfdW5sb2NrKG5vZGUpOworCQkJbmV0X3JvdXRlX21zZyhidWYpOworCQl9CisJCWlmIChkZWZlcnJlZCAmJiAoYnVmX3NlcW5vKGRlZmVycmVkKSA9PSBtb2QobmV4dF9pbiArIDEpKSkgeworCQkJbm9kZV9sb2NrKG5vZGUpOworCQkJYnVmID0gZGVmZXJyZWQ7CisJCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCQlub2RlLT5iY2xpbmsuZGVmZXJyZWRfaGVhZCA9IGRlZmVycmVkLT5uZXh0OworCQkJZ290byByZWNlaXZlOworCQl9CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGxlc3MobmV4dF9pbiwgc2Vxbm8pKSB7CisJCXUzMiBnYXBfYWZ0ZXIgPSBub2RlLT5iY2xpbmsuZ2FwX2FmdGVyOworCQl1MzIgZ2FwX3RvID0gbm9kZS0+YmNsaW5rLmdhcF90bzsKKworCQlpZiAobGlua19kZWZlcl9wa3QoJm5vZGUtPmJjbGluay5kZWZlcnJlZF9oZWFkLAorCQkJCSAgICZub2RlLT5iY2xpbmsuZGVmZXJyZWRfdGFpbCwKKwkJCQkgICBidWYpKSB7CisJCQlub2RlLT5iY2xpbmsubmFja19zeW5jKys7CisJCQliY2wtPnN0YXRzLmRlZmVycmVkX3JlY3YrKzsKKwkJCWlmIChzZXFubyA9PSBtb2QoZ2FwX2FmdGVyICsgMSkpCisJCQkJbm9kZS0+YmNsaW5rLmdhcF9hZnRlciA9IHNlcW5vOworCQkJZWxzZSBpZiAobGVzcyhnYXBfYWZ0ZXIsIHNlcW5vKSAmJiBsZXNzKHNlcW5vLCBnYXBfdG8pKQorCQkJCW5vZGUtPmJjbGluay5nYXBfdG8gPSBzZXFubzsKKwkJfQorCQlpZiAoYmNsaW5rX2Fja19hbGxvd2VkKG5vZGUtPmJjbGluay5uYWNrX3N5bmMpKSB7CisJCQlpZiAoZ2FwX3RvICE9IGdhcF9hZnRlcikKKwkJCQliY2xpbmtfc2VuZF9uYWNrKG5vZGUpOworCQkJYmNsaW5rX3NldF9nYXAobm9kZSk7CisJCX0KKwl9IGVsc2UgeworCQliY2wtPnN0YXRzLmR1cGxpY2F0ZXMrKzsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwl9CisJbm9kZV91bmxvY2sobm9kZSk7Cit9CisKK3UzMiBiY2xpbmtfZ2V0X2xhc3Rfc2VudCh2b2lkKQoreworCXUzMiBsYXN0X3NlbnQgPSBtb2QoYmNsLT5uZXh0X291dF9ubyAtIDEpOworCisJaWYgKGJjbC0+bmV4dF9vdXQpCisJCWxhc3Rfc2VudCA9IG1vZChidWZfc2Vxbm8oYmNsLT5uZXh0X291dCkgLSAxKTsKKwlyZXR1cm4gbGFzdF9zZW50OworfQorCit1MzIgYmNsaW5rX2Fja3NfbWlzc2luZyhzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJcmV0dXJuIChuX3B0ci0+YmNsaW5rLnN1cHBvcnRlZCAmJgorCQkoYmNsaW5rX2dldF9sYXN0X3NlbnQoKSAhPSBuX3B0ci0+YmNsaW5rLmFja2VkKSk7Cit9CisKKworLyoqCisgKiBiY2JlYXJlcl9zZW5kIC0gc2VuZCBhIHBhY2tldCB0aHJvdWdoIHRoZSBicm9hZGNhc3QgcHNldWRvLWJlYXJlcgorICogCisgKiBTZW5kIHRocm91Z2ggYXMgbWFueSBiZWFyZXJzIGFzIG5lY2Vzc2FyeSB0byByZWFjaCBhbGwgbm9kZXMKKyAqIHRoYXQgc3VwcG9ydCBUSVBDIG11bHRpY2FzdGluZy4KKyAqIAorICogUmV0dXJucyAwIGlmIHBhY2tldCBzZW50IHN1Y2Nlc3NmdWxseSwgbm9uLXplcm8gaWYgbm90CisgKi8KKworaW50IGJjYmVhcmVyX3NlbmQoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKKwkJICBzdHJ1Y3QgdGlwY19iZWFyZXIgKnVudXNlZDEsCisJCSAgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqdW51c2VkMikKK3sKKwlzdGF0aWMgaW50IHNlbmRfY291bnQgPSAwOworCisJc3RydWN0IG5vZGVfbWFwIHJlbWFpbnM7CisJc3RydWN0IG5vZGVfbWFwIHJlbWFpbnNfbmV3OworCWludCBicF9pbmRleDsKKwlpbnQgc3dhcF90aW1lOworCisJLyogUHJlcGFyZSBidWZmZXIgZm9yIGJyb2FkY2FzdGluZyAoaWYgZmlyc3QgdGltZSB0cnlpbmcgdG8gc2VuZCBpdCkgKi8KKworCWlmIChsaWtlbHkoIW1zZ19ub25fc2VxKGJ1Zl9tc2coYnVmKSkpKSB7CisJCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCisJCWFzc2VydChjbHVzdGVyX2JjYXN0X25vZGVzLmNvdW50ICE9IDApOworCQliY2J1Zl9zZXRfYWNrcyhidWYsIGNsdXN0ZXJfYmNhc3Rfbm9kZXMuY291bnQpOworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1zZ19zZXRfbm9uX3NlcShtc2cpOworCQltc2dfc2V0X21jX25ldGlkKG1zZywgdGlwY19uZXRfaWQpOworCX0KKworCS8qIERldGVybWluZSBpZiBiZWFyZXIgcGFpcnMgc2hvdWxkIGJlIHN3YXBwZWQgZm9sbG93aW5nIHRoaXMgYXR0ZW1wdCAqLworCisJaWYgKChzd2FwX3RpbWUgPSAoKytzZW5kX2NvdW50ID49IDEwKSkpCisJCXNlbmRfY291bnQgPSAwOworCisJLyogU2VuZCBidWZmZXIgb3ZlciBiZWFyZXJzIHVudGlsIGFsbCB0YXJnZXRzIHJlYWNoZWQgKi8KKwkKKwlyZW1haW5zID0gY2x1c3Rlcl9iY2FzdF9ub2RlczsKKworCWZvciAoYnBfaW5kZXggPSAwOyBicF9pbmRleCA8IE1BWF9CRUFSRVJTOyBicF9pbmRleCsrKSB7CisJCXN0cnVjdCBiZWFyZXIgKnAgPSBiY2JlYXJlci0+YnBhaXJzW2JwX2luZGV4XS5wcmltYXJ5OworCQlzdHJ1Y3QgYmVhcmVyICpzID0gYmNiZWFyZXItPmJwYWlyc1ticF9pbmRleF0uc2Vjb25kYXJ5OworCisJCWlmICghcCkKKwkJCWJyZWFrOwkvKiBubyBtb3JlIGJlYXJlcnMgdG8gdHJ5ICovCisKKwkJbm1hcF9kaWZmKCZyZW1haW5zLCAmcC0+bm9kZXMsICZyZW1haW5zX25ldyk7CisJCWlmIChyZW1haW5zX25ldy5jb3VudCA9PSByZW1haW5zLmNvdW50KQorCQkJY29udGludWU7CS8qIGJlYXJlciBwYWlyIGRvZXNuJ3QgYWRkIGFueXRoaW5nICovCisKKwkJaWYgKCFwLT5wdWJsLmJsb2NrZWQgJiYKKwkJICAgICFwLT5tZWRpYS0+c2VuZF9tc2coYnVmLCAmcC0+cHVibCwgJnAtPm1lZGlhLT5iY2FzdF9hZGRyKSkgeworCQkJaWYgKHN3YXBfdGltZSAmJiBzICYmICFzLT5wdWJsLmJsb2NrZWQpCisJCQkJZ290byBzd2FwOworCQkJZWxzZQorCQkJCWdvdG8gdXBkYXRlOworCQl9CisKKwkJaWYgKCFzIHx8IHMtPnB1YmwuYmxvY2tlZCB8fAorCQkgICAgcy0+bWVkaWEtPnNlbmRfbXNnKGJ1ZiwgJnMtPnB1YmwsICZzLT5tZWRpYS0+YmNhc3RfYWRkcikpCisJCQljb250aW51ZTsJLyogdW5hYmxlIHRvIHNlbmQgdXNpbmcgYmVhcmVyIHBhaXIgKi8KK3N3YXA6CisJCWJjYmVhcmVyLT5icGFpcnNbYnBfaW5kZXhdLnByaW1hcnkgPSBzOworCQliY2JlYXJlci0+YnBhaXJzW2JwX2luZGV4XS5zZWNvbmRhcnkgPSBwOwordXBkYXRlOgorCQlpZiAocmVtYWluc19uZXcuY291bnQgPT0gMCkKKwkJCXJldHVybiBUSVBDX09LOworCisJCXJlbWFpbnMgPSByZW1haW5zX25ldzsKKwl9CisJCisJLyogVW5hYmxlIHRvIHJlYWNoIGFsbCB0YXJnZXRzICovCisKKwliY2JlYXJlci0+YmVhcmVyLnB1YmwuYmxvY2tlZCA9IDE7CisJYmNsLT5zdGF0cy5iZWFyZXJfY29uZ3MrKzsKKwlyZXR1cm4gflRJUENfT0s7Cit9CisKKy8qKgorICogYmNiZWFyZXJfc29ydCAtIGNyZWF0ZSBzZXRzIG9mIGJlYXJlciBwYWlycyB1c2VkIGJ5IGJyb2FkY2FzdCBiZWFyZXIKKyAqLworCit2b2lkIGJjYmVhcmVyX3NvcnQodm9pZCkKK3sKKwlzdHJ1Y3QgYmNiZWFyZXJfcGFpciAqYnBfdGVtcCA9IGJjYmVhcmVyLT5icGFpcnNfdGVtcDsKKwlzdHJ1Y3QgYmNiZWFyZXJfcGFpciAqYnBfY3VycjsKKwlpbnQgYl9pbmRleDsKKwlpbnQgcHJpOworCisJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKworCS8qIEdyb3VwIGJlYXJlcnMgYnkgcHJpb3JpdHkgKGNhbiBhc3N1bWUgbWF4IG9mIHR3byBwZXIgcHJpb3JpdHkpICovCisKKwltZW1zZXQoYnBfdGVtcCwgMCwgc2l6ZW9mKGJjYmVhcmVyLT5icGFpcnNfdGVtcCkpOworCisJZm9yIChiX2luZGV4ID0gMDsgYl9pbmRleCA8IE1BWF9CRUFSRVJTOyBiX2luZGV4KyspIHsKKwkJc3RydWN0IGJlYXJlciAqYiA9ICZiZWFyZXJzW2JfaW5kZXhdOworCisJCWlmICghYi0+YWN0aXZlIHx8ICFiLT5ub2Rlcy5jb3VudCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghYnBfdGVtcFtiLT5wcmlvcml0eV0ucHJpbWFyeSkKKwkJCWJwX3RlbXBbYi0+cHJpb3JpdHldLnByaW1hcnkgPSBiOworCQllbHNlCisJCQlicF90ZW1wW2ItPnByaW9yaXR5XS5zZWNvbmRhcnkgPSBiOworCX0KKworCS8qIENyZWF0ZSBhcnJheSBvZiBiZWFyZXIgcGFpcnMgZm9yIGJyb2FkY2FzdGluZyAqLworCisJYnBfY3VyciA9IGJjYmVhcmVyLT5icGFpcnM7CisJbWVtc2V0KGJjYmVhcmVyLT5icGFpcnMsIDAsIHNpemVvZihiY2JlYXJlci0+YnBhaXJzKSk7CisKKwlmb3IgKHByaSA9IChUSVBDX05VTV9MSU5LX1BSSSAtIDEpOyBwcmkgPj0gMDsgcHJpLS0pIHsKKworCQlpZiAoIWJwX3RlbXBbcHJpXS5wcmltYXJ5KQorCQkJY29udGludWU7CisKKwkJYnBfY3Vyci0+cHJpbWFyeSA9IGJwX3RlbXBbcHJpXS5wcmltYXJ5OworCisJCWlmIChicF90ZW1wW3ByaV0uc2Vjb25kYXJ5KSB7CisJCQlpZiAobm1hcF9lcXVhbCgmYnBfdGVtcFtwcmldLnByaW1hcnktPm5vZGVzLAorCQkJCSAgICAgICAmYnBfdGVtcFtwcmldLnNlY29uZGFyeS0+bm9kZXMpKSB7CisJCQkJYnBfY3Vyci0+c2Vjb25kYXJ5ID0gYnBfdGVtcFtwcmldLnNlY29uZGFyeTsKKwkJCX0gZWxzZSB7CisJCQkJYnBfY3VycisrOworCQkJCWJwX2N1cnItPnByaW1hcnkgPSBicF90ZW1wW3ByaV0uc2Vjb25kYXJ5OworCQkJfQorCQl9CisKKwkJYnBfY3VycisrOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKK30KKworLyoqCisgKiBiY2JlYXJlcl9wdXNoIC0gcmVzb2x2ZSBiZWFyZXIgY29uZ2VzdGlvbgorICogCisgKiBGb3JjZXMgYmNsaW5rIHRvIHB1c2ggb3V0IGFueSB1bnNlbnQgcGFja2V0cywgdW50aWwgYWxsIHBhY2tldHMgYXJlIGdvbmUKKyAqIG9yIGNvbmdlc3Rpb24gcmVvY2N1cnMuCisgKiBObyBsb2NrcyBzZXQgd2hlbiBmdW5jdGlvbiBjYWxsZWQKKyAqLworCit2b2lkIGJjYmVhcmVyX3B1c2godm9pZCkKK3sKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0cjsKKworCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisJYl9wdHIgPSAmYmNiZWFyZXItPmJlYXJlcjsKKwlpZiAoYl9wdHItPnB1YmwuYmxvY2tlZCkgeworCQliX3B0ci0+cHVibC5ibG9ja2VkID0gMDsKKwkJYmVhcmVyX2xvY2tfcHVzaChiX3B0cik7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKK30KKworCitpbnQgYmNsaW5rX3N0YXRzKGNoYXIgKmJ1ZiwgY29uc3QgdTMyIGJ1Zl9zaXplKQoreworCXN0cnVjdCBwcmludF9idWYgcGI7CisKKwlpZiAoIWJjbCkKKwkJcmV0dXJuIDA7CisKKwlwcmludGJ1Zl9pbml0KCZwYiwgYnVmLCBidWZfc2l6ZSk7CisKKwlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCisJdGlwY19wcmludGYoJnBiLCAiTGluayA8JXM+XG4iCisJCSAgICAgICAgICIgIFdpbmRvdzoldSBwYWNrZXRzXG4iLCAKKwkJICAgIGJjbC0+bmFtZSwgYmNsLT5xdWV1ZV9saW1pdFswXSk7CisJdGlwY19wcmludGYoJnBiLCAiICBSWCBwYWNrZXRzOiV1IGZyYWdtZW50czoldS8ldSBidW5kbGVzOiV1LyV1XG4iLCAKKwkJICAgIGJjbC0+c3RhdHMucmVjdl9pbmZvLAorCQkgICAgYmNsLT5zdGF0cy5yZWN2X2ZyYWdtZW50cywKKwkJICAgIGJjbC0+c3RhdHMucmVjdl9mcmFnbWVudGVkLAorCQkgICAgYmNsLT5zdGF0cy5yZWN2X2J1bmRsZXMsCisJCSAgICBiY2wtPnN0YXRzLnJlY3ZfYnVuZGxlZCk7CisJdGlwY19wcmludGYoJnBiLCAiICBUWCBwYWNrZXRzOiV1IGZyYWdtZW50czoldS8ldSBidW5kbGVzOiV1LyV1XG4iLCAKKwkJICAgIGJjbC0+c3RhdHMuc2VudF9pbmZvLAorCQkgICAgYmNsLT5zdGF0cy5zZW50X2ZyYWdtZW50cywKKwkJICAgIGJjbC0+c3RhdHMuc2VudF9mcmFnbWVudGVkLCAKKwkJICAgIGJjbC0+c3RhdHMuc2VudF9idW5kbGVzLAorCQkgICAgYmNsLT5zdGF0cy5zZW50X2J1bmRsZWQpOworCXRpcGNfcHJpbnRmKCZwYiwgIiAgUlggbmFrczoldSBkZWZzOiV1IGR1cHM6JXVcbiIsIAorCQkgICAgYmNsLT5zdGF0cy5yZWN2X25hY2tzLAorCQkgICAgYmNsLT5zdGF0cy5kZWZlcnJlZF9yZWN2LCAKKwkJICAgIGJjbC0+c3RhdHMuZHVwbGljYXRlcyk7CisJdGlwY19wcmludGYoJnBiLCAiICBUWCBuYWtzOiV1IGFja3M6JXUgZHVwczoldVxuIiwgCisJCSAgICBiY2wtPnN0YXRzLnNlbnRfbmFja3MsIAorCQkgICAgYmNsLT5zdGF0cy5zZW50X2Fja3MsIAorCQkgICAgYmNsLT5zdGF0cy5yZXRyYW5zbWl0dGVkKTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIENvbmdlc3Rpb24gYmVhcmVyOiV1IGxpbms6JXUgIFNlbmQgcXVldWUgbWF4OiV1IGF2ZzoldVxuIiwKKwkJICAgIGJjbC0+c3RhdHMuYmVhcmVyX2NvbmdzLAorCQkgICAgYmNsLT5zdGF0cy5saW5rX2NvbmdzLAorCQkgICAgYmNsLT5zdGF0cy5tYXhfcXVldWVfc3osCisJCSAgICBiY2wtPnN0YXRzLnF1ZXVlX3N6X2NvdW50cworCQkgICAgPyAoYmNsLT5zdGF0cy5hY2N1X3F1ZXVlX3N6IC8gYmNsLT5zdGF0cy5xdWV1ZV9zel9jb3VudHMpCisJCSAgICA6IDApOworCisJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworCXJldHVybiBwcmludGJ1Zl92YWxpZGF0ZSgmcGIpOworfQorCitpbnQgYmNsaW5rX3Jlc2V0X3N0YXRzKHZvaWQpCit7CisJaWYgKCFiY2wpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCW1lbXNldCgmYmNsLT5zdGF0cywgMCwgc2l6ZW9mKGJjbC0+c3RhdHMpKTsKKwlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCBiY2xpbmtfc2V0X3F1ZXVlX2xpbWl0cyh1MzIgbGltaXQpCit7CisJaWYgKCFiY2wpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJaWYgKChsaW1pdCA8IFRJUENfTUlOX0xJTktfV0lOKSB8fCAobGltaXQgPiBUSVBDX01BWF9MSU5LX1dJTikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKwlsaW5rX3NldF9xdWV1ZV9saW1pdHMoYmNsLCBsaW1pdCk7CisJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworCXJldHVybiBUSVBDX09LOworfQorCitpbnQgYmNsaW5rX2luaXQodm9pZCkKK3sKKwliY2JlYXJlciA9IGttYWxsb2Moc2l6ZW9mKCpiY2JlYXJlciksIEdGUF9BVE9NSUMpOworCWJjbGluayA9IGttYWxsb2Moc2l6ZW9mKCpiY2xpbmspLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWJjYmVhcmVyIHx8ICFiY2xpbmspIHsKKyBub21lbToKKwkgCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBGYWlsZWQgdG8gY3JlYXRlIG11bHRpY2FzdCBsaW5rXG4iKTsKKwkJa2ZyZWUoYmNiZWFyZXIpOworCQliY2JlYXJlciA9IE5VTEw7CisJCWtmcmVlKGJjbGluayk7CisJCWJjbGluayA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChiY2JlYXJlciwgMCwgc2l6ZW9mKHN0cnVjdCBiY2JlYXJlcikpOworCUlOSVRfTElTVF9IRUFEKCZiY2JlYXJlci0+YmVhcmVyLmNvbmdfbGlua3MpOworCWJjYmVhcmVyLT5iZWFyZXIubWVkaWEgPSAmYmNiZWFyZXItPm1lZGlhOworCWJjYmVhcmVyLT5tZWRpYS5zZW5kX21zZyA9IGJjYmVhcmVyX3NlbmQ7CisJc3ByaW50ZihiY2JlYXJlci0+bWVkaWEubmFtZSwgInRpcGMtbXVsdGljYXN0Iik7CisKKwliY2wgPSAmYmNsaW5rLT5saW5rOworCW1lbXNldChiY2xpbmssIDAsIHNpemVvZihzdHJ1Y3QgYmNsaW5rKSk7CisJSU5JVF9MSVNUX0hFQUQoJmJjbC0+d2FpdGluZ19wb3J0cyk7CisJYmNsLT5uZXh0X291dF9ubyA9IDE7CisJYmNsaW5rLT5ub2RlLmxvY2sgPSAgU1BJTl9MT0NLX1VOTE9DS0VEOyAgICAgICAgCisJYmNsLT5vd25lciA9ICZiY2xpbmstPm5vZGU7CisgICAgICAgIGJjbC0+bWF4X3BrdCA9IE1BWF9QS1RfREVGQVVMVF9NQ0FTVDsKKwlsaW5rX3NldF9xdWV1ZV9saW1pdHMoYmNsLCBCQ0xJTktfV0lOX0RFRkFVTFQpOworCWJjbC0+Yl9wdHIgPSAmYmNiZWFyZXItPmJlYXJlcjsKKwliY2wtPnN0YXRlID0gV09SS0lOR19XT1JLSU5HOworCXNwcmludGYoYmNsLT5uYW1lLCBiY19saW5rX25hbWUpOworCisJaWYgKEJDTElOS19MT0dfQlVGX1NJWkUpIHsKKwkJY2hhciAqcGIgPSBrbWFsbG9jKEJDTElOS19MT0dfQlVGX1NJWkUsIEdGUF9BVE9NSUMpOworCisJCWlmICghcGIpCisJCQlnb3RvIG5vbWVtOworCQlwcmludGJ1Zl9pbml0KCZiY2wtPnByaW50X2J1ZiwgcGIsIEJDTElOS19MT0dfQlVGX1NJWkUpOworCX0KKworCXJldHVybiBUSVBDX09LOworfQorCit2b2lkIGJjbGlua19zdG9wKHZvaWQpCit7CisJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKwlpZiAoYmNiZWFyZXIpIHsKKwkJbGlua19zdG9wKGJjbCk7CisJCWlmIChCQ0xJTktfTE9HX0JVRl9TSVpFKQorCQkJa2ZyZWUoYmNsLT5wcmludF9idWYuYnVmKTsKKwkJYmNsID0gTlVMTDsKKwkJa2ZyZWUoYmNsaW5rKTsKKwkJYmNsaW5rID0gTlVMTDsKKwkJa2ZyZWUoYmNiZWFyZXIpOworCQliY2JlYXJlciA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmNhc3QuaCBiL25ldC90aXBjL2JjYXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzMGU1MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2JjYXN0LmgKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBuZXQvdGlwYy9iY2FzdC5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgYnJvYWRjYXN0IGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19CQ0FTVF9ICisjZGVmaW5lIF9USVBDX0JDQVNUX0gKKworI2RlZmluZSBNQVhfTk9ERVMgNDA5NgorI2RlZmluZSBXU0laRSAzMgorCisvKioKKyAqIHN0cnVjdCBub2RlX21hcCAtIHNldCBvZiBub2RlIGlkZW50aWZpZXJzCisgKiBAY291bnQ6ICMgb2Ygbm9kZXMgaW4gc2V0CisgKiBAbWFwOiBiaXRtYXAgb2Ygbm9kZSBpZGVudGlmaWVycyB0aGF0IGFyZSBpbiB0aGUgc2V0CisgKi8KKworc3RydWN0IG5vZGVfbWFwIHsKKwl1MzIgY291bnQ7CisJdTMyIG1hcFtNQVhfTk9ERVMgLyBXU0laRV07Cit9OworCisKKyNkZWZpbmUgUExTSVpFIDMyCisKKy8qKgorICogc3RydWN0IHBvcnRfbGlzdCAtIHNldCBvZiBub2RlIGxvY2FsIGRlc3RpbmF0aW9uIHBvcnRzCisgKiBAY291bnQ6ICMgb2YgcG9ydHMgaW4gc2V0IChvbmx5IHZhbGlkIGZvciBmaXJzdCBlbnRyeSBpbiBsaXN0KQorICogQG5leHQ6IHBvaW50ZXIgdG8gbmV4dCBlbnRyeSBpbiBsaXN0CisgKiBAcG9ydHM6IGFycmF5IG9mIHBvcnQgcmVmZXJlbmNlcworICovCisKK3N0cnVjdCBwb3J0X2xpc3QgeworCWludCBjb3VudDsKKwlzdHJ1Y3QgcG9ydF9saXN0ICpuZXh0OworCXUzMiBwb3J0c1tQTFNJWkVdOworfTsKKworCitzdHJ1Y3Qgbm9kZTsKKworZXh0ZXJuIGNoYXIgYmNfbGlua19uYW1lW107CisKKworLyoqCisgKiBubWFwX2dldCAtIGRldGVybWluZSBpZiBub2RlIGV4aXN0cyBpbiBhIG5vZGUgbWFwCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgbm1hcF9nZXQoc3RydWN0IG5vZGVfbWFwICpubV9wdHIsIHUzMiBub2RlKQoreworCWludCBuID0gdGlwY19ub2RlKG5vZGUpOworCWludCB3ID0gbiAvIFdTSVpFOworCWludCBiID0gbiAlIFdTSVpFOworCisJcmV0dXJuIG5tX3B0ci0+bWFwW3ddICYgKDEgPDwgYik7Cit9CisKKy8qKgorICogbm1hcF9hZGQgLSBhZGQgYSBub2RlIHRvIGEgbm9kZSBtYXAKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbm1hcF9hZGQoc3RydWN0IG5vZGVfbWFwICpubV9wdHIsIHUzMiBub2RlKQoreworCWludCBuID0gdGlwY19ub2RlKG5vZGUpOworCWludCB3ID0gbiAvIFdTSVpFOworCXUzMiBtYXNrID0gKDEgPDwgKG4gJSBXU0laRSkpOworCisJaWYgKChubV9wdHItPm1hcFt3XSAmIG1hc2spID09IDApIHsKKwkJbm1fcHRyLT5jb3VudCsrOworCQlubV9wdHItPm1hcFt3XSB8PSBtYXNrOworCX0KK30KKworLyoqIAorICogbm1hcF9yZW1vdmUgLSByZW1vdmUgYSBub2RlIGZyb20gYSBub2RlIG1hcAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBubWFwX3JlbW92ZShzdHJ1Y3Qgbm9kZV9tYXAgKm5tX3B0ciwgdTMyIG5vZGUpCit7CisJaW50IG4gPSB0aXBjX25vZGUobm9kZSk7CisJaW50IHcgPSBuIC8gV1NJWkU7CisJdTMyIG1hc2sgPSAoMSA8PCAobiAlIFdTSVpFKSk7CisKKwlpZiAoKG5tX3B0ci0+bWFwW3ddICYgbWFzaykgIT0gMCkgeworCQlubV9wdHItPm1hcFt3XSAmPSB+bWFzazsKKwkJbm1fcHRyLT5jb3VudC0tOworCX0KK30KKworLyoqCisgKiBubWFwX2VxdWFsIC0gdGVzdCBmb3IgZXF1YWxpdHkgb2Ygbm9kZSBtYXBzCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgbm1hcF9lcXVhbChzdHJ1Y3Qgbm9kZV9tYXAgKm5tX2EsIHN0cnVjdCBub2RlX21hcCAqbm1fYikKK3sKKwlyZXR1cm4gIW1lbWNtcChubV9hLCBubV9iLCBzaXplb2YoKm5tX2EpKTsKK30KKworLyoqCisgKiBubWFwX2RpZmYgLSBmaW5kIGRpZmZlcmVuY2VzIGJldHdlZW4gbm9kZSBtYXBzCisgKiBAbm1fYTogaW5wdXQgbm9kZSBtYXAgQQorICogQG5tX2I6IGlucHV0IG5vZGUgbWFwIEIKKyAqIEBubV9kaWZmOiBvdXRwdXQgbm9kZSBtYXAgQS1CIChpLmUuIG5vZGVzIG9mIEEgdGhhdCBhcmUgbm90IGluIEIpCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG5tYXBfZGlmZihzdHJ1Y3Qgbm9kZV9tYXAgKm5tX2EsIHN0cnVjdCBub2RlX21hcCAqbm1fYiwKKwkJCSAgICAgc3RydWN0IG5vZGVfbWFwICpubV9kaWZmKQoreworCWludCBzdG9wID0gc2l6ZW9mKG5tX2EtPm1hcCkgLyBzaXplb2YodTMyKTsKKwlpbnQgdzsKKwlpbnQgYjsKKwl1MzIgbWFwOworCisJbWVtc2V0KG5tX2RpZmYsIDAsIHNpemVvZigqbm1fZGlmZikpOworCWZvciAodyA9IDA7IHcgPCBzdG9wOyB3KyspIHsKKwkJbWFwID0gbm1fYS0+bWFwW3ddIF4gKG5tX2EtPm1hcFt3XSAmIG5tX2ItPm1hcFt3XSk7CisJCW5tX2RpZmYtPm1hcFt3XSA9IG1hcDsKKwkJaWYgKG1hcCAhPSAwKSB7CisJCQlmb3IgKGIgPSAwIDsgYiA8IFdTSVpFOyBiKyspIHsKKwkJCQlpZiAobWFwICYgKDEgPDwgYikpCisJCQkJCW5tX2RpZmYtPmNvdW50Kys7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKgorICogcG9ydF9saXN0X2FkZCAtIGFkZCBhIHBvcnQgdG8gYSBwb3J0IGxpc3QsIGVuc3VyaW5nIG5vIGR1cGxpY2F0ZXMKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcG9ydF9saXN0X2FkZChzdHJ1Y3QgcG9ydF9saXN0ICpwbF9wdHIsIHUzMiBwb3J0KQoreworCXN0cnVjdCBwb3J0X2xpc3QgKml0ZW0gPSBwbF9wdHI7CisJaW50IGk7CisJaW50IGl0ZW1fc3ogPSBQTFNJWkU7CisJaW50IGNudCA9IHBsX3B0ci0+Y291bnQ7CisKKwlmb3IgKDsgOyBjbnQgLT0gaXRlbV9zeiwgaXRlbSA9IGl0ZW0tPm5leHQpIHsKKwkJaWYgKGNudCA8IFBMU0laRSkKKwkJCWl0ZW1fc3ogPSBjbnQ7CisJCWZvciAoaSA9IDA7IGkgPCBpdGVtX3N6OyBpKyspCisJCQlpZiAoaXRlbS0+cG9ydHNbaV0gPT0gcG9ydCkKKwkJCQlyZXR1cm47CisJCWlmIChpIDwgUExTSVpFKSB7CisJCQlpdGVtLT5wb3J0c1tpXSA9IHBvcnQ7CisJCQlwbF9wdHItPmNvdW50Kys7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFpdGVtLT5uZXh0KSB7CisJCQlpdGVtLT5uZXh0ID0ga21hbGxvYyhzaXplb2YoKml0ZW0pLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghaXRlbS0+bmV4dCkgeworCQkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOiBtdWx0aWNhc3QgZGVzdGluYXRpb24gcG9ydCBsaXN0IGlzIGluY29tcGxldGVcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWl0ZW0tPm5leHQtPm5leHQgPSBOVUxMOworCQl9CisJfQorfQorCisvKioKKyAqIHBvcnRfbGlzdF9mcmVlIC0gZnJlZSBkeW5hbWljYWxseSBjcmVhdGVkIGVudHJpZXMgaW4gcG9ydF9saXN0IGNoYWluCisgKiAKKyAqIE5vdGU6IEZpcnN0IGl0ZW0gaXMgb24gc3RhY2ssIHNvIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSByZWxlYXNlZAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwb3J0X2xpc3RfZnJlZShzdHJ1Y3QgcG9ydF9saXN0ICpwbF9wdHIpCit7CisJc3RydWN0IHBvcnRfbGlzdCAqaXRlbTsKKwlzdHJ1Y3QgcG9ydF9saXN0ICpuZXh0OworCisJZm9yIChpdGVtID0gcGxfcHRyLT5uZXh0OyBpdGVtOyBpdGVtID0gbmV4dCkgeworCQluZXh0ID0gaXRlbS0+bmV4dDsKKwkJa2ZyZWUoaXRlbSk7CisJfQorfQorCisKK2ludCAgYmNsaW5rX2luaXQodm9pZCk7Cit2b2lkIGJjbGlua19zdG9wKHZvaWQpOwordm9pZCBiY2xpbmtfYWNrbm93bGVkZ2Uoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgYWNrZWQpOworaW50ICBiY2xpbmtfc2VuZF9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1Zik7Cit2b2lkIGJjbGlua19yZWN2X3BrdChzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK3UzMiAgYmNsaW5rX2dldF9sYXN0X3NlbnQodm9pZCk7Cit1MzIgIGJjbGlua19hY2tzX21pc3Npbmcoc3RydWN0IG5vZGUgKm5fcHRyKTsKK3ZvaWQgYmNsaW5rX2NoZWNrX2dhcChzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHUzMiBzZXFubyk7CitpbnQgIGJjbGlua19zdGF0cyhjaGFyICpzdGF0c19idWYsIGNvbnN0IHUzMiBidWZfc2l6ZSk7CitpbnQgIGJjbGlua19yZXNldF9zdGF0cyh2b2lkKTsKK2ludCAgYmNsaW5rX3NldF9xdWV1ZV9saW1pdHModTMyIGxpbWl0KTsKK3ZvaWQgYmNiZWFyZXJfc29ydCh2b2lkKTsKK3ZvaWQgYmNiZWFyZXJfcHVzaCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iZWFyZXIuYyBiL25ldC90aXBjL2JlYXJlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDE5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9iZWFyZXIuYwpAQCAtMCwwICsxLDY5MiBAQAorLyoKKyAqIG5ldC90aXBjL2JlYXJlci5jOiBUSVBDIGJlYXJlciBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJiZWFyZXIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgImRpc2NvdmVyLmgiCisjaW5jbHVkZSAiYmNhc3QuaCIKKworI2RlZmluZSBNQVhfQUREUl9TVFIgMzIKKworc3RhdGljIHN0cnVjdCBtZWRpYSAqbWVkaWFfbGlzdCA9IDA7CitzdGF0aWMgdTMyIG1lZGlhX2NvdW50ID0gMDsKKworc3RydWN0IGJlYXJlciAqYmVhcmVycyA9IDA7CisKKy8qKgorICogbWVkaWFfbmFtZV92YWxpZCAtIHZhbGlkYXRlIG1lZGlhIG5hbWUKKyAqIAorICogUmV0dXJucyAxIGlmIG1lZGlhIG5hbWUgaXMgdmFsaWQsIG90aGVyd2lzZSAwLgorICovCisKK3N0YXRpYyBpbnQgbWVkaWFfbmFtZV92YWxpZChjb25zdCBjaGFyICpuYW1lKQoreworCXUzMiBsZW47CisKKwlsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKChsZW4gKyAxKSA+IFRJUENfTUFYX01FRElBX05BTUUpCisJCXJldHVybiAwOworCXJldHVybiAoc3Ryc3BuKG5hbWUsIHRpcGNfYWxwaGFiZXQpID09IGxlbik7Cit9CisKKy8qKgorICogbWVkaWFfZmluZCAtIGxvY2F0ZXMgc3BlY2lmaWVkIG1lZGlhIG9iamVjdCBieSBuYW1lCisgKi8KKworc3RhdGljIHN0cnVjdCBtZWRpYSAqbWVkaWFfZmluZChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBtZWRpYSAqbV9wdHI7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwLCBtX3B0ciA9IG1lZGlhX2xpc3Q7IGkgPCBtZWRpYV9jb3VudDsgaSsrLCBtX3B0cisrKSB7CisJCWlmICghc3RyY21wKG1fcHRyLT5uYW1lLCBuYW1lKSkKKwkJCXJldHVybiBtX3B0cjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdGlwY19yZWdpc3Rlcl9tZWRpYSAtIHJlZ2lzdGVyIGEgbWVkaWEgdHlwZQorICogCisgKiBCZWFyZXJzIGZvciB0aGlzIG1lZGlhIHR5cGUgbXVzdCBiZSBhY3RpdmF0ZWQgc2VwYXJhdGVseSBhdCBhIGxhdGVyIHN0YWdlLgorICovCisKK2ludCAgdGlwY19yZWdpc3Rlcl9tZWRpYSh1MzIgbWVkaWFfdHlwZSwKKwkJCSBjaGFyICpuYW1lLCAKKwkJCSBpbnQgKCplbmFibGUpKHN0cnVjdCB0aXBjX2JlYXJlciAqKSwgCisJCQkgdm9pZCAoKmRpc2FibGUpKHN0cnVjdCB0aXBjX2JlYXJlciAqKSwgCisJCQkgaW50ICgqc2VuZF9tc2cpKHN0cnVjdCBza19idWZmICosIAorCQkJCQkgc3RydWN0IHRpcGNfYmVhcmVyICosCisJCQkJCSBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICopLCAKKwkJCSBjaGFyICooKmFkZHIyc3RyKShzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphLAorCQkJCQkgICBjaGFyICpzdHJfYnVmLCBpbnQgc3RyX3NpemUpLAorCQkJIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmJjYXN0X2FkZHIsCisJCQkgY29uc3QgdTMyIGJlYXJlcl9wcmlvcml0eSwKKwkJCSBjb25zdCB1MzIgbGlua190b2xlcmFuY2UsICAvKiBbbXNdICovCisJCQkgY29uc3QgdTMyIHNlbmRfd2luZG93X2xpbWl0KQoreworCXN0cnVjdCBtZWRpYSAqbV9wdHI7CisJdTMyIG1lZGlhX2lkOworCXUzMiBpOworCWludCByZXMgPSAtRUlOVkFMOworCisJd3JpdGVfbG9ja19iaCgmbmV0X2xvY2spOworCWlmICghbWVkaWFfbGlzdCkKKwkJZ290byBleGl0OworCisJaWYgKCFtZWRpYV9uYW1lX3ZhbGlkKG5hbWUpKSB7CisJCXdhcm4oIk1lZGlhIHJlZ2lzdHJhdGlvbiBlcnJvcjogaWxsZWdhbCBuYW1lIDwlcz5cbiIsIG5hbWUpOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICghYmNhc3RfYWRkcikgeworCQl3YXJuKCJNZWRpYSByZWdpc3RyYXRpb24gZXJyb3I6IG5vIGJyb2FkY2FzdCBhZGRyZXNzIHN1cHBsaWVkXG4iKTsKKwkJZ290byBleGl0OworCX0KKwlpZiAoYmVhcmVyX3ByaW9yaXR5ID49IFRJUENfTlVNX0xJTktfUFJJKSB7CisJCXdhcm4oIk1lZGlhIHJlZ2lzdHJhdGlvbiBlcnJvcjogcHJpb3JpdHkgJXVcbiIsIGJlYXJlcl9wcmlvcml0eSk7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKChsaW5rX3RvbGVyYW5jZSA8IFRJUENfTUlOX0xJTktfVE9MKSB8fCAKKwkgICAgKGxpbmtfdG9sZXJhbmNlID4gVElQQ19NQVhfTElOS19UT0wpKSB7CisJCXdhcm4oIk1lZGlhIHJlZ2lzdHJhdGlvbiBlcnJvcjogdG9sZXJhbmNlICV1XG4iLCBsaW5rX3RvbGVyYW5jZSk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwltZWRpYV9pZCA9IG1lZGlhX2NvdW50Kys7CisJaWYgKG1lZGlhX2lkID49IE1BWF9NRURJQSkgeworCQl3YXJuKCJBdHRlbXB0IHRvIHJlZ2lzdGVyIG1vcmUgdGhhbiAldSBtZWRpYVxuIiwgTUFYX01FRElBKTsKKwkJbWVkaWFfY291bnQtLTsKKwkJZ290byBleGl0OworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbWVkaWFfaWQ7IGkrKykgeworCQlpZiAobWVkaWFfbGlzdFtpXS50eXBlX2lkID09IG1lZGlhX3R5cGUpIHsKKwkJCXdhcm4oIkF0dGVtcHQgdG8gcmVnaXN0ZXIgc2Vjb25kIG1lZGlhIHdpdGggdHlwZSAldVxuIiwgCisJCQkgICAgIG1lZGlhX3R5cGUpOworCQkJbWVkaWFfY291bnQtLTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlpZiAoIXN0cmNtcChuYW1lLCBtZWRpYV9saXN0W2ldLm5hbWUpKSB7CisJCQl3YXJuKCJBdHRlbXB0IHRvIHJlLXJlZ2lzdGVyIG1lZGlhIG5hbWUgPCVzPlxuIiwgbmFtZSk7CisJCQltZWRpYV9jb3VudC0tOworCQkJZ290byBleGl0OworCQl9CisJfQorCisJbV9wdHIgPSAmbWVkaWFfbGlzdFttZWRpYV9pZF07CisJbV9wdHItPnR5cGVfaWQgPSBtZWRpYV90eXBlOworCW1fcHRyLT5zZW5kX21zZyA9IHNlbmRfbXNnOworCW1fcHRyLT5lbmFibGVfYmVhcmVyID0gZW5hYmxlOworCW1fcHRyLT5kaXNhYmxlX2JlYXJlciA9IGRpc2FibGU7CisJbV9wdHItPmFkZHIyc3RyID0gYWRkcjJzdHI7CisJbWVtY3B5KCZtX3B0ci0+YmNhc3RfYWRkciwgYmNhc3RfYWRkciwgc2l6ZW9mKCpiY2FzdF9hZGRyKSk7CisJbV9wdHItPmJjYXN0ID0gMTsKKwlzdHJjcHkobV9wdHItPm5hbWUsIG5hbWUpOworCW1fcHRyLT5wcmlvcml0eSA9IGJlYXJlcl9wcmlvcml0eTsKKwltX3B0ci0+dG9sZXJhbmNlID0gbGlua190b2xlcmFuY2U7CisJbV9wdHItPndpbmRvdyA9IHNlbmRfd2luZG93X2xpbWl0OworCWRiZygiTWVkaWEgPCVzPiByZWdpc3RlcmVkXG4iLCBuYW1lKTsKKwlyZXMgPSAwOworZXhpdDoKKwl3cml0ZV91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIG1lZGlhX2FkZHJfcHJpbnRmIC0gcmVjb3JkIG1lZGlhIGFkZHJlc3MgaW4gcHJpbnQgYnVmZmVyCisgKi8KKwordm9pZCBtZWRpYV9hZGRyX3ByaW50ZihzdHJ1Y3QgcHJpbnRfYnVmICpwYiwgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSkKK3sKKwlzdHJ1Y3QgbWVkaWEgKm1fcHRyOworCXUzMiBtZWRpYV90eXBlOworCXUzMiBpOworCisJbWVkaWFfdHlwZSA9IG50b2hsKGEtPnR5cGUpOworCWZvciAoaSA9IDAsIG1fcHRyID0gbWVkaWFfbGlzdDsgaSA8IG1lZGlhX2NvdW50OyBpKyssIG1fcHRyKyspIHsKKwkJaWYgKG1fcHRyLT50eXBlX2lkID09IG1lZGlhX3R5cGUpCisJCQlicmVhazsKKwl9CisKKwlpZiAoKGkgPCBtZWRpYV9jb3VudCkgJiYgKG1fcHRyLT5hZGRyMnN0ciAhPSBOVUxMKSkgeworCQljaGFyIGFkZHJfc3RyW01BWF9BRERSX1NUUl07CisKKwkJdGlwY19wcmludGYocGIsICIlcyglcykgIiwgbV9wdHItPm5hbWUsIAorCQkJICAgIG1fcHRyLT5hZGRyMnN0cihhLCBhZGRyX3N0ciwgc2l6ZW9mKGFkZHJfc3RyKSkpOworCX0gZWxzZSB7CisJCXVuY2hhciAqYWRkciA9ICh1bmNoYXIgKikmYS0+ZGV2X2FkZHI7CisKKwkJdGlwY19wcmludGYocGIsICJVTktOT1dOKCV1KToiLCBtZWRpYV90eXBlKTsKKwkJZm9yIChpID0gMDsgaSA8IChzaXplb2YoKmEpIC0gc2l6ZW9mKGEtPnR5cGUpKTsgaSsrKSB7CisJCQl0aXBjX3ByaW50ZihwYiwgIiUwMnggIiwgYWRkcltpXSk7CisJCX0KKwl9Cit9CisKKy8qKgorICogbWVkaWFfZ2V0X25hbWVzIC0gcmVjb3JkIG5hbWVzIG9mIHJlZ2lzdGVyZWQgbWVkaWEgaW4gYnVmZmVyCisgKi8KKworc3RydWN0IHNrX2J1ZmYgKm1lZGlhX2dldF9uYW1lcyh2b2lkKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IG1lZGlhICptX3B0cjsKKwlpbnQgaTsKKworCWJ1ZiA9IGNmZ19yZXBseV9hbGxvYyhNQVhfTUVESUEgKiBUTFZfU1BBQ0UoVElQQ19NQVhfTUVESUFfTkFNRSkpOworCWlmICghYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCXJlYWRfbG9ja19iaCgmbmV0X2xvY2spOworCWZvciAoaSA9IDAsIG1fcHRyID0gbWVkaWFfbGlzdDsgaSA8IG1lZGlhX2NvdW50OyBpKyssIG1fcHRyKyspIHsKKwkJY2ZnX2FwcGVuZF90bHYoYnVmLCBUSVBDX1RMVl9NRURJQV9OQU1FLCBtX3B0ci0+bmFtZSwgCisJCQkgICAgICAgc3RybGVuKG1fcHRyLT5uYW1lKSArIDEpOworCX0KKwlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOworCXJldHVybiBidWY7Cit9CisKKy8qKgorICogYmVhcmVyX25hbWVfdmFsaWRhdGUgLSB2YWxpZGF0ZSAmIChvcHRpb25hbGx5KSBkZWNvbnN0cnVjdCBiZWFyZXIgbmFtZQorICogQG5hbWUgLSBwdHIgdG8gYmVhcmVyIG5hbWUgc3RyaW5nCisgKiBAbmFtZV9wYXJ0cyAtIHB0ciB0byBhcmVhIGZvciBiZWFyZXIgbmFtZSBjb21wb25lbnRzIChvciBOVUxMIGlmIG5vdCBuZWVkZWQpCisgKiAKKyAqIFJldHVybnMgMSBpZiBiZWFyZXIgbmFtZSBpcyB2YWxpZCwgb3RoZXJ3aXNlIDAuCisgKi8KKworc3RhdGljIGludCBiZWFyZXJfbmFtZV92YWxpZGF0ZShjb25zdCBjaGFyICpuYW1lLCAKKwkJCQlzdHJ1Y3QgYmVhcmVyX25hbWUgKm5hbWVfcGFydHMpCit7CisJY2hhciBuYW1lX2NvcHlbVElQQ19NQVhfQkVBUkVSX05BTUVdOworCWNoYXIgKm1lZGlhX25hbWU7CisJY2hhciAqaWZfbmFtZTsKKwl1MzIgbWVkaWFfbGVuOworCXUzMiBpZl9sZW47CisKKwkvKiBjb3B5IGJlYXJlciBuYW1lICYgZW5zdXJlIGxlbmd0aCBpcyBPSyAqLworCisJbmFtZV9jb3B5W1RJUENfTUFYX0JFQVJFUl9OQU1FIC0gMV0gPSAwOworCS8qIG5lZWQgYWJvdmUgaW4gY2FzZSBub24tUG9zaXggc3RybmNweSgpIGRvZXNuJ3QgcGFkIHdpdGggbnVsbHMgKi8KKwlzdHJuY3B5KG5hbWVfY29weSwgbmFtZSwgVElQQ19NQVhfQkVBUkVSX05BTUUpOworCWlmIChuYW1lX2NvcHlbVElQQ19NQVhfQkVBUkVSX05BTUUgLSAxXSAhPSAwKQorCQlyZXR1cm4gMDsKKworCS8qIGVuc3VyZSBhbGwgY29tcG9uZW50IHBhcnRzIG9mIGJlYXJlciBuYW1lIGFyZSBwcmVzZW50ICovCisKKwltZWRpYV9uYW1lID0gbmFtZV9jb3B5OworCWlmICgoaWZfbmFtZSA9IHN0cmNocihtZWRpYV9uYW1lLCAnOicpKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwkqKGlmX25hbWUrKykgPSAwOworCW1lZGlhX2xlbiA9IGlmX25hbWUgLSBtZWRpYV9uYW1lOworCWlmX2xlbiA9IHN0cmxlbihpZl9uYW1lKSArIDE7CisKKwkvKiB2YWxpZGF0ZSBjb21wb25lbnQgcGFydHMgb2YgYmVhcmVyIG5hbWUgKi8KKworCWlmICgobWVkaWFfbGVuIDw9IDEpIHx8IChtZWRpYV9sZW4gPiBUSVBDX01BWF9NRURJQV9OQU1FKSB8fCAKKwkgICAgKGlmX2xlbiA8PSAxKSB8fCAoaWZfbGVuID4gVElQQ19NQVhfSUZfTkFNRSkgfHwgCisJICAgIChzdHJzcG4obWVkaWFfbmFtZSwgdGlwY19hbHBoYWJldCkgIT0gKG1lZGlhX2xlbiAtIDEpKSB8fAorCSAgICAoc3Ryc3BuKGlmX25hbWUsIHRpcGNfYWxwaGFiZXQpICE9IChpZl9sZW4gLSAxKSkpCisJCXJldHVybiAwOworCisJLyogcmV0dXJuIGJlYXJlciBuYW1lIGNvbXBvbmVudHMsIGlmIG5lY2Vzc2FyeSAqLworCisJaWYgKG5hbWVfcGFydHMpIHsKKwkJc3RyY3B5KG5hbWVfcGFydHMtPm1lZGlhX25hbWUsIG1lZGlhX25hbWUpOworCQlzdHJjcHkobmFtZV9wYXJ0cy0+aWZfbmFtZSwgaWZfbmFtZSk7CisJfQorCXJldHVybiAxOworfQorCisvKioKKyAqIGJlYXJlcl9maW5kIC0gbG9jYXRlcyBiZWFyZXIgb2JqZWN0IHdpdGggbWF0Y2hpbmcgYmVhcmVyIG5hbWUKKyAqLworCitzdGF0aWMgc3RydWN0IGJlYXJlciAqYmVhcmVyX2ZpbmQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0cjsKKwl1MzIgaTsKKworCWZvciAoaSA9IDAsIGJfcHRyID0gYmVhcmVyczsgaSA8IE1BWF9CRUFSRVJTOyBpKyssIGJfcHRyKyspIHsKKwkJaWYgKGJfcHRyLT5hY3RpdmUgJiYgKCFzdHJjbXAoYl9wdHItPnB1YmwubmFtZSwgbmFtZSkpKQorCQkJcmV0dXJuIGJfcHRyOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiZWFyZXJfZmluZCAtIGxvY2F0ZXMgYmVhcmVyIG9iamVjdCB3aXRoIG1hdGNoaW5nIGludGVyZmFjZSBuYW1lCisgKi8KKworc3RydWN0IGJlYXJlciAqYmVhcmVyX2ZpbmRfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUpCit7CisJc3RydWN0IGJlYXJlciAqYl9wdHI7CisJY2hhciAqYl9pZl9uYW1lOworCXUzMiBpOworCisJZm9yIChpID0gMCwgYl9wdHIgPSBiZWFyZXJzOyBpIDwgTUFYX0JFQVJFUlM7IGkrKywgYl9wdHIrKykgeworCQlpZiAoIWJfcHRyLT5hY3RpdmUpCisJCQljb250aW51ZTsKKwkJYl9pZl9uYW1lID0gc3RyY2hyKGJfcHRyLT5wdWJsLm5hbWUsICc6JykgKyAxOworCQlpZiAoIXN0cmNtcChiX2lmX25hbWUsIGlmX25hbWUpKQorCQkJcmV0dXJuIGJfcHRyOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiZWFyZXJfZ2V0X25hbWVzIC0gcmVjb3JkIG5hbWVzIG9mIGJlYXJlcnMgaW4gYnVmZmVyCisgKi8KKworc3RydWN0IHNrX2J1ZmYgKmJlYXJlcl9nZXRfbmFtZXModm9pZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCBtZWRpYSAqbV9wdHI7CisJc3RydWN0IGJlYXJlciAqYl9wdHI7CisJaW50IGksIGo7CisKKwlidWYgPSBjZmdfcmVwbHlfYWxsb2MoTUFYX0JFQVJFUlMgKiBUTFZfU1BBQ0UoVElQQ19NQVhfQkVBUkVSX05BTUUpKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZWFkX2xvY2tfYmgoJm5ldF9sb2NrKTsKKwlmb3IgKGkgPSAwLCBtX3B0ciA9IG1lZGlhX2xpc3Q7IGkgPCBtZWRpYV9jb3VudDsgaSsrLCBtX3B0cisrKSB7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfQkVBUkVSUzsgaisrKSB7CisJCQliX3B0ciA9ICZiZWFyZXJzW2pdOworCQkJaWYgKGJfcHRyLT5hY3RpdmUgJiYgKGJfcHRyLT5tZWRpYSA9PSBtX3B0cikpIHsKKwkJCQljZmdfYXBwZW5kX3RsdihidWYsIFRJUENfVExWX0JFQVJFUl9OQU1FLCAKKwkJCQkJICAgICAgIGJfcHRyLT5wdWJsLm5hbWUsIAorCQkJCQkgICAgICAgc3RybGVuKGJfcHRyLT5wdWJsLm5hbWUpICsgMSk7CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwlyZXR1cm4gYnVmOworfQorCit2b2lkIGJlYXJlcl9hZGRfZGVzdChzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgdTMyIGRlc3QpCit7CisJbm1hcF9hZGQoJmJfcHRyLT5ub2RlcywgZGVzdCk7CisJZGlzY191cGRhdGVfbGlua19yZXEoYl9wdHItPmxpbmtfcmVxKTsKKwliY2JlYXJlcl9zb3J0KCk7Cit9CisKK3ZvaWQgYmVhcmVyX3JlbW92ZV9kZXN0KHN0cnVjdCBiZWFyZXIgKmJfcHRyLCB1MzIgZGVzdCkKK3sKKwlubWFwX3JlbW92ZSgmYl9wdHItPm5vZGVzLCBkZXN0KTsKKwlkaXNjX3VwZGF0ZV9saW5rX3JlcShiX3B0ci0+bGlua19yZXEpOworCWJjYmVhcmVyX3NvcnQoKTsKK30KKworLyoKKyAqIGJlYXJlcl9wdXNoKCk6IFJlc29sdmUgYmVhcmVyIGNvbmdlc3Rpb24uIEZvcmNlIHRoZSB3YWl0aW5nCisgKiBsaW5rcyB0byBwdXNoIG91dCB0aGVpciB1bnNlbnQgcGFja2V0cywgb25lIHBhY2tldCBwZXIgbGluaworICogcGVyIGl0ZXJhdGlvbiwgdW50aWwgYWxsIHBhY2tldHMgYXJlIGdvbmUgb3IgY29uZ2VzdGlvbiByZW9jY3Vycy4KKyAqICduZXRfbG9jaycgaXMgcmVhZF9sb2NrZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogYmVhcmVyLmxvY2sgbXVzdCBiZSB0YWtlbiBiZWZvcmUgY2FsbGluZworICogUmV0dXJucyBiaW5hcnkgdHJ1ZSgxKSBvcmUgZmFsc2UoMCkKKyAqLworc3RhdGljIGludCBiZWFyZXJfcHVzaChzdHJ1Y3QgYmVhcmVyICpiX3B0cikKK3sKKwl1MzIgcmVzID0gVElQQ19PSzsKKwlzdHJ1Y3QgbGluayAqbG4sICp0bG47CisKKwlpZiAoYl9wdHItPnB1YmwuYmxvY2tlZCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmJfcHRyLT5jb25nX2xpbmtzKSAmJiAocmVzICE9IFBVU0hfRkFJTEVEKSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG4sIHRsbiwgJmJfcHRyLT5jb25nX2xpbmtzLCBsaW5rX2xpc3QpIHsKKwkJCXJlcyA9IGxpbmtfcHVzaF9wYWNrZXQobG4pOworCQkJaWYgKHJlcyA9PSBQVVNIX0ZBSUxFRCkKKwkJCQlicmVhazsKKwkJCWlmIChyZXMgPT0gUFVTSF9GSU5JU0hFRCkKKwkJCQlsaXN0X21vdmVfdGFpbCgmbG4tPmxpbmtfbGlzdCwgJmJfcHRyLT5saW5rcyk7CisJCX0KKwl9CisJcmV0dXJuIGxpc3RfZW1wdHkoJmJfcHRyLT5jb25nX2xpbmtzKTsKK30KKwordm9pZCBiZWFyZXJfbG9ja19wdXNoKHN0cnVjdCBiZWFyZXIgKmJfcHRyKQoreworCWludCByZXM7CisKKwlzcGluX2xvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCXJlcyA9IGJlYXJlcl9wdXNoKGJfcHRyKTsKKwlzcGluX3VubG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJaWYgKHJlcykKKwkJYmNiZWFyZXJfcHVzaCgpOworfQorCisKKy8qCisgKiBJbnRlcnJ1cHQgZW5hYmxpbmcgbmV3IHJlcXVlc3RzIGFmdGVyIGJlYXJlciBjb25nZXN0aW9uIG9yIGJsb2NraW5nOiAgICAKKyAqIFNlZSBiZWFyZXJfc2VuZCgpLiAgIAorICovCit2b2lkIHRpcGNfY29udGludWUoc3RydWN0IHRpcGNfYmVhcmVyICp0Yl9wdHIpCit7CisJc3RydWN0IGJlYXJlciAqYl9wdHIgPSAoc3RydWN0IGJlYXJlciAqKXRiX3B0cjsKKworCXNwaW5fbG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJYl9wdHItPmNvbnRpbnVlX2NvdW50Kys7CisJaWYgKCFsaXN0X2VtcHR5KCZiX3B0ci0+Y29uZ19saW5rcykpCisJCWtfc2lnbmFsKChIYW5kbGVyKWJlYXJlcl9sb2NrX3B1c2gsICh1bnNpZ25lZCBsb25nKWJfcHRyKTsKKwliX3B0ci0+cHVibC5ibG9ja2VkID0gMDsKKwlzcGluX3VubG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7Cit9CisKKy8qCisgKiBTY2hlZHVsZSBsaW5rIGZvciBzZW5kaW5nIG9mIG1lc3NhZ2VzIGFmdGVyIHRoZSBiZWFyZXIgCisgKiBoYXMgYmVlbiBkZWJsb2NrZWQgYnkgJ2NvbnRpbnVlKCknLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgCisgKiB3aGVuIHNvbWVib2R5IHRyaWVzIHRvIHNlbmQgYSBtZXNzYWdlIHZpYSB0aGlzIGxpbmsgd2hpbGUgCisgKiB0aGUgYmVhcmVyIGlzIGNvbmdlc3RlZC4gJ25ldF9sb2NrJyBpcyBpbiByZWFkX2xvY2sgaGVyZQorICogYmVhcmVyLmxvY2sgaXMgYnVzeQorICovCisKK3N0YXRpYyB2b2lkIGJlYXJlcl9zY2hlZHVsZV91bmxvY2tlZChzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKQoreworCWxpc3RfbW92ZV90YWlsKCZsX3B0ci0+bGlua19saXN0LCAmYl9wdHItPmNvbmdfbGlua3MpOworfQorCisvKgorICogU2NoZWR1bGUgbGluayBmb3Igc2VuZGluZyBvZiBtZXNzYWdlcyBhZnRlciB0aGUgYmVhcmVyIAorICogaGFzIGJlZW4gZGVibG9ja2VkIGJ5ICdjb250aW51ZSgpJy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIAorICogd2hlbiBzb21lYm9keSB0cmllcyB0byBzZW5kIGEgbWVzc2FnZSB2aWEgdGhpcyBsaW5rIHdoaWxlIAorICogdGhlIGJlYXJlciBpcyBjb25nZXN0ZWQuICduZXRfbG9jaycgaXMgaW4gcmVhZF9sb2NrIGhlcmUsCisgKiBiZWFyZXIubG9jayBpcyBmcmVlCisgKi8KKwordm9pZCBiZWFyZXJfc2NoZWR1bGUoc3RydWN0IGJlYXJlciAqYl9wdHIsIHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlzcGluX2xvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCWJlYXJlcl9zY2hlZHVsZV91bmxvY2tlZChiX3B0ciwgbF9wdHIpOworCXNwaW5fdW5sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKK30KKworCisvKgorICogYmVhcmVyX3Jlc29sdmVfY29uZ2VzdGlvbigpOiBDaGVjayBpZiB0aGVyZSBpcyBiZWFyZXIgY29uZ2VzdGlvbiwKKyAqIGFuZCBpZiB0aGVyZSBpcywgdHJ5IHRvIHJlc29sdmUgaXQgYmVmb3JlIHJldHVybmluZy4KKyAqICduZXRfbG9jaycgaXMgcmVhZF9sb2NrZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICovCitpbnQgYmVhcmVyX3Jlc29sdmVfY29uZ2VzdGlvbihzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKQoreworCWludCByZXMgPSAxOworCisJaWYgKGxpc3RfZW1wdHkoJmJfcHRyLT5jb25nX2xpbmtzKSkKKwkJcmV0dXJuIDE7CisJc3Bpbl9sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKKwlpZiAoIWJlYXJlcl9wdXNoKGJfcHRyKSkgeworCQliZWFyZXJfc2NoZWR1bGVfdW5sb2NrZWQoYl9wdHIsIGxfcHRyKTsKKwkJcmVzID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCXJldHVybiByZXM7Cit9CisKKworLyoqCisgKiB0aXBjX2VuYWJsZV9iZWFyZXIgLSBlbmFibGUgYmVhcmVyIHdpdGggdGhlIGdpdmVuIG5hbWUKKyAqLyAgICAgICAgICAgICAgCisKK2ludCB0aXBjX2VuYWJsZV9iZWFyZXIoY29uc3QgY2hhciAqbmFtZSwgdTMyIGJjYXN0X3Njb3BlLCB1MzIgcHJpb3JpdHkpCit7CisJc3RydWN0IGJlYXJlciAqYl9wdHI7CisJc3RydWN0IG1lZGlhICptX3B0cjsKKwlzdHJ1Y3QgYmVhcmVyX25hbWUgYl9uYW1lOworCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCXUzMiBiZWFyZXJfaWQ7CisJdTMyIHdpdGhfdGhpc19wcmlvOworCXUzMiBpOworCWludCByZXMgPSAtRUlOVkFMOworCisJaWYgKHRpcGNfbW9kZSAhPSBUSVBDX05FVF9NT0RFKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCWlmICghYmVhcmVyX25hbWVfdmFsaWRhdGUobmFtZSwgJmJfbmFtZSkgfHwKKwkgICAgIWFkZHJfZG9tYWluX3ZhbGlkKGJjYXN0X3Njb3BlKSB8fAorCSAgICAhaW5fc2NvcGUoYmNhc3Rfc2NvcGUsIHRpcGNfb3duX2FkZHIpIHx8CisJICAgIChwcmlvcml0eSA+IFRJUENfTlVNX0xJTktfUFJJKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2JoKCZuZXRfbG9jayk7CisJaWYgKCFiZWFyZXJzKQorCQlnb3RvIGZhaWxlZDsKKworCW1fcHRyID0gbWVkaWFfZmluZChiX25hbWUubWVkaWFfbmFtZSk7CisJaWYgKCFtX3B0cikgeworCQl3YXJuKCJObyBtZWRpYSA8JXM+XG4iLCBiX25hbWUubWVkaWFfbmFtZSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZiAocHJpb3JpdHkgPT0gVElQQ19OVU1fTElOS19QUkkpCisJCXByaW9yaXR5ID0gbV9wdHItPnByaW9yaXR5OworCityZXN0YXJ0OgorCWJlYXJlcl9pZCA9IE1BWF9CRUFSRVJTOworCXdpdGhfdGhpc19wcmlvID0gMTsKKwlmb3IgKGkgPSBNQVhfQkVBUkVSUzsgaS0tICE9IDA7ICkgeworCQlpZiAoIWJlYXJlcnNbaV0uYWN0aXZlKSB7CisJCQliZWFyZXJfaWQgPSBpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAobmFtZSwgYmVhcmVyc1tpXS5wdWJsLm5hbWUpKSB7CisJCQl3YXJuKCJCZWFyZXIgPCVzPiBhbHJlYWR5IGVuYWJsZWRcbiIsIG5hbWUpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJaWYgKChiZWFyZXJzW2ldLnByaW9yaXR5ID09IHByaW9yaXR5KSAmJgorCQkgICAgKCsrd2l0aF90aGlzX3ByaW8gPiAyKSkgeworCQkJaWYgKHByaW9yaXR5LS0gPT0gMCkgeworCQkJCXdhcm4oIlRoaXJkIGJlYXJlciA8JXM+IHdpdGggcHJpb3JpdHkgJXUsIHVuYWJsZSB0byBsb3dlciB0byAldVxuIiwKKwkJCQkgICAgIG5hbWUsIHByaW9yaXR5ICsgMSwgcHJpb3JpdHkpOworCQkJCWdvdG8gZmFpbGVkOworCQkJfQorCQkJd2FybigiVGhpcmQgYmVhcmVyIDwlcz4gd2l0aCBwcmlvcml0eSAldSwgbG93ZXJpbmcgdG8gJXVcbiIsCisJCQkgICAgIG5hbWUsIHByaW9yaXR5ICsgMSwgcHJpb3JpdHkpOworCQkJZ290byByZXN0YXJ0OworCQl9CisJfQorCWlmIChiZWFyZXJfaWQgPj0gTUFYX0JFQVJFUlMpIHsKKwkJd2FybigiQXR0ZW1wdCB0byBlbmFibGUgbW9yZSB0aGFuICVkIGJlYXJlcnNcbiIsIE1BWF9CRUFSRVJTKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJYl9wdHIgPSAmYmVhcmVyc1tiZWFyZXJfaWRdOworCW1lbXNldChiX3B0ciwgMCwgc2l6ZW9mKHN0cnVjdCBiZWFyZXIpKTsKKworCXN0cmNweShiX3B0ci0+cHVibC5uYW1lLCBuYW1lKTsKKwlyZXMgPSBtX3B0ci0+ZW5hYmxlX2JlYXJlcigmYl9wdHItPnB1YmwpOworCWlmIChyZXMpIHsKKwkJd2FybigiRmFpbGVkIHRvIGVuYWJsZSBiZWFyZXIgPCVzPlxuIiwgbmFtZSk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWJfcHRyLT5pZGVudGl0eSA9IGJlYXJlcl9pZDsKKwliX3B0ci0+bWVkaWEgPSBtX3B0cjsKKwliX3B0ci0+bmV0X3BsYW5lID0gYmVhcmVyX2lkICsgJ0EnOworCWJfcHRyLT5hY3RpdmUgPSAxOworCWJfcHRyLT5kZXRlY3Rfc2NvcGUgPSBiY2FzdF9zY29wZTsKKwliX3B0ci0+cHJpb3JpdHkgPSBwcmlvcml0eTsKKwlJTklUX0xJU1RfSEVBRCgmYl9wdHItPmNvbmdfbGlua3MpOworCUlOSVRfTElTVF9IRUFEKCZiX3B0ci0+bGlua3MpOworCWlmIChtX3B0ci0+YmNhc3QpIHsKKwkJYl9wdHItPmxpbmtfcmVxID0gZGlzY19pbml0X2xpbmtfcmVxKGJfcHRyLCAmbV9wdHItPmJjYXN0X2FkZHIsCisJCQkJCQkgICAgIGJjYXN0X3Njb3BlLCAyKTsKKwl9CisJYl9wdHItPnB1YmwubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwl3cml0ZV91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwlpbmZvKCJFbmFibGVkIGJlYXJlciA8JXM+LCBkaXNjb3ZlcnkgZG9tYWluICVzXG4iLAorCSAgICAgbmFtZSwgYWRkcl9zdHJpbmdfZmlsbChhZGRyX3N0cmluZywgYmNhc3Rfc2NvcGUpKTsKKwlyZXR1cm4gMDsKK2ZhaWxlZDoKKwl3cml0ZV91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHRpcGNfYmxvY2tfYmVhcmVyKCk6IEJsb2NrIHRoZSBiZWFyZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwKKyAqICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXNldCBhbGwgaXRzIGxpbmtzCisgKi8KKworaW50IHRpcGNfYmxvY2tfYmVhcmVyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGJlYXJlciAqYl9wdHIgPSAwOworCXN0cnVjdCBsaW5rICpsX3B0cjsKKwlzdHJ1Y3QgbGluayAqdGVtcF9sX3B0cjsKKworCWlmICh0aXBjX21vZGUgIT0gVElQQ19ORVRfTU9ERSkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCXJlYWRfbG9ja19iaCgmbmV0X2xvY2spOworCWJfcHRyID0gYmVhcmVyX2ZpbmQobmFtZSk7CisJaWYgKCFiX3B0cikgeworCQl3YXJuKCJBdHRlbXB0IHRvIGJsb2NrIHVua25vd24gYmVhcmVyIDwlcz5cbiIsIG5hbWUpOworCQlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCWJfcHRyLT5wdWJsLmJsb2NrZWQgPSAxOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsX3B0ciwgdGVtcF9sX3B0ciwgJmJfcHRyLT5saW5rcywgbGlua19saXN0KSB7CisJCXN0cnVjdCBub2RlICpuX3B0ciA9IGxfcHRyLT5vd25lcjsKKworCQlzcGluX2xvY2tfYmgoJm5fcHRyLT5sb2NrKTsKKwkJbGlua19yZXNldChsX3B0cik7CisJCXNwaW5fdW5sb2NrX2JoKCZuX3B0ci0+bG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKKwlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOworCWluZm8oIkJsb2NrZWQgYmVhcmVyIDwlcz5cbiIsIG5hbWUpOworCXJldHVybiBUSVBDX09LOworfQorCisvKioKKyAqIGJlYXJlcl9kaXNhYmxlIC0KKyAqIAorICogTm90ZTogVGhpcyByb3V0aW5lIGFzc3VtZXMgY2FsbGVyIGhvbGRzIG5ldF9sb2NrLgorICovCisKK3N0YXRpYyBpbnQgYmVhcmVyX2Rpc2FibGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0cjsKKwlzdHJ1Y3QgbGluayAqbF9wdHI7CisJc3RydWN0IGxpbmsgKnRlbXBfbF9wdHI7CisKKwlpZiAodGlwY19tb2RlICE9IFRJUENfTkVUX01PREUpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwliX3B0ciA9IGJlYXJlcl9maW5kKG5hbWUpOworCWlmICghYl9wdHIpIHsKKwkJd2FybigiQXR0ZW1wdCB0byBkaXNhYmxlIHVua25vd24gYmVhcmVyIDwlcz5cbiIsIG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkaXNjX3N0b3BfbGlua19yZXEoYl9wdHItPmxpbmtfcmVxKTsKKwlzcGluX2xvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCWJfcHRyLT5saW5rX3JlcSA9IE5VTEw7CisJYl9wdHItPnB1YmwuYmxvY2tlZCA9IDE7CisJaWYgKGJfcHRyLT5tZWRpYS0+ZGlzYWJsZV9iZWFyZXIpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCQl3cml0ZV91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwkJYl9wdHItPm1lZGlhLT5kaXNhYmxlX2JlYXJlcigmYl9wdHItPnB1YmwpOworCQl3cml0ZV9sb2NrX2JoKCZuZXRfbG9jayk7CisJCXNwaW5fbG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsX3B0ciwgdGVtcF9sX3B0ciwgJmJfcHRyLT5saW5rcywgbGlua19saXN0KSB7CisJCWxpbmtfZGVsZXRlKGxfcHRyKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCWluZm8oIkRpc2FibGVkIGJlYXJlciA8JXM+XG4iLCBuYW1lKTsKKwltZW1zZXQoYl9wdHIsIDAsIHNpemVvZihzdHJ1Y3QgYmVhcmVyKSk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCB0aXBjX2Rpc2FibGVfYmVhcmVyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHJlczsKKworCXdyaXRlX2xvY2tfYmgoJm5ldF9sb2NrKTsKKwlyZXMgPSBiZWFyZXJfZGlzYWJsZShuYW1lKTsKKwl3cml0ZV91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCisKKworaW50IGJlYXJlcl9pbml0KHZvaWQpCit7CisJaW50IHJlczsKKworCXdyaXRlX2xvY2tfYmgoJm5ldF9sb2NrKTsKKwliZWFyZXJzID0ga21hbGxvYyhNQVhfQkVBUkVSUyAqIHNpemVvZihzdHJ1Y3QgYmVhcmVyKSwgR0ZQX0FUT01JQyk7CisJbWVkaWFfbGlzdCA9IGttYWxsb2MoTUFYX01FRElBICogc2l6ZW9mKHN0cnVjdCBtZWRpYSksIEdGUF9BVE9NSUMpOworCWlmIChiZWFyZXJzICYmIG1lZGlhX2xpc3QpIHsKKwkJbWVtc2V0KGJlYXJlcnMsIDAsIE1BWF9CRUFSRVJTICogc2l6ZW9mKHN0cnVjdCBiZWFyZXIpKTsKKwkJbWVtc2V0KG1lZGlhX2xpc3QsIDAsIE1BWF9NRURJQSAqIHNpemVvZihzdHJ1Y3QgbWVkaWEpKTsKKwkJcmVzID0gVElQQ19PSzsKKwl9IGVsc2UgeworCQlrZnJlZShiZWFyZXJzKTsKKwkJa2ZyZWUobWVkaWFfbGlzdCk7CisJCWJlYXJlcnMgPSAwOworCQltZWRpYV9saXN0ID0gMDsKKwkJcmVzID0gLUVOT01FTTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisJcmV0dXJuIHJlczsKK30KKwordm9pZCBiZWFyZXJfc3RvcCh2b2lkKQoreworCXUzMiBpOworCisJaWYgKCFiZWFyZXJzKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JFQVJFUlM7IGkrKykgeworCQlpZiAoYmVhcmVyc1tpXS5hY3RpdmUpCisJCQliZWFyZXJzW2ldLnB1YmwuYmxvY2tlZCA9IDE7CisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgaSsrKSB7CisJCWlmIChiZWFyZXJzW2ldLmFjdGl2ZSkKKwkJCWJlYXJlcl9kaXNhYmxlKGJlYXJlcnNbaV0ucHVibC5uYW1lKTsKKwl9CisJa2ZyZWUoYmVhcmVycyk7CisJa2ZyZWUobWVkaWFfbGlzdCk7CisJYmVhcmVycyA9IDA7CisJbWVkaWFfbGlzdCA9IDA7CisJbWVkaWFfY291bnQgPSAwOworfQorCisKZGlmZiAtLWdpdCBhL25ldC90aXBjL2JlYXJlci5oIGIvbmV0L3RpcGMvYmVhcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlNjNkMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2JlYXJlci5oCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogbmV0L3RpcGMvYmVhcmVyLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBiZWFyZXIgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX0JFQVJFUl9ICisjZGVmaW5lIF9USVBDX0JFQVJFUl9ICisKKyNpbmNsdWRlIDxuZXQvdGlwYy90aXBjX2JlYXJlci5oPgorI2luY2x1ZGUgImJjYXN0LmgiCisKKyNkZWZpbmUgTUFYX0JFQVJFUlMgOAorI2RlZmluZSBNQVhfTUVESUEgNAorCisKKy8qKgorICogc3RydWN0IG1lZGlhIC0gVElQQyBtZWRpYSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gaW50ZXJuYWwgdXNlcnMKKyAqIEBzZW5kX21zZzogcm91dGluZSB3aGljaCBoYW5kbGVzIGJ1ZmZlciB0cmFuc21pc3Npb24KKyAqIEBlbmFibGVfYmVhcmVyOiByb3V0aW5lIHdoaWNoIGVuYWJsZXMgYSBiZWFyZXIKKyAqIEBkaXNhYmxlX2JlYXJlcjogcm91dGluZSB3aGljaCBkaXNhYmxlcyBhIGJlYXJlcgorICogQGFkZHIyc3RyOiByb3V0aW5lIHdoaWNoIGNvbnZlcnRzIGJlYXJlcidzIGFkZHJlc3MgdG8gc3RyaW5nIGZvcm0KKyAqIEBiY2FzdF9hZGRyOiBtZWRpYSBhZGRyZXNzIHVzZWQgaW4gYnJvYWRjYXN0aW5nCisgKiBAYmNhc3Q6IG5vbi16ZXJvIGlmIG1lZGlhIHN1cHBvcnRzIGJyb2FkY2FzdGluZyBbY3VycmVudGx5IG1hbmRhdG9yeV0KKyAqIEBwcmlvcml0eTogZGVmYXVsdCBsaW5rIChhbmQgYmVhcmVyKSBwcmlvcml0eQorICogQHRvbGVyYW5jZTogZGVmYXVsdCB0aW1lIChpbiBtcykgYmVmb3JlIGRlY2xhcmluZyBsaW5rIGZhaWx1cmUKKyAqIEB3aW5kb3c6IGRlZmF1bHQgd2luZG93IChpbiBwYWNrZXRzKSBiZWZvcmUgZGVjbGFyaW5nIGxpbmsgY29uZ2VzdGlvbgorICogQHR5cGVfaWQ6IFRJUEMgbWVkaWEgaWRlbnRpZmllciBbZGVmaW5lZCBpbiB0aXBjX2JlYXJlci5oXQorICogQG5hbWU6IG1lZGlhIG5hbWUKKyAqLworIAorc3RydWN0IG1lZGlhIHsKKwlpbnQgKCpzZW5kX21zZykoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgCisJCQlzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLAorCQkJc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCk7CisJaW50ICgqZW5hYmxlX2JlYXJlcikoc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cik7CisJdm9pZCAoKmRpc2FibGVfYmVhcmVyKShzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyKTsKKwljaGFyICooKmFkZHIyc3RyKShzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphLCAKKwkJCSAgY2hhciAqc3RyX2J1ZiwgaW50IHN0cl9zaXplKTsKKwlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIGJjYXN0X2FkZHI7CisJaW50IGJjYXN0OworCXUzMiBwcmlvcml0eTsKKwl1MzIgdG9sZXJhbmNlOworCXUzMiB3aW5kb3c7CisJdTMyIHR5cGVfaWQ7CisJY2hhciBuYW1lW1RJUENfTUFYX01FRElBX05BTUVdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYmVhcmVyIC0gVElQQyBiZWFyZXIgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGludGVybmFsIHVzZXJzCisgKiBAcHVibDogYmVhcmVyIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBwcml2aWxlZ2VkIHVzZXJzCisgKiBAbWVkaWE6IHB0ciB0byBtZWRpYSBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGJlYXJlcgorICogQHByaW9yaXR5OiBkZWZhdWx0IGxpbmsgcHJpb3JpdHkgZm9yIGJlYXJlcgorICogQGRldGVjdF9zY29wZTogbmV0d29yayBhZGRyZXNzIG1hc2sgdXNlZCBkdXJpbmcgYXV0b21hdGljIGxpbmsgY3JlYXRpb24KKyAqIEBpZGVudGl0eTogYXJyYXkgaW5kZXggb2YgdGhpcyBiZWFyZXIgd2l0aGluIFRJUEMgYmVhcmVyIGFycmF5CisgKiBAbGlua19yZXE6IHB0ciB0byAob3B0aW9uYWwpIHN0cnVjdHVyZSBtYWtpbmcgcGVyaW9kaWMgbGluayBzZXR1cCByZXF1ZXN0cworICogQGxpbmtzOiBsaXN0IG9mIG5vbi1jb25nZXN0ZWQgbGlua3MgYXNzb2NpYXRlZCB3aXRoIGJlYXJlcgorICogQGNvbmdfbGlua3M6IGxpc3Qgb2YgY29uZ2VzdGVkIGxpbmtzIGFzc29jaWF0ZWQgd2l0aCBiZWFyZXIKKyAqIEBjb250aW51ZV9jb3VudDogIyBvZiB0aW1lcyBiZWFyZXIgaGFzIHJlc3VtZWQgYWZ0ZXIgY29uZ2VzdGlvbiBvciBibG9ja2luZworICogQGFjdGl2ZTogbm9uLXplcm8gaWYgYmVhcmVyIHN0cnVjdHVyZSBpcyByZXByZXNlbnRzIGEgYmVhcmVyCisgKiBAbmV0X3BsYW5lOiBuZXR3b3JrIHBsYW5lICgnQScgdGhyb3VnaCAnSCcpIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggYmVhcmVyCisgKiBAbm9kZXM6IGluZGljYXRlcyB3aGljaCBub2RlcyBpbiBjbHVzdGVyIGNhbiBiZSByZWFjaGVkIHRocm91Z2ggYmVhcmVyCisgKi8KKyAKK3N0cnVjdCBiZWFyZXIgeworCXN0cnVjdCB0aXBjX2JlYXJlciBwdWJsOworCXN0cnVjdCBtZWRpYSAqbWVkaWE7CisJdTMyIHByaW9yaXR5OworCXUzMiBkZXRlY3Rfc2NvcGU7CisJdTMyIGlkZW50aXR5OworCXN0cnVjdCBsaW5rX3JlcSAqbGlua19yZXE7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvbmdfbGlua3M7CisJdTMyIGNvbnRpbnVlX2NvdW50OworCWludCBhY3RpdmU7CisJY2hhciBuZXRfcGxhbmU7CisJc3RydWN0IG5vZGVfbWFwIG5vZGVzOworfTsKKworc3RydWN0IGJlYXJlcl9uYW1lIHsKKwljaGFyIG1lZGlhX25hbWVbVElQQ19NQVhfTUVESUFfTkFNRV07CisJY2hhciBpZl9uYW1lW1RJUENfTUFYX0lGX05BTUVdOworfTsKKworc3RydWN0IGxpbms7CisKK2V4dGVybiBzdHJ1Y3QgYmVhcmVyICpiZWFyZXJzOworCit2b2lkIG1lZGlhX2FkZHJfcHJpbnRmKHN0cnVjdCBwcmludF9idWYgKnBiLCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphKTsKK3N0cnVjdCBza19idWZmICptZWRpYV9nZXRfbmFtZXModm9pZCk7CisKK3N0cnVjdCBza19idWZmICpiZWFyZXJfZ2V0X25hbWVzKHZvaWQpOwordm9pZCBiZWFyZXJfYWRkX2Rlc3Qoc3RydWN0IGJlYXJlciAqYl9wdHIsIHUzMiBkZXN0KTsKK3ZvaWQgYmVhcmVyX3JlbW92ZV9kZXN0KHN0cnVjdCBiZWFyZXIgKmJfcHRyLCB1MzIgZGVzdCk7Cit2b2lkIGJlYXJlcl9zY2hlZHVsZShzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKTsKK3N0cnVjdCBiZWFyZXIgKmJlYXJlcl9maW5kX2ludGVyZmFjZShjb25zdCBjaGFyICppZl9uYW1lKTsKK2ludCBiZWFyZXJfcmVzb2x2ZV9jb25nZXN0aW9uKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpOworaW50IGJlYXJlcl9pbml0KHZvaWQpOwordm9pZCBiZWFyZXJfc3RvcCh2b2lkKTsKK2ludCBiZWFyZXJfYnJvYWRjYXN0KHN0cnVjdCBza19idWZmICpidWYsIHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsCisJCSAgICAgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCk7Cit2b2lkIGJlYXJlcl9sb2NrX3B1c2goc3RydWN0IGJlYXJlciAqYl9wdHIpOworCisKKy8qKgorICogYmVhcmVyX3NlbmQtIHNlbmRzIGJ1ZmZlciB0byBkZXN0aW5hdGlvbiBvdmVyIGJlYXJlciAKKyAqIAorICogUmV0dXJucyB0cnVlICgxKSBpZiBzdWNjZXNzZnVsLCBvciBmYWxzZSAoMCkgaWYgdW5hYmxlIHRvIHNlbmQKKyAqIAorICogSU1QT1JUQU5UOgorICogVGhlIG1lZGlhIHNlbmQgcm91dGluZSBtdXN0IG5vdCBhbHRlciB0aGUgYnVmZmVyIGJlaW5nIHBhc3NlZCBpbgorICogYXMgaXQgbWF5IGJlIG5lZWRlZCBmb3IgbGF0ZXIgcmV0cmFuc21pc3Npb24hCisgKiAKKyAqIElmIHRoZSBtZWRpYSBzZW5kIHJvdXRpbmUgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIChpbmRpY2F0aW5nIHRoYXQgCisgKiBpdCB3YXMgdW5hYmxlIHRvIHNlbmQgdGhlIGJ1ZmZlciksIGl0IG11c3Q6CisgKiAgIDEpIG1hcmsgdGhlIGJlYXJlciBhcyBibG9ja2VkLAorICogICAyKSBjYWxsIHRpcGNfY29udGludWUoKSBvbmNlIHRoZSBiZWFyZXIgaXMgYWJsZSB0byBzZW5kIGFnYWluLgorICogTWVkaWEgdHlwZXMgdGhhdCBhcmUgdW5hYmxlIHRvIG1lZXQgdGhlc2UgdHdvIGNyaXRlcmEgbXVzdCBlbnN1cmUgdGhlaXIKKyAqIHNlbmQgcm91dGluZSBhbHdheXMgcmV0dXJucyBzdWNjZXNzIC0tIGV2ZW4gaWYgdGhlIGJ1ZmZlciB3YXMgbm90IHNlbnQgLS0KKyAqIGFuZCBsZXQgVElQQydzIGxpbmsgY29kZSBkZWFsIHdpdGggdGhlIHVuZGVsaXZlcmVkIG1lc3NhZ2UuIAorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGJlYXJlcl9zZW5kKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAorCQkJICAgICAgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCkKK3sKKwlyZXR1cm4gIWJfcHRyLT5tZWRpYS0+c2VuZF9tc2coYnVmLCAmYl9wdHItPnB1YmwsIGRlc3QpOworfQorCisvKioKKyAqIGJlYXJlcl9jb25nZXN0ZWQgLSBkZXRlcm1pbmVzIGlmIGJlYXJlciBpcyBjdXJyZW50bHkgY29uZ2VzdGVkCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgYmVhcmVyX2Nvbmdlc3RlZChzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKQoreworCWlmICh1bmxpa2VseShiX3B0ci0+cHVibC5ibG9ja2VkKSkKKwkJcmV0dXJuIDE7CisJaWYgKGxpa2VseShsaXN0X2VtcHR5KCZiX3B0ci0+Y29uZ19saW5rcykpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIWJlYXJlcl9yZXNvbHZlX2Nvbmdlc3Rpb24oYl9wdHIsIGxfcHRyKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jbHVzdGVyLmMgYi9uZXQvdGlwYy9jbHVzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmN2JhYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2NsdXN0ZXIuYwpAQCAtMCwwICsxLDU3NiBAQAorLyoKKyAqIG5ldC90aXBjL2NsdXN0ZXIuYzogVElQQyBjbHVzdGVyIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJjbHVzdGVyLmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgIm5vZGUuaCIKKyNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJtc2cuaCIKKyNpbmNsdWRlICJiZWFyZXIuaCIKKwordm9pZCBjbHVzdGVyX211bHRpY2FzdChzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHN0cnVjdCBza19idWZmICpidWYsIAorCQkgICAgICAgdTMyIGxvd2VyLCB1MzIgdXBwZXIpOworc3RydWN0IHNrX2J1ZmYgKmNsdXN0ZXJfcHJlcGFyZV9yb3V0aW5nX21zZyh1MzIgZGF0YV9zaXplLCB1MzIgZGVzdCk7CisKK3N0cnVjdCBub2RlICoqbG9jYWxfbm9kZXMgPSAwOworc3RydWN0IG5vZGVfbWFwIGNsdXN0ZXJfYmNhc3Rfbm9kZXMgPSB7MCx7MCx9fTsKK3UzMiBoaWdoZXN0X2FsbG93ZWRfc2xhdmUgPSAwOworCitzdHJ1Y3QgY2x1c3RlciAqY2x1c3Rlcl9jcmVhdGUodTMyIGFkZHIpCit7CisJc3RydWN0IF96b25lICp6X3B0cjsKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHI7CisJaW50IG1heF9ub2RlczsgCisJaW50IGFsbG9jOworCisJY19wdHIgPSAoc3RydWN0IGNsdXN0ZXIgKilrbWFsbG9jKHNpemVvZigqY19wdHIpLCBHRlBfQVRPTUlDKTsKKwlpZiAoY19wdHIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJbWVtc2V0KGNfcHRyLCAwLCBzaXplb2YoKmNfcHRyKSk7CisKKwljX3B0ci0+YWRkciA9IHRpcGNfYWRkcih0aXBjX3pvbmUoYWRkciksIHRpcGNfY2x1c3RlcihhZGRyKSwgMCk7CisJaWYgKGluX293bl9jbHVzdGVyKGFkZHIpKQorCQltYXhfbm9kZXMgPSBMT1dFU1RfU0xBVkUgKyB0aXBjX21heF9zbGF2ZXM7CisJZWxzZQorCQltYXhfbm9kZXMgPSB0aXBjX21heF9ub2RlcyArIDE7CisJYWxsb2MgPSBzaXplb2Yodm9pZCAqKSAqIChtYXhfbm9kZXMgKyAxKTsKKwljX3B0ci0+bm9kZXMgPSAoc3RydWN0IG5vZGUgKiopa21hbGxvYyhhbGxvYywgR0ZQX0FUT01JQyk7CisJaWYgKGNfcHRyLT5ub2RlcyA9PSBOVUxMKSB7CisJCWtmcmVlKGNfcHRyKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbXNldChjX3B0ci0+bm9kZXMsIDAsIGFsbG9jKTsgIAorCWlmIChpbl9vd25fY2x1c3RlcihhZGRyKSkKKwkJbG9jYWxfbm9kZXMgPSBjX3B0ci0+bm9kZXM7CisJY19wdHItPmhpZ2hlc3Rfc2xhdmUgPSBMT1dFU1RfU0xBVkUgLSAxOworCWNfcHRyLT5oaWdoZXN0X25vZGUgPSAwOworCQorCXpfcHRyID0gem9uZV9maW5kKHRpcGNfem9uZShhZGRyKSk7CisJaWYgKHpfcHRyID09IE5VTEwpIHsKKwkJel9wdHIgPSB6b25lX2NyZWF0ZShhZGRyKTsKKwl9CisJaWYgKHpfcHRyICE9IE5VTEwpIHsKKwkJem9uZV9hdHRhY2hfY2x1c3Rlcih6X3B0ciwgY19wdHIpOworCQljX3B0ci0+b3duZXIgPSB6X3B0cjsKKwl9CisJZWxzZSB7CisJCWtmcmVlKGNfcHRyKTsKKwkJY19wdHIgPSAwOworCX0KKworCXJldHVybiBjX3B0cjsKK30KKwordm9pZCBjbHVzdGVyX2RlbGV0ZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIpCit7CisJdTMyIG5fbnVtOworCisJaWYgKCFjX3B0cikKKwkJcmV0dXJuOworCWZvciAobl9udW0gPSAxOyBuX251bSA8PSBjX3B0ci0+aGlnaGVzdF9ub2RlOyBuX251bSsrKSB7CisJCW5vZGVfZGVsZXRlKGNfcHRyLT5ub2Rlc1tuX251bV0pOworCX0KKwlmb3IgKG5fbnVtID0gTE9XRVNUX1NMQVZFOyBuX251bSA8PSBjX3B0ci0+aGlnaGVzdF9zbGF2ZTsgbl9udW0rKykgeworCQlub2RlX2RlbGV0ZShjX3B0ci0+bm9kZXNbbl9udW1dKTsKKwl9CisJa2ZyZWUoY19wdHItPm5vZGVzKTsKKwlrZnJlZShjX3B0cik7Cit9CisKK3UzMiBjbHVzdGVyX25leHRfbm9kZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBhZGRyKQoreworCXN0cnVjdCBub2RlICpuX3B0cjsKKwl1MzIgbl9udW0gPSB0aXBjX25vZGUoYWRkcikgKyAxOworCisJaWYgKCFjX3B0cikKKwkJcmV0dXJuIGFkZHI7CisJZm9yICg7IG5fbnVtIDw9IGNfcHRyLT5oaWdoZXN0X25vZGU7IG5fbnVtKyspIHsKKwkJbl9wdHIgPSBjX3B0ci0+bm9kZXNbbl9udW1dOworCQlpZiAobl9wdHIgJiYgbm9kZV9oYXNfYWN0aXZlX2xpbmtzKG5fcHRyKSkKKwkJCXJldHVybiBuX3B0ci0+YWRkcjsKKwl9CisJZm9yIChuX251bSA9IDE7IG5fbnVtIDwgdGlwY19ub2RlKGFkZHIpOyBuX251bSsrKSB7CisJCW5fcHRyID0gY19wdHItPm5vZGVzW25fbnVtXTsKKwkJaWYgKG5fcHRyICYmIG5vZGVfaGFzX2FjdGl2ZV9saW5rcyhuX3B0cikpCisJCQlyZXR1cm4gbl9wdHItPmFkZHI7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGNsdXN0ZXJfYXR0YWNoX25vZGUoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCBzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJdTMyIG5fbnVtID0gdGlwY19ub2RlKG5fcHRyLT5hZGRyKTsKKwl1MzIgbWF4X25fbnVtID0gdGlwY19tYXhfbm9kZXM7CisKKwlpZiAoaW5fb3duX2NsdXN0ZXIobl9wdHItPmFkZHIpKQorCQltYXhfbl9udW0gPSBoaWdoZXN0X2FsbG93ZWRfc2xhdmU7CisJYXNzZXJ0KG5fbnVtID4gMCk7CisJYXNzZXJ0KG5fbnVtIDw9IG1heF9uX251bSk7CisJYXNzZXJ0KGNfcHRyLT5ub2Rlc1tuX251bV0gPT0gMCk7CisJY19wdHItPm5vZGVzW25fbnVtXSA9IG5fcHRyOworCWlmIChuX251bSA+IGNfcHRyLT5oaWdoZXN0X25vZGUpCisJCWNfcHRyLT5oaWdoZXN0X25vZGUgPSBuX251bTsKK30KKworLyoqCisgKiBjbHVzdGVyX3NlbGVjdF9yb3V0ZXIgLSBzZWxlY3Qgcm91dGVyIHRvIGEgY2x1c3RlcgorICogCisgKiBVc2VzIGRldGVybWluaXN0aWMgYW5kIGZhaXIgYWxnb3JpdGhtLgorICovCisKK3UzMiBjbHVzdGVyX3NlbGVjdF9yb3V0ZXIoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgcmVmKQoreworCXUzMiBuX251bTsKKwl1MzIgdWxpbSA9IGNfcHRyLT5oaWdoZXN0X25vZGU7CisJdTMyIG1hc2s7CisJdTMyIHRzdGFydDsKKworCWFzc2VydCghaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpKTsKKwlpZiAoIXVsaW0pCisJCXJldHVybiAwOworCisJLyogU3RhcnQgZW50cnkgbXVzdCBiZSByYW5kb20gKi8KKwltYXNrID0gdGlwY19tYXhfbm9kZXM7CisJd2hpbGUgKG1hc2sgPiB1bGltKQorCQltYXNrID4+PSAxOworCXRzdGFydCA9IHJlZiAmIG1hc2s7CisJbl9udW0gPSB0c3RhcnQ7CisKKwkvKiBMb29rdXAgdXB3YXJkcyB3aXRoIHdyYXAtYXJvdW5kICovCisJZG8geworCQlpZiAobm9kZV9pc191cChjX3B0ci0+bm9kZXNbbl9udW1dKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCsrbl9udW0gPD0gdWxpbSk7CisJaWYgKG5fbnVtID4gdWxpbSkgeworCQluX251bSA9IDE7CisJCWRvIHsKKwkJCWlmIChub2RlX2lzX3VwKGNfcHRyLT5ub2Rlc1tuX251bV0pKQorCQkJCWJyZWFrOworCQl9IHdoaWxlICgrK25fbnVtIDwgdHN0YXJ0KTsKKwkJaWYgKG5fbnVtID09IHRzdGFydCkKKwkJCXJldHVybiAwOworCX0KKwlhc3NlcnQobl9udW0gPD0gdWxpbSk7CisJcmV0dXJuIG5vZGVfc2VsZWN0X3JvdXRlcihjX3B0ci0+bm9kZXNbbl9udW1dLCByZWYpOworfQorCisvKioKKyAqIGNsdXN0ZXJfc2VsZWN0X25vZGUgLSBzZWxlY3QgZGVzdGluYXRpb24gbm9kZSB3aXRoaW4gYSByZW1vdGUgY2x1c3RlcgorICogCisgKiBVc2VzIGRldGVybWluaXN0aWMgYW5kIGZhaXIgYWxnb3JpdGhtLgorICovCisKK3N0cnVjdCBub2RlICpjbHVzdGVyX3NlbGVjdF9ub2RlKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIHNlbGVjdG9yKQoreworCXUzMiBuX251bTsKKwl1MzIgbWFzayA9IHRpcGNfbWF4X25vZGVzOworCXUzMiBzdGFydF9lbnRyeTsKKworCWFzc2VydCghaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpKTsKKwlpZiAoIWNfcHRyLT5oaWdoZXN0X25vZGUpCisJCXJldHVybiAwOworCisJLyogU3RhcnQgZW50cnkgbXVzdCBiZSByYW5kb20gKi8KKwl3aGlsZSAobWFzayA+IGNfcHRyLT5oaWdoZXN0X25vZGUpIHsKKwkJbWFzayA+Pj0gMTsKKwl9CisJc3RhcnRfZW50cnkgPSAoc2VsZWN0b3IgJiBtYXNrKSA/IHNlbGVjdG9yICYgbWFzayA6IDF1OworCWFzc2VydChzdGFydF9lbnRyeSA8PSBjX3B0ci0+aGlnaGVzdF9ub2RlKTsKKworCS8qIExvb2t1cCB1cHdhcmRzIHdpdGggd3JhcC1hcm91bmQgKi8KKwlmb3IgKG5fbnVtID0gc3RhcnRfZW50cnk7IG5fbnVtIDw9IGNfcHRyLT5oaWdoZXN0X25vZGU7IG5fbnVtKyspIHsKKwkJaWYgKG5vZGVfaGFzX2FjdGl2ZV9saW5rcyhjX3B0ci0+bm9kZXNbbl9udW1dKSkKKwkJCXJldHVybiBjX3B0ci0+bm9kZXNbbl9udW1dOworCX0KKwlmb3IgKG5fbnVtID0gMTsgbl9udW0gPCBzdGFydF9lbnRyeTsgbl9udW0rKykgeworCQlpZiAobm9kZV9oYXNfYWN0aXZlX2xpbmtzKGNfcHRyLT5ub2Rlc1tuX251bV0pKQorCQkJcmV0dXJuIGNfcHRyLT5ub2Rlc1tuX251bV07CisJfQorCXJldHVybiAwOworfQorCisvKgorICogICAgUm91dGluZyB0YWJsZSBtYW5hZ2VtZW50OiBTZWUgZGVzY3JpcHRpb24gaW4gbm9kZS5jCisgKi8KKworc3RydWN0IHNrX2J1ZmYgKmNsdXN0ZXJfcHJlcGFyZV9yb3V0aW5nX21zZyh1MzIgZGF0YV9zaXplLCB1MzIgZGVzdCkKK3sKKwl1MzIgc2l6ZSA9IElOVF9IX1NJWkUgKyBkYXRhX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGJ1Zl9hY3F1aXJlKHNpemUpOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCisJaWYgKGJ1ZikgeworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1lbXNldCgoY2hhciAqKW1zZywgMCwgc2l6ZSk7CisJCW1zZ19pbml0KG1zZywgUk9VVEVfRElTVFJJQlVUT1IsIDAsIFRJUENfT0ssIElOVF9IX1NJWkUsIGRlc3QpOworCX0KKwlyZXR1cm4gYnVmOworfQorCit2b2lkIGNsdXN0ZXJfYmNhc3RfbmV3X3JvdXRlKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIGRlc3QsCisJCQkgICAgIHUzMiBsb3dlciwgdTMyIHVwcGVyKQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBjbHVzdGVyX3ByZXBhcmVfcm91dGluZ19tc2coMCwgY19wdHItPmFkZHIpOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCisJaWYgKGJ1ZikgeworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1zZ19zZXRfcmVtb3RlX25vZGUobXNnLCBkZXN0KTsKKwkJbXNnX3NldF90eXBlKG1zZywgUk9VVEVfQURESVRJT04pOworCQljbHVzdGVyX211bHRpY2FzdChjX3B0ciwgYnVmLCBsb3dlciwgdXBwZXIpOworCX0gZWxzZSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOiBicm9hZGNhc3Qgb2YgbmV3IHJvdXRlIGZhaWxlZFxuIik7CisJfQorfQorCit2b2lkIGNsdXN0ZXJfYmNhc3RfbG9zdF9yb3V0ZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBkZXN0LAorCQkJICAgICAgdTMyIGxvd2VyLCB1MzIgdXBwZXIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGNsdXN0ZXJfcHJlcGFyZV9yb3V0aW5nX21zZygwLCBjX3B0ci0+YWRkcik7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisKKwlpZiAoYnVmKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX3NldF9yZW1vdGVfbm9kZShtc2csIGRlc3QpOworCQltc2dfc2V0X3R5cGUobXNnLCBST1VURV9SRU1PVkFMKTsKKwkJY2x1c3Rlcl9tdWx0aWNhc3QoY19wdHIsIGJ1ZiwgbG93ZXIsIHVwcGVyKTsKKwl9IGVsc2UgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTogYnJvYWRjYXN0IG9mIGxvc3Qgcm91dGUgZmFpbGVkXG4iKTsKKwl9Cit9CisKK3ZvaWQgY2x1c3Rlcl9zZW5kX3NsYXZlX3JvdXRlcyhzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBkZXN0KQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJdTMyIGhpZ2hlc3QgPSBjX3B0ci0+aGlnaGVzdF9zbGF2ZTsKKwl1MzIgbl9udW07CisJaW50IHNlbmQgPSAwOworCisJYXNzZXJ0KCFpc19zbGF2ZShkZXN0KSk7CisJYXNzZXJ0KGluX293bl9jbHVzdGVyKGRlc3QpKTsKKwlhc3NlcnQoaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpKTsKKwlpZiAoaGlnaGVzdCA8PSBMT1dFU1RfU0xBVkUpCisJCXJldHVybjsKKwlidWYgPSBjbHVzdGVyX3ByZXBhcmVfcm91dGluZ19tc2coaGlnaGVzdCAtIExPV0VTVF9TTEFWRSArIDEsCisJCQkJCSAgY19wdHItPmFkZHIpOworCWlmIChidWYpIHsKKwkJbXNnID0gYnVmX21zZyhidWYpOworCQltc2dfc2V0X3JlbW90ZV9ub2RlKG1zZywgY19wdHItPmFkZHIpOworCQltc2dfc2V0X3R5cGUobXNnLCBTTEFWRV9ST1VUSU5HX1RBQkxFKTsKKwkJZm9yIChuX251bSA9IExPV0VTVF9TTEFWRTsgbl9udW0gPD0gaGlnaGVzdDsgbl9udW0rKykgeworCQkJaWYgKGNfcHRyLT5ub2Rlc1tuX251bV0gJiYgCisJCQkgICAgbm9kZV9oYXNfYWN0aXZlX2xpbmtzKGNfcHRyLT5ub2Rlc1tuX251bV0pKSB7CisJCQkJc2VuZCA9IDE7CisJCQkJbXNnX3NldF9kYXRhb2N0ZXQobXNnLCBuX251bSk7CisJCQl9CisJCX0KKwkJaWYgKHNlbmQpCisJCQlsaW5rX3NlbmQoYnVmLCBkZXN0LCBkZXN0KTsKKwkJZWxzZQorCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwl9IGVsc2UgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTogYnJvYWRjYXN0IG9mIGxvc3Qgcm91dGUgZmFpbGVkXG4iKTsKKwl9Cit9CisKK3ZvaWQgY2x1c3Rlcl9zZW5kX2V4dF9yb3V0ZXMoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCXUzMiBoaWdoZXN0ID0gY19wdHItPmhpZ2hlc3Rfbm9kZTsKKwl1MzIgbl9udW07CisJaW50IHNlbmQgPSAwOworCisJaWYgKGluX293bl9jbHVzdGVyKGNfcHRyLT5hZGRyKSkKKwkJcmV0dXJuOworCWFzc2VydCghaXNfc2xhdmUoZGVzdCkpOworCWFzc2VydChpbl9vd25fY2x1c3RlcihkZXN0KSk7CisJaGlnaGVzdCA9IGNfcHRyLT5oaWdoZXN0X25vZGU7CisJYnVmID0gY2x1c3Rlcl9wcmVwYXJlX3JvdXRpbmdfbXNnKGhpZ2hlc3QgKyAxLCBjX3B0ci0+YWRkcik7CisJaWYgKGJ1ZikgeworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1zZ19zZXRfcmVtb3RlX25vZGUobXNnLCBjX3B0ci0+YWRkcik7CisJCW1zZ19zZXRfdHlwZShtc2csIEVYVF9ST1VUSU5HX1RBQkxFKTsKKwkJZm9yIChuX251bSA9IDE7IG5fbnVtIDw9IGhpZ2hlc3Q7IG5fbnVtKyspIHsKKwkJCWlmIChjX3B0ci0+bm9kZXNbbl9udW1dICYmIAorCQkJICAgIG5vZGVfaGFzX2FjdGl2ZV9saW5rcyhjX3B0ci0+bm9kZXNbbl9udW1dKSkgeworCQkJCXNlbmQgPSAxOworCQkJCW1zZ19zZXRfZGF0YW9jdGV0KG1zZywgbl9udW0pOworCQkJfQorCQl9CisJCWlmIChzZW5kKQorCQkJbGlua19zZW5kKGJ1ZiwgZGVzdCwgZGVzdCk7CisJCWVsc2UKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJfSBlbHNlIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU6IGJyb2FkY2FzdCBvZiBleHRlcm5hbCByb3V0ZSBmYWlsZWRcbiIpOworCX0KK30KKwordm9pZCBjbHVzdGVyX3NlbmRfbG9jYWxfcm91dGVzKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIGRlc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1MzIgaGlnaGVzdCA9IGNfcHRyLT5oaWdoZXN0X25vZGU7CisJdTMyIG5fbnVtOworCWludCBzZW5kID0gMDsKKworCWFzc2VydChpc19zbGF2ZShkZXN0KSk7CisJYXNzZXJ0KGluX293bl9jbHVzdGVyKGNfcHRyLT5hZGRyKSk7CisJYnVmID0gY2x1c3Rlcl9wcmVwYXJlX3JvdXRpbmdfbXNnKGhpZ2hlc3QsIGNfcHRyLT5hZGRyKTsKKwlpZiAoYnVmKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX3NldF9yZW1vdGVfbm9kZShtc2csIGNfcHRyLT5hZGRyKTsKKwkJbXNnX3NldF90eXBlKG1zZywgTE9DQUxfUk9VVElOR19UQUJMRSk7CisJCWZvciAobl9udW0gPSAxOyBuX251bSA8PSBoaWdoZXN0OyBuX251bSsrKSB7CisJCQlpZiAoY19wdHItPm5vZGVzW25fbnVtXSAmJiAKKwkJCSAgICBub2RlX2hhc19hY3RpdmVfbGlua3MoY19wdHItPm5vZGVzW25fbnVtXSkpIHsKKwkJCQlzZW5kID0gMTsKKwkJCQltc2dfc2V0X2RhdGFvY3RldChtc2csIG5fbnVtKTsKKwkJCX0KKwkJfQorCQlpZiAoc2VuZCkKKwkJCWxpbmtfc2VuZChidWYsIGRlc3QsIGRlc3QpOworCQllbHNlCisJCQlidWZfZGlzY2FyZChidWYpOworCX0gZWxzZSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOiBicm9hZGNhc3Qgb2YgbG9jYWwgcm91dGUgZmFpbGVkXG4iKTsKKwl9Cit9CisKK3ZvaWQgY2x1c3Rlcl9yZWN2X3JvdXRpbmdfdGFibGUoc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHI7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCXVuY2hhciAqbm9kZV90YWJsZTsKKwl1MzIgdGFibGVfc2l6ZTsKKwl1MzIgcm91dGVyOworCXUzMiByZW1fbm9kZSA9IG1zZ19yZW1vdGVfbm9kZShtc2cpOworCXUzMiB6X251bTsKKwl1MzIgY19udW07CisJdTMyIG5fbnVtOworCisJY19wdHIgPSBjbHVzdGVyX2ZpbmQocmVtX25vZGUpOworCWlmICghY19wdHIpIHsKKwkJY19wdHIgPSBjbHVzdGVyX2NyZWF0ZShyZW1fbm9kZSk7CisJCWlmICghY19wdHIpIHsKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlub2RlX3RhYmxlID0gYnVmLT5kYXRhICsgbXNnX2hkcl9zeihtc2cpOworCXRhYmxlX3NpemUgPSBtc2dfc2l6ZShtc2cpIC0gbXNnX2hkcl9zeihtc2cpOworCXJvdXRlciA9IG1zZ19wcmV2bm9kZShtc2cpOworCXpfbnVtID0gdGlwY196b25lKHJlbV9ub2RlKTsKKwljX251bSA9IHRpcGNfY2x1c3RlcihyZW1fbm9kZSk7CisKKwlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwljYXNlIExPQ0FMX1JPVVRJTkdfVEFCTEU6CisJCWFzc2VydChpc19zbGF2ZSh0aXBjX293bl9hZGRyKSk7CisJY2FzZSBFWFRfUk9VVElOR19UQUJMRToKKwkJZm9yIChuX251bSA9IDE7IG5fbnVtIDwgdGFibGVfc2l6ZTsgbl9udW0rKykgeworCQkJaWYgKG5vZGVfdGFibGVbbl9udW1dKSB7CisJCQkJdTMyIGFkZHIgPSB0aXBjX2FkZHIoel9udW0sIGNfbnVtLCBuX251bSk7CisJCQkJbl9wdHIgPSBjX3B0ci0+bm9kZXNbbl9udW1dOworCQkJCWlmICghbl9wdHIpIHsKKwkJCQkJbl9wdHIgPSBub2RlX2NyZWF0ZShhZGRyKTsKKwkJCQl9CisJCQkJaWYgKG5fcHRyKQorCQkJCQlub2RlX2FkZF9yb3V0ZXIobl9wdHIsIHJvdXRlcik7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTEFWRV9ST1VUSU5HX1RBQkxFOgorCQlhc3NlcnQoIWlzX3NsYXZlKHRpcGNfb3duX2FkZHIpKTsKKwkJYXNzZXJ0KGluX293bl9jbHVzdGVyKGNfcHRyLT5hZGRyKSk7CisJCWZvciAobl9udW0gPSAxOyBuX251bSA8IHRhYmxlX3NpemU7IG5fbnVtKyspIHsKKwkJCWlmIChub2RlX3RhYmxlW25fbnVtXSkgeworCQkJCXUzMiBzbGF2ZV9udW0gPSBuX251bSArIExPV0VTVF9TTEFWRTsKKwkJCQl1MzIgYWRkciA9IHRpcGNfYWRkcih6X251bSwgY19udW0sIHNsYXZlX251bSk7CisJCQkJbl9wdHIgPSBjX3B0ci0+bm9kZXNbc2xhdmVfbnVtXTsKKwkJCQlpZiAoIW5fcHRyKSB7CisJCQkJCW5fcHRyID0gbm9kZV9jcmVhdGUoYWRkcik7CisJCQkJfQorCQkJCWlmIChuX3B0cikKKwkJCQkJbm9kZV9hZGRfcm91dGVyKG5fcHRyLCByb3V0ZXIpOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgUk9VVEVfQURESVRJT046CisJCWlmICghaXNfc2xhdmUodGlwY19vd25fYWRkcikpIHsKKwkJCWFzc2VydCghaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpCisJCQkgICAgICAgfHwgaXNfc2xhdmUocmVtX25vZGUpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydChpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikKKwkJCSAgICAgICAmJiAhaXNfc2xhdmUocmVtX25vZGUpKTsKKwkJfQorCQluX3B0ciA9IGNfcHRyLT5ub2Rlc1t0aXBjX25vZGUocmVtX25vZGUpXTsKKwkJaWYgKCFuX3B0cikKKwkJCW5fcHRyID0gbm9kZV9jcmVhdGUocmVtX25vZGUpOworCQlpZiAobl9wdHIpCisJCQlub2RlX2FkZF9yb3V0ZXIobl9wdHIsIHJvdXRlcik7CisJCWJyZWFrOworCWNhc2UgUk9VVEVfUkVNT1ZBTDoKKwkJaWYgKCFpc19zbGF2ZSh0aXBjX293bl9hZGRyKSkgeworCQkJYXNzZXJ0KCFpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikKKwkJCSAgICAgICB8fCBpc19zbGF2ZShyZW1fbm9kZSkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0KGluX293bl9jbHVzdGVyKGNfcHRyLT5hZGRyKQorCQkJICAgICAgICYmICFpc19zbGF2ZShyZW1fbm9kZSkpOworCQl9CisJCW5fcHRyID0gY19wdHItPm5vZGVzW3RpcGNfbm9kZShyZW1fbm9kZSldOworCQlpZiAobl9wdHIpCisJCQlub2RlX3JlbW92ZV9yb3V0ZXIobl9wdHIsIHJvdXRlcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFzc2VydCghIklsbGVnYWwgcm91dGluZyBtYW5hZ2VyIG1lc3NhZ2UgcmVjZWl2ZWRcbiIpOworCX0KKwlidWZfZGlzY2FyZChidWYpOworfQorCit2b2lkIGNsdXN0ZXJfcmVtb3ZlX2FzX3JvdXRlcihzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiByb3V0ZXIpCit7CisJdTMyIHN0YXJ0X2VudHJ5OworCXUzMiB0c3RvcDsKKwl1MzIgbl9udW07CisKKwlpZiAoaXNfc2xhdmUocm91dGVyKSkKKwkJcmV0dXJuOwkvKiBTbGF2ZSBub2RlcyBjYW4gbm90IGJlIHJvdXRlcnMgKi8KKworCWlmIChpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikpIHsKKwkJc3RhcnRfZW50cnkgPSBMT1dFU1RfU0xBVkU7CisJCXRzdG9wID0gY19wdHItPmhpZ2hlc3Rfc2xhdmU7CisJfSBlbHNlIHsKKwkJc3RhcnRfZW50cnkgPSAxOworCQl0c3RvcCA9IGNfcHRyLT5oaWdoZXN0X25vZGU7CisJfQorCisJZm9yIChuX251bSA9IHN0YXJ0X2VudHJ5OyBuX251bSA8PSB0c3RvcDsgbl9udW0rKykgeworCQlpZiAoY19wdHItPm5vZGVzW25fbnVtXSkgeworCQkJbm9kZV9yZW1vdmVfcm91dGVyKGNfcHRyLT5ub2Rlc1tuX251bV0sIHJvdXRlcik7CisJCX0KKwl9Cit9CisKKy8qKgorICogY2x1c3Rlcl9tdWx0aWNhc3QgLSBtdWx0aWNhc3QgbWVzc2FnZSB0byBsb2NhbCBub2RlcyAKKyAqLworCit2b2lkIGNsdXN0ZXJfbXVsdGljYXN0KHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgCisJCSAgICAgICB1MzIgbG93ZXIsIHUzMiB1cHBlcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmX2NvcHk7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCXUzMiBuX251bTsKKwl1MzIgdHN0b3A7CisKKwlhc3NlcnQobG93ZXIgPD0gdXBwZXIpOworCWFzc2VydCgoKGxvd2VyID49IDEpICYmIChsb3dlciA8PSB0aXBjX21heF9ub2RlcykpIHx8CisJICAgICAgICgobG93ZXIgPj0gTE9XRVNUX1NMQVZFKSAmJiAobG93ZXIgPD0gaGlnaGVzdF9hbGxvd2VkX3NsYXZlKSkpOworCWFzc2VydCgoKHVwcGVyID49IDEpICYmICh1cHBlciA8PSB0aXBjX21heF9ub2RlcykpIHx8CisJICAgICAgICgodXBwZXIgPj0gTE9XRVNUX1NMQVZFKSAmJiAodXBwZXIgPD0gaGlnaGVzdF9hbGxvd2VkX3NsYXZlKSkpOworCWFzc2VydChpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikpOworCisJdHN0b3AgPSBpc19zbGF2ZSh1cHBlcikgPyBjX3B0ci0+aGlnaGVzdF9zbGF2ZSA6IGNfcHRyLT5oaWdoZXN0X25vZGU7CisJaWYgKHRzdG9wID4gdXBwZXIpCisJCXRzdG9wID0gdXBwZXI7CisJZm9yIChuX251bSA9IGxvd2VyOyBuX251bSA8PSB0c3RvcDsgbl9udW0rKykgeworCQluX3B0ciA9IGNfcHRyLT5ub2Rlc1tuX251bV07CisJCWlmIChuX3B0ciAmJiBub2RlX2hhc19hY3RpdmVfbGlua3Mobl9wdHIpKSB7CisJCQlidWZfY29weSA9IHNrYl9jb3B5KGJ1ZiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoYnVmX2NvcHkgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCW1zZ19zZXRfZGVzdG5vZGUoYnVmX21zZyhidWZfY29weSksIG5fcHRyLT5hZGRyKTsKKwkJCWxpbmtfc2VuZChidWZfY29weSwgbl9wdHItPmFkZHIsIG5fcHRyLT5hZGRyKTsKKwkJfQorCX0KKwlidWZfZGlzY2FyZChidWYpOworfQorCisvKioKKyAqIGNsdXN0ZXJfYnJvYWRjYXN0IC0gYnJvYWRjYXN0IG1lc3NhZ2UgdG8gYWxsIG5vZGVzIHdpdGhpbiBjbHVzdGVyCisgKi8KKwordm9pZCBjbHVzdGVyX2Jyb2FkY2FzdChzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCBza19idWZmICpidWZfY29weTsKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHI7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCXUzMiBuX251bTsKKwl1MzIgdHN0YXJ0OworCXUzMiB0c3RvcDsKKwl1MzIgbm9kZV90eXBlOworCisJaWYgKHRpcGNfbW9kZSA9PSBUSVBDX05FVF9NT0RFKSB7CisJCWNfcHRyID0gY2x1c3Rlcl9maW5kKHRpcGNfb3duX2FkZHIpOworCQlhc3NlcnQoaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpKTsJLyogRm9yIG5vdyAqLworCisJCS8qIFNlbmQgdG8gc3RhbmRhcmQgbm9kZXMsIHRoZW4gcmVwZWF0IGxvb3Agc2VuZGluZyB0byBzbGF2ZXMgKi8KKwkJdHN0YXJ0ID0gMTsKKwkJdHN0b3AgPSBjX3B0ci0+aGlnaGVzdF9ub2RlOworCQlmb3IgKG5vZGVfdHlwZSA9IDE7IG5vZGVfdHlwZSA8PSAyOyBub2RlX3R5cGUrKykgeworCQkJZm9yIChuX251bSA9IHRzdGFydDsgbl9udW0gPD0gdHN0b3A7IG5fbnVtKyspIHsKKwkJCQluX3B0ciA9IGNfcHRyLT5ub2Rlc1tuX251bV07CisJCQkJaWYgKG5fcHRyICYmIG5vZGVfaGFzX2FjdGl2ZV9saW5rcyhuX3B0cikpIHsKKwkJCQkJYnVmX2NvcHkgPSBza2JfY29weShidWYsIEdGUF9BVE9NSUMpOworCQkJCQlpZiAoYnVmX2NvcHkgPT0gTlVMTCkKKwkJCQkJCWdvdG8gZXhpdDsKKwkJCQkJbXNnX3NldF9kZXN0bm9kZShidWZfbXNnKGJ1Zl9jb3B5KSwgCisJCQkJCQkJIG5fcHRyLT5hZGRyKTsKKwkJCQkJbGlua19zZW5kKGJ1Zl9jb3B5LCBuX3B0ci0+YWRkciwgCisJCQkJCQkgIG5fcHRyLT5hZGRyKTsKKwkJCQl9CisJCQl9CisJCQl0c3RhcnQgPSBMT1dFU1RfU0xBVkU7CisJCQl0c3RvcCA9IGNfcHRyLT5oaWdoZXN0X3NsYXZlOworCQl9CisJfQorZXhpdDoKKwlidWZfZGlzY2FyZChidWYpOworfQorCitpbnQgY2x1c3Rlcl9pbml0KHZvaWQpCit7CisJaGlnaGVzdF9hbGxvd2VkX3NsYXZlID0gTE9XRVNUX1NMQVZFICsgdGlwY19tYXhfc2xhdmVzOworCXJldHVybiBjbHVzdGVyX2NyZWF0ZSh0aXBjX293bl9hZGRyKSA/IFRJUENfT0sgOiAtRU5PTUVNOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jbHVzdGVyLmggYi9uZXQvdGlwYy9jbHVzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmYjA5NQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2NsdXN0ZXIuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogbmV0L3RpcGMvY2x1c3Rlci5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgY2x1c3RlciBtYW5hZ2VtZW50IHJvdXRpbmVzCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfQ0xVU1RFUl9ICisjZGVmaW5lIF9USVBDX0NMVVNURVJfSAorCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgInpvbmUuaCIKKworI2RlZmluZSBMT1dFU1RfU0xBVkUgIDIwNDh1CisKKy8qKgorICogc3RydWN0IGNsdXN0ZXIgLSBUSVBDIGNsdXN0ZXIgc3RydWN0dXJlCisgKiBAYWRkcjogbmV0d29yayBhZGRyZXNzIG9mIGNsdXN0ZXIKKyAqIEBvd25lcjogcG9pbnRlciB0byB6b25lIHRoYXQgY2x1c3RlciBiZWxvbmdzIHRvCisgKiBAbm9kZXM6IGFycmF5IG9mIHBvaW50ZXJzIHRvIGFsbCBub2RlcyB3aXRoaW4gY2x1c3RlcgorICogQGhpZ2hlc3Rfbm9kZTogaWQgb2YgaGlnaGVzdCBudW1iZXJlZCBub2RlIHdpdGhpbiBjbHVzdGVyCisgKiBAaGlnaGVzdF9zbGF2ZTogKHVzZWQgZm9yIHNlY29uZGFyeSBub2RlIHN1cHBvcnQpCisgKi8KKyAKK3N0cnVjdCBjbHVzdGVyIHsKKwl1MzIgYWRkcjsKKwlzdHJ1Y3QgX3pvbmUgKm93bmVyOworCXN0cnVjdCBub2RlICoqbm9kZXM7CisJdTMyIGhpZ2hlc3Rfbm9kZTsKKwl1MzIgaGlnaGVzdF9zbGF2ZTsKK307CisKKworZXh0ZXJuIHN0cnVjdCBub2RlICoqbG9jYWxfbm9kZXM7CitleHRlcm4gdTMyIGhpZ2hlc3RfYWxsb3dlZF9zbGF2ZTsKK2V4dGVybiBzdHJ1Y3Qgbm9kZV9tYXAgY2x1c3Rlcl9iY2FzdF9ub2RlczsKKwordm9pZCBjbHVzdGVyX3JlbW92ZV9hc19yb3V0ZXIoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgcm91dGVyKTsKK3ZvaWQgY2x1c3Rlcl9zZW5kX2V4dF9yb3V0ZXMoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgZGVzdCk7CitzdHJ1Y3Qgbm9kZSAqY2x1c3Rlcl9zZWxlY3Rfbm9kZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBzZWxlY3Rvcik7Cit1MzIgY2x1c3Rlcl9zZWxlY3Rfcm91dGVyKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIHJlZik7Cit2b2lkIGNsdXN0ZXJfcmVjdl9yb3V0aW5nX3RhYmxlKHN0cnVjdCBza19idWZmICpidWYpOworc3RydWN0IGNsdXN0ZXIgKmNsdXN0ZXJfY3JlYXRlKHUzMiBhZGRyKTsKK3ZvaWQgY2x1c3Rlcl9kZWxldGUoc3RydWN0IGNsdXN0ZXIgKmNfcHRyKTsKK3ZvaWQgY2x1c3Rlcl9hdHRhY2hfbm9kZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHN0cnVjdCBub2RlICpuX3B0cik7Cit2b2lkIGNsdXN0ZXJfc2VuZF9zbGF2ZV9yb3V0ZXMoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgZGVzdCk7Cit2b2lkIGNsdXN0ZXJfYnJvYWRjYXN0KHN0cnVjdCBza19idWZmICpidWYpOworaW50IGNsdXN0ZXJfaW5pdCh2b2lkKTsKK3UzMiBjbHVzdGVyX25leHRfbm9kZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBhZGRyKTsKK3ZvaWQgY2x1c3Rlcl9iY2FzdF9uZXdfcm91dGUoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgZGVzdCwgdTMyIGxvLCB1MzIgaGkpOwordm9pZCBjbHVzdGVyX3NlbmRfbG9jYWxfcm91dGVzKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIGRlc3QpOwordm9pZCBjbHVzdGVyX2JjYXN0X2xvc3Rfcm91dGUoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgZGVzdCwgdTMyIGxvLCB1MzIgaGkpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjbHVzdGVyICpjbHVzdGVyX2ZpbmQodTMyIGFkZHIpCit7CisJc3RydWN0IF96b25lICp6X3B0ciA9IHpvbmVfZmluZChhZGRyKTsKKworCWlmICh6X3B0cikKKwkJcmV0dXJuIHpfcHRyLT5jbHVzdGVyc1sxXTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jb25maWcuYyBiL25ldC90aXBjL2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZGVmNGYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9jb25maWcuYwpAQCAtMCwwICsxLDcxOCBAQAorLyoKKyAqIG5ldC90aXBjL2NvbmZpZy5jOiBUSVBDIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJiZWFyZXIuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgInpvbmUuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAibmFtZV90YWJsZS5oIgorI2luY2x1ZGUgIm5vZGUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkaXNjb3Zlci5oIgorCitzdHJ1Y3Qgc3Vic2NyX2RhdGEgeworCWNoYXIgdXNyX2hhbmRsZVs4XTsKKwl1MzIgZG9tYWluOworCXUzMiBwb3J0X3JlZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1YmRfbGlzdDsKK307CisKK3N0cnVjdCBtYW5hZ2VyIHsKKwl1MzIgdXNlcl9yZWY7CisJdTMyIHBvcnRfcmVmOworCXUzMiBzdWJzY3JfcmVmOworCXUzMiBsaW5rX3N1YnNjcmlwdGlvbnM7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rX3N1YnNjcmliZXJzOworfTsKKworc3RhdGljIHN0cnVjdCBtYW5hZ2VyIG1uZyA9IHsgMH07CisKK3N0YXRpYyBzcGlubG9ja190IGNvbmZpZ19sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCitzdGF0aWMgY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhOwkvKiByZXF1ZXN0IG1lc3NhZ2UgVExWIGFyZWEgKi8KK3N0YXRpYyBpbnQgcmVxX3Rsdl9zcGFjZTsJCS8qIHJlcXVlc3QgbWVzc2FnZSBUTFYgYXJlYSBzaXplICovCitzdGF0aWMgaW50IHJlcF9oZWFkcm9vbTsJCS8qIHJlcGx5IG1lc3NhZ2UgaGVhZHJvb20gdG8gdXNlICovCisKKwordm9pZCBjZmdfbGlua19ldmVudCh1MzIgYWRkciwgY2hhciAqbmFtZSwgaW50IHVwKQoreworCS8qIFRJUEMgRE9FU04nVCBIQU5ETEUgTElOSyBFVkVOVCBTVUJTQ1JJUFRJT05TIEFUIFRIRSBNT01FTlQgKi8KK30KKworCitzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3JlcGx5X2FsbG9jKGludCBwYXlsb2FkX3NpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKworCWJ1ZiA9IGFsbG9jX3NrYihyZXBfaGVhZHJvb20gKyBwYXlsb2FkX3NpemUsIEdGUF9BVE9NSUMpOworCWlmIChidWYpCisJCXNrYl9yZXNlcnZlKGJ1ZiwgcmVwX2hlYWRyb29tKTsKKwlyZXR1cm4gYnVmOworfQorCitpbnQgY2ZnX2FwcGVuZF90bHYoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgaW50IHRsdl90eXBlLCAKKwkJICAgdm9pZCAqdGx2X2RhdGEsIGludCB0bHZfZGF0YV9zaXplKQoreworCXN0cnVjdCB0bHZfZGVzYyAqdGx2ID0gKHN0cnVjdCB0bHZfZGVzYyAqKWJ1Zi0+dGFpbDsKKwlpbnQgbmV3X3Rsdl9zcGFjZSA9IFRMVl9TUEFDRSh0bHZfZGF0YV9zaXplKTsKKworCWlmIChza2JfdGFpbHJvb20oYnVmKSA8IG5ld190bHZfc3BhY2UpIHsKKwkJZGJnKCJjZmdfYXBwZW5kX3RsdiB1bmFibGUgdG8gYXBwZW5kIFRMVlxuIik7CisJCXJldHVybiAwOworCX0KKwlza2JfcHV0KGJ1ZiwgbmV3X3Rsdl9zcGFjZSk7CisJdGx2LT50bHZfdHlwZSA9IGh0b25zKHRsdl90eXBlKTsKKwl0bHYtPnRsdl9sZW4gID0gaHRvbnMoVExWX0xFTkdUSCh0bHZfZGF0YV9zaXplKSk7CisJaWYgKHRsdl9kYXRhX3NpemUgJiYgdGx2X2RhdGEpCisJCW1lbWNweShUTFZfREFUQSh0bHYpLCB0bHZfZGF0YSwgdGx2X2RhdGFfc2l6ZSk7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBza19idWZmICpjZmdfcmVwbHlfdW5zaWduZWRfdHlwZSh1MTYgdGx2X3R5cGUsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXUzMiB2YWx1ZV9uZXQ7CisKKwlidWYgPSBjZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKHNpemVvZih2YWx1ZSkpKTsKKwlpZiAoYnVmKSB7CisJCXZhbHVlX25ldCA9IGh0b25sKHZhbHVlKTsKKwkJY2ZnX2FwcGVuZF90bHYoYnVmLCB0bHZfdHlwZSwgJnZhbHVlX25ldCwgCisJCQkgICAgICAgc2l6ZW9mKHZhbHVlX25ldCkpOworCX0KKwlyZXR1cm4gYnVmOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3JlcGx5X3N0cmluZ190eXBlKHUxNiB0bHZfdHlwZSwgY2hhciAqc3RyaW5nKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJaW50IHN0cmluZ19sZW4gPSBzdHJsZW4oc3RyaW5nKSArIDE7CisKKwlidWYgPSBjZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKHN0cmluZ19sZW4pKTsKKwlpZiAoYnVmKQorCQljZmdfYXBwZW5kX3RsdihidWYsIHRsdl90eXBlLCBzdHJpbmcsIHN0cmluZ19sZW4pOworCXJldHVybiBidWY7Cit9CisKKworCisKKyNpZiAwCisKKy8qIE5vdyBvYnNvbGV0ZSBjb2RlIGZvciBoYW5kbGluZyBjb21tYW5kcyBub3QgeWV0IGltcGxlbWVudGVkIHRoZSBuZXcgd2F5ICovCisKK2ludCB0aXBjX2NmZ19jbWQoY29uc3Qgc3RydWN0IHRpcGNfY21kX21zZyAqIG1zZywKKwkJIGNoYXIgKmRhdGEsCisJCSB1MzIgc3osCisJCSB1MzIgKnJldF9zaXplLAorCQkgc3RydWN0IHRpcGNfcG9ydGlkICpvcmlnKQoreworCWludCBydiA9IC1FSU5WQUw7CisJdTMyIGNtZCA9IG1zZy0+Y21kOworCisJKnJldF9zaXplID0gMDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElQQ19SRU1PVkVfTElOSzoKKwljYXNlIFRJUENfQ01EX0JMT0NLX0xJTks6CisJY2FzZSBUSVBDX0NNRF9VTkJMT0NLX0xJTks6CisJCWlmICghY2ZnX2NoZWNrX2Nvbm5lY3Rpb24ob3JpZykpCisJCQlydiA9IGxpbmtfY29udHJvbChtc2ctPmFyZ3YubGlua19uYW1lLCBtc2ctPmNtZCwgMCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19FU1RBQkxJU0g6CisJCXsKKwkJCWludCBjb25uZWN0ZWQ7CisKKwkJCXRpcGNfaXNjb25uZWN0ZWQobW5nLmNvbm5fcG9ydF9yZWYsICZjb25uZWN0ZWQpOworCQkJaWYgKGNvbm5lY3RlZCB8fCAhb3JpZykgeworCQkJCXJ2ID0gVElQQ19GQUlMVVJFOworCQkJCWJyZWFrOworCQkJfQorCQkJcnYgPSB0aXBjX2Nvbm5lY3QycG9ydChtbmcuY29ubl9wb3J0X3JlZiwgb3JpZyk7CisJCQlpZiAocnYgPT0gVElQQ19PSykKKwkJCQlvcmlnID0gMDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBUSVBDX0dFVF9QRUVSX0FERFJFU1M6CisJCSpyZXRfc2l6ZSA9IGxpbmtfcGVlcl9hZGRyKG1zZy0+YXJndi5saW5rX25hbWUsIGRhdGEsIHN6KTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0dFVF9ST1VURVM6CisJCXJ2ID0gVElQQ19PSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoge30KKwl9CisJaWYgKCpyZXRfc2l6ZSkKKwkJcnYgPSBUSVBDX09LOworCXJldHVybiBydjsKK30KKworc3RhdGljIHZvaWQgY2ZnX2NtZF9ldmVudChzdHJ1Y3QgdGlwY19jbWRfbXNnICptc2csCisJCQkgIGNoYXIgKmRhdGEsCisJCQkgIHUzMiBzeiwgICAgICAgIAorCQkJICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWcpCit7CisJaW50IHJ2ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgdGlwY19jbWRfcmVzdWx0X21zZyBybXNnOworCXN0cnVjdCBpb3ZlYyBtc2dfc2VjdFsyXTsKKwlpbnQgKmFyZzsKKworCW1zZy0+Y21kID0gbnRvaGwobXNnLT5jbWQpOworCisJY2ZnX3ByZXBhcmVfcmVzX21zZyhtc2ctPmNtZCwgbXNnLT51c3JfaGFuZGxlLCBydiwgJnJtc2csIG1zZ19zZWN0LCAKKwkJCSAgICBkYXRhLCAwKTsKKwlpZiAobnRvaGwobXNnLT5tYWdpYykgIT0gVElQQ19NQUdJQykKKwkJZ290byBleGl0OworCisJc3dpdGNoIChtc2ctPmNtZCkgeworCWNhc2UgVElQQ19DUkVBVEVfTElOSzoKKwkJaWYgKCFjZmdfY2hlY2tfY29ubmVjdGlvbihvcmlnKSkKKwkJCXJ2ID0gZGlzY19jcmVhdGVfbGluaygmbXNnLT5hcmd2LmNyZWF0ZV9saW5rKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0xJTktfU1VCU0NSSUJFOgorCQl7CisJCQlzdHJ1Y3Qgc3Vic2NyX2RhdGEgKnN1YjsKKworCQkJaWYgKG1uZy5saW5rX3N1YnNjcmlwdGlvbnMgPiA2NCkKKwkJCQlicmVhazsKKwkJCXN1YiA9IChzdHJ1Y3Qgc3Vic2NyX2RhdGEgKilrbWFsbG9jKHNpemVvZigqc3ViKSwKKwkJCQkJCQkgICAgR0ZQX0FUT01JQyk7CisJCQlpZiAoc3ViID09IE5VTEwpIHsKKwkJCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZHJvcHBlZCByZW1vdGUgbGluayBzdWJzY3JpcHRpb25cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJSU5JVF9MSVNUX0hFQUQoJnN1Yi0+c3ViZF9saXN0KTsKKwkJCXRpcGNfY3JlYXRlcG9ydChtbmcudXNlcl9yZWYsCisJCQkJCSh2b2lkICopc3ViLAorCQkJCQlUSVBDX0hJR0hfSU1QT1JUQU5DRSwKKwkJCQkJMCwKKwkJCQkJMCwKKwkJCQkJKHRpcGNfY29ubl9zaHV0ZG93bl9ldmVudCljZmdfbGlua3N1YnNjcl9jYW5jZWwsCisJCQkJCTAsCisJCQkJCTAsCisJCQkJCSh0aXBjX2Nvbm5fbXNnX2V2ZW50KWNmZ19saW5rc3Vic2NyX2NhbmNlbCwKKwkJCQkJMCwKKwkJCQkJJnN1Yi0+cG9ydF9yZWYpOworCQkJaWYgKCFzdWItPnBvcnRfcmVmKSB7CisJCQkJa2ZyZWUoc3ViKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1lbWNweShzdWItPnVzcl9oYW5kbGUsbXNnLT51c3JfaGFuZGxlLAorCQkJICAgICAgIHNpemVvZihzdWItPnVzcl9oYW5kbGUpKTsKKwkJCXN1Yi0+ZG9tYWluID0gbXNnLT5hcmd2LmRvbWFpbjsKKwkJCWxpc3RfYWRkX3RhaWwoJnN1Yi0+c3ViZF9saXN0LCAmbW5nLmxpbmtfc3Vic2NyaWJlcnMpOworCQkJdGlwY19jb25uZWN0MnBvcnQoc3ViLT5wb3J0X3JlZiwgb3JpZyk7CisJCQlybXNnLnJldHZhbCA9IFRJUENfT0s7CisJCQl0aXBjX3NlbmQoc3ViLT5wb3J0X3JlZiwgMnUsIG1zZ19zZWN0KTsKKwkJCW1uZy5saW5rX3N1YnNjcmlwdGlvbnMrKzsKKwkJCXJldHVybjsKKwkJfQorCWRlZmF1bHQ6CisJCXJ2ID0gdGlwY19jZmdfY21kKG1zZywgZGF0YSwgc3osICh1MzIgKikmbXNnX3NlY3RbMV0uaW92X2xlbiwgb3JpZyk7CisJfQorCWV4aXQ6CisJcm1zZy5yZXN1bHRfbGVuID0gaHRvbmwobXNnX3NlY3RbMV0uaW92X2xlbik7CisJcm1zZy5yZXR2YWwgPSBodG9ubChydik7CisJY2ZnX3Jlc3BvbmQobXNnX3NlY3QsIDJ1LCBvcmlnKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNmZ19lbmFibGVfYmVhcmVyKHZvaWQpCit7CisJc3RydWN0IHRpcGNfYmVhcmVyX2NvbmZpZyAqYXJnczsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfQkVBUkVSX0NPTkZJRykpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwlhcmdzID0gKHN0cnVjdCB0aXBjX2JlYXJlcl9jb25maWcgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOworCWlmICh0aXBjX2VuYWJsZV9iZWFyZXIoYXJncy0+bmFtZSwKKwkJCSAgICAgICBudG9obChhcmdzLT5kZXRlY3Rfc2NvcGUpLAorCQkJICAgICAgIG50b2hsKGFyZ3MtPnByaW9yaXR5KSkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKCJ1bmFibGUgdG8gZW5hYmxlIGJlYXJlciIpOworCisJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX2Rpc2FibGVfYmVhcmVyKHZvaWQpCit7CisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9CRUFSRVJfTkFNRSkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwlpZiAodGlwY19kaXNhYmxlX2JlYXJlcigoY2hhciAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZygidW5hYmxlIHRvIGRpc2FibGUgYmVhcmVyIik7CisKKwlyZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfc2V0X293bl9hZGRyKHZvaWQpCit7CisJdTMyIGFkZHI7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX05FVF9BRERSKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCWFkZHIgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJYWRkciA9IG50b2hsKGFkZHIpOworCWlmIChhZGRyID09IHRpcGNfb3duX2FkZHIpCisJCXJldHVybiBjZmdfcmVwbHlfbm9uZSgpOworCWlmICghYWRkcl9ub2RlX3ZhbGlkKGFkZHIpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCisJCQkJCSAgICAgICIgKG5vZGUgYWRkcmVzcykiKTsKKwlpZiAodGlwY19vd25fYWRkcikKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX1NVUFBPUlRFRAorCQkJCQkgICAgICAiIChjYW5ub3QgY2hhbmdlIG5vZGUgYWRkcmVzcyBvbmNlIGFzc2lnbmVkKSIpOworCisJc3Bpbl91bmxvY2tfYmgoJmNvbmZpZ19sb2NrKTsKKwlzdG9wX25ldCgpOworCXRpcGNfb3duX2FkZHIgPSBhZGRyOworCXN0YXJ0X25ldCgpOworCXNwaW5fbG9ja19iaCgmY29uZmlnX2xvY2spOworCXJldHVybiBjZmdfcmVwbHlfbm9uZSgpOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNmZ19zZXRfcmVtb3RlX21uZyh2b2lkKQoreworCXUzMiB2YWx1ZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdGlwY19yZW1vdGVfbWFuYWdlbWVudCA9ICh2YWx1ZSAhPSAwKTsKKwlyZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfc2V0X21heF9wdWJsaWNhdGlvbnModm9pZCkKK3sKKwl1MzIgdmFsdWU7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOworCXZhbHVlID0gbnRvaGwodmFsdWUpOworCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAxLCA2NTUzNSkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKKwkJCQkJICAgICAgIiAobWF4IHB1YmxpY2F0aW9ucyBtdXN0IGJlIDEtNjU1MzUpIik7CisJdGlwY19tYXhfcHVibGljYXRpb25zID0gdmFsdWU7CisJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9tYXhfc3Vic2NyaXB0aW9ucyh2b2lkKQoreworCXUzMiB2YWx1ZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDEsIDY1NTM1KSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQorCQkJCQkgICAgICAiIChtYXggc3Vic2NyaXB0aW9ucyBtdXN0IGJlIDEtNjU1MzUiKTsKKwl0aXBjX21heF9zdWJzY3JpcHRpb25zID0gdmFsdWU7CisJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9tYXhfcG9ydHModm9pZCkKK3sKKwlpbnQgb3JpZ19tb2RlOworCXUzMiB2YWx1ZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOworCXZhbHVlID0gbnRvaGwodmFsdWUpOworCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAxMjcsIDY1NTM1KSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQorCQkJCQkgICAgICAiIChtYXggcG9ydHMgbXVzdCBiZSAxMjctNjU1MzUpIik7CisKKwlpZiAodmFsdWUgPT0gdGlwY19tYXhfcG9ydHMpCisJCXJldHVybiBjZmdfcmVwbHlfbm9uZSgpOworCisJaWYgKGF0b21pY19yZWFkKCZ0aXBjX3VzZXJfY291bnQpID4gMikKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX1NVUFBPUlRFRAorCQkJCQkgICAgICAiIChjYW5ub3QgY2hhbmdlIG1heCBwb3J0cyB3aGlsZSBUSVBDIHVzZXJzIGV4aXN0KSIpOworCisJc3Bpbl91bmxvY2tfYmgoJmNvbmZpZ19sb2NrKTsKKwlvcmlnX21vZGUgPSB0aXBjX2dldF9tb2RlKCk7CisJaWYgKG9yaWdfbW9kZSA9PSBUSVBDX05FVF9NT0RFKQorCQlzdG9wX25ldCgpOworCXN0b3BfY29yZSgpOworCXRpcGNfbWF4X3BvcnRzID0gdmFsdWU7CisJc3RhcnRfY29yZSgpOworCWlmIChvcmlnX21vZGUgPT0gVElQQ19ORVRfTU9ERSkKKwkJc3RhcnRfbmV0KCk7CisJc3Bpbl9sb2NrX2JoKCZjb25maWdfbG9jayk7CisJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc2V0X25ldF9tYXgoaW50IHZhbHVlLCBpbnQgKnBhcmFtZXRlcikKK3sKKwlpbnQgb3JpZ19tb2RlOworCisJaWYgKHZhbHVlICE9ICpwYXJhbWV0ZXIpIHsKKwkJb3JpZ19tb2RlID0gdGlwY19nZXRfbW9kZSgpOworCQlpZiAob3JpZ19tb2RlID09IFRJUENfTkVUX01PREUpCisJCQlzdG9wX25ldCgpOworCQkqcGFyYW1ldGVyID0gdmFsdWU7CisJCWlmIChvcmlnX21vZGUgPT0gVElQQ19ORVRfTU9ERSkKKwkJCXN0YXJ0X25ldCgpOworCX0KKworCXJldHVybiBjZmdfcmVwbHlfbm9uZSgpOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNmZ19zZXRfbWF4X3pvbmVzKHZvaWQpCit7CisJdTMyIHZhbHVlOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDEsIDI1NSkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKKwkJCQkJICAgICAgIiAobWF4IHpvbmVzIG11c3QgYmUgMS0yNTUpIik7CisJcmV0dXJuIHNldF9uZXRfbWF4KHZhbHVlLCAmdGlwY19tYXhfem9uZXMpOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNmZ19zZXRfbWF4X2NsdXN0ZXJzKHZvaWQpCit7CisJdTMyIHZhbHVlOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJaWYgKHZhbHVlICE9IDEpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9TVVBQT1JURUQKKwkJCQkJICAgICAgIiAobWF4IGNsdXN0ZXJzIGZpeGVkIGF0IDEpIik7CisJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9tYXhfbm9kZXModm9pZCkKK3sKKwl1MzIgdmFsdWU7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKwl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgOCwgMjA0NykpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKKwkJCQkJICAgICAgIiAobWF4IG5vZGVzIG11c3QgYmUgOC0yMDQ3KSIpOworCXJldHVybiBzZXRfbmV0X21heCh2YWx1ZSwgJnRpcGNfbWF4X25vZGVzKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfc2V0X21heF9zbGF2ZXModm9pZCkKK3sKKwl1MzIgdmFsdWU7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKwl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwlpZiAodmFsdWUgIT0gMCkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX1NVUFBPUlRFRAorCQkJCQkgICAgICAiIChtYXggc2Vjb25kYXJ5IG5vZGVzIGZpeGVkIGF0IDApIik7CisJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9uZXRpZCh2b2lkKQoreworCXUzMiB2YWx1ZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOworCXZhbHVlID0gbnRvaGwodmFsdWUpOworCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAxLCA5OTk5KSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQorCQkJCQkgICAgICAiIChuZXR3b3JrIGlkIG11c3QgYmUgMS05OTk5KSIpOworCisJaWYgKHRpcGNfb3duX2FkZHIpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9TVVBQT1JURUQKKwkJCQkJICAgICAgIiAoY2Fubm90IGNoYW5nZSBuZXR3b3JrIGlkIG9uY2UgcGFydCBvZiBuZXR3b3JrKSIpOworCQorCXJldHVybiBzZXRfbmV0X21heCh2YWx1ZSwgJnRpcGNfbmV0X2lkKTsKK30KKworc3RydWN0IHNrX2J1ZmYgKmNmZ19kb19jbWQodTMyIG9yaWdfbm9kZSwgdTE2IGNtZCwgY29uc3Qgdm9pZCAqcmVxdWVzdF9hcmVhLAorCQkJICAgaW50IHJlcXVlc3Rfc3BhY2UsIGludCByZXBseV9oZWFkcm9vbSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwX3Rsdl9idWY7CisKKwlzcGluX2xvY2tfYmgoJmNvbmZpZ19sb2NrKTsKKworCS8qIFNhdmUgcmVxdWVzdCBhbmQgcmVwbHkgZGV0YWlscyBpbiBhIHdlbGwta25vd24gbG9jYXRpb24gKi8KKworCXJlcV90bHZfYXJlYSA9IHJlcXVlc3RfYXJlYTsKKwlyZXFfdGx2X3NwYWNlID0gcmVxdWVzdF9zcGFjZTsKKwlyZXBfaGVhZHJvb20gPSByZXBseV9oZWFkcm9vbTsKKworCS8qIENoZWNrIGNvbW1hbmQgYXV0aG9yaXphdGlvbiAqLworCisJaWYgKGxpa2VseShvcmlnX25vZGUgPT0gdGlwY19vd25fYWRkcikpIHsKKwkJLyogY29tbWFuZCBpcyBwZXJtaXR0ZWQgKi8KKwl9IGVsc2UgaWYgKGNtZCA+PSAweDgwMDApIHsKKwkJcmVwX3Rsdl9idWYgPSBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9TVVBQT1JURUQKKwkJCQkJCSAgICAgIiAoY2Fubm90IGJlIGRvbmUgcmVtb3RlbHkpIik7CisJCWdvdG8gZXhpdDsKKwl9IGVsc2UgaWYgKCF0aXBjX3JlbW90ZV9tYW5hZ2VtZW50KSB7CisJCXJlcF90bHZfYnVmID0gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT19SRU1PVEUpOworCQlnb3RvIGV4aXQ7CisJfQorCWVsc2UgaWYgKGNtZCA+PSAweDQwMDApIHsKKwkJdTMyIGRvbWFpbiA9IDA7CisKKwkJaWYgKChuYW1ldGJsX3RyYW5zbGF0ZShUSVBDX1pNX1NSViwgMCwgJmRvbWFpbikgPT0gMCkgfHwKKwkJICAgIChkb21haW4gIT0gb3JpZ19ub2RlKSkgeworCQkJcmVwX3Rsdl9idWYgPSBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9aT05FX01TVFIpOworCQkJZ290byBleGl0OworCQl9CisJfQorCisJLyogQ2FsbCBhcHByb3ByaWF0ZSBwcm9jZXNzaW5nIHJvdXRpbmUgKi8KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSVBDX0NNRF9OT09QOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19yZXBseV9ub25lKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfR0VUX05PREVTOgorCQlyZXBfdGx2X2J1ZiA9IG5vZGVfZ2V0X25vZGVzKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfR0VUX0xJTktTOgorCQlyZXBfdGx2X2J1ZiA9IG5vZGVfZ2V0X2xpbmtzKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0hPV19MSU5LX1NUQVRTOgorCQlyZXBfdGx2X2J1ZiA9IGxpbmtfY21kX3Nob3dfc3RhdHMocmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9SRVNFVF9MSU5LX1NUQVRTOgorCQlyZXBfdGx2X2J1ZiA9IGxpbmtfY21kX3Jlc2V0X3N0YXRzKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0hPV19OQU1FX1RBQkxFOgorCQlyZXBfdGx2X2J1ZiA9IG5hbWV0YmxfZ2V0KHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfR0VUX0JFQVJFUl9OQU1FUzoKKwkJcmVwX3Rsdl9idWYgPSBiZWFyZXJfZ2V0X25hbWVzKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfR0VUX01FRElBX05BTUVTOgorCQlyZXBfdGx2X2J1ZiA9IG1lZGlhX2dldF9uYW1lcygpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1NIT1dfUE9SVFM6CisJCXJlcF90bHZfYnVmID0gcG9ydF9nZXRfcG9ydHMoKTsKKwkJYnJlYWs7CisjaWYgMAorCWNhc2UgVElQQ19DTURfU0hPV19QT1JUX1NUQVRTOgorCQlyZXBfdGx2X2J1ZiA9IHBvcnRfc2hvd19zdGF0cyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1JFU0VUX1BPUlRfU1RBVFM6CisJCXJlcF90bHZfYnVmID0gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVEKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFRJUENfQ01EX1NFVF9MT0dfU0laRToKKwkJcmVwX3Rsdl9idWYgPSBsb2dfcmVzaXplKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfRFVNUF9MT0c6CisJCXJlcF90bHZfYnVmID0gbG9nX2R1bXAoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19UT0w6CisJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19QUkk6CisJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19XSU5ET1c6CisJCXJlcF90bHZfYnVmID0gbGlua19jbWRfY29uZmlnKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9FTkFCTEVfQkVBUkVSOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19lbmFibGVfYmVhcmVyKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfRElTQUJMRV9CRUFSRVI6CisJCXJlcF90bHZfYnVmID0gY2ZnX2Rpc2FibGVfYmVhcmVyKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX05PREVfQUREUjoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X293bl9hZGRyKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX1JFTU9URV9NTkc6CisJCXJlcF90bHZfYnVmID0gY2ZnX3NldF9yZW1vdGVfbW5nKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX01BWF9QT1JUUzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X21heF9wb3J0cygpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1NFVF9NQVhfUFVCTDoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X21heF9wdWJsaWNhdGlvbnMoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTUFYX1NVQlNDUjoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X21heF9zdWJzY3JpcHRpb25zKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX01BWF9aT05FUzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X21heF96b25lcygpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1NFVF9NQVhfQ0xVU1RFUlM6CisJCXJlcF90bHZfYnVmID0gY2ZnX3NldF9tYXhfY2x1c3RlcnMoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTUFYX05PREVTOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19zZXRfbWF4X25vZGVzKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX01BWF9TTEFWRVM6CisJCXJlcF90bHZfYnVmID0gY2ZnX3NldF9tYXhfc2xhdmVzKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX05FVElEOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19zZXRfbmV0aWQoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfUkVNT1RFX01ORzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfcmVwbHlfdW5zaWduZWQodGlwY19yZW1vdGVfbWFuYWdlbWVudCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfR0VUX01BWF9QT1JUUzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfcmVwbHlfdW5zaWduZWQodGlwY19tYXhfcG9ydHMpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX0dFVF9NQVhfUFVCTDoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfcmVwbHlfdW5zaWduZWQodGlwY19tYXhfcHVibGljYXRpb25zKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUFYX1NVQlNDUjoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfcmVwbHlfdW5zaWduZWQodGlwY19tYXhfc3Vic2NyaXB0aW9ucyk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfR0VUX01BWF9aT05FUzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfcmVwbHlfdW5zaWduZWQodGlwY19tYXhfem9uZXMpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX0dFVF9NQVhfQ0xVU1RFUlM6CisJCXJlcF90bHZfYnVmID0gY2ZnX3JlcGx5X3Vuc2lnbmVkKHRpcGNfbWF4X2NsdXN0ZXJzKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUFYX05PREVTOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19yZXBseV91bnNpZ25lZCh0aXBjX21heF9ub2Rlcyk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfR0VUX01BWF9TTEFWRVM6CisJCXJlcF90bHZfYnVmID0gY2ZnX3JlcGx5X3Vuc2lnbmVkKHRpcGNfbWF4X3NsYXZlcyk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfR0VUX05FVElEOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19yZXBseV91bnNpZ25lZCh0aXBjX25ldF9pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlcF90bHZfYnVmID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJLyogUmV0dXJuIHJlcGx5IGJ1ZmZlciAqLworZXhpdDoKKwlzcGluX3VubG9ja19iaCgmY29uZmlnX2xvY2spOworCXJldHVybiByZXBfdGx2X2J1ZjsKK30KKworc3RhdGljIHZvaWQgY2ZnX25hbWVkX21zZ19ldmVudCh2b2lkICp1c2VyZGF0YSwKKwkJCQl1MzIgcG9ydF9yZWYsCisJCQkJc3RydWN0IHNrX2J1ZmYgKipidWYsCisJCQkJY29uc3QgdW5jaGFyICptc2csCisJCQkJdTMyIHNpemUsCisJCQkJdTMyIGltcG9ydGFuY2UsIAorCQkJCXN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZywKKwkJCQlzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqZGVzdCkKK3sKKwlzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciAqcmVxX2hkcjsKKwlzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciAqcmVwX2hkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwX2J1ZjsKKworCS8qIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb24gbWVzc2FnZSBoZWFkZXIgKGlnbm9yZSBpbnZhbGlkIG1lc3NhZ2UpICovCisKKwlyZXFfaGRyID0gKHN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyICopbXNnOworCWlmICgoc2l6ZSA8IHNpemVvZigqcmVxX2hkcikpIHx8CisJICAgIChzaXplICE9IFRDTV9BTElHTihudG9obChyZXFfaGRyLT50Y21fbGVuKSkpIHx8CisJICAgIChudG9ocyhyZXFfaGRyLT50Y21fZmxhZ3MpICE9IFRDTV9GX1JFUVVFU1QpKSB7CisJCXdhcm4oImRpc2NhcmRlZCBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gbWVzc2FnZVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZW5lcmF0ZSByZXBseSBmb3IgcmVxdWVzdCAoaWYgY2FuJ3QsIHJldHVybiByZXF1ZXN0KSAqLworCisJcmVwX2J1ZiA9IGNmZ19kb19jbWQob3JpZy0+bm9kZSwKKwkJCSAgICAgbnRvaHMocmVxX2hkci0+dGNtX3R5cGUpLCAKKwkJCSAgICAgbXNnICsgc2l6ZW9mKCpyZXFfaGRyKSwKKwkJCSAgICAgc2l6ZSAtIHNpemVvZigqcmVxX2hkciksCisJCQkgICAgIEJVRl9IRUFEUk9PTSArIE1BWF9IX1NJWkUgKyBzaXplb2YoKnJlcF9oZHIpKTsKKwlpZiAocmVwX2J1ZikgeworCQlza2JfcHVzaChyZXBfYnVmLCBzaXplb2YoKnJlcF9oZHIpKTsKKwkJcmVwX2hkciA9IChzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciAqKXJlcF9idWYtPmRhdGE7CisJCW1lbWNweShyZXBfaGRyLCByZXFfaGRyLCBzaXplb2YoKnJlcF9oZHIpKTsKKwkJcmVwX2hkci0+dGNtX2xlbiA9IGh0b25sKHJlcF9idWYtPmxlbik7CisJCXJlcF9oZHItPnRjbV9mbGFncyAmPSBodG9ucyh+VENNX0ZfUkVRVUVTVCk7CisJfSBlbHNlIHsKKwkJcmVwX2J1ZiA9ICpidWY7CisJCSpidWYgPSBOVUxMOworCX0KKworCS8qIE5FRUQgVE8gQUREIENPREUgVE8gSEFORExFIEZBSUxFRCBTRU5EIChTVUNIIEFTIENPTkdFU1RJT04pICovCisJdGlwY19zZW5kX2J1ZjJwb3J0KHBvcnRfcmVmLCBvcmlnLCByZXBfYnVmLCByZXBfYnVmLT5sZW4pOworfQorCitpbnQgY2ZnX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgdGlwY19uYW1lX3NlcSBzZXE7CisJaW50IHJlczsKKworCW1lbXNldCgmbW5nLCAwLCBzaXplb2YobW5nKSk7CisJSU5JVF9MSVNUX0hFQUQoJm1uZy5saW5rX3N1YnNjcmliZXJzKTsKKworCXJlcyA9IHRpcGNfYXR0YWNoKCZtbmcudXNlcl9yZWYsIDAsIDApOworCWlmIChyZXMpCisJCWdvdG8gZmFpbGVkOworCisJcmVzID0gdGlwY19jcmVhdGVwb3J0KG1uZy51c2VyX3JlZiwgMCwgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFLAorCQkJICAgICAgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCSAgICAgIE5VTEwsIGNmZ19uYW1lZF9tc2dfZXZlbnQsIE5VTEwsCisJCQkgICAgICBOVUxMLCAmbW5nLnBvcnRfcmVmKTsKKwlpZiAocmVzKQorCQlnb3RvIGZhaWxlZDsKKworCXNlcS50eXBlID0gVElQQ19DRkdfU1JWOworCXNlcS5sb3dlciA9IHNlcS51cHBlciA9IHRpcGNfb3duX2FkZHI7CisJcmVzID0gbmFtZXRibF9wdWJsaXNoX3JzdihtbmcucG9ydF9yZWYsIFRJUENfWk9ORV9TQ09QRSwgJnNlcSk7CisJaWYgKHJlcykKKwkJZ290byBmYWlsZWQ7CisKKwlyZXR1cm4gMDsKKworZmFpbGVkOgorCWVycigiVW5hYmxlIHRvIGNyZWF0ZSBjb25maWd1cmF0aW9uIHNlcnZpY2VcbiIpOworCXRpcGNfZGV0YWNoKG1uZy51c2VyX3JlZik7CisJbW5nLnVzZXJfcmVmID0gMDsKKwlyZXR1cm4gcmVzOworfQorCit2b2lkIGNmZ19zdG9wKHZvaWQpCit7CisJaWYgKG1uZy51c2VyX3JlZikgeworCQl0aXBjX2RldGFjaChtbmcudXNlcl9yZWYpOworCQltbmcudXNlcl9yZWYgPSAwOworCX0KK30KZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvbmZpZy5oIGIvbmV0L3RpcGMvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2Mzc3ZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2NvbmZpZy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBuZXQvdGlwYy9jb25maWcuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIGNvbmZpZ3VyYXRpb24gc2VydmljZSBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfQ09ORklHX0gKKyNkZWZpbmUgX1RJUENfQ09ORklHX0gKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8bGludXgvdGlwYy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpcGNfY29uZmlnLmg+CisjaW5jbHVkZSAibGluay5oIgorCitzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3JlcGx5X2FsbG9jKGludCBwYXlsb2FkX3NpemUpOworaW50IGNmZ19hcHBlbmRfdGx2KHN0cnVjdCBza19idWZmICpidWYsIGludCB0bHZfdHlwZSwgCisJCSAgIHZvaWQgKnRsdl9kYXRhLCBpbnQgdGx2X2RhdGFfc2l6ZSk7CitzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3JlcGx5X3Vuc2lnbmVkX3R5cGUodTE2IHRsdl90eXBlLCB1MzIgdmFsdWUpOworc3RydWN0IHNrX2J1ZmYgKmNmZ19yZXBseV9zdHJpbmdfdHlwZSh1MTYgdGx2X3R5cGUsIGNoYXIgKnN0cmluZyk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmNmZ19yZXBseV9ub25lKHZvaWQpCit7CisJcmV0dXJuIGNmZ19yZXBseV9hbGxvYygwKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3JlcGx5X3Vuc2lnbmVkKHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gY2ZnX3JlcGx5X3Vuc2lnbmVkX3R5cGUoVElQQ19UTFZfVU5TSUdORUQsIHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhjaGFyICpzdHJpbmcpCit7CisJcmV0dXJuIGNmZ19yZXBseV9zdHJpbmdfdHlwZShUSVBDX1RMVl9FUlJPUl9TVFJJTkcsIHN0cmluZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmNmZ19yZXBseV91bHRyYV9zdHJpbmcoY2hhciAqc3RyaW5nKQoreworCXJldHVybiBjZmdfcmVwbHlfc3RyaW5nX3R5cGUoVElQQ19UTFZfVUxUUkFfU1RSSU5HLCBzdHJpbmcpOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX2RvX2NtZCh1MzIgb3JpZ19ub2RlLCB1MTYgY21kLCAKKwkJCSAgIGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UsIAorCQkJICAgaW50IGhlYWRyb29tKTsKKwordm9pZCBjZmdfbGlua19ldmVudCh1MzIgYWRkciwgY2hhciAqbmFtZSwgaW50IHVwKTsKK2ludCAgY2ZnX2luaXQodm9pZCk7Cit2b2lkIGNmZ19zdG9wKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvcmUuYyBiL25ldC90aXBjL2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNhYzA2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvY29yZS5jCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogbmV0L3RpcGMvY29yZS5jOiBUSVBDIG1vZHVsZSBjb2RlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAicmVmLmgiCisjaW5jbHVkZSAibmV0LmgiCisjaW5jbHVkZSAidXNlcl9yZWcuaCIKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisjaW5jbHVkZSAic3Vic2NyLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKK2ludCAgZXRoX21lZGlhX3N0YXJ0KHZvaWQpOwordm9pZCBldGhfbWVkaWFfc3RvcCh2b2lkKTsKK2ludCAgaGFuZGxlcl9zdGFydCh2b2lkKTsKK3ZvaWQgaGFuZGxlcl9zdG9wKHZvaWQpOworaW50ICBzb2NrZXRfaW5pdCh2b2lkKTsKK3ZvaWQgc29ja2V0X3N0b3Aodm9pZCk7CitpbnQgIG5ldGxpbmtfc3RhcnQodm9pZCk7Cit2b2lkIG5ldGxpbmtfc3RvcCh2b2lkKTsKKworI2RlZmluZSBNT0RfTkFNRSAidGlwY19zdGFydDogIgorCisjaWZuZGVmIENPTkZJR19USVBDX1pPTkVTCisjZGVmaW5lIENPTkZJR19USVBDX1pPTkVTIDMKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19USVBDX0NMVVNURVJTCisjZGVmaW5lIENPTkZJR19USVBDX0NMVVNURVJTIDEKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19USVBDX05PREVTCisjZGVmaW5lIENPTkZJR19USVBDX05PREVTIDI1NQorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1RJUENfU0xBVkVfTk9ERVMKKyNkZWZpbmUgQ09ORklHX1RJUENfU0xBVkVfTk9ERVMgMAorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1RJUENfUE9SVFMKKyNkZWZpbmUgQ09ORklHX1RJUENfUE9SVFMgODE5MQorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1RJUENfTE9HCisjZGVmaW5lIENPTkZJR19USVBDX0xPRyAwCisjZW5kaWYKKworLyogZ2xvYmFsIHZhcmlhYmxlcyB1c2VkIGJ5IG11bHRpcGxlIHN1Yi1zeXN0ZW1zIHdpdGhpbiBUSVBDICovCisKK2ludCB0aXBjX21vZGUgPSBUSVBDX05PVF9SVU5OSU5HOworaW50IHRpcGNfcmFuZG9tOworYXRvbWljX3QgdGlwY191c2VyX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CisKK2NvbnN0IGNoYXIgdGlwY19hbHBoYWJldFtdID0gCisJIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XyI7CisKKy8qIGNvbmZpZ3VyYWJsZSBUSVBDIHBhcmFtZXRlcnMgKi8KKwordTMyIHRpcGNfb3duX2FkZHI7CitpbnQgdGlwY19tYXhfem9uZXM7CitpbnQgdGlwY19tYXhfY2x1c3RlcnM7CitpbnQgdGlwY19tYXhfbm9kZXM7CitpbnQgdGlwY19tYXhfc2xhdmVzOworaW50IHRpcGNfbWF4X3BvcnRzOworaW50IHRpcGNfbWF4X3N1YnNjcmlwdGlvbnM7CitpbnQgdGlwY19tYXhfcHVibGljYXRpb25zOworaW50IHRpcGNfbmV0X2lkOworaW50IHRpcGNfcmVtb3RlX21hbmFnZW1lbnQ7CisKKworaW50IHRpcGNfZ2V0X21vZGUodm9pZCkKK3sKKwlyZXR1cm4gdGlwY19tb2RlOworfQorCisvKioKKyAqIHN0b3BfbmV0IC0gc2h1dCBkb3duIFRJUEMgbmV0d29ya2luZyBzdWItc3lzdGVtcworICovCisKK3ZvaWQgc3RvcF9uZXQodm9pZCkKK3sKKwlldGhfbWVkaWFfc3RvcCgpOworCXRpcGNfc3RvcF9uZXQoKTsKK30KKworLyoqCisgKiBzdGFydF9uZXQgLSBzdGFydCBUSVBDIG5ldHdvcmtpbmcgc3ViLXN5c3RlbXMKKyAqLworCitpbnQgc3RhcnRfbmV0KHZvaWQpCit7CisJaW50IHJlczsKKworCWlmICgocmVzID0gdGlwY19zdGFydF9uZXQoKSkgfHwKKwkgICAgKHJlcyA9IGV0aF9tZWRpYV9zdGFydCgpKSkgeworCQlzdG9wX25ldCgpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHN0b3BfY29yZSAtIHN3aXRjaCBUSVBDIGZyb20gU0lOR0xFIE5PREUgdG8gTk9UIFJVTk5JTkcgbW9kZQorICovCisKK3ZvaWQgc3RvcF9jb3JlKHZvaWQpCit7CisJaWYgKHRpcGNfbW9kZSAhPSBUSVBDX05PREVfTU9ERSkKKwkJcmV0dXJuOworCisJdGlwY19tb2RlID0gVElQQ19OT1RfUlVOTklORzsKKworCW5ldGxpbmtfc3RvcCgpOworCWhhbmRsZXJfc3RvcCgpOworCWNmZ19zdG9wKCk7CisJc3Vic2NyX3N0b3AoKTsKKwlyZWdfc3RvcCgpOworCW5hbWV0Ymxfc3RvcCgpOworCXJlZl90YWJsZV9zdG9wKCk7CisJc29ja2V0X3N0b3AoKTsKK30KKworLyoqCisgKiBzdGFydF9jb3JlIC0gc3dpdGNoIFRJUEMgZnJvbSBOT1QgUlVOTklORyB0byBTSU5HTEUgTk9ERSBtb2RlCisgKi8KKworaW50IHN0YXJ0X2NvcmUodm9pZCkKK3sKKwlpbnQgcmVzOworCisJaWYgKHRpcGNfbW9kZSAhPSBUSVBDX05PVF9SVU5OSU5HKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJZ2V0X3JhbmRvbV9ieXRlcygmdGlwY19yYW5kb20sIHNpemVvZih0aXBjX3JhbmRvbSkpOworCXRpcGNfbW9kZSA9IFRJUENfTk9ERV9NT0RFOworCisJaWYgKChyZXMgPSBoYW5kbGVyX3N0YXJ0KCkpIHx8IAorCSAgICAocmVzID0gcmVmX3RhYmxlX2luaXQodGlwY19tYXhfcG9ydHMgKyB0aXBjX21heF9zdWJzY3JpcHRpb25zLAorCQkJCSAgdGlwY19yYW5kb20pKSB8fAorCSAgICAocmVzID0gcmVnX3N0YXJ0KCkpIHx8CisJICAgIChyZXMgPSBuYW1ldGJsX2luaXQoKSkgfHwKKyAgICAgICAgICAgIChyZXMgPSBrX3NpZ25hbCgoSGFuZGxlcilzdWJzY3Jfc3RhcnQsIDApKSB8fAorCSAgICAocmVzID0ga19zaWduYWwoKEhhbmRsZXIpY2ZnX2luaXQsIDApKSB8fCAKKwkgICAgKHJlcyA9IG5ldGxpbmtfc3RhcnQoKSkgfHwKKwkgICAgKHJlcyA9IHNvY2tldF9pbml0KCkpKSB7CisJCXN0b3BfY29yZSgpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHRpcGNfaW5pdCh2b2lkKQoreworCWludCByZXM7CisKKwlsb2dfcmVpbml0KENPTkZJR19USVBDX0xPRyk7CisJaW5mbygiQWN0aXZhdGVkIChjb21waWxlZCAiIF9fREFURV9fICIgIiBfX1RJTUVfXyAiKVxuIik7CisKKwl0aXBjX293bl9hZGRyID0gMDsKKwl0aXBjX3JlbW90ZV9tYW5hZ2VtZW50ID0gMTsKKwl0aXBjX21heF9wdWJsaWNhdGlvbnMgPSAxMDAwMDsKKwl0aXBjX21heF9zdWJzY3JpcHRpb25zID0gMjAwMDsKKwl0aXBjX21heF9wb3J0cyA9IGRlbGltaXQoQ09ORklHX1RJUENfUE9SVFMsIDEyNywgNjU1MzYpOworCXRpcGNfbWF4X3pvbmVzID0gZGVsaW1pdChDT05GSUdfVElQQ19aT05FUywgMSwgNTExKTsKKwl0aXBjX21heF9jbHVzdGVycyA9IGRlbGltaXQoQ09ORklHX1RJUENfQ0xVU1RFUlMsIDEsIDEpOworCXRpcGNfbWF4X25vZGVzID0gZGVsaW1pdChDT05GSUdfVElQQ19OT0RFUywgOCwgMjA0Nyk7CisJdGlwY19tYXhfc2xhdmVzID0gZGVsaW1pdChDT05GSUdfVElQQ19TTEFWRV9OT0RFUywgMCwgMjA0Nyk7CisJdGlwY19uZXRfaWQgPSA0NzExOworCisJaWYgKChyZXMgPSBzdGFydF9jb3JlKCkpKQorCQllcnIoIlVuYWJsZSB0byBzdGFydCBpbiBzaW5nbGUgbm9kZSBtb2RlXG4iKTsKKwllbHNlCQorCQlpbmZvKCJTdGFydGVkIGluIHNpbmdsZSBub2RlIG1vZGVcbiIpOworICAgICAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGlwY19leGl0KHZvaWQpCit7CisJc3RvcF9uZXQoKTsKKwlzdG9wX2NvcmUoKTsKKwlpbmZvKCJEZWFjdGl2YXRlZFxuIik7CisJbG9nX3N0b3AoKTsKK30KKworbW9kdWxlX2luaXQodGlwY19pbml0KTsKK21vZHVsZV9leGl0KHRpcGNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVElQQzogVHJhbnNwYXJlbnQgSW50ZXIgUHJvY2VzcyBDb21tdW5pY2F0aW9uIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisKKy8qIE5hdGl2ZSBUSVBDIEFQSSBmb3Iga2VybmVsLXNwYWNlIGFwcGxpY2F0aW9ucyAoc2VlIHRpcGMuaCkgKi8KKworRVhQT1JUX1NZTUJPTCh0aXBjX2F0dGFjaCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfZGV0YWNoKTsKK0VYUE9SVF9TWU1CT0wodGlwY19nZXRfYWRkcik7CitFWFBPUlRfU1lNQk9MKHRpcGNfZ2V0X21vZGUpOworRVhQT1JUX1NZTUJPTCh0aXBjX2NyZWF0ZXBvcnQpOworRVhQT1JUX1NZTUJPTCh0aXBjX2RlbGV0ZXBvcnQpOworRVhQT1JUX1NZTUJPTCh0aXBjX293bmlkZW50aXR5KTsKK0VYUE9SVF9TWU1CT0wodGlwY19wb3J0aW1wb3J0YW5jZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2V0X3BvcnRpbXBvcnRhbmNlKTsKK0VYUE9SVF9TWU1CT0wodGlwY19wb3J0dW5yZWxpYWJsZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2V0X3BvcnR1bnJlbGlhYmxlKTsKK0VYUE9SVF9TWU1CT0wodGlwY19wb3J0dW5yZXR1cm5hYmxlKTsKK0VYUE9SVF9TWU1CT0wodGlwY19zZXRfcG9ydHVucmV0dXJuYWJsZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfcHVibGlzaCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfd2l0aGRyYXcpOworRVhQT1JUX1NZTUJPTCh0aXBjX2Nvbm5lY3QycG9ydCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfZGlzY29ubmVjdCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2h1dGRvd24pOworRVhQT1JUX1NZTUJPTCh0aXBjX2lzY29ubmVjdGVkKTsKK0VYUE9SVF9TWU1CT0wodGlwY19wZWVyKTsKK0VYUE9SVF9TWU1CT0wodGlwY19yZWZfdmFsaWQpOworRVhQT1JUX1NZTUJPTCh0aXBjX3NlbmQpOworRVhQT1JUX1NZTUJPTCh0aXBjX3NlbmRfYnVmKTsKK0VYUE9SVF9TWU1CT0wodGlwY19zZW5kMm5hbWUpOworRVhQT1JUX1NZTUJPTCh0aXBjX2ZvcndhcmQybmFtZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2VuZF9idWYybmFtZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfZm9yd2FyZF9idWYybmFtZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2VuZDJwb3J0KTsKK0VYUE9SVF9TWU1CT0wodGlwY19mb3J3YXJkMnBvcnQpOworRVhQT1JUX1NZTUJPTCh0aXBjX3NlbmRfYnVmMnBvcnQpOworRVhQT1JUX1NZTUJPTCh0aXBjX2ZvcndhcmRfYnVmMnBvcnQpOworRVhQT1JUX1NZTUJPTCh0aXBjX211bHRpY2FzdCk7CisvKiBFWFBPUlRfU1lNQk9MKHRpcGNfbXVsdGljYXN0X2J1Zik7IG5vdCBhdmFpbGFibGUgeWV0ICovCitFWFBPUlRfU1lNQk9MKHRpcGNfaXNwdWJsaXNoZWQpOworRVhQT1JUX1NZTUJPTCh0aXBjX2F2YWlsYWJsZV9ub2Rlcyk7CisKKy8qIFRJUEMgQVBJIGZvciBleHRlcm5hbCBiZWFyZXJzIChzZWUgdGlwY19iZWFyZXIuaCkgKi8KKworRVhQT1JUX1NZTUJPTCh0aXBjX2Jsb2NrX2JlYXJlcik7CitFWFBPUlRfU1lNQk9MKHRpcGNfY29udGludWUpOyAKK0VYUE9SVF9TWU1CT0wodGlwY19kaXNhYmxlX2JlYXJlcik7CitFWFBPUlRfU1lNQk9MKHRpcGNfZW5hYmxlX2JlYXJlcik7CitFWFBPUlRfU1lNQk9MKHRpcGNfcmVjdl9tc2cpOworRVhQT1JUX1NZTUJPTCh0aXBjX3JlZ2lzdGVyX21lZGlhKTsgCisKKy8qIFRJUEMgQVBJIGZvciBleHRlcm5hbCBBUElzIChzZWUgdGlwY19wb3J0LmgpICovCisKK0VYUE9SVF9TWU1CT0wodGlwY19jcmVhdGVwb3J0X3Jhdyk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2V0X21zZ19vcHRpb24pOworRVhQT1JUX1NZTUJPTCh0aXBjX3JlamVjdF9tc2cpOworRVhQT1JUX1NZTUJPTCh0aXBjX3NlbmRfYnVmX2Zhc3QpOworRVhQT1JUX1NZTUJPTCh0aXBjX2Fja25vd2xlZGdlKTsKK0VYUE9SVF9TWU1CT0wodGlwY19nZXRfcG9ydCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfZ2V0X2hhbmRsZSk7CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvcmUuaCBiL25ldC90aXBjL2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjliNjBiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvY29yZS5oCkBAIC0wLDAgKzEsMzE2IEBACisvKgorICogbmV0L3RpcGMvY29yZS5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgZ2xvYmFsIGRlY2xhcmF0aW9ucworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX0NPUkVfSAorI2RlZmluZSBfVElQQ19DT1JFX0gKKworI2luY2x1ZGUgPG5ldC90aXBjL3RpcGMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4JCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworLyoKKyAqIFRJUEMgZGVidWdnaW5nIGNvZGUKKyAqLworCisjZGVmaW5lIGFzc2VydChpKSAgQlVHX09OKCEoaSkpCisKK3N0cnVjdCB0aXBjX21zZzsKK2V4dGVybiBzdHJ1Y3QgcHJpbnRfYnVmICpDT05TLCAqTE9HOworZXh0ZXJuIHN0cnVjdCBwcmludF9idWYgKlRFRShzdHJ1Y3QgcHJpbnRfYnVmICosIHN0cnVjdCBwcmludF9idWYgKik7Cit2b2lkIG1zZ19wcmludChzdHJ1Y3QgcHJpbnRfYnVmKixzdHJ1Y3QgdGlwY19tc2cgKixjb25zdCBjaGFyKik7Cit2b2lkIHRpcGNfcHJpbnRmKHN0cnVjdCBwcmludF9idWYgKiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCB0aXBjX2R1bXAoc3RydWN0IHByaW50X2J1ZiosY29uc3QgY2hhciAqZm10LCAuLi4pOworCisjaWZkZWYgQ09ORklHX1RJUENfREVCVUcKKworLyoKKyAqIFRJUEMgZGVidWcgc3VwcG9ydCBpbmNsdWRlZDoKKyAqIC0gc3lzdGVtIG1lc3NhZ2VzIGFyZSBwcmludGVkIHRvIFRJUENfT1VUUFVUIHByaW50IGJ1ZmZlcgorICogLSBkZWJ1ZyBtZXNzYWdlcyBhcmUgcHJpbnRlZCB0byBEQkdfT1VUUFVUIHByaW50IGJ1ZmZlcgorICovCisKKyNkZWZpbmUgZXJyKGZtdCwgYXJnLi4uKSAgdGlwY19wcmludGYoVElQQ19PVVRQVVQsIEtFUk5fRVJSICJUSVBDOiAiIGZtdCwgIyMgYXJnKQorI2RlZmluZSB3YXJuKGZtdCwgYXJnLi4uKSB0aXBjX3ByaW50ZihUSVBDX09VVFBVVCwgS0VSTl9XQVJOSU5HICJUSVBDOiAiIGZtdCwgIyMgYXJnKQorI2RlZmluZSBpbmZvKGZtdCwgYXJnLi4uKSB0aXBjX3ByaW50ZihUSVBDX09VVFBVVCwgS0VSTl9OT1RJQ0UgIlRJUEM6ICIgZm10LCAjIyBhcmcpCisKKyNkZWZpbmUgZGJnKGZtdCwgYXJnLi4uKSAgZG8ge2lmIChEQkdfT1VUUFVUKSB0aXBjX3ByaW50ZihEQkdfT1VUUFVULCBmbXQsICMjIGFyZyk7fSB3aGlsZSgwKQorI2RlZmluZSBtc2dfZGJnKG1zZywgdHh0KSBkbyB7aWYgKERCR19PVVRQVVQpIG1zZ19wcmludChEQkdfT1VUUFVULCBtc2csIHR4dCk7fSB3aGlsZSgwKQorI2RlZmluZSBkdW1wKGZtdCwgYXJnLi4uKSBkbyB7aWYgKERCR19PVVRQVVQpIHRpcGNfZHVtcChEQkdfT1VUUFVULCBmbXQsICMjYXJnKTt9IHdoaWxlKDApCisKKworLyoJCisgKiBCeSBkZWZhdWx0LCBUSVBDX09VVFBVVCBpcyBkZWZpbmVkIHRvIGJlIHN5c3RlbSBjb25zb2xlIGFuZCBUSVBDIGxvZyBidWZmZXIsCisgKiB3aGlsZSBEQkdfT1VUUFVUIGlzIHRoZSBudWxsIHByaW50IGJ1ZmZlci4gIFRoZXNlIGRlZmF1bHRzIGNhbiBiZSBjaGFuZ2VkCisgKiBoZXJlLCBvciBvbiBhIHBlciAuYyBmaWxlIGJhc2lzLCBieSByZWRlZmluaW5nIHRoZXNlIHN5bWJvbHMuICBUaGUgZm9sbG93aW5nCisgKiBwcmludCBidWZmZXIgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgorICoKKyAqIE5VTEwJCQk6IE91dHB1dCB0byBudWxsIHByaW50IGJ1ZmZlciAoaS5lLiBwcmludCBub3doZXJlKQorICogQ09OUwkJCTogT3V0cHV0IHRvIHN5c3RlbSBjb25zb2xlCisgKiBMT0cJCQk6IE91dHB1dCB0byBUSVBDIGxvZyBidWZmZXIgCisgKiAmYnVmIAkJOiBPdXRwdXQgdG8gdXNlci1kZWZpbmVkIGJ1ZmZlciAoc3RydWN0IHByaW50X2J1ZiAqKQorICogVEVFKCZidWZfYSwmYnVmX2IpCTogT3V0cHV0IHRvIHR3byBwcmludCBidWZmZXJzIChlZy4gVEVFKENPTlMsTE9HKSApCisgKi8KKworI2lmbmRlZiBUSVBDX09VVFBVVAorI2RlZmluZSBUSVBDX09VVFBVVCBURUUoQ09OUyxMT0cpCisjZW5kaWYKKworI2lmbmRlZiBEQkdfT1VUUFVUCisjZGVmaW5lIERCR19PVVRQVVQgTlVMTAorI2VuZGlmCisKKyNlbHNlCisKKyNpZm5kZWYgREJHX09VVFBVVAorI2RlZmluZSBEQkdfT1VUUFVUIE5VTEwKKyNlbmRpZgorCisvKgorICogVElQQyBkZWJ1ZyBzdXBwb3J0IG5vdCBpbmNsdWRlZDoKKyAqIC0gc3lzdGVtIG1lc3NhZ2VzIGFyZSBwcmludGVkIHRvIHN5c3RlbSBjb25zb2xlCisgKiAtIGRlYnVnIG1lc3NhZ2VzIGFyZSBub3QgcHJpbnRlZAorICovCisKKyNkZWZpbmUgZXJyKGZtdCwgYXJnLi4uKSAgcHJpbnRrKEtFUk5fRVJSICJUSVBDOiAiIGZtdCAsICMjIGFyZykKKyNkZWZpbmUgaW5mbyhmbXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyAiVElQQzogIiBmbXQgLCAjIyBhcmcpCisjZGVmaW5lIHdhcm4oZm10LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgIlRJUEM6ICIgZm10ICwgIyMgYXJnKQorCisjZGVmaW5lIGRiZyhmbXQsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIG1zZ19kYmcobXNnLHR4dCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGR1bXAoZm10LGFyZy4uLikgZG8ge30gd2hpbGUgKDApCisKKyNlbmRpZgkJCSAgCisKKworLyogCisgKiBUSVBDLXNwZWNpZmljIGVycm9yIGNvZGVzCisgKi8KKworI2RlZmluZSBFTElOS0NPTkcgRUFHQUlOCS8qIGxpbmsgY29uZ2VzdGlvbiA8PT4gcmVzb3VyY2UgdW5hdmFpbGFibGUgKi8KKworLyoKKyAqIEdsb2JhbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworICovCisKK2V4dGVybiB1MzIgdGlwY19vd25fYWRkcjsKK2V4dGVybiBpbnQgdGlwY19tYXhfem9uZXM7CitleHRlcm4gaW50IHRpcGNfbWF4X2NsdXN0ZXJzOworZXh0ZXJuIGludCB0aXBjX21heF9ub2RlczsKK2V4dGVybiBpbnQgdGlwY19tYXhfc2xhdmVzOworZXh0ZXJuIGludCB0aXBjX21heF9wb3J0czsKK2V4dGVybiBpbnQgdGlwY19tYXhfc3Vic2NyaXB0aW9uczsKK2V4dGVybiBpbnQgdGlwY19tYXhfcHVibGljYXRpb25zOworZXh0ZXJuIGludCB0aXBjX25ldF9pZDsKK2V4dGVybiBpbnQgdGlwY19yZW1vdGVfbWFuYWdlbWVudDsKKworLyoKKyAqIE90aGVyIGdsb2JhbCB2YXJpYWJsZXMKKyAqLworCitleHRlcm4gaW50IHRpcGNfbW9kZTsKK2V4dGVybiBpbnQgdGlwY19yYW5kb207CitleHRlcm4gY29uc3QgY2hhciB0aXBjX2FscGhhYmV0W107CitleHRlcm4gYXRvbWljX3QgdGlwY191c2VyX2NvdW50OworCisKKy8qCisgKiBSb3V0aW5lcyBhdmFpbGFibGUgdG8gcHJpdmlsZWdlZCBzdWJzeXN0ZW1zCisgKi8KKworZXh0ZXJuIGludCAgc3RhcnRfY29yZSh2b2lkKTsKK2V4dGVybiB2b2lkIHN0b3BfY29yZSh2b2lkKTsKK2V4dGVybiBpbnQgIHN0YXJ0X25ldCh2b2lkKTsKK2V4dGVybiB2b2lkIHN0b3BfbmV0KHZvaWQpOworCitzdGF0aWMgaW5saW5lIGludCBkZWxpbWl0KGludCB2YWwsIGludCBtaW4sIGludCBtYXgpCit7CisJaWYgKHZhbCA+IG1heCkKKwkJcmV0dXJuIG1heDsKKwlpZiAodmFsIDwgbWluKQorCQlyZXR1cm4gbWluOworCXJldHVybiB2YWw7Cit9CisKKworLyoKKyAqIFRJUEMgdGltZXIgYW5kIHNpZ25hbCBjb2RlCisgKi8KKwordHlwZWRlZiB2b2lkICgqSGFuZGxlcikgKHVuc2lnbmVkIGxvbmcpOworCit1MzIga19zaWduYWwoSGFuZGxlciByb3V0aW5lLCB1bnNpZ25lZCBsb25nIGFyZ3VtZW50KTsKKworLyoqCisgKiBrX2luaXRfdGltZXIgLSBpbml0aWFsaXplIGEgdGltZXIKKyAqIEB0aW1lcjogcG9pbnRlciB0byB0aW1lciBzdHJ1Y3R1cmUKKyAqIEByb3V0aW5lOiBwb2ludGVyIHRvIHJvdXRpbmUgdG8gaW52b2tlIHdoZW4gdGltZXIgZXhwaXJlcworICogQGFyZ3VtZW50OiB2YWx1ZSB0byBwYXNzIHRvIHJvdXRpbmUgd2hlbiB0aW1lciBleHBpcmVzCisgKiAKKyAqIFRpbWVyIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSAoYW5kIHRlcm1pbmF0ZWQgd2hlbiBubyBsb25nZXIgbmVlZGVkKS4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQga19pbml0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgSGFuZGxlciByb3V0aW5lLCAKKwkJCQl1bnNpZ25lZCBsb25nIGFyZ3VtZW50KQoreworCWRiZygiaW5pdGlhbGl6aW5nIHRpbWVyICVwXG4iLCB0aW1lcik7CisJaW5pdF90aW1lcih0aW1lcik7CisJdGltZXItPmZ1bmN0aW9uID0gcm91dGluZTsKKwl0aW1lci0+ZGF0YSA9IGFyZ3VtZW50OworfQorCisvKioKKyAqIGtfc3RhcnRfdGltZXIgLSBzdGFydCBhIHRpbWVyCisgKiBAdGltZXI6IHBvaW50ZXIgdG8gdGltZXIgc3RydWN0dXJlCisgKiBAbXNlYzogdGltZSB0byBkZWxheSAoaW4gbXMpCisgKiAKKyAqIFNjaGVkdWxlcyBhIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgdGltZXIgZm9yIGxhdGVyIGV4ZWN1dGlvbi4KKyAqIElmIHRpbWVyIGlzIGFscmVhZHkgcnVubmluZywgdGhlIG5ldyB0aW1lb3V0IG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgcmVxdWVzdC4KKyAqIAorICogVG8gZW5zdXJlIHRoZSB0aW1lciBkb2Vzbid0IGV4cGlyZSBiZWZvcmUgdGhlIHNwZWNpZmllZCBkZWxheSBlbGFwc2VzLAorICogdGhlIGFtb3VudCBvZiBkZWxheSBpcyByb3VuZGVkIHVwIHdoZW4gY29udmVydGluZyB0byB0aGUgamlmZmllcworICogdGhlbiBhbiBhZGRpdGlvbmFsIGppZmZ5IGlzIGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgCisgKiB0aGUgc3RhcnRpbmcgdGltZSBtYXkgYmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgY3VycmVudCBqaWZmeS4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQga19zdGFydF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsIHVuc2lnbmVkIGxvbmcgbXNlYykKK3sKKwlkYmcoInN0YXJ0aW5nIHRpbWVyICVwIGZvciAldVxuIiwgdGltZXIsIG1zZWMpOworCW1vZF90aW1lcih0aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMobXNlYykgKyAxKTsKK30KKworLyoqCisgKiBrX2NhbmNlbF90aW1lciAtIGNhbmNlbCBhIHRpbWVyCisgKiBAdGltZXI6IHBvaW50ZXIgdG8gdGltZXIgc3RydWN0dXJlCisgKiAKKyAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGluaXRpYWxpemVkIHRpbWVyLiAgCisgKiBDYW4gYmUgY2FsbGVkIHNhZmVseSBldmVuIGlmIHRoZSB0aW1lciBpcyBhbHJlYWR5IGluYWN0aXZlLgorICogCisgKiBXQVJOSU5HOiBNdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiBob2xkaW5nIGxvY2tzIHJlcXVpcmVkIGJ5IHRoZSB0aW1lcidzCisgKiAgICAgICAgICB0aW1lb3V0IHJvdXRpbmUsIG90aGVyd2lzZSBkZWFkbG9jayBjYW4gb2NjdXIgb24gU01QIHN5c3RlbXMhCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGtfY2FuY2VsX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlkYmcoImNhbmNlbGxpbmcgdGltZXIgJXBcbiIsIHRpbWVyKTsKKwlkZWxfdGltZXJfc3luYyh0aW1lcik7Cit9CisKKy8qKgorICoga190ZXJtX3RpbWVyIC0gdGVybWluYXRlIGEgdGltZXIKKyAqIEB0aW1lcjogcG9pbnRlciB0byB0aW1lciBzdHJ1Y3R1cmUKKyAqIAorICogUHJldmVudHMgZnVydGhlciB1c2Ugb2YgYSBwcmV2aW91c2x5IGluaXRpYWxpemVkIHRpbWVyLgorICogCisgKiBXQVJOSU5HOiBDYWxsZXIgbXVzdCBlbnN1cmUgdGltZXIgaXNuJ3QgY3VycmVudGx5IHJ1bm5pbmcuCisgKiAKKyAqIChEbyBub3QgImVuaGFuY2UiIHRoaXMgcm91dGluZSB0byBhdXRvbWF0aWNhbGx5IGNhbmNlbCBhbiBhY3RpdmUgdGltZXIsCisgKiBvdGhlcndpc2UgZGVhZGxvY2sgY2FuIGFyaXNlIHdoZW4gYSB0aW1lb3V0IHJvdXRpbmUgY2FsbHMga190ZXJtX3RpbWVyLikKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQga190ZXJtX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlkYmcoInRlcm1pbmF0aW5nIHRpbWVyICVwXG4iLCB0aW1lcik7Cit9CisKKworLyoKKyAqIFRJUEMgbWVzc2FnZSBidWZmZXIgY29kZQorICoKKyAqIFRJUEMgbWVzc2FnZSBidWZmZXIgaGVhZHJvb20gbGVhdmVzIHJvb20gZm9yIDE0IGJ5dGUgRXRoZXJuZXQgaGVhZGVyLCAKKyAqIHdoaWxlIGVuc3VyaW5nIFRJUEMgaGVhZGVyIGlzIHdvcmQgYWxpZ25lZCBmb3IgcXVpY2tlciBhY2Nlc3MKKyAqLworCisjZGVmaW5lIEJVRl9IRUFEUk9PTSAxNnUgCisKK3N0cnVjdCB0aXBjX3NrYl9jYiB7CisJdm9pZCAqaGFuZGxlOworfTsKKworI2RlZmluZSBUSVBDX1NLQl9DQihfX3NrYikgKChzdHJ1Y3QgdGlwY19za2JfY2IgKikmKChfX3NrYiktPmNiWzBdKSkKKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aXBjX21zZyAqYnVmX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IHRpcGNfbXNnICopc2tiLT5kYXRhOworfQorCisvKioKKyAqIGJ1Zl9hY3F1aXJlIC0gY3JlYXRlcyBhIFRJUEMgbWVzc2FnZSBidWZmZXIKKyAqIEBzaXplOiBtZXNzYWdlIHNpemUgKGluY2x1ZGluZyBUSVBDIGhlYWRlcikKKyAqCisgKiBSZXR1cm5zIGEgbmV3IGJ1ZmZlci4gIFNwYWNlIGlzIHJlc2VydmVkIGZvciBhIGRhdGEgbGluayBoZWFkZXIuCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqYnVmX2FjcXVpcmUodTMyIHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgYnVmX3NpemUgPSAoQlVGX0hFQURST09NICsgc2l6ZSArIDMpICYgfjN1OworCisJc2tiID0gYWxsb2Nfc2tiKGJ1Zl9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiKSB7CisJCXNrYl9yZXNlcnZlKHNrYiwgQlVGX0hFQURST09NKTsKKwkJc2tiX3B1dChza2IsIHNpemUpOworCQlza2ItPm5leHQgPSBOVUxMOworCX0KKwlyZXR1cm4gc2tiOworfQorCisvKioKKyAqIGJ1Zl9kaXNjYXJkIC0gZnJlZXMgYSBUSVBDIG1lc3NhZ2UgYnVmZmVyCisgKiBAc2tiOiBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIEZyZWVzIGEgbmV3IGJ1ZmZlci4gIElmIHBhc3NlZCBOVUxMLCBqdXN0IHJldHVybnMuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGJ1Zl9kaXNjYXJkKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpCisJCWtmcmVlX3NrYihza2IpOworfQorCisjZW5kaWYJCQkKZGlmZiAtLWdpdCBhL25ldC90aXBjL2RiZy5jIGIvbmV0L3RpcGMvZGJnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkNjBhMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2RiZy5jCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogbmV0L3RpcGMvZGJnLmM6IFRJUEMgcHJpbnQgYnVmZmVyIHJvdXRpbmVzIGZvciBkZWJ1Z2dpZ24KKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkYmcuaCIKKworI2RlZmluZSBNQVhfU1RSSU5HIDUxMgorCitzdGF0aWMgY2hhciBwcmludF9zdHJpbmdbTUFYX1NUUklOR107CitzdGF0aWMgc3BpbmxvY2tfdCBwcmludF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCitzdGF0aWMgc3RydWN0IHByaW50X2J1ZiBjb25zX2J1ZiA9IHsgTlVMTCwgMCwgTlVMTCwgTlVMTCB9Oworc3RydWN0IHByaW50X2J1ZiAqQ09OUyA9ICZjb25zX2J1ZjsKKworc3RhdGljIHN0cnVjdCBwcmludF9idWYgbG9nX2J1ZiA9IHsgTlVMTCwgMCwgTlVMTCwgTlVMTCB9Oworc3RydWN0IHByaW50X2J1ZiAqTE9HID0gJmxvZ19idWY7CisKKworI2RlZmluZSBGT1JNQVQoUFRSLExFTixGTVQpIFwKK3tcCisgICAgICAgdmFfbGlzdCBhcmdzO1wKKyAgICAgICB2YV9zdGFydChhcmdzLCBGTVQpO1wKKyAgICAgICBMRU4gPSB2c3ByaW50ZihQVFIsIEZNVCwgYXJncyk7XAorICAgICAgIHZhX2VuZChhcmdzKTtcCisgICAgICAgKihQVFIgKyBMRU4pID0gJ1wwJztcCit9CisKKy8qCisgKiBMb2NraW5nIHBvbGljeSB3aGVuIHVzaW5nIHByaW50IGJ1ZmZlcnMuCisgKgorICogMSkgUm91dGluZXMgb2YgdGhlIGZvcm0gcHJpbnRidWZfWFhYKCkgcmVseSBvbiB0aGUgY2FsbGVyIHRvIHByZXZlbnQKKyAqICAgIHNpbXVsdGFuZW91cyB1c2Ugb2YgdGhlIHByaW50IGJ1ZmZlcihzKSBiZWluZyBtYW5pcHVsYXRlZC4KKyAqIDIpIHRpcGNfcHJpbnRmKCkgdXNlcyAncHJpbnRfbG9jaycgdG8gcHJldmVudCBzaW11bHRhbmVvdXMgdXNlIG9mCisgKiAgICAncHJpbnRfc3RyaW5nJyBhbmQgdG8gcHJvdGVjdCBpdHMgcHJpbnQgYnVmZmVyKHMpLgorICogMykgVEVFKCkgdXNlcyAncHJpbnRfbG9jaycgdG8gcHJvdGVjdCBpdHMgcHJpbnQgYnVmZmVyKHMpLgorICogNCkgUm91dGluZXMgb2YgdGhlIGZvcm0gbG9nX1hYWCgpIHVzZXMgJ3ByaW50X2xvY2snIHRvIHByb3RlY3QgTE9HLgorICovCisKKy8qKgorICogcHJpbnRidWZfaW5pdCAtIGluaXRpYWxpemUgcHJpbnQgYnVmZmVyIHRvIGVtcHR5CisgKi8KKwordm9pZCBwcmludGJ1Zl9pbml0KHN0cnVjdCBwcmludF9idWYgKnBiLCBjaGFyICpyYXcsIHUzMiBzeikKK3sKKwlpZiAoIXBiIHx8ICFyYXcgfHwgKHN6IDwgKE1BWF9TVFJJTkcgKyAxKSkpCisJCXJldHVybjsKKworCXBiLT5jcnMgPSBwYi0+YnVmID0gcmF3OworCXBiLT5zaXplID0gc3o7CisJcGItPm5leHQgPSAwOworCXBiLT5idWZbMF0gPSAwOworCXBiLT5idWZbc3otMV0gPSB+MDsKK30KKworLyoqCisgKiBwcmludGJ1Zl9yZXNldCAtIHJlaW5pdGlhbGl6ZSBwcmludCBidWZmZXIgdG8gZW1wdHkgc3RhdGUKKyAqLworCit2b2lkIHByaW50YnVmX3Jlc2V0KHN0cnVjdCBwcmludF9idWYgKnBiKQoreworCWlmIChwYiAmJiBwYi0+YnVmKQorCQlwcmludGJ1Zl9pbml0KHBiLCBwYi0+YnVmLCBwYi0+c2l6ZSk7Cit9CisKKy8qKgorICogcHJpbnRidWZfZW1wdHkgLSB0ZXN0IGlmIHByaW50IGJ1ZmZlciBpcyBpbiBlbXB0eSBzdGF0ZQorICovCisKK2ludCBwcmludGJ1Zl9lbXB0eShzdHJ1Y3QgcHJpbnRfYnVmICpwYikKK3sKKwlyZXR1cm4gKCFwYiB8fCAhcGItPmJ1ZiB8fCAocGItPmNycyA9PSBwYi0+YnVmKSk7Cit9CisKKy8qKgorICogcHJpbnRidWZfdmFsaWRhdGUgLSBjaGVjayBmb3IgcHJpbnQgYnVmZmVyIG92ZXJmbG93CisgKiAKKyAqIFZlcmlmaWVzIHRoYXQgYSBwcmludCBidWZmZXIgaGFzIGNhcHR1cmVkIGFsbCBkYXRhIHdyaXR0ZW4gdG8gaXQuIAorICogSWYgZGF0YSBoYXMgYmVlbiBsb3N0LCBsaW5lYXJpemUgYnVmZmVyIGFuZCBwcmVwZW5kIGFuIGVycm9yIG1lc3NhZ2UKKyAqIAorICogUmV0dXJucyBsZW5ndGggb2YgcHJpbnQgYnVmZmVyIGRhdGEgc3RyaW5nIChpbmNsdWRpbmcgdHJhaWxpbmcgTlVMTCkKKyAqLworCitpbnQgcHJpbnRidWZfdmFsaWRhdGUoc3RydWN0IHByaW50X2J1ZiAqcGIpCit7CisgICAgICAgIGNoYXIgKmVyciA9ICIgICAgICAgICAgICAgKioqIFBSSU5UIEJVRkZFUiBXUkFQUEVEIEFST1VORCAqKipcbiI7CisgICAgICAgIGNoYXIgKmNwX2J1ZjsKKyAgICAgICAgc3RydWN0IHByaW50X2J1ZiBjYjsKKworCWlmICghcGIgfHwgIXBiLT5idWYpCisJCXJldHVybiAwOworCisJaWYgKHBiLT5idWZbcGItPnNpemUgLSAxXSA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgY3BfYnVmID0ga21hbGxvYyhwYi0+c2l6ZSwgR0ZQX0FUT01JQyk7CisgICAgICAgICAgICAgICAgaWYgKGNwX2J1ZiAhPSBOVUxMKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50YnVmX2luaXQoJmNiLCBjcF9idWYsIHBiLT5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50YnVmX21vdmUoJmNiLCBwYik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGJ1Zl9tb3ZlKHBiLCAmY2IpOworICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUoY3BfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwYi0+YnVmLCBlcnIsIHN0cmxlbihlcnIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRidWZfcmVzZXQocGIpOworICAgICAgICAgICAgICAgICAgICAgICAgdGlwY19wcmludGYocGIsIGVycik7CisgICAgICAgICAgICAgICAgfQorCX0KKwlyZXR1cm4gKHBiLT5jcnMgLSBwYi0+YnVmICsgMSk7Cit9CisKKy8qKgorICogcHJpbnRidWZfbW92ZSAtIG1vdmUgcHJpbnQgYnVmZmVyIGNvbnRlbnRzIHRvIGFub3RoZXIgcHJpbnQgYnVmZmVyCisgKiAKKyAqIEN1cnJlbnQgY29udGVudHMgb2YgZGVzdGluYXRpb24gcHJpbnQgYnVmZmVyIChpZiBhbnkpIGFyZSBkaXNjYXJkZWQuCisgKiBTb3VyY2UgcHJpbnQgYnVmZmVyIGJlY29tZXMgZW1wdHkgaWYgYSBzdWNjZXNzZnVsIG1vdmUgb2NjdXJzLgorICovCisKK3ZvaWQgcHJpbnRidWZfbW92ZShzdHJ1Y3QgcHJpbnRfYnVmICpwYl90bywgc3RydWN0IHByaW50X2J1ZiAqcGJfZnJvbSkKK3sKKwlpbnQgbGVuOworCisJLyogSGFuZGxlIHRoZSBjYXNlcyB3aGVyZSBjb250ZW50cyBjYW4ndCBiZSBtb3ZlZCAqLworCisJaWYgKCFwYl90byB8fCAhcGJfdG8tPmJ1ZikKKwkJcmV0dXJuOworCisJaWYgKCFwYl9mcm9tIHx8ICFwYl9mcm9tLT5idWYpIHsKKwkJcHJpbnRidWZfcmVzZXQocGJfdG8pOworCQlyZXR1cm47CisJfQorCisJaWYgKHBiX3RvLT5zaXplIDwgcGJfZnJvbS0+c2l6ZSkgeworCQlwcmludGJ1Zl9yZXNldChwYl90byk7CisJCXRpcGNfcHJpbnRmKHBiX3RvLCAiKioqIFBSSU5UIEJVRkZFUiBPVkVSRkxPVyAqKioiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENvcHkgZGF0YSBmcm9tIGNoYXIgYWZ0ZXIgY3Vyc29yIHRvIGVuZCAoaWYgdXNlZCkgKi8KKwlsZW4gPSBwYl9mcm9tLT5idWYgKyBwYl9mcm9tLT5zaXplIC0gcGJfZnJvbS0+Y3JzIC0gMjsKKwlpZiAoKHBiX2Zyb20tPmJ1ZltwYl9mcm9tLT5zaXplLTFdID09IDApICYmIChsZW4gPiAwKSkgeworCQlzdHJjcHkocGJfdG8tPmJ1ZiwgcGJfZnJvbS0+Y3JzICsgMSk7CisJCXBiX3RvLT5jcnMgPSBwYl90by0+YnVmICsgbGVuOworCX0gZWxzZQorCQlwYl90by0+Y3JzID0gcGJfdG8tPmJ1ZjsKKworCS8qIENvcHkgZGF0YSBmcm9tIHN0YXJ0IHRvIGN1cnNvciAoYWx3YXlzKSAqLworCWxlbiA9IHBiX2Zyb20tPmNycyAtIHBiX2Zyb20tPmJ1ZjsKKwlzdHJjcHkocGJfdG8tPmNycywgcGJfZnJvbS0+YnVmKTsKKwlwYl90by0+Y3JzICs9IGxlbjsKKworCXByaW50YnVmX3Jlc2V0KHBiX2Zyb20pOworfQorCisvKioKKyAqIHRpcGNfcHJpbnRmIC0gYXBwZW5kIGZvcm1hdHRlZCBvdXRwdXQgdG8gcHJpbnQgYnVmZmVyIGNoYWluCisgKi8KKwordm9pZCB0aXBjX3ByaW50ZihzdHJ1Y3QgcHJpbnRfYnVmICpwYiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJaW50IGNoYXJzX3RvX2FkZDsKKwlpbnQgY2hhcnNfbGVmdDsKKwljaGFyIHNhdmVfY2hhcjsKKwlzdHJ1Y3QgcHJpbnRfYnVmICpwYl9uZXh0OworCisJc3Bpbl9sb2NrX2JoKCZwcmludF9sb2NrKTsKKwlGT1JNQVQocHJpbnRfc3RyaW5nLCBjaGFyc190b19hZGQsIGZtdCk7CisJaWYgKGNoYXJzX3RvX2FkZCA+PSBNQVhfU1RSSU5HKQorCQlzdHJjcHkocHJpbnRfc3RyaW5nLCAiKioqIFNUUklORyBUT08gTE9ORyAqKioiKTsKKworCXdoaWxlIChwYikgeworCQlpZiAocGIgPT0gQ09OUykKKwkJCXByaW50ayhwcmludF9zdHJpbmcpOworCQllbHNlIGlmIChwYi0+YnVmKSB7CisJCQljaGFyc19sZWZ0ID0gcGItPmJ1ZiArIHBiLT5zaXplIC0gcGItPmNycyAtIDE7CisJCQlpZiAoY2hhcnNfdG9fYWRkIDw9IGNoYXJzX2xlZnQpIHsKKwkJCQlzdHJjcHkocGItPmNycywgcHJpbnRfc3RyaW5nKTsKKwkJCQlwYi0+Y3JzICs9IGNoYXJzX3RvX2FkZDsKKwkJCX0gZWxzZSB7CisJCQkJc3RyY3B5KHBiLT5idWYsIHByaW50X3N0cmluZyArIGNoYXJzX2xlZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlX2NoYXIgPSBwcmludF9zdHJpbmdbY2hhcnNfbGVmdF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0cmluZ1tjaGFyc19sZWZ0XSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShwYi0+Y3JzLCBwcmludF9zdHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9zdHJpbmdbY2hhcnNfbGVmdF0gPSBzYXZlX2NoYXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiLT5jcnMgPSBwYi0+YnVmICsgY2hhcnNfdG9fYWRkIC0gY2hhcnNfbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisJCXBiX25leHQgPSBwYi0+bmV4dDsKKwkJcGItPm5leHQgPSAwOworCQlwYiA9IHBiX25leHQ7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZwcmludF9sb2NrKTsKK30KKworLyoqCisgKiBURUUgLSBwZXJmb3JtIG5leHQgb3V0cHV0IG9wZXJhdGlvbiBvbiBib3RoIHByaW50IGJ1ZmZlcnMgIAorICovCisKK3N0cnVjdCBwcmludF9idWYgKlRFRShzdHJ1Y3QgcHJpbnRfYnVmICpiMCwgc3RydWN0IHByaW50X2J1ZiAqYjEpCit7CisJc3RydWN0IHByaW50X2J1ZiAqcGIgPSBiMDsKKworCWlmICghYjAgfHwgKGIwID09IGIxKSkKKwkJcmV0dXJuIGIxOworCWlmICghYjEpCisJCXJldHVybiBiMDsKKworCXNwaW5fbG9ja19iaCgmcHJpbnRfbG9jayk7CisJd2hpbGUgKHBiLT5uZXh0KSB7CisJCWlmICgocGItPm5leHQgPT0gYjEpIHx8IChwYi0+bmV4dCA9PSBiMCkpCisJCQlwYi0+bmV4dCA9IHBiLT5uZXh0LT5uZXh0OworCQllbHNlCisJCQlwYiA9IHBiLT5uZXh0OworCX0KKwlwYi0+bmV4dCA9IGIxOworCXNwaW5fdW5sb2NrX2JoKCZwcmludF9sb2NrKTsKKwlyZXR1cm4gYjA7Cit9CisKKy8qKgorICogcHJpbnRfdG9fY29uc29sZSAtIHdyaXRlIHN0cmluZyBvZiBieXRlcyB0byBjb25zb2xlIGluIG11bHRpcGxlIGNodW5rcworICovCisKK3N0YXRpYyB2b2lkIHByaW50X3RvX2NvbnNvbGUoY2hhciAqY3JzLCBpbnQgbGVuKQoreworCWludCByZXN0ID0gbGVuOworCisJd2hpbGUgKHJlc3QgPiAwKSB7CisJCWludCBzeiA9IHJlc3QgPCBNQVhfU1RSSU5HID8gcmVzdCA6IE1BWF9TVFJJTkc7CisJCWNoYXIgYyA9IGNyc1tzel07CisKKwkJY3JzW3N6XSA9IDA7CisJCXByaW50aygoY29uc3QgY2hhciAqKWNycyk7CisJCWNyc1tzel0gPSBjOworCQlyZXN0IC09IHN6OworCQljcnMgKz0gc3o7CisJfQorfQorCisvKioKKyAqIHByaW50YnVmX2R1bXAgLSB3cml0ZSBwcmludCBidWZmZXIgY29udGVudHMgdG8gY29uc29sZQorICovCisKK3N0YXRpYyB2b2lkIHByaW50YnVmX2R1bXAoc3RydWN0IHByaW50X2J1ZiAqcGIpCit7CisJaW50IGxlbjsKKworCS8qIER1bXAgcHJpbnQgYnVmZmVyIGZyb20gY2hhciBhZnRlciBjdXJzb3IgdG8gZW5kIChpZiB1c2VkKSAqLworCWxlbiA9IHBiLT5idWYgKyBwYi0+c2l6ZSAtIHBiLT5jcnMgLSAyOworCWlmICgocGItPmJ1ZltwYi0+c2l6ZSAtIDFdID09IDApICYmIChsZW4gPiAwKSkKKwkJcHJpbnRfdG9fY29uc29sZShwYi0+Y3JzICsgMSwgbGVuKTsKKworCS8qIER1bXAgcHJpbnQgYnVmZmVyIGZyb20gc3RhcnQgdG8gY3Vyc29yIChhbHdheXMpICovCisJbGVuID0gcGItPmNycyAtIHBiLT5idWY7CisJcHJpbnRfdG9fY29uc29sZShwYi0+YnVmLCBsZW4pOworfQorCisvKioKKyAqIHRpcGNfZHVtcCAtIGR1bXAgbm9uLWNvbnNvbGUgcHJpbnQgYnVmZmVyKHMpIHRvIGNvbnNvbGUKKyAqLworCit2b2lkIHRpcGNfZHVtcChzdHJ1Y3QgcHJpbnRfYnVmICpwYiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJaW50IGxlbjsKKworCXNwaW5fbG9ja19iaCgmcHJpbnRfbG9jayk7CisJRk9STUFUKENPTlMtPmJ1ZiwgbGVuLCBmbXQpOworCXByaW50ayhDT05TLT5idWYpOworCisJZm9yICg7IHBiOyBwYiA9IHBiLT5uZXh0KSB7CisJCWlmIChwYiA9PSBDT05TKQorCQkJY29udGludWU7CisJCXByaW50aygiXG4tLS0tIFN0YXJ0IG9mIGR1bXAsJXMgbG9nIC0tLS1cblxuIiwgCisJCSAgICAgICAocGIgPT0gTE9HKSA/ICJnbG9iYWwiIDogImxvY2FsIik7CisJCXByaW50YnVmX2R1bXAocGIpOworCQlwcmludGJ1Zl9yZXNldChwYik7CisJCXByaW50aygiXG4tLS0tLS0tLSBFbmQgb2YgZHVtcCAtLS0tLS0tLVxuIik7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZwcmludF9sb2NrKTsKK30KKworLyoqCisgKiBsb2dfc3RvcCAtIGZyZWUgdXAgVElQQyBsb2cgcHJpbnQgYnVmZmVyIAorICovCisKK3ZvaWQgbG9nX3N0b3Aodm9pZCkKK3sKKwlzcGluX2xvY2tfYmgoJnByaW50X2xvY2spOworCWlmIChMT0ctPmJ1ZikgeworCQlrZnJlZShMT0ctPmJ1Zik7CisJCUxPRy0+YnVmID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnByaW50X2xvY2spOworfQorCisvKioKKyAqIGxvZ19yZWluaXQgLSBzZXQgVElQQyBsb2cgcHJpbnQgYnVmZmVyIHRvIHNwZWNpZmllZCBzaXplCisgKi8KKwordm9pZCBsb2dfcmVpbml0KGludCBsb2dfc2l6ZSkKK3sKKwlsb2dfc3RvcCgpOworCisJaWYgKGxvZ19zaXplKSB7CisJCWlmIChsb2dfc2l6ZSA8PSBNQVhfU1RSSU5HKQorCQkJbG9nX3NpemUgPSBNQVhfU1RSSU5HICsgMTsKKwkJc3Bpbl9sb2NrX2JoKCZwcmludF9sb2NrKTsKKwkJcHJpbnRidWZfaW5pdChMT0csIGttYWxsb2MobG9nX3NpemUsIEdGUF9BVE9NSUMpLCBsb2dfc2l6ZSk7CisJCXNwaW5fdW5sb2NrX2JoKCZwcmludF9sb2NrKTsKKwl9Cit9CisKKy8qKgorICogbG9nX3Jlc2l6ZSAtIHJlY29uZmlndXJlIHNpemUgb2YgVElQQyBsb2cgYnVmZmVyCisgKi8KKworc3RydWN0IHNrX2J1ZmYgKmxvZ19yZXNpemUoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSkKK3sKKwl1MzIgdmFsdWU7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOworCXZhbHVlID0gbnRvaGwodmFsdWUpOworCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAwLCAzMjc2OCkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKKwkJCQkJICAgICAgIiAobG9nIHNpemUgbXVzdCBiZSAwLTMyNzY4KSIpOworCWxvZ19yZWluaXQodmFsdWUpOworCXJldHVybiBjZmdfcmVwbHlfbm9uZSgpOworfQorCisvKioKKyAqIGxvZ19kdW1wIC0gY2FwdHVyZSBUSVBDIGxvZyBidWZmZXIgY29udGVudHMgaW4gY29uZmlndXJhdGlvbiBtZXNzYWdlCisgKi8KKworc3RydWN0IHNrX2J1ZmYgKmxvZ19kdW1wKHZvaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnJlcGx5OworCisJc3Bpbl9sb2NrX2JoKCZwcmludF9sb2NrKTsKKwlpZiAoIUxPRy0+YnVmKQorCQlyZXBseSA9IGNmZ19yZXBseV91bHRyYV9zdHJpbmcoImxvZyBub3QgYWN0aXZhdGVkXG4iKTsKKwllbHNlIGlmIChwcmludGJ1Zl9lbXB0eShMT0cpKQorCQlyZXBseSA9IGNmZ19yZXBseV91bHRyYV9zdHJpbmcoImxvZyBpcyBlbXB0eVxuIik7CisJZWxzZSB7CisJCXN0cnVjdCB0bHZfZGVzYyAqcmVwX3RsdjsKKwkJc3RydWN0IHByaW50X2J1ZiBwYjsKKwkJaW50IHN0cl9sZW47CisKKwkJc3RyX2xlbiA9IG1pbihMT0ctPnNpemUsIDMyNzY4dSk7CisJCXJlcGx5ID0gY2ZnX3JlcGx5X2FsbG9jKFRMVl9TUEFDRShzdHJfbGVuKSk7CisJCWlmIChyZXBseSkgeworCQkJcmVwX3RsdiA9IChzdHJ1Y3QgdGx2X2Rlc2MgKilyZXBseS0+ZGF0YTsKKwkJCXByaW50YnVmX2luaXQoJnBiLCBUTFZfREFUQShyZXBfdGx2KSwgc3RyX2xlbik7CisJCQlwcmludGJ1Zl9tb3ZlKCZwYiwgTE9HKTsKKwkJCXN0cl9sZW4gPSBzdHJsZW4oVExWX0RBVEEocmVwX3RsdikpICsgMTsKKwkJCXNrYl9wdXQocmVwbHksIFRMVl9TUEFDRShzdHJfbGVuKSk7CisJCQlUTFZfU0VUKHJlcF90bHYsIFRJUENfVExWX1VMVFJBX1NUUklORywgTlVMTCwgc3RyX2xlbik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJnByaW50X2xvY2spOworCXJldHVybiByZXBseTsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGJnLmggYi9uZXQvdGlwYy9kYmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmIyYTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvZGJnLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIG5ldC90aXBjL2RiZy5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgcHJpbnQgYnVmZmVyIHJvdXRpbmVzCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfREJHX0gKKyNkZWZpbmUgX1RJUENfREJHX0gKKworc3RydWN0IHByaW50X2J1ZiB7CisJY2hhciAqYnVmOworCXUzMiBzaXplOworCWNoYXIgKmNyczsKKwlzdHJ1Y3QgcHJpbnRfYnVmICpuZXh0OworfTsKKwordm9pZCBwcmludGJ1Zl9pbml0KHN0cnVjdCBwcmludF9idWYgKnBiLCBjaGFyICpidWYsIHUzMiBzeik7Cit2b2lkIHByaW50YnVmX3Jlc2V0KHN0cnVjdCBwcmludF9idWYgKnBiKTsKK2ludCAgcHJpbnRidWZfZW1wdHkoc3RydWN0IHByaW50X2J1ZiAqcGIpOworaW50ICBwcmludGJ1Zl92YWxpZGF0ZShzdHJ1Y3QgcHJpbnRfYnVmICpwYik7Cit2b2lkIHByaW50YnVmX21vdmUoc3RydWN0IHByaW50X2J1ZiAqcGJfdG8sIHN0cnVjdCBwcmludF9idWYgKnBiX2Zyb20pOworCit2b2lkIGxvZ19yZWluaXQoaW50IGxvZ19zaXplKTsKK3ZvaWQgbG9nX3N0b3Aodm9pZCk7CisKK3N0cnVjdCBza19idWZmICpsb2dfcmVzaXplKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpOworc3RydWN0IHNrX2J1ZmYgKmxvZ19kdW1wKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL2Rpc2NvdmVyLmMgYi9uZXQvdGlwYy9kaXNjb3Zlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMDZlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9kaXNjb3Zlci5jCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogbmV0L3RpcGMvZGlzY292ZXIuYworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJ6b25lLmgiCisjaW5jbHVkZSAiZGlzY292ZXIuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAibmFtZV90YWJsZS5oIgorCisjZGVmaW5lIFRJUENfTElOS19SRVFfSU5JVAkxMjUJLyogbWluIGRlbGF5IGR1cmluZyBiZWFyZXIgc3RhcnQgdXAgKi8KKyNkZWZpbmUgVElQQ19MSU5LX1JFUV9GQVNUCTIwMDAJLyogbm9ybWFsIGRlbGF5IGlmIGJlYXJlciBoYXMgbm8gbGlua3MgKi8KKyNkZWZpbmUgVElQQ19MSU5LX1JFUV9TTE9XCTYwMDAwMAkvKiBub3JtYWwgZGVsYXkgaWYgYmVhcmVyIGhhcyBsaW5rcyAqLworCisjaWYgMAorI2RlZmluZSAgR0VUX05PREVfSU5GTyAgICAgICAgIDMwMAorI2RlZmluZSAgR0VUX05PREVfSU5GT19SRVNVTFQgIDMwMQorI2RlZmluZSAgRk9SV0FSRF9MSU5LX1BST0JFICAgIDMwMgorI2RlZmluZSAgTElOS19SRVFVRVNUX1JFSkVDVEVEIDMwMworI2RlZmluZSAgTElOS19SRVFVRVNUX0FDQ0VQVEVEIDMwNAorI2RlZmluZSAgRFJPUF9MSU5LX1JFUVVFU1QgICAgIDMwNQorI2RlZmluZSAgQ0hFQ0tfTElOS19DT1VOVCAgICAgIDMwNgorI2VuZGlmCisKKy8qIAorICogVE9ETzogTW9zdCBvZiB0aGUgaW50ZXItY2x1c3RlciBzZXR1cCBzdHVmZiBzaG91bGQgYmUKKyAqIHJld3JpdHRlbiwgYW5kIGJlIG1hZGUgY29uZm9ybWFudCB3aXRoIHNwZWNpZmljYXRpb24uCisgKi8gCisKKworLyoqCisgKiBzdHJ1Y3QgbGlua19yZXEgLSBpbmZvcm1hdGlvbiBhYm91dCBhbiBvbmdvaW5nIGxpbmsgc2V0dXAgcmVxdWVzdAorICogQGJlYXJlcjogYmVhcmVyIGlzc3VpbmcgcmVxdWVzdHMKKyAqIEBkZXN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciByZXF1ZXN0IG1lc3NhZ2VzCisgKiBAYnVmOiByZXF1ZXN0IG1lc3NhZ2UgdG8gYmUgKHJlcGVhdGVkbHkpIHNlbnQKKyAqIEB0aW1lcjogdGltZXIgZ292ZXJuaW5nIHBlcmlvZCBiZXR3ZWVuIHJlcXVlc3RzCisgKiBAdGltZXJfaW50djogY3VycmVudCBpbnRlcnZhbCBiZXR3ZWVuIHJlcXVlc3RzIChpbiBtcykKKyAqLworc3RydWN0IGxpbmtfcmVxIHsKKwlzdHJ1Y3QgYmVhcmVyICpiZWFyZXI7CisJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBkZXN0OworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJdW5zaWduZWQgaW50IHRpbWVyX2ludHY7Cit9OworCisKKyNpZiAwCitpbnQgZGlzY19jcmVhdGVfbGluayhjb25zdCBzdHJ1Y3QgdGlwY19saW5rX2NyZWF0ZSAqYXJndikgCit7CisJLyogCisJICogQ29kZSBmb3IgaW50ZXIgY2x1c3RlciBsaW5rIHNldHVwIGhlcmUgCisJICovCisJcmV0dXJuIFRJUENfT0s7Cit9CisjZW5kaWYKKworLyoKKyAqIGRpc2NfbG9zdF9saW5rKCk6IEEgbGluayBoYXMgbG9zdCBjb250YWN0CisgKi8KKwordm9pZCBkaXNjX2xpbmtfZXZlbnQodTMyIGFkZHIsIGNoYXIgKm5hbWUsIGludCB1cCkgCit7CisJaWYgKGluX293bl9jbHVzdGVyKGFkZHIpKQorCQlyZXR1cm47CisJLyogCisJICogQ29kZSBmb3IgaW50ZXIgY2x1c3RlciBsaW5rIHNldHVwIGhlcmUgCisJICovCit9CisKKy8qKiAKKyAqIGRpc2NfaW5pdF9tc2cgLSBpbml0aWFsaXplIGEgbGluayBzZXR1cCBtZXNzYWdlCisgKiBAdHlwZTogbWVzc2FnZSB0eXBlIChyZXF1ZXN0IG9yIHJlc3BvbnNlKQorICogQHJlcV9saW5rczogbnVtYmVyIG9mIGxpbmtzIGFzc29jaWF0ZWQgd2l0aCBtZXNzYWdlCisgKiBAZGVzdF9kb21haW46IG5ldHdvcmsgZG9tYWluIG9mIG5vZGUocykgd2hpY2ggc2hvdWxkIHJlc3BvbmQgdG8gbWVzc2FnZQorICogQGJfcHRyOiBwdHIgdG8gYmVhcmVyIGlzc3VpbmcgbWVzc2FnZQorICovCisKK3N0cnVjdCBza19idWZmICpkaXNjX2luaXRfbXNnKHUzMiB0eXBlLAorCQkJICAgICAgdTMyIHJlcV9saW5rcywKKwkJCSAgICAgIHUzMiBkZXN0X2RvbWFpbiwKKwkJCSAgICAgIHN0cnVjdCBiZWFyZXIgKmJfcHRyKQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBidWZfYWNxdWlyZShEU0NfSF9TSVpFKTsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKworCWlmIChidWYpIHsKKwkJbXNnID0gYnVmX21zZyhidWYpOworCQltc2dfaW5pdChtc2csIExJTktfQ09ORklHLCB0eXBlLCBUSVBDX09LLCBEU0NfSF9TSVpFLAorCQkJIGRlc3RfZG9tYWluKTsKKwkJbXNnX3NldF9ub25fc2VxKG1zZyk7CisJCW1zZ19zZXRfcmVxX2xpbmtzKG1zZywgcmVxX2xpbmtzKTsKKwkJbXNnX3NldF9kZXN0X2RvbWFpbihtc2csIGRlc3RfZG9tYWluKTsKKwkJbXNnX3NldF9iY19uZXRpZChtc2csIHRpcGNfbmV0X2lkKTsKKwkJbXNnX3NldF9tZWRpYV9hZGRyKG1zZywgJmJfcHRyLT5wdWJsLmFkZHIpOworCX0KKwlyZXR1cm4gYnVmOworfQorCisvKioKKyAqIGRpc2NfcmVjdl9tc2cgLSBoYW5kbGUgaW5jb21pbmcgbGluayBzZXR1cCBtZXNzYWdlIChyZXF1ZXN0IG9yIHJlc3BvbnNlKQorICogQGJ1ZjogYnVmZmVyIGNvbnRhaW5pbmcgbWVzc2FnZQorICovCisKK3ZvaWQgZGlzY19yZWN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCBiZWFyZXIgKmJfcHRyID0gKHN0cnVjdCBiZWFyZXIgKilUSVBDX1NLQl9DQihidWYpLT5oYW5kbGU7CisJc3RydWN0IGxpbmsgKmxpbms7CisJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBtZWRpYV9hZGRyOworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCXUzMiBkZXN0ID0gbXNnX2Rlc3RfZG9tYWluKG1zZyk7CisJdTMyIG9yaWcgPSBtc2dfcHJldm5vZGUobXNnKTsKKwl1MzIgbmV0X2lkID0gbXNnX2JjX25ldGlkKG1zZyk7CisJdTMyIHR5cGUgPSBtc2dfdHlwZShtc2cpOworCisJbXNnX2dldF9tZWRpYV9hZGRyKG1zZywmbWVkaWFfYWRkcik7CisJbXNnX2RiZyhtc2csICJSRUNWOiIpOworCWJ1Zl9kaXNjYXJkKGJ1Zik7CisKKwlpZiAobmV0X2lkICE9IHRpcGNfbmV0X2lkKQorCQlyZXR1cm47CisJaWYgKCFhZGRyX2RvbWFpbl92YWxpZChkZXN0KSkKKwkJcmV0dXJuOworCWlmICghYWRkcl9ub2RlX3ZhbGlkKG9yaWcpKQorCQlyZXR1cm47CisJaWYgKG9yaWcgPT0gdGlwY19vd25fYWRkcikKKwkJcmV0dXJuOworCWlmICghaW5fc2NvcGUoZGVzdCwgdGlwY19vd25fYWRkcikpCisJCXJldHVybjsKKwlpZiAoaXNfc2xhdmUodGlwY19vd25fYWRkcikgJiYgaXNfc2xhdmUob3JpZykpCisJCXJldHVybjsKKwlpZiAoaXNfc2xhdmUob3JpZykgJiYgIWluX293bl9jbHVzdGVyKG9yaWcpKQorCQlyZXR1cm47CisJaWYgKGluX293bl9jbHVzdGVyKG9yaWcpKSB7CisJCS8qIEFsd2F5cyBhY2NlcHQgbGluayBoZXJlICovCisJCXN0cnVjdCBza19idWZmICpyYnVmOworCQlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphZGRyOworCQlzdHJ1Y3Qgbm9kZSAqbl9wdHIgPSBub2RlX2ZpbmQob3JpZyk7CisJCWludCBsaW5rX3VwOworCQlkYmcoIiBpbiBvd24gY2x1c3RlclxuIik7CisJCWlmIChuX3B0ciA9PSBOVUxMKSB7CisJCQluX3B0ciA9IG5vZGVfY3JlYXRlKG9yaWcpOworCQl9CisJCWlmIChuX3B0ciA9PSBOVUxMKSB7CisJCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgRmFpbGVkIHRvIGNyZWF0ZSBub2RlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlzcGluX2xvY2tfYmgoJm5fcHRyLT5sb2NrKTsKKwkJbGluayA9IG5fcHRyLT5saW5rc1tiX3B0ci0+aWRlbnRpdHldOworCQlpZiAoIWxpbmspIHsKKwkJCWRiZygiY3JlYXRpbmcgbGlua1xuIik7CisJCQlsaW5rID0gbGlua19jcmVhdGUoYl9wdHIsIG9yaWcsICZtZWRpYV9hZGRyKTsKKwkJCWlmICghbGluaykgeworCQkJCXNwaW5fdW5sb2NrX2JoKCZuX3B0ci0+bG9jayk7ICAgICAgICAgICAgICAgIAorCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlhZGRyID0gJmxpbmstPm1lZGlhX2FkZHI7CisJCWlmIChtZW1jbXAoYWRkciwgJm1lZGlhX2FkZHIsIHNpemVvZigqYWRkcikpKSB7CisJCQljaGFyIGFkZHJfc3RyaW5nWzE2XTsKKworCQkJd2FybigiTmV3IGJlYXJlciBhZGRyZXNzIGZvciAlc1xuIiwgCisJCQkgICAgIGFkZHJfc3RyaW5nX2ZpbGwoYWRkcl9zdHJpbmcsIG9yaWcpKTsKKwkJCW1lbWNweShhZGRyLCAmbWVkaWFfYWRkciwgc2l6ZW9mKCphZGRyKSk7CisJCQlsaW5rX3Jlc2V0KGxpbmspOyAgICAgCisJCX0KKwkJbGlua191cCA9IGxpbmtfaXNfdXAobGluayk7CisJCXNwaW5fdW5sb2NrX2JoKCZuX3B0ci0+bG9jayk7ICAgICAgICAgICAgICAgIAorCQlpZiAoKHR5cGUgPT0gRFNDX1JFU1BfTVNHKSB8fCBsaW5rX3VwKQorCQkJcmV0dXJuOworCQlyYnVmID0gZGlzY19pbml0X21zZyhEU0NfUkVTUF9NU0csIDEsIG9yaWcsIGJfcHRyKTsKKwkJaWYgKHJidWYgIT0gTlVMTCkgeworCQkJbXNnX2RiZyhidWZfbXNnKHJidWYpLCJTRU5EOiIpOworCQkJYl9wdHItPm1lZGlhLT5zZW5kX21zZyhyYnVmLCAmYl9wdHItPnB1YmwsICZtZWRpYV9hZGRyKTsKKwkJCWJ1Zl9kaXNjYXJkKHJidWYpOworCQl9CisJfQorfQorCisvKioKKyAqIGRpc2Nfc3RvcF9saW5rX3JlcSAtIHN0b3Agc2VuZGluZyBwZXJpb2RpYyBsaW5rIHNldHVwIHJlcXVlc3RzCisgKiBAcmVxOiBwdHIgdG8gbGluayByZXF1ZXN0IHN0cnVjdHVyZQorICovCisKK3ZvaWQgZGlzY19zdG9wX2xpbmtfcmVxKHN0cnVjdCBsaW5rX3JlcSAqcmVxKSAKK3sKKwlpZiAoIXJlcSkKKwkJcmV0dXJuOworCQkKKwlrX2NhbmNlbF90aW1lcigmcmVxLT50aW1lcik7CisJa190ZXJtX3RpbWVyKCZyZXEtPnRpbWVyKTsKKwlidWZfZGlzY2FyZChyZXEtPmJ1Zik7CisJa2ZyZWUocmVxKTsKK30gCisKKy8qKgorICogZGlzY191cGRhdGVfbGlua19yZXEgLSB1cGRhdGUgZnJlcXVlbmN5IG9mIHBlcmlvZGljIGxpbmsgc2V0dXAgcmVxdWVzdHMKKyAqIEByZXE6IHB0ciB0byBsaW5rIHJlcXVlc3Qgc3RydWN0dXJlCisgKi8KKwordm9pZCBkaXNjX3VwZGF0ZV9saW5rX3JlcShzdHJ1Y3QgbGlua19yZXEgKnJlcSkgCit7CisJaWYgKCFyZXEpCisJCXJldHVybjsKKworCWlmIChyZXEtPnRpbWVyX2ludHYgPT0gVElQQ19MSU5LX1JFUV9TTE9XKSB7CisJCWlmICghcmVxLT5iZWFyZXItPm5vZGVzLmNvdW50KSB7CisJCQlyZXEtPnRpbWVyX2ludHYgPSBUSVBDX0xJTktfUkVRX0ZBU1Q7CisJCQlrX3N0YXJ0X3RpbWVyKCZyZXEtPnRpbWVyLCByZXEtPnRpbWVyX2ludHYpOworCQl9CisJfSBlbHNlIGlmIChyZXEtPnRpbWVyX2ludHYgPT0gVElQQ19MSU5LX1JFUV9GQVNUKSB7CisJCWlmIChyZXEtPmJlYXJlci0+bm9kZXMuY291bnQpIHsKKwkJCXJlcS0+dGltZXJfaW50diA9IFRJUENfTElOS19SRVFfU0xPVzsKKwkJCWtfc3RhcnRfdGltZXIoJnJlcS0+dGltZXIsIHJlcS0+dGltZXJfaW50dik7CisJCX0KKwl9IGVsc2UgeworCQkvKiBsZWF2ZSB0aW1lciAiYXMgaXMiIGlmIGhhdmVuJ3QgeWV0IHJlYWNoZWQgYSAibm9ybWFsIiByYXRlICovCisJfQorfSAKKworLyoqCisgKiBkaXNjX3RpbWVvdXQgLSBzZW5kIGEgcGVyaW9kaWMgbGluayBzZXR1cCByZXF1ZXN0CisgKiBAcmVxOiBwdHIgdG8gbGluayByZXF1ZXN0IHN0cnVjdHVyZQorICogCisgKiBDYWxsZWQgd2hlbmV2ZXIgYSBsaW5rIHNldHVwIHJlcXVlc3QgdGltZXIgYXNzb2NpYXRlZCB3aXRoIGEgYmVhcmVyIGV4cGlyZXMuCisgKi8KKworc3RhdGljIHZvaWQgZGlzY190aW1lb3V0KHN0cnVjdCBsaW5rX3JlcSAqcmVxKSAKK3sKKwlzcGluX2xvY2tfYmgoJnJlcS0+YmVhcmVyLT5wdWJsLmxvY2spOworCisJcmVxLT5iZWFyZXItPm1lZGlhLT5zZW5kX21zZyhyZXEtPmJ1ZiwgJnJlcS0+YmVhcmVyLT5wdWJsLCAmcmVxLT5kZXN0KTsKKworCWlmICgocmVxLT50aW1lcl9pbnR2ID09IFRJUENfTElOS19SRVFfU0xPVykgfHwKKwkgICAgKHJlcS0+dGltZXJfaW50diA9PSBUSVBDX0xJTktfUkVRX0ZBU1QpKSB7CisJCS8qIGxlYXZlIHRpbWVyIGludGVydmFsICJhcyBpcyIgaWYgYWxyZWFkeSBhdCBhICJub3JtYWwiIHJhdGUgKi8KKwl9IGVsc2UgeworCQlyZXEtPnRpbWVyX2ludHYgKj0gMjsKKwkJaWYgKHJlcS0+dGltZXJfaW50diA+IFRJUENfTElOS19SRVFfU0xPVykKKwkJCXJlcS0+dGltZXJfaW50diA9IFRJUENfTElOS19SRVFfU0xPVzsKKwkJaWYgKChyZXEtPnRpbWVyX2ludHYgPT0gVElQQ19MSU5LX1JFUV9GQVNUKSAmJiAKKwkJICAgIChyZXEtPmJlYXJlci0+bm9kZXMuY291bnQpKQorCQkJcmVxLT50aW1lcl9pbnR2ID0gVElQQ19MSU5LX1JFUV9TTE9XOworCX0KKwlrX3N0YXJ0X3RpbWVyKCZyZXEtPnRpbWVyLCByZXEtPnRpbWVyX2ludHYpOworCisJc3Bpbl91bmxvY2tfYmgoJnJlcS0+YmVhcmVyLT5wdWJsLmxvY2spOworfQorCisvKioKKyAqIGRpc2NfaW5pdF9saW5rX3JlcSAtIHN0YXJ0IHNlbmRpbmcgcGVyaW9kaWMgbGluayBzZXR1cCByZXF1ZXN0cworICogQGJfcHRyOiBwdHIgdG8gYmVhcmVyIGlzc3VpbmcgcmVxdWVzdHMKKyAqIEBkZXN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciByZXF1ZXN0IG1lc3NhZ2VzCisgKiBAZGVzdF9kb21haW46IG5ldHdvcmsgZG9tYWluIG9mIG5vZGUocykgd2hpY2ggc2hvdWxkIHJlc3BvbmQgdG8gbWVzc2FnZQorICogQHJlcV9saW5rczogbWF4IG51bWJlciBvZiBkZXNpcmVkIGxpbmtzCisgKiAKKyAqIFJldHVybnMgcG9pbnRlciB0byBsaW5rIHJlcXVlc3Qgc3RydWN0dXJlLCBvciBOVUxMIGlmIHVuYWJsZSB0byBjcmVhdGUuCisgKi8KKworc3RydWN0IGxpbmtfcmVxICpkaXNjX2luaXRfbGlua19yZXEoc3RydWN0IGJlYXJlciAqYl9wdHIsIAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpkZXN0LAorCQkJCSAgICB1MzIgZGVzdF9kb21haW4sCisJCQkJICAgIHUzMiByZXFfbGlua3MpIAoreworCXN0cnVjdCBsaW5rX3JlcSAqcmVxOworCisJcmVxID0gKHN0cnVjdCBsaW5rX3JlcSAqKWttYWxsb2Moc2l6ZW9mKCpyZXEpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXEtPmJ1ZiA9IGRpc2NfaW5pdF9tc2coRFNDX1JFUV9NU0csIHJlcV9saW5rcywgZGVzdF9kb21haW4sIGJfcHRyKTsKKwlpZiAoIXJlcS0+YnVmKSB7CisJCWtmcmVlKHJlcSk7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbWNweSgmcmVxLT5kZXN0LCBkZXN0LCBzaXplb2YoKmRlc3QpKTsKKwlyZXEtPmJlYXJlciA9IGJfcHRyOworCXJlcS0+dGltZXJfaW50diA9IFRJUENfTElOS19SRVFfSU5JVDsKKwlrX2luaXRfdGltZXIoJnJlcS0+dGltZXIsIChIYW5kbGVyKWRpc2NfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpcmVxKTsKKwlrX3N0YXJ0X3RpbWVyKCZyZXEtPnRpbWVyLCByZXEtPnRpbWVyX2ludHYpOworCXJldHVybiByZXE7Cit9IAorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kaXNjb3Zlci5oIGIvbmV0L3RpcGMvZGlzY292ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTYxMTRkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvZGlzY292ZXIuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogbmV0L3RpcGMvZGlzY292ZXIuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfRElTQ09WRVJfSAorI2RlZmluZSBfVElQQ19ESVNDT1ZFUl9ICisKKyNpbmNsdWRlIDxsaW51eC90aXBjLmg+CisKK3N0cnVjdCBsaW5rX3JlcTsKKworc3RydWN0IGxpbmtfcmVxICpkaXNjX2luaXRfbGlua19yZXEoc3RydWN0IGJlYXJlciAqYl9wdHIsIAorCQkJICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCwKKwkJCSAgICAgICAgICAgIHUzMiBkZXN0X2RvbWFpbiwKKwkJCSAgICAgICAgICAgIHUzMiByZXFfbGlua3MpOwordm9pZCBkaXNjX3VwZGF0ZV9saW5rX3JlcShzdHJ1Y3QgbGlua19yZXEgKnJlcSk7Cit2b2lkIGRpc2Nfc3RvcF9saW5rX3JlcShzdHJ1Y3QgbGlua19yZXEgKnJlcSk7CisKK3ZvaWQgZGlzY19yZWN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKKwordm9pZCBkaXNjX2xpbmtfZXZlbnQodTMyIGFkZHIsIGNoYXIgKm5hbWUsIGludCB1cCk7CisjaWYgMAoraW50ICBkaXNjX2NyZWF0ZV9saW5rKGNvbnN0IHN0cnVjdCB0aXBjX2xpbmtfY3JlYXRlICphcmd2KTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL2V0aF9tZWRpYS5jIGIvbmV0L3RpcGMvZXRoX21lZGlhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkMDQ2MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2V0aF9tZWRpYS5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogbmV0L3RpcGMvZXRoX21lZGlhLmM6IEV0aGVybmV0IGJlYXJlciBzdXBwb3J0IGZvciBUSVBDCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxuZXQvdGlwYy90aXBjLmg+CisjaW5jbHVkZSA8bmV0L3RpcGMvdGlwY19iZWFyZXIuaD4KKyNpbmNsdWRlIDxuZXQvdGlwYy90aXBjX21zZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2RlZmluZSBNQVhfRVRIX0JFQVJFUlMJCTIKKyNkZWZpbmUgVElQQ19QUk9UT0NPTAkJMHg4OGNhCisjZGVmaW5lIEVUSF9MSU5LX1BSSU9SSVRZCTEwCisjZGVmaW5lIEVUSF9MSU5LX1RPTEVSQU5DRQlUSVBDX0RFRl9MSU5LX1RPTAorCisKKy8qKgorICogc3RydWN0IGV0aF9iZWFyZXIgLSBFdGhlcm5ldCBiZWFyZXIgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBiZWFyZXI6IHB0ciB0byBhc3NvY2lhdGVkICJnZW5lcmljIiBiZWFyZXIgc3RydWN0dXJlCisgKiBAZGV2OiBwdHIgdG8gYXNzb2NpYXRlZCBFdGhlcm5ldCBuZXR3b3JrIGRldmljZQorICogQHRpcGNfcGFja2V0X3R5cGU6IHVzZWQgaW4gYmluZGluZyBUSVBDIHRvIEV0aGVybmV0IGRyaXZlcgorICovCisgCitzdHJ1Y3QgZXRoX2JlYXJlciB7CisJc3RydWN0IHRpcGNfYmVhcmVyICpiZWFyZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcGFja2V0X3R5cGUgdGlwY19wYWNrZXRfdHlwZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXRoX2JlYXJlciBldGhfYmVhcmVyc1tNQVhfRVRIX0JFQVJFUlNdOworc3RhdGljIGludCBldGhfc3RhcnRlZCA9IDA7CitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5vdGlmaWVyOworCisvKioKKyAqIHNlbmRfbXNnIC0gc2VuZCBhIFRJUEMgbWVzc2FnZSBvdXQgb3ZlciBhbiBFdGhlcm5ldCBpbnRlcmZhY2UgCisgKi8KKworc3RhdGljIGludCBzZW5kX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCBzdHJ1Y3QgdGlwY19iZWFyZXIgKnRiX3B0ciwgCisJCSAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpkZXN0KQoreworCXN0cnVjdCBza19idWZmICpjbG9uZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJY2xvbmUgPSBza2JfY2xvbmUoYnVmLCBHRlBfQVRPTUlDKTsKKwlpZiAoY2xvbmUpIHsKKwkJY2xvbmUtPm5oLnJhdyA9IGNsb25lLT5kYXRhOworCQlkZXYgPSAoKHN0cnVjdCBldGhfYmVhcmVyICopKHRiX3B0ci0+dXNyX2hhbmRsZSkpLT5kZXY7CisJCWNsb25lLT5kZXYgPSBkZXY7CisJCWRldi0+aGFyZF9oZWFkZXIoY2xvbmUsIGRldiwgVElQQ19QUk9UT0NPTCwgCisJCQkJICZkZXN0LT5kZXZfYWRkci5ldGhfYWRkciwKKwkJCQkgZGV2LT5kZXZfYWRkciwgY2xvbmUtPmxlbik7CisJCWRldl9xdWV1ZV94bWl0KGNsb25lKTsKKwl9CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qKgorICogcmVjdl9tc2cgLSBoYW5kbGUgaW5jb21pbmcgVElQQyBtZXNzYWdlIGZyb20gYW4gRXRoZXJuZXQgaW50ZXJmYWNlCisgKiAKKyAqIFJvdXRpbmUgdHJ1bmNhdGVzIGFueSBFdGhlcm5ldCBwYWRkaW5nL0NSQyBhcHBlbmRlZCB0byB0aGUgbWVzc2FnZSwKKyAqIGFuZCBlbnN1cmVzIG1lc3NhZ2Ugc2l6ZSBtYXRjaGVzIGFjdHVhbCBsZW5ndGgKKyAqLworCitzdGF0aWMgaW50IHJlY3ZfbXNnKHN0cnVjdCBza19idWZmICpidWYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorCQkgICAgc3RydWN0IHBhY2tldF90eXBlICpwdCwgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KQoreworCXN0cnVjdCBldGhfYmVhcmVyICplYl9wdHIgPSAoc3RydWN0IGV0aF9iZWFyZXIgKilwdC0+YWZfcGFja2V0X3ByaXY7CisJdTMyIHNpemU7CisKKwlpZiAobGlrZWx5KGViX3B0ci0+YmVhcmVyKSkgeworCQlzaXplID0gbXNnX3NpemUoKHN0cnVjdCB0aXBjX21zZyAqKWJ1Zi0+ZGF0YSk7CisJCXNrYl90cmltKGJ1Ziwgc2l6ZSk7CisJCWlmIChsaWtlbHkoYnVmLT5sZW4gPT0gc2l6ZSkpIHsKKwkJCWJ1Zi0+bmV4dCA9IE5VTEw7CisJCQl0aXBjX3JlY3ZfbXNnKGJ1ZiwgZWJfcHRyLT5iZWFyZXIpOworCQl9IGVsc2UgeworCQkJa2ZyZWVfc2tiKGJ1Zik7CisJCX0KKwl9IGVsc2UgeworCQlrZnJlZV9za2IoYnVmKTsKKwl9CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qKgorICogZW5hYmxlX2JlYXJlciAtIGF0dGFjaCBUSVBDIGJlYXJlciB0byBhbiBFdGhlcm5ldCBpbnRlcmZhY2UgCisgKi8KKworc3RhdGljIGludCBlbmFibGVfYmVhcmVyKHN0cnVjdCB0aXBjX2JlYXJlciAqdGJfcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfYmFzZTsKKwlzdHJ1Y3QgZXRoX2JlYXJlciAqZWJfcHRyID0gJmV0aF9iZWFyZXJzWzBdOworCXN0cnVjdCBldGhfYmVhcmVyICpzdG9wID0gJmV0aF9iZWFyZXJzW01BWF9FVEhfQkVBUkVSU107CisJY2hhciAqZHJpdmVyX25hbWUgPSBzdHJjaHIoKGNvbnN0IGNoYXIgKil0Yl9wdHItPm5hbWUsICc6JykgKyAxOworCisJLyogRmluZCBkZXZpY2Ugd2l0aCBzcGVjaWZpZWQgbmFtZSAqLworCisJd2hpbGUgKGRldiAmJiBkZXYtPm5hbWUgJiYKKwkgICAgICAgKG1lbWNtcChkZXYtPm5hbWUsIGRyaXZlcl9uYW1lLCBzdHJsZW4oZGV2LT5uYW1lKSkpKSB7CisJCWRldiA9IGRldi0+bmV4dDsKKwl9CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJLyogRmluZCBFdGhlcm5ldCBiZWFyZXIgZm9yIGRldmljZSAob3IgY3JlYXRlIG9uZSkgKi8KKworCWZvciAoOyhlYl9wdHIgIT0gc3RvcCkgJiYgZWJfcHRyLT5kZXYgJiYgKGViX3B0ci0+ZGV2ICE9IGRldik7IGViX3B0cisrKTsKKwlpZiAoZWJfcHRyID09IHN0b3ApCisJCXJldHVybiAtRURRVU9UOworCWlmICghZWJfcHRyLT5kZXYpIHsKKwkJZWJfcHRyLT5kZXYgPSBkZXY7CisJCWViX3B0ci0+dGlwY19wYWNrZXRfdHlwZS50eXBlID0gX19jb25zdGFudF9odG9ucyhUSVBDX1BST1RPQ09MKTsKKwkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmRldiA9IGRldjsKKwkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmZ1bmMgPSByZWN2X21zZzsKKwkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmFmX3BhY2tldF9wcml2ID0gZWJfcHRyOworCQlJTklUX0xJU1RfSEVBRCgmKGViX3B0ci0+dGlwY19wYWNrZXRfdHlwZS5saXN0KSk7CisJCWRldl9ob2xkKGRldik7CisJCWRldl9hZGRfcGFjaygmZWJfcHRyLT50aXBjX3BhY2tldF90eXBlKTsKKwl9CisKKwkvKiBBc3NvY2lhdGUgVElQQyBiZWFyZXIgd2l0aCBFdGhlcm5ldCBiZWFyZXIgKi8KKworCWViX3B0ci0+YmVhcmVyID0gdGJfcHRyOworCXRiX3B0ci0+dXNyX2hhbmRsZSA9ICh2b2lkICopZWJfcHRyOworCXRiX3B0ci0+bXR1ID0gZGV2LT5tdHU7CisJdGJfcHRyLT5ibG9ja2VkID0gMDsgCisJdGJfcHRyLT5hZGRyLnR5cGUgPSBodG9ubChUSVBDX01FRElBX1RZUEVfRVRIKTsKKwltZW1jcHkoJnRiX3B0ci0+YWRkci5kZXZfYWRkciwgJmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkaXNhYmxlX2JlYXJlciAtIGRldGFjaCBUSVBDIGJlYXJlciBmcm9tIGFuIEV0aGVybmV0IGludGVyZmFjZSAKKyAqCisgKiBXZSByZWFsbHkgc2hvdWxkIGRvIGRldl9yZW1vdmVfcGFjaygpIGhlcmUsIGJ1dCB0aGlzIGZ1bmN0aW9uIGNhbiBub3QgYmUKKyAqIGNhbGxlZCBhdCB0YXNrbGV0IGxldmVsLiA9PiBVc2UgZXRoX2JlYXJlci0+YmVhcmVyIGFzIGEgZmxhZyB0byB0aHJvdyBhd2F5CisgKiBpbmNvbWluZyBidWZmZXJzLCAmIHBvc3Rwb25lIGRldl9yZW1vdmVfcGFjaygpIHRvIGV0aF9tZWRpYV9zdG9wKCkgb24gZXhpdC4KKyAqLworCitzdGF0aWMgdm9pZCBkaXNhYmxlX2JlYXJlcihzdHJ1Y3QgdGlwY19iZWFyZXIgKnRiX3B0cikKK3sKKwkoKHN0cnVjdCBldGhfYmVhcmVyICopdGJfcHRyLT51c3JfaGFuZGxlKS0+YmVhcmVyID0gMDsKK30KKworLyoqCisgKiByZWN2X25vdGlmaWNhdGlvbiAtIGhhbmRsZSBkZXZpY2UgdXBkYXRlcyBmcm9tIE9TCisgKgorICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgRXRoZXJuZXQgYmVhcmVyIChpZiBhbnkpIGFzc29jaWF0ZWQgd2l0aCB0aGUgCisgKiBzcGVjaWZpZWQgZGV2aWNlLgorICovCisKK3N0YXRpYyBpbnQgcmVjdl9ub3RpZmljYXRpb24oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBldnQsIAorCQkJICAgICB2b2lkICpkdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZHY7CisJc3RydWN0IGV0aF9iZWFyZXIgKmViX3B0ciA9ICZldGhfYmVhcmVyc1swXTsKKwlzdHJ1Y3QgZXRoX2JlYXJlciAqc3RvcCA9ICZldGhfYmVhcmVyc1tNQVhfRVRIX0JFQVJFUlNdOworCisJd2hpbGUgKChlYl9wdHItPmRldiAhPSBkZXYpKSB7CisJCWlmICgrK2ViX3B0ciA9PSBzdG9wKQorCQkJcmV0dXJuIE5PVElGWV9ET05FOwkvKiBjb3VsZG4ndCBmaW5kIGRldmljZSAqLworCX0KKwlpZiAoIWViX3B0ci0+YmVhcmVyKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CQkvKiBiZWFyZXIgaGFkIGJlZW4gZGlzYWJsZWQgKi8KKworICAgICAgICBlYl9wdHItPmJlYXJlci0+bXR1ID0gZGV2LT5tdHU7CisKKwlzd2l0Y2ggKGV2dCkgeworCWNhc2UgTkVUREVWX0NIQU5HRToKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkKKwkJCXRpcGNfY29udGludWUoZWJfcHRyLT5iZWFyZXIpOworCQllbHNlCisJCQl0aXBjX2Jsb2NrX2JlYXJlcihlYl9wdHItPmJlYXJlci0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX1VQOgorCQl0aXBjX2NvbnRpbnVlKGViX3B0ci0+YmVhcmVyKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfRE9XTjoKKwkJdGlwY19ibG9ja19iZWFyZXIoZWJfcHRyLT5iZWFyZXItPm5hbWUpOworCQlicmVhazsKKwljYXNlIE5FVERFVl9DSEFOR0VNVFU6CisgICAgICAgIGNhc2UgTkVUREVWX0NIQU5HRUFERFI6CisJCXRpcGNfYmxvY2tfYmVhcmVyKGViX3B0ci0+YmVhcmVyLT5uYW1lKTsKKyAgICAgICAgICAgICAgICB0aXBjX2NvbnRpbnVlKGViX3B0ci0+YmVhcmVyKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKKwkJdGlwY19kaXNhYmxlX2JlYXJlcihlYl9wdHItPmJlYXJlci0+bmFtZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCisvKioKKyAqIGV0aF9hZGRyMnN0ciAtIGNvbnZlcnQgRXRoZXJuZXQgYWRkcmVzcyB0byBzdHJpbmcKKyAqLworCitzdGF0aWMgY2hhciAqZXRoX2FkZHIyc3RyKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsIGNoYXIgKnN0cl9idWYsIGludCBzdHJfc2l6ZSkKK3sgICAgICAgICAgICAgICAgICAgICAgIAorCXVuY2hhciAqYWRkciA9ICh1bmNoYXIgKikmYS0+ZGV2X2FkZHI7CisKKwlpZiAoc3RyX3NpemUgPCAxOCkKKwkJKnN0cl9idWYgPSAnXDAnOworCWVsc2UKKwkJc3ByaW50ZihzdHJfYnVmLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisJcmV0dXJuIHN0cl9idWY7Cit9CisKKy8qKgorICogZXRoX21lZGlhX3N0YXJ0IC0gYWN0aXZhdGUgRXRoZXJuZXQgYmVhcmVyIHN1cHBvcnQKKyAqCisgKiBSZWdpc3RlciBFdGhlcm5ldCBtZWRpYSB0eXBlIHdpdGggVElQQyBiZWFyZXIgY29kZS4gIEFsc28gcmVnaXN0ZXIKKyAqIHdpdGggT1MgZm9yIG5vdGlmaWNhdGlvbnMgYWJvdXQgZGV2aWNlIHN0YXRlIGNoYW5nZXMuCisgKi8KKworaW50IGV0aF9tZWRpYV9zdGFydCh2b2lkKQoreyAgICAgICAgICAgICAgICAgICAgICAgCisJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBiY2FzdF9hZGRyOworCWludCByZXM7CisKKwlpZiAoZXRoX3N0YXJ0ZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZiY2FzdF9hZGRyLCAweGZmLCBzaXplb2YoYmNhc3RfYWRkcikpOworCW1lbXNldChldGhfYmVhcmVycywgMCwgc2l6ZW9mKGV0aF9iZWFyZXJzKSk7CisKKwlyZXMgPSB0aXBjX3JlZ2lzdGVyX21lZGlhKFRJUENfTUVESUFfVFlQRV9FVEgsICJldGgiLAorCQkJCSAgZW5hYmxlX2JlYXJlciwgZGlzYWJsZV9iZWFyZXIsIHNlbmRfbXNnLCAKKwkJCQkgIGV0aF9hZGRyMnN0ciwgJmJjYXN0X2FkZHIsIEVUSF9MSU5LX1BSSU9SSVRZLCAKKwkJCQkgIEVUSF9MSU5LX1RPTEVSQU5DRSwgVElQQ19ERUZfTElOS19XSU4pOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlub3RpZmllci5ub3RpZmllcl9jYWxsID0gJnJlY3Zfbm90aWZpY2F0aW9uOworCW5vdGlmaWVyLnByaW9yaXR5ID0gMDsKKwlyZXMgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm5vdGlmaWVyKTsKKwlpZiAoIXJlcykKKwkJZXRoX3N0YXJ0ZWQgPSAxOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogZXRoX21lZGlhX3N0b3AgLSBkZWFjdGl2YXRlIEV0aGVybmV0IGJlYXJlciBzdXBwb3J0CisgKi8KKwordm9pZCBldGhfbWVkaWFfc3RvcCh2b2lkKQoreworCWludCBpOworCisJaWYgKCFldGhfc3RhcnRlZCkKKwkJcmV0dXJuOworCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm5vdGlmaWVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0VUSF9CRUFSRVJTIDsgaSsrKSB7CisJCWlmIChldGhfYmVhcmVyc1tpXS5iZWFyZXIpIHsKKwkJCWV0aF9iZWFyZXJzW2ldLmJlYXJlci0+YmxvY2tlZCA9IDE7CisJCQlldGhfYmVhcmVyc1tpXS5iZWFyZXIgPSAwOworCQl9CisJCWlmIChldGhfYmVhcmVyc1tpXS5kZXYpIHsKKwkJCWRldl9yZW1vdmVfcGFjaygmZXRoX2JlYXJlcnNbaV0udGlwY19wYWNrZXRfdHlwZSk7CisJCQlkZXZfcHV0KGV0aF9iZWFyZXJzW2ldLmRldik7CisJCX0KKwl9CisJbWVtc2V0KCZldGhfYmVhcmVycywgMCwgc2l6ZW9mKGV0aF9iZWFyZXJzKSk7CisJZXRoX3N0YXJ0ZWQgPSAwOworfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvaGFuZGxlci5jIGIvbmV0L3RpcGMvaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjAwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9oYW5kbGVyLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBuZXQvdGlwYy9oYW5kbGVyLmM6IFRJUEMgc2lnbmFsIGhhbmRsaW5nCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisKK3N0cnVjdCBxdWV1ZV9pdGVtIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5leHRfc2lnbmFsOworCXZvaWQgKCpoYW5kbGVyKSAodW5zaWduZWQgbG9uZyk7CisJdW5zaWduZWQgbG9uZyBkYXRhOworfTsKKworc3RhdGljIGttZW1fY2FjaGVfdCAqdGlwY19xdWV1ZV9pdGVtX2NhY2hlOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc2lnbmFsX3F1ZXVlX2hlYWQ7CitzdGF0aWMgc3BpbmxvY2tfdCBxaXRlbV9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIGludCBoYW5kbGVyX2VuYWJsZWQgPSAwOworCitzdGF0aWMgdm9pZCBwcm9jZXNzX3NpZ25hbF9xdWV1ZSh1bnNpZ25lZCBsb25nIGR1bW15KTsKKworc3RhdGljIERFQ0xBUkVfVEFTS0xFVF9ESVNBQkxFRCh0aXBjX3Rhc2tsZXQsIHByb2Nlc3Nfc2lnbmFsX3F1ZXVlLCAwKTsKKworCit1bnNpZ25lZCBpbnQga19zaWduYWwoSGFuZGxlciByb3V0aW5lLCB1bnNpZ25lZCBsb25nIGFyZ3VtZW50KQoreworCXN0cnVjdCBxdWV1ZV9pdGVtICppdGVtOworCisJaWYgKCFoYW5kbGVyX2VuYWJsZWQpIHsKKwkJZXJyKCJTaWduYWwgcmVxdWVzdCBpZ25vcmVkIGJ5IGhhbmRsZXJcbiIpOworCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCX0KKworCXNwaW5fbG9ja19iaCgmcWl0ZW1fbG9jayk7CisJaXRlbSA9IGttZW1fY2FjaGVfYWxsb2ModGlwY19xdWV1ZV9pdGVtX2NhY2hlLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWl0ZW0pIHsKKwkJZXJyKCJTaWduYWwgcXVldWUgb3V0IG9mIG1lbW9yeVxuIik7CisJCXNwaW5fdW5sb2NrX2JoKCZxaXRlbV9sb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWl0ZW0tPmhhbmRsZXIgPSByb3V0aW5lOworCWl0ZW0tPmRhdGEgPSBhcmd1bWVudDsKKwlsaXN0X2FkZF90YWlsKCZpdGVtLT5uZXh0X3NpZ25hbCwgJnNpZ25hbF9xdWV1ZV9oZWFkKTsKKwlzcGluX3VubG9ja19iaCgmcWl0ZW1fbG9jayk7CisJdGFza2xldF9zY2hlZHVsZSgmdGlwY190YXNrbGV0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19zaWduYWxfcXVldWUodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlzdHJ1Y3QgcXVldWVfaXRlbSAqX192b2xhdGlsZV9fIGl0ZW07CisJc3RydWN0IGxpc3RfaGVhZCAqbCwgKm47CisKKwlzcGluX2xvY2tfYmgoJnFpdGVtX2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBuLCAmc2lnbmFsX3F1ZXVlX2hlYWQpIHsKKwkJaXRlbSA9IGxpc3RfZW50cnkobCwgc3RydWN0IHF1ZXVlX2l0ZW0sIG5leHRfc2lnbmFsKTsKKwkJbGlzdF9kZWwoJml0ZW0tPm5leHRfc2lnbmFsKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnFpdGVtX2xvY2spOworCQlpdGVtLT5oYW5kbGVyKGl0ZW0tPmRhdGEpOworCQlzcGluX2xvY2tfYmgoJnFpdGVtX2xvY2spOworCQlrbWVtX2NhY2hlX2ZyZWUodGlwY19xdWV1ZV9pdGVtX2NhY2hlLCBpdGVtKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnFpdGVtX2xvY2spOworfQorCitpbnQgaGFuZGxlcl9zdGFydCh2b2lkKQoreworCXRpcGNfcXVldWVfaXRlbV9jYWNoZSA9IAorCQlrbWVtX2NhY2hlX2NyZWF0ZSgidGlwY19xdWV1ZV9pdGVtcyIsIHNpemVvZihzdHJ1Y3QgcXVldWVfaXRlbSksCisJCQkJICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCWlmICghdGlwY19xdWV1ZV9pdGVtX2NhY2hlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUlOSVRfTElTVF9IRUFEKCZzaWduYWxfcXVldWVfaGVhZCk7CisJdGFza2xldF9lbmFibGUoJnRpcGNfdGFza2xldCk7CisJaGFuZGxlcl9lbmFibGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBoYW5kbGVyX3N0b3Aodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsLCAqbjsKKwlzdHJ1Y3QgcXVldWVfaXRlbSAqaXRlbTsgCisKKwlpZiAoIWhhbmRsZXJfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJaGFuZGxlcl9lbmFibGVkID0gMDsKKwl0YXNrbGV0X2Rpc2FibGUoJnRpcGNfdGFza2xldCk7CisJdGFza2xldF9raWxsKCZ0aXBjX3Rhc2tsZXQpOworCisJc3Bpbl9sb2NrX2JoKCZxaXRlbV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgbiwgJnNpZ25hbF9xdWV1ZV9oZWFkKSB7CisJCWl0ZW0gPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBxdWV1ZV9pdGVtLCBuZXh0X3NpZ25hbCk7CisJCWxpc3RfZGVsKCZpdGVtLT5uZXh0X3NpZ25hbCk7CisJCWttZW1fY2FjaGVfZnJlZSh0aXBjX3F1ZXVlX2l0ZW1fY2FjaGUsIGl0ZW0pOworCX0KKwlzcGluX3VubG9ja19iaCgmcWl0ZW1fbG9jayk7CisKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kodGlwY19xdWV1ZV9pdGVtX2NhY2hlKTsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbGluay5jIGIvbmV0L3RpcGMvbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNjVmNGIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9saW5rLmMKQEAgLTAsMCArMSwzMTY3IEBACisvKgorICogbmV0L3RpcGMvbGluay5jOiBUSVBDIGxpbmsgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgIm5ldC5oIgorI2luY2x1ZGUgIm5vZGUuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisjaW5jbHVkZSAibmFtZV9kaXN0ci5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorI2luY2x1ZGUgIm5hbWVfdGFibGUuaCIKKyNpbmNsdWRlICJkaXNjb3Zlci5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImJjYXN0LmgiCisKKworLyogCisgKiBMaW1pdCBmb3IgZGVmZXJyZWQgcmVjZXB0aW9uIHF1ZXVlOiAKKyAqLworCisjZGVmaW5lIERFRl9RVUVVRV9MSU1JVCAyNTZ1CisKKy8qIAorICogTGluayBzdGF0ZSBldmVudHM6IAorICovCisKKyNkZWZpbmUgIFNUQVJUSU5HX0VWVCAgICA4NTYzODQ3NjgJLyogbGluayBwcm9jZXNzaW5nIHRyaWdnZXIgKi8KKyNkZWZpbmUgIFRSQUZGSUNfTVNHX0VWVCA1NjA4MTV1CS8qIHJ4J2QgPz8/ICovCisjZGVmaW5lICBUSU1FT1VUX0VWVCAgICAgNTYwODE3dQkvKiBsaW5rIHRpbWVyIGV4cGlyZWQgKi8KKworLyogICAKKyAqIFRoZSBmb2xsb3dpbmcgdHdvICdtZXNzYWdlIHR5cGVzJyBpcyByZWFsbHkganVzdCBpbXBsZW1lbnRhdGlvbiAKKyAqIGRhdGEgY29udmVuaWVudGx5IHN0b3JlZCBpbiB0aGUgbWVzc2FnZSBoZWFkZXIuIAorICogVGhleSBtdXN0IG5vdCBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHByb3RvY29sCisgKi8KKyNkZWZpbmUgT1BFTl9NU0cgICAwCisjZGVmaW5lIENMT1NFRF9NU0cgMQorCisvKiAKKyAqIFN0YXRlIHZhbHVlIHN0b3JlZCBpbiAnZXhwX21zZ19jb3VudCcKKyAqLworCisjZGVmaW5lIFNUQVJUX0NIQU5HRU9WRVIgMTAwMDAwdQorCisvKioKKyAqIHN0cnVjdCBsaW5rX25hbWUgLSBkZWNvbnN0cnVjdGVkIGxpbmsgbmFtZQorICogQGFkZHJfbG9jYWw6IG5ldHdvcmsgYWRkcmVzcyBvZiBub2RlIGF0IHRoaXMgZW5kCisgKiBAaWZfbG9jYWw6IG5hbWUgb2YgaW50ZXJmYWNlIGF0IHRoaXMgZW5kCisgKiBAYWRkcl9wZWVyOiBuZXR3b3JrIGFkZHJlc3Mgb2Ygbm9kZSBhdCBmYXIgZW5kCisgKiBAaWZfcGVlcjogbmFtZSBvZiBpbnRlcmZhY2UgYXQgZmFyIGVuZAorICovCisKK3N0cnVjdCBsaW5rX25hbWUgeworCXUzMiBhZGRyX2xvY2FsOworCWNoYXIgaWZfbG9jYWxbVElQQ19NQVhfSUZfTkFNRV07CisJdTMyIGFkZHJfcGVlcjsKKwljaGFyIGlmX3BlZXJbVElQQ19NQVhfSUZfTkFNRV07Cit9OworCisjaWYgMAorCisvKiBMSU5LIEVWRU5UIENPREUgSVMgTk9UIFNVUFBPUlRFRCBBVCBQUkVTRU5UICovCisKKy8qKiAKKyAqIHN0cnVjdCBsaW5rX2V2ZW50IC0gbGluayB1cC9kb3duIGV2ZW50IG5vdGlmaWNhdGlvbgorICovCisKK3N0cnVjdCBsaW5rX2V2ZW50IHsKKwl1MzIgYWRkcjsKKwlpbnQgdXA7CisJdm9pZCAoKmZjbikodTMyLCBjaGFyICosIGludCk7CisJY2hhciBuYW1lW1RJUENfTUFYX0xJTktfTkFNRV07Cit9OworCisjZW5kaWYKKworc3RhdGljIHZvaWQgbGlua19oYW5kbGVfb3V0X29mX3NlcV9tc2coc3RydWN0IGxpbmsgKmxfcHRyLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK3N0YXRpYyB2b2lkIGxpbmtfcmVjdl9wcm90b19tc2coc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK3N0YXRpYyBpbnQgIGxpbmtfcmVjdl9jaGFuZ2VvdmVyX21zZyhzdHJ1Y3QgbGluayAqKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqKmJ1Zik7CitzdGF0aWMgdm9pZCBsaW5rX3NldF9zdXBlcnZpc2lvbl9wcm9wcyhzdHJ1Y3QgbGluayAqbF9wdHIsIHUzMiB0b2xlcmFuY2UpOworc3RhdGljIGludCAgbGlua19zZW5kX3NlY3Rpb25zX2xvbmcoc3RydWN0IHBvcnQgKnNlbmRlciwKKwkJCQkgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCwKKwkJCQkgICAgdTMyIG51bV9zZWN0LCB1MzIgZGVzdG5vZGUpOworc3RhdGljIHZvaWQgbGlua19jaGVja19kZWZyYWdtX2J1ZnMoc3RydWN0IGxpbmsgKmxfcHRyKTsKK3N0YXRpYyB2b2lkIGxpbmtfc3RhdGVfZXZlbnQoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgZXZlbnQpOworc3RhdGljIHZvaWQgbGlua19yZXNldF9zdGF0aXN0aWNzKHN0cnVjdCBsaW5rICpsX3B0cik7CitzdGF0aWMgdm9pZCBsaW5rX3ByaW50KHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHByaW50X2J1ZiAqYnVmLCAKKwkJICAgICAgIGNvbnN0IGNoYXIgKnN0cik7CisKKy8qCisgKiBEZWJ1Z2dpbmcgY29kZSB1c2VkIGJ5IGxpbmsgcm91dGluZXMgb25seQorICoKKyAqIFdoZW4gZGVidWdnaW5nIGxpbmsgcHJvYmxlbXMgb24gYSBzeXN0ZW0gdGhhdCBoYXMgbXVsdGlwbGUgbGlua3MsCisgKiB0aGUgc3RhbmRhcmQgVElQQyBkZWJ1Z2dpbmcgcm91dGluZXMgbWF5IG5vdCBiZSB1c2VmdWwgc2luY2UgdGhleQorICogYWxsb3cgdGhlIG91dHB1dCBmcm9tIG11bHRpcGxlIGxpbmtzIHRvIGJlIGludGVybWl4ZWQuICBGb3IgdGhpcyByZWFzb24KKyAqIHJvdXRpbmVzIG9mIHRoZSBmb3JtICJkYmdfbGlua19YWFgoKSIgaGF2ZSBiZWVuIGNyZWF0ZWQgdGhhdCB3aWxsIGNhcHR1cmUKKyAqIGRlYnVnIGluZm8gaW50byBhIGxpbmsncyBwZXJzb25hbCBwcmludCBidWZmZXIsIHdoaWNoIGNhbiB0aGVuIGJlIGR1bXBlZAorICogaW50byB0aGUgVElQQyBzeXN0ZW0gbG9nIChMT0cpIHVwb24gcmVxdWVzdC4KKyAqCisgKiBUbyBlbmFibGUgcGVyLWxpbmsgZGVidWdnaW5nLCB1c2UgTElOS19MT0dfQlVGX1NJWkUgdG8gc3BlY2lmeSB0aGUgc2l6ZQorICogb2YgdGhlIHByaW50IGJ1ZmZlciB1c2VkIGJ5IGVhY2ggbGluay4gIElmIExJTktfTE9HX0JVRl9TSVpFIGlzIHNldCB0byAwLAorICogdGhlIGRiZ19saW5rX1hYWCgpIHJvdXRpbmVzIHNpbXBseSBzZW5kIHRoZWlyIG91dHB1dCB0byB0aGUgc3RhbmRhcmQgCisgKiBkZWJ1ZyBwcmludCBidWZmZXIgKERCR19PVVRQVVQpLCBpZiBpdCBoYXMgYmVlbiBkZWZpbmVkOyB0aGlzIGNhbiBiZSB1c2VmdWwKKyAqIHdoZW4gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBsaW5rIGluIHRoZSBzeXN0ZW0gYmVpbmcgZGVidWdnZWQuCisgKgorICogTm90ZXM6CisgKiAtIFdoZW4gZW5hYmxlZCwgTElOS19MT0dfQlVGX1NJWkUgc2hvdWxkIGJlIHNldCB0byBhdCBsZWFzdCAxMDAwIChieXRlcykKKyAqIC0gImxfcHRyIiBtdXN0IGJlIHZhbGlkIHdoZW4gdXNpbmcgZGJnX2xpbmtfWFhYKCkgbWFjcm9zICAKKyAqLworCisjZGVmaW5lIExJTktfTE9HX0JVRl9TSVpFIDAKKworI2RlZmluZSBkYmdfbGluayhmbXQsIGFyZy4uLikgIGRvIHtpZiAoTElOS19MT0dfQlVGX1NJWkUpIHRpcGNfcHJpbnRmKCZsX3B0ci0+cHJpbnRfYnVmLCBmbXQsICMjIGFyZyk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgZGJnX2xpbmtfbXNnKG1zZywgdHh0KSBkbyB7aWYgKExJTktfTE9HX0JVRl9TSVpFKSBtc2dfcHJpbnQoJmxfcHRyLT5wcmludF9idWYsIG1zZywgdHh0KTsgfSB3aGlsZSgwKQorI2RlZmluZSBkYmdfbGlua19zdGF0ZSh0eHQpIGRvIHtpZiAoTElOS19MT0dfQlVGX1NJWkUpIGxpbmtfcHJpbnQobF9wdHIsICZsX3B0ci0+cHJpbnRfYnVmLCB0eHQpOyB9IHdoaWxlKDApCisjZGVmaW5lIGRiZ19saW5rX2R1bXAoKSBkbyB7IFwKKwlpZiAoTElOS19MT0dfQlVGX1NJWkUpIHsgXAorCQl0aXBjX3ByaW50ZihMT0csICJcblxuRHVtcGluZyBsaW5rIDwlcz46XG4iLCBsX3B0ci0+bmFtZSk7IFwKKwkJcHJpbnRidWZfbW92ZShMT0csICZsX3B0ci0+cHJpbnRfYnVmKTsgXAorCX0gXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB2b2lkIGRiZ19wcmludF9saW5rKHN0cnVjdCBsaW5rICpsX3B0ciwgY29uc3QgY2hhciAqc3RyKQoreworCWlmIChEQkdfT1VUUFVUKQorCQlsaW5rX3ByaW50KGxfcHRyLCBEQkdfT1VUUFVULCBzdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGJnX3ByaW50X2J1Zl9jaGFpbihzdHJ1Y3Qgc2tfYnVmZiAqcm9vdF9idWYpCit7CisJaWYgKERCR19PVVRQVVQpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IHJvb3RfYnVmOworCisJCXdoaWxlIChidWYpIHsKKwkJCW1zZ19kYmcoYnVmX21zZyhidWYpLCAiSW4gY2hhaW46ICIpOworCQkJYnVmID0gYnVmLT5uZXh0OworCQl9CisJfQorfQorCisvKgorICogIFNpbXBsZSBpbmxpbmVkIGxpbmsgcm91dGluZXMKKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhbGlnbih1bnNpZ25lZCBpbnQgaSkKK3sKKwlyZXR1cm4gKGkgKyAzKSAmIH4zdTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGlua193b3JraW5nX3dvcmtpbmcoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXJldHVybiAobF9wdHItPnN0YXRlID09IFdPUktJTkdfV09SS0lORyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmtfd29ya2luZ191bmtub3duKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlyZXR1cm4gKGxfcHRyLT5zdGF0ZSA9PSBXT1JLSU5HX1VOS05PV04pOworfQorCitzdGF0aWMgaW5saW5lIGludCBsaW5rX3Jlc2V0X3Vua25vd24oc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXJldHVybiAobF9wdHItPnN0YXRlID09IFJFU0VUX1VOS05PV04pOworfQorCitzdGF0aWMgaW5saW5lIGludCBsaW5rX3Jlc2V0X3Jlc2V0KHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlyZXR1cm4gKGxfcHRyLT5zdGF0ZSA9PSBSRVNFVF9SRVNFVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmtfYmxvY2tlZChzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJcmV0dXJuIChsX3B0ci0+ZXhwX21zZ19jb3VudCB8fCBsX3B0ci0+YmxvY2tlZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmtfY29uZ2VzdGVkKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlyZXR1cm4gKGxfcHRyLT5vdXRfcXVldWVfc2l6ZSA+PSBsX3B0ci0+cXVldWVfbGltaXRbMF0pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBsaW5rX21heF9wa3Qoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXJldHVybiBsX3B0ci0+bWF4X3BrdDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpbmtfaW5pdF9tYXhfcGt0KHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwl1MzIgbWF4X3BrdDsKKwkKKwltYXhfcGt0ID0gKGxfcHRyLT5iX3B0ci0+cHVibC5tdHUgJiB+Myk7CisJaWYgKG1heF9wa3QgPiBNQVhfTVNHX1NJWkUpCisJCW1heF9wa3QgPSBNQVhfTVNHX1NJWkU7CisKKyAgICAgICAgbF9wdHItPm1heF9wa3RfdGFyZ2V0ID0gbWF4X3BrdDsKKwlpZiAobF9wdHItPm1heF9wa3RfdGFyZ2V0IDwgTUFYX1BLVF9ERUZBVUxUKQorCQlsX3B0ci0+bWF4X3BrdCA9IGxfcHRyLT5tYXhfcGt0X3RhcmdldDsKKwllbHNlIAorCQlsX3B0ci0+bWF4X3BrdCA9IE1BWF9QS1RfREVGQVVMVDsKKworICAgICAgICBsX3B0ci0+bWF4X3BrdF9wcm9iZXMgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBsaW5rX25leHRfc2VudChzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJaWYgKGxfcHRyLT5uZXh0X291dCkKKwkJcmV0dXJuIG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5uZXh0X291dCkpOworCXJldHVybiBtb2QobF9wdHItPm5leHRfb3V0X25vKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbGlua19sYXN0X3NlbnQoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXJldHVybiBtb2QobGlua19uZXh0X3NlbnQobF9wdHIpIC0gMSk7Cit9CisKKy8qCisgKiAgU2ltcGxlIG5vbi1pbmxpbmVkIGxpbmsgcm91dGluZXMgKGkuZS4gcmVmZXJlbmNlZCBvdXRzaWRlIHRoaXMgZmlsZSkKKyAqLworCitpbnQgbGlua19pc191cChzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJaWYgKCFsX3B0cikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChsaW5rX3dvcmtpbmdfd29ya2luZyhsX3B0cikgfHwgbGlua193b3JraW5nX3Vua25vd24obF9wdHIpKTsKK30KKworaW50IGxpbmtfaXNfYWN0aXZlKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlyZXR1cm4gKChsX3B0ci0+b3duZXItPmFjdGl2ZV9saW5rc1swXSA9PSBsX3B0cikgfHwKKwkJKGxfcHRyLT5vd25lci0+YWN0aXZlX2xpbmtzWzFdID09IGxfcHRyKSk7Cit9CisKKy8qKgorICogbGlua19uYW1lX3ZhbGlkYXRlIC0gdmFsaWRhdGUgJiAob3B0aW9uYWxseSkgZGVjb25zdHJ1Y3QgbGluayBuYW1lCisgKiBAbmFtZSAtIHB0ciB0byBsaW5rIG5hbWUgc3RyaW5nCisgKiBAbmFtZV9wYXJ0cyAtIHB0ciB0byBhcmVhIGZvciBsaW5rIG5hbWUgY29tcG9uZW50cyAob3IgTlVMTCBpZiBub3QgbmVlZGVkKQorICogCisgKiBSZXR1cm5zIDEgaWYgbGluayBuYW1lIGlzIHZhbGlkLCBvdGhlcndpc2UgMC4KKyAqLworCitzdGF0aWMgaW50IGxpbmtfbmFtZV92YWxpZGF0ZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbGlua19uYW1lICpuYW1lX3BhcnRzKQoreworCWNoYXIgbmFtZV9jb3B5W1RJUENfTUFYX0xJTktfTkFNRV07CisJY2hhciAqYWRkcl9sb2NhbDsKKwljaGFyICppZl9sb2NhbDsKKwljaGFyICphZGRyX3BlZXI7CisJY2hhciAqaWZfcGVlcjsKKwljaGFyIGR1bW15OworCXUzMiB6X2xvY2FsLCBjX2xvY2FsLCBuX2xvY2FsOworCXUzMiB6X3BlZXIsIGNfcGVlciwgbl9wZWVyOworCXUzMiBpZl9sb2NhbF9sZW47CisJdTMyIGlmX3BlZXJfbGVuOworCisJLyogY29weSBsaW5rIG5hbWUgJiBlbnN1cmUgbGVuZ3RoIGlzIE9LICovCisKKwluYW1lX2NvcHlbVElQQ19NQVhfTElOS19OQU1FIC0gMV0gPSAwOworCS8qIG5lZWQgYWJvdmUgaW4gY2FzZSBub24tUG9zaXggc3RybmNweSgpIGRvZXNuJ3QgcGFkIHdpdGggbnVsbHMgKi8KKwlzdHJuY3B5KG5hbWVfY29weSwgbmFtZSwgVElQQ19NQVhfTElOS19OQU1FKTsKKwlpZiAobmFtZV9jb3B5W1RJUENfTUFYX0xJTktfTkFNRSAtIDFdICE9IDApCisJCXJldHVybiAwOworCisJLyogZW5zdXJlIGFsbCBjb21wb25lbnQgcGFydHMgb2YgbGluayBuYW1lIGFyZSBwcmVzZW50ICovCisKKwlhZGRyX2xvY2FsID0gbmFtZV9jb3B5OworCWlmICgoaWZfbG9jYWwgPSBzdHJjaHIoYWRkcl9sb2NhbCwgJzonKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJKihpZl9sb2NhbCsrKSA9IDA7CisJaWYgKChhZGRyX3BlZXIgPSBzdHJjaHIoaWZfbG9jYWwsICctJykpID09IE5VTEwpCisJCXJldHVybiAwOworCSooYWRkcl9wZWVyKyspID0gMDsKKwlpZl9sb2NhbF9sZW4gPSBhZGRyX3BlZXIgLSBpZl9sb2NhbDsKKwlpZiAoKGlmX3BlZXIgPSBzdHJjaHIoYWRkcl9wZWVyLCAnOicpKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwkqKGlmX3BlZXIrKykgPSAwOworCWlmX3BlZXJfbGVuID0gc3RybGVuKGlmX3BlZXIpICsgMTsKKworCS8qIHZhbGlkYXRlIGNvbXBvbmVudCBwYXJ0cyBvZiBsaW5rIG5hbWUgKi8KKworCWlmICgoc3NjYW5mKGFkZHJfbG9jYWwsICIldS4ldS4ldSVjIiwKKwkJICAgICZ6X2xvY2FsLCAmY19sb2NhbCwgJm5fbG9jYWwsICZkdW1teSkgIT0gMykgfHwKKwkgICAgKHNzY2FuZihhZGRyX3BlZXIsICIldS4ldS4ldSVjIiwKKwkJICAgICZ6X3BlZXIsICZjX3BlZXIsICZuX3BlZXIsICZkdW1teSkgIT0gMykgfHwKKwkgICAgKHpfbG9jYWwgPiAyNTUpIHx8IChjX2xvY2FsID4gNDA5NSkgfHwgKG5fbG9jYWwgPiA0MDk1KSB8fAorCSAgICAoel9wZWVyICA+IDI1NSkgfHwgKGNfcGVlciAgPiA0MDk1KSB8fCAobl9wZWVyICA+IDQwOTUpIHx8CisJICAgIChpZl9sb2NhbF9sZW4gPD0gMSkgfHwgKGlmX2xvY2FsX2xlbiA+IFRJUENfTUFYX0lGX05BTUUpIHx8IAorCSAgICAoaWZfcGVlcl9sZW4gIDw9IDEpIHx8IChpZl9wZWVyX2xlbiAgPiBUSVBDX01BWF9JRl9OQU1FKSB8fCAKKwkgICAgKHN0cnNwbihpZl9sb2NhbCwgdGlwY19hbHBoYWJldCkgIT0gKGlmX2xvY2FsX2xlbiAtIDEpKSB8fAorCSAgICAoc3Ryc3BuKGlmX3BlZXIsIHRpcGNfYWxwaGFiZXQpICE9IChpZl9wZWVyX2xlbiAtIDEpKSkKKwkJcmV0dXJuIDA7CisKKwkvKiByZXR1cm4gbGluayBuYW1lIGNvbXBvbmVudHMsIGlmIG5lY2Vzc2FyeSAqLworCisJaWYgKG5hbWVfcGFydHMpIHsKKwkJbmFtZV9wYXJ0cy0+YWRkcl9sb2NhbCA9IHRpcGNfYWRkcih6X2xvY2FsLCBjX2xvY2FsLCBuX2xvY2FsKTsKKwkJc3RyY3B5KG5hbWVfcGFydHMtPmlmX2xvY2FsLCBpZl9sb2NhbCk7CisJCW5hbWVfcGFydHMtPmFkZHJfcGVlciA9IHRpcGNfYWRkcih6X3BlZXIsIGNfcGVlciwgbl9wZWVyKTsKKwkJc3RyY3B5KG5hbWVfcGFydHMtPmlmX3BlZXIsIGlmX3BlZXIpOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBsaW5rX3RpbWVvdXQgLSBoYW5kbGUgZXhwaXJhdGlvbiBvZiBsaW5rIHRpbWVyCisgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluaworICogCisgKiBUaGlzIHJvdXRpbmUgbXVzdCBub3QgZ3JhYiAibmV0X2xvY2siIHRvIGF2b2lkIGEgcG90ZW50aWFsIGRlYWRsb2NrIGNvbmZsaWN0CisgKiB3aXRoIGxpbmtfZGVsZXRlKCkuICAoVGhlcmUgaXMgbm8gcmlzayB0aGF0IHRoZSBub2RlIHdpbGwgYmUgZGVsZXRlZCBieQorICogYW5vdGhlciB0aHJlYWQgYmVjYXVzZSBsaW5rX2RlbGV0ZSgpIGFsd2F5cyBjYW5jZWxzIHRoZSBsaW5rIHRpbWVyIGJlZm9yZQorICogbm9kZV9kZWxldGUoKSBpcyBjYWxsZWQuKQorICovCisKK3N0YXRpYyB2b2lkIGxpbmtfdGltZW91dChzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJbm9kZV9sb2NrKGxfcHRyLT5vd25lcik7CisKKwkvKiB1cGRhdGUgY291bnRlcnMgdXNlZCBpbiBzdGF0aXN0aWNhbCBwcm9maWxpbmcgb2Ygc2VuZCB0cmFmZmljICovCisKKwlsX3B0ci0+c3RhdHMuYWNjdV9xdWV1ZV9zeiArPSBsX3B0ci0+b3V0X3F1ZXVlX3NpemU7CisJbF9wdHItPnN0YXRzLnF1ZXVlX3N6X2NvdW50cysrOworCisJaWYgKGxfcHRyLT5vdXRfcXVldWVfc2l6ZSA+IGxfcHRyLT5zdGF0cy5tYXhfcXVldWVfc3opCisJCWxfcHRyLT5zdGF0cy5tYXhfcXVldWVfc3ogPSBsX3B0ci0+b3V0X3F1ZXVlX3NpemU7CisKKwlpZiAobF9wdHItPmZpcnN0X291dCkgeworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2cobF9wdHItPmZpcnN0X291dCk7CisJCXUzMiBsZW5ndGggPSBtc2dfc2l6ZShtc2cpOworCisJCWlmICgobXNnX3VzZXIobXNnKSA9PSBNU0dfRlJBR01FTlRFUikKKwkJICAgICYmIChtc2dfdHlwZShtc2cpID09IEZJUlNUX0ZSQUdNRU5UKSkgeworCQkJbGVuZ3RoID0gbXNnX3NpemUobXNnX2dldF93cmFwcGVkKG1zZykpOworCQl9CisJCWlmIChsZW5ndGgpIHsKKwkJCWxfcHRyLT5zdGF0cy5tc2dfbGVuZ3Roc190b3RhbCArPSBsZW5ndGg7CisJCQlsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9jb3VudHMrKzsKKwkJCWlmIChsZW5ndGggPD0gNjQpCisJCQkJbF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVswXSsrOworCQkJZWxzZSBpZiAobGVuZ3RoIDw9IDI1NikKKwkJCQlsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzFdKys7CisJCQllbHNlIGlmIChsZW5ndGggPD0gMTAyNCkKKwkJCQlsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzJdKys7CisJCQllbHNlIGlmIChsZW5ndGggPD0gNDA5NikKKwkJCQlsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzNdKys7CisJCQllbHNlIGlmIChsZW5ndGggPD0gMTYzODQpCisJCQkJbF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVs0XSsrOworCQkJZWxzZSBpZiAobGVuZ3RoIDw9IDMyNzY4KQorCQkJCWxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbNV0rKzsKKwkJCWVsc2UKKwkJCQlsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzZdKys7CisJCX0KKwl9CisKKwkvKiBkbyBhbGwgb3RoZXIgbGluayBwcm9jZXNzaW5nIHBlcmZvcm1lZCBvbiBhIHBlcmlvZGljIGJhc2lzICovCisKKwlsaW5rX2NoZWNrX2RlZnJhZ21fYnVmcyhsX3B0cik7CisKKwlsaW5rX3N0YXRlX2V2ZW50KGxfcHRyLCBUSU1FT1VUX0VWVCk7CisKKwlpZiAobF9wdHItPm5leHRfb3V0KQorCQlsaW5rX3B1c2hfcXVldWUobF9wdHIpOworCisJbm9kZV91bmxvY2sobF9wdHItPm93bmVyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpbmtfc2V0X3RpbWVyKHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIHRpbWUpCit7CisJa19zdGFydF90aW1lcigmbF9wdHItPnRpbWVyLCB0aW1lKTsKK30KKworLyoqCisgKiBsaW5rX2NyZWF0ZSAtIGNyZWF0ZSBhIG5ldyBsaW5rCisgKiBAYl9wdHI6IHBvaW50ZXIgdG8gYXNzb2NpYXRlZCBiZWFyZXIKKyAqIEBwZWVyOiBuZXR3b3JrIGFkZHJlc3Mgb2Ygbm9kZSBhdCBvdGhlciBlbmQgb2YgbGluaworICogQG1lZGlhX2FkZHI6IG1lZGlhIGFkZHJlc3MgdG8gdXNlIHdoZW4gc2VuZGluZyBtZXNzYWdlcyBvdmVyIGxpbmsKKyAqIAorICogUmV0dXJucyBwb2ludGVyIHRvIGxpbmsuCisgKi8KKworc3RydWN0IGxpbmsgKmxpbmtfY3JlYXRlKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBjb25zdCB1MzIgcGVlciwKKwkJCSBjb25zdCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICptZWRpYV9hZGRyKQoreworCXN0cnVjdCBsaW5rICpsX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwljaGFyICppZl9uYW1lOworCisJbF9wdHIgPSAoc3RydWN0IGxpbmsgKilrbWFsbG9jKHNpemVvZigqbF9wdHIpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWxfcHRyKSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBGYWlsZWQgdG8gY3JlYXRlIGxpbmtcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGxfcHRyLCAwLCBzaXplb2YoKmxfcHRyKSk7CisKKwlsX3B0ci0+YWRkciA9IHBlZXI7CisJaWZfbmFtZSA9IHN0cmNocihiX3B0ci0+cHVibC5uYW1lLCAnOicpICsgMTsKKwlzcHJpbnRmKGxfcHRyLT5uYW1lLCAiJXUuJXUuJXU6JXMtJXUuJXUuJXU6IiwKKwkJdGlwY196b25lKHRpcGNfb3duX2FkZHIpLCB0aXBjX2NsdXN0ZXIodGlwY19vd25fYWRkciksCisJCXRpcGNfbm9kZSh0aXBjX293bl9hZGRyKSwgCisJCWlmX25hbWUsCisJCXRpcGNfem9uZShwZWVyKSwgdGlwY19jbHVzdGVyKHBlZXIpLCB0aXBjX25vZGUocGVlcikpOworCQkvKiBub3RlOiBwZWVyIGkvZiBpcyBhcHBlbmRlZCB0byBsaW5rIG5hbWUgYnkgcmVzZXQvYWN0aXZhdGUgKi8KKwltZW1jcHkoJmxfcHRyLT5tZWRpYV9hZGRyLCBtZWRpYV9hZGRyLCBzaXplb2YoKm1lZGlhX2FkZHIpKTsKKwlrX2luaXRfdGltZXIoJmxfcHRyLT50aW1lciwgKEhhbmRsZXIpbGlua190aW1lb3V0LCAodW5zaWduZWQgbG9uZylsX3B0cik7CisJbGlzdF9hZGRfdGFpbCgmbF9wdHItPmxpbmtfbGlzdCwgJmJfcHRyLT5saW5rcyk7CisJbF9wdHItPmNoZWNrcG9pbnQgPSAxOworCWxfcHRyLT5iX3B0ciA9IGJfcHRyOworCWxpbmtfc2V0X3N1cGVydmlzaW9uX3Byb3BzKGxfcHRyLCBiX3B0ci0+bWVkaWEtPnRvbGVyYW5jZSk7CisJbF9wdHItPnN0YXRlID0gUkVTRVRfVU5LTk9XTjsKKworCWxfcHRyLT5wbXNnID0gKHN0cnVjdCB0aXBjX21zZyAqKSZsX3B0ci0+cHJvdG9fbXNnOworCW1zZyA9IGxfcHRyLT5wbXNnOworCW1zZ19pbml0KG1zZywgTElOS19QUk9UT0NPTCwgUkVTRVRfTVNHLCBUSVBDX09LLCBJTlRfSF9TSVpFLCBsX3B0ci0+YWRkcik7CisJbXNnX3NldF9zaXplKG1zZywgc2l6ZW9mKGxfcHRyLT5wcm90b19tc2cpKTsKKwltc2dfc2V0X3Nlc3Npb24obXNnLCB0aXBjX3JhbmRvbSk7CisJbXNnX3NldF9iZWFyZXJfaWQobXNnLCBiX3B0ci0+aWRlbnRpdHkpOworCXN0cmNweSgoY2hhciAqKW1zZ19kYXRhKG1zZyksIGlmX25hbWUpOworCisJbF9wdHItPnByaW9yaXR5ID0gYl9wdHItPnByaW9yaXR5OworCWxpbmtfc2V0X3F1ZXVlX2xpbWl0cyhsX3B0ciwgYl9wdHItPm1lZGlhLT53aW5kb3cpOworCisJbGlua19pbml0X21heF9wa3QobF9wdHIpOworCisJbF9wdHItPm5leHRfb3V0X25vID0gMTsKKwlJTklUX0xJU1RfSEVBRCgmbF9wdHItPndhaXRpbmdfcG9ydHMpOworCisJbGlua19yZXNldF9zdGF0aXN0aWNzKGxfcHRyKTsKKworCWxfcHRyLT5vd25lciA9IG5vZGVfYXR0YWNoX2xpbmsobF9wdHIpOworCWlmICghbF9wdHItPm93bmVyKSB7CisJCWtmcmVlKGxfcHRyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKExJTktfTE9HX0JVRl9TSVpFKSB7CisJCWNoYXIgKnBiID0ga21hbGxvYyhMSU5LX0xPR19CVUZfU0laRSwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKCFwYikgeworCQkJa2ZyZWUobF9wdHIpOworCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IEZhaWxlZCB0byBjcmVhdGUgbGlua1xuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlwcmludGJ1Zl9pbml0KCZsX3B0ci0+cHJpbnRfYnVmLCBwYiwgTElOS19MT0dfQlVGX1NJWkUpOworCX0KKworCWtfc2lnbmFsKChIYW5kbGVyKWxpbmtfc3RhcnQsICh1bnNpZ25lZCBsb25nKWxfcHRyKTsKKworCWRiZygibGlua19jcmVhdGUoKTogdG9sZXJhbmNlID0gJXUsY29udCBpbnR2ID0gJXUsIGFib3J0X2xpbWl0ID0gJXVcbiIsCisJICAgIGxfcHRyLT50b2xlcmFuY2UsIGxfcHRyLT5jb250aW51aXR5X2ludGVydmFsLCBsX3B0ci0+YWJvcnRfbGltaXQpOworCQorCXJldHVybiBsX3B0cjsKK30KKworLyoqIAorICogbGlua19kZWxldGUgLSBkZWxldGUgYSBsaW5rCisgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluaworICogCisgKiBOb3RlOiAnbmV0X2xvY2snIGlzIHdyaXRlX2xvY2tlZCwgYmVhcmVyIGlzIGxvY2tlZC4KKyAqIFRoaXMgcm91dGluZSBtdXN0IG5vdCBncmFiIHRoZSBub2RlIGxvY2sgdW50aWwgYWZ0ZXIgbGluayB0aW1lciBjYW5jZWxsYXRpb24KKyAqIHRvIGF2b2lkIGEgcG90ZW50aWFsIGRlYWRsb2NrIHNpdHVhdGlvbi4gIAorICovCisKK3ZvaWQgbGlua19kZWxldGUoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCWlmICghbF9wdHIpIHsKKwkJZXJyKCJBdHRlbXB0IHRvIGRlbGV0ZSBub24tZXhpc3RlbnQgbGlua1xuIik7CisJCXJldHVybjsKKwl9CisKKwlkYmcoImxpbmtfZGVsZXRlKClcbiIpOworCisJa19jYW5jZWxfdGltZXIoJmxfcHRyLT50aW1lcik7CisJCisJbm9kZV9sb2NrKGxfcHRyLT5vd25lcik7CisJbGlua19yZXNldChsX3B0cik7CisJbm9kZV9kZXRhY2hfbGluayhsX3B0ci0+b3duZXIsIGxfcHRyKTsKKwlsaW5rX3N0b3AobF9wdHIpOworCWxpc3RfZGVsX2luaXQoJmxfcHRyLT5saW5rX2xpc3QpOworCWlmIChMSU5LX0xPR19CVUZfU0laRSkKKwkJa2ZyZWUobF9wdHItPnByaW50X2J1Zi5idWYpOworCW5vZGVfdW5sb2NrKGxfcHRyLT5vd25lcik7CisJa190ZXJtX3RpbWVyKCZsX3B0ci0+dGltZXIpOworCWtmcmVlKGxfcHRyKTsKK30KKwordm9pZCBsaW5rX3N0YXJ0KHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlkYmcoImxpbmtfc3RhcnQgJXhcbiIsIGxfcHRyKTsKKwlsaW5rX3N0YXRlX2V2ZW50KGxfcHRyLCBTVEFSVElOR19FVlQpOworfQorCisvKioKKyAqIGxpbmtfc2NoZWR1bGVfcG9ydCAtIHNjaGVkdWxlIHBvcnQgZm9yIGRlZmVycmVkIHNlbmRpbmcgCisgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluaworICogQG9yaWdwb3J0OiByZWZlcmVuY2UgdG8gc2VuZGluZyBwb3J0CisgKiBAc3o6IGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAqIAorICogU2NoZWR1bGVzIHBvcnQgZm9yIHJlbmV3ZWQgc2VuZGluZyBvZiBtZXNzYWdlcyBhZnRlciBsaW5rIGNvbmdlc3Rpb24gCisgKiBoYXMgYWJhdGVkLgorICovCisKK3N0YXRpYyBpbnQgbGlua19zY2hlZHVsZV9wb3J0KHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIG9yaWdwb3J0LCB1MzIgc3opCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCisJc3Bpbl9sb2NrX2JoKCZwb3J0X2xpc3RfbG9jayk7CisJcF9wdHIgPSBwb3J0X2xvY2sob3JpZ3BvcnQpOworCWlmIChwX3B0cikgeworCQlpZiAoIXBfcHRyLT53YWtldXApCisJCQlnb3RvIGV4aXQ7CisJCWlmICghbGlzdF9lbXB0eSgmcF9wdHItPndhaXRfbGlzdCkpCisJCQlnb3RvIGV4aXQ7CisJCXBfcHRyLT5jb25nZXN0ZWRfbGluayA9IGxfcHRyOworCQlwX3B0ci0+cHVibC5jb25nZXN0ZWQgPSAxOworCQlwX3B0ci0+d2FpdGluZ19wa3RzID0gMSArICgoc3ogLSAxKSAvIGxpbmtfbWF4X3BrdChsX3B0cikpOworCQlsaXN0X2FkZF90YWlsKCZwX3B0ci0+d2FpdF9saXN0LCAmbF9wdHItPndhaXRpbmdfcG9ydHMpOworCQlsX3B0ci0+c3RhdHMubGlua19jb25ncysrOworZXhpdDoKKwkJcG9ydF91bmxvY2socF9wdHIpOworCX0KKwlzcGluX3VubG9ja19iaCgmcG9ydF9saXN0X2xvY2spOworCXJldHVybiAtRUxJTktDT05HOworfQorCit2b2lkIGxpbmtfd2FrZXVwX3BvcnRzKHN0cnVjdCBsaW5rICpsX3B0ciwgaW50IGFsbCkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHBvcnQgKnRlbXBfcF9wdHI7CisJaW50IHdpbiA9IGxfcHRyLT5xdWV1ZV9saW1pdFswXSAtIGxfcHRyLT5vdXRfcXVldWVfc2l6ZTsKKworCWlmIChhbGwpCisJCXdpbiA9IDEwMDAwMDsKKwlpZiAod2luIDw9IDApCisJCXJldHVybjsKKwlpZiAoIXNwaW5fdHJ5bG9ja19iaCgmcG9ydF9saXN0X2xvY2spKQorCQlyZXR1cm47CisJaWYgKGxpbmtfY29uZ2VzdGVkKGxfcHRyKSkKKwkJZ290byBleGl0OworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwX3B0ciwgdGVtcF9wX3B0ciwgJmxfcHRyLT53YWl0aW5nX3BvcnRzLCAKKwkJCQkgd2FpdF9saXN0KSB7CisJCWlmICh3aW4gPD0gMCkKKwkJCWJyZWFrOworCQlsaXN0X2RlbF9pbml0KCZwX3B0ci0+d2FpdF9saXN0KTsKKwkJcF9wdHItPmNvbmdlc3RlZF9saW5rID0gMDsKKwkJYXNzZXJ0KHBfcHRyLT53YWtldXApOworCQlzcGluX2xvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDA7CisJCXBfcHRyLT53YWtldXAoJnBfcHRyLT5wdWJsKTsKKwkJd2luIC09IHBfcHRyLT53YWl0aW5nX3BrdHM7CisJCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCX0KKworZXhpdDoKKwlzcGluX3VubG9ja19iaCgmcG9ydF9saXN0X2xvY2spOworfQorCisvKiogCisgKiBsaW5rX3JlbGVhc2Vfb3V0cXVldWUgLSBwdXJnZSBsaW5rJ3Mgb3V0Ym91bmQgbWVzc2FnZSBxdWV1ZQorICogQGxfcHRyOiBwb2ludGVyIHRvIGxpbmsKKyAqLworCitzdGF0aWMgdm9pZCBsaW5rX3JlbGVhc2Vfb3V0cXVldWUoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBsX3B0ci0+Zmlyc3Rfb3V0OworCXN0cnVjdCBza19idWZmICpuZXh0OworCisJd2hpbGUgKGJ1ZikgeworCQluZXh0ID0gYnVmLT5uZXh0OworCQlidWZfZGlzY2FyZChidWYpOworCQlidWYgPSBuZXh0OworCX0KKwlsX3B0ci0+Zmlyc3Rfb3V0ID0gTlVMTDsKKwlsX3B0ci0+b3V0X3F1ZXVlX3NpemUgPSAwOworfQorCisvKioKKyAqIGxpbmtfcmVzZXRfZnJhZ21lbnRzIC0gcHVyZ2UgbGluaydzIGluYm91bmQgbWVzc2FnZSBmcmFnbWVudHMgcXVldWUKKyAqIEBsX3B0cjogcG9pbnRlciB0byBsaW5rCisgKi8KKwordm9pZCBsaW5rX3Jlc2V0X2ZyYWdtZW50cyhzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGxfcHRyLT5kZWZyYWdtX2J1ZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dDsKKworCXdoaWxlIChidWYpIHsKKwkJbmV4dCA9IGJ1Zi0+bmV4dDsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJYnVmID0gbmV4dDsKKwl9CisJbF9wdHItPmRlZnJhZ21fYnVmID0gTlVMTDsKK30KKworLyoqIAorICogbGlua19zdG9wIC0gcHVyZ2UgYWxsIGluYm91bmQgYW5kIG91dGJvdW5kIG1lc3NhZ2VzIGFzc29jaWF0ZWQgd2l0aCBsaW5rCisgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluaworICovCisKK3ZvaWQgbGlua19zdG9wKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCBza19idWZmICpuZXh0OworCisJYnVmID0gbF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbjsKKwl3aGlsZSAoYnVmKSB7CisJCW5leHQgPSBidWYtPm5leHQ7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCWJ1ZiA9IG5leHQ7CisJfQorCisJYnVmID0gbF9wdHItPmZpcnN0X291dDsKKwl3aGlsZSAoYnVmKSB7CisJCW5leHQgPSBidWYtPm5leHQ7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCWJ1ZiA9IG5leHQ7CisJfQorCisJbGlua19yZXNldF9mcmFnbWVudHMobF9wdHIpOworCisJYnVmX2Rpc2NhcmQobF9wdHItPnByb3RvX21zZ19xdWV1ZSk7CisJbF9wdHItPnByb3RvX21zZ19xdWV1ZSA9IE5VTEw7Cit9CisKKyNpZiAwCisKKy8qIExJTksgRVZFTlQgQ09ERSBJUyBOT1QgU1VQUE9SVEVEIEFUIFBSRVNFTlQgKi8KKworc3RhdGljIHZvaWQgbGlua19yZWN2X2V2ZW50KHN0cnVjdCBsaW5rX2V2ZW50ICpldikKK3sKKwlldi0+ZmNuKGV2LT5hZGRyLCBldi0+bmFtZSwgZXYtPnVwKTsKKwlrZnJlZShldik7Cit9CisKK3N0YXRpYyB2b2lkIGxpbmtfc2VuZF9ldmVudCh2b2lkICgqZmNuKSh1MzIgYSwgY2hhciAqbiwgaW50IHVwKSwKKwkJCSAgICBzdHJ1Y3QgbGluayAqbF9wdHIsIGludCB1cCkKK3sKKwlzdHJ1Y3QgbGlua19ldmVudCAqZXY7CisJCisJZXYgPSBrbWFsbG9jKHNpemVvZigqZXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWV2KSB7CisJCXdhcm4oIkxpbmsgZXZlbnQgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlldi0+YWRkciA9IGxfcHRyLT5hZGRyOworCWV2LT51cCA9IHVwOworCWV2LT5mY24gPSBmY247CisJbWVtY3B5KGV2LT5uYW1lLCBsX3B0ci0+bmFtZSwgVElQQ19NQVhfTElOS19OQU1FKTsKKwlrX3NpZ25hbCgoSGFuZGxlcilsaW5rX3JlY3ZfZXZlbnQsICh1bnNpZ25lZCBsb25nKWV2KTsKK30KKworI2Vsc2UKKworI2RlZmluZSBsaW5rX3NlbmRfZXZlbnQoZmNuLCBsX3B0ciwgdXApIGRvIHsgfSB3aGlsZSAoMCkKKworI2VuZGlmCisKK3ZvaWQgbGlua19yZXNldChzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwl1MzIgcHJldl9zdGF0ZSA9IGxfcHRyLT5zdGF0ZTsKKwl1MzIgY2hlY2twb2ludCA9IGxfcHRyLT5uZXh0X2luX25vOworCQorCW1zZ19zZXRfc2Vzc2lvbihsX3B0ci0+cG1zZywgbXNnX3Nlc3Npb24obF9wdHItPnBtc2cpICsgMSk7CisKKyAgICAgICAgLyogTGluayBpcyBkb3duLCBhY2NlcHQgYW55IHNlc3Npb246ICovCisJbF9wdHItPnBlZXJfc2Vzc2lvbiA9IDA7CisKKyAgICAgICAgLyogUHJlcGFyZSBmb3IgbWF4IHBhY2tldCBzaXplIG5lZ290aWF0aW9uICovCisJbGlua19pbml0X21heF9wa3QobF9wdHIpOworCQorCWxfcHRyLT5zdGF0ZSA9IFJFU0VUX1VOS05PV047CisJZGJnX2xpbmtfc3RhdGUoIlJlc2V0dGluZyBMaW5rXG4iKTsKKworCWlmICgocHJldl9zdGF0ZSA9PSBSRVNFVF9VTktOT1dOKSB8fCAocHJldl9zdGF0ZSA9PSBSRVNFVF9SRVNFVCkpCisJCXJldHVybjsKKworCW5vZGVfbGlua19kb3duKGxfcHRyLT5vd25lciwgbF9wdHIpOworCWJlYXJlcl9yZW1vdmVfZGVzdChsX3B0ci0+Yl9wdHIsIGxfcHRyLT5hZGRyKTsKKyNpZiAwCisJdGlwY19wcmludGYoQ09OUywgIlxuUmVzZXQgbGluayA8JXM+XG4iLCBsX3B0ci0+bmFtZSk7CisJZGJnX2xpbmtfZHVtcCgpOworI2VuZGlmCisJaWYgKG5vZGVfaGFzX2FjdGl2ZV9saW5rcyhsX3B0ci0+b3duZXIpICYmCisJICAgIGxfcHRyLT5vd25lci0+cGVybWl0X2NoYW5nZW92ZXIpIHsKKwkJbF9wdHItPnJlc2V0X2NoZWNrcG9pbnQgPSBjaGVja3BvaW50OworCQlsX3B0ci0+ZXhwX21zZ19jb3VudCA9IFNUQVJUX0NIQU5HRU9WRVI7CisJfQorCisJLyogQ2xlYW4gdXAgYWxsIHF1ZXVlczogKi8KKworCWxpbmtfcmVsZWFzZV9vdXRxdWV1ZShsX3B0cik7CisJYnVmX2Rpc2NhcmQobF9wdHItPnByb3RvX21zZ19xdWV1ZSk7CisJbF9wdHItPnByb3RvX21zZ19xdWV1ZSA9IE5VTEw7CisJYnVmID0gbF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbjsKKwl3aGlsZSAoYnVmKSB7CisJCXN0cnVjdCBza19idWZmICpuZXh0ID0gYnVmLT5uZXh0OworCQlidWZfZGlzY2FyZChidWYpOworCQlidWYgPSBuZXh0OworCX0KKwlpZiAoIWxpc3RfZW1wdHkoJmxfcHRyLT53YWl0aW5nX3BvcnRzKSkKKwkJbGlua193YWtldXBfcG9ydHMobF9wdHIsIDEpOworCisJbF9wdHItPnJldHJhbnNtX3F1ZXVlX2hlYWQgPSAwOworCWxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9zaXplID0gMDsKKwlsX3B0ci0+bGFzdF9vdXQgPSBOVUxMOworCWxfcHRyLT5maXJzdF9vdXQgPSBOVUxMOworCWxfcHRyLT5uZXh0X291dCA9IE5VTEw7CisJbF9wdHItPnVuYWNrZWRfd2luZG93ID0gMDsKKwlsX3B0ci0+Y2hlY2twb2ludCA9IDE7CisJbF9wdHItPm5leHRfb3V0X25vID0gMTsKKwlsX3B0ci0+ZGVmZXJyZWRfaW5xdWV1ZV9zeiA9IDA7CisJbF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbiA9IE5VTEw7CisJbF9wdHItPm5ld2VzdF9kZWZlcnJlZF9pbiA9IE5VTEw7CisJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKKwlsX3B0ci0+c3RhbGVfY291bnQgPSAwOworCWxpbmtfcmVzZXRfc3RhdGlzdGljcyhsX3B0cik7CisKKwlsaW5rX3NlbmRfZXZlbnQoY2ZnX2xpbmtfZXZlbnQsIGxfcHRyLCAwKTsKKwlpZiAoIWluX293bl9jbHVzdGVyKGxfcHRyLT5hZGRyKSkKKwkJbGlua19zZW5kX2V2ZW50KGRpc2NfbGlua19ldmVudCwgbF9wdHIsIDApOworfQorCisKK3N0YXRpYyB2b2lkIGxpbmtfYWN0aXZhdGUoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCWxfcHRyLT5uZXh0X2luX25vID0gMTsKKwlub2RlX2xpbmtfdXAobF9wdHItPm93bmVyLCBsX3B0cik7CisJYmVhcmVyX2FkZF9kZXN0KGxfcHRyLT5iX3B0ciwgbF9wdHItPmFkZHIpOworCWxpbmtfc2VuZF9ldmVudChjZmdfbGlua19ldmVudCwgbF9wdHIsIDEpOworCWlmICghaW5fb3duX2NsdXN0ZXIobF9wdHItPmFkZHIpKQorCQlsaW5rX3NlbmRfZXZlbnQoZGlzY19saW5rX2V2ZW50LCBsX3B0ciwgMSk7Cit9CisKKy8qKgorICogbGlua19zdGF0ZV9ldmVudCAtIGxpbmsgZmluaXRlIHN0YXRlIG1hY2hpbmUKKyAqIEBsX3B0cjogcG9pbnRlciB0byBsaW5rCisgKiBAZXZlbnQ6IHN0YXRlIG1hY2hpbmUgZXZlbnQgdG8gcHJvY2VzcworICovCisKK3N0YXRpYyB2b2lkIGxpbmtfc3RhdGVfZXZlbnQoc3RydWN0IGxpbmsgKmxfcHRyLCB1bnNpZ25lZCBldmVudCkKK3sKKwlzdHJ1Y3QgbGluayAqb3RoZXI7IAorCXUzMiBjb250X2ludHYgPSBsX3B0ci0+Y29udGludWl0eV9pbnRlcnZhbDsKKworCWlmICghbF9wdHItPnN0YXJ0ZWQgJiYgKGV2ZW50ICE9IFNUQVJUSU5HX0VWVCkpCisJCXJldHVybjsJCS8qIE5vdCB5ZXQuICovCisKKwlpZiAobGlua19ibG9ja2VkKGxfcHRyKSkgeworCQlpZiAoZXZlbnQgPT0gVElNRU9VVF9FVlQpIHsKKwkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQl9CisJCXJldHVybjsJICAvKiBDaGFuZ2VvdmVyIGdvaW5nIG9uICovCisJfQorCWRiZ19saW5rKCJTVEFURV9FVjogPCVzPiAiLCBsX3B0ci0+bmFtZSk7CisKKwlzd2l0Y2ggKGxfcHRyLT5zdGF0ZSkgeworCWNhc2UgV09SS0lOR19XT1JLSU5HOgorCQlkYmdfbGluaygiV1cvIik7CisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBUUkFGRklDX01TR19FVlQ6CisJCQlkYmdfbGluaygiVFJGLSIpOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgQUNUSVZBVEVfTVNHOgorCQkJZGJnX2xpbmsoIkFDVFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBUSU1FT1VUX0VWVDoKKwkJCWRiZ19saW5rKCJUSU0gIik7CisJCQlpZiAobF9wdHItPm5leHRfaW5fbm8gIT0gbF9wdHItPmNoZWNrcG9pbnQpIHsKKwkJCQlsX3B0ci0+Y2hlY2twb2ludCA9IGxfcHRyLT5uZXh0X2luX25vOworCQkJCWlmIChiY2xpbmtfYWNrc19taXNzaW5nKGxfcHRyLT5vd25lcikpIHsKKwkJCQkJbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgU1RBVEVfTVNHLCAKKwkJCQkJCQkgICAgMCwgMCwgMCwgMCwgMCk7CisJCQkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJCX0gZWxzZSBpZiAobF9wdHItPm1heF9wa3QgPCBsX3B0ci0+bWF4X3BrdF90YXJnZXQpIHsKKwkJCQkJbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgU1RBVEVfTVNHLCAKKwkJCQkJCQkgICAgMSwgMCwgMCwgMCwgMCk7CisJCQkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJCX0KKwkJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRiZ19saW5rKCIgLT4gV1VcbiIpOworCQkJbF9wdHItPnN0YXRlID0gV09SS0lOR19VTktOT1dOOworCQkJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKKwkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgMSwgMCwgMCwgMCwgMCk7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYgLyA0KTsKKwkJCWJyZWFrOworCQljYXNlIFJFU0VUX01TRzoKKwkJCWRiZ19saW5rKCJSRVMgLT4gUlJcbiIpOworCQkJbGlua19yZXNldChsX3B0cik7CisJCQlsX3B0ci0+c3RhdGUgPSBSRVNFVF9SRVNFVDsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CisJCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBBQ1RJVkFURV9NU0csIDAsIDAsIDAsIDAsIDApOworCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyKCJVbmtub3duIGxpbmsgZXZlbnQgJXUgaW4gV1cgc3RhdGVcbiIsIGV2ZW50KTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdPUktJTkdfVU5LTk9XTjoKKwkJZGJnX2xpbmsoIldVLyIpOworCQlzd2l0Y2ggKGV2ZW50KSB7CisJCWNhc2UgVFJBRkZJQ19NU0dfRVZUOgorCQkJZGJnX2xpbmsoIlRSRi0iKTsKKwkJY2FzZSBBQ1RJVkFURV9NU0c6CisJCQlkYmdfbGluaygiQUNUIC0+IFdXXG4iKTsKKwkJCWxfcHRyLT5zdGF0ZSA9IFdPUktJTkdfV09SS0lORzsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CisJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKKwkJCWJyZWFrOworCQljYXNlIFJFU0VUX01TRzoKKwkJCWRiZ19saW5rKCJSRVMgLT4gUlJcbiIpOworCQkJbGlua19yZXNldChsX3B0cik7CisJCQlsX3B0ci0+c3RhdGUgPSBSRVNFVF9SRVNFVDsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CisJCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBBQ1RJVkFURV9NU0csIDAsIDAsIDAsIDAsIDApOworCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKKwkJCWJyZWFrOworCQljYXNlIFRJTUVPVVRfRVZUOgorCQkJZGJnX2xpbmsoIlRJTSAiKTsKKwkJCWlmIChsX3B0ci0+bmV4dF9pbl9ubyAhPSBsX3B0ci0+Y2hlY2twb2ludCkgeworCQkJCWRiZ19saW5rKCItPiBXVyBcbiIpOworCQkJCWxfcHRyLT5zdGF0ZSA9IFdPUktJTkdfV09SS0lORzsKKwkJCQlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOworCQkJCWxfcHRyLT5jaGVja3BvaW50ID0gbF9wdHItPm5leHRfaW5fbm87CisJCQkJaWYgKGJjbGlua19hY2tzX21pc3NpbmcobF9wdHItPm93bmVyKSkgeworCQkJCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csCisJCQkJCQkJICAgIDAsIDAsIDAsIDAsIDApOworCQkJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCQl9CisJCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CisJCQl9IGVsc2UgaWYgKGxfcHRyLT5mc21fbXNnX2NudCA8IGxfcHRyLT5hYm9ydF9saW1pdCkgeworCQkJCWRiZ19saW5rKCJQcm9iaW5nICV1LyV1LHRpbWVyID0gJXUgbXMpXG4iLAorCQkJCQkgbF9wdHItPmZzbV9tc2dfY250LCBsX3B0ci0+YWJvcnRfbGltaXQsCisJCQkJCSBjb250X2ludHYgLyA0KTsKKwkJCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csIAorCQkJCQkJICAgIDEsIDAsIDAsIDAsIDApOworCQkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYgLyA0KTsKKwkJCX0gZWxzZSB7CS8qIExpbmsgaGFzIGZhaWxlZCAqLworCQkJCWRiZ19saW5rKCItPiBSVSAoJXUgcHJvYmVzIHVuYW5zd2VyZWQpXG4iLAorCQkJCQkgbF9wdHItPmZzbV9tc2dfY250KTsKKwkJCQlsaW5rX3Jlc2V0KGxfcHRyKTsKKwkJCQlsX3B0ci0+c3RhdGUgPSBSRVNFVF9VTktOT1dOOworCQkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CisJCQkJbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgUkVTRVRfTVNHLAorCQkJCQkJICAgIDAsIDAsIDAsIDAsIDApOworCQkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIoIlVua25vd24gbGluayBldmVudCAldSBpbiBXVSBzdGF0ZVxuIiwgZXZlbnQpOworCQl9CisJCWJyZWFrOworCWNhc2UgUkVTRVRfVU5LTk9XTjoKKwkJZGJnX2xpbmsoIlJVLyIpOworCQlzd2l0Y2ggKGV2ZW50KSB7CisJCWNhc2UgVFJBRkZJQ19NU0dfRVZUOgorCQkJZGJnX2xpbmsoIlRSRi1cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQUNUSVZBVEVfTVNHOgorCQkJb3RoZXIgPSBsX3B0ci0+b3duZXItPmFjdGl2ZV9saW5rc1swXTsKKwkJCWlmIChvdGhlciAmJiBsaW5rX3dvcmtpbmdfdW5rbm93bihvdGhlcikpIHsKKwkJCQlkYmdfbGluaygiQUNUXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRiZ19saW5rKCJBQ1QgLT4gV1dcbiIpOworCQkJbF9wdHItPnN0YXRlID0gV09SS0lOR19XT1JLSU5HOworCQkJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKKwkJCWxpbmtfYWN0aXZhdGUobF9wdHIpOworCQkJbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgU1RBVEVfTVNHLCAxLCAwLCAwLCAwLCAwKTsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CisJCQlicmVhazsKKwkJY2FzZSBSRVNFVF9NU0c6CisJCQlkYmdfbGluaygiUkVTIFxuIik7CisJCQlkYmdfbGluaygiIC0+IFJSXG4iKTsKKwkJCWxfcHRyLT5zdGF0ZSA9IFJFU0VUX1JFU0VUOworCQkJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKKwkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIEFDVElWQVRFX01TRywgMSwgMCwgMCwgMCwgMCk7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQkJYnJlYWs7CisJCWNhc2UgU1RBUlRJTkdfRVZUOgorCQkJZGJnX2xpbmsoIlNUQVJULSIpOworCQkJbF9wdHItPnN0YXJ0ZWQgPSAxOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgVElNRU9VVF9FVlQ6CisJCQlkYmdfbGluaygiVElNIFxuIik7CisJCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBSRVNFVF9NU0csIDAsIDAsIDAsIDAsIDApOworCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyKCJVbmtub3duIGxpbmsgZXZlbnQgJXUgaW4gUlUgc3RhdGVcbiIsIGV2ZW50KTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFU0VUX1JFU0VUOgorCQlkYmdfbGluaygiUlIvICIpOworCQlzd2l0Y2ggKGV2ZW50KSB7CisJCWNhc2UgVFJBRkZJQ19NU0dfRVZUOgorCQkJZGJnX2xpbmsoIlRSRi0iKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIEFDVElWQVRFX01TRzoKKwkJCW90aGVyID0gbF9wdHItPm93bmVyLT5hY3RpdmVfbGlua3NbMF07CisJCQlpZiAob3RoZXIgJiYgbGlua193b3JraW5nX3Vua25vd24ob3RoZXIpKSB7CisJCQkJZGJnX2xpbmsoIkFDVFxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkYmdfbGluaygiQUNUIC0+IFdXXG4iKTsKKwkJCWxfcHRyLT5zdGF0ZSA9IFdPUktJTkdfV09SS0lORzsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CisJCQlsaW5rX2FjdGl2YXRlKGxfcHRyKTsKKwkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgMSwgMCwgMCwgMCwgMCk7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQkJYnJlYWs7CisJCWNhc2UgUkVTRVRfTVNHOgorCQkJZGJnX2xpbmsoIlJFU1xuIik7CisJCQlicmVhazsKKwkJY2FzZSBUSU1FT1VUX0VWVDoKKwkJCWRiZ19saW5rKCJUSU1cbiIpOworCQkJbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgQUNUSVZBVEVfTVNHLCAwLCAwLCAwLCAwLCAwKTsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CisJCQlkYmdfbGluaygiZnNtX21zZ19jbnQgJXVcbiIsIGxfcHRyLT5mc21fbXNnX2NudCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycigiVW5rbm93biBsaW5rIGV2ZW50ICV1IGluIFJSIHN0YXRlXG4iLCBldmVudCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyKCJVbmtub3duIGxpbmsgc3RhdGUgJXUvJXVcbiIsIGxfcHRyLT5zdGF0ZSwgZXZlbnQpOworCX0KK30KKworLyoKKyAqIGxpbmtfYnVuZGxlX2J1ZigpOiBBcHBlbmQgY29udGVudHMgb2YgYSBidWZmZXIgdG8KKyAqIHRoZSB0YWlsIG9mIGFuIGV4aXN0aW5nIG9uZS4gCisgKi8KKworc3RhdGljIGludCBsaW5rX2J1bmRsZV9idWYoc3RydWN0IGxpbmsgKmxfcHRyLAorCQkJICAgc3RydWN0IHNrX2J1ZmYgKmJ1bmRsZXIsIAorCQkJICAgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKmJ1bmRsZXJfbXNnID0gYnVmX21zZyhidW5kbGVyKTsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwl1MzIgc2l6ZSA9IG1zZ19zaXplKG1zZyk7CisJdTMyIHRvX3BvcyA9IGFsaWduKG1zZ19zaXplKGJ1bmRsZXJfbXNnKSk7CisJdTMyIHJlc3QgPSBsaW5rX21heF9wa3QobF9wdHIpIC0gdG9fcG9zOworCisJaWYgKG1zZ191c2VyKGJ1bmRsZXJfbXNnKSAhPSBNU0dfQlVORExFUikKKwkJcmV0dXJuIDA7CisJaWYgKG1zZ190eXBlKGJ1bmRsZXJfbXNnKSAhPSBPUEVOX01TRykKKwkJcmV0dXJuIDA7CisJaWYgKHJlc3QgPCBhbGlnbihzaXplKSkKKwkJcmV0dXJuIDA7CisKKwlza2JfcHV0KGJ1bmRsZXIsICh0b19wb3MgLSBtc2dfc2l6ZShidW5kbGVyX21zZykpICsgc2l6ZSk7CisJbWVtY3B5KGJ1bmRsZXItPmRhdGEgKyB0b19wb3MsIGJ1Zi0+ZGF0YSwgc2l6ZSk7CisJbXNnX3NldF9zaXplKGJ1bmRsZXJfbXNnLCB0b19wb3MgKyBzaXplKTsKKwltc2dfc2V0X21zZ2NudChidW5kbGVyX21zZywgbXNnX21zZ2NudChidW5kbGVyX21zZykgKyAxKTsKKwlkYmcoIlBhY2tlZCBtc2cgIyAldSgldSBvY3RldHMpIGludG8gcG9zICV1IGluIGJ1ZigjJXUpXG4iLAorCSAgICBtc2dfbXNnY250KGJ1bmRsZXJfbXNnKSwgc2l6ZSwgdG9fcG9zLCBtc2dfc2Vxbm8oYnVuZGxlcl9tc2cpKTsKKwltc2dfZGJnKG1zZywgIlBBQ0tEOiIpOworCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJbF9wdHItPnN0YXRzLnNlbnRfYnVuZGxlZCsrOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlua19hZGRfdG9fb3V0cXVldWUoc3RydWN0IGxpbmsgKmxfcHRyLCAKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgCisJCQkJCXN0cnVjdCB0aXBjX21zZyAqbXNnKQoreworCXUzMiBhY2sgPSBtb2QobF9wdHItPm5leHRfaW5fbm8gLSAxKTsKKwl1MzIgc2Vxbm8gPSBtb2QobF9wdHItPm5leHRfb3V0X25vKyspOworCisJbXNnX3NldF93b3JkKG1zZywgMiwgKChhY2sgPDwgMTYpIHwgc2Vxbm8pKTsKKwltc2dfc2V0X2JjYXN0X2Fjayhtc2csIGxfcHRyLT5vd25lci0+YmNsaW5rLmxhc3RfaW4pOworCWJ1Zi0+bmV4dCA9IE5VTEw7CisJaWYgKGxfcHRyLT5maXJzdF9vdXQpIHsKKwkJbF9wdHItPmxhc3Rfb3V0LT5uZXh0ID0gYnVmOworCQlsX3B0ci0+bGFzdF9vdXQgPSBidWY7CisJfSBlbHNlCisJCWxfcHRyLT5maXJzdF9vdXQgPSBsX3B0ci0+bGFzdF9vdXQgPSBidWY7CisJbF9wdHItPm91dF9xdWV1ZV9zaXplKys7Cit9CisKKy8qIAorICogbGlua19zZW5kX2J1ZigpIGlzIHRoZSAnZnVsbCBwYXRoJyBmb3IgbWVzc2FnZXMsIGNhbGxlZCBmcm9tIAorICogaW5zaWRlIFRJUEMgd2hlbiB0aGUgJ2Zhc3QgcGF0aCcgaW4gdGlwY19zZW5kX2J1ZgorICogaGFzIGZhaWxlZCwgYW5kIGZyb20gbGlua19zZW5kKCkKKyAqLworCitpbnQgbGlua19zZW5kX2J1ZihzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJdTMyIHNpemUgPSBtc2dfc2l6ZShtc2cpOworCXUzMiBkc3ogPSBtc2dfZGF0YV9zeihtc2cpOworCXUzMiBxdWV1ZV9zaXplID0gbF9wdHItPm91dF9xdWV1ZV9zaXplOworCXUzMiBpbXAgPSBtc2dfdG90X2ltcG9ydGFuY2UobXNnKTsKKwl1MzIgcXVldWVfbGltaXQgPSBsX3B0ci0+cXVldWVfbGltaXRbaW1wXTsKKwl1MzIgbWF4X3BhY2tldCA9IGxpbmtfbWF4X3BrdChsX3B0cik7CisKKwltc2dfc2V0X3ByZXZub2RlKG1zZywgdGlwY19vd25fYWRkcik7CS8qIElmIHJvdXRlZCBtZXNzYWdlICovCisKKwkvKiBNYXRjaCBtc2cgaW1wb3J0YW5jZSBhZ2FpbnN0IHF1ZXVlIGxpbWl0czogKi8KKworCWlmICh1bmxpa2VseShxdWV1ZV9zaXplID49IHF1ZXVlX2xpbWl0KSkgeworCQlpZiAoaW1wIDw9IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkgeworCQkJcmV0dXJuIGxpbmtfc2NoZWR1bGVfcG9ydChsX3B0ciwgbXNnX29yaWdwb3J0KG1zZyksCisJCQkJCQkgIHNpemUpOworCQl9CisJCW1zZ19kYmcobXNnLCAiVElQQzogQ29uZ2VzdGlvbiwgdGhyb3dpbmcgYXdheVxuIik7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCWlmIChpbXAgPiBDT05OX01BTkFHRVIpIHsKKwkJCXdhcm4oIlJlc2V0dGluZyA8JXM+LCBzZW5kIHF1ZXVlIGZ1bGwiLCBsX3B0ci0+bmFtZSk7CisJCQlsaW5rX3Jlc2V0KGxfcHRyKTsKKwkJfQorCQlyZXR1cm4gZHN6OworCX0KKworCS8qIEZyYWdtZW50YXRpb24gbmVlZGVkID8gKi8KKworCWlmIChzaXplID4gbWF4X3BhY2tldCkKKwkJcmV0dXJuIGxpbmtfc2VuZF9sb25nX2J1ZihsX3B0ciwgYnVmKTsKKworCS8qIFBhY2tldCBjYW4gYmUgcXVldWVkIG9yIHNlbnQ6ICovCisKKwlpZiAocXVldWVfc2l6ZSA+IGxfcHRyLT5zdGF0cy5tYXhfcXVldWVfc3opCisJCWxfcHRyLT5zdGF0cy5tYXhfcXVldWVfc3ogPSBxdWV1ZV9zaXplOworCisJaWYgKGxpa2VseSghYmVhcmVyX2Nvbmdlc3RlZChsX3B0ci0+Yl9wdHIsIGxfcHRyKSAmJiAKKwkJICAgIWxpbmtfY29uZ2VzdGVkKGxfcHRyKSkpIHsKKwkJbGlua19hZGRfdG9fb3V0cXVldWUobF9wdHIsIGJ1ZiwgbXNnKTsKKworCQlpZiAobGlrZWx5KGJlYXJlcl9zZW5kKGxfcHRyLT5iX3B0ciwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpKSkgeworCQkJbF9wdHItPnVuYWNrZWRfd2luZG93ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWJlYXJlcl9zY2hlZHVsZShsX3B0ci0+Yl9wdHIsIGxfcHRyKTsKKwkJCWxfcHRyLT5zdGF0cy5iZWFyZXJfY29uZ3MrKzsKKwkJCWxfcHRyLT5uZXh0X291dCA9IGJ1ZjsKKwkJfQorCQlyZXR1cm4gZHN6OworCX0KKwkvKiBDb25nZXN0aW9uOiBjYW4gbWVzc2FnZSBiZSBidW5kbGVkID86ICovCisKKwlpZiAoKG1zZ191c2VyKG1zZykgIT0gQ0hBTkdFT1ZFUl9QUk9UT0NPTCkgJiYKKwkgICAgKG1zZ191c2VyKG1zZykgIT0gTVNHX0ZSQUdNRU5URVIpKSB7CisKKwkJLyogVHJ5IGFkZGluZyBtZXNzYWdlIHRvIGFuIGV4aXN0aW5nIGJ1bmRsZSAqLworCisJCWlmIChsX3B0ci0+bmV4dF9vdXQgJiYgCisJCSAgICBsaW5rX2J1bmRsZV9idWYobF9wdHIsIGxfcHRyLT5sYXN0X291dCwgYnVmKSkgeworCQkJYmVhcmVyX3Jlc29sdmVfY29uZ2VzdGlvbihsX3B0ci0+Yl9wdHIsIGxfcHRyKTsKKwkJCXJldHVybiBkc3o7CisJCX0KKworCQkvKiBUcnkgY3JlYXRpbmcgYSBuZXcgYnVuZGxlICovCisKKwkJaWYgKHNpemUgPD0gbWF4X3BhY2tldCAqIDIgLyAzKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqYnVuZGxlciA9IGJ1Zl9hY3F1aXJlKG1heF9wYWNrZXQpOworCQkJc3RydWN0IHRpcGNfbXNnIGJ1bmRsZXJfaGRyOworCisJCQlpZiAoYnVuZGxlcikgeworCQkJCW1zZ19pbml0KCZidW5kbGVyX2hkciwgTVNHX0JVTkRMRVIsIE9QRU5fTVNHLAorCQkJCQkgVElQQ19PSywgSU5UX0hfU0laRSwgbF9wdHItPmFkZHIpOworCQkJCW1lbWNweShidW5kbGVyLT5kYXRhLCAodW5jaGFyICopJmJ1bmRsZXJfaGRyLCAKKwkJCQkgICAgICAgSU5UX0hfU0laRSk7CisJCQkJc2tiX3RyaW0oYnVuZGxlciwgSU5UX0hfU0laRSk7CisJCQkJbGlua19idW5kbGVfYnVmKGxfcHRyLCBidW5kbGVyLCBidWYpOworCQkJCWJ1ZiA9IGJ1bmRsZXI7CisJCQkJbXNnID0gYnVmX21zZyhidWYpOworCQkJCWxfcHRyLT5zdGF0cy5zZW50X2J1bmRsZXMrKzsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIWxfcHRyLT5uZXh0X291dCkKKwkJbF9wdHItPm5leHRfb3V0ID0gYnVmOworCWxpbmtfYWRkX3RvX291dHF1ZXVlKGxfcHRyLCBidWYsIG1zZyk7CisJYmVhcmVyX3Jlc29sdmVfY29uZ2VzdGlvbihsX3B0ci0+Yl9wdHIsIGxfcHRyKTsKKwlyZXR1cm4gZHN6OworfQorCisvKiAKKyAqIGxpbmtfc2VuZCgpOiBzYW1lIGFzIGxpbmtfc2VuZF9idWYoKSwgYnV0IHRoZSBsaW5rIHRvIHVzZSBoYXMgCisgKiBub3QgYmVlbiBzZWxlY3RlZCB5ZXQsIGFuZCB0aGUgdGhlIG93bmVyIG5vZGUgaXMgbm90IGxvY2tlZAorICogQ2FsbGVkIGJ5IFRJUEMgaW50ZXJuYWwgdXNlcnMsIGUuZy4gdGhlIG5hbWUgZGlzdHJpYnV0b3IKKyAqLworCitpbnQgbGlua19zZW5kKHN0cnVjdCBza19idWZmICpidWYsIHUzMiBkZXN0LCB1MzIgc2VsZWN0b3IpCit7CisJc3RydWN0IGxpbmsgKmxfcHRyOworCXN0cnVjdCBub2RlICpuX3B0cjsKKwlpbnQgcmVzID0gLUVMSU5LQ09ORzsKKworCXJlYWRfbG9ja19iaCgmbmV0X2xvY2spOworCW5fcHRyID0gbm9kZV9zZWxlY3QoZGVzdCwgc2VsZWN0b3IpOworCWlmIChuX3B0cikgeworCQlub2RlX2xvY2sobl9wdHIpOworCQlsX3B0ciA9IG5fcHRyLT5hY3RpdmVfbGlua3Nbc2VsZWN0b3IgJiAxXTsKKwkJZGJnKCJsaW5rX3NlbmQ6IGZvdW5kIGxpbmsgJXggZm9yIGRlc3QgJXhcbiIsIGxfcHRyLCBkZXN0KTsKKwkJaWYgKGxfcHRyKSB7CisJCQlyZXMgPSBsaW5rX3NlbmRfYnVmKGxfcHRyLCBidWYpOworCQl9CisJCW5vZGVfdW5sb2NrKG5fcHRyKTsKKwl9IGVsc2UgeworCQlkYmcoIkF0dGVtcHQgdG8gc2VuZCBtc2cgdG8gdW5rbm93biBub2RlOlxuIik7CisJCW1zZ19kYmcoYnVmX21zZyhidWYpLCI+Pj4iKTsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwl9CisJcmVhZF91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiAKKyAqIGxpbmtfc2VuZF9idWZfZmFzdDogRW50cnkgZm9yIGRhdGEgbWVzc2FnZXMgd2hlcmUgdGhlIAorICogZGVzdGluYXRpb24gbGluayBpcyBrbm93biBhbmQgdGhlIGhlYWRlciBpcyBjb21wbGV0ZSwKKyAqIGluY2x1c2l2ZSB0b3RhbCBtZXNzYWdlIGxlbmd0aC4gVmVyeSB0aW1lIGNyaXRpY2FsLgorICogTGluayBpcyBsb2NrZWQuIFJldHVybnMgdXNlciBkYXRhIGxlbmd0aC4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBsaW5rX3NlbmRfYnVmX2Zhc3Qoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAorCQkJCSAgICAgdTMyICp1c2VkX21heF9wa3QpCit7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJaW50IHJlcyA9IG1zZ19kYXRhX3N6KG1zZyk7CisKKwlpZiAobGlrZWx5KCFsaW5rX2Nvbmdlc3RlZChsX3B0cikpKSB7CisJCWlmIChsaWtlbHkobXNnX3NpemUobXNnKSA8PSBsaW5rX21heF9wa3QobF9wdHIpKSkgeworCQkJaWYgKGxpa2VseShsaXN0X2VtcHR5KCZsX3B0ci0+Yl9wdHItPmNvbmdfbGlua3MpKSkgeworCQkJCWxpbmtfYWRkX3RvX291dHF1ZXVlKGxfcHRyLCBidWYsIG1zZyk7CisJCQkJaWYgKGxpa2VseShiZWFyZXJfc2VuZChsX3B0ci0+Yl9wdHIsIGJ1ZiwKKwkJCQkJCSAgICAgICAmbF9wdHItPm1lZGlhX2FkZHIpKSkgeworCQkJCQlsX3B0ci0+dW5hY2tlZF93aW5kb3cgPSAwOworCQkJCQltc2dfZGJnKG1zZywiU0VOVF9GQVNUOiIpOworCQkJCQlyZXR1cm4gcmVzOworCQkJCX0KKwkJCQlkYmcoImZhaWxlZCBzZW50IGZhc3QuLi5cbiIpOworCQkJCWJlYXJlcl9zY2hlZHVsZShsX3B0ci0+Yl9wdHIsIGxfcHRyKTsKKwkJCQlsX3B0ci0+c3RhdHMuYmVhcmVyX2NvbmdzKys7CisJCQkJbF9wdHItPm5leHRfb3V0ID0gYnVmOworCQkJCXJldHVybiByZXM7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJKnVzZWRfbWF4X3BrdCA9IGxpbmtfbWF4X3BrdChsX3B0cik7CisJfQorCXJldHVybiBsaW5rX3NlbmRfYnVmKGxfcHRyLCBidWYpOyAgLyogQWxsIG90aGVyIGNhc2VzICovCit9CisKKy8qIAorICogdGlwY19zZW5kX2J1Zl9mYXN0OiBFbnRyeSBmb3IgZGF0YSBtZXNzYWdlcyB3aGVyZSB0aGUgCisgKiBkZXN0aW5hdGlvbiBub2RlIGlzIGtub3duIGFuZCB0aGUgaGVhZGVyIGlzIGNvbXBsZXRlLAorICogaW5jbHVzaXZlIHRvdGFsIG1lc3NhZ2UgbGVuZ3RoLgorICogUmV0dXJucyB1c2VyIGRhdGEgbGVuZ3RoLgorICovCitpbnQgdGlwY19zZW5kX2J1Zl9mYXN0KHN0cnVjdCBza19idWZmICpidWYsIHUzMiBkZXN0bm9kZSkKK3sKKwlzdHJ1Y3QgbGluayAqbF9wdHI7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCWludCByZXM7CisJdTMyIHNlbGVjdG9yID0gbXNnX29yaWdwb3J0KGJ1Zl9tc2coYnVmKSkgJiAxOworCXUzMiBkdW1teTsKKworCWlmIChkZXN0bm9kZSA9PSB0aXBjX293bl9hZGRyKQorCQlyZXR1cm4gcG9ydF9yZWN2X21zZyhidWYpOworCisJcmVhZF9sb2NrX2JoKCZuZXRfbG9jayk7CisJbl9wdHIgPSBub2RlX3NlbGVjdChkZXN0bm9kZSwgc2VsZWN0b3IpOworCWlmIChsaWtlbHkobl9wdHIpKSB7CisJCW5vZGVfbG9jayhuX3B0cik7CisJCWxfcHRyID0gbl9wdHItPmFjdGl2ZV9saW5rc1tzZWxlY3Rvcl07CisJCWRiZygic2VuZF9mYXN0OiBidWYgJXggc2VsZWN0ZWQgJXgsIGRlc3Rub2RlID0gJXhcbiIsCisJCSAgICBidWYsIGxfcHRyLCBkZXN0bm9kZSk7CisJCWlmIChsaWtlbHkobF9wdHIpKSB7CisJCQlyZXMgPSBsaW5rX3NlbmRfYnVmX2Zhc3QobF9wdHIsIGJ1ZiwgJmR1bW15KTsKKwkJCW5vZGVfdW5sb2NrKG5fcHRyKTsKKwkJCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisJCQlyZXR1cm4gcmVzOworCQl9CisJCW5vZGVfdW5sb2NrKG5fcHRyKTsKKwl9CisJcmVhZF91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwlyZXMgPSBtc2dfZGF0YV9zeihidWZfbXNnKGJ1ZikpOworCXRpcGNfcmVqZWN0X21zZyhidWYsIFRJUENfRVJSX05PX05PREUpOworCXJldHVybiByZXM7Cit9CisKKworLyogCisgKiBsaW5rX3NlbmRfc2VjdGlvbnNfZmFzdDogRW50cnkgZm9yIG1lc3NhZ2VzIHdoZXJlIHRoZSAKKyAqIGRlc3RpbmF0aW9uIHByb2Nlc3NvciBpcyBrbm93biBhbmQgdGhlIGhlYWRlciBpcyBjb21wbGV0ZSwKKyAqIGV4Y2VwdCBmb3IgdG90YWwgbWVzc2FnZSBsZW5ndGguIAorICogUmV0dXJucyB1c2VyIGRhdGEgbGVuZ3RoIG9yIGVycm5vLgorICovCitpbnQgbGlua19zZW5kX3NlY3Rpb25zX2Zhc3Qoc3RydWN0IHBvcnQgKnNlbmRlciwgCisJCQkgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCwKKwkJCSAgICBjb25zdCB1MzIgbnVtX3NlY3QsIAorCQkJICAgIHUzMiBkZXN0YWRkcikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKmhkciA9ICZzZW5kZXItPnB1YmwucGhkcjsKKwlzdHJ1Y3QgbGluayAqbF9wdHI7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3Qgbm9kZSAqbm9kZTsKKwlpbnQgcmVzOworCXUzMiBzZWxlY3RvciA9IG1zZ19vcmlncG9ydChoZHIpICYgMTsKKworCWFzc2VydChkZXN0YWRkciAhPSB0aXBjX293bl9hZGRyKTsKKworYWdhaW46CisJLyoKKwkgKiBUcnkgYnVpbGRpbmcgbWVzc2FnZSB1c2luZyBwb3J0J3MgbWF4X3BrdCBoaW50LgorCSAqIChNdXN0IG5vdCBob2xkIGFueSBsb2NrcyB3aGlsZSBidWlsZGluZyBtZXNzYWdlLikKKwkgKi8KKworCXJlcyA9IG1zZ19idWlsZChoZHIsIG1zZ19zZWN0LCBudW1fc2VjdCwgc2VuZGVyLT5tYXhfcGt0LAorCQkJIXNlbmRlci0+dXNlcl9wb3J0LCAmYnVmKTsKKworCXJlYWRfbG9ja19iaCgmbmV0X2xvY2spOworCW5vZGUgPSBub2RlX3NlbGVjdChkZXN0YWRkciwgc2VsZWN0b3IpOworCWlmIChsaWtlbHkobm9kZSkpIHsKKwkJbm9kZV9sb2NrKG5vZGUpOworCQlsX3B0ciA9IG5vZGUtPmFjdGl2ZV9saW5rc1tzZWxlY3Rvcl07CisJCWlmIChsaWtlbHkobF9wdHIpKSB7CisJCQlpZiAobGlrZWx5KGJ1ZikpIHsKKwkJCQlyZXMgPSBsaW5rX3NlbmRfYnVmX2Zhc3QobF9wdHIsIGJ1ZiwKKwkJCQkJCQkgJnNlbmRlci0+bWF4X3BrdCk7CisJCQkJaWYgKHVubGlrZWx5KHJlcyA8IDApKQorCQkJCQlidWZfZGlzY2FyZChidWYpOworZXhpdDoKKwkJCQlub2RlX3VubG9jayhub2RlKTsKKwkJCQlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOworCQkJCXJldHVybiByZXM7CisJCQl9CisKKwkJCS8qIEV4aXQgaWYgYnVpbGQgcmVxdWVzdCB3YXMgaW52YWxpZCAqLworCisJCQlpZiAodW5saWtlbHkocmVzIDwgMCkpCisJCQkJZ290byBleGl0OworCisJCQkvKiBFeGl0IGlmIGxpbmsgKG9yIGJlYXJlcikgaXMgY29uZ2VzdGVkICovCisKKwkJCWlmIChsaW5rX2Nvbmdlc3RlZChsX3B0cikgfHwgCisJCQkgICAgIWxpc3RfZW1wdHkoJmxfcHRyLT5iX3B0ci0+Y29uZ19saW5rcykpIHsKKwkJCQlyZXMgPSBsaW5rX3NjaGVkdWxlX3BvcnQobF9wdHIsCisJCQkJCQkJIHNlbmRlci0+cHVibC5yZWYsIHJlcyk7CisJCQkJZ290byBleGl0OworCQkJfQorCisJCQkvKiAKKwkJCSAqIE1lc3NhZ2Ugc2l6ZSBleGNlZWRzIG1heF9wa3QgaGludDsgdXBkYXRlIGhpbnQsCisJCQkgKiB0aGVuIHJlLXRyeSBmYXN0IHBhdGggb3IgZnJhZ21lbnQgdGhlIG1lc3NhZ2UKKwkJCSAqLworCisJCQlzZW5kZXItPm1heF9wa3QgPSBsaW5rX21heF9wa3QobF9wdHIpOworCQkJbm9kZV91bmxvY2sobm9kZSk7CisJCQlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOworCisKKwkJCWlmICgobXNnX2hkcl9zeihoZHIpICsgcmVzKSA8PSBzZW5kZXItPm1heF9wa3QpCisJCQkJZ290byBhZ2FpbjsKKworCQkJcmV0dXJuIGxpbmtfc2VuZF9zZWN0aW9uc19sb25nKHNlbmRlciwgbXNnX3NlY3QsCisJCQkJCQkgICAgICAgbnVtX3NlY3QsIGRlc3RhZGRyKTsKKwkJfQorCQlub2RlX3VubG9jayhub2RlKTsKKwl9CisJcmVhZF91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKworCS8qIENvdWxkbid0IGZpbmQgYSBsaW5rIHRvIHRoZSBkZXN0aW5hdGlvbiBub2RlICovCisKKwlpZiAoYnVmKQorCQlyZXR1cm4gdGlwY19yZWplY3RfbXNnKGJ1ZiwgVElQQ19FUlJfTk9fTk9ERSk7CisJaWYgKHJlcyA+PSAwKQorCQlyZXR1cm4gcG9ydF9yZWplY3Rfc2VjdGlvbnMoc2VuZGVyLCBoZHIsIG1zZ19zZWN0LCBudW1fc2VjdCwKKwkJCQkJICAgIFRJUENfRVJSX05PX05PREUpOworCXJldHVybiByZXM7Cit9CisKKy8qIAorICogbGlua19zZW5kX3NlY3Rpb25zX2xvbmcoKTogRW50cnkgZm9yIGxvbmcgbWVzc2FnZXMgd2hlcmUgdGhlIAorICogZGVzdGluYXRpb24gbm9kZSBpcyBrbm93biBhbmQgdGhlIGhlYWRlciBpcyBjb21wbGV0ZSwKKyAqIGluY2x1c2l2ZSB0b3RhbCBtZXNzYWdlIGxlbmd0aC4gCisgKiBMaW5rIGFuZCBiZWFyZXIgY29uZ2VzdGlvbiBzdGF0dXMgaGF2ZSBiZWVuIGNoZWNrZWQgdG8gYmUgb2ssCisgKiBhbmQgYXJlIGlnbm9yZWQgaWYgdGhleSBjaGFuZ2UuCisgKgorICogTm90ZSB0aGF0IGZyYWdtZW50cyBkbyBub3QgdXNlIHRoZSBmdWxsIGxpbmsgTVRVIHNvIHRoYXQgdGhleSB3b24ndCBoYXZlCisgKiB0byB1bmRlcmdvIHJlZnJhZ21lbnRhdGlvbiBpZiBsaW5rIGNoYW5nZW92ZXIgY2F1c2VzIHRoZW0gdG8gYmUgc2VudAorICogb3ZlciBhbm90aGVyIGxpbmsgd2l0aCBhbiBhZGRpdGlvbmFsIHR1bm5lbCBoZWFkZXIgYWRkZWQgYXMgcHJlZml4LgorICogKFJlZnJhZ21lbnRhdGlvbiB3aWxsIHN0aWxsIG9jY3VyIGlmIHRoZSBvdGhlciBsaW5rIGhhcyBhIHNtYWxsZXIgTVRVLikKKyAqCisgKiBSZXR1cm5zIHVzZXIgZGF0YSBsZW5ndGggb3IgZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgbGlua19zZW5kX3NlY3Rpb25zX2xvbmcoc3RydWN0IHBvcnQgKnNlbmRlciwKKwkJCQkgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LAorCQkJCSAgIHUzMiBudW1fc2VjdCwKKwkJCQkgICB1MzIgZGVzdGFkZHIpCit7CisJc3RydWN0IGxpbmsgKmxfcHRyOworCXN0cnVjdCBub2RlICpub2RlOworCXN0cnVjdCB0aXBjX21zZyAqaGRyID0gJnNlbmRlci0+cHVibC5waGRyOworCXUzMiBkc3ogPSBtc2dfZGF0YV9zeihoZHIpOworCXUzMiBtYXhfcGt0LGZyYWdtX3N6LHJlc3Q7CisJc3RydWN0IHRpcGNfbXNnIGZyYWdtX2hkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCpidWZfY2hhaW4sKnByZXY7CisJdTMyIGZyYWdtX2NycyxmcmFnbV9yZXN0LGhzeixzZWN0X3Jlc3Q7CisJY29uc3QgdW5jaGFyICpzZWN0X2NyczsKKwlpbnQgY3Vycl9zZWN0OworCXUzMiBmcmFnbV9ubzsKKworYWdhaW46CisJZnJhZ21fbm8gPSAxOworCW1heF9wa3QgPSBzZW5kZXItPm1heF9wa3QgLSBJTlRfSF9TSVpFOyAgCisJCS8qIGxlYXZlIHJvb20gZm9yIHR1bm5lbCBoZWFkZXIgaW4gY2FzZSBvZiBsaW5rIGNoYW5nZW92ZXIgKi8KKwlmcmFnbV9zeiA9IG1heF9wa3QgLSBJTlRfSF9TSVpFOyAKKwkJLyogbGVhdmUgcm9vbSBmb3IgZnJhZ21lbnRhdGlvbiBoZWFkZXIgaW4gZWFjaCBmcmFnbWVudCAqLworCXJlc3QgPSBkc3o7CisJZnJhZ21fY3JzID0gMDsKKwlmcmFnbV9yZXN0ID0gMDsKKwlzZWN0X3Jlc3QgPSAwOworCXNlY3RfY3JzID0gMDsKKwljdXJyX3NlY3QgPSAtMTsKKworCS8qIFByZXBhcmUgcmV1c2FibGUgZnJhZ21lbnQgaGVhZGVyOiAqLworCisJbXNnX2RiZyhoZHIsICI+RlJBR01FTlRJTkc+Iik7CisJbXNnX2luaXQoJmZyYWdtX2hkciwgTVNHX0ZSQUdNRU5URVIsIEZJUlNUX0ZSQUdNRU5ULAorCQkgVElQQ19PSywgSU5UX0hfU0laRSwgbXNnX2Rlc3Rub2RlKGhkcikpOworCW1zZ19zZXRfbGlua19zZWxlY3RvcigmZnJhZ21faGRyLCBzZW5kZXItPnB1YmwucmVmKTsKKwltc2dfc2V0X3NpemUoJmZyYWdtX2hkciwgbWF4X3BrdCk7CisJbXNnX3NldF9mcmFnbV9ubygmZnJhZ21faGRyLCAxKTsKKworCS8qIFByZXBhcmUgaGVhZGVyIG9mIGZpcnN0IGZyYWdtZW50OiAqLworCisJYnVmX2NoYWluID0gYnVmID0gYnVmX2FjcXVpcmUobWF4X3BrdCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCWJ1Zi0+bmV4dCA9IE5VTEw7CisJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKSZmcmFnbV9oZHIsIElOVF9IX1NJWkUpOworCWhzeiA9IG1zZ19oZHJfc3ooaGRyKTsKKwltZW1jcHkoYnVmLT5kYXRhICsgSU5UX0hfU0laRSwgKHVuY2hhciAqKWhkciwgaHN6KTsKKwltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgIj5CVUlMRD4iKTsKKworCS8qIENob3AgdXAgbWVzc2FnZTogKi8KKworCWZyYWdtX2NycyA9IElOVF9IX1NJWkUgKyBoc3o7CisJZnJhZ21fcmVzdCA9IGZyYWdtX3N6IC0gaHN6OworCisJZG8gewkJLyogRm9yIGFsbCBzZWN0aW9ucyAqLworCQl1MzIgc3o7CisKKwkJaWYgKCFzZWN0X3Jlc3QpIHsKKwkJCXNlY3RfcmVzdCA9IG1zZ19zZWN0WysrY3Vycl9zZWN0XS5pb3ZfbGVuOworCQkJc2VjdF9jcnMgPSAoY29uc3QgdW5jaGFyICopbXNnX3NlY3RbY3Vycl9zZWN0XS5pb3ZfYmFzZTsKKwkJfQorCisJCWlmIChzZWN0X3Jlc3QgPCBmcmFnbV9yZXN0KQorCQkJc3ogPSBzZWN0X3Jlc3Q7CisJCWVsc2UKKwkJCXN6ID0gZnJhZ21fcmVzdDsKKworCQlpZiAobGlrZWx5KCFzZW5kZXItPnVzZXJfcG9ydCkpIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihidWYtPmRhdGEgKyBmcmFnbV9jcnMsIHNlY3RfY3JzLCBzeikpIHsKK2Vycm9yOgorCQkJCWZvciAoOyBidWZfY2hhaW47IGJ1Zl9jaGFpbiA9IGJ1ZikgeworCQkJCQlidWYgPSBidWZfY2hhaW4tPm5leHQ7CisJCQkJCWJ1Zl9kaXNjYXJkKGJ1Zl9jaGFpbik7CisJCQkJfQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQl9IGVsc2UKKwkJCW1lbWNweShidWYtPmRhdGEgKyBmcmFnbV9jcnMsIHNlY3RfY3JzLCBzeik7CisKKwkJc2VjdF9jcnMgKz0gc3o7CisJCXNlY3RfcmVzdCAtPSBzejsKKwkJZnJhZ21fY3JzICs9IHN6OworCQlmcmFnbV9yZXN0IC09IHN6OworCQlyZXN0IC09IHN6OworCisJCWlmICghZnJhZ21fcmVzdCAmJiByZXN0KSB7CisKKwkJCS8qIEluaXRpYXRlIG5ldyBmcmFnbWVudDogKi8KKwkJCWlmIChyZXN0IDw9IGZyYWdtX3N6KSB7CisJCQkJZnJhZ21fc3ogPSByZXN0OworCQkJCW1zZ19zZXRfdHlwZSgmZnJhZ21faGRyLExBU1RfRlJBR01FTlQpOworCQkJfSBlbHNlIHsKKwkJCQltc2dfc2V0X3R5cGUoJmZyYWdtX2hkciwgRlJBR01FTlQpOworCQkJfQorCQkJbXNnX3NldF9zaXplKCZmcmFnbV9oZHIsIGZyYWdtX3N6ICsgSU5UX0hfU0laRSk7CisJCQltc2dfc2V0X2ZyYWdtX25vKCZmcmFnbV9oZHIsICsrZnJhZ21fbm8pOworCQkJcHJldiA9IGJ1ZjsKKwkJCWJ1ZiA9IGJ1Zl9hY3F1aXJlKGZyYWdtX3N6ICsgSU5UX0hfU0laRSk7CisJCQlpZiAoIWJ1ZikKKwkJCQlnb3RvIGVycm9yOworCisJCQlidWYtPm5leHQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlwcmV2LT5uZXh0ID0gYnVmOworCQkJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKSZmcmFnbV9oZHIsIElOVF9IX1NJWkUpOworCQkJZnJhZ21fY3JzID0gSU5UX0hfU0laRTsKKwkJCWZyYWdtX3Jlc3QgPSBmcmFnbV9zejsKKwkJCW1zZ19kYmcoYnVmX21zZyhidWYpLCIgID5CVUlMRD4iKTsKKwkJfQorCX0KKwl3aGlsZSAocmVzdCA+IDApOworCisJLyogCisJICogTm93IHdlIGhhdmUgYSBidWZmZXIgY2hhaW4uIFNlbGVjdCBhIGxpbmsgYW5kIGNoZWNrCisJICogdGhhdCBwYWNrZXQgc2l6ZSBpcyBzdGlsbCBPSworCSAqLworCW5vZGUgPSBub2RlX3NlbGVjdChkZXN0YWRkciwgc2VuZGVyLT5wdWJsLnJlZiAmIDEpOworCWlmIChsaWtlbHkobm9kZSkpIHsKKwkJbm9kZV9sb2NrKG5vZGUpOworCQlsX3B0ciA9IG5vZGUtPmFjdGl2ZV9saW5rc1tzZW5kZXItPnB1YmwucmVmICYgMV07CisJCWlmICghbF9wdHIpIHsKKwkJCW5vZGVfdW5sb2NrKG5vZGUpOworCQkJZ290byByZWplY3Q7CisJCX0KKwkJaWYgKGxpbmtfbWF4X3BrdChsX3B0cikgPCBtYXhfcGt0KSB7CisJCQlzZW5kZXItPm1heF9wa3QgPSBsaW5rX21heF9wa3QobF9wdHIpOworCQkJbm9kZV91bmxvY2sobm9kZSk7CisJCQlmb3IgKDsgYnVmX2NoYWluOyBidWZfY2hhaW4gPSBidWYpIHsKKwkJCQlidWYgPSBidWZfY2hhaW4tPm5leHQ7CisJCQkJYnVmX2Rpc2NhcmQoYnVmX2NoYWluKTsKKwkJCX0KKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9IGVsc2UgeworcmVqZWN0OgorCQlmb3IgKDsgYnVmX2NoYWluOyBidWZfY2hhaW4gPSBidWYpIHsKKwkJCWJ1ZiA9IGJ1Zl9jaGFpbi0+bmV4dDsKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zl9jaGFpbik7CisJCX0KKwkJcmV0dXJuIHBvcnRfcmVqZWN0X3NlY3Rpb25zKHNlbmRlciwgaGRyLCBtc2dfc2VjdCwgbnVtX3NlY3QsCisJCQkJCSAgICBUSVBDX0VSUl9OT19OT0RFKTsKKwl9CisKKwkvKiBBcHBlbmQgd2hvbGUgY2hhaW4gdG8gc2VuZCBxdWV1ZTogKi8KKworCWJ1ZiA9IGJ1Zl9jaGFpbjsKKwlsX3B0ci0+bG9uZ19tc2dfc2VxX25vID0gbW9kKGxfcHRyLT5sb25nX21zZ19zZXFfbm8gKyAxKTsKKwlpZiAoIWxfcHRyLT5uZXh0X291dCkKKwkJbF9wdHItPm5leHRfb3V0ID0gYnVmX2NoYWluOworCWxfcHRyLT5zdGF0cy5zZW50X2ZyYWdtZW50ZWQrKzsKKwl3aGlsZSAoYnVmKSB7CisJCXN0cnVjdCBza19idWZmICpuZXh0ID0gYnVmLT5uZXh0OworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKworCQlsX3B0ci0+c3RhdHMuc2VudF9mcmFnbWVudHMrKzsKKwkJbXNnX3NldF9sb25nX21zZ25vKG1zZywgbF9wdHItPmxvbmdfbXNnX3NlcV9ubyk7CisJCWxpbmtfYWRkX3RvX291dHF1ZXVlKGxfcHRyLCBidWYsIG1zZyk7CisJCW1zZ19kYmcobXNnLCAiPkFERD4iKTsKKwkJYnVmID0gbmV4dDsKKwl9CisKKwkvKiBTZW5kIGl0LCBpZiBwb3NzaWJsZTogKi8KKworCWxpbmtfcHVzaF9xdWV1ZShsX3B0cik7CisJbm9kZV91bmxvY2sobm9kZSk7CisJcmV0dXJuIGRzejsKK30KKworLyogCisgKiBsaW5rX3B1c2hfcGFja2V0OiBQdXNoIG9uZSB1bnNlbnQgcGFja2V0IHRvIHRoZSBtZWRpYQorICovCit1MzIgbGlua19wdXNoX3BhY2tldChzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGxfcHRyLT5maXJzdF9vdXQ7CisJdTMyIHJfcV9zaXplID0gbF9wdHItPnJldHJhbnNtX3F1ZXVlX3NpemU7CisJdTMyIHJfcV9oZWFkID0gbF9wdHItPnJldHJhbnNtX3F1ZXVlX2hlYWQ7CisKKwkvKiBTdGVwIHRvIHBvc2l0aW9uIHdoZXJlIHJldHJhbnNtaXNzaW9uIGZhaWxlZCwgaWYgYW55LCAgICAqLworCS8qIGNvbnNpZGVyIHRoYXQgYnVmZmVycyBtYXkgaGF2ZSBiZWVuIHJlbGVhc2VkIGluIG1lYW50aW1lICovCisKKwlpZiAocl9xX3NpemUgJiYgYnVmKSB7CisJCXUzMiBsYXN0ID0gbGVzc2VyKG1vZChyX3FfaGVhZCArIHJfcV9zaXplKSwgCisJCQkJICBsaW5rX2xhc3Rfc2VudChsX3B0cikpOworCQl1MzIgZmlyc3QgPSBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKKworCQl3aGlsZSAoYnVmICYmIGxlc3MoZmlyc3QsIHJfcV9oZWFkKSkgeworCQkJZmlyc3QgPSBtb2QoZmlyc3QgKyAxKTsKKwkJCWJ1ZiA9IGJ1Zi0+bmV4dDsKKwkJfQorCQlsX3B0ci0+cmV0cmFuc21fcXVldWVfaGVhZCA9IHJfcV9oZWFkID0gZmlyc3Q7CisJCWxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9zaXplID0gcl9xX3NpemUgPSBtb2QobGFzdCAtIGZpcnN0KTsKKwl9CisKKwkvKiBDb250aW51ZSByZXRyYW5zbWlzc2lvbiBub3csIGlmIHRoZXJlIGlzIGFueXRoaW5nOiAqLworCisJaWYgKHJfcV9zaXplICYmIGJ1ZiAmJiAhc2tiX2Nsb25lZChidWYpKSB7CisJCW1zZ19zZXRfYWNrKGJ1Zl9tc2coYnVmKSwgbW9kKGxfcHRyLT5uZXh0X2luX25vIC0gMSkpOworCQltc2dfc2V0X2JjYXN0X2FjayhidWZfbXNnKGJ1ZiksIGxfcHRyLT5vd25lci0+YmNsaW5rLmxhc3RfaW4pOyAKKwkJaWYgKGJlYXJlcl9zZW5kKGxfcHRyLT5iX3B0ciwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpKSB7CisJCQltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgIj5ERUYtUkVUUj4iKTsKKwkJCWxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9oZWFkID0gbW9kKCsrcl9xX2hlYWQpOworCQkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX3NpemUgPSAtLXJfcV9zaXplOworCQkJbF9wdHItPnN0YXRzLnJldHJhbnNtaXR0ZWQrKzsKKwkJCXJldHVybiBUSVBDX09LOworCQl9IGVsc2UgeworCQkJbF9wdHItPnN0YXRzLmJlYXJlcl9jb25ncysrOworCQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICJ8PkRFRi1SRVRSPiIpOworCQkJcmV0dXJuIFBVU0hfRkFJTEVEOworCQl9CisJfQorCisJLyogU2VuZCBkZWZlcnJlZCBwcm90b2NvbCBtZXNzYWdlLCBpZiBhbnk6ICovCisKKwlidWYgPSBsX3B0ci0+cHJvdG9fbXNnX3F1ZXVlOworCWlmIChidWYpIHsKKwkJbXNnX3NldF9hY2soYnVmX21zZyhidWYpLCBtb2QobF9wdHItPm5leHRfaW5fbm8gLSAxKSk7CisJCW1zZ19zZXRfYmNhc3RfYWNrKGJ1Zl9tc2coYnVmKSxsX3B0ci0+b3duZXItPmJjbGluay5sYXN0X2luKTsgCisJCWlmIChiZWFyZXJfc2VuZChsX3B0ci0+Yl9wdHIsIGJ1ZiwgJmxfcHRyLT5tZWRpYV9hZGRyKSkgeworCQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI+REVGLVBST1Q+Iik7CisJCQlsX3B0ci0+dW5hY2tlZF93aW5kb3cgPSAwOworCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJCWxfcHRyLT5wcm90b19tc2dfcXVldWUgPSAwOworCQkJcmV0dXJuIFRJUENfT0s7CisJCX0gZWxzZSB7CisJCQltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgInw+REVGLVBST1Q+Iik7CisJCQlsX3B0ci0+c3RhdHMuYmVhcmVyX2NvbmdzKys7CisJCQlyZXR1cm4gUFVTSF9GQUlMRUQ7CisJCX0KKwl9CisKKwkvKiBTZW5kIG9uZSBkZWZlcnJlZCBkYXRhIG1lc3NhZ2UsIGlmIHNlbmQgd2luZG93IG5vdCBmdWxsOiAqLworCisJYnVmID0gbF9wdHItPm5leHRfb3V0OworCWlmIChidWYpIHsKKwkJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJCXUzMiBuZXh0ID0gbXNnX3NlcW5vKG1zZyk7CisJCXUzMiBmaXJzdCA9IG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5maXJzdF9vdXQpKTsKKworCQlpZiAobW9kKG5leHQgLSBmaXJzdCkgPCBsX3B0ci0+cXVldWVfbGltaXRbMF0pIHsKKwkJCW1zZ19zZXRfYWNrKG1zZywgbW9kKGxfcHRyLT5uZXh0X2luX25vIC0gMSkpOworCQkJbXNnX3NldF9iY2FzdF9hY2sobXNnLCBsX3B0ci0+b3duZXItPmJjbGluay5sYXN0X2luKTsgCisJCQlpZiAoYmVhcmVyX3NlbmQobF9wdHItPmJfcHRyLCBidWYsICZsX3B0ci0+bWVkaWFfYWRkcikpIHsKKwkJCQlpZiAobXNnX3VzZXIobXNnKSA9PSBNU0dfQlVORExFUikKKwkJCQkJbXNnX3NldF90eXBlKG1zZywgQ0xPU0VEX01TRyk7CisJCQkJbXNnX2RiZyhtc2csICI+UFVTSC1EQVRBPiIpOworCQkJCWxfcHRyLT5uZXh0X291dCA9IGJ1Zi0+bmV4dDsKKwkJCQlyZXR1cm4gVElQQ19PSzsKKwkJCX0gZWxzZSB7CisJCQkJbXNnX2RiZyhtc2csICJ8UFVTSC1EQVRBfCIpOworCQkJCWxfcHRyLT5zdGF0cy5iZWFyZXJfY29uZ3MrKzsKKwkJCQlyZXR1cm4gUFVTSF9GQUlMRUQ7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIFBVU0hfRklOSVNIRUQ7Cit9CisKKy8qCisgKiBwdXNoX3F1ZXVlKCk6IHB1c2ggb3V0IHRoZSB1bnNlbnQgbWVzc2FnZXMgb2YgYSBsaW5rIHdoZXJlCisgKiAgICAgICAgICAgICAgIGNvbmdlc3Rpb24gaGFzIGFiYXRlZC4gTm9kZSBpcyBsb2NrZWQKKyAqLwordm9pZCBsaW5rX3B1c2hfcXVldWUoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXUzMiByZXM7CisKKwlpZiAoYmVhcmVyX2Nvbmdlc3RlZChsX3B0ci0+Yl9wdHIsIGxfcHRyKSkKKwkJcmV0dXJuOworCisJZG8geworCQlyZXMgPSBsaW5rX3B1c2hfcGFja2V0KGxfcHRyKTsKKwl9CisJd2hpbGUgKHJlcyA9PSBUSVBDX09LKTsKKwlpZiAocmVzID09IFBVU0hfRkFJTEVEKQorCQliZWFyZXJfc2NoZWR1bGUobF9wdHItPmJfcHRyLCBsX3B0cik7Cit9CisKK3ZvaWQgbGlua19yZXRyYW5zbWl0KHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgCisJCSAgICAgdTMyIHJldHJhbnNtaXRzKQoreworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCisJZGJnKCJSZXRyYW5zbWl0dGluZyAldSBpbiBsaW5rICV4XG4iLCByZXRyYW5zbWl0cywgbF9wdHIpOworCisJaWYgKGJlYXJlcl9jb25nZXN0ZWQobF9wdHItPmJfcHRyLCBsX3B0cikgJiYgYnVmICYmICFza2JfY2xvbmVkKGJ1ZikpIHsKKwkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI+Tk9fUkVUUi0+QkNPTkc+Iik7CisJCWRiZ19wcmludF9saW5rKGxfcHRyLCAiICAgIik7CisJCWxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9oZWFkID0gbXNnX3NlcW5vKGJ1Zl9tc2coYnVmKSk7CisJCWxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9zaXplID0gcmV0cmFuc21pdHM7CisJCXJldHVybjsKKwl9CisJd2hpbGUgKHJldHJhbnNtaXRzICYmIChidWYgIT0gbF9wdHItPm5leHRfb3V0KSAmJiBidWYgJiYgIXNrYl9jbG9uZWQoYnVmKSkgeworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1zZ19zZXRfYWNrKG1zZywgbW9kKGxfcHRyLT5uZXh0X2luX25vIC0gMSkpOworCQltc2dfc2V0X2JjYXN0X2Fjayhtc2csIGxfcHRyLT5vd25lci0+YmNsaW5rLmxhc3RfaW4pOyAKKwkJaWYgKGJlYXJlcl9zZW5kKGxfcHRyLT5iX3B0ciwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYXRjaCBpZiByZXRyYW5zbWlzc2lvbnMgZmFpbCByZXBlYXRlZGx5OiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfcHRyLT5sYXN0X3JldHJhbnNtaXR0ZWQgPT0gbXNnX3NlcW5vKG1zZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrbF9wdHItPnN0YWxlX2NvdW50ID4gMTAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX3ByaW50KENPTlMsIGJ1Zl9tc2coYnVmKSwgIj5SRVRSPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8oIi4uLlJldHJhbnNtaXR0ZWQgJXUgdGltZXNcbiIsCisJCQkJCSAgICAgbF9wdHItPnN0YWxlX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX3ByaW50KGxfcHRyLCBDT05TLCAiUmVzZXR0aW5nIExpbmtcbiIpOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX3Jlc2V0KGxfcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wdHItPnN0YWxlX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfcHRyLT5sYXN0X3JldHJhbnNtaXR0ZWQgPSBtc2dfc2Vxbm8obXNnKTsKKworCQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI+UkVUUj4iKTsKKwkJCWJ1ZiA9IGJ1Zi0+bmV4dDsKKwkJCXJldHJhbnNtaXRzLS07CisJCQlsX3B0ci0+c3RhdHMucmV0cmFuc21pdHRlZCsrOworCQl9IGVsc2UgeworCQkJYmVhcmVyX3NjaGVkdWxlKGxfcHRyLT5iX3B0ciwgbF9wdHIpOworCQkJbF9wdHItPnN0YXRzLmJlYXJlcl9jb25ncysrOworCQkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX2hlYWQgPSBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKKwkJCWxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9zaXplID0gcmV0cmFuc21pdHM7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbF9wdHItPnJldHJhbnNtX3F1ZXVlX2hlYWQgPSBsX3B0ci0+cmV0cmFuc21fcXVldWVfc2l6ZSA9IDA7Cit9CisKKy8qIAorICogbGlua19yZWN2X25vbl9zZXE6IFJlY2VpdmUgcGFja2V0cyB3aGljaCBhcmUgb3V0c2lkZQorICogICAgICAgICAgICAgICAgICAgIHRoZSBsaW5rIHNlcXVlbmNlIGZsb3cKKyAqLworCitzdGF0aWMgdm9pZCBsaW5rX3JlY3Zfbm9uX3NlcShzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCisJaWYgKG1zZ191c2VyKG1zZykgPT0gIExJTktfQ09ORklHKQorCQlkaXNjX3JlY3ZfbXNnKGJ1Zik7CisJZWxzZQorCQliY2xpbmtfcmVjdl9wa3QoYnVmKTsKK30KKworLyoqIAorICogbGlua19pbnNlcnRfZGVmZXJyZWRfcXVldWUgLSBpbnNlcnQgZGVmZXJyZWQgbWVzc2FnZXMgYmFjayBpbnRvIHJlY2VpdmUgY2hhaW4KKyAqLworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmxpbmtfaW5zZXJ0X2RlZmVycmVkX3F1ZXVlKHN0cnVjdCBsaW5rICpsX3B0ciwgCisJCQkJCQkgIHN0cnVjdCBza19idWZmICpidWYpCit7CisJdTMyIHNlcV9ubzsKKworCWlmIChsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luID09IE5VTEwpCisJCXJldHVybiBidWY7CisKKwlzZXFfbm8gPSBtc2dfc2Vxbm8oYnVmX21zZyhsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luKSk7CisJaWYgKHNlcV9ubyA9PSBtb2QobF9wdHItPm5leHRfaW5fbm8pKSB7CisJCWxfcHRyLT5uZXdlc3RfZGVmZXJyZWRfaW4tPm5leHQgPSBidWY7CisJCWJ1ZiA9IGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW47CisJCWxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4gPSBOVUxMOworCQlsX3B0ci0+ZGVmZXJyZWRfaW5xdWV1ZV9zeiA9IDA7CisJfQorCXJldHVybiBidWY7Cit9CisKK3ZvaWQgdGlwY19yZWN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqaGVhZCwgc3RydWN0IHRpcGNfYmVhcmVyICp0Yl9wdHIpCit7CisJcmVhZF9sb2NrX2JoKCZuZXRfbG9jayk7CisJd2hpbGUgKGhlYWQpIHsKKwkJc3RydWN0IGJlYXJlciAqYl9wdHI7CisJCXN0cnVjdCBub2RlICpuX3B0cjsKKwkJc3RydWN0IGxpbmsgKmxfcHRyOworCQlzdHJ1Y3Qgc2tfYnVmZiAqY3JzOworCQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaGVhZDsKKwkJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJCXUzMiBzZXFfbm8gPSBtc2dfc2Vxbm8obXNnKTsKKwkJdTMyIGFja2QgPSBtc2dfYWNrKG1zZyk7CisJCXUzMiByZWxlYXNlZCA9IDA7CisJCWludCB0eXBlOworCisJCWJfcHRyID0gKHN0cnVjdCBiZWFyZXIgKil0Yl9wdHI7CisJCVRJUENfU0tCX0NCKGJ1ZiktPmhhbmRsZSA9IGJfcHRyOworCisJCWhlYWQgPSBoZWFkLT5uZXh0OworCQlpZiAodW5saWtlbHkobXNnX3ZlcnNpb24obXNnKSAhPSBUSVBDX1ZFUlNJT04pKQorCQkJZ290byBjb250OworI2lmIDAKKwkJaWYgKG1zZ191c2VyKG1zZykgIT0gTElOS19QUk9UT0NPTCkKKyNlbmRpZgorCQkJbXNnX2RiZyhtc2csIjxSRUM8Iik7CisKKwkJaWYgKHVubGlrZWx5KG1zZ19ub25fc2VxKG1zZykpKSB7CisJCQlsaW5rX3JlY3Zfbm9uX3NlcShidWYpOworCQkJY29udGludWU7CisJCX0KKwkJbl9wdHIgPSBub2RlX2ZpbmQobXNnX3ByZXZub2RlKG1zZykpOworCQlpZiAodW5saWtlbHkoIW5fcHRyKSkKKwkJCWdvdG8gY29udDsKKworCQlub2RlX2xvY2sobl9wdHIpOworCQlsX3B0ciA9IG5fcHRyLT5saW5rc1tiX3B0ci0+aWRlbnRpdHldOworCQlpZiAodW5saWtlbHkoIWxfcHRyKSkgeworCQkJbm9kZV91bmxvY2sobl9wdHIpOworCQkJZ290byBjb250OworCQl9CisJCS8qIAorCQkgKiBSZWxlYXNlIGFja2VkIG1lc3NhZ2VzIAorCQkgKi8KKwkJaWYgKGxlc3Mobl9wdHItPmJjbGluay5hY2tlZCwgbXNnX2JjYXN0X2Fjayhtc2cpKSkgeworCQkJaWYgKG5vZGVfaXNfdXAobl9wdHIpICYmIG5fcHRyLT5iY2xpbmsuc3VwcG9ydGVkKQorCQkJCWJjbGlua19hY2tub3dsZWRnZShuX3B0ciwgbXNnX2JjYXN0X2Fjayhtc2cpKTsKKwkJfQorCisJCWNycyA9IGxfcHRyLT5maXJzdF9vdXQ7CisJCXdoaWxlICgoY3JzICE9IGxfcHRyLT5uZXh0X291dCkgJiYgCisJCSAgICAgICBsZXNzX2VxKG1zZ19zZXFubyhidWZfbXNnKGNycykpLCBhY2tkKSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBjcnMtPm5leHQ7CisKKwkJCWJ1Zl9kaXNjYXJkKGNycyk7CisJCQljcnMgPSBuZXh0OworCQkJcmVsZWFzZWQrKzsKKwkJfQorCQlpZiAocmVsZWFzZWQpIHsKKwkJCWxfcHRyLT5maXJzdF9vdXQgPSBjcnM7CisJCQlsX3B0ci0+b3V0X3F1ZXVlX3NpemUgLT0gcmVsZWFzZWQ7CisJCX0KKwkJaWYgKHVubGlrZWx5KGxfcHRyLT5uZXh0X291dCkpCisJCQlsaW5rX3B1c2hfcXVldWUobF9wdHIpOworCQlpZiAodW5saWtlbHkoIWxpc3RfZW1wdHkoJmxfcHRyLT53YWl0aW5nX3BvcnRzKSkpCisJCQlsaW5rX3dha2V1cF9wb3J0cyhsX3B0ciwgMCk7CisJCWlmICh1bmxpa2VseSgrK2xfcHRyLT51bmFja2VkX3dpbmRvdyA+PSBUSVBDX01JTl9MSU5LX1dJTikpIHsKKwkJCWxfcHRyLT5zdGF0cy5zZW50X2Fja3MrKzsKKwkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgMCwgMCwgMCwgMCwgMCk7CisJCX0KKworcHJvdG9jb2xfY2hlY2s6CisJCWlmIChsaWtlbHkobGlua193b3JraW5nX3dvcmtpbmcobF9wdHIpKSkgeworCQkJaWYgKGxpa2VseShzZXFfbm8gPT0gbW9kKGxfcHRyLT5uZXh0X2luX25vKSkpIHsKKwkJCQlsX3B0ci0+bmV4dF9pbl9ubysrOworCQkJCWlmICh1bmxpa2VseShsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luKSkKKwkJCQkJaGVhZCA9IGxpbmtfaW5zZXJ0X2RlZmVycmVkX3F1ZXVlKGxfcHRyLAorCQkJCQkJCQkJICBoZWFkKTsKKwkJCQlpZiAobGlrZWx5KG1zZ19pc19kZXN0KG1zZywgdGlwY19vd25fYWRkcikpKSB7CitkZWxpdmVyOgorCQkJCQlpZiAobGlrZWx5KG1zZ19pc2RhdGEobXNnKSkpIHsKKwkJCQkJCW5vZGVfdW5sb2NrKG5fcHRyKTsKKwkJCQkJCXBvcnRfcmVjdl9tc2coYnVmKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCXN3aXRjaCAobXNnX3VzZXIobXNnKSkgeworCQkJCQljYXNlIE1TR19CVU5ETEVSOgorCQkJCQkJbF9wdHItPnN0YXRzLnJlY3ZfYnVuZGxlcysrOworCQkJCQkJbF9wdHItPnN0YXRzLnJlY3ZfYnVuZGxlZCArPSAKKwkJCQkJCQltc2dfbXNnY250KG1zZyk7CisJCQkJCQlub2RlX3VubG9jayhuX3B0cik7CisJCQkJCQlsaW5rX3JlY3ZfYnVuZGxlKGJ1Zik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJY2FzZSBST1VURV9ESVNUUklCVVRPUjoKKwkJCQkJCW5vZGVfdW5sb2NrKG5fcHRyKTsKKwkJCQkJCWNsdXN0ZXJfcmVjdl9yb3V0aW5nX3RhYmxlKGJ1Zik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJY2FzZSBOQU1FX0RJU1RSSUJVVE9SOgorCQkJCQkJbm9kZV91bmxvY2sobl9wdHIpOworCQkJCQkJbmFtZWRfcmVjdihidWYpOworCQkJCQkJY29udGludWU7CisJCQkJCWNhc2UgQ09OTl9NQU5BR0VSOgorCQkJCQkJbm9kZV91bmxvY2sobl9wdHIpOworCQkJCQkJcG9ydF9yZWN2X3Byb3RvX21zZyhidWYpOworCQkJCQkJY29udGludWU7CisJCQkJCWNhc2UgTVNHX0ZSQUdNRU5URVI6CisJCQkJCQlsX3B0ci0+c3RhdHMucmVjdl9mcmFnbWVudHMrKzsKKwkJCQkJCWlmIChsaW5rX3JlY3ZfZnJhZ21lbnQoCisJCQkJCQkJJmxfcHRyLT5kZWZyYWdtX2J1ZiwgCisJCQkJCQkJJmJ1ZiwgJm1zZykpIHsKKwkJCQkJCQlsX3B0ci0+c3RhdHMucmVjdl9mcmFnbWVudGVkKys7CisJCQkJCQkJZ290byBkZWxpdmVyOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgQ0hBTkdFT1ZFUl9QUk9UT0NPTDoKKwkJCQkJCXR5cGUgPSBtc2dfdHlwZShtc2cpOworCQkJCQkJaWYgKGxpbmtfcmVjdl9jaGFuZ2VvdmVyX21zZygKKwkJCQkJCQkmbF9wdHIsICZidWYpKSB7CisJCQkJCQkJbXNnID0gYnVmX21zZyhidWYpOworCQkJCQkJCXNlcV9ubyA9IG1zZ19zZXFubyhtc2cpOworCQkJCQkJCVRJUENfU0tCX0NCKGJ1ZiktPmhhbmRsZSAKKwkJCQkJCQkJPSBiX3B0cjsKKwkJCQkJCQlpZiAodHlwZSA9PSBPUklHSU5BTF9NU0cpCisJCQkJCQkJCWdvdG8gZGVsaXZlcjsKKwkJCQkJCQlnb3RvIHByb3RvY29sX2NoZWNrOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJbm9kZV91bmxvY2sobl9wdHIpOworCQkJCW5ldF9yb3V0ZV9tc2coYnVmKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWxpbmtfaGFuZGxlX291dF9vZl9zZXFfbXNnKGxfcHRyLCBidWYpOworCQkJaGVhZCA9IGxpbmtfaW5zZXJ0X2RlZmVycmVkX3F1ZXVlKGxfcHRyLCBoZWFkKTsKKwkJCW5vZGVfdW5sb2NrKG5fcHRyKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG1zZ191c2VyKG1zZykgPT0gTElOS19QUk9UT0NPTCkgeworCQkJbGlua19yZWN2X3Byb3RvX21zZyhsX3B0ciwgYnVmKTsKKwkJCWhlYWQgPSBsaW5rX2luc2VydF9kZWZlcnJlZF9xdWV1ZShsX3B0ciwgaGVhZCk7CisJCQlub2RlX3VubG9jayhuX3B0cik7CisJCQljb250aW51ZTsKKwkJfQorCQltc2dfZGJnKG1zZywiTlNFUTxSRUM8Iik7CisJCWxpbmtfc3RhdGVfZXZlbnQobF9wdHIsIFRSQUZGSUNfTVNHX0VWVCk7CisKKwkJaWYgKGxpbmtfd29ya2luZ193b3JraW5nKGxfcHRyKSkgeworCQkJLyogUmUtaW5zZXJ0IGluIGZyb250IG9mIHF1ZXVlICovCisJCQltc2dfZGJnKG1zZywiUkVDVi1SRUlOUzoiKTsKKwkJCWJ1Zi0+bmV4dCA9IGhlYWQ7CisJCQloZWFkID0gYnVmOworCQkJbm9kZV91bmxvY2sobl9wdHIpOworCQkJY29udGludWU7CisJCX0KKwkJbm9kZV91bmxvY2sobl9wdHIpOworY29udDoKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwl9CisJcmVhZF91bmxvY2tfYmgoJm5ldF9sb2NrKTsKK30KKworLyogCisgKiBsaW5rX2RlZmVyX2J1ZigpOiBTb3J0IGEgcmVjZWl2ZWQgb3V0LW9mLXNlcXVlbmNlIHBhY2tldCAKKyAqICAgICAgICAgICAgICAgICAgIGludG8gdGhlIGRlZmVycmVkIHJlY2VwdGlvbiBxdWV1ZS4KKyAqIFJldHVybnMgdGhlIGluY3JlYXNlIG9mIHRoZSBxdWV1ZSBsZW5ndGgsaS5lLiAwIG9yIDEKKyAqLworCit1MzIgbGlua19kZWZlcl9wa3Qoc3RydWN0IHNrX2J1ZmYgKipoZWFkLAorCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqKnRhaWwsCisJCSAgIHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnByZXYgPSAwOworCXN0cnVjdCBza19idWZmICpjcnMgPSAqaGVhZDsKKwl1MzIgc2VxX25vID0gbXNnX3NlcW5vKGJ1Zl9tc2coYnVmKSk7CisKKwlidWYtPm5leHQgPSBOVUxMOworCisJLyogRW1wdHkgcXVldWUgPyAqLworCWlmICgqaGVhZCA9PSBOVUxMKSB7CisJCSpoZWFkID0gKnRhaWwgPSBidWY7CisJCXJldHVybiAxOworCX0KKworCS8qIExhc3QgPyAqLworCWlmIChsZXNzKG1zZ19zZXFubyhidWZfbXNnKCp0YWlsKSksIHNlcV9ubykpIHsKKwkJKCp0YWlsKS0+bmV4dCA9IGJ1ZjsKKwkJKnRhaWwgPSBidWY7CisJCXJldHVybiAxOworCX0KKworCS8qIFNjYW4gdGhyb3VnaCBxdWV1ZSBhbmQgc29ydCBpdCBpbiAqLworCWRvIHsKKwkJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGNycyk7CisKKwkJaWYgKGxlc3Moc2VxX25vLCBtc2dfc2Vxbm8obXNnKSkpIHsKKwkJCWJ1Zi0+bmV4dCA9IGNyczsKKwkJCWlmIChwcmV2KQorCQkJCXByZXYtPm5leHQgPSBidWY7CisJCQllbHNlCisJCQkJKmhlYWQgPSBidWY7ICAgCisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoc2VxX25vID09IG1zZ19zZXFubyhtc2cpKSB7CisJCQlicmVhazsKKwkJfQorCQlwcmV2ID0gY3JzOworCQljcnMgPSBjcnMtPm5leHQ7CisJfQorCXdoaWxlIChjcnMpOworCisJLyogTWVzc2FnZSBpcyBhIGR1cGxpY2F0ZSBvZiBhbiBleGlzdGluZyBtZXNzYWdlICovCisKKwlidWZfZGlzY2FyZChidWYpOworCXJldHVybiAwOworfQorCisvKiogCisgKiBsaW5rX2hhbmRsZV9vdXRfb2Zfc2VxX21zZyAtIGhhbmRsZSBhcnJpdmFsIG9mIG91dC1vZi1zZXF1ZW5jZSBwYWNrZXQKKyAqLworCitzdGF0aWMgdm9pZCBsaW5rX2hhbmRsZV9vdXRfb2Zfc2VxX21zZyhzdHJ1Y3QgbGluayAqbF9wdHIsIAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXUzMiBzZXFfbm8gPSBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKKworCWlmIChsaWtlbHkobXNnX3VzZXIoYnVmX21zZyhidWYpKSA9PSBMSU5LX1BST1RPQ09MKSkgeworCQlsaW5rX3JlY3ZfcHJvdG9fbXNnKGxfcHRyLCBidWYpOworCQlyZXR1cm47CisJfQorCisJZGJnKCJyeCBPT1MgbXNnOiBzZXFfbm8gJXUsIGV4cGVjdGluZyAldSAoJXUpXG4iLCAKKwkgICAgc2VxX25vLCBtb2QobF9wdHItPm5leHRfaW5fbm8pLCBsX3B0ci0+bmV4dF9pbl9ubyk7CisKKwkvKiBSZWNvcmQgT09TIHBhY2tldCBhcnJpdmFsIChmb3JjZSBtaXNtYXRjaCBvbiBuZXh0IHRpbWVvdXQpICovCisKKwlsX3B0ci0+Y2hlY2twb2ludC0tOworCisJLyogCisJICogRGlzY2FyZCBwYWNrZXQgaWYgYSBkdXBsaWNhdGU7IG90aGVyd2lzZSBhZGQgaXQgdG8gZGVmZXJyZWQgcXVldWUKKwkgKiBhbmQgbm90aWZ5IHBlZXIgb2YgZ2FwIGFzIHBlciBwcm90b2NvbCBzcGVjaWZpY2F0aW9uCisJICovCisKKwlpZiAobGVzcyhzZXFfbm8sIG1vZChsX3B0ci0+bmV4dF9pbl9ubykpKSB7CisJCWxfcHRyLT5zdGF0cy5kdXBsaWNhdGVzKys7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobGlua19kZWZlcl9wa3QoJmxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4sCisJCQkgICAmbF9wdHItPm5ld2VzdF9kZWZlcnJlZF9pbiwgYnVmKSkgeworCQlsX3B0ci0+ZGVmZXJyZWRfaW5xdWV1ZV9zeisrOworCQlsX3B0ci0+c3RhdHMuZGVmZXJyZWRfcmVjdisrOworCQlpZiAoKGxfcHRyLT5kZWZlcnJlZF9pbnF1ZXVlX3N6ICUgMTYpID09IDEpCisJCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csIDAsIDAsIDAsIDAsIDApOworCX0gZWxzZQorCQlsX3B0ci0+c3RhdHMuZHVwbGljYXRlcysrOworfQorCisvKgorICogU2VuZCBwcm90b2NvbCBtZXNzYWdlIHRvIHRoZSBvdGhlciBlbmRwb2ludC4KKyAqLwordm9pZCBsaW5rX3NlbmRfcHJvdG9fbXNnKHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIG1zZ190eXAsIGludCBwcm9iZV9tc2csCisJCQkgdTMyIGdhcCwgdTMyIHRvbGVyYW5jZSwgdTMyIHByaW9yaXR5LCB1MzIgYWNrX210dSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gMDsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGxfcHRyLT5wbXNnOworICAgICAgICB1MzIgbXNnX3NpemUgPSBzaXplb2YobF9wdHItPnByb3RvX21zZyk7CisKKwlpZiAobGlua19ibG9ja2VkKGxfcHRyKSkKKwkJcmV0dXJuOworCW1zZ19zZXRfdHlwZShtc2csIG1zZ190eXApOworCW1zZ19zZXRfbmV0X3BsYW5lKG1zZywgbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUpOworCW1zZ19zZXRfYmNhc3RfYWNrKG1zZywgbW9kKGxfcHRyLT5vd25lci0+YmNsaW5rLmxhc3RfaW4pKTsgCisJbXNnX3NldF9sYXN0X2JjYXN0KG1zZywgYmNsaW5rX2dldF9sYXN0X3NlbnQoKSk7CisKKwlpZiAobXNnX3R5cCA9PSBTVEFURV9NU0cpIHsKKwkJdTMyIG5leHRfc2VudCA9IG1vZChsX3B0ci0+bmV4dF9vdXRfbm8pOworCisJCWlmICghbGlua19pc191cChsX3B0cikpCisJCQlyZXR1cm47CisJCWlmIChsX3B0ci0+bmV4dF9vdXQpCisJCQluZXh0X3NlbnQgPSBtc2dfc2Vxbm8oYnVmX21zZyhsX3B0ci0+bmV4dF9vdXQpKTsKKwkJbXNnX3NldF9uZXh0X3NlbnQobXNnLCBuZXh0X3NlbnQpOworCQlpZiAobF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbikgeworCQkJdTMyIHJlYyA9IG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4pKTsKKwkJCWdhcCA9IG1vZChyZWMgLSBtb2QobF9wdHItPm5leHRfaW5fbm8pKTsKKwkJfQorCQltc2dfc2V0X3NlcV9nYXAobXNnLCBnYXApOworCQlpZiAoZ2FwKQorCQkJbF9wdHItPnN0YXRzLnNlbnRfbmFja3MrKzsKKwkJbXNnX3NldF9saW5rX3RvbGVyYW5jZShtc2csIHRvbGVyYW5jZSk7CisJCW1zZ19zZXRfbGlua3ByaW8obXNnLCBwcmlvcml0eSk7CisJCW1zZ19zZXRfbWF4X3BrdChtc2csIGFja19tdHUpOworCQltc2dfc2V0X2Fjayhtc2csIG1vZChsX3B0ci0+bmV4dF9pbl9ubyAtIDEpKTsKKwkJbXNnX3NldF9wcm9iZShtc2csIHByb2JlX21zZyAhPSAwKTsKKwkJaWYgKHByb2JlX21zZykgeyAKKwkJCXUzMiBtdHUgPSBsX3B0ci0+bWF4X3BrdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtdHUgPCBsX3B0ci0+bWF4X3BrdF90YXJnZXQpICYmCisJCQkgICAgbGlua193b3JraW5nX3dvcmtpbmcobF9wdHIpICYmCisJCQkgICAgbF9wdHItPmZzbV9tc2dfY250KSB7CisJCQkJbXNnX3NpemUgPSAobXR1ICsgKGxfcHRyLT5tYXhfcGt0X3RhcmdldCAtIG10dSkvMiArIDIpICYgfjM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3B0ci0+bWF4X3BrdF9wcm9iZXMgPT0gMTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3B0ci0+bWF4X3BrdF90YXJnZXQgPSAobXNnX3NpemUgLSA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3B0ci0+bWF4X3BrdF9wcm9iZXMgPSAwOworCQkJCQltc2dfc2l6ZSA9IChtdHUgKyAobF9wdHItPm1heF9wa3RfdGFyZ2V0IC0gbXR1KS8yICsgMikgJiB+MzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJCWxfcHRyLT5tYXhfcGt0X3Byb2JlcysrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisJCQlsX3B0ci0+c3RhdHMuc2VudF9wcm9iZXMrKzsKKyAgICAgICAgICAgICAgICB9CisJCWxfcHRyLT5zdGF0cy5zZW50X3N0YXRlcysrOworCX0gZWxzZSB7CQkvKiBSRVNFVF9NU0cgb3IgQUNUSVZBVEVfTVNHICovCisJCW1zZ19zZXRfYWNrKG1zZywgbW9kKGxfcHRyLT5yZXNldF9jaGVja3BvaW50IC0gMSkpOworCQltc2dfc2V0X3NlcV9nYXAobXNnLCAwKTsKKwkJbXNnX3NldF9uZXh0X3NlbnQobXNnLCAxKTsKKwkJbXNnX3NldF9saW5rX3RvbGVyYW5jZShtc2csIGxfcHRyLT50b2xlcmFuY2UpOworCQltc2dfc2V0X2xpbmtwcmlvKG1zZywgbF9wdHItPnByaW9yaXR5KTsKKwkJbXNnX3NldF9tYXhfcGt0KG1zZywgbF9wdHItPm1heF9wa3RfdGFyZ2V0KTsKKwl9CisKKwlpZiAobm9kZV9oYXNfcmVkdW5kYW50X2xpbmtzKGxfcHRyLT5vd25lcikpIHsKKwkJbXNnX3NldF9yZWR1bmRhbnRfbGluayhtc2cpOworCX0gZWxzZSB7CisJCW1zZ19jbGVhcl9yZWR1bmRhbnRfbGluayhtc2cpOworCX0KKwltc2dfc2V0X2xpbmtwcmlvKG1zZywgbF9wdHItPnByaW9yaXR5KTsKKworCS8qIEVuc3VyZSBzZXF1ZW5jZSBudW1iZXIgd2lsbCBub3QgZml0IDogKi8KKworCW1zZ19zZXRfc2Vxbm8obXNnLCBtb2QobF9wdHItPm5leHRfb3V0X25vICsgKDB4ZmZmZi8yKSkpOworCisJLyogQ29uZ2VzdGlvbj8gKi8KKworCWlmIChiZWFyZXJfY29uZ2VzdGVkKGxfcHRyLT5iX3B0ciwgbF9wdHIpKSB7CisJCWlmICghbF9wdHItPnByb3RvX21zZ19xdWV1ZSkgeworCQkJbF9wdHItPnByb3RvX21zZ19xdWV1ZSA9CisJCQkJYnVmX2FjcXVpcmUoc2l6ZW9mKGxfcHRyLT5wcm90b19tc2cpKTsKKwkJfQorCQlidWYgPSBsX3B0ci0+cHJvdG9fbXNnX3F1ZXVlOworCQlpZiAoIWJ1ZikKKwkJCXJldHVybjsKKwkJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKW1zZywgc2l6ZW9mKGxfcHRyLT5wcm90b19tc2cpKTsKKwkJcmV0dXJuOworCX0KKwltc2dfc2V0X3RpbWVzdGFtcChtc2csIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcykpOworCisJLyogTWVzc2FnZSBjYW4gYmUgc2VudCAqLworCisJbXNnX2RiZyhtc2csICI+PiIpOworCisJYnVmID0gYnVmX2FjcXVpcmUobXNnX3NpemUpOworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopbXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOworICAgICAgICBtc2dfc2V0X3NpemUoYnVmX21zZyhidWYpLCBtc2dfc2l6ZSk7CisKKwlpZiAoYmVhcmVyX3NlbmQobF9wdHItPmJfcHRyLCBidWYsICZsX3B0ci0+bWVkaWFfYWRkcikpIHsKKwkJbF9wdHItPnVuYWNrZWRfd2luZG93ID0gMDsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE5ldyBjb25nZXN0aW9uICovCisJYmVhcmVyX3NjaGVkdWxlKGxfcHRyLT5iX3B0ciwgbF9wdHIpOworCWxfcHRyLT5wcm90b19tc2dfcXVldWUgPSBidWY7CisJbF9wdHItPnN0YXRzLmJlYXJlcl9jb25ncysrOworfQorCisvKgorICogUmVjZWl2ZSBwcm90b2NvbCBtZXNzYWdlIDoKKyAqIE5vdGUgdGhhdCBuZXR3b3JrIHBsYW5lIGlkIHByb3BhZ2F0ZXMgdGhyb3VnaCB0aGUgbmV0d29yaywgYW5kIG1heSAKKyAqIGNoYW5nZSBhdCBhbnkgdGltZS4gVGhlIG5vZGUgd2l0aCBsb3dlc3QgYWRkcmVzcyBydWxlcyAgICAKKyAqLworCitzdGF0aWMgdm9pZCBsaW5rX3JlY3ZfcHJvdG9fbXNnKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwl1MzIgcmVjX2dhcCA9IDA7CisJdTMyIG1heF9wa3RfaW5mbzsKKyAgICAgICAgdTMyIG1heF9wa3RfYWNrOworCXUzMiBtc2dfdG9sOworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCisJZGJnKCJBVCgldSk6IiwgamlmZmllc190b19tc2VjcyhqaWZmaWVzKSk7CisJbXNnX2RiZyhtc2csICI8PCIpOworCWlmIChsaW5rX2Jsb2NrZWQobF9wdHIpKQorCQlnb3RvIGV4aXQ7CisKKwkvKiByZWNvcmQgdW5udW1iZXJlZCBwYWNrZXQgYXJyaXZhbCAoZm9yY2UgbWlzbWF0Y2ggb24gbmV4dCB0aW1lb3V0KSAqLworCisJbF9wdHItPmNoZWNrcG9pbnQtLTsKKworCWlmIChsX3B0ci0+Yl9wdHItPm5ldF9wbGFuZSAhPSBtc2dfbmV0X3BsYW5lKG1zZykpCisJCWlmICh0aXBjX293bl9hZGRyID4gbXNnX3ByZXZub2RlKG1zZykpCisJCQlsX3B0ci0+Yl9wdHItPm5ldF9wbGFuZSA9IG1zZ19uZXRfcGxhbmUobXNnKTsKKworCWxfcHRyLT5vd25lci0+cGVybWl0X2NoYW5nZW92ZXIgPSBtc2dfcmVkdW5kYW50X2xpbmsobXNnKTsKKworCXN3aXRjaCAobXNnX3R5cGUobXNnKSkgeworCQorCWNhc2UgUkVTRVRfTVNHOgorCQlpZiAoIWxpbmtfd29ya2luZ191bmtub3duKGxfcHRyKSAmJiBsX3B0ci0+cGVlcl9zZXNzaW9uKSB7CisJCQlpZiAobXNnX3Nlc3Npb24obXNnKSA9PSBsX3B0ci0+cGVlcl9zZXNzaW9uKSB7CisJCQkJZGJnKCJEdXBsaWNhdGUgUkVTRVQ6ICV1PC0+JXVcbiIsCisJCQkJICAgIG1zZ19zZXNzaW9uKG1zZyksIGxfcHRyLT5wZWVyX3Nlc3Npb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQlicmVhazsgLyogZHVwbGljYXRlOiBpZ25vcmUgKi8KKwkJCX0KKwkJfQorCQkvKiBmYWxsIHRocnUnICovCisJY2FzZSBBQ1RJVkFURV9NU0c6CisJCS8qIFVwZGF0ZSBsaW5rIHNldHRpbmdzIGFjY29yZGluZyBvdGhlciBlbmRwb2ludCdzIHZhbHVlcyAqLworCisJCXN0cmNweSgoc3RycmNocihsX3B0ci0+bmFtZSwgJzonKSArIDEpLCAoY2hhciAqKW1zZ19kYXRhKG1zZykpOworCisJCWlmICgobXNnX3RvbCA9IG1zZ19saW5rX3RvbGVyYW5jZShtc2cpKSAmJgorCQkgICAgKG1zZ190b2wgPiBsX3B0ci0+dG9sZXJhbmNlKSkKKwkJCWxpbmtfc2V0X3N1cGVydmlzaW9uX3Byb3BzKGxfcHRyLCBtc2dfdG9sKTsKKworCQlpZiAobXNnX2xpbmtwcmlvKG1zZykgPiBsX3B0ci0+cHJpb3JpdHkpCisJCQlsX3B0ci0+cHJpb3JpdHkgPSBtc2dfbGlua3ByaW8obXNnKTsKKworCQltYXhfcGt0X2luZm8gPSBtc2dfbWF4X3BrdChtc2cpOworICAgICAgICAgICAgICAgIGlmIChtYXhfcGt0X2luZm8pIHsKKwkJCWlmIChtYXhfcGt0X2luZm8gPCBsX3B0ci0+bWF4X3BrdF90YXJnZXQpCisJCQkJbF9wdHItPm1heF9wa3RfdGFyZ2V0ID0gbWF4X3BrdF9pbmZvOworCQkJaWYgKGxfcHRyLT5tYXhfcGt0ID4gbF9wdHItPm1heF9wa3RfdGFyZ2V0KQorCQkJCWxfcHRyLT5tYXhfcGt0ID0gbF9wdHItPm1heF9wa3RfdGFyZ2V0OworCQl9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbF9wdHItPm1heF9wa3QgPSBsX3B0ci0+bWF4X3BrdF90YXJnZXQ7CisJCX0KKwkJbF9wdHItPm93bmVyLT5iY2xpbmsuc3VwcG9ydGVkID0gKG1heF9wa3RfaW5mbyAhPSAwKTsKKworCQlsaW5rX3N0YXRlX2V2ZW50KGxfcHRyLCBtc2dfdHlwZShtc2cpKTsKKworCQlsX3B0ci0+cGVlcl9zZXNzaW9uID0gbXNnX3Nlc3Npb24obXNnKTsKKwkJbF9wdHItPnBlZXJfYmVhcmVyX2lkID0gbXNnX2JlYXJlcl9pZChtc2cpOworCisJCS8qIFN5bmNocm9uaXplIGJyb2FkY2FzdCBzZXF1ZW5jZSBudW1iZXJzICovCisJCWlmICghbm9kZV9oYXNfcmVkdW5kYW50X2xpbmtzKGxfcHRyLT5vd25lcikpIHsKKwkJCWxfcHRyLT5vd25lci0+YmNsaW5rLmxhc3RfaW4gPSBtb2QobXNnX2xhc3RfYmNhc3QobXNnKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTVEFURV9NU0c6CisKKwkJaWYgKChtc2dfdG9sID0gbXNnX2xpbmtfdG9sZXJhbmNlKG1zZykpKQorCQkJbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMobF9wdHIsIG1zZ190b2wpOworCQkKKwkJaWYgKG1zZ19saW5rcHJpbyhtc2cpICYmIAorCQkgICAgKG1zZ19saW5rcHJpbyhtc2cpICE9IGxfcHRyLT5wcmlvcml0eSkpIHsKKwkJCXdhcm4oIkNoYW5naW5nIHByaW8gPCVzPjogJXUtPiV1XG4iLAorCQkJICAgICBsX3B0ci0+bmFtZSwgbF9wdHItPnByaW9yaXR5LCBtc2dfbGlua3ByaW8obXNnKSk7CisJCQlsX3B0ci0+cHJpb3JpdHkgPSBtc2dfbGlua3ByaW8obXNnKTsKKwkJCWxpbmtfcmVzZXQobF9wdHIpOyAvKiBFbmZvcmNlIGNoYW5nZSB0byB0YWtlIGVmZmVjdCAqLworCQkJYnJlYWs7CisJCX0KKwkJbGlua19zdGF0ZV9ldmVudChsX3B0ciwgVFJBRkZJQ19NU0dfRVZUKTsKKwkJbF9wdHItPnN0YXRzLnJlY3Zfc3RhdGVzKys7CisJCWlmIChsaW5rX3Jlc2V0X3Vua25vd24obF9wdHIpKQorCQkJYnJlYWs7CisKKwkJaWYgKGxlc3NfZXEobW9kKGxfcHRyLT5uZXh0X2luX25vKSwgbXNnX25leHRfc2VudChtc2cpKSkgeworCQkJcmVjX2dhcCA9IG1vZChtc2dfbmV4dF9zZW50KG1zZykgLSAKKwkJCQkgICAgICBtb2QobF9wdHItPm5leHRfaW5fbm8pKTsKKwkJfQorCisJCW1heF9wa3RfYWNrID0gbXNnX21heF9wa3QobXNnKTsKKyAgICAgICAgICAgICAgICBpZiAobWF4X3BrdF9hY2sgPiBsX3B0ci0+bWF4X3BrdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGJnKCJMaW5rIDwlcz4gdXBkYXRlZCBNVFUgJXUgLT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wdHItPm5hbWUsIGxfcHRyLT5tYXhfcGt0LCBtYXhfcGt0X2Fjayk7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3B0ci0+bWF4X3BrdCA9IG1heF9wa3RfYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgbF9wdHItPm1heF9wa3RfcHJvYmVzID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKwkJbWF4X3BrdF9hY2sgPSAwOworICAgICAgICAgICAgICAgIGlmIChtc2dfcHJvYmUobXNnKSkgeworCQkJbF9wdHItPnN0YXRzLnJlY3ZfcHJvYmVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnX3NpemUobXNnKSA+IHNpemVvZihsX3B0ci0+cHJvdG9fbXNnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcGt0X2FjayA9IG1zZ19zaXplKG1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisJCS8qIFByb3RvY29sIG1lc3NhZ2UgYmVmb3JlIHJldHJhbnNtaXRzLCByZWR1Y2UgbG9zcyByaXNrICovCisKKwkJYmNsaW5rX2NoZWNrX2dhcChsX3B0ci0+b3duZXIsIG1zZ19sYXN0X2JjYXN0KG1zZykpOworCisJCWlmIChyZWNfZ2FwIHx8IChtc2dfcHJvYmUobXNnKSkpIHsKKwkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywKKwkJCQkJICAgIDAsIHJlY19nYXAsIDAsIDAsIG1heF9wa3RfYWNrKTsKKwkJfQorCQlpZiAobXNnX3NlcV9nYXAobXNnKSkgeworCQkJbXNnX2RiZyhtc2csICJXaXRoIEdhcDoiKTsKKwkJCWxfcHRyLT5zdGF0cy5yZWN2X25hY2tzKys7CisJCQlsaW5rX3JldHJhbnNtaXQobF9wdHIsIGxfcHRyLT5maXJzdF9vdXQsCisJCQkJCW1zZ19zZXFfZ2FwKG1zZykpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1zZ19kYmcoYnVmX21zZyhidWYpLCAiPERJU0NBUkRJTkcgVU5LTk9XTjwiKTsKKwl9CitleGl0OgorCWJ1Zl9kaXNjYXJkKGJ1Zik7Cit9CisKKworLyoKKyAqIGxpbmtfdHVubmVsKCk6IFNlbmQgb25lIG1lc3NhZ2UgdmlhIGEgbGluayBiZWxvbmdpbmcgdG8gCisgKiBhbm90aGVyIGJlYXJlci4gT3duZXIgbm9kZSBpcyBsb2NrZWQuCisgKi8KK3ZvaWQgbGlua190dW5uZWwoc3RydWN0IGxpbmsgKmxfcHRyLCAKKwkgICAgc3RydWN0IHRpcGNfbXNnICp0dW5uZWxfaGRyLCAKKwkgICAgc3RydWN0IHRpcGNfbXNnICAqbXNnLAorCSAgICB1MzIgc2VsZWN0b3IpCit7CisJc3RydWN0IGxpbmsgKnR1bm5lbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXUzMiBsZW5ndGggPSBtc2dfc2l6ZShtc2cpOworCisJdHVubmVsID0gbF9wdHItPm93bmVyLT5hY3RpdmVfbGlua3Nbc2VsZWN0b3IgJiAxXTsKKwlpZiAoIWxpbmtfaXNfdXAodHVubmVsKSkKKwkJcmV0dXJuOworCW1zZ19zZXRfc2l6ZSh0dW5uZWxfaGRyLCBsZW5ndGggKyBJTlRfSF9TSVpFKTsKKwlidWYgPSBidWZfYWNxdWlyZShsZW5ndGggKyBJTlRfSF9TSVpFKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKil0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKKwltZW1jcHkoYnVmLT5kYXRhICsgSU5UX0hfU0laRSwgKHVuY2hhciAqKW1zZywgbGVuZ3RoKTsKKwlkYmcoIiVjLT4lYzoiLCBsX3B0ci0+Yl9wdHItPm5ldF9wbGFuZSwgdHVubmVsLT5iX3B0ci0+bmV0X3BsYW5lKTsKKwltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgIj5TRU5EPiIpOworCWFzc2VydCh0dW5uZWwpOworCWxpbmtfc2VuZF9idWYodHVubmVsLCBidWYpOworfQorCisKKworLyoKKyAqIGNoYW5nZW92ZXIoKTogU2VuZCB3aG9sZSBtZXNzYWdlIHF1ZXVlIHZpYSB0aGUgcmVtYWluaW5nIGxpbmsKKyAqICAgICAgICAgICAgICAgT3duZXIgbm9kZSBpcyBsb2NrZWQuCisgKi8KKwordm9pZCBsaW5rX2NoYW5nZW92ZXIoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXUzMiBtc2djb3VudCA9IGxfcHRyLT5vdXRfcXVldWVfc2l6ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqY3JzID0gbF9wdHItPmZpcnN0X291dDsKKwlzdHJ1Y3QgbGluayAqdHVubmVsID0gbF9wdHItPm93bmVyLT5hY3RpdmVfbGlua3NbMF07CisJaW50IHNwbGl0X2J1bmRsZXMgPSBub2RlX2hhc19yZWR1bmRhbnRfbGlua3MobF9wdHItPm93bmVyKTsKKwlzdHJ1Y3QgdGlwY19tc2cgdHVubmVsX2hkcjsKKworCWlmICghdHVubmVsKQorCQlyZXR1cm47CisKKwlpZiAoIWxfcHRyLT5vd25lci0+cGVybWl0X2NoYW5nZW92ZXIpCisJCXJldHVybjsKKworCW1zZ19pbml0KCZ0dW5uZWxfaGRyLCBDSEFOR0VPVkVSX1BST1RPQ09MLAorCQkgT1JJR0lOQUxfTVNHLCBUSVBDX09LLCBJTlRfSF9TSVpFLCBsX3B0ci0+YWRkcik7CisJbXNnX3NldF9iZWFyZXJfaWQoJnR1bm5lbF9oZHIsIGxfcHRyLT5wZWVyX2JlYXJlcl9pZCk7CisJbXNnX3NldF9tc2djbnQoJnR1bm5lbF9oZHIsIG1zZ2NvdW50KTsKKwlpZiAoIWxfcHRyLT5maXJzdF9vdXQpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKworCQlhc3NlcnQoIW1zZ2NvdW50KTsKKwkJYnVmID0gYnVmX2FjcXVpcmUoSU5UX0hfU0laRSk7CisJCWlmIChidWYpIHsKKwkJCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKikmdHVubmVsX2hkciwgSU5UX0hfU0laRSk7CisJCQltc2dfc2V0X3NpemUoJnR1bm5lbF9oZHIsIElOVF9IX1NJWkUpOworCQkJZGJnKCIlYy0+JWM6IiwgbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUsCisJCQkgICAgdHVubmVsLT5iX3B0ci0+bmV0X3BsYW5lKTsKKwkJCW1zZ19kYmcoJnR1bm5lbF9oZHIsICJFTVBUWT5TRU5EPiIpOworCQkJbGlua19zZW5kX2J1Zih0dW5uZWwsIGJ1Zik7CisJCX0gZWxzZSB7CisJCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgbGluayBjaGFuZ2VvdmVyIGZhaWxlZFxuIik7CisJCX0KKwkJcmV0dXJuOworCX0KKwl3aGlsZSAoY3JzKSB7CisJCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhjcnMpOworCisJCWlmICgobXNnX3VzZXIobXNnKSA9PSBNU0dfQlVORExFUikgJiYgc3BsaXRfYnVuZGxlcykgeworCQkJdTMyIG1zZ2NvdW50ID0gbXNnX21zZ2NudChtc2cpOworCQkJc3RydWN0IHRpcGNfbXNnICptID0gbXNnX2dldF93cmFwcGVkKG1zZyk7CisJCQl1bmNoYXIqIHBvcyA9ICh1bmNoYXIqKW07CisKKwkJCXdoaWxlIChtc2djb3VudC0tKSB7CisJCQkJbXNnX3NldF9zZXFubyhtLG1zZ19zZXFubyhtc2cpKTsKKwkJCQlsaW5rX3R1bm5lbChsX3B0ciwgJnR1bm5lbF9oZHIsIG0sCisJCQkJCSAgICBtc2dfbGlua19zZWxlY3RvcihtKSk7CisJCQkJcG9zICs9IGFsaWduKG1zZ19zaXplKG0pKTsKKwkJCQltID0gKHN0cnVjdCB0aXBjX21zZyAqKXBvczsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxpbmtfdHVubmVsKGxfcHRyLCAmdHVubmVsX2hkciwgbXNnLAorCQkJCSAgICBtc2dfbGlua19zZWxlY3Rvcihtc2cpKTsKKwkJfQorCQljcnMgPSBjcnMtPm5leHQ7CisJfQorfQorCit2b2lkIGxpbmtfc2VuZF9kdXBsaWNhdGUoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3QgbGluayAqdHVubmVsKQoreworCXN0cnVjdCBza19idWZmICppdGVyOworCXN0cnVjdCB0aXBjX21zZyB0dW5uZWxfaGRyOworCisJbXNnX2luaXQoJnR1bm5lbF9oZHIsIENIQU5HRU9WRVJfUFJPVE9DT0wsCisJCSBEVVBMSUNBVEVfTVNHLCBUSVBDX09LLCBJTlRfSF9TSVpFLCBsX3B0ci0+YWRkcik7CisJbXNnX3NldF9tc2djbnQoJnR1bm5lbF9oZHIsIGxfcHRyLT5vdXRfcXVldWVfc2l6ZSk7CisJbXNnX3NldF9iZWFyZXJfaWQoJnR1bm5lbF9oZHIsIGxfcHRyLT5wZWVyX2JlYXJlcl9pZCk7CisJaXRlciA9IGxfcHRyLT5maXJzdF9vdXQ7CisJd2hpbGUgKGl0ZXIpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm91dGJ1ZjsKKwkJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGl0ZXIpOworCQl1MzIgbGVuZ3RoID0gbXNnX3NpemUobXNnKTsKKworCQlpZiAobXNnX3VzZXIobXNnKSA9PSBNU0dfQlVORExFUikKKwkJCW1zZ19zZXRfdHlwZShtc2csIENMT1NFRF9NU0cpOworCQltc2dfc2V0X2Fjayhtc2csIG1vZChsX3B0ci0+bmV4dF9pbl9ubyAtIDEpKTsJLyogVXBkYXRlICovCisJCW1zZ19zZXRfYmNhc3RfYWNrKG1zZywgbF9wdHItPm93bmVyLT5iY2xpbmsubGFzdF9pbik7IAorCQltc2dfc2V0X3NpemUoJnR1bm5lbF9oZHIsIGxlbmd0aCArIElOVF9IX1NJWkUpOworCQlvdXRidWYgPSBidWZfYWNxdWlyZShsZW5ndGggKyBJTlRfSF9TSVpFKTsKKwkJaWYgKG91dGJ1ZiA9PSBOVUxMKSB7CisJCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgYnVmZmVyIGR1cGxpY2F0aW9uIGZhaWxlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJbWVtY3B5KG91dGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKSZ0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKKwkJbWVtY3B5KG91dGJ1Zi0+ZGF0YSArIElOVF9IX1NJWkUsIGl0ZXItPmRhdGEsIGxlbmd0aCk7CisJCWRiZygiJWMtPiVjOiIsIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lLAorCQkgICAgdHVubmVsLT5iX3B0ci0+bmV0X3BsYW5lKTsKKwkJbXNnX2RiZyhidWZfbXNnKG91dGJ1ZiksICI+U0VORD4iKTsKKwkJbGlua19zZW5kX2J1Zih0dW5uZWwsIG91dGJ1Zik7CisJCWlmICghbGlua19pc191cChsX3B0cikpCisJCQlyZXR1cm47CisJCWl0ZXIgPSBpdGVyLT5uZXh0OworCX0KK30KKworCisKKy8qKgorICogYnVmX2V4dHJhY3QgLSBleHRyYWN0cyBlbWJlZGRlZCBUSVBDIG1lc3NhZ2UgZnJvbSBhbm90aGVyIG1lc3NhZ2UKKyAqIEBza2I6IGVuY2Fwc3VsYXRpbmcgbWVzc2FnZSBidWZmZXIKKyAqIEBmcm9tX3Bvczogb2Zmc2V0IHRvIGV4dHJhY3QgZnJvbQorICoKKyAqIFJldHVybnMgYSBuZXcgbWVzc2FnZSBidWZmZXIgY29udGFpbmluZyBhbiBlbWJlZGRlZCBtZXNzYWdlLiAgVGhlIAorICogZW5jYXBzdWxhdGluZyBtZXNzYWdlIGl0c2VsZiBpcyBsZWZ0IHVuY2hhbmdlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmJ1Zl9leHRyYWN0KHN0cnVjdCBza19idWZmICpza2IsIHUzMiBmcm9tX3BvcykKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IChzdHJ1Y3QgdGlwY19tc2cgKikoc2tiLT5kYXRhICsgZnJvbV9wb3MpOworCXUzMiBzaXplID0gbXNnX3NpemUobXNnKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZWI7CisKKwllYiA9IGJ1Zl9hY3F1aXJlKHNpemUpOworCWlmIChlYikKKwkJbWVtY3B5KGViLT5kYXRhLCAodW5jaGFyICopbXNnLCBzaXplKTsKKwlyZXR1cm4gZWI7Cit9CisKKy8qIAorICogIGxpbmtfcmVjdl9jaGFuZ2VvdmVyX21zZygpOiBSZWNlaXZlIHR1bm5lbGVkIHBhY2tldCBzZW50CisgKiAgdmlhIG90aGVyIGxpbmsuIE5vZGUgaXMgbG9ja2VkLiBSZXR1cm4gZXh0cmFjdGVkIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgaW50IGxpbmtfcmVjdl9jaGFuZ2VvdmVyX21zZyhzdHJ1Y3QgbGluayAqKmxfcHRyLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHVubmVsX2J1ZiA9ICpidWY7CisJc3RydWN0IGxpbmsgKmRlc3RfbGluazsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwlzdHJ1Y3QgdGlwY19tc2cgKnR1bm5lbF9tc2cgPSBidWZfbXNnKHR1bm5lbF9idWYpOworCXUzMiBtc2dfdHlwID0gbXNnX3R5cGUodHVubmVsX21zZyk7CisJdTMyIG1zZ19jb3VudCA9IG1zZ19tc2djbnQodHVubmVsX21zZyk7CisKKwlkZXN0X2xpbmsgPSAoKmxfcHRyKS0+b3duZXItPmxpbmtzW21zZ19iZWFyZXJfaWQodHVubmVsX21zZyldOworCWFzc2VydChkZXN0X2xpbmsgIT0gKmxfcHRyKTsKKwlpZiAoIWRlc3RfbGluaykgeworCQltc2dfZGJnKHR1bm5lbF9tc2csICJOT0xJTksvPFJFQzwiKTsKKwkJZ290byBleGl0OworCX0KKwlkYmcoIiVjPC0lYzoiLCBkZXN0X2xpbmstPmJfcHRyLT5uZXRfcGxhbmUsCisJICAgICgqbF9wdHIpLT5iX3B0ci0+bmV0X3BsYW5lKTsKKwkqbF9wdHIgPSBkZXN0X2xpbms7CisJbXNnID0gbXNnX2dldF93cmFwcGVkKHR1bm5lbF9tc2cpOworCisJaWYgKG1zZ190eXAgPT0gRFVQTElDQVRFX01TRykgeworCQlpZiAobGVzcyhtc2dfc2Vxbm8obXNnKSwgbW9kKGRlc3RfbGluay0+bmV4dF9pbl9ubykpKSB7CisJCQltc2dfZGJnKHR1bm5lbF9tc2csICJEUk9QLzxSRUM8Iik7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJKmJ1ZiA9IGJ1Zl9leHRyYWN0KHR1bm5lbF9idWYsSU5UX0hfU0laRSk7CisJCWlmICgqYnVmID09IE5VTEwpIHsKKwkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBmYWlsZWQgdG8gZXh0cmFjdCBtc2dcbiIpOworCQkJZ290byBleGl0OworCQl9CisJCW1zZ19kYmcodHVubmVsX21zZywgIlROTDxSRUM8Iik7CisJCWJ1Zl9kaXNjYXJkKHR1bm5lbF9idWYpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBGaXJzdCBvcmlnaW5hbCBtZXNzYWdlID86ICovCisKKwlpZiAobGlua19pc191cChkZXN0X2xpbmspKSB7CisJCW1zZ19kYmcodHVubmVsX21zZywgIlVQL0ZJUlNULzxSRUM8Iik7CisJCWxpbmtfcmVzZXQoZGVzdF9saW5rKTsKKwkJZGVzdF9saW5rLT5leHBfbXNnX2NvdW50ID0gbXNnX2NvdW50OworCQlpZiAoIW1zZ19jb3VudCkKKwkJCWdvdG8gZXhpdDsKKwl9IGVsc2UgaWYgKGRlc3RfbGluay0+ZXhwX21zZ19jb3VudCA9PSBTVEFSVF9DSEFOR0VPVkVSKSB7CisJCW1zZ19kYmcodHVubmVsX21zZywgIkJMSy9GSVJTVC88UkVDPCIpOworCQlkZXN0X2xpbmstPmV4cF9tc2dfY291bnQgPSBtc2dfY291bnQ7CisJCWlmICghbXNnX2NvdW50KQorCQkJZ290byBleGl0OworCX0KKworCS8qIFJlY2VpdmUgb3JpZ2luYWwgbWVzc2FnZSAqLworCisJaWYgKGRlc3RfbGluay0+ZXhwX21zZ19jb3VudCA9PSAwKSB7CisJCW1zZ19kYmcodHVubmVsX21zZywgIk9WRVJEVUUvRFJPUC88UkVDPCIpOworCQlkYmdfcHJpbnRfbGluayhkZXN0X2xpbmssICJMSU5LOiIpOworCQlnb3RvIGV4aXQ7CisJfQorCWRlc3RfbGluay0+ZXhwX21zZ19jb3VudC0tOworCWlmIChsZXNzKG1zZ19zZXFubyhtc2cpLCBkZXN0X2xpbmstPnJlc2V0X2NoZWNrcG9pbnQpKSB7CisJCW1zZ19kYmcodHVubmVsX21zZywgIkRST1AvRFVQTC88UkVDPCIpOworCQlnb3RvIGV4aXQ7CisJfSBlbHNlIHsKKwkJKmJ1ZiA9IGJ1Zl9leHRyYWN0KHR1bm5lbF9idWYsIElOVF9IX1NJWkUpOworCQlpZiAoKmJ1ZiAhPSBOVUxMKSB7CisJCQltc2dfZGJnKHR1bm5lbF9tc2csICJUTkw8UkVDPCIpOworCQkJYnVmX2Rpc2NhcmQodHVubmVsX2J1Zik7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIHsKKwkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBkcm9wcGVkIGluY29taW5nIG1zZ1xuIik7CisJCX0KKwl9CitleGl0OgorCSpidWYgPSAwOworCWJ1Zl9kaXNjYXJkKHR1bm5lbF9idWYpOworCXJldHVybiAwOworfQorCisvKgorICogIEJ1bmRsZXIgZnVuY3Rpb25hbGl0eToKKyAqLwordm9pZCBsaW5rX3JlY3ZfYnVuZGxlKHN0cnVjdCBza19idWZmICpidWYpCit7CisJdTMyIG1zZ2NvdW50ID0gbXNnX21zZ2NudChidWZfbXNnKGJ1ZikpOworCXUzMiBwb3MgPSBJTlRfSF9TSVpFOworCXN0cnVjdCBza19idWZmICpvYnVmOworCisJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI8Qk5ETDw6ICIpOworCXdoaWxlIChtc2djb3VudC0tKSB7CisJCW9idWYgPSBidWZfZXh0cmFjdChidWYsIHBvcyk7CisJCWlmIChvYnVmID09IE5VTEwpIHsKKwkJCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCisJCQl3YXJuKCJCdWZmZXIgYWxsb2NhdGlvbiBmYWlsdXJlO1xuIik7CisJCQl3YXJuKCIgIGluY29taW5nIG1lc3NhZ2UocykgZnJvbSAlcyBsb3N0XG4iLAorCQkJICAgICBhZGRyX3N0cmluZ19maWxsKGFkZHJfc3RyaW5nLCAKKwkJCQkJICAgICAgbXNnX29yaWdub2RlKGJ1Zl9tc2coYnVmKSkpKTsKKwkJCXJldHVybjsKKwkJfTsKKwkJcG9zICs9IGFsaWduKG1zZ19zaXplKGJ1Zl9tc2cob2J1ZikpKTsKKwkJbXNnX2RiZyhidWZfbXNnKG9idWYpLCAiICAgICAvIik7CisJCW5ldF9yb3V0ZV9tc2cob2J1Zik7CisJfQorCWJ1Zl9kaXNjYXJkKGJ1Zik7Cit9CisKKy8qCisgKiAgRnJhZ21lbnRhdGlvbi9kZWZyYWdtZW50YXRpb246CisgKi8KKworCisvKiAKKyAqIGxpbmtfc2VuZF9sb25nX2J1ZjogRW50cnkgZm9yIGJ1ZmZlcnMgbmVlZGluZyBmcmFnbWVudGF0aW9uLgorICogVGhlIGJ1ZmZlciBpcyBjb21wbGV0ZSwgaW5jbHVzaXZlIHRvdGFsIG1lc3NhZ2UgbGVuZ3RoLiAKKyAqIFJldHVybnMgdXNlciBkYXRhIGxlbmd0aC4KKyAqLworaW50IGxpbmtfc2VuZF9sb25nX2J1ZihzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHRpcGNfbXNnICppbm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwlzdHJ1Y3QgdGlwY19tc2cgZnJhZ21faGRyOworCXUzMiBpbnNpemUgPSBtc2dfc2l6ZShpbm1zZyk7CisJdTMyIGRzeiA9IG1zZ19kYXRhX3N6KGlubXNnKTsKKwl1bmNoYXIgKmNycyA9IGJ1Zi0+ZGF0YTsKKwl1MzIgcmVzdCA9IGluc2l6ZTsKKwl1MzIgcGFja19zeiA9IGxpbmtfbWF4X3BrdChsX3B0cik7CisJdTMyIGZyYWdtX3N6ID0gcGFja19zeiAtIElOVF9IX1NJWkU7CisJdTMyIGZyYWdtX25vID0gMTsKKwl1MzIgZGVzdGFkZHIgPSBtc2dfZGVzdG5vZGUoaW5tc2cpOworCisJaWYgKG1zZ19zaG9ydChpbm1zZykpCisJCWRlc3RhZGRyID0gbF9wdHItPmFkZHI7CisKKwlpZiAobXNnX3JvdXRlZChpbm1zZykpCisJCW1zZ19zZXRfcHJldm5vZGUoaW5tc2csIHRpcGNfb3duX2FkZHIpOworCisJLyogUHJlcGFyZSByZXVzYWJsZSBmcmFnbWVudCBoZWFkZXI6ICovCisKKwltc2dfaW5pdCgmZnJhZ21faGRyLCBNU0dfRlJBR01FTlRFUiwgRklSU1RfRlJBR01FTlQsCisJCSBUSVBDX09LLCBJTlRfSF9TSVpFLCBkZXN0YWRkcik7CisJbXNnX3NldF9saW5rX3NlbGVjdG9yKCZmcmFnbV9oZHIsIG1zZ19saW5rX3NlbGVjdG9yKGlubXNnKSk7CisJbXNnX3NldF9sb25nX21zZ25vKCZmcmFnbV9oZHIsIG1vZChsX3B0ci0+bG9uZ19tc2dfc2VxX25vKyspKTsKKwltc2dfc2V0X2ZyYWdtX25vKCZmcmFnbV9oZHIsIGZyYWdtX25vKTsKKwlsX3B0ci0+c3RhdHMuc2VudF9mcmFnbWVudGVkKys7CisKKwkvKiBDaG9wIHVwIG1lc3NhZ2U6ICovCisKKwl3aGlsZSAocmVzdCA+IDApIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmZyYWdtOworCisJCWlmIChyZXN0IDw9IGZyYWdtX3N6KSB7CisJCQlmcmFnbV9zeiA9IHJlc3Q7CisJCQltc2dfc2V0X3R5cGUoJmZyYWdtX2hkciwgTEFTVF9GUkFHTUVOVCk7CisJCX0KKwkJZnJhZ20gPSBidWZfYWNxdWlyZShmcmFnbV9zeiArIElOVF9IX1NJWkUpOworCQlpZiAoZnJhZ20gPT0gTlVMTCkgeworCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBmcmFnbWVudCBtc2dcbiIpOworCQkJZHN6ID0gLUVOT01FTTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQltc2dfc2V0X3NpemUoJmZyYWdtX2hkciwgZnJhZ21fc3ogKyBJTlRfSF9TSVpFKTsKKwkJbWVtY3B5KGZyYWdtLT5kYXRhLCAodW5jaGFyICopJmZyYWdtX2hkciwgSU5UX0hfU0laRSk7CisJCW1lbWNweShmcmFnbS0+ZGF0YSArIElOVF9IX1NJWkUsIGNycywgZnJhZ21fc3opOworCisJCS8qICBTZW5kIHF1ZXVlZCBtZXNzYWdlcyBmaXJzdCwgaWYgYW55OiAqLworCisJCWxfcHRyLT5zdGF0cy5zZW50X2ZyYWdtZW50cysrOworCQlsaW5rX3NlbmRfYnVmKGxfcHRyLCBmcmFnbSk7CisJCWlmICghbGlua19pc191cChsX3B0cikpCisJCQlyZXR1cm4gZHN6OworCQltc2dfc2V0X2ZyYWdtX25vKCZmcmFnbV9oZHIsICsrZnJhZ21fbm8pOworCQlyZXN0IC09IGZyYWdtX3N6OworCQljcnMgKz0gZnJhZ21fc3o7CisJCW1zZ19zZXRfdHlwZSgmZnJhZ21faGRyLCBGUkFHTUVOVCk7CisJfQorZXhpdDoKKwlidWZfZGlzY2FyZChidWYpOworCXJldHVybiBkc3o7Cit9CisKKy8qIAorICogQSBwZW5kaW5nIG1lc3NhZ2UgYmVpbmcgcmUtYXNzZW1ibGVkIG11c3Qgc3RvcmUgY2VydGFpbiB2YWx1ZXMgCisgKiB0byBoYW5kbGUgc3Vic2VxdWVudCBmcmFnbWVudHMgY29ycmVjdGx5LiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyAKKyAqIGhlbHAgc3RvcmluZyB0aGVzZSB2YWx1ZXMgaW4gdW51c2VkLCBhdmFpbGFibGUgZmllbGRzIGluIHRoZQorICogcGVuZGluZyBtZXNzYWdlLiBUaGlzIG1ha2VzIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gdW5lY2Vzc2FyeS4KKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfbG9uZ19tc2dfc2Vxbm8oc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlyZXR1cm4gbXNnX3NlcW5vKGJ1Zl9tc2coYnVmKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbG9uZ19tc2dfc2Vxbm8oc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgdTMyIHNlcW5vKQoreworCW1zZ19zZXRfc2Vxbm8oYnVmX21zZyhidWYpLCBzZXFubyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGdldF9mcmFnbV9zaXplKHN0cnVjdCBza19idWZmICpidWYpCit7CisJcmV0dXJuIG1zZ19hY2soYnVmX21zZyhidWYpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9mcmFnbV9zaXplKHN0cnVjdCBza19idWZmICpidWYsIHUzMiBzeikKK3sKKwltc2dfc2V0X2FjayhidWZfbXNnKGJ1ZiksIHN6KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgZ2V0X2V4cGVjdGVkX2ZyYWdzKHN0cnVjdCBza19idWZmICpidWYpCit7CisJcmV0dXJuIG1zZ19iY2FzdF9hY2soYnVmX21zZyhidWYpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9leHBlY3RlZF9mcmFncyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgZXhwKQoreworCW1zZ19zZXRfYmNhc3RfYWNrKGJ1Zl9tc2coYnVmKSwgZXhwKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgZ2V0X3RpbWVyX2NudChzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXJldHVybiBtc2dfcmVyb3V0ZV9jbnQoYnVmX21zZyhidWYpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluY3JfdGltZXJfY250KHN0cnVjdCBza19idWZmICpidWYpCit7CisJbXNnX2luY3JfcmVyb3V0ZV9jbnQoYnVmX21zZyhidWYpKTsKK30KKworLyogCisgKiBsaW5rX3JlY3ZfZnJhZ21lbnQoKTogQ2FsbGVkIHdpdGggbm9kZSBsb2NrIG9uLiBSZXR1cm5zIAorICogdGhlIHJlYXNzZW1ibGVkIGJ1ZmZlciBpZiBtZXNzYWdlIGlzIGNvbXBsZXRlLgorICovCitpbnQgbGlua19yZWN2X2ZyYWdtZW50KHN0cnVjdCBza19idWZmICoqcGVuZGluZywgc3RydWN0IHNrX2J1ZmYgKipmYiwgCisJCSAgICAgICBzdHJ1Y3QgdGlwY19tc2cgKiptKQoreworCXN0cnVjdCBza19idWZmICpwcmV2ID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZmJ1ZiA9ICpmYjsKKwlzdHJ1Y3QgdGlwY19tc2cgKmZyYWdtID0gYnVmX21zZyhmYnVmKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGJ1ZiA9ICpwZW5kaW5nOworCXUzMiBsb25nX21zZ19zZXFfbm8gPSBtc2dfbG9uZ19tc2dubyhmcmFnbSk7CisKKwkqZmIgPSAwOworCW1zZ19kYmcoZnJhZ20sIkZSRzxSRUM8Iik7CisKKwkvKiBJcyB0aGVyZSBhbiBpbmNvbXBsZXRlIG1lc3NhZ2Ugd2FpdGluZyBmb3IgdGhpcyBmcmFnbWVudD8gKi8KKworCXdoaWxlIChwYnVmICYmICgobXNnX3NlcW5vKGJ1Zl9tc2cocGJ1ZikpICE9IGxvbmdfbXNnX3NlcV9ubykKKwkJCXx8IChtc2dfb3JpZ25vZGUoZnJhZ20pICE9IG1zZ19vcmlnbm9kZShidWZfbXNnKHBidWYpKSkpKSB7CisJCXByZXYgPSBwYnVmOworCQlwYnVmID0gcGJ1Zi0+bmV4dDsKKwl9CisKKwlpZiAoIXBidWYgJiYgKG1zZ190eXBlKGZyYWdtKSA9PSBGSVJTVF9GUkFHTUVOVCkpIHsKKwkJc3RydWN0IHRpcGNfbXNnICppbXNnID0gKHN0cnVjdCB0aXBjX21zZyAqKW1zZ19kYXRhKGZyYWdtKTsKKwkJdTMyIG1zZ19zeiA9IG1zZ19zaXplKGltc2cpOworCQl1MzIgZnJhZ21fc3ogPSBtc2dfZGF0YV9zeihmcmFnbSk7CisJCXUzMiBleHBfZnJhZ21fY250ID0gbXNnX3N6L2ZyYWdtX3N6ICsgISEobXNnX3N6ICUgZnJhZ21fc3opOworCQl1MzIgbWF4ID0gIFRJUENfTUFYX1VTRVJfTVNHX1NJWkUgKyBMT05HX0hfU0laRTsKKwkJaWYgKG1zZ190eXBlKGltc2cpID09IFRJUENfTUNBU1RfTVNHKQorCQkJbWF4ID0gVElQQ19NQVhfVVNFUl9NU0dfU0laRSArIE1DQVNUX0hfU0laRTsKKwkJaWYgKG1zZ19zaXplKGltc2cpID4gbWF4KSB7CisJCQltc2dfZGJnKGZyYWdtLCI8UkVDPE92ZXJzaXplZDogIik7CisJCQlidWZfZGlzY2FyZChmYnVmKTsKKwkJCXJldHVybiAwOworCQl9CisJCXBidWYgPSBidWZfYWNxdWlyZShtc2dfc2l6ZShpbXNnKSk7CisJCWlmIChwYnVmICE9IE5VTEwpIHsKKwkJCXBidWYtPm5leHQgPSAqcGVuZGluZzsKKwkJCSpwZW5kaW5nID0gcGJ1ZjsKKwkJCW1lbWNweShwYnVmLT5kYXRhLCAodW5jaGFyICopaW1zZywgbXNnX2RhdGFfc3ooZnJhZ20pKTsKKworCQkJLyogIFByZXBhcmUgYnVmZmVyIGZvciBzdWJzZXF1ZW50IGZyYWdtZW50cy4gKi8KKworCQkJc2V0X2xvbmdfbXNnX3NlcW5vKHBidWYsIGxvbmdfbXNnX3NlcV9ubyk7IAorCQkJc2V0X2ZyYWdtX3NpemUocGJ1ZixmcmFnbV9zeik7IAorCQkJc2V0X2V4cGVjdGVkX2ZyYWdzKHBidWYsZXhwX2ZyYWdtX2NudCAtIDEpOyAKKwkJfSBlbHNlIHsKKwkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBnb3Qgbm8gZGVmcmFnbWVudGluZyBidWZmZXJcbiIpOworCQl9CisJCWJ1Zl9kaXNjYXJkKGZidWYpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHBidWYgJiYgKG1zZ190eXBlKGZyYWdtKSAhPSBGSVJTVF9GUkFHTUVOVCkpIHsKKwkJdTMyIGRzeiA9IG1zZ19kYXRhX3N6KGZyYWdtKTsKKwkJdTMyIGZzeiA9IGdldF9mcmFnbV9zaXplKHBidWYpOworCQl1MzIgY3JzID0gKChtc2dfZnJhZ21fbm8oZnJhZ20pIC0gMSkgKiBmc3opOworCQl1MzIgZXhwX2ZyYWdzID0gZ2V0X2V4cGVjdGVkX2ZyYWdzKHBidWYpIC0gMTsKKwkJbWVtY3B5KHBidWYtPmRhdGEgKyBjcnMsIG1zZ19kYXRhKGZyYWdtKSwgZHN6KTsKKwkJYnVmX2Rpc2NhcmQoZmJ1Zik7CisKKwkJLyogSXMgbWVzc2FnZSBjb21wbGV0ZT8gKi8KKworCQlpZiAoZXhwX2ZyYWdzID09IDApIHsKKwkJCWlmIChwcmV2KQorCQkJCXByZXYtPm5leHQgPSBwYnVmLT5uZXh0OworCQkJZWxzZQorCQkJCSpwZW5kaW5nID0gcGJ1Zi0+bmV4dDsKKwkJCW1zZ19yZXNldF9yZXJvdXRlX2NudChidWZfbXNnKHBidWYpKTsKKwkJCSpmYiA9IHBidWY7CisJCQkqbSA9IGJ1Zl9tc2cocGJ1Zik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlzZXRfZXhwZWN0ZWRfZnJhZ3MocGJ1ZixleHBfZnJhZ3MpOyAgICAgCisJCXJldHVybiAwOworCX0KKwlkYmcoIiBEaXNjYXJkaW5nIG9ycGhhbiBmcmFnbWVudCAleFxuIixmYnVmKTsKKwltc2dfZGJnKGZyYWdtLCJPUlBIQU46Iik7CisJZGJnKCJQZW5kaW5nIGxvbmcgYnVmZmVyczpcbiIpOworCWRiZ19wcmludF9idWZfY2hhaW4oKnBlbmRpbmcpOworCWJ1Zl9kaXNjYXJkKGZidWYpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGxpbmtfY2hlY2tfZGVmcmFnbV9idWZzIC0gZmx1c2ggc3RhbGUgaW5jb21pbmcgbWVzc2FnZSBmcmFnbWVudHMKKyAqIEBsX3B0cjogcG9pbnRlciB0byBsaW5rCisgKi8KKworc3RhdGljIHZvaWQgbGlua19jaGVja19kZWZyYWdtX2J1ZnMoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXN0cnVjdCBza19idWZmICpwcmV2ID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGxfcHRyLT5kZWZyYWdtX2J1ZjsKKworCWlmICghYnVmKQorCQlyZXR1cm47CisJaWYgKCFsaW5rX3dvcmtpbmdfd29ya2luZyhsX3B0cikpCisJCXJldHVybjsKKwl3aGlsZSAoYnVmKSB7CisJCXUzMiBjbnQgPSBnZXRfdGltZXJfY250KGJ1Zik7CisKKwkJbmV4dCA9IGJ1Zi0+bmV4dDsKKwkJaWYgKGNudCA8IDQpIHsKKwkJCWluY3JfdGltZXJfY250KGJ1Zik7CisJCQlwcmV2ID0gYnVmOworCQl9IGVsc2UgeworCQkJZGJnKCIgRGlzY2FyZGluZyBpbmNvbXBsZXRlIGxvbmcgYnVmZmVyXG4iKTsKKwkJCW1zZ19kYmcoYnVmX21zZyhidWYpLCAiTE9ORzoiKTsKKwkJCWRiZ19wcmludF9saW5rKGxfcHRyLCAiY3VycjoiKTsKKwkJCWRiZygiUGVuZGluZyBsb25nIGJ1ZmZlcnM6XG4iKTsKKwkJCWRiZ19wcmludF9idWZfY2hhaW4obF9wdHItPmRlZnJhZ21fYnVmKTsKKwkJCWlmIChwcmV2KQorCQkJCXByZXYtPm5leHQgPSBidWYtPm5leHQ7CisJCQllbHNlCisJCQkJbF9wdHItPmRlZnJhZ21fYnVmID0gYnVmLT5uZXh0OworCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJfQorCQlidWYgPSBuZXh0OworCX0KK30KKworCisKK3N0YXRpYyB2b2lkIGxpbmtfc2V0X3N1cGVydmlzaW9uX3Byb3BzKHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIHRvbGVyYW5jZSkKK3sKKwlsX3B0ci0+dG9sZXJhbmNlID0gdG9sZXJhbmNlOworCWxfcHRyLT5jb250aW51aXR5X2ludGVydmFsID0KKwkJKCh0b2xlcmFuY2UgLyA0KSA+IDUwMCkgPyA1MDAgOiB0b2xlcmFuY2UgLyA0OworCWxfcHRyLT5hYm9ydF9saW1pdCA9IHRvbGVyYW5jZSAvIChsX3B0ci0+Y29udGludWl0eV9pbnRlcnZhbCAvIDQpOworfQorCisKK3ZvaWQgbGlua19zZXRfcXVldWVfbGltaXRzKHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIHdpbmRvdykKK3sKKwkvKiBEYXRhIG1lc3NhZ2VzIGZyb20gdGhpcyBub2RlLCBpbmNsdXNpdmUgRklSU1RfRlJBR00gKi8KKwlsX3B0ci0+cXVldWVfbGltaXRbREFUQV9MT1ddID0gd2luZG93OworCWxfcHRyLT5xdWV1ZV9saW1pdFtEQVRBX01FRElVTV0gPSAod2luZG93IC8gMykgKiA0OworCWxfcHRyLT5xdWV1ZV9saW1pdFtEQVRBX0hJR0hdID0gKHdpbmRvdyAvIDMpICogNTsKKwlsX3B0ci0+cXVldWVfbGltaXRbREFUQV9DUklUSUNBTF0gPSAod2luZG93IC8gMykgKiA2OworCS8qIFRyYW5zaXRpbmcgZGF0YSBtZXNzYWdlcyxpbmNsdXNpdmUgRklSU1RfRlJBR00gKi8KKwlsX3B0ci0+cXVldWVfbGltaXRbREFUQV9MT1cgKyA0XSA9IDMwMDsKKwlsX3B0ci0+cXVldWVfbGltaXRbREFUQV9NRURJVU0gKyA0XSA9IDYwMDsKKwlsX3B0ci0+cXVldWVfbGltaXRbREFUQV9ISUdIICsgNF0gPSA5MDA7CisJbF9wdHItPnF1ZXVlX2xpbWl0W0RBVEFfQ1JJVElDQUwgKyA0XSA9IDEyMDA7CisJbF9wdHItPnF1ZXVlX2xpbWl0W0NPTk5fTUFOQUdFUl0gPSAxMjAwOworCWxfcHRyLT5xdWV1ZV9saW1pdFtST1VURV9ESVNUUklCVVRPUl0gPSAxMjAwOworCWxfcHRyLT5xdWV1ZV9saW1pdFtDSEFOR0VPVkVSX1BST1RPQ09MXSA9IDI1MDA7CisJbF9wdHItPnF1ZXVlX2xpbWl0W05BTUVfRElTVFJJQlVUT1JdID0gMzAwMDsKKwkvKiBGUkFHTUVOVCBhbmQgTEFTVF9GUkFHTUVOVCBwYWNrZXRzICovCisJbF9wdHItPnF1ZXVlX2xpbWl0W01TR19GUkFHTUVOVEVSXSA9IDQwMDA7Cit9CisKKy8qKgorICogbGlua19maW5kX2xpbmsgLSBsb2NhdGUgbGluayBieSBuYW1lCisgKiBAbmFtZSAtIHB0ciB0byBsaW5rIG5hbWUgc3RyaW5nCisgKiBAbm9kZSAtIHB0ciB0byBhcmVhIHRvIGJlIGZpbGxlZCB3aXRoIHB0ciB0byBhc3NvY2lhdGVkIG5vZGUKKyAqIAorICogQ2FsbGVyIG11c3QgaG9sZCAnbmV0X2xvY2snIHRvIGVuc3VyZSBub2RlIGFuZCBiZWFyZXIgYXJlIG5vdCBkZWxldGVkOworICogdGhpcyBhbHNvIHByZXZlbnRzIGxpbmsgZGVsZXRpb24uCisgKiAKKyAqIFJldHVybnMgcG9pbnRlciB0byBsaW5rIChvciAwIGlmIGludmFsaWQgbGluayBuYW1lKS4KKyAqLworCitzdGF0aWMgc3RydWN0IGxpbmsgKmxpbmtfZmluZF9saW5rKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBub2RlICoqbm9kZSkKK3sKKwlzdHJ1Y3QgbGlua19uYW1lIGxpbmtfbmFtZV9wYXJ0czsKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0cjsKKwlzdHJ1Y3QgbGluayAqbF9wdHI7IAorCisJaWYgKCFsaW5rX25hbWVfdmFsaWRhdGUobmFtZSwgJmxpbmtfbmFtZV9wYXJ0cykpCisJCXJldHVybiAwOworCisJYl9wdHIgPSBiZWFyZXJfZmluZF9pbnRlcmZhY2UobGlua19uYW1lX3BhcnRzLmlmX2xvY2FsKTsKKwlpZiAoIWJfcHRyKQorCQlyZXR1cm4gMDsKKworCSpub2RlID0gbm9kZV9maW5kKGxpbmtfbmFtZV9wYXJ0cy5hZGRyX3BlZXIpOyAKKwlpZiAoISpub2RlKQorCQlyZXR1cm4gMDsKKworCWxfcHRyID0gKCpub2RlKS0+bGlua3NbYl9wdHItPmlkZW50aXR5XTsKKwlpZiAoIWxfcHRyIHx8IHN0cmNtcChsX3B0ci0+bmFtZSwgbmFtZSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIGxfcHRyOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqbGlua19jbWRfY29uZmlnKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UsIAorCQkJICAgICAgICB1MTYgY21kKQoreworCXN0cnVjdCB0aXBjX2xpbmtfY29uZmlnICphcmdzOworICAgICAgICB1MzIgbmV3X3ZhbHVlOworCXN0cnVjdCBsaW5rICpsX3B0cjsKKwlzdHJ1Y3Qgbm9kZSAqbm9kZTsKKyAgICAgICAgaW50IHJlczsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfTElOS19DT05GSUcpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJYXJncyA9IChzdHJ1Y3QgdGlwY19saW5rX2NvbmZpZyAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJbmV3X3ZhbHVlID0gbnRvaGwoYXJncy0+dmFsdWUpOworCisJaWYgKCFzdHJjbXAoYXJncy0+bmFtZSwgYmNfbGlua19uYW1lKSkgeworCQlpZiAoKGNtZCA9PSBUSVBDX0NNRF9TRVRfTElOS19XSU5ET1cpICYmCisJCSAgICAoYmNsaW5rX3NldF9xdWV1ZV9saW1pdHMobmV3X3ZhbHVlKSA9PSAwKSkKKwkJCXJldHVybiBjZmdfcmVwbHlfbm9uZSgpOworCSAgICAgICAJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX1NVUFBPUlRFRAorCQkJCQkgICAgICAiIChjYW5ub3QgY2hhbmdlIHNldHRpbmcgb24gYnJvYWRjYXN0IGxpbmspIik7CisJfQorCisJcmVhZF9sb2NrX2JoKCZuZXRfbG9jayk7CisJbF9wdHIgPSBsaW5rX2ZpbmRfbGluayhhcmdzLT5uYW1lLCAmbm9kZSk7IAorCWlmICghbF9wdHIpIHsKKwkJcmVhZF91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwkgICAgICAgCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKCJsaW5rIG5vdCBmb3VuZCIpOworCX0KKworCW5vZGVfbG9jayhub2RlKTsKKwlyZXMgPSAtRUlOVkFMOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19UT0w6IAorCQlpZiAoKG5ld192YWx1ZSA+PSBUSVBDX01JTl9MSU5LX1RPTCkgJiYgCisJCSAgICAobmV3X3ZhbHVlIDw9IFRJUENfTUFYX0xJTktfVE9MKSkgeworCQkJbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMobF9wdHIsIG5ld192YWx1ZSk7CisJCQlsaW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csIAorCQkJCQkgICAgMCwgMCwgbmV3X3ZhbHVlLCAwLCAwKTsKKwkJCXJlcyA9IFRJUENfT0s7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19QUkk6IAorCQlpZiAobmV3X3ZhbHVlIDwgVElQQ19OVU1fTElOS19QUkkpIHsKKwkJCWxfcHRyLT5wcmlvcml0eSA9IG5ld192YWx1ZTsKKwkJCWxpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgCisJCQkJCSAgICAwLCAwLCAwLCBuZXdfdmFsdWUsIDApOworCQkJcmVzID0gVElQQ19PSzsKKwkJfQorCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1NFVF9MSU5LX1dJTkRPVzogCisJCWlmICgobmV3X3ZhbHVlID49IFRJUENfTUlOX0xJTktfV0lOKSAmJiAKKwkJICAgIChuZXdfdmFsdWUgPD0gVElQQ19NQVhfTElOS19XSU4pKSB7CisJCQlsaW5rX3NldF9xdWV1ZV9saW1pdHMobF9wdHIsIG5ld192YWx1ZSk7CisJCQlyZXMgPSBUSVBDX09LOworCQl9CisJCWJyZWFrOworCX0KKwlub2RlX3VubG9jayhub2RlKTsKKworCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisJaWYgKHJlcykKKwkgICAgICAgCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKCJjYW5ub3QgY2hhbmdlIGxpbmsgc2V0dGluZyIpOworCisJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7Cit9CisKKy8qKgorICogbGlua19yZXNldF9zdGF0aXN0aWNzIC0gcmVzZXQgbGluayBzdGF0aXN0aWNzCisgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluaworICovCisKK3N0YXRpYyB2b2lkIGxpbmtfcmVzZXRfc3RhdGlzdGljcyhzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJbWVtc2V0KCZsX3B0ci0+c3RhdHMsIDAsIHNpemVvZihsX3B0ci0+c3RhdHMpKTsKKwlsX3B0ci0+c3RhdHMuc2VudF9pbmZvID0gbF9wdHItPm5leHRfb3V0X25vOworCWxfcHRyLT5zdGF0cy5yZWN2X2luZm8gPSBsX3B0ci0+bmV4dF9pbl9ubzsKK30KKworc3RydWN0IHNrX2J1ZmYgKmxpbmtfY21kX3Jlc2V0X3N0YXRzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpCit7CisJY2hhciAqbGlua19uYW1lOworCXN0cnVjdCBsaW5rICpsX3B0cjsgCisJc3RydWN0IG5vZGUgKm5vZGU7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX0xJTktfTkFNRSkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwlsaW5rX25hbWUgPSAoY2hhciAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJaWYgKCFzdHJjbXAobGlua19uYW1lLCBiY19saW5rX25hbWUpKSB7CisJCWlmIChiY2xpbmtfcmVzZXRfc3RhdHMoKSkKKwkJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKCJsaW5rIG5vdCBmb3VuZCIpOworCQlyZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKKwl9CisKKwlyZWFkX2xvY2tfYmgoJm5ldF9sb2NrKTsKKwlsX3B0ciA9IGxpbmtfZmluZF9saW5rKGxpbmtfbmFtZSwgJm5vZGUpOyAKKwlpZiAoIWxfcHRyKSB7CisJCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKCJsaW5rIG5vdCBmb3VuZCIpOworCX0KKworCW5vZGVfbG9jayhub2RlKTsKKwlsaW5rX3Jlc2V0X3N0YXRpc3RpY3MobF9wdHIpOworCW5vZGVfdW5sb2NrKG5vZGUpOworCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisJcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7Cit9CisKKy8qKgorICogcGVyY2VudCAtIGNvbnZlcnQgY291bnQgdG8gYSBwZXJjZW50YWdlIG9mIHRvdGFsIChyb3VuZGluZyB1cCBvciBkb3duKQorICovCisKK3N0YXRpYyB1MzIgcGVyY2VudCh1MzIgY291bnQsIHUzMiB0b3RhbCkKK3sKKwlyZXR1cm4gKGNvdW50ICogMTAwICsgKHRvdGFsIC8gMikpIC8gdG90YWw7Cit9CisKKy8qKgorICogbGlua19zdGF0cyAtIHByaW50IGxpbmsgc3RhdGlzdGljcworICogQG5hbWU6IGxpbmsgbmFtZQorICogQGJ1ZjogcHJpbnQgYnVmZmVyIGFyZWEKKyAqIEBidWZfc2l6ZTogc2l6ZSBvZiBwcmludCBidWZmZXIgYXJlYQorICogCisgKiBSZXR1cm5zIGxlbmd0aCBvZiBwcmludCBidWZmZXIgZGF0YSBzdHJpbmcgKG9yIDAgaWYgZXJyb3IpCisgKi8KKworc3RhdGljIGludCBsaW5rX3N0YXRzKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZiwgY29uc3QgdTMyIGJ1Zl9zaXplKQoreworCXN0cnVjdCBwcmludF9idWYgcGI7CisJc3RydWN0IGxpbmsgKmxfcHRyOyAKKwlzdHJ1Y3Qgbm9kZSAqbm9kZTsKKwljaGFyICpzdGF0dXM7CisJdTMyIHByb2ZpbGVfdG90YWwgPSAwOworCisJaWYgKCFzdHJjbXAobmFtZSwgYmNfbGlua19uYW1lKSkKKwkJcmV0dXJuIGJjbGlua19zdGF0cyhidWYsIGJ1Zl9zaXplKTsKKworCXByaW50YnVmX2luaXQoJnBiLCBidWYsIGJ1Zl9zaXplKTsKKworCXJlYWRfbG9ja19iaCgmbmV0X2xvY2spOworCWxfcHRyID0gbGlua19maW5kX2xpbmsobmFtZSwgJm5vZGUpOyAKKwlpZiAoIWxfcHRyKSB7CisJCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisJCXJldHVybiAwOworCX0KKwlub2RlX2xvY2sobm9kZSk7CisKKwlpZiAobGlua19pc19hY3RpdmUobF9wdHIpKQorCQlzdGF0dXMgPSAiQUNUSVZFIjsKKwllbHNlIGlmIChsaW5rX2lzX3VwKGxfcHRyKSkKKwkJc3RhdHVzID0gIlNUQU5EQlkiOworCWVsc2UKKwkJc3RhdHVzID0gIkRFRlVOQ1QiOworCXRpcGNfcHJpbnRmKCZwYiwgIkxpbmsgPCVzPlxuIgorCQkgICAgICAgICAiICAlcyAgTVRVOiV1ICBQcmlvcml0eToldSAgVG9sZXJhbmNlOiV1IG1zIgorCQkgICAgICAgICAiICBXaW5kb3c6JXUgcGFja2V0c1xuIiwgCisJCSAgICBsX3B0ci0+bmFtZSwgc3RhdHVzLCBsaW5rX21heF9wa3QobF9wdHIpLCAKKwkJICAgIGxfcHRyLT5wcmlvcml0eSwgbF9wdHItPnRvbGVyYW5jZSwgbF9wdHItPnF1ZXVlX2xpbWl0WzBdKTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIFJYIHBhY2tldHM6JXUgZnJhZ21lbnRzOiV1LyV1IGJ1bmRsZXM6JXUvJXVcbiIsIAorCQkgICAgbF9wdHItPm5leHRfaW5fbm8gLSBsX3B0ci0+c3RhdHMucmVjdl9pbmZvLAorCQkgICAgbF9wdHItPnN0YXRzLnJlY3ZfZnJhZ21lbnRzLAorCQkgICAgbF9wdHItPnN0YXRzLnJlY3ZfZnJhZ21lbnRlZCwKKwkJICAgIGxfcHRyLT5zdGF0cy5yZWN2X2J1bmRsZXMsCisJCSAgICBsX3B0ci0+c3RhdHMucmVjdl9idW5kbGVkKTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIFRYIHBhY2tldHM6JXUgZnJhZ21lbnRzOiV1LyV1IGJ1bmRsZXM6JXUvJXVcbiIsIAorCQkgICAgbF9wdHItPm5leHRfb3V0X25vIC0gbF9wdHItPnN0YXRzLnNlbnRfaW5mbywKKwkJICAgIGxfcHRyLT5zdGF0cy5zZW50X2ZyYWdtZW50cywKKwkJICAgIGxfcHRyLT5zdGF0cy5zZW50X2ZyYWdtZW50ZWQsIAorCQkgICAgbF9wdHItPnN0YXRzLnNlbnRfYnVuZGxlcywKKwkJICAgIGxfcHRyLT5zdGF0cy5zZW50X2J1bmRsZWQpOworCXByb2ZpbGVfdG90YWwgPSBsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9jb3VudHM7CisJaWYgKCFwcm9maWxlX3RvdGFsKQorCQlwcm9maWxlX3RvdGFsID0gMTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIFRYIHByb2ZpbGUgc2FtcGxlOiV1IHBhY2tldHMgIGF2ZXJhZ2U6JXUgb2N0ZXRzXG4iCisJCSAgICAgICAgICIgIDAtNjQ6JXUlJSAtMjU2OiV1JSUgLTEwMjQ6JXUlJSAtNDA5NjoldSUlICIKKwkJICAgICAgICAgIi0xNjM1NDoldSUlIC0zMjc2ODoldSUlIC02NjAwMDoldSUlXG4iLAorCQkgICAgbF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfY291bnRzLAorCQkgICAgbF9wdHItPnN0YXRzLm1zZ19sZW5ndGhzX3RvdGFsIC8gcHJvZmlsZV90b3RhbCwKKwkJICAgIHBlcmNlbnQobF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVswXSwgcHJvZmlsZV90b3RhbCksCisJCSAgICBwZXJjZW50KGxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbMV0sIHByb2ZpbGVfdG90YWwpLAorCQkgICAgcGVyY2VudChsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzJdLCBwcm9maWxlX3RvdGFsKSwKKwkJICAgIHBlcmNlbnQobF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVszXSwgcHJvZmlsZV90b3RhbCksCisJCSAgICBwZXJjZW50KGxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbNF0sIHByb2ZpbGVfdG90YWwpLAorCQkgICAgcGVyY2VudChsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzVdLCBwcm9maWxlX3RvdGFsKSwKKwkJICAgIHBlcmNlbnQobF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVs2XSwgcHJvZmlsZV90b3RhbCkpOworCXRpcGNfcHJpbnRmKCZwYiwgIiAgUlggc3RhdGVzOiV1IHByb2JlczoldSBuYWtzOiV1IGRlZnM6JXUgZHVwczoldVxuIiwgCisJCSAgICBsX3B0ci0+c3RhdHMucmVjdl9zdGF0ZXMsCisJCSAgICBsX3B0ci0+c3RhdHMucmVjdl9wcm9iZXMsCisJCSAgICBsX3B0ci0+c3RhdHMucmVjdl9uYWNrcywKKwkJICAgIGxfcHRyLT5zdGF0cy5kZWZlcnJlZF9yZWN2LCAKKwkJICAgIGxfcHRyLT5zdGF0cy5kdXBsaWNhdGVzKTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIFRYIHN0YXRlczoldSBwcm9iZXM6JXUgbmFrczoldSBhY2tzOiV1IGR1cHM6JXVcbiIsIAorCQkgICAgbF9wdHItPnN0YXRzLnNlbnRfc3RhdGVzLCAKKwkJICAgIGxfcHRyLT5zdGF0cy5zZW50X3Byb2JlcywgCisJCSAgICBsX3B0ci0+c3RhdHMuc2VudF9uYWNrcywgCisJCSAgICBsX3B0ci0+c3RhdHMuc2VudF9hY2tzLCAKKwkJICAgIGxfcHRyLT5zdGF0cy5yZXRyYW5zbWl0dGVkKTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIENvbmdlc3Rpb24gYmVhcmVyOiV1IGxpbms6JXUgIFNlbmQgcXVldWUgbWF4OiV1IGF2ZzoldVxuIiwKKwkJICAgIGxfcHRyLT5zdGF0cy5iZWFyZXJfY29uZ3MsCisJCSAgICBsX3B0ci0+c3RhdHMubGlua19jb25ncywgCisJCSAgICBsX3B0ci0+c3RhdHMubWF4X3F1ZXVlX3N6LAorCQkgICAgbF9wdHItPnN0YXRzLnF1ZXVlX3N6X2NvdW50cworCQkgICAgPyAobF9wdHItPnN0YXRzLmFjY3VfcXVldWVfc3ogLyBsX3B0ci0+c3RhdHMucXVldWVfc3pfY291bnRzKQorCQkgICAgOiAwKTsKKworCW5vZGVfdW5sb2NrKG5vZGUpOworCXJlYWRfdW5sb2NrX2JoKCZuZXRfbG9jayk7CisJcmV0dXJuIHByaW50YnVmX3ZhbGlkYXRlKCZwYik7Cit9CisKKyNkZWZpbmUgTUFYX0xJTktfU1RBVFNfSU5GTyAyMDAwCisKK3N0cnVjdCBza19idWZmICpsaW5rX2NtZF9zaG93X3N0YXRzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGx2X2Rlc2MgKnJlcF90bHY7CisJaW50IHN0cl9sZW47CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX0xJTktfTkFNRSkpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwlidWYgPSBjZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKE1BWF9MSU5LX1NUQVRTX0lORk8pKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXBfdGx2ID0gKHN0cnVjdCB0bHZfZGVzYyAqKWJ1Zi0+ZGF0YTsKKworCXN0cl9sZW4gPSBsaW5rX3N0YXRzKChjaGFyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKSwKKwkJCSAgICAgKGNoYXIgKilUTFZfREFUQShyZXBfdGx2KSwgTUFYX0xJTktfU1RBVFNfSU5GTyk7CisJaWYgKCFzdHJfbGVuKSB7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJICAgICAgIAlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZygibGluayBub3QgZm91bmQiKTsKKwl9CisKKwlza2JfcHV0KGJ1ZiwgVExWX1NQQUNFKHN0cl9sZW4pKTsKKwlUTFZfU0VUKHJlcF90bHYsIFRJUENfVExWX1VMVFJBX1NUUklORywgTlVMTCwgc3RyX2xlbik7CisKKwlyZXR1cm4gYnVmOworfQorCisjaWYgMAoraW50IGxpbmtfY29udHJvbChjb25zdCBjaGFyICpuYW1lLCB1MzIgb3AsIHUzMiB2YWwpCit7CisJaW50IHJlcyA9IC1FSU5WQUw7CisJc3RydWN0IGxpbmsgKmxfcHRyOworCXUzMiBiZWFyZXJfaWQ7CisJc3RydWN0IG5vZGUgKiBub2RlOworCXUzMiBhOworCisJYSA9IGxpbmtfbmFtZTJhZGRyKG5hbWUsICZiZWFyZXJfaWQpOworCXJlYWRfbG9ja19iaCgmbmV0X2xvY2spOworCW5vZGUgPSBub2RlX2ZpbmQoYSk7CisJaWYgKG5vZGUpIHsKKwkJbm9kZV9sb2NrKG5vZGUpOworCQlsX3B0ciA9IG5vZGUtPmxpbmtzW2JlYXJlcl9pZF07CisJCWlmIChsX3B0cikgeworCQkJaWYgKG9wID09IFRJUENfUkVNT1ZFX0xJTkspIHsKKwkJCQlzdHJ1Y3QgYmVhcmVyICpiX3B0ciA9IGxfcHRyLT5iX3B0cjsKKwkJCQlzcGluX2xvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCQkJCWxpbmtfZGVsZXRlKGxfcHRyKTsKKwkJCQlzcGluX3VubG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJCQl9CisJCQlpZiAob3AgPT0gVElQQ19DTURfQkxPQ0tfTElOSykgeworCQkJCWxpbmtfcmVzZXQobF9wdHIpOworCQkJCWxfcHRyLT5ibG9ja2VkID0gMTsKKwkJCX0KKwkJCWlmIChvcCA9PSBUSVBDX0NNRF9VTkJMT0NLX0xJTkspIHsKKwkJCQlsX3B0ci0+YmxvY2tlZCA9IDA7CisJCQl9CisJCQlyZXMgPSBUSVBDX09LOworCQl9CisJCW5vZGVfdW5sb2NrKG5vZGUpOworCX0KKwlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOworCXJldHVybiByZXM7Cit9CisjZW5kaWYKKworLyoqCisgKiBsaW5rX2dldF9tYXhfcGt0IC0gZ2V0IG1heGltdW0gcGFja2V0IHNpemUgdG8gdXNlIHdoZW4gc2VuZGluZyB0byBkZXN0aW5hdGlvbgorICogQGRlc3Q6IG5ldHdvcmsgYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBub2RlCisgKiBAc2VsZWN0b3I6IHVzZWQgdG8gc2VsZWN0IGZyb20gc2V0IG9mIGFjdGl2ZSBsaW5rcworICogCisgKiBJZiBubyBhY3RpdmUgbGluayBjYW4gYmUgZm91bmQsIHVzZXMgZGVmYXVsdCBtYXhpbXVtIHBhY2tldCBzaXplLgorICovCisKK3UzMiBsaW5rX2dldF9tYXhfcGt0KHUzMiBkZXN0LCB1MzIgc2VsZWN0b3IpCit7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCXN0cnVjdCBsaW5rICpsX3B0cjsKKwl1MzIgcmVzID0gTUFYX1BLVF9ERUZBVUxUOworCQorCWlmIChkZXN0ID09IHRpcGNfb3duX2FkZHIpCisJCXJldHVybiBNQVhfTVNHX1NJWkU7CisKKwlyZWFkX2xvY2tfYmgoJm5ldF9sb2NrKTsgICAgICAgIAorCW5fcHRyID0gbm9kZV9zZWxlY3QoZGVzdCwgc2VsZWN0b3IpOworCWlmIChuX3B0cikgeworCQlub2RlX2xvY2sobl9wdHIpOworCQlsX3B0ciA9IG5fcHRyLT5hY3RpdmVfbGlua3Nbc2VsZWN0b3IgJiAxXTsKKwkJaWYgKGxfcHRyKQorCQkJcmVzID0gbGlua19tYXhfcGt0KGxfcHRyKTsKKwkJbm9kZV91bmxvY2sobl9wdHIpOworCX0KKwlyZWFkX3VubG9ja19iaCgmbmV0X2xvY2spOyAgICAgICAKKwlyZXR1cm4gcmVzOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgbGlua19kdW1wX3JlY19xdWV1ZShzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmNyczsKKworCWlmICghbF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbikgeworCQlpbmZvKCJSZWNlcHRpb24gcXVldWUgZW1wdHlcbiIpOworCQlyZXR1cm47CisJfQorCWluZm8oIkNvbnRlbnRzIG9mIFJlY2VwdGlvbiBxdWV1ZTpcbiIpOworCWNycyA9IGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW47CisJd2hpbGUgKGNycykgeworCQlpZiAoY3JzLT5kYXRhID09ICh2b2lkICopMHgwMDAwYTNhMykgeworCQkJaW5mbygiYnVmZmVyICV4IGludmFsaWRcbiIsIGNycyk7CisJCQlyZXR1cm47CisJCX0KKwkJbXNnX2RiZyhidWZfbXNnKGNycyksICJJbiByZWMgcXVldWU6IFxuIik7CisJCWNycyA9IGNycy0+bmV4dDsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbGlua19kdW1wX3NlbmRfcXVldWUoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCWlmIChsX3B0ci0+bmV4dF9vdXQpIHsKKwkJaW5mbygiXG5Db250ZW50cyBvZiB1bnNlbnQgcXVldWU6XG4iKTsKKwkJZGJnX3ByaW50X2J1Zl9jaGFpbihsX3B0ci0+bmV4dF9vdXQpOworCX0KKwlpbmZvKCJcbkNvbnRlbnRzIG9mIHNlbmQgcXVldWU6XG4iKTsKKwlpZiAobF9wdHItPmZpcnN0X291dCkgeworCQlkYmdfcHJpbnRfYnVmX2NoYWluKGxfcHRyLT5maXJzdF9vdXQpOworCX0KKwlpbmZvKCJFbXB0eSBzZW5kIHF1ZXVlXG4iKTsKK30KKworc3RhdGljIHZvaWQgbGlua19wcmludChzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBwcmludF9idWYgKmJ1ZiwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl0aXBjX3ByaW50ZihidWYsIHN0cik7CisJaWYgKGxpbmtfcmVzZXRfcmVzZXQobF9wdHIpIHx8IGxpbmtfcmVzZXRfdW5rbm93bihsX3B0cikpCisJCXJldHVybjsKKwl0aXBjX3ByaW50ZihidWYsICJMaW5rICV4PCVzPjoiLAorCQkgICAgbF9wdHItPmFkZHIsIGxfcHRyLT5iX3B0ci0+cHVibC5uYW1lKTsKKwl0aXBjX3ByaW50ZihidWYsICI6IE5YTygldSk6IiwgbW9kKGxfcHRyLT5uZXh0X291dF9ubykpOworCXRpcGNfcHJpbnRmKGJ1ZiwgIk5YSSgldSk6IiwgbW9kKGxfcHRyLT5uZXh0X2luX25vKSk7CisJdGlwY19wcmludGYoYnVmLCAiU1FVRSIpOworCWlmIChsX3B0ci0+Zmlyc3Rfb3V0KSB7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlsldS4uIiwgbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPmZpcnN0X291dCkpKTsKKwkJaWYgKGxfcHRyLT5uZXh0X291dCkKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIiV1Li4iLAorCQkJCSAgICBtc2dfc2Vxbm8oYnVmX21zZyhsX3B0ci0+bmV4dF9vdXQpKSk7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIiV1XSIsCisJCQkgICAgbXNnX3NlcW5vKGJ1Zl9tc2cKKwkJCQkgICAgICAobF9wdHItPmxhc3Rfb3V0KSksIGxfcHRyLT5vdXRfcXVldWVfc2l6ZSk7CisJCWlmICgobW9kKG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5sYXN0X291dCkpIC0gCisJCQkgbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPmZpcnN0X291dCkpKSAKKwkJICAgICAhPSAobF9wdHItPm91dF9xdWV1ZV9zaXplIC0gMSkpCisJCSAgICB8fCAobF9wdHItPmxhc3Rfb3V0LT5uZXh0ICE9IDApKSB7CisJCQl0aXBjX3ByaW50ZihidWYsICJcblNlbmQgcXVldWUgaW5jb25zaXN0ZW5jeVxuIik7CisJCQl0aXBjX3ByaW50ZihidWYsICJmaXJzdF9vdXQ9ICV4ICIsIGxfcHRyLT5maXJzdF9vdXQpOworCQkJdGlwY19wcmludGYoYnVmLCAibmV4dF9vdXQ9ICV4ICIsIGxfcHRyLT5uZXh0X291dCk7CisJCQl0aXBjX3ByaW50ZihidWYsICJsYXN0X291dD0gJXggIiwgbF9wdHItPmxhc3Rfb3V0KTsKKwkJCWxpbmtfZHVtcF9zZW5kX3F1ZXVlKGxfcHRyKTsKKwkJfQorCX0gZWxzZQorCQl0aXBjX3ByaW50ZihidWYsICJbXSIpOworCXRpcGNfcHJpbnRmKGJ1ZiwgIlNRU0laKCV1KSIsIGxfcHRyLT5vdXRfcXVldWVfc2l6ZSk7CisJaWYgKGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4pIHsKKwkJdTMyIG8gPSBtc2dfc2Vxbm8oYnVmX21zZyhsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luKSk7CisJCXUzMiBuID0gbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPm5ld2VzdF9kZWZlcnJlZF9pbikpOworCQl0aXBjX3ByaW50ZihidWYsICI6UlFVRVsldS4uJXVdIiwgbywgbik7CisJCWlmIChsX3B0ci0+ZGVmZXJyZWRfaW5xdWV1ZV9zeiAhPSBtb2QoKG4gKyAxKSAtIG8pKSB7CisJCQl0aXBjX3ByaW50ZihidWYsICI6UlFTSVooJXUpIiwKKwkJCQkgICAgbF9wdHItPmRlZmVycmVkX2lucXVldWVfc3opOworCQl9CisJfQorCWlmIChsaW5rX3dvcmtpbmdfdW5rbm93bihsX3B0cikpCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpXVSIpOworCWlmIChsaW5rX3Jlc2V0X3Jlc2V0KGxfcHRyKSkKKwkJdGlwY19wcmludGYoYnVmLCAiOlJSIik7CisJaWYgKGxpbmtfcmVzZXRfdW5rbm93bihsX3B0cikpCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpSVSIpOworCWlmIChsaW5rX3dvcmtpbmdfd29ya2luZyhsX3B0cikpCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpXVyIpOworCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuIik7Cit9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL2xpbmsuaCBiL25ldC90aXBjL2xpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjU1M2YwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbGluay5oCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogbmV0L3RpcGMvbGluay5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgbGluayBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5NS0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19MSU5LX0gKKyNkZWZpbmUgX1RJUENfTElOS19ICisKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJtc2cuaCIKKyNpbmNsdWRlICJiZWFyZXIuaCIKKyNpbmNsdWRlICJub2RlLmgiCisKKyNkZWZpbmUgUFVTSF9GQUlMRUQgICAxCisjZGVmaW5lIFBVU0hfRklOSVNIRUQgMgorCisvKiAKKyAqIExpbmsgc3RhdGVzIAorICovCisKKyNkZWZpbmUgV09SS0lOR19XT1JLSU5HIDU2MDgxMHUKKyNkZWZpbmUgV09SS0lOR19VTktOT1dOIDU2MDgxMXUKKyNkZWZpbmUgUkVTRVRfVU5LTk9XTiAgIDU2MDgxMnUKKyNkZWZpbmUgUkVTRVRfUkVTRVQgICAgIDU2MDgxM3UKKworLyogCisgKiBTdGFydGluZyB2YWx1ZSBmb3IgbWF4aW11bSBwYWNrZXQgc2l6ZSBuZWdvdGlhdGlvbiBvbiB1bmljYXN0IGxpbmtzCisgKiAodW5sZXNzIGJlYXJlciBNVFUgaXMgbGVzcykKKyAqLworCisjZGVmaW5lIE1BWF9QS1RfREVGQVVMVCAxNTAwCisKKy8qKgorICogc3RydWN0IGxpbmsgLSBUSVBDIGxpbmsgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBhZGRyOiBuZXR3b3JrIGFkZHJlc3Mgb2YgbGluaydzIHBlZXIgbm9kZQorICogQG5hbWU6IGxpbmsgbmFtZSBjaGFyYWN0ZXIgc3RyaW5nCisgKiBAbWVkaWFfYWRkcjogbWVkaWEgYWRkcmVzcyB0byB1c2Ugd2hlbiBzZW5kaW5nIG1lc3NhZ2VzIG92ZXIgbGluaworICogQHRpbWVyOiBsaW5rIHRpbWVyCisgKiBAb3duZXI6IHBvaW50ZXIgdG8gcGVlciBub2RlCisgKiBAbGlua19saXN0OiBhZGphY2VudCBsaW5rcyBpbiBiZWFyZXIncyBsaXN0IG9mIGxpbmtzCisgKiBAc3RhcnRlZDogaW5kaWNhdGVzIGlmIGxpbmsgaGFzIGJlZW4gc3RhcnRlZAorICogQGNoZWNrcG9pbnQ6IHJlZmVyZW5jZSBwb2ludCBmb3IgdHJpZ2dlcmluZyBsaW5rIGNvbnRpbnVpdHkgY2hlY2tpbmcKKyAqIEBwZWVyX3Nlc3Npb246IGxpbmsgc2Vzc2lvbiAjIGJlaW5nIHVzZWQgYnkgcGVlciBlbmQgb2YgbGluaworICogQHBlZXJfYmVhcmVyX2lkOiBiZWFyZXIgaWQgdXNlZCBieSBsaW5rJ3MgcGVlciBlbmRwb2ludAorICogQGJfcHRyOiBwb2ludGVyIHRvIGJlYXJlciB1c2VkIGJ5IGxpbmsKKyAqIEB0b2xlcmFuY2U6IG1pbmltdW0gbGluayBjb250aW51aXR5IGxvc3MgbmVlZGVkIHRvIHJlc2V0IGxpbmsgW2luIG1zXSAKKyAqIEBjb250aW51aXR5X2ludGVydmFsOiBsaW5rIGNvbnRpbnVpdHkgdGVzdGluZyBpbnRlcnZhbCBbaW4gbXNdCisgKiBAYWJvcnRfbGltaXQ6ICMgb2YgdW5hY2tub3dsZWRnZWQgY29udGludWl0eSBwcm9iZXMgbmVlZGVkIHRvIHJlc2V0IGxpbmsKKyAqIEBzdGF0ZTogY3VycmVudCBzdGF0ZSBvZiBsaW5rIEZTTQorICogQGJsb2NrZWQ6IGluZGljYXRlcyBpZiBsaW5rIGhhcyBiZWVuIGFkbWluaXN0cmF0aXZlbHkgYmxvY2tlZAorICogQGZzbV9tc2dfY250OiAjIG9mIHByb3RvY29sIG1lc3NhZ2VzIGxpbmsgRlNNIGhhcyBzZW50IGluIGN1cnJlbnQgc3RhdGUKKyAqIEBwcm90b19tc2c6IHRlbXBsYXRlIGZvciBjb250cm9sIG1lc3NhZ2VzIGdlbmVyYXRlZCBieSBsaW5rCisgKiBAcG1zZzogY29udmVuaWVuY2UgcG9pbnRlciB0byAicHJvdG9fbXNnIiBmaWVsZAorICogQHByaW9yaXR5OiBjdXJyZW50IGxpbmsgcHJpb3JpdHkKKyAqIEBxdWV1ZV9saW1pdDogb3V0Ym91bmQgbWVzc2FnZSBxdWV1ZSBjb25nZXN0aW9uIHRocmVzaG9sZHMgKGluZGV4ZWQgYnkgdXNlcikKKyAqIEBleHBfbXNnX2NvdW50OiAjIG9mIHR1bm5lbGxlZCBtZXNzYWdlcyBleHBlY3RlZCBkdXJpbmcgbGluayBjaGFuZ2VvdmVyCisgKiBAcmVzZXRfY2hlY2twb2ludDogc2VxICMgb2YgbGFzdCBhY2tub3dsZWRnZWQgbWVzc2FnZSBhdCB0aW1lIG9mIGxpbmsgcmVzZXQKKyAqIEBtYXhfcGt0OiBjdXJyZW50IG1heGltdW0gcGFja2V0IHNpemUgZm9yIHRoaXMgbGluaworICogQG1heF9wa3RfdGFyZ2V0OiBkZXNpcmVkIG1heGltdW0gcGFja2V0IHNpemUgZm9yIHRoaXMgbGluaworICogQG1heF9wa3RfcHJvYmVzOiAjIG9mIHByb2JlcyBiYXNlZCBvbiBjdXJyZW50IChtYXhfcGt0LCBtYXhfcGt0X3RhcmdldCkKKyAqIEBvdXRfcXVldWVfc2l6ZTogIyBvZiBtZXNzYWdlcyBpbiBvdXRib3VuZCBtZXNzYWdlIHF1ZXVlCisgKiBAZmlyc3Rfb3V0OiBwdHIgdG8gZmlyc3Qgb3V0Ym91bmQgbWVzc2FnZSBpbiBxdWV1ZQorICogQGxhc3Rfb3V0OiBwdHIgdG8gbGFzdCBvdXRib3VuZCBtZXNzYWdlIGluIHF1ZXVlCisgKiBAbmV4dF9vdXRfbm86IG5leHQgc2VxdWVuY2UgbnVtYmVyIHRvIHVzZSBmb3Igb3V0Ym91bmQgbWVzc2FnZXMKKyAqIEBsYXN0X3JldHJhbnNtaXR0ZWQ6IHNlcXVlbmNlIG51bWJlciBvZiBtb3N0IHJlY2VudGx5IHJldHJhbnNtaXR0ZWQgbWVzc2FnZQorICogQHN0YWxlX2NvdW50OiAjIG9mIGlkZW50aWNhbCByZXRyYW5zbWl0IHJlcXVlc3RzIG1hZGUgYnkgcGVlcgorICogQG5leHRfaW5fbm86IG5leHQgc2VxdWVuY2UgbnVtYmVyIHRvIGV4cGVjdCBmb3IgaW5ib3VuZCBtZXNzYWdlcworICogQGRlZmVycmVkX2lucXVldWVfc3o6ICMgb2YgbWVzc2FnZXMgaW4gaW5ib3VuZCBtZXNzYWdlIHF1ZXVlCisgKiBAb2xkZXN0X2RlZmVycmVkX2luOiBwdHIgdG8gZmlyc3QgaW5ib3VuZCBtZXNzYWdlIGluIHF1ZXVlCisgKiBAbmV3ZXN0X2RlZmVycmVkX2luOiBwdHIgdG8gbGFzdCBpbmJvdW5kIG1lc3NhZ2UgaW4gcXVldWUKKyAqIEB1bmFja2VkX3dpbmRvdzogIyBvZiBpbmJvdW5kIG1lc3NhZ2VzIHJ4J2Qgd2l0aG91dCBhY2snaW5nIGJhY2sgdG8gcGVlcgorICogQHByb3RvX21zZ19xdWV1ZTogcHRyIHRvIChzaW5nbGUpIG91dGJvdW5kIGNvbnRyb2wgbWVzc2FnZQorICogQHJldHJhbnNtX3F1ZXVlX3NpemU6IG51bWJlciBvZiBtZXNzYWdlcyB0byByZXRyYW5zbWl0CisgKiBAcmV0cmFuc21fcXVldWVfaGVhZDogc2VxdWVuY2UgbnVtYmVyIG9mIGZpcnN0IG1lc3NhZ2UgdG8gcmV0cmFuc21pdAorICogQG5leHRfb3V0OiBwdHIgdG8gZmlyc3QgdW5zZW50IG91dGJvdW5kIG1lc3NhZ2UgaW4gcXVldWUKKyAqIEB3YWl0aW5nX3BvcnRzOiBsaW5rZWQgbGlzdCBvZiBwb3J0cyB3YWl0aW5nIGZvciBsaW5rIGNvbmdlc3Rpb24gdG8gYWJhdGUKKyAqIEBsb25nX21zZ19zZXFfbm86IG5leHQgaWRlbnRpZmllciB0byB1c2UgZm9yIG91dGJvdW5kIGZyYWdtZW50ZWQgbWVzc2FnZXMKKyAqIEBkZWZyYWdtX2J1ZjogbGlzdCBvZiBwYXJ0aWFsbHkgcmVhc3NlbWJsZWQgaW5ib3VuZCBtZXNzYWdlIGZyYWdtZW50cworICogQHN0YXRzOiBjb2xsZWN0cyBzdGF0aXN0aWNzIHJlZ2FyZGluZyBsaW5rIGFjdGl2aXR5CisgKiBAcHJpbnRfYnVmOiBwcmludCBidWZmZXIgdXNlZCB0byBsb2cgbGluayBhY3Rpdml0eQorICovCisgCitzdHJ1Y3QgbGluayB7CisJdTMyIGFkZHI7CisJY2hhciBuYW1lW1RJUENfTUFYX0xJTktfTkFNRV07CisJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBtZWRpYV9hZGRyOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXN0cnVjdCBub2RlICpvd25lcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbmtfbGlzdDsKKworCS8qIE1hbmFnZW1lbnQgYW5kIGxpbmsgc3VwZXJ2aXNpb24gZGF0YSAqLworCWludCBzdGFydGVkOworCXUzMiBjaGVja3BvaW50OworCXUzMiBwZWVyX3Nlc3Npb247CisJdTMyIHBlZXJfYmVhcmVyX2lkOworCXN0cnVjdCBiZWFyZXIgKmJfcHRyOworCXUzMiB0b2xlcmFuY2U7CisJdTMyIGNvbnRpbnVpdHlfaW50ZXJ2YWw7CisJdTMyIGFib3J0X2xpbWl0OworCWludCBzdGF0ZTsKKwlpbnQgYmxvY2tlZDsKKwl1MzIgZnNtX21zZ19jbnQ7CisJc3RydWN0IHsKKwkJdW5jaGFyIGhkcltJTlRfSF9TSVpFXTsKKwkJdW5jaGFyIGJvZHlbVElQQ19NQVhfSUZfTkFNRV07CisJfSBwcm90b19tc2c7CisJc3RydWN0IHRpcGNfbXNnICpwbXNnOworCXUzMiBwcmlvcml0eTsKKwl1MzIgcXVldWVfbGltaXRbMTVdOwkvKiBxdWV1ZV9saW1pdFswXT09d2luZG93IGxpbWl0ICovCisKKwkvKiBDaGFuZ2VvdmVyICovCisJdTMyIGV4cF9tc2dfY291bnQ7CisJdTMyIHJlc2V0X2NoZWNrcG9pbnQ7CisKKyAgICAgICAgLyogTWF4IHBhY2tldCBuZWdvdGlhdGlvbiAqLworICAgICAgICB1MzIgbWF4X3BrdDsKKyAgICAgICAgdTMyIG1heF9wa3RfdGFyZ2V0OworICAgICAgICB1MzIgbWF4X3BrdF9wcm9iZXM7CisKKwkvKiBTZW5kaW5nICovCisJdTMyIG91dF9xdWV1ZV9zaXplOworCXN0cnVjdCBza19idWZmICpmaXJzdF9vdXQ7CisJc3RydWN0IHNrX2J1ZmYgKmxhc3Rfb3V0OworCXUzMiBuZXh0X291dF9ubzsKKyAgICAgICAgdTMyIGxhc3RfcmV0cmFuc21pdHRlZDsKKyAgICAgICAgdTMyIHN0YWxlX2NvdW50OworCisJLyogUmVjZXB0aW9uICovCisJdTMyIG5leHRfaW5fbm87CisJdTMyIGRlZmVycmVkX2lucXVldWVfc3o7CisJc3RydWN0IHNrX2J1ZmYgKm9sZGVzdF9kZWZlcnJlZF9pbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3ZXN0X2RlZmVycmVkX2luOworCXUzMiB1bmFja2VkX3dpbmRvdzsKKworCS8qIENvbmdlc3Rpb24gaGFuZGxpbmcgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcHJvdG9fbXNnX3F1ZXVlOworCXUzMiByZXRyYW5zbV9xdWV1ZV9zaXplOworCXUzMiByZXRyYW5zbV9xdWV1ZV9oZWFkOworCXN0cnVjdCBza19idWZmICpuZXh0X291dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRpbmdfcG9ydHM7CisKKwkvKiBGcmFnbWVudGF0aW9uL2RlZnJhZ21lbnRhdGlvbiAqLworCXUzMiBsb25nX21zZ19zZXFfbm87CisJc3RydWN0IHNrX2J1ZmYgKmRlZnJhZ21fYnVmOworCisgICAgICAgIC8qIFN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgeworCQl1MzIgc2VudF9pbmZvOwkJLyogdXNlZCBpbiBjb3VudGluZyAjIHNlbnQgcGFja2V0cyAqLworCQl1MzIgcmVjdl9pbmZvOwkJLyogdXNlZCBpbiBjb3VudGluZyAjIHJlY3YnZCBwYWNrZXRzICovCisJCXUzMiBzZW50X3N0YXRlczsKKwkJdTMyIHJlY3Zfc3RhdGVzOworCQl1MzIgc2VudF9wcm9iZXM7CisJCXUzMiByZWN2X3Byb2JlczsKKwkJdTMyIHNlbnRfbmFja3M7CisJCXUzMiByZWN2X25hY2tzOworCQl1MzIgc2VudF9hY2tzOworCQl1MzIgc2VudF9idW5kbGVkOworCQl1MzIgc2VudF9idW5kbGVzOworCQl1MzIgcmVjdl9idW5kbGVkOworCQl1MzIgcmVjdl9idW5kbGVzOworCQl1MzIgcmV0cmFuc21pdHRlZDsKKwkJdTMyIHNlbnRfZnJhZ21lbnRlZDsKKwkJdTMyIHNlbnRfZnJhZ21lbnRzOworCQl1MzIgcmVjdl9mcmFnbWVudGVkOworCQl1MzIgcmVjdl9mcmFnbWVudHM7CisJCXUzMiBsaW5rX2NvbmdzOwkJLyogIyBwb3J0IHNlbmRzIGJsb2NrZWQgYnkgY29uZ2VzdGlvbiAqLworCQl1MzIgYmVhcmVyX2NvbmdzOworCQl1MzIgZGVmZXJyZWRfcmVjdjsKKwkJdTMyIGR1cGxpY2F0ZXM7CisKKwkJLyogZm9yIHN0YXRpc3RpY2FsIHByb2ZpbGluZyBvZiBzZW5kIHF1ZXVlIHNpemUgKi8KKworCQl1MzIgbWF4X3F1ZXVlX3N6OworCQl1MzIgYWNjdV9xdWV1ZV9zejsKKwkJdTMyIHF1ZXVlX3N6X2NvdW50czsKKworCQkvKiBmb3Igc3RhdGlzdGljYWwgcHJvZmlsaW5nIG9mIG1lc3NhZ2UgbGVuZ3RocyAqLworCisJCXUzMiBtc2dfbGVuZ3RoX2NvdW50czsKKwkJdTMyIG1zZ19sZW5ndGhzX3RvdGFsOworCQl1MzIgbXNnX2xlbmd0aF9wcm9maWxlWzddOworI2lmIDAKKwkJdTMyIHNlbnRfdHVubmVsZWQ7CisJCXUzMiByZWN2X3R1bm5lbGVkOworI2VuZGlmCisJfSBzdGF0czsKKworCXN0cnVjdCBwcmludF9idWYgcHJpbnRfYnVmOworfTsKKworc3RydWN0IHBvcnQ7CisKK3N0cnVjdCBsaW5rICpsaW5rX2NyZWF0ZShzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgY29uc3QgdTMyIHBlZXIsCisJCQkgY29uc3Qgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqbWVkaWFfYWRkcik7Cit2b2lkIGxpbmtfZGVsZXRlKHN0cnVjdCBsaW5rICpsX3B0cik7Cit2b2lkIGxpbmtfY2hhbmdlb3ZlcihzdHJ1Y3QgbGluayAqbF9wdHIpOwordm9pZCBsaW5rX3NlbmRfZHVwbGljYXRlKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IGxpbmsgKmRlc3QpOwordm9pZCBsaW5rX3Jlc2V0X2ZyYWdtZW50cyhzdHJ1Y3QgbGluayAqbF9wdHIpOworaW50IGxpbmtfaXNfdXAoc3RydWN0IGxpbmsgKmxfcHRyKTsKK2ludCBsaW5rX2lzX2FjdGl2ZShzdHJ1Y3QgbGluayAqbF9wdHIpOwordm9pZCBsaW5rX3N0YXJ0KHN0cnVjdCBsaW5rICpsX3B0cik7Cit1MzIgbGlua19wdXNoX3BhY2tldChzdHJ1Y3QgbGluayAqbF9wdHIpOwordm9pZCBsaW5rX3N0b3Aoc3RydWN0IGxpbmsgKmxfcHRyKTsKK3N0cnVjdCBza19idWZmICpsaW5rX2NtZF9jb25maWcoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSwgdTE2IGNtZCk7CitzdHJ1Y3Qgc2tfYnVmZiAqbGlua19jbWRfc2hvd19zdGF0cyhjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKTsKK3N0cnVjdCBza19idWZmICpsaW5rX2NtZF9yZXNldF9zdGF0cyhjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKTsKK3ZvaWQgbGlua19yZXNldChzdHJ1Y3QgbGluayAqbF9wdHIpOworaW50IGxpbmtfc2VuZChzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgZGVzdCwgdTMyIHNlbGVjdG9yKTsKK2ludCBsaW5rX3NlbmRfYnVmKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7Cit1MzIgbGlua19nZXRfbWF4X3BrdCh1MzIgZGVzdCx1MzIgc2VsZWN0b3IpOworaW50IGxpbmtfc2VuZF9zZWN0aW9uc19mYXN0KHN0cnVjdCBwb3J0KiBzZW5kZXIsIAorCQkJICAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsCisJCQkgICAgY29uc3QgdTMyIG51bV9zZWN0LCAKKwkJCSAgICB1MzIgZGVzdG5vZGUpOworCitpbnQgbGlua19zZW5kX2xvbmdfYnVmKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7Cit2b2lkIGxpbmtfdHVubmVsKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHRpcGNfbXNnICp0bmxfaGRyLAorCQkgc3RydWN0IHRpcGNfbXNnICptc2csIHUzMiBzZWxlY3Rvcik7Cit2b2lkIGxpbmtfcmVjdl9idW5kbGUoc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CitpbnQgIGxpbmtfcmVjdl9mcmFnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqKnBlbmRpbmcsCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqKmZiLAorCQkJc3RydWN0IHRpcGNfbXNnICoqbXNnKTsKK3ZvaWQgbGlua19zZW5kX3Byb3RvX21zZyhzdHJ1Y3QgbGluayAqbF9wdHIsIHUzMiBtc2dfdHlwLCBpbnQgcHJvYiwgdTMyIGdhcCwgCisJCQkgdTMyIHRvbGVyYW5jZSwgdTMyIHByaW9yaXR5LCB1MzIgYWNrZWRfbXR1KTsKK3ZvaWQgbGlua19wdXNoX3F1ZXVlKHN0cnVjdCBsaW5rICpsX3B0cik7Cit1MzIgbGlua19kZWZlcl9wa3Qoc3RydWN0IHNrX2J1ZmYgKipoZWFkLCBzdHJ1Y3Qgc2tfYnVmZiAqKnRhaWwsCisJCSAgIHN0cnVjdCBza19idWZmICpidWYpOwordm9pZCBsaW5rX3dha2V1cF9wb3J0cyhzdHJ1Y3QgbGluayAqbF9wdHIsIGludCBhbGwpOwordm9pZCBsaW5rX3NldF9xdWV1ZV9saW1pdHMoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgd2luZG93KTsKK3ZvaWQgbGlua19yZXRyYW5zbWl0KHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKnN0YXJ0LCB1MzIgcmV0cmFuc21pdHMpOworCisvKgorICogTGluayBzZXF1ZW5jZSBudW1iZXIgbWFuaXB1bGF0aW9uIHJvdXRpbmVzICh1c2VzIG1vZHVsbyAyKioxNiBhcml0aG1ldGljKQorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1vZCh1MzIgeCkKK3sKKwlyZXR1cm4geCAmIDB4ZmZmZnU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJldHdlZW4odTMyIGxvd2VyLCB1MzIgdXBwZXIsIHUzMiBuKQoreworCWlmICgobG93ZXIgPCBuKSAmJiAobiA8IHVwcGVyKSkKKwkJcmV0dXJuIDE7CisJaWYgKCh1cHBlciA8IGxvd2VyKSAmJiAoKG4gPiBsb3dlcikgfHwgKG4gPCB1cHBlcikpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGVzc19lcSh1MzIgbGVmdCwgdTMyIHJpZ2h0KQoreworCXJldHVybiAobW9kKHJpZ2h0IC0gbGVmdCkgPCAzMjc2OHUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBsZXNzKHUzMiBsZWZ0LCB1MzIgcmlnaHQpCit7CisJcmV0dXJuIChsZXNzX2VxKGxlZnQsIHJpZ2h0KSAmJiAobW9kKHJpZ2h0KSAhPSBtb2QobGVmdCkpKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbGVzc2VyKHUzMiBsZWZ0LCB1MzIgcmlnaHQpCit7CisJcmV0dXJuIGxlc3NfZXEobGVmdCwgcmlnaHQpID8gbGVmdCA6IHJpZ2h0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL21zZy5jIGIvbmV0L3RpcGMvbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkYmM1NQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL21zZy5jCkBAIC0wLDAgKzEsMzM0IEBACisvKgorICogbmV0L3RpcGMvbXNnLmM6IFRJUEMgbWVzc2FnZSBoZWFkZXIgcm91dGluZXMKKyAqICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorCisKK3ZvaWQgbXNnX3NldF9tZWRpYV9hZGRyKHN0cnVjdCB0aXBjX21zZyAqbSwgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSkKK3sKKwltZW1jcHkoJigoaW50ICopbSlbNV0sIGEsIHNpemVvZigqYSkpOworfQorCit2b2lkIG1zZ19nZXRfbWVkaWFfYWRkcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEpCit7CisJbWVtY3B5KGEsICYoKGludCopbSlbNV0sIHNpemVvZigqYSkpOworfQorCisKK3ZvaWQgbXNnX3ByaW50KHN0cnVjdCBwcmludF9idWYgKmJ1Ziwgc3RydWN0IHRpcGNfbXNnICptc2csIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl1MzIgdXNyID0gbXNnX3VzZXIobXNnKTsKKwl0aXBjX3ByaW50ZihidWYsIHN0cik7CisKKwlzd2l0Y2ggKHVzcikgeworCWNhc2UgTVNHX0JVTkRMRVI6CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIkJOREw6OiIpOworCQl0aXBjX3ByaW50ZihidWYsICJNU0dTKCV1KToiLCBtc2dfbXNnY250KG1zZykpOworCQlicmVhazsKKwljYXNlIEJDQVNUX1BST1RPQ09MOgorCQl0aXBjX3ByaW50ZihidWYsICJCQ0FTVFA6OiIpOworCQlicmVhazsKKwljYXNlIE1TR19GUkFHTUVOVEVSOgorCQl0aXBjX3ByaW50ZihidWYsICJGUkFHTTo6Iik7CisJCXN3aXRjaCAobXNnX3R5cGUobXNnKSkgeworCQljYXNlIEZJUlNUX0ZSQUdNRU5UOgorCQkJdGlwY19wcmludGYoYnVmLCAiRklSU1Q6Iik7CisJCQlicmVhazsKKwkJY2FzZSBGUkFHTUVOVDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkJPRFk6Iik7CisJCQlicmVhazsKKwkJY2FzZSBMQVNUX0ZSQUdNRU5UOgorCQkJdGlwY19wcmludGYoYnVmLCAiTEFTVDoiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGlwY19wcmludGYoYnVmLCAiVU5LTk9XTjoleCIsbXNnX3R5cGUobXNnKSk7CisKKwkJfQorCQl0aXBjX3ByaW50ZihidWYsICJOTygldS8ldSk6Iixtc2dfbG9uZ19tc2dubyhtc2cpLAorCQkJICAgIG1zZ19mcmFnbV9ubyhtc2cpKTsKKwkJYnJlYWs7CisJY2FzZSBEQVRBX0xPVzoKKwljYXNlIERBVEFfTUVESVVNOgorCWNhc2UgREFUQV9ISUdIOgorCWNhc2UgREFUQV9DUklUSUNBTDoKKwkJdGlwY19wcmludGYoYnVmLCAiREFUJXU6IiwgbXNnX3VzZXIobXNnKSk7CisJCWlmIChtc2dfc2hvcnQobXNnKSkgeworCQkJdGlwY19wcmludGYoYnVmLCAiQ09OOiIpOworCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJCWNhc2UgVElQQ19DT05OX01TRzoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkNPTjoiKTsKKwkJCWJyZWFrOworCQljYXNlIFRJUENfTUNBU1RfTVNHOgorCQkJdGlwY19wcmludGYoYnVmLCAiTUNTVDoiKTsKKwkJCWJyZWFrOworCQljYXNlIFRJUENfTkFNRURfTVNHOgorCQkJdGlwY19wcmludGYoYnVmLCAiTkFNOiIpOworCQkJYnJlYWs7CisJCWNhc2UgVElQQ19ESVJFQ1RfTVNHOgorCQkJdGlwY19wcmludGYoYnVmLCAiRElSOiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJVTktOT1dOIFRZUEUgJXUiLG1zZ190eXBlKG1zZykpOworCQl9CisJCWlmIChtc2dfcm91dGVkKG1zZykgJiYgIW1zZ19ub25fc2VxKG1zZykpCisJCQl0aXBjX3ByaW50ZihidWYsICJST1VUOiIpOworCQlpZiAobXNnX3Jlcm91dGVfY250KG1zZykpCisJCQl0aXBjX3ByaW50ZihidWYsICJSRVJPVVRFRCgldSk6IiwKKwkJCQkgICAgbXNnX3Jlcm91dGVfY250KG1zZykpOworCQlicmVhazsKKwljYXNlIE5BTUVfRElTVFJJQlVUT1I6CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIk5NRDo6Iik7CisJCXN3aXRjaCAobXNnX3R5cGUobXNnKSkgeworCQljYXNlIFBVQkxJQ0FUSU9OOgorCQkJdGlwY19wcmludGYoYnVmLCAiUFVCTCgldSk6IiwgKG1zZ19zaXplKG1zZykgLSBtc2dfaGRyX3N6KG1zZykpIC8gMjApOwkvKiBJdGVtcyAqLworCQkJYnJlYWs7CisJCWNhc2UgV0lUSERSQVdBTDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIldEUlc6Iik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlVOS05PV046JXgiLG1zZ190eXBlKG1zZykpOworCQl9CisJCWlmIChtc2dfcm91dGVkKG1zZykpCisJCQl0aXBjX3ByaW50ZihidWYsICJST1VUOiIpOworCQlpZiAobXNnX3Jlcm91dGVfY250KG1zZykpCisJCQl0aXBjX3ByaW50ZihidWYsICJSRVJPVVRFRCgldSk6IiwKKwkJCQkgICAgbXNnX3Jlcm91dGVfY250KG1zZykpOworCQlicmVhazsKKwljYXNlIENPTk5fTUFOQUdFUjoKKwkJdGlwY19wcmludGYoYnVmLCAiQ09OTl9NTkc6Iik7CisJCXN3aXRjaCAobXNnX3R5cGUobXNnKSkgeworCQljYXNlIENPTk5fUFJPQkU6CisJCQl0aXBjX3ByaW50ZihidWYsICJQUk9CRToiKTsKKwkJCWJyZWFrOworCQljYXNlIENPTk5fUFJPQkVfUkVQTFk6CisJCQl0aXBjX3ByaW50ZihidWYsICJQUk9CRV9SRVBMWToiKTsKKwkJCWJyZWFrOworCQljYXNlIENPTk5fQUNLOgorCQkJdGlwY19wcmludGYoYnVmLCAiQ09OTl9BQ0s6Iik7CisJCQl0aXBjX3ByaW50ZihidWYsICJBQ0soJXUpOiIsbXNnX21zZ2NudChtc2cpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGlwY19wcmludGYoYnVmLCAiVU5LTk9XTiBUWVBFOiV4Iixtc2dfdHlwZShtc2cpKTsKKwkJfQorCQlpZiAobXNnX3JvdXRlZChtc2cpKQorCQkJdGlwY19wcmludGYoYnVmLCAiUk9VVDoiKTsKKwkJaWYgKG1zZ19yZXJvdXRlX2NudChtc2cpKQorCQkJdGlwY19wcmludGYoYnVmLCAiUkVST1VURUQoJXUpOiIsbXNnX3Jlcm91dGVfY250KG1zZykpOworCQlicmVhazsKKwljYXNlIExJTktfUFJPVE9DT0w6CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlBST1Q6VElNKCV1KToiLG1zZ190aW1lc3RhbXAobXNnKSk7CisJCXN3aXRjaCAobXNnX3R5cGUobXNnKSkgeworCQljYXNlIFNUQVRFX01TRzoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlNUQVRFOiIpOworCQkJdGlwY19wcmludGYoYnVmLCAiJXM6Iixtc2dfcHJvYmUobXNnKSA/ICJQUkIiIDoiIik7CisJCQl0aXBjX3ByaW50ZihidWYsICJOWFMoJXUpOiIsbXNnX25leHRfc2VudChtc2cpKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkdBUCgldSk6Iixtc2dfc2VxX2dhcChtc2cpKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkxTVEJDKCV1KToiLG1zZ19sYXN0X2JjYXN0KG1zZykpOworCQkJYnJlYWs7CisJCWNhc2UgUkVTRVRfTVNHOgorCQkJdGlwY19wcmludGYoYnVmLCAiUkVTRVQ6Iik7CisJCQlpZiAobXNnX3NpemUobXNnKSAhPSBtc2dfaGRyX3N6KG1zZykpCisJCQkJdGlwY19wcmludGYoYnVmLCAiQkVBUjolczoiLG1zZ19kYXRhKG1zZykpOworCQkJYnJlYWs7CisJCWNhc2UgQUNUSVZBVEVfTVNHOgorCQkJdGlwY19wcmludGYoYnVmLCAiQUNUSVZBVEU6Iik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlVOS05PV04gVFlQRToleCIsbXNnX3R5cGUobXNnKSk7CisJCX0KKwkJdGlwY19wcmludGYoYnVmLCAiUExBTkUoJWMpOiIsbXNnX25ldF9wbGFuZShtc2cpKTsKKwkJdGlwY19wcmludGYoYnVmLCAiU0VTUygldSk6Iixtc2dfc2Vzc2lvbihtc2cpKTsKKwkJYnJlYWs7CisJY2FzZSBDSEFOR0VPVkVSX1BST1RPQ09MOgorCQl0aXBjX3ByaW50ZihidWYsICJUVU5MOiIpOworCQlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwkJY2FzZSBEVVBMSUNBVEVfTVNHOgorCQkJdGlwY19wcmludGYoYnVmLCAiRFVQTDoiKTsKKwkJCWJyZWFrOworCQljYXNlIE9SSUdJTkFMX01TRzoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIk9SSUc6Iik7CisJCQl0aXBjX3ByaW50ZihidWYsICJFWFAoJXUpIixtc2dfbXNnY250KG1zZykpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJVTktOT1dOIFRZUEU6JXgiLG1zZ190eXBlKG1zZykpOworCQl9CisJCWJyZWFrOworCWNhc2UgUk9VVEVfRElTVFJJQlVUT1I6CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlJPVVRJTkdfTU5HOiIpOworCQlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwkJY2FzZSBFWFRfUk9VVElOR19UQUJMRToKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkVYVF9UQkw6Iik7CisJCQl0aXBjX3ByaW50ZihidWYsICJUTzoleDoiLG1zZ19yZW1vdGVfbm9kZShtc2cpKTsKKwkJCWJyZWFrOworCQljYXNlIExPQ0FMX1JPVVRJTkdfVEFCTEU6CisJCQl0aXBjX3ByaW50ZihidWYsICJMT0NBTF9UQkw6Iik7CisJCQl0aXBjX3ByaW50ZihidWYsICJUTzoleDoiLG1zZ19yZW1vdGVfbm9kZShtc2cpKTsKKwkJCWJyZWFrOworCQljYXNlIFNMQVZFX1JPVVRJTkdfVEFCTEU6CisJCQl0aXBjX3ByaW50ZihidWYsICJEUF9UQkw6Iik7CisJCQl0aXBjX3ByaW50ZihidWYsICJUTzoleDoiLG1zZ19yZW1vdGVfbm9kZShtc2cpKTsKKwkJCWJyZWFrOworCQljYXNlIFJPVVRFX0FERElUSU9OOgorCQkJdGlwY19wcmludGYoYnVmLCAiQUREOiIpOworCQkJdGlwY19wcmludGYoYnVmLCAiVE86JXg6Iixtc2dfcmVtb3RlX25vZGUobXNnKSk7CisJCQlicmVhazsKKwkJY2FzZSBST1VURV9SRU1PVkFMOgorCQkJdGlwY19wcmludGYoYnVmLCAiUkVNT1ZFOiIpOworCQkJdGlwY19wcmludGYoYnVmLCAiVE86JXg6Iixtc2dfcmVtb3RlX25vZGUobXNnKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlVOS05PV04gVFlQRToleCIsbXNnX3R5cGUobXNnKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMSU5LX0NPTkZJRzoKKwkJdGlwY19wcmludGYoYnVmLCAiQ0ZHOiIpOworCQlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwkJY2FzZSBEU0NfUkVRX01TRzoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkRTQ19SRVE6Iik7CisJCQlicmVhazsKKwkJY2FzZSBEU0NfUkVTUF9NU0c6CisJCQl0aXBjX3ByaW50ZihidWYsICJEU0NfUkVTUDoiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGlwY19wcmludGYoYnVmLCAiVU5LTk9XTiBUWVBFOiV4OiIsbXNnX3R5cGUobXNnKSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQl0aXBjX3ByaW50ZihidWYsICJVTktOT1dOIFVTRVI6Iik7CisJfQorCisJc3dpdGNoICh1c3IpIHsKKwljYXNlIENPTk5fTUFOQUdFUjoKKwljYXNlIE5BTUVfRElTVFJJQlVUT1I6CisJY2FzZSBEQVRBX0xPVzoKKwljYXNlIERBVEFfTUVESVVNOgorCWNhc2UgREFUQV9ISUdIOgorCWNhc2UgREFUQV9DUklUSUNBTDoKKwkJaWYgKG1zZ19zaG9ydChtc2cpKQorCQkJYnJlYWs7CS8qIE5vIGVycm9yICovCisJCXN3aXRjaCAobXNnX2VycmNvZGUobXNnKSkgeworCQljYXNlIFRJUENfT0s6CisJCQlicmVhazsKKwkJY2FzZSBUSVBDX0VSUl9OT19OQU1FOgorCQkJdGlwY19wcmludGYoYnVmLCAiTk9fTkFNRToiKTsKKwkJCWJyZWFrOworCQljYXNlIFRJUENfRVJSX05PX1BPUlQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJOT19QT1JUOiIpOworCQkJYnJlYWs7CisJCWNhc2UgVElQQ19FUlJfTk9fTk9ERToKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIk5PX1BST0M6Iik7CisJCQlicmVhazsKKwkJY2FzZSBUSVBDX0VSUl9PVkVSTE9BRDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIk9WRVJMT0FEOiIpOworCQkJYnJlYWs7CisJCWNhc2UgVElQQ19DT05OX1NIVVRET1dOOgorCQkJdGlwY19wcmludGYoYnVmLCAiU0hVVERPV046Iik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlVOS05PV04gRVJST1IoJXgpOiIsCisJCQkJICAgIG1zZ19lcnJjb2RlKG1zZykpOworCQl9CisJZGVmYXVsdDp7fQorCX0KKworCXRpcGNfcHJpbnRmKGJ1ZiwgIkhaKCV1KToiLCBtc2dfaGRyX3N6KG1zZykpOworCXRpcGNfcHJpbnRmKGJ1ZiwgIlNaKCV1KToiLCBtc2dfc2l6ZShtc2cpKTsKKwl0aXBjX3ByaW50ZihidWYsICJTUU5PKCV1KToiLCBtc2dfc2Vxbm8obXNnKSk7CisKKwlpZiAobXNnX25vbl9zZXEobXNnKSkKKwkJdGlwY19wcmludGYoYnVmLCAiTk9TRVE6Iik7CisJZWxzZSB7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIkFDSygldSk6IiwgbXNnX2Fjayhtc2cpKTsKKwl9CisJdGlwY19wcmludGYoYnVmLCAiQkFDSygldSk6IiwgbXNnX2JjYXN0X2Fjayhtc2cpKTsKKwl0aXBjX3ByaW50ZihidWYsICJQUk5EKCV4KSIsIG1zZ19wcmV2bm9kZShtc2cpKTsKKworCWlmIChtc2dfaXNkYXRhKG1zZykpIHsKKwkJaWYgKG1zZ19uYW1lZChtc2cpKSB7CisJCQl0aXBjX3ByaW50ZihidWYsICJOVFlQKCV1KToiLCBtc2dfbmFtZXR5cGUobXNnKSk7CisJCQl0aXBjX3ByaW50ZihidWYsICJOSU5TVCgldSkiLCBtc2dfbmFtZWluc3QobXNnKSk7CisJCX0KKwl9CisKKwlpZiAoKHVzciAhPSBMSU5LX1BST1RPQ09MKSAmJiAodXNyICE9IExJTktfQ09ORklHKSAmJgorCSAgICAodXNyICE9IE1TR19CVU5ETEVSKSkgeworCQlpZiAoIW1zZ19zaG9ydChtc2cpKSB7CisJCQl0aXBjX3ByaW50ZihidWYsICI6T1JJRygleDoldSk6IiwKKwkJCQkgICAgbXNnX29yaWdub2RlKG1zZyksIG1zZ19vcmlncG9ydChtc2cpKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpERVNUKCV4OiV1KToiLAorCQkJCSAgICBtc2dfZGVzdG5vZGUobXNnKSwgbXNnX2Rlc3Rwb3J0KG1zZykpOworCQl9IGVsc2UgeworCQkJdGlwY19wcmludGYoYnVmLCAiOk9QUlQoJXUpOiIsIG1zZ19vcmlncG9ydChtc2cpKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpEUFJUKCV1KToiLCBtc2dfZGVzdHBvcnQobXNnKSk7CisJCX0KKwkJaWYgKG1zZ19yb3V0ZWQobXNnKSAmJiAhbXNnX25vbl9zZXEobXNnKSkKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpUU0VRTigldSkiLCBtc2dfdHJhbnNwX3NlcW5vKG1zZykpOworCX0KKwlpZiAobXNnX3VzZXIobXNnKSA9PSBOQU1FX0RJU1RSSUJVVE9SKSB7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpPTk9EKCV4KToiLCBtc2dfb3JpZ25vZGUobXNnKSk7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpETk9EKCV4KToiLCBtc2dfZGVzdG5vZGUobXNnKSk7CisJCWlmIChtc2dfcm91dGVkKG1zZykpIHsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpDU0VRTigldSkiLCBtc2dfdHJhbnNwX3NlcW5vKG1zZykpOworCQl9CisJfQorCisJaWYgKG1zZ191c2VyKG1zZykgPT0gIExJTktfQ09ORklHKSB7CisJCXUzMiogcmF3ID0gKHUzMiopbXNnOworCQlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyKiBvcmlnID0gKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIqKSZyYXdbNV07CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpSRVFMKCV1KToiLCBtc2dfcmVxX2xpbmtzKG1zZykpOworCQl0aXBjX3ByaW50ZihidWYsICI6RERPTSgleCk6IiwgbXNnX2Rlc3RfZG9tYWluKG1zZykpOworCQl0aXBjX3ByaW50ZihidWYsICI6TkVUSUQoJXUpOiIsIG1zZ19iY19uZXRpZChtc2cpKTsKKwkJbWVkaWFfYWRkcl9wcmludGYoYnVmLCBvcmlnKTsKKwl9CisJaWYgKG1zZ191c2VyKG1zZykgPT0gQkNBU1RfUFJPVE9DT0wpIHsKKwkJdGlwY19wcmludGYoYnVmLCAiQkNOQUNLOkFGVEVSKCV1KToiLCBtc2dfYmNnYXBfYWZ0ZXIobXNnKSk7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlRPKCV1KToiLCBtc2dfYmNnYXBfdG8obXNnKSk7CisJfQorCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuIik7CisJaWYgKCh1c3IgPT0gQ0hBTkdFT1ZFUl9QUk9UT0NPTCkgJiYgKG1zZ19tc2djbnQobXNnKSkpIHsKKwkJbXNnX3ByaW50KGJ1Zixtc2dfZ2V0X3dyYXBwZWQobXNnKSwiICAgICAgLyIpOworCX0KKwlpZiAoKHVzciA9PSBNU0dfRlJBR01FTlRFUikgJiYgKG1zZ190eXBlKG1zZykgPT0gRklSU1RfRlJBR01FTlQpKSB7CisJCW1zZ19wcmludChidWYsbXNnX2dldF93cmFwcGVkKG1zZyksIiAgICAgIC8iKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9tc2cuaCBiL25ldC90aXBjL21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MmM4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9tc2cuaApAQCAtMCwwICsxLDgxOCBAQAorLyoKKyAqIG5ldC90aXBjL21zZy5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgbWVzc2FnZSBoZWFkZXIgcm91dGluZXMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19NU0dfSAorI2RlZmluZSBfVElQQ19NU0dfSAorCisjaW5jbHVkZSA8bmV0L3RpcGMvdGlwY19tc2cuaD4KKworI2RlZmluZSBUSVBDX1ZFUlNJT04gICAgICAgICAgICAgIDIKKyNkZWZpbmUgREFUQV9MT1cgICAgICAgICAgICAgICAgICBUSVBDX0xPV19JTVBPUlRBTkNFCisjZGVmaW5lIERBVEFfTUVESVVNICAgICAgICAgICAgICAgVElQQ19NRURJVU1fSU1QT1JUQU5DRQorI2RlZmluZSBEQVRBX0hJR0ggICAgICAgICAgICAgICAgIFRJUENfSElHSF9JTVBPUlRBTkNFCisjZGVmaW5lIERBVEFfQ1JJVElDQUwgICAgICAgICAgICAgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFCisjZGVmaW5lIFNIT1JUX0hfU0laRSAgICAgICAgICAgICAgMjQJLyogQ29ubmVjdGVkLGluIGNsdXN0ZXIgKi8KKyNkZWZpbmUgRElSX01TR19IX1NJWkUgICAgICAgICAgICAzMgkvKiBEaXJlY3RseSBhZGRyZXNzZWQgbWVzc2FnZXMgKi8KKyNkZWZpbmUgQ09OTl9NU0dfSF9TSVpFICAgICAgICAgICAzNgkvKiBSb3V0ZWQgY29ubmVjdGVkIG1zZ3MqLworI2RlZmluZSBMT05HX0hfU0laRSAgICAgICAgICAgICAgIDQwCS8qIE5hbWVkIE1lc3NhZ2VzICovCisjZGVmaW5lIE1DQVNUX0hfU0laRSAgICAgICAgICAgICAgNDQJLyogTXVsdGljYXN0IG1lc3NhZ2VzICovCisjZGVmaW5lIE1BWF9IX1NJWkUgICAgICAgICAgICAgICAgNjAJLyogSW5jbHVzaXZlIGZ1bGwgb3B0aW9ucyAqLworI2RlZmluZSBNQVhfTVNHX1NJWkUgKE1BWF9IX1NJWkUgKyBUSVBDX01BWF9VU0VSX01TR19TSVpFKQorI2RlZmluZSBMSU5LX0NPTkZJRyAgICAgICAgICAgICAgIDEzCisKKworLyoKKwkJVElQQyB1c2VyIGRhdGEgbWVzc2FnZSBoZWFkZXIgZm9ybWF0LCB2ZXJzaW9uIDIKKwkJCisJLSBGdW5kYW1lbnRhbCBkZWZpbml0aW9ucyBhdmFpbGFibGUgdG8gcHJpdmlsZWdlZCBUSVBDIHVzZXJzCisJICBhcmUgbG9jYXRlZCBpbiB0aXBjX21zZy5oLgorCS0gUmVtYWluaW5nIGRlZmluaXRpb25zIGF2YWlsYWJsZSB0byBUSVBDIGludGVybmFsIHVzZXJzIGFwcGVhciBiZWxvdy4gCisqLworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3dvcmQoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgdywgdTMyIHZhbCkKK3sKKwltLT5oZHJbd10gPSBodG9ubCh2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9iaXRzKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIHcsCisJCQkJdTMyIHBvcywgdTMyIG1hc2ssIHUzMiB2YWwpCit7CisJdTMyIHdvcmQgPSBtc2dfd29yZChtLHcpICYgfihtYXNrIDw8IHBvcyk7CisJbXNnX3NldF93b3JkKG0sIHcsICh3b3JkIHw9ICh2YWwgPDwgcG9zKSkpOworfQorCisvKiAKKyAqIFdvcmQgMAorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ192ZXJzaW9uKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMCwgMjksIDcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF92ZXJzaW9uKHN0cnVjdCB0aXBjX21zZyAqbSkgCit7CisJbXNnX3NldF9iaXRzKG0sIDAsIDI5LCAweGYsIFRJUENfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ191c2VyKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMCwgMjUsIDB4Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19pc2RhdGEoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiAobXNnX3VzZXIobSkgPD0gREFUQV9DUklUSUNBTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3VzZXIoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDAsIDI1LCAweGYsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9pbXBvcnRhbmNlKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIGkpIAoreworCW1zZ19zZXRfdXNlcihtLCBpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfaGRyX3N6KHN0cnVjdCB0aXBjX21zZyAqbSx1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDAsIDIxLCAweGYsIG4+PjIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtc2dfbm9uX3NlcShzdHJ1Y3QgdGlwY19tc2cgKm0pIAoreworCXJldHVybiBtc2dfYml0cyhtLCAwLCAyMCwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X25vbl9zZXEoc3RydWN0IHRpcGNfbXNnICptKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMCwgMjAsIDEsIDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtc2dfZGVzdF9kcm9wcGFibGUoc3RydWN0IHRpcGNfbXNnICptKSAKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMCwgMTksIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9kZXN0X2Ryb3BwYWJsZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBkKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMCwgMTksIDEsIGQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtc2dfc3JjX2Ryb3BwYWJsZShzdHJ1Y3QgdGlwY19tc2cgKm0pIAoreworCXJldHVybiBtc2dfYml0cyhtLCAwLCAxOCwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3NyY19kcm9wcGFibGUoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgZCkgCit7CisJbXNnX3NldF9iaXRzKG0sIDAsIDE4LCAxLCBkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfc2l6ZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBzeikKK3sKKwltLT5oZHJbMF0gPSBodG9ubCgobXNnX3dvcmQobSwgMCkgJiB+MHgxZmZmZikgfCBzeik7Cit9CisKKworLyogCisgKiBXb3JkIDEKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF90eXBlKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfYml0cyhtLCAxLCAyOSwgMHg3LCBuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfZXJyY29kZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBlcnIpIAoreworCW1zZ19zZXRfYml0cyhtLCAxLCAyNSwgMHhmLCBlcnIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfcmVyb3V0ZV9jbnQoc3RydWN0IHRpcGNfbXNnICptKSAKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMSwgMjEsIDB4Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfaW5jcl9yZXJvdXRlX2NudChzdHJ1Y3QgdGlwY19tc2cgKm0pIAoreworCW1zZ19zZXRfYml0cyhtLCAxLCAyMSwgMHhmLCBtc2dfcmVyb3V0ZV9jbnQobSkgKyAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19yZXNldF9yZXJvdXRlX2NudChzdHJ1Y3QgdGlwY19tc2cgKm0pIAoreworCW1zZ19zZXRfYml0cyhtLCAxLCAyMSwgMHhmLCAwKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2xvb2t1cF9zY29wZShzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDEsIDE5LCAweDMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9sb29rdXBfc2NvcGUoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDEsIDE5LCAweDMsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9vcHRpb25zKHN0cnVjdCB0aXBjX21zZyAqbSwgY29uc3QgY2hhciAqb3B0LCB1MzIgc3opIAoreworCXUzMiBoc3ogPSBtc2dfaGRyX3N6KG0pOworCWNoYXIgKnRvID0gKGNoYXIgKikmbS0+aGRyW2hzei80XTsKKworCWlmICgoaHN6IDwgRElSX01TR19IX1NJWkUpIHx8ICgoaHN6ICsgc3opID4gTUFYX0hfU0laRSkpCisJCXJldHVybjsKKwltc2dfc2V0X2JpdHMobSwgMSwgMTYsIDB4NywgKGhzeiAtIDI4KS80KTsKKwltc2dfc2V0X2hkcl9zeihtLCBoc3ogKyBzeik7CisJbWVtY3B5KHRvLCBvcHQsIHN6KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2JjYXN0X2FjayhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDEsIDAsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2JjYXN0X2FjayhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMSwgMCwgMHhmZmZmLCBuKTsKK30KKworCisvKiAKKyAqIFdvcmQgMgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19hY2soc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAyLCAxNiwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfYWNrKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfYml0cyhtLCAyLCAxNiwgMHhmZmZmLCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3NlcW5vKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMiwgMCwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfc2Vxbm8oc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDIsIDAsIDB4ZmZmZiwgbik7Cit9CisKKworLyogCisgKiBXb3JkcyAzLTEwCisgKi8KKworCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9wcmV2bm9kZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBhKSAKK3sKKwltc2dfc2V0X3dvcmQobSwgMywgYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X29yaWdwb3J0KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIHApIAoreworCW1zZ19zZXRfd29yZChtLCA0LCBwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfZGVzdHBvcnQoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgcCkgCit7CisJbXNnX3NldF93b3JkKG0sIDUsIHApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9tY19uZXRpZChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBwKSAKK3sKKwltc2dfc2V0X3dvcmQobSwgNSwgcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X29yaWdub2RlKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIGEpIAoreworCW1zZ19zZXRfd29yZChtLCA2LCBhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfZGVzdG5vZGUoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgYSkgCit7CisJbXNnX3NldF93b3JkKG0sIDcsIGEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtc2dfaXNfZGVzdChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBkKSAKK3sKKwlyZXR1cm4obXNnX3Nob3J0KG0pIHx8IChtc2dfZGVzdG5vZGUobSkgPT0gZCkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfcm91dGVkKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlpZiAobGlrZWx5KG1zZ19zaG9ydChtKSkpCisJCXJldHVybiAwOworCXJldHVybihtc2dfZGVzdG5vZGUobSkgXiBtc2dfb3JpZ25vZGUobSkpID4+IDExOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9uYW1ldHlwZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X3dvcmQobSwgOCwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ190cmFuc3Bfc2Vxbm8oc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfd29yZChtLCA4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfdGltZXN0YW1wKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF93b3JkKG0sIDgsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfdGltZXN0YW1wKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3RyYW5zcF9zZXFubyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKQoreworCW1zZ19zZXRfd29yZChtLCA4LCBuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbmFtZWxvd2VyKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfd29yZChtLCA5LCBuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbmFtZWluc3Qoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9uYW1lbG93ZXIobSwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X25hbWV1cHBlcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X3dvcmQobSwgMTAsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aXBjX21zZyAqbXNnX2dldF93cmFwcGVkKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gKHN0cnVjdCB0aXBjX21zZyAqKW1zZ19kYXRhKG0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX2V4cGFuZChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBkZXN0bm9kZSkgCit7CisJaWYgKCFtc2dfc2hvcnQobSkpCisJCXJldHVybjsKKwltc2dfc2V0X2hkcl9zeihtLCBMT05HX0hfU0laRSk7CisJbXNnX3NldF9vcmlnbm9kZShtLCBtc2dfcHJldm5vZGUobSkpOworCW1zZ19zZXRfZGVzdG5vZGUobSwgZGVzdG5vZGUpOworCW1lbXNldCgmbS0+aGRyWzhdLCAwLCAxMik7Cit9CisKKworCisvKgorCQlUSVBDIGludGVybmFsIG1lc3NhZ2UgaGVhZGVyIGZvcm1hdCwgdmVyc2lvbiAyCisKKyAgICAgICAxIDAgOSA4IDcgNiA1IDR8MyAyIDEgMCA5IDggNyA2fDUgNCAzIDIgMSAwIDkgOHw3IDYgNSA0IDMgMiAxIDAgCisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzA6fHZlcnMgfG1zZyB1c3J8aGRyIHN6IHxufHJlc3J2fCAgICAgICAgICAgIHBhY2tldCBzaXplICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3MTp8bSB0eXB8cnN2PTB8ICAgc2VxdWVuY2UgZ2FwICAgIHwgICAgICAgYnJvYWRjYXN0IGFjayBubyAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHcyOnwgbGluayBsZXZlbCBhY2sgbm8vYmNfZ2FwX2Zyb20gfCAgICAgc2VxIG5vIC8gYmNhc3RfZ2FwX3RvICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzM6fCAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3NDp8ICBuZXh0IHNlbnQgYnJvYWRjYXN0L2ZyYWdtIG5vIHwgbmV4dCBzZW50IHBrdC8gZnJhZ20gbXNnIG5vICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHc1OnwgICAgICAgICAgc2Vzc2lvbiBubyAgICAgICAgICAgfHJzdj0wfHJ8YmVyaWR8bGluayBwcmlvfG5ldHBsfHB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzY6fCAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hdGluZyBub2RlICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3Nzp8ICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHc4OnwgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IHNlcXVlbmNlIG51bWJlciAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzk6fCAgIG1zZyBjb3VudCAvIGJjYXN0IHRhZyAgICAgICB8ICAgICAgIGxpbmsgdG9sZXJhbmNlICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgLyAgICAgICAgICAgICAgICAgICAgIFVzZXIgU3BlY2lmaWMgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCisgICAgICBOQjogQ09OTl9NQU5BR0VSIHVzZSBkYXRhIG1lc3NhZ2UgZm9ybWF0LiBMSU5LX0NPTkZJRyBoYXMgb3duIGZvcm1hdC4KKyovICAgCisKKy8qIAorICogSW50ZXJuYWwgdXNlcnMKKyAqLworCisjZGVmaW5lICBCQ0FTVF9QUk9UT0NPTCAgICAgICA1CisjZGVmaW5lICBNU0dfQlVORExFUiAgICAgICAgICA2CisjZGVmaW5lICBMSU5LX1BST1RPQ09MICAgICAgICA3CisjZGVmaW5lICBDT05OX01BTkFHRVIgICAgICAgICA4CisjZGVmaW5lICBST1VURV9ESVNUUklCVVRPUiAgICA5CisjZGVmaW5lICBDSEFOR0VPVkVSX1BST1RPQ09MICAxMAorI2RlZmluZSAgTkFNRV9ESVNUUklCVVRPUiAgICAgMTEKKyNkZWZpbmUgIE1TR19GUkFHTUVOVEVSICAgICAgIDEyCisjZGVmaW5lICBMSU5LX0NPTkZJRyAgICAgICAgICAxMworI2RlZmluZSAgSU5UX0hfU0laRSAgICAgICAgICAgNDAKKyNkZWZpbmUgIERTQ19IX1NJWkUgICAgICAgICAgIDQwCisKKy8qIAorICogIENvbm5lY3Rpb24gbWFuYWdlbWVudCBwcm90b2NvbCBtZXNzYWdlcworICovCisKKyNkZWZpbmUgQ09OTl9QUk9CRSAgICAgICAgMAorI2RlZmluZSBDT05OX1BST0JFX1JFUExZICAxCisjZGVmaW5lIENPTk5fQUNLICAgICAgICAgIDIKKworLyogCisgKiBOYW1lIGRpc3RyaWJ1dG9yIG1lc3NhZ2VzCisgKi8KKworI2RlZmluZSBQVUJMSUNBVElPTiAgICAgICAwCisjZGVmaW5lIFdJVEhEUkFXQUwgICAgICAgIDEKKworCisvKiAKKyAqIFdvcmQgMQorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19zZXFfZ2FwKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMSwgMTYsIDB4ZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9zZXFfZ2FwKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDEsIDE2LCAweGZmLCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3JlcV9saW5rcyhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDEsIDE2LCAweGZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3JlcV9saW5rcyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMSwgMTYsIDB4ZmZmLCBuKTsKK30KKworCisvKiAKKyAqIFdvcmQgMgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19kZXN0X2RvbWFpbihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9kZXN0X2RvbWFpbihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X3dvcmQobSwgMiwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19iY2dhcF9hZnRlcihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDIsIDE2LCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9iY2dhcF9hZnRlcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKQoreworCW1zZ19zZXRfYml0cyhtLCAyLCAxNiwgMHhmZmZmLCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2JjZ2FwX3RvKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMiwgMCwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfYmNnYXBfdG8oc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDIsIDAsIDB4ZmZmZiwgbik7Cit9CisKKworLyogCisgKiBXb3JkIDQKKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbGFzdF9iY2FzdChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDQsIDE2LCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9sYXN0X2JjYXN0KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDQsIDE2LCAweGZmZmYsIG4pOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19mcmFnbV9ubyhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDQsIDE2LCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9mcmFnbV9ubyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKQoreworCW1zZ19zZXRfYml0cyhtLCA0LCAxNiwgMHhmZmZmLCBuKTsKK30KKworCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbmV4dF9zZW50KHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNCwgMCwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbmV4dF9zZW50KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDQsIDAsIDB4ZmZmZiwgbik7Cit9CisKKworc3RhdGljIGlubGluZSB1MzIgbXNnX2xvbmdfbXNnbm8oc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCA0LCAwLCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9sb25nX21zZ25vKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDQsIDAsIDB4ZmZmZiwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19iY19uZXRpZChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9iY19uZXRpZChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBpZCkKK3sKKwltc2dfc2V0X3dvcmQobSwgNCwgaWQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbGlua19zZWxlY3RvcihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDQsIDAsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9saW5rX3NlbGVjdG9yKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDQsIDAsIDEsIChuICYgMSkpOworfQorCisvKiAKKyAqIFdvcmQgNQorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19zZXNzaW9uKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNSwgMTYsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3Nlc3Npb24oc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgNSwgMTYsIDB4ZmZmZiwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19wcm9iZShzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDUsIDAsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9wcm9iZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiB2YWwpCit7CisJbXNnX3NldF9iaXRzKG0sIDUsIDAsIDEsICh2YWwgJiAxKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciBtc2dfbmV0X3BsYW5lKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNSwgMSwgNykgKyAnQSc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X25ldF9wbGFuZShzdHJ1Y3QgdGlwY19tc2cgKm0sIGNoYXIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgNSwgMSwgNywgKG4gLSAnQScpKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2xpbmtwcmlvKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNSwgNCwgMHgxZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2xpbmtwcmlvKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDUsIDQsIDB4MWYsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfYmVhcmVyX2lkKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNSwgOSwgMHg3KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfYmVhcmVyX2lkKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDUsIDksIDB4Nywgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19yZWR1bmRhbnRfbGluayhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDUsIDEyLCAweDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9yZWR1bmRhbnRfbGluayhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJbXNnX3NldF9iaXRzKG0sIDUsIDEyLCAweDEsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX2NsZWFyX3JlZHVuZGFudF9saW5rKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwltc2dfc2V0X2JpdHMobSwgNSwgMTIsIDB4MSwgMCk7Cit9CisKKworLyogCisgKiBXb3JkIDkKKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbXNnY250KHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgOSwgMTYsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X21zZ2NudChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKQoreworCW1zZ19zZXRfYml0cyhtLCA5LCAxNiwgMHhmZmZmLCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2JjYXN0X3RhZyhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDksIDE2LCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9iY2FzdF90YWcoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgOSwgMTYsIDB4ZmZmZiwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19tYXhfcGt0KHN0cnVjdCB0aXBjX21zZyAqbSkgCit7CisJcmV0dXJuIChtc2dfYml0cyhtLCA5LCAxNiwgMHhmZmZmKSAqIDQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9tYXhfcGt0KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfYml0cyhtLCA5LCAxNiwgMHhmZmZmLCAobiAvIDQpKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2xpbmtfdG9sZXJhbmNlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgOSwgMCwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbGlua190b2xlcmFuY2Uoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgOSwgMCwgMHhmZmZmLCBuKTsKK30KKworLyogCisgKiBSb3V0aW5nIHRhYmxlIG1lc3NhZ2UgZGF0YQorICovCisKKworc3RhdGljIGlubGluZSB1MzIgbXNnX3JlbW90ZV9ub2RlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgbXNnX2hkcl9zeihtKS80KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfcmVtb3RlX25vZGUoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgYSkKK3sKKwltc2dfc2V0X3dvcmQobSwgbXNnX2hkcl9zeihtKS80LCBhKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXNnX2RhdGFvY3RldChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBwb3MpCit7CisJcmV0dXJuKG1zZ19kYXRhKG0pW3BvcyArIDRdICE9IDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9kYXRhb2N0ZXQoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgcG9zKQoreworCW1zZ19kYXRhKG0pW3BvcyArIDRdID0gMTsKK30KKworLyogCisgKiBTZWdtZW50YXRpb24gbWVzc2FnZSB0eXBlcworICovCisKKyNkZWZpbmUgRklSU1RfRlJBR01FTlQgICAgIDAKKyNkZWZpbmUgRlJBR01FTlQgICAgICAgICAgIDEKKyNkZWZpbmUgTEFTVF9GUkFHTUVOVCAgICAgIDIKKworLyogCisgKiBMaW5rIG1hbmFnZW1lbnQgcHJvdG9jb2wgbWVzc2FnZSB0eXBlcworICovCisKKyNkZWZpbmUgU1RBVEVfTVNHICAgICAgIDAKKyNkZWZpbmUgUkVTRVRfTVNHICAgICAgIDEKKyNkZWZpbmUgQUNUSVZBVEVfTVNHICAgIDIKKworLyogCisgKiBDaGFuZ2VvdmVyIHR1bm5lbCBtZXNzYWdlIHR5cGVzCisgKi8KKyNkZWZpbmUgRFVQTElDQVRFX01TRyAgICAwCisjZGVmaW5lIE9SSUdJTkFMX01TRyAgICAgMQorCisvKiAKKyAqIFJvdXRpbmcgdGFibGUgbWVzc2FnZSB0eXBlcworICovCisjZGVmaW5lIEVYVF9ST1VUSU5HX1RBQkxFICAgIDAKKyNkZWZpbmUgTE9DQUxfUk9VVElOR19UQUJMRSAgMQorI2RlZmluZSBTTEFWRV9ST1VUSU5HX1RBQkxFICAyCisjZGVmaW5lIFJPVVRFX0FERElUSU9OICAgICAgIDMKKyNkZWZpbmUgUk9VVEVfUkVNT1ZBTCAgICAgICAgNAorCisvKiAKKyAqIENvbmZpZyBwcm90b2NvbCBtZXNzYWdlIHR5cGVzCisgKi8KKworI2RlZmluZSBEU0NfUkVRX01TRyAgICAgICAgICAwCisjZGVmaW5lIERTQ19SRVNQX01TRyAgICAgICAgIDEKKworc3RhdGljIGlubGluZSB1MzIgbXNnX3RvdF9pbXBvcnRhbmNlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlpZiAobGlrZWx5KG1zZ19pc2RhdGEobSkpKSB7CisJCWlmIChsaWtlbHkobXNnX29yaWdub2RlKG0pID09IHRpcGNfb3duX2FkZHIpKQorCQkJcmV0dXJuIG1zZ19pbXBvcnRhbmNlKG0pOworCQlyZXR1cm4gbXNnX2ltcG9ydGFuY2UobSkgKyA0OworCX0KKwlpZiAoKG1zZ191c2VyKG0pID09IE1TR19GUkFHTUVOVEVSKSAgJiYKKwkgICAgKG1zZ190eXBlKG0pID09IEZJUlNUX0ZSQUdNRU5UKSkKKwkJcmV0dXJuIG1zZ19pbXBvcnRhbmNlKG1zZ19nZXRfd3JhcHBlZChtKSk7CisJcmV0dXJuIG1zZ19pbXBvcnRhbmNlKG0pOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfaW5pdChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiB1c2VyLCB1MzIgdHlwZSwgCisJCQkgICAgdTMyIGVyciwgdTMyIGhzaXplLCB1MzIgZGVzdG5vZGUpCit7CisJbWVtc2V0KG0sIDAsIGhzaXplKTsKKwltc2dfc2V0X3ZlcnNpb24obSk7CisJbXNnX3NldF91c2VyKG0sIHVzZXIpOworCW1zZ19zZXRfaGRyX3N6KG0sIGhzaXplKTsKKwltc2dfc2V0X3NpemUobSwgaHNpemUpOworCW1zZ19zZXRfcHJldm5vZGUobSwgdGlwY19vd25fYWRkcik7CisJbXNnX3NldF90eXBlKG0sIHR5cGUpOworCW1zZ19zZXRfZXJyY29kZShtLCBlcnIpOworCWlmICghbXNnX3Nob3J0KG0pKSB7CisJCW1zZ19zZXRfb3JpZ25vZGUobSwgdGlwY19vd25fYWRkcik7CisJCW1zZ19zZXRfZGVzdG5vZGUobSwgZGVzdG5vZGUpOworCX0KK30KKworLyoqIAorICogbXNnX2NhbGNfZGF0YV9zaXplIC0gZGV0ZXJtaW5lIHRvdGFsIGRhdGEgc2l6ZSBmb3IgbWVzc2FnZQorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IG1zZ19jYWxjX2RhdGFfc2l6ZShzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LCB1MzIgbnVtX3NlY3QpCit7CisJaW50IGRzeiA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3NlY3Q7IGkrKykKKwkJZHN6ICs9IG1zZ19zZWN0W2ldLmlvdl9sZW47CisJcmV0dXJuIGRzejsKK30KKworLyoqIAorICogbXNnX2J1aWxkIC0gY3JlYXRlIG1lc3NhZ2UgdXNpbmcgc3BlY2lmaWVkIGhlYWRlciBhbmQgZGF0YQorICogCisgKiBOb3RlOiBDYWxsZXIgbXVzdCBub3QgaG9sZCBhbnkgbG9ja3MgaW4gY2FzZSBjb3B5X2Zyb21fdXNlcigpIGlzIGludGVycnVwdGVkIQorICogCisgKiBSZXR1cm5zIG1lc3NhZ2UgZGF0YSBzaXplIG9yIGVycm5vCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgbXNnX2J1aWxkKHN0cnVjdCB0aXBjX21zZyAqaGRyLCAKKwkJCSAgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LCB1MzIgbnVtX3NlY3QsCisJCQkgICAgaW50IG1heF9zaXplLCBpbnQgdXNybWVtLCBzdHJ1Y3Qgc2tfYnVmZioqIGJ1ZikKK3sKKwlpbnQgZHN6LCBzeiwgaHN6LCBwb3MsIHJlcywgY250OworCisJZHN6ID0gbXNnX2NhbGNfZGF0YV9zaXplKG1zZ19zZWN0LCBudW1fc2VjdCk7CisJaWYgKHVubGlrZWx5KGRzeiA+IFRJUENfTUFYX1VTRVJfTVNHX1NJWkUpKSB7CisJCSpidWYgPSBOVUxMOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwb3MgPSBoc3ogPSBtc2dfaGRyX3N6KGhkcik7CisJc3ogPSBoc3ogKyBkc3o7CisJbXNnX3NldF9zaXplKGhkciwgc3opOworCWlmICh1bmxpa2VseShzeiA+IG1heF9zaXplKSkgeworCQkqYnVmID0gTlVMTDsKKwkJcmV0dXJuIGRzejsKKwl9CisKKwkqYnVmID0gYnVmX2FjcXVpcmUoc3opOworCWlmICghKCpidWYpKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoKCpidWYpLT5kYXRhLCAodW5jaGFyICopaGRyLCBoc3opOworCWZvciAocmVzID0gMSwgY250ID0gMDsgcmVzICYmIChjbnQgPCBudW1fc2VjdCk7IGNudCsrKSB7CisJCWlmIChsaWtlbHkodXNybWVtKSkKKwkJCXJlcyA9ICFjb3B5X2Zyb21fdXNlcigoKmJ1ZiktPmRhdGEgKyBwb3MsIAorCQkJCQkgICAgICBtc2dfc2VjdFtjbnRdLmlvdl9iYXNlLCAKKwkJCQkJICAgICAgbXNnX3NlY3RbY250XS5pb3ZfbGVuKTsKKwkJZWxzZQorCQkJbWVtY3B5KCgqYnVmKS0+ZGF0YSArIHBvcywgbXNnX3NlY3RbY250XS5pb3ZfYmFzZSwgCisJCQkgICAgICAgbXNnX3NlY3RbY250XS5pb3ZfbGVuKTsKKwkJcG9zICs9IG1zZ19zZWN0W2NudF0uaW92X2xlbjsKKwl9CisJaWYgKGxpa2VseShyZXMpKQorCQlyZXR1cm4gZHN6OworCisJYnVmX2Rpc2NhcmQoKmJ1Zik7CisJKmJ1ZiA9IE5VTEw7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKworc3RydWN0IHRpcGNfbWVkaWFfYWRkcjsKKworZXh0ZXJuIHZvaWQgbXNnX3NldF9tZWRpYV9hZGRyKHN0cnVjdCB0aXBjX21zZyAqbSwKKwkJCSAgICAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphKTsKKworZXh0ZXJuIHZvaWQgbXNnX2dldF9tZWRpYV9hZGRyKHN0cnVjdCB0aXBjX21zZyAqbSwKKwkJCSAgICAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL25hbWVfZGlzdHIuYyBiL25ldC90aXBjL25hbWVfZGlzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWNiYWYxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogbmV0L3RpcGMvbmFtZV9kaXN0ci5jOiBUSVBDIG5hbWUgZGlzdHJpYnV0aW9uIGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJjbHVzdGVyLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgIm5hbWVfZGlzdHIuaCIKKworI3VuZGVmICBEQkdfT1VUUFVUCisjZGVmaW5lIERCR19PVVRQVVQgTlVMTAorCisjZGVmaW5lIElURU1fU0laRSBzaXplb2Yoc3RydWN0IGRpc3RyX2l0ZW0pCisKKy8qKgorICogc3RydWN0IGRpc3RyX2l0ZW0gLSBwdWJsaWNhdGlvbiBpbmZvIGRpc3RyaWJ1dGVkIHRvIG90aGVyIG5vZGVzCisgKiBAdHlwZTogbmFtZSBzZXF1ZW5jZSB0eXBlCisgKiBAbG93ZXI6IG5hbWUgc2VxdWVuY2UgbG93ZXIgYm91bmQKKyAqIEB1cHBlcjogbmFtZSBzZXF1ZW5jZSB1cHBlciBib3VuZAorICogQHJlZjogcHVibGlzaGluZyBwb3J0IHJlZmVyZW5jZQorICogQGtleTogcHVibGljYXRpb24ga2V5CisgKiAKKyAqID09PT4gQWxsIGZpZWxkcyBhcmUgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gPD09PQorICogCisgKiBGaXJzdCAzIGZpZWxkcyBpZGVudGlmeSAobmFtZSBvcikgbmFtZSBzZXF1ZW5jZSBiZWluZyBwdWJsaXNoZWQuCisgKiBSZWZlcmVuY2UgZmllbGQgdW5pcXVlbHkgaWRlbnRpZmllcyBwb3J0IHRoYXQgcHVibGlzaGVkIG5hbWUgc2VxdWVuY2UuCisgKiBLZXkgZmllbGQgdW5pcXVlbHkgaWRlbnRpZmllcyBwdWJsaWNhdGlvbiwgaW4gdGhlIGV2ZW50IGEgcG9ydCBoYXMKKyAqIG11bHRpcGxlIHB1YmxpY2F0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIHNlcXVlbmNlLgorICogCisgKiBOb3RlOiBUaGVyZSBpcyBubyBmaWVsZCB0aGF0IGlkZW50aWZpZXMgdGhlIHB1Ymxpc2hpbmcgbm9kZSBiZWNhdXNlIGl0IGlzIAorICogdGhlIHNhbWUgZm9yIGFsbCBpdGVtcyBjb250YWluZWQgd2l0aGluIGEgcHVibGljYXRpb24gbWVzc2FnZS4KKyAqLworCitzdHJ1Y3QgZGlzdHJfaXRlbSB7CisJdTMyIHR5cGU7CisJdTMyIGxvd2VyOworCXUzMiB1cHBlcjsKKwl1MzIgcmVmOworCXUzMiBrZXk7Cit9OworCisvKioKKyAqIExpc3Qgb2YgZXh0ZXJuYWxseSB2aXNpYmxlIHB1YmxpY2F0aW9ucyBieSB0aGlzIG5vZGUgLS0gCisgKiB0aGF0IGlzLCBhbGwgcHVibGljYXRpb25zIGhhdmluZyBzY29wZSA+IFRJUENfTk9ERV9TQ09QRS4KKyAqLworCitzdGF0aWMgTElTVF9IRUFEKHB1Ymxfcm9vdCk7CitzdGF0aWMgdTMyIHB1YmxfY250ID0gMDsJCQorCisvKioKKyAqIHB1YmxfdG9faXRlbSAtIGFkZCBwdWJsaWNhdGlvbiBpbmZvIHRvIGEgcHVibGljYXRpb24gbWVzc2FnZQorICovCisKK3N0YXRpYyB2b2lkIHB1YmxfdG9faXRlbShzdHJ1Y3QgZGlzdHJfaXRlbSAqaSwgc3RydWN0IHB1YmxpY2F0aW9uICpwKQoreworCWktPnR5cGUgPSBodG9ubChwLT50eXBlKTsKKwlpLT5sb3dlciA9IGh0b25sKHAtPmxvd2VyKTsKKwlpLT51cHBlciA9IGh0b25sKHAtPnVwcGVyKTsKKwlpLT5yZWYgPSBodG9ubChwLT5yZWYpOworCWktPmtleSA9IGh0b25sKHAtPmtleSk7CisJZGJnKCJwdWJsX3RvX2l0ZW06ICV1LCAldSwgJXVcbiIsIHAtPnR5cGUsIHAtPmxvd2VyLCBwLT51cHBlcik7Cit9CisKKy8qKgorICogbmFtZWRfcHJlcGFyZV9idWYgLSBhbGxvY2F0ZSAmIGluaXRpYWxpemUgYSBwdWJsaWNhdGlvbiBtZXNzYWdlCisgKi8KKworc3RhdGljIHN0cnVjdCBza19idWZmICpuYW1lZF9wcmVwYXJlX2J1Zih1MzIgdHlwZSwgdTMyIHNpemUsIHUzMiBkZXN0KQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBidWZfYWNxdWlyZShMT05HX0hfU0laRSArIHNpemUpOyAgCisJc3RydWN0IHRpcGNfbXNnICptc2c7CisKKwlpZiAoYnVmICE9IE5VTEwpIHsKKwkJbXNnID0gYnVmX21zZyhidWYpOworCQltc2dfaW5pdChtc2csIE5BTUVfRElTVFJJQlVUT1IsIHR5cGUsIFRJUENfT0ssIAorCQkJIExPTkdfSF9TSVpFLCBkZXN0KTsKKwkJbXNnX3NldF9zaXplKG1zZywgTE9OR19IX1NJWkUgKyBzaXplKTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworLyoqCisgKiBuYW1lZF9wdWJsaXNoIC0gdGVsbCBvdGhlciBub2RlcyBhYm91dCBhIG5ldyBwdWJsaWNhdGlvbiBieSB0aGlzIG5vZGUKKyAqLworCit2b2lkIG5hbWVkX3B1Ymxpc2goc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IGRpc3RyX2l0ZW0gKml0ZW07CisKKwlsaXN0X2FkZCgmcHVibC0+bG9jYWxfbGlzdCwgJnB1Ymxfcm9vdCk7CisJcHVibF9jbnQrKzsKKworCWJ1ZiA9IG5hbWVkX3ByZXBhcmVfYnVmKFBVQkxJQ0FUSU9OLCBJVEVNX1NJWkUsIDApOworCWlmICghYnVmKSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBmYWlsZWQgdG8gZGlzdHJpYnV0ZSBwdWJsaWNhdGlvblxuIik7CisJCXJldHVybjsKKwl9CisKKwlpdGVtID0gKHN0cnVjdCBkaXN0cl9pdGVtICopbXNnX2RhdGEoYnVmX21zZyhidWYpKTsKKwlwdWJsX3RvX2l0ZW0oaXRlbSwgcHVibCk7CisJZGJnKCJuYW1lZF93aXRoZHJhdzogYnJvYWRjYXN0aW5nIHB1Ymxpc2ggbXNnXG4iKTsKKwljbHVzdGVyX2Jyb2FkY2FzdChidWYpOworfQorCisvKioKKyAqIG5hbWVkX3dpdGhkcmF3IC0gdGVsbCBvdGhlciBub2RlcyBhYm91dCBhIHdpdGhkcmF3biBwdWJsaWNhdGlvbiBieSB0aGlzIG5vZGUKKyAqLworCit2b2lkIG5hbWVkX3dpdGhkcmF3KHN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCBkaXN0cl9pdGVtICppdGVtOworCisJbGlzdF9kZWwoJnB1YmwtPmxvY2FsX2xpc3QpOworCXB1YmxfY250LS07CisKKwlidWYgPSBuYW1lZF9wcmVwYXJlX2J1ZihXSVRIRFJBV0FMLCBJVEVNX1NJWkUsIDApOworCWlmICghYnVmKSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBmYWlsZWQgdG8gZGlzdHJpYnV0ZSB3aXRoZHJhd2FsXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWl0ZW0gPSAoc3RydWN0IGRpc3RyX2l0ZW0gKiltc2dfZGF0YShidWZfbXNnKGJ1ZikpOworCXB1YmxfdG9faXRlbShpdGVtLCBwdWJsKTsKKwlkYmcoIm5hbWVkX3dpdGhkcmF3OiBicm9hZGNhc3Rpbmcgd2l0aGRyYXcgbXNnXG4iKTsKKwljbHVzdGVyX2Jyb2FkY2FzdChidWYpOworfQorCisvKioKKyAqIG5hbWVkX25vZGVfdXAgLSB0ZWxsIHNwZWNpZmllZCBub2RlIGFib3V0IGFsbCBwdWJsaWNhdGlvbnMgYnkgdGhpcyBub2RlCisgKi8KKwordm9pZCBuYW1lZF9ub2RlX3VwKHVuc2lnbmVkIGxvbmcgbm9kZSkKK3sKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1Ymw7CisJc3RydWN0IGRpc3RyX2l0ZW0gKml0ZW0gPSAwOworCXN0cnVjdCBza19idWZmICpidWYgPSAwOworCXUzMiBsZWZ0ID0gMDsKKwl1MzIgcmVzdDsKKwl1MzIgbWF4X2l0ZW1fYnVmOworCisJYXNzZXJ0KGluX293bl9jbHVzdGVyKG5vZGUpKTsKKwlyZWFkX2xvY2tfYmgoJm5hbWV0YmxfbG9jayk7IAorCW1heF9pdGVtX2J1ZiA9IFRJUENfTUFYX1VTRVJfTVNHX1NJWkUgLyBJVEVNX1NJWkU7CisJbWF4X2l0ZW1fYnVmICo9IElURU1fU0laRTsKKwlyZXN0ID0gcHVibF9jbnQgKiBJVEVNX1NJWkU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB1YmwsICZwdWJsX3Jvb3QsIGxvY2FsX2xpc3QpIHsKKwkJaWYgKCFidWYpIHsKKwkJCWxlZnQgPSAocmVzdCA8PSBtYXhfaXRlbV9idWYpID8gcmVzdCA6IG1heF9pdGVtX2J1ZjsKKwkJCXJlc3QgLT0gbGVmdDsKKwkJCWJ1ZiA9IG5hbWVkX3ByZXBhcmVfYnVmKFBVQkxJQ0FUSU9OLCBsZWZ0LCBub2RlKTsgICAgICAgCisJCQlpZiAoYnVmID09IE5VTEwpIHsKKwkJCQl3YXJuKCJNZW1vcnkgU3F1ZWV6ZTsgY291bGQgbm90IHNlbmQgcHVibGljYXRpb25cbiIpOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJCWl0ZW0gPSAoc3RydWN0IGRpc3RyX2l0ZW0gKiltc2dfZGF0YShidWZfbXNnKGJ1ZikpOworCQl9CisJCXB1YmxfdG9faXRlbShpdGVtLCBwdWJsKTsKKwkJaXRlbSsrOworCQlsZWZ0IC09IElURU1fU0laRTsKKwkJaWYgKCFsZWZ0KSB7CisJCQltc2dfc2V0X2xpbmtfc2VsZWN0b3IoYnVmX21zZyhidWYpLCBub2RlKTsKKwkJCWRiZygibmFtZWRfbm9kZV91cDogc2VuZGluZyBwdWJsaXNoIG1zZyB0byAiCisJCQkgICAgIjwldS4ldS4ldT5cbiIsIHRpcGNfem9uZShub2RlKSwgCisJCQkgICAgdGlwY19jbHVzdGVyKG5vZGUpLCB0aXBjX25vZGUobm9kZSkpOworCQkJbGlua19zZW5kKGJ1Ziwgbm9kZSwgbm9kZSk7CisJCQlidWYgPSAwOworCQl9CisJfQorZXhpdDoKKwlyZWFkX3VubG9ja19iaCgmbmFtZXRibF9sb2NrKTsgCit9CisKKy8qKgorICogbm9kZV9pc19kb3duIC0gcmVtb3ZlIHB1YmxpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGZhaWxlZCBub2RlCisgKiAKKyAqIEludm9rZWQgZm9yIGVhY2ggcHVibGljYXRpb24gaXNzdWVkIGJ5IGEgbmV3bHkgZmFpbGVkIG5vZGUuICAKKyAqIFJlbW92ZXMgcHVibGljYXRpb24gc3RydWN0dXJlIGZyb20gbmFtZSB0YWJsZSAmIGRlbGV0ZXMgaXQuCisgKiBJbiByYXJlIGNhc2VzIHRoZSBsaW5rIG1heSBoYXZlIGNvbWUgYmFjayB1cCBhZ2FpbiB3aGVuIHRoaXMKKyAqIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYW5kIHdlIGhhdmUgdHdvIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgc2FtZQorICogcHVibGljYXRpb24uIE51ZGdlIHRoaXMgaXRlbSdzIGtleSB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZSBvdGhlci4KKyAqIChOb3RlOiBQdWJsaWNhdGlvbidzIG5vZGUgc3Vic2NyaXB0aW9uIGlzIGFscmVhZHkgdW5zdWJzY3JpYmVkLikKKyAqLworCitzdGF0aWMgdm9pZCBub2RlX2lzX2Rvd24oc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsKQoreworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcDsKKyAgICAgICAgd3JpdGVfbG9ja19iaCgmbmFtZXRibF9sb2NrKTsKKwlkYmcoIm5vZGVfaXNfZG93bjogd2l0aGRyYXdpbmcgJXUsICV1LCAldVxuIiwgCisJICAgIHB1YmwtPnR5cGUsIHB1YmwtPmxvd2VyLCBwdWJsLT51cHBlcik7CisgICAgICAgIHB1YmwtPmtleSArPSAxMjIyMzQ1OworCXAgPSBuYW1ldGJsX3JlbW92ZV9wdWJsKHB1YmwtPnR5cGUsIHB1YmwtPmxvd2VyLCAKKwkJCQlwdWJsLT5ub2RlLCBwdWJsLT5yZWYsIHB1YmwtPmtleSk7CisgICAgICAgIGFzc2VydChwID09IHB1YmwpOworCXdyaXRlX3VubG9ja19iaCgmbmFtZXRibF9sb2NrKTsKKwlpZiAocHVibCkKKwkJa2ZyZWUocHVibCk7Cit9CisKKy8qKgorICogbmFtZWRfcmVjdiAtIHByb2Nlc3MgbmFtZSB0YWJsZSB1cGRhdGUgbWVzc2FnZSBzZW50IGJ5IGFub3RoZXIgbm9kZQorICovCisKK3ZvaWQgbmFtZWRfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwlzdHJ1Y3QgZGlzdHJfaXRlbSAqaXRlbSA9IChzdHJ1Y3QgZGlzdHJfaXRlbSAqKW1zZ19kYXRhKG1zZyk7CisJdTMyIGNvdW50ID0gbXNnX2RhdGFfc3oobXNnKSAvIElURU1fU0laRTsKKworCXdyaXRlX2xvY2tfYmgoJm5hbWV0YmxfbG9jayk7IAorCXdoaWxlIChjb3VudC0tKSB7CisJCWlmIChtc2dfdHlwZShtc2cpID09IFBVQkxJQ0FUSU9OKSB7CisJCQlkYmcoIm5hbWVkX3JlY3Y6IGdvdCBwdWJsaWNhdGlvbiBmb3IgJXUsICV1LCAldVxuIiwgCisJCQkgICAgbnRvaGwoaXRlbS0+dHlwZSksIG50b2hsKGl0ZW0tPmxvd2VyKSwKKwkJCSAgICBudG9obChpdGVtLT51cHBlcikpOworCQkJcHVibCA9IG5hbWV0YmxfaW5zZXJ0X3B1YmwobnRvaGwoaXRlbS0+dHlwZSksIAorCQkJCQkJICAgbnRvaGwoaXRlbS0+bG93ZXIpLAorCQkJCQkJICAgbnRvaGwoaXRlbS0+dXBwZXIpLAorCQkJCQkJICAgVElQQ19DTFVTVEVSX1NDT1BFLAorCQkJCQkJICAgbXNnX29yaWdub2RlKG1zZyksIAorCQkJCQkJICAgbnRvaGwoaXRlbS0+cmVmKSwKKwkJCQkJCSAgIG50b2hsKGl0ZW0tPmtleSkpOworCQkJaWYgKHB1YmwpIHsKKwkJCQlub2Rlc3ViX3N1YnNjcmliZSgmcHVibC0+c3Vic2NyLCAKKwkJCQkJCSAgbXNnX29yaWdub2RlKG1zZyksIAorCQkJCQkJICBwdWJsLAorCQkJCQkJICAobmV0X2V2X2hhbmRsZXIpbm9kZV9pc19kb3duKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtc2dfdHlwZShtc2cpID09IFdJVEhEUkFXQUwpIHsKKwkJCWRiZygibmFtZWRfcmVjdjogZ290IHdpdGhkcmF3bCBmb3IgJXUsICV1LCAldVxuIiwgCisJCQkgICAgbnRvaGwoaXRlbS0+dHlwZSksIG50b2hsKGl0ZW0tPmxvd2VyKSwKKwkJCSAgICBudG9obChpdGVtLT51cHBlcikpOworCQkJcHVibCA9IG5hbWV0YmxfcmVtb3ZlX3B1YmwobnRvaGwoaXRlbS0+dHlwZSksCisJCQkJCQkgICBudG9obChpdGVtLT5sb3dlciksCisJCQkJCQkgICBtc2dfb3JpZ25vZGUobXNnKSwKKwkJCQkJCSAgIG50b2hsKGl0ZW0tPnJlZiksCisJCQkJCQkgICBudG9obChpdGVtLT5rZXkpKTsKKworCQkJaWYgKHB1YmwpIHsKKwkJCQlub2Rlc3ViX3Vuc3Vic2NyaWJlKCZwdWJsLT5zdWJzY3IpOworICAgICAgICAJCQlrZnJlZShwdWJsKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdhcm4oIm5hbWVkX3JlY3Y6IHVua25vd24gbXNnXG4iKTsKKwkJfQorCQlpdGVtKys7CisJfQorCXdyaXRlX3VubG9ja19iaCgmbmFtZXRibF9sb2NrKTsgCisJYnVmX2Rpc2NhcmQoYnVmKTsKK30KKworLyoqCisgKiBuYW1lZF9yZWluaXQgLSByZS1pbml0aWFsaXplIGxvY2FsIHB1YmxpY2F0aW9uIGxpc3QKKyAqIAorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBUSVBDIG5ldHdvcmtpbmcgaXMgKHJlKWVuYWJsZWQuCisgKiBBbGwgZXhpc3RpbmcgcHVibGljYXRpb25zIGJ5IHRoaXMgbm9kZSB0aGF0IGhhdmUgImNsdXN0ZXIiIG9yICJ6b25lIiBzY29wZQorICogYXJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbm9kZSdzIGN1cnJlbnQgbmV0d29yayBhZGRyZXNzLgorICogKElmIHRoZSBub2RlJ3MgYWRkcmVzcyBpcyB1bmNoYW5nZWQsIHRoZSB1cGRhdGUgbG9vcCB0ZXJtaW5hdGVzIGltbWVkaWF0ZWx5LikKKyAqLworCit2b2lkIG5hbWVkX3JlaW5pdCh2b2lkKQoreworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKworCXdyaXRlX2xvY2tfYmgoJm5hbWV0YmxfbG9jayk7IAorCWxpc3RfZm9yX2VhY2hfZW50cnkocHVibCwgJnB1Ymxfcm9vdCwgbG9jYWxfbGlzdCkgeworCQlpZiAocHVibC0+bm9kZSA9PSB0aXBjX293bl9hZGRyKQorCQkJYnJlYWs7CisJCXB1YmwtPm5vZGUgPSB0aXBjX293bl9hZGRyOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJm5hbWV0YmxfbG9jayk7IAorfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbmFtZV9kaXN0ci5oIGIvbmV0L3RpcGMvbmFtZV9kaXN0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNGJkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9uYW1lX2Rpc3RyLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIG5ldC90aXBjL25hbWVfZGlzdHIuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG5hbWUgZGlzdHJpYnV0aW9uIGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19OQU1FX0RJU1RSX0gKKyNkZWZpbmUgX1RJUENfTkFNRV9ESVNUUl9ICisKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisKK3ZvaWQgbmFtZWRfcHVibGlzaChzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwpOwordm9pZCBuYW1lZF93aXRoZHJhdyhzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwpOwordm9pZCBuYW1lZF9ub2RlX3VwKHVuc2lnbmVkIGxvbmcgbm9kZSk7Cit2b2lkIG5hbWVkX3JlY3Yoc3RydWN0IHNrX2J1ZmYgKmJ1Zik7Cit2b2lkIG5hbWVkX3JlaW5pdCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX3RhYmxlLmMgYi9uZXQvdGlwYy9uYW1lX3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyYzgzZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL25hbWVfdGFibGUuYwpAQCAtMCwwICsxLDEwNzkgQEAKKy8qCisgKiBuZXQvdGlwYy9uYW1lX3RhYmxlLmM6IFRJUEMgbmFtZSB0YWJsZSBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisjaW5jbHVkZSAibmFtZV9kaXN0ci5oIgorI2luY2x1ZGUgImFkZHIuaCIKKyNpbmNsdWRlICJub2RlX3N1YnNjci5oIgorI2luY2x1ZGUgInN1YnNjci5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJjbHVzdGVyLmgiCisjaW5jbHVkZSAiYmNhc3QuaCIKKworaW50IHRpcGNfbmFtZXRibF9zaXplID0gMTAyNDsJCS8qIG11c3QgYmUgYSBwb3dlciBvZiAyICovCisKKy8qKgorICogc3RydWN0IHN1Yl9zZXEgLSBjb250YWluZXIgZm9yIGFsbCBwdWJsaXNoZWQgaW5zdGFuY2VzIG9mIGEgbmFtZSBzZXF1ZW5jZQorICogQGxvd2VyOiBuYW1lIHNlcXVlbmNlIGxvd2VyIGJvdW5kCisgKiBAdXBwZXI6IG5hbWUgc2VxdWVuY2UgdXBwZXIgYm91bmQKKyAqIEBub2RlX2xpc3Q6IGNpcmN1bGFyIGxpc3Qgb2YgbWF0Y2hpbmcgcHVibGljYXRpb25zIHdpdGggPj0gbm9kZSBzY29wZQorICogQGNsdXN0ZXJfbGlzdDogY2lyY3VsYXIgbGlzdCBvZiBtYXRjaGluZyBwdWJsaWNhdGlvbnMgd2l0aCA+PSBjbHVzdGVyIHNjb3BlCisgKiBAem9uZV9saXN0OiBjaXJjdWxhciBsaXN0IG9mIG1hdGNoaW5nIHB1YmxpY2F0aW9ucyB3aXRoID49IHpvbmUgc2NvcGUKKyAqLworCitzdHJ1Y3Qgc3ViX3NlcSB7CisJdTMyIGxvd2VyOworCXUzMiB1cHBlcjsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKm5vZGVfbGlzdDsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKmNsdXN0ZXJfbGlzdDsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnpvbmVfbGlzdDsKK307CisKKy8qKiAKKyAqIHN0cnVjdCBuYW1lX3NlcSAtIGNvbnRhaW5lciBmb3IgYWxsIHB1Ymxpc2hlZCBpbnN0YW5jZXMgb2YgYSBuYW1lIHR5cGUKKyAqIEB0eXBlOiAzMiBiaXQgJ3R5cGUnIHZhbHVlIGZvciBuYW1lIHNlcXVlbmNlCisgKiBAc3NlcTogcG9pbnRlciB0byBkeW5hbWljYWxseS1zaXplZCBhcnJheSBvZiBzdWItc2VxdWVuY2VzIG9mIHRoaXMgJ3R5cGUnOworICogICAgICAgIHN1Yi1zZXF1ZW5jZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIKKyAqIEBhbGxvYzogbnVtYmVyIG9mIHN1Yi1zZXF1ZW5jZXMgY3VycmVudGx5IGluIGFycmF5CisgKiBAZmlyc3RfZnJlZTogdXBwZXIgYm91bmQgb2YgaGlnaGVzdCBzdWItc2VxdWVuY2UgKyAxCisgKiBAbnNfbGlzdDogbGlua3MgdG8gYWRqYWNlbnQgbmFtZSBzZXF1ZW5jZXMgaW4gaGFzaCBjaGFpbgorICogQHN1YnNjcmlwdGlvbnM6IGxpc3Qgb2Ygc3Vic2NyaXB0aW9ucyBmb3IgdGhpcyAndHlwZScKKyAqIEBsb2NrOiBzcGlubG9jayBjb250cm9sbGluZyBhY2Nlc3MgdG8gbmFtZSBzZXF1ZW5jZSBzdHJ1Y3R1cmUKKyAqLworCitzdHJ1Y3QgbmFtZV9zZXEgeworCXUzMiB0eXBlOworCXN0cnVjdCBzdWJfc2VxICpzc2VxczsKKwl1MzIgYWxsb2M7CisJdTMyIGZpcnN0X2ZyZWU7CisJc3RydWN0IGhsaXN0X25vZGUgbnNfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1YnNjcmlwdGlvbnM7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbmFtZV90YWJsZSAtIHRhYmxlIGNvbnRhaW5pbmcgYWxsIGV4aXN0aW5nIHBvcnQgbmFtZSBwdWJsaWNhdGlvbnMKKyAqIEB0eXBlczogcG9pbnRlciB0byBmaXhlZC1zaXplZCBhcnJheSBvZiBuYW1lIHNlcXVlbmNlIGxpc3RzLCAKKyAqICAgICAgICAgYWNjZXNzZWQgdmlhIGhhc2hpbmcgb24gJ3R5cGUnOyBuYW1lIHNlcXVlbmNlIGxpc3RzIGFyZSAqbm90KiBzb3J0ZWQKKyAqIEBsb2NhbF9wdWJsX2NvdW50OiBudW1iZXIgb2YgcHVibGljYXRpb25zIGlzc3VlZCBieSB0aGlzIG5vZGUKKyAqLworCitzdHJ1Y3QgbmFtZV90YWJsZSB7CisJc3RydWN0IGhsaXN0X2hlYWQgKnR5cGVzOworCXUzMiBsb2NhbF9wdWJsX2NvdW50OworfTsKKworc3RydWN0IG5hbWVfdGFibGUgdGFibGUgPSB7IE5VTEwgfSA7CitzdGF0aWMgYXRvbWljX3QgcnN2X3B1Ymxfb2sgPSBBVE9NSUNfSU5JVCgwKTsKK3J3bG9ja190IG5hbWV0YmxfbG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQ7CisKKworc3RhdGljIGlubGluZSBpbnQgaGFzaChpbnQgeCkKK3sKKwlyZXR1cm4oeCAmICh0aXBjX25hbWV0Ymxfc2l6ZSAtIDEpKTsKK30KKworLyoqCisgKiBwdWJsX2NyZWF0ZSAtIGNyZWF0ZSBhIHB1YmxpY2F0aW9uIHN0cnVjdHVyZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmxfY3JlYXRlKHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwgCisJCQkJICAgICAgIHUzMiBzY29wZSwgdTMyIG5vZGUsIHUzMiBwb3J0X3JlZiwgICAKKwkJCQkgICAgICAgdTMyIGtleSkKK3sKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwgPQorCQkoc3RydWN0IHB1YmxpY2F0aW9uICopa21hbGxvYyhzaXplb2YoKnB1YmwpLCBHRlBfQVRPTUlDKTsKKwlpZiAocHVibCA9PSBOVUxMKSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBmYWlsZWQgdG8gY3JlYXRlIHB1YmxpY2F0aW9uXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KHB1YmwsIDAsIHNpemVvZigqcHVibCkpOworCXB1YmwtPnR5cGUgPSB0eXBlOworCXB1YmwtPmxvd2VyID0gbG93ZXI7CisJcHVibC0+dXBwZXIgPSB1cHBlcjsKKwlwdWJsLT5zY29wZSA9IHNjb3BlOworCXB1YmwtPm5vZGUgPSBub2RlOworCXB1YmwtPnJlZiA9IHBvcnRfcmVmOworCXB1YmwtPmtleSA9IGtleTsKKwlJTklUX0xJU1RfSEVBRCgmcHVibC0+bG9jYWxfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnB1YmwtPnBwb3J0X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZwdWJsLT5zdWJzY3Iubm9kZXN1Yl9saXN0KTsKKwlyZXR1cm4gcHVibDsKK30KKworLyoqCisgKiBzdWJzZXFfYWxsb2MgLSBhbGxvY2F0ZSBhIHNwZWNpZmllZCBudW1iZXIgb2Ygc3ViLXNlcXVlbmNlIHN0cnVjdHVyZXMKKyAqLworCitzdHJ1Y3Qgc3ViX3NlcSAqc3Vic2VxX2FsbG9jKHUzMiBjbnQpCit7CisJdTMyIHN6ID0gY250ICogc2l6ZW9mKHN0cnVjdCBzdWJfc2VxKTsKKwlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcSA9IChzdHJ1Y3Qgc3ViX3NlcSAqKWttYWxsb2Moc3osIEdGUF9BVE9NSUMpOworCisJaWYgKHNzZXEpCisJCW1lbXNldChzc2VxLCAwLCBzeik7CisJcmV0dXJuIHNzZXE7Cit9CisKKy8qKgorICogbmFtZXNlcV9jcmVhdGUgLSBjcmVhdGUgYSBuYW1lIHNlcXVlbmNlIHN0cnVjdHVyZSBmb3IgdGhlIHNwZWNpZmllZCAndHlwZScKKyAqIAorICogQWxsb2NhdGVzIGEgc2luZ2xlIHN1Yi1zZXF1ZW5jZSBzdHJ1Y3R1cmUgYW5kIHNldHMgaXQgdG8gYWxsIDAncy4KKyAqLworCitzdHJ1Y3QgbmFtZV9zZXEgKm5hbWVzZXFfY3JlYXRlKHUzMiB0eXBlLCBzdHJ1Y3QgaGxpc3RfaGVhZCAqc2VxX2hlYWQpCit7CisJc3RydWN0IG5hbWVfc2VxICpuc2VxID0gCisJCShzdHJ1Y3QgbmFtZV9zZXEgKilrbWFsbG9jKHNpemVvZigqbnNlcSksIEdGUF9BVE9NSUMpOworCXN0cnVjdCBzdWJfc2VxICpzc2VxID0gc3Vic2VxX2FsbG9jKDEpOworCisJaWYgKCFuc2VxIHx8ICFzc2VxKSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBmYWlsZWQgdG8gY3JlYXRlIG5hbWUgc2VxdWVuY2VcbiIpOworCQlrZnJlZShuc2VxKTsKKwkJa2ZyZWUoc3NlcSk7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldChuc2VxLCAwLCBzaXplb2YoKm5zZXEpKTsKKwluc2VxLT5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCW5zZXEtPnR5cGUgPSB0eXBlOworCW5zZXEtPnNzZXFzID0gc3NlcTsKKwlkYmcoIm5hbWVzZXFfY3JlYXRlKCkgbnNlcSA9ICV4IHR5cGUgJXUsIHNzc2VxcyAleCwgZmY6ICV1XG4iLAorCSAgICBuc2VxLCB0eXBlLCBuc2VxLT5zc2VxcywgbnNlcS0+Zmlyc3RfZnJlZSk7CisJbnNlcS0+YWxsb2MgPSAxOworCUlOSVRfSExJU1RfTk9ERSgmbnNlcS0+bnNfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm5zZXEtPnN1YnNjcmlwdGlvbnMpOworCWhsaXN0X2FkZF9oZWFkKCZuc2VxLT5uc19saXN0LCBzZXFfaGVhZCk7CisJcmV0dXJuIG5zZXE7Cit9CisKKy8qKgorICogbmFtZXNlcV9maW5kX3N1YnNlcSAtIGZpbmQgc3ViLXNlcXVlbmNlIChpZiBhbnkpIG1hdGNoaW5nIGEgbmFtZSBpbnN0YW5jZQorICogIAorICogVmVyeSB0aW1lLWNyaXRpY2FsLCBzbyBiaW5hcnkgc2VhcmNoZXMgdGhyb3VnaCBzdWItc2VxdWVuY2UgYXJyYXkuCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3ViX3NlcSAqbmFtZXNlcV9maW5kX3N1YnNlcShzdHJ1Y3QgbmFtZV9zZXEgKm5zZXEsIAorCQkJCQkJICB1MzIgaW5zdGFuY2UpCit7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXFzID0gbnNlcS0+c3NlcXM7CisJaW50IGxvdyA9IDA7CisJaW50IGhpZ2ggPSBuc2VxLT5maXJzdF9mcmVlIC0gMTsKKwlpbnQgbWlkOworCisJd2hpbGUgKGxvdyA8PSBoaWdoKSB7CisJCW1pZCA9IChsb3cgKyBoaWdoKSAvIDI7CisJCWlmIChpbnN0YW5jZSA8IHNzZXFzW21pZF0ubG93ZXIpCisJCQloaWdoID0gbWlkIC0gMTsKKwkJZWxzZSBpZiAoaW5zdGFuY2UgPiBzc2Vxc1ttaWRdLnVwcGVyKQorCQkJbG93ID0gbWlkICsgMTsKKwkJZWxzZQorCQkJcmV0dXJuICZzc2Vxc1ttaWRdOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBuYW1lc2VxX2xvY2F0ZV9zdWJzZXEgLSBkZXRlcm1pbmUgcG9zaXRpb24gb2YgbmFtZSBpbnN0YW5jZSBpbiBzdWItc2VxdWVuY2UKKyAqIAorICogUmV0dXJucyBpbmRleCBpbiBzdWItc2VxdWVuY2UgYXJyYXkgb2YgdGhlIGVudHJ5IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZAorICogaW5zdGFuY2UgdmFsdWU7IGlmIG5vIGVudHJ5IGNvbnRhaW5zIHRoYXQgdmFsdWUsIHJldHVybnMgdGhlIHBvc2l0aW9uCisgKiB3aGVyZSBhIG5ldyBlbnRyeSBmb3IgaXQgd291bGQgYmUgaW5zZXJ0ZWQgaW4gdGhlIGFycmF5LgorICoKKyAqIE5vdGU6IFNpbWlsYXIgdG8gYmluYXJ5IHNlYXJjaCBjb2RlIGZvciBsb2NhdGluZyBhIHN1Yi1zZXF1ZW5jZS4KKyAqLworCitzdGF0aWMgdTMyIG5hbWVzZXFfbG9jYXRlX3N1YnNlcShzdHJ1Y3QgbmFtZV9zZXEgKm5zZXEsIHUzMiBpbnN0YW5jZSkKK3sKKwlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcXMgPSBuc2VxLT5zc2VxczsKKwlpbnQgbG93ID0gMDsKKwlpbnQgaGlnaCA9IG5zZXEtPmZpcnN0X2ZyZWUgLSAxOworCWludCBtaWQ7CisKKwl3aGlsZSAobG93IDw9IGhpZ2gpIHsKKwkJbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKKwkJaWYgKGluc3RhbmNlIDwgc3NlcXNbbWlkXS5sb3dlcikKKwkJCWhpZ2ggPSBtaWQgLSAxOworCQllbHNlIGlmIChpbnN0YW5jZSA+IHNzZXFzW21pZF0udXBwZXIpCisJCQlsb3cgPSBtaWQgKyAxOworCQllbHNlCisJCQlyZXR1cm4gbWlkOworCX0KKwlyZXR1cm4gbG93OworfQorCisvKioKKyAqIG5hbWVzZXFfaW5zZXJ0X3B1YmwgLSAKKyAqLworCitzdHJ1Y3QgcHVibGljYXRpb24gKm5hbWVzZXFfaW5zZXJ0X3B1Ymwoc3RydWN0IG5hbWVfc2VxICpuc2VxLAorCQkJCQl1MzIgdHlwZSwgdTMyIGxvd2VyLCB1MzIgdXBwZXIsCisJCQkJCXUzMiBzY29wZSwgdTMyIG5vZGUsIHUzMiBwb3J0LCB1MzIga2V5KQoreworCXN0cnVjdCBzdWJzY3JpcHRpb24gKnM7CisJc3RydWN0IHN1YnNjcmlwdGlvbiAqc3Q7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCXN0cnVjdCBzdWJfc2VxICpzc2VxOworCWludCBjcmVhdGVkX3N1YnNlcSA9IDA7CisKKwlhc3NlcnQobnNlcS0+Zmlyc3RfZnJlZSA8PSBuc2VxLT5hbGxvYyk7CisJc3NlcSA9IG5hbWVzZXFfZmluZF9zdWJzZXEobnNlcSwgbG93ZXIpOworCWRiZygibmFtZXNlcV9pbnM6IGZvciBzZXEgJXgsPCV1LCV1PiwgZm91bmQgc3NlcSAleFxuIiwKKwkgICAgbnNlcSwgdHlwZSwgbG93ZXIsIHNzZXEpOworCWlmIChzc2VxKSB7CisKKwkJLyogTG93ZXIgZW5kIG92ZXJsYXBzIGV4aXN0aW5nIGVudHJ5ID0+IG5lZWQgYW4gZXhhY3QgbWF0Y2ggKi8KKworCQlpZiAoKHNzZXEtPmxvd2VyICE9IGxvd2VyKSB8fCAoc3NlcS0+dXBwZXIgIT0gdXBwZXIpKSB7CisJCQl3YXJuKCJPdmVybGFwcGluZyBwdWJsIDwldSwldSwldT5cbiIsIHR5cGUsIGxvd2VyLCB1cHBlcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCXUzMiBpbnNwb3M7CisJCXN0cnVjdCBzdWJfc2VxICpmcmVlc3NlcTsKKworCQkvKiBGaW5kIHdoZXJlIGxvd2VyIGVuZCBzaG91bGQgYmUgaW5zZXJ0ZWQgKi8KKworCQlpbnNwb3MgPSBuYW1lc2VxX2xvY2F0ZV9zdWJzZXEobnNlcSwgbG93ZXIpOworCisJCS8qIEZhaWwgaWYgdXBwZXIgZW5kIG92ZXJsYXBzIGludG8gYW4gZXhpc3RpbmcgZW50cnkgKi8KKworCQlpZiAoKGluc3BvcyA8IG5zZXEtPmZpcnN0X2ZyZWUpICYmCisJCSAgICAodXBwZXIgPj0gbnNlcS0+c3NlcXNbaW5zcG9zXS5sb3dlcikpIHsKKwkJCXdhcm4oIk92ZXJsYXBwaW5nIHB1YmwgPCV1LCV1LCV1PlxuIiwgdHlwZSwgbG93ZXIsIHVwcGVyKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogRW5zdXJlIHRoZXJlIGlzIHNwYWNlIGZvciBuZXcgc3ViLXNlcXVlbmNlICovCisKKwkJaWYgKG5zZXEtPmZpcnN0X2ZyZWUgPT0gbnNlcS0+YWxsb2MpIHsKKwkJCXN0cnVjdCBzdWJfc2VxICpzc2VxcyA9IG5zZXEtPnNzZXFzOworCQkJbnNlcS0+c3NlcXMgPSBzdWJzZXFfYWxsb2MobnNlcS0+YWxsb2MgKiAyKTsKKwkJCWlmIChuc2VxLT5zc2VxcyAhPSBOVUxMKSB7CisJCQkJbWVtY3B5KG5zZXEtPnNzZXFzLCBzc2VxcywKKwkJCQkgICAgICAgbnNlcS0+YWxsb2MgKiBzaXplb2YgKHN0cnVjdCBzdWJfc2VxKSk7CisJCQkJa2ZyZWUoc3NlcXMpOworCQkJCWRiZygiQWxsb2NhdGVkICV1IHNzZXFzXG4iLCBuc2VxLT5hbGxvYyk7CisJCQkJbnNlcS0+YWxsb2MgKj0gMjsKKwkJCX0gZWxzZSB7CisJCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBjcmVhdGUgc3ViLXNlcXVlbmNlXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlkYmcoIkhhdmUgJXUgc3NlcXMgZm9yIHR5cGUgJXVcbiIsIG5zZXEtPmFsbG9jLCB0eXBlKTsKKworCQkvKiBJbnNlcnQgbmV3IHN1Yi1zZXF1ZW5jZSAqLworCisJCWRiZygiaW5zIGluIHBvcyAldSwgZmYgPSAldVxuIiwgaW5zcG9zLCBuc2VxLT5maXJzdF9mcmVlKTsKKwkJc3NlcSA9ICZuc2VxLT5zc2Vxc1tpbnNwb3NdOworCQlmcmVlc3NlcSA9ICZuc2VxLT5zc2Vxc1tuc2VxLT5maXJzdF9mcmVlXTsKKwkJbWVtbW92ZShzc2VxICsgMSwgc3NlcSwgKGZyZWVzc2VxIC0gc3NlcSkgKiBzaXplb2YgKCpzc2VxKSk7CisJCW1lbXNldChzc2VxLCAwLCBzaXplb2YgKCpzc2VxKSk7CisJCW5zZXEtPmZpcnN0X2ZyZWUrKzsKKwkJc3NlcS0+bG93ZXIgPSBsb3dlcjsKKwkJc3NlcS0+dXBwZXIgPSB1cHBlcjsKKwkJY3JlYXRlZF9zdWJzZXEgPSAxOworCX0KKwlkYmcoImluc2VydGluZyAoJXUgJXUgJXUpIGZyb20gJXg6JXUgaW50byBzc2VxICV4KCV1LCV1KSBvZiBzZXEgJXhcbiIsCisJICAgIHR5cGUsIGxvd2VyLCB1cHBlciwgbm9kZSwgcG9ydCwgc3NlcSwKKwkgICAgc3NlcS0+bG93ZXIsIHNzZXEtPnVwcGVyLCBuc2VxKTsKKworCS8qIEluc2VydCBhIHB1YmxpY2F0aW9uOiAqLworCisJcHVibCA9IHB1YmxfY3JlYXRlKHR5cGUsIGxvd2VyLCB1cHBlciwgc2NvcGUsIG5vZGUsIHBvcnQsIGtleSk7CisJaWYgKCFwdWJsKQorCQlyZXR1cm4gMDsKKwlkYmcoImluc2VydGluZyBwdWJsICV4LCBub2RlPSV4IHB1YmwtPm5vZGU9JXgsIHN1YnNjci0+bm9kZT0leFxuIiwKKwkgICAgcHVibCwgbm9kZSwgcHVibC0+bm9kZSwgcHVibC0+c3Vic2NyLm5vZGUpOworCisJaWYgKCFzc2VxLT56b25lX2xpc3QpCisJCXNzZXEtPnpvbmVfbGlzdCA9IHB1YmwtPnpvbmVfbGlzdF9uZXh0ID0gcHVibDsKKwllbHNlIHsKKwkJcHVibC0+em9uZV9saXN0X25leHQgPSBzc2VxLT56b25lX2xpc3QtPnpvbmVfbGlzdF9uZXh0OworCQlzc2VxLT56b25lX2xpc3QtPnpvbmVfbGlzdF9uZXh0ID0gcHVibDsKKwl9CisKKwlpZiAoaW5fb3duX2NsdXN0ZXIobm9kZSkpIHsKKwkJaWYgKCFzc2VxLT5jbHVzdGVyX2xpc3QpCisJCQlzc2VxLT5jbHVzdGVyX2xpc3QgPSBwdWJsLT5jbHVzdGVyX2xpc3RfbmV4dCA9IHB1Ymw7CisJCWVsc2UgeworCQkJcHVibC0+Y2x1c3Rlcl9saXN0X25leHQgPQorCQkJc3NlcS0+Y2x1c3Rlcl9saXN0LT5jbHVzdGVyX2xpc3RfbmV4dDsKKwkJCXNzZXEtPmNsdXN0ZXJfbGlzdC0+Y2x1c3Rlcl9saXN0X25leHQgPSBwdWJsOworCQl9CisJfQorCisJaWYgKG5vZGUgPT0gdGlwY19vd25fYWRkcikgeworCQlpZiAoIXNzZXEtPm5vZGVfbGlzdCkKKwkJCXNzZXEtPm5vZGVfbGlzdCA9IHB1YmwtPm5vZGVfbGlzdF9uZXh0ID0gcHVibDsKKwkJZWxzZSB7CisJCQlwdWJsLT5ub2RlX2xpc3RfbmV4dCA9IHNzZXEtPm5vZGVfbGlzdC0+bm9kZV9saXN0X25leHQ7CisJCQlzc2VxLT5ub2RlX2xpc3QtPm5vZGVfbGlzdF9uZXh0ID0gcHVibDsKKwkJfQorCX0KKworCS8qIAorCSAqIEFueSBzdWJzY3JpcHRpb25zIHdhaXRpbmcgZm9yIG5vdGlmaWNhdGlvbj8gCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHMsIHN0LCAmbnNlcS0+c3Vic2NyaXB0aW9ucywgbmFtZXNlcV9saXN0KSB7CisJCWRiZygiY2FsbGluZyByZXBvcnRfb3ZlcmxhcCgpXG4iKTsKKwkJc3Vic2NyX3JlcG9ydF9vdmVybGFwKHMsCisJCQkJICAgICAgcHVibC0+bG93ZXIsCisJCQkJICAgICAgcHVibC0+dXBwZXIsCisJCQkJICAgICAgVElQQ19QVUJMSVNIRUQsCisJCQkJICAgICAgcHVibC0+cmVmLCAKKwkJCQkgICAgICBwdWJsLT5ub2RlLAorCQkJCSAgICAgIGNyZWF0ZWRfc3Vic2VxKTsKKwl9CisJcmV0dXJuIHB1Ymw7Cit9CisKKy8qKgorICogbmFtZXNlcV9yZW1vdmVfcHVibCAtCisgKi8KKworc3RydWN0IHB1YmxpY2F0aW9uICpuYW1lc2VxX3JlbW92ZV9wdWJsKHN0cnVjdCBuYW1lX3NlcSAqbnNlcSwgdTMyIGluc3QsCisJCQkJCXUzMiBub2RlLCB1MzIgcmVmLCB1MzIga2V5KQoreworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnByZXY7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXEgPSBuYW1lc2VxX2ZpbmRfc3Vic2VxKG5zZXEsIGluc3QpOworCXN0cnVjdCBzdWJfc2VxICpmcmVlOworCXN0cnVjdCBzdWJzY3JpcHRpb24gKnMsICpzdDsKKwlpbnQgcmVtb3ZlZF9zdWJzZXEgPSAwOworCisJYXNzZXJ0KG5zZXEpOworCisJaWYgKCFzc2VxKSB7CisJCWludCBpOworCisJCXdhcm4oIldpdGhkcmF3IHVua25vd24gPCV1LCV1Pj9cbiIsIG5zZXEtPnR5cGUsIGluc3QpOworCQlhc3NlcnQobnNlcS0+c3NlcXMpOworCQlkYmcoIkR1bXBpbmcgc3Vic2VxcyAleCBmb3IgJXgsIGFsbG9jID0gJXUsZmY9JXVcbiIsCisJCSAgICBuc2VxLT5zc2VxcywgbnNlcSwgbnNlcS0+YWxsb2MsIAorCQkgICAgbnNlcS0+Zmlyc3RfZnJlZSk7CisJCWZvciAoaSA9IDA7IGkgPCBuc2VxLT5maXJzdF9mcmVlOyBpKyspIHsKKwkJCWRiZygiU3Vic2VxICV1KCV4KTogbG93ZXIgPSAldSx1cHBlciA9ICV1XG4iLAorCQkJICAgIGksICZuc2VxLT5zc2Vxc1tpXSwgbnNlcS0+c3NlcXNbaV0ubG93ZXIsCisJCQkgICAgbnNlcS0+c3NlcXNbaV0udXBwZXIpOworCQl9CisJCXJldHVybiAwOworCX0KKwlkYmcoIm5hbWVzZXFfcmVtb3ZlOiBzZXE6ICV4LCBzc2VxICV4LCA8JXUsJXU+IGtleSAldVxuIiwKKwkgICAgbnNlcSwgc3NlcSwgbnNlcS0+dHlwZSwgaW5zdCwga2V5KTsKKworCXByZXYgPSBzc2VxLT56b25lX2xpc3Q7CisJcHVibCA9IHNzZXEtPnpvbmVfbGlzdC0+em9uZV9saXN0X25leHQ7CisJd2hpbGUgKChwdWJsLT5rZXkgIT0ga2V5KSB8fCAocHVibC0+cmVmICE9IHJlZikgfHwgCisJICAgICAgIChwdWJsLT5ub2RlICYmIChwdWJsLT5ub2RlICE9IG5vZGUpKSkgeworCQlwcmV2ID0gcHVibDsKKwkJcHVibCA9IHB1YmwtPnpvbmVfbGlzdF9uZXh0OworCQlhc3NlcnQocHJldiAhPSBzc2VxLT56b25lX2xpc3QpOworCX0KKwlpZiAocHVibCAhPSBzc2VxLT56b25lX2xpc3QpCisJCXByZXYtPnpvbmVfbGlzdF9uZXh0ID0gcHVibC0+em9uZV9saXN0X25leHQ7CisJZWxzZSBpZiAocHVibC0+em9uZV9saXN0X25leHQgIT0gcHVibCkgeworCQlwcmV2LT56b25lX2xpc3RfbmV4dCA9IHB1YmwtPnpvbmVfbGlzdF9uZXh0OworCQlzc2VxLT56b25lX2xpc3QgPSBwdWJsLT56b25lX2xpc3RfbmV4dDsKKwl9IGVsc2UgeworCQlzc2VxLT56b25lX2xpc3QgPSAwOworCX0KKworCWlmIChpbl9vd25fY2x1c3Rlcihub2RlKSkgeworCQlwcmV2ID0gc3NlcS0+Y2x1c3Rlcl9saXN0OworCQlwdWJsID0gc3NlcS0+Y2x1c3Rlcl9saXN0LT5jbHVzdGVyX2xpc3RfbmV4dDsKKwkJd2hpbGUgKChwdWJsLT5rZXkgIT0ga2V5KSB8fCAocHVibC0+cmVmICE9IHJlZikgfHwgCisJCSAgICAgICAocHVibC0+bm9kZSAmJiAocHVibC0+bm9kZSAhPSBub2RlKSkpIHsKKwkJCXByZXYgPSBwdWJsOworCQkJcHVibCA9IHB1YmwtPmNsdXN0ZXJfbGlzdF9uZXh0OworCQkJYXNzZXJ0KHByZXYgIT0gc3NlcS0+Y2x1c3Rlcl9saXN0KTsKKwkJfQorCQlpZiAocHVibCAhPSBzc2VxLT5jbHVzdGVyX2xpc3QpCisJCQlwcmV2LT5jbHVzdGVyX2xpc3RfbmV4dCA9IHB1YmwtPmNsdXN0ZXJfbGlzdF9uZXh0OworCQllbHNlIGlmIChwdWJsLT5jbHVzdGVyX2xpc3RfbmV4dCAhPSBwdWJsKSB7CisJCQlwcmV2LT5jbHVzdGVyX2xpc3RfbmV4dCA9IHB1YmwtPmNsdXN0ZXJfbGlzdF9uZXh0OworCQkJc3NlcS0+Y2x1c3Rlcl9saXN0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7CisJCX0gZWxzZSB7CisJCQlzc2VxLT5jbHVzdGVyX2xpc3QgPSAwOworCQl9CisJfQorCisJaWYgKG5vZGUgPT0gdGlwY19vd25fYWRkcikgeworCQlwcmV2ID0gc3NlcS0+bm9kZV9saXN0OworCQlwdWJsID0gc3NlcS0+bm9kZV9saXN0LT5ub2RlX2xpc3RfbmV4dDsKKwkJd2hpbGUgKChwdWJsLT5rZXkgIT0ga2V5KSB8fCAocHVibC0+cmVmICE9IHJlZikgfHwgCisJCSAgICAgICAocHVibC0+bm9kZSAmJiAocHVibC0+bm9kZSAhPSBub2RlKSkpIHsKKwkJCXByZXYgPSBwdWJsOworCQkJcHVibCA9IHB1YmwtPm5vZGVfbGlzdF9uZXh0OworCQkJYXNzZXJ0KHByZXYgIT0gc3NlcS0+bm9kZV9saXN0KTsKKwkJfQorCQlpZiAocHVibCAhPSBzc2VxLT5ub2RlX2xpc3QpCisJCQlwcmV2LT5ub2RlX2xpc3RfbmV4dCA9IHB1YmwtPm5vZGVfbGlzdF9uZXh0OworCQllbHNlIGlmIChwdWJsLT5ub2RlX2xpc3RfbmV4dCAhPSBwdWJsKSB7CisJCQlwcmV2LT5ub2RlX2xpc3RfbmV4dCA9IHB1YmwtPm5vZGVfbGlzdF9uZXh0OworCQkJc3NlcS0+bm9kZV9saXN0ID0gcHVibC0+bm9kZV9saXN0X25leHQ7CisJCX0gZWxzZSB7CisJCQlzc2VxLT5ub2RlX2xpc3QgPSAwOworCQl9CisJfQorCWFzc2VydCghcHVibC0+bm9kZSB8fCAocHVibC0+bm9kZSA9PSBub2RlKSk7CisJYXNzZXJ0KHB1YmwtPnJlZiA9PSByZWYpOworCWFzc2VydChwdWJsLT5rZXkgPT0ga2V5KTsKKworCS8qIAorCSAqIENvbnRyYWN0IHN1YnNlcSBsaXN0IGlmIG5vIG1vcmUgcHVibGljYXRpb25zOgorCSAqLworCWlmICghc3NlcS0+bm9kZV9saXN0ICYmICFzc2VxLT5jbHVzdGVyX2xpc3QgJiYgIXNzZXEtPnpvbmVfbGlzdCkgeworCQlmcmVlID0gJm5zZXEtPnNzZXFzW25zZXEtPmZpcnN0X2ZyZWUtLV07CisJCW1lbW1vdmUoc3NlcSwgc3NlcSArIDEsIChmcmVlIC0gKHNzZXEgKyAxKSkgKiBzaXplb2YgKCpzc2VxKSk7CisJCXJlbW92ZWRfc3Vic2VxID0gMTsKKwl9CisKKwkvKiAKKwkgKiBBbnkgc3Vic2NyaXB0aW9ucyB3YWl0aW5nID8gCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHMsIHN0LCAmbnNlcS0+c3Vic2NyaXB0aW9ucywgbmFtZXNlcV9saXN0KSB7CisJCXN1YnNjcl9yZXBvcnRfb3ZlcmxhcChzLAorCQkJCSAgICAgIHB1YmwtPmxvd2VyLAorCQkJCSAgICAgIHB1YmwtPnVwcGVyLAorCQkJCSAgICAgIFRJUENfV0lUSERSQVdOLCAKKwkJCQkgICAgICBwdWJsLT5yZWYsIAorCQkJCSAgICAgIHB1YmwtPm5vZGUsCisJCQkJICAgICAgcmVtb3ZlZF9zdWJzZXEpOworCX0KKwlyZXR1cm4gcHVibDsKK30KKworLyoqCisgKiBuYW1lc2VxX3N1YnNjcmliZTogYXR0YWNoIGEgc3Vic2NyaXB0aW9uLCBhbmQgaXNzdWUKKyAqIHRoZSBwcmVzY3JpYmVkIG51bWJlciBvZiBldmVudHMgaWYgdGhlcmUgaXMgYW55IHN1Yi0KKyAqIHNlcXVlbmNlIG92ZXJsYXBwaW5nIHdpdGggdGhlIHJlcXVlc3RlZCBzZXF1ZW5jZQorICovCisKK3ZvaWQgbmFtZXNlcV9zdWJzY3JpYmUoc3RydWN0IG5hbWVfc2VxICpuc2VxLCBzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzKQoreworCXN0cnVjdCBzdWJfc2VxICpzc2VxID0gbnNlcS0+c3NlcXM7CisKKwlsaXN0X2FkZCgmcy0+bmFtZXNlcV9saXN0LCAmbnNlcS0+c3Vic2NyaXB0aW9ucyk7CisKKwlpZiAoIXNzZXEpCisJCXJldHVybjsKKworCXdoaWxlIChzc2VxICE9ICZuc2VxLT5zc2Vxc1tuc2VxLT5maXJzdF9mcmVlXSkgeworCQlzdHJ1Y3QgcHVibGljYXRpb24gKnpsID0gc3NlcS0+em9uZV9saXN0OworCQlpZiAoemwgJiYgc3Vic2NyX292ZXJsYXAocyxzc2VxLT5sb3dlcixzc2VxLT51cHBlcikpIHsKKwkJCXN0cnVjdCBwdWJsaWNhdGlvbiAqY3JzID0gemw7CisJCQlpbnQgbXVzdF9yZXBvcnQgPSAxOworCisJCQlkbyB7CisJCQkJc3Vic2NyX3JlcG9ydF9vdmVybGFwKHMsIAorCQkJCQkJICAgICAgIHNzZXEtPmxvd2VyLCAKKwkJCQkJCSAgICAgICBzc2VxLT51cHBlciwKKwkJCQkJCSAgICAgICBUSVBDX1BVQkxJU0hFRCwKKwkJCQkJCSAgICAgICBjcnMtPnJlZiwKKwkJCQkJCSAgICAgICBjcnMtPm5vZGUsCisJCQkJCQkgICAgICAgbXVzdF9yZXBvcnQpOworCQkJCW11c3RfcmVwb3J0ID0gMDsKKwkJCQljcnMgPSBjcnMtPnpvbmVfbGlzdF9uZXh0OworCQkJfSB3aGlsZSAoY3JzICE9IHpsKTsKKwkJfQorCQlzc2VxKys7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG5hbWVfc2VxICpuYW1ldGJsX2ZpbmRfc2VxKHUzMiB0eXBlKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpzZXFfaGVhZDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqc2VxX25vZGU7CisJc3RydWN0IG5hbWVfc2VxICpuczsKKworCWRiZygiZmluZF9zZXEgJXUsKCV1LDB4JXgpIHRhYmxlID0gJXAsIGhhc2hbdHlwZV0gPSAldVxuIiwKKwkgICAgdHlwZSwgbnRvaGwodHlwZSksIHR5cGUsIHRhYmxlLnR5cGVzLCBoYXNoKHR5cGUpKTsKKworCXNlcV9oZWFkID0gJnRhYmxlLnR5cGVzW2hhc2godHlwZSldOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zLCBzZXFfbm9kZSwgc2VxX2hlYWQsIG5zX2xpc3QpIHsKKwkJaWYgKG5zLT50eXBlID09IHR5cGUpIHsKKwkJCWRiZygiZm91bmQgJXhcbiIsIG5zKTsKKwkJCXJldHVybiBuczsKKwkJfQorCX0KKworCXJldHVybiAwOworfTsKKworc3RydWN0IHB1YmxpY2F0aW9uICpuYW1ldGJsX2luc2VydF9wdWJsKHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwKKwkJICAgIHUzMiBzY29wZSwgdTMyIG5vZGUsIHUzMiBwb3J0LCB1MzIga2V5KQoreworCXN0cnVjdCBuYW1lX3NlcSAqc2VxID0gbmFtZXRibF9maW5kX3NlcSh0eXBlKTsKKworCWRiZygiaW5zX3B1Ymw6IDwldSwleCwleD4gZm91bmQgJXhcbiIsIHR5cGUsIGxvd2VyLCB1cHBlciwgc2VxKTsKKwlpZiAobG93ZXIgPiB1cHBlcikgeworCQl3YXJuKCJGYWlsZWQgdG8gcHVibGlzaCBpbGxlZ2FsIDwldSwldSwldT5cbiIsCisJCSAgICAgdHlwZSwgbG93ZXIsIHVwcGVyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGJnKCJQdWJsaXNoaW5nIDwldSwldSwldT4gZnJvbSAleFxuIiwgdHlwZSwgbG93ZXIsIHVwcGVyLCBub2RlKTsKKwlpZiAoIXNlcSkgeworCQlzZXEgPSBuYW1lc2VxX2NyZWF0ZSh0eXBlLCAmdGFibGUudHlwZXNbaGFzaCh0eXBlKV0pOworCQlkYmcoIm5hbWV0YmxfaW5zZXJ0X3B1Ymw6IGNyZWF0ZWQgJXhcbiIsIHNlcSk7CisJfQorCWlmICghc2VxKQorCQlyZXR1cm4gMDsKKworCWFzc2VydChzZXEtPnR5cGUgPT0gdHlwZSk7CisJcmV0dXJuIG5hbWVzZXFfaW5zZXJ0X3B1Ymwoc2VxLCB0eXBlLCBsb3dlciwgdXBwZXIsCisJCQkJICAgc2NvcGUsIG5vZGUsIHBvcnQsIGtleSk7Cit9CisKK3N0cnVjdCBwdWJsaWNhdGlvbiAqbmFtZXRibF9yZW1vdmVfcHVibCh1MzIgdHlwZSwgdTMyIGxvd2VyLCAKKwkJCQkJdTMyIG5vZGUsIHUzMiByZWYsIHUzMiBrZXkpCit7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCXN0cnVjdCBuYW1lX3NlcSAqc2VxID0gbmFtZXRibF9maW5kX3NlcSh0eXBlKTsKKworCWlmICghc2VxKQorCQlyZXR1cm4gMDsKKworCWRiZygiV2l0aGRyYXdpbmcgPCV1LCV1PiBmcm9tICV4XG4iLCB0eXBlLCBsb3dlciwgbm9kZSk7CisJcHVibCA9IG5hbWVzZXFfcmVtb3ZlX3B1Ymwoc2VxLCBsb3dlciwgbm9kZSwgcmVmLCBrZXkpOworCisJaWYgKCFzZXEtPmZpcnN0X2ZyZWUgJiYgbGlzdF9lbXB0eSgmc2VxLT5zdWJzY3JpcHRpb25zKSkgeworCQlobGlzdF9kZWxfaW5pdCgmc2VxLT5uc19saXN0KTsKKwkJa2ZyZWUoc2VxLT5zc2Vxcyk7CisJCWtmcmVlKHNlcSk7CisJfQorCXJldHVybiBwdWJsOworfQorCisvKgorICogbmFtZXRibF90cmFuc2xhdGUoKTogVHJhbnNsYXRlIHRpcGNfbmFtZSAtPiB0aXBjX3BvcnRpZC4KKyAqICAgICAgICAgICAgICAgICAgICAgIFZlcnkgdGltZS1jcml0aWNhbC4KKyAqCisgKiBOb3RlOiBvbiBlbnRyeSAnZGVzdG5vZGUnIGlzIHRoZSBzZWFyY2ggZG9tYWluIHVzZWQgZHVyaW5nIHRyYW5zbGF0aW9uOworICogICAgICAgb24gZXhpdCBpdCBwYXNzZXMgYmFjayB0aGUgbm9kZSBhZGRyZXNzIG9mIHRoZSBtYXRjaGluZyBwb3J0IChpZiBhbnkpCisgKi8KKwordTMyIG5hbWV0YmxfdHJhbnNsYXRlKHUzMiB0eXBlLCB1MzIgaW5zdGFuY2UsIHUzMiAqZGVzdG5vZGUpCit7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXE7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsID0gMDsKKwlzdHJ1Y3QgbmFtZV9zZXEgKnNlcTsKKwl1MzIgcmVmOworCisJaWYgKCFpbl9zY29wZSgqZGVzdG5vZGUsIHRpcGNfb3duX2FkZHIpKQorCQlyZXR1cm4gMDsKKworCXJlYWRfbG9ja19iaCgmbmFtZXRibF9sb2NrKTsKKwlzZXEgPSBuYW1ldGJsX2ZpbmRfc2VxKHR5cGUpOworCWlmICh1bmxpa2VseSghc2VxKSkKKwkJZ290byBub3RfZm91bmQ7CisJc3NlcSA9IG5hbWVzZXFfZmluZF9zdWJzZXEoc2VxLCBpbnN0YW5jZSk7CisJaWYgKHVubGlrZWx5KCFzc2VxKSkKKwkJZ290byBub3RfZm91bmQ7CisJc3Bpbl9sb2NrX2JoKCZzZXEtPmxvY2spOworCisJLyogQ2xvc2VzdC1GaXJzdCBBbGdvcml0aG06ICovCisJaWYgKGxpa2VseSghKmRlc3Rub2RlKSkgeworCQlwdWJsID0gc3NlcS0+bm9kZV9saXN0OworCQlpZiAocHVibCkgeworCQkJc3NlcS0+bm9kZV9saXN0ID0gcHVibC0+bm9kZV9saXN0X25leHQ7Citmb3VuZDoKKwkJCXJlZiA9IHB1YmwtPnJlZjsKKwkJCSpkZXN0bm9kZSA9IHB1YmwtPm5vZGU7CisJCQlzcGluX3VubG9ja19iaCgmc2VxLT5sb2NrKTsKKwkJCXJlYWRfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCQkJcmV0dXJuIHJlZjsKKwkJfQorCQlwdWJsID0gc3NlcS0+Y2x1c3Rlcl9saXN0OworCQlpZiAocHVibCkgeworCQkJc3NlcS0+Y2x1c3Rlcl9saXN0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7CisJCQlnb3RvIGZvdW5kOworCQl9CisJCXB1YmwgPSBzc2VxLT56b25lX2xpc3Q7CisJCWlmIChwdWJsKSB7CisJCQlzc2VxLT56b25lX2xpc3QgPSBwdWJsLT56b25lX2xpc3RfbmV4dDsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwkvKiBSb3VuZC1Sb2JpbiBBbGdvcml0aG06ICovCisJZWxzZSBpZiAoKmRlc3Rub2RlID09IHRpcGNfb3duX2FkZHIpIHsKKwkJcHVibCA9IHNzZXEtPm5vZGVfbGlzdDsKKwkJaWYgKHB1YmwpIHsKKwkJCXNzZXEtPm5vZGVfbGlzdCA9IHB1YmwtPm5vZGVfbGlzdF9uZXh0OworCQkJZ290byBmb3VuZDsKKwkJfQorCX0gZWxzZSBpZiAoaW5fb3duX2NsdXN0ZXIoKmRlc3Rub2RlKSkgeworCQlwdWJsID0gc3NlcS0+Y2x1c3Rlcl9saXN0OworCQlpZiAocHVibCkgeworCQkJc3NlcS0+Y2x1c3Rlcl9saXN0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfSBlbHNlIHsKKwkJcHVibCA9IHNzZXEtPnpvbmVfbGlzdDsKKwkJaWYgKHB1YmwpIHsKKwkJCXNzZXEtPnpvbmVfbGlzdCA9IHB1YmwtPnpvbmVfbGlzdF9uZXh0OworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmc2VxLT5sb2NrKTsKK25vdF9mb3VuZDoKKwkqZGVzdG5vZGUgPSAwOworCXJlYWRfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCXJldHVybiAwOworfQorCisvKioKKyAqIG5hbWV0YmxfbWNfdHJhbnNsYXRlIC0gZmluZCBtdWx0aWNhc3QgZGVzdGluYXRpb25zCisgKiAKKyAqIENyZWF0ZXMgbGlzdCBvZiBhbGwgbG9jYWwgcG9ydHMgdGhhdCBvdmVybGFwIHRoZSBnaXZlbiBtdWx0aWNhc3QgYWRkcmVzczsKKyAqIGFsc28gZGV0ZXJtaW5lcyBpZiBhbnkgb2ZmLW5vZGUgcG9ydHMgb3ZlcmxhcC4KKyAqCisgKiBOb3RlOiBQdWJsaWNhdGlvbnMgd2l0aCBhIHNjb3BlIG5hcnJvd2VyIHRoYW4gJ2xpbWl0JyBhcmUgaWdub3JlZC4KKyAqIChpLmUuIGxvY2FsIG5vZGUtc2NvcGUgcHVibGljYXRpb25zIG11c3RuJ3QgcmVjZWl2ZSBtZXNzYWdlcyBhcnJpdmluZworICogZnJvbSBhbm90aGVyIG5vZGUsIGV2ZW4gaWYgdGhlIG11bHRjYXN0IGxpbmsgYnJvdWdodCBpdCBoZXJlKQorICogCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGFueSBvZmYtbm9kZSBwb3J0cyBvdmVybGFwCisgKi8KKworaW50IG5hbWV0YmxfbWNfdHJhbnNsYXRlKHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwgdTMyIGxpbWl0LAorCQkJIHN0cnVjdCBwb3J0X2xpc3QgKmRwb3J0cykKK3sKKwlzdHJ1Y3QgbmFtZV9zZXEgKnNlcTsKKwlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcTsKKwlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcV9zdG9wOworCWludCByZXMgPSAwOworCisJcmVhZF9sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCXNlcSA9IG5hbWV0YmxfZmluZF9zZXEodHlwZSk7CisJaWYgKCFzZXEpCisJCWdvdG8gZXhpdDsKKworCXNwaW5fbG9ja19iaCgmc2VxLT5sb2NrKTsKKworCXNzZXEgPSBzZXEtPnNzZXFzICsgbmFtZXNlcV9sb2NhdGVfc3Vic2VxKHNlcSwgbG93ZXIpOworCXNzZXFfc3RvcCA9IHNlcS0+c3NlcXMgKyBzZXEtPmZpcnN0X2ZyZWU7CisJZm9yICg7IHNzZXEgIT0gc3NlcV9zdG9wOyBzc2VxKyspIHsKKwkJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCisJCWlmIChzc2VxLT5sb3dlciA+IHVwcGVyKQorCQkJYnJlYWs7CisJCXB1YmwgPSBzc2VxLT5jbHVzdGVyX2xpc3Q7CisJCWlmIChwdWJsICYmIChwdWJsLT5zY29wZSA8PSBsaW1pdCkpCisJCQlkbyB7CisJCQkJaWYgKHB1YmwtPm5vZGUgPT0gdGlwY19vd25fYWRkcikKKwkJCQkJcG9ydF9saXN0X2FkZChkcG9ydHMsIHB1YmwtPnJlZik7CisJCQkJZWxzZQorCQkJCQlyZXMgPSAxOworCQkJCXB1YmwgPSBwdWJsLT5jbHVzdGVyX2xpc3RfbmV4dDsKKwkJCX0gd2hpbGUgKHB1YmwgIT0gc3NlcS0+Y2x1c3Rlcl9saXN0KTsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmc2VxLT5sb2NrKTsKK2V4aXQ6CisJcmVhZF91bmxvY2tfYmgoJm5hbWV0YmxfbG9jayk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBuYW1ldGJsX3B1Ymxpc2hfcnN2IC0gcHVibGlzaCBwb3J0IG5hbWUgdXNpbmcgYSByZXNlcnZlZCBuYW1lIHR5cGUKKyAqLworCitpbnQgbmFtZXRibF9wdWJsaXNoX3Jzdih1MzIgcmVmLCB1bnNpZ25lZCBpbnQgc2NvcGUsIAorCQkJc3RydWN0IHRpcGNfbmFtZV9zZXEgY29uc3QgKnNlcSkKK3sKKwlpbnQgcmVzOworCisJYXRvbWljX2luYygmcnN2X3B1Ymxfb2spOworCXJlcyA9IHRpcGNfcHVibGlzaChyZWYsIHNjb3BlLCBzZXEpOworCWF0b21pY19kZWMoJnJzdl9wdWJsX29rKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIG5hbWV0YmxfcHVibGlzaCAtIGFkZCBuYW1lIHB1YmxpY2F0aW9uIHRvIG5ldHdvcmsgbmFtZSB0YWJsZXMKKyAqLworCitzdHJ1Y3QgcHVibGljYXRpb24gKm5hbWV0YmxfcHVibGlzaCh1MzIgdHlwZSwgdTMyIGxvd2VyLCB1MzIgdXBwZXIsIAorCQkJCSAgICB1MzIgc2NvcGUsIHUzMiBwb3J0X3JlZiwgdTMyIGtleSkKK3sKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1Ymw7CisKKwlpZiAodGFibGUubG9jYWxfcHVibF9jb3VudCA+PSB0aXBjX21heF9wdWJsaWNhdGlvbnMpIHsKKwkJd2FybigiRmFpbGVkIHB1Ymxpc2g6IG1heCAldSBsb2NhbCBwdWJsaWNhdGlvblxuIiwgCisJCSAgICAgdGlwY19tYXhfcHVibGljYXRpb25zKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICgodHlwZSA8IFRJUENfUkVTRVJWRURfVFlQRVMpICYmICFhdG9taWNfcmVhZCgmcnN2X3B1Ymxfb2spKSB7CisJCXdhcm4oIkZhaWxlZCB0byBwdWJsaXNoIHJlc2VydmVkIG5hbWUgPCV1LCV1LCV1PlxuIiwKKwkJICAgICB0eXBlLCBsb3dlciwgdXBwZXIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCXRhYmxlLmxvY2FsX3B1YmxfY291bnQrKzsKKwlwdWJsID0gbmFtZXRibF9pbnNlcnRfcHVibCh0eXBlLCBsb3dlciwgdXBwZXIsIHNjb3BlLAorCQkJCSAgIHRpcGNfb3duX2FkZHIsIHBvcnRfcmVmLCBrZXkpOworCWlmIChwdWJsICYmIChzY29wZSAhPSBUSVBDX05PREVfU0NPUEUpKSB7CisJCW5hbWVkX3B1Ymxpc2gocHVibCk7CisJfQorCXdyaXRlX3VubG9ja19iaCgmbmFtZXRibF9sb2NrKTsKKwlyZXR1cm4gcHVibDsKK30KKworLyoqCisgKiBuYW1ldGJsX3dpdGhkcmF3IC0gd2l0aGRyYXcgbmFtZSBwdWJsaWNhdGlvbiBmcm9tIG5ldHdvcmsgbmFtZSB0YWJsZXMKKyAqLworCitpbnQgbmFtZXRibF93aXRoZHJhdyh1MzIgdHlwZSwgdTMyIGxvd2VyLCB1MzIgcmVmLCB1MzIga2V5KQoreworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKworCWRiZygibmFtZXRibF93aXRoZHJhdzo8JWQsJWQsJWQ+XG4iLCB0eXBlLCBsb3dlciwga2V5KTsKKwl3cml0ZV9sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCXB1YmwgPSBuYW1ldGJsX3JlbW92ZV9wdWJsKHR5cGUsIGxvd2VyLCB0aXBjX293bl9hZGRyLCByZWYsIGtleSk7CisJaWYgKHB1YmwpIHsKKwkJdGFibGUubG9jYWxfcHVibF9jb3VudC0tOworCQlpZiAocHVibC0+c2NvcGUgIT0gVElQQ19OT0RFX1NDT1BFKQorCQkJbmFtZWRfd2l0aGRyYXcocHVibCk7CisJCXdyaXRlX3VubG9ja19iaCgmbmFtZXRibF9sb2NrKTsKKwkJbGlzdF9kZWxfaW5pdCgmcHVibC0+cHBvcnRfbGlzdCk7CisJCWtmcmVlKHB1YmwpOworCQlyZXR1cm4gMTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCXJldHVybiAwOworfQorCisvKioKKyAqIG5hbWV0Ymxfc3Vic2NyaWJlIC0gYWRkIGEgc3Vic2NyaXB0aW9uIG9iamVjdCB0byB0aGUgbmFtZSB0YWJsZQorICovCisKK3ZvaWQKK25hbWV0Ymxfc3Vic2NyaWJlKHN0cnVjdCBzdWJzY3JpcHRpb24gKnMpCit7CisJdTMyIHR5cGUgPSBzLT5zZXEudHlwZTsKKwlzdHJ1Y3QgbmFtZV9zZXEgKnNlcTsKKworICAgICAgICB3cml0ZV9sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCXNlcSA9IG5hbWV0YmxfZmluZF9zZXEodHlwZSk7CisJaWYgKCFzZXEpIHsKKwkJc2VxID0gbmFtZXNlcV9jcmVhdGUodHlwZSwgJnRhYmxlLnR5cGVzW2hhc2godHlwZSldKTsKKwl9CisgICAgICAgIGlmIChzZXEpeworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19iaCgmc2VxLT5sb2NrKTsKKyAgICAgICAgICAgICAgICBkYmcoIm5hbWV0Ymxfc3Vic2NyaWJlOmZvdW5kICV4IGZvciA8JXUsJXUsJXU+XG4iLAorICAgICAgICAgICAgICAgICAgICBzZXEsIHR5cGUsIHMtPnNlcS5sb3dlciwgcy0+c2VxLnVwcGVyKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoc2VxLT50eXBlID09IHR5cGUpOworICAgICAgICAgICAgICAgIG5hbWVzZXFfc3Vic2NyaWJlKHNlcSwgcyk7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfYmgoJnNlcS0+bG9jayk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworfQorCisvKioKKyAqIG5hbWV0YmxfdW5zdWJzY3JpYmUgLSByZW1vdmUgYSBzdWJzY3JpcHRpb24gb2JqZWN0IGZyb20gbmFtZSB0YWJsZQorICovCisKK3ZvaWQKK25hbWV0YmxfdW5zdWJzY3JpYmUoc3RydWN0IHN1YnNjcmlwdGlvbiAqcykKK3sKKwlzdHJ1Y3QgbmFtZV9zZXEgKnNlcTsKKworICAgICAgICB3cml0ZV9sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworICAgICAgICBzZXEgPSBuYW1ldGJsX2ZpbmRfc2VxKHMtPnNlcS50eXBlKTsKKwlpZiAoc2VxICE9IE5VTEwpeworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19iaCgmc2VxLT5sb2NrKTsKKyAgICAgICAgICAgICAgICBsaXN0X2RlbF9pbml0KCZzLT5uYW1lc2VxX2xpc3QpOworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2JoKCZzZXEtPmxvY2spOworICAgICAgICAgICAgICAgIGlmICgoc2VxLT5maXJzdF9mcmVlID09IDApICYmIGxpc3RfZW1wdHkoJnNlcS0+c3Vic2NyaXB0aW9ucykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhsaXN0X2RlbF9pbml0KCZzZXEtPm5zX2xpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUoc2VxLT5zc2Vxcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShzZXEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3cml0ZV91bmxvY2tfYmgoJm5hbWV0YmxfbG9jayk7Cit9CisKKworLyoqCisgKiBzdWJzZXFfbGlzdDogcHJpbnQgc3BlY2lmaWVkIHN1Yi1zZXF1ZW5jZSBjb250ZW50cyBpbnRvIHRoZSBnaXZlbiBidWZmZXIKKyAqLworCitzdGF0aWMgdm9pZCBzdWJzZXFfbGlzdChzdHJ1Y3Qgc3ViX3NlcSAqc3NlcSwgc3RydWN0IHByaW50X2J1ZiAqYnVmLCB1MzIgZGVwdGgsCisJCQl1MzIgaW5kZXgpCit7CisJY2hhciBwb3J0SWRTdHJbMjddOworCWNoYXIgKnNjb3BlU3RyOworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibCA9IHNzZXEtPnpvbmVfbGlzdDsKKworCXRpcGNfcHJpbnRmKGJ1ZiwgIiUtMTB1ICUtMTB1ICIsIHNzZXEtPmxvd2VyLCBzc2VxLT51cHBlcik7CisKKwlpZiAoZGVwdGggPT0gMiB8fCAhcHVibCkgeworCQl0aXBjX3ByaW50ZihidWYsICJcbiIpOworCQlyZXR1cm47CisJfQorCisJZG8geworCQlzcHJpbnRmIChwb3J0SWRTdHIsICI8JXUuJXUuJXU6JXU+IiwKKwkJCSB0aXBjX3pvbmUocHVibC0+bm9kZSksIHRpcGNfY2x1c3RlcihwdWJsLT5ub2RlKSwKKwkJCSB0aXBjX25vZGUocHVibC0+bm9kZSksIHB1YmwtPnJlZik7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIiUtMjZzICIsIHBvcnRJZFN0cik7CisJCWlmIChkZXB0aCA+IDMpIHsKKwkJCWlmIChwdWJsLT5ub2RlICE9IHRpcGNfb3duX2FkZHIpCisJCQkJc2NvcGVTdHIgPSAiIjsKKwkJCWVsc2UgaWYgKHB1YmwtPnNjb3BlID09IFRJUENfTk9ERV9TQ09QRSkKKwkJCQlzY29wZVN0ciA9ICJub2RlIjsKKwkJCWVsc2UgaWYgKHB1YmwtPnNjb3BlID09IFRJUENfQ0xVU1RFUl9TQ09QRSkKKwkJCQlzY29wZVN0ciA9ICJjbHVzdGVyIjsKKwkJCWVsc2UKKwkJCQlzY29wZVN0ciA9ICJ6b25lIjsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIiUtMTB1ICVzIiwgcHVibC0+a2V5LCBzY29wZVN0cik7CisJCX0KKworCQlwdWJsID0gcHVibC0+em9uZV9saXN0X25leHQ7CisJCWlmIChwdWJsID09IHNzZXEtPnpvbmVfbGlzdCkKKwkJCWJyZWFrOworCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuJTMzcyIsICIgIik7CisJfSB3aGlsZSAoMSk7CisKKwl0aXBjX3ByaW50ZihidWYsICJcbiIpOworfQorCisvKioKKyAqIG5hbWVzZXFfbGlzdDogcHJpbnQgc3BlY2lmaWVkIG5hbWUgc2VxdWVuY2UgY29udGVudHMgaW50byB0aGUgZ2l2ZW4gYnVmZmVyCisgKi8KKworc3RhdGljIHZvaWQgbmFtZXNlcV9saXN0KHN0cnVjdCBuYW1lX3NlcSAqc2VxLCBzdHJ1Y3QgcHJpbnRfYnVmICpidWYsIHUzMiBkZXB0aCwKKwkJCSB1MzIgdHlwZSwgdTMyIGxvd2JvdW5kLCB1MzIgdXBib3VuZCwgdTMyIGluZGV4KQoreworCXN0cnVjdCBzdWJfc2VxICpzc2VxOworCWNoYXIgdHlwZWFyZWFbMTFdOworCisJc3ByaW50Zih0eXBlYXJlYSwgIiUtMTB1Iiwgc2VxLT50eXBlKTsKKworCWlmIChkZXB0aCA9PSAxKSB7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIiVzXG4iLCB0eXBlYXJlYSk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKHNzZXEgPSBzZXEtPnNzZXFzOyBzc2VxICE9ICZzZXEtPnNzZXFzW3NlcS0+Zmlyc3RfZnJlZV07IHNzZXErKykgeworCQlpZiAoKGxvd2JvdW5kIDw9IHNzZXEtPnVwcGVyKSAmJiAodXBib3VuZCA+PSBzc2VxLT5sb3dlcikpIHsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIiVzICIsIHR5cGVhcmVhKTsKKwkJCXN1YnNlcV9saXN0KHNzZXEsIGJ1ZiwgZGVwdGgsIGluZGV4KTsKKwkJCXNwcmludGYodHlwZWFyZWEsICIlMTBzIiwgIiAiKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBuYW1ldGJsX2hlYWRlciAtIHByaW50IG5hbWUgdGFibGUgaGVhZGVyIGludG8gdGhlIGdpdmVuIGJ1ZmZlcgorICovCisKK3N0YXRpYyB2b2lkIG5hbWV0YmxfaGVhZGVyKHN0cnVjdCBwcmludF9idWYgKmJ1ZiwgdTMyIGRlcHRoKQoreworCXRpcGNfcHJpbnRmKGJ1ZiwgIlR5cGUgICAgICAgIik7CisKKwlpZiAoZGVwdGggPiAxKQorCQl0aXBjX3ByaW50ZihidWYsICJMb3dlciAgICAgIFVwcGVyICAgICAgIik7CisJaWYgKGRlcHRoID4gMikKKwkJdGlwY19wcmludGYoYnVmLCAiUG9ydCBJZGVudGl0eSAgICAgICAgICAgICAgIik7CisJaWYgKGRlcHRoID4gMykKKwkJdGlwY19wcmludGYoYnVmLCAiUHVibGljYXRpb24iKTsKKworCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuLS0tLS0tLS0tLS0iKTsKKworCWlmIChkZXB0aCA+IDEpCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAiKTsKKwlpZiAoZGVwdGggPiAyKQorCQl0aXBjX3ByaW50ZihidWYsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAiKTsKKwlpZiAoZGVwdGggPiAzKQorCQl0aXBjX3ByaW50ZihidWYsICItLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuIik7Cit9CisKKy8qKgorICogbmFtZXRibF9saXN0IC0gcHJpbnQgc3BlY2lmaWVkIG5hbWUgdGFibGUgY29udGVudHMgaW50byB0aGUgZ2l2ZW4gYnVmZmVyCisgKi8KKworc3RhdGljIHZvaWQgbmFtZXRibF9saXN0KHN0cnVjdCBwcmludF9idWYgKmJ1ZiwgdTMyIGRlcHRoX2luZm8sIAorCQkJIHUzMiB0eXBlLCB1MzIgbG93Ym91bmQsIHUzMiB1cGJvdW5kKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpzZXFfaGVhZDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqc2VxX25vZGU7CisJc3RydWN0IG5hbWVfc2VxICpzZXE7CisJaW50IGFsbF90eXBlczsKKwl1MzIgZGVwdGg7CisJdTMyIGk7CisKKwlhbGxfdHlwZXMgPSAoZGVwdGhfaW5mbyAmIFRJUENfTlRRX0FMTFRZUEVTKTsKKwlkZXB0aCA9IChkZXB0aF9pbmZvICYgflRJUENfTlRRX0FMTFRZUEVTKTsKKworCWlmIChkZXB0aCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoYWxsX3R5cGVzKSB7CisJCS8qIGRpc3BsYXkgYWxsIGVudHJpZXMgaW4gbmFtZSB0YWJsZSB0byBzcGVjaWZpZWQgZGVwdGggKi8KKwkJbmFtZXRibF9oZWFkZXIoYnVmLCBkZXB0aCk7CisJCWxvd2JvdW5kID0gMDsKKwkJdXBib3VuZCA9IH4wOworCQlmb3IgKGkgPSAwOyBpIDwgdGlwY19uYW1ldGJsX3NpemU7IGkrKykgeworCQkJc2VxX2hlYWQgPSAmdGFibGUudHlwZXNbaV07CisJCQlobGlzdF9mb3JfZWFjaF9lbnRyeShzZXEsIHNlcV9ub2RlLCBzZXFfaGVhZCwgbnNfbGlzdCkgeworCQkJCW5hbWVzZXFfbGlzdChzZXEsIGJ1ZiwgZGVwdGgsIHNlcS0+dHlwZSwgCisJCQkJCSAgICAgbG93Ym91bmQsIHVwYm91bmQsIGkpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogZGlzcGxheSBvbmx5IHRoZSBzZXF1ZW5jZSB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCB0eXBlICovCisJCWlmICh1cGJvdW5kIDwgbG93Ym91bmQpIHsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgImludmFsaWQgbmFtZSBzZXF1ZW5jZSBzcGVjaWZpZWRcbiIpOworCQkJcmV0dXJuOworCQl9CisJCW5hbWV0YmxfaGVhZGVyKGJ1ZiwgZGVwdGgpOworCQlpID0gaGFzaCh0eXBlKTsKKwkJc2VxX2hlYWQgPSAmdGFibGUudHlwZXNbaV07CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlcSwgc2VxX25vZGUsIHNlcV9oZWFkLCBuc19saXN0KSB7CisJCQlpZiAoc2VxLT50eXBlID09IHR5cGUpIHsKKwkJCQluYW1lc2VxX2xpc3Qoc2VxLCBidWYsIGRlcHRoLCB0eXBlLCAKKwkJCQkJICAgICBsb3dib3VuZCwgdXBib3VuZCwgaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgbmFtZXRibF9wcmludChzdHJ1Y3QgcHJpbnRfYnVmICpidWYsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl0aXBjX3ByaW50ZihidWYsIHN0cik7CisJcmVhZF9sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCW5hbWV0YmxfbGlzdChidWYsIDAsIDAsIDAsIDApOworCXJlYWRfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworfQorCisjZGVmaW5lIE1BWF9OQU1FX1RCTF9RVUVSWSAzMjc2OAorCitzdHJ1Y3Qgc2tfYnVmZiAqbmFtZXRibF9nZXQoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCB0aXBjX25hbWVfdGFibGVfcXVlcnkgKmFyZ3Y7CisJc3RydWN0IHRsdl9kZXNjICpyZXBfdGx2OworCXN0cnVjdCBwcmludF9idWYgYjsKKwlpbnQgc3RyX2xlbjsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfTkFNRV9UQkxfUVVFUlkpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJYnVmID0gY2ZnX3JlcGx5X2FsbG9jKFRMVl9TUEFDRShNQVhfTkFNRV9UQkxfUVVFUlkpKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXBfdGx2ID0gKHN0cnVjdCB0bHZfZGVzYyAqKWJ1Zi0+ZGF0YTsKKwlwcmludGJ1Zl9pbml0KCZiLCBUTFZfREFUQShyZXBfdGx2KSwgTUFYX05BTUVfVEJMX1FVRVJZKTsKKwlhcmd2ID0gKHN0cnVjdCB0aXBjX25hbWVfdGFibGVfcXVlcnkgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOworCXJlYWRfbG9ja19iaCgmbmFtZXRibF9sb2NrKTsKKwluYW1ldGJsX2xpc3QoJmIsIG50b2hsKGFyZ3YtPmRlcHRoKSwgbnRvaGwoYXJndi0+dHlwZSksIAorCQkgICAgIG50b2hsKGFyZ3YtPmxvd2JvdW5kKSwgbnRvaGwoYXJndi0+dXBib3VuZCkpOworCXJlYWRfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCXN0cl9sZW4gPSBwcmludGJ1Zl92YWxpZGF0ZSgmYik7CisKKwlza2JfcHV0KGJ1ZiwgVExWX1NQQUNFKHN0cl9sZW4pKTsKKwlUTFZfU0VUKHJlcF90bHYsIFRJUENfVExWX1VMVFJBX1NUUklORywgTlVMTCwgc3RyX2xlbik7CisKKwlyZXR1cm4gYnVmOworfQorCit2b2lkIG5hbWV0YmxfZHVtcCh2b2lkKQoreworCW5hbWV0YmxfbGlzdChDT05TLCAwLCAwLCAwLCAwKTsKK30KKworaW50IG5hbWV0YmxfaW5pdCh2b2lkKQoreworCWludCBhcnJheV9zaXplID0gc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSAqIHRpcGNfbmFtZXRibF9zaXplOworCisJdGFibGUudHlwZXMgPSAoc3RydWN0IGhsaXN0X2hlYWQgKilrbWFsbG9jKGFycmF5X3NpemUsIEdGUF9BVE9NSUMpOworCWlmICghdGFibGUudHlwZXMpCisJCXJldHVybiAtRU5PTUVNOworCisJd3JpdGVfbG9ja19iaCgmbmFtZXRibF9sb2NrKTsKKwltZW1zZXQodGFibGUudHlwZXMsIDAsIGFycmF5X3NpemUpOworCXRhYmxlLmxvY2FsX3B1YmxfY291bnQgPSAwOworCXdyaXRlX3VubG9ja19iaCgmbmFtZXRibF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuYW1ldGJsX3N0b3Aodm9pZCkKK3sKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqc2VxX2hlYWQ7CisJc3RydWN0IGhsaXN0X25vZGUgKnNlcV9ub2RlOworCXN0cnVjdCBobGlzdF9ub2RlICp0bXA7CisJc3RydWN0IG5hbWVfc2VxICpzZXE7CisJdTMyIGk7CisKKwlpZiAoIXRhYmxlLnR5cGVzKQorCQlyZXR1cm47CisKKwl3cml0ZV9sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCB0aXBjX25hbWV0Ymxfc2l6ZTsgaSsrKSB7CisJCXNlcV9oZWFkID0gJnRhYmxlLnR5cGVzW2ldOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlcSwgc2VxX25vZGUsIHRtcCwgc2VxX2hlYWQsIG5zX2xpc3QpIHsKKwkJCXN0cnVjdCBzdWJfc2VxICpzc2VxID0gc2VxLT5zc2VxczsKKworCQkJZm9yICg7IHNzZXEgIT0gJnNlcS0+c3NlcXNbc2VxLT5maXJzdF9mcmVlXTsgc3NlcSsrKSB7CisJCQkJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsID0gc3NlcS0+em9uZV9saXN0OworCQkJCWFzc2VydChwdWJsKTsKKwkJCQlkbyB7CisJCQkJCXN0cnVjdCBwdWJsaWNhdGlvbiAqbmV4dCA9CisJCQkJCQlwdWJsLT56b25lX2xpc3RfbmV4dDsKKwkJCQkJa2ZyZWUocHVibCk7CisJCQkJCXB1YmwgPSBuZXh0OworCQkJCX0KKwkJCQl3aGlsZSAocHVibCAhPSBzc2VxLT56b25lX2xpc3QpOworCQkJfQorCQl9CisJfQorCWtmcmVlKHRhYmxlLnR5cGVzKTsKKwl0YWJsZS50eXBlcyA9IE5VTEw7CisJd3JpdGVfdW5sb2NrX2JoKCZuYW1ldGJsX2xvY2spOworfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbmFtZV90YWJsZS5oIGIvbmV0L3RpcGMvbmFtZV90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjY5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9uYW1lX3RhYmxlLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBuZXQvdGlwYy9uYW1lX3RhYmxlLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBuYW1lIHRhYmxlIGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX05BTUVfVEFCTEVfSAorI2RlZmluZSBfVElQQ19OQU1FX1RBQkxFX0gKKworI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisKK3N0cnVjdCBzdWJzY3JpcHRpb247CitzdHJ1Y3QgcG9ydF9saXN0OworCisvKgorICogVElQQyBuYW1lIHR5cGVzIHJlc2VydmVkIGZvciBpbnRlcm5hbCBUSVBDIHVzZSAoYm90aCBjdXJyZW50IGFuZCBwbGFubmVkKQorICovCisKKyNkZWZpbmUgVElQQ19aTV9TUlYgMyAgCQkvKiB6b25lIG1hc3RlciBzZXJ2aWNlIG5hbWUgdHlwZSAqLworCisKKy8qKgorICogc3RydWN0IHB1YmxpY2F0aW9uIC0gaW5mbyBhYm91dCBhIHB1Ymxpc2hlZCAobmFtZSBvcikgbmFtZSBzZXF1ZW5jZQorICogQHR5cGU6IG5hbWUgc2VxdWVuY2UgdHlwZQorICogQGxvd2VyOiBuYW1lIHNlcXVlbmNlIGxvd2VyIGJvdW5kCisgKiBAdXBwZXI6IG5hbWUgc2VxdWVuY2UgdXBwZXIgYm91bmQKKyAqIEBzY29wZTogc2NvcGUgb2YgcHVibGljYXRpb24KKyAqIEBub2RlOiBuZXR3b3JrIGFkZHJlc3Mgb2YgcHVibGlzaGluZyBwb3J0J3Mgbm9kZQorICogQHJlZjogcHVibGlzaGluZyBwb3J0CisgKiBAa2V5OiBwdWJsaWNhdGlvbiBrZXkKKyAqIEBzdWJzY3I6IHN1YnNjcmlwdGlvbiB0byAibm9kZSBkb3duIiBldmVudCAoZm9yIG9mZi1ub2RlIHB1YmxpY2F0aW9ucyBvbmx5KQorICogQGxvY2FsX2xpc3Q6IGFkamFjZW50IGVudHJpZXMgaW4gbGlzdCBvZiBwdWJsaWNhdGlvbnMgbWFkZSBieSB0aGlzIG5vZGUKKyAqIEBwcG9ydF9saXN0OiBhZGphY2VudCBlbnRyaWVzIGluIGxpc3Qgb2YgcHVibGljYXRpb25zIG1hZGUgYnkgdGhpcyBwb3J0CisgKiBAbm9kZV9saXN0OiBuZXh0IG1hdGNoaW5nIG5hbWUgc2VxIHB1YmxpY2F0aW9uIHdpdGggPj0gbm9kZSBzY29wZQorICogQGNsdXN0ZXJfbGlzdDogbmV4dCBtYXRjaGluZyBuYW1lIHNlcSBwdWJsaWNhdGlvbiB3aXRoID49IGNsdXN0ZXIgc2NvcGUKKyAqIEB6b25lX2xpc3Q6IG5leHQgbWF0Y2hpbmcgbmFtZSBzZXEgcHVibGljYXRpb24gd2l0aCA+PSB6b25lIHNjb3BlCisgKiAKKyAqIE5vdGUgdGhhdCB0aGUgbm9kZSBsaXN0LCBjbHVzdGVyIGxpc3QsIGFuZCB6b25lIGxpc3QgYXJlIGNpcmN1bGFyIGxpc3RzLgorICovCisKK3N0cnVjdCBwdWJsaWNhdGlvbiB7CisJdTMyIHR5cGU7CisJdTMyIGxvd2VyOworCXUzMiB1cHBlcjsKKwl1MzIgc2NvcGU7CisJdTMyIG5vZGU7CisJdTMyIHJlZjsKKwl1MzIga2V5OworCXN0cnVjdCBub2RlX3N1YnNjciBzdWJzY3I7CisJc3RydWN0IGxpc3RfaGVhZCBsb2NhbF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgcHBvcnRfbGlzdDsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKm5vZGVfbGlzdF9uZXh0OworCXN0cnVjdCBwdWJsaWNhdGlvbiAqY2x1c3Rlcl9saXN0X25leHQ7CisJc3RydWN0IHB1YmxpY2F0aW9uICp6b25lX2xpc3RfbmV4dDsKK307CisKKworZXh0ZXJuIHJ3bG9ja190IG5hbWV0YmxfbG9jazsKKworc3RydWN0IHNrX2J1ZmYgKm5hbWV0YmxfZ2V0KGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpOwordTMyIG5hbWV0YmxfdHJhbnNsYXRlKHUzMiB0eXBlLCB1MzIgaW5zdGFuY2UsIHUzMiAqbm9kZSk7CitpbnQgbmFtZXRibF9tY190cmFuc2xhdGUodTMyIHR5cGUsIHUzMiBsb3dlciwgdTMyIHVwcGVyLCB1MzIgbGltaXQsIAorCQkJIHN0cnVjdCBwb3J0X2xpc3QgKmRwb3J0cyk7CitpbnQgbmFtZXRibF9wdWJsaXNoX3Jzdih1MzIgcmVmLCB1bnNpZ25lZCBpbnQgc2NvcGUsIAorCQkJc3RydWN0IHRpcGNfbmFtZV9zZXEgY29uc3QgKnNlcSk7CitzdHJ1Y3QgcHVibGljYXRpb24gKm5hbWV0YmxfcHVibGlzaCh1MzIgdHlwZSwgdTMyIGxvd2VyLCB1MzIgdXBwZXIsCisJCQkJICAgIHUzMiBzY29wZSwgdTMyIHBvcnRfcmVmLCB1MzIga2V5KTsKK2ludCBuYW1ldGJsX3dpdGhkcmF3KHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiByZWYsIHUzMiBrZXkpOworc3RydWN0IHB1YmxpY2F0aW9uICpuYW1ldGJsX2luc2VydF9wdWJsKHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwKKwkJCQkJdTMyIHNjb3BlLCB1MzIgbm9kZSwgdTMyIHJlZiwgdTMyIGtleSk7CitzdHJ1Y3QgcHVibGljYXRpb24gKm5hbWV0YmxfcmVtb3ZlX3B1YmwodTMyIHR5cGUsIHUzMiBsb3dlciwgCisJCQkJCXUzMiBub2RlLCB1MzIgcmVmLCB1MzIga2V5KTsKK3ZvaWQgbmFtZXRibF9zdWJzY3JpYmUoc3RydWN0IHN1YnNjcmlwdGlvbiAqcyk7Cit2b2lkIG5hbWV0YmxfdW5zdWJzY3JpYmUoc3RydWN0IHN1YnNjcmlwdGlvbiAqcyk7CitpbnQgbmFtZXRibF9pbml0KHZvaWQpOwordm9pZCBuYW1ldGJsX3N0b3Aodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbmV0LmMgYi9uZXQvdGlwYy9uZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODI2YjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbmV0LmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBuZXQvdGlwYy9uZXQuYzogVElQQyBuZXR3b3JrIHJvdXRpbmcgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorI2luY2x1ZGUgIm5ldC5oIgorI2luY2x1ZGUgInpvbmUuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAibmFtZV90YWJsZS5oIgorI2luY2x1ZGUgIm5hbWVfZGlzdHIuaCIKKyNpbmNsdWRlICJzdWJzY3IuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgImJjYXN0LmgiCisjaW5jbHVkZSAiZGlzY292ZXIuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworLyogCisgKiBUaGUgVElQQyBsb2NraW5nIHBvbGljeSBpcyBkZXNpZ25lZCB0byBlbnN1cmUgYSB2ZXJ5IGZpbmUgbG9ja2luZworICogZ3JhbnVsYXJpdHksIHBlcm1pdHRpbmcgY29tcGxldGUgcGFyYWxsZWwgYWNjZXNzIHRvIGluZGl2aWR1YWwKKyAqIHBvcnQgYW5kIG5vZGUvbGluayBpbnN0YW5jZXMuIFRoZSBjb2RlIGNvbnNpc3RzIG9mIHRocmVlIG1ham9yIAorICogbG9ja2luZyBkb21haW5zLCBlYWNoIHByb3RlY3RlZCB3aXRoIHRoZWlyIG93biBkaXNqdW5jdCBzZXQgb2YgbG9ja3MuCisgKgorICogMTogVGhlIHJvdXRpbmcgaGllcmFyY2h5LgorICogICAgQ29tcHJpc2VzIHRoZSBzdHJ1Y3R1cmVzICd6b25lJywgJ2NsdXN0ZXInLCAnbm9kZScsICdsaW5rJyAKKyAqICAgIGFuZCAnYmVhcmVyJy4gVGhlIHdob2xlIGhpZXJhcmNoeSBpcyBwcm90ZWN0ZWQgYnkgYSBiaWcgCisgKiAgICByZWFkL3dyaXRlIGxvY2ssIG5ldF9sb2NrLCB0byBlbnNzdXJlIHRoYXQgbm90aGluZyBpcyBhZGRlZCAKKyAqICAgIG9yIHJlbW92ZWQgd2hpbGUgY29kZSBpcyBhY2Nlc3NpbmcgYW55IG9mIHRoZXNlIHN0cnVjdHVyZXMuIAorICogICAgVGhpcyBsYXllciBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgdHdvIG90aGVycyB3aGlsZSB0aGV5IAorICogICAgaG9sZCBhbnkgb2YgdGhlaXIgb3duIGxvY2tzLgorICogICAgTmVpdGhlciBtdXN0IGl0IGl0c2VsZiBkbyBhbnkgdXBjYWxscyB0byB0aGUgb3RoZXIgdHdvIGJlZm9yZQorICogICAgaXQgaGFzIHJlbGVhc2VkIG5ldF9sb2NrIGFuZCBvdGhlciBwcm90ZWN0aXZlIGxvY2tzLgorICoKKyAqICAgV2l0aGluIHRoZSBuZXRfbG9jayBkb21haW4gdGhlcmUgYXJlIHR3byBzdWItZG9tYWluczsnbm9kZScgYW5kIAorICogICAnYmVhcmVyJywgd2hlcmUgbG9jYWwgd3JpdGUgb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLAorICogICBwcm92aWRlZCB0aGF0IHRob3NlIGFyZSBwcm90ZWN0ZWQgYnkgaW5kaXZpZHVhbCBzcGluX2xvY2tzCisgKiAgIHBlciBpbnN0YW5jZS4gQ29kZSBob2xkaW5nIG5ldF9sb2NrKHJlYWQpIGFuZCBhIG5vZGUgc3Bpbl9sb2NrIAorICogICBpcyBwZXJtaXR0ZWQgdG8gcG9rZSBhcm91bmQgaW4gYm90aCB0aGUgbm9kZSBpdHNlbGYgYW5kIGl0cworICogICBzdWJvcmRpbmF0ZSBsaW5rcy4gSS5lLCBpdCBjYW4gdXBkYXRlIGxpbmsgY291bnRlcnMgYW5kIHF1ZXVlcywgCisgKiAgIGNoYW5nZSBsaW5rIHN0YXRlLCBzZW5kIHByb3RvY29sIG1lc3NhZ2VzLCBhbmQgYWx0ZXIgdGhlIAorICogICAiYWN0aXZlX2xpbmtzIiBhcnJheSBpbiB0aGUgbm9kZTsgYnV0IGl0IGNhbiBfbm90XyByZW1vdmUgYSBsaW5rIAorICogICBvciBhIG5vZGUgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUuCisgKiAgIENvcnJlc3BvbmRpbmdseSwgaW5kaXZpZHVhbCBiZWFyZXJzIG1heSBjaGFuZ2Ugc3RhdHVzIHdpdGhpbiBhIAorICogICBuZXRfbG9jayhyZWFkKSwgcHJvdGVjdGVkIGJ5IGFuIGluZGl2aWR1YWwgc3Bpbl9sb2NrIGJlciBiZWFyZXIgCisgKiAgIGluc3RhbmNlLCBidXQgaXQgbmVlZHMgbmV0X2xvY2sod3JpdGUpIHRvIHJlbW92ZS9hZGQgYW55IGJlYXJlcnMuCisgKiAgICAgCisgKgorICogIDI6IFRoZSB0cmFuc3BvcnQgbGV2ZWwgb2YgdGhlIHByb3RvY29sLiAKKyAqICAgICBUaGlzIGNvbnNpc3RzIG9mIHRoZSBzdHJ1Y3R1cmVzIHBvcnQsIChhbmQgaXRzIHVzZXIgbGV2ZWwgCisgKiAgICAgcmVwcmVzZW50YXRpb25zLCBzdWNoIGFzIHVzZXJfcG9ydCBhbmQgdGlwY19zb2NrKSwgcmVmZXJlbmNlIGFuZCAKKyAqICAgICB0aXBjX3VzZXIgKHBvcnQuYywgcmVnLmMsIHNvY2tldC5jKS4gCisgKgorICogICAgIFRoaXMgbGF5ZXIgaGFzIGZvdXIgZGlmZmVyZW50IGxvY2tzOgorICogICAgIC0gVGhlIHRpcGNfcG9ydCBzcGluX2xvY2suIFRoaXMgaXMgcHJvdGVjdGluZyBlYWNoIHBvcnQgaW5zdGFuY2UKKyAqICAgICAgIGZyb20gcGFyYWxsZWwgZGF0YSBhY2Nlc3MgYW5kIHJlbW92YWwuIFNpbmNlIHdlIGNhbiBub3QgcGxhY2UgCisgKiAgICAgICB0aGlzIGxvY2sgaW4gdGhlIHBvcnQgaXRzZWxmLCBpdCBoYXMgYmVlbiBwbGFjZWQgaW4gdGhlIAorICogICAgICAgY29ycmVzcG9uZGluZyByZWZlcmVuY2UgdGFibGUgZW50cnksIHdoaWNoIGhhcyB0aGUgc2FtZSBsaWZlCisgKiAgICAgICBjeWNsZSBhcyB0aGUgbW9kdWxlLiBUaGlzIGVudHJ5IGlzIGRpZmZpY3VsdCB0byBhY2Nlc3MgZnJvbSAKKyAqICAgICAgIG91dHNpZGUgdGhlIFRJUEMgY29yZSwgaG93ZXZlciwgc28gYSBwb2ludGVyIHRvIHRoZSBsb2NrIGhhcyAKKyAqICAgICAgIGJlZW4gYWRkZWQgaW4gdGhlIHBvcnQgaW5zdGFuY2UsIC10byBiZSB1c2VkIGZvciB1bmxvY2tpbmcgCisgKiAgICAgICBvbmx5LgorICogICAgIC0gQSByZWFkL3dyaXRlIGxvY2sgdG8gcHJvdGVjdCB0aGUgcmVmZXJlbmNlIHRhYmxlIGl0c2VsZiAodGVnLmMpLiAKKyAqICAgICAgIChOb2JvZHkgaXMgdXNpbmcgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGlzLCBzbyBpdCBjYW4ganVzdCBhcyAKKyAqICAgICAgIHdlbGwgYmUgY2hhbmdlZCB0byBhIHNwaW5fbG9jaykKKyAqICAgICAtIEEgc3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHJlZ2lzdHJ5IG9mIGtlcm5lbC9kcml2ZXIgdXNlcnMgKHJlZy5jKQorICogICAgIC0gQSBnbG9iYWwgc3Bpbl9sb2NrIChwb3J0X2xvY2spLCB3aGljaCBvbmx5IHRhc2sgaXMgdG8gZW5zdXJlIAorICogICAgICAgY29uc2lzdGVuY3kgd2hlcmUgbW9yZSB0aGFuIG9uZSBwb3J0IGlzIGludm9sdmVkIGluIGFuIG9wZXJhdGlvbiwKKyAqICAgICAgIGkuZS4sIHdoZSBhIHBvcnQgaXMgcGFydCBvZiBhIGxpbmtlZCBsaXN0IG9mIHBvcnRzLgorICogICAgICAgVGhlcmUgYXJlIHR3byBzdWNoIGxpc3RzOyAncG9ydF9saXN0Jywgd2hpY2ggaXMgdXNlZCBmb3IgbWFuYWdlbWVudCwKKyAqICAgICAgIGFuZCAnd2FpdF9saXN0Jywgd2hpY2ggaXMgdXNlZCB0byBxdWV1ZSBwb3J0cyBkdXJpbmcgY29uZ2VzdGlvbi4KKyAqICAgICAKKyAqICAzOiBUaGUgbmFtZSB0YWJsZSAobmFtZV90YWJsZS5jLCBuYW1lX2Rpc3RyLmMsIHN1YnNjcmlwdGlvbi5jKQorICogICAgIC0gVGhlcmUgaXMgb25lIGJpZyByZWFkL3dyaXRlLWxvY2sgKG5hbWV0YmxfbG9jaykgcHJvdGVjdGluZyB0aGUgCisgKiAgICAgICBvdmVyYWxsIG5hbWUgdGFibGUgc3RydWN0dXJlLiBOb3RoaW5nIG11c3QgYmUgYWRkZWQvcmVtb3ZlZCB0byAKKyAqICAgICAgIHRoaXMgc3RydWN0dXJlIHdpdGhvdXQgaG9sZGluZyB3cml0ZSBhY2Nlc3MgdG8gaXQuCisgKiAgICAgLSBUaGVyZSBpcyBvbmUgbG9jYWwgc3Bpbl9sb2NrIHBlciBzdWJfc2VxdWVuY2UsIHdoaWNoIGNhbiBiZSBzZWVuCisgKiAgICAgICBhcyBhIHN1Yi1kb21haW4gdG8gdGhlIG5hbWV0YmxfbG9jayBkb21haW4uIEl0IGlzIHVzZWQgb25seQorICogICAgICAgZm9yIHRyYW5zbGF0aW9uIG9wZXJhdGlvbnMsIGFuZCBpcyBuZWVkZWQgYmVjYXVzZSBhIHRyYW5zbGF0aW9uCisgKiAgICAgICBzdGVwcyB0aGUgcm9vdCBvZiB0aGUgJ3B1YmxpY2F0aW9uJyBsaW5rZWQgbGlzdCBiZXR3ZWVuIGVhY2ggbG9va3VwLgorICogICAgICAgVGhpcyBpcyBhbHdheXMgdXNlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgbmFtZXRibF9sb2NrKHJlYWQpLgorICogICAgIC0gQSBsb2NhbCBzcGluX2xvY2sgcHJvdGVjdGluZyB0aGUgcXVldWUgb2Ygc3Vic2NyaWJlciBldmVudHMuCisqLworCityd2xvY2tfdCBuZXRfbG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQ7CitzdHJ1Y3QgbmV0d29yayBuZXQgPSB7IDAgfTsKKworc3RydWN0IG5vZGUgKm5ldF9zZWxlY3RfcmVtb3RlX25vZGUodTMyIGFkZHIsIHUzMiByZWYpIAoreworCXJldHVybiB6b25lX3NlbGVjdF9yZW1vdGVfbm9kZShuZXQuem9uZXNbdGlwY196b25lKGFkZHIpXSwgYWRkciwgcmVmKTsKK30KKwordTMyIG5ldF9zZWxlY3Rfcm91dGVyKHUzMiBhZGRyLCB1MzIgcmVmKQoreworCXJldHVybiB6b25lX3NlbGVjdF9yb3V0ZXIobmV0LnpvbmVzW3RpcGNfem9uZShhZGRyKV0sIGFkZHIsIHJlZik7Cit9CisKKwordTMyIG5ldF9uZXh0X25vZGUodTMyIGEpCit7CisJaWYgKG5ldC56b25lc1t0aXBjX3pvbmUoYSldKQorCQlyZXR1cm4gem9uZV9uZXh0X25vZGUoYSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmV0X3JlbW92ZV9hc19yb3V0ZXIodTMyIHJvdXRlcikKK3sKKwl1MzIgel9udW07CisKKwlmb3IgKHpfbnVtID0gMTsgel9udW0gPD0gdGlwY19tYXhfem9uZXM7IHpfbnVtKyspIHsKKwkJaWYgKCFuZXQuem9uZXNbel9udW1dKQorCQkJY29udGludWU7CisJCXpvbmVfcmVtb3ZlX2FzX3JvdXRlcihuZXQuem9uZXNbel9udW1dLCByb3V0ZXIpOworCX0KK30KKwordm9pZCBuZXRfc2VuZF9leHRlcm5hbF9yb3V0ZXModTMyIGRlc3QpCit7CisJdTMyIHpfbnVtOworCisJZm9yICh6X251bSA9IDE7IHpfbnVtIDw9IHRpcGNfbWF4X3pvbmVzOyB6X251bSsrKSB7CisJCWlmIChuZXQuem9uZXNbel9udW1dKQorCQkJem9uZV9zZW5kX2V4dGVybmFsX3JvdXRlcyhuZXQuem9uZXNbel9udW1dLCBkZXN0KTsKKwl9Cit9CisKK2ludCBuZXRfaW5pdCh2b2lkKQoreworCXUzMiBzeiA9IHNpemVvZihzdHJ1Y3QgX3pvbmUgKikgKiAodGlwY19tYXhfem9uZXMgKyAxKTsKKworCW1lbXNldCgmbmV0LCAwLCBzaXplb2YobmV0KSk7CisJbmV0LnpvbmVzID0gKHN0cnVjdCBfem9uZSAqKilrbWFsbG9jKHN6LCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5ldC56b25lcykgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KG5ldC56b25lcywgMCwgc3opOworCXJldHVybiBUSVBDX09LOworfQorCit2b2lkIG5ldF9zdG9wKHZvaWQpCit7CisJdTMyIHpfbnVtOworCisJaWYgKCFuZXQuem9uZXMpCisJCXJldHVybjsKKworCWZvciAoel9udW0gPSAxOyB6X251bSA8PSB0aXBjX21heF96b25lczsgel9udW0rKykgeworCQl6b25lX2RlbGV0ZShuZXQuem9uZXNbel9udW1dKTsKKwl9CisJa2ZyZWUobmV0LnpvbmVzKTsKKwluZXQuem9uZXMgPSAwOworfQorCitzdGF0aWMgdm9pZCBuZXRfcm91dGVfbmFtZWRfbXNnKHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJdTMyIGRub2RlOworCXUzMiBkcG9ydDsKKworCWlmICghbXNnX25hbWVkKG1zZykpIHsKKwkJbXNnX2RiZyhtc2csICJuZXQtPmRyb3BfbmFtOiIpOworCQlidWZfZGlzY2FyZChidWYpOworCQlyZXR1cm47CisJfQorCisJZG5vZGUgPSBhZGRyX2RvbWFpbihtc2dfbG9va3VwX3Njb3BlKG1zZykpOworCWRwb3J0ID0gbmFtZXRibF90cmFuc2xhdGUobXNnX25hbWV0eXBlKG1zZyksIG1zZ19uYW1laW5zdChtc2cpLCAmZG5vZGUpOworCWRiZygibmV0LT5sb29rdXA8JXUsJXU+LT48JXUsJXg+XG4iLAorCSAgICBtc2dfbmFtZXR5cGUobXNnKSwgbXNnX25hbWVpbnN0KG1zZyksIGRwb3J0LCBkbm9kZSk7CisJaWYgKGRwb3J0KSB7CisJCW1zZ19zZXRfZGVzdG5vZGUobXNnLCBkbm9kZSk7CisJCW1zZ19zZXRfZGVzdHBvcnQobXNnLCBkcG9ydCk7CisJCW5ldF9yb3V0ZV9tc2coYnVmKTsKKwkJcmV0dXJuOworCX0KKwltc2dfZGJnKG1zZywgIm5ldC0+cmVqOk5PIE5BTUU6ICIpOworCXRpcGNfcmVqZWN0X21zZyhidWYsIFRJUENfRVJSX05PX05BTUUpOworfQorCit2b2lkIG5ldF9yb3V0ZV9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1MzIgZG5vZGU7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKworCW1zZ19pbmNyX3Jlcm91dGVfY250KG1zZyk7CisJaWYgKG1zZ19yZXJvdXRlX2NudChtc2cpID4gNikgeworCQlpZiAobXNnX2VycmNvZGUobXNnKSkgeworCQkJbXNnX2RiZyhtc2csICJORVQ+RElTQz46Iik7CisJCQlidWZfZGlzY2FyZChidWYpOworCQl9IGVsc2UgeworCQkJbXNnX2RiZyhtc2csICJORVQ+UkVKPjoiKTsKKwkJCXRpcGNfcmVqZWN0X21zZyhidWYsIG1zZ19kZXN0cG9ydChtc2cpID8gCisJCQkJCVRJUENfRVJSX05PX1BPUlQgOiBUSVBDX0VSUl9OT19OQU1FKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJbXNnX2RiZyhtc2csICJuZXQtPnJvdXQ6ICIpOworCisJLyogSGFuZGxlIG1lc3NhZ2UgZm9yIHRoaXMgbm9kZSAqLworCWRub2RlID0gbXNnX3Nob3J0KG1zZykgPyB0aXBjX293bl9hZGRyIDogbXNnX2Rlc3Rub2RlKG1zZyk7CisJaWYgKGluX3Njb3BlKGRub2RlLCB0aXBjX293bl9hZGRyKSkgeworCQlpZiAobXNnX2lzZGF0YShtc2cpKSB7CisJCQlpZiAobXNnX21jYXN0KG1zZykpIAorCQkJCXBvcnRfcmVjdl9tY2FzdChidWYsIE5VTEwpOworCQkJZWxzZSBpZiAobXNnX2Rlc3Rwb3J0KG1zZykpCisJCQkJcG9ydF9yZWN2X21zZyhidWYpOworCQkJZWxzZQorCQkJCW5ldF9yb3V0ZV9uYW1lZF9tc2coYnVmKTsKKwkJCXJldHVybjsKKwkJfQorCQlzd2l0Y2ggKG1zZ191c2VyKG1zZykpIHsKKwkJY2FzZSBST1VURV9ESVNUUklCVVRPUjoKKwkJCWNsdXN0ZXJfcmVjdl9yb3V0aW5nX3RhYmxlKGJ1Zik7CisJCQlicmVhazsKKwkJY2FzZSBOQU1FX0RJU1RSSUJVVE9SOgorCQkJbmFtZWRfcmVjdihidWYpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OTl9NQU5BR0VSOgorCQkJcG9ydF9yZWN2X3Byb3RvX21zZyhidWYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltc2dfZGJnKG1zZywiRFJPUC9ORVQvPFJFQzwiKTsKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIEhhbmRsZSBtZXNzYWdlIGZvciBhbm90aGVyIG5vZGUgKi8KKwltc2dfZGJnKG1zZywgIk5FVD5TRU5EPjogIik7CisJbGlua19zZW5kKGJ1ZiwgZG5vZGUsIG1zZ19saW5rX3NlbGVjdG9yKG1zZykpOworfQorCitpbnQgdGlwY19zdGFydF9uZXQodm9pZCkKK3sKKwljaGFyIGFkZHJfc3RyaW5nWzE2XTsKKwlpbnQgcmVzOworCisJaWYgKHRpcGNfbW9kZSAhPSBUSVBDX05PREVfTU9ERSkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCXRpcGNfbW9kZSA9IFRJUENfTkVUX01PREU7CisJbmFtZWRfcmVpbml0KCk7CisJcG9ydF9yZWluaXQoKTsKKworCWlmICgocmVzID0gYmVhcmVyX2luaXQoKSkgfHwKKwkgICAgKHJlcyA9IG5ldF9pbml0KCkpIHx8CisJICAgIChyZXMgPSBjbHVzdGVyX2luaXQoKSkgfHwKKwkgICAgKHJlcyA9IGJjbGlua19pbml0KCkpKSB7CisJCXJldHVybiByZXM7CisJfQorICAgICAgICBzdWJzY3Jfc3RvcCgpOworCWNmZ19zdG9wKCk7CisJa19zaWduYWwoKEhhbmRsZXIpc3Vic2NyX3N0YXJ0LCAwKTsKKwlrX3NpZ25hbCgoSGFuZGxlciljZmdfaW5pdCwgMCk7CisJaW5mbygiU3RhcnRlZCBpbiBuZXR3b3JrIG1vZGVcbiIpOworCWluZm8oIk93biBub2RlIGFkZHJlc3MgJXMsIG5ldHdvcmsgaWRlbnRpdHkgJXVcbiIsCisJICAgICBhZGRyX3N0cmluZ19maWxsKGFkZHJfc3RyaW5nLCB0aXBjX293bl9hZGRyKSwgdGlwY19uZXRfaWQpOworCXJldHVybiBUSVBDX09LOworfQorCit2b2lkIHRpcGNfc3RvcF9uZXQodm9pZCkKK3sKKwlpZiAodGlwY19tb2RlICE9IFRJUENfTkVUX01PREUpCisJCXJldHVybjsKKyAgICAgICAgd3JpdGVfbG9ja19iaCgmbmV0X2xvY2spOworCWJlYXJlcl9zdG9wKCk7CisJdGlwY19tb2RlID0gVElQQ19OT0RFX01PREU7CisJYmNsaW5rX3N0b3AoKTsKKwluZXRfc3RvcCgpOworICAgICAgICB3cml0ZV91bmxvY2tfYmgoJm5ldF9sb2NrKTsKKwlpbmZvKCJMZWZ0IG5ldHdvcmsgbW9kZSBcbiIpOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uZXQuaCBiL25ldC90aXBjL25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OGM2ZDQyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbmV0LmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIG5ldC90aXBjL25ldC5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgbmV0d29yayByb3V0aW5nIGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk1LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19ORVRfSAorI2RlZmluZSBfVElQQ19ORVRfSAorCitzdHJ1Y3QgX3pvbmU7CisKKy8qKgorICogc3RydWN0IG5ldHdvcmsgLSBUSVBDIG5ldHdvcmsgc3RydWN0dXJlCisgKiBAem9uZXM6IGFycmF5IG9mIHBvaW50ZXJzIHRvIGFsbCB6b25lcyB3aXRoaW4gbmV0d29yaworICovCisgCitzdHJ1Y3QgbmV0d29yayB7CisJc3RydWN0IF96b25lICoqem9uZXM7Cit9OworCisKK2V4dGVybiBzdHJ1Y3QgbmV0d29yayBuZXQ7CitleHRlcm4gcndsb2NrX3QgbmV0X2xvY2s7CisKK2ludCBuZXRfaW5pdCh2b2lkKTsKK3ZvaWQgbmV0X3N0b3Aodm9pZCk7Cit2b2lkIG5ldF9yZW1vdmVfYXNfcm91dGVyKHUzMiByb3V0ZXIpOwordm9pZCBuZXRfc2VuZF9leHRlcm5hbF9yb3V0ZXModTMyIGRlc3QpOwordm9pZCBuZXRfcm91dGVfbXNnKHN0cnVjdCBza19idWZmICpidWYpOworc3RydWN0IG5vZGUgKm5ldF9zZWxlY3RfcmVtb3RlX25vZGUodTMyIGFkZHIsIHUzMiByZWYpOwordTMyIG5ldF9zZWxlY3Rfcm91dGVyKHUzMiBhZGRyLCB1MzIgcmVmKTsKKworaW50IHRpcGNfc3RhcnRfbmV0KHZvaWQpOwordm9pZCB0aXBjX3N0b3BfbmV0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL25ldGxpbmsuYyBiL25ldC90aXBjL25ldGxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWIzZjQwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbmV0bGluay5jCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogbmV0L3RpcGMvbmV0bGluay5jOiBUSVBDIGNvbmZpZ3VyYXRpb24gaGFuZGxpbmcKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisKK3N0YXRpYyBpbnQgaGFuZGxlX2NtZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBza19idWZmICpyZXBfYnVmOworCXN0cnVjdCBubG1zZ2hkciAqcmVwX25saDsKKwlzdHJ1Y3Qgbmxtc2doZHIgKnJlcV9ubGggPSBpbmZvLT5ubGhkcjsKKwlzdHJ1Y3QgdGlwY19nZW5sbXNnaGRyICpyZXFfdXNlcmhkciA9IGluZm8tPnVzZXJoZHI7CisJaW50IGhkcl9zcGFjZSA9IE5MTVNHX1NQQUNFKEdFTkxfSERSTEVOICsgVElQQ19HRU5MX0hEUkxFTik7CisKKwlpZiAoKHJlcV91c2VyaGRyLT5jbWQgJiAweEMwMDApICYmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkpCisJCXJlcF9idWYgPSBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9ORVRfQURNSU4pOworCWVsc2UKKwkJcmVwX2J1ZiA9IGNmZ19kb19jbWQocmVxX3VzZXJoZHItPmRlc3QsCisJCQkJICAgICByZXFfdXNlcmhkci0+Y21kLAorCQkJCSAgICAgTkxNU0dfREFUQShyZXFfbmxoKSArIEdFTkxfSERSTEVOICsgVElQQ19HRU5MX0hEUkxFTiwKKwkJCQkgICAgIE5MTVNHX1BBWUxPQUQocmVxX25saCwgR0VOTF9IRFJMRU4gKyBUSVBDX0dFTkxfSERSTEVOKSwKKwkJCQkgICAgIGhkcl9zcGFjZSk7CisKKwlpZiAocmVwX2J1ZikgeworCQlza2JfcHVzaChyZXBfYnVmLCBoZHJfc3BhY2UpOworCQlyZXBfbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXJlcF9idWYtPmRhdGE7CisJCW1lbWNweShyZXBfbmxoLCByZXFfbmxoLCBoZHJfc3BhY2UpOworCQlyZXBfbmxoLT5ubG1zZ19sZW4gPSByZXBfYnVmLT5sZW47CisJCWdlbmxtc2dfdW5pY2FzdChyZXBfYnVmLCByZXFfbmxoLT5ubG1zZ19waWQpOworCX0KKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBnZW5sX2ZhbWlseSBmYW1pbHkgPSB7CisgICAgICAgIC5pZAkJPSBHRU5MX0lEX0dFTkVSQVRFLAorICAgICAgICAubmFtZQkJPSBUSVBDX0dFTkxfTkFNRSwKKyAgICAgICAgLnZlcnNpb24JPSBUSVBDX0dFTkxfVkVSU0lPTiwKKyAgICAgICAgLmhkcnNpemUJPSBUSVBDX0dFTkxfSERSTEVOLAorICAgICAgICAubWF4YXR0cgk9IDAsCit9OworCitzdGF0aWMgc3RydWN0IGdlbmxfb3BzIG9wcyA9IHsKKwkuY21kCQk9IFRJUENfR0VOTF9DTUQsCisJLmRvaXQJCT0gaGFuZGxlX2NtZCwKK307CisKK3N0YXRpYyBpbnQgZmFtaWx5X3JlZ2lzdGVyZWQgPSAwOworCitpbnQgbmV0bGlua19zdGFydCh2b2lkKQoreworCisKKwlpZiAoZ2VubF9yZWdpc3Rlcl9mYW1pbHkoJmZhbWlseSkpCisJCWdvdG8gZXJyOworCisJZmFtaWx5X3JlZ2lzdGVyZWQgPSAxOworCisJaWYgKGdlbmxfcmVnaXN0ZXJfb3BzKCZmYW1pbHksICZvcHMpKQorCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCisgICAgICAgIHJldHVybiAwOworCisgZXJyX3VucmVnaXN0ZXI6CisJZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSgmZmFtaWx5KTsKKwlmYW1pbHlfcmVnaXN0ZXJlZCA9IDA7CisgZXJyOgorCWVycigiRmFpbGVkIHRvIHJlZ2lzdGVyIG5ldGxpbmsgaW50ZXJmYWNlXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKwordm9pZCBuZXRsaW5rX3N0b3Aodm9pZCkKK3sKKwlpZiAoZmFtaWx5X3JlZ2lzdGVyZWQpIHsKKwkJZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSgmZmFtaWx5KTsKKwkJZmFtaWx5X3JlZ2lzdGVyZWQgPSAwOworCX0KK30KZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGUuYyBiL25ldC90aXBjL25vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTY4OGQwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbm9kZS5jCkBAIC0wLDAgKzEsNjc5IEBACisvKgorICogbmV0L3RpcGMvbm9kZS5jOiBUSVBDIG5vZGUgbWFuYWdlbWVudCByb3V0aW5lcworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIm5vZGUuaCIKKyNpbmNsdWRlICJjbHVzdGVyLmgiCisjaW5jbHVkZSAibmV0LmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJiZWFyZXIuaCIKKyNpbmNsdWRlICJuYW1lX2Rpc3RyLmgiCisjaW5jbHVkZSAibmV0LmgiCisKK3ZvaWQgbm9kZV9wcmludChzdHJ1Y3QgcHJpbnRfYnVmICpidWYsIHN0cnVjdCBub2RlICpuX3B0ciwgY2hhciAqc3RyKTsKK3N0YXRpYyB2b2lkIG5vZGVfbG9zdF9jb250YWN0KHN0cnVjdCBub2RlICpuX3B0cik7CitzdGF0aWMgdm9pZCBub2RlX2VzdGFibGlzaGVkX2NvbnRhY3Qoc3RydWN0IG5vZGUgKm5fcHRyKTsKKworc3RydWN0IG5vZGUgKm5vZGVzID0gTlVMTDsJLyogc29ydGVkIGxpc3Qgb2Ygbm9kZXMgd2l0aGluIGNsdXN0ZXIgKi8KKwordTMyIHRpcGNfb3duX3RhZyA9IDA7CisKK3N0cnVjdCBub2RlICpub2RlX2NyZWF0ZSh1MzIgYWRkcikKK3sKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHI7CisJc3RydWN0IG5vZGUgKm5fcHRyOworICAgICAgICBzdHJ1Y3Qgbm9kZSAqKmN1cnJfbm9kZTsKKworCW5fcHRyID0ga21hbGxvYyhzaXplb2YoKm5fcHRyKSxHRlBfQVRPTUlDKTsKKyAgICAgICAgaWYgKG5fcHRyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQobl9wdHIsIDAsIHNpemVvZigqbl9wdHIpKTsKKyAgICAgICAgICAgICAgICBuX3B0ci0+YWRkciA9IGFkZHI7CisgICAgICAgICAgICAgICAgbl9wdHItPmxvY2sgPSAgU1BJTl9MT0NLX1VOTE9DS0VEOwkKKyAgICAgICAgICAgICAgICBJTklUX0xJU1RfSEVBRCgmbl9wdHItPm5zdWIpOworCQorCQljX3B0ciA9IGNsdXN0ZXJfZmluZChhZGRyKTsKKyAgICAgICAgICAgICAgICBpZiAoY19wdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNfcHRyID0gY2x1c3Rlcl9jcmVhdGUoYWRkcik7CisgICAgICAgICAgICAgICAgaWYgKGNfcHRyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5fcHRyLT5vd25lciA9IGNfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9hdHRhY2hfbm9kZShjX3B0ciwgbl9wdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgbl9wdHItPmxhc3Rfcm91dGVyID0gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc2VydCBub2RlIGludG8gb3JkZXJlZCBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGN1cnJfbm9kZSA9ICZub2RlczsgKmN1cnJfbm9kZTsgCisJCQkgICAgIGN1cnJfbm9kZSA9ICYoKmN1cnJfbm9kZSktPm5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHIgPCAoKmN1cnJfbm9kZSktPmFkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX3B0ci0+bmV4dCA9ICpjdXJyX25vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICgqY3Vycl9ub2RlKSA9IG5fcHRyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShuX3B0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBuX3B0ciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJcmV0dXJuIG5fcHRyOworfQorCit2b2lkIG5vZGVfZGVsZXRlKHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwlpZiAoIW5fcHRyKQorCQlyZXR1cm47CisKKyNpZiAwCisJLyogTm90IG5lZWRlZCBiZWNhdXNlIGxpbmtzIGFyZSBhbHJlYWR5IGRlbGV0ZWQgdmlhIGJlYXJlcl9zdG9wKCkgKi8KKworCXUzMiBsX251bTsKKworCWZvciAobF9udW0gPSAwOyBsX251bSA8IE1BWF9CRUFSRVJTOyBsX251bSsrKSB7CisJCWxpbmtfZGVsZXRlKG5fcHRyLT5saW5rc1tsX251bV0pOworCX0KKyNlbmRpZgorCisJZGJnKCJub2RlICV4IGRlbGV0ZWRcbiIsIG5fcHRyLT5hZGRyKTsKKwlrZnJlZShuX3B0cik7Cit9CisKKworLyoqCisgKiBub2RlX2xpbmtfdXAgLSBoYW5kbGUgYWRkaXRpb24gb2YgbGluaworICogCisgKiBMaW5rIGJlY29tZXMgYWN0aXZlIChhbG9uZSBvciBzaGFyZWQpIG9yIHN0YW5kYnksIGRlcGVuZGluZyBvbiBpdHMgcHJpb3JpdHkuCisgKi8KKwordm9pZCBub2RlX2xpbmtfdXAoc3RydWN0IG5vZGUgKm5fcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJc3RydWN0IGxpbmsgKiphY3RpdmUgPSAmbl9wdHItPmFjdGl2ZV9saW5rc1swXTsKKworCWluZm8oIkVzdGFibGlzaGVkIGxpbmsgPCVzPiBvbiBuZXR3b3JrIHBsYW5lICVjXG4iLAorCSAgICAgbF9wdHItPm5hbWUsIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lKTsKKwkKKwlpZiAoIWFjdGl2ZVswXSkgeworCQlkYmcoIiBsaW5rICV4IGludG8gJXgvJXhcbiIsIGxfcHRyLCAmYWN0aXZlWzBdLCAmYWN0aXZlWzFdKTsKKwkJYWN0aXZlWzBdID0gYWN0aXZlWzFdID0gbF9wdHI7CisJCW5vZGVfZXN0YWJsaXNoZWRfY29udGFjdChuX3B0cik7CisJCXJldHVybjsKKwl9CisJaWYgKGxfcHRyLT5wcmlvcml0eSA8IGFjdGl2ZVswXS0+cHJpb3JpdHkpIHsgCisJCWluZm8oIkxpbmsgaXMgc3RhbmRieVxuIik7CisJCXJldHVybjsKKwl9CisJbGlua19zZW5kX2R1cGxpY2F0ZShhY3RpdmVbMF0sIGxfcHRyKTsKKwlpZiAobF9wdHItPnByaW9yaXR5ID09IGFjdGl2ZVswXS0+cHJpb3JpdHkpIHsgCisJCWFjdGl2ZVswXSA9IGxfcHRyOworCQlyZXR1cm47CisJfQorCWluZm8oIkxpbmsgPCVzPiBvbiBuZXR3b3JrIHBsYW5lICVjIGJlY29tZXMgc3RhbmRieVxuIiwKKwkgICAgIGFjdGl2ZVswXS0+bmFtZSwgYWN0aXZlWzBdLT5iX3B0ci0+bmV0X3BsYW5lKTsKKwlhY3RpdmVbMF0gPSBhY3RpdmVbMV0gPSBsX3B0cjsKK30KKworLyoqCisgKiBub2RlX3NlbGVjdF9hY3RpdmVfbGlua3MgLSBzZWxlY3QgYWN0aXZlIGxpbmsKKyAqLworCitzdGF0aWMgdm9pZCBub2RlX3NlbGVjdF9hY3RpdmVfbGlua3Moc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXN0cnVjdCBsaW5rICoqYWN0aXZlID0gJm5fcHRyLT5hY3RpdmVfbGlua3NbMF07CisJdTMyIGk7CisJdTMyIGhpZ2hlc3RfcHJpbyA9IDA7CisKKyAgICAgICAgYWN0aXZlWzBdID0gYWN0aXZlWzFdID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGxpbmsgKmxfcHRyID0gbl9wdHItPmxpbmtzW2ldOworCisJCWlmICghbF9wdHIgfHwgIWxpbmtfaXNfdXAobF9wdHIpIHx8CisJCSAgICAobF9wdHItPnByaW9yaXR5IDwgaGlnaGVzdF9wcmlvKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChsX3B0ci0+cHJpb3JpdHkgPiBoaWdoZXN0X3ByaW8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlc3RfcHJpbyA9IGxfcHRyLT5wcmlvcml0eTsKKwkJCWFjdGl2ZVswXSA9IGFjdGl2ZVsxXSA9IGxfcHRyOworCQl9IGVsc2UgeworCQkJYWN0aXZlWzFdID0gbF9wdHI7CisJCX0KKwl9Cit9CisKKy8qKgorICogbm9kZV9saW5rX2Rvd24gLSBoYW5kbGUgbG9zcyBvZiBsaW5rCisgKi8KKwordm9pZCBub2RlX2xpbmtfZG93bihzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlzdHJ1Y3QgbGluayAqKmFjdGl2ZTsKKworCWlmICghbGlua19pc19hY3RpdmUobF9wdHIpKSB7CisJCWluZm8oIkxvc3Qgc3RhbmRieSBsaW5rIDwlcz4gb24gbmV0d29yayBwbGFuZSAlY1xuIiwKKwkJICAgICBsX3B0ci0+bmFtZSwgbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUpOworCQlyZXR1cm47CisJfQorCWluZm8oIkxvc3QgbGluayA8JXM+IG9uIG5ldHdvcmsgcGxhbmUgJWNcbiIsCisJCWxfcHRyLT5uYW1lLCBsX3B0ci0+Yl9wdHItPm5ldF9wbGFuZSk7CisKKwlhY3RpdmUgPSAmbl9wdHItPmFjdGl2ZV9saW5rc1swXTsKKwlpZiAoYWN0aXZlWzBdID09IGxfcHRyKQorCQlhY3RpdmVbMF0gPSBhY3RpdmVbMV07CisJaWYgKGFjdGl2ZVsxXSA9PSBsX3B0cikKKwkJYWN0aXZlWzFdID0gYWN0aXZlWzBdOworCWlmIChhY3RpdmVbMF0gPT0gbF9wdHIpCisJCW5vZGVfc2VsZWN0X2FjdGl2ZV9saW5rcyhuX3B0cik7CisJaWYgKG5vZGVfaXNfdXAobl9wdHIpKSAKKwkJbGlua19jaGFuZ2VvdmVyKGxfcHRyKTsKKwllbHNlIAorCQlub2RlX2xvc3RfY29udGFjdChuX3B0cik7Cit9CisKK2ludCBub2RlX2hhc19hY3RpdmVfbGlua3Moc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXJldHVybiAobl9wdHIgJiYgCisJCSgobl9wdHItPmFjdGl2ZV9saW5rc1swXSkgfHwgKG5fcHRyLT5hY3RpdmVfbGlua3NbMV0pKSk7Cit9CisKK2ludCBub2RlX2hhc19yZWR1bmRhbnRfbGlua3Moc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXJldHVybiAobm9kZV9oYXNfYWN0aXZlX2xpbmtzKG5fcHRyKSAmJgorCQkobl9wdHItPmFjdGl2ZV9saW5rc1swXSAhPSBuX3B0ci0+YWN0aXZlX2xpbmtzWzFdKSk7Cit9CisKK2ludCBub2RlX2hhc19hY3RpdmVfcm91dGVzKHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwlyZXR1cm4gKG5fcHRyICYmIChuX3B0ci0+bGFzdF9yb3V0ZXIgPj0gMCkpOworfQorCitpbnQgbm9kZV9pc191cChzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJcmV0dXJuIChub2RlX2hhc19hY3RpdmVfbGlua3Mobl9wdHIpIHx8IG5vZGVfaGFzX2FjdGl2ZV9yb3V0ZXMobl9wdHIpKTsKK30KKworc3RydWN0IG5vZGUgKm5vZGVfYXR0YWNoX2xpbmsoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXN0cnVjdCBub2RlICpuX3B0ciA9IG5vZGVfZmluZChsX3B0ci0+YWRkcik7CisKKwlpZiAoIW5fcHRyKQorCQluX3B0ciA9IG5vZGVfY3JlYXRlKGxfcHRyLT5hZGRyKTsKKyAgICAgICAgaWYgKG5fcHRyKSB7CisJCXUzMiBiZWFyZXJfaWQgPSBsX3B0ci0+Yl9wdHItPmlkZW50aXR5OworCQljaGFyIGFkZHJfc3RyaW5nWzE2XTsKKworICAgICAgICAgICAgICAgIGFzc2VydChiZWFyZXJfaWQgPCBNQVhfQkVBUkVSUyk7CisgICAgICAgICAgICAgICAgaWYgKG5fcHRyLT5saW5rX2NudCA+PSAyKSB7CisJCQljaGFyIGFkZHJfc3RyaW5nWzE2XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJBdHRlbXB0IHRvIGNyZWF0ZSB0aGlyZCBsaW5rIHRvICVzXG4iLAorCQkJICAgIGFkZHJfc3RyaW5nX2ZpbGwoYWRkcl9zdHJpbmcsIG5fcHRyLT5hZGRyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIW5fcHRyLT5saW5rc1tiZWFyZXJfaWRdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuX3B0ci0+bGlua3NbYmVhcmVyX2lkXSA9IGxfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgbmV0LnpvbmVzW3RpcGNfem9uZShsX3B0ci0+YWRkcildLT5saW5rcysrOworICAgICAgICAgICAgICAgICAgICAgICAgbl9wdHItPmxpbmtfY250Kys7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbl9wdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVycigiQXR0ZW1wdCB0byBlc3RhYmxpc2ggc2Vjb25kIGxpbmsgb24gPCVzPiB0byA8JXM+IFxuIiwKKyAgICAgICAgICAgICAgICAgICAgbF9wdHItPmJfcHRyLT5wdWJsLm5hbWUsIAorCQkgICAgYWRkcl9zdHJpbmdfZmlsbChhZGRyX3N0cmluZywgbF9wdHItPmFkZHIpKTsKKyAgICAgICAgfQorCXJldHVybiAwOworfQorCit2b2lkIG5vZGVfZGV0YWNoX2xpbmsoc3RydWN0IG5vZGUgKm5fcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJbl9wdHItPmxpbmtzW2xfcHRyLT5iX3B0ci0+aWRlbnRpdHldID0gMDsKKwluZXQuem9uZXNbdGlwY196b25lKGxfcHRyLT5hZGRyKV0tPmxpbmtzLS07CisJbl9wdHItPmxpbmtfY250LS07Cit9CisKKy8qCisgKiBSb3V0aW5nIHRhYmxlIG1hbmFnZW1lbnQgLSBmaXZlIGNhc2VzIHRvIGhhbmRsZToKKyAqCisgKiAxOiBBIGxpbmsgdG93YXJkcyBhIHpvbmUvY2x1c3RlciBleHRlcm5hbCBub2RlIGNvbWVzIHVwLgorICogICAgPT4gU2VuZCBhIG11bHRpY2FzdCBtZXNzYWdlIHVwZGF0aW5nIHJvdXRpbmcgdGFibGVzIG9mIGFsbCAKKyAqICAgIHN5c3RlbSBub2RlcyB3aXRoaW4gb3duIGNsdXN0ZXIgdGhhdCB0aGUgbmV3IGRlc3RpbmF0aW9uIAorICogICAgY2FuIGJlIHJlYWNoZWQgdmlhIHRoaXMgbm9kZS4gCisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT0+Y2x1c3Rlci5tdWx0aWNhc3ROZXdSb3V0ZSgpKQorICoKKyAqIDI6IEEgbGluayB0b3dhcmRzIGEgc2xhdmUgbm9kZSBjb21lcyB1cC4KKyAqICAgID0+IFNlbmQgYSBtdWx0aWNhc3QgbWVzc2FnZSB1cGRhdGluZyByb3V0aW5nIHRhYmxlcyBvZiBhbGwgCisgKiAgICBzeXN0ZW0gbm9kZXMgd2l0aGluIG93biBjbHVzdGVyIHRoYXQgdGhlIG5ldyBkZXN0aW5hdGlvbiAKKyAqICAgIGNhbiBiZSByZWFjaGVkIHZpYSB0aGlzIG5vZGUuIAorICogICAgKG5vZGUuZXN0YWJsaXNoZWRDb250YWN0KCk9PmNsdXN0ZXIubXVsdGljYXN0TmV3Um91dGUoKSkKKyAqICAgID0+IFNlbmQgYSAgbWVzc2FnZSB0byB0aGUgc2xhdmUgbm9kZSBhYm91dCBleGlzdGVuY2UgCisgKiAgICBvZiBhbGwgc3lzdGVtIG5vZGVzIHdpdGhpbiBjbHVzdGVyOgorICogICAgKG5vZGUuZXN0YWJsaXNoZWRDb250YWN0KCk9PmNsdXN0ZXIuc2VuZExvY2FsUm91dGVzKCkpCisgKgorICogMzogQSBuZXcgY2x1c3RlciBsb2NhbCBzeXN0ZW0gbm9kZSBiZWNvbWVzIGF2YWlsYWJsZS4KKyAqICAgID0+IFNlbmQgbWVzc2FnZShzKSB0byB0aGlzIHBhcnRpY3VsYXIgbm9kZSBjb250YWluaW5nCisgKiAgICBpbmZvcm1hdGlvbiBhYm91dCBhbGwgY2x1c3RlciBleHRlcm5hbCBhbmQgc2xhdmUKKyAqICAgICBub2RlcyB3aGljaCBjYW4gYmUgcmVhY2hlZCB2aWEgdGhpcyBub2RlLgorICogICAgKG5vZGUuZXN0YWJsaXNoZWRDb250YWN0KCk9PT5uZXR3b3JrLnNlbmRFeHRlcm5hbFJvdXRlcygpKQorICogICAgKG5vZGUuZXN0YWJsaXNoZWRDb250YWN0KCk9PT5uZXR3b3JrLnNlbmRTbGF2ZVJvdXRlcygpKQorICogICAgPT4gU2VuZCBtZXNzYWdlcyB0byBhbGwgZGlyZWN0bHkgY29ubmVjdGVkIHNsYXZlIG5vZGVzIAorICogICAgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhpc3RlbmNlIG9mIHRoZSBuZXcgbm9kZQorICogICAgKG5vZGUuZXN0YWJsaXNoZWRDb250YWN0KCk9PmNsdXN0ZXIubXVsdGljYXN0TmV3Um91dGUoKSkKKyAqICAgIAorICogNDogVGhlIGxpbmsgdG93YXJkcyBhIHpvbmUvY2x1c3RlciBleHRlcm5hbCBub2RlIG9yIHNsYXZlCisgKiAgICBub2RlIGdvZXMgZG93bi4KKyAqICAgID0+IFNlbmQgYSBtdWx0Y2FzdCBtZXNzYWdlIHVwZGF0aW5nIHJvdXRpbmcgdGFibGVzIG9mIGFsbCAKKyAqICAgIG5vZGVzIHdpdGhpbiBjbHVzdGVyIHRoYXQgdGhlIG5ldyBkZXN0aW5hdGlvbiBjYW4gbm90IGFueQorICogICAgbG9uZ2VyIGJlIHJlYWNoZWQgdmlhIHRoaXMgbm9kZS4KKyAqICAgIChub2RlLmxvc3RBbGxMaW5rcygpPT5jbHVzdGVyLmJjYXN0TG9zdFJvdXRlKCkpCisgKgorICogNTogQSBjbHVzdGVyIGxvY2FsIHN5c3RlbSBub2RlIGJlY29tZXMgdW5hdmFpbGFibGUuCisgKiAgICA9PiBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBub2RlIGZyb20gdGhlIGxvY2FsCisgKiAgICByb3V0aW5nIHRhYmxlcy4gTm90ZTogVGhpcyBpcyBhIGNvbXBsZXRlbHkgbm9kZQorICogICAgbG9jYWwgb3BlcmF0aW9uLgorICogICAgKG5vZGUubG9zdEFsbExpbmtzKCk9Pm5ldHdvcmsucmVtb3ZlQXNSb3V0ZXIoKSkKKyAqICAgID0+IFNlbmQgbWVzc2FnZXMgdG8gYWxsIGRpcmVjdGx5IGNvbm5lY3RlZCBzbGF2ZSBub2RlcyAKKyAqICAgIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgbG9zcyBvZiB0aGUgbm9kZQorICogICAgKG5vZGUuZXN0YWJsaXNoZWRDb250YWN0KCk9PmNsdXN0ZXIubXVsdGljYXN0TG9zdFJvdXRlKCkpCisgKgorICovCisKK3N0YXRpYyB2b2lkIG5vZGVfZXN0YWJsaXNoZWRfY29udGFjdChzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJc3RydWN0IGNsdXN0ZXIgKmNfcHRyOworCisJZGJnKCJub2RlX2VzdGFibGlzaGVkX2NvbnRhY3Q6LT4gJXhcbiIsIG5fcHRyLT5hZGRyKTsKKwlpZiAoIW5vZGVfaGFzX2FjdGl2ZV9yb3V0ZXMobl9wdHIpKSB7IAorCQlrX3NpZ25hbCgoSGFuZGxlciluYW1lZF9ub2RlX3VwLCBuX3B0ci0+YWRkcik7CisJfQorCisgICAgICAgIC8qIFN5bmNyb25pemUgYnJvYWRjYXN0IGFja3MgKi8KKyAgICAgICAgbl9wdHItPmJjbGluay5hY2tlZCA9IGJjbGlua19nZXRfbGFzdF9zZW50KCk7CisKKwlpZiAoaXNfc2xhdmUodGlwY19vd25fYWRkcikpCisJCXJldHVybjsKKwlpZiAoIWluX293bl9jbHVzdGVyKG5fcHRyLT5hZGRyKSkgeworCQkvKiBVc2FnZSBjYXNlIDEgKHNlZSBhYm92ZSkgKi8KKwkJY19wdHIgPSBjbHVzdGVyX2ZpbmQodGlwY19vd25fYWRkcik7CisJCWlmICghY19wdHIpCisJCQljX3B0ciA9IGNsdXN0ZXJfY3JlYXRlKHRpcGNfb3duX2FkZHIpOworICAgICAgICAgICAgICAgIGlmIChjX3B0cikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfYmNhc3RfbmV3X3JvdXRlKGNfcHRyLCBuX3B0ci0+YWRkciwgMSwgCisJCQkJCQl0aXBjX21heF9ub2Rlcyk7CisJCXJldHVybjsKKwl9IAorCisJY19wdHIgPSBuX3B0ci0+b3duZXI7CisJaWYgKGlzX3NsYXZlKG5fcHRyLT5hZGRyKSkgeworCQkvKiBVc2FnZSBjYXNlIDIgKHNlZSBhYm92ZSkgKi8KKwkJY2x1c3Rlcl9iY2FzdF9uZXdfcm91dGUoY19wdHIsIG5fcHRyLT5hZGRyLCAxLCB0aXBjX21heF9ub2Rlcyk7CisJCWNsdXN0ZXJfc2VuZF9sb2NhbF9yb3V0ZXMoY19wdHIsIG5fcHRyLT5hZGRyKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChuX3B0ci0+YmNsaW5rLnN1cHBvcnRlZCkgeworCQlubWFwX2FkZCgmY2x1c3Rlcl9iY2FzdF9ub2Rlcywgbl9wdHItPmFkZHIpOworCQlpZiAobl9wdHItPmFkZHIgPCB0aXBjX293bl9hZGRyKQorCQkJdGlwY19vd25fdGFnKys7CisJfQorCisJLyogQ2FzZSAzIChzZWUgYWJvdmUpICovCisJbmV0X3NlbmRfZXh0ZXJuYWxfcm91dGVzKG5fcHRyLT5hZGRyKTsKKwljbHVzdGVyX3NlbmRfc2xhdmVfcm91dGVzKGNfcHRyLCBuX3B0ci0+YWRkcik7CisJY2x1c3Rlcl9iY2FzdF9uZXdfcm91dGUoY19wdHIsIG5fcHRyLT5hZGRyLCBMT1dFU1RfU0xBVkUsCisJCQkJaGlnaGVzdF9hbGxvd2VkX3NsYXZlKTsKK30KKworc3RhdGljIHZvaWQgbm9kZV9sb3N0X2NvbnRhY3Qoc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXN0cnVjdCBjbHVzdGVyICpjX3B0cjsKKwlzdHJ1Y3Qgbm9kZV9zdWJzY3IgKm5zLCAqdG5zOworCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCXUzMiBpOworCisgICAgICAgIC8qIENsZWFuIHVwIGJyb2FkY2FzdCByZWNlcHRpb24gcmVtYWlucyAqLworICAgICAgICBuX3B0ci0+YmNsaW5rLmdhcF9hZnRlciA9IG5fcHRyLT5iY2xpbmsuZ2FwX3RvID0gMDsKKyAgICAgICAgd2hpbGUgKG5fcHRyLT5iY2xpbmsuZGVmZXJyZWRfaGVhZCkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmKiBidWYgPSBuX3B0ci0+YmNsaW5rLmRlZmVycmVkX2hlYWQ7CisgICAgICAgICAgICAgICAgbl9wdHItPmJjbGluay5kZWZlcnJlZF9oZWFkID0gYnVmLT5uZXh0OworICAgICAgICAgICAgICAgIGJ1Zl9kaXNjYXJkKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5fcHRyLT5iY2xpbmsuZGVmcmFnbSkgeworICAgICAgICAgICAgICAgIGJ1Zl9kaXNjYXJkKG5fcHRyLT5iY2xpbmsuZGVmcmFnbSk7ICAKKyAgICAgICAgICAgICAgICBuX3B0ci0+YmNsaW5rLmRlZnJhZ20gPSBOVUxMOworICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIGlmIChpbl9vd25fY2x1c3RlcihuX3B0ci0+YWRkcikgJiYgbl9wdHItPmJjbGluay5zdXBwb3J0ZWQpIHsgCisgICAgICAgICAgICAgICAgYmNsaW5rX2Fja25vd2xlZGdlKG5fcHRyLCBtb2Qobl9wdHItPmJjbGluay5hY2tlZCArIDEwMDAwKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBVcGRhdGUgcm91dGluZyB0YWJsZXMgKi8KKwlpZiAoaXNfc2xhdmUodGlwY19vd25fYWRkcikpIHsKKwkJbmV0X3JlbW92ZV9hc19yb3V0ZXIobl9wdHItPmFkZHIpOworCX0gZWxzZSB7CisJCWlmICghaW5fb3duX2NsdXN0ZXIobl9wdHItPmFkZHIpKSB7IAorCQkJLyogQ2FzZSA0IChzZWUgYWJvdmUpICovCisJCQljX3B0ciA9IGNsdXN0ZXJfZmluZCh0aXBjX293bl9hZGRyKTsKKwkJCWNsdXN0ZXJfYmNhc3RfbG9zdF9yb3V0ZShjX3B0ciwgbl9wdHItPmFkZHIsIDEsCisJCQkJCQkgdGlwY19tYXhfbm9kZXMpOworCQl9IGVsc2UgeworCQkJLyogQ2FzZSA1IChzZWUgYWJvdmUpICovCisJCQljX3B0ciA9IGNsdXN0ZXJfZmluZChuX3B0ci0+YWRkcik7CisJCQlpZiAoaXNfc2xhdmUobl9wdHItPmFkZHIpKSB7CisJCQkJY2x1c3Rlcl9iY2FzdF9sb3N0X3JvdXRlKGNfcHRyLCBuX3B0ci0+YWRkciwgMSwKKwkJCQkJCQkgdGlwY19tYXhfbm9kZXMpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobl9wdHItPmJjbGluay5zdXBwb3J0ZWQpIHsKKwkJCQkJbm1hcF9yZW1vdmUoJmNsdXN0ZXJfYmNhc3Rfbm9kZXMsIAorCQkJCQkJICAgIG5fcHRyLT5hZGRyKTsKKwkJCQkJaWYgKG5fcHRyLT5hZGRyIDwgdGlwY19vd25fYWRkcikKKwkJCQkJCXRpcGNfb3duX3RhZy0tOworCQkJCX0KKwkJCQluZXRfcmVtb3ZlX2FzX3JvdXRlcihuX3B0ci0+YWRkcik7CisJCQkJY2x1c3Rlcl9iY2FzdF9sb3N0X3JvdXRlKGNfcHRyLCBuX3B0ci0+YWRkciwKKwkJCQkJCQkgTE9XRVNUX1NMQVZFLAorCQkJCQkJCSBoaWdoZXN0X2FsbG93ZWRfc2xhdmUpOworCQkJfQorCQl9CisJfQorCWlmIChub2RlX2hhc19hY3RpdmVfcm91dGVzKG5fcHRyKSkKKwkJcmV0dXJuOworCisJaW5mbygiTG9zdCBjb250YWN0IHdpdGggJXNcbiIsIAorCSAgICAgYWRkcl9zdHJpbmdfZmlsbChhZGRyX3N0cmluZywgbl9wdHItPmFkZHIpKTsKKworCS8qIEFib3J0IGxpbmsgY2hhbmdlb3ZlciAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgaSsrKSB7CisJCXN0cnVjdCBsaW5rICpsX3B0ciA9IG5fcHRyLT5saW5rc1tpXTsKKwkJaWYgKCFsX3B0cikgCisJCQljb250aW51ZTsKKwkJbF9wdHItPnJlc2V0X2NoZWNrcG9pbnQgPSBsX3B0ci0+bmV4dF9pbl9ubzsKKwkJbF9wdHItPmV4cF9tc2dfY291bnQgPSAwOworCQlsaW5rX3Jlc2V0X2ZyYWdtZW50cyhsX3B0cik7CisJfQorCisJLyogTm90aWZ5IHN1YnNjcmliZXJzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5zLCB0bnMsICZuX3B0ci0+bnN1Yiwgbm9kZXN1Yl9saXN0KSB7CisgICAgICAgICAgICAgICAgbnMtPm5vZGUgPSAwOworCQlsaXN0X2RlbF9pbml0KCZucy0+bm9kZXN1Yl9saXN0KTsKKwkJa19zaWduYWwoKEhhbmRsZXIpbnMtPmhhbmRsZV9ub2RlX2Rvd24sCisJCQkgKHVuc2lnbmVkIGxvbmcpbnMtPnVzcl9oYW5kbGUpOworCX0KK30KKworLyoqCisgKiBub2RlX3NlbGVjdF9uZXh0X2hvcCAtIGZpbmQgdGhlIG5leHQtaG9wIG5vZGUgZm9yIGEgbWVzc2FnZQorICogCisgKiBDYWxsZWQgYnkgd2hlbiBjbHVzdGVyIGxvY2FsIGxvb2t1cCBoYXMgZmFpbGVkLgorICovCisKK3N0cnVjdCBub2RlICpub2RlX3NlbGVjdF9uZXh0X2hvcCh1MzIgYWRkciwgdTMyIHNlbGVjdG9yKQoreworCXN0cnVjdCBub2RlICpuX3B0cjsKKwl1MzIgcm91dGVyX2FkZHI7CisKKyAgICAgICAgaWYgKCFhZGRyX2RvbWFpbl92YWxpZChhZGRyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworCS8qIExvb2sgZm9yIGRpcmVjdCBsaW5rIHRvIGRlc3RpbmF0aW9uIHByb2Nlc3Nzb3IgKi8KKwluX3B0ciA9IG5vZGVfZmluZChhZGRyKTsKKwlpZiAobl9wdHIgJiYgbm9kZV9oYXNfYWN0aXZlX2xpbmtzKG5fcHRyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbl9wdHI7CisKKwkvKiBDbHVzdGVyIGxvY2FsIHN5c3RlbSBub2RlcyAqbXVzdCogaGF2ZSBkaXJlY3QgbGlua3MgKi8KKwlpZiAoIWlzX3NsYXZlKGFkZHIpICYmIGluX293bl9jbHVzdGVyKGFkZHIpKQorCQlyZXR1cm4gMDsKKworCS8qIExvb2sgZm9yIGNsdXN0ZXIgbG9jYWwgcm91dGVyIHdpdGggZGlyZWN0IGxpbmsgdG8gbm9kZSAqLworCXJvdXRlcl9hZGRyID0gbm9kZV9zZWxlY3Rfcm91dGVyKG5fcHRyLCBzZWxlY3Rvcik7CisJaWYgKHJvdXRlcl9hZGRyKSAKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZV9zZWxlY3Qocm91dGVyX2FkZHIsIHNlbGVjdG9yKTsKKworCS8qIFNsYXZlIG5vZGVzIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIHdpdGhpbiBvd24gY2x1c3RlciB2aWEgYSAKKwkgICBrbm93biByb3V0ZXIgd2l0aCBkaXJlY3QgbGluayAtLSBpZiBubyByb3V0ZXIgd2FzIGZvdW5kLGdpdmUgdXAgKi8KKwlpZiAoaXNfc2xhdmUoYWRkcikpCisJCXJldHVybiAwOworCisJLyogSW50ZXIgem9uZS9jbHVzdGVyIC0tIGZpbmQgYW55IGRpcmVjdCBsaW5rIHRvIHJlbW90ZSBjbHVzdGVyICovCisJYWRkciA9IHRpcGNfYWRkcih0aXBjX3pvbmUoYWRkciksIHRpcGNfY2x1c3RlcihhZGRyKSwgMCk7CisJbl9wdHIgPSBuZXRfc2VsZWN0X3JlbW90ZV9ub2RlKGFkZHIsIHNlbGVjdG9yKTsKKwlpZiAobl9wdHIgJiYgbm9kZV9oYXNfYWN0aXZlX2xpbmtzKG5fcHRyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbl9wdHI7CisKKwkvKiBMYXN0IHJlc29ydCAtLSBsb29rIGZvciBhbnkgcm91dGVyIHRvIGFueXdoZXJlIGluIHJlbW90ZSB6b25lICovCisJcm91dGVyX2FkZHIgPSAgbmV0X3NlbGVjdF9yb3V0ZXIoYWRkciwgc2VsZWN0b3IpOworCWlmIChyb3V0ZXJfYWRkcikgCisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVfc2VsZWN0KHJvdXRlcl9hZGRyLCBzZWxlY3Rvcik7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogbm9kZV9zZWxlY3Rfcm91dGVyIC0gc2VsZWN0IHJvdXRlciB0byByZWFjaCBzcGVjaWZpZWQgbm9kZQorICogCisgKiBVc2VzIGEgZGV0ZXJtaW5pc3RpYyBhbmQgZmFpciBhbGdvcml0aG0gZm9yIHNlbGVjdGluZyByb3V0ZXIgbm9kZS4gCisgKi8KKwordTMyIG5vZGVfc2VsZWN0X3JvdXRlcihzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHUzMiByZWYpCit7CisJdTMyIHVsaW07CisJdTMyIG1hc2s7CisJdTMyIHN0YXJ0OworCXUzMiByOworCisgICAgICAgIGlmICghbl9wdHIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKwlpZiAobl9wdHItPmxhc3Rfcm91dGVyIDwgMCkKKwkJcmV0dXJuIDA7CisJdWxpbSA9ICgobl9wdHItPmxhc3Rfcm91dGVyICsgMSkgKiAzMikgLSAxOworCisJLyogU3RhcnQgZW50cnkgbXVzdCBiZSByYW5kb20gKi8KKwltYXNrID0gdGlwY19tYXhfbm9kZXM7CisJd2hpbGUgKG1hc2sgPiB1bGltKQorCQltYXNrID4+PSAxOworCXN0YXJ0ID0gcmVmICYgbWFzazsKKwlyID0gc3RhcnQ7CisKKwkvKiBMb29rdXAgdXB3YXJkcyB3aXRoIHdyYXAtYXJvdW5kICovCisJZG8geworCQlpZiAoKChuX3B0ci0+cm91dGVyc1tyIC8gMzJdKSA+PiAociAlIDMyKSkgJiAxKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoKytyIDw9IHVsaW0pOworCWlmIChyID4gdWxpbSkgeworCQlyID0gMTsKKwkJZG8geworCQkJaWYgKCgobl9wdHItPnJvdXRlcnNbciAvIDMyXSkgPj4gKHIgJSAzMikpICYgMSkKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoKytyIDwgc3RhcnQpOworCQlhc3NlcnQociAhPSBzdGFydCk7CisJfQorCWFzc2VydChyICYmIChyIDw9IHVsaW0pKTsKKwlyZXR1cm4gdGlwY19hZGRyKG93bl96b25lKCksIG93bl9jbHVzdGVyKCksIHIpOworfQorCit2b2lkIG5vZGVfYWRkX3JvdXRlcihzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHUzMiByb3V0ZXIpCit7CisJdTMyIHJfbnVtID0gdGlwY19ub2RlKHJvdXRlcik7CisKKwluX3B0ci0+cm91dGVyc1tyX251bSAvIDMyXSA9IAorCQkoKDEgPDwgKHJfbnVtICUgMzIpKSB8IG5fcHRyLT5yb3V0ZXJzW3JfbnVtIC8gMzJdKTsKKwluX3B0ci0+bGFzdF9yb3V0ZXIgPSB0aXBjX21heF9ub2RlcyAvIDMyOworCXdoaWxlICgoLS1uX3B0ci0+bGFzdF9yb3V0ZXIgPj0gMCkgJiYgCisJICAgICAgICFuX3B0ci0+cm91dGVyc1tuX3B0ci0+bGFzdF9yb3V0ZXJdKTsKK30KKwordm9pZCBub2RlX3JlbW92ZV9yb3V0ZXIoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgcm91dGVyKQoreworCXUzMiByX251bSA9IHRpcGNfbm9kZShyb3V0ZXIpOworCisJaWYgKG5fcHRyLT5sYXN0X3JvdXRlciA8IDApCisJCXJldHVybjsJCS8qIE5vIHJvdXRlcyAqLworCisJbl9wdHItPnJvdXRlcnNbcl9udW0gLyAzMl0gPQorCQkoKH4oMSA8PCAocl9udW0gJSAzMikpKSAmIChuX3B0ci0+cm91dGVyc1tyX251bSAvIDMyXSkpOworCW5fcHRyLT5sYXN0X3JvdXRlciA9IHRpcGNfbWF4X25vZGVzIC8gMzI7CisJd2hpbGUgKCgtLW5fcHRyLT5sYXN0X3JvdXRlciA+PSAwKSAmJiAKKwkgICAgICAgIW5fcHRyLT5yb3V0ZXJzW25fcHRyLT5sYXN0X3JvdXRlcl0pOworCisJaWYgKCFub2RlX2lzX3VwKG5fcHRyKSkKKwkJbm9kZV9sb3N0X2NvbnRhY3Qobl9wdHIpOworfQorCisjaWYgMAordm9pZCBub2RlX3ByaW50KHN0cnVjdCBwcmludF9idWYgKmJ1Ziwgc3RydWN0IG5vZGUgKm5fcHRyLCBjaGFyICpzdHIpCit7CisJdTMyIGk7CisKKwl0aXBjX3ByaW50ZihidWYsICJcblxuJXMiLCBzdHIpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgaSsrKSB7CisJCWlmICghbl9wdHItPmxpbmtzW2ldKSAKKwkJCWNvbnRpbnVlOworCQl0aXBjX3ByaW50ZihidWYsICJMaW5rc1sldV06ICV4LCAiLCBpLCBuX3B0ci0+bGlua3NbaV0pOworCX0KKwl0aXBjX3ByaW50ZihidWYsICJBY3RpdmUgbGlua3M6IFsleCwleF1cbiIsCisJCSAgICBuX3B0ci0+YWN0aXZlX2xpbmtzWzBdLCBuX3B0ci0+YWN0aXZlX2xpbmtzWzFdKTsKK30KKyNlbmRpZgorCit1MzIgdGlwY19hdmFpbGFibGVfbm9kZXMoY29uc3QgdTMyIGRvbWFpbikKK3sKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CisJdTMyIGNudCA9IDA7CisKKwlmb3IgKG5fcHRyID0gbm9kZXM7IG5fcHRyOyBuX3B0ciA9IG5fcHRyLT5uZXh0KSB7CisJCWlmICghaW5fc2NvcGUoZG9tYWluLCBuX3B0ci0+YWRkcikpCisJCQljb250aW51ZTsKKwkJaWYgKG5vZGVfaXNfdXAobl9wdHIpKQorCQkJY250Kys7CisJfQorCXJldHVybiBjbnQ7Cit9CisKK3N0cnVjdCBza19idWZmICpub2RlX2dldF9ub2Rlcyhjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKQoreworCXUzMiBkb21haW47CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CisgICAgICAgIHN0cnVjdCB0aXBjX25vZGVfaW5mbyBub2RlX2luZm87CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX05FVF9BRERSKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCWRvbWFpbiA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwlkb21haW4gPSBudG9obChkb21haW4pOworCWlmICghYWRkcl9kb21haW5fdmFsaWQoZG9tYWluKSkKKwkJcmV0dXJuIGNmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQorCQkJCQkgICAgICAiIChuZXR3b3JrIGFkZHJlc3MpIik7CisKKyAgICAgICAgaWYgKCFub2RlcykKKyAgICAgICAgICAgICAgICByZXR1cm4gY2ZnX3JlcGx5X25vbmUoKTsKKworCS8qIEZvciBub3csIGdldCBzcGFjZSBmb3IgYWxsIG90aGVyIG5vZGVzIAorCSAgICh3aWxsIG5lZWQgdG8gbW9kaWZ5IHRoaXMgd2hlbiBzbGF2ZSBub2RlcyBhcmUgc3VwcG9ydGVkICovCisKKwlidWYgPSBjZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKHNpemVvZihub2RlX2luZm8pKSAqCisJCQkgICAgKHRpcGNfbWF4X25vZGVzIC0gMSkpOworCWlmICghYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEFkZCBUTFZzIGZvciBhbGwgbm9kZXMgaW4gc2NvcGUgKi8KKworCWZvciAobl9wdHIgPSBub2Rlczsgbl9wdHI7IG5fcHRyID0gbl9wdHItPm5leHQpIHsKKwkJaWYgKCFpbl9zY29wZShkb21haW4sIG5fcHRyLT5hZGRyKSkKKwkJCWNvbnRpbnVlOworICAgICAgICAgICAgICAgIG5vZGVfaW5mby5hZGRyID0gaHRvbmwobl9wdHItPmFkZHIpOworICAgICAgICAgICAgICAgIG5vZGVfaW5mby51cCA9IGh0b25sKG5vZGVfaXNfdXAobl9wdHIpKTsKKwkJY2ZnX2FwcGVuZF90bHYoYnVmLCBUSVBDX1RMVl9OT0RFX0lORk8sIAorCQkJICAgICAgICZub2RlX2luZm8sIHNpemVvZihub2RlX2luZm8pKTsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqbm9kZV9nZXRfbGlua3MoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSkKK3sKKwl1MzIgZG9tYWluOworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IG5vZGUgKm5fcHRyOworICAgICAgICBzdHJ1Y3QgdGlwY19saW5rX2luZm8gbGlua19pbmZvOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9ORVRfQUREUikpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwlkb21haW4gPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJZG9tYWluID0gbnRvaGwoZG9tYWluKTsKKwlpZiAoIWFkZHJfZG9tYWluX3ZhbGlkKGRvbWFpbikpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKKwkJCQkJICAgICAgIiAobmV0d29yayBhZGRyZXNzKSIpOworCisgICAgICAgIGlmICghbm9kZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNmZ19yZXBseV9ub25lKCk7CisKKwkvKiBGb3Igbm93LCBnZXQgc3BhY2UgZm9yIDIgbGlua3MgdG8gYWxsIG90aGVyIG5vZGVzICsgYmNhc3QgbGluayAKKwkgICAod2lsbCBuZWVkIHRvIG1vZGlmeSB0aGlzIHdoZW4gc2xhdmUgbm9kZXMgYXJlIHN1cHBvcnRlZCAqLworCisJYnVmID0gY2ZnX3JlcGx5X2FsbG9jKFRMVl9TUEFDRShzaXplb2YobGlua19pbmZvKSkgKgorCQkJICAgICgyICogKHRpcGNfbWF4X25vZGVzIC0gMSkgKyAxKSk7CisJaWYgKCFidWYpCisJCXJldHVybiBOVUxMOworCisJLyogQWRkIFRMViBmb3IgYnJvYWRjYXN0IGxpbmsgKi8KKworICAgICAgICBsaW5rX2luZm8uZGVzdCA9IHRpcGNfb3duX2FkZHIgJiAweGZmZmZmMDA7CisJbGlua19pbmZvLmRlc3QgPSBodG9ubChsaW5rX2luZm8uZGVzdCk7CisgICAgICAgIGxpbmtfaW5mby51cCA9IGh0b25sKDEpOworICAgICAgICBzcHJpbnRmKGxpbmtfaW5mby5zdHIsIGJjX2xpbmtfbmFtZSk7CisJY2ZnX2FwcGVuZF90bHYoYnVmLCBUSVBDX1RMVl9MSU5LX0lORk8sICZsaW5rX2luZm8sIHNpemVvZihsaW5rX2luZm8pKTsKKworCS8qIEFkZCBUTFZzIGZvciBhbnkgb3RoZXIgbGlua3MgaW4gc2NvcGUgKi8KKworCWZvciAobl9wdHIgPSBub2Rlczsgbl9wdHI7IG5fcHRyID0gbl9wdHItPm5leHQpIHsKKyAgICAgICAgICAgICAgICB1MzIgaTsKKworCQlpZiAoIWluX3Njb3BlKGRvbWFpbiwgbl9wdHItPmFkZHIpKQorCQkJY29udGludWU7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbl9wdHItPmxpbmtzW2ldKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX2luZm8uZGVzdCA9IGh0b25sKG5fcHRyLT5hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfaW5mby51cCA9IGh0b25sKGxpbmtfaXNfdXAobl9wdHItPmxpbmtzW2ldKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkobGlua19pbmZvLnN0ciwgbl9wdHItPmxpbmtzW2ldLT5uYW1lKTsKKwkJCWNmZ19hcHBlbmRfdGx2KGJ1ZiwgVElQQ19UTFZfTElOS19JTkZPLCAKKwkJCQkgICAgICAgJmxpbmtfaW5mbywgc2l6ZW9mKGxpbmtfaW5mbykpOworICAgICAgICAgICAgICAgIH0KKwl9CisKKwlyZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbm9kZS5oIGIvbmV0L3RpcGMvbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOTQ0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9ub2RlLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBuZXQvdGlwYy9ub2RlLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBub2RlIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19OT0RFX0gKKyNkZWZpbmUgX1RJUENfTk9ERV9ICisKKyNpbmNsdWRlICJub2RlX3N1YnNjci5oIgorI2luY2x1ZGUgImFkZHIuaCIKKyNpbmNsdWRlICJjbHVzdGVyLmgiCisjaW5jbHVkZSAiYmVhcmVyLmgiCisKKy8qKgorICogc3RydWN0IG5vZGUgLSBUSVBDIG5vZGUgc3RydWN0dXJlCisgKiBAYWRkcjogbmV0d29yayBhZGRyZXNzIG9mIG5vZGUKKyAqIEBsb2NrOiBzcGlubG9jayBnb3Zlcm5pbmcgYWNjZXNzIHRvIHN0cnVjdHVyZQorICogQG93bmVyOiBwb2ludGVyIHRvIGNsdXN0ZXIgdGhhdCBub2RlIGJlbG9uZ3MgdG8KKyAqIEBuZXh0OiBwb2ludGVyIHRvIG5leHQgbm9kZSBpbiBzb3J0ZWQgbGlzdCBvZiBjbHVzdGVyJ3Mgbm9kZXMKKyAqIEBuc3ViOiBsaXN0IG9mICJub2RlIGRvd24iIHN1YnNjcmlwdGlvbnMgbW9uaXRvcmluZyBub2RlCisgKiBAYWN0aXZlX2xpbmtzOiBwb2ludGVycyB0byBhY3RpdmUgbGlua3MgdG8gbm9kZQorICogQGxpbmtzOiBwb2ludGVycyB0byBhbGwgbGlua3MgdG8gbm9kZQorICogQGxpbmtfY250OiBudW1iZXIgb2YgbGlua3MgdG8gbm9kZQorICogQHBlcm1pdF9jaGFuZ2VvdmVyOiBub24temVybyBpZiBub2RlIGhhcyByZWR1bmRhbnQgbGlua3MgdG8gdGhpcyBzeXN0ZW0KKyAqIEByb3V0ZXJzOiBiaXRtYXAgKHVzZWQgZm9yIG11bHRpY2x1c3RlciBjb21tdW5pY2F0aW9uKQorICogQGxhc3Rfcm91dGVyOiAodXNlZCBmb3IgbXVsdGljbHVzdGVyIGNvbW11bmljYXRpb24pCisgKiBAYmNsaW5rOiBicm9hZGNhc3QtcmVsYXRlZCBpbmZvCisgKiAgICBAc3VwcG9ydGVkOiBub24temVybyBpZiBub2RlIHN1cHBvcnRzIFRJUEMgYidjYXN0IGNhcGFiaWxpdHkKKyAqICAgIEBhY2tlZDogc2VxdWVuY2UgIyBvZiBsYXN0IG91dGJvdW5kIGInY2FzdCBtZXNzYWdlIGFja25vd2xlZGdlZCBieSBub2RlCisgKiAgICBAbGFzdF9pbjogc2VxdWVuY2UgIyBvZiBsYXN0IGluLXNlcXVlbmNlIGInY2FzdCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gbm9kZQorICogICAgQGdhcF9hZnRlcjogc2VxdWVuY2UgIyBvZiBsYXN0IG1lc3NhZ2Ugbm90IHJlcXVpcmluZyBhIE5BSyByZXF1ZXN0CisgKiAgICBAZ2FwX3RvOiBzZXF1ZW5jZSAjIG9mIGxhc3QgbWVzc2FnZSByZXF1aXJpbmcgYSBOQUsgcmVxdWVzdAorICogICAgQG5hY2tfc3luYzogY291bnRlciB0aGF0IGRldGVybWluZXMgd2hlbiBOQUsgcmVxdWVzdHMgc2hvdWxkIGJlIHNlbnQKKyAqICAgIEBkZWZlcnJlZF9oZWFkOiBvbGRlc3QgT09TIGInY2FzdCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gbm9kZQorICogICAgQGRlZmVycmVkX3RhaWw6IG5ld2VzdCBPT1MgYidjYXN0IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBub2RlCisgKiAgICBAZGVmcmFnbTogbGlzdCBvZiBwYXJ0aWFsbHkgcmVhc3NlbWJsZWQgYidjYXN0IG1lc3NhZ2UgZnJhZ21lbnRzIGZyb20gbm9kZQorICovCisgCitzdHJ1Y3Qgbm9kZSB7CisJdTMyIGFkZHI7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBjbHVzdGVyICpvd25lcjsKKwlzdHJ1Y3Qgbm9kZSAqbmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5zdWI7CisJc3RydWN0IGxpbmsgKmFjdGl2ZV9saW5rc1syXTsKKwlzdHJ1Y3QgbGluayAqbGlua3NbTUFYX0JFQVJFUlNdOworCWludCBsaW5rX2NudDsKKwlpbnQgcGVybWl0X2NoYW5nZW92ZXI7CisJdTMyIHJvdXRlcnNbNTEyLzMyXTsKKwlpbnQgbGFzdF9yb3V0ZXI7CisJc3RydWN0IHsKKwkJaW50IHN1cHBvcnRlZDsKKwkJdTMyIGFja2VkOworCQl1MzIgbGFzdF9pbjsKKwkJdTMyIGdhcF9hZnRlcjsgCisJCXUzMiBnYXBfdG87IAorCQl1MzIgbmFja19zeW5jOworCQlzdHJ1Y3Qgc2tfYnVmZiAqZGVmZXJyZWRfaGVhZDsKKwkJc3RydWN0IHNrX2J1ZmYgKmRlZmVycmVkX3RhaWw7CisJCXN0cnVjdCBza19idWZmICpkZWZyYWdtOworCX0gYmNsaW5rOworfTsKKworZXh0ZXJuIHN0cnVjdCBub2RlICpub2RlczsKK2V4dGVybiB1MzIgdGlwY19vd25fdGFnOworCitzdHJ1Y3Qgbm9kZSAqbm9kZV9jcmVhdGUodTMyIGFkZHIpOwordm9pZCBub2RlX2RlbGV0ZShzdHJ1Y3Qgbm9kZSAqbl9wdHIpOworc3RydWN0IG5vZGUgKm5vZGVfYXR0YWNoX2xpbmsoc3RydWN0IGxpbmsgKmxfcHRyKTsKK3ZvaWQgbm9kZV9kZXRhY2hfbGluayhzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHN0cnVjdCBsaW5rICpsX3B0cik7Cit2b2lkIG5vZGVfbGlua19kb3duKHN0cnVjdCBub2RlICpuX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKTsKK3ZvaWQgbm9kZV9saW5rX3VwKHN0cnVjdCBub2RlICpuX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKTsKK2ludCBub2RlX2hhc19hY3RpdmVfbGlua3Moc3RydWN0IG5vZGUgKm5fcHRyKTsKK2ludCBub2RlX2hhc19yZWR1bmRhbnRfbGlua3Moc3RydWN0IG5vZGUgKm5fcHRyKTsKK3UzMiBub2RlX3NlbGVjdF9yb3V0ZXIoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgcmVmKTsKK3N0cnVjdCBub2RlICpub2RlX3NlbGVjdF9uZXh0X2hvcCh1MzIgYWRkciwgdTMyIHNlbGVjdG9yKTsKK2ludCBub2RlX2lzX3VwKHN0cnVjdCBub2RlICpuX3B0cik7Cit2b2lkIG5vZGVfYWRkX3JvdXRlcihzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHUzMiByb3V0ZXIpOwordm9pZCBub2RlX3JlbW92ZV9yb3V0ZXIoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgcm91dGVyKTsKK3N0cnVjdCBza19idWZmICpub2RlX2dldF9saW5rcyhjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKTsKK3N0cnVjdCBza19idWZmICpub2RlX2dldF9ub2Rlcyhjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm9kZSAqbm9kZV9maW5kKHUzMiBhZGRyKQoreworCWlmIChsaWtlbHkoaW5fb3duX2NsdXN0ZXIoYWRkcikpKQorCQlyZXR1cm4gbG9jYWxfbm9kZXNbdGlwY19ub2RlKGFkZHIpXTsKKwllbHNlIGlmIChhZGRyX2RvbWFpbl92YWxpZChhZGRyKSkgeworCQlzdHJ1Y3QgY2x1c3RlciAqY19wdHIgPSBjbHVzdGVyX2ZpbmQoYWRkcik7CisKKwkJaWYgKGNfcHRyKQorCQkJcmV0dXJuIGNfcHRyLT5ub2Rlc1t0aXBjX25vZGUoYWRkcildOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm9kZSAqbm9kZV9zZWxlY3QodTMyIGFkZHIsIHUzMiBzZWxlY3RvcikKK3sKKwlpZiAobGlrZWx5KGluX293bl9jbHVzdGVyKGFkZHIpKSkKKwkJcmV0dXJuIGxvY2FsX25vZGVzW3RpcGNfbm9kZShhZGRyKV07CisJcmV0dXJuIG5vZGVfc2VsZWN0X25leHRfaG9wKGFkZHIsIHNlbGVjdG9yKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5vZGVfbG9jayhzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJc3Bpbl9sb2NrX2JoKCZuX3B0ci0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBub2RlX3VubG9jayhzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJc3Bpbl91bmxvY2tfYmgoJm5fcHRyLT5sb2NrKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ub2RlX3N1YnNjci5jIGIvbmV0L3RpcGMvbm9kZV9zdWJzY3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM3NTkyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbm9kZV9zdWJzY3IuYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogbmV0L3RpcGMvbm9kZV9zdWJzY3IuYzogVElQQyAibm9kZSBkb3duIiBzdWJzY3JpcHRpb24gaGFuZGxpbmcKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk1LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJub2RlX3N1YnNjci5oIgorI2luY2x1ZGUgIm5vZGUuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisKKy8qKgorICogbm9kZXN1Yl9zdWJzY3JpYmUgLSBjcmVhdGUgIm5vZGUgZG93biIgc3Vic2NyaXB0aW9uIGZvciBzcGVjaWZpZWQgbm9kZQorICovCisKK3ZvaWQgbm9kZXN1Yl9zdWJzY3JpYmUoc3RydWN0IG5vZGVfc3Vic2NyICpub2RlX3N1YiwgdTMyIGFkZHIsIAorCQkgICAgICAgdm9pZCAqdXNyX2hhbmRsZSwgbmV0X2V2X2hhbmRsZXIgaGFuZGxlX2Rvd24pCit7CisJbm9kZV9zdWItPm5vZGUgPSAwOworCWlmIChhZGRyID09IHRpcGNfb3duX2FkZHIpCisJCXJldHVybjsKKwlpZiAoIWFkZHJfbm9kZV92YWxpZChhZGRyKSkgeworCQl3YXJuKCJub2RlX3N1YnNjciB3aXRoIGlsbGVnYWwgJXhcbiIsIGFkZHIpOworCQlyZXR1cm47CisJfQorCisJbm9kZV9zdWItPmhhbmRsZV9ub2RlX2Rvd24gPSBoYW5kbGVfZG93bjsKKwlub2RlX3N1Yi0+dXNyX2hhbmRsZSA9IHVzcl9oYW5kbGU7CisJbm9kZV9zdWItPm5vZGUgPSBub2RlX2ZpbmQoYWRkcik7CisJYXNzZXJ0KG5vZGVfc3ViLT5ub2RlKTsKKwlub2RlX2xvY2sobm9kZV9zdWItPm5vZGUpOworCWxpc3RfYWRkX3RhaWwoJm5vZGVfc3ViLT5ub2Rlc3ViX2xpc3QsICZub2RlX3N1Yi0+bm9kZS0+bnN1Yik7CisJbm9kZV91bmxvY2sobm9kZV9zdWItPm5vZGUpOworfQorCisvKioKKyAqIG5vZGVzdWJfdW5zdWJzY3JpYmUgLSBjYW5jZWwgIm5vZGUgZG93biIgc3Vic2NyaXB0aW9uIChpZiBhbnkpCisgKi8KKwordm9pZCBub2Rlc3ViX3Vuc3Vic2NyaWJlKHN0cnVjdCBub2RlX3N1YnNjciAqbm9kZV9zdWIpCit7CisJaWYgKCFub2RlX3N1Yi0+bm9kZSkKKwkJcmV0dXJuOworCisJbm9kZV9sb2NrKG5vZGVfc3ViLT5ub2RlKTsKKwlsaXN0X2RlbF9pbml0KCZub2RlX3N1Yi0+bm9kZXN1Yl9saXN0KTsKKwlub2RlX3VubG9jayhub2RlX3N1Yi0+bm9kZSk7Cit9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ub2RlX3N1YnNjci5oIGIvbmV0L3RpcGMvbm9kZV9zdWJzY3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2I4N2FjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbm9kZV9zdWJzY3IuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogbmV0L3RpcGMvbm9kZV9zdWJzY3IuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDICJub2RlIGRvd24iIHN1YnNjcmlwdGlvbiBoYW5kbGluZworICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX05PREVfU1VCU0NSX0gKKyNkZWZpbmUgX1RJUENfTk9ERV9TVUJTQ1JfSAorCisjaW5jbHVkZSAiYWRkci5oIgorCit0eXBlZGVmIHZvaWQgKCpuZXRfZXZfaGFuZGxlcikgKHZvaWQgKnVzcl9oYW5kbGUpOworCisvKioKKyAqIHN0cnVjdCBub2RlX3N1YnNjciAtICJub2RlIGRvd24iIHN1YnNjcmlwdGlvbiBlbnRyeQorICogQG5vZGU6IHB0ciB0byBub2RlIHN0cnVjdHVyZSBvZiBpbnRlcmVzdCAob3IgTlVMTCwgaWYgbm9uZSkKKyAqIEBoYW5kbGVfbm9kZV9kb3duOiByb3V0aW5lIHRvIGludm9rZSB3aGVuIG5vZGUgZmFpbHMKKyAqIEB1c3JfaGFuZGxlOiBhcmd1bWVudCB0byBwYXNzIHRvIHJvdXRpbmUgd2hlbiBub2RlIGZhaWxzCisgKiBAbm9kZXN1Yl9saXN0OiBhZGphY2VudCBlbnRyaWVzIGluIGxpc3Qgb2Ygc3Vic2NyaXB0aW9ucyBmb3IgdGhlIG5vZGUKKyAqLworCitzdHJ1Y3Qgbm9kZV9zdWJzY3IgeworCXN0cnVjdCBub2RlICpub2RlOworCW5ldF9ldl9oYW5kbGVyIGhhbmRsZV9ub2RlX2Rvd247CisJdm9pZCAqdXNyX2hhbmRsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGVzdWJfbGlzdDsKK307CisKK3ZvaWQgbm9kZXN1Yl9zdWJzY3JpYmUoc3RydWN0IG5vZGVfc3Vic2NyICpub2RlX3N1YiwgdTMyIGFkZHIsCisJCSAgICAgICB2b2lkICp1c3JfaGFuZGxlLCBuZXRfZXZfaGFuZGxlciBoYW5kbGVfZG93bik7Cit2b2lkIG5vZGVzdWJfdW5zdWJzY3JpYmUoc3RydWN0IG5vZGVfc3Vic2NyICpub2RlX3N1Yik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvcG9ydC5jIGIvbmV0L3RpcGMvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Y2FjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9wb3J0LmMKQEAgLTAsMCArMSwxNzA4IEBACisvKgorICogbmV0L3RpcGMvcG9ydC5jOiBUSVBDIHBvcnQgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTItMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgImFkZHIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAibm9kZS5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisjaW5jbHVkZSAidXNlcl9yZWcuaCIKKyNpbmNsdWRlICJtc2cuaCIKKyNpbmNsdWRlICJiY2FzdC5oIgorCisvKiBDb25uZWN0aW9uIG1hbmFnZW1lbnQ6ICovCisjZGVmaW5lIFBST0JJTkdfSU5URVJWQUwgMzYwMDAwMAkvKiBbbXNdID0+IDEgaCAqLworI2RlZmluZSBDT05GSVJNRUQgMAorI2RlZmluZSBQUk9CSU5HIDEKKworI2RlZmluZSBNQVhfUkVKRUNUX1NJWkUgMTAyNAorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKm1zZ19xdWV1ZV9oZWFkID0gMDsKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbXNnX3F1ZXVlX3RhaWwgPSAwOworCitzcGlubG9ja190IHBvcnRfbGlzdF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIHNwaW5sb2NrX3QgcXVldWVfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKworTElTVF9IRUFEKHBvcnRzKTsKK3N0YXRpYyB2b2lkIHBvcnRfaGFuZGxlX25vZGVfZG93bih1bnNpZ25lZCBsb25nIHJlZik7CitzdGF0aWMgc3RydWN0IHNrX2J1ZmYqIHBvcnRfYnVpbGRfc2VsZl9hYm9ydF9tc2coc3RydWN0IHBvcnQgKix1MzIgZXJyKTsKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiogcG9ydF9idWlsZF9wZWVyX2Fib3J0X21zZyhzdHJ1Y3QgcG9ydCAqLHUzMiBlcnIpOworc3RhdGljIHZvaWQgcG9ydF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgcmVmKTsKKworCitzdGF0aWMgaW5saW5lIHUzMiBwb3J0X3BlZXJub2RlKHN0cnVjdCBwb3J0ICpwX3B0cikKK3sKKwlyZXR1cm4gbXNnX2Rlc3Rub2RlKCZwX3B0ci0+cHVibC5waGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcG9ydF9wZWVycG9ydChzdHJ1Y3QgcG9ydCAqcF9wdHIpCit7CisJcmV0dXJuIG1zZ19kZXN0cG9ydCgmcF9wdHItPnB1YmwucGhkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHBvcnRfb3V0X3NlcW5vKHN0cnVjdCBwb3J0ICpwX3B0cikKK3sKKwlyZXR1cm4gbXNnX3RyYW5zcF9zZXFubygmcF9wdHItPnB1YmwucGhkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwb3J0X3NldF9vdXRfc2Vxbm8oc3RydWN0IHBvcnQgKnBfcHRyLCB1MzIgc2Vxbm8pIAoreworCW1zZ19zZXRfdHJhbnNwX3NlcW5vKCZwX3B0ci0+cHVibC5waGRyLHNlcW5vKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBvcnRfaW5jcl9vdXRfc2Vxbm8oc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXN0cnVjdCB0aXBjX21zZyAqbSA9ICZwX3B0ci0+cHVibC5waGRyOworCisJaWYgKGxpa2VseSghbXNnX3JvdXRlZChtKSkpCisJCXJldHVybjsKKwltc2dfc2V0X3RyYW5zcF9zZXFubyhtLCAobXNnX3RyYW5zcF9zZXFubyhtKSArIDEpKTsKK30KKworLyoqCisgKiB0aXBjX211bHRpY2FzdCAtIHNlbmQgYSBtdWx0aWNhc3QgbWVzc2FnZSB0byBsb2NhbCBhbmQgcmVtb3RlIGRlc3RpbmF0aW9ucworICovCisKK2ludCB0aXBjX211bHRpY2FzdCh1MzIgcmVmLCBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqc2VxLCB1MzIgZG9tYWluLAorCQkgICB1MzIgbnVtX3NlY3QsIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QpCit7CisJc3RydWN0IHRpcGNfbXNnICpoZHI7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqaWJ1ZiA9IE5VTEw7CisJc3RydWN0IHBvcnRfbGlzdCBkcG9ydHMgPSB7MCwgTlVMTCwgfTsKKwlzdHJ1Y3QgcG9ydCAqb3BvcnQgPSBwb3J0X2RlcmVmKHJlZik7CisJaW50IGV4dF90YXJnZXRzOworCWludCByZXM7CisKKwlpZiAodW5saWtlbHkoIW9wb3J0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBDcmVhdGUgbXVsdGljYXN0IG1lc3NhZ2UgKi8KKworCWhkciA9ICZvcG9ydC0+cHVibC5waGRyOworCW1zZ19zZXRfdHlwZShoZHIsIFRJUENfTUNBU1RfTVNHKTsKKwltc2dfc2V0X25hbWV0eXBlKGhkciwgc2VxLT50eXBlKTsKKwltc2dfc2V0X25hbWVsb3dlcihoZHIsIHNlcS0+bG93ZXIpOworCW1zZ19zZXRfbmFtZXVwcGVyKGhkciwgc2VxLT51cHBlcik7CisJbXNnX3NldF9oZHJfc3ooaGRyLCBNQ0FTVF9IX1NJWkUpOworCXJlcyA9IG1zZ19idWlsZChoZHIsIG1zZ19zZWN0LCBudW1fc2VjdCwgTUFYX01TR19TSVpFLAorCQkJIW9wb3J0LT51c2VyX3BvcnQsICZidWYpOworCWlmICh1bmxpa2VseSghYnVmKSkKKwkJcmV0dXJuIHJlczsKKworCS8qIEZpZ3VyZSBvdXQgd2hlcmUgdG8gc2VuZCBtdWx0aWNhc3QgbWVzc2FnZSAqLworCisJZXh0X3RhcmdldHMgPSBuYW1ldGJsX21jX3RyYW5zbGF0ZShzZXEtPnR5cGUsIHNlcS0+bG93ZXIsIHNlcS0+dXBwZXIsCisJCQkJCSAgIFRJUENfTk9ERV9TQ09QRSwgJmRwb3J0cyk7CisJCisJLyogU2VuZCBtZXNzYWdlIHRvIGRlc3RpbmF0aW9ucyAoZHVwbGljYXRlIGl0IG9ubHkgaWYgbmVjZXNzYXJ5KSAqLyAKKworCWlmIChleHRfdGFyZ2V0cykgeworCQlpZiAoZHBvcnRzLmNvdW50ICE9IDApIHsKKwkJCWlidWYgPSBza2JfY29weShidWYsIEdGUF9BVE9NSUMpOworCQkJaWYgKGlidWYgPT0gTlVMTCkgeworCQkJCXBvcnRfbGlzdF9mcmVlKCZkcG9ydHMpOworCQkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0KKwkJcmVzID0gYmNsaW5rX3NlbmRfbXNnKGJ1Zik7CisJCWlmICgocmVzIDwgMCkgJiYgKGRwb3J0cy5jb3VudCAhPSAwKSkgeworCQkJYnVmX2Rpc2NhcmQoaWJ1Zik7CisJCX0KKwl9IGVsc2UgeworCQlpYnVmID0gYnVmOworCX0KKworCWlmIChyZXMgPj0gMCkgeworCQlpZiAoaWJ1ZikKKwkJCXBvcnRfcmVjdl9tY2FzdChpYnVmLCAmZHBvcnRzKTsKKwl9IGVsc2UgeworCQlwb3J0X2xpc3RfZnJlZSgmZHBvcnRzKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBwb3J0X3JlY3ZfbWNhc3QgLSBkZWxpdmVyIG11bHRpY2FzdCBtZXNzYWdlIHRvIGFsbCBkZXN0aW5hdGlvbiBwb3J0cworICogCisgKiBJZiB0aGVyZSBpcyBubyBwb3J0IGxpc3QsIHBlcmZvcm0gYSBsb29rdXAgdG8gY3JlYXRlIG9uZQorICovCisKK3ZvaWQgcG9ydF9yZWN2X21jYXN0KHN0cnVjdCBza19idWZmICpidWYsIHN0cnVjdCBwb3J0X2xpc3QgKmRwKQoreworCXN0cnVjdCB0aXBjX21zZyogbXNnOworCXN0cnVjdCBwb3J0X2xpc3QgZHBvcnRzID0gezAsIE5VTEwsIH07CisJc3RydWN0IHBvcnRfbGlzdCAqaXRlbSA9IGRwOworCWludCBjbnQgPSAwOworCisJYXNzZXJ0KGJ1Zik7CisJbXNnID0gYnVmX21zZyhidWYpOworCisJLyogQ3JlYXRlIGRlc3RpbmF0aW9uIHBvcnQgbGlzdCwgaWYgb25lIHdhc24ndCBzdXBwbGllZCAqLworCisJaWYgKGRwID09IE5VTEwpIHsKKwkJbmFtZXRibF9tY190cmFuc2xhdGUobXNnX25hbWV0eXBlKG1zZyksCisJCQkJICAgICBtc2dfbmFtZWxvd2VyKG1zZyksCisJCQkJICAgICBtc2dfbmFtZXVwcGVyKG1zZyksCisJCQkJICAgICBUSVBDX0NMVVNURVJfU0NPUEUsCisJCQkJICAgICAmZHBvcnRzKTsKKwkJaXRlbSA9IGRwID0gJmRwb3J0czsKKwl9CisKKwkvKiBEZWxpdmVyIGEgY29weSBvZiBtZXNzYWdlIHRvIGVhY2ggZGVzdGluYXRpb24gcG9ydCAqLworCisJaWYgKGRwLT5jb3VudCAhPSAwKSB7CisJCWlmIChkcC0+Y291bnQgPT0gMSkgeworCQkJbXNnX3NldF9kZXN0cG9ydChtc2csIGRwLT5wb3J0c1swXSk7CisJCQlwb3J0X3JlY3ZfbXNnKGJ1Zik7CisJCQlwb3J0X2xpc3RfZnJlZShkcCk7CisJCQlyZXR1cm47CisJCX0KKwkJZm9yICg7IGNudCA8IGRwLT5jb3VudDsgY250KyspIHsKKwkJCWludCBpbmRleCA9IGNudCAlIFBMU0laRTsKKwkJCXN0cnVjdCBza19idWZmICpiID0gc2tiX2Nsb25lKGJ1ZiwgR0ZQX0FUT01JQyk7CisKKwkJCWlmIChiID09IE5VTEwpIHsKKwkJCQl3YXJuKCJCdWZmZXIgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJCQltc2dfZGJnKG1zZywgIkxPU1Q6Iik7CisJCQkJZ290byBleGl0OworCQkJfQorCQkJaWYgKChpbmRleCA9PSAwKSAmJiAoY250ICE9IDApKSB7CisJCQkJaXRlbSA9IGl0ZW0tPm5leHQ7CisJCQl9CisJCQltc2dfc2V0X2Rlc3Rwb3J0KGJ1Zl9tc2coYiksaXRlbS0+cG9ydHNbaW5kZXhdKTsKKwkJCXBvcnRfcmVjdl9tc2coYik7CisJCX0KKwl9CitleGl0OgorCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJcG9ydF9saXN0X2ZyZWUoZHApOworfQorCisvKioKKyAqIHRpcGNfY3JlYXRlcG9ydF9yYXcgLSBjcmVhdGUgYSBuYXRpdmUgVElQQyBwb3J0CisgKiAKKyAqIFJldHVybnMgbG9jYWwgcG9ydCByZWZlcmVuY2UKKyAqLworCit1MzIgdGlwY19jcmVhdGVwb3J0X3Jhdyh2b2lkICp1c3JfaGFuZGxlLAorCQkJdTMyICgqZGlzcGF0Y2hlcikoc3RydWN0IHRpcGNfcG9ydCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKSwKKwkJCXZvaWQgKCp3YWtldXApKHN0cnVjdCB0aXBjX3BvcnQgKiksCisJCQljb25zdCB1MzIgaW1wb3J0YW5jZSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJdTMyIHJlZjsKKworCXBfcHRyID0ga21hbGxvYyhzaXplb2YoKnBfcHRyKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBfcHRyID09IE5VTEwpIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBjcmVhdGUgcG9ydFxuIik7CisJCXJldHVybiAwOworCX0KKwltZW1zZXQocF9wdHIsIDAsIHNpemVvZigqcF9wdHIpKTsKKwlyZWYgPSByZWZfYWNxdWlyZShwX3B0ciwgJnBfcHRyLT5wdWJsLmxvY2spOworCWlmICghcmVmKSB7CisJCXdhcm4oIlJlZmVyZW5jZSBUYWJsZSBFeGhhdXN0ZWRcbiIpOworCQlrZnJlZShwX3B0cik7CisJCXJldHVybiAwOworCX0KKworCXBvcnRfbG9jayhyZWYpOworCXBfcHRyLT5wdWJsLnJlZiA9IHJlZjsKKwltc2cgPSAmcF9wdHItPnB1YmwucGhkcjsKKwltc2dfaW5pdChtc2csIERBVEFfTE9XLCBUSVBDX05BTUVEX01TRywgVElQQ19PSywgTE9OR19IX1NJWkUsIDApOworCW1zZ19zZXRfb3JpZ25vZGUobXNnLCB0aXBjX293bl9hZGRyKTsKKwltc2dfc2V0X3ByZXZub2RlKG1zZywgdGlwY19vd25fYWRkcik7CisJbXNnX3NldF9vcmlncG9ydChtc2csIHJlZik7CisJbXNnX3NldF9pbXBvcnRhbmNlKG1zZyxpbXBvcnRhbmNlKTsKKwlwX3B0ci0+bGFzdF9pbl9zZXFubyA9IDQxOworCXBfcHRyLT5zZW50ID0gMTsKKwlwX3B0ci0+cHVibC51c3JfaGFuZGxlID0gdXNyX2hhbmRsZTsKKwlJTklUX0xJU1RfSEVBRCgmcF9wdHItPndhaXRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnBfcHRyLT5zdWJzY3JpcHRpb24ubm9kZXN1Yl9saXN0KTsKKwlwX3B0ci0+Y29uZ2VzdGVkX2xpbmsgPSAwOworCXBfcHRyLT5tYXhfcGt0ID0gTUFYX1BLVF9ERUZBVUxUOworCXBfcHRyLT5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjsKKwlwX3B0ci0+d2FrZXVwID0gd2FrZXVwOworCXBfcHRyLT51c2VyX3BvcnQgPSAwOworCWtfaW5pdF90aW1lcigmcF9wdHItPnRpbWVyLCAoSGFuZGxlcilwb3J0X3RpbWVvdXQsIHJlZik7CisJc3Bpbl9sb2NrX2JoKCZwb3J0X2xpc3RfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnBfcHRyLT5wdWJsaWNhdGlvbnMpOworCUlOSVRfTElTVF9IRUFEKCZwX3B0ci0+cG9ydF9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZwX3B0ci0+cG9ydF9saXN0LCAmcG9ydHMpOworCXNwaW5fdW5sb2NrX2JoKCZwb3J0X2xpc3RfbG9jayk7CisJcG9ydF91bmxvY2socF9wdHIpOworCXJldHVybiByZWY7Cit9CisKK2ludCB0aXBjX2RlbGV0ZXBvcnQodTMyIHJlZikKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IDA7CisKKwl0aXBjX3dpdGhkcmF3KHJlZiwgMCwgMCk7CisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWZfZGlzY2FyZChyZWYpOworCXBvcnRfdW5sb2NrKHBfcHRyKTsKKworCWtfY2FuY2VsX3RpbWVyKCZwX3B0ci0+dGltZXIpOworCWlmIChwX3B0ci0+cHVibC5jb25uZWN0ZWQpIHsKKwkJYnVmID0gcG9ydF9idWlsZF9wZWVyX2Fib3J0X21zZyhwX3B0ciwgVElQQ19FUlJfTk9fUE9SVCk7CisJCW5vZGVzdWJfdW5zdWJzY3JpYmUoJnBfcHRyLT5zdWJzY3JpcHRpb24pOworCX0KKwlpZiAocF9wdHItPnVzZXJfcG9ydCkgeworCQlyZWdfcmVtb3ZlX3BvcnQocF9wdHItPnVzZXJfcG9ydCk7CisJCWtmcmVlKHBfcHRyLT51c2VyX3BvcnQpOworCX0KKworCXNwaW5fbG9ja19iaCgmcG9ydF9saXN0X2xvY2spOworCWxpc3RfZGVsKCZwX3B0ci0+cG9ydF9saXN0KTsKKwlsaXN0X2RlbCgmcF9wdHItPndhaXRfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnBvcnRfbGlzdF9sb2NrKTsKKwlrX3Rlcm1fdGltZXIoJnBfcHRyLT50aW1lcik7CisJa2ZyZWUocF9wdHIpOworCWRiZygiRGVsZXRlZCBwb3J0ICV1XG4iLCByZWYpOworCW5ldF9yb3V0ZV9tc2coYnVmKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworLyoqCisgKiB0aXBjX2dldF9wb3J0KCkgLSByZXR1cm4gcG9ydCBhc3NvY2lhdGVkIHdpdGggJ3JlZicKKyAqIAorICogTm90ZTogUG9ydCBpcyBub3QgbG9ja2VkLgorICovCisKK3N0cnVjdCB0aXBjX3BvcnQgKnRpcGNfZ2V0X3BvcnQoY29uc3QgdTMyIHJlZikKK3sKKwlyZXR1cm4gKHN0cnVjdCB0aXBjX3BvcnQgKilyZWZfZGVyZWYocmVmKTsKK30KKworLyoqCisgKiB0aXBjX2dldF9oYW5kbGUgLSByZXR1cm4gdXNlciBoYW5kbGUgYXNzb2NpYXRlZCB0byBwb3J0ICdyZWYnCisgKi8KKwordm9pZCAqdGlwY19nZXRfaGFuZGxlKGNvbnN0IHUzMiByZWYpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXZvaWQgKiBoYW5kbGU7CisKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAwOworCWhhbmRsZSA9IHBfcHRyLT5wdWJsLnVzcl9oYW5kbGU7CisJcG9ydF91bmxvY2socF9wdHIpOworCXJldHVybiBoYW5kbGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBvcnRfdW5yZWxpYWJsZShzdHJ1Y3QgcG9ydCAqcF9wdHIpCit7CisJcmV0dXJuIG1zZ19zcmNfZHJvcHBhYmxlKCZwX3B0ci0+cHVibC5waGRyKTsKK30KKworaW50IHRpcGNfcG9ydHVucmVsaWFibGUodTMyIHJlZiwgdW5zaWduZWQgaW50ICppc3VucmVsaWFibGUpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCQorCXBfcHRyID0gcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJKmlzdW5yZWxpYWJsZSA9IHBvcnRfdW5yZWxpYWJsZShwX3B0cik7CisJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCB0aXBjX3NldF9wb3J0dW5yZWxpYWJsZSh1MzIgcmVmLCB1bnNpZ25lZCBpbnQgaXN1bnJlbGlhYmxlKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwkKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCW1zZ19zZXRfc3JjX2Ryb3BwYWJsZSgmcF9wdHItPnB1YmwucGhkciwgKGlzdW5yZWxpYWJsZSAhPSAwKSk7CisJcG9ydF91bmxvY2socF9wdHIpOworCXJldHVybiBUSVBDX09LOworfQorCitzdGF0aWMgaW5saW5lIGludCBwb3J0X3VucmV0dXJuYWJsZShzdHJ1Y3QgcG9ydCAqcF9wdHIpCit7CisJcmV0dXJuIG1zZ19kZXN0X2Ryb3BwYWJsZSgmcF9wdHItPnB1YmwucGhkcik7Cit9CisKK2ludCB0aXBjX3BvcnR1bnJldHVybmFibGUodTMyIHJlZiwgdW5zaWduZWQgaW50ICppc3VucmVqZWN0YWJsZSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJCisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqaXN1bnJlamVjdGFibGUgPSBwb3J0X3VucmV0dXJuYWJsZShwX3B0cik7CisJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCB0aXBjX3NldF9wb3J0dW5yZXR1cm5hYmxlKHUzMiByZWYsIHVuc2lnbmVkIGludCBpc3VucmVqZWN0YWJsZSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJCisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltc2dfc2V0X2Rlc3RfZHJvcHBhYmxlKCZwX3B0ci0+cHVibC5waGRyLCAoaXN1bnJlamVjdGFibGUgIT0gMCkpOworCXBvcnRfdW5sb2NrKHBfcHRyKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworLyogCisgKiBwb3J0X2J1aWxkX3Byb3RvX21zZygpOiBidWlsZCBhIHBvcnQgbGV2ZWwgcHJvdG9jb2wgCisgKiBvciBhIGNvbm5lY3Rpb24gYWJvcnRpb24gbWVzc2FnZS4gQ2FsbGVkIHdpdGggCisgKiB0aXBjX3BvcnQgbG9jayBvbi4KKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmICpwb3J0X2J1aWxkX3Byb3RvX21zZyh1MzIgZGVzdHBvcnQsIHUzMiBkZXN0bm9kZSwKKwkJCQkJICAgIHUzMiBvcmlncG9ydCwgdTMyIG9yaWdub2RlLAorCQkJCQkgICAgdTMyIHVzciwgdTMyIHR5cGUsIHUzMiBlcnIsIAorCQkJCQkgICAgdTMyIHNlcW5vLCB1MzIgYWNrKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJCisJYnVmID0gYnVmX2FjcXVpcmUoTE9OR19IX1NJWkUpOworCWlmIChidWYpIHsKKwkJbXNnID0gYnVmX21zZyhidWYpOworCQltc2dfaW5pdChtc2csIHVzciwgdHlwZSwgZXJyLCBMT05HX0hfU0laRSwgZGVzdG5vZGUpOworCQltc2dfc2V0X2Rlc3Rwb3J0KG1zZywgZGVzdHBvcnQpOworCQltc2dfc2V0X29yaWdwb3J0KG1zZywgb3JpZ3BvcnQpOworCQltc2dfc2V0X2Rlc3Rub2RlKG1zZywgZGVzdG5vZGUpOworCQltc2dfc2V0X29yaWdub2RlKG1zZywgb3JpZ25vZGUpOworCQltc2dfc2V0X3RyYW5zcF9zZXFubyhtc2csIHNlcW5vKTsKKwkJbXNnX3NldF9tc2djbnQobXNnLCBhY2spOworCQltc2dfZGJnKG1zZywgIlBPUlQ+U0VORD46Iik7CisJfQorCXJldHVybiBidWY7Cit9CisKK2ludCB0aXBjX3NldF9tc2dfb3B0aW9uKHN0cnVjdCB0aXBjX3BvcnQgKnRwX3B0ciwgY29uc3QgY2hhciAqb3B0LCBjb25zdCB1MzIgc3opCit7CisJbXNnX2V4cGFuZCgmdHBfcHRyLT5waGRyLCBtc2dfZGVzdG5vZGUoJnRwX3B0ci0+cGhkcikpOworCW1zZ19zZXRfb3B0aW9ucygmdHBfcHRyLT5waGRyLCBvcHQsIHN6KTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworaW50IHRpcGNfcmVqZWN0X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgZXJyKQoreworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCXN0cnVjdCBza19idWZmICpyYnVmOworCXN0cnVjdCB0aXBjX21zZyAqcm1zZzsKKwlpbnQgaGRyX3N6OworCXUzMiBpbXAgPSBtc2dfaW1wb3J0YW5jZShtc2cpOworCXUzMiBkYXRhX3N6ID0gbXNnX2RhdGFfc3oobXNnKTsKKworCWlmIChkYXRhX3N6ID4gTUFYX1JFSkVDVF9TSVpFKQorCQlkYXRhX3N6ID0gTUFYX1JFSkVDVF9TSVpFOworCWlmIChtc2dfY29ubmVjdGVkKG1zZykgJiYgKGltcCA8IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkpCisJCWltcCsrOworCW1zZ19kYmcobXNnLCAicG9ydC0+cmVqOiAiKTsKKworCS8qIGRpc2NhcmQgcmVqZWN0ZWQgbWVzc2FnZSBpZiBpdCBzaG91bGRuJ3QgYmUgcmV0dXJuZWQgdG8gc2VuZGVyICovCisJaWYgKG1zZ19lcnJjb2RlKG1zZykgfHwgbXNnX2Rlc3RfZHJvcHBhYmxlKG1zZykpIHsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJcmV0dXJuIGRhdGFfc3o7CisJfQorCisJLyogY29uc3RydWN0IHJlamVjdGVkIG1lc3NhZ2UgKi8KKwlpZiAobXNnX21jYXN0KG1zZykpCisJCWhkcl9zeiA9IE1DQVNUX0hfU0laRTsKKwllbHNlCisJCWhkcl9zeiA9IExPTkdfSF9TSVpFOworCXJidWYgPSBidWZfYWNxdWlyZShkYXRhX3N6ICsgaGRyX3N6KTsKKwlpZiAocmJ1ZiA9PSBOVUxMKSB7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCXJldHVybiBkYXRhX3N6OworCX0KKwlybXNnID0gYnVmX21zZyhyYnVmKTsKKwltc2dfaW5pdChybXNnLCBpbXAsIG1zZ190eXBlKG1zZyksIGVyciwgaGRyX3N6LCBtc2dfb3JpZ25vZGUobXNnKSk7CisJbXNnX3NldF9kZXN0cG9ydChybXNnLCBtc2dfb3JpZ3BvcnQobXNnKSk7CisJbXNnX3NldF9wcmV2bm9kZShybXNnLCB0aXBjX293bl9hZGRyKTsKKwltc2dfc2V0X29yaWdwb3J0KHJtc2csIG1zZ19kZXN0cG9ydChtc2cpKTsKKwlpZiAobXNnX3Nob3J0KG1zZykpCisJCW1zZ19zZXRfb3JpZ25vZGUocm1zZywgdGlwY19vd25fYWRkcik7CisJZWxzZQorCQltc2dfc2V0X29yaWdub2RlKHJtc2csIG1zZ19kZXN0bm9kZShtc2cpKTsKKwltc2dfc2V0X3NpemUocm1zZywgZGF0YV9zeiArIGhkcl9zeik7IAorCW1zZ19zZXRfbmFtZXR5cGUocm1zZywgbXNnX25hbWV0eXBlKG1zZykpOworCW1zZ19zZXRfbmFtZWluc3Qocm1zZywgbXNnX25hbWVpbnN0KG1zZykpOworCW1lbWNweShyYnVmLT5kYXRhICsgaGRyX3N6LCBtc2dfZGF0YShtc2cpLCBkYXRhX3N6KTsKKworCS8qIHNlbmQgc2VsZi1hYm9ydCBtZXNzYWdlIHdoZW4gcmVqZWN0aW5nIG9uIGEgY29ubmVjdGVkIHBvcnQgKi8KKwlpZiAobXNnX2Nvbm5lY3RlZChtc2cpKSB7CisJCXN0cnVjdCBza19idWZmICphYnVmID0gMDsKKwkJc3RydWN0IHBvcnQgKnBfcHRyID0gcG9ydF9sb2NrKG1zZ19kZXN0cG9ydChtc2cpKTsKKworCQlpZiAocF9wdHIpIHsKKwkJCWlmIChwX3B0ci0+cHVibC5jb25uZWN0ZWQpCisJCQkJYWJ1ZiA9IHBvcnRfYnVpbGRfc2VsZl9hYm9ydF9tc2cocF9wdHIsIGVycik7CisJCQlwb3J0X3VubG9jayhwX3B0cik7CisJCX0KKwkJbmV0X3JvdXRlX21zZyhhYnVmKTsKKwl9CisKKwkvKiBzZW5kIHJlamVjdGVkIG1lc3NhZ2UgKi8KKwlidWZfZGlzY2FyZChidWYpOworCW5ldF9yb3V0ZV9tc2cocmJ1Zik7CisJcmV0dXJuIGRhdGFfc3o7Cit9CisKK2ludCBwb3J0X3JlamVjdF9zZWN0aW9ucyhzdHJ1Y3QgcG9ydCAqcF9wdHIsIHN0cnVjdCB0aXBjX21zZyAqaGRyLAorCQkJIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsIHUzMiBudW1fc2VjdCwKKwkJCSBpbnQgZXJyKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJaW50IHJlczsKKworCXJlcyA9IG1zZ19idWlsZChoZHIsIG1zZ19zZWN0LCBudW1fc2VjdCwgTUFYX01TR19TSVpFLCAKKwkJCSFwX3B0ci0+dXNlcl9wb3J0LCAmYnVmKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIHJlczsKKworCXJldHVybiB0aXBjX3JlamVjdF9tc2coYnVmLCBlcnIpOworfQorCitzdGF0aWMgdm9pZCBwb3J0X3RpbWVvdXQodW5zaWduZWQgbG9uZyByZWYpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyID0gcG9ydF9sb2NrKHJlZik7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IDA7CisKKwlpZiAoIXBfcHRyIHx8ICFwX3B0ci0+cHVibC5jb25uZWN0ZWQpCisJCXJldHVybjsKKworCS8qIExhc3QgcHJvYmUgYW5zd2VyZWQgPyAqLworCWlmIChwX3B0ci0+cHJvYmluZ19zdGF0ZSA9PSBQUk9CSU5HKSB7CisJCWJ1ZiA9IHBvcnRfYnVpbGRfc2VsZl9hYm9ydF9tc2cocF9wdHIsIFRJUENfRVJSX05PX1BPUlQpOworCX0gZWxzZSB7CisJCWJ1ZiA9IHBvcnRfYnVpbGRfcHJvdG9fbXNnKHBvcnRfcGVlcnBvcnQocF9wdHIpLAorCQkJCQkgICBwb3J0X3BlZXJub2RlKHBfcHRyKSwKKwkJCQkJICAgcF9wdHItPnB1YmwucmVmLAorCQkJCQkgICB0aXBjX293bl9hZGRyLAorCQkJCQkgICBDT05OX01BTkFHRVIsCisJCQkJCSAgIENPTk5fUFJPQkUsCisJCQkJCSAgIFRJUENfT0ssIAorCQkJCQkgICBwb3J0X291dF9zZXFubyhwX3B0ciksCisJCQkJCSAgIDApOworCQlwb3J0X2luY3Jfb3V0X3NlcW5vKHBfcHRyKTsKKwkJcF9wdHItPnByb2Jpbmdfc3RhdGUgPSBQUk9CSU5HOworCQlrX3N0YXJ0X3RpbWVyKCZwX3B0ci0+dGltZXIsIHBfcHRyLT5wcm9iaW5nX2ludGVydmFsKTsKKwl9CisJcG9ydF91bmxvY2socF9wdHIpOworCW5ldF9yb3V0ZV9tc2coYnVmKTsKK30KKworCitzdGF0aWMgdm9pZCBwb3J0X2hhbmRsZV9ub2RlX2Rvd24odW5zaWduZWQgbG9uZyByZWYpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyID0gcG9ydF9sb2NrKHJlZik7CisJc3RydWN0IHNrX2J1ZmYqIGJ1ZiA9IDA7CisKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm47CisJYnVmID0gcG9ydF9idWlsZF9zZWxmX2Fib3J0X21zZyhwX3B0ciwgVElQQ19FUlJfTk9fTk9ERSk7CisJcG9ydF91bmxvY2socF9wdHIpOworCW5ldF9yb3V0ZV9tc2coYnVmKTsKK30KKworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnBvcnRfYnVpbGRfc2VsZl9hYm9ydF9tc2coc3RydWN0IHBvcnQgKnBfcHRyLCB1MzIgZXJyKQoreworCXUzMiBpbXAgPSBtc2dfaW1wb3J0YW5jZSgmcF9wdHItPnB1YmwucGhkcik7CisKKwlpZiAoIXBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisJaWYgKGltcCA8IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkKKwkJaW1wKys7CisJcmV0dXJuIHBvcnRfYnVpbGRfcHJvdG9fbXNnKHBfcHRyLT5wdWJsLnJlZiwKKwkJCQkgICAgdGlwY19vd25fYWRkciwKKwkJCQkgICAgcG9ydF9wZWVycG9ydChwX3B0ciksCisJCQkJICAgIHBvcnRfcGVlcm5vZGUocF9wdHIpLAorCQkJCSAgICBpbXAsCisJCQkJICAgIFRJUENfQ09OTl9NU0csCisJCQkJICAgIGVyciwgCisJCQkJICAgIHBfcHRyLT5sYXN0X2luX3NlcW5vICsgMSwKKwkJCQkgICAgMCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBza19idWZmICpwb3J0X2J1aWxkX3BlZXJfYWJvcnRfbXNnKHN0cnVjdCBwb3J0ICpwX3B0ciwgdTMyIGVycikKK3sKKwl1MzIgaW1wID0gbXNnX2ltcG9ydGFuY2UoJnBfcHRyLT5wdWJsLnBoZHIpOworCisJaWYgKCFwX3B0ci0+cHVibC5jb25uZWN0ZWQpCisJCXJldHVybiAwOworCWlmIChpbXAgPCBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UpCisJCWltcCsrOworCXJldHVybiBwb3J0X2J1aWxkX3Byb3RvX21zZyhwb3J0X3BlZXJwb3J0KHBfcHRyKSwKKwkJCQkgICAgcG9ydF9wZWVybm9kZShwX3B0ciksCisJCQkJICAgIHBfcHRyLT5wdWJsLnJlZiwKKwkJCQkgICAgdGlwY19vd25fYWRkciwKKwkJCQkgICAgaW1wLAorCQkJCSAgICBUSVBDX0NPTk5fTVNHLAorCQkJCSAgICBlcnIsIAorCQkJCSAgICBwb3J0X291dF9zZXFubyhwX3B0ciksCisJCQkJICAgIDApOworfQorCit2b2lkIHBvcnRfcmVjdl9wcm90b19tc2coc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwlzdHJ1Y3QgcG9ydCAqcF9wdHIgPSBwb3J0X2xvY2sobXNnX2Rlc3Rwb3J0KG1zZykpOworCXUzMiBlcnIgPSBUSVBDX09LOworCXN0cnVjdCBza19idWZmICpyX2J1ZiA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKmFib3J0X2J1ZiA9IDA7CisKKwltc2dfZGJnKG1zZywgIlBPUlQ8UkVDVjw6Iik7CisKKwlpZiAoIXBfcHRyKSB7CisJCWVyciA9IFRJUENfRVJSX05PX1BPUlQ7CisJfSBlbHNlIGlmIChwX3B0ci0+cHVibC5jb25uZWN0ZWQpIHsKKwkJaWYgKHBvcnRfcGVlcm5vZGUocF9wdHIpICE9IG1zZ19vcmlnbm9kZShtc2cpKQorCQkJZXJyID0gVElQQ19FUlJfTk9fUE9SVDsKKwkJaWYgKHBvcnRfcGVlcnBvcnQocF9wdHIpICE9IG1zZ19vcmlncG9ydChtc2cpKQorCQkJZXJyID0gVElQQ19FUlJfTk9fUE9SVDsKKwkJaWYgKCFlcnIgJiYgbXNnX3JvdXRlZChtc2cpKSB7CisJCQl1MzIgc2Vxbm8gPSBtc2dfdHJhbnNwX3NlcW5vKG1zZyk7CisJCQl1MzIgbXlubyA9ICArK3BfcHRyLT5sYXN0X2luX3NlcW5vOworCQkJaWYgKHNlcW5vICE9IG15bm8pIHsKKwkJCQllcnIgPSBUSVBDX0VSUl9OT19QT1JUOworCQkJCWFib3J0X2J1ZiA9IHBvcnRfYnVpbGRfc2VsZl9hYm9ydF9tc2cocF9wdHIsIGVycik7CisJCQl9CisJCX0KKwkJaWYgKG1zZ190eXBlKG1zZykgPT0gQ09OTl9BQ0spIHsKKwkJCWludCB3YWtldXAgPSBwb3J0X2Nvbmdlc3RlZChwX3B0cikgJiYgCisJCQkJICAgICBwX3B0ci0+cHVibC5jb25nZXN0ZWQgJiYKKwkJCQkgICAgIHBfcHRyLT53YWtldXA7CisJCQlwX3B0ci0+YWNrZWQgKz0gbXNnX21zZ2NudChtc2cpOworCQkJaWYgKHBvcnRfY29uZ2VzdGVkKHBfcHRyKSkKKwkJCQlnb3RvIGV4aXQ7CisJCQlwX3B0ci0+cHVibC5jb25nZXN0ZWQgPSAwOworCQkJaWYgKCF3YWtldXApCisJCQkJZ290byBleGl0OworCQkJcF9wdHItPndha2V1cCgmcF9wdHItPnB1YmwpOworCQkJZ290byBleGl0OworCQl9CisJfSBlbHNlIGlmIChwX3B0ci0+cHVibC5wdWJsaXNoZWQpIHsKKwkJZXJyID0gVElQQ19FUlJfTk9fUE9SVDsKKwl9CisJaWYgKGVycikgeworCQlyX2J1ZiA9IHBvcnRfYnVpbGRfcHJvdG9fbXNnKG1zZ19vcmlncG9ydChtc2cpLAorCQkJCQkgICAgIG1zZ19vcmlnbm9kZShtc2cpLCAKKwkJCQkJICAgICBtc2dfZGVzdHBvcnQobXNnKSwgCisJCQkJCSAgICAgdGlwY19vd25fYWRkciwKKwkJCQkJICAgICBEQVRBX0hJR0gsCisJCQkJCSAgICAgVElQQ19DT05OX01TRywKKwkJCQkJICAgICBlcnIsCisJCQkJCSAgICAgMCwKKwkJCQkJICAgICAwKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIEFsbCBpcyBmaW5lICovCisJaWYgKG1zZ190eXBlKG1zZykgPT0gQ09OTl9QUk9CRSkgeworCQlyX2J1ZiA9IHBvcnRfYnVpbGRfcHJvdG9fbXNnKG1zZ19vcmlncG9ydChtc2cpLCAKKwkJCQkJICAgICBtc2dfb3JpZ25vZGUobXNnKSwgCisJCQkJCSAgICAgbXNnX2Rlc3Rwb3J0KG1zZyksIAorCQkJCQkgICAgIHRpcGNfb3duX2FkZHIsIAorCQkJCQkgICAgIENPTk5fTUFOQUdFUiwKKwkJCQkJICAgICBDT05OX1BST0JFX1JFUExZLAorCQkJCQkgICAgIFRJUENfT0ssCisJCQkJCSAgICAgcG9ydF9vdXRfc2Vxbm8ocF9wdHIpLAorCQkJCQkgICAgIDApOworCX0KKwlwX3B0ci0+cHJvYmluZ19zdGF0ZSA9IENPTkZJUk1FRDsKKwlwb3J0X2luY3Jfb3V0X3NlcW5vKHBfcHRyKTsKK2V4aXQ6CisJaWYgKHBfcHRyKQorCQlwb3J0X3VubG9jayhwX3B0cik7CisJbmV0X3JvdXRlX21zZyhyX2J1Zik7CisJbmV0X3JvdXRlX21zZyhhYm9ydF9idWYpOworCWJ1Zl9kaXNjYXJkKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfcHJpbnQoc3RydWN0IHBvcnQgKnBfcHRyLCBzdHJ1Y3QgcHJpbnRfYnVmICpidWYsIGludCBmdWxsX2lkKQoreworICAgICAgICBzdHJ1Y3QgcHVibGljYXRpb24gKnB1Ymw7CisKKwlpZiAoZnVsbF9pZCkKKwkJdGlwY19wcmludGYoYnVmLCAiPCV1LiV1LiV1OiV1PjoiLCAKKwkJCSAgICB0aXBjX3pvbmUodGlwY19vd25fYWRkciksIHRpcGNfY2x1c3Rlcih0aXBjX293bl9hZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX25vZGUodGlwY19vd25fYWRkciksIHBfcHRyLT5wdWJsLnJlZik7CisJZWxzZQorCQl0aXBjX3ByaW50ZihidWYsICIlLTEwdToiLCBwX3B0ci0+cHVibC5yZWYpOworCisgICAgICAgIGlmIChwX3B0ci0+cHVibC5jb25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICB1MzIgZHBvcnQgPSBwb3J0X3BlZXJwb3J0KHBfcHRyKTsKKyAgICAgICAgICAgICAgICB1MzIgZGVzdG5vZGUgPSBwb3J0X3BlZXJub2RlKHBfcHRyKTsKKworICAgICAgICAgICAgICAgIHRpcGNfcHJpbnRmKGJ1ZiwgIiBjb25uZWN0ZWQgdG8gPCV1LiV1LiV1OiV1PiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwY196b25lKGRlc3Rub2RlKSwgdGlwY19jbHVzdGVyKGRlc3Rub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX25vZGUoZGVzdG5vZGUpLCBkcG9ydCk7CisgICAgICAgICAgICAgICAgaWYgKHBfcHRyLT5wdWJsLmNvbm5fdHlwZSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdGlwY19wcmludGYoYnVmLCAiIHZpYSB7JXUsJXV9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHRyLT5wdWJsLmNvbm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHRyLT5wdWJsLmNvbm5faW5zdGFuY2UpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBfcHRyLT5wdWJsLnB1Ymxpc2hlZCkgeworICAgICAgICAgICAgICAgIHRpcGNfcHJpbnRmKGJ1ZiwgIiBib3VuZCB0byIpOworICAgICAgICAgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkocHVibCwgJnBfcHRyLT5wdWJsaWNhdGlvbnMsIHBwb3J0X2xpc3QpIHsKKwkJCWlmIChwdWJsLT5sb3dlciA9PSBwdWJsLT51cHBlcikKKwkJCQl0aXBjX3ByaW50ZihidWYsICIgeyV1LCV1fSIsIHB1YmwtPnR5cGUsCisJCQkJCSAgICBwdWJsLT5sb3dlcik7CisJCQllbHNlCisJCQkJdGlwY19wcmludGYoYnVmLCAiIHsldSwldSwldX0iLCBwdWJsLT50eXBlLCAKKwkJCQkJICAgIHB1YmwtPmxvd2VyLCBwdWJsLT51cHBlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRpcGNfcHJpbnRmKGJ1ZiwgIlxuIik7Cit9CisKKyNkZWZpbmUgTUFYX1BPUlRfUVVFUlkgMzI3NjgKKworc3RydWN0IHNrX2J1ZmYgKnBvcnRfZ2V0X3BvcnRzKHZvaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGx2X2Rlc2MgKnJlcF90bHY7CisJc3RydWN0IHByaW50X2J1ZiBwYjsKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJaW50IHN0cl9sZW47CisKKwlidWYgPSBjZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKE1BWF9QT1JUX1FVRVJZKSk7CisJaWYgKCFidWYpCisJCXJldHVybiBOVUxMOworCXJlcF90bHYgPSAoc3RydWN0IHRsdl9kZXNjICopYnVmLT5kYXRhOworCisJcHJpbnRidWZfaW5pdCgmcGIsIFRMVl9EQVRBKHJlcF90bHYpLCBNQVhfUE9SVF9RVUVSWSk7CisJc3Bpbl9sb2NrX2JoKCZwb3J0X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwX3B0ciwgJnBvcnRzLCBwb3J0X2xpc3QpIHsKKwkJc3Bpbl9sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCQlwb3J0X3ByaW50KHBfcHRyLCAmcGIsIDApOworCQlzcGluX3VubG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnBvcnRfbGlzdF9sb2NrKTsKKwlzdHJfbGVuID0gcHJpbnRidWZfdmFsaWRhdGUoJnBiKTsKKworCXNrYl9wdXQoYnVmLCBUTFZfU1BBQ0Uoc3RyX2xlbikpOworCVRMVl9TRVQocmVwX3RsdiwgVElQQ19UTFZfVUxUUkFfU1RSSU5HLCBOVUxMLCBzdHJfbGVuKTsKKworCXJldHVybiBidWY7Cit9CisKKyNpZiAwCisKKyNkZWZpbmUgTUFYX1BPUlRfU1RBVFMgMjAwMAorCitzdHJ1Y3Qgc2tfYnVmZiAqcG9ydF9zaG93X3N0YXRzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpCit7CisJdTMyIHJlZjsKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGx2X2Rlc2MgKnJlcF90bHY7CisJc3RydWN0IHByaW50X2J1ZiBwYjsKKwlpbnQgc3RyX2xlbjsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfUE9SVF9SRUYpKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJcmVmID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOworCXJlZiA9IG50b2hsKHJlZik7CisKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKCJwb3J0IG5vdCBmb3VuZCIpOworCisJYnVmID0gY2ZnX3JlcGx5X2FsbG9jKFRMVl9TUEFDRShNQVhfUE9SVF9TVEFUUykpOworCWlmICghYnVmKSB7CisJCXBvcnRfdW5sb2NrKHBfcHRyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJlcF90bHYgPSAoc3RydWN0IHRsdl9kZXNjICopYnVmLT5kYXRhOworCisJcHJpbnRidWZfaW5pdCgmcGIsIFRMVl9EQVRBKHJlcF90bHYpLCBNQVhfUE9SVF9TVEFUUyk7CisJcG9ydF9wcmludChwX3B0ciwgJnBiLCAxKTsKKwkvKiBORUVEIFRPIEZJTEwgSU4gQURESVRJT05BTCBQT1JUIFNUQVRJU1RJQ1MgSEVSRSAqLworCXBvcnRfdW5sb2NrKHBfcHRyKTsKKwlzdHJfbGVuID0gcHJpbnRidWZfdmFsaWRhdGUoJnBiKTsKKworCXNrYl9wdXQoYnVmLCBUTFZfU1BBQ0Uoc3RyX2xlbikpOworCVRMVl9TRVQocmVwX3RsdiwgVElQQ19UTFZfVUxUUkFfU1RSSU5HLCBOVUxMLCBzdHJfbGVuKTsKKworCXJldHVybiBidWY7Cit9CisKKyNlbmRpZgorCit2b2lkIHBvcnRfcmVpbml0KHZvaWQpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCisJc3Bpbl9sb2NrX2JoKCZwb3J0X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwX3B0ciwgJnBvcnRzLCBwb3J0X2xpc3QpIHsKKwkJbXNnID0gJnBfcHRyLT5wdWJsLnBoZHI7CisJCWlmIChtc2dfb3JpZ25vZGUobXNnKSA9PSB0aXBjX293bl9hZGRyKQorCQkJYnJlYWs7CisJCW1zZ19zZXRfb3JpZ25vZGUobXNnLCB0aXBjX293bl9hZGRyKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnBvcnRfbGlzdF9sb2NrKTsKK30KKworCisvKgorICogIHBvcnRfZGlzcGF0Y2hlcl9zaWdoKCk6IFNpZ25hbCBoYW5kbGVyIGZvciBtZXNzYWdlcyBkZXN0aW5hdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHRpcGNfcG9ydCBpbnRlcmZhY2UuCisgKi8KKworc3RhdGljIHZvaWQgcG9ydF9kaXNwYXRjaGVyX3NpZ2godm9pZCAqZHVtbXkpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKworCXNwaW5fbG9ja19iaCgmcXVldWVfbG9jayk7CisJYnVmID0gbXNnX3F1ZXVlX2hlYWQ7CisJbXNnX3F1ZXVlX2hlYWQgPSAwOworCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKworCXdoaWxlIChidWYpIHsKKwkJc3RydWN0IHBvcnQgKnBfcHRyOworCQlzdHJ1Y3QgdXNlcl9wb3J0ICp1cF9wdHI7CisJCXN0cnVjdCB0aXBjX3BvcnRpZCBvcmlnOworCQlzdHJ1Y3QgdGlwY19uYW1lX3NlcSBkc2VxOworCQl2b2lkICp1c3JfaGFuZGxlOworCQlpbnQgY29ubmVjdGVkOworCQlpbnQgcHVibGlzaGVkOworCisJCXN0cnVjdCBza19idWZmICpuZXh0ID0gYnVmLT5uZXh0OworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJdTMyIGRyZWYgPSBtc2dfZGVzdHBvcnQobXNnKTsKKwkJCisJCXBfcHRyID0gcG9ydF9sb2NrKGRyZWYpOworCQlpZiAoIXBfcHRyKSB7CisJCQkvKiBQb3J0IGRlbGV0ZWQgd2hpbGUgbXNnIGluIHF1ZXVlICovCisJCQl0aXBjX3JlamVjdF9tc2coYnVmLCBUSVBDX0VSUl9OT19QT1JUKTsKKwkJCWJ1ZiA9IG5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlvcmlnLnJlZiA9IG1zZ19vcmlncG9ydChtc2cpOworCQlvcmlnLm5vZGUgPSBtc2dfb3JpZ25vZGUobXNnKTsKKwkJdXBfcHRyID0gcF9wdHItPnVzZXJfcG9ydDsKKwkJdXNyX2hhbmRsZSA9IHVwX3B0ci0+dXNyX2hhbmRsZTsKKwkJY29ubmVjdGVkID0gcF9wdHItPnB1YmwuY29ubmVjdGVkOworCQlwdWJsaXNoZWQgPSBwX3B0ci0+cHVibC5wdWJsaXNoZWQ7CisKKwkJaWYgKHVubGlrZWx5KG1zZ19lcnJjb2RlKG1zZykpKQorCQkJZ290byBlcnI7CisKKwkJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJCQorCQljYXNlIFRJUENfQ09OTl9NU0c6eworCQkJCXRpcGNfY29ubl9tc2dfZXZlbnQgY2IgPSB1cF9wdHItPmNvbm5fbXNnX2NiOworCQkJCXUzMiBwZWVyX3BvcnQgPSBwb3J0X3BlZXJwb3J0KHBfcHRyKTsKKwkJCQl1MzIgcGVlcl9ub2RlID0gcG9ydF9wZWVybm9kZShwX3B0cik7CisKKwkJCQlzcGluX3VubG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwkJCQlpZiAodW5saWtlbHkoIWNvbm5lY3RlZCkpIHsKKwkJCQkJaWYgKHVubGlrZWx5KHB1Ymxpc2hlZCkpCisJCQkJCQlnb3RvIHJlamVjdDsKKwkJCQkJdGlwY19jb25uZWN0MnBvcnQoZHJlZiwmb3JpZyk7CisJCQkJfQorCQkJCWlmICh1bmxpa2VseShtc2dfb3JpZ3BvcnQobXNnKSAhPSBwZWVyX3BvcnQpKQorCQkJCQlnb3RvIHJlamVjdDsKKwkJCQlpZiAodW5saWtlbHkobXNnX29yaWdub2RlKG1zZykgIT0gcGVlcl9ub2RlKSkKKwkJCQkJZ290byByZWplY3Q7CisJCQkJaWYgKHVubGlrZWx5KCFjYikpCisJCQkJCWdvdG8gcmVqZWN0OworCQkJCWlmICh1bmxpa2VseSgrK3BfcHRyLT5wdWJsLmNvbm5fdW5hY2tlZCA+PSAKKwkJCQkJICAgICBUSVBDX0ZMT1dfQ09OVFJPTF9XSU4pKQorCQkJCQl0aXBjX2Fja25vd2xlZGdlKGRyZWYsIAorCQkJCQkJCSBwX3B0ci0+cHVibC5jb25uX3VuYWNrZWQpOworCQkJCXNrYl9wdWxsKGJ1ZiwgbXNnX2hkcl9zeihtc2cpKTsKKwkJCQljYih1c3JfaGFuZGxlLCBkcmVmLCAmYnVmLCBtc2dfZGF0YShtc2cpLAorCQkJCSAgIG1zZ19kYXRhX3N6KG1zZykpOworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIFRJUENfRElSRUNUX01TRzp7CisJCQkJdGlwY19tc2dfZXZlbnQgY2IgPSB1cF9wdHItPm1zZ19jYjsKKworCQkJCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCQkJCWlmICh1bmxpa2VseShjb25uZWN0ZWQpKQorCQkJCQlnb3RvIHJlamVjdDsKKwkJCQlpZiAodW5saWtlbHkoIWNiKSkKKwkJCQkJZ290byByZWplY3Q7CisJCQkJc2tiX3B1bGwoYnVmLCBtc2dfaGRyX3N6KG1zZykpOworCQkJCWNiKHVzcl9oYW5kbGUsIGRyZWYsICZidWYsIG1zZ19kYXRhKG1zZyksIAorCQkJCSAgIG1zZ19kYXRhX3N6KG1zZyksIG1zZ19pbXBvcnRhbmNlKG1zZyksCisJCQkJICAgJm9yaWcpOworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIFRJUENfTkFNRURfTVNHOnsKKwkJCQl0aXBjX25hbWVkX21zZ19ldmVudCBjYiA9IHVwX3B0ci0+bmFtZWRfbXNnX2NiOworCisJCQkJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJCQkJaWYgKHVubGlrZWx5KGNvbm5lY3RlZCkpCisJCQkJCWdvdG8gcmVqZWN0OworCQkJCWlmICh1bmxpa2VseSghY2IpKQorCQkJCQlnb3RvIHJlamVjdDsKKwkJCQlpZiAodW5saWtlbHkoIXB1Ymxpc2hlZCkpCisJCQkJCWdvdG8gcmVqZWN0OworCQkJCWRzZXEudHlwZSA9ICBtc2dfbmFtZXR5cGUobXNnKTsKKwkJCQlkc2VxLmxvd2VyID0gbXNnX25hbWVpbnN0KG1zZyk7CisJCQkJZHNlcS51cHBlciA9IGRzZXEubG93ZXI7CisJCQkJc2tiX3B1bGwoYnVmLCBtc2dfaGRyX3N6KG1zZykpOworCQkJCWNiKHVzcl9oYW5kbGUsIGRyZWYsICZidWYsIG1zZ19kYXRhKG1zZyksIAorCQkJCSAgIG1zZ19kYXRhX3N6KG1zZyksIG1zZ19pbXBvcnRhbmNlKG1zZyksCisJCQkJICAgJm9yaWcsICZkc2VxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoYnVmKQorCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJYnVmID0gbmV4dDsKKwkJY29udGludWU7CitlcnI6CisJCXN3aXRjaCAobXNnX3R5cGUobXNnKSkgeworCQkKKwkJY2FzZSBUSVBDX0NPTk5fTVNHOnsKKwkJCQl0aXBjX2Nvbm5fc2h1dGRvd25fZXZlbnQgY2IgPSAKKwkJCQkJdXBfcHRyLT5jb25uX2Vycl9jYjsKKwkJCQl1MzIgcGVlcl9wb3J0ID0gcG9ydF9wZWVycG9ydChwX3B0cik7CisJCQkJdTMyIHBlZXJfbm9kZSA9IHBvcnRfcGVlcm5vZGUocF9wdHIpOworCisJCQkJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJCQkJaWYgKCFjb25uZWN0ZWQgfHwgIWNiKQorCQkJCQlicmVhazsKKwkJCQlpZiAobXNnX29yaWdwb3J0KG1zZykgIT0gcGVlcl9wb3J0KQorCQkJCQlicmVhazsKKwkJCQlpZiAobXNnX29yaWdub2RlKG1zZykgIT0gcGVlcl9ub2RlKQorCQkJCQlicmVhazsKKwkJCQl0aXBjX2Rpc2Nvbm5lY3QoZHJlZik7CisJCQkJc2tiX3B1bGwoYnVmLCBtc2dfaGRyX3N6KG1zZykpOworCQkJCWNiKHVzcl9oYW5kbGUsIGRyZWYsICZidWYsIG1zZ19kYXRhKG1zZyksCisJCQkJICAgbXNnX2RhdGFfc3oobXNnKSwgbXNnX2VycmNvZGUobXNnKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgVElQQ19ESVJFQ1RfTVNHOnsKKwkJCQl0aXBjX21zZ19lcnJfZXZlbnQgY2IgPSB1cF9wdHItPmVycl9jYjsKKworCQkJCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCQkJCWlmIChjb25uZWN0ZWQgfHwgIWNiKQorCQkJCQlicmVhazsKKwkJCQlza2JfcHVsbChidWYsIG1zZ19oZHJfc3oobXNnKSk7CisJCQkJY2IodXNyX2hhbmRsZSwgZHJlZiwgJmJ1ZiwgbXNnX2RhdGEobXNnKSwKKwkJCQkgICBtc2dfZGF0YV9zeihtc2cpLCBtc2dfZXJyY29kZShtc2cpLCAmb3JpZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgVElQQ19OQU1FRF9NU0c6eworCQkJCXRpcGNfbmFtZWRfbXNnX2Vycl9ldmVudCBjYiA9IAorCQkJCQl1cF9wdHItPm5hbWVkX2Vycl9jYjsKKworCQkJCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCQkJCWlmIChjb25uZWN0ZWQgfHwgIWNiKQorCQkJCQlicmVhazsKKwkJCQlkc2VxLnR5cGUgPSAgbXNnX25hbWV0eXBlKG1zZyk7CisJCQkJZHNlcS5sb3dlciA9IG1zZ19uYW1laW5zdChtc2cpOworCQkJCWRzZXEudXBwZXIgPSBkc2VxLmxvd2VyOworCQkJCXNrYl9wdWxsKGJ1ZiwgbXNnX2hkcl9zeihtc2cpKTsKKwkJCQljYih1c3JfaGFuZGxlLCBkcmVmLCAmYnVmLCBtc2dfZGF0YShtc2cpLCAKKwkJCQkgICBtc2dfZGF0YV9zeihtc2cpLCBtc2dfZXJyY29kZShtc2cpLCAmZHNlcSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGJ1ZikKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCWJ1ZiA9IG5leHQ7CisJCWNvbnRpbnVlOworcmVqZWN0OgorCQl0aXBjX3JlamVjdF9tc2coYnVmLCBUSVBDX0VSUl9OT19QT1JUKTsKKwkJYnVmID0gbmV4dDsKKwl9Cit9CisKKy8qCisgKiAgcG9ydF9kaXNwYXRjaGVyKCk6IERpc3BhdGNoZXIgZm9yIG1lc3NhZ2VzIGRlc3RpbmF0ZWQKKyAqICB0byB0aGUgdGlwY19wb3J0IGludGVyZmFjZS4gQ2FsbGVkIHdpdGggcG9ydCBsb2NrZWQuCisgKi8KKworc3RhdGljIHUzMiBwb3J0X2Rpc3BhdGNoZXIoc3RydWN0IHRpcGNfcG9ydCAqZHVtbXksIHN0cnVjdCBza19idWZmICpidWYpCit7CisJYnVmLT5uZXh0ID0gTlVMTDsKKwlzcGluX2xvY2tfYmgoJnF1ZXVlX2xvY2spOworCWlmIChtc2dfcXVldWVfaGVhZCkgeworCQltc2dfcXVldWVfdGFpbC0+bmV4dCA9IGJ1ZjsKKwkJbXNnX3F1ZXVlX3RhaWwgPSBidWY7CisJfSBlbHNlIHsKKwkJbXNnX3F1ZXVlX3RhaWwgPSBtc2dfcXVldWVfaGVhZCA9IGJ1ZjsKKwkJa19zaWduYWwoKEhhbmRsZXIpcG9ydF9kaXNwYXRjaGVyX3NpZ2gsIDApOworCX0KKwlzcGluX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qIAorICogV2FrZSB1cCBwb3J0IGFmdGVyIGNvbmdlc3Rpb246IENhbGxlZCB3aXRoIHBvcnQgbG9ja2VkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICovCisKK3N0YXRpYyB2b2lkIHBvcnRfd2FrZXVwX3NoKHVuc2lnbmVkIGxvbmcgcmVmKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdXNlcl9wb3J0ICp1cF9wdHI7CisJdGlwY19jb250aW51ZV9ldmVudCBjYiA9IDA7CisJdm9pZCAqdWggPSAwOworCisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAocF9wdHIpIHsKKwkJdXBfcHRyID0gcF9wdHItPnVzZXJfcG9ydDsKKwkJaWYgKHVwX3B0cikgeworCQkJY2IgPSB1cF9wdHItPmNvbnRpbnVlX2V2ZW50X2NiOworCQkJdWggPSB1cF9wdHItPnVzcl9oYW5kbGU7CisJCX0KKwkJcG9ydF91bmxvY2socF9wdHIpOworCX0KKwlpZiAoY2IpCisJCWNiKHVoLCByZWYpOworfQorCisKK3N0YXRpYyB2b2lkIHBvcnRfd2FrZXVwKHN0cnVjdCB0aXBjX3BvcnQgKnBfcHRyKQoreworCWtfc2lnbmFsKChIYW5kbGVyKXBvcnRfd2FrZXVwX3NoLCBwX3B0ci0+cmVmKTsKK30KKwordm9pZCB0aXBjX2Fja25vd2xlZGdlKHUzMiByZWYsIHUzMiBhY2spCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCBza19idWZmICpidWYgPSAwOworCisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm47CisJaWYgKHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkgeworCQlwX3B0ci0+cHVibC5jb25uX3VuYWNrZWQgLT0gYWNrOworCQlidWYgPSBwb3J0X2J1aWxkX3Byb3RvX21zZyhwb3J0X3BlZXJwb3J0KHBfcHRyKSwKKwkJCQkJICAgcG9ydF9wZWVybm9kZShwX3B0ciksCisJCQkJCSAgIHJlZiwKKwkJCQkJICAgdGlwY19vd25fYWRkciwKKwkJCQkJICAgQ09OTl9NQU5BR0VSLAorCQkJCQkgICBDT05OX0FDSywKKwkJCQkJICAgVElQQ19PSywgCisJCQkJCSAgIHBvcnRfb3V0X3NlcW5vKHBfcHRyKSwKKwkJCQkJICAgYWNrKTsKKwl9CisJcG9ydF91bmxvY2socF9wdHIpOworCW5ldF9yb3V0ZV9tc2coYnVmKTsKK30KKworLyoKKyAqIHRpcGNfY3JlYXRlcG9ydCgpOiB1c2VyIGxldmVsIGNhbGwuIFdpbGwgYWRkIHBvcnQgdG8KKyAqICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSBpZiBub24temVybyB1c2VyX3JlZi4KKyAqLworCitpbnQgdGlwY19jcmVhdGVwb3J0KHUzMiB1c2VyX3JlZiwgCisJCSAgICB2b2lkICp1c3JfaGFuZGxlLCAKKwkJICAgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlLCAKKwkJICAgIHRpcGNfbXNnX2Vycl9ldmVudCBlcnJvcl9jYiwgCisJCSAgICB0aXBjX25hbWVkX21zZ19lcnJfZXZlbnQgbmFtZWRfZXJyb3JfY2IsIAorCQkgICAgdGlwY19jb25uX3NodXRkb3duX2V2ZW50IGNvbm5fZXJyb3JfY2IsIAorCQkgICAgdGlwY19tc2dfZXZlbnQgbXNnX2NiLCAKKwkJICAgIHRpcGNfbmFtZWRfbXNnX2V2ZW50IG5hbWVkX21zZ19jYiwgCisJCSAgICB0aXBjX2Nvbm5fbXNnX2V2ZW50IGNvbm5fbXNnX2NiLCAKKwkJICAgIHRpcGNfY29udGludWVfZXZlbnQgY29udGludWVfZXZlbnRfY2IsLyogTWF5IGJlIHplcm8gKi8KKwkJICAgIHUzMiAqcG9ydHJlZikKK3sKKwlzdHJ1Y3QgdXNlcl9wb3J0ICp1cF9wdHI7CisJc3RydWN0IHBvcnQgKnBfcHRyOyAKKwl1MzIgcmVmOworCisJdXBfcHRyID0gKHN0cnVjdCB1c2VyX3BvcnQgKilrbWFsbG9jKHNpemVvZigqdXBfcHRyKSwgR0ZQX0FUT01JQyk7CisJaWYgKHVwX3B0ciA9PSBOVUxMKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZWYgPSB0aXBjX2NyZWF0ZXBvcnRfcmF3KDAsIHBvcnRfZGlzcGF0Y2hlciwgcG9ydF93YWtldXAsIGltcG9ydGFuY2UpOworCXBfcHRyID0gcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikgeworCQlrZnJlZSh1cF9wdHIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwX3B0ci0+dXNlcl9wb3J0ID0gdXBfcHRyOworCXVwX3B0ci0+dXNlcl9yZWYgPSB1c2VyX3JlZjsKKwl1cF9wdHItPnVzcl9oYW5kbGUgPSB1c3JfaGFuZGxlOworCXVwX3B0ci0+cmVmID0gcF9wdHItPnB1YmwucmVmOworCXVwX3B0ci0+ZXJyX2NiID0gZXJyb3JfY2I7CisJdXBfcHRyLT5uYW1lZF9lcnJfY2IgPSBuYW1lZF9lcnJvcl9jYjsKKwl1cF9wdHItPmNvbm5fZXJyX2NiID0gY29ubl9lcnJvcl9jYjsKKwl1cF9wdHItPm1zZ19jYiA9IG1zZ19jYjsKKwl1cF9wdHItPm5hbWVkX21zZ19jYiA9IG5hbWVkX21zZ19jYjsKKwl1cF9wdHItPmNvbm5fbXNnX2NiID0gY29ubl9tc2dfY2I7CisJdXBfcHRyLT5jb250aW51ZV9ldmVudF9jYiA9IGNvbnRpbnVlX2V2ZW50X2NiOworCUlOSVRfTElTVF9IRUFEKCZ1cF9wdHItPnVwb3J0X2xpc3QpOworCXJlZ19hZGRfcG9ydCh1cF9wdHIpOworCSpwb3J0cmVmID0gcF9wdHItPnB1YmwucmVmOworCWRiZygiIHRpcGNfY3JlYXRlcG9ydDogJXggd2l0aCByZWYgJXVcbiIsIHBfcHRyLCBwX3B0ci0+cHVibC5yZWYpOyAgICAgICAgCisJcG9ydF91bmxvY2socF9wdHIpOworCXJldHVybiBUSVBDX09LOworfQorCitpbnQgdGlwY19vd25pZGVudGl0eSh1MzIgcmVmLCBzdHJ1Y3QgdGlwY19wb3J0aWQgKmlkKQoreworCWlkLT5yZWYgPSByZWY7CisJaWQtPm5vZGUgPSB0aXBjX293bl9hZGRyOworCXJldHVybiBUSVBDX09LOworfQorCitpbnQgdGlwY19wb3J0aW1wb3J0YW5jZSh1MzIgcmVmLCB1bnNpZ25lZCBpbnQgKmltcG9ydGFuY2UpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCQorCXBfcHRyID0gcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJKmltcG9ydGFuY2UgPSAodW5zaWduZWQgaW50KW1zZ19pbXBvcnRhbmNlKCZwX3B0ci0+cHVibC5waGRyKTsKKwlzcGluX3VubG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworaW50IHRpcGNfc2V0X3BvcnRpbXBvcnRhbmNlKHUzMiByZWYsIHVuc2lnbmVkIGludCBpbXApCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCisJaWYgKGltcCA+IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCW1zZ19zZXRfaW1wb3J0YW5jZSgmcF9wdHItPnB1YmwucGhkciwgKHUzMilpbXApOworCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCXJldHVybiBUSVBDX09LOworfQorCisKK2ludCB0aXBjX3B1Ymxpc2godTMyIHJlZiwgdW5zaWduZWQgaW50IHNjb3BlLCBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqc2VxKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1Ymw7CisJdTMyIGtleTsKKwlpbnQgcmVzID0gLUVJTlZBTDsKKworCXBfcHRyID0gcG9ydF9sb2NrKHJlZik7CisJZGJnKCJ0aXBjX3B1YmwgJXUsIHBfcHRyID0gJXgsIGNvbm4gPSAleCwgc2NvcGUgPSAleCwgIgorCSAgICAibG93ZXIgPSAldSwgdXBwZXIgPSAldVxuIiwKKwkgICAgcmVmLCBwX3B0ciwgcF9wdHItPnB1YmwuY29ubmVjdGVkLCBzY29wZSwgc2VxLT5sb3dlciwgc2VxLT51cHBlcik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJZ290byBleGl0OworCWlmIChzZXEtPmxvd2VyID4gc2VxLT51cHBlcikKKwkJZ290byBleGl0OworCWlmICgoc2NvcGUgPCBUSVBDX1pPTkVfU0NPUEUpIHx8IChzY29wZSA+IFRJUENfTk9ERV9TQ09QRSkpCisJCWdvdG8gZXhpdDsKKwlrZXkgPSByZWYgKyBwX3B0ci0+cHViX2NvdW50ICsgMTsKKwlpZiAoa2V5ID09IHJlZikgeworCQlyZXMgPSAtRUFERFJJTlVTRTsKKwkJZ290byBleGl0OworCX0KKwlwdWJsID0gbmFtZXRibF9wdWJsaXNoKHNlcS0+dHlwZSwgc2VxLT5sb3dlciwgc2VxLT51cHBlciwKKwkJCSAgICAgICBzY29wZSwgcF9wdHItPnB1YmwucmVmLCBrZXkpOworCWlmIChwdWJsKSB7CisJCWxpc3RfYWRkKCZwdWJsLT5wcG9ydF9saXN0LCAmcF9wdHItPnB1YmxpY2F0aW9ucyk7CisJCXBfcHRyLT5wdWJfY291bnQrKzsKKwkJcF9wdHItPnB1YmwucHVibGlzaGVkID0gMTsKKwkJcmVzID0gVElQQ19PSzsKKwl9CitleGl0OgorCXBvcnRfdW5sb2NrKHBfcHRyKTsKKwlyZXR1cm4gcmVzOworfQorCitpbnQgdGlwY193aXRoZHJhdyh1MzIgcmVmLCB1bnNpZ25lZCBpbnQgc2NvcGUsIHN0cnVjdCB0aXBjX25hbWVfc2VxIGNvbnN0ICpzZXEpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnRwdWJsOworCWludCByZXMgPSAtRUlOVkFMOworCQorCXBfcHRyID0gcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFwX3B0ci0+cHVibC5wdWJsaXNoZWQpCisJCWdvdG8gZXhpdDsKKwlpZiAoIXNlcSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHVibCwgdHB1YmwsIAorCQkJCQkgJnBfcHRyLT5wdWJsaWNhdGlvbnMsIHBwb3J0X2xpc3QpIHsKKwkJCW5hbWV0Ymxfd2l0aGRyYXcocHVibC0+dHlwZSwgcHVibC0+bG93ZXIsIAorCQkJCQkgcHVibC0+cmVmLCBwdWJsLT5rZXkpOworCQl9CisJCXJlcyA9IFRJUENfT0s7CisJfSBlbHNlIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB1YmwsIHRwdWJsLCAKKwkJCQkJICZwX3B0ci0+cHVibGljYXRpb25zLCBwcG9ydF9saXN0KSB7CisJCQlpZiAocHVibC0+c2NvcGUgIT0gc2NvcGUpCisJCQkJY29udGludWU7CisJCQlpZiAocHVibC0+dHlwZSAhPSBzZXEtPnR5cGUpCisJCQkJY29udGludWU7CisJCQlpZiAocHVibC0+bG93ZXIgIT0gc2VxLT5sb3dlcikKKwkJCQljb250aW51ZTsKKwkJCWlmIChwdWJsLT51cHBlciAhPSBzZXEtPnVwcGVyKQorCQkJCWJyZWFrOworCQkJbmFtZXRibF93aXRoZHJhdyhwdWJsLT50eXBlLCBwdWJsLT5sb3dlciwgCisJCQkJCSBwdWJsLT5yZWYsIHB1YmwtPmtleSk7CisJCQlyZXMgPSBUSVBDX09LOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGxpc3RfZW1wdHkoJnBfcHRyLT5wdWJsaWNhdGlvbnMpKQorCQlwX3B0ci0+cHVibC5wdWJsaXNoZWQgPSAwOworZXhpdDoKKwlwb3J0X3VubG9jayhwX3B0cik7CisJcmV0dXJuIHJlczsKK30KKworaW50IHRpcGNfY29ubmVjdDJwb3J0KHUzMiByZWYsIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqcGVlcikKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJaW50IHJlcyA9IC1FSU5WQUw7CisKKwlwX3B0ciA9IHBvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwX3B0ci0+cHVibC5wdWJsaXNoZWQgfHwgcF9wdHItPnB1YmwuY29ubmVjdGVkKQorCQlnb3RvIGV4aXQ7CisJaWYgKCFwZWVyLT5yZWYpCisJCWdvdG8gZXhpdDsKKworCW1zZyA9ICZwX3B0ci0+cHVibC5waGRyOworCW1zZ19zZXRfZGVzdG5vZGUobXNnLCBwZWVyLT5ub2RlKTsKKwltc2dfc2V0X2Rlc3Rwb3J0KG1zZywgcGVlci0+cmVmKTsKKwltc2dfc2V0X29yaWdub2RlKG1zZywgdGlwY19vd25fYWRkcik7CisJbXNnX3NldF9vcmlncG9ydChtc2csIHBfcHRyLT5wdWJsLnJlZik7CisJbXNnX3NldF90cmFuc3Bfc2Vxbm8obXNnLCA0Mik7CisJbXNnX3NldF90eXBlKG1zZywgVElQQ19DT05OX01TRyk7CisJaWYgKCFtYXlfcm91dGUocGVlci0+bm9kZSkpCisJCW1zZ19zZXRfaGRyX3N6KG1zZywgU0hPUlRfSF9TSVpFKTsKKwllbHNlCisJCW1zZ19zZXRfaGRyX3N6KG1zZywgTE9OR19IX1NJWkUpOworCisJcF9wdHItPnByb2JpbmdfaW50ZXJ2YWwgPSBQUk9CSU5HX0lOVEVSVkFMOworCXBfcHRyLT5wcm9iaW5nX3N0YXRlID0gQ09ORklSTUVEOworCXBfcHRyLT5wdWJsLmNvbm5lY3RlZCA9IDE7CisJa19zdGFydF90aW1lcigmcF9wdHItPnRpbWVyLCBwX3B0ci0+cHJvYmluZ19pbnRlcnZhbCk7CisKKwlub2Rlc3ViX3N1YnNjcmliZSgmcF9wdHItPnN1YnNjcmlwdGlvbixwZWVyLT5ub2RlLAorCQkJICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXJlZiwKKwkJCSAgKG5ldF9ldl9oYW5kbGVyKXBvcnRfaGFuZGxlX25vZGVfZG93bik7CisJcmVzID0gVElQQ19PSzsKK2V4aXQ6CisJcG9ydF91bmxvY2socF9wdHIpOworCXBfcHRyLT5tYXhfcGt0ID0gbGlua19nZXRfbWF4X3BrdChwZWVyLT5ub2RlLCByZWYpOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiB0aXBjX2Rpc2Nvbm5lY3QoKTogRGlzY29ubmVjdCBwb3J0IGZvcm0gcGVlci4KKyAqICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgbm9kZSBsb2NhbCBvcGVyYXRpb24uCisgKi8KKworaW50IHRpcGNfZGlzY29ubmVjdCh1MzIgcmVmKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlpbnQgcmVzID0gLUVOT1RDT05OOworCisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocF9wdHItPnB1YmwuY29ubmVjdGVkKSB7CisJCXBfcHRyLT5wdWJsLmNvbm5lY3RlZCA9IDA7CisJCS8qIGxldCB0aW1lciBleHBpcmUgb24gaXQncyBvd24gdG8gYXZvaWQgZGVhZGxvY2shICovCisJCW5vZGVzdWJfdW5zdWJzY3JpYmUoJnBfcHRyLT5zdWJzY3JpcHRpb24pOworCQlyZXMgPSBUSVBDX09LOworCX0KKwlwb3J0X3VubG9jayhwX3B0cik7CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIHRpcGNfc2h1dGRvd24oKTogU2VuZCBhIFNIVVRET1dOIG1zZyB0byBwZWVyIGFuZCBkaXNjb25uZWN0CisgKi8KK2ludCB0aXBjX3NodXRkb3duKHUzMiByZWYpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCBza19idWZmICpidWYgPSAwOworCisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwX3B0ci0+cHVibC5jb25uZWN0ZWQpIHsKKwkJdTMyIGltcCA9IG1zZ19pbXBvcnRhbmNlKCZwX3B0ci0+cHVibC5waGRyKTsKKwkJaWYgKGltcCA8IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkKKwkJCWltcCsrOworCQlidWYgPSBwb3J0X2J1aWxkX3Byb3RvX21zZyhwb3J0X3BlZXJwb3J0KHBfcHRyKSwKKwkJCQkJICAgcG9ydF9wZWVybm9kZShwX3B0ciksCisJCQkJCSAgIHJlZiwKKwkJCQkJICAgdGlwY19vd25fYWRkciwKKwkJCQkJICAgaW1wLAorCQkJCQkgICBUSVBDX0NPTk5fTVNHLAorCQkJCQkgICBUSVBDX0NPTk5fU0hVVERPV04sIAorCQkJCQkgICBwb3J0X291dF9zZXFubyhwX3B0ciksCisJCQkJCSAgIDApOworCX0KKwlwb3J0X3VubG9jayhwX3B0cik7CisJbmV0X3JvdXRlX21zZyhidWYpOworCXJldHVybiB0aXBjX2Rpc2Nvbm5lY3QocmVmKTsKK30KKworaW50IHRpcGNfaXNjb25uZWN0ZWQodTMyIHJlZiwgaW50ICppc2Nvbm5lY3RlZCkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJCisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqaXNjb25uZWN0ZWQgPSBwX3B0ci0+cHVibC5jb25uZWN0ZWQ7CisJcG9ydF91bmxvY2socF9wdHIpOworCXJldHVybiBUSVBDX09LOworfQorCitpbnQgdGlwY19wZWVyKHUzMiByZWYsIHN0cnVjdCB0aXBjX3BvcnRpZCAqcGVlcikKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJaW50IHJlczsKKwkgCisJcF9wdHIgPSBwb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocF9wdHItPnB1YmwuY29ubmVjdGVkKSB7CisJCXBlZXItPnJlZiA9IHBvcnRfcGVlcnBvcnQocF9wdHIpOworCQlwZWVyLT5ub2RlID0gcG9ydF9wZWVybm9kZShwX3B0cik7CisJCXJlcyA9IFRJUENfT0s7CisJfSBlbHNlCisJCXJlcyA9IC1FTk9UQ09OTjsKKwlwb3J0X3VubG9jayhwX3B0cik7CisJcmV0dXJuIHJlczsKK30KKworaW50IHRpcGNfcmVmX3ZhbGlkKHUzMiByZWYpCit7CisJLyogV29ya3MgaXJyZXNwZWN0aXZlIG9mIHR5cGUgKi8KKwlyZXR1cm4gISFyZWZfZGVyZWYocmVmKTsKK30KKworCisvKgorICogIHBvcnRfcmVjdl9zZWN0aW9ucygpOiBDb25jYXRlbmF0ZSBhbmQgZGVsaXZlciBzZWN0aW9uZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSBmb3IgdGhpcyBub2RlLgorICovCisKK2ludCBwb3J0X3JlY3Zfc2VjdGlvbnMoc3RydWN0IHBvcnQgKnNlbmRlciwgdW5zaWduZWQgaW50IG51bV9zZWN0LAorCQkgICAgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCWludCByZXM7CisJIAorCXJlcyA9IG1zZ19idWlsZCgmc2VuZGVyLT5wdWJsLnBoZHIsIG1zZ19zZWN0LCBudW1fc2VjdCwKKwkJCU1BWF9NU0dfU0laRSwgIXNlbmRlci0+dXNlcl9wb3J0LCAmYnVmKTsKKwlpZiAobGlrZWx5KGJ1ZikpCisJCXBvcnRfcmVjdl9tc2coYnVmKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHRpcGNfc2VuZCAtIHNlbmQgbWVzc2FnZSBzZWN0aW9ucyBvbiBjb25uZWN0aW9uCisgKi8KKworaW50IHRpcGNfc2VuZCh1MzIgcmVmLCB1bnNpZ25lZCBpbnQgbnVtX3NlY3QsIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXUzMiBkZXN0bm9kZTsKKwlpbnQgcmVzOworCisJcF9wdHIgPSBwb3J0X2RlcmVmKHJlZik7CisJaWYgKCFwX3B0ciB8fCAhcF9wdHItPnB1YmwuY29ubmVjdGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDE7CisJaWYgKCFwb3J0X2Nvbmdlc3RlZChwX3B0cikpIHsKKwkJZGVzdG5vZGUgPSBwb3J0X3BlZXJub2RlKHBfcHRyKTsKKwkJaWYgKGxpa2VseShkZXN0bm9kZSAhPSB0aXBjX293bl9hZGRyKSkKKwkJCXJlcyA9IGxpbmtfc2VuZF9zZWN0aW9uc19mYXN0KHBfcHRyLCBtc2dfc2VjdCwgbnVtX3NlY3QsCisJCQkJCQkgICAgICBkZXN0bm9kZSk7CisJCWVsc2UKKwkJCXJlcyA9IHBvcnRfcmVjdl9zZWN0aW9ucyhwX3B0ciwgbnVtX3NlY3QsIG1zZ19zZWN0KTsKKworCQlpZiAobGlrZWx5KHJlcyAhPSAtRUxJTktDT05HKSkgeworCQkJcG9ydF9pbmNyX291dF9zZXFubyhwX3B0cik7CisJCQlwX3B0ci0+cHVibC5jb25nZXN0ZWQgPSAwOworCQkJcF9wdHItPnNlbnQrKzsKKwkJCXJldHVybiByZXM7CisJCX0KKwl9CisJaWYgKHBvcnRfdW5yZWxpYWJsZShwX3B0cikpIHsKKwkJcF9wdHItPnB1YmwuY29uZ2VzdGVkID0gMDsKKwkJLyogSnVzdCBjYWxjdWxhdGUgbXNnIGxlbmd0aCBhbmQgcmV0dXJuICovCisJCXJldHVybiBtc2dfY2FsY19kYXRhX3NpemUobXNnX3NlY3QsIG51bV9zZWN0KTsKKwl9CisJcmV0dXJuIC1FTElOS0NPTkc7Cit9CisKKy8qKiAKKyAqIHRpcGNfc2VuZF9idWYgLSBzZW5kIG1lc3NhZ2UgYnVmZmVyIG9uIGNvbm5lY3Rpb24KKyAqLworCitpbnQgdGlwY19zZW5kX2J1Zih1MzIgcmVmLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1bnNpZ25lZCBpbnQgZHN6KQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1MzIgZGVzdG5vZGU7CisJdTMyIGhzejsKKwl1MzIgc3o7CisJdTMyIHJlczsKKwkgCisJcF9wdHIgPSBwb3J0X2RlcmVmKHJlZik7CisJaWYgKCFwX3B0ciB8fCAhcF9wdHItPnB1YmwuY29ubmVjdGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1zZyA9ICZwX3B0ci0+cHVibC5waGRyOworCWhzeiA9IG1zZ19oZHJfc3oobXNnKTsKKwlzeiA9IGhzeiArIGRzejsKKwltc2dfc2V0X3NpemUobXNnLCBzeik7CisJaWYgKHNrYl9jb3coYnVmLCBoc3opKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYl9wdXNoKGJ1ZiwgaHN6KTsKKwltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopbXNnLCBoc3opOworCWRlc3Rub2RlID0gbXNnX2Rlc3Rub2RlKG1zZyk7CisJcF9wdHItPnB1YmwuY29uZ2VzdGVkID0gMTsKKwlpZiAoIXBvcnRfY29uZ2VzdGVkKHBfcHRyKSkgeworCQlpZiAobGlrZWx5KGRlc3Rub2RlICE9IHRpcGNfb3duX2FkZHIpKQorCQkJcmVzID0gdGlwY19zZW5kX2J1Zl9mYXN0KGJ1ZiwgZGVzdG5vZGUpOworCQllbHNlIHsKKwkJCXBvcnRfcmVjdl9tc2coYnVmKTsKKwkJCXJlcyA9IHN6OworCQl9CisJCWlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKSB7CisJCQlwb3J0X2luY3Jfb3V0X3NlcW5vKHBfcHRyKTsKKwkJCXBfcHRyLT5zZW50Kys7CisJCQlwX3B0ci0+cHVibC5jb25nZXN0ZWQgPSAwOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKwlpZiAocG9ydF91bnJlbGlhYmxlKHBfcHRyKSkgeworCQlwX3B0ci0+cHVibC5jb25nZXN0ZWQgPSAwOworCQlyZXR1cm4gZHN6OworCX0KKwlyZXR1cm4gLUVMSU5LQ09ORzsKK30KKworLyoqCisgKiB0aXBjX2ZvcndhcmQybmFtZSAtIGZvcndhcmQgbWVzc2FnZSBzZWN0aW9ucyB0byBwb3J0IG5hbWUKKyAqLworCitpbnQgdGlwY19mb3J3YXJkMm5hbWUodTMyIHJlZiwgCisJCSAgICAgIHN0cnVjdCB0aXBjX25hbWUgY29uc3QgKm5hbWUsIAorCQkgICAgICB1MzIgZG9tYWluLAorCQkgICAgICB1MzIgbnVtX3NlY3QsIAorCQkgICAgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LAorCQkgICAgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWcsIAorCQkgICAgICB1bnNpZ25lZCBpbnQgaW1wb3J0YW5jZSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJdTMyIGRlc3Rub2RlID0gZG9tYWluOworCXUzMiBkZXN0cG9ydCA9IDA7CisJaW50IHJlczsKKworCXBfcHRyID0gcG9ydF9kZXJlZihyZWYpOworCWlmICghcF9wdHIgfHwgcF9wdHItPnB1YmwuY29ubmVjdGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1zZyA9ICZwX3B0ci0+cHVibC5waGRyOworCW1zZ19zZXRfdHlwZShtc2csIFRJUENfTkFNRURfTVNHKTsKKwltc2dfc2V0X29yaWdub2RlKG1zZywgb3JpZy0+bm9kZSk7CisJbXNnX3NldF9vcmlncG9ydChtc2csIG9yaWctPnJlZik7CisJbXNnX3NldF9oZHJfc3oobXNnLCBMT05HX0hfU0laRSk7CisJbXNnX3NldF9uYW1ldHlwZShtc2csIG5hbWUtPnR5cGUpOworCW1zZ19zZXRfbmFtZWluc3QobXNnLCBuYW1lLT5pbnN0YW5jZSk7CisJbXNnX3NldF9sb29rdXBfc2NvcGUobXNnLCBhZGRyX3Njb3BlKGRvbWFpbikpOworCWlmIChpbXBvcnRhbmNlIDw9IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkKKwkJbXNnX3NldF9pbXBvcnRhbmNlKG1zZyxpbXBvcnRhbmNlKTsKKwlkZXN0cG9ydCA9IG5hbWV0YmxfdHJhbnNsYXRlKG5hbWUtPnR5cGUsIG5hbWUtPmluc3RhbmNlLCAmZGVzdG5vZGUpOworCW1zZ19zZXRfZGVzdG5vZGUobXNnLCBkZXN0bm9kZSk7CisJbXNnX3NldF9kZXN0cG9ydChtc2csIGRlc3Rwb3J0KTsKKworCWlmIChsaWtlbHkoZGVzdHBvcnQgfHwgZGVzdG5vZGUpKSB7CisJCXBfcHRyLT5zZW50Kys7CisJCWlmIChsaWtlbHkoZGVzdG5vZGUgPT0gdGlwY19vd25fYWRkcikpCisJCQlyZXR1cm4gcG9ydF9yZWN2X3NlY3Rpb25zKHBfcHRyLCBudW1fc2VjdCwgbXNnX3NlY3QpOworCQlyZXMgPSBsaW5rX3NlbmRfc2VjdGlvbnNfZmFzdChwX3B0ciwgbXNnX3NlY3QsIG51bV9zZWN0LCAKKwkJCQkJICAgICAgZGVzdG5vZGUpOworCQlpZiAobGlrZWx5KHJlcyAhPSAtRUxJTktDT05HKSkKKwkJCXJldHVybiByZXM7CisJCWlmIChwb3J0X3VucmVsaWFibGUocF9wdHIpKSB7CisJCQkvKiBKdXN0IGNhbGN1bGF0ZSBtc2cgbGVuZ3RoIGFuZCByZXR1cm4gKi8KKwkJCXJldHVybiBtc2dfY2FsY19kYXRhX3NpemUobXNnX3NlY3QsIG51bV9zZWN0KTsKKwkJfQorCQlyZXR1cm4gLUVMSU5LQ09ORzsKKwl9CisJcmV0dXJuIHBvcnRfcmVqZWN0X3NlY3Rpb25zKHBfcHRyLCBtc2csIG1zZ19zZWN0LCBudW1fc2VjdCwgCisJCQkJICAgIFRJUENfRVJSX05PX05BTUUpOworfQorCisvKioKKyAqIHRpcGNfc2VuZDJuYW1lIC0gc2VuZCBtZXNzYWdlIHNlY3Rpb25zIHRvIHBvcnQgbmFtZQorICovCisKK2ludCB0aXBjX3NlbmQybmFtZSh1MzIgcmVmLCAKKwkJICAgc3RydWN0IHRpcGNfbmFtZSBjb25zdCAqbmFtZSwKKwkJICAgdW5zaWduZWQgaW50IGRvbWFpbiwgCisJCSAgIHVuc2lnbmVkIGludCBudW1fc2VjdCwgCisJCSAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QpCit7CisJc3RydWN0IHRpcGNfcG9ydGlkIG9yaWc7CisKKwlvcmlnLnJlZiA9IHJlZjsKKwlvcmlnLm5vZGUgPSB0aXBjX293bl9hZGRyOworCXJldHVybiB0aXBjX2ZvcndhcmQybmFtZShyZWYsIG5hbWUsIGRvbWFpbiwgbnVtX3NlY3QsIG1zZ19zZWN0LCAmb3JpZywKKwkJCQkgVElQQ19QT1JUX0lNUE9SVEFOQ0UpOworfQorCisvKiogCisgKiB0aXBjX2ZvcndhcmRfYnVmMm5hbWUgLSBmb3J3YXJkIG1lc3NhZ2UgYnVmZmVyIHRvIHBvcnQgbmFtZQorICovCisKK2ludCB0aXBjX2ZvcndhcmRfYnVmMm5hbWUodTMyIHJlZiwKKwkJCSAgc3RydWN0IHRpcGNfbmFtZSBjb25zdCAqbmFtZSwKKwkJCSAgdTMyIGRvbWFpbiwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKKwkJCSAgdW5zaWduZWQgaW50IGRzeiwKKwkJCSAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnLAorCQkJICB1bnNpZ25lZCBpbnQgaW1wb3J0YW5jZSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJdTMyIGRlc3Rub2RlID0gZG9tYWluOworCXUzMiBkZXN0cG9ydCA9IDA7CisJaW50IHJlczsKKworCXBfcHRyID0gKHN0cnVjdCBwb3J0ICopcmVmX2RlcmVmKHJlZik7CisJaWYgKCFwX3B0ciB8fCBwX3B0ci0+cHVibC5jb25uZWN0ZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJbXNnID0gJnBfcHRyLT5wdWJsLnBoZHI7CisJaWYgKGltcG9ydGFuY2UgPD0gVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKQorCQltc2dfc2V0X2ltcG9ydGFuY2UobXNnLCBpbXBvcnRhbmNlKTsKKwltc2dfc2V0X3R5cGUobXNnLCBUSVBDX05BTUVEX01TRyk7CisJbXNnX3NldF9vcmlnbm9kZShtc2csIG9yaWctPm5vZGUpOworCW1zZ19zZXRfb3JpZ3BvcnQobXNnLCBvcmlnLT5yZWYpOworCW1zZ19zZXRfbmFtZXR5cGUobXNnLCBuYW1lLT50eXBlKTsKKwltc2dfc2V0X25hbWVpbnN0KG1zZywgbmFtZS0+aW5zdGFuY2UpOworCW1zZ19zZXRfbG9va3VwX3Njb3BlKG1zZywgYWRkcl9zY29wZShkb21haW4pKTsKKwltc2dfc2V0X2hkcl9zeihtc2csIExPTkdfSF9TSVpFKTsKKwltc2dfc2V0X3NpemUobXNnLCBMT05HX0hfU0laRSArIGRzeik7CisJZGVzdHBvcnQgPSBuYW1ldGJsX3RyYW5zbGF0ZShuYW1lLT50eXBlLCBuYW1lLT5pbnN0YW5jZSwgJmRlc3Rub2RlKTsKKwltc2dfc2V0X2Rlc3Rub2RlKG1zZywgZGVzdG5vZGUpOworCW1zZ19zZXRfZGVzdHBvcnQobXNnLCBkZXN0cG9ydCk7CisJbXNnX2RiZyhtc2csICJmb3J3Mm5hbWUgPT0+ICIpOworCWlmIChza2JfY293KGJ1ZiwgTE9OR19IX1NJWkUpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlza2JfcHVzaChidWYsIExPTkdfSF9TSVpFKTsKKwltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopbXNnLCBMT05HX0hfU0laRSk7CisJbXNnX2RiZyhidWZfbXNnKGJ1ZiksIlBSRVA6Iik7CisJaWYgKGxpa2VseShkZXN0cG9ydCB8fCBkZXN0bm9kZSkpIHsKKwkJcF9wdHItPnNlbnQrKzsKKwkJaWYgKGRlc3Rub2RlID09IHRpcGNfb3duX2FkZHIpCisJCQlyZXR1cm4gcG9ydF9yZWN2X21zZyhidWYpOworCQlyZXMgPSB0aXBjX3NlbmRfYnVmX2Zhc3QoYnVmLCBkZXN0bm9kZSk7CisJCWlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKQorCQkJcmV0dXJuIHJlczsKKwkJaWYgKHBvcnRfdW5yZWxpYWJsZShwX3B0cikpCisJCQlyZXR1cm4gZHN6OworCQlyZXR1cm4gLUVMSU5LQ09ORzsKKwl9CisJcmV0dXJuIHRpcGNfcmVqZWN0X21zZyhidWYsIFRJUENfRVJSX05PX05BTUUpOworfQorCisvKiogCisgKiB0aXBjX3NlbmRfYnVmMm5hbWUgLSBzZW5kIG1lc3NhZ2UgYnVmZmVyIHRvIHBvcnQgbmFtZQorICovCisKK2ludCB0aXBjX3NlbmRfYnVmMm5hbWUodTMyIHJlZiwgCisJCSAgICAgICBzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpkZXN0LCAKKwkJICAgICAgIHUzMiBkb21haW4sCisJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCAKKwkJICAgICAgIHVuc2lnbmVkIGludCBkc3opCit7CisJc3RydWN0IHRpcGNfcG9ydGlkIG9yaWc7CisKKwlvcmlnLnJlZiA9IHJlZjsKKwlvcmlnLm5vZGUgPSB0aXBjX293bl9hZGRyOworCXJldHVybiB0aXBjX2ZvcndhcmRfYnVmMm5hbWUocmVmLCBkZXN0LCBkb21haW4sIGJ1ZiwgZHN6LCAmb3JpZywKKwkJCQkgICAgIFRJUENfUE9SVF9JTVBPUlRBTkNFKTsKK30KKworLyoqIAorICogdGlwY19mb3J3YXJkMnBvcnQgLSBmb3J3YXJkIG1lc3NhZ2Ugc2VjdGlvbnMgdG8gcG9ydCBpZGVudGl0eQorICovCisKK2ludCB0aXBjX2ZvcndhcmQycG9ydCh1MzIgcmVmLAorCQkgICAgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKmRlc3QsCisJCSAgICAgIHVuc2lnbmVkIGludCBudW1fc2VjdCwgCisJCSAgICAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsCisJCSAgICAgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZywgCisJCSAgICAgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwlpbnQgcmVzOworCisJcF9wdHIgPSBwb3J0X2RlcmVmKHJlZik7CisJaWYgKCFwX3B0ciB8fCBwX3B0ci0+cHVibC5jb25uZWN0ZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJbXNnID0gJnBfcHRyLT5wdWJsLnBoZHI7CisJbXNnX3NldF90eXBlKG1zZywgVElQQ19ESVJFQ1RfTVNHKTsKKwltc2dfc2V0X29yaWdub2RlKG1zZywgb3JpZy0+bm9kZSk7CisJbXNnX3NldF9vcmlncG9ydChtc2csIG9yaWctPnJlZik7CisJbXNnX3NldF9kZXN0bm9kZShtc2csIGRlc3QtPm5vZGUpOworCW1zZ19zZXRfZGVzdHBvcnQobXNnLCBkZXN0LT5yZWYpOworCW1zZ19zZXRfaGRyX3N6KG1zZywgRElSX01TR19IX1NJWkUpOworCWlmIChpbXBvcnRhbmNlIDw9IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkKKwkJbXNnX3NldF9pbXBvcnRhbmNlKG1zZywgaW1wb3J0YW5jZSk7CisJcF9wdHItPnNlbnQrKzsKKwlpZiAoZGVzdC0+bm9kZSA9PSB0aXBjX293bl9hZGRyKQorCQlyZXR1cm4gcG9ydF9yZWN2X3NlY3Rpb25zKHBfcHRyLCBudW1fc2VjdCwgbXNnX3NlY3QpOworCXJlcyA9IGxpbmtfc2VuZF9zZWN0aW9uc19mYXN0KHBfcHRyLCBtc2dfc2VjdCwgbnVtX3NlY3QsIGRlc3QtPm5vZGUpOworCWlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKQorCQlyZXR1cm4gcmVzOworCWlmIChwb3J0X3VucmVsaWFibGUocF9wdHIpKSB7CisJCS8qIEp1c3QgY2FsY3VsYXRlIG1zZyBsZW5ndGggYW5kIHJldHVybiAqLworCQlyZXR1cm4gbXNnX2NhbGNfZGF0YV9zaXplKG1zZ19zZWN0LCBudW1fc2VjdCk7CisJfQorCXJldHVybiAtRUxJTktDT05HOworfQorCisvKiogCisgKiB0aXBjX3NlbmQycG9ydCAtIHNlbmQgbWVzc2FnZSBzZWN0aW9ucyB0byBwb3J0IGlkZW50aXR5IAorICovCisKK2ludCB0aXBjX3NlbmQycG9ydCh1MzIgcmVmLCAKKwkJICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpkZXN0LAorCQkgICB1bnNpZ25lZCBpbnQgbnVtX3NlY3QsIAorCQkgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0KQoreworCXN0cnVjdCB0aXBjX3BvcnRpZCBvcmlnOworCisJb3JpZy5yZWYgPSByZWY7CisJb3JpZy5ub2RlID0gdGlwY19vd25fYWRkcjsKKwlyZXR1cm4gdGlwY19mb3J3YXJkMnBvcnQocmVmLCBkZXN0LCBudW1fc2VjdCwgbXNnX3NlY3QsICZvcmlnLCAKKwkJCQkgVElQQ19QT1JUX0lNUE9SVEFOQ0UpOworfQorCisvKiogCisgKiB0aXBjX2ZvcndhcmRfYnVmMnBvcnQgLSBmb3J3YXJkIG1lc3NhZ2UgYnVmZmVyIHRvIHBvcnQgaWRlbnRpdHkKKyAqLworaW50IHRpcGNfZm9yd2FyZF9idWYycG9ydCh1MzIgcmVmLAorCQkJICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKmRlc3QsCisJCQkgIHN0cnVjdCBza19idWZmICpidWYsCisJCQkgIHVuc2lnbmVkIGludCBkc3osCisJCQkgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZywKKwkJCSAgdW5zaWduZWQgaW50IGltcG9ydGFuY2UpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCWludCByZXM7CisKKwlwX3B0ciA9IChzdHJ1Y3QgcG9ydCAqKXJlZl9kZXJlZihyZWYpOworCWlmICghcF9wdHIgfHwgcF9wdHItPnB1YmwuY29ubmVjdGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1zZyA9ICZwX3B0ci0+cHVibC5waGRyOworCW1zZ19zZXRfdHlwZShtc2csIFRJUENfRElSRUNUX01TRyk7CisJbXNnX3NldF9vcmlnbm9kZShtc2csIG9yaWctPm5vZGUpOworCW1zZ19zZXRfb3JpZ3BvcnQobXNnLCBvcmlnLT5yZWYpOworCW1zZ19zZXRfZGVzdG5vZGUobXNnLCBkZXN0LT5ub2RlKTsKKwltc2dfc2V0X2Rlc3Rwb3J0KG1zZywgZGVzdC0+cmVmKTsKKwltc2dfc2V0X2hkcl9zeihtc2csIERJUl9NU0dfSF9TSVpFKTsKKwlpZiAoaW1wb3J0YW5jZSA8PSBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UpCisJCW1zZ19zZXRfaW1wb3J0YW5jZShtc2csIGltcG9ydGFuY2UpOworCW1zZ19zZXRfc2l6ZShtc2csIERJUl9NU0dfSF9TSVpFICsgZHN6KTsKKwlpZiAoc2tiX2NvdyhidWYsIERJUl9NU0dfSF9TSVpFKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2JfcHVzaChidWYsIERJUl9NU0dfSF9TSVpFKTsKKwltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopbXNnLCBESVJfTVNHX0hfU0laRSk7CisJbXNnX2RiZyhtc2csICJidWYycG9ydDogIik7CisJcF9wdHItPnNlbnQrKzsKKwlpZiAoZGVzdC0+bm9kZSA9PSB0aXBjX293bl9hZGRyKQorCQlyZXR1cm4gcG9ydF9yZWN2X21zZyhidWYpOworCXJlcyA9IHRpcGNfc2VuZF9idWZfZmFzdChidWYsIGRlc3QtPm5vZGUpOworCWlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKQorCQlyZXR1cm4gcmVzOworCWlmIChwb3J0X3VucmVsaWFibGUocF9wdHIpKQorCQlyZXR1cm4gZHN6OworCXJldHVybiAtRUxJTktDT05HOworfQorCisvKiogCisgKiB0aXBjX3NlbmRfYnVmMnBvcnQgLSBzZW5kIG1lc3NhZ2UgYnVmZmVyIHRvIHBvcnQgaWRlbnRpdHkKKyAqLworCitpbnQgdGlwY19zZW5kX2J1ZjJwb3J0KHUzMiByZWYsIAorCQkgICAgICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpkZXN0LAorCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgCisJCSAgICAgICB1bnNpZ25lZCBpbnQgZHN6KQoreworCXN0cnVjdCB0aXBjX3BvcnRpZCBvcmlnOworCisJb3JpZy5yZWYgPSByZWY7CisJb3JpZy5ub2RlID0gdGlwY19vd25fYWRkcjsKKwlyZXR1cm4gdGlwY19mb3J3YXJkX2J1ZjJwb3J0KHJlZiwgZGVzdCwgYnVmLCBkc3osICZvcmlnLCAKKwkJCQkgICAgIFRJUENfUE9SVF9JTVBPUlRBTkNFKTsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvcG9ydC5oIGIvbmV0L3RpcGMvcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjlhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9wb3J0LmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBuZXQvdGlwYy9wb3J0Lmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBwb3J0IGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX1BPUlRfSAorI2RlZmluZSBfVElQQ19QT1JUX0gKKworI2luY2x1ZGUgPG5ldC90aXBjL3RpcGNfcG9ydC5oPgorI2luY2x1ZGUgInJlZi5oIgorI2luY2x1ZGUgIm5ldC5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisKKy8qKgorICogc3RydWN0IHVzZXJfcG9ydCAtIFRJUEMgdXNlciBwb3J0ICh1c2VkIHdpdGggbmF0aXZlIEFQSSkKKyAqIEB1c2VyX3JlZjogaWQgb2YgdXNlciB3aG8gY3JlYXRlZCB1c2VyIHBvcnQKKyAqIEB1c3JfaGFuZGxlOiB1c2VyLXNwZWNpZmllZCBmaWVsZAorICogQHJlZjogb2JqZWN0IHJlZmVyZW5jZSB0byBhc3NvY2lhdGVkIFRJUEMgcG9ydAorICogPHZhcmlvdXMgY2FsbGJhY2sgcm91dGluZXM+CisgKiBAdXBvcnRfbGlzdDogYWRqYWNlbnQgdXNlciBwb3J0cyBpbiBsaXN0IG9mIHBvcnRzIGhlbGQgYnkgdXNlcgorICovCisgCitzdHJ1Y3QgdXNlcl9wb3J0IHsKKwl1MzIgdXNlcl9yZWY7CisJdm9pZCAqdXNyX2hhbmRsZTsgCisJdTMyIHJlZjsKKwl0aXBjX21zZ19lcnJfZXZlbnQgZXJyX2NiOyAKKwl0aXBjX25hbWVkX21zZ19lcnJfZXZlbnQgbmFtZWRfZXJyX2NiOyAKKwl0aXBjX2Nvbm5fc2h1dGRvd25fZXZlbnQgY29ubl9lcnJfY2I7IAorCXRpcGNfbXNnX2V2ZW50IG1zZ19jYjsgCisJdGlwY19uYW1lZF9tc2dfZXZlbnQgbmFtZWRfbXNnX2NiOyAKKwl0aXBjX2Nvbm5fbXNnX2V2ZW50IGNvbm5fbXNnX2NiOyAKKwl0aXBjX2NvbnRpbnVlX2V2ZW50IGNvbnRpbnVlX2V2ZW50X2NiOworCXN0cnVjdCBsaXN0X2hlYWQgdXBvcnRfbGlzdDsKK307CisKKy8qKgorICogc3RydWN0IHBvcnQgLSBUSVBDIHBvcnQgc3RydWN0dXJlCisgKiBAcHVibDogVElQQyBwb3J0IGluZm8gYXZhaWxhYmxlIHRvIHByaXZpbGVnZWQgdXNlcnMKKyAqIEBwb3J0X2xpc3Q6IGFkamFjZW50IHBvcnRzIGluIFRJUEMncyBnbG9iYWwgbGlzdCBvZiBwb3J0cworICogQGRpc3BhdGNoZXI6IHB0ciB0byByb3V0aW5lIHdoaWNoIGhhbmRsZXMgcmVjZWl2ZWQgbWVzc2FnZXMKKyAqIEB3YWtldXA6IHB0ciB0byByb3V0aW5lIHRvIGNhbGwgd2hlbiBwb3J0IGlzIG5vIGxvbmdlciBjb25nZXN0ZWQKKyAqIEB1c2VyX3BvcnQ6IHB0ciB0byB1c2VyIHBvcnQgYXNzb2NpYXRlZCB3aXRoIHBvcnQgKGlmIGFueSkKKyAqIEB3YWl0X2xpc3Q6IGFkamFjZW50IHBvcnRzIGluIGxpc3Qgb2YgcG9ydHMgd2FpdGluZyBvbiBsaW5rIGNvbmdlc3Rpb24KKyAqIEBjb25nZXN0ZWRfbGluazogcHRyIHRvIGNvbmdlc3RlZCBsaW5rIHBvcnQgaXMgd2FpdGluZyBvbgorICogQHdhaXRpbmdfcGt0czoKKyAqIEBzZW50OgorICogQGFja2VkOgorICogQHB1YmxpY2F0aW9uczogbGlzdCBvZiBwdWJsaWNhdGlvbnMgZm9yIHBvcnQKKyAqIEBwdWJfY291bnQ6IHRvdGFsICMgb2YgcHVibGljYXRpb25zIHBvcnQgaGFzIG1hZGUgZHVyaW5nIGl0cyBsaWZldGltZQorICogQG1heF9wa3Q6IG1heGltdW0gcGFja2V0IHNpemUgImhpbnQiIHVzZWQgd2hlbiBidWlsZGluZyBtZXNzYWdlcyBzZW50IGJ5IHBvcnQKKyAqIEBwcm9iaW5nX3N0YXRlOgorICogQHByb2JpbmdfaW50ZXJ2YWw6CisgKiBAbGFzdF9pbl9zZXFubzoKKyAqIEB0aW1lcl9yZWY6CisgKiBAc3Vic2NyaXB0aW9uOiAibm9kZSBkb3duIiBzdWJzY3JpcHRpb24gdXNlZCB0byB0ZXJtaW5hdGUgZmFpbGVkIGNvbm5lY3Rpb25zCisgKi8KKworc3RydWN0IHBvcnQgeworCXN0cnVjdCB0aXBjX3BvcnQgcHVibDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBvcnRfbGlzdDsKKwl1MzIgKCpkaXNwYXRjaGVyKShzdHJ1Y3QgdGlwY19wb3J0ICosIHN0cnVjdCBza19idWZmICopOworCXZvaWQgKCp3YWtldXApKHN0cnVjdCB0aXBjX3BvcnQgKik7CisJc3RydWN0IHVzZXJfcG9ydCAqdXNlcl9wb3J0OworCXN0cnVjdCBsaXN0X2hlYWQgd2FpdF9saXN0OworCXN0cnVjdCBsaW5rICpjb25nZXN0ZWRfbGluazsKKwl1MzIgd2FpdGluZ19wa3RzOworCXUzMiBzZW50OworCXUzMiBhY2tlZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHB1YmxpY2F0aW9uczsKKwl1MzIgcHViX2NvdW50OworCXUzMiBtYXhfcGt0OworCXUzMiBwcm9iaW5nX3N0YXRlOworCXUzMiBwcm9iaW5nX2ludGVydmFsOworCXUzMiBsYXN0X2luX3NlcW5vOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXN0cnVjdCBub2RlX3N1YnNjciBzdWJzY3JpcHRpb247Cit9OworCitleHRlcm4gc3BpbmxvY2tfdCBwb3J0X2xpc3RfbG9jazsKK3N0cnVjdCBwb3J0X2xpc3Q7CisKK2ludCBwb3J0X3JlY3Zfc2VjdGlvbnMoc3RydWN0IHBvcnQgKnBfcHRyLCB1MzIgbnVtX3NlY3QsIAorCQkgICAgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCk7CitpbnQgcG9ydF9yZWplY3Rfc2VjdGlvbnMoc3RydWN0IHBvcnQgKnBfcHRyLCBzdHJ1Y3QgdGlwY19tc2cgKmhkciwKKwkJCSBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LCB1MzIgbnVtX3NlY3QsCisJCQkgaW50IGVycik7CitzdHJ1Y3Qgc2tfYnVmZiAqcG9ydF9nZXRfcG9ydHModm9pZCk7CitzdHJ1Y3Qgc2tfYnVmZiAqcG9ydF9zaG93X3N0YXRzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpOwordm9pZCBwb3J0X3JlY3ZfcHJvdG9fbXNnKHN0cnVjdCBza19idWZmICpidWYpOwordm9pZCBwb3J0X3JlY3ZfbWNhc3Qoc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IHBvcnRfbGlzdCAqZHApOwordm9pZCBwb3J0X3JlaW5pdCh2b2lkKTsKKworLyoqCisgKiBwb3J0X2xvY2sgLSBsb2NrIHBvcnQgaW5zdGFuY2UgcmVmZXJyZWQgdG8gYW5kIHJldHVybiBpdHMgcG9pbnRlcgorICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBvcnQgKnBvcnRfbG9jayh1MzIgcmVmKQoreworCXJldHVybiAoc3RydWN0IHBvcnQgKilyZWZfbG9jayhyZWYpOworfQorCisvKiogCisgKiBwb3J0X3VubG9jayAtIHVubG9jayBhIHBvcnQgaW5zdGFuY2UKKyAqIAorICogQ2FuIHVzZSBwb2ludGVyIGluc3RlYWQgb2YgcmVmX3VubG9jaygpIHNpbmNlIHBvcnQgaXMgYWxyZWFkeSBsb2NrZWQuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBvcnRfdW5sb2NrKHN0cnVjdCBwb3J0ICpwX3B0cikKK3sKKwlzcGluX3VubG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG9ydCogcG9ydF9kZXJlZih1MzIgcmVmKQoreworCXJldHVybiAoc3RydWN0IHBvcnQgKilyZWZfZGVyZWYocmVmKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcGVlcl9wb3J0KHN0cnVjdCBwb3J0ICpwX3B0cikKK3sKKwlyZXR1cm4gbXNnX2Rlc3Rwb3J0KCZwX3B0ci0+cHVibC5waGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcGVlcl9ub2RlKHN0cnVjdCBwb3J0ICpwX3B0cikKK3sKKwlyZXR1cm4gbXNnX2Rlc3Rub2RlKCZwX3B0ci0+cHVibC5waGRyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcG9ydF9jb25nZXN0ZWQoc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXJldHVybigocF9wdHItPnNlbnQgLSBwX3B0ci0+YWNrZWQpID49IChUSVBDX0ZMT1dfQ09OVFJPTF9XSU4gKiAyKSk7Cit9CisKKy8qKiAKKyAqIHBvcnRfcmVjdl9tc2cgLSByZWNlaXZlIG1lc3NhZ2UgZnJvbSBsb3dlciBsYXllciBhbmQgZGVsaXZlciB0byBwb3J0IHVzZXIKKyAqLworCitzdGF0aWMgaW5saW5lIGludCBwb3J0X3JlY3ZfbXNnKHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCXUzMiBkZXN0cG9ydCA9IG1zZ19kZXN0cG9ydChtc2cpOworCXUzMiBkc3ogPSBtc2dfZGF0YV9zeihtc2cpOworCXUzMiBlcnI7CisJCisJLyogZm9yd2FyZCB1bnJlc29sdmVkIG5hbWVkIG1lc3NhZ2UgKi8KKwlpZiAodW5saWtlbHkoIWRlc3Rwb3J0KSkgeworCQluZXRfcm91dGVfbXNnKGJ1Zik7CisJCXJldHVybiBkc3o7CisJfQorCisJLyogdmFsaWRhdGUgZGVzdGluYXRpb24gJiBwYXNzIHRvIHBvcnQsIG90aGVyd2lzZSByZWplY3QgbWVzc2FnZSAqLworCXBfcHRyID0gcG9ydF9sb2NrKGRlc3Rwb3J0KTsKKwlpZiAobGlrZWx5KHBfcHRyKSkgeworCQlpZiAobGlrZWx5KHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkpIHsKKwkJCWlmICgodW5saWtlbHkobXNnX29yaWdwb3J0KG1zZykgIT0gcGVlcl9wb3J0KHBfcHRyKSkpIHx8CisJCQkgICAgKHVubGlrZWx5KG1zZ19vcmlnbm9kZShtc2cpICE9IHBlZXJfbm9kZShwX3B0cikpKSB8fAorCQkJICAgICh1bmxpa2VseSghbXNnX2Nvbm5lY3RlZChtc2cpKSkpIHsKKwkJCQllcnIgPSBUSVBDX0VSUl9OT19QT1JUOworCQkJCXBvcnRfdW5sb2NrKHBfcHRyKTsKKwkJCQlnb3RvIHJlamVjdDsKKwkJCX0KKwkJfQorCQllcnIgPSBwX3B0ci0+ZGlzcGF0Y2hlcigmcF9wdHItPnB1YmwsIGJ1Zik7CisJCXBvcnRfdW5sb2NrKHBfcHRyKTsKKwkJaWYgKGxpa2VseSghZXJyKSkKKwkJCXJldHVybiBkc3o7CisJfSBlbHNlIHsKKwkJZXJyID0gVElQQ19FUlJfTk9fUE9SVDsKKwl9CityZWplY3Q6CisJZGJnKCJwb3J0LT5yZWplY3RpbmcsIGVyciA9ICV4Li5cbiIsZXJyKTsKKwlyZXR1cm4gdGlwY19yZWplY3RfbXNnKGJ1ZiwgZXJyKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9yZWYuYyBiL25ldC90aXBjL3JlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDA5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9yZWYuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIG5ldC90aXBjL3JlZi5jOiBUSVBDIG9iamVjdCByZWdpc3RyeSBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5MS0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJyZWYuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAic3Vic2NyLmgiCisjaW5jbHVkZSAibmFtZV9kaXN0ci5oIgorI2luY2x1ZGUgIm5hbWVfdGFibGUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkaXNjb3Zlci5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorI2luY2x1ZGUgIm5vZGUuaCIKKyNpbmNsdWRlICJiY2FzdC5oIgorCisvKgorICogT2JqZWN0IHJlZmVyZW5jZSB0YWJsZSBjb25zaXN0cyBvZiAyKipOIGVudHJpZXMuCisgKgorICogQSB1c2VkIGVudHJ5IGhhcyBvYmplY3QgcHRyICE9IDAsIHJlZmVyZW5jZSA9PSBYWFhYfG93biBpbmRleAorICoJCQkJICAgICAoWFhYWCBjaGFuZ2VzIGVhY2ggdGltZSBlbnRyeSBpcyBhY3F1aXJlZCkgCisgKiBBIGZyZWUgZW50cnkgaGFzIG9iamVjdCBwdHIgPT0gMCwgcmVmZXJlbmNlID09IFlZWVl8bmV4dCBmcmVlIGluZGV4CisgKgkJCQkgICAgIChZWVlZIGlzIG9uZSBtb3JlIHRoYW4gbGFzdCB1c2VkIFhYWFgpCisgKgorICogRnJlZSBsaXN0IGlzIGluaXRpYWxseSBjaGFpbmVkIGZyb20gZW50cnkgKDIqKk4pLTEgdG8gZW50cnkgMS4gCisgKiBFbnRyeSAwIGlzIG5vdCB1c2VkIHRvIGFsbG93IGluZGV4IDAgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgZnJlZSBsaXN0LgorICoKKyAqIE5vdGU6IEFueSBhY2NpZGVudGFsIHJlZmVyZW5jZSBvZiB0aGUgZm9ybSBYWFhYfDAtLTAgd29uJ3QgbWF0Y2ggZW50cnkgMAorICogYmVjYXVzZSBlbnRyeSAwJ3MgcmVmZXJlbmNlIGZpZWxkIGhhcyB0aGUgZm9ybSBYWFhYfDEtLTEuCisgKi8KKworc3RydWN0IHJlZl90YWJsZSByZWZfdGFibGUgPSB7IDAgfTsKKworcndsb2NrX3QgcmVmdGJsX2xvY2sgPSBSV19MT0NLX1VOTE9DS0VEOworCisvKioKKyAqIHJlZl90YWJsZV9pbml0IC0gY3JlYXRlIHJlZmVyZW5jZSB0YWJsZSBmb3Igb2JqZWN0cworICovCisKK2ludCByZWZfdGFibGVfaW5pdCh1MzIgcmVxdWVzdGVkX3NpemUsIHUzMiBzdGFydCkKK3sKKwlzdHJ1Y3QgcmVmZXJlbmNlICp0YWJsZTsKKwl1MzIgc3ogPSAxIDw8IDQ7CisJdTMyIGluZGV4X21hc2s7CisJaW50IGk7CisKKwl3aGlsZSAoc3ogPCByZXF1ZXN0ZWRfc2l6ZSkgeworCQlzeiA8PD0gMTsKKwl9CisJdGFibGUgPSAoc3RydWN0IHJlZmVyZW5jZSAqKXZtYWxsb2Moc3ogKiBzaXplb2Yoc3RydWN0IHJlZmVyZW5jZSkpOworCWlmICh0YWJsZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdyaXRlX2xvY2tfYmgoJnJlZnRibF9sb2NrKTsKKwlpbmRleF9tYXNrID0gc3ogLSAxOworCWZvciAoaSA9IHN6IC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJdGFibGVbaV0ub2JqZWN0ID0gMDsKKwkJdGFibGVbaV0ubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwkJdGFibGVbaV0uZGF0YS5uZXh0X3BsdXNfdXBwZXIgPSAoc3RhcnQgJiB+aW5kZXhfbWFzaykgKyBpIC0gMTsKKwl9CisJcmVmX3RhYmxlLmVudHJpZXMgPSB0YWJsZTsKKwlyZWZfdGFibGUuaW5kZXhfbWFzayA9IGluZGV4X21hc2s7CisJcmVmX3RhYmxlLmZpcnN0X2ZyZWUgPSBzeiAtIDE7CisJcmVmX3RhYmxlLmxhc3RfZnJlZSA9IDE7CisJd3JpdGVfdW5sb2NrX2JoKCZyZWZ0YmxfbG9jayk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qKgorICogcmVmX3RhYmxlX3N0b3AgLSBkZXN0cm95IHJlZmVyZW5jZSB0YWJsZSBmb3Igb2JqZWN0cworICovCisKK3ZvaWQgcmVmX3RhYmxlX3N0b3Aodm9pZCkKK3sKKwlpZiAoIXJlZl90YWJsZS5lbnRyaWVzKQorCQlyZXR1cm47CisKKwl2ZnJlZShyZWZfdGFibGUuZW50cmllcyk7CisJcmVmX3RhYmxlLmVudHJpZXMgPSAwOworfQorCisvKioKKyAqIHJlZl9hY3F1aXJlIC0gY3JlYXRlIHJlZmVyZW5jZSB0byBhbiBvYmplY3QKKyAqIAorICogUmV0dXJuIGEgdW5pcXVlIHJlZmVyZW5jZSB2YWx1ZSB3aGljaCBjYW4gYmUgdHJhbnNsYXRlZCBiYWNrIHRvIHRoZSBwb2ludGVyCisgKiAnb2JqZWN0JyBhdCBhIGxhdGVyIHRpbWUuICBBbHNvLCBwYXNzIGJhY2sgYSBwb2ludGVyIHRvIHRoZSBsb2NrIHByb3RlY3RpbmcgCisgKiB0aGUgb2JqZWN0LCBidXQgd2l0aG91dCBsb2NraW5nIGl0LgorICovCisKK3UzMiByZWZfYWNxdWlyZSh2b2lkICpvYmplY3QsIHNwaW5sb2NrX3QgKipsb2NrKQoreworCXN0cnVjdCByZWZlcmVuY2UgKmVudHJ5OworCXUzMiBpbmRleDsKKwl1MzIgaW5kZXhfbWFzazsKKwl1MzIgbmV4dF9wbHVzX3VwcGVyOworCXUzMiByZWZlcmVuY2UgPSAwOworCisJYXNzZXJ0KHJlZl90YWJsZS5lbnRyaWVzICYmIG9iamVjdCk7CisKKwl3cml0ZV9sb2NrX2JoKCZyZWZ0YmxfbG9jayk7CisJaWYgKHJlZl90YWJsZS5maXJzdF9mcmVlKSB7CisJCWluZGV4ID0gcmVmX3RhYmxlLmZpcnN0X2ZyZWU7CisJCWVudHJ5ID0gJihyZWZfdGFibGUuZW50cmllc1tpbmRleF0pOworCQlpbmRleF9tYXNrID0gcmVmX3RhYmxlLmluZGV4X21hc2s7CisJCS8qIHRha2UgbG9jayBpbiBjYXNlIGEgcHJldmlvdXMgdXNlciBvZiBlbnRyeSBzdGlsbCBob2xkcyBpdCAqLyAKKwkJc3Bpbl9sb2NrX2JoKCZlbnRyeS0+bG9jayk7ICAKKwkJbmV4dF9wbHVzX3VwcGVyID0gZW50cnktPmRhdGEubmV4dF9wbHVzX3VwcGVyOworCQlyZWZfdGFibGUuZmlyc3RfZnJlZSA9IG5leHRfcGx1c191cHBlciAmIGluZGV4X21hc2s7CisJCXJlZmVyZW5jZSA9IChuZXh0X3BsdXNfdXBwZXIgJiB+aW5kZXhfbWFzaykgKyBpbmRleDsKKwkJZW50cnktPmRhdGEucmVmZXJlbmNlID0gcmVmZXJlbmNlOworCQllbnRyeS0+b2JqZWN0ID0gb2JqZWN0OworICAgICAgICAgICAgICAgIGlmIChsb2NrICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAqbG9jayA9ICZlbnRyeS0+bG9jazsKKwkJc3Bpbl91bmxvY2tfYmgoJmVudHJ5LT5sb2NrKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZyZWZ0YmxfbG9jayk7CisJcmV0dXJuIHJlZmVyZW5jZTsKK30KKworLyoqCisgKiByZWZfZGlzY2FyZCAtIGludmFsaWRhdGUgcmVmZXJlbmNlcyB0byBhbiBvYmplY3QKKyAqIAorICogRGlzYWxsb3cgZnV0dXJlIHJlZmVyZW5jZXMgdG8gYW4gb2JqZWN0IGFuZCBmcmVlIHVwIHRoZSBlbnRyeSBmb3IgcmUtdXNlLgorICogTm90ZTogVGhlIGVudHJ5J3Mgc3Bpbl9sb2NrIG1heSBzdGlsbCBiZSBidXN5IGFmdGVyIGRpc2NhcmQKKyAqLworCit2b2lkIHJlZl9kaXNjYXJkKHUzMiByZWYpCit7CisJc3RydWN0IHJlZmVyZW5jZSAqZW50cnk7CisJdTMyIGluZGV4OyAKKwl1MzIgaW5kZXhfbWFzazsKKworCWFzc2VydChyZWZfdGFibGUuZW50cmllcyk7CisJYXNzZXJ0KHJlZiAhPSAwKTsKKworCXdyaXRlX2xvY2tfYmgoJnJlZnRibF9sb2NrKTsKKwlpbmRleF9tYXNrID0gcmVmX3RhYmxlLmluZGV4X21hc2s7CisJaW5kZXggPSByZWYgJiBpbmRleF9tYXNrOworCWVudHJ5ID0gJihyZWZfdGFibGUuZW50cmllc1tpbmRleF0pOworCWFzc2VydChlbnRyeS0+b2JqZWN0ICE9IDApOworCWFzc2VydChlbnRyeS0+ZGF0YS5yZWZlcmVuY2UgPT0gcmVmKTsKKworCS8qIG1hcmsgZW50cnkgYXMgdW51c2VkICovCisJZW50cnktPm9iamVjdCA9IDA7CisJaWYgKHJlZl90YWJsZS5maXJzdF9mcmVlID09IDApCisJCXJlZl90YWJsZS5maXJzdF9mcmVlID0gaW5kZXg7CisJZWxzZQorCQkvKiBuZXh0X3BsdXNfdXBwZXIgaXMgYWx3YXlzIFhYWFh8MC0tMCBmb3IgbGFzdCBmcmVlIGVudHJ5ICovCisJCXJlZl90YWJsZS5lbnRyaWVzW3JlZl90YWJsZS5sYXN0X2ZyZWVdLmRhdGEubmV4dF9wbHVzX3VwcGVyIAorCQkJfD0gaW5kZXg7CisJcmVmX3RhYmxlLmxhc3RfZnJlZSA9IGluZGV4OworCisJLyogaW5jcmVtZW50IHVwcGVyIGJpdHMgb2YgZW50cnkgdG8gaW52YWxpZGF0ZSBzdWJzZXF1ZW50IHJlZmVyZW5jZXMgKi8KKwllbnRyeS0+ZGF0YS5uZXh0X3BsdXNfdXBwZXIgPSAocmVmICYgfmluZGV4X21hc2spICsgKGluZGV4X21hc2sgKyAxKTsKKwl3cml0ZV91bmxvY2tfYmgoJnJlZnRibF9sb2NrKTsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvcmVmLmggYi9uZXQvdGlwYy9yZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjljZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvcmVmLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBuZXQvdGlwYy9yZWYuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG9iamVjdCByZWdpc3RyeSBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5MS0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfUkVGX0gKKyNkZWZpbmUgX1RJUENfUkVGX0gKKworLyoqCisgKiBzdHJ1Y3QgcmVmZXJlbmNlIC0gVElQQyBvYmplY3QgcmVmZXJlbmNlIGVudHJ5CisgKiBAb2JqZWN0OiBwb2ludGVyIHRvIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggcmVmZXJlbmNlIGVudHJ5CisgKiBAbG9jazogc3BpbmxvY2sgY29udHJvbGxpbmcgYWNjZXNzIHRvIG9iamVjdAorICogQGRhdGE6IHJlZmVyZW5jZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggb2JqZWN0IChvciBsaW5rIHRvIG5leHQgdW51c2VkIGVudHJ5KQorICovCisgCitzdHJ1Y3QgcmVmZXJlbmNlIHsKKwl2b2lkICpvYmplY3Q7CisJc3BpbmxvY2tfdCBsb2NrOworCXVuaW9uIHsKKwkJdTMyIG5leHRfcGx1c191cHBlcjsKKwkJdTMyIHJlZmVyZW5jZTsKKwl9IGRhdGE7Cit9OworCisvKioKKyAqIHN0cnVjdCByZWZfdGFibGUgLSB0YWJsZSBvZiBUSVBDIG9iamVjdCByZWZlcmVuY2UgZW50cmllcworICogQGVudHJpZXM6IHBvaW50ZXIgdG8gYXJyYXkgb2YgcmVmZXJlbmNlIGVudHJpZXMKKyAqIEBpbmRleF9tYXNrOiBiaXRtYXNrIGZvciBhcnJheSBpbmRleCBwb3J0aW9uIG9mIHJlZmVyZW5jZSB2YWx1ZXMKKyAqIEBmaXJzdF9mcmVlOiBhcnJheSBpbmRleCBvZiBmaXJzdCB1bnVzZWQgb2JqZWN0IHJlZmVyZW5jZSBlbnRyeQorICogQGxhc3RfZnJlZTogYXJyYXkgaW5kZXggb2YgbGFzdCB1bnVzZWQgb2JqZWN0IHJlZmVyZW5jZSBlbnRyeQorICovCisKK3N0cnVjdCByZWZfdGFibGUgeworCXN0cnVjdCByZWZlcmVuY2UgKmVudHJpZXM7CisJdTMyIGluZGV4X21hc2s7CisJdTMyIGZpcnN0X2ZyZWU7CisJdTMyIGxhc3RfZnJlZTsKK307CisKK2V4dGVybiBzdHJ1Y3QgcmVmX3RhYmxlIHJlZl90YWJsZTsKKworaW50IHJlZl90YWJsZV9pbml0KHUzMiByZXF1ZXN0ZWRfc2l6ZSwgdTMyIHN0YXJ0KTsKK3ZvaWQgcmVmX3RhYmxlX3N0b3Aodm9pZCk7CisKK3UzMiByZWZfYWNxdWlyZSh2b2lkICpvYmplY3QsIHNwaW5sb2NrX3QgKipsb2NrKTsKK3ZvaWQgcmVmX2Rpc2NhcmQodTMyIHJlZik7CisKKworLyoqCisgKiByZWZfbG9jayAtIGxvY2sgcmVmZXJlbmNlZCBvYmplY3QgYW5kIHJldHVybiBwb2ludGVyIHRvIGl0CisgKi8KKworc3RhdGljIGlubGluZSB2b2lkICpyZWZfbG9jayh1MzIgcmVmKQoreworCWlmIChsaWtlbHkocmVmX3RhYmxlLmVudHJpZXMpKSB7CisJCXN0cnVjdCByZWZlcmVuY2UgKnIgPQorCQkJJnJlZl90YWJsZS5lbnRyaWVzW3JlZiAmIHJlZl90YWJsZS5pbmRleF9tYXNrXTsKKworCQlzcGluX2xvY2tfYmgoJnItPmxvY2spOworCQlpZiAobGlrZWx5KHItPmRhdGEucmVmZXJlbmNlID09IHJlZikpCisJCQlyZXR1cm4gci0+b2JqZWN0OworCQlzcGluX3VubG9ja19iaCgmci0+bG9jayk7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHJlZl91bmxvY2sgLSB1bmxvY2sgcmVmZXJlbmNlZCBvYmplY3QgCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHJlZl91bmxvY2sodTMyIHJlZikKK3sKKwlpZiAobGlrZWx5KHJlZl90YWJsZS5lbnRyaWVzKSkgeworCQlzdHJ1Y3QgcmVmZXJlbmNlICpyID0KKwkJCSZyZWZfdGFibGUuZW50cmllc1tyZWYgJiByZWZfdGFibGUuaW5kZXhfbWFza107CisKKwkJaWYgKGxpa2VseShyLT5kYXRhLnJlZmVyZW5jZSA9PSByZWYpKQorCQkJc3Bpbl91bmxvY2tfYmgoJnItPmxvY2spOworCQllbHNlCisJCQllcnIoInJlZl91bmxvY2soKSBpbnZva2VkIHVzaW5nIG9ic29sZXRlIHJlZmVyZW5jZVxuIik7CisJfQorfQorCisvKioKKyAqIHJlZl9kZXJlZiAtIHJldHVybiBwb2ludGVyIHJlZmVyZW5jZWQgb2JqZWN0ICh3aXRob3V0IGxvY2tpbmcgaXQpCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkICpyZWZfZGVyZWYodTMyIHJlZikKK3sKKwlpZiAobGlrZWx5KHJlZl90YWJsZS5lbnRyaWVzKSkgeworCQlzdHJ1Y3QgcmVmZXJlbmNlICpyID0gCisJCQkmcmVmX3RhYmxlLmVudHJpZXNbcmVmICYgcmVmX3RhYmxlLmluZGV4X21hc2tdOworCisJCWlmIChsaWtlbHkoci0+ZGF0YS5yZWZlcmVuY2UgPT0gcmVmKSkKKwkJCXJldHVybiByLT5vYmplY3Q7CisJfQorCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL3NvY2tldC5jIGIvbmV0L3RpcGMvc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxZjhjMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3NvY2tldC5jCkBAIC0wLDAgKzEsMTcyNiBAQAorLyoKKyAqIG5ldC90aXBjL3NvY2tldC5jOiBUSVBDIHNvY2tldCBBUEkKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpcGMuaD4KKyNpbmNsdWRlIDxsaW51eC90aXBjX2NvbmZpZy5oPgorI2luY2x1ZGUgPG5ldC90aXBjL3RpcGNfbXNnLmg+CisjaW5jbHVkZSA8bmV0L3RpcGMvdGlwY19wb3J0Lmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisKKyNkZWZpbmUgU1NfTElTVEVOSU5HCS0xCS8qIHNvY2tldCBpcyBsaXN0ZW5pbmcgKi8KKyNkZWZpbmUgU1NfUkVBRFkJLTIJLyogc29ja2V0IGlzIGNvbm5lY3Rpb25sZXNzICovCisKKyNkZWZpbmUgT1ZFUkxPQURfTElNSVRfQkFTRSAgICA1MDAwCisKK3N0cnVjdCB0aXBjX3NvY2sgeworCXN0cnVjdCBzb2NrIHNrOworCXN0cnVjdCB0aXBjX3BvcnQgKnA7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07Cit9OworCisjZGVmaW5lIHRpcGNfc2soc2spICgoc3RydWN0IHRpcGNfc29jayopc2spCisKK3N0YXRpYyB1MzIgZGlzcGF0Y2goc3RydWN0IHRpcGNfcG9ydCAqdHBvcnQsIHN0cnVjdCBza19idWZmICpidWYpOworc3RhdGljIHZvaWQgd2FrZXVwZGlzcGF0Y2goc3RydWN0IHRpcGNfcG9ydCAqdHBvcnQpOworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBwYWNrZXRfb3BzOworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgc3RyZWFtX29wczsKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIG1zZ19vcHM7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gdGlwY19wcm90bzsKKworc3RhdGljIGludCBzb2NrZXRzX2VuYWJsZWQgPSAwOworCitzdGF0aWMgYXRvbWljX3QgdGlwY19xdWV1ZV9zaXplID0gQVRPTUlDX0lOSVQoMCk7CisKKworLyogCisgKiBzb2NrX2xvY2soKTogTG9jayBhIHBvcnQvc29ja2V0IHBhaXIuIGxvY2tfc29jaygpIGNhbiAKKyAqIG5vdCBiZSB1c2VkIGhlcmUsIHNpbmNlIHRoZSBzYW1lIGxvY2sgbXVzdCBwcm90ZWN0IHBvcnRzIAorICogd2l0aCBub24tc29ja2V0IGludGVyZmFjZXMuCisgKiBTZWUgbmV0LmMgZm9yIGRlc2NyaXB0aW9uIG9mIGxvY2tpbmcgcG9saWN5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc29ja19sb2NrKHN0cnVjdCB0aXBjX3NvY2sqIHRzb2NrKQoreworICAgICAgICBzcGluX2xvY2tfYmgodHNvY2stPnAtPmxvY2spOyAgICAgICAKK30KKworLyogCisgKiBzb2NrX3VubG9jaygpOiBVbmxvY2sgYSBwb3J0L3NvY2tldCBwYWlyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzb2NrX3VubG9jayhzdHJ1Y3QgdGlwY19zb2NrKiB0c29jaykKK3sKKyAgICAgICAgc3Bpbl91bmxvY2tfYmgodHNvY2stPnAtPmxvY2spOworfQorCisvKioKKyAqIHBvbGxtYXNrIC0gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNldCBvZiBwb2xsKCkgZXZlbnRzIGZvciBhIHNvY2tldAorICogQHNvY2s6IHNvY2tldCBzdHJ1Y3R1cmUKKyAqIAorICogVElQQyBzZXRzIHRoZSByZXR1cm5lZCBldmVudHMgYXMgZm9sbG93czoKKyAqIGEpIFBPTExSRE5PUk0gYW5kIFBPTExJTiBhcmUgc2V0IGlmIHRoZSBzb2NrZXQncyByZWNlaXZlIHF1ZXVlIGlzIG5vbi1lbXB0eQorICogICAgb3IgaWYgYSBjb25uZWN0aW9uLW9yaWVudGVkIHNvY2tldCBpcyBkb2VzIG5vdCBoYXZlIGFuIGFjdGl2ZSBjb25uZWN0aW9uCisgKiAgICAoaS5lLiBhIHJlYWQgb3BlcmF0aW9uIHdpbGwgbm90IGJsb2NrKS4KKyAqIGIpIFBPTExPVVQgaXMgc2V0IGV4Y2VwdCB3aGVuIGEgc29ja2V0J3MgY29ubmVjdGlvbiBoYXMgYmVlbiB0ZXJtaW5hdGVkCisgKiAgICAoaS5lLiBhIHdyaXRlIG9wZXJhdGlvbiB3aWxsIG5vdCBibG9jaykuCisgKiBjKSBQT0xMSFVQIGlzIHNldCB3aGVuIGEgc29ja2V0J3MgY29ubmVjdGlvbiBoYXMgYmVlbiB0ZXJtaW5hdGVkLgorICoKKyAqIElNUE9SVEFOVDogVGhlIGZhY3QgdGhhdCBhIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uIHdpbGwgbm90IGJsb2NrIGRvZXMgTk9UCisgKiBpbXBseSB0aGF0IHRoZSBvcGVyYXRpb24gd2lsbCBzdWNjZWVkIQorICogCisgKiBSZXR1cm5zIHBvbGxtYXNrIHZhbHVlCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgcG9sbG1hc2soc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwl1MzIgbWFzazsKKworCWlmICgoc2tiX3F1ZXVlX2xlbigmc29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpICE9IDApIHx8CisJICAgIChzb2NrLT5zdGF0ZSA9PSBTU19VTkNPTk5FQ1RFRCkgfHwKKwkgICAgKHNvY2stPnN0YXRlID09IFNTX0RJU0NPTk5FQ1RJTkcpKQorCQltYXNrID0gKFBPTExSRE5PUk0gfCBQT0xMSU4pOworCWVsc2UKKwkJbWFzayA9IDA7CisKKwlpZiAoc29jay0+c3RhdGUgPT0gU1NfRElTQ09OTkVDVElORykgCisJCW1hc2sgfD0gUE9MTEhVUDsKKwllbHNlCisJCW1hc2sgfD0gUE9MTE9VVDsKKworCXJldHVybiBtYXNrOworfQorCisKKy8qKgorICogYWR2YW5jZV9xdWV1ZSAtIGRpc2NhcmQgZmlyc3QgYnVmZmVyIGluIHF1ZXVlCisgKiBAdHNvY2s6IFRJUEMgc29ja2V0CisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGFkdmFuY2VfcXVldWUoc3RydWN0IHRpcGNfc29jayAqdHNvY2spCit7CisgICAgICAgIHNvY2tfbG9jayh0c29jayk7CisJYnVmX2Rpc2NhcmQoc2tiX2RlcXVldWUoJnRzb2NrLT5zay5za19yZWNlaXZlX3F1ZXVlKSk7CisgICAgICAgIHNvY2tfdW5sb2NrKHRzb2NrKTsKKwlhdG9taWNfZGVjKCZ0aXBjX3F1ZXVlX3NpemUpOworfQorCisvKioKKyAqIHRpcGNfY3JlYXRlIC0gY3JlYXRlIGEgVElQQyBzb2NrZXQKKyAqIEBzb2NrOiBwcmUtYWxsb2NhdGVkIHNvY2tldCBzdHJ1Y3R1cmUKKyAqIEBwcm90b2NvbDogcHJvdG9jb2wgaW5kaWNhdG9yIChtdXN0IGJlIDApCisgKiAKKyAqIFRoaXMgcm91dGluZSBjcmVhdGVzIGFuZCBhdHRhY2hlcyBhICdzdHJ1Y3Qgc29jaycgdG8gdGhlICdzdHJ1Y3Qgc29ja2V0JywKKyAqIHRoZW4gY3JlYXRlIGFuZCBhdHRhY2hlcyBhIFRJUEMgcG9ydCB0byB0aGUgJ3N0cnVjdCBzb2NrJyBwYXJ0LgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCB0aXBjX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHRpcGNfc29jayAqdHNvY2s7CisJc3RydWN0IHRpcGNfcG9ydCAqcG9ydDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisgICAgICAgIHUzMiByZWY7CisKKwlpZiAoKHNvY2stPnR5cGUgIT0gU09DS19TVFJFQU0pICYmIAorCSAgICAoc29jay0+dHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkgJiYKKwkgICAgKHNvY2stPnR5cGUgIT0gU09DS19ER1JBTSkgJiYKKwkgICAgKHNvY2stPnR5cGUgIT0gU09DS19SRE0pKQorCQlyZXR1cm4gLUVQUk9UT1RZUEU7CisKKwlpZiAodW5saWtlbHkocHJvdG9jb2wgIT0gMCkpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCisJcmVmID0gdGlwY19jcmVhdGVwb3J0X3JhdygwLCAmZGlzcGF0Y2gsICZ3YWtldXBkaXNwYXRjaCwgVElQQ19MT1dfSU1QT1JUQU5DRSk7CisJaWYgKHVubGlrZWx5KCFyZWYpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlzd2l0Y2ggKHNvY2stPnR5cGUpIHsKKwljYXNlIFNPQ0tfU1RSRUFNOgorCQlzb2NrLT5vcHMgPSAmc3RyZWFtX29wczsKKwkJYnJlYWs7CisJY2FzZSBTT0NLX1NFUVBBQ0tFVDoKKwkJc29jay0+b3BzID0gJnBhY2tldF9vcHM7CisJCWJyZWFrOworCWNhc2UgU09DS19ER1JBTToKKwkJdGlwY19zZXRfcG9ydHVucmVsaWFibGUocmVmLCAxKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT0NLX1JETToKKwkJdGlwY19zZXRfcG9ydHVucmV0dXJuYWJsZShyZWYsIDEpOworCQlzb2NrLT5vcHMgPSAmbXNnX29wczsKKwkJc29jay0+c3RhdGUgPSBTU19SRUFEWTsKKwkJYnJlYWs7CisJfQorCisJc2sgPSBza19hbGxvYyhBRl9USVBDLCBHRlBfS0VSTkVMLCAmdGlwY19wcm90bywgMSk7CisJaWYgKCFzaykgeworCQl0aXBjX2RlbGV0ZXBvcnQocmVmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoc2stPnNrX3NsZWVwKTsKKwlzay0+c2tfcmN2dGltZW8gPSA4ICogSFo7ICAgLyogZGVmYXVsdCBjb25uZWN0IHRpbWVvdXQgPSA4cyAqLworCisJdHNvY2sgPSB0aXBjX3NrKHNrKTsKKwlwb3J0ID0gdGlwY19nZXRfcG9ydChyZWYpOworCisJdHNvY2stPnAgPSBwb3J0OworCXBvcnQtPnVzcl9oYW5kbGUgPSB0c29jazsKKworCWluaXRfTVVURVgoJnRzb2NrLT5zZW0pOworCisJZGJnKCJzb2NrX2NyZWF0ZTogJXhcbiIsdHNvY2spOworCisJYXRvbWljX2luYygmdGlwY191c2VyX2NvdW50KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHJlbGVhc2UgLSBkZXN0cm95IGEgVElQQyBzb2NrZXQKKyAqIEBzb2NrOiBzb2NrZXQgdG8gZGVzdHJveQorICoKKyAqIFRoaXMgcm91dGluZSBjbGVhbnMgdXAgYW55IG1lc3NhZ2VzIHRoYXQgYXJlIHN0aWxsIHF1ZXVlZCBvbiB0aGUgc29ja2V0LgorICogRm9yIERHUkFNIGFuZCBSRE0gc29ja2V0IHR5cGVzLCBhbGwgcXVldWVkIG1lc3NhZ2VzIGFyZSByZWplY3RlZC4KKyAqIEZvciBTRVFQQUNLRVQgYW5kIFNUUkVBTSBzb2NrZXQgdHlwZXMsIHRoZSBmaXJzdCBtZXNzYWdlIGlzIHJlamVjdGVkCisgKiBhbmQgYW55IG90aGVycyBhcmUgZGlzY2FyZGVkLiAgKElmIHRoZSBmaXJzdCBtZXNzYWdlIG9uIGEgU1RSRUFNIHNvY2tldAorICogaXMgcGFydGlhbGx5LXJlYWQsIGl0IGlzIGRpc2NhcmRlZCBhbmQgdGhlIG5leHQgb25lIGlzIHJlamVjdGVkIGluc3RlYWQuKQorICogCisgKiBOT1RFOiBSZWplY3RlZCBtZXNzYWdlcyBhcmUgbm90IG5lY2Vzc2FyaWx5IHJldHVybmVkIHRvIHRoZSBzZW5kZXIhICBUaGV5CisgKiBhcmUgcmV0dXJuZWQgb3IgZGlzY2FyZGVkIGFjY29yZGluZyB0byB0aGUgImRlc3RpbmF0aW9uIGRyb3BwYWJsZSIgc2V0dGluZworICogc3BlY2lmaWVkIGZvciB0aGUgbWVzc2FnZSBieSB0aGUgc2VuZGVyLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IHJlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCByZXMgPSBUSVBDX09LOworCXN0cnVjdCBza19idWZmICpidWY7CisKKyAgICAgICAgZGJnKCJzb2NrX2RlbGV0ZTogJXhcbiIsdHNvY2spOworCWlmICghdHNvY2spCisJCXJldHVybiAwOworCWRvd25faW50ZXJydXB0aWJsZSgmdHNvY2stPnNlbSk7CisJaWYgKCFzb2NrLT5zaykgeworCQl1cCgmdHNvY2stPnNlbSk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBSZWplY3QgdW5yZWNlaXZlZCBtZXNzYWdlcywgdW5sZXNzIG5vIGxvbmdlciBjb25uZWN0ZWQgKi8KKworCXdoaWxlIChzb2NrLT5zdGF0ZSAhPSBTU19ESVNDT05ORUNUSU5HKSB7CisJCXNvY2tfbG9jayh0c29jayk7CisJCWJ1ZiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCWlmICghYnVmKQorCQkJdHNvY2stPnAtPnVzcl9oYW5kbGUgPSAwOworCQlzb2NrX3VubG9jayh0c29jayk7CisJCWlmICghYnVmKQorCQkJYnJlYWs7CisJCWlmIChUSVBDX1NLQl9DQihidWYpLT5oYW5kbGUgIT0gbXNnX2RhdGEoYnVmX21zZyhidWYpKSkKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCWVsc2UKKwkJCXRpcGNfcmVqZWN0X21zZyhidWYsIFRJUENfRVJSX05PX1BPUlQpOworCQlhdG9taWNfZGVjKCZ0aXBjX3F1ZXVlX3NpemUpOworCX0KKworCS8qIERlbGV0ZSBUSVBDIHBvcnQgKi8KKworCXJlcyA9IHRpcGNfZGVsZXRlcG9ydCh0c29jay0+cC0+cmVmKTsKKwlzb2NrLT5zayA9IE5VTEw7CisKKwkvKiBEaXNjYXJkIGFueSByZW1haW5pbmcgbWVzc2FnZXMgKi8KKworCXdoaWxlICgoYnVmID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJYXRvbWljX2RlYygmdGlwY19xdWV1ZV9zaXplKTsKKwl9CisKKwl1cCgmdHNvY2stPnNlbSk7CisKKwlzb2NrX3B1dChzayk7CisKKyAgICAgICAgYXRvbWljX2RlYygmdGlwY191c2VyX2NvdW50KTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIGJpbmQgLSBhc3NvY2lhdGUgb3IgZGlzYXNzb2NhdGUgVElQQyBuYW1lKHMpIHdpdGggYSBzb2NrZXQKKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAdWFkZHI6IHNvY2tldCBhZGRyZXNzIGRlc2NyaWJpbmcgbmFtZShzKSBhbmQgZGVzaXJlZCBvcGVyYXRpb24KKyAqIEB1YWRkcl9sZW46IHNpemUgb2Ygc29ja2V0IGFkZHJlc3MgZGF0YSBzdHJ1Y3R1cmUKKyAqIAorICogTmFtZSBhbmQgbmFtZSBzZXF1ZW5jZSBiaW5kaW5nIGlzIGluZGljYXRlZCB1c2luZyBhIHBvc2l0aXZlIHNjb3BlIHZhbHVlOworICogYSBuZWdhdGl2ZSBzY29wZSB2YWx1ZSB1bmJpbmRzIHRoZSBzcGVjaWZpZWQgbmFtZS4gIFNwZWNpZnlpbmcgbm8gbmFtZQorICogKGkuZS4gYSBzb2NrZXQgYWRkcmVzcyBsZW5ndGggb2YgMCkgdW5iaW5kcyBhbGwgbmFtZXMgZnJvbSB0aGUgc29ja2V0LgorICogCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCBiaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsIGludCB1YWRkcl9sZW4pCit7CisJc3RydWN0IHRpcGNfc29jayAqdHNvY2sgPSB0aXBjX3NrKHNvY2stPnNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqKXVhZGRyOworCWludCByZXM7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkKKwlpZiAodW5saWtlbHkoIXVhZGRyX2xlbikpIHsKKwkJcmVzID0gdGlwY193aXRoZHJhdyh0c29jay0+cC0+cmVmLCAwLCAwKTsKKwkJZ290byBleGl0OworCX0KKworCWlmICh1YWRkcl9sZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3RpcGMpKSB7CisJCXJlcyA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoYWRkci0+ZmFtaWx5ICE9IEFGX1RJUEMpIHsKKwkJcmVzID0gLUVBRk5PU1VQUE9SVDsKKwkJZ290byBleGl0OworCX0KKwlpZiAoYWRkci0+YWRkcnR5cGUgPT0gVElQQ19BRERSX05BTUUpCisJCWFkZHItPmFkZHIubmFtZXNlcS51cHBlciA9IGFkZHItPmFkZHIubmFtZXNlcS5sb3dlcjsKKwllbHNlIGlmIChhZGRyLT5hZGRydHlwZSAhPSBUSVBDX0FERFJfTkFNRVNFUSkgeworCQlyZXMgPSAtRUFGTk9TVVBQT1JUOworCQlnb3RvIGV4aXQ7CisJfQorICAgICAgICAKKyAgICAgICAJaWYgKGFkZHItPnNjb3BlID4gMCkKKwkJcmVzID0gdGlwY19wdWJsaXNoKHRzb2NrLT5wLT5yZWYsIGFkZHItPnNjb3BlLAorCQkJCSAgICZhZGRyLT5hZGRyLm5hbWVzZXEpOworCWVsc2UKKwkJcmVzID0gdGlwY193aXRoZHJhdyh0c29jay0+cC0+cmVmLCAtYWRkci0+c2NvcGUsCisJCQkJICAgICZhZGRyLT5hZGRyLm5hbWVzZXEpOworZXhpdDoKKwl1cCgmdHNvY2stPnNlbSk7CisJcmV0dXJuIHJlczsKK30KKworLyoqIAorICogZ2V0X25hbWUgLSBnZXQgcG9ydCBJRCBvZiBzb2NrZXQgb3IgcGVlciBzb2NrZXQKKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAdWFkZHI6IGFyZWEgZm9yIHJldHVybmVkIHNvY2tldCBhZGRyZXNzCisgKiBAdWFkZHJfbGVuOiBhcmVhIGZvciByZXR1cm5lZCBsZW5ndGggb2Ygc29ja2V0IGFkZHJlc3MKKyAqIEBwZWVyOiAwIHRvIG9idGFpbiBzb2NrZXQgbmFtZSwgMSB0byBvYnRhaW4gcGVlciBzb2NrZXQgbmFtZQorICogCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCBnZXRfbmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCAKKwkJICAgIGludCAqdWFkZHJfbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworCXN0cnVjdCBzb2NrYWRkcl90aXBjICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl90aXBjICopdWFkZHI7CisJdTMyIHJlczsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJKnVhZGRyX2xlbiA9IHNpemVvZigqYWRkcik7CisJYWRkci0+YWRkcnR5cGUgPSBUSVBDX0FERFJfSUQ7CisJYWRkci0+ZmFtaWx5ID0gQUZfVElQQzsKKwlhZGRyLT5zY29wZSA9IDA7CisJaWYgKHBlZXIpCisJCXJlcyA9IHRpcGNfcGVlcih0c29jay0+cC0+cmVmLCAmYWRkci0+YWRkci5pZCk7CisJZWxzZQorCQlyZXMgPSB0aXBjX293bmlkZW50aXR5KHRzb2NrLT5wLT5yZWYsICZhZGRyLT5hZGRyLmlkKTsKKwlhZGRyLT5hZGRyLm5hbWUuZG9tYWluID0gMDsKKworCXVwKCZ0c29jay0+c2VtKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHBvbGwgLSByZWFkIGFuZCBwb3NzaWJseSBibG9jayBvbiBwb2xsbWFzaworICogQGZpbGU6IGZpbGUgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc29ja2V0CisgKiBAc29jazogc29ja2V0IGZvciB3aGljaCB0byBjYWxjdWxhdGUgdGhlIHBvbGwgYml0cworICogQHdhaXQ6ID8/PworICoKKyAqIFJldHVybnMgdGhlIHBvbGxtYXNrCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBwb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCAKKwkJCSBwb2xsX3RhYmxlICp3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCBzb2NrLT5zay0+c2tfc2xlZXAsIHdhaXQpOworCS8qIE5FRUQgTE9DSyBIRVJFPyAqLworCXJldHVybiBwb2xsbWFzayhzb2NrKTsKK30KKworLyoqIAorICogZGVzdF9uYW1lX2NoZWNrIC0gdmVyaWZ5IHVzZXIgaXMgcGVybWl0dGVkIHRvIHNlbmQgdG8gc3BlY2lmaWVkIHBvcnQgbmFtZQorICogQGRlc3Q6IGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEBtOiBkZXNjcmlwdG9yIGZvciBtZXNzYWdlIHRvIGJlIHNlbnQKKyAqIAorICogUHJldmVudHMgcmVzdHJpY3RlZCBjb25maWd1cmF0aW9uIGNvbW1hbmRzIGZyb20gYmVpbmcgaXNzdWVkIGJ5CisgKiB1bmF1dGhvcml6ZWQgdXNlcnMuCisgKiAKKyAqIFJldHVybnMgMCBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQsIG90aGVyd2lzZSBlcnJubworICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGRlc3RfbmFtZV9jaGVjayhzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqZGVzdCwgc3RydWN0IG1zZ2hkciAqbSkKK3sKKwlzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciBoZHI7CisKKyAgICAgICAgaWYgKGxpa2VseShkZXN0LT5hZGRyLm5hbWUubmFtZS50eXBlID49IFRJUENfUkVTRVJWRURfVFlQRVMpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAobGlrZWx5KGRlc3QtPmFkZHIubmFtZS5uYW1lLnR5cGUgPT0gVElQQ19UT1BfU1JWKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAobGlrZWx5KGRlc3QtPmFkZHIubmFtZS5uYW1lLnR5cGUgIT0gVElQQ19DRkdfU1JWKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVBQ0NFUzsKKworICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJmhkciwgbS0+bXNnX2lvdlswXS5pb3ZfYmFzZSwgc2l6ZW9mKGhkcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKG50b2hzKGhkci50Y21fdHlwZSkgJiAweEMwMDApICYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisgICAgICAgIAorCXJldHVybiAwOworfQorCisvKioKKyAqIHNlbmRfbXNnIC0gc2VuZCBtZXNzYWdlIGluIGNvbm5lY3Rpb25sZXNzIG1hbm5lcgorICogQGlvY2I6ICh1bnVzZWQpCisgKiBAc29jazogc29ja2V0IHN0cnVjdHVyZQorICogQG06IG1lc3NhZ2UgdG8gc2VuZAorICogQHRvdGFsX2xlbjogKHVudXNlZCkKKyAqIAorICogTWVzc2FnZSBtdXN0IGhhdmUgYW4gZGVzdGluYXRpb24gc3BlY2lmaWVkIGV4cGxpY2l0bHkuCisgKiBVc2VkIGZvciBTT0NLX1JETSBhbmQgU09DS19ER1JBTSBtZXNzYWdlcywgCisgKiBhbmQgZm9yICdTWU4nIG1lc3NhZ2VzIG9uIFNPQ0tfU0VRUEFDS0VUIGFuZCBTT0NLX1NUUkVBTSBjb25uZWN0aW9ucy4KKyAqIChOb3RlOiAnU1lOKycgaXMgcHJvaGliaXRlZCBvbiBTT0NLX1NUUkVBTS4pCisgKiAKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG9yIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgc2VuZF9tc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkgICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbikKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqZGVzdCA9IChzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqKW0tPm1zZ19uYW1lOworCXN0cnVjdCBza19idWZmICpidWY7CisJaW50IG5lZWRzX2Nvbm47CisJaW50IHJlcyA9IC1FSU5WQUw7CisKKwlpZiAodW5saWtlbHkoIWRlc3QpKQorCQlyZXR1cm4gLUVERVNUQUREUlJFUTsKKwlpZiAodW5saWtlbHkoZGVzdC0+ZmFtaWx5ICE9IEFGX1RJUEMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5lZWRzX2Nvbm4gPSAoc29jay0+c3RhdGUgIT0gU1NfUkVBRFkpOworCWlmICh1bmxpa2VseShuZWVkc19jb25uKSkgeworCQlpZiAoc29jay0+c3RhdGUgPT0gU1NfTElTVEVOSU5HKQorCQkJcmV0dXJuIC1FUElQRTsKKwkJaWYgKHNvY2stPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEKQorCQkJcmV0dXJuIC1FSVNDT05OOworCQlpZiAoKHRzb2NrLT5wLT5wdWJsaXNoZWQpIHx8CisJCSAgICAoKHNvY2stPnR5cGUgPT0gU09DS19TVFJFQU0pICYmICh0b3RhbF9sZW4gIT0gMCkpKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKG5lZWRzX2Nvbm4pIHsKKworCQkvKiBBYm9ydCBhbnkgcGVuZGluZyBjb25uZWN0aW9uIGF0dGVtcHRzICh2ZXJ5IHVubGlrZWx5KSAqLworCisJCXdoaWxlICgoYnVmID0gc2tiX2RlcXVldWUoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJCXRpcGNfcmVqZWN0X21zZyhidWYsIFRJUENfRVJSX05PX1BPUlQpOworCQkJYXRvbWljX2RlYygmdGlwY19xdWV1ZV9zaXplKTsKKwkJfQorCisJCXNvY2stPnN0YXRlID0gU1NfQ09OTkVDVElORzsKKwl9CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChkZXN0LT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTkFNRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXMgPSBkZXN0X25hbWVfY2hlY2soZGVzdCwgbSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB0aXBjX3NlbmQybmFtZSh0c29jay0+cC0+cmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3QtPmFkZHIubmFtZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdC0+YWRkci5uYW1lLmRvbWFpbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5tc2dfaW92bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+bXNnX2lvdik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlc3QtPmFkZHJ0eXBlID09IFRJUENfQUREUl9JRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdGlwY19zZW5kMnBvcnQodHNvY2stPnAtPnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0LT5hZGRyLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+bXNnX2lvdmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1zZ19pb3YpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXN0LT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTUNBU1QpIHsKKwkJCWlmIChuZWVkc19jb25uKSB7CisJCQkJcmVzID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byBleGl0OworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXMgPSBkZXN0X25hbWVfY2hlY2soZGVzdCwgbSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB0aXBjX211bHRpY2FzdCh0c29jay0+cC0+cmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3QtPmFkZHIubmFtZXNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5tc2dfaW92bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+bXNnX2lvdik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKSB7CitleGl0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdHNvY2stPnNlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKwkJaWYgKG0tPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCkgeworCQkJcmVzID0gLUVXT1VMREJMT0NLOworCQkJZ290byBleGl0OworCQl9CisgICAgICAgICAgICAgICAgaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgqc29jay0+c2stPnNrX3NsZWVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRzb2NrLT5wLT5jb25nZXN0ZWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IC1FUkVTVEFSVFNZUzsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoMSk7Cit9CisKKy8qKiAKKyAqIHNlbmRfcGFja2V0IC0gc2VuZCBhIGNvbm5lY3Rpb24tb3JpZW50ZWQgbWVzc2FnZQorICogQGlvY2I6ICh1bnVzZWQpCisgKiBAc29jazogc29ja2V0IHN0cnVjdHVyZQorICogQG06IG1lc3NhZ2UgdG8gc2VuZAorICogQHRvdGFsX2xlbjogKHVudXNlZCkKKyAqIAorICogVXNlZCBmb3IgU09DS19TRVFQQUNLRVQgbWVzc2FnZXMgYW5kIFNPQ0tfU1RSRUFNIGRhdGEuCisgKiAKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG9yIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgc2VuZF9wYWNrZXQoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbikKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqZGVzdCA9IChzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqKW0tPm1zZ19uYW1lOworCWludCByZXM7CisKKwkvKiBIYW5kbGUgaW1wbGllZCBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQgKi8KKworCWlmICh1bmxpa2VseShkZXN0KSkKKwkJcmV0dXJuIHNlbmRfbXNnKGlvY2IsIHNvY2ssIG0sIHRvdGFsX2xlbik7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkgeworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVubGlrZWx5KHNvY2stPnN0YXRlICE9IFNTX0NPTk5FQ1RFRCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc29jay0+c3RhdGUgPT0gU1NfRElTQ09OTkVDVElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IC1FUElQRTsgICAKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSAtRU5PVENPTk47CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHJlcyA9IHRpcGNfc2VuZCh0c29jay0+cC0+cmVmLCBtLT5tc2dfaW92bGVuLCBtLT5tc2dfaW92KTsKKyAgICAgICAgICAgICAgICBpZiAobGlrZWx5KHJlcyAhPSAtRUxJTktDT05HKSkgeworZXhpdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ0c29jay0+c2VtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCQlpZiAobS0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKSB7CisJCQlyZXMgPSAtRVdPVUxEQkxPQ0s7CisJCQlnb3RvIGV4aXQ7CisJCX0KKyAgICAgICAgICAgICAgICBpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKCpzb2NrLT5zay0+c2tfc2xlZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdHNvY2stPnAtPmNvbmdlc3RlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgxKTsKK30KKworLyoqIAorICogc2VuZF9zdHJlYW0gLSBzZW5kIHN0cmVhbS1vcmllbnRlZCBkYXRhCisgKiBAaW9jYjogKHVudXNlZCkKKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAbTogZGF0YSB0byBzZW5kCisgKiBAdG90YWxfbGVuOiB0b3RhbCBsZW5ndGggb2YgZGF0YSB0byBiZSBzZW50CisgKiAKKyAqIFVzZWQgZm9yIFNPQ0tfU1RSRUFNIGRhdGEuCisgKiAKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG9yIGVycm5vIG90aGVyd2lzZQorICovCisKKworc3RhdGljIGludCBzZW5kX3N0cmVhbShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgdG90YWxfbGVuKQoreworCXN0cnVjdCBtc2doZHIgbXlfbXNnOworCXN0cnVjdCBpb3ZlYyBteV9pb3Y7CisJc3RydWN0IGlvdmVjICpjdXJyX2lvdjsKKwlpbnQgY3Vycl9pb3ZsZW47CisJY2hhciBfX3VzZXIgKmN1cnJfc3RhcnQ7CisJaW50IGN1cnJfbGVmdDsKKwlpbnQgYnl0ZXNfdG9fc2VuZDsKKwlpbnQgcmVzOworCQorCWlmIChsaWtlbHkodG90YWxfbGVuIDw9IFRJUENfTUFYX1VTRVJfTVNHX1NJWkUpKQorCQlyZXR1cm4gc2VuZF9wYWNrZXQoaW9jYiwgc29jaywgbSwgdG90YWxfbGVuKTsKKworCS8qIENhbiBvbmx5IHNlbmQgbGFyZ2UgZGF0YSBzdHJlYW1zIGlmIGFscmVhZHkgY29ubmVjdGVkICovCisKKyAgICAgICAgaWYgKHVubGlrZWx5KHNvY2stPnN0YXRlICE9IFNTX0NPTk5FQ1RFRCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc29jay0+c3RhdGUgPT0gU1NfRElTQ09OTkVDVElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVBJUEU7ICAgCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9UQ09OTjsKKyAgICAgICAgfQorCisJLyogCisJICogU2VuZCBlYWNoIGlvdmVjIGVudHJ5IHVzaW5nIG9uZSBvciBtb3JlIG1lc3NhZ2VzCisJICoKKwkgKiBOb3RlOiBUaGlzIGFsZ29yaXRobSBpcyBnb29kIGZvciB0aGUgbW9zdCBsaWtlbHkgY2FzZSAKKwkgKiAoaS5lLiBvbmUgbGFyZ2UgaW92ZWMgZW50cnkpLCBidXQgY291bGQgYmUgaW1wcm92ZWQgdG8gcGFzcyBzZXRzCisJICogb2Ygc21hbGwgaW92ZWMgZW50cmllcyBpbnRvIHNlbmRfcGFja2V0KCkuCisJICovCisKKwlteV9tc2cgPSAqbTsKKwljdXJyX2lvdiA9IG15X21zZy5tc2dfaW92OworCWN1cnJfaW92bGVuID0gbXlfbXNnLm1zZ19pb3ZsZW47CisJbXlfbXNnLm1zZ19pb3YgPSAmbXlfaW92OworCW15X21zZy5tc2dfaW92bGVuID0gMTsKKworCXdoaWxlIChjdXJyX2lvdmxlbi0tKSB7CisJCWN1cnJfc3RhcnQgPSBjdXJyX2lvdi0+aW92X2Jhc2U7CisJCWN1cnJfbGVmdCA9IGN1cnJfaW92LT5pb3ZfbGVuOworCisJCXdoaWxlIChjdXJyX2xlZnQpIHsKKwkJCWJ5dGVzX3RvX3NlbmQgPSAoY3Vycl9sZWZ0IDwgVElQQ19NQVhfVVNFUl9NU0dfU0laRSkKKwkJCQk/IGN1cnJfbGVmdCA6IFRJUENfTUFYX1VTRVJfTVNHX1NJWkU7CisJCQlteV9pb3YuaW92X2Jhc2UgPSBjdXJyX3N0YXJ0OworCQkJbXlfaW92Lmlvdl9sZW4gPSBieXRlc190b19zZW5kOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXMgPSBzZW5kX3BhY2tldChpb2NiLCBzb2NrLCAmbXlfbXNnLCAwKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworCQkJY3Vycl9sZWZ0IC09IGJ5dGVzX3RvX3NlbmQ7CisJCQljdXJyX3N0YXJ0ICs9IGJ5dGVzX3RvX3NlbmQ7CisJCX0KKworCQljdXJyX2lvdisrOworCX0KKworCXJldHVybiB0b3RhbF9sZW47Cit9CisKKy8qKgorICogYXV0b19jb25uZWN0IC0gY29tcGxldGUgY29ubmVjdGlvbiBzZXR1cCB0byBhIHJlbW90ZSBwb3J0CisgKiBAc29jazogc29ja2V0IHN0cnVjdHVyZQorICogQHRzb2NrOiBUSVBDLXNwZWNpZmljIHNvY2tldCBzdHJ1Y3R1cmUKKyAqIEBtc2c6IHBlZXIncyByZXNwb25zZSBtZXNzYWdlCisgKiAKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IGF1dG9fY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgdGlwY19zb2NrICp0c29jaywgCisJCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgdGlwY19wb3J0aWQgcGVlcjsKKworCWlmIChtc2dfZXJyY29kZShtc2cpKSB7CisJCXNvY2stPnN0YXRlID0gU1NfRElTQ09OTkVDVElORzsKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisJfQorCisJcGVlci5yZWYgPSBtc2dfb3JpZ3BvcnQobXNnKTsKKwlwZWVyLm5vZGUgPSBtc2dfb3JpZ25vZGUobXNnKTsKKwl0aXBjX2Nvbm5lY3QycG9ydCh0c29jay0+cC0+cmVmLCAmcGVlcik7CisJdGlwY19zZXRfcG9ydGltcG9ydGFuY2UodHNvY2stPnAtPnJlZiwgbXNnX2ltcG9ydGFuY2UobXNnKSk7CisJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc2V0X29yaWdfYWRkciAtIGNhcHR1cmUgc2VuZGVyJ3MgYWRkcmVzcyBmb3IgcmVjZWl2ZWQgbWVzc2FnZQorICogQG06IGRlc2NyaXB0b3IgZm9yIG1lc3NhZ2UgaW5mbworICogQG1zZzogcmVjZWl2ZWQgbWVzc2FnZSBoZWFkZXIKKyAqIAorICogTm90ZTogQWRkcmVzcyBpcyBub3QgY2FwdHVyZWQgaWYgbm90IHJlcXVlc3RlZCBieSByZWNlaXZlci4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X29yaWdfYWRkcihzdHJ1Y3QgbXNnaGRyICptLCBzdHJ1Y3QgdGlwY19tc2cgKm1zZykKK3sKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX3RpcGMgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3RpcGMgKiltLT5tc2dfbmFtZTsKKworICAgICAgICBpZiAoYWRkcikgeworCQlhZGRyLT5mYW1pbHkgPSBBRl9USVBDOworCQlhZGRyLT5hZGRydHlwZSA9IFRJUENfQUREUl9JRDsKKwkJYWRkci0+YWRkci5pZC5yZWYgPSBtc2dfb3JpZ3BvcnQobXNnKTsKKwkJYWRkci0+YWRkci5pZC5ub2RlID0gbXNnX29yaWdub2RlKG1zZyk7CisJCWFkZHItPmFkZHIubmFtZS5kb21haW4gPSAwOyAgIAkvKiBjb3VsZCBsZWF2ZSB1bmluaXRpYWxpemVkICovCisJCWFkZHItPnNjb3BlID0gMDsgICAJCS8qIGNvdWxkIGxlYXZlIHVuaW5pdGlhbGl6ZWQgKi8KKwkJbS0+bXNnX25hbWVsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3RpcGMpOworCX0KK30KKworLyoqCisgKiBhbmNfZGF0YV9yZWN2IC0gb3B0aW9uYWxseSBjYXB0dXJlIGFuY2lsbGFyeSBkYXRhIGZvciByZWNlaXZlZCBtZXNzYWdlIAorICogQG06IGRlc2NyaXB0b3IgZm9yIG1lc3NhZ2UgaW5mbworICogQG1zZzogcmVjZWl2ZWQgbWVzc2FnZSBoZWFkZXIKKyAqIEB0cG9ydDogVElQQyBwb3J0IGFzc29jaWF0ZWQgd2l0aCBtZXNzYWdlCisgKiAKKyAqIE5vdGU6IEFuY2lsbGFyeSBkYXRhIGlzIG5vdCBjYXB0dXJlZCBpZiBub3QgcmVxdWVzdGVkIGJ5IHJlY2VpdmVyLgorICogCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm5vCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgYW5jX2RhdGFfcmVjdihzdHJ1Y3QgbXNnaGRyICptLCBzdHJ1Y3QgdGlwY19tc2cgKm1zZywgCisJCQkJc3RydWN0IHRpcGNfcG9ydCAqdHBvcnQpCit7CisJdTMyIGFuY19kYXRhWzNdOworCXUzMiBlcnI7CisJdTMyIGRlc3RfdHlwZTsKKwlpbnQgcmVzOworCisJaWYgKGxpa2VseShtLT5tc2dfY29udHJvbGxlbiA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBPcHRpb25hbGx5IGNhcHR1cmUgZXJyb3JlZCBtZXNzYWdlIG9iamVjdChzKSAqLworCisJZXJyID0gbXNnID8gbXNnX2VycmNvZGUobXNnKSA6IDA7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJYW5jX2RhdGFbMF0gPSBlcnI7CisJCWFuY19kYXRhWzFdID0gbXNnX2RhdGFfc3oobXNnKTsKKwkJaWYgKChyZXMgPSBwdXRfY21zZyhtLCBTT0xfU09DS0VULCBUSVBDX0VSUklORk8sIDgsIGFuY19kYXRhKSkpCisJCQlyZXR1cm4gcmVzOworCQlpZiAoYW5jX2RhdGFbMV0gJiYKKwkJICAgIChyZXMgPSBwdXRfY21zZyhtLCBTT0xfU09DS0VULCBUSVBDX1JFVERBVEEsIGFuY19kYXRhWzFdLCAKKwkJCQkgICAgbXNnX2RhdGEobXNnKSkpKQorCQkJcmV0dXJuIHJlczsKKwl9CisKKwkvKiBPcHRpb25hbGx5IGNhcHR1cmUgbWVzc2FnZSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KKworCWRlc3RfdHlwZSA9IG1zZyA/IG1zZ190eXBlKG1zZykgOiBUSVBDX0RJUkVDVF9NU0c7CisJc3dpdGNoIChkZXN0X3R5cGUpIHsKKwljYXNlIFRJUENfTkFNRURfTVNHOgorCQlhbmNfZGF0YVswXSA9IG1zZ19uYW1ldHlwZShtc2cpOworCQlhbmNfZGF0YVsxXSA9IG1zZ19uYW1lbG93ZXIobXNnKTsKKwkJYW5jX2RhdGFbMl0gPSBtc2dfbmFtZWxvd2VyKG1zZyk7CisJCWJyZWFrOworCWNhc2UgVElQQ19NQ0FTVF9NU0c6CisJCWFuY19kYXRhWzBdID0gbXNnX25hbWV0eXBlKG1zZyk7CisJCWFuY19kYXRhWzFdID0gbXNnX25hbWVsb3dlcihtc2cpOworCQlhbmNfZGF0YVsyXSA9IG1zZ19uYW1ldXBwZXIobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NPTk5fTVNHOgorCQlhbmNfZGF0YVswXSA9IHRwb3J0LT5jb25uX3R5cGU7CisJCWFuY19kYXRhWzFdID0gdHBvcnQtPmNvbm5faW5zdGFuY2U7CisJCWFuY19kYXRhWzJdID0gdHBvcnQtPmNvbm5faW5zdGFuY2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFuY19kYXRhWzBdID0gMDsKKwl9CisJaWYgKGFuY19kYXRhWzBdICYmCisJICAgIChyZXMgPSBwdXRfY21zZyhtLCBTT0xfU09DS0VULCBUSVBDX0RFU1ROQU1FLCAxMiwgYW5jX2RhdGEpKSkKKwkJcmV0dXJuIHJlczsKKworCXJldHVybiAwOworfQorCisvKiogCisgKiByZWN2X21zZyAtIHJlY2VpdmUgcGFja2V0LW9yaWVudGVkIG1lc3NhZ2UKKyAqIEBpb2NiOiAodW51c2VkKQorICogQG06IGRlc2NyaXB0b3IgZm9yIG1lc3NhZ2UgaW5mbworICogQGJ1Zl9sZW46IHRvdGFsIHNpemUgb2YgdXNlciBidWZmZXIgYXJlYQorICogQGZsYWdzOiByZWNlaXZlIGZsYWdzCisgKiAKKyAqIFVzZWQgZm9yIFNPQ0tfREdSQU0sIFNPQ0tfUkRNLCBhbmQgU09DS19TRVFQQUNLRVQgbWVzc2FnZXMuCisgKiBJZiB0aGUgY29tcGxldGUgbWVzc2FnZSBkb2Vzbid0IGZpdCBpbiB1c2VyIGFyZWEsIHRydW5jYXRlIGl0LgorICoKKyAqIFJldHVybnMgc2l6ZSBvZiByZXR1cm5lZCBtZXNzYWdlIGRhdGEsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgcmVjdl9tc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkgICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IGJ1Zl9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJdW5zaWduZWQgaW50IHFfbGVuOworCXVuc2lnbmVkIGludCBzejsKKwl1MzIgZXJyOworCWludCByZXM7CisKKwkvKiBDdXJyZW50bHkgZG9lc24ndCBzdXBwb3J0IHJlY2VpdmluZyBpbnRvIG11bHRpcGxlIGlvdmVjIGVudHJpZXMgKi8KKworCWlmIChtLT5tc2dfaW92bGVuICE9IDEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIENhdGNoIGludmFsaWQgcmVjZWl2ZSBhdHRlbXB0cyAqLworCisJaWYgKHVubGlrZWx5KCFidWZfbGVuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCkgeworCQlpZiAodW5saWtlbHkoc29jay0+c3RhdGUgPT0gU1NfVU5DT05ORUNURUQpKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKwkJaWYgKHVubGlrZWx5KChzb2NrLT5zdGF0ZSA9PSBTU19ESVNDT05ORUNUSU5HKSAmJiAKKwkJCSAgICAgKHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSA9PSAwKSkpCisJCSAgICAgICAJcmV0dXJuIC1FTk9UQ09OTjsKKwl9CisKKwkvKiBMb29rIGZvciBhIG1lc3NhZ2UgaW4gcmVjZWl2ZSBxdWV1ZTsgd2FpdCBpZiBuZWNlc3NhcnkgKi8KKworCWlmICh1bmxpa2VseShkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworcmVzdGFydDoKKwlpZiAodW5saWtlbHkoKHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSA9PSAwKSAmJgorCQkgICAgIChmbGFncyAmIE1TR19ET05UV0FJVCkpKSB7CisJCXJlcyA9IC1FV09VTERCTE9DSzsKKwkJZ290byBleGl0OworCX0KKworCWlmICgocmVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAorCQkqc29jay0+c2stPnNrX3NsZWVwLCAKKwkJKChxX2xlbiA9IHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgfHwKKwkJIChzb2NrLT5zdGF0ZSA9PSBTU19ESVNDT05ORUNUSU5HKSkpICkpIHsKKwkJZ290byBleGl0OworCX0KKworCS8qIENhdGNoIGF0dGVtcHQgdG8gcmVjZWl2ZSBvbiBhbiBhbHJlYWR5IHRlcm1pbmF0ZWQgY29ubmVjdGlvbiAqLworCS8qIFtUSElTIENIRUNLIE1BWSBPVkVSTEFQIFdJVEggQU4gRUFSTElFUiBDSEVDS10gKi8KKworCWlmICghcV9sZW4pIHsKKwkJcmVzID0gLUVOT1RDT05OOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogR2V0IGFjY2VzcyB0byBmaXJzdCBtZXNzYWdlIGluIHJlY2VpdmUgcXVldWUgKi8KKworCWJ1ZiA9IHNrYl9wZWVrKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJbXNnID0gYnVmX21zZyhidWYpOworCXN6ID0gbXNnX2RhdGFfc3oobXNnKTsKKwllcnIgPSBtc2dfZXJyY29kZShtc2cpOworCisJLyogQ29tcGxldGUgY29ubmVjdGlvbiBzZXR1cCBmb3IgYW4gaW1wbGllZCBjb25uZWN0ICovCisKKwlpZiAodW5saWtlbHkoc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykpIHsKKwkJaWYgKChyZXMgPSBhdXRvX2Nvbm5lY3Qoc29jaywgdHNvY2ssIG1zZykpKQorCQkJZ290byBleGl0OworCX0KKworCS8qIERpc2NhcmQgYW4gZW1wdHkgbm9uLWVycm9yZWQgbWVzc2FnZSAmIHRyeSBhZ2FpbiAqLworCisJaWYgKCghc3opICYmICghZXJyKSkgeworCQlhZHZhbmNlX3F1ZXVlKHRzb2NrKTsKKwkJZ290byByZXN0YXJ0OworCX0KKworCS8qIENhcHR1cmUgc2VuZGVyJ3MgYWRkcmVzcyAob3B0aW9uYWwpICovCisKKwlzZXRfb3JpZ19hZGRyKG0sIG1zZyk7CisKKwkvKiBDYXB0dXJlIGFuY2lsbGFyeSBkYXRhIChvcHRpb25hbCkgKi8KKworCWlmICgocmVzID0gYW5jX2RhdGFfcmVjdihtLCBtc2csIHRzb2NrLT5wKSkpCisJCWdvdG8gZXhpdDsKKworCS8qIENhcHR1cmUgbWVzc2FnZSBkYXRhIChpZiB2YWxpZCkgJiBjb21wdXRlIHJldHVybiB2YWx1ZSAoYWx3YXlzKSAqLworCQorCWlmICghZXJyKSB7CisJCWlmICh1bmxpa2VseShidWZfbGVuIDwgc3opKSB7CisJCQlzeiA9IGJ1Zl9sZW47CisJCQltLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOworCQl9CisJCWlmICh1bmxpa2VseShjb3B5X3RvX3VzZXIobS0+bXNnX2lvdi0+aW92X2Jhc2UsIG1zZ19kYXRhKG1zZyksCisJCQkJCSAgc3opKSkgeworCQkJcmVzID0gLUVGQVVMVDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlyZXMgPSBzejsKKwl9IGVsc2UgeworCQlpZiAoKHNvY2stPnN0YXRlID09IFNTX1JFQURZKSB8fAorCQkgICAgKChlcnIgPT0gVElQQ19DT05OX1NIVVRET1dOKSB8fCBtLT5tc2dfY29udHJvbCkpCisJCQlyZXMgPSAwOworCQllbHNlCisJCQlyZXMgPSAtRUNPTk5SRVNFVDsKKwl9CisKKwkvKiBDb25zdW1lIHJlY2VpdmVkIG1lc3NhZ2UgKG9wdGlvbmFsKSAqLworCisJaWYgKGxpa2VseSghKGZsYWdzICYgTVNHX1BFRUspKSkgeworICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseSgrK3Rzb2NrLT5wLT5jb25uX3VuYWNrZWQgPj0gVElQQ19GTE9XX0NPTlRST0xfV0lOKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpcGNfYWNrbm93bGVkZ2UodHNvY2stPnAtPnJlZiwgdHNvY2stPnAtPmNvbm5fdW5hY2tlZCk7CisJCWFkdmFuY2VfcXVldWUodHNvY2spOworICAgICAgICB9CitleGl0OgorCXVwKCZ0c29jay0+c2VtKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiogCisgKiByZWN2X3N0cmVhbSAtIHJlY2VpdmUgc3RyZWFtLW9yaWVudGVkIGRhdGEKKyAqIEBpb2NiOiAodW51c2VkKQorICogQG06IGRlc2NyaXB0b3IgZm9yIG1lc3NhZ2UgaW5mbworICogQGJ1Zl9sZW46IHRvdGFsIHNpemUgb2YgdXNlciBidWZmZXIgYXJlYQorICogQGZsYWdzOiByZWNlaXZlIGZsYWdzCisgKiAKKyAqIFVzZWQgZm9yIFNPQ0tfU1RSRUFNIG1lc3NhZ2VzIG9ubHkuICBJZiBub3QgZW5vdWdoIGRhdGEgaXMgYXZhaWxhYmxlIAorICogd2lsbCBvcHRpb25hbGx5IHdhaXQgZm9yIG1vcmU7IG5ldmVyIHRydW5jYXRlcyBkYXRhLgorICoKKyAqIFJldHVybnMgc2l6ZSBvZiByZXR1cm5lZCBtZXNzYWdlIGRhdGEsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgcmVjdl9zdHJlYW0oc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IGJ1Zl9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJdW5zaWduZWQgaW50IHFfbGVuOworCXVuc2lnbmVkIGludCBzejsKKwlpbnQgc3pfdG9fY29weTsKKwlpbnQgc3pfY29waWVkID0gMDsKKwlpbnQgbmVlZGVkOworCWNoYXIgKmNycyA9IG0tPm1zZ19pb3YtPmlvdl9iYXNlOworCXVuc2lnbmVkIGNoYXIgKmJ1Zl9jcnM7CisJdTMyIGVycjsKKwlpbnQgcmVzOworCisJLyogQ3VycmVudGx5IGRvZXNuJ3Qgc3VwcG9ydCByZWNlaXZpbmcgaW50byBtdWx0aXBsZSBpb3ZlYyBlbnRyaWVzICovCisKKwlpZiAobS0+bXNnX2lvdmxlbiAhPSAxKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBDYXRjaCBpbnZhbGlkIHJlY2VpdmUgYXR0ZW1wdHMgKi8KKworCWlmICh1bmxpa2VseSghYnVmX2xlbikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVubGlrZWx5KHNvY2stPnN0YXRlID09IFNTX0RJU0NPTk5FQ1RJTkcpKSB7CisJCWlmIChza2JfcXVldWVfbGVuKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSkgPT0gMCkKKwkJCXJldHVybiAtRU5PVENPTk47CisJfSBlbHNlIGlmICh1bmxpa2VseShzb2NrLT5zdGF0ZSAhPSBTU19DT05ORUNURUQpKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJLyogTG9vayBmb3IgYSBtZXNzYWdlIGluIHJlY2VpdmUgcXVldWU7IHdhaXQgaWYgbmVjZXNzYXJ5ICovCisKKwlpZiAodW5saWtlbHkoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKK3Jlc3RhcnQ6CisJaWYgKHVubGlrZWx5KChza2JfcXVldWVfbGVuKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSkgPT0gMCkgJiYKKwkJICAgICAoZmxhZ3MgJiBNU0dfRE9OVFdBSVQpKSkgeworCQlyZXMgPSAoc3pfY29waWVkID09IDApID8gLUVXT1VMREJMT0NLIDogMDsKKwkJZ290byBleGl0OworCX0KKworCWlmICgocmVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAorCQkqc29jay0+c2stPnNrX3NsZWVwLCAKKwkJKChxX2xlbiA9IHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgfHwKKwkJIChzb2NrLT5zdGF0ZSA9PSBTU19ESVNDT05ORUNUSU5HKSkpICkpIHsKKwkJZ290byBleGl0OworCX0KKworCS8qIENhdGNoIGF0dGVtcHQgdG8gcmVjZWl2ZSBvbiBhbiBhbHJlYWR5IHRlcm1pbmF0ZWQgY29ubmVjdGlvbiAqLworCS8qIFtUSElTIENIRUNLIE1BWSBPVkVSTEFQIFdJVEggQU4gRUFSTElFUiBDSEVDS10gKi8KKworCWlmICghcV9sZW4pIHsKKwkJcmVzID0gLUVOT1RDT05OOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogR2V0IGFjY2VzcyB0byBmaXJzdCBtZXNzYWdlIGluIHJlY2VpdmUgcXVldWUgKi8KKworCWJ1ZiA9IHNrYl9wZWVrKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJbXNnID0gYnVmX21zZyhidWYpOworCXN6ID0gbXNnX2RhdGFfc3oobXNnKTsKKwllcnIgPSBtc2dfZXJyY29kZShtc2cpOworCisJLyogRGlzY2FyZCBhbiBlbXB0eSBub24tZXJyb3JlZCBtZXNzYWdlICYgdHJ5IGFnYWluICovCisKKwlpZiAoKCFzeikgJiYgKCFlcnIpKSB7CisJCWFkdmFuY2VfcXVldWUodHNvY2spOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogT3B0aW9uYWxseSBjYXB0dXJlIHNlbmRlcidzIGFkZHJlc3MgJiBhbmNpbGxhcnkgZGF0YSBvZiBmaXJzdCBtc2cgKi8KKworCWlmIChzel9jb3BpZWQgPT0gMCkgeworCQlzZXRfb3JpZ19hZGRyKG0sIG1zZyk7CisJCWlmICgocmVzID0gYW5jX2RhdGFfcmVjdihtLCBtc2csIHRzb2NrLT5wKSkpCisJCQlnb3RvIGV4aXQ7CisJfQorCisJLyogQ2FwdHVyZSBtZXNzYWdlIGRhdGEgKGlmIHZhbGlkKSAmIGNvbXB1dGUgcmV0dXJuIHZhbHVlIChhbHdheXMpICovCisJCisJaWYgKCFlcnIpIHsKKwkJYnVmX2NycyA9ICh1bnNpZ25lZCBjaGFyICopKFRJUENfU0tCX0NCKGJ1ZiktPmhhbmRsZSk7CisJCXN6ID0gYnVmLT50YWlsIC0gYnVmX2NyczsKKworCQluZWVkZWQgPSAoYnVmX2xlbiAtIHN6X2NvcGllZCk7CisJCXN6X3RvX2NvcHkgPSAoc3ogPD0gbmVlZGVkKSA/IHN6IDogbmVlZGVkOworCQlpZiAodW5saWtlbHkoY29weV90b191c2VyKGNycywgYnVmX2Nycywgc3pfdG9fY29weSkpKSB7CisJCQlyZXMgPSAtRUZBVUxUOworCQkJZ290byBleGl0OworCQl9CisJCXN6X2NvcGllZCArPSBzel90b19jb3B5OworCisJCWlmIChzel90b19jb3B5IDwgc3opIHsKKwkJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKQorCQkJCVRJUENfU0tCX0NCKGJ1ZiktPmhhbmRsZSA9IGJ1Zl9jcnMgKyBzel90b19jb3B5OworCQkJZ290byBleGl0OworCQl9CisKKwkJY3JzICs9IHN6X3RvX2NvcHk7CisJfSBlbHNlIHsKKwkJaWYgKHN6X2NvcGllZCAhPSAwKQorCQkJZ290byBleGl0OyAvKiBjYW4ndCBhZGQgZXJyb3IgbXNnIHRvIHZhbGlkIGRhdGEgKi8KKworCQlpZiAoKGVyciA9PSBUSVBDX0NPTk5fU0hVVERPV04pIHx8IG0tPm1zZ19jb250cm9sKQorCQkJcmVzID0gMDsKKwkJZWxzZQorCQkJcmVzID0gLUVDT05OUkVTRVQ7CisJfQorCisJLyogQ29uc3VtZSByZWNlaXZlZCBtZXNzYWdlIChvcHRpb25hbCkgKi8KKworCWlmIChsaWtlbHkoIShmbGFncyAmIE1TR19QRUVLKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkoKyt0c29jay0+cC0+Y29ubl91bmFja2VkID49IFRJUENfRkxPV19DT05UUk9MX1dJTikpCisgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX2Fja25vd2xlZGdlKHRzb2NrLT5wLT5yZWYsIHRzb2NrLT5wLT5jb25uX3VuYWNrZWQpOworCQlhZHZhbmNlX3F1ZXVlKHRzb2NrKTsKKyAgICAgICAgfQorCisJLyogTG9vcCBhcm91bmQgaWYgbW9yZSBkYXRhIGlzIHJlcXVpcmVkICovCisKKwlpZiAoKHN6X2NvcGllZCA8IGJ1Zl9sZW4pICAgIC8qIGRpZG4ndCBnZXQgYWxsIHJlcXVlc3RlZCBkYXRhICovIAorCSAgICAmJiAoZmxhZ3MgJiBNU0dfV0FJVEFMTCkgLyogLi4uIGFuZCBuZWVkIHRvIHdhaXQgZm9yIG1vcmUgKi8KKwkgICAgJiYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIC8qIC4uLiBhbmQgYXJlbid0IGp1c3QgcGVla2luZyBhdCBkYXRhICovCisJICAgICYmICghZXJyKSAgICAgICAgICAgICAgICAvKiAuLi4gYW5kIGhhdmVuJ3QgcmVhY2hlZCBhIEZJTiAqLworCSAgICApCisJCWdvdG8gcmVzdGFydDsKKworZXhpdDoKKwl1cCgmdHNvY2stPnNlbSk7CisJcmV0dXJuIHJlcyA/IHJlcyA6IHN6X2NvcGllZDsKK30KKworLyoqCisgKiBxdWV1ZV9vdmVybG9hZGVkIC0gdGVzdCBpZiBxdWV1ZSBvdmVybG9hZCBjb25kaXRpb24gZXhpc3RzCisgKiBAcXVldWVfc2l6ZTogY3VycmVudCBzaXplIG9mIHF1ZXVlCisgKiBAYmFzZTogbm9taW5hbCBtYXhpbXVtIHNpemUgb2YgcXVldWUKKyAqIEBtc2c6IG1lc3NhZ2UgdG8gYmUgYWRkZWQgdG8gcXVldWUKKyAqIAorICogUmV0dXJucyAxIGlmIHF1ZXVlIGlzIGN1cnJlbnRseSBvdmVybG9hZGVkLCAwIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgcXVldWVfb3ZlcmxvYWRlZCh1MzIgcXVldWVfc2l6ZSwgdTMyIGJhc2UsIHN0cnVjdCB0aXBjX21zZyAqbXNnKQoreworCXUzMiB0aHJlc2hvbGQ7CisJdTMyIGltcCA9IG1zZ19pbXBvcnRhbmNlKG1zZyk7CisKKwlpZiAoaW1wID09IFRJUENfTE9XX0lNUE9SVEFOQ0UpCisJCXRocmVzaG9sZCA9IGJhc2U7CisJZWxzZSBpZiAoaW1wID09IFRJUENfTUVESVVNX0lNUE9SVEFOQ0UpCisJCXRocmVzaG9sZCA9IGJhc2UgKiAyOworCWVsc2UgaWYgKGltcCA9PSBUSVBDX0hJR0hfSU1QT1JUQU5DRSkKKwkJdGhyZXNob2xkID0gYmFzZSAqIDEwMDsKKwllbHNlCisJCXJldHVybiAwOworCisJaWYgKG1zZ19jb25uZWN0ZWQobXNnKSkKKwkJdGhyZXNob2xkICo9IDQ7CisKKwlyZXR1cm4gKHF1ZXVlX3NpemUgPiB0aHJlc2hvbGQpOworfQorCisvKiogCisgKiBhc3luY19kaXNjb25uZWN0IC0gd3JhcHBlciBmdW5jdGlvbiB1c2VkIHRvIGRpc2Nvbm5lY3QgcG9ydAorICogQHBvcnRyZWY6IFRJUEMgcG9ydCByZWZlcmVuY2UgKHBhc3NlZCBhcyBwb2ludGVyLXNpemVkIHZhbHVlKQorICovCisKK3N0YXRpYyB2b2lkIGFzeW5jX2Rpc2Nvbm5lY3QodW5zaWduZWQgbG9uZyBwb3J0cmVmKQoreworCXRpcGNfZGlzY29ubmVjdCgodTMyKXBvcnRyZWYpOworfQorCisvKiogCisgKiBkaXNwYXRjaCAtIGhhbmRsZSBhcnJpdmluZyBtZXNzYWdlCisgKiBAdHBvcnQ6IFRJUEMgcG9ydCB0aGF0IHJlY2VpdmVkIG1lc3NhZ2UKKyAqIEBidWY6IG1lc3NhZ2UKKyAqIAorICogQ2FsbGVkIHdpdGggcG9ydCBsb2NrZWQuICBNdXN0IG5vdCB0YWtlIHNvY2tldCBsb2NrIHRvIGF2b2lkIGRlYWRsb2NrIHJpc2suCisgKiAKKyAqIFJldHVybnMgVElQQyBlcnJvciBzdGF0dXMgY29kZSAoVElQQ19PSyBpZiBtZXNzYWdlIGlzIG5vdCB0byBiZSByZWplY3RlZCkKKyAqLworCitzdGF0aWMgdTMyIGRpc3BhdGNoKHN0cnVjdCB0aXBjX3BvcnQgKnRwb3J0LCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gKHN0cnVjdCB0aXBjX3NvY2sgKil0cG9ydC0+dXNyX2hhbmRsZTsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXUzMiByZWN2X3FfbGVuOworCisJLyogUmVqZWN0IG1lc3NhZ2UgaWYgc29ja2V0IGlzIGNsb3NpbmcgKi8KKworCWlmICghdHNvY2spCisJCXJldHVybiBUSVBDX0VSUl9OT19QT1JUOworCisJLyogUmVqZWN0IG1lc3NhZ2UgaWYgaXQgaXMgd3Jvbmcgc29ydCBvZiBtZXNzYWdlIGZvciBzb2NrZXQgKi8KKworCS8qCisJICogV09VTEQgSVQgQkUgQkVUVEVSIFRPIEpVU1QgRElTQ0FSRCBUSEVTRSBNRVNTQUdFUyBJTlNURUFEPworCSAqICJOTyBQT1JUIiBJU04nVCBSRUFMTFkgVEhFIFJJR0hUIEVSUk9SIENPREUsIEFORCBUSEVSRSBNQVkKKwkgKiBCRSBTRUNVUklUWSBJTVBMSUNBVElPTlMgSU5IRVJFTlQgSU4gUkVKRUNUSU5HIElOVkFMSUQgVFJBRkZJQworCSAqLworCXNvY2sgPSB0c29jay0+c2suc2tfc29ja2V0OworCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19SRUFEWSkgeworCQlpZiAobXNnX2Nvbm5lY3RlZChtc2cpKSB7CisJCQltc2dfZGJnKG1zZywgImRpc3BhdGNoIGZpbHRlciAxXG4iKTsKKwkJCXJldHVybiBUSVBDX0VSUl9OT19QT1JUOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKG1zZ19tY2FzdChtc2cpKSB7CisJCQltc2dfZGJnKG1zZywgImRpc3BhdGNoIGZpbHRlciAyXG4iKTsKKwkJCXJldHVybiBUSVBDX0VSUl9OT19QT1JUOworCQl9CisJCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNURUQpIHsKKwkJCWlmICghbXNnX2Nvbm5lY3RlZChtc2cpKSB7CisJCQkJbXNnX2RiZyhtc2csICJkaXNwYXRjaCBmaWx0ZXIgM1xuIik7CisJCQkJcmV0dXJuIFRJUENfRVJSX05PX1BPUlQ7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykgeworCQkJaWYgKCFtc2dfY29ubmVjdGVkKG1zZykgJiYgKG1zZ19lcnJjb2RlKG1zZykgPT0gMCkpIHsKKwkJCQltc2dfZGJnKG1zZywgImRpc3BhdGNoIGZpbHRlciA0XG4iKTsKKwkJCQlyZXR1cm4gVElQQ19FUlJfTk9fUE9SVDsKKwkJCX0KKwkJfSAKKwkJZWxzZSBpZiAoc29jay0+c3RhdGUgPT0gU1NfTElTVEVOSU5HKSB7CisJCQlpZiAobXNnX2Nvbm5lY3RlZChtc2cpIHx8IG1zZ19lcnJjb2RlKG1zZykpIHsKKwkJCQltc2dfZGJnKG1zZywgImRpc3BhdGNoIGZpbHRlciA1XG4iKTsKKwkJCQlyZXR1cm4gVElQQ19FUlJfTk9fUE9SVDsKKwkJCX0KKwkJfSAKKwkJZWxzZSBpZiAoc29jay0+c3RhdGUgPT0gU1NfRElTQ09OTkVDVElORykgeworCQkJbXNnX2RiZyhtc2csICJkaXNwYXRjaCBmaWx0ZXIgNlxuIik7CisJCQlyZXR1cm4gVElQQ19FUlJfTk9fUE9SVDsKKwkJfQorCQllbHNlIC8qIChzb2NrLT5zdGF0ZSA9PSBTU19VTkNPTk5FQ1RFRCkgKi8geworCQkJaWYgKG1zZ19jb25uZWN0ZWQobXNnKSB8fCBtc2dfZXJyY29kZShtc2cpKSB7CisJCQkJbXNnX2RiZyhtc2csICJkaXNwYXRjaCBmaWx0ZXIgN1xuIik7CisJCQkJcmV0dXJuIFRJUENfRVJSX05PX1BPUlQ7CisJCQl9CisJCX0KKwl9CisKKwkvKiBSZWplY3QgbWVzc2FnZSBpZiB0aGVyZSBpc24ndCByb29tIHRvIHF1ZXVlIGl0ICovCisKKwlpZiAodW5saWtlbHkoKHUzMilhdG9taWNfcmVhZCgmdGlwY19xdWV1ZV9zaXplKSA+IAorCQkgICAgIE9WRVJMT0FEX0xJTUlUX0JBU0UpKSB7CisJCWlmIChxdWV1ZV9vdmVybG9hZGVkKGF0b21pY19yZWFkKCZ0aXBjX3F1ZXVlX3NpemUpLCAKKwkJCQkgICAgIE9WRVJMT0FEX0xJTUlUX0JBU0UsIG1zZykpCisJCQlyZXR1cm4gVElQQ19FUlJfT1ZFUkxPQUQ7CisgICAgICAgIH0KKwlyZWN2X3FfbGVuID0gc2tiX3F1ZXVlX2xlbigmdHNvY2stPnNrLnNrX3JlY2VpdmVfcXVldWUpOworCWlmICh1bmxpa2VseShyZWN2X3FfbGVuID4gKE9WRVJMT0FEX0xJTUlUX0JBU0UgLyAyKSkpIHsKKwkJaWYgKHF1ZXVlX292ZXJsb2FkZWQocmVjdl9xX2xlbiwgCisJCQkJICAgICBPVkVSTE9BRF9MSU1JVF9CQVNFIC8gMiwgbXNnKSkgCisJCQlyZXR1cm4gVElQQ19FUlJfT1ZFUkxPQUQ7CisgICAgICAgIH0KKworCS8qIEluaXRpYXRlIGNvbm5lY3Rpb24gdGVybWluYXRpb24gZm9yIGFuIGluY29taW5nICdGSU4nICovCisKKwlpZiAodW5saWtlbHkobXNnX2VycmNvZGUobXNnKSAmJiAoc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVEVEKSkpIHsKKwkJc29jay0+c3RhdGUgPSBTU19ESVNDT05ORUNUSU5HOworCQkvKiBOb3RlOiBVc2Ugc2lnbmFsIHNpbmNlIHBvcnQgbG9jayBpcyBhbHJlYWR5IHRha2VuISAqLworCQlrX3NpZ25hbCgoSGFuZGxlcilhc3luY19kaXNjb25uZWN0LCB0cG9ydC0+cmVmKTsKKwl9CisKKwkvKiBFbnF1ZXVlIG1lc3NhZ2UgKGZpbmFsbHkhKSAqLworCisJbXNnX2RiZyhtc2csIjxESVNQPDogIik7CisJVElQQ19TS0JfQ0IoYnVmKS0+aGFuZGxlID0gbXNnX2RhdGEobXNnKTsKKwlhdG9taWNfaW5jKCZ0aXBjX3F1ZXVlX3NpemUpOworCXNrYl9xdWV1ZV90YWlsKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSwgYnVmKTsKKworICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoc29jay0+c2stPnNrX3NsZWVwKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworLyoqIAorICogd2FrZXVwZGlzcGF0Y2ggLSB3YWtlIHVwIHBvcnQgYWZ0ZXIgY29uZ2VzdGlvbgorICogQHRwb3J0OiBwb3J0IHRvIHdha2V1cAorICogCisgKiBDYWxsZWQgd2l0aCBwb3J0IGxvY2sgb24uCisgKi8KKworc3RhdGljIHZvaWQgd2FrZXVwZGlzcGF0Y2goc3RydWN0IHRpcGNfcG9ydCAqdHBvcnQpCit7CisJc3RydWN0IHRpcGNfc29jayAqdHNvY2sgPSAoc3RydWN0IHRpcGNfc29jayAqKXRwb3J0LT51c3JfaGFuZGxlOworCisgICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSh0c29jay0+c2suc2tfc2xlZXApOworfQorCisvKioKKyAqIGNvbm5lY3QgLSBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIGFub3RoZXIgVElQQyBwb3J0CisgKiBAc29jazogc29ja2V0IHN0cnVjdHVyZQorICogQGRlc3Q6IHNvY2tldCBhZGRyZXNzIGZvciBkZXN0aW5hdGlvbiBwb3J0CisgKiBAZGVzdGxlbjogc2l6ZSBvZiBzb2NrZXQgYWRkcmVzcyBkYXRhIHN0cnVjdHVyZQorICogQGZsYWdzOiAodW51c2VkKQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IGNvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICpkZXN0LCBpbnQgZGVzdGxlbiwgCisJCSAgIGludCBmbGFncykKK3sKKyAgIHN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CisgICBzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqZHN0ID0gKHN0cnVjdCBzb2NrYWRkcl90aXBjICopZGVzdDsKKyAgIHN0cnVjdCBtc2doZHIgbSA9IHswLH07CisgICBzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworICAgc3RydWN0IHRpcGNfbXNnICptc2c7CisgICBpbnQgcmVzOworCisgICAvKiBGb3Igbm93LCBUSVBDIGRvZXMgbm90IGFsbG93IHVzZSBvZiBjb25uZWN0KCkgd2l0aCBER1JBTSBvciBSRE0gdHlwZXMgKi8KKworICAgaWYgKHNvY2stPnN0YXRlID09IFNTX1JFQURZKQorCSAgIHJldHVybiAtRU9QTk9UU1VQUDsKKworICAgLyogTU9WRSBUSEUgUkVTVCBPRiBUSElTIEVSUk9SIENIRUNLSU5HIFRPIHNlbmRfbXNnKCk/ICovCisgICBpZiAoc29jay0+c3RhdGUgPT0gU1NfTElTVEVOSU5HKQorCSAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgIGlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNUSU5HKQorCSAgIHJldHVybiAtRUFMUkVBRFk7CisgICBpZiAoc29jay0+c3RhdGUgIT0gU1NfVU5DT05ORUNURUQpCisgICAgICAgICAgIHJldHVybiAtRUlTQ09OTjsKKworICAgaWYgKChkc3QtPmZhbWlseSAhPSBBRl9USVBDKSB8fAorICAgICAgICgoZHN0LT5hZGRydHlwZSAhPSBUSVBDX0FERFJfTkFNRSkgJiYgKGRzdC0+YWRkcnR5cGUgIT0gVElQQ19BRERSX0lEKSkpCisgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAvKiBTZW5kIGEgJ1NZTi0nIHRvIGRlc3RpbmF0aW9uICovCisKKyAgIG0ubXNnX25hbWUgPSBkZXN0OworICAgaWYgKChyZXMgPSBzZW5kX21zZygwLCBzb2NrLCAmbSwgMCkpIDwgMCkgeworCSAgIHNvY2stPnN0YXRlID0gU1NfRElTQ09OTkVDVElORzsKKwkgICByZXR1cm4gcmVzOworICAgfQorCisgICBpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkgCisgICAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7CisJCisgICAvKiBXYWl0IGZvciBkZXN0aW5hdGlvbidzICdBQ0snIHJlc3BvbnNlICovCisKKyAgIHJlcyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KCpzb2NrLT5zay0+c2tfc2xlZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2JfcXVldWVfbGVuKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSksCisJCQkJCSAgc29jay0+c2stPnNrX3JjdnRpbWVvKTsKKyAgIGJ1ZiA9IHNrYl9wZWVrKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisgICBpZiAocmVzID4gMCkgeworCSAgIG1zZyA9IGJ1Zl9tc2coYnVmKTsKKyAgICAgICAgICAgcmVzID0gYXV0b19jb25uZWN0KHNvY2ssIHRzb2NrLCBtc2cpOworICAgICAgICAgICBpZiAoIXJlcykgeworCQkgICBpZiAoZHN0LT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTkFNRSkgeworCQkJICAgdHNvY2stPnAtPmNvbm5fdHlwZSA9IGRzdC0+YWRkci5uYW1lLm5hbWUudHlwZTsKKwkJCSAgIHRzb2NrLT5wLT5jb25uX2luc3RhbmNlID0gZHN0LT5hZGRyLm5hbWUubmFtZS5pbnN0YW5jZTsKKwkJICAgfQorCQkgICBpZiAoIW1zZ19kYXRhX3N6KG1zZykpCisJCQkgICBhZHZhbmNlX3F1ZXVlKHRzb2NrKTsKKwkgICB9CisgICB9IGVsc2UgeworCSAgIGlmIChyZXMgPT0gMCkgeworCQkgICByZXMgPSAtRVRJTUVET1VUOworCSAgIH0gZWxzZQorCSAgICAgICAgICAgeyAvKiBsZWF2ZSAicmVzIiB1bmNoYW5nZWQgKi8gfQorCSAgIHNvY2stPnN0YXRlID0gU1NfRElTQ09OTkVDVElORzsKKyAgIH0KKworICAgdXAoJnRzb2NrLT5zZW0pOworICAgcmV0dXJuIHJlczsKK30KKworLyoqIAorICogbGlzdGVuIC0gYWxsb3cgc29ja2V0IHRvIGxpc3RlbiBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMKKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAbGVuOiAodW51c2VkKQorICogCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCBsaXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxlbikKK3sKKwkvKiBSRVFVSVJFUyBTT0NLRVQgTE9DS0lORyBPRiBTT01FIFNPUlQ/ICovCisKKwlpZiAoc29jay0+c3RhdGUgPT0gU1NfUkVBRFkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoc29jay0+c3RhdGUgIT0gU1NfVU5DT05ORUNURUQpCisJCXJldHVybiAtRUlOVkFMOworCXNvY2stPnN0YXRlID0gU1NfTElTVEVOSU5HOworICAgICAgICByZXR1cm4gMDsKK30KKworLyoqIAorICogYWNjZXB0IC0gd2FpdCBmb3IgY29ubmVjdGlvbiByZXF1ZXN0CisgKiBAc29jazogbGlzdGVuaW5nIHNvY2tldAorICogQG5ld3NvY2s6IG5ldyBzb2NrZXQgdGhhdCBpcyB0byBiZSBjb25uZWN0ZWQKKyAqIEBmbGFnczogZmlsZS1yZWxhdGVkIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBzb2NrZXQKKyAqIAorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworCXN0cnVjdCBza19idWZmICpidWY7CisJaW50IHJlcyA9IC1FRkFVTFQ7CisKKwlpZiAoc29jay0+c3RhdGUgPT0gU1NfUkVBRFkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoc29jay0+c3RhdGUgIT0gU1NfTElTVEVOSU5HKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlpZiAodW5saWtlbHkoKHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSA9PSAwKSAmJiAKKwkJICAgICAoZmxhZ3MgJiBPX05PTkJMT0NLKSkpCisJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKnNvY2stPnNrLT5za19zbGVlcCwgCisJCQkJICAgICBza2JfcXVldWVfbGVuKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSkpKSB7CisJCXJlcyA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKwlidWYgPSBza2JfcGVlaygmc29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpOworCisJcmVzID0gdGlwY19jcmVhdGUobmV3c29jaywgMCk7CisJaWYgKCFyZXMpIHsKKwkJc3RydWN0IHRpcGNfc29jayAqbmV3X3Rzb2NrID0gdGlwY19zayhuZXdzb2NrLT5zayk7CisJCXN0cnVjdCB0aXBjX3BvcnRpZCBpZDsKKwkJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJCXUzMiBuZXdfcmVmID0gbmV3X3Rzb2NrLT5wLT5yZWY7CisKKwkJaWQucmVmID0gbXNnX29yaWdwb3J0KG1zZyk7CisJCWlkLm5vZGUgPSBtc2dfb3JpZ25vZGUobXNnKTsKKwkJdGlwY19jb25uZWN0MnBvcnQobmV3X3JlZiwgJmlkKTsKKwkJbmV3c29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisKKwkJdGlwY19zZXRfcG9ydGltcG9ydGFuY2UobmV3X3JlZiwgbXNnX2ltcG9ydGFuY2UobXNnKSk7CisJCWlmIChtc2dfbmFtZWQobXNnKSkgeworCQkJbmV3X3Rzb2NrLT5wLT5jb25uX3R5cGUgPSBtc2dfbmFtZXR5cGUobXNnKTsKKwkJCW5ld190c29jay0+cC0+Y29ubl9pbnN0YW5jZSA9IG1zZ19uYW1laW5zdChtc2cpOworCQl9CisKKyAgICAgICAgICAgICAgIC8qIAorCQkgKiBSZXNwb25kIHRvICdTWU4tJyBieSBkaXNjYXJkaW5nIGl0ICYgcmV0dXJuaW5nICdBQ0snLS4KKwkJICogUmVzcG9uZCB0byAnU1lOKycgYnkgcXVldWluZyBpdCBvbiBuZXcgc29ja2V0LgorCQkgKi8KKworCQltc2dfZGJnKG1zZywiPEFDQzw6ICIpOworICAgICAgICAgICAgICAgIGlmICghbXNnX2RhdGFfc3oobXNnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1zZ2hkciBtID0gezAsfTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9wYWNrZXQoMCwgbmV3c29jaywgJm0sIDApOyAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZV9xdWV1ZSh0c29jayk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCXNvY2tfbG9jayh0c29jayk7CisJCQlza2JfZGVxdWV1ZSgmc29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpOworCQkJc29ja191bmxvY2sodHNvY2spOworCQkJc2tiX3F1ZXVlX2hlYWQoJm5ld3NvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlLCBidWYpOworCQl9CisJfQorZXhpdDoKKwl1cCgmdHNvY2stPnNlbSk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBzaHV0ZG93biAtIHNodXRkb3duIHNvY2tldCBjb25uZWN0aW9uCisgKiBAc29jazogc29ja2V0IHN0cnVjdHVyZQorICogQGhvdzogZGlyZWN0aW9uIHRvIGNsb3NlIChhbHdheXMgdHJlYXRlZCBhcyByZWFkICsgd3JpdGUpCisgKgorICogVGVybWluYXRlcyBjb25uZWN0aW9uIChpZiBuZWNlc3NhcnkpLCB0aGVuIHB1cmdlcyBzb2NrZXQncyByZWNlaXZlIHF1ZXVlLgorICogCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCBzaHV0ZG93bihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgaG93KQoreworCXN0cnVjdCB0aXBjX3NvY2sqIHRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlpbnQgcmVzOworCisJLyogQ291bGQgcmV0dXJuIC1FSU5WQUwgZm9yIGFuIGludmFsaWQgImhvdyIsIGJ1dCB3aHkgYm90aGVyPyAqLworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdHNvY2stPnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlzb2NrX2xvY2sodHNvY2spOworCisJc3dpdGNoIChzb2NrLT5zdGF0ZSkgeworCWNhc2UgU1NfQ09OTkVDVEVEOgorCisJCS8qIFNlbmQgJ0ZJTisnIG9yICdGSU4tJyBtZXNzYWdlIHRvIHBlZXIgKi8KKworCQlzb2NrX3VubG9jayh0c29jayk7CityZXN0YXJ0OgorCQlpZiAoKGJ1ZiA9IHNrYl9kZXF1ZXVlKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSkpKSB7CisJCQlhdG9taWNfZGVjKCZ0aXBjX3F1ZXVlX3NpemUpOworCQkJaWYgKFRJUENfU0tCX0NCKGJ1ZiktPmhhbmRsZSAhPSBtc2dfZGF0YShidWZfbXNnKGJ1ZikpKSB7CisJCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCQl0aXBjX3JlamVjdF9tc2coYnVmLCBUSVBDX0NPTk5fU0hVVERPV04pOworCQl9CisJCWVsc2UgeworCQkJdGlwY19zaHV0ZG93bih0c29jay0+cC0+cmVmKTsKKwkJfQorCQlzb2NrX2xvY2sodHNvY2spOworCisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBTU19ESVNDT05ORUNUSU5HOgorCisJCS8qIERpc2NhcmQgYW55IHVucmVjZWl2ZWQgbWVzc2FnZXMgKi8KKworCQl3aGlsZSAoKGJ1ZiA9IHNrYl9kZXF1ZXVlKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSkpKSB7CisJCQlhdG9taWNfZGVjKCZ0aXBjX3F1ZXVlX3NpemUpOworCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJfQorCQl0c29jay0+cC0+Y29ubl91bmFja2VkID0gMDsKKworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWNhc2UgU1NfQ09OTkVDVElORzoKKwkJc29jay0+c3RhdGUgPSBTU19ESVNDT05ORUNUSU5HOworCQlyZXMgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJlcyA9IC1FTk9UQ09OTjsKKwl9CisKKwlzb2NrX3VubG9jayh0c29jayk7CisKKwl1cCgmdHNvY2stPnNlbSk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBzZXRzb2Nrb3B0IC0gc2V0IHNvY2tldCBvcHRpb24KKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAbHZsOiBvcHRpb24gbGV2ZWwKKyAqIEBvcHQ6IG9wdGlvbiBpZGVudGlmaWVyCisgKiBAb3Y6IHBvaW50ZXIgdG8gbmV3IG9wdGlvbiB2YWx1ZQorICogQG9sOiBsZW5ndGggb2Ygb3B0aW9uIHZhbHVlCisgKiAKKyAqIEZvciBzdHJlYW0gc29ja2V0cyBvbmx5LCBhY2NlcHRzIGFuZCBpZ25vcmVzIGFsbCBJUFBST1RPX1RDUCBvcHRpb25zIAorICogKHRvIGVhc2UgY29tcGF0aWJpbGl0eSkuCisgKiAKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IHNldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGx2bCwgaW50IG9wdCwgY2hhciAqb3YsIGludCBvbCkKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworCXUzMiB2YWx1ZTsKKwlpbnQgcmVzOworCisgICAgICAgIGlmICgobHZsID09IElQUFJPVE9fVENQKSAmJiAoc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJaWYgKGx2bCAhPSBTT0xfVElQQykKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwlpZiAob2wgPCBzaXplb2YodmFsdWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgaWYgKChyZXMgPSBnZXRfdXNlcih2YWx1ZSwgKHUzMiAqKW92KSkpCisJCXJldHVybiByZXM7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkgCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCisJc3dpdGNoIChvcHQpIHsKKwljYXNlIFRJUENfSU1QT1JUQU5DRToKKwkJcmVzID0gdGlwY19zZXRfcG9ydGltcG9ydGFuY2UodHNvY2stPnAtPnJlZiwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIFRJUENfU1JDX0RST1BQQUJMRToKKwkJaWYgKHNvY2stPnR5cGUgIT0gU09DS19TVFJFQU0pCisJCQlyZXMgPSB0aXBjX3NldF9wb3J0dW5yZWxpYWJsZSh0c29jay0+cC0+cmVmLCB2YWx1ZSk7CisJCWVsc2UgCisJCQlyZXMgPSAtRU5PUFJPVE9PUFQ7CisJCWJyZWFrOworCWNhc2UgVElQQ19ERVNUX0RST1BQQUJMRToKKwkJcmVzID0gdGlwY19zZXRfcG9ydHVucmV0dXJuYWJsZSh0c29jay0+cC0+cmVmLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DT05OX1RJTUVPVVQ6CisJCXNvY2stPnNrLT5za19yY3Z0aW1lbyA9ICh2YWx1ZSAqIEhaIC8gMTAwMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlcyA9IC1FSU5WQUw7CisJfQorCisJdXAoJnRzb2NrLT5zZW0pOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogZ2V0c29ja29wdCAtIGdldCBzb2NrZXQgb3B0aW9uCisgKiBAc29jazogc29ja2V0IHN0cnVjdHVyZQorICogQGx2bDogb3B0aW9uIGxldmVsCisgKiBAb3B0OiBvcHRpb24gaWRlbnRpZmllcgorICogQG92OiByZWNlcHRhY2xlIGZvciBvcHRpb24gdmFsdWUKKyAqIEBvbDogcmVjZXB0YWNsZSBmb3IgbGVuZ3RoIG9mIG9wdGlvbiB2YWx1ZQorICogCisgKiBGb3Igc3RyZWFtIHNvY2tldHMgb25seSwgcmV0dXJucyAwIGxlbmd0aCByZXN1bHQgZm9yIGFsbCBJUFBST1RPX1RDUCBvcHRpb25zIAorICogKHRvIGVhc2UgY29tcGF0aWJpbGl0eSkuCisgKiAKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IGdldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGx2bCwgaW50IG9wdCwgY2hhciAqb3YsIGludCAqb2wpCit7CisJc3RydWN0IHRpcGNfc29jayAqdHNvY2sgPSB0aXBjX3NrKHNvY2stPnNrKTsKKyAgICAgICAgaW50IGxlbjsKKwl1MzIgdmFsdWU7CisgICAgICAgIGludCByZXM7CisKKyAgICAgICAgaWYgKChsdmwgPT0gSVBQUk9UT19UQ1ApICYmIChzb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoMCwgb2wpOworCWlmIChsdmwgIT0gU09MX1RJUEMpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisgICAgICAgIGlmICgocmVzID0gZ2V0X3VzZXIobGVuLCBvbCkpKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkgCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlzd2l0Y2ggKG9wdCkgeworCWNhc2UgVElQQ19JTVBPUlRBTkNFOgorCQlyZXMgPSB0aXBjX3BvcnRpbXBvcnRhbmNlKHRzb2NrLT5wLT5yZWYsICZ2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVElQQ19TUkNfRFJPUFBBQkxFOgorCQlyZXMgPSB0aXBjX3BvcnR1bnJlbGlhYmxlKHRzb2NrLT5wLT5yZWYsICZ2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVElQQ19ERVNUX0RST1BQQUJMRToKKwkJcmVzID0gdGlwY19wb3J0dW5yZXR1cm5hYmxlKHRzb2NrLT5wLT5yZWYsICZ2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DT05OX1RJTUVPVVQ6CisJCXZhbHVlID0gKHNvY2stPnNrLT5za19yY3Z0aW1lbyAqIDEwMDApIC8gSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlcyA9IC1FSU5WQUw7CisJfQorCisJaWYgKHJlcykgeworCQkvKiAiZ2V0IiBmYWlsZWQgKi8KKwl9CisJZWxzZSBpZiAobGVuIDwgc2l6ZW9mKHZhbHVlKSkgeworCQlyZXMgPSAtRUlOVkFMOworCX0KKwllbHNlIGlmICgocmVzID0gY29weV90b191c2VyKG92LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKSkgeworCQkvKiBjb3VsZG4ndCByZXR1cm4gdmFsdWUgKi8KKwl9CisJZWxzZSB7CisJCXJlcyA9IHB1dF91c2VyKHNpemVvZih2YWx1ZSksIG9sKTsKKwl9CisKKyAgICAgICAgdXAoJnRzb2NrLT5zZW0pOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogUGxhY2Vob2xkZXJzIGZvciBub24taW1wbGVtZW50ZWQgZnVuY3Rpb25hbGl0eQorICogCisgKiBSZXR1cm5zIGVycm9yIGNvZGUgKFBPU0lYLWNvbXBsaWFudCB3aGVyZSBkZWZpbmVkKQorICovCisKK3N0YXRpYyBpbnQgaW9jdGwoc3RydWN0IHNvY2tldCAqcywgdTMyIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IG5vX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisgICAgICAgICAgICAgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworfQorc3RhdGljIHNzaXplX3Qgbm9fc2VuZHBhZ2Uoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHBhZ2UgKnBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworICAgICAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBub19za3BhaXIoc3RydWN0IHNvY2tldCAqczEsIHN0cnVjdCBzb2NrZXQgKnMyKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworLyoqCisgKiBQcm90b2NvbCBzd2l0Y2hlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgVElQQyBzb2NrZXRzCisgKi8KKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgbXNnX29wcyA9IHsKKwkub3duZXIgCQk9IFRISVNfTU9EVUxFLAorCS5mYW1pbHkJCT0gQUZfVElQQywKKwkucmVsZWFzZQk9IHJlbGVhc2UsCisJLmJpbmQJCT0gYmluZCwKKwkuY29ubmVjdAk9IGNvbm5lY3QsCisJLnNvY2tldHBhaXIJPSBub19za3BhaXIsCisJLmFjY2VwdAkJPSBhY2NlcHQsCisJLmdldG5hbWUJPSBnZXRfbmFtZSwKKwkucG9sbAkJPSBwb2xsLAorCS5pb2N0bAkJPSBpb2N0bCwKKwkubGlzdGVuCQk9IGxpc3RlbiwKKwkuc2h1dGRvd24JPSBzaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHNldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJPSBnZXRzb2Nrb3B0LAorCS5zZW5kbXNnCT0gc2VuZF9tc2csCisJLnJlY3Ztc2cJPSByZWN2X21zZywKKyAgICAgICAgLm1tYXAJCT0gbm9fbW1hcCwKKyAgICAgICAgLnNlbmRwYWdlCT0gbm9fc2VuZHBhZ2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHBhY2tldF9vcHMgPSB7CisJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKKwkuZmFtaWx5CQk9IEFGX1RJUEMsCisJLnJlbGVhc2UJPSByZWxlYXNlLAorCS5iaW5kCQk9IGJpbmQsCisJLmNvbm5lY3QJPSBjb25uZWN0LAorCS5zb2NrZXRwYWlyCT0gbm9fc2twYWlyLAorCS5hY2NlcHQJCT0gYWNjZXB0LAorCS5nZXRuYW1lCT0gZ2V0X25hbWUsCisJLnBvbGwJCT0gcG9sbCwKKwkuaW9jdGwJCT0gaW9jdGwsCisJLmxpc3RlbgkJPSBsaXN0ZW4sCisJLnNodXRkb3duCT0gc2h1dGRvd24sCisJLnNldHNvY2tvcHQJPSBzZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0CT0gZ2V0c29ja29wdCwKKwkuc2VuZG1zZwk9IHNlbmRfcGFja2V0LAorCS5yZWN2bXNnCT0gcmVjdl9tc2csCisgICAgICAgIC5tbWFwCQk9IG5vX21tYXAsCisgICAgICAgIC5zZW5kcGFnZQk9IG5vX3NlbmRwYWdlCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBzdHJlYW1fb3BzID0geworCS5vd25lciAJCT0gVEhJU19NT0RVTEUsCisJLmZhbWlseQkJPSBBRl9USVBDLAorCS5yZWxlYXNlCT0gcmVsZWFzZSwKKwkuYmluZAkJPSBiaW5kLAorCS5jb25uZWN0CT0gY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IG5vX3NrcGFpciwKKwkuYWNjZXB0CQk9IGFjY2VwdCwKKwkuZ2V0bmFtZQk9IGdldF9uYW1lLAorCS5wb2xsCQk9IHBvbGwsCisJLmlvY3RsCQk9IGlvY3RsLAorCS5saXN0ZW4JCT0gbGlzdGVuLAorCS5zaHV0ZG93bgk9IHNodXRkb3duLAorCS5zZXRzb2Nrb3B0CT0gc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IGdldHNvY2tvcHQsCisJLnNlbmRtc2cJPSBzZW5kX3N0cmVhbSwKKwkucmVjdm1zZwk9IHJlY3Zfc3RyZWFtLAorICAgICAgICAubW1hcAkJPSBub19tbWFwLAorICAgICAgICAuc2VuZHBhZ2UJPSBub19zZW5kcGFnZQorfTsKKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IHRpcGNfZmFtaWx5X29wcyA9IHsKKwkub3duZXIgCQk9IFRISVNfTU9EVUxFLAorCS5mYW1pbHkJCT0gQUZfVElQQywKKwkuY3JlYXRlCQk9IHRpcGNfY3JlYXRlCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvIHRpcGNfcHJvdG8gPSB7CisJLm5hbWUJCT0gIlRJUEMiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IHRpcGNfc29jaykKK307CisKKy8qKgorICogc29ja2V0X2luaXQgLSBpbml0aWFsaXplIFRJUEMgc29ja2V0IGludGVyZmFjZQorICogCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb3RoZXJ3aXNlCisgKi8KK2ludCBzb2NrZXRfaW5pdCh2b2lkKQoreworCWludCByZXM7CisKKyAgICAgICAgcmVzID0gcHJvdG9fcmVnaXN0ZXIoJnRpcGNfcHJvdG8sIDEpOworCWlmIChyZXMpIHsKKwkJZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgVElQQyBwcm90b2NvbCB0eXBlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmVzID0gc29ja19yZWdpc3RlcigmdGlwY19mYW1pbHlfb3BzKTsKKwlpZiAocmVzKSB7CisJCWVycigiRmFpbGVkIHRvIHJlZ2lzdGVyIFRJUEMgc29ja2V0IHR5cGVcbiIpOworCQlwcm90b191bnJlZ2lzdGVyKCZ0aXBjX3Byb3RvKTsKKwkJZ290byBvdXQ7CisJfQorCisJc29ja2V0c19lbmFibGVkID0gMTsKKyBvdXQ6CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBzb2NrX3N0b3AgLSBzdG9wIFRJUEMgc29ja2V0IGludGVyZmFjZQorICovCit2b2lkIHNvY2tldF9zdG9wKHZvaWQpCit7CisJaWYgKCFzb2NrZXRzX2VuYWJsZWQpCisJCXJldHVybjsKKworCXNvY2tldHNfZW5hYmxlZCA9IDA7CisJc29ja191bnJlZ2lzdGVyKHRpcGNfZmFtaWx5X29wcy5mYW1pbHkpOworCXByb3RvX3VucmVnaXN0ZXIoJnRpcGNfcHJvdG8pOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zdWJzY3IuYyBiL25ldC90aXBjL3N1YnNjci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZTIxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9zdWJzY3IuYwpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqIG5ldC90aXBjL3N1YnNjci5jOiBUSVBDIHN1YnNjcmlwdGlvbiBzZXJ2aWNlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAic3Vic2NyLmgiCisjaW5jbHVkZSAibmFtZV90YWJsZS5oIgorI2luY2x1ZGUgInJlZi5oIgorCisvKioKKyAqIHN0cnVjdCBzdWJzY3JpYmVyIC0gVElQQyBuZXR3b3JrIHRvcG9sb2d5IHN1YnNjcmliZXIKKyAqIEByZWY6IG9iamVjdCByZWZlcmVuY2UgdG8gc3Vic2NyaWJlciBvYmplY3QgaXRzZWxmCisgKiBAbG9jazogcG9pbnRlciB0byBzcGlubG9jayBjb250cm9sbGluZyBhY2Nlc3MgdG8gc3Vic2NyaWJlciBvYmplY3QKKyAqIEBzdWJzY3JpYmVyX2xpc3Q6IGFkamFjZW50IHN1YnNjcmliZXJzIGluIHRvcC4gc2VydmVyJ3MgbGlzdCBvZiBzdWJzY3JpYmVycworICogQHN1YnNjcmlwdGlvbl9saXN0OiBsaXN0IG9mIHN1YnNjcmlwdGlvbiBvYmplY3RzIGZvciB0aGlzIHN1YnNjcmliZXIKKyAqIEBwb3J0X3JlZjogb2JqZWN0IHJlZmVyZW5jZSB0byBwb3J0IHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBzdWJzY3JpYmVyCisgKiBAc3dhcDogaW5kaWNhdGVzIGlmIHN1YnNjcmliZXIgdXNlcyBvcHBvc2l0ZSBlbmRpYW5uZXNzIGluIGl0cyBtZXNzYWdlcworICovCisgCitzdHJ1Y3Qgc3Vic2NyaWJlciB7CisJdTMyIHJlZjsKKyAgICAgICAgc3BpbmxvY2tfdCAqbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1YnNjcmliZXJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1YnNjcmlwdGlvbl9saXN0OworCXUzMiBwb3J0X3JlZjsKKwlpbnQgc3dhcDsKK307CisKKy8qKgorICogc3RydWN0IHRvcF9zcnYgLSBUSVBDIG5ldHdvcmsgdG9wb2xvZ3kgc3Vic2NyaXB0aW9uIHNlcnZpY2UKKyAqIEB1c2VyX3JlZjogVElQQyB1c2VyaWQgb2Ygc3Vic2NyaXB0aW9uIHNlcnZpY2UKKyAqIEBzZXR1cF9wb3J0OiByZWZlcmVuY2UgdG8gVElQQyBwb3J0IHRoYXQgaGFuZGxlcyBzdWJzY3JpcHRpb24gcmVxdWVzdHMKKyAqIEBzdWJzY3JpcHRpb25fY291bnQ6IG51bWJlciBvZiBhY3RpdmUgc3Vic2NyaXB0aW9ucyAobm90IHN1YnNjcmliZXJzISkKKyAqIEBzdWJzY3JpYmVyX2xpc3Q6IGxpc3Qgb2YgcG9ydHMgc3Vic2NyaWJpbmcgdG8gc2VydmljZQorICogQGxvY2s6IHNwaW5sb2NrIGdvdmVyaW5nIGFjY2VzcyB0byBzdWJzY3JpYmVyIGxpc3QKKyAqLworCitzdHJ1Y3QgdG9wX3NydiB7CisJdTMyIHVzZXJfcmVmOworCXUzMiBzZXR1cF9wb3J0OworCWF0b21pY190IHN1YnNjcmlwdGlvbl9jb3VudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1YnNjcmliZXJfbGlzdDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgc3RydWN0IHRvcF9zcnYgdG9wc3J2ID0geyAwIH07CisKKy8qKgorICogaHRvaGwgLSBjb252ZXJ0IHZhbHVlIHRvIGVuZGlhbm5lc3MgdXNlZCBieSBkZXN0aW5hdGlvbgorICogQGluOiB2YWx1ZSB0byBjb252ZXJ0CisgKiBAc3dhcDogbm9uLXplcm8gaWYgZW5kaWFubmVzcyBtdXN0IGJlIHJldmVyc2VkCisgKiAKKyAqIFJldHVybnMgY29udmVydGVkIHZhbHVlCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgaHRvaGwodTMyIGluLCBpbnQgc3dhcCkKK3sKKwljaGFyICpjID0gKGNoYXIgKikmaW47CisKKwlyZXR1cm4gc3dhcCA/ICgoY1szXSA8PCAzKSArIChjWzJdIDw8IDIpICsgKGNbMV0gPDwgMSkgKyBjWzBdKSA6IGluOworfQorCisvKioKKyAqIHN1YnNjcl9zZW5kX2V2ZW50IC0gc2VuZCBhIG1lc3NhZ2UgY29udGFpbmluZyBhIHRpcGNfZXZlbnQgdG8gdGhlIHN1YnNjcmliZXIKKyAqLworCitzdGF0aWMgdm9pZCBzdWJzY3Jfc2VuZF9ldmVudChzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWIsIAorCQkJICAgICAgdTMyIGZvdW5kX2xvd2VyLCAKKwkJCSAgICAgIHUzMiBmb3VuZF91cHBlciwKKwkJCSAgICAgIHUzMiBldmVudCwgCisJCQkgICAgICB1MzIgcG9ydF9yZWYsIAorCQkJICAgICAgdTMyIG5vZGUpCit7CisJc3RydWN0IGlvdmVjIG1zZ19zZWN0OworCisJbXNnX3NlY3QuaW92X2Jhc2UgPSAodm9pZCAqKSZzdWItPmV2dDsKKwltc2dfc2VjdC5pb3ZfbGVuID0gc2l6ZW9mKHN0cnVjdCB0aXBjX2V2ZW50KTsKKworCXN1Yi0+ZXZ0LmV2ZW50ID0gaHRvaGwoZXZlbnQsIHN1Yi0+b3duZXItPnN3YXApOworCXN1Yi0+ZXZ0LmZvdW5kX2xvd2VyID0gaHRvaGwoZm91bmRfbG93ZXIsIHN1Yi0+b3duZXItPnN3YXApOworCXN1Yi0+ZXZ0LmZvdW5kX3VwcGVyID0gaHRvaGwoZm91bmRfdXBwZXIsIHN1Yi0+b3duZXItPnN3YXApOworCXN1Yi0+ZXZ0LnBvcnQucmVmID0gaHRvaGwocG9ydF9yZWYsIHN1Yi0+b3duZXItPnN3YXApOworCXN1Yi0+ZXZ0LnBvcnQubm9kZSA9IGh0b2hsKG5vZGUsIHN1Yi0+b3duZXItPnN3YXApOworCXRpcGNfc2VuZChzdWItPm93bmVyLT5wb3J0X3JlZiwgMSwgJm1zZ19zZWN0KTsKK30KKworLyoqCisgKiBzdWJzY3Jfb3ZlcmxhcCAtIHRlc3QgZm9yIHN1YnNjcmlwdGlvbiBvdmVybGFwIHdpdGggdGhlIGdpdmVuIHZhbHVlcworICoKKyAqIFJldHVybnMgMSBpZiB0aGVyZSBpcyBvdmVybGFwLCBvdGhlcndpc2UgMC4KKyAqLworCitpbnQgc3Vic2NyX292ZXJsYXAoc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViLCAKKwkJICAgdTMyIGZvdW5kX2xvd2VyLCAKKwkJICAgdTMyIGZvdW5kX3VwcGVyKQorCit7CisJaWYgKGZvdW5kX2xvd2VyIDwgc3ViLT5zZXEubG93ZXIpCisJCWZvdW5kX2xvd2VyID0gc3ViLT5zZXEubG93ZXI7CisJaWYgKGZvdW5kX3VwcGVyID4gc3ViLT5zZXEudXBwZXIpCisJCWZvdW5kX3VwcGVyID0gc3ViLT5zZXEudXBwZXI7CisJaWYgKGZvdW5kX2xvd2VyID4gZm91bmRfdXBwZXIpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKioKKyAqIHN1YnNjcl9yZXBvcnRfb3ZlcmxhcCAtIGlzc3VlIGV2ZW50IGlmIHRoZXJlIGlzIHN1YnNjcmlwdGlvbiBvdmVybGFwCisgKiAKKyAqIFByb3RlY3RlZCBieSBuYW1lc2VxLmxvY2sgaW4gbmFtZV90YWJsZS5jCisgKi8KKwordm9pZCBzdWJzY3JfcmVwb3J0X292ZXJsYXAoc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViLCAKKwkJCSAgIHUzMiBmb3VuZF9sb3dlciwgCisJCQkgICB1MzIgZm91bmRfdXBwZXIsCisJCQkgICB1MzIgZXZlbnQsIAorCQkJICAgdTMyIHBvcnRfcmVmLCAKKwkJCSAgIHUzMiBub2RlLAorCQkJICAgaW50IG11c3QpCit7CisJZGJnKCJSZXAgb3ZlcmxhcCAldToldSwldTwtPiV1LCV1XG4iLCBzdWItPnNlcS50eXBlLCBzdWItPnNlcS5sb3dlciwKKwkgICAgc3ViLT5zZXEudXBwZXIsIGZvdW5kX2xvd2VyLCBmb3VuZF91cHBlcik7CisJaWYgKCFzdWJzY3Jfb3ZlcmxhcChzdWIsIGZvdW5kX2xvd2VyLCBmb3VuZF91cHBlcikpCisJCXJldHVybjsKKwlpZiAoIW11c3QgJiYgKHN1Yi0+ZmlsdGVyICE9IFRJUENfU1VCX1BPUlRTKSkKKwkJcmV0dXJuOworCXN1YnNjcl9zZW5kX2V2ZW50KHN1YiwgZm91bmRfbG93ZXIsIGZvdW5kX3VwcGVyLCBldmVudCwgcG9ydF9yZWYsIG5vZGUpOworfQorCisvKioKKyAqIHN1YnNjcl90aW1lb3V0IC0gc3Vic2NyaXB0aW9uIHRpbWVvdXQgaGFzIG9jY3VycmVkCisgKi8KKworc3RhdGljIHZvaWQgc3Vic2NyX3RpbWVvdXQoc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViKQoreworCXN0cnVjdCBzdWJzY3JpYmVyICpzdWJzY3JpYmVyOworCXUzMiBzdWJzY3JpYmVyX3JlZjsKKworCS8qIFZhbGlkYXRlIHN1YnNjcmliZXIgcmVmZXJlbmNlIChpbiBjYXNlIHN1YnNjcmliZXIgaXMgdGVybWluYXRpbmcpICovCisKKwlzdWJzY3JpYmVyX3JlZiA9IHN1Yi0+b3duZXItPnJlZjsKKwlzdWJzY3JpYmVyID0gKHN0cnVjdCBzdWJzY3JpYmVyICopcmVmX2xvY2soc3Vic2NyaWJlcl9yZWYpOworCWlmIChzdWJzY3JpYmVyID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIFVubGluayBzdWJzY3JpcHRpb24gZnJvbSBuYW1lIHRhYmxlICovCisKKwluYW1ldGJsX3Vuc3Vic2NyaWJlKHN1Yik7CisKKwkvKiBOb3RpZnkgc3Vic2NyaWJlciBvZiB0aW1lb3V0LCB0aGVuIHVubGluayBzdWJzY3JpcHRpb24gKi8KKworCXN1YnNjcl9zZW5kX2V2ZW50KHN1YiwgCisJCQkgIHN1Yi0+ZXZ0LnMuc2VxLmxvd2VyLCAKKwkJCSAgc3ViLT5ldnQucy5zZXEudXBwZXIsCisJCQkgIFRJUENfU1VCU0NSX1RJTUVPVVQsIAorCQkJICAwLCAKKwkJCSAgMCk7CisJbGlzdF9kZWwoJnN1Yi0+c3Vic2NyaXB0aW9uX2xpc3QpOworCisJLyogTm93IGRlc3Ryb3kgc3Vic2NyaXB0aW9uICovCisKKwlyZWZfdW5sb2NrKHN1YnNjcmliZXJfcmVmKTsKKwlrX3Rlcm1fdGltZXIoJnN1Yi0+dGltZXIpOworCWtmcmVlKHN1Yik7CisJYXRvbWljX2RlYygmdG9wc3J2LnN1YnNjcmlwdGlvbl9jb3VudCk7Cit9CisKKy8qKgorICogc3Vic2NyX3Rlcm1pbmF0ZSAtIHRlcm1pbmF0ZSBjb21tdW5pY2F0aW9uIHdpdGggYSBzdWJzY3JpYmVyCisgKiAKKyAqIENhbGxlZCB3aXRoIHN1YnNjcmliZXIgbG9ja2VkLiAgUm91dGluZSBtdXN0IHRlbXBvcmFyaWx5IHJlbGVhc2UgdGhpcyBsb2NrCisgKiB0byBlbmFibGUgc3Vic2NyaXB0aW9uIHRpbWVvdXQgcm91dGluZShzKSB0byBmaW5pc2ggd2l0aG91dCBkZWFkbG9ja2luZzsgCisgKiB0aGUgbG9jayBpcyB0aGVuIHJlY2xhaW1lZCB0byBhbGxvdyBjYWxsZXIgdG8gcmVsZWFzZSBpdCB1cG9uIHJldHVybi4KKyAqIChUaGlzIHNob3VsZCB3b3JrIGV2ZW4gaW4gdGhlIHVubGlrZWx5IGV2ZW50IHNvbWUgb3RoZXIgdGhyZWFkIGNyZWF0ZXMgCisgKiBhIG5ldyBvYmplY3QgcmVmZXJlbmNlIGluIHRoZSBpbnRlcmltIHRoYXQgdXNlcyB0aGlzIGxvY2s7IHRoaXMgcm91dGluZSB3aWxsCisgKiBzaW1wbHkgd2FpdCBmb3IgaXQgdG8gYmUgcmVsZWFzZWQsIHRoZW4gY2xhaW0gaXQuKQorICovCisKK3N0YXRpYyB2b2lkIHN1YnNjcl90ZXJtaW5hdGUoc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXIpCit7CisJc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViOworCXN0cnVjdCBzdWJzY3JpcHRpb24gKnN1Yl90ZW1wOworCisJLyogSW52YWxpZGF0ZSBzdWJzY3JpYmVyIHJlZmVyZW5jZSAqLworCisJcmVmX2Rpc2NhcmQoc3Vic2NyaWJlci0+cmVmKTsKKwlzcGluX3VubG9ja19iaChzdWJzY3JpYmVyLT5sb2NrKTsKKworCS8qIERlc3Ryb3kgYW55IGV4aXN0aW5nIHN1YnNjcmlwdGlvbnMgZm9yIHN1YnNjcmliZXIgKi8KKwkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3ViLCBzdWJfdGVtcCwgJnN1YnNjcmliZXItPnN1YnNjcmlwdGlvbl9saXN0LAorCQkJCSBzdWJzY3JpcHRpb25fbGlzdCkgeworCQlpZiAoc3ViLT50aW1lb3V0ICE9IFRJUENfV0FJVF9GT1JFVkVSKSB7CisJCQlrX2NhbmNlbF90aW1lcigmc3ViLT50aW1lcik7CisJCQlrX3Rlcm1fdGltZXIoJnN1Yi0+dGltZXIpOworCQl9CisJCW5hbWV0YmxfdW5zdWJzY3JpYmUoc3ViKTsKKwkJbGlzdF9kZWwoJnN1Yi0+c3Vic2NyaXB0aW9uX2xpc3QpOworCQlkYmcoIlRlcm06IFJlbW92ZWQgc3ViICV1LCV1LCV1IGZyb20gc3Vic2NyaWJlciAleCBsaXN0XG4iLAorCQkgICAgc3ViLT5zZXEudHlwZSwgc3ViLT5zZXEubG93ZXIsIHN1Yi0+c2VxLnVwcGVyLCBzdWJzY3JpYmVyKTsKKwkJa2ZyZWUoc3ViKTsKKwkJYXRvbWljX2RlYygmdG9wc3J2LnN1YnNjcmlwdGlvbl9jb3VudCk7CisJfQorCisJLyogU2V2ZXIgY29ubmVjdGlvbiB0byBzdWJzY3JpYmVyICovCisKKwl0aXBjX3NodXRkb3duKHN1YnNjcmliZXItPnBvcnRfcmVmKTsKKwl0aXBjX2RlbGV0ZXBvcnQoc3Vic2NyaWJlci0+cG9ydF9yZWYpOworCisJLyogUmVtb3ZlIHN1YnNjcmliZXIgZnJvbSB0b3BvbG9neSBzZXJ2ZXIncyBzdWJzY3JpYmVyIGxpc3QgKi8KKworCXNwaW5fbG9ja19iaCgmdG9wc3J2LmxvY2spOworCWxpc3RfZGVsKCZzdWJzY3JpYmVyLT5zdWJzY3JpYmVyX2xpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZ0b3BzcnYubG9jayk7CisKKwkvKiBOb3cgZGVzdHJveSBzdWJzY3JpYmVyICovCisKKwlzcGluX2xvY2tfYmgoc3Vic2NyaWJlci0+bG9jayk7CisJa2ZyZWUoc3Vic2NyaWJlcik7Cit9CisKKy8qKgorICogc3Vic2NyX3N1YnNjcmliZSAtIGNyZWF0ZSBzdWJzY3JpcHRpb24gZm9yIHN1YnNjcmliZXIKKyAqIAorICogQ2FsbGVkIHdpdGggc3Vic2NyaWJlciBsb2NrZWQKKyAqLworCitzdGF0aWMgdm9pZCBzdWJzY3Jfc3Vic2NyaWJlKHN0cnVjdCB0aXBjX3N1YnNjciAqcywKKwkJCSAgICAgc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXIpCit7CisJc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViOworCisJLyogUmVmdXNlIHN1YnNjcmlwdGlvbiBpZiBnbG9iYWwgbGltaXQgZXhjZWVkZWQgKi8KKworCWlmIChhdG9taWNfcmVhZCgmdG9wc3J2LnN1YnNjcmlwdGlvbl9jb3VudCkgPj0gdGlwY19tYXhfc3Vic2NyaXB0aW9ucykgeworCQl3YXJuKCJGYWlsZWQ6IG1heCAldSBzdWJzY3JpcHRpb25zXG4iLCB0aXBjX21heF9zdWJzY3JpcHRpb25zKTsKKwkJc3Vic2NyX3Rlcm1pbmF0ZShzdWJzY3JpYmVyKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFsbG9jYXRlIHN1YnNjcmlwdGlvbiBvYmplY3QgKi8KKworCXN1YiA9IGttYWxsb2Moc2l6ZW9mKCpzdWIpLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3ViID09IE5VTEwpIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU7IGlnbm9yaW5nIHN1YnNjcmlwdGlvblxuIik7CisJCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7CisJCXJldHVybjsKKwl9CisKKwkvKiBEZXRlcm1pbmUvdXBkYXRlIHN1YnNjcmliZXIncyBlbmRpYW5uZXNzICovCisKKwlpZiAoKHMtPmZpbHRlciA9PSBUSVBDX1NVQl9QT1JUUykgfHwgKHMtPmZpbHRlciA9PSBUSVBDX1NVQl9TRVJWSUNFKSkKKwkJc3Vic2NyaWJlci0+c3dhcCA9IDA7CisJZWxzZQorCQlzdWJzY3JpYmVyLT5zd2FwID0gMTsKKworCS8qIEluaXRpYWxpemUgc3Vic2NyaXB0aW9uIG9iamVjdCAqLworCisJbWVtc2V0KHN1YiwgMCwgc2l6ZW9mKCpzdWIpKTsKKwlzdWItPnNlcS50eXBlID0gaHRvaGwocy0+c2VxLnR5cGUsIHN1YnNjcmliZXItPnN3YXApOworCXN1Yi0+c2VxLmxvd2VyID0gaHRvaGwocy0+c2VxLmxvd2VyLCBzdWJzY3JpYmVyLT5zd2FwKTsKKwlzdWItPnNlcS51cHBlciA9IGh0b2hsKHMtPnNlcS51cHBlciwgc3Vic2NyaWJlci0+c3dhcCk7CisJc3ViLT50aW1lb3V0ID0gaHRvaGwocy0+dGltZW91dCwgc3Vic2NyaWJlci0+c3dhcCk7CisJc3ViLT5maWx0ZXIgPSBodG9obChzLT5maWx0ZXIsIHN1YnNjcmliZXItPnN3YXApOworCWlmICgoKChzdWItPmZpbHRlciAhPSBUSVBDX1NVQl9QT1JUUykgCisJICAgICAgJiYgKHN1Yi0+ZmlsdGVyICE9IFRJUENfU1VCX1NFUlZJQ0UpKSkKKwkgICAgfHwgKHN1Yi0+c2VxLmxvd2VyID4gc3ViLT5zZXEudXBwZXIpKSB7CisJCXdhcm4oIlJlamVjdGluZyBpbGxlZ2FsIHN1YnNjcmlwdGlvbiAldSwldSwldVxuIiwKKwkJICAgICBzdWItPnNlcS50eXBlLCBzdWItPnNlcS5sb3dlciwgc3ViLT5zZXEudXBwZXIpOworCQlrZnJlZShzdWIpOworCQlzdWJzY3JfdGVybWluYXRlKHN1YnNjcmliZXIpOworCQlyZXR1cm47CisJfQorCW1lbWNweSgmc3ViLT5ldnQucywgcywgc2l6ZW9mKHN0cnVjdCB0aXBjX3N1YnNjcikpOworCUlOSVRfTElTVF9IRUFEKCZzdWItPnN1YnNjcmlwdGlvbl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmc3ViLT5uYW1lc2VxX2xpc3QpOworCWxpc3RfYWRkKCZzdWItPnN1YnNjcmlwdGlvbl9saXN0LCAmc3Vic2NyaWJlci0+c3Vic2NyaXB0aW9uX2xpc3QpOworCWF0b21pY19pbmMoJnRvcHNydi5zdWJzY3JpcHRpb25fY291bnQpOworCWlmIChzdWItPnRpbWVvdXQgIT0gVElQQ19XQUlUX0ZPUkVWRVIpIHsKKwkJa19pbml0X3RpbWVyKCZzdWItPnRpbWVyLAorCQkJICAgICAoSGFuZGxlcilzdWJzY3JfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpc3ViKTsKKwkJa19zdGFydF90aW1lcigmc3ViLT50aW1lciwgc3ViLT50aW1lb3V0KTsKKwl9CisJc3ViLT5vd25lciA9IHN1YnNjcmliZXI7CisJbmFtZXRibF9zdWJzY3JpYmUoc3ViKTsKK30KKworLyoqCisgKiBzdWJzY3JfY29ubl9zaHV0ZG93bl9ldmVudCAtIGhhbmRsZSB0ZXJtaW5hdGlvbiByZXF1ZXN0IGZyb20gc3Vic2NyaWJlcgorICovCisKK3N0YXRpYyB2b2lkIHN1YnNjcl9jb25uX3NodXRkb3duX2V2ZW50KHZvaWQgKnVzcl9oYW5kbGUsCisJCQkJICAgICAgIHUzMiBwb3J0cmVmLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKmJ1ZiwKKwkJCQkgICAgICAgdW5zaWduZWQgY2hhciBjb25zdCAqZGF0YSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHNpemUsCisJCQkJICAgICAgIGludCByZWFzb24pCit7CisJc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXI7CisJc3BpbmxvY2tfdCAqc3Vic2NyaWJlcl9sb2NrOworCisJc3Vic2NyaWJlciA9IHJlZl9sb2NrKCh1MzIpKHVuc2lnbmVkIGxvbmcpdXNyX2hhbmRsZSk7CisJaWYgKHN1YnNjcmliZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Vic2NyaWJlcl9sb2NrID0gc3Vic2NyaWJlci0+bG9jazsKKwlzdWJzY3JfdGVybWluYXRlKHN1YnNjcmliZXIpOworCXNwaW5fdW5sb2NrX2JoKHN1YnNjcmliZXJfbG9jayk7Cit9CisKKy8qKgorICogc3Vic2NyX2Nvbm5fbXNnX2V2ZW50IC0gaGFuZGxlIG5ldyBzdWJzY3JpcHRpb24gcmVxdWVzdCBmcm9tIHN1YnNjcmliZXIKKyAqLworCitzdGF0aWMgdm9pZCBzdWJzY3JfY29ubl9tc2dfZXZlbnQodm9pZCAqdXNyX2hhbmRsZSwKKwkJCQkgIHUzMiBwb3J0X3JlZiwKKwkJCQkgIHN0cnVjdCBza19idWZmICoqYnVmLAorCQkJCSAgY29uc3QgdW5jaGFyICpkYXRhLAorCQkJCSAgdTMyIHNpemUpCit7CisJc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXI7CisJc3BpbmxvY2tfdCAqc3Vic2NyaWJlcl9sb2NrOworCisJc3Vic2NyaWJlciA9IHJlZl9sb2NrKCh1MzIpKHVuc2lnbmVkIGxvbmcpdXNyX2hhbmRsZSk7CisJaWYgKHN1YnNjcmliZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Vic2NyaWJlcl9sb2NrID0gc3Vic2NyaWJlci0+bG9jazsKKwlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IHRpcGNfc3Vic2NyKSkKKwkJc3Vic2NyX3Rlcm1pbmF0ZShzdWJzY3JpYmVyKTsKKwllbHNlCisJCXN1YnNjcl9zdWJzY3JpYmUoKHN0cnVjdCB0aXBjX3N1YnNjciAqKWRhdGEsIHN1YnNjcmliZXIpOworCQorCXNwaW5fdW5sb2NrX2JoKHN1YnNjcmliZXJfbG9jayk7Cit9CisKKy8qKgorICogc3Vic2NyX25hbWVkX21zZ19ldmVudCAtIGhhbmRsZSByZXF1ZXN0IHRvIGVzdGFibGlzaCBhIG5ldyBzdWJzY3JpYmVyCisgKi8KKworc3RhdGljIHZvaWQgc3Vic2NyX25hbWVkX21zZ19ldmVudCh2b2lkICp1c3JfaGFuZGxlLAorCQkJCSAgIHUzMiBwb3J0X3JlZiwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqKmJ1ZiwKKwkJCQkgICBjb25zdCB1bmNoYXIgKmRhdGEsCisJCQkJICAgdTMyIHNpemUsCisJCQkJICAgdTMyIGltcG9ydGFuY2UsIAorCQkJCSAgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZywKKwkJCQkgICBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqZGVzdCkKK3sKKwlzdHJ1Y3Qgc3Vic2NyaWJlciAqc3Vic2NyaWJlcjsKKwlzdHJ1Y3QgaW92ZWMgbXNnX3NlY3QgPSB7MCwgMH07CisJc3BpbmxvY2tfdCAqc3Vic2NyaWJlcl9sb2NrOworCisJZGJnKCJzdWJzY3JfbmFtZWRfbXNnX2V2ZW50OiBvcmlnID0gJXggb3duID0gJXgsXG4iLAorCSAgICBvcmlnLT5ub2RlLCB0aXBjX293bl9hZGRyKTsKKwlpZiAoc2l6ZSAmJiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IHRpcGNfc3Vic2NyKSkpIHsKKwkJd2FybigiUmVjZWl2ZWQgdGlwY19zdWJzY3Igb2YgaW52YWxpZCBzaXplXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENyZWF0ZSBzdWJzY3JpYmVyIG9iamVjdCAqLworCisJc3Vic2NyaWJlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdWJzY3JpYmVyKSwgR0ZQX0FUT01JQyk7CisJaWYgKHN1YnNjcmliZXIgPT0gTlVMTCkgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgaWdub3Jpbmcgc3Vic2NyaWJlciBzZXR1cFxuIik7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KHN1YnNjcmliZXIsIDAsIHNpemVvZihzdHJ1Y3Qgc3Vic2NyaWJlcikpOworCUlOSVRfTElTVF9IRUFEKCZzdWJzY3JpYmVyLT5zdWJzY3JpcHRpb25fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnN1YnNjcmliZXItPnN1YnNjcmliZXJfbGlzdCk7CisJc3Vic2NyaWJlci0+cmVmID0gcmVmX2FjcXVpcmUoc3Vic2NyaWJlciwgJnN1YnNjcmliZXItPmxvY2spOworCWlmIChzdWJzY3JpYmVyLT5yZWYgPT0gMCkgeworCQl3YXJuKCJGYWlsZWQgdG8gYWNxdWlyZSBzdWJzY3JpYmVyIHJlZmVyZW5jZVxuIik7CisJCWtmcmVlKHN1YnNjcmliZXIpOworCQlyZXR1cm47CisJfQorCisJLyogRXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byBzdWJzY3JpYmVyICovCisKKwl0aXBjX2NyZWF0ZXBvcnQodG9wc3J2LnVzZXJfcmVmLAorCQkJKHZvaWQgKikodW5zaWduZWQgbG9uZylzdWJzY3JpYmVyLT5yZWYsCisJCQlpbXBvcnRhbmNlLAorCQkJMCwKKwkJCTAsCisJCQlzdWJzY3JfY29ubl9zaHV0ZG93bl9ldmVudCwKKwkJCTAsCisJCQkwLAorCQkJc3Vic2NyX2Nvbm5fbXNnX2V2ZW50LAorCQkJMCwKKwkJCSZzdWJzY3JpYmVyLT5wb3J0X3JlZik7CisJaWYgKHN1YnNjcmliZXItPnBvcnRfcmVmID09IDApIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBjcmVhdGUgc3Vic2NyaXB0aW9uIHBvcnRcbiIpOworCQlyZWZfZGlzY2FyZChzdWJzY3JpYmVyLT5yZWYpOworCQlrZnJlZShzdWJzY3JpYmVyKTsKKwkJcmV0dXJuOworCX0KKwl0aXBjX2Nvbm5lY3QycG9ydChzdWJzY3JpYmVyLT5wb3J0X3JlZiwgb3JpZyk7CisKKworCS8qIEFkZCBzdWJzY3JpYmVyIHRvIHRvcG9sb2d5IHNlcnZlcidzIHN1YnNjcmliZXIgbGlzdCAqLworCisJcmVmX2xvY2soc3Vic2NyaWJlci0+cmVmKTsKKwlzcGluX2xvY2tfYmgoJnRvcHNydi5sb2NrKTsKKwlsaXN0X2FkZCgmc3Vic2NyaWJlci0+c3Vic2NyaWJlcl9saXN0LCAmdG9wc3J2LnN1YnNjcmliZXJfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnRvcHNydi5sb2NrKTsKKworCS8qCisJICogU3Vic2NyaWJlIG5vdyBpZiBtZXNzYWdlIGNvbnRhaW5zIGEgc3Vic2NyaXB0aW9uLAorCSAqIG90aGVyd2lzZSBzZW5kIGFuIGVtcHR5IHJlc3BvbnNlIHRvIGNvbXBsZXRlIGNvbm5lY3Rpb24gaGFuZHNoYWtpbmcKKwkgKi8KKworCXN1YnNjcmliZXJfbG9jayA9IHN1YnNjcmliZXItPmxvY2s7CisJaWYgKHNpemUpCisJCXN1YnNjcl9zdWJzY3JpYmUoKHN0cnVjdCB0aXBjX3N1YnNjciAqKWRhdGEsIHN1YnNjcmliZXIpOworCWVsc2UKKwkJdGlwY19zZW5kKHN1YnNjcmliZXItPnBvcnRfcmVmLCAxLCAmbXNnX3NlY3QpOworCisJc3Bpbl91bmxvY2tfYmgoc3Vic2NyaWJlcl9sb2NrKTsKK30KKworaW50IHN1YnNjcl9zdGFydCh2b2lkKQoreworCXN0cnVjdCB0aXBjX25hbWVfc2VxIHNlcSA9IHtUSVBDX1RPUF9TUlYsIFRJUENfVE9QX1NSViwgVElQQ19UT1BfU1JWfTsKKwlpbnQgcmVzID0gLTE7CisKKwltZW1zZXQoJnRvcHNydiwgMCwgc2l6ZW9mICh0b3BzcnYpKTsKKwl0b3BzcnYubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwlJTklUX0xJU1RfSEVBRCgmdG9wc3J2LnN1YnNjcmliZXJfbGlzdCk7CisKKwlzcGluX2xvY2tfYmgoJnRvcHNydi5sb2NrKTsKKwlyZXMgPSB0aXBjX2F0dGFjaCgmdG9wc3J2LnVzZXJfcmVmLCAwLCAwKTsKKwlpZiAocmVzKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZ0b3BzcnYubG9jayk7CisJCXJldHVybiByZXM7CisJfQorCisgCXJlcyA9IHRpcGNfY3JlYXRlcG9ydCh0b3BzcnYudXNlcl9yZWYsCisgCQkJICAgICAgMCwKKyAJCQkgICAgICBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UsCisgCQkJICAgICAgMCwKKyAJCQkgICAgICAwLAorIAkJCSAgICAgIDAsCisgCQkJICAgICAgMCwKKyAJCQkgICAgICBzdWJzY3JfbmFtZWRfbXNnX2V2ZW50LAorIAkJCSAgICAgIDAsCisgCQkJICAgICAgMCwKKyAJCQkgICAgICAmdG9wc3J2LnNldHVwX3BvcnQpOworIAlpZiAocmVzKQorCQlnb3RvIGZhaWxlZDsKKworIAlyZXMgPSBuYW1ldGJsX3B1Ymxpc2hfcnN2KHRvcHNydi5zZXR1cF9wb3J0LCBUSVBDX05PREVfU0NPUEUsICZzZXEpOworIAlpZiAocmVzKQorCQlnb3RvIGZhaWxlZDsKKworCXNwaW5fdW5sb2NrX2JoKCZ0b3BzcnYubG9jayk7CisJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwllcnIoIkZhaWxlZCB0byBjcmVhdGUgc3Vic2NyaXB0aW9uIHNlcnZpY2VcbiIpOworCXRpcGNfZGV0YWNoKHRvcHNydi51c2VyX3JlZik7CisJdG9wc3J2LnVzZXJfcmVmID0gMDsKKwlzcGluX3VubG9ja19iaCgmdG9wc3J2LmxvY2spOworCXJldHVybiByZXM7Cit9CisKK3ZvaWQgc3Vic2NyX3N0b3Aodm9pZCkKK3sKKwlzdHJ1Y3Qgc3Vic2NyaWJlciAqc3Vic2NyaWJlcjsKKwlzdHJ1Y3Qgc3Vic2NyaWJlciAqc3Vic2NyaWJlcl90ZW1wOworCXNwaW5sb2NrX3QgKnN1YnNjcmliZXJfbG9jazsKKworCWlmICh0b3BzcnYudXNlcl9yZWYpIHsKKwkJdGlwY19kZWxldGVwb3J0KHRvcHNydi5zZXR1cF9wb3J0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN1YnNjcmliZXIsIHN1YnNjcmliZXJfdGVtcCwgCisJCQkJCSAmdG9wc3J2LnN1YnNjcmliZXJfbGlzdCwKKwkJCQkJIHN1YnNjcmliZXJfbGlzdCkgeworCQkJcmVmX2xvY2soc3Vic2NyaWJlci0+cmVmKTsKKwkJCXN1YnNjcmliZXJfbG9jayA9IHN1YnNjcmliZXItPmxvY2s7CisJCQlzdWJzY3JfdGVybWluYXRlKHN1YnNjcmliZXIpOworCQkJc3Bpbl91bmxvY2tfYmgoc3Vic2NyaWJlcl9sb2NrKTsKKwkJfQorCQl0aXBjX2RldGFjaCh0b3BzcnYudXNlcl9yZWYpOworCQl0b3BzcnYudXNlcl9yZWYgPSAwOworCX0KK30KKworCitpbnQgdGlwY19pc3B1Ymxpc2hlZChzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpuYW1lKQoreworCXUzMiBkb21haW4gPSAwOworCisJcmV0dXJuKG5hbWV0YmxfdHJhbnNsYXRlKG5hbWUtPnR5cGUsIG5hbWUtPmluc3RhbmNlLCZkb21haW4pICE9IDApOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zdWJzY3IuaCBiL25ldC90aXBjL3N1YnNjci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZmY0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9zdWJzY3IuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogbmV0L3RpcGMvc3Vic2NyLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBzdWJzY3JpcHRpb24gc2VydmljZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX1NVQlNDUl9ICisjZGVmaW5lIF9USVBDX1NVQlNDUl9ICisKKy8qKgorICogc3RydWN0IHN1YnNjcmlwdGlvbiAtIFRJUEMgbmV0d29yayB0b3BvbG9neSBzdWJzY3JpcHRpb24gb2JqZWN0CisgKiBAc2VxOiBuYW1lIHNlcXVlbmNlIGFzc29jaWF0ZWQgd2l0aCBzdWJzY3JpcHRpb24KKyAqIEB0aW1lb3V0OiBkdXJhdGlvbiBvZiBzdWJzY3JpcHRpb24gKGluIG1zKQorICogQGZpbHRlcjogZXZlbnQgZmlsdGVyaW5nIHRvIGJlIGRvbmUgZm9yIHN1YnNjcmlwdGlvbgorICogQGV2dDogdGVtcGxhdGUgZm9yIGV2ZW50cyBnZW5lcmF0ZWQgYnkgc3Vic2NyaXB0aW9uCisgKiBAc3Vic2NyaXB0aW9uX2xpc3Q6IGFkamFjZW50IHN1YnNjcmlwdGlvbnMgaW4gc3Vic2NyaWJlcidzIHN1YnNjcmlwdGlvbiBsaXN0CisgKiBAbmFtZXNlcV9saXN0OiBhZGphY2VudCBzdWJzY3JpcHRpb25zIGluIG5hbWUgc2VxdWVuY2UncyBzdWJzY3JpcHRpb24gbGlzdAorICogQHRpbWVyX3JlZjogcmVmZXJlbmNlIHRvIHRpbWVyIGdvdmVybmluZyBzdWJzY3JpcHRpb24gZHVyYXRpb24gKG1heSBiZSBOVUxMKQorICogQG93bmVyOiBwb2ludGVyIHRvIHN1YnNjcmliZXIgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNjcmlwdGlvbgorICovCisgCitzdHJ1Y3Qgc3Vic2NyaXB0aW9uIHsKKwlzdHJ1Y3QgdGlwY19uYW1lX3NlcSBzZXE7CisJdTMyIHRpbWVvdXQ7CisJdTMyIGZpbHRlcjsKKwlzdHJ1Y3QgdGlwY19ldmVudCBldnQ7CisJc3RydWN0IGxpc3RfaGVhZCBzdWJzY3JpcHRpb25fbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5hbWVzZXFfbGlzdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlzdHJ1Y3Qgc3Vic2NyaWJlciAqb3duZXI7Cit9OworCitpbnQgc3Vic2NyX292ZXJsYXAoc3RydWN0IHN1YnNjcmlwdGlvbiAqIHN1YiwgCisJCSAgIHUzMiBmb3VuZF9sb3dlciwgCisJCSAgIHUzMiBmb3VuZF91cHBlcik7CisKK3ZvaWQgc3Vic2NyX3JlcG9ydF9vdmVybGFwKHN0cnVjdCBzdWJzY3JpcHRpb24gKiBzdWIsIAorCQkJICAgdTMyIGZvdW5kX2xvd2VyLCAKKwkJCSAgIHUzMiBmb3VuZF91cHBlciwKKwkJCSAgIHUzMiBldmVudCwgCisJCQkgICB1MzIgcG9ydF9yZWYsIAorCQkJICAgdTMyIG5vZGUsCisJCQkgICBpbnQgbXVzdF9yZXBvcnQpOworCitpbnQgc3Vic2NyX3N0YXJ0KHZvaWQpOworCit2b2lkIHN1YnNjcl9zdG9wKHZvaWQpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvdXNlcl9yZWcuYyBiL25ldC90aXBjL3VzZXJfcmVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlYzdkYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3VzZXJfcmVnLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBuZXQvdGlwYy91c2VyX3JlZy5jOiBUSVBDIHVzZXIgcmVnaXN0cnkgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAidXNlcl9yZWcuaCIKKworLyoKKyAqIFRJUEMgdXNlciByZWdpc3RyeSBrZWVwcyB0cmFjayBvZiB1c2VycyBvZiB0aGUgdGlwY19wb3J0IGludGVyZmFjZS4KKyAqCisgKiBUaGUgcmVnaXN0cnkgdXRpbGl6ZXMgYW4gYXJyYXkgb2YgIlRJUEMgdXNlciIgZW50cmllczsgCisgKiBhIHVzZXIncyBJRCBpcyB0aGUgaW5kZXggb2YgdGhlaXIgYXNzb2NpYXRlZCBhcnJheSBlbnRyeS4KKyAqIEFycmF5IGVudHJ5IDAgaXMgbm90IHVzZWQsIHNvIHVzZXJpZCAwIGlzIG5vdCB2YWxpZDsKKyAqIFRJUEMgc29tZXRpbWVzIHVzZXMgdGhpcyB2YWx1ZSB0byBkZW5vdGUgYW4gYW5vbnltb3VzIHVzZXIuCisgKiBUaGUgbGlzdCBvZiBmcmVlIGVudHJpZXMgaXMgaW5pdGlhbGx5IGNoYWluZWQgZnJvbSBsYXN0IGVudHJ5IHRvIGVudHJ5IDEuCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgdGlwY191c2VyIC0gcmVnaXN0ZXJlZCBUSVBDIHVzZXIgaW5mbworICogQG5leHQ6IGluZGV4IG9mIG5leHQgZnJlZSByZWdpc3RyeSBlbnRyeSAob3IgLTEgZm9yIGFuIGFsbG9jYXRlZCBlbnRyeSkKKyAqIEBjYWxsYmFjazogcHRyIHRvIHJvdXRpbmUgdG8gY2FsbCB3aGVuIFRJUEMgbW9kZSBjaGFuZ2VzIChOVUxMIGlmIG5vbmUpCisgKiBAdXNyX2hhbmRsZTogdXNlci1kZWZpbmVkIHZhbHVlIHBhc3NlZCB0byBjYWxsYmFjayByb3V0aW5lIAorICogQHBvcnRzOiBsaXN0IG9mIHVzZXIgcG9ydHMgb3duZWQgYnkgdGhlIHVzZXIKKyAqLworCitzdHJ1Y3QgdGlwY191c2VyIHsKKwlpbnQgbmV4dDsKKwl0aXBjX21vZGVfZXZlbnQgY2FsbGJhY2s7CisJdm9pZCAqdXNyX2hhbmRsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBvcnRzOworfTsKKworI2RlZmluZSBNQVhfVVNFUklEIDY0CisjZGVmaW5lIFVTRVJfTElTVF9TSVpFICgoTUFYX1VTRVJJRCArIDEpICogc2l6ZW9mKHN0cnVjdCB0aXBjX3VzZXIpKQorCitzdGF0aWMgc3RydWN0IHRpcGNfdXNlciAqdXNlcnMgPSAwOworc3RhdGljIHUzMiBuZXh0X2ZyZWVfdXNlciA9IE1BWF9VU0VSSUQgKyAxOworc3RhdGljIHNwaW5sb2NrX3QgcmVnX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKKy8qKgorICogcmVnX2luaXQgLSBjcmVhdGUgVElQQyB1c2VyIHJlZ2lzdHJ5IChidXQgZG9uJ3QgYWN0aXZhdGUgaXQpCisgKiAKKyAqIElmIHJlZ2lzdHJ5IGhhcyBiZWVuIHByZS1pbml0aWFsaXplZCBpdCBpcyBsZWZ0ICJhcyBpcyIuCisgKiBOT1RFOiBUaGlzIHJvdXRpbmUgbWF5IGJlIGNhbGxlZCB3aGVuIFRJUEMgaXMgaW5hY3RpdmUuCisgKi8KKworc3RhdGljIGludCByZWdfaW5pdCh2b2lkKQoreworCXUzMiBpOworCQorCXNwaW5fbG9ja19iaCgmcmVnX2xvY2spOworCWlmICghdXNlcnMpIHsKKwkJdXNlcnMgPSAoc3RydWN0IHRpcGNfdXNlciAqKWttYWxsb2MoVVNFUl9MSVNUX1NJWkUsIEdGUF9BVE9NSUMpOworCQlpZiAodXNlcnMpIHsKKwkJCW1lbXNldCh1c2VycywgMCwgVVNFUl9MSVNUX1NJWkUpOworCQkJZm9yIChpID0gMTsgaSA8PSBNQVhfVVNFUklEOyBpKyspIHsKKwkJCQl1c2Vyc1tpXS5uZXh0ID0gaSAtIDE7CisJCQl9CisJCQluZXh0X2ZyZWVfdXNlciA9IE1BWF9VU0VSSUQ7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJnJlZ19sb2NrKTsKKwlyZXR1cm4gdXNlcnMgPyBUSVBDX09LIDogLUVOT01FTTsKK30KKworLyoqCisgKiByZWdfY2FsbGJhY2sgLSBpbmZvcm0gVElQQyB1c2VyIGFib3V0IGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUKKyAqLworCitzdGF0aWMgdm9pZCByZWdfY2FsbGJhY2soc3RydWN0IHRpcGNfdXNlciAqdXNlcl9wdHIpCit7CisJdGlwY19tb2RlX2V2ZW50IGNiOworCXZvaWQgKmFyZzsKKworCXNwaW5fbG9ja19iaCgmcmVnX2xvY2spOworCWNiID0gdXNlcl9wdHItPmNhbGxiYWNrOworCWFyZyA9IHVzZXJfcHRyLT51c3JfaGFuZGxlOworCXNwaW5fdW5sb2NrX2JoKCZyZWdfbG9jayk7CisKKwlpZiAoY2IpCisJCWNiKGFyZywgdGlwY19tb2RlLCB0aXBjX293bl9hZGRyKTsKK30KKworLyoqCisgKiByZWdfc3RhcnQgLSBhY3RpdmF0ZSBUSVBDIHVzZXIgcmVnaXN0cnkKKyAqLworCitpbnQgcmVnX3N0YXJ0KHZvaWQpCit7CisJdTMyIHU7CisJaW50IHJlczsKKworCWlmICgocmVzID0gcmVnX2luaXQoKSkpCisJCXJldHVybiByZXM7CisKKwlmb3IgKHUgPSAxOyB1IDw9IE1BWF9VU0VSSUQ7IHUrKykgeworCQlpZiAodXNlcnNbdV0uY2FsbGJhY2spCisJCQlrX3NpZ25hbCgoSGFuZGxlcilyZWdfY2FsbGJhY2ssCisJCQkJICh1bnNpZ25lZCBsb25nKSZ1c2Vyc1t1XSk7CisJfQorCXJldHVybiBUSVBDX09LOworfQorCisvKioKKyAqIHJlZ19zdG9wIC0gc2h1dCBkb3duICYgZGVsZXRlIFRJUEMgdXNlciByZWdpc3RyeQorICovCisKK3ZvaWQgcmVnX3N0b3Aodm9pZCkKK3sgICAgICAgICAgICAgICAKKwlpbnQgaWQ7CisKKwlpZiAoIXVzZXJzKQorCQlyZXR1cm47CisKKwlmb3IgKGlkID0gMTsgaWQgPD0gTUFYX1VTRVJJRDsgaWQrKykgeworCQlpZiAodXNlcnNbaWRdLmNhbGxiYWNrKQorCQkJcmVnX2NhbGxiYWNrKCZ1c2Vyc1tpZF0pOworCX0KKwlrZnJlZSh1c2Vycyk7CisJdXNlcnMgPSAwOworfQorCisvKioKKyAqIHRpcGNfYXR0YWNoIC0gcmVnaXN0ZXIgYSBUSVBDIHVzZXIKKyAqCisgKiBOT1RFOiBUaGlzIHJvdXRpbmUgbWF5IGJlIGNhbGxlZCB3aGVuIFRJUEMgaXMgaW5hY3RpdmUuCisgKi8KKworaW50IHRpcGNfYXR0YWNoKHUzMiAqdXNlcmlkLCB0aXBjX21vZGVfZXZlbnQgY2IsIHZvaWQgKnVzcl9oYW5kbGUpCit7CisJc3RydWN0IHRpcGNfdXNlciAqdXNlcl9wdHI7CisKKwlpZiAoKHRpcGNfbW9kZSA9PSBUSVBDX05PVF9SVU5OSU5HKSAmJiAhY2IpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJaWYgKCF1c2VycykKKwkJcmVnX2luaXQoKTsKKworCXNwaW5fbG9ja19iaCgmcmVnX2xvY2spOworCWlmICghbmV4dF9mcmVlX3VzZXIpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnJlZ19sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJdXNlcl9wdHIgPSAmdXNlcnNbbmV4dF9mcmVlX3VzZXJdOworCSp1c2VyaWQgPSBuZXh0X2ZyZWVfdXNlcjsKKwluZXh0X2ZyZWVfdXNlciA9IHVzZXJfcHRyLT5uZXh0OworCXVzZXJfcHRyLT5uZXh0ID0gLTE7IAorCXNwaW5fdW5sb2NrX2JoKCZyZWdfbG9jayk7CisKKwl1c2VyX3B0ci0+Y2FsbGJhY2sgPSBjYjsKKwl1c2VyX3B0ci0+dXNyX2hhbmRsZSA9IHVzcl9oYW5kbGU7CisJSU5JVF9MSVNUX0hFQUQoJnVzZXJfcHRyLT5wb3J0cyk7CisJYXRvbWljX2luYygmdGlwY191c2VyX2NvdW50KTsKKwkKKwlpZiAoY2IgJiYgKHRpcGNfbW9kZSAhPSBUSVBDX05PVF9SVU5OSU5HKSkKKwkJa19zaWduYWwoKEhhbmRsZXIpcmVnX2NhbGxiYWNrLCAodW5zaWduZWQgbG9uZyl1c2VyX3B0cik7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qKgorICogdGlwY19kZXRhY2ggLSBkZXJlZ2lzdGVyIGEgVElQQyB1c2VyCisgKi8KKwordm9pZCB0aXBjX2RldGFjaCh1MzIgdXNlcmlkKQoreworCXN0cnVjdCB0aXBjX3VzZXIgKnVzZXJfcHRyOworCXN0cnVjdCBsaXN0X2hlYWQgcG9ydHNfdGVtcDsKKwlzdHJ1Y3QgdXNlcl9wb3J0ICp1cF9wdHIsICp0ZW1wX3VwX3B0cjsKKworCWlmICgodXNlcmlkID09IDApIHx8ICh1c2VyaWQgPiBNQVhfVVNFUklEKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZyZWdfbG9jayk7CisJaWYgKCghdXNlcnMpIHx8ICh1c2Vyc1t1c2VyaWRdLm5leHQgPj0gMCkpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnJlZ19sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCXVzZXJfcHRyID0gJnVzZXJzW3VzZXJpZF07CisgICAgICAgIHVzZXJfcHRyLT5jYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAKKwlJTklUX0xJU1RfSEVBRCgmcG9ydHNfdGVtcCk7CisgICAgICAgIGxpc3Rfc3BsaWNlKCZ1c2VyX3B0ci0+cG9ydHMsICZwb3J0c190ZW1wKTsKKwl1c2VyX3B0ci0+bmV4dCA9IG5leHRfZnJlZV91c2VyOworCW5leHRfZnJlZV91c2VyID0gdXNlcmlkOworCXNwaW5fdW5sb2NrX2JoKCZyZWdfbG9jayk7CisKKwlhdG9taWNfZGVjKCZ0aXBjX3VzZXJfY291bnQpOworCisgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1cF9wdHIsIHRlbXBfdXBfcHRyLCAmcG9ydHNfdGVtcCwgdXBvcnRfbGlzdCkgeworCQl0aXBjX2RlbGV0ZXBvcnQodXBfcHRyLT5yZWYpOworCX0KK30KKworLyoqCisgKiByZWdfYWRkX3BvcnQgLSByZWdpc3RlciBhIHVzZXIncyBkcml2ZXIgcG9ydAorICovCisKK2ludCByZWdfYWRkX3BvcnQoc3RydWN0IHVzZXJfcG9ydCAqdXBfcHRyKQoreworCXN0cnVjdCB0aXBjX3VzZXIgKnVzZXJfcHRyOworCisJaWYgKHVwX3B0ci0+dXNlcl9yZWYgPT0gMCkKKwkJcmV0dXJuIFRJUENfT0s7CisJaWYgKHVwX3B0ci0+dXNlcl9yZWYgPiBNQVhfVVNFUklEKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKHRpcGNfbW9kZSA9PSBUSVBDX05PVF9SVU5OSU5HKSB8fCAhdXNlcnMgKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJc3Bpbl9sb2NrX2JoKCZyZWdfbG9jayk7CisJdXNlcl9wdHIgPSAmdXNlcnNbdXBfcHRyLT51c2VyX3JlZl07CisJbGlzdF9hZGQoJnVwX3B0ci0+dXBvcnRfbGlzdCwgJnVzZXJfcHRyLT5wb3J0cyk7CisJc3Bpbl91bmxvY2tfYmgoJnJlZ19sb2NrKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworLyoqCisgKiByZWdfcmVtb3ZlX3BvcnQgLSBkZXJlZ2lzdGVyIGEgdXNlcidzIGRyaXZlciBwb3J0CisgKi8KKworaW50IHJlZ19yZW1vdmVfcG9ydChzdHJ1Y3QgdXNlcl9wb3J0ICp1cF9wdHIpCit7CisJaWYgKHVwX3B0ci0+dXNlcl9yZWYgPT0gMCkKKwkJcmV0dXJuIFRJUENfT0s7CisJaWYgKHVwX3B0ci0+dXNlcl9yZWYgPiBNQVhfVVNFUklEKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXVzZXJzICkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCXNwaW5fbG9ja19iaCgmcmVnX2xvY2spOworCWxpc3RfZGVsX2luaXQoJnVwX3B0ci0+dXBvcnRfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnJlZ19sb2NrKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvdXNlcl9yZWcuaCBiL25ldC90aXBjL3VzZXJfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyY2E5YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3VzZXJfcmVnLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIG5ldC90aXBjL3VzZXJfcmVnLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyB1c2VyIHJlZ2lzdHJ5IGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19VU0VSX1JFR19ICisjZGVmaW5lIF9USVBDX1VTRVJfUkVHX0gKKworI2luY2x1ZGUgInBvcnQuaCIKKworaW50IHJlZ19zdGFydCh2b2lkKTsKK3ZvaWQgcmVnX3N0b3Aodm9pZCk7CisKK2ludCByZWdfYWRkX3BvcnQoc3RydWN0IHVzZXJfcG9ydCAqdXBfcHRyKTsKK2ludCByZWdfcmVtb3ZlX3BvcnQoc3RydWN0IHVzZXJfcG9ydCAqdXBfcHRyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy96b25lLmMgYi9uZXQvdGlwYy96b25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhZWY2NgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3pvbmUuYwpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIG5ldC90aXBjL3pvbmUuYzogVElQQyB6b25lIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJ6b25lLmgiCisjaW5jbHVkZSAibmV0LmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisjaW5jbHVkZSAiY2x1c3Rlci5oIgorI2luY2x1ZGUgIm5vZGUuaCIKKworc3RydWN0IF96b25lICp6b25lX2NyZWF0ZSh1MzIgYWRkcikKK3sKKwlzdHJ1Y3QgX3pvbmUgKnpfcHRyID0gMDsKKwl1MzIgel9udW07CisKKwlpZiAoIWFkZHJfZG9tYWluX3ZhbGlkKGFkZHIpKQorCQlyZXR1cm4gMDsKKworCXpfcHRyID0gKHN0cnVjdCBfem9uZSAqKWttYWxsb2Moc2l6ZW9mKCp6X3B0ciksIEdGUF9BVE9NSUMpOworCWlmICh6X3B0ciAhPSBOVUxMKSB7CisJCW1lbXNldCh6X3B0ciwgMCwgc2l6ZW9mKCp6X3B0cikpOworCQl6X251bSA9IHRpcGNfem9uZShhZGRyKTsKKwkJel9wdHItPmFkZHIgPSB0aXBjX2FkZHIoel9udW0sIDAsIDApOworCQluZXQuem9uZXNbel9udW1dID0gel9wdHI7CisJfQorCXJldHVybiB6X3B0cjsKK30KKwordm9pZCB6b25lX2RlbGV0ZShzdHJ1Y3QgX3pvbmUgKnpfcHRyKQoreworCXUzMiBjX251bTsKKworCWlmICghel9wdHIpCisJCXJldHVybjsKKwlmb3IgKGNfbnVtID0gMTsgY19udW0gPD0gdGlwY19tYXhfY2x1c3RlcnM7IGNfbnVtKyspIHsKKwkJY2x1c3Rlcl9kZWxldGUoel9wdHItPmNsdXN0ZXJzW2NfbnVtXSk7CisJfQorCWtmcmVlKHpfcHRyKTsKK30KKwordm9pZCB6b25lX2F0dGFjaF9jbHVzdGVyKHN0cnVjdCBfem9uZSAqel9wdHIsIHN0cnVjdCBjbHVzdGVyICpjX3B0cikKK3sKKwl1MzIgY19udW0gPSB0aXBjX2NsdXN0ZXIoY19wdHItPmFkZHIpOworCisJYXNzZXJ0KGNfcHRyLT5hZGRyKTsKKwlhc3NlcnQoY19udW0gPD0gdGlwY19tYXhfY2x1c3RlcnMpOworCWFzc2VydCh6X3B0ci0+Y2x1c3RlcnNbY19udW1dID09IDApOworCXpfcHRyLT5jbHVzdGVyc1tjX251bV0gPSBjX3B0cjsKK30KKwordm9pZCB6b25lX3JlbW92ZV9hc19yb3V0ZXIoc3RydWN0IF96b25lICp6X3B0ciwgdTMyIHJvdXRlcikKK3sKKwl1MzIgY19udW07CisKKwlmb3IgKGNfbnVtID0gMTsgY19udW0gPD0gdGlwY19tYXhfY2x1c3RlcnM7IGNfbnVtKyspIHsKKwkJaWYgKHpfcHRyLT5jbHVzdGVyc1tjX251bV0pIHsKKwkJCWNsdXN0ZXJfcmVtb3ZlX2FzX3JvdXRlcih6X3B0ci0+Y2x1c3RlcnNbY19udW1dLCAKKwkJCQkJCSByb3V0ZXIpOworCQl9CisJfQorfQorCit2b2lkIHpvbmVfc2VuZF9leHRlcm5hbF9yb3V0ZXMoc3RydWN0IF96b25lICp6X3B0ciwgdTMyIGRlc3QpCit7CisJdTMyIGNfbnVtOworCisJZm9yIChjX251bSA9IDE7IGNfbnVtIDw9IHRpcGNfbWF4X2NsdXN0ZXJzOyBjX251bSsrKSB7CisJCWlmICh6X3B0ci0+Y2x1c3RlcnNbY19udW1dKSB7CisJCQlpZiAoaW5fb3duX2NsdXN0ZXIoel9wdHItPmFkZHIpKQorCQkJCWNvbnRpbnVlOworCQkJY2x1c3Rlcl9zZW5kX2V4dF9yb3V0ZXMoel9wdHItPmNsdXN0ZXJzW2NfbnVtXSwgZGVzdCk7CisJCX0KKwl9Cit9CisKK3N0cnVjdCBub2RlICp6b25lX3NlbGVjdF9yZW1vdGVfbm9kZShzdHJ1Y3QgX3pvbmUgKnpfcHRyLCB1MzIgYWRkciwgdTMyIHJlZikKK3sKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHI7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCXUzMiBjX251bTsKKworCWlmICghel9wdHIpCisJCXJldHVybiAwOworCWNfcHRyID0gel9wdHItPmNsdXN0ZXJzW3RpcGNfY2x1c3RlcihhZGRyKV07CisJaWYgKCFjX3B0cikKKwkJcmV0dXJuIDA7CisJbl9wdHIgPSBjbHVzdGVyX3NlbGVjdF9ub2RlKGNfcHRyLCByZWYpOworCWlmIChuX3B0cikKKwkJcmV0dXJuIG5fcHRyOworCisJLyogTGlua3MgdG8gYW55IG90aGVyIGNsdXN0ZXJzIHdpdGhpbiB0aGlzIHpvbmUgPyAqLworCWZvciAoY19udW0gPSAxOyBjX251bSA8PSB0aXBjX21heF9jbHVzdGVyczsgY19udW0rKykgeworCQljX3B0ciA9IHpfcHRyLT5jbHVzdGVyc1tjX251bV07CisJCWlmICghY19wdHIpCisJCQlyZXR1cm4gMDsKKwkJbl9wdHIgPSBjbHVzdGVyX3NlbGVjdF9ub2RlKGNfcHRyLCByZWYpOworCQlpZiAobl9wdHIpCisJCQlyZXR1cm4gbl9wdHI7CisJfQorCXJldHVybiAwOworfQorCit1MzIgem9uZV9zZWxlY3Rfcm91dGVyKHN0cnVjdCBfem9uZSAqel9wdHIsIHUzMiBhZGRyLCB1MzIgcmVmKQoreworCXN0cnVjdCBjbHVzdGVyICpjX3B0cjsKKwl1MzIgY19udW07CisJdTMyIHJvdXRlcjsKKworCWlmICghel9wdHIpCisJCXJldHVybiAwOworCWNfcHRyID0gel9wdHItPmNsdXN0ZXJzW3RpcGNfY2x1c3RlcihhZGRyKV07CisJcm91dGVyID0gY19wdHIgPyBjbHVzdGVyX3NlbGVjdF9yb3V0ZXIoY19wdHIsIHJlZikgOiAwOworCWlmIChyb3V0ZXIpCisJCXJldHVybiByb3V0ZXI7CisKKwkvKiBMaW5rcyB0byBhbnkgb3RoZXIgY2x1c3RlcnMgd2l0aGluIHRoZSB6b25lPyAqLworCWZvciAoY19udW0gPSAxOyBjX251bSA8PSB0aXBjX21heF9jbHVzdGVyczsgY19udW0rKykgeworCQljX3B0ciA9IHpfcHRyLT5jbHVzdGVyc1tjX251bV07CisJCXJvdXRlciA9IGNfcHRyID8gY2x1c3Rlcl9zZWxlY3Rfcm91dGVyKGNfcHRyLCByZWYpIDogMDsKKwkJaWYgKHJvdXRlcikKKwkJCXJldHVybiByb3V0ZXI7CisJfQorCXJldHVybiAwOworfQorCisKK3UzMiB6b25lX25leHRfbm9kZSh1MzIgYWRkcikKK3sKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHIgPSBjbHVzdGVyX2ZpbmQoYWRkcik7CisKKwlpZiAoY19wdHIpCisJCXJldHVybiBjbHVzdGVyX25leHRfbm9kZShjX3B0ciwgYWRkcik7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL3pvbmUuaCBiL25ldC90aXBjL3pvbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzI2Zjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvem9uZS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBuZXQvdGlwYy96b25lLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyB6b25lIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19aT05FX0gKKyNkZWZpbmUgX1RJUENfWk9ORV9ICisKKyNpbmNsdWRlICJub2RlX3N1YnNjci5oIgorI2luY2x1ZGUgIm5ldC5oIgorCisKKy8qKgorICogc3RydWN0IF96b25lIC0gVElQQyB6b25lIHN0cnVjdHVyZQorICogQGFkZHI6IG5ldHdvcmsgYWRkcmVzcyBvZiB6b25lCisgKiBAY2x1c3RlcnM6IGFycmF5IG9mIHBvaW50ZXJzIHRvIGFsbCBjbHVzdGVycyB3aXRoaW4gem9uZQorICogQGxpbmtzOiAodXNlZCBmb3IgaW50ZXItem9uZSBjb21tdW5pY2F0aW9uKQorICovCisgCitzdHJ1Y3QgX3pvbmUgeworCXUzMiBhZGRyOworCXN0cnVjdCBjbHVzdGVyICpjbHVzdGVyc1syXTsgLyogY3VycmVudGx5IGxpbWl0ZWQgdG8ganVzdCAxIGNsdXN0ZXIgKi8KKwl1MzIgbGlua3M7Cit9OworCitzdHJ1Y3Qgbm9kZSAqem9uZV9zZWxlY3RfcmVtb3RlX25vZGUoc3RydWN0IF96b25lICp6X3B0ciwgdTMyIGFkZHIsIHUzMiByZWYpOwordTMyIHpvbmVfc2VsZWN0X3JvdXRlcihzdHJ1Y3QgX3pvbmUgKnpfcHRyLCB1MzIgYWRkciwgdTMyIHJlZik7Cit2b2lkIHpvbmVfcmVtb3ZlX2FzX3JvdXRlcihzdHJ1Y3QgX3pvbmUgKnpfcHRyLCB1MzIgcm91dGVyKTsKK3ZvaWQgem9uZV9zZW5kX2V4dGVybmFsX3JvdXRlcyhzdHJ1Y3QgX3pvbmUgKnpfcHRyLCB1MzIgZGVzdCk7CitzdHJ1Y3QgX3pvbmUgKnpvbmVfY3JlYXRlKHUzMiBhZGRyKTsKK3ZvaWQgem9uZV9kZWxldGUoc3RydWN0IF96b25lICp6X3B0cik7Cit2b2lkIHpvbmVfYXR0YWNoX2NsdXN0ZXIoc3RydWN0IF96b25lICp6X3B0ciwgc3RydWN0IGNsdXN0ZXIgKmNfcHRyKTsKK3UzMiB6b25lX25leHRfbm9kZSh1MzIgYWRkcik7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IF96b25lICp6b25lX2ZpbmQodTMyIGFkZHIpCit7CisJcmV0dXJuIG5ldC56b25lc1t0aXBjX3pvbmUoYWRkcildOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvYXZjLmMgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCmluZGV4IDEyZTRmYjcuLjUzZDZjN2IgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9hdmMuYwpAQCAtNDk0LDggKzQ5NCw3IEBACiAJCQkJICAgICAgIGNoYXIgKm5hbWUxLCBjaGFyICpuYW1lMikKIHsKIAlpZiAoIWlwdjZfYWRkcl9hbnkoYWRkcikpCi0JCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgJXM9JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiIKLQkJCQkgIiUwNHg6JTA0eDolMDR4IiwgbmFtZTEsIE5JUDYoKmFkZHIpKTsKKwkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiAlcz0iIE5JUDZfRk1ULCBuYW1lMSwgTklQNigqYWRkcikpOwogCWlmIChwb3J0KQogCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiICVzPSVkIiwgbmFtZTIsIG50b2hzKHBvcnQpKTsKIH0KQEAgLTUwNCw3ICs1MDMsNyBAQAogCQkJCSAgICAgICBfX2JlMTYgcG9ydCwgY2hhciAqbmFtZTEsIGNoYXIgKm5hbWUyKQogewogCWlmIChhZGRyKQotCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiICVzPSVkLiVkLiVkLiVkIiwgbmFtZTEsIE5JUFFVQUQoYWRkcikpOworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiICVzPSIgTklQUVVBRF9GTVQsIG5hbWUxLCBOSVBRVUFEKGFkZHIpKTsKIAlpZiAocG9ydCkKIAkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiAlcz0lZCIsIG5hbWUyLCBudG9ocyhwb3J0KSk7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKaW5kZXggNjY0NzIwNC4uYjlmOGQ5NyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwpAQCAtMTAxOSw3ICsxMDE5LDcgQEAKICAgIGhhcyB0aGUgc2FtZSBTSUQgYXMgdGhlIHByb2Nlc3MuICBJZiBhdiBpcyB6ZXJvLCB0aGVuCiAgICBhY2Nlc3MgdG8gdGhlIGZpbGUgaXMgbm90IGNoZWNrZWQsIGUuZy4gZm9yIGNhc2VzCiAgICB3aGVyZSBvbmx5IHRoZSBkZXNjcmlwdG9yIGlzIGFmZmVjdGVkIGxpa2Ugc2Vlay4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZpbGVfaGFzX3Blcm0oc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCitzdGF0aWMgaW50IGZpbGVfaGFzX3Blcm0oc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkJc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJdTMyIGF2KQogewpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2Vzc3NvbG8xLmMgYi9zb3VuZC9vc3MvZXNzc29sbzEuYwppbmRleCBhNGVjYWIyZi4uODQ5YjU5ZiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2Vzc3NvbG8xLmMKKysrIGIvc291bmQvb3NzL2Vzc3NvbG8xLmMKQEAgLTUxNSw3ICs1MTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9kYWMoc3RydWN0IHNvbG8xX3N0YXRlICpzKQorc3RhdGljIGludCBwcm9nX2RtYWJ1Zl9kYWMoc3RydWN0IHNvbG8xX3N0YXRlICpzKQogewogCXVuc2lnbmVkIGxvbmcgdmE7CiAJaW50IGM7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTY4LmMgYi9zb3VuZC9wY2kvZXMxOTY4LmMKaW5kZXggOWZmYjYwMC4uMzc0N2E0MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VzMTk2OC5jCisrKyBiL3NvdW5kL3BjaS9lczE5NjguYwpAQCAtNzI3LDcgKzcyNyw3IEBACiAJYXB1X2RhdGFfc2V0KGNoaXAsIGRhdGEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXB1X3NldF9yZWdpc3RlcihzdHJ1Y3QgZXMxOTY4ICpjaGlwLCB1MTYgY2hhbm5lbCwgdTggcmVnLCB1MTYgZGF0YSkKK3N0YXRpYyB2b2lkIGFwdV9zZXRfcmVnaXN0ZXIoc3RydWN0IGVzMTk2OCAqY2hpcCwgdTE2IGNoYW5uZWwsIHU4IHJlZywgdTE2IGRhdGEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKQEAgLTc0Myw3ICs3NDMsNyBAQAogCXJldHVybiBfX21hZXN0cm9fcmVhZChjaGlwLCBJRFIwX0RBVEFfUE9SVCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTE2IGFwdV9nZXRfcmVnaXN0ZXIoc3RydWN0IGVzMTk2OCAqY2hpcCwgdTE2IGNoYW5uZWwsIHU4IHJlZykKK3N0YXRpYyB1MTYgYXB1X2dldF9yZWdpc3RlcihzdHJ1Y3QgZXMxOTY4ICpjaGlwLCB1MTYgY2hhbm5lbCwgdTggcmVnKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTE2IHY7Cg==